summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
commitc04dcc2e7d834218ef2d4194331e383402495ae1 (patch)
tree7333e38d10d75386e60f336b80c2443c1166031d /lib
parentInitial commit. (diff)
downloadkodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz
kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/libUPnP/CMakeLists.txt134
-rw-r--r--lib/libUPnP/Neptune/Build/Boot.scons66
-rw-r--r--lib/libUPnP/Neptune/Build/Build.scons237
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/any-blackberry-qnx/Config.scons23
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/any-google-pnacl/Config.scons13
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/arm-android-linux/Config.scons111
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/mipsel-sigma-linux/Config.scons5
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/ppu-sony-ps3/Config.scons8
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/universal-apple-macosx/Neptune.xcodeproj/project.pbxproj6917
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ArraysTest1/ArraysTest1.vcxproj101
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/BufferedStreamsTest1/BufferedStreamsTest1.vcxproj101
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Build.py97
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/FileTest1/FileTest1.vcxproj96
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/FileTest2/FileTest2.vcxproj96
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpClientTest1/HttpClientTest1.vcxproj103
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpClientTest2/HttpClientTest2.vcxproj96
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpServerTest1/HttpServerTest1.vcxproj102
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ListsTest1/ListsTest1.vcxproj101
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/LoggingTest1/LoggingTest1.vcxproj98
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/LoggingTest2/LoggingTest2.vcxproj102
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MapsTest1/MapsTest1.vcxproj98
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MessagesTest1/MessagesTest1.vcxproj103
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MessagesTest2/MessagesTest2.vcxproj103
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MiscTest1/MiscTest1.vcxproj97
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Neptune.sln199
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Neptune/Neptune.vcxproj233
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetConfig/NetConfig.vcxproj103
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetEcho/NetEcho.vcxproj103
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetGet/NetGet.vcxproj91
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetPing/NetPing.vcxproj103
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetPump/NetPump.vcxproj103
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetResolve/NetResolve.vcxproj91
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/QueueTest1/QueueTest1.vcxproj96
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/RingBufferTest1/RingBufferTest1.vcxproj101
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/SharedVariables1/SharedVariables1.vcxproj91
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/SocketsTest1/SocketsTest1.vcxproj96
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/StringsTest1/StringsTest1.vcxproj102
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ThreadsTest1/ThreadsTest1.vcxproj98
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/TimeTest1/TimeTest1.vcxproj96
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/TlsTest1/TlsTest1.vcxproj100
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/UdpTest1/UdpTest1.vcxproj103
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/UrlTest1/UrlTest1.vcxproj99
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/XmlTest1/XmlTest1.vcxproj108
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/axTLS/axTLS.vcxproj101
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune.sln52
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune/Neptune.vcxproj302
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune/Neptune.vcxproj.filters296
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml20
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml.cpp83
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml.h24
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/Logo.pngbin0 -> 801 bytes
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/SmallLogo.pngbin0 -> 329 bytes
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/SplashScreen.pngbin0 -> 2146 bytes
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/StoreLogo.pngbin0 -> 429 bytes
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Common/StandardStyles.xaml1007
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml16
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml.cpp46
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml.h25
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Package.appxmanifest42
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell.vcxproj212
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell.vcxproj.filters50
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell_TemporaryKey.pfxbin0 -> 2512 bytes
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/pch.cpp6
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/pch.h9
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-microsoft-xbox/Neptune/Neptune.vcproj394
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-unknown-cygwin/Config.scons4
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86-unknown-linux/Config.scons7
-rw-r--r--lib/libUPnP/Neptune/Build/Targets/x86_64-unknown-linux/Config.scons7
-rw-r--r--lib/libUPnP/Neptune/Build/Tools/SCons/gcc-generic.py34
-rw-r--r--lib/libUPnP/Neptune/Documents/Automatic/NeptuneErrorCodes.txt108
-rw-r--r--lib/libUPnP/Neptune/Documents/Manuals/Neptune Logging.docbin0 -> 77312 bytes
-rw-r--r--lib/libUPnP/Neptune/Extras/Data/TLS-Trust-Anchors-base.crt3382
-rw-r--r--lib/libUPnP/Neptune/Extras/Data/TLS-Trust-Anchors-extended.crt358
-rw-r--r--lib/libUPnP/Neptune/Extras/Scripts/CodeScanner.py150
-rw-r--r--lib/libUPnP/Neptune/Extras/Scripts/GenErrorMap.py146
-rw-r--r--lib/libUPnP/Neptune/Extras/Scripts/GenTrustAnchorsTables.py138
-rw-r--r--lib/libUPnP/Neptune/Extras/Tools/Logging/NeptuneLogConsole.py82
-rw-r--r--lib/libUPnP/Neptune/Extras/Tools/Testing/MakeUrlList.py16
-rw-r--r--lib/libUPnP/Neptune/Extras/Tools/Testing/axtls-crash-url.txt1
-rw-r--r--lib/libUPnP/Neptune/Extras/Tools/Testing/http-urls.txt3037
-rw-r--r--lib/libUPnP/Neptune/Extras/Tools/Testing/https-urls.txt5974
-rw-r--r--lib/libUPnP/Neptune/LICENSE29
-rw-r--r--lib/libUPnP/Neptune/README.md1
-rw-r--r--lib/libUPnP/Neptune/SConstruct1
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/MiniHttpServer/MiniHttpServer.cpp92
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/NetBench/NetBench.cpp256
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/NetConfig/NetConfig.cpp126
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/NetEcho/NetEcho.cpp168
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp279
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp218
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/NetPump/NetPump.cpp683
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/NetResolve/NetResolve.cpp77
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/ZipHttpServer/ZipHttpServer.cpp534
-rw-r--r--lib/libUPnP/Neptune/Source/Core/Neptune.cpp0
-rw-r--r--lib/libUPnP/Neptune/Source/Core/Neptune.h86
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptArray.h522
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptAutomaticCleaner.cpp101
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptAutomaticCleaner.h74
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptAutoreleasePool.h57
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptBase64.cpp194
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptBase64.h68
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.cpp471
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.h102
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptCommon.cpp38
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptCommon.h169
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptConfig.h381
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptConsole.cpp67
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptConsole.h55
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptConstants.h44
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptCrypto.cpp833
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptCrypto.h78
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDataBuffer.cpp256
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDataBuffer.h83
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDebug.cpp83
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDebug.h56
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDefs.h0
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDigest.cpp685
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDigest.h78
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDynamicCast.h89
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.cpp36
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.h84
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptFile.cpp409
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptFile.h229
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptHash.cpp137
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptHash.h83
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptHttp.cpp3483
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptHttp.h866
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptInterfaces.h115
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptJson.cpp37
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptJson.h42
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptList.cpp34
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptList.h704
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptLogging.cpp1555
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptLogging.h524
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptMap.h807
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptMessaging.cpp127
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptMessaging.h230
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptNetwork.cpp438
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptNetwork.h277
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptQueue.cpp36
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptQueue.h94
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptReferences.h173
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptResults.cpp153
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptResults.h163
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptRingBuffer.cpp269
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptRingBuffer.h83
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptSelectableMessageQueue.h68
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptSerialPort.h119
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.cpp128
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.h68
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptSockets.cpp59
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptSockets.h340
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptStack.h74
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptStreams.cpp724
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptStreams.h321
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptStrings.cpp1205
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptStrings.h358
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptSystem.cpp37
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptSystem.h63
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptThreads.cpp161
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptThreads.h322
-rwxr-xr-xlib/libUPnP/Neptune/Source/Core/NptTime.cpp714
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptTime.h156
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptTls.cpp1227
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptTls.h304
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptTlsDefaultTrustAnchorsBase.h583
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptTlsDefaultTrustAnchorsExtended.h91
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptTypes.h149
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptUri.cpp912
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptUri.h322
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptUtils.cpp957
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptUtils.h235
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptVersion.h41
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptXml.cpp2611
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptXml.h391
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptZip.cpp886
-rw-r--r--lib/libUPnP/Neptune/Source/Core/NptZip.h220
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0000.cpp108
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0001.cpp100
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0002.cpp112
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0003.cpp137
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0004.cpp138
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0005.cpp139
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0006.cpp135
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0007.cpp138
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0008.cpp137
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0009.cpp138
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0010.cpp138
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0011.cpp160
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0012.cpp160
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0013.cpp109
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0014.cpp109
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0015.cpp109
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0016.cpp133
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0017.cpp133
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0018.cpp133
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0019.cpp133
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0020.cpp148
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0021.cpp156
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0022.cpp130
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0023.cpp130
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0024.cpp130
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0025.cpp168
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0026.cpp168
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0027.cpp168
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0028.cpp168
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0029.cpp192
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0030.cpp195
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0031.cpp177
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0032.cpp148
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0033.cpp119
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0034.cpp117
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0035.cpp137
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0036.cpp149
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0037.cpp168
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0038.cpp172
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0039.cpp168
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0040.cpp169
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0041.cpp159
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0042.cpp121
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0043.cpp184
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0044.cpp181
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0045.cpp183
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0046.cpp162
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0047.cpp226
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0048.cpp203
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0049.cpp210
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0050.cpp239
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0051.cpp210
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0052.cpp145
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0053.cpp113
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0054.cpp144
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0055.cpp146
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0056.cpp210
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0057.cpp211
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0058.cpp178
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0059.cpp154
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0060.cpp218
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0061.cpp153
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0062.cpp145
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0063.cpp145
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0064.cpp135
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0065.cpp171
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0066.cpp173
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0067.cpp173
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0068.cpp292
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0069.cpp290
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0070.cpp290
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0071.cpp292
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0072.cpp292
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0073.cpp124
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0074.cpp300
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0075.cpp223
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0076.cpp220
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0077.cpp249
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0078.cpp144
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0079.cpp137
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0080.cpp137
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0081.cpp156
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0082.cpp170
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0083.cpp200
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0084.cpp177
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0085.cpp185
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0086.cpp180
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0087.cpp178
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0088.cpp189
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0089.cpp190
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0090.cpp255
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0091.cpp245
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0092.cpp206
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0093.cpp207
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0094.cpp171
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0095.cpp165
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0096.cpp167
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0097.cpp200
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0098.cpp286
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0099.cpp176
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0100.cpp162
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0101.cpp224
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0102.cpp156
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0103.cpp155
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0104.cpp158
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0105.cpp151
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0106.cpp142
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0107.cpp166
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0108.cpp221
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0109.cpp220
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0110.cpp221
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0111.cpp149
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0112.cpp169
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0113.cpp191
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0114.cpp156
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0115.cpp157
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0116.cpp169
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0117.cpp214
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0118.cpp162
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0119.cpp189
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0120.cpp165
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0121.cpp149
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0122.cpp186
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0123.cpp186
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0124.cpp161
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0125.cpp153
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0126.cpp151
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0127.cpp154
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0128.cpp153
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0129.cpp143
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0130.cpp143
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0131.cpp140
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0132.cpp153
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0133.cpp165
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0134.cpp170
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0135.cpp188
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0000.cpp156
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0001.cpp211
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0002.cpp164
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0003.cpp173
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0004.cpp163
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0005.cpp180
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0006.cpp282
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0007.cpp154
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0008.cpp242
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0009.cpp219
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0010.cpp200
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0011.cpp144
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0012.cpp226
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/NptTlsDefaultTrustAnchorsBase.cpp313
-rw-r--r--lib/libUPnP/Neptune/Source/Data/TLS/NptTlsDefaultTrustAnchorsExtended.cpp67
-rw-r--r--lib/libUPnP/Neptune/Source/System/Android/NptAndroidConsole.cpp26
-rw-r--r--lib/libUPnP/Neptune/Source/System/Android/NptAndroidDebug.cpp31
-rw-r--r--lib/libUPnP/Neptune/Source/System/Android/NptAndroidFile.cpp450
-rw-r--r--lib/libUPnP/Neptune/Source/System/Android/NptAndroidLogConfig.cpp45
-rw-r--r--lib/libUPnP/Neptune/Source/System/Apple/NptAppleAutoreleasePool.mm61
-rw-r--r--lib/libUPnP/Neptune/Source/System/Apple/NptAppleLogConfig.mm38
-rw-r--r--lib/libUPnP/Neptune/Source/System/Bsd/NptBsdBlockerSocket.h62
-rw-r--r--lib/libUPnP/Neptune/Source/System/Bsd/NptBsdNetwork.cpp651
-rw-r--r--lib/libUPnP/Neptune/Source/System/Bsd/NptBsdResolver.cpp137
-rw-r--r--lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp2337
-rwxr-xr-xlib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaConsole.mm27
-rw-r--r--lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaEnviroment.mm40
-rw-r--r--lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.h39
-rw-r--r--lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.mm104
-rw-r--r--lib/libUPnP/Neptune/Source/System/Null/NptNullAutoreleasePool.cpp27
-rw-r--r--lib/libUPnP/Neptune/Source/System/Null/NptNullDynamicLibraries.cpp23
-rw-r--r--lib/libUPnP/Neptune/Source/System/Null/NptNullFile.cpp102
-rw-r--r--lib/libUPnP/Neptune/Source/System/Null/NptNullHttpProxy.cpp23
-rw-r--r--lib/libUPnP/Neptune/Source/System/Null/NptNullNetwork.cpp23
-rw-r--r--lib/libUPnP/Neptune/Source/System/Null/NptNullQueue.cpp30
-rw-r--r--lib/libUPnP/Neptune/Source/System/Null/NptNullSerialPort.cpp83
-rw-r--r--lib/libUPnP/Neptune/Source/System/Null/NptNullSystem.cpp71
-rw-r--r--lib/libUPnP/Neptune/Source/System/Null/NptNullThreads.cpp42
-rw-r--r--lib/libUPnP/Neptune/Source/System/PS3/NptPs3System.cpp113
-rw-r--r--lib/libUPnP/Neptune/Source/System/Posix/NptPosixDynamicLibraries.cpp111
-rw-r--r--lib/libUPnP/Neptune/Source/System/Posix/NptPosixEnvironment.cpp23
-rw-r--r--lib/libUPnP/Neptune/Source/System/Posix/NptPosixFile.cpp268
-rw-r--r--lib/libUPnP/Neptune/Source/System/Posix/NptPosixNetwork.cpp35
-rw-r--r--lib/libUPnP/Neptune/Source/System/Posix/NptPosixQueue.cpp330
-rw-r--r--lib/libUPnP/Neptune/Source/System/Posix/NptPosixSystem.cpp201
-rw-r--r--lib/libUPnP/Neptune/Source/System/Posix/NptPosixThreads.cpp716
-rw-r--r--lib/libUPnP/Neptune/Source/System/Posix/NptPosixTime.cpp98
-rw-r--r--lib/libUPnP/Neptune/Source/System/Posix/NptSelectableMessageQueue.cpp84
-rw-r--r--lib/libUPnP/Neptune/Source/System/StdC/NptStdcConsole.cpp25
-rw-r--r--lib/libUPnP/Neptune/Source/System/StdC/NptStdcDebug.cpp30
-rw-r--r--lib/libUPnP/Neptune/Source/System/StdC/NptStdcEnvironment.cpp80
-rw-r--r--lib/libUPnP/Neptune/Source/System/StdC/NptStdcFile.cpp509
-rw-r--r--lib/libUPnP/Neptune/Source/System/Symbian/NptSymbianSystem.cpp116
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32Console.cpp29
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32Debug.cpp40
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp150
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32File.cpp414
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32HttpProxy.cpp43
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.cpp184
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.h52
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32Network.cpp327
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32Network.h20
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32Queue.cpp240
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp342
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32System.cpp147
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp704
-rw-r--r--lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.h73
-rwxr-xr-xlib/libUPnP/Neptune/Source/System/Win32/NptWin32Time.cpp33
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinCE/NptWinCeUtils.h92
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinCE/NptWinceConsole.cpp26
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinCE/NptWinceEnvironment.cpp63
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinCE/NptWinceMain.cpp47
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtConsole.cpp28
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtDebug.cpp30
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtEnvironment.cpp36
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtFile.cpp270
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtNetwork.cpp39
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtPch.cpp13
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtPch.h20
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtSockets.cpp664
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtSystem.cpp115
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtThreads.cpp712
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtThreads.h73
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtTime.cpp33
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtUtils.cpp73
-rw-r--r--lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtUtils.h39
-rw-r--r--lib/libUPnP/Neptune/Source/System/Xbox/NptXboxNetwork.cpp97
-rw-r--r--lib/libUPnP/Neptune/Source/System/Xbox/NptXboxNetwork.h19
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Arrays1/ArraysTest1.cpp201
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/BufferedStreams1/BufferedStreamsTest1.cpp70
-rwxr-xr-xlib/libUPnP/Neptune/Source/Tests/Crypto1/CryptoTest1.cpp171
-rwxr-xr-xlib/libUPnP/Neptune/Source/Tests/Digests1/DigestsTest1.cpp232
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/FileTest1/FileTest1.cpp370
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/FileTest2/FileTest2.cpp121
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/FileTest3/FileTest3.cpp197
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/HttpClient1/HttpClientTest1.cpp322
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/HttpClient2/HttpClientTest2.cpp253
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/HttpServer1/HttpServerTest1.cpp272
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Lists1/ListsTest1.cpp220
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Logging1/LoggingTest1.cpp181
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Logging2/LoggingTest2.cpp60
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Maps1/MapsTest1.cpp395
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Messages1/MessagesTest1.cpp407
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Messages2/MessagesTest2.cpp242
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Misc1/MiscTest1.cpp536
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Network1/NetworkTest1.cpp159
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Queue1/QueueTest1.cpp302
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/RingBuffer1/RingBufferTest1.cpp113
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/SharedVariables1/SharedVariablesTest1.cpp111
-rwxr-xr-xlib/libUPnP/Neptune/Source/Tests/Sockets1/SocketsTest1.cpp295
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Streams1/StreamsTest1.cpp74
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Strings1/StringsTest1.cpp663
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Threads1/ThreadsTest1.cpp547
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Time1/TimeTest1.cpp559
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Tls1/TlsClientPrivate1.h27
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Tls1/TlsClientPrivate2.h108
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Tls1/TlsTest1.cpp423
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Udp1/UdpTest1.cpp94
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Url1/UrlTest1.cpp309
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Xml1/XmlTest1.cpp591
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Xml1/XmlTest1Data.cpp843
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Xml1/big.xml3277
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Xml1/test.xml16
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Xml1/unicode.xml1
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Zip1/ZipTest1.cpp193
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Zip1/ZipTestData1.cpp21332
-rw-r--r--lib/libUPnP/Neptune/Source/Tests/Zip2/ZipTest2.cpp92
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/config/Generic/config.h126
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/config/Win32/config.h124
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/aes.c469
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint.c1513
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint.h99
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint_impl.h131
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/crypto.h227
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/crypto_misc.c400
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/hmac.c105
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/md2.c162
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/md5.c294
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/rc4.c93
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/rsa.c269
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/sha1.c249
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/asn1.c677
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/cert.h43
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/crypto_misc.h182
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/gen_cert.c367
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/loader.c491
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/os_port.h99
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/p12.c483
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/ssl.h511
-rwxr-xr-xlib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1.c2271
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1.h300
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1_clnt.c396
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1_svr.c479
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/version.h1
-rw-r--r--lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/x509.c578
-rw-r--r--lib/libUPnP/Platinum/Build/Boot.scons71
-rw-r--r--lib/libUPnP/Platinum/Build/Build.scons275
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/arm-android-linux/Config.scons107
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/arm-gp2x-linux/Config.scons9
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/arm-unknown-linux/Config.scons7
-rwxr-xr-xlib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser-Info.plist30
-rwxr-xr-xlib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser.xcodeproj/project.pbxproj316
-rwxr-xr-xlib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser_Prefix.pch9
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/README5
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/MobileMediaServer-Info.plist37
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/project.pbxproj3653
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/xcshareddata/xcschemes/Platinum-Mac.xcscheme77
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/xcshareddata/xcschemes/Platinum-iOS.xcscheme77
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Info.plist26
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Neptune.h2
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Platinum.h66
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/x86-unknown-cygwin/Config.scons4
-rw-r--r--lib/libUPnP/Platinum/Build/Targets/x86-unknown-linux/Config.scons5
-rw-r--r--lib/libUPnP/Platinum/Build/Tools/SCons/gcc-generic.py36
-rwxr-xr-xlib/libUPnP/Platinum/Build/Tools/Scripts/GenDocumentation.py77
-rw-r--r--lib/libUPnP/Platinum/Build/Tools/Scripts/GenSvnVersionHeader.py41
-rw-r--r--lib/libUPnP/Platinum/Build/Tools/Scripts/MakeAllVs.py37
-rw-r--r--lib/libUPnP/Platinum/Build/Tools/Scripts/VsMake.py97
-rwxr-xr-xlib/libUPnP/Platinum/Build/Tools/Scripts/XCodeMake.py83
-rw-r--r--lib/libUPnP/Platinum/CHANGELOG.txt730
-rw-r--r--lib/libUPnP/Platinum/Extras/neptune-logging.properties13
-rw-r--r--lib/libUPnP/Platinum/Extras/platinum-120x120.jpgbin0 -> 16096 bytes
-rw-r--r--lib/libUPnP/Platinum/Extras/platinum-120x120.pngbin0 -> 26577 bytes
-rw-r--r--lib/libUPnP/Platinum/Extras/platinum-48x48.jpgbin0 -> 3041 bytes
-rw-r--r--lib/libUPnP/Platinum/Extras/platinum-48x48.pngbin0 -> 4681 bytes
-rw-r--r--lib/libUPnP/Platinum/LICENSE.txt375
-rw-r--r--lib/libUPnP/Platinum/README.md131
-rw-r--r--lib/libUPnP/Platinum/SConstruct1
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowser-Info.plist22
-rwxr-xr-xlib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.h44
-rwxr-xr-xlib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.m73
-rwxr-xr-xlib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MainWindow.xib267
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.h101
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.mm130
-rwxr-xr-xlib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.h38
-rwxr-xr-xlib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.m179
-rwxr-xr-xlib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.xib192
-rwxr-xr-xlib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/main.m43
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/FrameStreamer/main.cpp249
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MediaConnect/main.cpp131
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MediaCrawler/MediaCrawler.cpp566
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MediaCrawler/MediaCrawler.h118
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MediaCrawler/StreamHandler.h113
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MediaCrawler/main.cpp83
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MicroMediaController/PltMicroMediaController.cpp869
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MicroMediaController/PltMicroMediaController.h176
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MicroMediaController/main.cpp136
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/AppDelegate.h17
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/AppDelegate.m45
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/LaunchScreen.xib41
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/Main.storyboard25
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/ViewController.h14
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/ViewController.mm70
-rw-r--r--lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/main.m16
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltAction.cpp505
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltAction.h321
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltArgument.cpp156
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltArgument.h168
-rwxr-xr-xlib/libUPnP/Platinum/Source/Core/PltConstants.cpp62
-rwxr-xr-xlib/libUPnP/Platinum/Source/Core/PltConstants.h87
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.cpp1875
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h254
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.cpp213
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.h225
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltDatagramStream.cpp169
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltDatagramStream.h117
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltDeviceData.cpp830
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltDeviceData.h260
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp953
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltDeviceHost.h341
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltEvent.cpp328
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltEvent.h191
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltHttp.cpp352
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltHttp.h214
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.cpp190
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.h121
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltHttpServer.cpp310
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltHttpServer.h100
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.cpp443
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h163
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltIconsData.cpp2580
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltMimeType.cpp162
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltMimeType.h75
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltProtocolInfo.cpp598
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltProtocolInfo.h158
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltService.cpp920
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltService.h522
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltSsdp.cpp513
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltSsdp.h389
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp269
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltStateVariable.h231
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltTaskManager.cpp236
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltTaskManager.h116
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltThreadTask.cpp190
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltThreadTask.h140
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltUPnP.cpp298
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltUPnP.h143
-rw-r--r--lib/libUPnP/Platinum/Source/Core/PltUtilities.h766
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp348
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h110
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.cpp214
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.h73
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.cpp176
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.xml88
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaConnect/process_scpds.sh9
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp996
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml515
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPDFull.xml561
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp1392
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h349
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp516
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h119
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.cpp257
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.xml132
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.cpp434
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.xml216
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD_Full.xml749
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaRenderer/process_scpds.sh15
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.cpp262
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.xml132
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.cpp267
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.xml148
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp453
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml231
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp406
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h197
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.cpp519
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h151
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp571
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h184
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaCache.cpp37
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaCache.h203
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp1128
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h348
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp711
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h196
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp578
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h218
-rw-r--r--lib/libUPnP/Platinum/Source/Devices/MediaServer/process_scpds.sh15
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Action.cpp92
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Action.h159
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/ActionArgumentDescription.cpp45
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/ActionArgumentDescription.h153
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/ActionDescription.cpp69
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/ActionDescription.h123
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Clix.h202
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/ControlPoint.cpp115
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/ControlPoint.h227
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/ControlPointEventBridge.cpp88
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/ControlPointEventBridge.h68
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/DeviceData.cpp168
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/DeviceData.h264
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/DeviceHost.cpp38
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/DeviceHost.h124
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Didl.cpp39
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Didl.h70
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/EnumerableNptArray.h226
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/EnumerableNptList.h234
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Helpers.cpp39
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Helpers.h378
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Http.cpp38
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Http.h286
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/MediaConnect.cpp59
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/MediaConnect.h80
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/MediaObject.cpp118
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/MediaObject.h735
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/MediaServer.cpp121
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/MediaServer.h131
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/MediaServerEventBridge.cpp103
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/MediaServerEventBridge.h97
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Neptun_marshal_as.h104
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneException.cpp39
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneException.h64
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneLoggingBridge.cpp38
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneLoggingBridge.h207
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Service.cpp97
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/Service.h147
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/StateVariable.cpp44
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/StateVariable.h165
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/UPnP.cpp81
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/UPnP.h131
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/Managed/clix.hpp209
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltMediaServerObject.h84
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltMediaServerObject.mm198
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltUPnPObject.h61
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltUPnPObject.mm118
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltDownloader.cpp132
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltDownloader.h89
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltFrameBuffer.cpp129
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltFrameBuffer.h76
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltFrameServer.cpp236
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltFrameServer.h103
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltFrameStream.cpp128
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltFrameStream.h79
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltLeaks.cpp99
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltLeaks.h51
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltMetadataHandler.cpp90
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltMetadataHandler.h91
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.cpp255
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.h119
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltStreamPump.cpp227
-rw-r--r--lib/libUPnP/Platinum/Source/Extras/PltStreamPump.h131
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/AndroidManifest.xml14
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/Android.mk52
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/Application.mk1
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/platinum-jni.cpp81
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/platinum-jni.h37
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/update-header.sh1
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/proguard-project.txt20
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/project.properties15
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-hdpi/ic_launcher.pngbin0 -> 9397 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-ldpi/ic_launcher.pngbin0 -> 2729 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-mdpi/ic_launcher.pngbin0 -> 5237 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-xhdpi/ic_launcher.pngbin0 -> 14383 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/layout/main.xml12
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/values/strings.xml7
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/src/com/plutinosoft/platinum/UPnP.java25
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/AndroidManifest.xml24
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/proguard-project.txt20
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/project.properties15
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-hdpi/ic_launcher.pngbin0 -> 9397 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-ldpi/ic_launcher.pngbin0 -> 2729 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-mdpi/ic_launcher.pngbin0 -> 5237 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-xhdpi/ic_launcher.pngbin0 -> 14383 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/layout/main.xml22
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/values/strings.xml7
-rw-r--r--lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/src/com/plutinosoft/platinum/sample/PlatinumUPnPActivity.java44
-rw-r--r--lib/libUPnP/Platinum/Source/Platinum/Platinum.h111
-rw-r--r--lib/libUPnP/Platinum/Source/Platinum/PltVersion.h44
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/FileMediaServer/FileMediaServerTest.cpp159
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/Http/HttpTest.cpp526
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/LightSample/LightSampleTest.cpp76
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/LightSample/PltLightSample.cpp171
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/LightSample/PltLightSample.h59
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaRenderer/MediaRendererTest.cpp121
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/English.lproj/InfoPlist.strings1
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/English.lproj/MainMenu.xib3224
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest-Info.plist32
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTestController.h20
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTestController.mm64
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.h28
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.m212
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.mm195
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_DataModel.xcdatamodel/elementsbin0 -> 1199 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_DataModel.xcdatamodel/layoutbin0 -> 475 bytes
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_Prefix.pch7
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/main.mm14
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/Simple/PltSimple.cpp111
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/Simple/PltSimple.h56
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/Simple/SimpleTest.cpp63
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/Ssdp/SsdpTest1.cpp66
-rw-r--r--lib/libUPnP/Platinum/Source/Tests/Time/TimeTest1.cpp189
-rw-r--r--lib/libUPnP/Platinum/Source/Tools/SsdpProxy/SsdpProxy.cpp405
-rw-r--r--lib/libUPnP/Platinum/Source/Tools/SsdpProxy/SsdpProxy.h109
-rw-r--r--lib/libUPnP/Platinum/Source/Tools/TextToHeader/TextToHeader.cpp267
-rw-r--r--lib/libUPnP/patches/0001-platinum-fix-compile-error-in-NptWin32Threads.cpp.patch14
-rw-r--r--lib/libUPnP/patches/0002-platinum-add-custom-CMakeLists.txt.patch132
-rw-r--r--lib/libUPnP/patches/0003-platinum-log-allowed-values-with-state-variable-erro.patch39
-rw-r--r--lib/libUPnP/patches/0004-platinum-make-sure-Neptune-threads-are-named.patch45
-rw-r--r--lib/libUPnP/patches/0005-platinum-use-server-provided-item-count-to-iterate-b.patch95
-rw-r--r--lib/libUPnP/patches/0006-platinum-report-and-support-proper-mimetypes-for-mat.patch40
-rw-r--r--lib/libUPnP/patches/0007-platinum-also-support-sort-criterias-in-format-res-p.patch26
-rw-r--r--lib/libUPnP/patches/0008-platinum-allow-some-statevariables-to-reset-to-defau.patch151
-rw-r--r--lib/libUPnP/patches/0009-platinum-add-support-for-upnp-lastPlaybackPosition-u.patch96
-rw-r--r--lib/libUPnP/patches/0010-platinum-use-PersonRole-for-directors.-Also-fixes-Fr.patch129
-rw-r--r--lib/libUPnP/patches/0011-platinum-support-video-ratings.patch66
-rw-r--r--lib/libUPnP/patches/0012-platinum-increase-number-of-requested-items-per-iter.patch26
-rw-r--r--lib/libUPnP/patches/0013-platinum-fixes-support-for-filtering-by-the-extended.patch71
-rw-r--r--lib/libUPnP/patches/0014-platinum-switch-to-NPT_UInt64-for-bitmask-flags.patch212
-rw-r--r--lib/libUPnP/patches/0015-platinum-fix-missing-filtering-for-extra-metadata.patch85
-rw-r--r--lib/libUPnP/patches/0016-platinum-fix-compilation-by-using-the-right-suffix-f.patch101
-rw-r--r--lib/libUPnP/patches/0017-platinum-don-t-disregard-PLT_MediaObjects-only-for-l.patch32
-rw-r--r--lib/libUPnP/patches/0018-platinum-add-SetNextAVTransportURI-support-to-media-.patch2048
-rw-r--r--lib/libUPnP/patches/0019-platinum-add-support-for-UpdateObject-action.patch996
-rw-r--r--lib/libUPnP/patches/0020-platinum-fixed-compiler-warning-about-unused-var.patch32
-rw-r--r--lib/libUPnP/patches/0021-platinum-fix-shadowed-local-var.patch27
-rw-r--r--lib/libUPnP/patches/0022-platinum-Add-audio-x-flac-MIME-type-to-Neptune.patch32
-rw-r--r--lib/libUPnP/patches/0023-platinum-lastPlaybackTime-is-in-the-upnp-and-not-in-.patch26
-rw-r--r--lib/libUPnP/patches/0024-platinum-add-already-supported-default-filters.patch25
-rw-r--r--lib/libUPnP/patches/0025-platinum-add-proper-support-for-dc-publisher.patch124
-rw-r--r--lib/libUPnP/patches/0026-platinum-add-support-for-upnp-episodeCount-and-upnp-.patch131
-rw-r--r--lib/libUPnP/patches/0027-platinum-add-support-for-xbmc-specific-fields-datead.patch284
-rw-r--r--lib/libUPnP/patches/0028-platinum-add-SearchSync-method-to-SyncMediaBrowser.patch254
-rw-r--r--lib/libUPnP/patches/0029-platinum-implement-GetSearchCapabilities-in-media-br.patch251
-rw-r--r--lib/libUPnP/patches/0030-platinum-implement-GetSortCapabilities-in-media-brow.patch236
-rw-r--r--lib/libUPnP/patches/0031-platinum-only-apply-Xbox-specific-friendlyName-restr.patch39
-rw-r--r--lib/libUPnP/patches/0032-platinum-improve-logging-on-bad-HTTP-requests.patch150
-rw-r--r--lib/libUPnP/patches/0033-platinum-fix-filter-mask-values-of-xbmc-votes-and-xb.patch28
-rw-r--r--lib/libUPnP/patches/0034-platinum-add-xbmc-uniqueidentifier-for-IMDB-TVDB-ide.patch109
-rw-r--r--lib/libUPnP/patches/0035-platinum-Changes-to-external-subtitles-over-UPnP-wor.patch122
-rw-r--r--lib/libUPnP/patches/0036-platinum-add-xbmc-country-for-countries.patch103
-rw-r--r--lib/libUPnP/patches/0037-platinum-add-xbmc-userrating-for-user-ratings.patch100
-rw-r--r--lib/libUPnP/patches/0038-platinum-add-support-for-multiple-ratings.patch63
-rw-r--r--lib/libUPnP/patches/0039-platinum-fix-potential-crash-in-parsetaglist.patch26
-rw-r--r--lib/libUPnP/patches/0040-platinum-add-resume-playerstate.patch107
-rw-r--r--lib/libUPnP/patches/0042-platinum-switch-build-to-unicode.patch85
-rw-r--r--lib/libUPnP/patches/0043-platinum-Fix-upnp-lastPlaybackPosition-parsing.patch32
-rw-r--r--lib/libUPnP/patches/0044-platinum-Prefer-override-usage.patch2307
-rw-r--r--lib/libUPnP/patches/0045-platinum-win10-uwp-fixes.patch238
-rw-r--r--lib/libUPnP/patches/0046-platinum-fix-format-security-warning.patch22
-rw-r--r--lib/libUPnP/patches/0047-neptune-fix-device-discovery-on-windows.patch49
-rw-r--r--lib/libUPnP/patches/0048-libUPnP-Remove-unused-headers-from-Platinum-Source-E.patch29
-rw-r--r--lib/libUPnP/patches/0049-libUPnP-fix-no-permissive-build.patch182
776 files changed, 210172 insertions, 0 deletions
diff --git a/lib/libUPnP/CMakeLists.txt b/lib/libUPnP/CMakeLists.txt
new file mode 100644
index 0000000..c610060
--- /dev/null
+++ b/lib/libUPnP/CMakeLists.txt
@@ -0,0 +1,134 @@
+set(SOURCES Platinum/Source/Core/PltAction.cpp
+ Platinum/Source/Core/PltArgument.cpp
+ Platinum/Source/Core/PltConstants.cpp
+ Platinum/Source/Core/PltCtrlPoint.cpp
+ Platinum/Source/Core/PltCtrlPointTask.cpp
+ Platinum/Source/Core/PltDatagramStream.cpp
+ Platinum/Source/Core/PltDeviceData.cpp
+ Platinum/Source/Core/PltDeviceHost.cpp
+ Platinum/Source/Core/PltEvent.cpp
+ Platinum/Source/Core/PltHttp.cpp
+ Platinum/Source/Core/PltHttpClientTask.cpp
+ Platinum/Source/Core/PltHttpServer.cpp
+ Platinum/Source/Core/PltHttpServerTask.cpp
+ Platinum/Source/Core/PltIconsData.cpp
+ Platinum/Source/Core/PltMimeType.cpp
+ Platinum/Source/Core/PltProtocolInfo.cpp
+ Platinum/Source/Core/PltService.cpp
+ Platinum/Source/Core/PltSsdp.cpp
+ Platinum/Source/Core/PltStateVariable.cpp
+ Platinum/Source/Core/PltTaskManager.cpp
+ Platinum/Source/Core/PltThreadTask.cpp
+ Platinum/Source/Core/PltUPnP.cpp
+ Platinum/Source/Devices/MediaServer/PltDidl.cpp
+ Platinum/Source/Devices/MediaServer/PltFileMediaServer.cpp
+ Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
+ Platinum/Source/Devices/MediaServer/PltMediaCache.cpp
+ Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+ Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+ Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.cpp
+ Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.cpp
+ Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp
+ Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+ Neptune/Source/Core/Neptune.cpp
+ Neptune/Source/Core/NptAutomaticCleaner.cpp
+ Neptune/Source/Core/NptBase64.cpp
+ Neptune/Source/Core/NptBufferedStreams.cpp
+ Neptune/Source/Core/NptCommon.cpp
+ Neptune/Source/Core/NptDataBuffer.cpp
+ Neptune/Source/Core/NptDebug.cpp
+ Neptune/Source/Core/NptFile.cpp
+ Neptune/Source/Core/NptHash.cpp
+ Neptune/Source/Core/NptHttp.cpp
+ Neptune/Source/Core/NptList.cpp
+ Neptune/Source/Core/NptLogging.cpp
+ Neptune/Source/Core/NptMessaging.cpp
+ Neptune/Source/Core/NptNetwork.cpp
+ Neptune/Source/Core/NptQueue.cpp
+ Neptune/Source/Core/NptResults.cpp
+ Neptune/Source/Core/NptRingBuffer.cpp
+ Neptune/Source/Core/NptSimpleMessageQueue.cpp
+ Neptune/Source/Core/NptSockets.cpp
+ Neptune/Source/Core/NptStreams.cpp
+ Neptune/Source/Core/NptStrings.cpp
+ Neptune/Source/Core/NptSystem.cpp
+ Neptune/Source/Core/NptThreads.cpp
+ Neptune/Source/Core/NptTime.cpp
+ Neptune/Source/Core/NptTls.cpp
+ Neptune/Source/Core/NptUri.cpp
+ Neptune/Source/Core/NptUtils.cpp
+ Neptune/Source/Core/NptXml.cpp
+ Neptune/Source/System/Bsd/NptBsdResolver.cpp
+ Neptune/Source/System/Bsd/NptBsdSockets.cpp
+ Neptune/Source/System/StdC/NptStdcDebug.cpp
+ Neptune/Source/System/StdC/NptStdcEnvironment.cpp
+ Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp
+ Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp
+ Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp
+ Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.cpp
+ Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.cpp
+ Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.cpp
+ Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp
+ Neptune/Source/System/Posix/NptPosixEnvironment.cpp)
+
+if(NOT CORE_SYSTEM_NAME STREQUAL windows AND NOT CORE_SYSTEM_NAME STREQUAL windowsstore)
+ list(APPEND SOURCES Neptune/Source/System/Posix/NptPosixSystem.cpp
+ Neptune/Source/System/Posix/NptSelectableMessageQueue.cpp
+ Neptune/Source/System/Posix/NptPosixQueue.cpp
+ Neptune/Source/System/Posix/NptPosixThreads.cpp
+ Neptune/Source/System/Posix/NptPosixTime.cpp
+ Neptune/Source/System/Bsd/NptBsdNetwork.cpp)
+ if(APPLE)
+ list(APPEND SOURCES Neptune/Source/System/Apple/NptAppleAutoreleasePool.mm)
+ set_property(SOURCE Neptune/Source/System/Apple/NptAppleAutoreleasePool.mm APPEND_STRING PROPERTY COMPILE_OPTIONS "-fno-objc-arc")
+ else()
+ list(APPEND SOURCES Neptune/Source/System/Null/NptNullAutoreleasePool.cpp)
+ endif()
+else()
+ list(APPEND SOURCES Neptune/Source/System/Win32/NptWin32Console.cpp
+ Neptune/Source/System/Win32/NptWin32Debug.cpp
+ Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp
+ Neptune/Source/System/Win32/NptWin32MessageQueue.cpp
+ Neptune/Source/System/Win32/NptWin32Network.cpp
+ Neptune/Source/System/Win32/NptWin32Queue.cpp
+ Neptune/Source/System/Win32/NptWin32SerialPort.cpp
+ Neptune/Source/System/Win32/NptWin32System.cpp
+ Neptune/Source/System/Win32/NptWin32Threads.cpp
+ Neptune/Source/System/Win32/NptWin32Time.cpp)
+endif()
+
+if(CORE_SYSTEM_NAME STREQUAL "freebsd")
+ list(APPEND SOURCES Neptune/Source/System/Bsd/NptBsdResolver.cpp
+ Neptune/Source/System/Bsd/NptBsdSockets.cpp)
+endif()
+
+
+add_library(upnp STATIC ${SOURCES} ${HEADERS})
+target_compile_definitions(upnp PUBLIC -DNPT_CONFIG_ENABLE_LOGGING)
+if(CORE_SYSTEM_NAME STREQUAL "freebsd")
+ target_compile_definitions(upnp PUBLIC -DNPT_CONFIG_HAVE_GETADDRINFO)
+endif()
+
+set(INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}
+ Platinum/Source/Core
+ Platinum/Source/Platinum
+ Platinum/Source/Devices/MediaConnect
+ Platinum/Source/Devices/MediaRenderer
+ Platinum/Source/Devices/MediaServer
+ Neptune/Source/Core
+ Neptune/Source/System/Posix)
+target_include_directories(upnp SYSTEM INTERFACE ${INCLUDE_DIRECTORIES})
+target_include_directories(upnp PRIVATE ${INCLUDE_DIRECTORIES})
+if(CORE_SYSTEM_NAME STREQUAL windows OR CORE_SYSTEM_NAME STREQUAL windowsstore)
+ target_include_directories(upnp PRIVATE Neptune/Source/System/Win32)
+endif()
+set_target_properties(upnp PROPERTIES CXX_CLANG_TIDY "")
+set_target_properties(upnp PROPERTIES CXX_CPPCHECK "")
+set_target_properties(upnp PROPERTIES CXX_INCLUDE_WHAT_YOU_USE "")
+set_target_properties(upnp PROPERTIES FOLDER lib)
+source_group_by_folder(upnp)
+set(core_DEPENDS upnp ${core_DEPENDS} CACHE STRING "" FORCE)
+
+if(CORE_SYSTEM_NAME STREQUAL windowsstore)
+ set_target_properties(upnp PROPERTIES STATIC_LIBRARY_FLAGS "/ignore:4264")
+endif()
diff --git a/lib/libUPnP/Neptune/Build/Boot.scons b/lib/libUPnP/Neptune/Build/Boot.scons
new file mode 100644
index 0000000..979573b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Boot.scons
@@ -0,0 +1,66 @@
+import sys
+import os
+import platform
+
+EnsureSConsVersion(0,98,1)
+
+#######################################################
+# reusable functions and data structures
+#######################################################
+
+# Platform to Target Map (specifies which default target to build on a platform)
+PLATFORM_TO_TARGET_MAP = {
+ 'linux-i386' : 'x86-unknown-linux',
+ 'linux-x86_64': 'x86_64-unknown-linux',
+ 'linux-arm' : 'arm-unknown-linux',
+ 'linux2' : 'x86-unknown-linux',
+ 'win32' : 'x86-microsoft-win32',
+ 'cygwin' : 'x86-unknown-cygwin',
+ 'darwin' : 'universal-apple-macosx'
+}
+
+# list all target dirs
+scons_root = Environment().GetBuildPath('#')
+targets_dir = scons_root+'/Build/Targets'
+targets_dirs = os.listdir(targets_dir)
+TARGET_PLATFORMS = [x for x in targets_dirs if os.path.exists(targets_dir +'/'+x+'/Config.scons')]
+
+def DefaultTarget():
+ platform_id = sys.platform
+ if platform.system() == 'Linux':
+ if (platform.machine() == 'i386' or
+ platform.machine() == 'i486' or
+ platform.machine() == 'i586'or
+ platform.machine() == 'i686'):
+ platform_id = 'linux-i386'
+ if (platform.machine() == 'x86_64'):
+ platform_id = 'linux-x86_64'
+ if (platform.machine().startswith('arm')):
+ platform_id = 'linux-arm'
+
+ if PLATFORM_TO_TARGET_MAP.has_key(platform_id):
+ return PLATFORM_TO_TARGET_MAP[platform_id]
+ else:
+ return None
+
+#######################################################
+# Main Build
+#######################################################
+options = Variables()
+options.AddVariables(
+ EnumVariable('target', 'Build Target', DefaultTarget(), allowed_values=TARGET_PLATFORMS),
+ BoolVariable('stop_on_warning', 'Stop the build on warnings', False),
+ BoolVariable('shared', 'Build a shared library', False),
+ ListVariable('build_config', 'build configurations', 'Debug', names=['Debug', 'Release'])
+)
+
+env = Environment(variables=options)
+Help(options.GenerateHelpText(env))
+
+### call the actual build script for each build config
+base_env = env
+for build_config in env['build_config']:
+ env = base_env.Clone()
+ env['build_config'] = build_config
+ print '********** Configuring Build Target =', env['target'], '/', build_config, '********'
+ SConscript('Build.scons', variant_dir='Targets/'+env['target']+'/'+build_config, exports='env', duplicate=0)
diff --git a/lib/libUPnP/Neptune/Build/Build.scons b/lib/libUPnP/Neptune/Build/Build.scons
new file mode 100644
index 0000000..ff5021d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Build.scons
@@ -0,0 +1,237 @@
+import sys
+import os
+import imp
+from glob import glob
+
+#######################################################
+# reusable functions and data structures
+#######################################################
+def LoadTool(name, env, **kw):
+ config_path = GetBuildPath('#/Build/Tools/SCons')
+ file, path, desc = imp.find_module(name, [config_path])
+ module = imp.load_module(name, file, path, desc)
+ module.generate(env, **kw)
+
+def MergeListUnique(item_list, items):
+ for item in items:
+ if not item in item_list: item_list.append(item)
+
+def MergeItemUnique(item_list, item):
+ if not item in item_list: item_list.append(item)
+
+def GlobSources(drct, patterns, excluded_files=[]):
+ root = GetBuildPath('#'+drct)
+ files = []
+ for pattern in Split(patterns):
+ files += glob(root+'/'+pattern)
+ return [drct+'/'+os.path.basename(x) for x in files if os.path.basename(x) not in excluded_files]
+
+def GetDirPath(dir):
+ return '#/'+dir
+
+def DeclareBuildDir(dir):
+ env.VariantDir(dir, GetDirPath(dir), duplicate=0)
+
+def GetIncludeDirs(modules, exclude=None):
+ dirs = []
+ for module in Split(modules):
+ if Modules.has_key(module) and not module == exclude:
+ dirs += Modules[module].GetIncludeDirs()
+ else:
+ dirs += [GetDirPath(module)]
+ return dirs
+
+def GetLibraries(modules):
+ libs = []
+ for module in Split(modules):
+ if Modules.has_key(module):
+ libs += Modules[module].GetLibraries()
+ else:
+ libs += [module]
+ return libs
+
+def BuildApp(source_dir, name, deps):
+ DeclareBuildDir(source_dir)
+ libs = GetLibraries(deps)
+ cpp_path = GetIncludeDirs(deps)
+ prog = env.Program(target=name,
+ source=GlobSources(source_dir, ['*c', '*.cpp']),
+ LIBS=libs, CPPPATH=cpp_path)
+ env.Alias(name, prog)
+
+Modules = {}
+class Module:
+ def __init__(self, name, included_modules = [], linked_modules = []):
+ self.name = name
+ self.included_modules = included_modules
+ self.linked_modules = linked_modules
+ self.product = []
+
+ def GetLibraries(self):
+ return self.product+GetLibraries(self.linked_modules)
+
+ def GetIncludeDirs(self):
+ return GetIncludeDirs(self.included_modules+self.build_include_dirs, self.name)
+
+class LibraryModule(Module):
+ def __init__(self, name,
+ build_source_dirs = ['.'],
+ build_source_files = {},
+ source_root = 'Source',
+ build_source_pattern = ['*.c', '*.cpp'],
+ build_include_dirs = [],
+ included_modules = [],
+ included_only_modules = [],
+ linked_modules = [],
+ environment = None,
+ excluded_files = [],
+ extra_cpp_defines = [],
+ shared = False) :
+ build_source_dirs = [source_root+'/'+drct for drct in build_source_dirs]
+ Module.__init__(self,
+ name,
+ Split(included_modules)+Split(included_only_modules)+Split(build_source_dirs),
+ Split(linked_modules)+Split(included_modules))
+ self.build_include_dirs = build_include_dirs
+ if environment is None:
+ self.env = env.Clone()
+ else:
+ self.env = environment.Clone()
+ self.env.AppendUnique(CPPDEFINES = extra_cpp_defines)
+
+ # store this new object in the module dictionary
+ Modules[name] = self
+
+ # for each source drct to build, create a BuildDir
+ # to say where we want the object files to be built,
+ # and compute the list of source files to build
+ sources = []
+ for drct in Split(build_source_dirs):
+ DeclareBuildDir(drct)
+ sources += GlobSources(drct, build_source_pattern, excluded_files)
+
+ # add cherry-picked files
+ for drct in build_source_files.keys():
+ pattern = build_source_files[drct]
+ drct_path = source_root+'/'+drct
+ DeclareBuildDir(drct_path)
+ sources += GlobSources(drct_path, pattern)
+
+ # calculate our build include path
+ cpp_path = GetIncludeDirs(Split(self.build_include_dirs) + Split(build_source_dirs) + self.included_modules + self.linked_modules)
+
+ # the product is a library
+ self.env.AppendUnique(CPPPATH=cpp_path)
+ if shared is False:
+ self.product = self.env.Library(target=name, source=sources)
+ else:
+ libs = GetLibraries(Split(linked_modules))
+ self.product = self.env.SharedLibrary(target=name, LIBS=libs, source=sources)
+ self.env.Alias(name, self.product)
+
+
+def Application(name, dir):
+ DeclareBuildDir(dir)
+ libs = GetLibraries('Neptune')
+ cpp_path = GetIncludeDirs('Neptune')
+
+ prog = env.Program(name,
+ GlobSources(dir, ['*.c', '*.cpp']) + env['NPT_EXTRA_EXECUTABLE_OBJECTS'],
+ LIBS=libs, CPPPATH=cpp_path)
+ #env.Alias(name, prog)
+ if env.has_key('NPT_EXECUTABLE_POST_PROCESSOR'):
+ env.AddPostAction(prog, env['NPT_EXECUTABLE_POST_PROCESSOR'])
+
+#######################################################
+# Main Build
+#######################################################
+Import("env")
+
+### defaults
+env['NPT_EXTRA_LIBS'] = []
+env['NPT_EXTRA_EXECUTABLE_OBJECTS'] = []
+
+if (env['build_config'] == 'Debug'):
+ env.AppendUnique(CPPDEFINES=['NPT_DEBUG', 'NPT_CONFIG_ENABLE_LOGGING'])
+else:
+ env.AppendUnique(CPPDEFINES=['NDEBUG', 'NPT_CONFIG_ENABLE_LOGGING'])
+
+### try to read in any target specific configuration
+target_config_file = env.GetBuildPath('#/Build/Targets/'+env['target']+'/Config.scons')
+if os.path.exists(target_config_file):
+ # Load the target-specific config file
+ execfile(target_config_file)
+
+#######################################################
+# modules
+#######################################################
+
+extra_cpp_flags = []
+if not env.has_key('NPT_CONFIG_NO_ZIP'):
+ env.AppendUnique(CPPDEFINES=['NPT_CONFIG_ENABLE_ZIP'])
+ zlib_sources = ['../ThirdParty/zlib-1.2.8']
+else:
+ zlib_sources = []
+
+if not env.has_key('NPT_CONFIG_NO_SSL'):
+ env.AppendUnique(CPPDEFINES=['NPT_CONFIG_ENABLE_TLS'])
+ axtls_sources = ['../ThirdParty/axTLS/crypto', '../ThirdParty/axTLS/ssl', '../ThirdParty/axTLS/config/Generic']
+ tls_data_dirs = ['Data/TLS']
+ tls_tests = ['Tls1']
+else:
+ axtls_sources = []
+ tls_data_dirs = []
+ tls_tests = []
+
+
+if env['shared']:
+ LibraryModule(name = 'Neptune',
+ build_source_dirs = ['Core']+tls_data_dirs+axtls_sources+zlib_sources,
+ build_source_files = env['NPT_SYSTEM_SOURCES'],
+ linked_modules = env['NPT_EXTRA_LIBS'],
+ shared = True)
+else:
+ LibraryModule(name = 'Zlib',
+ source_root = '.',
+ build_source_dirs = ['ThirdParty/zlib-1.2.3'])
+
+ LibraryModule(name = 'axTLS',
+ source_root = '.',
+ build_source_dirs = ['ThirdParty/axTLS/crypto', 'ThirdParty/axTLS/ssl', 'ThirdParty/axTLS/config/Generic'])
+
+ LibraryModule(name = 'Neptune',
+ build_source_dirs = ['Core']+tls_data_dirs,
+ build_source_files = env['NPT_SYSTEM_SOURCES'],
+ linked_modules = env['NPT_EXTRA_LIBS']+['Zlib']+['axTLS'])
+
+for app in ['NetPump', 'NetConfig', 'NetPing', 'NetEcho', 'NetGet', 'NetResolve', 'NetBench', 'MiniHttpServer', 'ZipHttpServer']:
+ Application(app, 'Source/Apps/'+app)
+
+tests = ['Arrays1',
+ 'BufferedStreams1',
+ 'HttpClient1',
+ 'HttpClient2',
+ 'HttpServer1',
+ 'Network1',
+ 'Lists1',
+ 'Maps1',
+ 'Misc1',
+ 'RingBuffer1',
+ 'Strings1',
+ 'Xml1',
+ 'Udp1',
+ 'Threads1',
+ 'Queue1',
+ 'Messages1',
+ 'Messages2',
+ 'Url1',
+ 'Zip1',
+ 'Zip2',
+ 'Time1',
+ 'Sockets1',
+ 'FileTest1',
+ 'FileTest2',
+ 'FileTest3']+tls_tests
+
+for test in tests:
+ Application(test+'Test', 'Source/Tests/'+test)
diff --git a/lib/libUPnP/Neptune/Build/Targets/any-blackberry-qnx/Config.scons b/lib/libUPnP/Neptune/Build/Targets/any-blackberry-qnx/Config.scons
new file mode 100644
index 0000000..38675af
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/any-blackberry-qnx/Config.scons
@@ -0,0 +1,23 @@
+### compiler flags
+env.AppendUnique(CCFLAGS = ['-w9'])
+env.AppendUnique(CFLAGS = [])
+env.AppendUnique(CPPFLAGS = [])
+
+if env['build_config'] == 'Debug':
+ env.AppendUnique(CCFLAGS = '-g')
+else:
+ env.AppendUnique(CCFLAGS = '-O')
+
+env['ARCOM'] = 'qcc -A $TARGET $SOURCES'
+env['RANLIB'] = 'echo'
+env['CC'] = 'qcc -lang-c'
+env['CXX'] = 'qcc -lang-c++'
+env['LINK'] = 'qcc -lang-c++'
+
+env['ENV']['PATH'] = os.environ['PATH'] + ':' + env['ENV']['PATH']
+env['ENV']['QNX_HOST'] = os.environ['QNX_HOST']
+env['ENV']['QNX_TARGET'] = os.environ['QNX_TARGET']
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Bsd':'*.cpp', 'System/Posix':'*.cpp', 'System/Null':'NptNullSerialPort.cpp'}
+env['NPT_EXTRA_LIBS']=['m', 'socket']
diff --git a/lib/libUPnP/Neptune/Build/Targets/any-google-pnacl/Config.scons b/lib/libUPnP/Neptune/Build/Targets/any-google-pnacl/Config.scons
new file mode 100644
index 0000000..574ef35
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/any-google-pnacl/Config.scons
@@ -0,0 +1,13 @@
+### Compiler settings
+#LoadTool('gcc-generic', env, gcc_cross_prefix='pnacl', gcc_strict=False)
+env['ENV']['PATH'] = os.environ['PATH'] + ':' + env['ENV']['PATH']
+
+env['CC'] = 'pnacl-clang'
+env['CXX'] = 'pnacl-clang++'
+env['LINK'] = 'pnacl-clang++'
+env['RANLIB'] = 'pnacl-ranlib'
+env['AR'] = 'pnacl-ar'
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Posix':'NptPosixThreads.cpp NptPosixSystem.cpp', 'System/Nacl':'*.cpp', 'System/Null':'NptNullSerialPort.cpp'}
+env['NPT_EXTRA_LIBS']=['m', 'pthread']
diff --git a/lib/libUPnP/Neptune/Build/Targets/arm-android-linux/Config.scons b/lib/libUPnP/Neptune/Build/Targets/arm-android-linux/Config.scons
new file mode 100644
index 0000000..40fe821
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/arm-android-linux/Config.scons
@@ -0,0 +1,111 @@
+#################################################################
+# Important: this build file has been tested with Android NDK 11
+# It may or may not work with other releases of the NDK. Please notify
+# us if you find a newer NDK for which this does not work.
+#################################################################
+
+import os
+import re
+import sys
+import platform
+
+# we need to know when the NDK is
+ANDROID_NDK_ROOT=os.getenv('ANDROID_NDK_ROOT')
+if not ANDROID_NDK_ROOT:
+ raise Exception('ANDROID_NDK_ROOT environment variable not set')
+
+# detect the host system on which we're running
+if env.has_key('android_host_system') and env['android_host_system']:
+ ANDROID_HOST_SYSTEM = env['android_host_system']
+else:
+ PLATFORM_TO_TARGET_MAP = {
+ 'linux-i386' : 'linux-x86',
+ 'linux2' : 'linux-x86',
+ 'win32' : 'windows',
+ 'cygwin' : 'windows',
+ 'darwin' : 'darwin-x86_64'
+ }
+ if sys.platform in PLATFORM_TO_TARGET_MAP:
+ ANDROID_HOST_SYSTEM = PLATFORM_TO_TARGET_MAP[sys.platform]
+ else:
+ raise Exception('Android Host Platform cannot be determined')
+
+# set defaults
+ANDROID_ARCH = 'arm'
+ANDROID_PLATFORM = 'android-9'
+ANDROID_TOOLCHAIN = 'arm-linux-androideabi-4.9'
+ANDROID_CROSS_PREFIX = 'arm-linux-androideabi'
+
+if not os.path.exists(os.path.join(ANDROID_NDK_ROOT, 'toolchains', ANDROID_TOOLCHAIN)):
+ toolchain_dirs = os.listdir(ANDROID_NDK_ROOT+'/toolchains')
+ for toolchain_dir in toolchain_dirs:
+ if os.path.exists(os.path.join(ANDROID_NDK_ROOT, 'toolchains', toolchain_dir, 'prebuilt', ANDROID_HOST_SYSTEM)):
+ ANDROID_TOOLCHAIN=toolchain_dir
+ suffix_pos = toolchain_dir.rfind('-')
+ if (suffix_pos >= 0):
+ ANDROID_CROSS_PREFIX = ANDROID_TOOLCHAIN[:suffix_pos]
+ print "Auto-selecting toolchain:", ANDROID_TOOLCHAIN
+ break
+
+# override defaults from command line args
+if ARGUMENTS.get('android_toolchain'):
+ ANDROID_TOOLCHAIN=ARGUMENTS.get('android_toolchain')
+
+if ARGUMENTS.get('android_cross_prefix'):
+ ANDROID_CROSS_PREFIX=ARGUMENTS.get('android_cross_prefix')
+
+if ARGUMENTS.get('android_platform'):
+ ANDROID_PLATFORM=ARGUMENTS.get('android_platform')
+
+if ARGUMENTS.get('android_arch'):
+ ANDROID_ARCH=ARGUMENTS.get('android_arch')
+
+print 'Building for Android: '
+print 'ANDROID_HOST_SYSTEM =', ANDROID_HOST_SYSTEM
+print 'ANDROID_TOOLCHAIN =', ANDROID_TOOLCHAIN
+print 'ANDROID_PLATFORM =', ANDROID_PLATFORM
+print 'ANDROID_ARCH =', ANDROID_ARCH
+
+ANDROID_TOOLCHAIN_BIN = ANDROID_NDK_ROOT+'/toolchains/'+ANDROID_TOOLCHAIN+'/prebuilt/'+ANDROID_HOST_SYSTEM+'/bin'
+if not os.path.exists(ANDROID_TOOLCHAIN_BIN) and ANDROID_HOST_SYSTEM is 'darwin-x86':
+ ANDROID_HOST_SYSTEM = 'darwin-x86_64'
+ ANDROID_TOOLCHAIN_BIN = ANDROID_NDK_ROOT+'/toolchains/'+ANDROID_TOOLCHAIN+'/prebuilt/'+ANDROID_HOST_SYSTEM+'/bin'
+ANDROID_SYSROOT = ANDROID_NDK_ROOT+'/platforms/'+ANDROID_PLATFORM+'/arch-'+ANDROID_ARCH
+
+### add the tools to the path
+env.PrependENVPath('PATH', ANDROID_TOOLCHAIN_BIN)
+
+### special C Runtime startup for executables
+env['NPT_EXTRA_EXECUTABLE_OBJECTS'] = []
+env['NPT_EXTRA_LIBS'] = ['gcc']
+
+### Load the tools
+LoadTool('gcc-generic', env, gcc_cross_prefix=ANDROID_CROSS_PREFIX, gcc_strict=False)
+env.AppendUnique(CCFLAGS = ['-I'+ANDROID_NDK_ROOT+'/sources/cxx-stl/system/include' ,
+ '--sysroot', ANDROID_SYSROOT,
+ '-msoft-float',
+ '-fpic',
+ '-mthumb-interwork',
+ '-ffunction-sections',
+ '-funwind-tables',
+ '-fstack-protector',
+ '-fno-short-enums'])
+env.AppendUnique(CXXFLAGS = ['-fno-exceptions', '-fno-rtti'])
+env.AppendUnique(CPPDEFINES = ['ANDROID', 'NPT_CONFIG_HAVE_SYSTEM_LOG_CONFIG'])
+env.AppendUnique(LINKFLAGS = ['--sysroot', ANDROID_SYSROOT,
+ '-Wl,--no-undefined',
+ '-Wl,-z,noexecstack',
+ '-L'+ANDROID_SYSROOT+'/usr/lib',
+ '-lc',
+ '-lstdc++',
+ '-lm',
+ '-llog',
+ '-ldl',
+ '-pie'])
+
+### Specific System choices
+env['NPT_SYSTEM_SOURCES']={'System/StdC':['NptStdcConsole.cpp', 'NptStdcEnvironment.cpp'],
+ 'System/Bsd':'*.cpp',
+ 'System/Posix':'*.cpp',
+ 'System/Null':['NptNullSerialPort.cpp', 'NptNullAutoreleasePool.cpp'],
+ 'System/Android':'*.cpp'}
diff --git a/lib/libUPnP/Neptune/Build/Targets/mipsel-sigma-linux/Config.scons b/lib/libUPnP/Neptune/Build/Targets/mipsel-sigma-linux/Config.scons
new file mode 100644
index 0000000..18eb6ee
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/mipsel-sigma-linux/Config.scons
@@ -0,0 +1,5 @@
+LoadTool('gcc-generic', env, gcc_cross_prefix='mipsel-linux')
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Bsd':'*.cpp', 'System/Posix':'*.cpp', 'System/Null':'NptNullSerialPort.cpp'}
+env['NPT_EXTRA_LIBS']=['pthread']
diff --git a/lib/libUPnP/Neptune/Build/Targets/ppu-sony-ps3/Config.scons b/lib/libUPnP/Neptune/Build/Targets/ppu-sony-ps3/Config.scons
new file mode 100644
index 0000000..a6ae338
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/ppu-sony-ps3/Config.scons
@@ -0,0 +1,8 @@
+LoadTool('gcc-generic', env, gcc_cross_prefix='ppu-lv2')
+
+## add a post processing step for execuables
+env['NPT_EXECUTABLE_POST_PROCESSOR'] = Action('make_fself $TARGET ${TARGET.base}.self')
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'Source/System/StdC':'*.cpp', 'Source/System/Bsd':'NptBsdSockets.cpp', 'Source/System/PS3':'*.cpp', 'Source/System/Null':'NptNullNetwork.cpp'}
+env['NPT_EXTRA_LIBS']='net'
diff --git a/lib/libUPnP/Neptune/Build/Targets/universal-apple-macosx/Neptune.xcodeproj/project.pbxproj b/lib/libUPnP/Neptune/Build/Targets/universal-apple-macosx/Neptune.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..0127b65
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/universal-apple-macosx/Neptune.xcodeproj/project.pbxproj
@@ -0,0 +1,6917 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ CAE4176C0E0DC0FE00A530D1 /* Tests */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = CAE417B30E0DC16300A530D1 /* Build configuration list for PBXAggregateTarget "Tests" */;
+ buildPhases = (
+ );
+ dependencies = (
+ CA261074127EB817008E2D29 /* PBXTargetDependency */,
+ CA9DDC5110AE2820008B871E /* PBXTargetDependency */,
+ CA9DDC6E10AE3DFD008B871E /* PBXTargetDependency */,
+ CA9958A81046FFF60073F34A /* PBXTargetDependency */,
+ CA197D270E1AE4540018E87C /* PBXTargetDependency */,
+ CAE417710E0DC10600A530D1 /* PBXTargetDependency */,
+ CA8066511187BD20009D099D /* PBXTargetDependency */,
+ CAE417730E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE417750E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE417770E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE417790E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE4177B0E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE4177D0E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE4177F0E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE417810E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE417830E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE417850E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE417870E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE417890E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE4178B0E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE4178D0E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE4178F0E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE417910E0DC10600A530D1 /* PBXTargetDependency */,
+ CAE063D71241479100E5AFC4 /* PBXTargetDependency */,
+ CAE063D91241479800E5AFC4 /* PBXTargetDependency */,
+ CAE063DB124147A100E5AFC4 /* PBXTargetDependency */,
+ CA30B77A0F0DCEFE0085B46E /* PBXTargetDependency */,
+ CAE063DD124147B300E5AFC4 /* PBXTargetDependency */,
+ );
+ name = Tests;
+ productName = Tests;
+ };
+ CAE417920E0DC11800A530D1 /* All */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = CAE417B40E0DC16300A530D1 /* Build configuration list for PBXAggregateTarget "All" */;
+ buildPhases = (
+ );
+ dependencies = (
+ E44E2BC11AE7692F0092347B /* PBXTargetDependency */,
+ CAE417EC0E0DC20400A530D1 /* PBXTargetDependency */,
+ CAE417970E0DC11F00A530D1 /* PBXTargetDependency */,
+ CAE417990E0DC11F00A530D1 /* PBXTargetDependency */,
+ );
+ name = All;
+ productName = All;
+ };
+ CAE417DF0E0DC1F600A530D1 /* Apps */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = CAE417F30E0DC24100A530D1 /* Build configuration list for PBXAggregateTarget "Apps" */;
+ buildPhases = (
+ );
+ dependencies = (
+ E4FCC8621B1E464B00CCA327 /* PBXTargetDependency */,
+ CA7848420F3B6E71009E84AD /* PBXTargetDependency */,
+ CAE417E40E0DC1FD00A530D1 /* PBXTargetDependency */,
+ CAE417E60E0DC1FD00A530D1 /* PBXTargetDependency */,
+ CAE417E80E0DC1FD00A530D1 /* PBXTargetDependency */,
+ CAE417EA0E0DC1FD00A530D1 /* PBXTargetDependency */,
+ CA451F731252BE430045CF69 /* PBXTargetDependency */,
+ CAAAA08412FF827D00ABC84B /* PBXTargetDependency */,
+ );
+ name = Apps;
+ productName = Apps;
+ };
+ E44E2BB81AE7691C0092347B /* Frameworks */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = E44E2BB91AE7691C0092347B /* Build configuration list for PBXAggregateTarget "Frameworks" */;
+ buildPhases = (
+ );
+ dependencies = (
+ E44E2BBD1AE769290092347B /* PBXTargetDependency */,
+ E44E2BBF1AE769290092347B /* PBXTargetDependency */,
+ );
+ name = Frameworks;
+ productName = Frameworks;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ CA057AB011BC27F200C90519 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA057AAE11BC27F200C90519 /* NptTlsDefaultTrustAnchorsBase.cpp */; };
+ CA057AB111BC27F200C90519 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA057AAF11BC27F200C90519 /* NptTlsDefaultTrustAnchorsExtended.cpp */; };
+ CA197D250E1AE4400018E87C /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA197D280E1AE4790018E87C /* QueueTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA197D1A0E1AE4200018E87C /* QueueTest1.cpp */; };
+ CA1A5EAF0EC0154D00A9040C /* x509.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E850EC0145900A9040C /* x509.c */; };
+ CA1A5EB00EC0154D00A9040C /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E840EC0145900A9040C /* version.h */; };
+ CA1A5EB10EC0154E00A9040C /* tls1_svr.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E830EC0145900A9040C /* tls1_svr.c */; };
+ CA1A5EB20EC0155000A9040C /* tls1_clnt.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E820EC0145900A9040C /* tls1_clnt.c */; };
+ CA1A5EB30EC0155000A9040C /* tls1.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E810EC0145900A9040C /* tls1.h */; };
+ CA1A5EB40EC0155100A9040C /* tls1.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E800EC0145900A9040C /* tls1.c */; };
+ CA1A5EB50EC0155100A9040C /* ssl.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E7F0EC0145900A9040C /* ssl.h */; };
+ CA1A5EB60EC0155200A9040C /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E720EC0145900A9040C /* sha1.c */; };
+ CA1A5EB70EC0155300A9040C /* rsa.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E710EC0145900A9040C /* rsa.c */; };
+ CA1A5EB80EC0155300A9040C /* rc4.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E700EC0145900A9040C /* rc4.c */; };
+ CA1A5EBA0EC0155400A9040C /* p12.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E7D0EC0145900A9040C /* p12.c */; };
+ CA1A5EBE0EC0155700A9040C /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E6F0EC0145900A9040C /* md5.c */; };
+ CA1A5EBF0EC0155800A9040C /* md2.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E6E0EC0145900A9040C /* md2.c */; };
+ CA1A5EC00EC0155900A9040C /* loader.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E790EC0145900A9040C /* loader.c */; };
+ CA1A5EC10EC0155900A9040C /* hmac.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E6D0EC0145900A9040C /* hmac.c */; };
+ CA1A5EC20EC0155A00A9040C /* gen_cert.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E780EC0145900A9040C /* gen_cert.c */; };
+ CA1A5EC30EC0155A00A9040C /* crypto_misc.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E770EC0145900A9040C /* crypto_misc.h */; };
+ CA1A5EC40EC0155B00A9040C /* crypto_misc.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E6C0EC0145900A9040C /* crypto_misc.c */; };
+ CA1A5EC50EC0155C00A9040C /* crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E6B0EC0145900A9040C /* crypto.h */; };
+ CA1A5EC70EC0155E00A9040C /* cert.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E760EC0145900A9040C /* cert.h */; };
+ CA1A5EC80EC0155F00A9040C /* bigint_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E6A0EC0145900A9040C /* bigint_impl.h */; };
+ CA1A5EC90EC0155F00A9040C /* bigint.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E690EC0145900A9040C /* bigint.h */; };
+ CA1A5ECA0EC0156000A9040C /* bigint.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E680EC0145900A9040C /* bigint.c */; };
+ CA1A5ECB0EC0156100A9040C /* asn1.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E750EC0145900A9040C /* asn1.c */; };
+ CA1A5ECC0EC0156100A9040C /* aes.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E670EC0145900A9040C /* aes.c */; };
+ CA1D056F0E68E29C00E3DEE8 /* NptDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA1D056C0E68E29C00E3DEE8 /* NptDynamicLibraries.cpp */; };
+ CA1D05700E68E29C00E3DEE8 /* NptDynamicLibraries.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1D056D0E68E29C00E3DEE8 /* NptDynamicLibraries.h */; };
+ CA1D05710E68E29C00E3DEE8 /* NptSerialPort.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1D056E0E68E29C00E3DEE8 /* NptSerialPort.h */; };
+ CA1D05730E68E2AC00E3DEE8 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA1D05720E68E2AC00E3DEE8 /* NptPosixDynamicLibraries.cpp */; };
+ CA289B6B10E16150001BC817 /* NptCocoaMessageQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = CA289B6810E16150001BC817 /* NptCocoaMessageQueue.h */; };
+ CA289B6C10E16150001BC817 /* NptCocoaMessageQueue.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA289B6910E16150001BC817 /* NptCocoaMessageQueue.mm */; };
+ CA289DBD10E31618001BC817 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA289DC010E31637001BC817 /* SocketsTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA289DBF10E31637001BC817 /* SocketsTest1.cpp */; };
+ CA2B1E210FC22DBA00B9E79F /* NptResults.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA096EF10ED0DBCE00A5103D /* NptResults.cpp */; };
+ CA2EF628154DDFA700933B11 /* NptJson.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA2EF626154DDFA700933B11 /* NptJson.cpp */; };
+ CA2EF629154DDFA700933B11 /* NptJson.h in Headers */ = {isa = PBXBuildFile; fileRef = CA2EF627154DDFA700933B11 /* NptJson.h */; };
+ CA2F54340EC1165700AEBC12 /* TlsTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA2F54330EC1165700AEBC12 /* TlsTest1.cpp */; };
+ CA2F54390EC1203A00AEBC12 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA2F543A0EC1203A00AEBC12 /* libaxTLS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CA1A5EA90EC0152A00A9040C /* libaxTLS.a */; };
+ CA30B7720F0DCEA70085B46E /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA40905C10AA10A800ED81C5 /* NptPosixTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA40905B10AA10A800ED81C5 /* NptPosixTime.cpp */; };
+ CA4090CA10AA259600ED81C5 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA4090CE10AA25BE00ED81C5 /* TimeTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA4090CD10AA25BE00ED81C5 /* TimeTest1.cpp */; };
+ CA5041AF0C5AE2180060E6FE /* NptNullSerialPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA5041AA0C5AE2180060E6FE /* NptNullSerialPort.cpp */; };
+ CA550D500D20A37E00B22D72 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA550D580D20A3AC00B22D72 /* HttpServerTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979DD0CF1648300C01909 /* HttpServerTest1.cpp */; };
+ CA77C0C614C0BCD600442B97 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA77C0C714C0BCF400442B97 /* NetworkTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA77C0B414C0BC5B00442B97 /* NetworkTest1.cpp */; };
+ CA77C18414C25AFF00442B97 /* NptNullAutoreleasePool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA77C18214C25AC100442B97 /* NptNullAutoreleasePool.cpp */; };
+ CA7848450F3B6E9B009E84AD /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA7848480F3B6EB8009E84AD /* MiniHttpServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA7848470F3B6EB8009E84AD /* MiniHttpServer.cpp */; };
+ CA790DAF1233BDF100875081 /* libaxTLS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CA1A5EA90EC0152A00A9040C /* libaxTLS.a */; };
+ CA790DB01233BDF100875081 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA790DB31233BE1000875081 /* NetGet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA790DA51233BDAA00875081 /* NetGet.cpp */; };
+ CA80664F1187BD14009D099D /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA8066521187BD42009D099D /* DigestsTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA8066451187BCF3009D099D /* DigestsTest1.cpp */; };
+ CA806989118A602B009D099D /* NptCrypto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA806987118A602B009D099D /* NptCrypto.cpp */; };
+ CA80698A118A602B009D099D /* NptCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = CA806988118A602B009D099D /* NptCrypto.h */; };
+ CA8069DF118B578C009D099D /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA8069E5118B57BE009D099D /* CryptoTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA8069E4118B57BE009D099D /* CryptoTest1.cpp */; };
+ CA84EC7B0C7E5A7000CC9622 /* NptZip.h in Headers */ = {isa = PBXBuildFile; fileRef = CA84EC7A0C7E5A7000CC9622 /* NptZip.h */; };
+ CA87F23F1148401E0082AAFC /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = CA87F23E1148401E0082AAFC /* config.h */; };
+ CA926A500F8BEB50003CB74E /* NptDynamicCast.h in Headers */ = {isa = PBXBuildFile; fileRef = CA926A4F0F8BEB50003CB74E /* NptDynamicCast.h */; };
+ CA97E0250E2FDFDD0090CC9B /* StreamsTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA97E01C0E2FDFA10090CC9B /* StreamsTest1.cpp */; };
+ CA97E0320E2FEA540090CC9B /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA9958A61046FFD20073F34A /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA9958AB1047001B0073F34A /* HttpClientTest2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA9958AA1047001B0073F34A /* HttpClientTest2.cpp */; };
+ CA9DDC6C10AE3DE8008B871E /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CA9DDC7210AE3E52008B871E /* FileTest2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA9DDC7110AE3E52008B871E /* FileTest2.cpp */; };
+ CAA97A070CF164E000C01909 /* XmlTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979F80CF1648300C01909 /* XmlTest1.cpp */; };
+ CAA97A080CF164E300C01909 /* XmlTest1Data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979F90CF1648300C01909 /* XmlTest1Data.cpp */; };
+ CAA97A0C0CF164FC00C01909 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAA97A170CF1654A00C01909 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAA97A1D0CF1659200C01909 /* StringsTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979ED0CF1648300C01909 /* StringsTest1.cpp */; };
+ CAAAA08212FF825800ABC84B /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAAAA08512FF828A00ABC84B /* NetResolve.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAAAA07612FF823200ABC84B /* NetResolve.cpp */; };
+ CAC029DE139D84D10034427F /* LoggingTest2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAC029DD139D84D10034427F /* LoggingTest2.cpp */; };
+ CAC5048312FFB7EF00FEB1D8 /* NptBsdResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAC5048212FFB7EF00FEB1D8 /* NptBsdResolver.cpp */; };
+ CAC8F0AB16AB550A00C49741 /* NetBench.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAC8F09C16AB54AF00C49741 /* NetBench.cpp */; };
+ CAC8F0B016AB558100C49741 /* libaxTLS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CA1A5EA90EC0152A00A9040C /* libaxTLS.a */; };
+ CAC8F0B116AB558100C49741 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAD78DD312A99DC500D7EBA7 /* NptHash.h in Headers */ = {isa = PBXBuildFile; fileRef = CAD78DD212A99DC500D7EBA7 /* NptHash.h */; };
+ CAD78E0412A9C42000D7EBA7 /* NptHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAD78E0312A9C42000D7EBA7 /* NptHash.cpp */; };
+ CAE063D31241473B00E5AFC4 /* libaxTLS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CA1A5EA90EC0152A00A9040C /* libaxTLS.a */; };
+ CAE416A20E0DBD7400A530D1 /* MiscTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979E90CF1648300C01909 /* MiscTest1.cpp */; };
+ CAE416A50E0DBD8800A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE416C00E0DBE0C00A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE416C10E0DBE1900A530D1 /* ArraysTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979D70CF1648300C01909 /* ArraysTest1.cpp */; };
+ CAE416CD0E0DBE3B00A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE416CE0E0DBE4200A530D1 /* BufferedStreamsTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979D90CF1648300C01909 /* BufferedStreamsTest1.cpp */; };
+ CAE416DA0E0DBE6400A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE416DB0E0DBE6D00A530D1 /* HttpClientTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979DB0CF1648300C01909 /* HttpClientTest1.cpp */; };
+ CAE416E70E0DBE8C00A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE416E80E0DBE9600A530D1 /* ListsTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979DF0CF1648300C01909 /* ListsTest1.cpp */; };
+ CAE416F40E0DBEB900A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE416F50E0DBEC000A530D1 /* LoggingTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979E10CF1648300C01909 /* LoggingTest1.cpp */; };
+ CAE417010E0DBEED00A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE417020E0DBEF500A530D1 /* MapsTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979E30CF1648300C01909 /* MapsTest1.cpp */; };
+ CAE4170E0E0DBF1100A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE4170F0E0DBF1900A530D1 /* MessagesTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979E50CF1648300C01909 /* MessagesTest1.cpp */; };
+ CAE4171B0E0DBF3100A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE4171C0E0DBF3A00A530D1 /* MessagesTest2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979E70CF1648300C01909 /* MessagesTest2.cpp */; };
+ CAE417340E0DC04000A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE417350E0DC04C00A530D1 /* RingBufferTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979EB0CF1648300C01909 /* RingBufferTest1.cpp */; };
+ CAE417410E0DC06F00A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE417420E0DC07800A530D1 /* ThreadsTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979EF0CF1648300C01909 /* ThreadsTest1.cpp */; };
+ CAE4174E0E0DC09500A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE4174F0E0DC09B00A530D1 /* UdpTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979F10CF1648300C01909 /* UdpTest1.cpp */; };
+ CAE4175B0E0DC0B200A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE4175C0E0DC0BC00A530D1 /* UrlTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979F30CF1648300C01909 /* UrlTest1.cpp */; };
+ CAE417680E0DC0DB00A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE417690E0DC0E500A530D1 /* ZipTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979FC0CF1648300C01909 /* ZipTest1.cpp */; };
+ CAE4176A0E0DC0E600A530D1 /* ZipTestData1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA979FD0CF1648300C01909 /* ZipTestData1.cpp */; };
+ CAE417A40E0DC14100A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE417B60E0DC17800A530D1 /* NetPump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAE417AD0E0DC16300A530D1 /* NetPump.cpp */; };
+ CAE417C20E0DC1A100A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE417C30E0DC1AA00A530D1 /* NetEcho.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAE417A90E0DC16300A530D1 /* NetEcho.cpp */; };
+ CAE417CF0E0DC1BF00A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE417D00E0DC1C600A530D1 /* NetConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAE417A70E0DC16300A530D1 /* NetConfig.cpp */; };
+ CAE417DC0E0DC1DF00A530D1 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAE417DD0E0DC1EA00A530D1 /* NetPing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAE417AB0E0DC16300A530D1 /* NetPing.cpp */; };
+ CAEB8EC511864F0B00B4AF01 /* NptDigest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAEB8EC111864F0B00B4AF01 /* NptDigest.cpp */; };
+ CAEB8EC611864F0B00B4AF01 /* NptDigest.h in Headers */ = {isa = PBXBuildFile; fileRef = CAEB8EC211864F0B00B4AF01 /* NptDigest.h */; };
+ CAF03CB60C7E7F15002C470F /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF03CB50C7E7F15002C470F /* NptZip.cpp */; };
+ CAF26E9918C74B110015ABB9 /* ZipTest2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF26E9818C74B110015ABB9 /* ZipTest2.cpp */; };
+ CAF26E9A18C74D320015ABB9 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAF26EAA18C7FF820015ABB9 /* ZipHttpServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF26EA918C7FF820015ABB9 /* ZipHttpServer.cpp */; };
+ CAF2EFB60E64881E00948C04 /* NptPosixFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF2EFB50E64881E00948C04 /* NptPosixFile.cpp */; };
+ CAF2EFB80E64882900948C04 /* NptPosixNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF2EFB70E64882900948C04 /* NptPosixNetwork.cpp */; };
+ CAF2EFDE0E64A2AB00948C04 /* FileTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF2EFD30E64A25700948C04 /* FileTest1.cpp */; };
+ CAF2EFDF0E64A2B700948C04 /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ CAFB23700EC760FE009C3459 /* NptTls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAFB236E0EC760FE009C3459 /* NptTls.cpp */; };
+ CAFB23710EC760FE009C3459 /* NptTls.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFB236F0EC760FE009C3459 /* NptTls.h */; };
+ CAFC5B1518051F2800169F5A /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0118051C7000169F5A /* adler32.c */; };
+ CAFC5B1618051F2800169F5A /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0218051C7000169F5A /* compress.c */; };
+ CAFC5B1718051F2800169F5A /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0318051C7000169F5A /* crc32.c */; };
+ CAFC5B1818051F2800169F5A /* crc32.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B0418051C7000169F5A /* crc32.h */; };
+ CAFC5B1918051F2800169F5A /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0518051C7000169F5A /* deflate.c */; };
+ CAFC5B1A18051F2800169F5A /* deflate.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B0618051C7000169F5A /* deflate.h */; };
+ CAFC5B1B18051F2800169F5A /* infback.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0718051C7000169F5A /* infback.c */; };
+ CAFC5B1C18051F2800169F5A /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0818051C7000169F5A /* inffast.c */; };
+ CAFC5B1D18051F2800169F5A /* inffast.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B0918051C7000169F5A /* inffast.h */; };
+ CAFC5B1E18051F2800169F5A /* inffixed.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B0A18051C7000169F5A /* inffixed.h */; };
+ CAFC5B1F18051F2800169F5A /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0B18051C7000169F5A /* inflate.c */; };
+ CAFC5B2018051F2800169F5A /* inflate.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B0C18051C7000169F5A /* inflate.h */; };
+ CAFC5B2118051F2800169F5A /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0D18051C7000169F5A /* inftrees.c */; };
+ CAFC5B2218051F2800169F5A /* inftrees.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B0E18051C7000169F5A /* inftrees.h */; };
+ CAFC5B2318051F2800169F5A /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0F18051C7000169F5A /* trees.c */; };
+ CAFC5B2418051F2800169F5A /* trees.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B1018051C7000169F5A /* trees.h */; };
+ CAFC5B2518051F2800169F5A /* zconf.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B1118051C7000169F5A /* zconf.h */; };
+ CAFC5B2618051F2800169F5A /* zlib.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B1218051C7000169F5A /* zlib.h */; };
+ CAFC5B2718051F2800169F5A /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B1318051C7000169F5A /* zutil.c */; };
+ CAFC5B2818051F2800169F5A /* zutil.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFC5B1418051C7000169F5A /* zutil.h */; };
+ E40D8B181AD868A80041A617 /* NptAutomaticCleaner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40D8B161AD868A80041A617 /* NptAutomaticCleaner.cpp */; };
+ E40D8B191AD868A80041A617 /* NptAutomaticCleaner.h in Headers */ = {isa = PBXBuildFile; fileRef = E40D8B171AD868A80041A617 /* NptAutomaticCleaner.h */; };
+ E40D8B1B1AD86B480041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B1C1AD86B490041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B1D1AD86B4A0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B1E1AD86B4B0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B1F1AD86B4B0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B201AD86B4C0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B211AD86B4C0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B221AD86B4D0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B231AD86B4D0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B241AD86B4E0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B261AD86B510041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B271AD86B510041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B281AD86B520041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B291AD86B520041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B2A1AD86B520041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B2B1AD86B530041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B2C1AD86B530041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B2D1AD86B540041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B2E1AD86B540041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B2F1AD86B550041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B301AD86B550041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B311AD86B560041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B321AD86B570041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B331AD86B570041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B341AD86B580041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B351AD86B580041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B361AD86B580041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B371AD86B5A0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B381AD86B5B0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B391AD86B5C0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B3A1AD86B5C0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B3B1AD86B5D0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B3C1AD86B5D0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B3D1AD86B5E0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B3E1AD86B5E0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B3F1AD86B5F0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B401AD86B5F0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8B411AD86B5F0041A617 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */; };
+ E40D8BA11AD86D3A0041A617 /* Neptune.h in Headers */ = {isa = PBXBuildFile; fileRef = E40D8BA01AD86D3A0041A617 /* Neptune.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BB51AD86F450041A617 /* Neptune.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B00B8EB27400C1E90D /* Neptune.cpp */; };
+ E40D8BB71AD86F450041A617 /* NptArray.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B20B8EB27400C1E90D /* NptArray.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BB81AD86F450041A617 /* NptAutomaticCleaner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40D8B161AD868A80041A617 /* NptAutomaticCleaner.cpp */; };
+ E40D8BB91AD86F450041A617 /* NptAutomaticCleaner.h in Headers */ = {isa = PBXBuildFile; fileRef = E40D8B171AD868A80041A617 /* NptAutomaticCleaner.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BBA1AD86F450041A617 /* NptAutoreleasePool.h in Headers */ = {isa = PBXBuildFile; fileRef = CA77C17E14C259AB00442B97 /* NptAutoreleasePool.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BBB1AD86F450041A617 /* NptBase64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B30B8EB27400C1E90D /* NptBase64.cpp */; };
+ E40D8BBC1AD86F450041A617 /* NptBase64.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B40B8EB27400C1E90D /* NptBase64.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BBD1AD86F450041A617 /* NptBufferedStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B50B8EB27400C1E90D /* NptBufferedStreams.cpp */; };
+ E40D8BBE1AD86F450041A617 /* NptBufferedStreams.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B60B8EB27400C1E90D /* NptBufferedStreams.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BBF1AD86F450041A617 /* NptCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B70B8EB27400C1E90D /* NptCommon.cpp */; };
+ E40D8BC01AD86F450041A617 /* NptCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B80B8EB27400C1E90D /* NptCommon.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BC11AD86F450041A617 /* NptConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B90B8EB27400C1E90D /* NptConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BC21AD86F450041A617 /* NptConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6BA0B8EB27400C1E90D /* NptConsole.cpp */; };
+ E40D8BC31AD86F450041A617 /* NptConsole.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6BB0B8EB27400C1E90D /* NptConsole.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BC41AD86F450041A617 /* NptConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6BC0B8EB27400C1E90D /* NptConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BC51AD86F450041A617 /* NptCrypto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA806987118A602B009D099D /* NptCrypto.cpp */; };
+ E40D8BC61AD86F450041A617 /* NptCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = CA806988118A602B009D099D /* NptCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BC71AD86F450041A617 /* NptDataBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6BD0B8EB27400C1E90D /* NptDataBuffer.cpp */; };
+ E40D8BC81AD86F450041A617 /* NptDataBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6BE0B8EB27400C1E90D /* NptDataBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BC91AD86F450041A617 /* NptDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6BF0B8EB27400C1E90D /* NptDebug.cpp */; };
+ E40D8BCA1AD86F450041A617 /* NptDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C00B8EB27400C1E90D /* NptDebug.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BCB1AD86F450041A617 /* NptDefs.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C10B8EB27400C1E90D /* NptDefs.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BCC1AD86F450041A617 /* NptDigest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAEB8EC111864F0B00B4AF01 /* NptDigest.cpp */; };
+ E40D8BCD1AD86F450041A617 /* NptDigest.h in Headers */ = {isa = PBXBuildFile; fileRef = CAEB8EC211864F0B00B4AF01 /* NptDigest.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BCE1AD86F450041A617 /* NptDynamicCast.h in Headers */ = {isa = PBXBuildFile; fileRef = CA926A4F0F8BEB50003CB74E /* NptDynamicCast.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BCF1AD86F450041A617 /* NptDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA1D056C0E68E29C00E3DEE8 /* NptDynamicLibraries.cpp */; };
+ E40D8BD01AD86F450041A617 /* NptDynamicLibraries.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1D056D0E68E29C00E3DEE8 /* NptDynamicLibraries.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BD11AD86F450041A617 /* NptFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C20B8EB27400C1E90D /* NptFile.cpp */; };
+ E40D8BD21AD86F450041A617 /* NptFile.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C30B8EB27400C1E90D /* NptFile.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BD31AD86F450041A617 /* NptHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAD78E0312A9C42000D7EBA7 /* NptHash.cpp */; };
+ E40D8BD41AD86F450041A617 /* NptHash.h in Headers */ = {isa = PBXBuildFile; fileRef = CAD78DD212A99DC500D7EBA7 /* NptHash.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BD51AD86F450041A617 /* NptHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C40B8EB27400C1E90D /* NptHttp.cpp */; };
+ E40D8BD61AD86F450041A617 /* NptHttp.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C50B8EB27400C1E90D /* NptHttp.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BD71AD86F450041A617 /* NptInterfaces.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C60B8EB27400C1E90D /* NptInterfaces.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BD81AD86F450041A617 /* NptJson.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA2EF626154DDFA700933B11 /* NptJson.cpp */; };
+ E40D8BD91AD86F450041A617 /* NptJson.h in Headers */ = {isa = PBXBuildFile; fileRef = CA2EF627154DDFA700933B11 /* NptJson.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BDA1AD86F450041A617 /* NptList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C70B8EB27400C1E90D /* NptList.cpp */; };
+ E40D8BDB1AD86F450041A617 /* NptList.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C80B8EB27400C1E90D /* NptList.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BDC1AD86F450041A617 /* NptLogging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C90B8EB27400C1E90D /* NptLogging.cpp */; };
+ E40D8BDD1AD86F450041A617 /* NptLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CA0B8EB27400C1E90D /* NptLogging.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BDE1AD86F450041A617 /* NptMap.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CB0B8EB27400C1E90D /* NptMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BDF1AD86F450041A617 /* NptMessaging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6CC0B8EB27400C1E90D /* NptMessaging.cpp */; };
+ E40D8BE01AD86F450041A617 /* NptMessaging.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CD0B8EB27400C1E90D /* NptMessaging.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BE11AD86F450041A617 /* NptNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6CE0B8EB27400C1E90D /* NptNetwork.cpp */; };
+ E40D8BE21AD86F450041A617 /* NptNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CF0B8EB27400C1E90D /* NptNetwork.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BE31AD86F450041A617 /* NptQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D00B8EB27400C1E90D /* NptQueue.cpp */; };
+ E40D8BE41AD86F450041A617 /* NptQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D10B8EB27400C1E90D /* NptQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BE51AD86F450041A617 /* NptReferences.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D20B8EB27400C1E90D /* NptReferences.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BE61AD86F450041A617 /* NptResults.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA096EF10ED0DBCE00A5103D /* NptResults.cpp */; };
+ E40D8BE71AD86F450041A617 /* NptResults.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D30B8EB27400C1E90D /* NptResults.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BE81AD86F450041A617 /* NptRingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D40B8EB27400C1E90D /* NptRingBuffer.cpp */; };
+ E40D8BE91AD86F450041A617 /* NptRingBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D50B8EB27400C1E90D /* NptRingBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BEA1AD86F450041A617 /* NptSelectableMessageQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D60B8EB27400C1E90D /* NptSelectableMessageQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BEB1AD86F450041A617 /* NptSerialPort.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1D056E0E68E29C00E3DEE8 /* NptSerialPort.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BEC1AD86F450041A617 /* NptSimpleMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D70B8EB27400C1E90D /* NptSimpleMessageQueue.cpp */; };
+ E40D8BED1AD86F450041A617 /* NptSimpleMessageQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D80B8EB27400C1E90D /* NptSimpleMessageQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BEE1AD86F450041A617 /* NptSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D90B8EB27400C1E90D /* NptSockets.cpp */; };
+ E40D8BEF1AD86F450041A617 /* NptSockets.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DA0B8EB27400C1E90D /* NptSockets.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BF01AD86F450041A617 /* NptStack.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DB0B8EB27400C1E90D /* NptStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BF11AD86F450041A617 /* NptStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6DC0B8EB27400C1E90D /* NptStreams.cpp */; };
+ E40D8BF21AD86F450041A617 /* NptStreams.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DD0B8EB27400C1E90D /* NptStreams.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BF31AD86F450041A617 /* NptStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6DE0B8EB27400C1E90D /* NptStrings.cpp */; };
+ E40D8BF41AD86F450041A617 /* NptStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DF0B8EB27400C1E90D /* NptStrings.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BF51AD86F450041A617 /* NptSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E00B8EB27400C1E90D /* NptSystem.cpp */; };
+ E40D8BF61AD86F450041A617 /* NptSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E10B8EB27400C1E90D /* NptSystem.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BF71AD86F450041A617 /* NptThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E20B8EB27400C1E90D /* NptThreads.cpp */; };
+ E40D8BF81AD86F450041A617 /* NptThreads.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E30B8EB27400C1E90D /* NptThreads.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BF91AD86F450041A617 /* NptTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E40B8EB27400C1E90D /* NptTime.cpp */; };
+ E40D8BFA1AD86F450041A617 /* NptTime.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E50B8EB27400C1E90D /* NptTime.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BFB1AD86F450041A617 /* NptTls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAFB236E0EC760FE009C3459 /* NptTls.cpp */; };
+ E40D8BFD1AD86F450041A617 /* NptTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E60B8EB27400C1E90D /* NptTypes.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8BFE1AD86F450041A617 /* NptUri.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E70B8EB27400C1E90D /* NptUri.cpp */; };
+ E40D8BFF1AD86F450041A617 /* NptUri.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E80B8EB27400C1E90D /* NptUri.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8C001AD86F450041A617 /* NptUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E90B8EB27400C1E90D /* NptUtils.cpp */; };
+ E40D8C011AD86F450041A617 /* NptUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6EA0B8EB27400C1E90D /* NptUtils.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8C021AD86F450041A617 /* NptVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6EB0B8EB27400C1E90D /* NptVersion.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8C031AD86F450041A617 /* NptXml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6EC0B8EB27400C1E90D /* NptXml.cpp */; };
+ E40D8C041AD86F450041A617 /* NptXml.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6ED0B8EB27400C1E90D /* NptXml.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8C051AD86F450041A617 /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF03CB50C7E7F15002C470F /* NptZip.cpp */; };
+ E40D8C071AD870020041A617 /* NptAppleAutoreleasePool.mm in Sources */ = {isa = PBXBuildFile; fileRef = E40D8B951AD86CD20041A617 /* NptAppleAutoreleasePool.mm */; };
+ E40D8C081AD870020041A617 /* NptAppleLogConfig.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA16FE6111C6C882006E2A86 /* NptAppleLogConfig.mm */; };
+ E40D8C091AD8700C0041A617 /* NptCocoaEnviroment.mm in Sources */ = {isa = PBXBuildFile; fileRef = E40D8B141AD868920041A617 /* NptCocoaEnviroment.mm */; };
+ E40D8C0A1AD8700C0041A617 /* NptCocoaConsole.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA289B6710E16150001BC817 /* NptCocoaConsole.mm */; };
+ E40D8C0C1AD8700C0041A617 /* NptCocoaMessageQueue.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA289B6910E16150001BC817 /* NptCocoaMessageQueue.mm */; };
+ E40D8C0D1AD870120041A617 /* NptNullSerialPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA5041AA0C5AE2180060E6FE /* NptNullSerialPort.cpp */; };
+ E40D8C0E1AD870330041A617 /* NptBsdResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAC5048212FFB7EF00FEB1D8 /* NptBsdResolver.cpp */; };
+ E40D8C0F1AD870330041A617 /* NptBsdNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F00B8EB27400C1E90D /* NptBsdNetwork.cpp */; };
+ E40D8C101AD870330041A617 /* NptBsdSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F10B8EB27400C1E90D /* NptBsdSockets.cpp */; };
+ E40D8C111AD870400041A617 /* NptPosixTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA40905B10AA10A800ED81C5 /* NptPosixTime.cpp */; };
+ E40D8C121AD870400041A617 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA1D05720E68E2AC00E3DEE8 /* NptPosixDynamicLibraries.cpp */; };
+ E40D8C131AD870400041A617 /* NptPosixNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF2EFB70E64882900948C04 /* NptPosixNetwork.cpp */; };
+ E40D8C141AD870400041A617 /* NptPosixFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF2EFB50E64881E00948C04 /* NptPosixFile.cpp */; };
+ E40D8C151AD870400041A617 /* NptPosixQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F80B8EB27400C1E90D /* NptPosixQueue.cpp */; };
+ E40D8C161AD870400041A617 /* NptPosixSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F90B8EB27400C1E90D /* NptPosixSystem.cpp */; };
+ E40D8C171AD870400041A617 /* NptPosixThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6FA0B8EB27400C1E90D /* NptPosixThreads.cpp */; };
+ E40D8C181AD870400041A617 /* NptSelectableMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6FB0B8EB27400C1E90D /* NptSelectableMessageQueue.cpp */; };
+ E40D8C1A1AD8704E0041A617 /* NptStdcDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B7000B8EB27400C1E90D /* NptStdcDebug.cpp */; };
+ E40D8C1B1AD8704E0041A617 /* NptStdcEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B7010B8EB27400C1E90D /* NptStdcEnvironment.cpp */; };
+ E40D8C1C1AD8704E0041A617 /* NptStdcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B7020B8EB27400C1E90D /* NptStdcFile.cpp */; };
+ E40D8C201AD874350041A617 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA057AAE11BC27F200C90519 /* NptTlsDefaultTrustAnchorsBase.cpp */; };
+ E40D8C211AD874350041A617 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA057AAF11BC27F200C90519 /* NptTlsDefaultTrustAnchorsExtended.cpp */; };
+ E40D8C241AD8747E0041A617 /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0118051C7000169F5A /* adler32.c */; };
+ E40D8C251AD8747E0041A617 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0218051C7000169F5A /* compress.c */; };
+ E40D8C261AD8747E0041A617 /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0318051C7000169F5A /* crc32.c */; };
+ E40D8C271AD8747E0041A617 /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0518051C7000169F5A /* deflate.c */; };
+ E40D8C281AD8747E0041A617 /* infback.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0718051C7000169F5A /* infback.c */; };
+ E40D8C291AD8747E0041A617 /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0818051C7000169F5A /* inffast.c */; };
+ E40D8C2A1AD8747E0041A617 /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0B18051C7000169F5A /* inflate.c */; };
+ E40D8C2B1AD8747E0041A617 /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0D18051C7000169F5A /* inftrees.c */; };
+ E40D8C2C1AD8747E0041A617 /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0F18051C7000169F5A /* trees.c */; };
+ E40D8C2D1AD8747E0041A617 /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B1318051C7000169F5A /* zutil.c */; };
+ E40D8C2E1AD874BB0041A617 /* NptTls.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFB236F0EC760FE009C3459 /* NptTls.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8C2F1AD874E70041A617 /* NptStdcConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6FF0B8EB27400C1E90D /* NptStdcConsole.cpp */; };
+ E40D8D661ADB7F8D0041A617 /* NptZip.h in Headers */ = {isa = PBXBuildFile; fileRef = CA84EC7A0C7E5A7000CC9622 /* NptZip.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8D691ADB80950041A617 /* NptTlsDefaultTrustAnchorsExtended.h in Headers */ = {isa = PBXBuildFile; fileRef = E40D8D681ADB808A0041A617 /* NptTlsDefaultTrustAnchorsExtended.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E40D8D6A1ADB80980041A617 /* NptTlsDefaultTrustAnchorsBase.h in Headers */ = {isa = PBXBuildFile; fileRef = E40D8D671ADB808A0041A617 /* NptTlsDefaultTrustAnchorsBase.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44A6FDE1ADE3A9D00970F48 /* Neptune.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6B10B8EB27400C1E90D /* Neptune.h */; };
+ E44A6FDF1ADE3A9D00970F48 /* NptArray.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6B20B8EB27400C1E90D /* NptArray.h */; };
+ E44A6FE01ADE3A9D00970F48 /* NptAutomaticCleaner.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E40D8B171AD868A80041A617 /* NptAutomaticCleaner.h */; };
+ E44A6FE11ADE3A9D00970F48 /* NptAutoreleasePool.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CA77C17E14C259AB00442B97 /* NptAutoreleasePool.h */; };
+ E44A6FE21ADE3A9D00970F48 /* NptBase64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6B40B8EB27400C1E90D /* NptBase64.h */; };
+ E44A6FE31ADE3A9D00970F48 /* NptBufferedStreams.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6B60B8EB27400C1E90D /* NptBufferedStreams.h */; };
+ E44A6FE41ADE3A9D00970F48 /* NptCommon.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6B80B8EB27400C1E90D /* NptCommon.h */; };
+ E44A6FE51ADE3A9D00970F48 /* NptConfig.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6B90B8EB27400C1E90D /* NptConfig.h */; };
+ E44A6FE61ADE3A9D00970F48 /* NptConsole.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6BB0B8EB27400C1E90D /* NptConsole.h */; };
+ E44A6FE71ADE3A9D00970F48 /* NptConstants.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6BC0B8EB27400C1E90D /* NptConstants.h */; };
+ E44A6FE81ADE3A9D00970F48 /* NptCrypto.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CA806988118A602B009D099D /* NptCrypto.h */; };
+ E44A6FE91ADE3A9D00970F48 /* NptDataBuffer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6BE0B8EB27400C1E90D /* NptDataBuffer.h */; };
+ E44A6FEA1ADE3A9D00970F48 /* NptDebug.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6C00B8EB27400C1E90D /* NptDebug.h */; };
+ E44A6FEB1ADE3A9D00970F48 /* NptDefs.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6C10B8EB27400C1E90D /* NptDefs.h */; };
+ E44A6FEC1ADE3A9D00970F48 /* NptDigest.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CAEB8EC211864F0B00B4AF01 /* NptDigest.h */; };
+ E44A6FED1ADE3A9D00970F48 /* NptDynamicCast.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CA926A4F0F8BEB50003CB74E /* NptDynamicCast.h */; };
+ E44A6FEE1ADE3A9D00970F48 /* NptDynamicLibraries.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CA1D056D0E68E29C00E3DEE8 /* NptDynamicLibraries.h */; };
+ E44A6FEF1ADE3A9D00970F48 /* NptFile.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6C30B8EB27400C1E90D /* NptFile.h */; };
+ E44A6FF01ADE3A9D00970F48 /* NptHash.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CAD78DD212A99DC500D7EBA7 /* NptHash.h */; };
+ E44A6FF11ADE3A9D00970F48 /* NptHttp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6C50B8EB27400C1E90D /* NptHttp.h */; };
+ E44A6FF21ADE3A9D00970F48 /* NptInterfaces.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6C60B8EB27400C1E90D /* NptInterfaces.h */; };
+ E44A6FF31ADE3A9D00970F48 /* NptJson.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CA2EF627154DDFA700933B11 /* NptJson.h */; };
+ E44A6FF41ADE3A9D00970F48 /* NptList.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6C80B8EB27400C1E90D /* NptList.h */; };
+ E44A6FF51ADE3A9D00970F48 /* NptLogging.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6CA0B8EB27400C1E90D /* NptLogging.h */; };
+ E44A6FF61ADE3A9D00970F48 /* NptMap.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6CB0B8EB27400C1E90D /* NptMap.h */; };
+ E44A6FF71ADE3A9D00970F48 /* NptMessaging.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6CD0B8EB27400C1E90D /* NptMessaging.h */; };
+ E44A6FF81ADE3A9D00970F48 /* NptNetwork.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6CF0B8EB27400C1E90D /* NptNetwork.h */; };
+ E44A6FF91ADE3A9D00970F48 /* NptQueue.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6D10B8EB27400C1E90D /* NptQueue.h */; };
+ E44A6FFA1ADE3A9D00970F48 /* NptReferences.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6D20B8EB27400C1E90D /* NptReferences.h */; };
+ E44A6FFB1ADE3A9D00970F48 /* NptResults.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6D30B8EB27400C1E90D /* NptResults.h */; };
+ E44A6FFC1ADE3A9D00970F48 /* NptRingBuffer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6D50B8EB27400C1E90D /* NptRingBuffer.h */; };
+ E44A6FFD1ADE3A9D00970F48 /* NptSelectableMessageQueue.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6D60B8EB27400C1E90D /* NptSelectableMessageQueue.h */; };
+ E44A6FFE1ADE3A9D00970F48 /* NptSerialPort.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CA1D056E0E68E29C00E3DEE8 /* NptSerialPort.h */; };
+ E44A6FFF1ADE3A9D00970F48 /* NptSimpleMessageQueue.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6D80B8EB27400C1E90D /* NptSimpleMessageQueue.h */; };
+ E44A70001ADE3A9D00970F48 /* NptSockets.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6DA0B8EB27400C1E90D /* NptSockets.h */; };
+ E44A70011ADE3A9D00970F48 /* NptStack.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6DB0B8EB27400C1E90D /* NptStack.h */; };
+ E44A70021ADE3A9D00970F48 /* NptStreams.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6DD0B8EB27400C1E90D /* NptStreams.h */; };
+ E44A70031ADE3A9D00970F48 /* NptStrings.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6DF0B8EB27400C1E90D /* NptStrings.h */; };
+ E44A70041ADE3A9D00970F48 /* NptSystem.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6E10B8EB27400C1E90D /* NptSystem.h */; };
+ E44A70051ADE3A9D00970F48 /* NptThreads.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6E30B8EB27400C1E90D /* NptThreads.h */; };
+ E44A70061ADE3A9D00970F48 /* NptTime.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6E50B8EB27400C1E90D /* NptTime.h */; };
+ E44A70071ADE3A9D00970F48 /* NptTls.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CAFB236F0EC760FE009C3459 /* NptTls.h */; };
+ E44A70081ADE3A9D00970F48 /* NptTypes.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6E60B8EB27400C1E90D /* NptTypes.h */; };
+ E44A70091ADE3A9D00970F48 /* NptUri.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6E80B8EB27400C1E90D /* NptUri.h */; };
+ E44A700A1ADE3A9D00970F48 /* NptUtils.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6EA0B8EB27400C1E90D /* NptUtils.h */; };
+ E44A700B1ADE3A9D00970F48 /* NptVersion.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6EB0B8EB27400C1E90D /* NptVersion.h */; };
+ E44A700C1ADE3A9D00970F48 /* NptXml.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F912B6ED0B8EB27400C1E90D /* NptXml.h */; };
+ E44A700D1ADE3A9D00970F48 /* NptZip.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CA84EC7A0C7E5A7000CC9622 /* NptZip.h */; };
+ E44A700E1ADE3BDD00970F48 /* NptTlsDefaultTrustAnchorsBase.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E40D8D671ADB808A0041A617 /* NptTlsDefaultTrustAnchorsBase.h */; };
+ E44A700F1ADE3BDD00970F48 /* NptTlsDefaultTrustAnchorsExtended.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E40D8D681ADB808A0041A617 /* NptTlsDefaultTrustAnchorsExtended.h */; };
+ E44E2AA01AE75CD20092347B /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0118051C7000169F5A /* adler32.c */; };
+ E44E2AA11AE75CD20092347B /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0218051C7000169F5A /* compress.c */; };
+ E44E2AA21AE75CD20092347B /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0318051C7000169F5A /* crc32.c */; };
+ E44E2AA31AE75CD20092347B /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0518051C7000169F5A /* deflate.c */; };
+ E44E2AA41AE75CD20092347B /* infback.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0718051C7000169F5A /* infback.c */; };
+ E44E2AA51AE75CD20092347B /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0818051C7000169F5A /* inffast.c */; };
+ E44E2AA61AE75CD20092347B /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0B18051C7000169F5A /* inflate.c */; };
+ E44E2AA71AE75CD20092347B /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0D18051C7000169F5A /* inftrees.c */; };
+ E44E2AA81AE75CD20092347B /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B0F18051C7000169F5A /* trees.c */; };
+ E44E2AA91AE75CD20092347B /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = CAFC5B1318051C7000169F5A /* zutil.c */; };
+ E44E2AAA1AE75CD20092347B /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA057AAE11BC27F200C90519 /* NptTlsDefaultTrustAnchorsBase.cpp */; };
+ E44E2AAB1AE75CD20092347B /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA057AAF11BC27F200C90519 /* NptTlsDefaultTrustAnchorsExtended.cpp */; };
+ E44E2AAC1AE75CD20092347B /* Neptune.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B00B8EB27400C1E90D /* Neptune.cpp */; };
+ E44E2AAD1AE75CD20092347B /* NptAutomaticCleaner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40D8B161AD868A80041A617 /* NptAutomaticCleaner.cpp */; };
+ E44E2AAE1AE75CD20092347B /* NptBase64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B30B8EB27400C1E90D /* NptBase64.cpp */; };
+ E44E2AAF1AE75CD20092347B /* NptBufferedStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B50B8EB27400C1E90D /* NptBufferedStreams.cpp */; };
+ E44E2AB01AE75CD20092347B /* NptCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B70B8EB27400C1E90D /* NptCommon.cpp */; };
+ E44E2AB11AE75CD20092347B /* NptConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6BA0B8EB27400C1E90D /* NptConsole.cpp */; };
+ E44E2AB21AE75CD20092347B /* NptCrypto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA806987118A602B009D099D /* NptCrypto.cpp */; };
+ E44E2AB31AE75CD20092347B /* NptDataBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6BD0B8EB27400C1E90D /* NptDataBuffer.cpp */; };
+ E44E2AB41AE75CD20092347B /* NptDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6BF0B8EB27400C1E90D /* NptDebug.cpp */; };
+ E44E2AB51AE75CD20092347B /* NptDigest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAEB8EC111864F0B00B4AF01 /* NptDigest.cpp */; };
+ E44E2AB61AE75CD20092347B /* NptDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA1D056C0E68E29C00E3DEE8 /* NptDynamicLibraries.cpp */; };
+ E44E2AB71AE75CD20092347B /* NptFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C20B8EB27400C1E90D /* NptFile.cpp */; };
+ E44E2AB81AE75CD20092347B /* NptHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAD78E0312A9C42000D7EBA7 /* NptHash.cpp */; };
+ E44E2AB91AE75CD20092347B /* NptHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C40B8EB27400C1E90D /* NptHttp.cpp */; };
+ E44E2ABA1AE75CD20092347B /* NptJson.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA2EF626154DDFA700933B11 /* NptJson.cpp */; };
+ E44E2ABB1AE75CD20092347B /* NptList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C70B8EB27400C1E90D /* NptList.cpp */; };
+ E44E2ABC1AE75CD20092347B /* NptLogging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C90B8EB27400C1E90D /* NptLogging.cpp */; };
+ E44E2ABD1AE75CD20092347B /* NptMessaging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6CC0B8EB27400C1E90D /* NptMessaging.cpp */; };
+ E44E2ABE1AE75CD20092347B /* NptNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6CE0B8EB27400C1E90D /* NptNetwork.cpp */; };
+ E44E2ABF1AE75CD20092347B /* NptQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D00B8EB27400C1E90D /* NptQueue.cpp */; };
+ E44E2AC01AE75CD20092347B /* NptResults.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA096EF10ED0DBCE00A5103D /* NptResults.cpp */; };
+ E44E2AC11AE75CD20092347B /* NptRingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D40B8EB27400C1E90D /* NptRingBuffer.cpp */; };
+ E44E2AC21AE75CD20092347B /* NptSimpleMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D70B8EB27400C1E90D /* NptSimpleMessageQueue.cpp */; };
+ E44E2AC31AE75CD20092347B /* NptSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D90B8EB27400C1E90D /* NptSockets.cpp */; };
+ E44E2AC41AE75CD20092347B /* NptStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6DC0B8EB27400C1E90D /* NptStreams.cpp */; };
+ E44E2AC51AE75CD20092347B /* NptStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6DE0B8EB27400C1E90D /* NptStrings.cpp */; };
+ E44E2AC61AE75CD20092347B /* NptSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E00B8EB27400C1E90D /* NptSystem.cpp */; };
+ E44E2AC71AE75CD20092347B /* NptThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E20B8EB27400C1E90D /* NptThreads.cpp */; };
+ E44E2AC81AE75CD20092347B /* NptTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E40B8EB27400C1E90D /* NptTime.cpp */; };
+ E44E2AC91AE75CD20092347B /* NptTls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAFB236E0EC760FE009C3459 /* NptTls.cpp */; };
+ E44E2ACA1AE75CD20092347B /* NptUri.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E70B8EB27400C1E90D /* NptUri.cpp */; };
+ E44E2ACB1AE75CD20092347B /* NptUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E90B8EB27400C1E90D /* NptUtils.cpp */; };
+ E44E2ACC1AE75CD20092347B /* NptXml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6EC0B8EB27400C1E90D /* NptXml.cpp */; };
+ E44E2ACD1AE75CD20092347B /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF03CB50C7E7F15002C470F /* NptZip.cpp */; };
+ E44E2ACE1AE75CD20092347B /* NptAppleAutoreleasePool.mm in Sources */ = {isa = PBXBuildFile; fileRef = E40D8B951AD86CD20041A617 /* NptAppleAutoreleasePool.mm */; };
+ E44E2ACF1AE75CD20092347B /* NptAppleLogConfig.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA16FE6111C6C882006E2A86 /* NptAppleLogConfig.mm */; };
+ E44E2AD01AE75CD20092347B /* NptCocoaEnviroment.mm in Sources */ = {isa = PBXBuildFile; fileRef = E40D8B141AD868920041A617 /* NptCocoaEnviroment.mm */; };
+ E44E2AD11AE75CD20092347B /* NptCocoaConsole.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA289B6710E16150001BC817 /* NptCocoaConsole.mm */; };
+ E44E2AD21AE75CD20092347B /* NptCocoaMessageQueue.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA289B6910E16150001BC817 /* NptCocoaMessageQueue.mm */; };
+ E44E2AD31AE75CD20092347B /* NptNullSerialPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA5041AA0C5AE2180060E6FE /* NptNullSerialPort.cpp */; };
+ E44E2AD41AE75CD20092347B /* NptBsdResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAC5048212FFB7EF00FEB1D8 /* NptBsdResolver.cpp */; };
+ E44E2AD51AE75CD20092347B /* NptBsdNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F00B8EB27400C1E90D /* NptBsdNetwork.cpp */; };
+ E44E2AD61AE75CD20092347B /* NptBsdSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F10B8EB27400C1E90D /* NptBsdSockets.cpp */; };
+ E44E2AD71AE75CD20092347B /* NptPosixTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA40905B10AA10A800ED81C5 /* NptPosixTime.cpp */; };
+ E44E2AD81AE75CD20092347B /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CA1D05720E68E2AC00E3DEE8 /* NptPosixDynamicLibraries.cpp */; };
+ E44E2AD91AE75CD20092347B /* NptPosixNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF2EFB70E64882900948C04 /* NptPosixNetwork.cpp */; };
+ E44E2ADA1AE75CD20092347B /* NptPosixFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAF2EFB50E64881E00948C04 /* NptPosixFile.cpp */; };
+ E44E2ADB1AE75CD20092347B /* NptPosixQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F80B8EB27400C1E90D /* NptPosixQueue.cpp */; };
+ E44E2ADC1AE75CD20092347B /* NptPosixSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F90B8EB27400C1E90D /* NptPosixSystem.cpp */; };
+ E44E2ADD1AE75CD20092347B /* NptPosixThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6FA0B8EB27400C1E90D /* NptPosixThreads.cpp */; };
+ E44E2ADE1AE75CD20092347B /* NptSelectableMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6FB0B8EB27400C1E90D /* NptSelectableMessageQueue.cpp */; };
+ E44E2ADF1AE75CD20092347B /* NptStdcDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B7000B8EB27400C1E90D /* NptStdcDebug.cpp */; };
+ E44E2AE01AE75CD20092347B /* NptStdcEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B7010B8EB27400C1E90D /* NptStdcEnvironment.cpp */; };
+ E44E2AE11AE75CD20092347B /* NptStdcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B7020B8EB27400C1E90D /* NptStdcFile.cpp */; };
+ E44E2AE51AE75CD20092347B /* NptArray.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B20B8EB27400C1E90D /* NptArray.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AE61AE75CD20092347B /* NptAutomaticCleaner.h in Headers */ = {isa = PBXBuildFile; fileRef = E40D8B171AD868A80041A617 /* NptAutomaticCleaner.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AE71AE75CD20092347B /* NptAutoreleasePool.h in Headers */ = {isa = PBXBuildFile; fileRef = CA77C17E14C259AB00442B97 /* NptAutoreleasePool.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AE81AE75CD20092347B /* NptBase64.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B40B8EB27400C1E90D /* NptBase64.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AE91AE75CD20092347B /* NptBufferedStreams.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B60B8EB27400C1E90D /* NptBufferedStreams.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AEA1AE75CD20092347B /* NptCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B80B8EB27400C1E90D /* NptCommon.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AEB1AE75CD20092347B /* NptConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B90B8EB27400C1E90D /* NptConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AEC1AE75CD20092347B /* NptConsole.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6BB0B8EB27400C1E90D /* NptConsole.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AED1AE75CD20092347B /* NptConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6BC0B8EB27400C1E90D /* NptConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AEE1AE75CD20092347B /* NptCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = CA806988118A602B009D099D /* NptCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AEF1AE75CD20092347B /* NptDataBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6BE0B8EB27400C1E90D /* NptDataBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF01AE75CD20092347B /* NptDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C00B8EB27400C1E90D /* NptDebug.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF11AE75CD20092347B /* NptDefs.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C10B8EB27400C1E90D /* NptDefs.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF21AE75CD20092347B /* NptDigest.h in Headers */ = {isa = PBXBuildFile; fileRef = CAEB8EC211864F0B00B4AF01 /* NptDigest.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF31AE75CD20092347B /* NptDynamicCast.h in Headers */ = {isa = PBXBuildFile; fileRef = CA926A4F0F8BEB50003CB74E /* NptDynamicCast.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF41AE75CD20092347B /* NptDynamicLibraries.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1D056D0E68E29C00E3DEE8 /* NptDynamicLibraries.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF51AE75CD20092347B /* NptFile.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C30B8EB27400C1E90D /* NptFile.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF61AE75CD20092347B /* NptHash.h in Headers */ = {isa = PBXBuildFile; fileRef = CAD78DD212A99DC500D7EBA7 /* NptHash.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF71AE75CD20092347B /* NptHttp.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C50B8EB27400C1E90D /* NptHttp.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF81AE75CD20092347B /* NptInterfaces.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C60B8EB27400C1E90D /* NptInterfaces.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AF91AE75CD20092347B /* NptJson.h in Headers */ = {isa = PBXBuildFile; fileRef = CA2EF627154DDFA700933B11 /* NptJson.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AFA1AE75CD20092347B /* NptList.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C80B8EB27400C1E90D /* NptList.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AFB1AE75CD20092347B /* NptLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CA0B8EB27400C1E90D /* NptLogging.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AFC1AE75CD20092347B /* NptMap.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CB0B8EB27400C1E90D /* NptMap.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AFD1AE75CD20092347B /* NptMessaging.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CD0B8EB27400C1E90D /* NptMessaging.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AFE1AE75CD20092347B /* NptNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CF0B8EB27400C1E90D /* NptNetwork.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2AFF1AE75CD20092347B /* NptSelectableMessageQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D60B8EB27400C1E90D /* NptSelectableMessageQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B001AE75CD20092347B /* NptSimpleMessageQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D80B8EB27400C1E90D /* NptSimpleMessageQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B011AE75CD20092347B /* NptQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D10B8EB27400C1E90D /* NptQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B021AE75CD20092347B /* NptReferences.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D20B8EB27400C1E90D /* NptReferences.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B031AE75CD20092347B /* NptResults.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D30B8EB27400C1E90D /* NptResults.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B041AE75CD20092347B /* NptTls.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFB236F0EC760FE009C3459 /* NptTls.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B051AE75CD20092347B /* NptRingBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D50B8EB27400C1E90D /* NptRingBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B061AE75CD20092347B /* NptSerialPort.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1D056E0E68E29C00E3DEE8 /* NptSerialPort.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B071AE75CD20092347B /* NptSockets.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DA0B8EB27400C1E90D /* NptSockets.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B081AE75CD20092347B /* NptStack.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DB0B8EB27400C1E90D /* NptStack.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B091AE75CD20092347B /* NptStreams.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DD0B8EB27400C1E90D /* NptStreams.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B0A1AE75CD20092347B /* Neptune.h in Headers */ = {isa = PBXBuildFile; fileRef = E40D8BA01AD86D3A0041A617 /* Neptune.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B0B1AE75CD20092347B /* NptStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DF0B8EB27400C1E90D /* NptStrings.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B0C1AE75CD20092347B /* NptSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E10B8EB27400C1E90D /* NptSystem.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B0D1AE75CD20092347B /* NptThreads.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E30B8EB27400C1E90D /* NptThreads.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B0E1AE75CD20092347B /* NptTime.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E50B8EB27400C1E90D /* NptTime.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B0F1AE75CD20092347B /* NptVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6EB0B8EB27400C1E90D /* NptVersion.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B101AE75CD20092347B /* NptTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E60B8EB27400C1E90D /* NptTypes.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B111AE75CD20092347B /* NptUri.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E80B8EB27400C1E90D /* NptUri.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B121AE75CD20092347B /* NptUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6EA0B8EB27400C1E90D /* NptUtils.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B131AE75CD20092347B /* NptXml.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6ED0B8EB27400C1E90D /* NptXml.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B141AE75CD20092347B /* NptTlsDefaultTrustAnchorsBase.h in Headers */ = {isa = PBXBuildFile; fileRef = E40D8D671ADB808A0041A617 /* NptTlsDefaultTrustAnchorsBase.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B151AE75CD20092347B /* NptTlsDefaultTrustAnchorsExtended.h in Headers */ = {isa = PBXBuildFile; fileRef = E40D8D681ADB808A0041A617 /* NptTlsDefaultTrustAnchorsExtended.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B161AE75CD20092347B /* NptZip.h in Headers */ = {isa = PBXBuildFile; fileRef = CA84EC7A0C7E5A7000CC9622 /* NptZip.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B931AE764E80092347B /* libNeptune.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F912B69F0B8EB1C700C1E90D /* libNeptune.a */; };
+ E4FCC83D1B1E3EB500CCA327 /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E840EC0145900A9040C /* version.h */; };
+ E4FCC83E1B1E3EB500CCA327 /* tls1.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E810EC0145900A9040C /* tls1.h */; };
+ E4FCC83F1B1E3EB500CCA327 /* ssl.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E7F0EC0145900A9040C /* ssl.h */; };
+ E4FCC8401B1E3EB500CCA327 /* crypto_misc.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E770EC0145900A9040C /* crypto_misc.h */; };
+ E4FCC8411B1E3EB500CCA327 /* crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E6B0EC0145900A9040C /* crypto.h */; };
+ E4FCC8421B1E3EB500CCA327 /* cert.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E760EC0145900A9040C /* cert.h */; };
+ E4FCC8431B1E3EB500CCA327 /* bigint_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E6A0EC0145900A9040C /* bigint_impl.h */; };
+ E4FCC8441B1E3EB500CCA327 /* bigint.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1A5E690EC0145900A9040C /* bigint.h */; };
+ E4FCC8451B1E3EB500CCA327 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = CA87F23E1148401E0082AAFC /* config.h */; };
+ E4FCC8471B1E3EB500CCA327 /* x509.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E850EC0145900A9040C /* x509.c */; };
+ E4FCC8481B1E3EB500CCA327 /* tls1_svr.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E830EC0145900A9040C /* tls1_svr.c */; };
+ E4FCC8491B1E3EB500CCA327 /* tls1_clnt.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E820EC0145900A9040C /* tls1_clnt.c */; };
+ E4FCC84A1B1E3EB500CCA327 /* tls1.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E800EC0145900A9040C /* tls1.c */; };
+ E4FCC84B1B1E3EB500CCA327 /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E720EC0145900A9040C /* sha1.c */; };
+ E4FCC84C1B1E3EB500CCA327 /* rsa.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E710EC0145900A9040C /* rsa.c */; };
+ E4FCC84D1B1E3EB500CCA327 /* rc4.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E700EC0145900A9040C /* rc4.c */; };
+ E4FCC84E1B1E3EB500CCA327 /* p12.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E7D0EC0145900A9040C /* p12.c */; };
+ E4FCC84F1B1E3EB500CCA327 /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E6F0EC0145900A9040C /* md5.c */; };
+ E4FCC8501B1E3EB500CCA327 /* md2.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E6E0EC0145900A9040C /* md2.c */; };
+ E4FCC8511B1E3EB500CCA327 /* loader.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E790EC0145900A9040C /* loader.c */; };
+ E4FCC8521B1E3EB500CCA327 /* hmac.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E6D0EC0145900A9040C /* hmac.c */; };
+ E4FCC8531B1E3EB500CCA327 /* gen_cert.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E780EC0145900A9040C /* gen_cert.c */; };
+ E4FCC8541B1E3EB500CCA327 /* crypto_misc.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E6C0EC0145900A9040C /* crypto_misc.c */; };
+ E4FCC8551B1E3EB500CCA327 /* bigint.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E680EC0145900A9040C /* bigint.c */; };
+ E4FCC8561B1E3EB500CCA327 /* asn1.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E750EC0145900A9040C /* asn1.c */; };
+ E4FCC8571B1E3EB500CCA327 /* aes.c in Sources */ = {isa = PBXBuildFile; fileRef = CA1A5E670EC0145900A9040C /* aes.c */; };
+ F912B7480B8EB27400C1E90D /* Neptune.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B00B8EB27400C1E90D /* Neptune.cpp */; };
+ F912B7490B8EB27400C1E90D /* Neptune.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B10B8EB27400C1E90D /* Neptune.h */; };
+ F912B74A0B8EB27400C1E90D /* NptArray.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B20B8EB27400C1E90D /* NptArray.h */; };
+ F912B74B0B8EB27400C1E90D /* NptBase64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B30B8EB27400C1E90D /* NptBase64.cpp */; };
+ F912B74C0B8EB27400C1E90D /* NptBase64.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B40B8EB27400C1E90D /* NptBase64.h */; };
+ F912B74D0B8EB27400C1E90D /* NptBufferedStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B50B8EB27400C1E90D /* NptBufferedStreams.cpp */; };
+ F912B74E0B8EB27400C1E90D /* NptBufferedStreams.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B60B8EB27400C1E90D /* NptBufferedStreams.h */; };
+ F912B74F0B8EB27400C1E90D /* NptCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6B70B8EB27400C1E90D /* NptCommon.cpp */; };
+ F912B7500B8EB27400C1E90D /* NptCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B80B8EB27400C1E90D /* NptCommon.h */; };
+ F912B7510B8EB27400C1E90D /* NptConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6B90B8EB27400C1E90D /* NptConfig.h */; };
+ F912B7520B8EB27400C1E90D /* NptConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6BA0B8EB27400C1E90D /* NptConsole.cpp */; };
+ F912B7530B8EB27400C1E90D /* NptConsole.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6BB0B8EB27400C1E90D /* NptConsole.h */; };
+ F912B7540B8EB27400C1E90D /* NptConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6BC0B8EB27400C1E90D /* NptConstants.h */; };
+ F912B7550B8EB27400C1E90D /* NptDataBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6BD0B8EB27400C1E90D /* NptDataBuffer.cpp */; };
+ F912B7560B8EB27400C1E90D /* NptDataBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6BE0B8EB27400C1E90D /* NptDataBuffer.h */; };
+ F912B7570B8EB27400C1E90D /* NptDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6BF0B8EB27400C1E90D /* NptDebug.cpp */; };
+ F912B7580B8EB27400C1E90D /* NptDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C00B8EB27400C1E90D /* NptDebug.h */; };
+ F912B7590B8EB27400C1E90D /* NptDefs.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C10B8EB27400C1E90D /* NptDefs.h */; };
+ F912B75A0B8EB27400C1E90D /* NptFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C20B8EB27400C1E90D /* NptFile.cpp */; };
+ F912B75B0B8EB27400C1E90D /* NptFile.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C30B8EB27400C1E90D /* NptFile.h */; };
+ F912B75C0B8EB27400C1E90D /* NptHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C40B8EB27400C1E90D /* NptHttp.cpp */; };
+ F912B75D0B8EB27400C1E90D /* NptHttp.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C50B8EB27400C1E90D /* NptHttp.h */; };
+ F912B75E0B8EB27400C1E90D /* NptInterfaces.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C60B8EB27400C1E90D /* NptInterfaces.h */; };
+ F912B75F0B8EB27400C1E90D /* NptList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C70B8EB27400C1E90D /* NptList.cpp */; };
+ F912B7600B8EB27400C1E90D /* NptList.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6C80B8EB27400C1E90D /* NptList.h */; };
+ F912B7610B8EB27400C1E90D /* NptLogging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6C90B8EB27400C1E90D /* NptLogging.cpp */; };
+ F912B7620B8EB27400C1E90D /* NptLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CA0B8EB27400C1E90D /* NptLogging.h */; };
+ F912B7630B8EB27400C1E90D /* NptMap.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CB0B8EB27400C1E90D /* NptMap.h */; };
+ F912B7640B8EB27400C1E90D /* NptMessaging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6CC0B8EB27400C1E90D /* NptMessaging.cpp */; };
+ F912B7650B8EB27400C1E90D /* NptMessaging.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CD0B8EB27400C1E90D /* NptMessaging.h */; };
+ F912B7660B8EB27400C1E90D /* NptNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6CE0B8EB27400C1E90D /* NptNetwork.cpp */; };
+ F912B7670B8EB27400C1E90D /* NptNetwork.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6CF0B8EB27400C1E90D /* NptNetwork.h */; };
+ F912B7680B8EB27400C1E90D /* NptQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D00B8EB27400C1E90D /* NptQueue.cpp */; };
+ F912B7690B8EB27400C1E90D /* NptQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D10B8EB27400C1E90D /* NptQueue.h */; };
+ F912B76A0B8EB27400C1E90D /* NptReferences.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D20B8EB27400C1E90D /* NptReferences.h */; };
+ F912B76B0B8EB27400C1E90D /* NptResults.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D30B8EB27400C1E90D /* NptResults.h */; };
+ F912B76C0B8EB27400C1E90D /* NptRingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D40B8EB27400C1E90D /* NptRingBuffer.cpp */; };
+ F912B76D0B8EB27400C1E90D /* NptRingBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D50B8EB27400C1E90D /* NptRingBuffer.h */; };
+ F912B76E0B8EB27400C1E90D /* NptSelectableMessageQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D60B8EB27400C1E90D /* NptSelectableMessageQueue.h */; };
+ F912B76F0B8EB27400C1E90D /* NptSimpleMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D70B8EB27400C1E90D /* NptSimpleMessageQueue.cpp */; };
+ F912B7700B8EB27400C1E90D /* NptSimpleMessageQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6D80B8EB27400C1E90D /* NptSimpleMessageQueue.h */; };
+ F912B7710B8EB27400C1E90D /* NptSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6D90B8EB27400C1E90D /* NptSockets.cpp */; };
+ F912B7720B8EB27400C1E90D /* NptSockets.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DA0B8EB27400C1E90D /* NptSockets.h */; };
+ F912B7730B8EB27400C1E90D /* NptStack.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DB0B8EB27400C1E90D /* NptStack.h */; };
+ F912B7740B8EB27400C1E90D /* NptStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6DC0B8EB27400C1E90D /* NptStreams.cpp */; };
+ F912B7750B8EB27400C1E90D /* NptStreams.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DD0B8EB27400C1E90D /* NptStreams.h */; };
+ F912B7760B8EB27400C1E90D /* NptStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6DE0B8EB27400C1E90D /* NptStrings.cpp */; };
+ F912B7770B8EB27400C1E90D /* NptStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6DF0B8EB27400C1E90D /* NptStrings.h */; };
+ F912B7780B8EB27400C1E90D /* NptSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E00B8EB27400C1E90D /* NptSystem.cpp */; };
+ F912B7790B8EB27400C1E90D /* NptSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E10B8EB27400C1E90D /* NptSystem.h */; };
+ F912B77A0B8EB27400C1E90D /* NptThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E20B8EB27400C1E90D /* NptThreads.cpp */; };
+ F912B77B0B8EB27400C1E90D /* NptThreads.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E30B8EB27400C1E90D /* NptThreads.h */; };
+ F912B77C0B8EB27400C1E90D /* NptTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E40B8EB27400C1E90D /* NptTime.cpp */; };
+ F912B77D0B8EB27400C1E90D /* NptTime.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E50B8EB27400C1E90D /* NptTime.h */; };
+ F912B77E0B8EB27400C1E90D /* NptTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E60B8EB27400C1E90D /* NptTypes.h */; };
+ F912B77F0B8EB27400C1E90D /* NptUri.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E70B8EB27400C1E90D /* NptUri.cpp */; };
+ F912B7800B8EB27400C1E90D /* NptUri.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6E80B8EB27400C1E90D /* NptUri.h */; };
+ F912B7810B8EB27400C1E90D /* NptUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6E90B8EB27400C1E90D /* NptUtils.cpp */; };
+ F912B7820B8EB27400C1E90D /* NptUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6EA0B8EB27400C1E90D /* NptUtils.h */; };
+ F912B7830B8EB27400C1E90D /* NptVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6EB0B8EB27400C1E90D /* NptVersion.h */; };
+ F912B7840B8EB27400C1E90D /* NptXml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6EC0B8EB27400C1E90D /* NptXml.cpp */; };
+ F912B7850B8EB27400C1E90D /* NptXml.h in Headers */ = {isa = PBXBuildFile; fileRef = F912B6ED0B8EB27400C1E90D /* NptXml.h */; };
+ F912B7860B8EB27400C1E90D /* NptBsdNetwork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F00B8EB27400C1E90D /* NptBsdNetwork.cpp */; };
+ F912B7870B8EB27400C1E90D /* NptBsdSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F10B8EB27400C1E90D /* NptBsdSockets.cpp */; };
+ F912B78C0B8EB27400C1E90D /* NptPosixQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F80B8EB27400C1E90D /* NptPosixQueue.cpp */; };
+ F912B78D0B8EB27400C1E90D /* NptPosixSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6F90B8EB27400C1E90D /* NptPosixSystem.cpp */; };
+ F912B78E0B8EB27400C1E90D /* NptPosixThreads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6FA0B8EB27400C1E90D /* NptPosixThreads.cpp */; };
+ F912B78F0B8EB27400C1E90D /* NptSelectableMessageQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B6FB0B8EB27400C1E90D /* NptSelectableMessageQueue.cpp */; };
+ F912B7920B8EB27400C1E90D /* NptStdcDebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B7000B8EB27400C1E90D /* NptStdcDebug.cpp */; };
+ F912B7930B8EB27400C1E90D /* NptStdcEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B7010B8EB27400C1E90D /* NptStdcEnvironment.cpp */; };
+ F912B7940B8EB27400C1E90D /* NptStdcFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F912B7020B8EB27400C1E90D /* NptStdcFile.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ CA197D230E1AE43B0018E87C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA197D260E1AE4540018E87C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA197D1D0E1AE4360018E87C;
+ remoteInfo = QueueTest1;
+ };
+ CA261073127EB817008E2D29 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA2F54230EC115E600AEBC12;
+ remoteInfo = TlsTest1;
+ };
+ CA289DBB10E31613001BC817 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA2F54290EC115EE00AEBC12 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA2F542B0EC115F200AEBC12 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA1A5EA80EC0152A00A9040C;
+ remoteInfo = axTLS;
+ };
+ CA30B7700F0DCE9F0085B46E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA30B7790F0DCEFE0085B46E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA30B76A0F0DCE990085B46E;
+ remoteInfo = LoggingTest2;
+ };
+ CA4090C810AA259200ED81C5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA451F681252BE110045CF69 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA1A5EA80EC0152A00A9040C;
+ remoteInfo = axTLS;
+ };
+ CA451F721252BE430045CF69 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA790DA81233BDC100875081;
+ remoteInfo = NetGet;
+ };
+ CA550D4C0D20A37E00B22D72 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA77C0C414C0BCD100442B97 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA7848410F3B6E71009E84AD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA78483C0F3B6E69009E84AD;
+ remoteInfo = MiniHttpServer;
+ };
+ CA7848430F3B6E95009E84AD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA790DAD1233BDE900875081 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA790DB11233BDF500875081 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA1A5EA80EC0152A00A9040C;
+ remoteInfo = axTLS;
+ };
+ CA80664D1187BD0F009D099D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA8066501187BD20009D099D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA8066481187BD08009D099D;
+ remoteInfo = DigestsTest1;
+ };
+ CA8069DD118B5786009D099D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA97E0480E2FEB6F0090CC9B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA9958A41046FFCD0073F34A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA9958A71046FFF60073F34A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA99589F1046FFC70073F34A;
+ remoteInfo = HttpClientTest2;
+ };
+ CA9DDC5010AE2820008B871E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAF2EFD60E64A27200948C04;
+ remoteInfo = FileTest1;
+ };
+ CA9DDC6A10AE3DE3008B871E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CA9DDC6D10AE3DFD008B871E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA9DDC6510AE3DD6008B871E;
+ remoteInfo = FileTest2;
+ };
+ CAA97A050CF164B500C01909 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAA97A120CF1654A00C01909 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAAAA08012FF825300ABC84B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAAAA08312FF827D00ABC84B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAAAA07B12FF824E00ABC84B;
+ remoteInfo = NetResolve;
+ };
+ CAC8F0AC16AB553400C49741 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAC8F0AE16AB553400C49741 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA1A5EA80EC0152A00A9040C;
+ remoteInfo = axTLS;
+ };
+ CAE063D61241479100E5AFC4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA8069D8118B577E009D099D;
+ remoteInfo = CryptoTest1;
+ };
+ CAE063D81241479800E5AFC4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA289DB610E31600001BC817;
+ remoteInfo = SocketsTest1;
+ };
+ CAE063DA124147A100E5AFC4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA4090C310AA257B00ED81C5;
+ remoteInfo = TimeTest1;
+ };
+ CAE063DC124147B300E5AFC4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA97E01F0E2FDFB30090CC9B;
+ remoteInfo = StreamsTest1;
+ };
+ CAE416A00E0DBD6B00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE416BE0E0DBE0000A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE416CB0E0DBE3400A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE416D80E0DBE5F00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE416E50E0DBE8700A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE416F20E0DBEB400A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE416FF0E0DBEE600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE4170C0E0DBF0E00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417190E0DBF2D00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417320E0DC03B00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE4173F0E0DC06B00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE4174C0E0DC09100A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417590E0DC0AE00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417660E0DC0D700A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417700E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE416B80E0DBDF800A530D1;
+ remoteInfo = ArraysTest1;
+ };
+ CAE417720E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE416C50E0DBE2F00A530D1;
+ remoteInfo = BufferedStreamsTest1;
+ };
+ CAE417740E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA550D4A0D20A37E00B22D72;
+ remoteInfo = HttpServerTest1;
+ };
+ CAE417760E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE416D20E0DBE5A00A530D1;
+ remoteInfo = HttpClientTest1;
+ };
+ CAE417780E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE416DF0E0DBE7F00A530D1;
+ remoteInfo = ListsTest1;
+ };
+ CAE4177A0E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE416EC0E0DBEAF00A530D1;
+ remoteInfo = LoggingTest1;
+ };
+ CAE4177C0E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE416F90E0DBEDD00A530D1;
+ remoteInfo = MapsTest1;
+ };
+ CAE4177E0E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417060E0DBF0900A530D1;
+ remoteInfo = MessagesTest1;
+ };
+ CAE417800E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417130E0DBF2800A530D1;
+ remoteInfo = MessagesTest2;
+ };
+ CAE417820E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE4169A0E0DBD6600A530D1;
+ remoteInfo = MiscTest1;
+ };
+ CAE417840E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE4172C0E0DC03500A530D1;
+ remoteInfo = RingBufferTest1;
+ };
+ CAE417860E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAA97A100CF1654A00C01909;
+ remoteInfo = StringsTest1;
+ };
+ CAE417880E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417390E0DC06700A530D1;
+ remoteInfo = ThreadsTest1;
+ };
+ CAE4178A0E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417460E0DC08C00A530D1;
+ remoteInfo = UdpTest1;
+ };
+ CAE4178C0E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417530E0DC0A800A530D1;
+ remoteInfo = UrlTest1;
+ };
+ CAE4178E0E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAA97A000CF164A700C01909;
+ remoteInfo = XmlTest1;
+ };
+ CAE417900E0DC10600A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417600E0DC0D200A530D1;
+ remoteInfo = ZipTest1;
+ };
+ CAE417960E0DC11F00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE4176C0E0DC0FE00A530D1;
+ remoteInfo = Tests;
+ };
+ CAE417980E0DC11F00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417A20E0DC13E00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417C00E0DC19C00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417CD0E0DC1BA00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417DA0E0DC1DB00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ CAE417E30E0DC1FD00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE4179C0E0DC13A00A530D1;
+ remoteInfo = NetPump;
+ };
+ CAE417E50E0DC1FD00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417BA0E0DC19400A530D1;
+ remoteInfo = NetEcho;
+ };
+ CAE417E70E0DC1FD00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417C70E0DC1B400A530D1;
+ remoteInfo = NetConfig;
+ };
+ CAE417E90E0DC1FD00A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417D40E0DC1D600A530D1;
+ remoteInfo = NetPing;
+ };
+ CAE417EB0E0DC20400A530D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAE417DF0E0DC1F600A530D1;
+ remoteInfo = Apps;
+ };
+ CAF2EFDC0E64A28000948C04 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ E44E2B911AE7649D0092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F912B69E0B8EB1C700C1E90D;
+ remoteInfo = Neptune;
+ };
+ E44E2BBC1AE769290092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E40D8B9B1AD86D3A0041A617;
+ remoteInfo = "Neptune-iOS";
+ };
+ E44E2BBE1AE769290092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2A9C1AE75CD20092347B;
+ remoteInfo = "Neptune-Mac";
+ };
+ E44E2BC01AE7692F0092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2BB81AE7691C0092347B;
+ remoteInfo = Frameworks;
+ };
+ E47C644F1B1E106300BBDDD6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CA1A5EA80EC0152A00A9040C;
+ remoteInfo = axTLS;
+ };
+ E4FCC85F1B1E3ECD00CCA327 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E4FCC83B1B1E3EB500CCA327;
+ remoteInfo = "axTLS-iOS";
+ };
+ E4FCC8611B1E464B00CCA327 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = F912B6870B8EB12700C1E90D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CAC8F0A016AB54EA00C49741;
+ remoteInfo = NetBench;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ CA77C0B814C0BC7700442B97 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ CAC8F09F16AB54EA00C49741 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ CAF26E8C18C74A2F0015ABB9 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ CAF26E9D18C7FF630015ABB9 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ E44A6FDD1ADE3A5500970F48 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "include/${PRODUCT_NAME}";
+ dstSubfolderSpec = 16;
+ files = (
+ E44A700E1ADE3BDD00970F48 /* NptTlsDefaultTrustAnchorsBase.h in CopyFiles */,
+ E44A700F1ADE3BDD00970F48 /* NptTlsDefaultTrustAnchorsExtended.h in CopyFiles */,
+ E44A6FDE1ADE3A9D00970F48 /* Neptune.h in CopyFiles */,
+ E44A6FDF1ADE3A9D00970F48 /* NptArray.h in CopyFiles */,
+ E44A6FE01ADE3A9D00970F48 /* NptAutomaticCleaner.h in CopyFiles */,
+ E44A6FE11ADE3A9D00970F48 /* NptAutoreleasePool.h in CopyFiles */,
+ E44A6FE21ADE3A9D00970F48 /* NptBase64.h in CopyFiles */,
+ E44A6FE31ADE3A9D00970F48 /* NptBufferedStreams.h in CopyFiles */,
+ E44A6FE41ADE3A9D00970F48 /* NptCommon.h in CopyFiles */,
+ E44A6FE51ADE3A9D00970F48 /* NptConfig.h in CopyFiles */,
+ E44A6FE61ADE3A9D00970F48 /* NptConsole.h in CopyFiles */,
+ E44A6FE71ADE3A9D00970F48 /* NptConstants.h in CopyFiles */,
+ E44A6FE81ADE3A9D00970F48 /* NptCrypto.h in CopyFiles */,
+ E44A6FE91ADE3A9D00970F48 /* NptDataBuffer.h in CopyFiles */,
+ E44A6FEA1ADE3A9D00970F48 /* NptDebug.h in CopyFiles */,
+ E44A6FEB1ADE3A9D00970F48 /* NptDefs.h in CopyFiles */,
+ E44A6FEC1ADE3A9D00970F48 /* NptDigest.h in CopyFiles */,
+ E44A6FED1ADE3A9D00970F48 /* NptDynamicCast.h in CopyFiles */,
+ E44A6FEE1ADE3A9D00970F48 /* NptDynamicLibraries.h in CopyFiles */,
+ E44A6FEF1ADE3A9D00970F48 /* NptFile.h in CopyFiles */,
+ E44A6FF01ADE3A9D00970F48 /* NptHash.h in CopyFiles */,
+ E44A6FF11ADE3A9D00970F48 /* NptHttp.h in CopyFiles */,
+ E44A6FF21ADE3A9D00970F48 /* NptInterfaces.h in CopyFiles */,
+ E44A6FF31ADE3A9D00970F48 /* NptJson.h in CopyFiles */,
+ E44A6FF41ADE3A9D00970F48 /* NptList.h in CopyFiles */,
+ E44A6FF51ADE3A9D00970F48 /* NptLogging.h in CopyFiles */,
+ E44A6FF61ADE3A9D00970F48 /* NptMap.h in CopyFiles */,
+ E44A6FF71ADE3A9D00970F48 /* NptMessaging.h in CopyFiles */,
+ E44A6FF81ADE3A9D00970F48 /* NptNetwork.h in CopyFiles */,
+ E44A6FF91ADE3A9D00970F48 /* NptQueue.h in CopyFiles */,
+ E44A6FFA1ADE3A9D00970F48 /* NptReferences.h in CopyFiles */,
+ E44A6FFB1ADE3A9D00970F48 /* NptResults.h in CopyFiles */,
+ E44A6FFC1ADE3A9D00970F48 /* NptRingBuffer.h in CopyFiles */,
+ E44A6FFD1ADE3A9D00970F48 /* NptSelectableMessageQueue.h in CopyFiles */,
+ E44A6FFE1ADE3A9D00970F48 /* NptSerialPort.h in CopyFiles */,
+ E44A6FFF1ADE3A9D00970F48 /* NptSimpleMessageQueue.h in CopyFiles */,
+ E44A70001ADE3A9D00970F48 /* NptSockets.h in CopyFiles */,
+ E44A70011ADE3A9D00970F48 /* NptStack.h in CopyFiles */,
+ E44A70021ADE3A9D00970F48 /* NptStreams.h in CopyFiles */,
+ E44A70031ADE3A9D00970F48 /* NptStrings.h in CopyFiles */,
+ E44A70041ADE3A9D00970F48 /* NptSystem.h in CopyFiles */,
+ E44A70051ADE3A9D00970F48 /* NptThreads.h in CopyFiles */,
+ E44A70061ADE3A9D00970F48 /* NptTime.h in CopyFiles */,
+ E44A70071ADE3A9D00970F48 /* NptTls.h in CopyFiles */,
+ E44A70081ADE3A9D00970F48 /* NptTypes.h in CopyFiles */,
+ E44A70091ADE3A9D00970F48 /* NptUri.h in CopyFiles */,
+ E44A700A1ADE3A9D00970F48 /* NptUtils.h in CopyFiles */,
+ E44A700B1ADE3A9D00970F48 /* NptVersion.h in CopyFiles */,
+ E44A700C1ADE3A9D00970F48 /* NptXml.h in CopyFiles */,
+ E44A700D1ADE3A9D00970F48 /* NptZip.h in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ CA057AAE11BC27F200C90519 /* NptTlsDefaultTrustAnchorsBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptTlsDefaultTrustAnchorsBase.cpp; sourceTree = "<group>"; };
+ CA057AAF11BC27F200C90519 /* NptTlsDefaultTrustAnchorsExtended.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptTlsDefaultTrustAnchorsExtended.cpp; sourceTree = "<group>"; };
+ CA096EF10ED0DBCE00A5103D /* NptResults.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptResults.cpp; sourceTree = "<group>"; };
+ CA16FE6111C6C882006E2A86 /* NptAppleLogConfig.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NptAppleLogConfig.mm; sourceTree = "<group>"; };
+ CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
+ CA197D1A0E1AE4200018E87C /* QueueTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QueueTest1.cpp; sourceTree = "<group>"; };
+ CA197D1E0E1AE4360018E87C /* QueueTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = QueueTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA1A5E670EC0145900A9040C /* aes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aes.c; sourceTree = "<group>"; };
+ CA1A5E680EC0145900A9040C /* bigint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bigint.c; sourceTree = "<group>"; };
+ CA1A5E690EC0145900A9040C /* bigint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bigint.h; sourceTree = "<group>"; };
+ CA1A5E6A0EC0145900A9040C /* bigint_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bigint_impl.h; sourceTree = "<group>"; };
+ CA1A5E6B0EC0145900A9040C /* crypto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto.h; sourceTree = "<group>"; };
+ CA1A5E6C0EC0145900A9040C /* crypto_misc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = crypto_misc.c; sourceTree = "<group>"; };
+ CA1A5E6D0EC0145900A9040C /* hmac.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hmac.c; sourceTree = "<group>"; };
+ CA1A5E6E0EC0145900A9040C /* md2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = md2.c; sourceTree = "<group>"; };
+ CA1A5E6F0EC0145900A9040C /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = md5.c; sourceTree = "<group>"; };
+ CA1A5E700EC0145900A9040C /* rc4.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rc4.c; sourceTree = "<group>"; };
+ CA1A5E710EC0145900A9040C /* rsa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rsa.c; sourceTree = "<group>"; };
+ CA1A5E720EC0145900A9040C /* sha1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sha1.c; sourceTree = "<group>"; };
+ CA1A5E750EC0145900A9040C /* asn1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = asn1.c; sourceTree = "<group>"; };
+ CA1A5E760EC0145900A9040C /* cert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cert.h; sourceTree = "<group>"; };
+ CA1A5E770EC0145900A9040C /* crypto_misc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto_misc.h; sourceTree = "<group>"; };
+ CA1A5E780EC0145900A9040C /* gen_cert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gen_cert.c; sourceTree = "<group>"; };
+ CA1A5E790EC0145900A9040C /* loader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = loader.c; sourceTree = "<group>"; };
+ CA1A5E7C0EC0145900A9040C /* os_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = os_port.h; sourceTree = "<group>"; };
+ CA1A5E7D0EC0145900A9040C /* p12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = p12.c; sourceTree = "<group>"; };
+ CA1A5E7F0EC0145900A9040C /* ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl.h; sourceTree = "<group>"; };
+ CA1A5E800EC0145900A9040C /* tls1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tls1.c; sourceTree = "<group>"; };
+ CA1A5E810EC0145900A9040C /* tls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tls1.h; sourceTree = "<group>"; };
+ CA1A5E820EC0145900A9040C /* tls1_clnt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tls1_clnt.c; sourceTree = "<group>"; };
+ CA1A5E830EC0145900A9040C /* tls1_svr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tls1_svr.c; sourceTree = "<group>"; };
+ CA1A5E840EC0145900A9040C /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = "<group>"; };
+ CA1A5E850EC0145900A9040C /* x509.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x509.c; sourceTree = "<group>"; };
+ CA1A5EA90EC0152A00A9040C /* libaxTLS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libaxTLS.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA1D056C0E68E29C00E3DEE8 /* NptDynamicLibraries.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptDynamicLibraries.cpp; sourceTree = "<group>"; };
+ CA1D056D0E68E29C00E3DEE8 /* NptDynamicLibraries.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptDynamicLibraries.h; sourceTree = "<group>"; };
+ CA1D056E0E68E29C00E3DEE8 /* NptSerialPort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptSerialPort.h; sourceTree = "<group>"; };
+ CA1D05720E68E2AC00E3DEE8 /* NptPosixDynamicLibraries.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptPosixDynamicLibraries.cpp; sourceTree = "<group>"; };
+ CA289B6710E16150001BC817 /* NptCocoaConsole.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NptCocoaConsole.mm; sourceTree = "<group>"; };
+ CA289B6810E16150001BC817 /* NptCocoaMessageQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptCocoaMessageQueue.h; sourceTree = "<group>"; };
+ CA289B6910E16150001BC817 /* NptCocoaMessageQueue.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NptCocoaMessageQueue.mm; sourceTree = "<group>"; };
+ CA289DB710E31600001BC817 /* SocketsTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SocketsTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA289DBF10E31637001BC817 /* SocketsTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SocketsTest1.cpp; sourceTree = "<group>"; };
+ CA2EF626154DDFA700933B11 /* NptJson.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptJson.cpp; sourceTree = "<group>"; };
+ CA2EF627154DDFA700933B11 /* NptJson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptJson.h; sourceTree = "<group>"; };
+ CA2F54240EC115E600AEBC12 /* TlsTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = TlsTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA2F54330EC1165700AEBC12 /* TlsTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TlsTest1.cpp; sourceTree = "<group>"; };
+ CA30B76B0F0DCE990085B46E /* LoggingTest2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = LoggingTest2; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA40905B10AA10A800ED81C5 /* NptPosixTime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptPosixTime.cpp; sourceTree = "<group>"; };
+ CA4090C410AA257B00ED81C5 /* TimeTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = TimeTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA4090CD10AA25BE00ED81C5 /* TimeTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TimeTest1.cpp; sourceTree = "<group>"; };
+ CA5041AA0C5AE2180060E6FE /* NptNullSerialPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptNullSerialPort.cpp; sourceTree = "<group>"; };
+ CA550D550D20A37E00B22D72 /* HttpServerTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = HttpServerTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA77C0B414C0BC5B00442B97 /* NetworkTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkTest1.cpp; sourceTree = "<group>"; };
+ CA77C0BA14C0BC7700442B97 /* NetworkTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetworkTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA77C17E14C259AB00442B97 /* NptAutoreleasePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptAutoreleasePool.h; sourceTree = "<group>"; };
+ CA77C18214C25AC100442B97 /* NptNullAutoreleasePool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptNullAutoreleasePool.cpp; sourceTree = "<group>"; };
+ CA78483D0F3B6E69009E84AD /* minihttpserver */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = minihttpserver; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA7848470F3B6EB8009E84AD /* MiniHttpServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MiniHttpServer.cpp; sourceTree = "<group>"; };
+ CA790DA51233BDAA00875081 /* NetGet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetGet.cpp; sourceTree = "<group>"; };
+ CA790DA91233BDC100875081 /* NetGet */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetGet; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA8066451187BCF3009D099D /* DigestsTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DigestsTest1.cpp; sourceTree = "<group>"; };
+ CA8066491187BD08009D099D /* DigestsTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DigestsTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA806987118A602B009D099D /* NptCrypto.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptCrypto.cpp; sourceTree = "<group>"; };
+ CA806988118A602B009D099D /* NptCrypto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptCrypto.h; sourceTree = "<group>"; };
+ CA8069D9118B577E009D099D /* CryptoTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CryptoTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA8069E4118B57BE009D099D /* CryptoTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CryptoTest1.cpp; sourceTree = "<group>"; };
+ CA84EC7A0C7E5A7000CC9622 /* NptZip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptZip.h; sourceTree = "<group>"; };
+ CA87F23E1148401E0082AAFC /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
+ CA926A4F0F8BEB50003CB74E /* NptDynamicCast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptDynamicCast.h; sourceTree = "<group>"; };
+ CA97E01C0E2FDFA10090CC9B /* StreamsTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StreamsTest1.cpp; sourceTree = "<group>"; };
+ CA97E0200E2FDFB30090CC9B /* StreamsTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = StreamsTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA9958A01046FFC70073F34A /* HttpClientTest2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = HttpClientTest2; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA9958AA1047001B0073F34A /* HttpClientTest2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HttpClientTest2.cpp; sourceTree = "<group>"; };
+ CA9DDC6610AE3DD6008B871E /* FileTest2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = FileTest2; sourceTree = BUILT_PRODUCTS_DIR; };
+ CA9DDC7110AE3E52008B871E /* FileTest2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileTest2.cpp; sourceTree = "<group>"; };
+ CAA979D70CF1648300C01909 /* ArraysTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArraysTest1.cpp; sourceTree = "<group>"; };
+ CAA979D90CF1648300C01909 /* BufferedStreamsTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BufferedStreamsTest1.cpp; sourceTree = "<group>"; };
+ CAA979DB0CF1648300C01909 /* HttpClientTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HttpClientTest1.cpp; sourceTree = "<group>"; };
+ CAA979DD0CF1648300C01909 /* HttpServerTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HttpServerTest1.cpp; sourceTree = "<group>"; };
+ CAA979DF0CF1648300C01909 /* ListsTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ListsTest1.cpp; sourceTree = "<group>"; };
+ CAA979E10CF1648300C01909 /* LoggingTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LoggingTest1.cpp; sourceTree = "<group>"; };
+ CAA979E30CF1648300C01909 /* MapsTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MapsTest1.cpp; sourceTree = "<group>"; };
+ CAA979E50CF1648300C01909 /* MessagesTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MessagesTest1.cpp; sourceTree = "<group>"; };
+ CAA979E70CF1648300C01909 /* MessagesTest2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MessagesTest2.cpp; sourceTree = "<group>"; };
+ CAA979E90CF1648300C01909 /* MiscTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MiscTest1.cpp; sourceTree = "<group>"; };
+ CAA979EB0CF1648300C01909 /* RingBufferTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RingBufferTest1.cpp; sourceTree = "<group>"; };
+ CAA979ED0CF1648300C01909 /* StringsTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringsTest1.cpp; sourceTree = "<group>"; };
+ CAA979EF0CF1648300C01909 /* ThreadsTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadsTest1.cpp; sourceTree = "<group>"; };
+ CAA979F10CF1648300C01909 /* UdpTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UdpTest1.cpp; sourceTree = "<group>"; };
+ CAA979F30CF1648300C01909 /* UrlTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UrlTest1.cpp; sourceTree = "<group>"; };
+ CAA979F50CF1648300C01909 /* big.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = big.xml; sourceTree = "<group>"; };
+ CAA979F60CF1648300C01909 /* test.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = test.xml; sourceTree = "<group>"; };
+ CAA979F70CF1648300C01909 /* unicode.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = unicode.xml; sourceTree = "<group>"; };
+ CAA979F80CF1648300C01909 /* XmlTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XmlTest1.cpp; sourceTree = "<group>"; };
+ CAA979F90CF1648300C01909 /* XmlTest1Data.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XmlTest1Data.cpp; sourceTree = "<group>"; };
+ CAA979FB0CF1648300C01909 /* big.xml.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = big.xml.gz; sourceTree = "<group>"; };
+ CAA979FC0CF1648300C01909 /* ZipTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ZipTest1.cpp; sourceTree = "<group>"; };
+ CAA979FD0CF1648300C01909 /* ZipTestData1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ZipTestData1.cpp; sourceTree = "<group>"; };
+ CAA97A010CF164A700C01909 /* XmlTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = XmlTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAA97A1B0CF1654A00C01909 /* StringsTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = StringsTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAAAA07612FF823200ABC84B /* NetResolve.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetResolve.cpp; sourceTree = "<group>"; };
+ CAAAA07C12FF824E00ABC84B /* NetResolve */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetResolve; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAC029DD139D84D10034427F /* LoggingTest2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LoggingTest2.cpp; sourceTree = "<group>"; };
+ CAC5048212FFB7EF00FEB1D8 /* NptBsdResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptBsdResolver.cpp; sourceTree = "<group>"; };
+ CAC8F09C16AB54AF00C49741 /* NetBench.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetBench.cpp; sourceTree = "<group>"; };
+ CAC8F0A116AB54EA00C49741 /* NetBench */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetBench; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAD78DD212A99DC500D7EBA7 /* NptHash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptHash.h; sourceTree = "<group>"; };
+ CAD78E0312A9C42000D7EBA7 /* NptHash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptHash.cpp; sourceTree = "<group>"; };
+ CAE4169B0E0DBD6600A530D1 /* MiscTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MiscTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE416B90E0DBDF800A530D1 /* ArraysTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ArraysTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE416C60E0DBE2F00A530D1 /* BufferedStreamsTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BufferedStreamsTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE416D30E0DBE5A00A530D1 /* HttpClientTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = HttpClientTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE416E00E0DBE7F00A530D1 /* ListsTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ListsTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE416ED0E0DBEAF00A530D1 /* LoggingTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = LoggingTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE416FA0E0DBEDD00A530D1 /* MapsTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MapsTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE417070E0DBF0900A530D1 /* MessagesTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MessagesTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE417140E0DBF2800A530D1 /* MessagesTest2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MessagesTest2; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE4172D0E0DC03500A530D1 /* RingBufferTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = RingBufferTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE4173A0E0DC06700A530D1 /* ThreadsTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ThreadsTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE417470E0DC08C00A530D1 /* UdpTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = UdpTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE417540E0DC0A800A530D1 /* UrlTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = UrlTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE417610E0DC0D200A530D1 /* ZipTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ZipTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE4179D0E0DC13A00A530D1 /* NetPump */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetPump; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE417A70E0DC16300A530D1 /* NetConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetConfig.cpp; sourceTree = "<group>"; };
+ CAE417A90E0DC16300A530D1 /* NetEcho.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetEcho.cpp; sourceTree = "<group>"; };
+ CAE417AB0E0DC16300A530D1 /* NetPing.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetPing.cpp; sourceTree = "<group>"; };
+ CAE417AD0E0DC16300A530D1 /* NetPump.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetPump.cpp; sourceTree = "<group>"; };
+ CAE417BB0E0DC19400A530D1 /* NetEcho */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetEcho; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE417C80E0DC1B400A530D1 /* NetConfig */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetConfig; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAE417D50E0DC1D600A530D1 /* NetPing */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NetPing; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAEB8EC111864F0B00B4AF01 /* NptDigest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptDigest.cpp; sourceTree = "<group>"; };
+ CAEB8EC211864F0B00B4AF01 /* NptDigest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptDigest.h; sourceTree = "<group>"; };
+ CAF03CB50C7E7F15002C470F /* NptZip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptZip.cpp; sourceTree = "<group>"; };
+ CAF26E8E18C74A2F0015ABB9 /* ZipTest2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ZipTest2; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAF26E9818C74B110015ABB9 /* ZipTest2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ZipTest2.cpp; sourceTree = "<group>"; };
+ CAF26E9F18C7FF630015ABB9 /* ziphttpserver */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ziphttpserver; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAF26EA918C7FF820015ABB9 /* ZipHttpServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ZipHttpServer.cpp; sourceTree = "<group>"; };
+ CAF2EFB50E64881E00948C04 /* NptPosixFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptPosixFile.cpp; sourceTree = "<group>"; };
+ CAF2EFB70E64882900948C04 /* NptPosixNetwork.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptPosixNetwork.cpp; sourceTree = "<group>"; };
+ CAF2EFD30E64A25700948C04 /* FileTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileTest1.cpp; sourceTree = "<group>"; };
+ CAF2EFD70E64A27200948C04 /* FileTest1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = FileTest1; sourceTree = BUILT_PRODUCTS_DIR; };
+ CAFB236E0EC760FE009C3459 /* NptTls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptTls.cpp; sourceTree = "<group>"; };
+ CAFB236F0EC760FE009C3459 /* NptTls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptTls.h; sourceTree = "<group>"; };
+ CAFC5B0118051C7000169F5A /* adler32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = adler32.c; path = "../ThirdParty/zlib-1.2.8/adler32.c"; sourceTree = "<group>"; };
+ CAFC5B0218051C7000169F5A /* compress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = compress.c; path = "../ThirdParty/zlib-1.2.8/compress.c"; sourceTree = "<group>"; };
+ CAFC5B0318051C7000169F5A /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crc32.c; path = "../ThirdParty/zlib-1.2.8/crc32.c"; sourceTree = "<group>"; };
+ CAFC5B0418051C7000169F5A /* crc32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crc32.h; path = "../ThirdParty/zlib-1.2.8/crc32.h"; sourceTree = "<group>"; };
+ CAFC5B0518051C7000169F5A /* deflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = deflate.c; path = "../ThirdParty/zlib-1.2.8/deflate.c"; sourceTree = "<group>"; };
+ CAFC5B0618051C7000169F5A /* deflate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = deflate.h; path = "../ThirdParty/zlib-1.2.8/deflate.h"; sourceTree = "<group>"; };
+ CAFC5B0718051C7000169F5A /* infback.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = infback.c; path = "../ThirdParty/zlib-1.2.8/infback.c"; sourceTree = "<group>"; };
+ CAFC5B0818051C7000169F5A /* inffast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = inffast.c; path = "../ThirdParty/zlib-1.2.8/inffast.c"; sourceTree = "<group>"; };
+ CAFC5B0918051C7000169F5A /* inffast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = inffast.h; path = "../ThirdParty/zlib-1.2.8/inffast.h"; sourceTree = "<group>"; };
+ CAFC5B0A18051C7000169F5A /* inffixed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = inffixed.h; path = "../ThirdParty/zlib-1.2.8/inffixed.h"; sourceTree = "<group>"; };
+ CAFC5B0B18051C7000169F5A /* inflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = inflate.c; path = "../ThirdParty/zlib-1.2.8/inflate.c"; sourceTree = "<group>"; };
+ CAFC5B0C18051C7000169F5A /* inflate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = inflate.h; path = "../ThirdParty/zlib-1.2.8/inflate.h"; sourceTree = "<group>"; };
+ CAFC5B0D18051C7000169F5A /* inftrees.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = inftrees.c; path = "../ThirdParty/zlib-1.2.8/inftrees.c"; sourceTree = "<group>"; };
+ CAFC5B0E18051C7000169F5A /* inftrees.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = inftrees.h; path = "../ThirdParty/zlib-1.2.8/inftrees.h"; sourceTree = "<group>"; };
+ CAFC5B0F18051C7000169F5A /* trees.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = trees.c; path = "../ThirdParty/zlib-1.2.8/trees.c"; sourceTree = "<group>"; };
+ CAFC5B1018051C7000169F5A /* trees.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = trees.h; path = "../ThirdParty/zlib-1.2.8/trees.h"; sourceTree = "<group>"; };
+ CAFC5B1118051C7000169F5A /* zconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zconf.h; path = "../ThirdParty/zlib-1.2.8/zconf.h"; sourceTree = "<group>"; };
+ CAFC5B1218051C7000169F5A /* zlib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zlib.h; path = "../ThirdParty/zlib-1.2.8/zlib.h"; sourceTree = "<group>"; };
+ CAFC5B1318051C7000169F5A /* zutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zutil.c; path = "../ThirdParty/zlib-1.2.8/zutil.c"; sourceTree = "<group>"; };
+ CAFC5B1418051C7000169F5A /* zutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zutil.h; path = "../ThirdParty/zlib-1.2.8/zutil.h"; sourceTree = "<group>"; };
+ CAFC5B291805210000169F5A /* gzguts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = gzguts.h; path = "../ThirdParty/zlib-1.2.8/gzguts.h"; sourceTree = "<group>"; };
+ E40D8B141AD868920041A617 /* NptCocoaEnviroment.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NptCocoaEnviroment.mm; sourceTree = "<group>"; };
+ E40D8B161AD868A80041A617 /* NptAutomaticCleaner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptAutomaticCleaner.cpp; sourceTree = "<group>"; };
+ E40D8B171AD868A80041A617 /* NptAutomaticCleaner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NptAutomaticCleaner.h; sourceTree = "<group>"; };
+ E40D8B951AD86CD20041A617 /* NptAppleAutoreleasePool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NptAppleAutoreleasePool.mm; sourceTree = "<group>"; };
+ E40D8B9C1AD86D3A0041A617 /* Neptune.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Neptune.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ E40D8B9F1AD86D3A0041A617 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ E40D8BA01AD86D3A0041A617 /* Neptune.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Neptune.h; sourceTree = "<group>"; };
+ E40D8D671ADB808A0041A617 /* NptTlsDefaultTrustAnchorsBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NptTlsDefaultTrustAnchorsBase.h; sourceTree = "<group>"; };
+ E40D8D681ADB808A0041A617 /* NptTlsDefaultTrustAnchorsExtended.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NptTlsDefaultTrustAnchorsExtended.h; sourceTree = "<group>"; };
+ E44E2B1B1AE75CD20092347B /* Neptune.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Neptune.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ E4FCC85E1B1E3EB500CCA327 /* libaxTLS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libaxTLS.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ F912B69F0B8EB1C700C1E90D /* libNeptune.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libNeptune.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ F912B6B00B8EB27400C1E90D /* Neptune.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Neptune.cpp; sourceTree = "<group>"; };
+ F912B6B10B8EB27400C1E90D /* Neptune.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Neptune.h; sourceTree = "<group>"; };
+ F912B6B20B8EB27400C1E90D /* NptArray.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptArray.h; sourceTree = "<group>"; };
+ F912B6B30B8EB27400C1E90D /* NptBase64.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptBase64.cpp; sourceTree = "<group>"; };
+ F912B6B40B8EB27400C1E90D /* NptBase64.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptBase64.h; sourceTree = "<group>"; };
+ F912B6B50B8EB27400C1E90D /* NptBufferedStreams.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptBufferedStreams.cpp; sourceTree = "<group>"; };
+ F912B6B60B8EB27400C1E90D /* NptBufferedStreams.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptBufferedStreams.h; sourceTree = "<group>"; };
+ F912B6B70B8EB27400C1E90D /* NptCommon.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptCommon.cpp; sourceTree = "<group>"; };
+ F912B6B80B8EB27400C1E90D /* NptCommon.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptCommon.h; sourceTree = "<group>"; };
+ F912B6B90B8EB27400C1E90D /* NptConfig.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptConfig.h; sourceTree = "<group>"; };
+ F912B6BA0B8EB27400C1E90D /* NptConsole.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptConsole.cpp; sourceTree = "<group>"; };
+ F912B6BB0B8EB27400C1E90D /* NptConsole.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptConsole.h; sourceTree = "<group>"; };
+ F912B6BC0B8EB27400C1E90D /* NptConstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptConstants.h; sourceTree = "<group>"; };
+ F912B6BD0B8EB27400C1E90D /* NptDataBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptDataBuffer.cpp; sourceTree = "<group>"; };
+ F912B6BE0B8EB27400C1E90D /* NptDataBuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptDataBuffer.h; sourceTree = "<group>"; };
+ F912B6BF0B8EB27400C1E90D /* NptDebug.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptDebug.cpp; sourceTree = "<group>"; };
+ F912B6C00B8EB27400C1E90D /* NptDebug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptDebug.h; sourceTree = "<group>"; };
+ F912B6C10B8EB27400C1E90D /* NptDefs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptDefs.h; sourceTree = "<group>"; };
+ F912B6C20B8EB27400C1E90D /* NptFile.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptFile.cpp; sourceTree = "<group>"; };
+ F912B6C30B8EB27400C1E90D /* NptFile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptFile.h; sourceTree = "<group>"; };
+ F912B6C40B8EB27400C1E90D /* NptHttp.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptHttp.cpp; sourceTree = "<group>"; usesTabs = 0; };
+ F912B6C50B8EB27400C1E90D /* NptHttp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptHttp.h; sourceTree = "<group>"; };
+ F912B6C60B8EB27400C1E90D /* NptInterfaces.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptInterfaces.h; sourceTree = "<group>"; };
+ F912B6C70B8EB27400C1E90D /* NptList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptList.cpp; sourceTree = "<group>"; };
+ F912B6C80B8EB27400C1E90D /* NptList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptList.h; sourceTree = "<group>"; };
+ F912B6C90B8EB27400C1E90D /* NptLogging.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptLogging.cpp; sourceTree = "<group>"; };
+ F912B6CA0B8EB27400C1E90D /* NptLogging.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptLogging.h; sourceTree = "<group>"; };
+ F912B6CB0B8EB27400C1E90D /* NptMap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptMap.h; sourceTree = "<group>"; };
+ F912B6CC0B8EB27400C1E90D /* NptMessaging.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptMessaging.cpp; sourceTree = "<group>"; };
+ F912B6CD0B8EB27400C1E90D /* NptMessaging.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptMessaging.h; sourceTree = "<group>"; };
+ F912B6CE0B8EB27400C1E90D /* NptNetwork.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptNetwork.cpp; sourceTree = "<group>"; };
+ F912B6CF0B8EB27400C1E90D /* NptNetwork.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptNetwork.h; sourceTree = "<group>"; };
+ F912B6D00B8EB27400C1E90D /* NptQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptQueue.cpp; sourceTree = "<group>"; };
+ F912B6D10B8EB27400C1E90D /* NptQueue.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptQueue.h; sourceTree = "<group>"; };
+ F912B6D20B8EB27400C1E90D /* NptReferences.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptReferences.h; sourceTree = "<group>"; };
+ F912B6D30B8EB27400C1E90D /* NptResults.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptResults.h; sourceTree = "<group>"; };
+ F912B6D40B8EB27400C1E90D /* NptRingBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptRingBuffer.cpp; sourceTree = "<group>"; };
+ F912B6D50B8EB27400C1E90D /* NptRingBuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptRingBuffer.h; sourceTree = "<group>"; };
+ F912B6D60B8EB27400C1E90D /* NptSelectableMessageQueue.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptSelectableMessageQueue.h; sourceTree = "<group>"; };
+ F912B6D70B8EB27400C1E90D /* NptSimpleMessageQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptSimpleMessageQueue.cpp; sourceTree = "<group>"; };
+ F912B6D80B8EB27400C1E90D /* NptSimpleMessageQueue.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptSimpleMessageQueue.h; sourceTree = "<group>"; };
+ F912B6D90B8EB27400C1E90D /* NptSockets.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptSockets.cpp; sourceTree = "<group>"; };
+ F912B6DA0B8EB27400C1E90D /* NptSockets.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptSockets.h; sourceTree = "<group>"; };
+ F912B6DB0B8EB27400C1E90D /* NptStack.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptStack.h; sourceTree = "<group>"; };
+ F912B6DC0B8EB27400C1E90D /* NptStreams.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptStreams.cpp; sourceTree = "<group>"; };
+ F912B6DD0B8EB27400C1E90D /* NptStreams.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptStreams.h; sourceTree = "<group>"; };
+ F912B6DE0B8EB27400C1E90D /* NptStrings.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptStrings.cpp; sourceTree = "<group>"; };
+ F912B6DF0B8EB27400C1E90D /* NptStrings.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptStrings.h; sourceTree = "<group>"; };
+ F912B6E00B8EB27400C1E90D /* NptSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptSystem.cpp; sourceTree = "<group>"; };
+ F912B6E10B8EB27400C1E90D /* NptSystem.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptSystem.h; sourceTree = "<group>"; };
+ F912B6E20B8EB27400C1E90D /* NptThreads.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptThreads.cpp; sourceTree = "<group>"; };
+ F912B6E30B8EB27400C1E90D /* NptThreads.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptThreads.h; sourceTree = "<group>"; };
+ F912B6E40B8EB27400C1E90D /* NptTime.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptTime.cpp; sourceTree = "<group>"; };
+ F912B6E50B8EB27400C1E90D /* NptTime.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptTime.h; sourceTree = "<group>"; };
+ F912B6E60B8EB27400C1E90D /* NptTypes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptTypes.h; sourceTree = "<group>"; };
+ F912B6E70B8EB27400C1E90D /* NptUri.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptUri.cpp; sourceTree = "<group>"; };
+ F912B6E80B8EB27400C1E90D /* NptUri.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptUri.h; sourceTree = "<group>"; };
+ F912B6E90B8EB27400C1E90D /* NptUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptUtils.cpp; sourceTree = "<group>"; };
+ F912B6EA0B8EB27400C1E90D /* NptUtils.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptUtils.h; sourceTree = "<group>"; };
+ F912B6EB0B8EB27400C1E90D /* NptVersion.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptVersion.h; sourceTree = "<group>"; };
+ F912B6EC0B8EB27400C1E90D /* NptXml.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptXml.cpp; sourceTree = "<group>"; };
+ F912B6ED0B8EB27400C1E90D /* NptXml.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NptXml.h; sourceTree = "<group>"; };
+ F912B6F00B8EB27400C1E90D /* NptBsdNetwork.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptBsdNetwork.cpp; sourceTree = "<group>"; usesTabs = 0; };
+ F912B6F10B8EB27400C1E90D /* NptBsdSockets.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptBsdSockets.cpp; sourceTree = "<group>"; };
+ F912B6F80B8EB27400C1E90D /* NptPosixQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptPosixQueue.cpp; sourceTree = "<group>"; };
+ F912B6F90B8EB27400C1E90D /* NptPosixSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptPosixSystem.cpp; sourceTree = "<group>"; };
+ F912B6FA0B8EB27400C1E90D /* NptPosixThreads.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptPosixThreads.cpp; sourceTree = "<group>"; };
+ F912B6FB0B8EB27400C1E90D /* NptSelectableMessageQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptSelectableMessageQueue.cpp; sourceTree = "<group>"; };
+ F912B6FF0B8EB27400C1E90D /* NptStdcConsole.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptStdcConsole.cpp; sourceTree = "<group>"; };
+ F912B7000B8EB27400C1E90D /* NptStdcDebug.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptStdcDebug.cpp; sourceTree = "<group>"; };
+ F912B7010B8EB27400C1E90D /* NptStdcEnvironment.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptStdcEnvironment.cpp; sourceTree = "<group>"; };
+ F912B7020B8EB27400C1E90D /* NptStdcFile.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NptStdcFile.cpp; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ CA197D1C0E1AE4360018E87C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B2F1AD86B550041A617 /* CoreFoundation.framework in Frameworks */,
+ CA197D250E1AE4400018E87C /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA1A5EA70EC0152A00A9040C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA289DB510E31600001BC817 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B3E1AD86B5E0041A617 /* CoreFoundation.framework in Frameworks */,
+ CA289DBD10E31618001BC817 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA2F54220EC115E600AEBC12 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA2F54390EC1203A00AEBC12 /* libNeptune.a in Frameworks */,
+ CA2F543A0EC1203A00AEBC12 /* libaxTLS.a in Frameworks */,
+ E40D8B3A1AD86B5C0041A617 /* CoreFoundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA30B7690F0DCE990085B46E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B291AD86B520041A617 /* CoreFoundation.framework in Frameworks */,
+ CA30B7720F0DCEA70085B46E /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA4090C210AA257B00ED81C5 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B3C1AD86B5D0041A617 /* CoreFoundation.framework in Frameworks */,
+ CA4090CA10AA259600ED81C5 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA550D4F0D20A37E00B22D72 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B241AD86B4E0041A617 /* CoreFoundation.framework in Frameworks */,
+ CA550D500D20A37E00B22D72 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA77C0B714C0BC7700442B97 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B2D1AD86B540041A617 /* CoreFoundation.framework in Frameworks */,
+ CA77C0C614C0BCD600442B97 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA78483B0F3B6E69009E84AD /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA7848450F3B6E9B009E84AD /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA790DA71233BDC100875081 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA790DAF1233BDF100875081 /* libaxTLS.a in Frameworks */,
+ CA790DB01233BDF100875081 /* libNeptune.a in Frameworks */,
+ E40D8B1F1AD86B4B0041A617 /* CoreFoundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA8066471187BD08009D099D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B3F1AD86B5F0041A617 /* CoreFoundation.framework in Frameworks */,
+ CA80664F1187BD14009D099D /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA8069D7118B577E009D099D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B401AD86B5F0041A617 /* CoreFoundation.framework in Frameworks */,
+ CA8069DF118B578C009D099D /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA97E01E0E2FDFB30090CC9B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B381AD86B5B0041A617 /* CoreFoundation.framework in Frameworks */,
+ CA97E0320E2FEA540090CC9B /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA99589E1046FFC70073F34A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B3B1AD86B5D0041A617 /* CoreFoundation.framework in Frameworks */,
+ CA9958A61046FFD20073F34A /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA9DDC6410AE3DD6008B871E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B3D1AD86B5E0041A617 /* CoreFoundation.framework in Frameworks */,
+ CA9DDC6C10AE3DE8008B871E /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAA979FF0CF164A700C01909 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B351AD86B580041A617 /* CoreFoundation.framework in Frameworks */,
+ CAA97A0C0CF164FC00C01909 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAA97A160CF1654A00C01909 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B321AD86B570041A617 /* CoreFoundation.framework in Frameworks */,
+ CAA97A170CF1654A00C01909 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAAAA07A12FF824E00ABC84B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B201AD86B4C0041A617 /* CoreFoundation.framework in Frameworks */,
+ CAAAA08212FF825800ABC84B /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAC8F09E16AB54EA00C49741 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAC8F0B016AB558100C49741 /* libaxTLS.a in Frameworks */,
+ CAC8F0B116AB558100C49741 /* libNeptune.a in Frameworks */,
+ E40D8B211AD86B4C0041A617 /* CoreFoundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416990E0DBD6600A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B2E1AD86B540041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE416A50E0DBD8800A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416B70E0DBDF800A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B221AD86B4D0041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE416C00E0DBE0C00A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416C40E0DBE2F00A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B231AD86B4D0041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE416CD0E0DBE3B00A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416D10E0DBE5A00A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B261AD86B510041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE416DA0E0DBE6400A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416DE0E0DBE7F00A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B271AD86B510041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE416E70E0DBE8C00A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416EB0E0DBEAF00A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B281AD86B520041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE416F40E0DBEB900A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416F80E0DBEDD00A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B2A1AD86B520041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE417010E0DBEED00A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417050E0DBF0900A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B2B1AD86B530041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE4170E0E0DBF1100A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417120E0DBF2800A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B2C1AD86B530041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE4171B0E0DBF3100A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE4172B0E0DC03500A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B301AD86B550041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE417340E0DC04000A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417380E0DC06700A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B311AD86B560041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE417410E0DC06F00A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417450E0DC08C00A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B331AD86B570041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE4174E0E0DC09500A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417520E0DC0A800A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B341AD86B580041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE4175B0E0DC0B200A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE4175F0E0DC0D200A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B361AD86B580041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE417680E0DC0DB00A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE4179B0E0DC13A00A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B1B1AD86B480041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE417A40E0DC14100A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417B90E0DC19400A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B1C1AD86B490041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE417C20E0DC1A100A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417C60E0DC1B400A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B1E1AD86B4B0041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE417CF0E0DC1BF00A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417D30E0DC1D600A530D1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B1D1AD86B4A0041A617 /* CoreFoundation.framework in Frameworks */,
+ CAE417DC0E0DC1DF00A530D1 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAF26E8B18C74A2F0015ABB9 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B371AD86B5A0041A617 /* CoreFoundation.framework in Frameworks */,
+ CAF26E9A18C74D320015ABB9 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAF26E9C18C7FF630015ABB9 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2B931AE764E80092347B /* libNeptune.a in Frameworks */,
+ E40D8B411AD86B5F0041A617 /* CoreFoundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAF2EFD50E64A27200948C04 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8B391AD86B5C0041A617 /* CoreFoundation.framework in Frameworks */,
+ CAF2EFDF0E64A2B700948C04 /* libNeptune.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E40D8B981AD86D3A0041A617 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E44E2AE21AE75CD20092347B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E4FCC8581B1E3EB500CCA327 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F912B69D0B8EB1C700C1E90D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE063D31241473B00E5AFC4 /* libaxTLS.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ CA16FE6011C6C882006E2A86 /* Apple */ = {
+ isa = PBXGroup;
+ children = (
+ E40D8B951AD86CD20041A617 /* NptAppleAutoreleasePool.mm */,
+ CA16FE6111C6C882006E2A86 /* NptAppleLogConfig.mm */,
+ );
+ path = Apple;
+ sourceTree = "<group>";
+ };
+ CA197D190E1AE4200018E87C /* Queue1 */ = {
+ isa = PBXGroup;
+ children = (
+ CA197D1A0E1AE4200018E87C /* QueueTest1.cpp */,
+ );
+ path = Queue1;
+ sourceTree = "<group>";
+ };
+ CA1A5E620EC0145900A9040C /* axTLS */ = {
+ isa = PBXGroup;
+ children = (
+ CA1A5E630EC0145900A9040C /* config */,
+ CA1A5E650EC0145900A9040C /* crypto */,
+ CA1A5E730EC0145900A9040C /* ssl */,
+ );
+ name = axTLS;
+ path = ../../../ThirdParty/axTLS;
+ sourceTree = SOURCE_ROOT;
+ };
+ CA1A5E630EC0145900A9040C /* config */ = {
+ isa = PBXGroup;
+ children = (
+ CA87F23D1148401E0082AAFC /* Generic */,
+ );
+ path = config;
+ sourceTree = "<group>";
+ };
+ CA1A5E650EC0145900A9040C /* crypto */ = {
+ isa = PBXGroup;
+ children = (
+ CA1A5E670EC0145900A9040C /* aes.c */,
+ CA1A5E680EC0145900A9040C /* bigint.c */,
+ CA1A5E690EC0145900A9040C /* bigint.h */,
+ CA1A5E6A0EC0145900A9040C /* bigint_impl.h */,
+ CA1A5E6B0EC0145900A9040C /* crypto.h */,
+ CA1A5E6C0EC0145900A9040C /* crypto_misc.c */,
+ CA1A5E6D0EC0145900A9040C /* hmac.c */,
+ CA1A5E6E0EC0145900A9040C /* md2.c */,
+ CA1A5E6F0EC0145900A9040C /* md5.c */,
+ CA1A5E700EC0145900A9040C /* rc4.c */,
+ CA1A5E710EC0145900A9040C /* rsa.c */,
+ CA1A5E720EC0145900A9040C /* sha1.c */,
+ );
+ path = crypto;
+ sourceTree = "<group>";
+ };
+ CA1A5E730EC0145900A9040C /* ssl */ = {
+ isa = PBXGroup;
+ children = (
+ CA1A5E750EC0145900A9040C /* asn1.c */,
+ CA1A5E760EC0145900A9040C /* cert.h */,
+ CA1A5E770EC0145900A9040C /* crypto_misc.h */,
+ CA1A5E780EC0145900A9040C /* gen_cert.c */,
+ CA1A5E790EC0145900A9040C /* loader.c */,
+ CA1A5E7C0EC0145900A9040C /* os_port.h */,
+ CA1A5E7D0EC0145900A9040C /* p12.c */,
+ CA1A5E7F0EC0145900A9040C /* ssl.h */,
+ CA1A5E800EC0145900A9040C /* tls1.c */,
+ CA1A5E810EC0145900A9040C /* tls1.h */,
+ CA1A5E820EC0145900A9040C /* tls1_clnt.c */,
+ CA1A5E830EC0145900A9040C /* tls1_svr.c */,
+ CA1A5E840EC0145900A9040C /* version.h */,
+ CA1A5E850EC0145900A9040C /* x509.c */,
+ );
+ path = ssl;
+ sourceTree = "<group>";
+ };
+ CA289B6610E16150001BC817 /* Cocoa */ = {
+ isa = PBXGroup;
+ children = (
+ E40D8B141AD868920041A617 /* NptCocoaEnviroment.mm */,
+ CA289B6710E16150001BC817 /* NptCocoaConsole.mm */,
+ CA289B6810E16150001BC817 /* NptCocoaMessageQueue.h */,
+ CA289B6910E16150001BC817 /* NptCocoaMessageQueue.mm */,
+ );
+ path = Cocoa;
+ sourceTree = "<group>";
+ };
+ CA289DBE10E31637001BC817 /* Sockets1 */ = {
+ isa = PBXGroup;
+ children = (
+ CA289DBF10E31637001BC817 /* SocketsTest1.cpp */,
+ );
+ path = Sockets1;
+ sourceTree = "<group>";
+ };
+ CA2F54320EC1165700AEBC12 /* Tls1 */ = {
+ isa = PBXGroup;
+ children = (
+ CA2F54330EC1165700AEBC12 /* TlsTest1.cpp */,
+ );
+ path = Tls1;
+ sourceTree = "<group>";
+ };
+ CA4090CC10AA25BE00ED81C5 /* Time1 */ = {
+ isa = PBXGroup;
+ children = (
+ CA4090CD10AA25BE00ED81C5 /* TimeTest1.cpp */,
+ );
+ path = Time1;
+ sourceTree = "<group>";
+ };
+ CA5041A70C5AE2180060E6FE /* Null */ = {
+ isa = PBXGroup;
+ children = (
+ CA77C18214C25AC100442B97 /* NptNullAutoreleasePool.cpp */,
+ CA5041AA0C5AE2180060E6FE /* NptNullSerialPort.cpp */,
+ );
+ path = Null;
+ sourceTree = "<group>";
+ };
+ CA77C0B314C0BC5B00442B97 /* Network1 */ = {
+ isa = PBXGroup;
+ children = (
+ CA77C0B414C0BC5B00442B97 /* NetworkTest1.cpp */,
+ );
+ path = Network1;
+ sourceTree = "<group>";
+ };
+ CA7848460F3B6EB8009E84AD /* MiniHttpServer */ = {
+ isa = PBXGroup;
+ children = (
+ CA7848470F3B6EB8009E84AD /* MiniHttpServer.cpp */,
+ );
+ path = MiniHttpServer;
+ sourceTree = "<group>";
+ };
+ CA790DA41233BDAA00875081 /* NetGet */ = {
+ isa = PBXGroup;
+ children = (
+ CA790DA51233BDAA00875081 /* NetGet.cpp */,
+ );
+ path = NetGet;
+ sourceTree = "<group>";
+ };
+ CA8066441187BCF3009D099D /* Digests1 */ = {
+ isa = PBXGroup;
+ children = (
+ CA8066451187BCF3009D099D /* DigestsTest1.cpp */,
+ );
+ path = Digests1;
+ sourceTree = "<group>";
+ };
+ CA8069E3118B57BE009D099D /* Crypto1 */ = {
+ isa = PBXGroup;
+ children = (
+ CA8069E4118B57BE009D099D /* CryptoTest1.cpp */,
+ );
+ path = Crypto1;
+ sourceTree = "<group>";
+ };
+ CA84EC460C7E517E00CC9622 /* Zlib */ = {
+ isa = PBXGroup;
+ children = (
+ CAFC5B0118051C7000169F5A /* adler32.c */,
+ CAFC5B0218051C7000169F5A /* compress.c */,
+ CAFC5B0318051C7000169F5A /* crc32.c */,
+ CAFC5B0418051C7000169F5A /* crc32.h */,
+ CAFC5B0518051C7000169F5A /* deflate.c */,
+ CAFC5B0618051C7000169F5A /* deflate.h */,
+ CAFC5B291805210000169F5A /* gzguts.h */,
+ CAFC5B0718051C7000169F5A /* infback.c */,
+ CAFC5B0818051C7000169F5A /* inffast.c */,
+ CAFC5B0918051C7000169F5A /* inffast.h */,
+ CAFC5B0A18051C7000169F5A /* inffixed.h */,
+ CAFC5B0B18051C7000169F5A /* inflate.c */,
+ CAFC5B0C18051C7000169F5A /* inflate.h */,
+ CAFC5B0D18051C7000169F5A /* inftrees.c */,
+ CAFC5B0E18051C7000169F5A /* inftrees.h */,
+ CAFC5B0F18051C7000169F5A /* trees.c */,
+ CAFC5B1018051C7000169F5A /* trees.h */,
+ CAFC5B1118051C7000169F5A /* zconf.h */,
+ CAFC5B1218051C7000169F5A /* zlib.h */,
+ CAFC5B1318051C7000169F5A /* zutil.c */,
+ CAFC5B1418051C7000169F5A /* zutil.h */,
+ );
+ name = Zlib;
+ sourceTree = "<group>";
+ };
+ CA84EC470C7E51A500CC9622 /* ThirdParty */ = {
+ isa = PBXGroup;
+ children = (
+ CA1A5E620EC0145900A9040C /* axTLS */,
+ CA84EC460C7E517E00CC9622 /* Zlib */,
+ );
+ name = ThirdParty;
+ sourceTree = "<group>";
+ };
+ CA87F23D1148401E0082AAFC /* Generic */ = {
+ isa = PBXGroup;
+ children = (
+ CA87F23E1148401E0082AAFC /* config.h */,
+ );
+ path = Generic;
+ sourceTree = "<group>";
+ };
+ CA97E01B0E2FDFA10090CC9B /* Streams1 */ = {
+ isa = PBXGroup;
+ children = (
+ CA97E01C0E2FDFA10090CC9B /* StreamsTest1.cpp */,
+ );
+ path = Streams1;
+ sourceTree = "<group>";
+ };
+ CA9958A91047001B0073F34A /* HttpClient2 */ = {
+ isa = PBXGroup;
+ children = (
+ CA9958AA1047001B0073F34A /* HttpClientTest2.cpp */,
+ );
+ path = HttpClient2;
+ sourceTree = "<group>";
+ };
+ CA9DDC7010AE3E52008B871E /* FileTest2 */ = {
+ isa = PBXGroup;
+ children = (
+ CA9DDC7110AE3E52008B871E /* FileTest2.cpp */,
+ );
+ path = FileTest2;
+ sourceTree = "<group>";
+ };
+ CAA979D50CF1648300C01909 /* Tests */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979D60CF1648300C01909 /* Arrays1 */,
+ CAA979D80CF1648300C01909 /* BufferedStreams1 */,
+ CA8069E3118B57BE009D099D /* Crypto1 */,
+ CA8066441187BCF3009D099D /* Digests1 */,
+ CAF2EFD20E64A25700948C04 /* FileTest1 */,
+ CA9DDC7010AE3E52008B871E /* FileTest2 */,
+ CAA979DA0CF1648300C01909 /* HttpClient1 */,
+ CA9958A91047001B0073F34A /* HttpClient2 */,
+ CAA979DC0CF1648300C01909 /* HttpServer1 */,
+ CAA979DE0CF1648300C01909 /* Lists1 */,
+ CAA979E00CF1648300C01909 /* Logging1 */,
+ CAC029DC139D84D10034427F /* Logging2 */,
+ CAA979E20CF1648300C01909 /* Maps1 */,
+ CAA979E40CF1648300C01909 /* Messages1 */,
+ CAA979E60CF1648300C01909 /* Messages2 */,
+ CAA979E80CF1648300C01909 /* Misc1 */,
+ CA77C0B314C0BC5B00442B97 /* Network1 */,
+ CA197D190E1AE4200018E87C /* Queue1 */,
+ CAA979EA0CF1648300C01909 /* RingBuffer1 */,
+ CA289DBE10E31637001BC817 /* Sockets1 */,
+ CA97E01B0E2FDFA10090CC9B /* Streams1 */,
+ CAA979EC0CF1648300C01909 /* Strings1 */,
+ CAA979EE0CF1648300C01909 /* Threads1 */,
+ CA4090CC10AA25BE00ED81C5 /* Time1 */,
+ CA2F54320EC1165700AEBC12 /* Tls1 */,
+ CAA979F00CF1648300C01909 /* Udp1 */,
+ CAA979F20CF1648300C01909 /* Url1 */,
+ CAA979F40CF1648300C01909 /* Xml1 */,
+ CAA979FA0CF1648300C01909 /* Zip1 */,
+ CAF26E9718C74B110015ABB9 /* Zip2 */,
+ );
+ name = Tests;
+ path = ../../../Source/Tests;
+ sourceTree = SOURCE_ROOT;
+ };
+ CAA979D60CF1648300C01909 /* Arrays1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979D70CF1648300C01909 /* ArraysTest1.cpp */,
+ );
+ path = Arrays1;
+ sourceTree = "<group>";
+ };
+ CAA979D80CF1648300C01909 /* BufferedStreams1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979D90CF1648300C01909 /* BufferedStreamsTest1.cpp */,
+ );
+ path = BufferedStreams1;
+ sourceTree = "<group>";
+ };
+ CAA979DA0CF1648300C01909 /* HttpClient1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979DB0CF1648300C01909 /* HttpClientTest1.cpp */,
+ );
+ path = HttpClient1;
+ sourceTree = "<group>";
+ };
+ CAA979DC0CF1648300C01909 /* HttpServer1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979DD0CF1648300C01909 /* HttpServerTest1.cpp */,
+ );
+ path = HttpServer1;
+ sourceTree = "<group>";
+ };
+ CAA979DE0CF1648300C01909 /* Lists1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979DF0CF1648300C01909 /* ListsTest1.cpp */,
+ );
+ path = Lists1;
+ sourceTree = "<group>";
+ };
+ CAA979E00CF1648300C01909 /* Logging1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979E10CF1648300C01909 /* LoggingTest1.cpp */,
+ );
+ path = Logging1;
+ sourceTree = "<group>";
+ };
+ CAA979E20CF1648300C01909 /* Maps1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979E30CF1648300C01909 /* MapsTest1.cpp */,
+ );
+ path = Maps1;
+ sourceTree = "<group>";
+ };
+ CAA979E40CF1648300C01909 /* Messages1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979E50CF1648300C01909 /* MessagesTest1.cpp */,
+ );
+ path = Messages1;
+ sourceTree = "<group>";
+ };
+ CAA979E60CF1648300C01909 /* Messages2 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979E70CF1648300C01909 /* MessagesTest2.cpp */,
+ );
+ path = Messages2;
+ sourceTree = "<group>";
+ };
+ CAA979E80CF1648300C01909 /* Misc1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979E90CF1648300C01909 /* MiscTest1.cpp */,
+ );
+ path = Misc1;
+ sourceTree = "<group>";
+ };
+ CAA979EA0CF1648300C01909 /* RingBuffer1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979EB0CF1648300C01909 /* RingBufferTest1.cpp */,
+ );
+ path = RingBuffer1;
+ sourceTree = "<group>";
+ };
+ CAA979EC0CF1648300C01909 /* Strings1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979ED0CF1648300C01909 /* StringsTest1.cpp */,
+ );
+ path = Strings1;
+ sourceTree = "<group>";
+ };
+ CAA979EE0CF1648300C01909 /* Threads1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979EF0CF1648300C01909 /* ThreadsTest1.cpp */,
+ );
+ path = Threads1;
+ sourceTree = "<group>";
+ };
+ CAA979F00CF1648300C01909 /* Udp1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979F10CF1648300C01909 /* UdpTest1.cpp */,
+ );
+ path = Udp1;
+ sourceTree = "<group>";
+ };
+ CAA979F20CF1648300C01909 /* Url1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979F30CF1648300C01909 /* UrlTest1.cpp */,
+ );
+ path = Url1;
+ sourceTree = "<group>";
+ };
+ CAA979F40CF1648300C01909 /* Xml1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979F50CF1648300C01909 /* big.xml */,
+ CAA979F60CF1648300C01909 /* test.xml */,
+ CAA979F70CF1648300C01909 /* unicode.xml */,
+ CAA979F80CF1648300C01909 /* XmlTest1.cpp */,
+ CAA979F90CF1648300C01909 /* XmlTest1Data.cpp */,
+ );
+ path = Xml1;
+ sourceTree = "<group>";
+ };
+ CAA979FA0CF1648300C01909 /* Zip1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAA979FB0CF1648300C01909 /* big.xml.gz */,
+ CAA979FC0CF1648300C01909 /* ZipTest1.cpp */,
+ CAA979FD0CF1648300C01909 /* ZipTestData1.cpp */,
+ );
+ path = Zip1;
+ sourceTree = "<group>";
+ };
+ CAAAA07512FF823200ABC84B /* NetResolve */ = {
+ isa = PBXGroup;
+ children = (
+ CAAAA07612FF823200ABC84B /* NetResolve.cpp */,
+ );
+ path = NetResolve;
+ sourceTree = "<group>";
+ };
+ CAC029DC139D84D10034427F /* Logging2 */ = {
+ isa = PBXGroup;
+ children = (
+ CAC029DD139D84D10034427F /* LoggingTest2.cpp */,
+ );
+ path = Logging2;
+ sourceTree = "<group>";
+ };
+ CAC8F09B16AB54AF00C49741 /* NetBench */ = {
+ isa = PBXGroup;
+ children = (
+ CAC8F09C16AB54AF00C49741 /* NetBench.cpp */,
+ );
+ path = NetBench;
+ sourceTree = "<group>";
+ };
+ CAE417A50E0DC16300A530D1 /* Apps */ = {
+ isa = PBXGroup;
+ children = (
+ CA7848460F3B6EB8009E84AD /* MiniHttpServer */,
+ CAC8F09B16AB54AF00C49741 /* NetBench */,
+ CAE417A60E0DC16300A530D1 /* NetConfig */,
+ CAE417A80E0DC16300A530D1 /* NetEcho */,
+ CA790DA41233BDAA00875081 /* NetGet */,
+ CAE417AA0E0DC16300A530D1 /* NetPing */,
+ CAE417AC0E0DC16300A530D1 /* NetPump */,
+ CAAAA07512FF823200ABC84B /* NetResolve */,
+ CAF26EA818C7FF820015ABB9 /* ZipHttpServer */,
+ );
+ name = Apps;
+ path = ../../../Source/Apps;
+ sourceTree = SOURCE_ROOT;
+ };
+ CAE417A60E0DC16300A530D1 /* NetConfig */ = {
+ isa = PBXGroup;
+ children = (
+ CAE417A70E0DC16300A530D1 /* NetConfig.cpp */,
+ );
+ path = NetConfig;
+ sourceTree = "<group>";
+ };
+ CAE417A80E0DC16300A530D1 /* NetEcho */ = {
+ isa = PBXGroup;
+ children = (
+ CAE417A90E0DC16300A530D1 /* NetEcho.cpp */,
+ );
+ path = NetEcho;
+ sourceTree = "<group>";
+ };
+ CAE417AA0E0DC16300A530D1 /* NetPing */ = {
+ isa = PBXGroup;
+ children = (
+ CAE417AB0E0DC16300A530D1 /* NetPing.cpp */,
+ );
+ path = NetPing;
+ sourceTree = "<group>";
+ };
+ CAE417AC0E0DC16300A530D1 /* NetPump */ = {
+ isa = PBXGroup;
+ children = (
+ CAE417AD0E0DC16300A530D1 /* NetPump.cpp */,
+ );
+ path = NetPump;
+ sourceTree = "<group>";
+ };
+ CAE4F7661157C3A000DD82F9 /* Data */ = {
+ isa = PBXGroup;
+ children = (
+ CAE4F7671157C3A000DD82F9 /* TLS */,
+ );
+ path = Data;
+ sourceTree = "<group>";
+ };
+ CAE4F7671157C3A000DD82F9 /* TLS */ = {
+ isa = PBXGroup;
+ children = (
+ CA057AAE11BC27F200C90519 /* NptTlsDefaultTrustAnchorsBase.cpp */,
+ CA057AAF11BC27F200C90519 /* NptTlsDefaultTrustAnchorsExtended.cpp */,
+ );
+ path = TLS;
+ sourceTree = "<group>";
+ };
+ CAF26E9718C74B110015ABB9 /* Zip2 */ = {
+ isa = PBXGroup;
+ children = (
+ CAF26E9818C74B110015ABB9 /* ZipTest2.cpp */,
+ );
+ path = Zip2;
+ sourceTree = "<group>";
+ };
+ CAF26EA818C7FF820015ABB9 /* ZipHttpServer */ = {
+ isa = PBXGroup;
+ children = (
+ CAF26EA918C7FF820015ABB9 /* ZipHttpServer.cpp */,
+ );
+ path = ZipHttpServer;
+ sourceTree = "<group>";
+ };
+ CAF2EFD20E64A25700948C04 /* FileTest1 */ = {
+ isa = PBXGroup;
+ children = (
+ CAF2EFD30E64A25700948C04 /* FileTest1.cpp */,
+ );
+ path = FileTest1;
+ sourceTree = "<group>";
+ };
+ E40D8B9D1AD86D3A0041A617 /* Neptune-Framework */ = {
+ isa = PBXGroup;
+ children = (
+ E40D8BA01AD86D3A0041A617 /* Neptune.h */,
+ E40D8B9E1AD86D3A0041A617 /* Supporting Files */,
+ );
+ path = "Neptune-Framework";
+ sourceTree = "<group>";
+ };
+ E40D8B9E1AD86D3A0041A617 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ E40D8B9F1AD86D3A0041A617 /* Info.plist */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ F912B6850B8EB12700C1E90D = {
+ isa = PBXGroup;
+ children = (
+ F912B6A50B8EB27400C1E90D /* Source */,
+ CAE417A50E0DC16300A530D1 /* Apps */,
+ CAA979D50CF1648300C01909 /* Tests */,
+ E40D8B9D1AD86D3A0041A617 /* Neptune-Framework */,
+ F912B6A00B8EB1C700C1E90D /* Products */,
+ CA16FE6511C6C954006E2A86 /* CoreFoundation.framework */,
+ );
+ sourceTree = "<group>";
+ };
+ F912B6A00B8EB1C700C1E90D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ F912B69F0B8EB1C700C1E90D /* libNeptune.a */,
+ CAA97A010CF164A700C01909 /* XmlTest1 */,
+ CAA97A1B0CF1654A00C01909 /* StringsTest1 */,
+ CA550D550D20A37E00B22D72 /* HttpServerTest1 */,
+ CAE4169B0E0DBD6600A530D1 /* MiscTest1 */,
+ CAE416B90E0DBDF800A530D1 /* ArraysTest1 */,
+ CAE416C60E0DBE2F00A530D1 /* BufferedStreamsTest1 */,
+ CAE416D30E0DBE5A00A530D1 /* HttpClientTest1 */,
+ CAE416E00E0DBE7F00A530D1 /* ListsTest1 */,
+ CAE416ED0E0DBEAF00A530D1 /* LoggingTest1 */,
+ CAE416FA0E0DBEDD00A530D1 /* MapsTest1 */,
+ CAE417070E0DBF0900A530D1 /* MessagesTest1 */,
+ CAE417140E0DBF2800A530D1 /* MessagesTest2 */,
+ CAE4172D0E0DC03500A530D1 /* RingBufferTest1 */,
+ CAE4173A0E0DC06700A530D1 /* ThreadsTest1 */,
+ CAE417470E0DC08C00A530D1 /* UdpTest1 */,
+ CAE417540E0DC0A800A530D1 /* UrlTest1 */,
+ CAE417610E0DC0D200A530D1 /* ZipTest1 */,
+ CAE4179D0E0DC13A00A530D1 /* NetPump */,
+ CAE417BB0E0DC19400A530D1 /* NetEcho */,
+ CAE417C80E0DC1B400A530D1 /* NetConfig */,
+ CAE417D50E0DC1D600A530D1 /* NetPing */,
+ CA197D1E0E1AE4360018E87C /* QueueTest1 */,
+ CA97E0200E2FDFB30090CC9B /* StreamsTest1 */,
+ CAF2EFD70E64A27200948C04 /* FileTest1 */,
+ CA1A5EA90EC0152A00A9040C /* libaxTLS.a */,
+ CA2F54240EC115E600AEBC12 /* TlsTest1 */,
+ CA30B76B0F0DCE990085B46E /* LoggingTest2 */,
+ CA78483D0F3B6E69009E84AD /* minihttpserver */,
+ CA9958A01046FFC70073F34A /* HttpClientTest2 */,
+ CA4090C410AA257B00ED81C5 /* TimeTest1 */,
+ CA9DDC6610AE3DD6008B871E /* FileTest2 */,
+ CA289DB710E31600001BC817 /* SocketsTest1 */,
+ CA8066491187BD08009D099D /* DigestsTest1 */,
+ CA8069D9118B577E009D099D /* CryptoTest1 */,
+ CA790DA91233BDC100875081 /* NetGet */,
+ CAAAA07C12FF824E00ABC84B /* NetResolve */,
+ CA77C0BA14C0BC7700442B97 /* NetworkTest1 */,
+ CAC8F0A116AB54EA00C49741 /* NetBench */,
+ CAF26E8E18C74A2F0015ABB9 /* ZipTest2 */,
+ CAF26E9F18C7FF630015ABB9 /* ziphttpserver */,
+ E40D8B9C1AD86D3A0041A617 /* Neptune.framework */,
+ E44E2B1B1AE75CD20092347B /* Neptune.framework */,
+ E4FCC85E1B1E3EB500CCA327 /* libaxTLS.a */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ F912B6A50B8EB27400C1E90D /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ CAE4F7661157C3A000DD82F9 /* Data */,
+ F912B6AF0B8EB27400C1E90D /* Core */,
+ F912B6EE0B8EB27400C1E90D /* System */,
+ CA84EC470C7E51A500CC9622 /* ThirdParty */,
+ );
+ name = Source;
+ path = ../../../Source;
+ sourceTree = SOURCE_ROOT;
+ };
+ F912B6AF0B8EB27400C1E90D /* Core */ = {
+ isa = PBXGroup;
+ children = (
+ E40D8D671ADB808A0041A617 /* NptTlsDefaultTrustAnchorsBase.h */,
+ E40D8D681ADB808A0041A617 /* NptTlsDefaultTrustAnchorsExtended.h */,
+ F912B6B00B8EB27400C1E90D /* Neptune.cpp */,
+ F912B6B10B8EB27400C1E90D /* Neptune.h */,
+ F912B6B20B8EB27400C1E90D /* NptArray.h */,
+ E40D8B161AD868A80041A617 /* NptAutomaticCleaner.cpp */,
+ E40D8B171AD868A80041A617 /* NptAutomaticCleaner.h */,
+ CA77C17E14C259AB00442B97 /* NptAutoreleasePool.h */,
+ F912B6B30B8EB27400C1E90D /* NptBase64.cpp */,
+ F912B6B40B8EB27400C1E90D /* NptBase64.h */,
+ F912B6B50B8EB27400C1E90D /* NptBufferedStreams.cpp */,
+ F912B6B60B8EB27400C1E90D /* NptBufferedStreams.h */,
+ F912B6B70B8EB27400C1E90D /* NptCommon.cpp */,
+ F912B6B80B8EB27400C1E90D /* NptCommon.h */,
+ F912B6B90B8EB27400C1E90D /* NptConfig.h */,
+ F912B6BA0B8EB27400C1E90D /* NptConsole.cpp */,
+ F912B6BB0B8EB27400C1E90D /* NptConsole.h */,
+ F912B6BC0B8EB27400C1E90D /* NptConstants.h */,
+ CA806987118A602B009D099D /* NptCrypto.cpp */,
+ CA806988118A602B009D099D /* NptCrypto.h */,
+ F912B6BD0B8EB27400C1E90D /* NptDataBuffer.cpp */,
+ F912B6BE0B8EB27400C1E90D /* NptDataBuffer.h */,
+ F912B6BF0B8EB27400C1E90D /* NptDebug.cpp */,
+ F912B6C00B8EB27400C1E90D /* NptDebug.h */,
+ F912B6C10B8EB27400C1E90D /* NptDefs.h */,
+ CAEB8EC111864F0B00B4AF01 /* NptDigest.cpp */,
+ CAEB8EC211864F0B00B4AF01 /* NptDigest.h */,
+ CA926A4F0F8BEB50003CB74E /* NptDynamicCast.h */,
+ CA1D056C0E68E29C00E3DEE8 /* NptDynamicLibraries.cpp */,
+ CA1D056D0E68E29C00E3DEE8 /* NptDynamicLibraries.h */,
+ F912B6C20B8EB27400C1E90D /* NptFile.cpp */,
+ F912B6C30B8EB27400C1E90D /* NptFile.h */,
+ CAD78E0312A9C42000D7EBA7 /* NptHash.cpp */,
+ CAD78DD212A99DC500D7EBA7 /* NptHash.h */,
+ F912B6C40B8EB27400C1E90D /* NptHttp.cpp */,
+ F912B6C50B8EB27400C1E90D /* NptHttp.h */,
+ F912B6C60B8EB27400C1E90D /* NptInterfaces.h */,
+ CA2EF626154DDFA700933B11 /* NptJson.cpp */,
+ CA2EF627154DDFA700933B11 /* NptJson.h */,
+ F912B6C70B8EB27400C1E90D /* NptList.cpp */,
+ F912B6C80B8EB27400C1E90D /* NptList.h */,
+ F912B6C90B8EB27400C1E90D /* NptLogging.cpp */,
+ F912B6CA0B8EB27400C1E90D /* NptLogging.h */,
+ F912B6CB0B8EB27400C1E90D /* NptMap.h */,
+ F912B6CC0B8EB27400C1E90D /* NptMessaging.cpp */,
+ F912B6CD0B8EB27400C1E90D /* NptMessaging.h */,
+ F912B6CE0B8EB27400C1E90D /* NptNetwork.cpp */,
+ F912B6CF0B8EB27400C1E90D /* NptNetwork.h */,
+ F912B6D00B8EB27400C1E90D /* NptQueue.cpp */,
+ F912B6D10B8EB27400C1E90D /* NptQueue.h */,
+ F912B6D20B8EB27400C1E90D /* NptReferences.h */,
+ CA096EF10ED0DBCE00A5103D /* NptResults.cpp */,
+ F912B6D30B8EB27400C1E90D /* NptResults.h */,
+ F912B6D40B8EB27400C1E90D /* NptRingBuffer.cpp */,
+ F912B6D50B8EB27400C1E90D /* NptRingBuffer.h */,
+ F912B6D60B8EB27400C1E90D /* NptSelectableMessageQueue.h */,
+ CA1D056E0E68E29C00E3DEE8 /* NptSerialPort.h */,
+ F912B6D70B8EB27400C1E90D /* NptSimpleMessageQueue.cpp */,
+ F912B6D80B8EB27400C1E90D /* NptSimpleMessageQueue.h */,
+ F912B6D90B8EB27400C1E90D /* NptSockets.cpp */,
+ F912B6DA0B8EB27400C1E90D /* NptSockets.h */,
+ F912B6DB0B8EB27400C1E90D /* NptStack.h */,
+ F912B6DC0B8EB27400C1E90D /* NptStreams.cpp */,
+ F912B6DD0B8EB27400C1E90D /* NptStreams.h */,
+ F912B6DE0B8EB27400C1E90D /* NptStrings.cpp */,
+ F912B6DF0B8EB27400C1E90D /* NptStrings.h */,
+ F912B6E00B8EB27400C1E90D /* NptSystem.cpp */,
+ F912B6E10B8EB27400C1E90D /* NptSystem.h */,
+ F912B6E20B8EB27400C1E90D /* NptThreads.cpp */,
+ F912B6E30B8EB27400C1E90D /* NptThreads.h */,
+ F912B6E40B8EB27400C1E90D /* NptTime.cpp */,
+ F912B6E50B8EB27400C1E90D /* NptTime.h */,
+ CAFB236E0EC760FE009C3459 /* NptTls.cpp */,
+ CAFB236F0EC760FE009C3459 /* NptTls.h */,
+ F912B6E60B8EB27400C1E90D /* NptTypes.h */,
+ F912B6E70B8EB27400C1E90D /* NptUri.cpp */,
+ F912B6E80B8EB27400C1E90D /* NptUri.h */,
+ F912B6E90B8EB27400C1E90D /* NptUtils.cpp */,
+ F912B6EA0B8EB27400C1E90D /* NptUtils.h */,
+ F912B6EB0B8EB27400C1E90D /* NptVersion.h */,
+ F912B6EC0B8EB27400C1E90D /* NptXml.cpp */,
+ F912B6ED0B8EB27400C1E90D /* NptXml.h */,
+ CAF03CB50C7E7F15002C470F /* NptZip.cpp */,
+ CA84EC7A0C7E5A7000CC9622 /* NptZip.h */,
+ );
+ path = Core;
+ sourceTree = "<group>";
+ };
+ F912B6EE0B8EB27400C1E90D /* System */ = {
+ isa = PBXGroup;
+ children = (
+ CA16FE6011C6C882006E2A86 /* Apple */,
+ CA289B6610E16150001BC817 /* Cocoa */,
+ CA5041A70C5AE2180060E6FE /* Null */,
+ F912B6EF0B8EB27400C1E90D /* Bsd */,
+ F912B6F70B8EB27400C1E90D /* Posix */,
+ F912B6FE0B8EB27400C1E90D /* StdC */,
+ );
+ path = System;
+ sourceTree = "<group>";
+ };
+ F912B6EF0B8EB27400C1E90D /* Bsd */ = {
+ isa = PBXGroup;
+ children = (
+ CAC5048212FFB7EF00FEB1D8 /* NptBsdResolver.cpp */,
+ F912B6F00B8EB27400C1E90D /* NptBsdNetwork.cpp */,
+ F912B6F10B8EB27400C1E90D /* NptBsdSockets.cpp */,
+ );
+ path = Bsd;
+ sourceTree = "<group>";
+ };
+ F912B6F70B8EB27400C1E90D /* Posix */ = {
+ isa = PBXGroup;
+ children = (
+ CA40905B10AA10A800ED81C5 /* NptPosixTime.cpp */,
+ CA1D05720E68E2AC00E3DEE8 /* NptPosixDynamicLibraries.cpp */,
+ CAF2EFB70E64882900948C04 /* NptPosixNetwork.cpp */,
+ CAF2EFB50E64881E00948C04 /* NptPosixFile.cpp */,
+ F912B6F80B8EB27400C1E90D /* NptPosixQueue.cpp */,
+ F912B6F90B8EB27400C1E90D /* NptPosixSystem.cpp */,
+ F912B6FA0B8EB27400C1E90D /* NptPosixThreads.cpp */,
+ F912B6FB0B8EB27400C1E90D /* NptSelectableMessageQueue.cpp */,
+ );
+ path = Posix;
+ sourceTree = "<group>";
+ };
+ F912B6FE0B8EB27400C1E90D /* StdC */ = {
+ isa = PBXGroup;
+ children = (
+ F912B6FF0B8EB27400C1E90D /* NptStdcConsole.cpp */,
+ F912B7000B8EB27400C1E90D /* NptStdcDebug.cpp */,
+ F912B7010B8EB27400C1E90D /* NptStdcEnvironment.cpp */,
+ F912B7020B8EB27400C1E90D /* NptStdcFile.cpp */,
+ );
+ path = StdC;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ CA1A5EA50EC0152A00A9040C /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA1A5EB00EC0154D00A9040C /* version.h in Headers */,
+ CA1A5EB30EC0155000A9040C /* tls1.h in Headers */,
+ CA1A5EB50EC0155100A9040C /* ssl.h in Headers */,
+ CA1A5EC30EC0155A00A9040C /* crypto_misc.h in Headers */,
+ CA1A5EC50EC0155C00A9040C /* crypto.h in Headers */,
+ CA1A5EC70EC0155E00A9040C /* cert.h in Headers */,
+ CA1A5EC80EC0155F00A9040C /* bigint_impl.h in Headers */,
+ CA1A5EC90EC0155F00A9040C /* bigint.h in Headers */,
+ CA87F23F1148401E0082AAFC /* config.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E40D8B991AD86D3A0041A617 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8BB71AD86F450041A617 /* NptArray.h in Headers */,
+ E40D8BB91AD86F450041A617 /* NptAutomaticCleaner.h in Headers */,
+ E40D8BBA1AD86F450041A617 /* NptAutoreleasePool.h in Headers */,
+ E40D8BBC1AD86F450041A617 /* NptBase64.h in Headers */,
+ E40D8BBE1AD86F450041A617 /* NptBufferedStreams.h in Headers */,
+ E40D8BC01AD86F450041A617 /* NptCommon.h in Headers */,
+ E40D8BC11AD86F450041A617 /* NptConfig.h in Headers */,
+ E40D8BC31AD86F450041A617 /* NptConsole.h in Headers */,
+ E40D8BC41AD86F450041A617 /* NptConstants.h in Headers */,
+ E40D8BC61AD86F450041A617 /* NptCrypto.h in Headers */,
+ E40D8BC81AD86F450041A617 /* NptDataBuffer.h in Headers */,
+ E40D8BCA1AD86F450041A617 /* NptDebug.h in Headers */,
+ E40D8BCB1AD86F450041A617 /* NptDefs.h in Headers */,
+ E40D8BCD1AD86F450041A617 /* NptDigest.h in Headers */,
+ E40D8BCE1AD86F450041A617 /* NptDynamicCast.h in Headers */,
+ E40D8BD01AD86F450041A617 /* NptDynamicLibraries.h in Headers */,
+ E40D8BD21AD86F450041A617 /* NptFile.h in Headers */,
+ E40D8BD41AD86F450041A617 /* NptHash.h in Headers */,
+ E40D8BD61AD86F450041A617 /* NptHttp.h in Headers */,
+ E40D8BD71AD86F450041A617 /* NptInterfaces.h in Headers */,
+ E40D8BD91AD86F450041A617 /* NptJson.h in Headers */,
+ E40D8BDB1AD86F450041A617 /* NptList.h in Headers */,
+ E40D8BDD1AD86F450041A617 /* NptLogging.h in Headers */,
+ E40D8BDE1AD86F450041A617 /* NptMap.h in Headers */,
+ E40D8BE01AD86F450041A617 /* NptMessaging.h in Headers */,
+ E40D8BE21AD86F450041A617 /* NptNetwork.h in Headers */,
+ E40D8BEA1AD86F450041A617 /* NptSelectableMessageQueue.h in Headers */,
+ E40D8BED1AD86F450041A617 /* NptSimpleMessageQueue.h in Headers */,
+ E40D8BE41AD86F450041A617 /* NptQueue.h in Headers */,
+ E40D8BE51AD86F450041A617 /* NptReferences.h in Headers */,
+ E40D8BE71AD86F450041A617 /* NptResults.h in Headers */,
+ E40D8C2E1AD874BB0041A617 /* NptTls.h in Headers */,
+ E40D8BE91AD86F450041A617 /* NptRingBuffer.h in Headers */,
+ E40D8BEB1AD86F450041A617 /* NptSerialPort.h in Headers */,
+ E40D8BEF1AD86F450041A617 /* NptSockets.h in Headers */,
+ E40D8BF01AD86F450041A617 /* NptStack.h in Headers */,
+ E40D8BF21AD86F450041A617 /* NptStreams.h in Headers */,
+ E40D8BA11AD86D3A0041A617 /* Neptune.h in Headers */,
+ E40D8BF41AD86F450041A617 /* NptStrings.h in Headers */,
+ E40D8BF61AD86F450041A617 /* NptSystem.h in Headers */,
+ E40D8BF81AD86F450041A617 /* NptThreads.h in Headers */,
+ E40D8BFA1AD86F450041A617 /* NptTime.h in Headers */,
+ E40D8C021AD86F450041A617 /* NptVersion.h in Headers */,
+ E40D8BFD1AD86F450041A617 /* NptTypes.h in Headers */,
+ E40D8BFF1AD86F450041A617 /* NptUri.h in Headers */,
+ E40D8C011AD86F450041A617 /* NptUtils.h in Headers */,
+ E40D8C041AD86F450041A617 /* NptXml.h in Headers */,
+ E40D8D6A1ADB80980041A617 /* NptTlsDefaultTrustAnchorsBase.h in Headers */,
+ E40D8D691ADB80950041A617 /* NptTlsDefaultTrustAnchorsExtended.h in Headers */,
+ E40D8D661ADB7F8D0041A617 /* NptZip.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E44E2AE41AE75CD20092347B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2AE51AE75CD20092347B /* NptArray.h in Headers */,
+ E44E2AE61AE75CD20092347B /* NptAutomaticCleaner.h in Headers */,
+ E44E2AE71AE75CD20092347B /* NptAutoreleasePool.h in Headers */,
+ E44E2AE81AE75CD20092347B /* NptBase64.h in Headers */,
+ E44E2AE91AE75CD20092347B /* NptBufferedStreams.h in Headers */,
+ E44E2AEA1AE75CD20092347B /* NptCommon.h in Headers */,
+ E44E2AEB1AE75CD20092347B /* NptConfig.h in Headers */,
+ E44E2AEC1AE75CD20092347B /* NptConsole.h in Headers */,
+ E44E2AED1AE75CD20092347B /* NptConstants.h in Headers */,
+ E44E2AEE1AE75CD20092347B /* NptCrypto.h in Headers */,
+ E44E2AEF1AE75CD20092347B /* NptDataBuffer.h in Headers */,
+ E44E2AF01AE75CD20092347B /* NptDebug.h in Headers */,
+ E44E2AF11AE75CD20092347B /* NptDefs.h in Headers */,
+ E44E2AF21AE75CD20092347B /* NptDigest.h in Headers */,
+ E44E2AF31AE75CD20092347B /* NptDynamicCast.h in Headers */,
+ E44E2AF41AE75CD20092347B /* NptDynamicLibraries.h in Headers */,
+ E44E2AF51AE75CD20092347B /* NptFile.h in Headers */,
+ E44E2AF61AE75CD20092347B /* NptHash.h in Headers */,
+ E44E2AF71AE75CD20092347B /* NptHttp.h in Headers */,
+ E44E2AF81AE75CD20092347B /* NptInterfaces.h in Headers */,
+ E44E2AF91AE75CD20092347B /* NptJson.h in Headers */,
+ E44E2AFA1AE75CD20092347B /* NptList.h in Headers */,
+ E44E2AFB1AE75CD20092347B /* NptLogging.h in Headers */,
+ E44E2AFC1AE75CD20092347B /* NptMap.h in Headers */,
+ E44E2AFD1AE75CD20092347B /* NptMessaging.h in Headers */,
+ E44E2AFE1AE75CD20092347B /* NptNetwork.h in Headers */,
+ E44E2AFF1AE75CD20092347B /* NptSelectableMessageQueue.h in Headers */,
+ E44E2B001AE75CD20092347B /* NptSimpleMessageQueue.h in Headers */,
+ E44E2B011AE75CD20092347B /* NptQueue.h in Headers */,
+ E44E2B021AE75CD20092347B /* NptReferences.h in Headers */,
+ E44E2B031AE75CD20092347B /* NptResults.h in Headers */,
+ E44E2B041AE75CD20092347B /* NptTls.h in Headers */,
+ E44E2B051AE75CD20092347B /* NptRingBuffer.h in Headers */,
+ E44E2B061AE75CD20092347B /* NptSerialPort.h in Headers */,
+ E44E2B071AE75CD20092347B /* NptSockets.h in Headers */,
+ E44E2B081AE75CD20092347B /* NptStack.h in Headers */,
+ E44E2B091AE75CD20092347B /* NptStreams.h in Headers */,
+ E44E2B0A1AE75CD20092347B /* Neptune.h in Headers */,
+ E44E2B0B1AE75CD20092347B /* NptStrings.h in Headers */,
+ E44E2B0C1AE75CD20092347B /* NptSystem.h in Headers */,
+ E44E2B0D1AE75CD20092347B /* NptThreads.h in Headers */,
+ E44E2B0E1AE75CD20092347B /* NptTime.h in Headers */,
+ E44E2B0F1AE75CD20092347B /* NptVersion.h in Headers */,
+ E44E2B101AE75CD20092347B /* NptTypes.h in Headers */,
+ E44E2B111AE75CD20092347B /* NptUri.h in Headers */,
+ E44E2B121AE75CD20092347B /* NptUtils.h in Headers */,
+ E44E2B131AE75CD20092347B /* NptXml.h in Headers */,
+ E44E2B141AE75CD20092347B /* NptTlsDefaultTrustAnchorsBase.h in Headers */,
+ E44E2B151AE75CD20092347B /* NptTlsDefaultTrustAnchorsExtended.h in Headers */,
+ E44E2B161AE75CD20092347B /* NptZip.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E4FCC83C1B1E3EB500CCA327 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E4FCC83D1B1E3EB500CCA327 /* version.h in Headers */,
+ E4FCC83E1B1E3EB500CCA327 /* tls1.h in Headers */,
+ E4FCC83F1B1E3EB500CCA327 /* ssl.h in Headers */,
+ E4FCC8401B1E3EB500CCA327 /* crypto_misc.h in Headers */,
+ E4FCC8411B1E3EB500CCA327 /* crypto.h in Headers */,
+ E4FCC8421B1E3EB500CCA327 /* cert.h in Headers */,
+ E4FCC8431B1E3EB500CCA327 /* bigint_impl.h in Headers */,
+ E4FCC8441B1E3EB500CCA327 /* bigint.h in Headers */,
+ E4FCC8451B1E3EB500CCA327 /* config.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F912B69B0B8EB1C700C1E90D /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ F912B7490B8EB27400C1E90D /* Neptune.h in Headers */,
+ F912B74A0B8EB27400C1E90D /* NptArray.h in Headers */,
+ F912B74C0B8EB27400C1E90D /* NptBase64.h in Headers */,
+ F912B74E0B8EB27400C1E90D /* NptBufferedStreams.h in Headers */,
+ F912B7500B8EB27400C1E90D /* NptCommon.h in Headers */,
+ F912B7510B8EB27400C1E90D /* NptConfig.h in Headers */,
+ F912B7530B8EB27400C1E90D /* NptConsole.h in Headers */,
+ F912B7540B8EB27400C1E90D /* NptConstants.h in Headers */,
+ F912B7560B8EB27400C1E90D /* NptDataBuffer.h in Headers */,
+ F912B7580B8EB27400C1E90D /* NptDebug.h in Headers */,
+ CAFC5B1D18051F2800169F5A /* inffast.h in Headers */,
+ F912B7590B8EB27400C1E90D /* NptDefs.h in Headers */,
+ F912B75B0B8EB27400C1E90D /* NptFile.h in Headers */,
+ F912B75D0B8EB27400C1E90D /* NptHttp.h in Headers */,
+ F912B75E0B8EB27400C1E90D /* NptInterfaces.h in Headers */,
+ F912B7600B8EB27400C1E90D /* NptList.h in Headers */,
+ F912B7620B8EB27400C1E90D /* NptLogging.h in Headers */,
+ F912B7630B8EB27400C1E90D /* NptMap.h in Headers */,
+ F912B7650B8EB27400C1E90D /* NptMessaging.h in Headers */,
+ F912B7670B8EB27400C1E90D /* NptNetwork.h in Headers */,
+ F912B7690B8EB27400C1E90D /* NptQueue.h in Headers */,
+ CAFC5B2618051F2800169F5A /* zlib.h in Headers */,
+ F912B76A0B8EB27400C1E90D /* NptReferences.h in Headers */,
+ F912B76B0B8EB27400C1E90D /* NptResults.h in Headers */,
+ F912B76D0B8EB27400C1E90D /* NptRingBuffer.h in Headers */,
+ F912B76E0B8EB27400C1E90D /* NptSelectableMessageQueue.h in Headers */,
+ F912B7700B8EB27400C1E90D /* NptSimpleMessageQueue.h in Headers */,
+ F912B7720B8EB27400C1E90D /* NptSockets.h in Headers */,
+ F912B7730B8EB27400C1E90D /* NptStack.h in Headers */,
+ F912B7750B8EB27400C1E90D /* NptStreams.h in Headers */,
+ CAFC5B2518051F2800169F5A /* zconf.h in Headers */,
+ F912B7770B8EB27400C1E90D /* NptStrings.h in Headers */,
+ CAFC5B2418051F2800169F5A /* trees.h in Headers */,
+ F912B7790B8EB27400C1E90D /* NptSystem.h in Headers */,
+ F912B77B0B8EB27400C1E90D /* NptThreads.h in Headers */,
+ F912B77D0B8EB27400C1E90D /* NptTime.h in Headers */,
+ F912B77E0B8EB27400C1E90D /* NptTypes.h in Headers */,
+ CAFC5B2018051F2800169F5A /* inflate.h in Headers */,
+ F912B7800B8EB27400C1E90D /* NptUri.h in Headers */,
+ F912B7820B8EB27400C1E90D /* NptUtils.h in Headers */,
+ CAFC5B1E18051F2800169F5A /* inffixed.h in Headers */,
+ CAFC5B2218051F2800169F5A /* inftrees.h in Headers */,
+ F912B7830B8EB27400C1E90D /* NptVersion.h in Headers */,
+ F912B7850B8EB27400C1E90D /* NptXml.h in Headers */,
+ E40D8B191AD868A80041A617 /* NptAutomaticCleaner.h in Headers */,
+ CA84EC7B0C7E5A7000CC9622 /* NptZip.h in Headers */,
+ CAFC5B2818051F2800169F5A /* zutil.h in Headers */,
+ CA1D05700E68E29C00E3DEE8 /* NptDynamicLibraries.h in Headers */,
+ CA1D05710E68E29C00E3DEE8 /* NptSerialPort.h in Headers */,
+ CAFC5B1A18051F2800169F5A /* deflate.h in Headers */,
+ CAFB23710EC760FE009C3459 /* NptTls.h in Headers */,
+ CA926A500F8BEB50003CB74E /* NptDynamicCast.h in Headers */,
+ CAFC5B1818051F2800169F5A /* crc32.h in Headers */,
+ CA289B6B10E16150001BC817 /* NptCocoaMessageQueue.h in Headers */,
+ CAEB8EC611864F0B00B4AF01 /* NptDigest.h in Headers */,
+ CA80698A118A602B009D099D /* NptCrypto.h in Headers */,
+ CAD78DD312A99DC500D7EBA7 /* NptHash.h in Headers */,
+ CA2EF629154DDFA700933B11 /* NptJson.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ CA197D1D0E1AE4360018E87C /* QueueTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA197D2A0E1AE4970018E87C /* Build configuration list for PBXNativeTarget "QueueTest1" */;
+ buildPhases = (
+ CA197D1B0E1AE4360018E87C /* Sources */,
+ CA197D1C0E1AE4360018E87C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA197D240E1AE43B0018E87C /* PBXTargetDependency */,
+ );
+ name = QueueTest1;
+ productName = QueueTest1;
+ productReference = CA197D1E0E1AE4360018E87C /* QueueTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA1A5EA80EC0152A00A9040C /* axTLS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA1A5ECD0EC0156900A9040C /* Build configuration list for PBXNativeTarget "axTLS" */;
+ buildPhases = (
+ CA1A5EA50EC0152A00A9040C /* Headers */,
+ CA1A5EA60EC0152A00A9040C /* Sources */,
+ CA1A5EA70EC0152A00A9040C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = axTLS;
+ productName = axTLS;
+ productReference = CA1A5EA90EC0152A00A9040C /* libaxTLS.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ CA289DB610E31600001BC817 /* SocketsTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA289DC110E31637001BC817 /* Build configuration list for PBXNativeTarget "SocketsTest1" */;
+ buildPhases = (
+ CA289DB410E31600001BC817 /* Sources */,
+ CA289DB510E31600001BC817 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA289DBC10E31613001BC817 /* PBXTargetDependency */,
+ );
+ name = SocketsTest1;
+ productName = SocketsTest1;
+ productReference = CA289DB710E31600001BC817 /* SocketsTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA2F54230EC115E600AEBC12 /* TlsTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA2F54310EC1160800AEBC12 /* Build configuration list for PBXNativeTarget "TlsTest1" */;
+ buildPhases = (
+ CA2F54210EC115E600AEBC12 /* Sources */,
+ CA2F54220EC115E600AEBC12 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA2F542A0EC115EE00AEBC12 /* PBXTargetDependency */,
+ CA2F542C0EC115F200AEBC12 /* PBXTargetDependency */,
+ );
+ name = TlsTest1;
+ productName = TlsTest1;
+ productReference = CA2F54240EC115E600AEBC12 /* TlsTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA30B76A0F0DCE990085B46E /* LoggingTest2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA30B7760F0DCEC60085B46E /* Build configuration list for PBXNativeTarget "LoggingTest2" */;
+ buildPhases = (
+ CA30B7680F0DCE990085B46E /* Sources */,
+ CA30B7690F0DCE990085B46E /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA30B7710F0DCE9F0085B46E /* PBXTargetDependency */,
+ );
+ name = LoggingTest2;
+ productName = LoggingTest2;
+ productReference = CA30B76B0F0DCE990085B46E /* LoggingTest2 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA4090C310AA257B00ED81C5 /* TimeTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA4090CB10AA25BE00ED81C5 /* Build configuration list for PBXNativeTarget "TimeTest1" */;
+ buildPhases = (
+ CA4090C110AA257B00ED81C5 /* Sources */,
+ CA4090C210AA257B00ED81C5 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA4090C910AA259200ED81C5 /* PBXTargetDependency */,
+ );
+ name = TimeTest1;
+ productName = TimeTest1;
+ productReference = CA4090C410AA257B00ED81C5 /* TimeTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA550D4A0D20A37E00B22D72 /* HttpServerTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA550D510D20A37E00B22D72 /* Build configuration list for PBXNativeTarget "HttpServerTest1" */;
+ buildPhases = (
+ CA550D4D0D20A37E00B22D72 /* Sources */,
+ CA550D4F0D20A37E00B22D72 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA550D4B0D20A37E00B22D72 /* PBXTargetDependency */,
+ );
+ name = HttpServerTest1;
+ productName = XmlTest1;
+ productReference = CA550D550D20A37E00B22D72 /* HttpServerTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA77C0B914C0BC7700442B97 /* NetworkTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA77C0C114C0BC7700442B97 /* Build configuration list for PBXNativeTarget "NetworkTest1" */;
+ buildPhases = (
+ CA77C0B614C0BC7700442B97 /* Sources */,
+ CA77C0B714C0BC7700442B97 /* Frameworks */,
+ CA77C0B814C0BC7700442B97 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA77C0C514C0BCD100442B97 /* PBXTargetDependency */,
+ );
+ name = NetworkTest1;
+ productName = NetworkTest1;
+ productReference = CA77C0BA14C0BC7700442B97 /* NetworkTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA78483C0F3B6E69009E84AD /* MiniHttpServer */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA7848490F3B6EB8009E84AD /* Build configuration list for PBXNativeTarget "MiniHttpServer" */;
+ buildPhases = (
+ CA78483A0F3B6E69009E84AD /* Sources */,
+ CA78483B0F3B6E69009E84AD /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA7848440F3B6E95009E84AD /* PBXTargetDependency */,
+ );
+ name = MiniHttpServer;
+ productName = MiniHttpServer;
+ productReference = CA78483D0F3B6E69009E84AD /* minihttpserver */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA790DA81233BDC100875081 /* NetGet */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA790DB51233BE2F00875081 /* Build configuration list for PBXNativeTarget "NetGet" */;
+ buildPhases = (
+ CA790DA61233BDC100875081 /* Sources */,
+ CA790DA71233BDC100875081 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA790DAE1233BDE900875081 /* PBXTargetDependency */,
+ CA790DB21233BDF500875081 /* PBXTargetDependency */,
+ );
+ name = NetGet;
+ productName = NetGet;
+ productReference = CA790DA91233BDC100875081 /* NetGet */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA8066481187BD08009D099D /* DigestsTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA8066541187BD60009D099D /* Build configuration list for PBXNativeTarget "DigestsTest1" */;
+ buildPhases = (
+ CA8066461187BD08009D099D /* Sources */,
+ CA8066471187BD08009D099D /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA80664E1187BD0F009D099D /* PBXTargetDependency */,
+ );
+ name = DigestsTest1;
+ productName = DigestsTest1;
+ productReference = CA8066491187BD08009D099D /* DigestsTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA8069D8118B577E009D099D /* CryptoTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA8069E6118B57BE009D099D /* Build configuration list for PBXNativeTarget "CryptoTest1" */;
+ buildPhases = (
+ CA8069D6118B577E009D099D /* Sources */,
+ CA8069D7118B577E009D099D /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA8069DE118B5786009D099D /* PBXTargetDependency */,
+ );
+ name = CryptoTest1;
+ productName = CryptoTest1;
+ productReference = CA8069D9118B577E009D099D /* CryptoTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA97E01F0E2FDFB30090CC9B /* StreamsTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA97E0270E2FDFFB0090CC9B /* Build configuration list for PBXNativeTarget "StreamsTest1" */;
+ buildPhases = (
+ CA97E01D0E2FDFB30090CC9B /* Sources */,
+ CA97E01E0E2FDFB30090CC9B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA97E0490E2FEB6F0090CC9B /* PBXTargetDependency */,
+ );
+ name = StreamsTest1;
+ productName = StreamsTest1;
+ productReference = CA97E0200E2FDFB30090CC9B /* StreamsTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA99589F1046FFC70073F34A /* HttpClientTest2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA9958AC1047001B0073F34A /* Build configuration list for PBXNativeTarget "HttpClientTest2" */;
+ buildPhases = (
+ CA99589D1046FFC70073F34A /* Sources */,
+ CA99589E1046FFC70073F34A /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA9958A51046FFCD0073F34A /* PBXTargetDependency */,
+ );
+ name = HttpClientTest2;
+ productName = HttpClientTest2;
+ productReference = CA9958A01046FFC70073F34A /* HttpClientTest2 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CA9DDC6510AE3DD6008B871E /* FileTest2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CA9DDC6F10AE3E29008B871E /* Build configuration list for PBXNativeTarget "FileTest2" */;
+ buildPhases = (
+ CA9DDC6310AE3DD6008B871E /* Sources */,
+ CA9DDC6410AE3DD6008B871E /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA9DDC6B10AE3DE3008B871E /* PBXTargetDependency */,
+ );
+ name = FileTest2;
+ productName = FileTest2;
+ productReference = CA9DDC6610AE3DD6008B871E /* FileTest2 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAA97A000CF164A700C01909 /* XmlTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAA97A0F0CF1653800C01909 /* Build configuration list for PBXNativeTarget "XmlTest1" */;
+ buildPhases = (
+ CAA979FE0CF164A700C01909 /* Sources */,
+ CAA979FF0CF164A700C01909 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAA97A060CF164B500C01909 /* PBXTargetDependency */,
+ );
+ name = XmlTest1;
+ productName = XmlTest1;
+ productReference = CAA97A010CF164A700C01909 /* XmlTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAA97A100CF1654A00C01909 /* StringsTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAA97A180CF1654A00C01909 /* Build configuration list for PBXNativeTarget "StringsTest1" */;
+ buildPhases = (
+ CAA97A130CF1654A00C01909 /* Sources */,
+ CAA97A160CF1654A00C01909 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAA97A110CF1654A00C01909 /* PBXTargetDependency */,
+ );
+ name = StringsTest1;
+ productName = XmlTest1;
+ productReference = CAA97A1B0CF1654A00C01909 /* StringsTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAAAA07B12FF824E00ABC84B /* NetResolve */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAAAA08812FF82A900ABC84B /* Build configuration list for PBXNativeTarget "NetResolve" */;
+ buildPhases = (
+ CAAAA07912FF824E00ABC84B /* Sources */,
+ CAAAA07A12FF824E00ABC84B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAAAA08112FF825300ABC84B /* PBXTargetDependency */,
+ );
+ name = NetResolve;
+ productName = NetResolve;
+ productReference = CAAAA07C12FF824E00ABC84B /* NetResolve */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAC8F0A016AB54EA00C49741 /* NetBench */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAC8F0A816AB54EA00C49741 /* Build configuration list for PBXNativeTarget "NetBench" */;
+ buildPhases = (
+ CAC8F09D16AB54EA00C49741 /* Sources */,
+ CAC8F09E16AB54EA00C49741 /* Frameworks */,
+ CAC8F09F16AB54EA00C49741 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAC8F0AD16AB553400C49741 /* PBXTargetDependency */,
+ CAC8F0AF16AB553400C49741 /* PBXTargetDependency */,
+ );
+ name = NetBench;
+ productName = NetBench;
+ productReference = CAC8F0A116AB54EA00C49741 /* NetBench */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE4169A0E0DBD6600A530D1 /* MiscTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE416B30E0DBDBB00A530D1 /* Build configuration list for PBXNativeTarget "MiscTest1" */;
+ buildPhases = (
+ CAE416980E0DBD6600A530D1 /* Sources */,
+ CAE416990E0DBD6600A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE416A10E0DBD6B00A530D1 /* PBXTargetDependency */,
+ );
+ name = MiscTest1;
+ productName = MiscTest1;
+ productReference = CAE4169B0E0DBD6600A530D1 /* MiscTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE416B80E0DBDF800A530D1 /* ArraysTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417200E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "ArraysTest1" */;
+ buildPhases = (
+ CAE416B60E0DBDF800A530D1 /* Sources */,
+ CAE416B70E0DBDF800A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE416BF0E0DBE0000A530D1 /* PBXTargetDependency */,
+ );
+ name = ArraysTest1;
+ productName = ArraysTest1;
+ productReference = CAE416B90E0DBDF800A530D1 /* ArraysTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE416C50E0DBE2F00A530D1 /* BufferedStreamsTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417210E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "BufferedStreamsTest1" */;
+ buildPhases = (
+ CAE416C30E0DBE2F00A530D1 /* Sources */,
+ CAE416C40E0DBE2F00A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE416CC0E0DBE3400A530D1 /* PBXTargetDependency */,
+ );
+ name = BufferedStreamsTest1;
+ productName = BufferedStreamsTest1;
+ productReference = CAE416C60E0DBE2F00A530D1 /* BufferedStreamsTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE416D20E0DBE5A00A530D1 /* HttpClientTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417220E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "HttpClientTest1" */;
+ buildPhases = (
+ CAE416D00E0DBE5A00A530D1 /* Sources */,
+ CAE416D10E0DBE5A00A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE416D90E0DBE5F00A530D1 /* PBXTargetDependency */,
+ );
+ name = HttpClientTest1;
+ productName = HttpClientTest1;
+ productReference = CAE416D30E0DBE5A00A530D1 /* HttpClientTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE416DF0E0DBE7F00A530D1 /* ListsTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417230E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "ListsTest1" */;
+ buildPhases = (
+ CAE416DD0E0DBE7F00A530D1 /* Sources */,
+ CAE416DE0E0DBE7F00A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE416E60E0DBE8700A530D1 /* PBXTargetDependency */,
+ );
+ name = ListsTest1;
+ productName = ListsTest1;
+ productReference = CAE416E00E0DBE7F00A530D1 /* ListsTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE416EC0E0DBEAF00A530D1 /* LoggingTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417240E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "LoggingTest1" */;
+ buildPhases = (
+ CAE416EA0E0DBEAF00A530D1 /* Sources */,
+ CAE416EB0E0DBEAF00A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE416F30E0DBEB400A530D1 /* PBXTargetDependency */,
+ );
+ name = LoggingTest1;
+ productName = LoggingTest1;
+ productReference = CAE416ED0E0DBEAF00A530D1 /* LoggingTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE416F90E0DBEDD00A530D1 /* MapsTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417250E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "MapsTest1" */;
+ buildPhases = (
+ CAE416F70E0DBEDD00A530D1 /* Sources */,
+ CAE416F80E0DBEDD00A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE417000E0DBEE600A530D1 /* PBXTargetDependency */,
+ );
+ name = MapsTest1;
+ productName = MapsTest1;
+ productReference = CAE416FA0E0DBEDD00A530D1 /* MapsTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE417060E0DBF0900A530D1 /* MessagesTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417260E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "MessagesTest1" */;
+ buildPhases = (
+ CAE417040E0DBF0900A530D1 /* Sources */,
+ CAE417050E0DBF0900A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE4170D0E0DBF0E00A530D1 /* PBXTargetDependency */,
+ );
+ name = MessagesTest1;
+ productName = MessagesTest1;
+ productReference = CAE417070E0DBF0900A530D1 /* MessagesTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE417130E0DBF2800A530D1 /* MessagesTest2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417270E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "MessagesTest2" */;
+ buildPhases = (
+ CAE417110E0DBF2800A530D1 /* Sources */,
+ CAE417120E0DBF2800A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE4171A0E0DBF2D00A530D1 /* PBXTargetDependency */,
+ );
+ name = MessagesTest2;
+ productName = MessagesTest2;
+ productReference = CAE417140E0DBF2800A530D1 /* MessagesTest2 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE4172C0E0DC03500A530D1 /* RingBufferTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417AE0E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "RingBufferTest1" */;
+ buildPhases = (
+ CAE4172A0E0DC03500A530D1 /* Sources */,
+ CAE4172B0E0DC03500A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE417330E0DC03B00A530D1 /* PBXTargetDependency */,
+ );
+ name = RingBufferTest1;
+ productName = RingBufferTest1;
+ productReference = CAE4172D0E0DC03500A530D1 /* RingBufferTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE417390E0DC06700A530D1 /* ThreadsTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417AF0E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "ThreadsTest1" */;
+ buildPhases = (
+ CAE417370E0DC06700A530D1 /* Sources */,
+ CAE417380E0DC06700A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE417400E0DC06B00A530D1 /* PBXTargetDependency */,
+ );
+ name = ThreadsTest1;
+ productName = ThreadsTest1;
+ productReference = CAE4173A0E0DC06700A530D1 /* ThreadsTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE417460E0DC08C00A530D1 /* UdpTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417B00E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "UdpTest1" */;
+ buildPhases = (
+ CAE417440E0DC08C00A530D1 /* Sources */,
+ CAE417450E0DC08C00A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE4174D0E0DC09100A530D1 /* PBXTargetDependency */,
+ );
+ name = UdpTest1;
+ productName = UdpTest1;
+ productReference = CAE417470E0DC08C00A530D1 /* UdpTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE417530E0DC0A800A530D1 /* UrlTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417B10E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "UrlTest1" */;
+ buildPhases = (
+ CAE417510E0DC0A800A530D1 /* Sources */,
+ CAE417520E0DC0A800A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE4175A0E0DC0AE00A530D1 /* PBXTargetDependency */,
+ );
+ name = UrlTest1;
+ productName = UrlTest1;
+ productReference = CAE417540E0DC0A800A530D1 /* UrlTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE417600E0DC0D200A530D1 /* ZipTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417B20E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "ZipTest1" */;
+ buildPhases = (
+ CAE4175E0E0DC0D200A530D1 /* Sources */,
+ CAE4175F0E0DC0D200A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE417670E0DC0D700A530D1 /* PBXTargetDependency */,
+ );
+ name = ZipTest1;
+ productName = ZipTest1;
+ productReference = CAE417610E0DC0D200A530D1 /* ZipTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE4179C0E0DC13A00A530D1 /* NetPump */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417B50E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "NetPump" */;
+ buildPhases = (
+ CAE4179A0E0DC13A00A530D1 /* Sources */,
+ CAE4179B0E0DC13A00A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE417A30E0DC13E00A530D1 /* PBXTargetDependency */,
+ );
+ name = NetPump;
+ productName = NetPump;
+ productReference = CAE4179D0E0DC13A00A530D1 /* NetPump */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE417BA0E0DC19400A530D1 /* NetEcho */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417F00E0DC24100A530D1 /* Build configuration list for PBXNativeTarget "NetEcho" */;
+ buildPhases = (
+ CAE417B80E0DC19400A530D1 /* Sources */,
+ CAE417B90E0DC19400A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE417C10E0DC19C00A530D1 /* PBXTargetDependency */,
+ );
+ name = NetEcho;
+ productName = NetEcho;
+ productReference = CAE417BB0E0DC19400A530D1 /* NetEcho */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE417C70E0DC1B400A530D1 /* NetConfig */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417F10E0DC24100A530D1 /* Build configuration list for PBXNativeTarget "NetConfig" */;
+ buildPhases = (
+ CAE417C50E0DC1B400A530D1 /* Sources */,
+ CAE417C60E0DC1B400A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE417CE0E0DC1BA00A530D1 /* PBXTargetDependency */,
+ );
+ name = NetConfig;
+ productName = NetConfig;
+ productReference = CAE417C80E0DC1B400A530D1 /* NetConfig */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAE417D40E0DC1D600A530D1 /* NetPing */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAE417F20E0DC24100A530D1 /* Build configuration list for PBXNativeTarget "NetPing" */;
+ buildPhases = (
+ CAE417D20E0DC1D600A530D1 /* Sources */,
+ CAE417D30E0DC1D600A530D1 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAE417DB0E0DC1DB00A530D1 /* PBXTargetDependency */,
+ );
+ name = NetPing;
+ productName = NetPing;
+ productReference = CAE417D50E0DC1D600A530D1 /* NetPing */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAF26E8D18C74A2F0015ABB9 /* ZipTest2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAF26E9618C74A2F0015ABB9 /* Build configuration list for PBXNativeTarget "ZipTest2" */;
+ buildPhases = (
+ CAF26E8A18C74A2F0015ABB9 /* Sources */,
+ CAF26E8B18C74A2F0015ABB9 /* Frameworks */,
+ CAF26E8C18C74A2F0015ABB9 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = ZipTest2;
+ productName = ZipTest2;
+ productReference = CAF26E8E18C74A2F0015ABB9 /* ZipTest2 */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAF26E9E18C7FF630015ABB9 /* ZipHttpServer */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAF26EA518C7FF630015ABB9 /* Build configuration list for PBXNativeTarget "ZipHttpServer" */;
+ buildPhases = (
+ CAF26E9B18C7FF630015ABB9 /* Sources */,
+ CAF26E9C18C7FF630015ABB9 /* Frameworks */,
+ CAF26E9D18C7FF630015ABB9 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2B921AE7649D0092347B /* PBXTargetDependency */,
+ );
+ name = ZipHttpServer;
+ productName = ZipHttpServer;
+ productReference = CAF26E9F18C7FF630015ABB9 /* ziphttpserver */;
+ productType = "com.apple.product-type.tool";
+ };
+ CAF2EFD60E64A27200948C04 /* FileTest1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CAF2EFE10E64A2D500948C04 /* Build configuration list for PBXNativeTarget "FileTest1" */;
+ buildPhases = (
+ CAF2EFD40E64A27200948C04 /* Sources */,
+ CAF2EFD50E64A27200948C04 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CAF2EFDD0E64A28000948C04 /* PBXTargetDependency */,
+ );
+ name = FileTest1;
+ productName = FileTest1;
+ productReference = CAF2EFD70E64A27200948C04 /* FileTest1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ E40D8B9B1AD86D3A0041A617 /* Neptune-iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E40D8BAF1AD86D3A0041A617 /* Build configuration list for PBXNativeTarget "Neptune-iOS" */;
+ buildPhases = (
+ E40D8B971AD86D3A0041A617 /* Sources */,
+ E40D8B981AD86D3A0041A617 /* Frameworks */,
+ E40D8B991AD86D3A0041A617 /* Headers */,
+ E40D8B9A1AD86D3A0041A617 /* Resources */,
+ E4974CD11FC5538F009223E2 /* Copy Products to Carthage/Build/iOS */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E4FCC8601B1E3ECD00CCA327 /* PBXTargetDependency */,
+ );
+ name = "Neptune-iOS";
+ productName = "Neptune-iOS";
+ productReference = E40D8B9C1AD86D3A0041A617 /* Neptune.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ E44E2A9C1AE75CD20092347B /* Neptune-Mac */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E44E2B181AE75CD20092347B /* Build configuration list for PBXNativeTarget "Neptune-Mac" */;
+ buildPhases = (
+ E44E2A9F1AE75CD20092347B /* Sources */,
+ E44E2AE21AE75CD20092347B /* Frameworks */,
+ E44E2AE41AE75CD20092347B /* Headers */,
+ E44E2B171AE75CD20092347B /* Resources */,
+ E4974CD21FC553C8009223E2 /* Copy Products to Carthage/Build/iOS */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E47C64501B1E106300BBDDD6 /* PBXTargetDependency */,
+ );
+ name = "Neptune-Mac";
+ productName = "Neptune-iOS";
+ productReference = E44E2B1B1AE75CD20092347B /* Neptune.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ E4FCC83B1B1E3EB500CCA327 /* axTLS-iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E4FCC8591B1E3EB500CCA327 /* Build configuration list for PBXNativeTarget "axTLS-iOS" */;
+ buildPhases = (
+ E4FCC83C1B1E3EB500CCA327 /* Headers */,
+ E4FCC8461B1E3EB500CCA327 /* Sources */,
+ E4FCC8581B1E3EB500CCA327 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "axTLS-iOS";
+ productName = axTLS;
+ productReference = E4FCC85E1B1E3EB500CCA327 /* libaxTLS.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ F912B69E0B8EB1C700C1E90D /* Neptune */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = F912B6A10B8EB1C800C1E90D /* Build configuration list for PBXNativeTarget "Neptune" */;
+ buildPhases = (
+ F912B69B0B8EB1C700C1E90D /* Headers */,
+ F912B69C0B8EB1C700C1E90D /* Sources */,
+ F912B69D0B8EB1C700C1E90D /* Frameworks */,
+ E44A6FDD1ADE3A5500970F48 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CA451F691252BE110045CF69 /* PBXTargetDependency */,
+ );
+ name = Neptune;
+ productName = Neptune;
+ productReference = F912B69F0B8EB1C700C1E90D /* libNeptune.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ F912B6870B8EB12700C1E90D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0620;
+ TargetAttributes = {
+ E40D8B9B1AD86D3A0041A617 = {
+ CreatedOnToolsVersion = 6.2;
+ };
+ E44E2BB81AE7691C0092347B = {
+ CreatedOnToolsVersion = 6.3;
+ };
+ };
+ };
+ buildConfigurationList = F912B6880B8EB12700C1E90D /* Build configuration list for PBXProject "Neptune" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ );
+ mainGroup = F912B6850B8EB12700C1E90D;
+ productRefGroup = F912B6A00B8EB1C700C1E90D /* Products */;
+ projectDirPath = "";
+ projectRoot = ../../..;
+ targets = (
+ CAE417920E0DC11800A530D1 /* All */,
+ CAE417DF0E0DC1F600A530D1 /* Apps */,
+ CAE4176C0E0DC0FE00A530D1 /* Tests */,
+ E44E2BB81AE7691C0092347B /* Frameworks */,
+ CA1A5EA80EC0152A00A9040C /* axTLS */,
+ E4FCC83B1B1E3EB500CCA327 /* axTLS-iOS */,
+ F912B69E0B8EB1C700C1E90D /* Neptune */,
+ E40D8B9B1AD86D3A0041A617 /* Neptune-iOS */,
+ E44E2A9C1AE75CD20092347B /* Neptune-Mac */,
+ CA78483C0F3B6E69009E84AD /* MiniHttpServer */,
+ CAE4179C0E0DC13A00A530D1 /* NetPump */,
+ CAE417BA0E0DC19400A530D1 /* NetEcho */,
+ CAE417C70E0DC1B400A530D1 /* NetConfig */,
+ CAE417D40E0DC1D600A530D1 /* NetPing */,
+ CA790DA81233BDC100875081 /* NetGet */,
+ CAC8F0A016AB54EA00C49741 /* NetBench */,
+ CAAAA07B12FF824E00ABC84B /* NetResolve */,
+ CAE416B80E0DBDF800A530D1 /* ArraysTest1 */,
+ CAE416C50E0DBE2F00A530D1 /* BufferedStreamsTest1 */,
+ CA550D4A0D20A37E00B22D72 /* HttpServerTest1 */,
+ CAE416D20E0DBE5A00A530D1 /* HttpClientTest1 */,
+ CAE416DF0E0DBE7F00A530D1 /* ListsTest1 */,
+ CAE416EC0E0DBEAF00A530D1 /* LoggingTest1 */,
+ CA30B76A0F0DCE990085B46E /* LoggingTest2 */,
+ CAE416F90E0DBEDD00A530D1 /* MapsTest1 */,
+ CAE417060E0DBF0900A530D1 /* MessagesTest1 */,
+ CAE417130E0DBF2800A530D1 /* MessagesTest2 */,
+ CAE4169A0E0DBD6600A530D1 /* MiscTest1 */,
+ CA77C0B914C0BC7700442B97 /* NetworkTest1 */,
+ CA197D1D0E1AE4360018E87C /* QueueTest1 */,
+ CAE4172C0E0DC03500A530D1 /* RingBufferTest1 */,
+ CAA97A100CF1654A00C01909 /* StringsTest1 */,
+ CAE417390E0DC06700A530D1 /* ThreadsTest1 */,
+ CAE417460E0DC08C00A530D1 /* UdpTest1 */,
+ CAE417530E0DC0A800A530D1 /* UrlTest1 */,
+ CAA97A000CF164A700C01909 /* XmlTest1 */,
+ CAE417600E0DC0D200A530D1 /* ZipTest1 */,
+ CAF26E8D18C74A2F0015ABB9 /* ZipTest2 */,
+ CA97E01F0E2FDFB30090CC9B /* StreamsTest1 */,
+ CAF2EFD60E64A27200948C04 /* FileTest1 */,
+ CA2F54230EC115E600AEBC12 /* TlsTest1 */,
+ CA99589F1046FFC70073F34A /* HttpClientTest2 */,
+ CA4090C310AA257B00ED81C5 /* TimeTest1 */,
+ CA9DDC6510AE3DD6008B871E /* FileTest2 */,
+ CA289DB610E31600001BC817 /* SocketsTest1 */,
+ CA8066481187BD08009D099D /* DigestsTest1 */,
+ CA8069D8118B577E009D099D /* CryptoTest1 */,
+ CAF26E9E18C7FF630015ABB9 /* ZipHttpServer */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ E40D8B9A1AD86D3A0041A617 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E44E2B171AE75CD20092347B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ E4974CD11FC5538F009223E2 /* Copy Products to Carthage/Build/iOS */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Copy Products to Carthage/Build/iOS";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "build_dir=\"$SRCROOT/../../../Carthage/Build\"\n\n# Only copy when the Carthage/Build directory is a symlink\nif ! [ -L \"$build_dir\" ]; then exit 0; fi\n\nrsync --delete -av \"$BUILT_PRODUCTS_DIR/$PRODUCT_NAME\"* \"$build_dir/iOS\"";
+ };
+ E4974CD21FC553C8009223E2 /* Copy Products to Carthage/Build/iOS */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Copy Products to Carthage/Build/iOS";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "build_dir=\"$SRCROOT/../../../Carthage/Build\"\n\n# Only copy when the Carthage/Build directory is a symlink\nif ! [ -L \"$build_dir\" ]; then exit 0; fi\n\nrsync --delete -av \"$BUILT_PRODUCTS_DIR/$PRODUCT_NAME\"* \"$build_dir/Mac\"";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ CA197D1B0E1AE4360018E87C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA197D280E1AE4790018E87C /* QueueTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA1A5EA60EC0152A00A9040C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA1A5EAF0EC0154D00A9040C /* x509.c in Sources */,
+ CA1A5EB10EC0154E00A9040C /* tls1_svr.c in Sources */,
+ CA1A5EB20EC0155000A9040C /* tls1_clnt.c in Sources */,
+ CA1A5EB40EC0155100A9040C /* tls1.c in Sources */,
+ CA1A5EB60EC0155200A9040C /* sha1.c in Sources */,
+ CA1A5EB70EC0155300A9040C /* rsa.c in Sources */,
+ CA1A5EB80EC0155300A9040C /* rc4.c in Sources */,
+ CA1A5EBA0EC0155400A9040C /* p12.c in Sources */,
+ CA1A5EBE0EC0155700A9040C /* md5.c in Sources */,
+ CA1A5EBF0EC0155800A9040C /* md2.c in Sources */,
+ CA1A5EC00EC0155900A9040C /* loader.c in Sources */,
+ CA1A5EC10EC0155900A9040C /* hmac.c in Sources */,
+ CA1A5EC20EC0155A00A9040C /* gen_cert.c in Sources */,
+ CA1A5EC40EC0155B00A9040C /* crypto_misc.c in Sources */,
+ CA1A5ECA0EC0156000A9040C /* bigint.c in Sources */,
+ CA1A5ECB0EC0156100A9040C /* asn1.c in Sources */,
+ CA1A5ECC0EC0156100A9040C /* aes.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA289DB410E31600001BC817 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA289DC010E31637001BC817 /* SocketsTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA2F54210EC115E600AEBC12 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA2F54340EC1165700AEBC12 /* TlsTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA30B7680F0DCE990085B46E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAC029DE139D84D10034427F /* LoggingTest2.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA4090C110AA257B00ED81C5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA4090CE10AA25BE00ED81C5 /* TimeTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA550D4D0D20A37E00B22D72 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA550D580D20A3AC00B22D72 /* HttpServerTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA77C0B614C0BC7700442B97 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA77C0C714C0BCF400442B97 /* NetworkTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA78483A0F3B6E69009E84AD /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA7848480F3B6EB8009E84AD /* MiniHttpServer.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA790DA61233BDC100875081 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA790DB31233BE1000875081 /* NetGet.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA8066461187BD08009D099D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA8066521187BD42009D099D /* DigestsTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA8069D6118B577E009D099D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA8069E5118B57BE009D099D /* CryptoTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA97E01D0E2FDFB30090CC9B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA97E0250E2FDFDD0090CC9B /* StreamsTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA99589D1046FFC70073F34A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA9958AB1047001B0073F34A /* HttpClientTest2.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CA9DDC6310AE3DD6008B871E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA9DDC7210AE3E52008B871E /* FileTest2.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAA979FE0CF164A700C01909 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAA97A070CF164E000C01909 /* XmlTest1.cpp in Sources */,
+ CAA97A080CF164E300C01909 /* XmlTest1Data.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAA97A130CF1654A00C01909 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAA97A1D0CF1659200C01909 /* StringsTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAAAA07912FF824E00ABC84B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAAAA08512FF828A00ABC84B /* NetResolve.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAC8F09D16AB54EA00C49741 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAC8F0AB16AB550A00C49741 /* NetBench.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416980E0DBD6600A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE416A20E0DBD7400A530D1 /* MiscTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416B60E0DBDF800A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE416C10E0DBE1900A530D1 /* ArraysTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416C30E0DBE2F00A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE416CE0E0DBE4200A530D1 /* BufferedStreamsTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416D00E0DBE5A00A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE416DB0E0DBE6D00A530D1 /* HttpClientTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416DD0E0DBE7F00A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE416E80E0DBE9600A530D1 /* ListsTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416EA0E0DBEAF00A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE416F50E0DBEC000A530D1 /* LoggingTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE416F70E0DBEDD00A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE417020E0DBEF500A530D1 /* MapsTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417040E0DBF0900A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE4170F0E0DBF1900A530D1 /* MessagesTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417110E0DBF2800A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE4171C0E0DBF3A00A530D1 /* MessagesTest2.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE4172A0E0DC03500A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE417350E0DC04C00A530D1 /* RingBufferTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417370E0DC06700A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE417420E0DC07800A530D1 /* ThreadsTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417440E0DC08C00A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE4174F0E0DC09B00A530D1 /* UdpTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417510E0DC0A800A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE4175C0E0DC0BC00A530D1 /* UrlTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE4175E0E0DC0D200A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE417690E0DC0E500A530D1 /* ZipTest1.cpp in Sources */,
+ CAE4176A0E0DC0E600A530D1 /* ZipTestData1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE4179A0E0DC13A00A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE417B60E0DC17800A530D1 /* NetPump.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417B80E0DC19400A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE417C30E0DC1AA00A530D1 /* NetEcho.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417C50E0DC1B400A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE417D00E0DC1C600A530D1 /* NetConfig.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAE417D20E0DC1D600A530D1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAE417DD0E0DC1EA00A530D1 /* NetPing.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAF26E8A18C74A2F0015ABB9 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAF26E9918C74B110015ABB9 /* ZipTest2.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAF26E9B18C7FF630015ABB9 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAF26EAA18C7FF820015ABB9 /* ZipHttpServer.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CAF2EFD40E64A27200948C04 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CAF2EFDE0E64A2AB00948C04 /* FileTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E40D8B971AD86D3A0041A617 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E40D8C241AD8747E0041A617 /* adler32.c in Sources */,
+ E40D8C251AD8747E0041A617 /* compress.c in Sources */,
+ E40D8C261AD8747E0041A617 /* crc32.c in Sources */,
+ E40D8C271AD8747E0041A617 /* deflate.c in Sources */,
+ E40D8C281AD8747E0041A617 /* infback.c in Sources */,
+ E40D8C291AD8747E0041A617 /* inffast.c in Sources */,
+ E40D8C2A1AD8747E0041A617 /* inflate.c in Sources */,
+ E40D8C2B1AD8747E0041A617 /* inftrees.c in Sources */,
+ E40D8C2C1AD8747E0041A617 /* trees.c in Sources */,
+ E40D8C2D1AD8747E0041A617 /* zutil.c in Sources */,
+ E40D8C201AD874350041A617 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */,
+ E40D8C211AD874350041A617 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */,
+ E40D8BB51AD86F450041A617 /* Neptune.cpp in Sources */,
+ E40D8BB81AD86F450041A617 /* NptAutomaticCleaner.cpp in Sources */,
+ E40D8BBB1AD86F450041A617 /* NptBase64.cpp in Sources */,
+ E40D8BBD1AD86F450041A617 /* NptBufferedStreams.cpp in Sources */,
+ E40D8BBF1AD86F450041A617 /* NptCommon.cpp in Sources */,
+ E40D8BC21AD86F450041A617 /* NptConsole.cpp in Sources */,
+ E40D8BC51AD86F450041A617 /* NptCrypto.cpp in Sources */,
+ E40D8BC71AD86F450041A617 /* NptDataBuffer.cpp in Sources */,
+ E40D8BC91AD86F450041A617 /* NptDebug.cpp in Sources */,
+ E40D8BCC1AD86F450041A617 /* NptDigest.cpp in Sources */,
+ E40D8BCF1AD86F450041A617 /* NptDynamicLibraries.cpp in Sources */,
+ E40D8BD11AD86F450041A617 /* NptFile.cpp in Sources */,
+ E40D8BD31AD86F450041A617 /* NptHash.cpp in Sources */,
+ E40D8BD51AD86F450041A617 /* NptHttp.cpp in Sources */,
+ E40D8BD81AD86F450041A617 /* NptJson.cpp in Sources */,
+ E40D8BDA1AD86F450041A617 /* NptList.cpp in Sources */,
+ E40D8BDC1AD86F450041A617 /* NptLogging.cpp in Sources */,
+ E40D8BDF1AD86F450041A617 /* NptMessaging.cpp in Sources */,
+ E40D8BE11AD86F450041A617 /* NptNetwork.cpp in Sources */,
+ E40D8BE31AD86F450041A617 /* NptQueue.cpp in Sources */,
+ E40D8BE61AD86F450041A617 /* NptResults.cpp in Sources */,
+ E40D8BE81AD86F450041A617 /* NptRingBuffer.cpp in Sources */,
+ E40D8BEC1AD86F450041A617 /* NptSimpleMessageQueue.cpp in Sources */,
+ E40D8BEE1AD86F450041A617 /* NptSockets.cpp in Sources */,
+ E40D8BF11AD86F450041A617 /* NptStreams.cpp in Sources */,
+ E40D8BF31AD86F450041A617 /* NptStrings.cpp in Sources */,
+ E40D8BF51AD86F450041A617 /* NptSystem.cpp in Sources */,
+ E40D8BF71AD86F450041A617 /* NptThreads.cpp in Sources */,
+ E40D8BF91AD86F450041A617 /* NptTime.cpp in Sources */,
+ E40D8BFB1AD86F450041A617 /* NptTls.cpp in Sources */,
+ E40D8BFE1AD86F450041A617 /* NptUri.cpp in Sources */,
+ E40D8C001AD86F450041A617 /* NptUtils.cpp in Sources */,
+ E40D8C031AD86F450041A617 /* NptXml.cpp in Sources */,
+ E40D8C051AD86F450041A617 /* NptZip.cpp in Sources */,
+ E40D8C071AD870020041A617 /* NptAppleAutoreleasePool.mm in Sources */,
+ E40D8C081AD870020041A617 /* NptAppleLogConfig.mm in Sources */,
+ E40D8C091AD8700C0041A617 /* NptCocoaEnviroment.mm in Sources */,
+ E40D8C0A1AD8700C0041A617 /* NptCocoaConsole.mm in Sources */,
+ E40D8C0C1AD8700C0041A617 /* NptCocoaMessageQueue.mm in Sources */,
+ E40D8C0D1AD870120041A617 /* NptNullSerialPort.cpp in Sources */,
+ E40D8C0E1AD870330041A617 /* NptBsdResolver.cpp in Sources */,
+ E40D8C0F1AD870330041A617 /* NptBsdNetwork.cpp in Sources */,
+ E40D8C101AD870330041A617 /* NptBsdSockets.cpp in Sources */,
+ E40D8C111AD870400041A617 /* NptPosixTime.cpp in Sources */,
+ E40D8C121AD870400041A617 /* NptPosixDynamicLibraries.cpp in Sources */,
+ E40D8C131AD870400041A617 /* NptPosixNetwork.cpp in Sources */,
+ E40D8C141AD870400041A617 /* NptPosixFile.cpp in Sources */,
+ E40D8C151AD870400041A617 /* NptPosixQueue.cpp in Sources */,
+ E40D8C161AD870400041A617 /* NptPosixSystem.cpp in Sources */,
+ E40D8C171AD870400041A617 /* NptPosixThreads.cpp in Sources */,
+ E40D8C181AD870400041A617 /* NptSelectableMessageQueue.cpp in Sources */,
+ E40D8C1A1AD8704E0041A617 /* NptStdcDebug.cpp in Sources */,
+ E40D8C1B1AD8704E0041A617 /* NptStdcEnvironment.cpp in Sources */,
+ E40D8C1C1AD8704E0041A617 /* NptStdcFile.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E44E2A9F1AE75CD20092347B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2AA01AE75CD20092347B /* adler32.c in Sources */,
+ E44E2AA11AE75CD20092347B /* compress.c in Sources */,
+ E44E2AA21AE75CD20092347B /* crc32.c in Sources */,
+ E44E2AA31AE75CD20092347B /* deflate.c in Sources */,
+ E44E2AA41AE75CD20092347B /* infback.c in Sources */,
+ E44E2AA51AE75CD20092347B /* inffast.c in Sources */,
+ E44E2AA61AE75CD20092347B /* inflate.c in Sources */,
+ E44E2AA71AE75CD20092347B /* inftrees.c in Sources */,
+ E44E2AA81AE75CD20092347B /* trees.c in Sources */,
+ E44E2AA91AE75CD20092347B /* zutil.c in Sources */,
+ E44E2AAA1AE75CD20092347B /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */,
+ E44E2AAB1AE75CD20092347B /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */,
+ E44E2AAC1AE75CD20092347B /* Neptune.cpp in Sources */,
+ E44E2AAD1AE75CD20092347B /* NptAutomaticCleaner.cpp in Sources */,
+ E44E2AAE1AE75CD20092347B /* NptBase64.cpp in Sources */,
+ E44E2AAF1AE75CD20092347B /* NptBufferedStreams.cpp in Sources */,
+ E44E2AB01AE75CD20092347B /* NptCommon.cpp in Sources */,
+ E44E2AB11AE75CD20092347B /* NptConsole.cpp in Sources */,
+ E44E2AB21AE75CD20092347B /* NptCrypto.cpp in Sources */,
+ E44E2AB31AE75CD20092347B /* NptDataBuffer.cpp in Sources */,
+ E44E2AB41AE75CD20092347B /* NptDebug.cpp in Sources */,
+ E44E2AB51AE75CD20092347B /* NptDigest.cpp in Sources */,
+ E44E2AB61AE75CD20092347B /* NptDynamicLibraries.cpp in Sources */,
+ E44E2AB71AE75CD20092347B /* NptFile.cpp in Sources */,
+ E44E2AB81AE75CD20092347B /* NptHash.cpp in Sources */,
+ E44E2AB91AE75CD20092347B /* NptHttp.cpp in Sources */,
+ E44E2ABA1AE75CD20092347B /* NptJson.cpp in Sources */,
+ E44E2ABB1AE75CD20092347B /* NptList.cpp in Sources */,
+ E44E2ABC1AE75CD20092347B /* NptLogging.cpp in Sources */,
+ E44E2ABD1AE75CD20092347B /* NptMessaging.cpp in Sources */,
+ E44E2ABE1AE75CD20092347B /* NptNetwork.cpp in Sources */,
+ E44E2ABF1AE75CD20092347B /* NptQueue.cpp in Sources */,
+ E44E2AC01AE75CD20092347B /* NptResults.cpp in Sources */,
+ E44E2AC11AE75CD20092347B /* NptRingBuffer.cpp in Sources */,
+ E44E2AC21AE75CD20092347B /* NptSimpleMessageQueue.cpp in Sources */,
+ E44E2AC31AE75CD20092347B /* NptSockets.cpp in Sources */,
+ E44E2AC41AE75CD20092347B /* NptStreams.cpp in Sources */,
+ E44E2AC51AE75CD20092347B /* NptStrings.cpp in Sources */,
+ E44E2AC61AE75CD20092347B /* NptSystem.cpp in Sources */,
+ E44E2AC71AE75CD20092347B /* NptThreads.cpp in Sources */,
+ E44E2AC81AE75CD20092347B /* NptTime.cpp in Sources */,
+ E44E2AC91AE75CD20092347B /* NptTls.cpp in Sources */,
+ E44E2ACA1AE75CD20092347B /* NptUri.cpp in Sources */,
+ E44E2ACB1AE75CD20092347B /* NptUtils.cpp in Sources */,
+ E44E2ACC1AE75CD20092347B /* NptXml.cpp in Sources */,
+ E44E2ACD1AE75CD20092347B /* NptZip.cpp in Sources */,
+ E44E2ACE1AE75CD20092347B /* NptAppleAutoreleasePool.mm in Sources */,
+ E44E2ACF1AE75CD20092347B /* NptAppleLogConfig.mm in Sources */,
+ E44E2AD01AE75CD20092347B /* NptCocoaEnviroment.mm in Sources */,
+ E44E2AD11AE75CD20092347B /* NptCocoaConsole.mm in Sources */,
+ E44E2AD21AE75CD20092347B /* NptCocoaMessageQueue.mm in Sources */,
+ E44E2AD31AE75CD20092347B /* NptNullSerialPort.cpp in Sources */,
+ E44E2AD41AE75CD20092347B /* NptBsdResolver.cpp in Sources */,
+ E44E2AD51AE75CD20092347B /* NptBsdNetwork.cpp in Sources */,
+ E44E2AD61AE75CD20092347B /* NptBsdSockets.cpp in Sources */,
+ E44E2AD71AE75CD20092347B /* NptPosixTime.cpp in Sources */,
+ E44E2AD81AE75CD20092347B /* NptPosixDynamicLibraries.cpp in Sources */,
+ E44E2AD91AE75CD20092347B /* NptPosixNetwork.cpp in Sources */,
+ E44E2ADA1AE75CD20092347B /* NptPosixFile.cpp in Sources */,
+ E44E2ADB1AE75CD20092347B /* NptPosixQueue.cpp in Sources */,
+ E44E2ADC1AE75CD20092347B /* NptPosixSystem.cpp in Sources */,
+ E44E2ADD1AE75CD20092347B /* NptPosixThreads.cpp in Sources */,
+ E44E2ADE1AE75CD20092347B /* NptSelectableMessageQueue.cpp in Sources */,
+ E44E2ADF1AE75CD20092347B /* NptStdcDebug.cpp in Sources */,
+ E44E2AE01AE75CD20092347B /* NptStdcEnvironment.cpp in Sources */,
+ E44E2AE11AE75CD20092347B /* NptStdcFile.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E4FCC8461B1E3EB500CCA327 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E4FCC8471B1E3EB500CCA327 /* x509.c in Sources */,
+ E4FCC8481B1E3EB500CCA327 /* tls1_svr.c in Sources */,
+ E4FCC8491B1E3EB500CCA327 /* tls1_clnt.c in Sources */,
+ E4FCC84A1B1E3EB500CCA327 /* tls1.c in Sources */,
+ E4FCC84B1B1E3EB500CCA327 /* sha1.c in Sources */,
+ E4FCC84C1B1E3EB500CCA327 /* rsa.c in Sources */,
+ E4FCC84D1B1E3EB500CCA327 /* rc4.c in Sources */,
+ E4FCC84E1B1E3EB500CCA327 /* p12.c in Sources */,
+ E4FCC84F1B1E3EB500CCA327 /* md5.c in Sources */,
+ E4FCC8501B1E3EB500CCA327 /* md2.c in Sources */,
+ E4FCC8511B1E3EB500CCA327 /* loader.c in Sources */,
+ E4FCC8521B1E3EB500CCA327 /* hmac.c in Sources */,
+ E4FCC8531B1E3EB500CCA327 /* gen_cert.c in Sources */,
+ E4FCC8541B1E3EB500CCA327 /* crypto_misc.c in Sources */,
+ E4FCC8551B1E3EB500CCA327 /* bigint.c in Sources */,
+ E4FCC8561B1E3EB500CCA327 /* asn1.c in Sources */,
+ E4FCC8571B1E3EB500CCA327 /* aes.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F912B69C0B8EB1C700C1E90D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CA77C18414C25AFF00442B97 /* NptNullAutoreleasePool.cpp in Sources */,
+ F912B7480B8EB27400C1E90D /* Neptune.cpp in Sources */,
+ F912B74B0B8EB27400C1E90D /* NptBase64.cpp in Sources */,
+ F912B74D0B8EB27400C1E90D /* NptBufferedStreams.cpp in Sources */,
+ F912B74F0B8EB27400C1E90D /* NptCommon.cpp in Sources */,
+ CAFC5B1C18051F2800169F5A /* inffast.c in Sources */,
+ F912B7520B8EB27400C1E90D /* NptConsole.cpp in Sources */,
+ F912B7550B8EB27400C1E90D /* NptDataBuffer.cpp in Sources */,
+ F912B7570B8EB27400C1E90D /* NptDebug.cpp in Sources */,
+ F912B75A0B8EB27400C1E90D /* NptFile.cpp in Sources */,
+ F912B75C0B8EB27400C1E90D /* NptHttp.cpp in Sources */,
+ CAFC5B1B18051F2800169F5A /* infback.c in Sources */,
+ F912B75F0B8EB27400C1E90D /* NptList.cpp in Sources */,
+ F912B7610B8EB27400C1E90D /* NptLogging.cpp in Sources */,
+ F912B7640B8EB27400C1E90D /* NptMessaging.cpp in Sources */,
+ F912B7660B8EB27400C1E90D /* NptNetwork.cpp in Sources */,
+ CAFC5B2718051F2800169F5A /* zutil.c in Sources */,
+ F912B7680B8EB27400C1E90D /* NptQueue.cpp in Sources */,
+ F912B76C0B8EB27400C1E90D /* NptRingBuffer.cpp in Sources */,
+ F912B76F0B8EB27400C1E90D /* NptSimpleMessageQueue.cpp in Sources */,
+ F912B7710B8EB27400C1E90D /* NptSockets.cpp in Sources */,
+ F912B7740B8EB27400C1E90D /* NptStreams.cpp in Sources */,
+ E40D8C2F1AD874E70041A617 /* NptStdcConsole.cpp in Sources */,
+ CAFC5B1518051F2800169F5A /* adler32.c in Sources */,
+ F912B7760B8EB27400C1E90D /* NptStrings.cpp in Sources */,
+ CAFC5B2118051F2800169F5A /* inftrees.c in Sources */,
+ F912B7780B8EB27400C1E90D /* NptSystem.cpp in Sources */,
+ F912B77A0B8EB27400C1E90D /* NptThreads.cpp in Sources */,
+ F912B77C0B8EB27400C1E90D /* NptTime.cpp in Sources */,
+ F912B77F0B8EB27400C1E90D /* NptUri.cpp in Sources */,
+ F912B7810B8EB27400C1E90D /* NptUtils.cpp in Sources */,
+ F912B7840B8EB27400C1E90D /* NptXml.cpp in Sources */,
+ F912B7860B8EB27400C1E90D /* NptBsdNetwork.cpp in Sources */,
+ CAFC5B1F18051F2800169F5A /* inflate.c in Sources */,
+ F912B7870B8EB27400C1E90D /* NptBsdSockets.cpp in Sources */,
+ CAFC5B2318051F2800169F5A /* trees.c in Sources */,
+ F912B78C0B8EB27400C1E90D /* NptPosixQueue.cpp in Sources */,
+ F912B78D0B8EB27400C1E90D /* NptPosixSystem.cpp in Sources */,
+ F912B78E0B8EB27400C1E90D /* NptPosixThreads.cpp in Sources */,
+ F912B78F0B8EB27400C1E90D /* NptSelectableMessageQueue.cpp in Sources */,
+ F912B7920B8EB27400C1E90D /* NptStdcDebug.cpp in Sources */,
+ F912B7930B8EB27400C1E90D /* NptStdcEnvironment.cpp in Sources */,
+ F912B7940B8EB27400C1E90D /* NptStdcFile.cpp in Sources */,
+ CAFC5B1918051F2800169F5A /* deflate.c in Sources */,
+ CA5041AF0C5AE2180060E6FE /* NptNullSerialPort.cpp in Sources */,
+ CAF03CB60C7E7F15002C470F /* NptZip.cpp in Sources */,
+ E40D8B181AD868A80041A617 /* NptAutomaticCleaner.cpp in Sources */,
+ CAF2EFB60E64881E00948C04 /* NptPosixFile.cpp in Sources */,
+ CAF2EFB80E64882900948C04 /* NptPosixNetwork.cpp in Sources */,
+ CA1D056F0E68E29C00E3DEE8 /* NptDynamicLibraries.cpp in Sources */,
+ CA1D05730E68E2AC00E3DEE8 /* NptPosixDynamicLibraries.cpp in Sources */,
+ CAFB23700EC760FE009C3459 /* NptTls.cpp in Sources */,
+ CA2B1E210FC22DBA00B9E79F /* NptResults.cpp in Sources */,
+ CA40905C10AA10A800ED81C5 /* NptPosixTime.cpp in Sources */,
+ CA289B6C10E16150001BC817 /* NptCocoaMessageQueue.mm in Sources */,
+ CAEB8EC511864F0B00B4AF01 /* NptDigest.cpp in Sources */,
+ CAFC5B1718051F2800169F5A /* crc32.c in Sources */,
+ CA806989118A602B009D099D /* NptCrypto.cpp in Sources */,
+ CA057AB011BC27F200C90519 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */,
+ CA057AB111BC27F200C90519 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */,
+ CAD78E0412A9C42000D7EBA7 /* NptHash.cpp in Sources */,
+ CAC5048312FFB7EF00FEB1D8 /* NptBsdResolver.cpp in Sources */,
+ CA2EF628154DDFA700933B11 /* NptJson.cpp in Sources */,
+ CAFC5B1618051F2800169F5A /* compress.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ CA197D240E1AE43B0018E87C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA197D230E1AE43B0018E87C /* PBXContainerItemProxy */;
+ };
+ CA197D270E1AE4540018E87C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA197D1D0E1AE4360018E87C /* QueueTest1 */;
+ targetProxy = CA197D260E1AE4540018E87C /* PBXContainerItemProxy */;
+ };
+ CA261074127EB817008E2D29 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA2F54230EC115E600AEBC12 /* TlsTest1 */;
+ targetProxy = CA261073127EB817008E2D29 /* PBXContainerItemProxy */;
+ };
+ CA289DBC10E31613001BC817 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA289DBB10E31613001BC817 /* PBXContainerItemProxy */;
+ };
+ CA2F542A0EC115EE00AEBC12 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA2F54290EC115EE00AEBC12 /* PBXContainerItemProxy */;
+ };
+ CA2F542C0EC115F200AEBC12 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA1A5EA80EC0152A00A9040C /* axTLS */;
+ targetProxy = CA2F542B0EC115F200AEBC12 /* PBXContainerItemProxy */;
+ };
+ CA30B7710F0DCE9F0085B46E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA30B7700F0DCE9F0085B46E /* PBXContainerItemProxy */;
+ };
+ CA30B77A0F0DCEFE0085B46E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA30B76A0F0DCE990085B46E /* LoggingTest2 */;
+ targetProxy = CA30B7790F0DCEFE0085B46E /* PBXContainerItemProxy */;
+ };
+ CA4090C910AA259200ED81C5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA4090C810AA259200ED81C5 /* PBXContainerItemProxy */;
+ };
+ CA451F691252BE110045CF69 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA1A5EA80EC0152A00A9040C /* axTLS */;
+ targetProxy = CA451F681252BE110045CF69 /* PBXContainerItemProxy */;
+ };
+ CA451F731252BE430045CF69 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA790DA81233BDC100875081 /* NetGet */;
+ targetProxy = CA451F721252BE430045CF69 /* PBXContainerItemProxy */;
+ };
+ CA550D4B0D20A37E00B22D72 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA550D4C0D20A37E00B22D72 /* PBXContainerItemProxy */;
+ };
+ CA77C0C514C0BCD100442B97 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA77C0C414C0BCD100442B97 /* PBXContainerItemProxy */;
+ };
+ CA7848420F3B6E71009E84AD /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA78483C0F3B6E69009E84AD /* MiniHttpServer */;
+ targetProxy = CA7848410F3B6E71009E84AD /* PBXContainerItemProxy */;
+ };
+ CA7848440F3B6E95009E84AD /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA7848430F3B6E95009E84AD /* PBXContainerItemProxy */;
+ };
+ CA790DAE1233BDE900875081 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA790DAD1233BDE900875081 /* PBXContainerItemProxy */;
+ };
+ CA790DB21233BDF500875081 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA1A5EA80EC0152A00A9040C /* axTLS */;
+ targetProxy = CA790DB11233BDF500875081 /* PBXContainerItemProxy */;
+ };
+ CA80664E1187BD0F009D099D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA80664D1187BD0F009D099D /* PBXContainerItemProxy */;
+ };
+ CA8066511187BD20009D099D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA8066481187BD08009D099D /* DigestsTest1 */;
+ targetProxy = CA8066501187BD20009D099D /* PBXContainerItemProxy */;
+ };
+ CA8069DE118B5786009D099D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA8069DD118B5786009D099D /* PBXContainerItemProxy */;
+ };
+ CA97E0490E2FEB6F0090CC9B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA97E0480E2FEB6F0090CC9B /* PBXContainerItemProxy */;
+ };
+ CA9958A51046FFCD0073F34A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA9958A41046FFCD0073F34A /* PBXContainerItemProxy */;
+ };
+ CA9958A81046FFF60073F34A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA99589F1046FFC70073F34A /* HttpClientTest2 */;
+ targetProxy = CA9958A71046FFF60073F34A /* PBXContainerItemProxy */;
+ };
+ CA9DDC5110AE2820008B871E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAF2EFD60E64A27200948C04 /* FileTest1 */;
+ targetProxy = CA9DDC5010AE2820008B871E /* PBXContainerItemProxy */;
+ };
+ CA9DDC6B10AE3DE3008B871E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CA9DDC6A10AE3DE3008B871E /* PBXContainerItemProxy */;
+ };
+ CA9DDC6E10AE3DFD008B871E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA9DDC6510AE3DD6008B871E /* FileTest2 */;
+ targetProxy = CA9DDC6D10AE3DFD008B871E /* PBXContainerItemProxy */;
+ };
+ CAA97A060CF164B500C01909 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAA97A050CF164B500C01909 /* PBXContainerItemProxy */;
+ };
+ CAA97A110CF1654A00C01909 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAA97A120CF1654A00C01909 /* PBXContainerItemProxy */;
+ };
+ CAAAA08112FF825300ABC84B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAAAA08012FF825300ABC84B /* PBXContainerItemProxy */;
+ };
+ CAAAA08412FF827D00ABC84B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAAAA07B12FF824E00ABC84B /* NetResolve */;
+ targetProxy = CAAAA08312FF827D00ABC84B /* PBXContainerItemProxy */;
+ };
+ CAC8F0AD16AB553400C49741 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAC8F0AC16AB553400C49741 /* PBXContainerItemProxy */;
+ };
+ CAC8F0AF16AB553400C49741 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA1A5EA80EC0152A00A9040C /* axTLS */;
+ targetProxy = CAC8F0AE16AB553400C49741 /* PBXContainerItemProxy */;
+ };
+ CAE063D71241479100E5AFC4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA8069D8118B577E009D099D /* CryptoTest1 */;
+ targetProxy = CAE063D61241479100E5AFC4 /* PBXContainerItemProxy */;
+ };
+ CAE063D91241479800E5AFC4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA289DB610E31600001BC817 /* SocketsTest1 */;
+ targetProxy = CAE063D81241479800E5AFC4 /* PBXContainerItemProxy */;
+ };
+ CAE063DB124147A100E5AFC4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA4090C310AA257B00ED81C5 /* TimeTest1 */;
+ targetProxy = CAE063DA124147A100E5AFC4 /* PBXContainerItemProxy */;
+ };
+ CAE063DD124147B300E5AFC4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA97E01F0E2FDFB30090CC9B /* StreamsTest1 */;
+ targetProxy = CAE063DC124147B300E5AFC4 /* PBXContainerItemProxy */;
+ };
+ CAE416A10E0DBD6B00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE416A00E0DBD6B00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE416BF0E0DBE0000A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE416BE0E0DBE0000A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE416CC0E0DBE3400A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE416CB0E0DBE3400A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE416D90E0DBE5F00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE416D80E0DBE5F00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE416E60E0DBE8700A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE416E50E0DBE8700A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE416F30E0DBEB400A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE416F20E0DBEB400A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417000E0DBEE600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE416FF0E0DBEE600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4170D0E0DBF0E00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE4170C0E0DBF0E00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4171A0E0DBF2D00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE417190E0DBF2D00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417330E0DC03B00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE417320E0DC03B00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417400E0DC06B00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE4173F0E0DC06B00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4174D0E0DC09100A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE4174C0E0DC09100A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4175A0E0DC0AE00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE417590E0DC0AE00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417670E0DC0D700A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE417660E0DC0D700A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417710E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE416B80E0DBDF800A530D1 /* ArraysTest1 */;
+ targetProxy = CAE417700E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417730E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE416C50E0DBE2F00A530D1 /* BufferedStreamsTest1 */;
+ targetProxy = CAE417720E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417750E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA550D4A0D20A37E00B22D72 /* HttpServerTest1 */;
+ targetProxy = CAE417740E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417770E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE416D20E0DBE5A00A530D1 /* HttpClientTest1 */;
+ targetProxy = CAE417760E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417790E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE416DF0E0DBE7F00A530D1 /* ListsTest1 */;
+ targetProxy = CAE417780E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4177B0E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE416EC0E0DBEAF00A530D1 /* LoggingTest1 */;
+ targetProxy = CAE4177A0E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4177D0E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE416F90E0DBEDD00A530D1 /* MapsTest1 */;
+ targetProxy = CAE4177C0E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4177F0E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417060E0DBF0900A530D1 /* MessagesTest1 */;
+ targetProxy = CAE4177E0E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417810E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417130E0DBF2800A530D1 /* MessagesTest2 */;
+ targetProxy = CAE417800E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417830E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE4169A0E0DBD6600A530D1 /* MiscTest1 */;
+ targetProxy = CAE417820E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417850E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE4172C0E0DC03500A530D1 /* RingBufferTest1 */;
+ targetProxy = CAE417840E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417870E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAA97A100CF1654A00C01909 /* StringsTest1 */;
+ targetProxy = CAE417860E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417890E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417390E0DC06700A530D1 /* ThreadsTest1 */;
+ targetProxy = CAE417880E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4178B0E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417460E0DC08C00A530D1 /* UdpTest1 */;
+ targetProxy = CAE4178A0E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4178D0E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417530E0DC0A800A530D1 /* UrlTest1 */;
+ targetProxy = CAE4178C0E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE4178F0E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAA97A000CF164A700C01909 /* XmlTest1 */;
+ targetProxy = CAE4178E0E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417910E0DC10600A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417600E0DC0D200A530D1 /* ZipTest1 */;
+ targetProxy = CAE417900E0DC10600A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417970E0DC11F00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE4176C0E0DC0FE00A530D1 /* Tests */;
+ targetProxy = CAE417960E0DC11F00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417990E0DC11F00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE417980E0DC11F00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417A30E0DC13E00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE417A20E0DC13E00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417C10E0DC19C00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE417C00E0DC19C00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417CE0E0DC1BA00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE417CD0E0DC1BA00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417DB0E0DC1DB00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAE417DA0E0DC1DB00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417E40E0DC1FD00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE4179C0E0DC13A00A530D1 /* NetPump */;
+ targetProxy = CAE417E30E0DC1FD00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417E60E0DC1FD00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417BA0E0DC19400A530D1 /* NetEcho */;
+ targetProxy = CAE417E50E0DC1FD00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417E80E0DC1FD00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417C70E0DC1B400A530D1 /* NetConfig */;
+ targetProxy = CAE417E70E0DC1FD00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417EA0E0DC1FD00A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417D40E0DC1D600A530D1 /* NetPing */;
+ targetProxy = CAE417E90E0DC1FD00A530D1 /* PBXContainerItemProxy */;
+ };
+ CAE417EC0E0DC20400A530D1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAE417DF0E0DC1F600A530D1 /* Apps */;
+ targetProxy = CAE417EB0E0DC20400A530D1 /* PBXContainerItemProxy */;
+ };
+ CAF2EFDD0E64A28000948C04 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = CAF2EFDC0E64A28000948C04 /* PBXContainerItemProxy */;
+ };
+ E44E2B921AE7649D0092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = F912B69E0B8EB1C700C1E90D /* Neptune */;
+ targetProxy = E44E2B911AE7649D0092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BBD1AE769290092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E40D8B9B1AD86D3A0041A617 /* Neptune-iOS */;
+ targetProxy = E44E2BBC1AE769290092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BBF1AE769290092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2A9C1AE75CD20092347B /* Neptune-Mac */;
+ targetProxy = E44E2BBE1AE769290092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BC11AE7692F0092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2BB81AE7691C0092347B /* Frameworks */;
+ targetProxy = E44E2BC01AE7692F0092347B /* PBXContainerItemProxy */;
+ };
+ E47C64501B1E106300BBDDD6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CA1A5EA80EC0152A00A9040C /* axTLS */;
+ targetProxy = E47C644F1B1E106300BBDDD6 /* PBXContainerItemProxy */;
+ };
+ E4FCC8601B1E3ECD00CCA327 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E4FCC83B1B1E3EB500CCA327 /* axTLS-iOS */;
+ targetProxy = E4FCC85F1B1E3ECD00CCA327 /* PBXContainerItemProxy */;
+ };
+ E4FCC8621B1E464B00CCA327 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CAC8F0A016AB54EA00C49741 /* NetBench */;
+ targetProxy = E4FCC8611B1E464B00CCA327 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ CA197D200E1AE4360018E87C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = QueueTest1;
+ };
+ name = Debug;
+ };
+ CA197D220E1AE4360018E87C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = QueueTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA1A5EAA0EC0152C00A9040C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
+ GCC_ENABLE_CPP_RTTI = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = NO;
+ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+ GCC_WARN_PEDANTIC = NO;
+ GCC_WARN_UNUSED_FUNCTION = NO;
+ GCC_WARN_UNUSED_LABEL = NO;
+ GCC_WARN_UNUSED_PARAMETER = NO;
+ GCC_WARN_UNUSED_VALUE = NO;
+ GCC_WARN_UNUSED_VARIABLE = NO;
+ PRODUCT_NAME = axTLS;
+ SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator";
+ WARNING_CFLAGS = "";
+ };
+ name = Debug;
+ };
+ CA1A5EAC0EC0152C00A9040C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
+ GCC_ENABLE_CPP_RTTI = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = NO;
+ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+ GCC_WARN_PEDANTIC = NO;
+ GCC_WARN_UNUSED_FUNCTION = NO;
+ GCC_WARN_UNUSED_LABEL = NO;
+ GCC_WARN_UNUSED_PARAMETER = NO;
+ GCC_WARN_UNUSED_VALUE = NO;
+ GCC_WARN_UNUSED_VARIABLE = NO;
+ PRODUCT_NAME = axTLS;
+ SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator";
+ WARNING_CFLAGS = "";
+ };
+ name = Release;
+ };
+ CA289DB910E31601001BC817 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = SocketsTest1;
+ };
+ name = Debug;
+ };
+ CA289DBA10E31601001BC817 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = SocketsTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA2F54260EC115E600AEBC12 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = TlsTest1;
+ };
+ name = Debug;
+ };
+ CA2F54280EC115E600AEBC12 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = TlsTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA30B76D0F0DCE9A0085B46E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = LoggingTest2;
+ };
+ name = Debug;
+ };
+ CA30B76F0F0DCE9A0085B46E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = LoggingTest2;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA4090C610AA257C00ED81C5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = TimeTest1;
+ };
+ name = Debug;
+ };
+ CA4090C710AA257C00ED81C5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = TimeTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA550D520D20A37E00B22D72 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = HttpServerTest1;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ CA550D540D20A37E00B22D72 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = HttpServerTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA77C0C214C0BC7700442B97 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ CA77C0C314C0BC7700442B97 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ CA78483F0F3B6E6A009E84AD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = minihttpserver;
+ };
+ name = Debug;
+ };
+ CA7848400F3B6E6A009E84AD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = minihttpserver;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA790DAB1233BDC100875081 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetGet;
+ };
+ name = Debug;
+ };
+ CA790DAC1233BDC100875081 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetGet;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA80664B1187BD09009D099D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = DigestsTest1;
+ };
+ name = Debug;
+ };
+ CA80664C1187BD09009D099D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = DigestsTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA8069DB118B5780009D099D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = CryptoTest1;
+ };
+ name = Debug;
+ };
+ CA8069DC118B5780009D099D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = CryptoTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA97E0220E2FDFB30090CC9B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = StreamsTest1;
+ };
+ name = Debug;
+ };
+ CA97E0240E2FDFB30090CC9B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = StreamsTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA9958A21046FFC80073F34A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = HttpClientTest2;
+ };
+ name = Debug;
+ };
+ CA9958A31046FFC80073F34A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = HttpClientTest2;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CA9DDC6810AE3DD7008B871E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = FileTest2;
+ };
+ name = Debug;
+ };
+ CA9DDC6910AE3DD7008B871E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = FileTest2;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAA97A030CF164A800C01909 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = XmlTest1;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ CAA97A040CF164A800C01909 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = XmlTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAA97A190CF1654A00C01909 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = StringsTest1;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ CAA97A1A0CF1654A00C01909 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = StringsTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAAAA07E12FF824F00ABC84B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetResolve;
+ };
+ name = Debug;
+ };
+ CAAAA07F12FF824F00ABC84B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetResolve;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAC8F0A916AB54EA00C49741 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ CAC8F0AA16AB54EA00C49741 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ CAE4169D0E0DBD6700A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = MiscTest1;
+ };
+ name = Debug;
+ };
+ CAE4169F0E0DBD6700A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = MiscTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE416BB0E0DBDF800A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = ArraysTest1;
+ };
+ name = Debug;
+ };
+ CAE416BD0E0DBDF800A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = ArraysTest1;
+ };
+ name = Release;
+ };
+ CAE416C80E0DBE3000A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = BufferedStreamsTest1;
+ };
+ name = Debug;
+ };
+ CAE416CA0E0DBE3000A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = BufferedStreamsTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE416D50E0DBE5A00A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = HttpClientTest1;
+ };
+ name = Debug;
+ };
+ CAE416D70E0DBE5A00A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = HttpClientTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE416E20E0DBE8000A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = ListsTest1;
+ };
+ name = Debug;
+ };
+ CAE416E40E0DBE8000A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = ListsTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE416EF0E0DBEAF00A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = LoggingTest1;
+ };
+ name = Debug;
+ };
+ CAE416F10E0DBEAF00A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = LoggingTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE416FC0E0DBEDD00A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = MapsTest1;
+ };
+ name = Debug;
+ };
+ CAE416FE0E0DBEDD00A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = MapsTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417090E0DBF0900A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = MessagesTest1;
+ };
+ name = Debug;
+ };
+ CAE4170B0E0DBF0900A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = MessagesTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417160E0DBF2800A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = MessagesTest2;
+ };
+ name = Debug;
+ };
+ CAE417180E0DBF2800A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = MessagesTest2;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE4172F0E0DC03600A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = RingBufferTest1;
+ };
+ name = Debug;
+ };
+ CAE417310E0DC03600A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = RingBufferTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE4173C0E0DC06700A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = ThreadsTest1;
+ };
+ name = Debug;
+ };
+ CAE4173E0E0DC06700A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = ThreadsTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417490E0DC08D00A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = UdpTest1;
+ };
+ name = Debug;
+ };
+ CAE4174B0E0DC08D00A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = UdpTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417560E0DC0A800A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = UrlTest1;
+ };
+ name = Debug;
+ };
+ CAE417580E0DC0A800A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = UrlTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417630E0DC0D200A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = ZipTest1;
+ };
+ name = Debug;
+ };
+ CAE417650E0DC0D200A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = ZipTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE4176D0E0DC0FE00A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ PRODUCT_NAME = Tests;
+ };
+ name = Debug;
+ };
+ CAE4176F0E0DC0FE00A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ PRODUCT_NAME = Tests;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417930E0DC11800A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ PRODUCT_NAME = All;
+ };
+ name = Debug;
+ };
+ CAE417950E0DC11800A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ PRODUCT_NAME = All;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE4179F0E0DC13A00A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetPump;
+ };
+ name = Debug;
+ };
+ CAE417A10E0DC13A00A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetPump;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417BD0E0DC19400A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetEcho;
+ };
+ name = Debug;
+ };
+ CAE417BF0E0DC19400A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetEcho;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417CA0E0DC1B500A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetConfig;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ CAE417CC0E0DC1B500A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetConfig;
+ SDKROOT = macosx;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417D70E0DC1D600A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetPing;
+ };
+ name = Debug;
+ };
+ CAE417D90E0DC1D600A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = NetPing;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAE417E00E0DC1F600A530D1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ PRODUCT_NAME = Apps;
+ };
+ name = Debug;
+ };
+ CAE417E20E0DC1F600A530D1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ PRODUCT_NAME = Apps;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ CAF26E9418C74A2F0015ABB9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ CAF26E9518C74A2F0015ABB9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = YES;
+ ENABLE_NS_ASSERTIONS = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ CAF26EA618C7FF630015ABB9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = ziphttpserver;
+ };
+ name = Debug;
+ };
+ CAF26EA718C7FF630015ABB9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = YES;
+ ENABLE_NS_ASSERTIONS = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ PRODUCT_NAME = ziphttpserver;
+ };
+ name = Release;
+ };
+ CAF2EFD90E64A27300948C04 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = FileTest1;
+ };
+ name = Debug;
+ };
+ CAF2EFDB0E64A27300948C04 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PRODUCT_NAME = FileTest1;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E40D8BB01AD86D3A0041A617 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ CURRENT_PROJECT_VERSION = 1.1.8;
+ DEFINES_MODULE = NO;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "$(inherited)",
+ "DEBUG=1",
+ NPT_CONFIG_HAVE_SYSTEM_LOG_CONFIG,
+ NPT_CONFIG_HAVE_SYSTEM_MACHINE_NAME,
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ INFOPLIST_FILE = "Neptune-Framework/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ MTL_ENABLE_DEBUG_INFO = YES;
+ OTHER_LDFLAGS = (
+ "-framework",
+ UIKit,
+ "-laxTLS",
+ );
+ PRODUCT_NAME = Neptune;
+ SDKROOT = iphoneos;
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ E40D8BB11AD86D3A0041A617 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1.1.8;
+ DEFINES_MODULE = NO;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "$(inherited)",
+ NPT_CONFIG_HAVE_SYSTEM_LOG_CONFIG,
+ NPT_CONFIG_HAVE_SYSTEM_MACHINE_NAME,
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ INFOPLIST_FILE = "Neptune-Framework/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ MTL_ENABLE_DEBUG_INFO = NO;
+ OTHER_LDFLAGS = (
+ "-framework",
+ UIKit,
+ "-laxTLS",
+ );
+ PRODUCT_NAME = Neptune;
+ SDKROOT = iphoneos;
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ E44E2B191AE75CD20092347B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CURRENT_PROJECT_VERSION = 1.1.8;
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ NPT_CONFIG_HAVE_SYSTEM_LOG_CONFIG,
+ NPT_CONFIG_HAVE_SYSTEM_MACHINE_NAME,
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ INFOPLIST_FILE = "Neptune-Framework/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+ MTL_ENABLE_DEBUG_INFO = YES;
+ OTHER_LDFLAGS = (
+ "-framework",
+ SystemConfiguration,
+ "-laxTLS",
+ );
+ PRODUCT_NAME = Neptune;
+ SDKROOT = macosx;
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = macosx;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ E44E2B1A1AE75CD20092347B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1.1.8;
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "$(inherited)",
+ NPT_CONFIG_HAVE_SYSTEM_LOG_CONFIG,
+ NPT_CONFIG_HAVE_SYSTEM_MACHINE_NAME,
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ INFOPLIST_FILE = "Neptune-Framework/Info.plist";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+ MTL_ENABLE_DEBUG_INFO = NO;
+ OTHER_LDFLAGS = (
+ "-framework",
+ SystemConfiguration,
+ "-laxTLS",
+ );
+ PRODUCT_NAME = Neptune;
+ SDKROOT = macosx;
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = macosx;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ E44E2BBA1AE7691C0092347B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ E44E2BBB1AE7691C0092347B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ E4FCC85A1B1E3EB500CCA327 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
+ GCC_ENABLE_CPP_RTTI = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = NO;
+ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+ GCC_WARN_PEDANTIC = NO;
+ GCC_WARN_UNUSED_FUNCTION = NO;
+ GCC_WARN_UNUSED_LABEL = NO;
+ GCC_WARN_UNUSED_PARAMETER = NO;
+ GCC_WARN_UNUSED_VALUE = NO;
+ GCC_WARN_UNUSED_VARIABLE = NO;
+ PRODUCT_NAME = axTLS;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
+ VALID_ARCHS = "arm64 armv7s armv7";
+ WARNING_CFLAGS = "";
+ };
+ name = Debug;
+ };
+ E4FCC85C1B1E3EB500CCA327 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
+ GCC_ENABLE_CPP_RTTI = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = NO;
+ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+ GCC_WARN_PEDANTIC = NO;
+ GCC_WARN_UNUSED_FUNCTION = NO;
+ GCC_WARN_UNUSED_LABEL = NO;
+ GCC_WARN_UNUSED_PARAMETER = NO;
+ GCC_WARN_UNUSED_VALUE = NO;
+ GCC_WARN_UNUSED_VARIABLE = NO;
+ PRODUCT_NAME = axTLS;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
+ VALID_ARCHS = "arm64 armv7s armv7";
+ WARNING_CFLAGS = "";
+ };
+ name = Release;
+ };
+ F912B6890B8EB12700C1E90D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ NPT_DEBUG,
+ NPT_CONFIG_ENABLE_LOGGING,
+ NPT_CONFIG_ENABLE_ZIP,
+ NPT_CONFIG_ENABLE_TLS,
+ NPT_CONFIG_ENABLE_CRYPTO,
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+ GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
+ GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_PEDANTIC = YES;
+ GCC_WARN_SHADOW = YES;
+ GCC_WARN_SIGN_COMPARE = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_LABEL = YES;
+ GCC_WARN_UNUSED_PARAMETER = YES;
+ GCC_WARN_UNUSED_VALUE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MACOSX_DEPLOYMENT_TARGET = 10.10;
+ ONLY_ACTIVE_ARCH = YES;
+ WARNING_CFLAGS = (
+ "-Wall",
+ "-Wextra",
+ "-Wno-long-long",
+ );
+ };
+ name = Debug;
+ };
+ F912B68A0B8EB12700C1E90D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ NPT_CONFIG_ENABLE_LOGGING,
+ NPT_CONFIG_ENABLE_ZIP,
+ NPT_CONFIG_ENABLE_TLS,
+ NPT_CONFIG_ENABLE_CRYPTO,
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+ GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
+ GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_PEDANTIC = YES;
+ GCC_WARN_SHADOW = YES;
+ GCC_WARN_SIGN_COMPARE = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNKNOWN_PRAGMAS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_LABEL = YES;
+ GCC_WARN_UNUSED_PARAMETER = YES;
+ GCC_WARN_UNUSED_VALUE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MACOSX_DEPLOYMENT_TARGET = 10.10;
+ WARNING_CFLAGS = (
+ "-Wall",
+ "-Wextra",
+ "-Wno-long-long",
+ );
+ };
+ name = Release;
+ };
+ F912B6A20B8EB1C800C1E90D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ PRODUCT_NAME = Neptune;
+ SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos";
+ };
+ name = Debug;
+ };
+ F912B6A30B8EB1C800C1E90D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ PRODUCT_NAME = Neptune;
+ SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ CA197D2A0E1AE4970018E87C /* Build configuration list for PBXNativeTarget "QueueTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA197D200E1AE4360018E87C /* Debug */,
+ CA197D220E1AE4360018E87C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA1A5ECD0EC0156900A9040C /* Build configuration list for PBXNativeTarget "axTLS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA1A5EAA0EC0152C00A9040C /* Debug */,
+ CA1A5EAC0EC0152C00A9040C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA289DC110E31637001BC817 /* Build configuration list for PBXNativeTarget "SocketsTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA289DB910E31601001BC817 /* Debug */,
+ CA289DBA10E31601001BC817 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA2F54310EC1160800AEBC12 /* Build configuration list for PBXNativeTarget "TlsTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA2F54260EC115E600AEBC12 /* Debug */,
+ CA2F54280EC115E600AEBC12 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA30B7760F0DCEC60085B46E /* Build configuration list for PBXNativeTarget "LoggingTest2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA30B76D0F0DCE9A0085B46E /* Debug */,
+ CA30B76F0F0DCE9A0085B46E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA4090CB10AA25BE00ED81C5 /* Build configuration list for PBXNativeTarget "TimeTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA4090C610AA257C00ED81C5 /* Debug */,
+ CA4090C710AA257C00ED81C5 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA550D510D20A37E00B22D72 /* Build configuration list for PBXNativeTarget "HttpServerTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA550D520D20A37E00B22D72 /* Debug */,
+ CA550D540D20A37E00B22D72 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA77C0C114C0BC7700442B97 /* Build configuration list for PBXNativeTarget "NetworkTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA77C0C214C0BC7700442B97 /* Debug */,
+ CA77C0C314C0BC7700442B97 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA7848490F3B6EB8009E84AD /* Build configuration list for PBXNativeTarget "MiniHttpServer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA78483F0F3B6E6A009E84AD /* Debug */,
+ CA7848400F3B6E6A009E84AD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA790DB51233BE2F00875081 /* Build configuration list for PBXNativeTarget "NetGet" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA790DAB1233BDC100875081 /* Debug */,
+ CA790DAC1233BDC100875081 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA8066541187BD60009D099D /* Build configuration list for PBXNativeTarget "DigestsTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA80664B1187BD09009D099D /* Debug */,
+ CA80664C1187BD09009D099D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA8069E6118B57BE009D099D /* Build configuration list for PBXNativeTarget "CryptoTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA8069DB118B5780009D099D /* Debug */,
+ CA8069DC118B5780009D099D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA97E0270E2FDFFB0090CC9B /* Build configuration list for PBXNativeTarget "StreamsTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA97E0220E2FDFB30090CC9B /* Debug */,
+ CA97E0240E2FDFB30090CC9B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA9958AC1047001B0073F34A /* Build configuration list for PBXNativeTarget "HttpClientTest2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA9958A21046FFC80073F34A /* Debug */,
+ CA9958A31046FFC80073F34A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CA9DDC6F10AE3E29008B871E /* Build configuration list for PBXNativeTarget "FileTest2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CA9DDC6810AE3DD7008B871E /* Debug */,
+ CA9DDC6910AE3DD7008B871E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAA97A0F0CF1653800C01909 /* Build configuration list for PBXNativeTarget "XmlTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAA97A030CF164A800C01909 /* Debug */,
+ CAA97A040CF164A800C01909 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAA97A180CF1654A00C01909 /* Build configuration list for PBXNativeTarget "StringsTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAA97A190CF1654A00C01909 /* Debug */,
+ CAA97A1A0CF1654A00C01909 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAAAA08812FF82A900ABC84B /* Build configuration list for PBXNativeTarget "NetResolve" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAAAA07E12FF824F00ABC84B /* Debug */,
+ CAAAA07F12FF824F00ABC84B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAC8F0A816AB54EA00C49741 /* Build configuration list for PBXNativeTarget "NetBench" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAC8F0A916AB54EA00C49741 /* Debug */,
+ CAC8F0AA16AB54EA00C49741 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE416B30E0DBDBB00A530D1 /* Build configuration list for PBXNativeTarget "MiscTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE4169D0E0DBD6700A530D1 /* Debug */,
+ CAE4169F0E0DBD6700A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417200E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "ArraysTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE416BB0E0DBDF800A530D1 /* Debug */,
+ CAE416BD0E0DBDF800A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417210E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "BufferedStreamsTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE416C80E0DBE3000A530D1 /* Debug */,
+ CAE416CA0E0DBE3000A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417220E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "HttpClientTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE416D50E0DBE5A00A530D1 /* Debug */,
+ CAE416D70E0DBE5A00A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417230E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "ListsTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE416E20E0DBE8000A530D1 /* Debug */,
+ CAE416E40E0DBE8000A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417240E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "LoggingTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE416EF0E0DBEAF00A530D1 /* Debug */,
+ CAE416F10E0DBEAF00A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417250E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "MapsTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE416FC0E0DBEDD00A530D1 /* Debug */,
+ CAE416FE0E0DBEDD00A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417260E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "MessagesTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417090E0DBF0900A530D1 /* Debug */,
+ CAE4170B0E0DBF0900A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417270E0DBF6600A530D1 /* Build configuration list for PBXNativeTarget "MessagesTest2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417160E0DBF2800A530D1 /* Debug */,
+ CAE417180E0DBF2800A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417AE0E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "RingBufferTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE4172F0E0DC03600A530D1 /* Debug */,
+ CAE417310E0DC03600A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417AF0E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "ThreadsTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE4173C0E0DC06700A530D1 /* Debug */,
+ CAE4173E0E0DC06700A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417B00E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "UdpTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417490E0DC08D00A530D1 /* Debug */,
+ CAE4174B0E0DC08D00A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417B10E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "UrlTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417560E0DC0A800A530D1 /* Debug */,
+ CAE417580E0DC0A800A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417B20E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "ZipTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417630E0DC0D200A530D1 /* Debug */,
+ CAE417650E0DC0D200A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417B30E0DC16300A530D1 /* Build configuration list for PBXAggregateTarget "Tests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE4176D0E0DC0FE00A530D1 /* Debug */,
+ CAE4176F0E0DC0FE00A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417B40E0DC16300A530D1 /* Build configuration list for PBXAggregateTarget "All" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417930E0DC11800A530D1 /* Debug */,
+ CAE417950E0DC11800A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417B50E0DC16300A530D1 /* Build configuration list for PBXNativeTarget "NetPump" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE4179F0E0DC13A00A530D1 /* Debug */,
+ CAE417A10E0DC13A00A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417F00E0DC24100A530D1 /* Build configuration list for PBXNativeTarget "NetEcho" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417BD0E0DC19400A530D1 /* Debug */,
+ CAE417BF0E0DC19400A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417F10E0DC24100A530D1 /* Build configuration list for PBXNativeTarget "NetConfig" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417CA0E0DC1B500A530D1 /* Debug */,
+ CAE417CC0E0DC1B500A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417F20E0DC24100A530D1 /* Build configuration list for PBXNativeTarget "NetPing" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417D70E0DC1D600A530D1 /* Debug */,
+ CAE417D90E0DC1D600A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAE417F30E0DC24100A530D1 /* Build configuration list for PBXAggregateTarget "Apps" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAE417E00E0DC1F600A530D1 /* Debug */,
+ CAE417E20E0DC1F600A530D1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAF26E9618C74A2F0015ABB9 /* Build configuration list for PBXNativeTarget "ZipTest2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAF26E9418C74A2F0015ABB9 /* Debug */,
+ CAF26E9518C74A2F0015ABB9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAF26EA518C7FF630015ABB9 /* Build configuration list for PBXNativeTarget "ZipHttpServer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAF26EA618C7FF630015ABB9 /* Debug */,
+ CAF26EA718C7FF630015ABB9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CAF2EFE10E64A2D500948C04 /* Build configuration list for PBXNativeTarget "FileTest1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CAF2EFD90E64A27300948C04 /* Debug */,
+ CAF2EFDB0E64A27300948C04 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E40D8BAF1AD86D3A0041A617 /* Build configuration list for PBXNativeTarget "Neptune-iOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E40D8BB01AD86D3A0041A617 /* Debug */,
+ E40D8BB11AD86D3A0041A617 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E44E2B181AE75CD20092347B /* Build configuration list for PBXNativeTarget "Neptune-Mac" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E44E2B191AE75CD20092347B /* Debug */,
+ E44E2B1A1AE75CD20092347B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E44E2BB91AE7691C0092347B /* Build configuration list for PBXAggregateTarget "Frameworks" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E44E2BBA1AE7691C0092347B /* Debug */,
+ E44E2BBB1AE7691C0092347B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E4FCC8591B1E3EB500CCA327 /* Build configuration list for PBXNativeTarget "axTLS-iOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E4FCC85A1B1E3EB500CCA327 /* Debug */,
+ E4FCC85C1B1E3EB500CCA327 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ F912B6880B8EB12700C1E90D /* Build configuration list for PBXProject "Neptune" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F912B6890B8EB12700C1E90D /* Debug */,
+ F912B68A0B8EB12700C1E90D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ F912B6A10B8EB1C800C1E90D /* Build configuration list for PBXNativeTarget "Neptune" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F912B6A20B8EB1C800C1E90D /* Debug */,
+ F912B6A30B8EB1C800C1E90D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = F912B6870B8EB12700C1E90D /* Project object */;
+}
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ArraysTest1/ArraysTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ArraysTest1/ArraysTest1.vcxproj
new file mode 100644
index 0000000..29afcf1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ArraysTest1/ArraysTest1.vcxproj
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{0978344F-DBD7-4B3E-809C-5E58FB1FFD43}</ProjectGuid>
+ <RootNamespace>ArraysTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NPT_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)ArraysTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)ArraysTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;NPT_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)ArraysTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Arrays1\ArraysTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/BufferedStreamsTest1/BufferedStreamsTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/BufferedStreamsTest1/BufferedStreamsTest1.vcxproj
new file mode 100644
index 0000000..afbcc27
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/BufferedStreamsTest1/BufferedStreamsTest1.vcxproj
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{F85C32FD-20B2-4066-B1B0-CE43A7BAA988}</ProjectGuid>
+ <RootNamespace>BufferedStreamsTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)BufferedStreamsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)BufferedStreamsTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)BufferedStreamsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\BufferedStreams1\BufferedStreamsTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Build.py b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Build.py
new file mode 100644
index 0000000..ab9b164
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Build.py
@@ -0,0 +1,97 @@
+#! /usr/bin/env python
+"""
+
+Visual Studio 2010 Build Script
+
+$Id: Build.py 87 2008-08-15 19:03:36Z bok $
+
+"""
+
+import os
+import sys
+import getopt
+import subprocess
+
+# Setup some path stuff
+try:
+ if environ['VISUALSTUDIO_BIN']:
+ VSBINDIR = environ['VISUALSTUDIO_BIN']
+except NameError:
+ # Use default value for visual studio.
+ VSBINDIR = 'C:/Program Files/Microsoft Visual Studio 10.0/Common7/IDE'
+ print 'VISUALSTUDIO_BIN not set. Trying default value:'
+ print ' ' + VSBINDIR
+ print ''
+
+
+# ------------------------------------------------------------
+# usage
+# ------------------------------------------------------------
+def usage(errMsg):
+ try:
+ print 'Error: %s' % (errMsg)
+ except NameError:
+ pass
+
+ print 'Usage: '
+ print ' %s -s <path to solution> -b [Release|Debug|etc.]' % (sys.argv[0])
+ print ''
+ print ' REQUIRED OPTIONS'
+ print '\t-s <solution>'
+ print '\t-b <configuration>'
+ print ''
+ print ' BUILD OPTIONS'
+ print '\t-c\tMake clean'
+ print '\t-r\tRe-build all'
+
+
+# ------------------------------------------------------------
+# main
+# ------------------------------------------------------------
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "s:b:rc")
+except getopt.GetoptError, (msg, opt):
+# print 'Error: invalid argument, %s: %s' % (opt, msg)
+ usage('invalid argument, %s: %s' % (opt, msg))
+ sys.exit(2)
+
+# Build options
+doingBuild = False
+rebuildAll = False
+makeClean = False
+
+for opt, arg in opts:
+ if opt == '-s':
+ solutionFile = arg
+ doingBuild = True
+ elif opt == '-b':
+ buildName = arg
+ doingBuild = True
+ elif opt == '-r':
+ rebuildAll = True
+ doingBuild = True
+ elif opt == '-c':
+ makeClean = True
+
+if rebuildAll and makeClean:
+ usage('Error cannot specify -c and -r together')
+ sys.exit(2)
+
+try:
+ buildSwitch = 'build'
+ if rebuildAll: buildSwitch = 'rebuild'
+ elif makeClean: buildSwitch = 'clean'
+
+ cmd_list = ['%s/devenv.com' % VSBINDIR, '/%s' % buildSwitch, buildName, solutionFile]
+ cmd = " ".join(cmd_list)
+ print 'Executing:'
+ print cmd
+ retVal = subprocess.call(cmd_list)
+ # only the least sig 8 bits are the real return value
+ if retVal != 0:
+ print cmd
+ print '** BUILD FAILURE **'
+ sys.exit(retVal)
+except NameError, (name):
+ usage('missing argument %s' % (name))
+ sys.exit(2)
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/FileTest1/FileTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/FileTest1/FileTest1.vcxproj
new file mode 100644
index 0000000..5e70c67
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/FileTest1/FileTest1.vcxproj
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{7CBC67C8-D481-4633-9B25-E6C95739E454}</ProjectGuid>
+ <RootNamespace>FileTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NPT_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;NPT_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\FileTest1\FileTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/FileTest2/FileTest2.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/FileTest2/FileTest2.vcxproj
new file mode 100644
index 0000000..4f7f289
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/FileTest2/FileTest2.vcxproj
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{87F46FDF-F568-43F7-BAAC-72948AC33A28}</ProjectGuid>
+ <RootNamespace>FileTest2</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\FileTest2\FileTest2.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpClientTest1/HttpClientTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpClientTest1/HttpClientTest1.vcxproj
new file mode 100644
index 0000000..5199c40
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpClientTest1/HttpClientTest1.vcxproj
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{589435E9-3451-45B0-83BD-E5FD0D875CBB}</ProjectGuid>
+ <RootNamespace>HttpClientTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)HttpClientTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)HttpClientTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)HttpClientTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\HttpClient1\HttpClientTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpClientTest2/HttpClientTest2.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpClientTest2/HttpClientTest2.vcxproj
new file mode 100644
index 0000000..2440878
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpClientTest2/HttpClientTest2.vcxproj
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{B5C87FF6-2862-4BBF-AC3B-6AFDA8D85BB2}</ProjectGuid>
+ <RootNamespace>HttpClientTest2</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NPT_CONFIG_ENABLE_TLS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NPT_CONFIG_ENABLE_TLS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\HttpClient2\HttpClientTest2.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpServerTest1/HttpServerTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpServerTest1/HttpServerTest1.vcxproj
new file mode 100644
index 0000000..b8010df
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/HttpServerTest1/HttpServerTest1.vcxproj
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{77FD5430-1AB3-414A-BE15-E63D38F1A5FC}</ProjectGuid>
+ <RootNamespace>HttpServerTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NPT_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)HttpServerTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)HttpServerTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)HttpServerTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\HttpServer1\HttpServerTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ListsTest1/ListsTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ListsTest1/ListsTest1.vcxproj
new file mode 100644
index 0000000..7063893
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ListsTest1/ListsTest1.vcxproj
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{AB6911DF-1EB4-4D37-B4A5-AD577761C188}</ProjectGuid>
+ <RootNamespace>ListsTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)ListsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)ListsTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)ListsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Lists1\ListsTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/LoggingTest1/LoggingTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/LoggingTest1/LoggingTest1.vcxproj
new file mode 100644
index 0000000..be5a936
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/LoggingTest1/LoggingTest1.vcxproj
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{6A729FAF-D757-4699-8BB4-CF48B2F4BC20}</ProjectGuid>
+ <RootNamespace>LoggingTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NPT_CONFIG_ENABLE_LOGGING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;NPT_CONFIG_ENABLE_LOGGING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Logging1\LoggingTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/LoggingTest2/LoggingTest2.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/LoggingTest2/LoggingTest2.vcxproj
new file mode 100644
index 0000000..cf63033
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/LoggingTest2/LoggingTest2.vcxproj
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{6C7F92DF-B9CB-453A-868A-BD3A18CCD552}</ProjectGuid>
+ <RootNamespace>LoggingTest2</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Logging2\LoggingTest2.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MapsTest1/MapsTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MapsTest1/MapsTest1.vcxproj
new file mode 100644
index 0000000..d3a017c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MapsTest1/MapsTest1.vcxproj
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{257C9F75-2708-4136-BFA9-621ACD0B9BD1}</ProjectGuid>
+ <RootNamespace>MapsTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)MapsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)MapsTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)MapsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Maps1\MapsTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MessagesTest1/MessagesTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MessagesTest1/MessagesTest1.vcxproj
new file mode 100644
index 0000000..ee1243f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MessagesTest1/MessagesTest1.vcxproj
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{40A4B71C-5481-4A70-8216-E7AE6E431313}</ProjectGuid>
+ <RootNamespace>MessagesTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NPT_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)MessagesTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)MessagesTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)MessagesTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Messages1\MessagesTest1.cpp">
+ <RuntimeTypeInfo Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</RuntimeTypeInfo>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MessagesTest2/MessagesTest2.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MessagesTest2/MessagesTest2.vcxproj
new file mode 100644
index 0000000..98401d7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MessagesTest2/MessagesTest2.vcxproj
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}</ProjectGuid>
+ <RootNamespace>MessagesTest2</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NPT_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <RuntimeTypeInfo>true</RuntimeTypeInfo>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName).exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)MessagesTest2.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <RuntimeTypeInfo>true</RuntimeTypeInfo>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName).exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Messages2\MessagesTest2.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MiscTest1/MiscTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MiscTest1/MiscTest1.vcxproj
new file mode 100644
index 0000000..b6df0bd
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/MiscTest1/MiscTest1.vcxproj
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{85255DB0-110B-460E-8AC9-406516F790BB}</ProjectGuid>
+ <RootNamespace>MiscTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Misc1\MiscTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Neptune.sln b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Neptune.sln
new file mode 100644
index 0000000..3ff0f34
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Neptune.sln
@@ -0,0 +1,199 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Neptune", "Neptune\Neptune.vcxproj", "{12AFF2E5-6D95-4809-9728-9551677C078A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XmlTest1", "XmlTest1\XmlTest1.vcxproj", "{21C242CD-B371-4970-94BE-7ED2522872BA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetPump", "NetPump\NetPump.vcxproj", "{0B04D92B-B644-4AED-90C6-A24303C78658}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StringsTest1", "StringsTest1\StringsTest1.vcxproj", "{569179D6-7767-4840-9708-D1ADAFB012DB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MessagesTest1", "MessagesTest1\MessagesTest1.vcxproj", "{40A4B71C-5481-4A70-8216-E7AE6E431313}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MessagesTest2", "MessagesTest2\MessagesTest2.vcxproj", "{B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetConfig", "NetConfig\NetConfig.vcxproj", "{0E80CEA0-5817-4B9C-B2D8-733D955A7673}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RingBufferTest1", "RingBufferTest1\RingBufferTest1.vcxproj", "{59C1FCBE-7987-41F2-A0EB-E0114D5B2972}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetEcho", "NetEcho\NetEcho.vcxproj", "{7228CB90-1ACE-43A3-A013-D437BF0E50F3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetPing", "NetPing\NetPing.vcxproj", "{9C1CAC88-8D92-4743-8330-CE8E7836D3BF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UdpTest1", "UdpTest1\UdpTest1.vcxproj", "{C025608F-9193-4040-B2F8-941746648CE2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ArraysTest1", "ArraysTest1\ArraysTest1.vcxproj", "{0978344F-DBD7-4B3E-809C-5E58FB1FFD43}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BufferedStreamsTest1", "BufferedStreamsTest1\BufferedStreamsTest1.vcxproj", "{F85C32FD-20B2-4066-B1B0-CE43A7BAA988}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HttpClientTest1", "HttpClientTest1\HttpClientTest1.vcxproj", "{589435E9-3451-45B0-83BD-E5FD0D875CBB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ListsTest1", "ListsTest1\ListsTest1.vcxproj", "{AB6911DF-1EB4-4D37-B4A5-AD577761C188}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MiscTest1", "MiscTest1\MiscTest1.vcxproj", "{85255DB0-110B-460E-8AC9-406516F790BB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HttpServerTest1", "HttpServerTest1\HttpServerTest1.vcxproj", "{77FD5430-1AB3-414A-BE15-E63D38F1A5FC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UrlTest1", "UrlTest1\UrlTest1.vcxproj", "{DBC6965C-D575-4DBC-9A0A-E6D9D9674282}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MapsTest1", "MapsTest1\MapsTest1.vcxproj", "{257C9F75-2708-4136-BFA9-621ACD0B9BD1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ThreadsTest1", "ThreadsTest1\ThreadsTest1.vcxproj", "{D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LoggingTest1", "LoggingTest1\LoggingTest1.vcxproj", "{6A729FAF-D757-4699-8BB4-CF48B2F4BC20}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QueueTest1", "QueueTest1\QueueTest1.vcxproj", "{63DE91B4-1F13-4A7B-B253-C6E365E0B3DB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FileTest1", "FileTest1\FileTest1.vcxproj", "{7CBC67C8-D481-4633-9B25-E6C95739E454}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FileTest2", "FileTest2\FileTest2.vcxproj", "{87F46FDF-F568-43F7-BAAC-72948AC33A28}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HttpClientTest2", "HttpClientTest2\HttpClientTest2.vcxproj", "{B5C87FF6-2862-4BBF-AC3B-6AFDA8D85BB2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SocketsTest1", "SocketsTest1\SocketsTest1.vcxproj", "{5335EB98-47F9-40EE-AB37-9BD8781A7BB2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TimeTest1", "TimeTest1\TimeTest1.vcxproj", "{4781266F-BA2E-4FEB-BBEA-C681ECF40840}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TlsTest1", "TlsTest1\TlsTest1.vcxproj", "{0948F98F-4FC8-423A-9F63-645EEB5D0947}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetGet", "NetGet\NetGet.vcxproj", "{1A2D83FE-57D8-4EAB-9CEE-420E1F980489}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetResolve", "NetResolve\NetResolve.vcxproj", "{62F20819-2CD5-463E-85E5-23C0466F05C2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SharedVariables1", "SharedVariables1\SharedVariables1.vcxproj", "{8029AE79-A145-4A5C-8F0B-297B56BA9ACD}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Debug|Win32.Build.0 = Debug|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Release|Win32.ActiveCfg = Release|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Release|Win32.Build.0 = Release|Win32
+ {21C242CD-B371-4970-94BE-7ED2522872BA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {21C242CD-B371-4970-94BE-7ED2522872BA}.Debug|Win32.Build.0 = Debug|Win32
+ {21C242CD-B371-4970-94BE-7ED2522872BA}.Release|Win32.ActiveCfg = Release|Win32
+ {21C242CD-B371-4970-94BE-7ED2522872BA}.Release|Win32.Build.0 = Release|Win32
+ {0B04D92B-B644-4AED-90C6-A24303C78658}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0B04D92B-B644-4AED-90C6-A24303C78658}.Debug|Win32.Build.0 = Debug|Win32
+ {0B04D92B-B644-4AED-90C6-A24303C78658}.Release|Win32.ActiveCfg = Release|Win32
+ {0B04D92B-B644-4AED-90C6-A24303C78658}.Release|Win32.Build.0 = Release|Win32
+ {569179D6-7767-4840-9708-D1ADAFB012DB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {569179D6-7767-4840-9708-D1ADAFB012DB}.Debug|Win32.Build.0 = Debug|Win32
+ {569179D6-7767-4840-9708-D1ADAFB012DB}.Release|Win32.ActiveCfg = Release|Win32
+ {569179D6-7767-4840-9708-D1ADAFB012DB}.Release|Win32.Build.0 = Release|Win32
+ {40A4B71C-5481-4A70-8216-E7AE6E431313}.Debug|Win32.ActiveCfg = Debug|Win32
+ {40A4B71C-5481-4A70-8216-E7AE6E431313}.Debug|Win32.Build.0 = Debug|Win32
+ {40A4B71C-5481-4A70-8216-E7AE6E431313}.Release|Win32.ActiveCfg = Release|Win32
+ {40A4B71C-5481-4A70-8216-E7AE6E431313}.Release|Win32.Build.0 = Release|Win32
+ {B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}.Debug|Win32.Build.0 = Debug|Win32
+ {B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}.Release|Win32.ActiveCfg = Release|Win32
+ {B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}.Release|Win32.Build.0 = Release|Win32
+ {0E80CEA0-5817-4B9C-B2D8-733D955A7673}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0E80CEA0-5817-4B9C-B2D8-733D955A7673}.Debug|Win32.Build.0 = Debug|Win32
+ {0E80CEA0-5817-4B9C-B2D8-733D955A7673}.Release|Win32.ActiveCfg = Release|Win32
+ {0E80CEA0-5817-4B9C-B2D8-733D955A7673}.Release|Win32.Build.0 = Release|Win32
+ {59C1FCBE-7987-41F2-A0EB-E0114D5B2972}.Debug|Win32.ActiveCfg = Debug|Win32
+ {59C1FCBE-7987-41F2-A0EB-E0114D5B2972}.Debug|Win32.Build.0 = Debug|Win32
+ {59C1FCBE-7987-41F2-A0EB-E0114D5B2972}.Release|Win32.ActiveCfg = Release|Win32
+ {59C1FCBE-7987-41F2-A0EB-E0114D5B2972}.Release|Win32.Build.0 = Release|Win32
+ {7228CB90-1ACE-43A3-A013-D437BF0E50F3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7228CB90-1ACE-43A3-A013-D437BF0E50F3}.Debug|Win32.Build.0 = Debug|Win32
+ {7228CB90-1ACE-43A3-A013-D437BF0E50F3}.Release|Win32.ActiveCfg = Release|Win32
+ {7228CB90-1ACE-43A3-A013-D437BF0E50F3}.Release|Win32.Build.0 = Release|Win32
+ {9C1CAC88-8D92-4743-8330-CE8E7836D3BF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9C1CAC88-8D92-4743-8330-CE8E7836D3BF}.Debug|Win32.Build.0 = Debug|Win32
+ {9C1CAC88-8D92-4743-8330-CE8E7836D3BF}.Release|Win32.ActiveCfg = Release|Win32
+ {9C1CAC88-8D92-4743-8330-CE8E7836D3BF}.Release|Win32.Build.0 = Release|Win32
+ {C025608F-9193-4040-B2F8-941746648CE2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C025608F-9193-4040-B2F8-941746648CE2}.Debug|Win32.Build.0 = Debug|Win32
+ {C025608F-9193-4040-B2F8-941746648CE2}.Release|Win32.ActiveCfg = Release|Win32
+ {C025608F-9193-4040-B2F8-941746648CE2}.Release|Win32.Build.0 = Release|Win32
+ {0978344F-DBD7-4B3E-809C-5E58FB1FFD43}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0978344F-DBD7-4B3E-809C-5E58FB1FFD43}.Debug|Win32.Build.0 = Debug|Win32
+ {0978344F-DBD7-4B3E-809C-5E58FB1FFD43}.Release|Win32.ActiveCfg = Release|Win32
+ {0978344F-DBD7-4B3E-809C-5E58FB1FFD43}.Release|Win32.Build.0 = Release|Win32
+ {F85C32FD-20B2-4066-B1B0-CE43A7BAA988}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F85C32FD-20B2-4066-B1B0-CE43A7BAA988}.Debug|Win32.Build.0 = Debug|Win32
+ {F85C32FD-20B2-4066-B1B0-CE43A7BAA988}.Release|Win32.ActiveCfg = Release|Win32
+ {F85C32FD-20B2-4066-B1B0-CE43A7BAA988}.Release|Win32.Build.0 = Release|Win32
+ {589435E9-3451-45B0-83BD-E5FD0D875CBB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {589435E9-3451-45B0-83BD-E5FD0D875CBB}.Debug|Win32.Build.0 = Debug|Win32
+ {589435E9-3451-45B0-83BD-E5FD0D875CBB}.Release|Win32.ActiveCfg = Release|Win32
+ {589435E9-3451-45B0-83BD-E5FD0D875CBB}.Release|Win32.Build.0 = Release|Win32
+ {AB6911DF-1EB4-4D37-B4A5-AD577761C188}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AB6911DF-1EB4-4D37-B4A5-AD577761C188}.Debug|Win32.Build.0 = Debug|Win32
+ {AB6911DF-1EB4-4D37-B4A5-AD577761C188}.Release|Win32.ActiveCfg = Release|Win32
+ {AB6911DF-1EB4-4D37-B4A5-AD577761C188}.Release|Win32.Build.0 = Release|Win32
+ {85255DB0-110B-460E-8AC9-406516F790BB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {85255DB0-110B-460E-8AC9-406516F790BB}.Debug|Win32.Build.0 = Debug|Win32
+ {85255DB0-110B-460E-8AC9-406516F790BB}.Release|Win32.ActiveCfg = Release|Win32
+ {85255DB0-110B-460E-8AC9-406516F790BB}.Release|Win32.Build.0 = Release|Win32
+ {77FD5430-1AB3-414A-BE15-E63D38F1A5FC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77FD5430-1AB3-414A-BE15-E63D38F1A5FC}.Debug|Win32.Build.0 = Debug|Win32
+ {77FD5430-1AB3-414A-BE15-E63D38F1A5FC}.Release|Win32.ActiveCfg = Release|Win32
+ {77FD5430-1AB3-414A-BE15-E63D38F1A5FC}.Release|Win32.Build.0 = Release|Win32
+ {DBC6965C-D575-4DBC-9A0A-E6D9D9674282}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DBC6965C-D575-4DBC-9A0A-E6D9D9674282}.Debug|Win32.Build.0 = Debug|Win32
+ {DBC6965C-D575-4DBC-9A0A-E6D9D9674282}.Release|Win32.ActiveCfg = Release|Win32
+ {DBC6965C-D575-4DBC-9A0A-E6D9D9674282}.Release|Win32.Build.0 = Release|Win32
+ {257C9F75-2708-4136-BFA9-621ACD0B9BD1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {257C9F75-2708-4136-BFA9-621ACD0B9BD1}.Debug|Win32.Build.0 = Debug|Win32
+ {257C9F75-2708-4136-BFA9-621ACD0B9BD1}.Release|Win32.ActiveCfg = Release|Win32
+ {257C9F75-2708-4136-BFA9-621ACD0B9BD1}.Release|Win32.Build.0 = Release|Win32
+ {D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}.Debug|Win32.Build.0 = Debug|Win32
+ {D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}.Release|Win32.ActiveCfg = Release|Win32
+ {D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}.Release|Win32.Build.0 = Release|Win32
+ {6A729FAF-D757-4699-8BB4-CF48B2F4BC20}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6A729FAF-D757-4699-8BB4-CF48B2F4BC20}.Debug|Win32.Build.0 = Debug|Win32
+ {6A729FAF-D757-4699-8BB4-CF48B2F4BC20}.Release|Win32.ActiveCfg = Release|Win32
+ {6A729FAF-D757-4699-8BB4-CF48B2F4BC20}.Release|Win32.Build.0 = Release|Win32
+ {63DE91B4-1F13-4A7B-B253-C6E365E0B3DB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {63DE91B4-1F13-4A7B-B253-C6E365E0B3DB}.Debug|Win32.Build.0 = Debug|Win32
+ {63DE91B4-1F13-4A7B-B253-C6E365E0B3DB}.Release|Win32.ActiveCfg = Release|Win32
+ {63DE91B4-1F13-4A7B-B253-C6E365E0B3DB}.Release|Win32.Build.0 = Release|Win32
+ {7CBC67C8-D481-4633-9B25-E6C95739E454}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7CBC67C8-D481-4633-9B25-E6C95739E454}.Debug|Win32.Build.0 = Debug|Win32
+ {7CBC67C8-D481-4633-9B25-E6C95739E454}.Release|Win32.ActiveCfg = Release|Win32
+ {7CBC67C8-D481-4633-9B25-E6C95739E454}.Release|Win32.Build.0 = Release|Win32
+ {87F46FDF-F568-43F7-BAAC-72948AC33A28}.Debug|Win32.ActiveCfg = Debug|Win32
+ {87F46FDF-F568-43F7-BAAC-72948AC33A28}.Debug|Win32.Build.0 = Debug|Win32
+ {87F46FDF-F568-43F7-BAAC-72948AC33A28}.Release|Win32.ActiveCfg = Release|Win32
+ {87F46FDF-F568-43F7-BAAC-72948AC33A28}.Release|Win32.Build.0 = Release|Win32
+ {B5C87FF6-2862-4BBF-AC3B-6AFDA8D85BB2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B5C87FF6-2862-4BBF-AC3B-6AFDA8D85BB2}.Debug|Win32.Build.0 = Debug|Win32
+ {B5C87FF6-2862-4BBF-AC3B-6AFDA8D85BB2}.Release|Win32.ActiveCfg = Release|Win32
+ {B5C87FF6-2862-4BBF-AC3B-6AFDA8D85BB2}.Release|Win32.Build.0 = Release|Win32
+ {5335EB98-47F9-40EE-AB37-9BD8781A7BB2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5335EB98-47F9-40EE-AB37-9BD8781A7BB2}.Debug|Win32.Build.0 = Debug|Win32
+ {5335EB98-47F9-40EE-AB37-9BD8781A7BB2}.Release|Win32.ActiveCfg = Release|Win32
+ {5335EB98-47F9-40EE-AB37-9BD8781A7BB2}.Release|Win32.Build.0 = Release|Win32
+ {4781266F-BA2E-4FEB-BBEA-C681ECF40840}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4781266F-BA2E-4FEB-BBEA-C681ECF40840}.Debug|Win32.Build.0 = Debug|Win32
+ {4781266F-BA2E-4FEB-BBEA-C681ECF40840}.Release|Win32.ActiveCfg = Release|Win32
+ {4781266F-BA2E-4FEB-BBEA-C681ECF40840}.Release|Win32.Build.0 = Release|Win32
+ {0948F98F-4FC8-423A-9F63-645EEB5D0947}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0948F98F-4FC8-423A-9F63-645EEB5D0947}.Debug|Win32.Build.0 = Debug|Win32
+ {0948F98F-4FC8-423A-9F63-645EEB5D0947}.Release|Win32.ActiveCfg = Release|Win32
+ {0948F98F-4FC8-423A-9F63-645EEB5D0947}.Release|Win32.Build.0 = Release|Win32
+ {1A2D83FE-57D8-4EAB-9CEE-420E1F980489}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1A2D83FE-57D8-4EAB-9CEE-420E1F980489}.Debug|Win32.Build.0 = Debug|Win32
+ {1A2D83FE-57D8-4EAB-9CEE-420E1F980489}.Release|Win32.ActiveCfg = Release|Win32
+ {1A2D83FE-57D8-4EAB-9CEE-420E1F980489}.Release|Win32.Build.0 = Release|Win32
+ {62F20819-2CD5-463E-85E5-23C0466F05C2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {62F20819-2CD5-463E-85E5-23C0466F05C2}.Debug|Win32.Build.0 = Debug|Win32
+ {62F20819-2CD5-463E-85E5-23C0466F05C2}.Release|Win32.ActiveCfg = Release|Win32
+ {62F20819-2CD5-463E-85E5-23C0466F05C2}.Release|Win32.Build.0 = Release|Win32
+ {8029AE79-A145-4A5C-8F0B-297B56BA9ACD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8029AE79-A145-4A5C-8F0B-297B56BA9ACD}.Debug|Win32.Build.0 = Debug|Win32
+ {8029AE79-A145-4A5C-8F0B-297B56BA9ACD}.Release|Win32.ActiveCfg = Release|Win32
+ {8029AE79-A145-4A5C-8F0B-297B56BA9ACD}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Neptune/Neptune.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Neptune/Neptune.vcxproj
new file mode 100644
index 0000000..d574b65
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/Neptune/Neptune.vcxproj
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{12AFF2E5-6D95-4809-9728-9551677C078A}</ProjectGuid>
+ <RootNamespace>Neptune</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;..\..\..\..\Source\System\Win32;..\..\..\..\ThirdParty\axTLS\config\Win32;..\..\..\..\ThirdParty\axTLS\crypto;..\..\..\..\ThirdParty\axTLS\ssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;NPT_DEBUG;NPT_CONFIG_ENABLE_LOGGING;NPT_CONFIG_ENABLE_TLS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Lib>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)Neptune.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <OmitFramePointers>true</OmitFramePointers>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;..\..\..\..\Source\System\Win32;..\..\..\..\ThirdParty\axTLS\config\Win32;..\..\..\..\ThirdParty\axTLS\crypto;..\..\..\..\ThirdParty\axTLS\ssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;NPT_CONFIG_ENABLE_TLS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Fast</FloatingPointModel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Lib>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)Neptune.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Core\NptBase64.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptHash.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Bsd\NptBsdResolver.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Bsd\NptBsdSockets.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptBufferedStreams.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptCommon.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptConsole.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptCrypto.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptDataBuffer.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptDebug.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptDigest.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptFile.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptHttp.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptList.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptLogging.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptMessaging.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptNetwork.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Posix\NptPosixFile.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptQueue.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptResults.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptRingBuffer.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptSimpleMessageQueue.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptSockets.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\StdC\NptStdcEnvironment.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\StdC\NptStdcFile.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptStreams.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptStrings.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptSystem.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptThreads.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptTime.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptTls.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptUri.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptUtils.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32Console.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32Debug.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32DynamicLibraries.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32File.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32MessageQueue.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32Network.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32Queue.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32SerialPort.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32System.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32Threads.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\Win32\NptWin32Time.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinCE\NptWinceConsole.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinCE\NptWinceEnvironment.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinCE\NptWinceMain.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptXml.cpp" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\aes.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\asn1.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\bigint.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\crypto_misc.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\gen_cert.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\hmac.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\loader.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\md2.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\md5.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\p12.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\rc4.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\rsa.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\sha1.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\tls1.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\tls1_clnt.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\tls1_svr.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\x509.c" />
+ <ClCompile Include="..\..\..\..\Source\Data\TLS\NptTlsDefaultTrustAnchorsBase.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Data\TLS\NptTlsDefaultTrustAnchorsExtended.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\Source\Core\NptHash.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\crypto\bigint.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\crypto\bigint_impl.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\ssl\cert.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\config\Win32\config.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\crypto\crypto.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\ssl\crypto_misc.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\ssl\os_port.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\ssl\ssl.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\ssl\tls1.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\ssl\version.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\Neptune.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptArray.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptBase64.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptBufferedStreams.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptCommon.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptConfig.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptConsole.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptConstants.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptCrypto.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDataBuffer.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDebug.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDefs.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDigest.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptFile.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptHttp.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptInterfaces.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptList.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptLogging.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptMap.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptMessaging.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptNetwork.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptQueue.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptReferences.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptResults.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptRingBuffer.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSelectableMessageQueue.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSerialPort.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSimpleMessageQueue.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSockets.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptStack.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptStreams.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptStrings.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSystem.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptThreads.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptTime.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptTls.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptTypes.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptUri.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptUtils.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptVersion.h" />
+ <ClInclude Include="..\..\..\..\Source\System\Win32\NptWin32MessageQueue.h" />
+ <ClInclude Include="..\..\..\..\Source\System\Win32\NptWin32Network.h" />
+ <ClInclude Include="..\..\..\..\Source\System\Win32\NptWin32Threads.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptXml.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetConfig/NetConfig.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetConfig/NetConfig.vcxproj
new file mode 100644
index 0000000..313d059
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetConfig/NetConfig.vcxproj
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{0E80CEA0-5817-4B9C-B2D8-733D955A7673}</ProjectGuid>
+ <RootNamespace>NetConfig</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>WS2_32.lib;iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)NetConfig.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)NetConfig.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)NetConfig.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Apps\NetConfig\NetConfig.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetEcho/NetEcho.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetEcho/NetEcho.vcxproj
new file mode 100644
index 0000000..deb438a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetEcho/NetEcho.vcxproj
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{7228CB90-1ACE-43A3-A013-D437BF0E50F3}</ProjectGuid>
+ <RootNamespace>NetEcho</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)NetEcho.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)NetEcho.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)NetEcho.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Apps\NetEcho\NetEcho.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetGet/NetGet.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetGet/NetGet.vcxproj
new file mode 100644
index 0000000..075ce16
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetGet/NetGet.vcxproj
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{1A2D83FE-57D8-4EAB-9CEE-420E1F980489}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>NetGet</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Apps\NetGet\NetGet.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetPing/NetPing.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetPing/NetPing.vcxproj
new file mode 100644
index 0000000..cc722c1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetPing/NetPing.vcxproj
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{9C1CAC88-8D92-4743-8330-CE8E7836D3BF}</ProjectGuid>
+ <RootNamespace>NetPing</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)NetPing.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)NetPing.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)NetPing.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Apps\NetPing\NetPing.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetPump/NetPump.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetPump/NetPump.vcxproj
new file mode 100644
index 0000000..95d6076
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetPump/NetPump.vcxproj
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{0B04D92B-B644-4AED-90C6-A24303C78658}</ProjectGuid>
+ <RootNamespace>NetPump</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NPT_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)NetPump.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)NetPump.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)NetPump.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Apps\NetPump\NetPump.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetResolve/NetResolve.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetResolve/NetResolve.vcxproj
new file mode 100644
index 0000000..9b3ed44
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/NetResolve/NetResolve.vcxproj
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{62F20819-2CD5-463E-85E5-23C0466F05C2}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>NetResolve</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Apps\NetResolve\NetResolve.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/QueueTest1/QueueTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/QueueTest1/QueueTest1.vcxproj
new file mode 100644
index 0000000..77e595b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/QueueTest1/QueueTest1.vcxproj
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{63DE91B4-1F13-4A7B-B253-C6E365E0B3DB}</ProjectGuid>
+ <RootNamespace>QueueTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Queue1\QueueTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/RingBufferTest1/RingBufferTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/RingBufferTest1/RingBufferTest1.vcxproj
new file mode 100644
index 0000000..52af6a2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/RingBufferTest1/RingBufferTest1.vcxproj
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{59C1FCBE-7987-41F2-A0EB-E0114D5B2972}</ProjectGuid>
+ <RootNamespace>RingBufferTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)RingBufferTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)RingBufferTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)RingBufferTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\RingBuffer1\RingBufferTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/SharedVariables1/SharedVariables1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/SharedVariables1/SharedVariables1.vcxproj
new file mode 100644
index 0000000..7ac2d4f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/SharedVariables1/SharedVariables1.vcxproj
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8029AE79-A145-4A5C-8F0B-297B56BA9ACD}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>SharedVariables1</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\SharedVariables1\SharedVariablesTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/SocketsTest1/SocketsTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/SocketsTest1/SocketsTest1.vcxproj
new file mode 100644
index 0000000..83b4809
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/SocketsTest1/SocketsTest1.vcxproj
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{5335EB98-47F9-40EE-AB37-9BD8781A7BB2}</ProjectGuid>
+ <RootNamespace>SocketsTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Sockets1\SocketsTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/StringsTest1/StringsTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/StringsTest1/StringsTest1.vcxproj
new file mode 100644
index 0000000..b3f71ea
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/StringsTest1/StringsTest1.vcxproj
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{569179D6-7767-4840-9708-D1ADAFB012DB}</ProjectGuid>
+ <RootNamespace>StringsTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)StringsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)StringsTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)StringsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Strings1\StringsTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ThreadsTest1/ThreadsTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ThreadsTest1/ThreadsTest1.vcxproj
new file mode 100644
index 0000000..d6fbe40
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/ThreadsTest1/ThreadsTest1.vcxproj
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}</ProjectGuid>
+ <RootNamespace>ThreadsTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)ThreadsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)ThreadsTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)ThreadsTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Threads1\ThreadsTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/TimeTest1/TimeTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/TimeTest1/TimeTest1.vcxproj
new file mode 100644
index 0000000..a02204f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/TimeTest1/TimeTest1.vcxproj
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{4781266F-BA2E-4FEB-BBEA-C681ECF40840}</ProjectGuid>
+ <RootNamespace>TimeTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Time1\TimeTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/TlsTest1/TlsTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/TlsTest1/TlsTest1.vcxproj
new file mode 100644
index 0000000..a706f13
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/TlsTest1/TlsTest1.vcxproj
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{0948F98F-4FC8-423A-9F63-645EEB5D0947}</ProjectGuid>
+ <RootNamespace>TlsTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NPT_CONFIG_ENABLE_TLS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NPT_CONFIG_ENABLE_TLS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Tls1\TlsTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\Source\Tests\Tls1\TlsClientPrivate1.h" />
+ <ClInclude Include="..\..\..\..\Source\Tests\Tls1\TlsClientPrivate2.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/UdpTest1/UdpTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/UdpTest1/UdpTest1.vcxproj
new file mode 100644
index 0000000..a53a2c5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/UdpTest1/UdpTest1.vcxproj
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C025608F-9193-4040-B2F8-941746648CE2}</ProjectGuid>
+ <RootNamespace>UdpTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)UdpTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)UdpTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)UdpTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Udp1\UdpTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/UrlTest1/UrlTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/UrlTest1/UrlTest1.vcxproj
new file mode 100644
index 0000000..a098402
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/UrlTest1/UrlTest1.vcxproj
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{DBC6965C-D575-4DBC-9A0A-E6D9D9674282}</ProjectGuid>
+ <RootNamespace>UrlTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Url1\UrlTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/XmlTest1/XmlTest1.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/XmlTest1/XmlTest1.vcxproj
new file mode 100644
index 0000000..2529fe4
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/XmlTest1/XmlTest1.vcxproj
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{21C242CD-B371-4970-94BE-7ED2522872BA}</ProjectGuid>
+ <RootNamespace>XmlTest1</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NPT_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)XmlTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)XmlTest1.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)XmlTest1.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <TargetMachine>MachineX86</TargetMachine>
+ <Profile>false</Profile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Xml1\XmlTest1.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Tests\Xml1\XmlTest1Data.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\Source\Tests\Xml1\big.xml" />
+ <None Include="..\..\..\..\Source\Tests\Xml1\test.xml" />
+ <None Include="..\..\..\..\Source\Tests\Xml1\unicode.xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{12aff2e5-6d95-4809-9728-9551677c078a}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/axTLS/axTLS.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/axTLS/axTLS.vcxproj
new file mode 100644
index 0000000..9a35040
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-win32-vs2010/axTLS/axTLS.vcxproj
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{5A06F861-0EFF-417B-89C3-963A172CE6EE}</ProjectGuid>
+ <RootNamespace>axTLS</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </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>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>../../../../ThirdParty/axTLS/config/Win32;../../../../ThirdParty/axTLS/crypto;../../../../ThirdParty/axTLS/ssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>../../../../ThirdParty/axTLS/config/Win32;../../../../ThirdParty/axTLS/crypto;../../../../ThirdParty/axTLS/ssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\aes.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\asn1.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\bigint.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\crypto_misc.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\hmac.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\loader.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\md2.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\md5.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\p12.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\rc4.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\rsa.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\crypto\sha1.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\tls1.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\tls1_clnt.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\tls1_svr.c" />
+ <ClCompile Include="..\..\..\..\ThirdParty\axTLS\ssl\x509.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\config\config.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\crypto\crypto.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\ssl\os_port.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\ssl\ssl.h" />
+ <ClInclude Include="..\..\..\..\ThirdParty\axTLS\ssl\tls1.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune.sln b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune.sln
new file mode 100644
index 0000000..c5f09c0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune.sln
@@ -0,0 +1,52 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 11
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Neptune", "Neptune\Neptune.vcxproj", "{4D304D49-41F5-48C2-BC88-898AF70F421C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestShell", "TestShell\TestShell.vcxproj", "{1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|ARM = Release|ARM
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Debug|ARM.ActiveCfg = Debug|ARM
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Debug|ARM.Build.0 = Debug|ARM
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Debug|ARM.Deploy.0 = Debug|ARM
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Debug|Win32.Build.0 = Debug|Win32
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Debug|Win32.Deploy.0 = Debug|Win32
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Debug|x64.ActiveCfg = Debug|x64
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Debug|x64.Build.0 = Debug|x64
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Debug|x64.Deploy.0 = Debug|x64
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Release|ARM.ActiveCfg = Release|ARM
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Release|ARM.Build.0 = Release|ARM
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Release|ARM.Deploy.0 = Release|ARM
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Release|Win32.ActiveCfg = Release|Win32
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Release|Win32.Build.0 = Release|Win32
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Release|Win32.Deploy.0 = Release|Win32
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Release|x64.ActiveCfg = Release|x64
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Release|x64.Build.0 = Release|x64
+ {1F30AD3F-A41D-4580-B7CB-BD7A7C92DE5E}.Release|x64.Deploy.0 = Release|x64
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Debug|ARM.ActiveCfg = Debug|ARM
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Debug|ARM.Build.0 = Debug|ARM
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Debug|Win32.Build.0 = Debug|Win32
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Debug|x64.ActiveCfg = Debug|x64
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Debug|x64.Build.0 = Debug|x64
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Release|ARM.ActiveCfg = Release|ARM
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Release|ARM.Build.0 = Release|ARM
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Release|Win32.ActiveCfg = Release|Win32
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Release|Win32.Build.0 = Release|Win32
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Release|x64.ActiveCfg = Release|x64
+ {4D304D49-41F5-48C2-BC88-898AF70F421C}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune/Neptune.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune/Neptune.vcxproj
new file mode 100644
index 0000000..439d886
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune/Neptune.vcxproj
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <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|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</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>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Core\Neptune.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptBase64.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptBufferedStreams.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptCommon.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptConsole.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptCrypto.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptDataBuffer.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptDebug.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptDigest.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptDynamicLibraries.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptFile.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptHash.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptHttp.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptJson.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptList.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptLogging.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptMessaging.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptNetwork.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptQueue.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptResults.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptRingBuffer.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptSimpleMessageQueue.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptSockets.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptStreams.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptStrings.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptSystem.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptThreads.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptTime.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptTls.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptUri.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptUtils.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptXml.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Core\NptZip.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\StdC\NptStdcFile.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtConsole.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtDebug.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtEnvironment.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtFile.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtNetwork.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtPch.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtSockets.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtSystem.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtThreads.cpp" />
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtTime.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\Source\Core\Neptune.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptArray.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptAutoreleasePool.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptBase64.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptBufferedStreams.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptCommon.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptConfig.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptConsole.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptConstants.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptCrypto.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDataBuffer.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDebug.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDefs.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDigest.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDynamicCast.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptDynamicLibraries.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptFile.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptHash.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptHttp.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptInterfaces.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptJson.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptList.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptLogging.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptMap.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptMessaging.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptNetwork.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptQueue.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptReferences.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptResults.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptRingBuffer.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSelectableMessageQueue.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSerialPort.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSimpleMessageQueue.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSockets.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptStack.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptStreams.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptStrings.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptSystem.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptThreads.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptTime.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptTls.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptTlsDefaultTrustAnchorsBase.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptTlsDefaultTrustAnchorsExtended.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptTypes.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptUri.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptUtils.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptVersion.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptXml.h" />
+ <ClInclude Include="..\..\..\..\Source\Core\NptZip.h" />
+ <ClInclude Include="..\..\..\..\Source\System\WinRT\NptWinRtThreads.h" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and '$(VisualStudioVersion)' == ''">$(VCTargetsPath11)</VCTargetsPath>
+ <ProjectGuid>{4d304d49-41f5-48c2-bc88-898af70f421c}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <ProjectName>Neptune</ProjectName>
+ <RootNamespace>Neptune</RootNamespace>
+ <DefaultLanguage>en-US</DefaultLanguage>
+ <MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
+ <AppContainerApplication>true</AppContainerApplication>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <GenerateManifest>false</GenerateManifest>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <CompileAsWinRT>true</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ <PrecompiledHeaderFile />
+ <PrecompiledHeaderOutputFile />
+ <AdditionalIncludeDirectories>$(ProjectDir);$(IntDir);%(AdditionalIncludeDirectories);..\..\..\..\Source\Core</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_UNICODE;UNICODE;NPT_CONFIG_ENABLE_LOGGING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <CompileAsWinRT>true</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ <PrecompiledHeaderFile />
+ <PrecompiledHeaderOutputFile />
+ <AdditionalIncludeDirectories>$(ProjectDir);$(IntDir);%(AdditionalIncludeDirectories);..\..\..\..\Source\Core</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_UNICODE;UNICODE;NPT_CONFIG_ENABLE_LOGGING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|arm'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <CompileAsWinRT>true</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>_UNICODE;UNICODE;NPT_CONFIG_ENABLE_LOGGING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(IntDir);%(AdditionalIncludeDirectories);..\..\..\..\Source\Core</AdditionalIncludeDirectories>
+ <EnablePREfast>true</EnablePREfast>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|arm'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <CompileAsWinRT>true</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>_UNICODE;UNICODE;NPT_CONFIG_ENABLE_LOGGING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(IntDir);%(AdditionalIncludeDirectories);..\..\..\..\Source\Core</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <CompileAsWinRT>true</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>_UNICODE;UNICODE;NPT_CONFIG_ENABLE_LOGGING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(IntDir);%(AdditionalIncludeDirectories);..\..\..\..\Source\Core</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <CompileAsWinRT>true</CompileAsWinRT>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>_UNICODE;UNICODE;NPT_CONFIG_ENABLE_LOGGING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>$(ProjectDir);$(IntDir);%(AdditionalIncludeDirectories);..\..\..\..\Source\Core</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune/Neptune.vcxproj.filters b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune/Neptune.vcxproj.filters
new file mode 100644
index 0000000..93614e9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/Neptune/Neptune.vcxproj.filters
@@ -0,0 +1,296 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source">
+ <UniqueIdentifier>{65ac2d3a-344a-46d6-9bea-4714722d8eed}</UniqueIdentifier>
+ <Extensions>cpp</Extensions>
+ </Filter>
+ <Filter Include="Headers">
+ <UniqueIdentifier>{9c12afd5-cd4a-4ea7-a966-4313de5fa803}</UniqueIdentifier>
+ <Extensions>h</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Core\Neptune.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptBase64.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptBufferedStreams.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptCommon.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptConsole.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptCrypto.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptDataBuffer.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptDebug.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptDigest.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptDynamicLibraries.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptFile.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptHash.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptHttp.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptJson.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptList.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptLogging.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptMessaging.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptNetwork.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptQueue.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptResults.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptRingBuffer.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptSimpleMessageQueue.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptSockets.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptStreams.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptStrings.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptSystem.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptThreads.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptTime.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptTls.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptUri.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptUtils.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptXml.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Core\NptZip.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtConsole.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtDebug.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtEnvironment.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtFile.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtNetwork.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtPch.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtSockets.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtSystem.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtThreads.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\System\WinRT\NptWinRtTime.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\Source\Core\Neptune.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptArray.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptAutoreleasePool.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptBase64.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptBufferedStreams.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptCommon.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptConfig.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptConsole.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptConstants.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptCrypto.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptDataBuffer.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptDebug.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptDefs.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptDigest.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptDynamicCast.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptDynamicLibraries.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptFile.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptHash.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptHttp.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptInterfaces.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptJson.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptList.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptLogging.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptMap.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptMessaging.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptNetwork.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptQueue.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptReferences.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptResults.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptRingBuffer.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptSelectableMessageQueue.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptSerialPort.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptSimpleMessageQueue.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptSockets.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptStack.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptStreams.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptStrings.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptSystem.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptThreads.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptTime.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptTls.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptTlsDefaultTrustAnchorsBase.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptTlsDefaultTrustAnchorsExtended.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptTypes.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptUri.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptUtils.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptVersion.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptXml.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\Core\NptZip.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\Source\System\WinRT\NptWinRtThreads.h">
+ <Filter>Headers</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml
new file mode 100644
index 0000000..9a9f7c1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml
@@ -0,0 +1,20 @@
+<Application
+ x:Class="TestShell.App"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:local="using:TestShell">
+
+ <Application.Resources>
+ <ResourceDictionary>
+ <ResourceDictionary.MergedDictionaries>
+
+ <!--
+ Styles that define common aspects of the platform look and feel
+ Required by Visual Studio project and item templates
+ -->
+ <ResourceDictionary Source="Common/StandardStyles.xaml"/>
+ </ResourceDictionary.MergedDictionaries>
+
+ </ResourceDictionary>
+ </Application.Resources>
+</Application>
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml.cpp b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml.cpp
new file mode 100644
index 0000000..3cca6d8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml.cpp
@@ -0,0 +1,83 @@
+//
+// App.xaml.cpp
+// Implementation of the App class.
+//
+
+#include "pch.h"
+#include "MainPage.xaml.h"
+
+using namespace TestShell;
+
+using namespace Platform;
+using namespace Windows::ApplicationModel;
+using namespace Windows::ApplicationModel::Activation;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls;
+using namespace Windows::UI::Xaml::Controls::Primitives;
+using namespace Windows::UI::Xaml::Data;
+using namespace Windows::UI::Xaml::Input;
+using namespace Windows::UI::Xaml::Interop;
+using namespace Windows::UI::Xaml::Media;
+using namespace Windows::UI::Xaml::Navigation;
+
+// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227
+
+/// <summary>
+/// Initializes the singleton application object. This is the first line of authored code
+/// executed, and as such is the logical equivalent of main() or WinMain().
+/// </summary>
+App::App()
+{
+ InitializeComponent();
+ Suspending += ref new SuspendingEventHandler(this, &App::OnSuspending);
+}
+
+/// <summary>
+/// Invoked when the application is launched normally by the end user. Other entry points
+/// will be used when the application is launched to open a specific file, to display
+/// search results, and so forth.
+/// </summary>
+/// <param name="pArgs">Details about the launch request and process.</param>
+void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ pArgs)
+{
+ // Do not repeat app initialization when already running, just ensure that
+ // the window is active
+ if (pArgs->PreviousExecutionState == ApplicationExecutionState::Running)
+ {
+ Window::Current->Activate();
+ return;
+ }
+
+ if (pArgs->PreviousExecutionState == ApplicationExecutionState::Terminated)
+ {
+ //TODO: Load state from previously suspended application
+ }
+
+ // Create a Frame to act navigation context and navigate to the first page
+ auto rootFrame = ref new Frame();
+ if (!rootFrame->Navigate(TypeName(MainPage::typeid)))
+ {
+ throw ref new FailureException("Failed to create initial page");
+ }
+
+ // Place the frame in the current Window and ensure that it is active
+ Window::Current->Content = rootFrame;
+ Window::Current->Activate();
+}
+
+/// <summary>
+/// Invoked when application execution is being suspended. Application state is saved
+/// without knowing whether the application will be terminated or resumed with the contents
+/// of memory still intact.
+/// </summary>
+/// <param name="sender">The source of the suspend request.</param>
+/// <param name="e">Details about the suspend request.</param>
+void App::OnSuspending(Object^ sender, SuspendingEventArgs^ e)
+{
+ (void) sender; // Unused parameter
+ (void) e; // Unused parameter
+
+ //TODO: Save application state and stop any background activity
+}
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml.h b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml.h
new file mode 100644
index 0000000..2c5da81
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/App.xaml.h
@@ -0,0 +1,24 @@
+//
+// App.xaml.h
+// Declaration of the App class.
+//
+
+#pragma once
+
+#include "App.g.h"
+
+namespace TestShell
+{
+ /// <summary>
+ /// Provides application-specific behavior to supplement the default Application class.
+ /// </summary>
+ ref class App sealed
+ {
+ public:
+ App();
+ virtual void OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ pArgs) override;
+
+ private:
+ void OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ e);
+ };
+}
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/Logo.png b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/Logo.png
new file mode 100644
index 0000000..e26771c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/Logo.png
Binary files differ
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/SmallLogo.png b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/SmallLogo.png
new file mode 100644
index 0000000..1eb0d9d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/SmallLogo.png
Binary files differ
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/SplashScreen.png b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/SplashScreen.png
new file mode 100644
index 0000000..c951e03
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/SplashScreen.png
Binary files differ
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/StoreLogo.png b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/StoreLogo.png
new file mode 100644
index 0000000..dcb6727
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Assets/StoreLogo.png
Binary files differ
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Common/StandardStyles.xaml b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Common/StandardStyles.xaml
new file mode 100644
index 0000000..81fb398
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Common/StandardStyles.xaml
@@ -0,0 +1,1007 @@
+<!--
+ This file contains XAML styles that simplify application development.
+
+ These are not merely convenient, but are required by most Visual Studio project and item templates.
+ Removing, renaming, or otherwise modifying the content of these files may result in a project that
+ does not build, or that will not build once additional pages are added. If variations on these
+ styles are desired it is recommended that you copy the content under a new name and modify your
+ private copy.
+-->
+
+<ResourceDictionary
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+
+ <!-- Non-brush values that vary across themes -->
+
+ <ResourceDictionary.ThemeDictionaries>
+ <ResourceDictionary x:Key="Default">
+ <x:String x:Key="BackButtonGlyph">&#xE071;</x:String>
+ <x:String x:Key="BackButtonSnappedGlyph">&#xE0BA;</x:String>
+ </ResourceDictionary>
+
+ <ResourceDictionary x:Key="HighContrast">
+ <x:String x:Key="BackButtonGlyph">&#xE0A6;</x:String>
+ <x:String x:Key="BackButtonSnappedGlyph">&#xE0C4;</x:String>
+ </ResourceDictionary>
+ </ResourceDictionary.ThemeDictionaries>
+
+ <!-- RichTextBlock styles -->
+
+ <Style x:Key="BasicRichTextStyle" TargetType="RichTextBlock">
+ <Setter Property="Foreground" Value="{StaticResource ApplicationForegroundThemeBrush}"/>
+ <Setter Property="FontSize" Value="{StaticResource ControlContentThemeFontSize}"/>
+ <Setter Property="FontFamily" Value="{StaticResource ContentControlThemeFontFamily}"/>
+ <Setter Property="TextTrimming" Value="WordEllipsis"/>
+ <Setter Property="TextWrapping" Value="Wrap"/>
+ <Setter Property="Typography.StylisticSet20" Value="True"/>
+ <Setter Property="Typography.DiscretionaryLigatures" Value="True"/>
+ <Setter Property="Typography.CaseSensitiveForms" Value="True"/>
+ </Style>
+
+ <Style x:Key="BaselineRichTextStyle" TargetType="RichTextBlock" BasedOn="{StaticResource BasicRichTextStyle}">
+ <Setter Property="LineHeight" Value="20"/>
+ <Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
+ <!-- Properly align text along its baseline -->
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <TranslateTransform X="-1" Y="4"/>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style x:Key="ItemRichTextStyle" TargetType="RichTextBlock" BasedOn="{StaticResource BaselineRichTextStyle}"/>
+
+ <Style x:Key="BodyRichTextStyle" TargetType="RichTextBlock" BasedOn="{StaticResource BaselineRichTextStyle}">
+ <Setter Property="FontWeight" Value="SemiLight"/>
+ </Style>
+
+ <!-- TextBlock styles -->
+
+ <Style x:Key="BasicTextStyle" TargetType="TextBlock">
+ <Setter Property="Foreground" Value="{StaticResource ApplicationForegroundThemeBrush}"/>
+ <Setter Property="FontSize" Value="{StaticResource ControlContentThemeFontSize}"/>
+ <Setter Property="FontFamily" Value="{StaticResource ContentControlThemeFontFamily}"/>
+ <Setter Property="TextTrimming" Value="WordEllipsis"/>
+ <Setter Property="TextWrapping" Value="Wrap"/>
+ <Setter Property="Typography.StylisticSet20" Value="True"/>
+ <Setter Property="Typography.DiscretionaryLigatures" Value="True"/>
+ <Setter Property="Typography.CaseSensitiveForms" Value="True"/>
+ </Style>
+
+ <Style x:Key="BaselineTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BasicTextStyle}">
+ <Setter Property="LineHeight" Value="20"/>
+ <Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
+ <!-- Properly align text along its baseline -->
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <TranslateTransform X="-1" Y="4"/>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style x:Key="HeaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+ <Setter Property="FontSize" Value="56"/>
+ <Setter Property="FontWeight" Value="Light"/>
+ <Setter Property="LineHeight" Value="40"/>
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <TranslateTransform X="-2" Y="8"/>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style x:Key="SubheaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+ <Setter Property="FontSize" Value="26.667"/>
+ <Setter Property="FontWeight" Value="Light"/>
+ <Setter Property="LineHeight" Value="30"/>
+ <Setter Property="RenderTransform">
+ <Setter.Value>
+ <TranslateTransform X="-1" Y="6"/>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <Style x:Key="TitleTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+ <Setter Property="FontWeight" Value="SemiBold"/>
+ </Style>
+
+ <Style x:Key="ItemTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}"/>
+
+ <Style x:Key="BodyTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+ <Setter Property="FontWeight" Value="SemiLight"/>
+ </Style>
+
+ <Style x:Key="CaptionTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+ <Setter Property="FontSize" Value="12"/>
+ <Setter Property="Foreground" Value="{StaticResource ApplicationSecondaryForegroundThemeBrush}"/>
+ </Style>
+
+ <!-- Button styles -->
+
+ <!--
+ TextButtonStyle is used to style a Button using subheader-styled text with no other adornment. This
+ style is used in the GroupedItemsPage as a group header and in the FileOpenPickerPage for triggering
+ commands.
+ -->
+ <Style x:Key="TextButtonStyle" TargetType="Button">
+ <Setter Property="MinWidth" Value="0"/>
+ <Setter Property="MinHeight" Value="0"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Button">
+ <Grid Background="Transparent">
+ <TextBlock
+ x:Name="Text"
+ Text="{TemplateBinding Content}"
+ Margin="3,-7,3,10"
+ TextWrapping="NoWrap"
+ Style="{StaticResource SubheaderTextStyle}"/>
+ <Rectangle
+ x:Name="FocusVisualWhite"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="1.5"/>
+ <Rectangle
+ x:Name="FocusVisualBlack"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="0.5"/>
+
+ <VisualStateManager.VisualStateGroups>
+ <VisualStateGroup x:Name="CommonStates">
+ <VisualState x:Name="Normal"/>
+ <VisualState x:Name="PointerOver">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPointerOverForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Pressed">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPressedForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Disabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonDisabledForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="FocusStates">
+ <VisualState x:Name="Focused">
+ <Storyboard>
+ <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualWhite" Storyboard.TargetProperty="Opacity"/>
+ <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualBlack" Storyboard.TargetProperty="Opacity"/>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Unfocused"/>
+ </VisualStateGroup>
+ </VisualStateManager.VisualStateGroups>
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <!--
+ TextRadioButtonStyle is used to style a RadioButton using subheader-styled text with no other adornment.
+ This style is used in the SearchResultsPage to allow selection among filters.
+ -->
+ <Style x:Key="TextRadioButtonStyle" TargetType="RadioButton">
+ <Setter Property="MinWidth" Value="0"/>
+ <Setter Property="MinHeight" Value="0"/>
+ <Setter Property="Margin" Value="0,0,30,0"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="RadioButton">
+ <Grid Background="Transparent">
+ <TextBlock
+ x:Name="Text"
+ Text="{TemplateBinding Content}"
+ Margin="3,-7,3,10"
+ TextWrapping="NoWrap"
+ Style="{StaticResource SubheaderTextStyle}"/>
+ <Rectangle
+ x:Name="FocusVisualWhite"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="1.5"/>
+ <Rectangle
+ x:Name="FocusVisualBlack"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="0.5"/>
+
+ <VisualStateManager.VisualStateGroups>
+ <VisualStateGroup x:Name="CommonStates">
+ <VisualState x:Name="Normal"/>
+ <VisualState x:Name="PointerOver">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPointerOverForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Pressed">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPressedForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Disabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonDisabledForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="FocusStates">
+ <VisualState x:Name="Focused">
+ <Storyboard>
+ <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualWhite" Storyboard.TargetProperty="Opacity"/>
+ <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualBlack" Storyboard.TargetProperty="Opacity"/>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Unfocused"/>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="CheckStates">
+ <VisualState x:Name="Checked"/>
+ <VisualState x:Name="Unchecked">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationSecondaryForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Indeterminate"/>
+ </VisualStateGroup>
+ </VisualStateManager.VisualStateGroups>
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <!--
+ AppBarButtonStyle is used to style a Button for use in an App Bar. Content will be centered and should fit within
+ the 40-pixel radius glyph provided. 16-point Segoe UI Symbol is used for content text to simplify the use of glyphs
+ from that font. AutomationProperties.Name is used for the text below the glyph.
+ -->
+ <Style x:Key="AppBarButtonStyle" TargetType="Button">
+ <Setter Property="Foreground" Value="{StaticResource AppBarItemForegroundThemeBrush}"/>
+ <Setter Property="VerticalAlignment" Value="Stretch"/>
+ <Setter Property="FontFamily" Value="Segoe UI Symbol"/>
+ <Setter Property="FontWeight" Value="Normal"/>
+ <Setter Property="FontSize" Value="20"/>
+ <Setter Property="AutomationProperties.ItemType" Value="App Bar Button"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Button">
+ <Grid x:Name="RootGrid" Width="100" Background="Transparent">
+ <StackPanel VerticalAlignment="Top" Margin="0,12,0,11">
+ <Grid Width="40" Height="40" Margin="0,0,0,5" HorizontalAlignment="Center">
+ <TextBlock x:Name="BackgroundGlyph" Text="&#xE0A8;" FontFamily="Segoe UI Symbol" FontSize="53.333" Margin="-4,-19,0,0" Foreground="{StaticResource AppBarItemBackgroundThemeBrush}"/>
+ <TextBlock x:Name="OutlineGlyph" Text="&#xE0A7;" FontFamily="Segoe UI Symbol" FontSize="53.333" Margin="-4,-19,0,0"/>
+ <ContentPresenter x:Name="Content" HorizontalAlignment="Center" Margin="-1,-1,0,0" VerticalAlignment="Center"/>
+ </Grid>
+ <TextBlock
+ x:Name="TextLabel"
+ Text="{TemplateBinding AutomationProperties.Name}"
+ Foreground="{StaticResource AppBarItemForegroundThemeBrush}"
+ Margin="0,0,2,0"
+ FontSize="12"
+ TextAlignment="Center"
+ Width="88"
+ MaxHeight="32"
+ TextTrimming="WordEllipsis"
+ Style="{StaticResource BasicTextStyle}"/>
+ </StackPanel>
+ <Rectangle
+ x:Name="FocusVisualWhite"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="1.5"/>
+ <Rectangle
+ x:Name="FocusVisualBlack"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="0.5"/>
+
+ <VisualStateManager.VisualStateGroups>
+ <VisualStateGroup x:Name="ApplicationViewStates">
+ <VisualState x:Name="FullScreenLandscape"/>
+ <VisualState x:Name="Filled"/>
+ <VisualState x:Name="FullScreenPortrait">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="Visibility">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootGrid" Storyboard.TargetProperty="Width">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="60"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Snapped">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="Visibility">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootGrid" Storyboard.TargetProperty="Width">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="60"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="CommonStates">
+ <VisualState x:Name="Normal"/>
+ <VisualState x:Name="PointerOver">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemPointerOverBackgroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Content" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemPointerOverForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Pressed">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="OutlineGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Content" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemPressedForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Disabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="OutlineGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemDisabledForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Content" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemDisabledForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemDisabledForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="FocusStates">
+ <VisualState x:Name="Focused">
+ <Storyboard>
+ <DoubleAnimation
+ Storyboard.TargetName="FocusVisualWhite"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0"/>
+ <DoubleAnimation
+ Storyboard.TargetName="FocusVisualBlack"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0"/>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Unfocused" />
+ <VisualState x:Name="PointerFocused" />
+ </VisualStateGroup>
+ </VisualStateManager.VisualStateGroups>
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <!-- Standard App Bar buttons -->
+
+ <Style x:Key="SkipBackAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="SkipBackAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Skip Back"/>
+ <Setter Property="Content" Value="&#xE100;"/>
+ </Style>
+ <Style x:Key="SkipAheadAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="SkipAheadAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Skip Ahead"/>
+ <Setter Property="Content" Value="&#xE101;"/>
+ </Style>
+ <Style x:Key="PlayAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="PlayAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Play"/>
+ <Setter Property="Content" Value="&#xE102;"/>
+ </Style>
+ <Style x:Key="PauseAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="PauseAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Pause"/>
+ <Setter Property="Content" Value="&#xE103;"/>
+ </Style>
+ <Style x:Key="EditAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="EditAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Edit"/>
+ <Setter Property="Content" Value="&#xE104;"/>
+ </Style>
+ <Style x:Key="SaveAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="SaveAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Save"/>
+ <Setter Property="Content" Value="&#xE105;"/>
+ </Style>
+ <Style x:Key="DeleteAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="DeleteAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Delete"/>
+ <Setter Property="Content" Value="&#xE106;"/>
+ </Style>
+ <Style x:Key="DiscardAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="DiscardAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Discard"/>
+ <Setter Property="Content" Value="&#xE107;"/>
+ </Style>
+ <Style x:Key="RemoveAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="RemoveAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Remove"/>
+ <Setter Property="Content" Value="&#xE108;"/>
+ </Style>
+ <Style x:Key="AddAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="AddAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Add"/>
+ <Setter Property="Content" Value="&#xE109;"/>
+ </Style>
+ <Style x:Key="NoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="NoAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="No"/>
+ <Setter Property="Content" Value="&#xE10A;"/>
+ </Style>
+ <Style x:Key="YesAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="YesAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Yes"/>
+ <Setter Property="Content" Value="&#xE10B;"/>
+ </Style>
+ <Style x:Key="MoreAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="MoreAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="More"/>
+ <Setter Property="Content" Value="&#xE10C;"/>
+ </Style>
+ <Style x:Key="RedoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="RedoAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Redo"/>
+ <Setter Property="Content" Value="&#xE10D;"/>
+ </Style>
+ <Style x:Key="UndoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="UndoAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Undo"/>
+ <Setter Property="Content" Value="&#xE10E;"/>
+ </Style>
+ <Style x:Key="HomeAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="HomeAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Home"/>
+ <Setter Property="Content" Value="&#xE10F;"/>
+ </Style>
+ <Style x:Key="OutAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="OutAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Out"/>
+ <Setter Property="Content" Value="&#xE110;"/>
+ </Style>
+ <Style x:Key="NextAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="NextAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Next"/>
+ <Setter Property="Content" Value="&#xE111;"/>
+ </Style>
+ <Style x:Key="PreviousAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="PreviousAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Previous"/>
+ <Setter Property="Content" Value="&#xE112;"/>
+ </Style>
+ <Style x:Key="FavoriteAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="FavoriteAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Favorite"/>
+ <Setter Property="Content" Value="&#xE113;"/>
+ </Style>
+ <Style x:Key="PhotoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="PhotoAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Photo"/>
+ <Setter Property="Content" Value="&#xE114;"/>
+ </Style>
+ <Style x:Key="SettingsAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="SettingsAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Settings"/>
+ <Setter Property="Content" Value="&#xE115;"/>
+ </Style>
+ <Style x:Key="VideoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="VideoAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Video"/>
+ <Setter Property="Content" Value="&#xE116;"/>
+ </Style>
+ <Style x:Key="RefreshAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="RefreshAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Refresh"/>
+ <Setter Property="Content" Value="&#xE117;"/>
+ </Style>
+ <Style x:Key="DownloadAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="DownloadAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Download"/>
+ <Setter Property="Content" Value="&#xE118;"/>
+ </Style>
+ <Style x:Key="MailAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="MailAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Mail"/>
+ <Setter Property="Content" Value="&#xE119;"/>
+ </Style>
+ <Style x:Key="SearchAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="SearchAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Search"/>
+ <Setter Property="Content" Value="&#xE11A;"/>
+ </Style>
+ <Style x:Key="HelpAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="HelpAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Help"/>
+ <Setter Property="Content" Value="&#xE11B;"/>
+ </Style>
+ <Style x:Key="UploadAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="UploadAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Upload"/>
+ <Setter Property="Content" Value="&#xE11C;"/>
+ </Style>
+ <Style x:Key="PinAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="PinAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Pin"/>
+ <Setter Property="Content" Value="&#xE141;"/>
+ </Style>
+ <Style x:Key="UnpinAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+ <Setter Property="AutomationProperties.AutomationId" Value="UnpinAppBarButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Unpin"/>
+ <Setter Property="Content" Value="&#xE196;"/>
+ </Style>
+
+ <!-- Title area styles -->
+
+ <Style x:Key="PageHeaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource HeaderTextStyle}">
+ <Setter Property="TextWrapping" Value="NoWrap"/>
+ <Setter Property="VerticalAlignment" Value="Bottom"/>
+ <Setter Property="Margin" Value="0,0,30,40"/>
+ </Style>
+
+ <Style x:Key="PageSubheaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource SubheaderTextStyle}">
+ <Setter Property="TextWrapping" Value="NoWrap"/>
+ <Setter Property="VerticalAlignment" Value="Bottom"/>
+ <Setter Property="Margin" Value="0,0,0,40"/>
+ </Style>
+
+ <Style x:Key="SnappedPageHeaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource PageSubheaderTextStyle}">
+ <Setter Property="Margin" Value="0,0,18,40"/>
+ </Style>
+
+ <!--
+ BackButtonStyle is used to style a Button for use in the title area of a page. Margins appropriate for
+ the conventional page layout are included as part of the style.
+ -->
+ <Style x:Key="BackButtonStyle" TargetType="Button">
+ <Setter Property="MinWidth" Value="0"/>
+ <Setter Property="Width" Value="48"/>
+ <Setter Property="Height" Value="48"/>
+ <Setter Property="Margin" Value="36,0,36,36"/>
+ <Setter Property="VerticalAlignment" Value="Bottom"/>
+ <Setter Property="FontFamily" Value="Segoe UI Symbol"/>
+ <Setter Property="FontWeight" Value="Normal"/>
+ <Setter Property="FontSize" Value="56"/>
+ <Setter Property="AutomationProperties.AutomationId" Value="BackButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Back"/>
+ <Setter Property="AutomationProperties.ItemType" Value="Navigation Button"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Button">
+ <Grid x:Name="RootGrid">
+ <Grid Margin="-1,-16,0,0">
+ <TextBlock x:Name="BackgroundGlyph" Text="&#xE0A8;" Foreground="{StaticResource BackButtonBackgroundThemeBrush}"/>
+ <TextBlock x:Name="NormalGlyph" Text="{StaticResource BackButtonGlyph}" Foreground="{StaticResource BackButtonForegroundThemeBrush}"/>
+ <TextBlock x:Name="ArrowGlyph" Text="&#xE0A6;" Foreground="{StaticResource BackButtonPressedForegroundThemeBrush}" Opacity="0"/>
+ </Grid>
+ <Rectangle
+ x:Name="FocusVisualWhite"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="1.5"/>
+ <Rectangle
+ x:Name="FocusVisualBlack"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="0.5"/>
+
+ <VisualStateManager.VisualStateGroups>
+ <VisualStateGroup x:Name="CommonStates">
+ <VisualState x:Name="Normal" />
+ <VisualState x:Name="PointerOver">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonPointerOverBackgroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonPointerOverForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Pressed">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <DoubleAnimation
+ Storyboard.TargetName="ArrowGlyph"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0"/>
+ <DoubleAnimation
+ Storyboard.TargetName="NormalGlyph"
+ Storyboard.TargetProperty="Opacity"
+ To="0"
+ Duration="0"/>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Disabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootGrid" Storyboard.TargetProperty="Visibility">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="FocusStates">
+ <VisualState x:Name="Focused">
+ <Storyboard>
+ <DoubleAnimation
+ Storyboard.TargetName="FocusVisualWhite"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0"/>
+ <DoubleAnimation
+ Storyboard.TargetName="FocusVisualBlack"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0"/>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Unfocused" />
+ <VisualState x:Name="PointerFocused" />
+ </VisualStateGroup>
+ </VisualStateManager.VisualStateGroups>
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <!--
+ PortraitBackButtonStyle is used to style a Button for use in the title area of a portrait page. Margins appropriate
+ for the conventional page layout are included as part of the style.
+ -->
+ <Style x:Key="PortraitBackButtonStyle" TargetType="Button" BasedOn="{StaticResource BackButtonStyle}">
+ <Setter Property="Margin" Value="26,0,26,36"/>
+ </Style>
+
+ <!--
+ SnappedBackButtonStyle is used to style a Button for use in the title area of a snapped page. Margins appropriate
+ for the conventional page layout are included as part of the style.
+
+ The obvious duplication here is necessary as the glyphs used in snapped are not merely smaller versions of the same
+ glyph but are actually distinct.
+ -->
+ <Style x:Key="SnappedBackButtonStyle" TargetType="Button">
+ <Setter Property="MinWidth" Value="0"/>
+ <Setter Property="Margin" Value="20,0,0,0"/>
+ <Setter Property="VerticalAlignment" Value="Bottom"/>
+ <Setter Property="FontFamily" Value="Segoe UI Symbol"/>
+ <Setter Property="FontWeight" Value="Normal"/>
+ <Setter Property="FontSize" Value="26.66667"/>
+ <Setter Property="AutomationProperties.AutomationId" Value="BackButton"/>
+ <Setter Property="AutomationProperties.Name" Value="Back"/>
+ <Setter Property="AutomationProperties.ItemType" Value="Navigation Button"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Button">
+ <Grid x:Name="RootGrid" Width="36" Height="36" Margin="-3,0,7,33">
+ <Grid Margin="-1,-1,0,0">
+ <TextBlock x:Name="BackgroundGlyph" Text="&#xE0D4;" Foreground="{StaticResource BackButtonBackgroundThemeBrush}"/>
+ <TextBlock x:Name="NormalGlyph" Text="{StaticResource BackButtonSnappedGlyph}" Foreground="{StaticResource BackButtonForegroundThemeBrush}"/>
+ <TextBlock x:Name="ArrowGlyph" Text="&#xE0C4;" Foreground="{StaticResource BackButtonPressedForegroundThemeBrush}" Opacity="0"/>
+ </Grid>
+ <Rectangle
+ x:Name="FocusVisualWhite"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="1.5"/>
+ <Rectangle
+ x:Name="FocusVisualBlack"
+ IsHitTestVisible="False"
+ Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}"
+ StrokeEndLineCap="Square"
+ StrokeDashArray="1,1"
+ Opacity="0"
+ StrokeDashOffset="0.5"/>
+
+ <VisualStateManager.VisualStateGroups>
+ <VisualStateGroup x:Name="CommonStates">
+ <VisualState x:Name="Normal" />
+ <VisualState x:Name="PointerOver">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonPointerOverBackgroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonPointerOverForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Pressed">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonForegroundThemeBrush}"/>
+ </ObjectAnimationUsingKeyFrames>
+ <DoubleAnimation
+ Storyboard.TargetName="ArrowGlyph"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0"/>
+ <DoubleAnimation
+ Storyboard.TargetName="NormalGlyph"
+ Storyboard.TargetProperty="Opacity"
+ To="0"
+ Duration="0"/>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Disabled">
+ <Storyboard>
+ <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootGrid" Storyboard.TargetProperty="Visibility">
+ <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
+ </ObjectAnimationUsingKeyFrames>
+ </Storyboard>
+ </VisualState>
+ </VisualStateGroup>
+ <VisualStateGroup x:Name="FocusStates">
+ <VisualState x:Name="Focused">
+ <Storyboard>
+ <DoubleAnimation
+ Storyboard.TargetName="FocusVisualWhite"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0"/>
+ <DoubleAnimation
+ Storyboard.TargetName="FocusVisualBlack"
+ Storyboard.TargetProperty="Opacity"
+ To="1"
+ Duration="0"/>
+ </Storyboard>
+ </VisualState>
+ <VisualState x:Name="Unfocused" />
+ <VisualState x:Name="PointerFocused" />
+ </VisualStateGroup>
+ </VisualStateManager.VisualStateGroups>
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <!-- Item templates -->
+
+ <!-- Grid-appropriate 250 pixel square item template as seen in the GroupedItemsPage and ItemsPage -->
+ <DataTemplate x:Key="Standard250x250ItemTemplate">
+ <Grid HorizontalAlignment="Left" Width="250" Height="250">
+ <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}">
+ <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+ </Border>
+ <StackPanel VerticalAlignment="Bottom" Background="{StaticResource ListViewItemOverlayBackgroundThemeBrush}">
+ <TextBlock Text="{Binding Title}" Foreground="{StaticResource ListViewItemOverlayForegroundThemeBrush}" Style="{StaticResource TitleTextStyle}" Height="60" Margin="15,0,15,0"/>
+ <TextBlock Text="{Binding Subtitle}" Foreground="{StaticResource ListViewItemOverlaySecondaryForegroundThemeBrush}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap" Margin="15,0,15,10"/>
+ </StackPanel>
+ </Grid>
+ </DataTemplate>
+
+ <!-- Grid-appropriate 500 by 130 pixel item template as seen in the GroupDetailPage -->
+ <DataTemplate x:Key="Standard500x130ItemTemplate">
+ <Grid Height="110" Width="480" Margin="10">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto"/>
+ <ColumnDefinition Width="*"/>
+ </Grid.ColumnDefinitions>
+ <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}" Width="110" Height="110">
+ <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+ </Border>
+ <StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="10,0,0,0">
+ <TextBlock Text="{Binding Title}" Style="{StaticResource TitleTextStyle}" TextWrapping="NoWrap"/>
+ <TextBlock Text="{Binding Subtitle}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap"/>
+ <TextBlock Text="{Binding Description}" Style="{StaticResource BodyTextStyle}" MaxHeight="60"/>
+ </StackPanel>
+ </Grid>
+ </DataTemplate>
+
+ <!-- List-appropriate 130 pixel high item template as seen in the SplitPage -->
+ <DataTemplate x:Key="Standard130ItemTemplate">
+ <Grid Height="110" Margin="6">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto"/>
+ <ColumnDefinition Width="*"/>
+ </Grid.ColumnDefinitions>
+ <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}" Width="110" Height="110">
+ <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+ </Border>
+ <StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="10,0,0,0">
+ <TextBlock Text="{Binding Title}" Style="{StaticResource TitleTextStyle}" TextWrapping="NoWrap"/>
+ <TextBlock Text="{Binding Subtitle}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap"/>
+ <TextBlock Text="{Binding Description}" Style="{StaticResource BodyTextStyle}" MaxHeight="60"/>
+ </StackPanel>
+ </Grid>
+ </DataTemplate>
+
+ <!--
+ List-appropriate 80 pixel high item template as seen in the SplitPage when Filled, and
+ the following pages when snapped: GroupedItemsPage, GroupDetailPage, and ItemsPage
+ -->
+ <DataTemplate x:Key="Standard80ItemTemplate">
+ <Grid Margin="6">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto"/>
+ <ColumnDefinition Width="*"/>
+ </Grid.ColumnDefinitions>
+ <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}" Width="60" Height="60">
+ <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+ </Border>
+ <StackPanel Grid.Column="1" Margin="10,0,0,0">
+ <TextBlock Text="{Binding Title}" Style="{StaticResource ItemTextStyle}" MaxHeight="40"/>
+ <TextBlock Text="{Binding Subtitle}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap"/>
+ </StackPanel>
+ </Grid>
+ </DataTemplate>
+
+ <!-- Grid-appropriate 300 by 70 pixel item template as seen in the SearchResultsPage -->
+ <DataTemplate x:Key="StandardSmallIcon300x70ItemTemplate">
+ <Grid Width="294" Margin="6">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto"/>
+ <ColumnDefinition Width="*"/>
+ </Grid.ColumnDefinitions>
+ <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}" Margin="0,0,0,10" Width="40" Height="40">
+ <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+ </Border>
+ <StackPanel Grid.Column="1" Margin="10,-10,0,0">
+ <TextBlock Text="{Binding Title}" Style="{StaticResource BodyTextStyle}" TextWrapping="NoWrap"/>
+ <TextBlock Text="{Binding Subtitle}" Style="{StaticResource BodyTextStyle}" Foreground="{StaticResource ApplicationSecondaryForegroundThemeBrush}" TextWrapping="NoWrap"/>
+ <TextBlock Text="{Binding Description}" Style="{StaticResource BodyTextStyle}" Foreground="{StaticResource ApplicationSecondaryForegroundThemeBrush}" TextWrapping="NoWrap"/>
+ </StackPanel>
+ </Grid>
+ </DataTemplate>
+
+ <!-- List-appropriate 70 pixel high item template as seen in the SearchResultsPage when Snapped -->
+ <DataTemplate x:Key="StandardSmallIcon70ItemTemplate">
+ <Grid Margin="6">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto"/>
+ <ColumnDefinition Width="*"/>
+ </Grid.ColumnDefinitions>
+ <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}" Margin="0,0,0,10" Width="40" Height="40">
+ <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+ </Border>
+ <StackPanel Grid.Column="1" Margin="10,-10,0,0">
+ <TextBlock Text="{Binding Title}" Style="{StaticResource BodyTextStyle}" TextWrapping="NoWrap"/>
+ <TextBlock Text="{Binding Subtitle}" Style="{StaticResource BodyTextStyle}" Foreground="{StaticResource ApplicationSecondaryForegroundThemeBrush}" TextWrapping="NoWrap"/>
+ <TextBlock Text="{Binding Description}" Style="{StaticResource BodyTextStyle}" Foreground="{StaticResource ApplicationSecondaryForegroundThemeBrush}" TextWrapping="NoWrap"/>
+ </StackPanel>
+ </Grid>
+ </DataTemplate>
+
+ <!--
+ 190x130 pixel item template for displaying file previews as seen in the FileOpenPickerPage
+ Includes an elaborate tooltip to display title and description text
+ -->
+ <DataTemplate x:Key="StandardFileWithTooltip190x130ItemTemplate">
+ <Grid>
+ <Grid Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}">
+ <Image
+ Source="{Binding Image}"
+ Width="190"
+ Height="130"
+ HorizontalAlignment="Center"
+ VerticalAlignment="Center"
+ Stretch="Uniform"/>
+ </Grid>
+ <ToolTipService.Placement>Mouse</ToolTipService.Placement>
+ <ToolTipService.ToolTip>
+ <ToolTip>
+ <ToolTip.Style>
+ <Style TargetType="ToolTip">
+ <Setter Property="BorderBrush" Value="{StaticResource ToolTipBackgroundThemeBrush}" />
+ <Setter Property="Padding" Value="0" />
+ </Style>
+ </ToolTip.Style>
+
+ <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto"/>
+ <ColumnDefinition Width="*"/>
+ </Grid.ColumnDefinitions>
+
+ <Grid Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}" Margin="20">
+ <Image
+ Source="{Binding Image}"
+ Width="160"
+ Height="160"
+ HorizontalAlignment="Center"
+ VerticalAlignment="Center"
+ Stretch="Uniform"/>
+ </Grid>
+ <StackPanel Width="200" Grid.Column="1" Margin="0,20,20,20">
+ <TextBlock Text="{Binding Title}" TextWrapping="NoWrap" Style="{StaticResource BodyTextStyle}"/>
+ <TextBlock Text="{Binding Description}" MaxHeight="140" Foreground="{StaticResource ApplicationSecondaryForegroundThemeBrush}" Style="{StaticResource BodyTextStyle}"/>
+ </StackPanel>
+ </Grid>
+ </ToolTip>
+ </ToolTipService.ToolTip>
+ </Grid>
+ </DataTemplate>
+
+ <!-- ScrollViewer styles -->
+
+ <Style x:Key="HorizontalScrollViewerStyle" TargetType="ScrollViewer">
+ <Setter Property="HorizontalScrollBarVisibility" Value="Auto"/>
+ <Setter Property="VerticalScrollBarVisibility" Value="Disabled"/>
+ <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Enabled" />
+ <Setter Property="ScrollViewer.VerticalScrollMode" Value="Disabled" />
+ <Setter Property="ScrollViewer.ZoomMode" Value="Disabled" />
+ </Style>
+
+ <Style x:Key="VerticalScrollViewerStyle" TargetType="ScrollViewer">
+ <Setter Property="HorizontalScrollBarVisibility" Value="Disabled"/>
+ <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
+ <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled" />
+ <Setter Property="ScrollViewer.VerticalScrollMode" Value="Enabled" />
+ <Setter Property="ScrollViewer.ZoomMode" Value="Disabled" />
+ </Style>
+
+ <!-- Page layout roots typically use entrance animations and a theme-appropriate background color -->
+
+ <Style x:Key="LayoutRootStyle" TargetType="Panel">
+ <Setter Property="Background" Value="{StaticResource ApplicationPageBackgroundThemeBrush}"/>
+ <Setter Property="ChildrenTransitions">
+ <Setter.Value>
+ <TransitionCollection>
+ <EntranceThemeTransition/>
+ </TransitionCollection>
+ </Setter.Value>
+ </Setter>
+ </Style>
+</ResourceDictionary>
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml
new file mode 100644
index 0000000..5f712b9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml
@@ -0,0 +1,16 @@
+<Page
+ x:Class="TestShell.MainPage"
+ IsTabStop="false"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:local="using:TestShell"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ mc:Ignorable="d">
+
+ <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
+ <Button x:Name="GoButton" Content="GO!" HorizontalAlignment="Left" Margin="36,30,0,0" VerticalAlignment="Top" Width="125" Click="GoButton_Click"/>
+ <TextBlock x:Name="OutputText" HorizontalAlignment="Left" Height="667" Margin="36,73,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="1296"/>
+
+ </Grid>
+</Page>
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml.cpp b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml.cpp
new file mode 100644
index 0000000..d5cf83f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml.cpp
@@ -0,0 +1,46 @@
+//
+// MainPage.xaml.cpp
+// Implementation of the MainPage class.
+//
+
+#include "pch.h"
+#include "MainPage.xaml.h"
+
+using namespace TestShell;
+
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls;
+using namespace Windows::UI::Xaml::Controls::Primitives;
+using namespace Windows::UI::Xaml::Data;
+using namespace Windows::UI::Xaml::Input;
+using namespace Windows::UI::Xaml::Media;
+using namespace Windows::UI::Xaml::Navigation;
+
+// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
+
+MainPage::MainPage()
+{
+ InitializeComponent();
+}
+
+/// <summary>
+/// Invoked when this page is about to be displayed in a Frame.
+/// </summary>
+/// <param name="e">Event data that describes how this page was reached. The Parameter
+/// property is typically used to configure the page.</param>
+void MainPage::OnNavigatedTo(NavigationEventArgs^ e)
+{
+ (void) e; // Unused parameter
+}
+
+extern int TimeTest1_main(int argc, char**argv);
+extern int ThreadsTest1_main(int argc, char**argv);
+
+void TestShell::MainPage::GoButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
+{
+ ThreadsTest1_main(0, NULL);
+ TimeTest1_main(0, NULL);
+}
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml.h b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml.h
new file mode 100644
index 0000000..82ff1b6
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/MainPage.xaml.h
@@ -0,0 +1,25 @@
+//
+// MainPage.xaml.h
+// Declaration of the MainPage class.
+//
+
+#pragma once
+
+#include "MainPage.g.h"
+
+namespace TestShell
+{
+ /// <summary>
+ /// An empty page that can be used on its own or navigated to within a Frame.
+ /// </summary>
+ public ref class MainPage sealed
+ {
+ public:
+ MainPage();
+
+ protected:
+ virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override;
+ private:
+ void GoButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+ };
+}
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Package.appxmanifest b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Package.appxmanifest
new file mode 100644
index 0000000..1c6445f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/Package.appxmanifest
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
+
+ <Identity Name="4e6bff6d-d58b-4901-bc85-70b2c8f5905a"
+ Publisher="CN=Gilles"
+ Version="1.0.0.0" />
+
+ <Properties>
+ <DisplayName>TestShell</DisplayName>
+ <PublisherDisplayName>Gilles</PublisherDisplayName>
+ <Logo>Assets\StoreLogo.png</Logo>
+ </Properties>
+
+ <Prerequisites>
+ <OSMinVersion>6.2.0</OSMinVersion>
+ <OSMaxVersionTested>6.2.0</OSMaxVersionTested>
+ </Prerequisites>
+
+ <Resources>
+ <Resource Language="x-generate"/>
+ </Resources>
+
+ <Applications>
+ <Application Id="App"
+ Executable="$targetnametoken$.exe"
+ EntryPoint="TestShell.App">
+ <VisualElements
+ DisplayName="TestShell"
+ Logo="Assets\Logo.png"
+ SmallLogo="Assets\SmallLogo.png"
+ Description="TestShell"
+ ForegroundText="light"
+ BackgroundColor="#464646">
+ <DefaultTile ShowName="allLogos" />
+ <SplashScreen Image="Assets\SplashScreen.png" />
+ </VisualElements>
+ </Application>
+ </Applications>
+ <Capabilities>
+ <Capability Name="internetClient" />
+ </Capabilities>
+</Package> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell.vcxproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell.vcxproj
new file mode 100644
index 0000000..fe8b9d5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell.vcxproj
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <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|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</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">
+ <ProjectGuid>{1f30ad3f-a41d-4580-b7cb-bd7a7c92de5e}</ProjectGuid>
+ <RootNamespace>TestShell</RootNamespace>
+ <DefaultLanguage>en-US</DefaultLanguage>
+ <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and '$(VisualStudioVersion)' == ''">$(VCTargetsPath11)</VCTargetsPath>
+ <MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
+ <AppContainerApplication>true</AppContainerApplication>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <PackageCertificateKeyFile>TestShell_TemporaryKey.pfx</PackageCertificateKeyFile>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\..\..\..\Source\Core;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="pch.h" />
+ <ClInclude Include="App.xaml.h">
+ <DependentUpon>App.xaml</DependentUpon>
+ </ClInclude>
+ <ClInclude Include="MainPage.xaml.h">
+ <DependentUpon>MainPage.xaml</DependentUpon>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ApplicationDefinition Include="App.xaml">
+ <SubType>Designer</SubType>
+ </ApplicationDefinition>
+ <Page Include="Common\StandardStyles.xaml">
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="MainPage.xaml">
+ <SubType>Designer</SubType>
+ </Page>
+ </ItemGroup>
+ <ItemGroup>
+ <AppxManifest Include="Package.appxmanifest">
+ <SubType>Designer</SubType>
+ </AppxManifest>
+ <None Include="TestShell_TemporaryKey.pfx" />
+ </ItemGroup>
+ <ItemGroup>
+ <Image Include="Assets\Logo.png" />
+ <Image Include="Assets\SmallLogo.png" />
+ <Image Include="Assets\StoreLogo.png" />
+ <Image Include="Assets\SplashScreen.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\Source\Tests\Threads1\ThreadsTest1.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">main=ThreadsTest1_main;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">main=ThreadsTest1_main;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ </PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ </PrecompiledHeaderOutputFile>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ </PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ </PrecompiledHeaderOutputFile>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\Source\Tests\Time1\TimeTest1.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">main=TimeTest1_main;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">main=TimeTest1_main;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ </PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ </PrecompiledHeaderOutputFile>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ </PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ </PrecompiledHeaderOutputFile>
+ </ClCompile>
+ <ClCompile Include="App.xaml.cpp">
+ <DependentUpon>App.xaml</DependentUpon>
+ </ClCompile>
+ <ClCompile Include="MainPage.xaml.cpp">
+ <DependentUpon>MainPage.xaml</DependentUpon>
+ </ClCompile>
+ <ClCompile Include="pch.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\Neptune\Neptune.vcxproj">
+ <Project>{4d304d49-41f5-48c2-bc88-898af70f421c}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell.vcxproj.filters b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell.vcxproj.filters
new file mode 100644
index 0000000..fc9afe8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell.vcxproj.filters
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Common">
+ <UniqueIdentifier>1f30ad3f-a41d-4580-b7cb-bd7a7c92de5e</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Assets">
+ <UniqueIdentifier>d7d56dd8-9345-432d-9151-c660ff9b2ed1</UniqueIdentifier>
+ </Filter>
+ <Page Include="Common\StandardStyles.xaml">
+ <Filter>Common</Filter>
+ </Page>
+ <Image Include="Assets\Logo.png">
+ <Filter>Assets</Filter>
+ </Image>
+ <Image Include="Assets\SmallLogo.png">
+ <Filter>Assets</Filter>
+ </Image>
+ <Image Include="Assets\StoreLogo.png">
+ <Filter>Assets</Filter>
+ </Image>
+ <Image Include="Assets\SplashScreen.png">
+ <Filter>Assets</Filter>
+ </Image>
+ </ItemGroup>
+ <ItemGroup>
+ <ApplicationDefinition Include="App.xaml" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="App.xaml.cpp" />
+ <ClCompile Include="MainPage.xaml.cpp" />
+ <ClCompile Include="pch.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Tests\Time1\TimeTest1.cpp" />
+ <ClCompile Include="..\..\..\..\Source\Tests\Threads1\ThreadsTest1.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="pch.h" />
+ <ClInclude Include="App.xaml.h" />
+ <ClInclude Include="MainPage.xaml.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <AppxManifest Include="Package.appxmanifest" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="TestShell_TemporaryKey.pfx" />
+ </ItemGroup>
+ <ItemGroup>
+ <Page Include="MainPage.xaml" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell_TemporaryKey.pfx b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell_TemporaryKey.pfx
new file mode 100644
index 0000000..4d2fcb4
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/TestShell_TemporaryKey.pfx
Binary files differ
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/pch.cpp b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/pch.cpp
new file mode 100644
index 0000000..01484ff
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/pch.cpp
@@ -0,0 +1,6 @@
+//
+// pch.cpp
+// Include the standard header and generate the precompiled header.
+//
+
+#include "pch.h"
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/pch.h b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/pch.h
new file mode 100644
index 0000000..fadf910
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-winrt-vs2011/TestShell/pch.h
@@ -0,0 +1,9 @@
+//
+// pch.h
+// Header for standard system include files.
+//
+
+#pragma once
+
+#include <collection.h>
+#include "App.xaml.h"
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-xbox/Neptune/Neptune.vcproj b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-xbox/Neptune/Neptune.vcproj
new file mode 100644
index 0000000..68ca1d0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-microsoft-xbox/Neptune/Neptune.vcproj
@@ -0,0 +1,394 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="Neptune"
+ ProjectGUID="{3C42FBD9-9926-4705-8A4C-04631AA5B4D8}"
+ Keyword="XboxProj">
+ <Platforms>
+ <Platform
+ Name="Xbox"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Xbox"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="4"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ OptimizeForProcessor="2"
+ AdditionalIncludeDirectories="..\..\..\..\Source\Core;..\..\..\..\Source\Config;..\..\..\..\Source\Neptune;..\..\..\..\Source\System\Xbox;..\..\..\..\Source\System\Win32"
+ PreprocessorDefinitions="_DEBUG;_XBOX;_LIB;NPT_DEBUG"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ EnableEnhancedInstructionSet="1"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="$(OutDir)/$(ProjectName).pch"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="FALSE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="$(OutDir)/$(ProjectName).lib"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ </Configuration>
+ <Configuration
+ Name="Profile|Xbox"
+ OutputDirectory="Profile"
+ IntermediateDirectory="Profile"
+ ConfigurationType="4"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ OmitFramePointers="TRUE"
+ OptimizeForProcessor="2"
+ PreprocessorDefinitions="NDEBUG;_XBOX;PROFILE;_LIB"
+ StringPooling="TRUE"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="TRUE"
+ EnableFunctionLevelLinking="TRUE"
+ EnableEnhancedInstructionSet="1"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="$(OutDir)/$(ProjectName).pch"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="FALSE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="$(OutDir)/$(ProjectName).lib"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ </Configuration>
+ <Configuration
+ Name="Profile_FastCap|Xbox"
+ OutputDirectory="Profile_FastCap"
+ IntermediateDirectory="Profile_FastCap"
+ ConfigurationType="4"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ OmitFramePointers="TRUE"
+ OptimizeForProcessor="2"
+ PreprocessorDefinitions="NDEBUG;_XBOX;PROFILE;FASTCAP;_LIB"
+ StringPooling="TRUE"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="TRUE"
+ EnableFunctionLevelLinking="TRUE"
+ EnableEnhancedInstructionSet="1"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="$(OutDir)/$(ProjectName).pch"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="FALSE"
+ DebugInformationFormat="3"
+ FastCAP="TRUE"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="$(OutDir)/$(ProjectName).lib"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Xbox"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="4"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ OmitFramePointers="TRUE"
+ OptimizeForProcessor="2"
+ AdditionalIncludeDirectories="..\..\..\..\Source\Config;..\..\..\..\Source\Core;..\..\..\..\Source\Neptune;..\..\..\..\Source\System\Xbox;..\..\..\..\Source\System\Win32"
+ PreprocessorDefinitions="NDEBUG;_XBOX;_LIB"
+ StringPooling="TRUE"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="TRUE"
+ EnableFunctionLevelLinking="TRUE"
+ EnableEnhancedInstructionSet="1"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="$(OutDir)/$(ProjectName).pch"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="FALSE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="$(OutDir)/$(ProjectName).lib"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release_LTCG|Xbox"
+ OutputDirectory="Release_LTCG"
+ IntermediateDirectory="Release_LTCG"
+ ConfigurationType="4"
+ CharacterSet="2"
+ WholeProgramOptimization="TRUE">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ OmitFramePointers="TRUE"
+ OptimizeForProcessor="2"
+ PreprocessorDefinitions="NDEBUG;_XBOX;LTCG;_LIB"
+ StringPooling="TRUE"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="TRUE"
+ EnableFunctionLevelLinking="TRUE"
+ EnableEnhancedInstructionSet="1"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="$(OutDir)/$(ProjectName).pch"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="FALSE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="$(OutDir)/$(ProjectName).lib"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ </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="..\..\..\..\Source\Core\NptBase64.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\System\Bsd\NptBsdSockets.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptBufferedStreams.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptCommon.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptDataBuffer.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptDebug.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptFile.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptHttp.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptList.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptMessaging.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptNetwork.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\System\Posix\NptPosixFile.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptQueue.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptResults.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptRingBuffer.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptSimpleMessageQueue.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptSockets.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\System\StdC\NptStdcFile.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptStreams.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptStrings.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptSystem.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptThreads.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptTime.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptUri.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptUtils.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\System\Win32\NptWin32Debug.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\System\Win32\NptWin32System.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\System\Win32\NptWin32Threads.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\System\Xbox\NptXboxNetwork.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptXml.cpp">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptArray.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptBase64.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptBufferedStreams.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptCommon.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptConstants.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptDataBuffer.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptDebug.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptDefs.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptFile.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptHttp.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptInterfaces.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptList.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptMap.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptMessaging.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptNetwork.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptQueue.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptReferences.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptResults.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptRingBuffer.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptSelectableMessageQueue.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptSimpleMessageQueue.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptSockets.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptStack.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptStreams.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptStrings.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptSystem.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptThreads.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptTime.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptTypes.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptUri.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptUtils.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\System\Win32\NptWin32Threads.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\System\Xbox\NptXboxNetwork.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\Source\Core\NptXml.h">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-unknown-cygwin/Config.scons b/lib/libUPnP/Neptune/Build/Targets/x86-unknown-cygwin/Config.scons
new file mode 100644
index 0000000..6ed2fc1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-unknown-cygwin/Config.scons
@@ -0,0 +1,4 @@
+LoadTool('gcc-generic', env)
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Bsd':'*.cpp', 'System/Posix':'*.cpp', 'System/Null':'NptNullSerialPort.cpp'}
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86-unknown-linux/Config.scons b/lib/libUPnP/Neptune/Build/Targets/x86-unknown-linux/Config.scons
new file mode 100644
index 0000000..504bbe9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86-unknown-linux/Config.scons
@@ -0,0 +1,7 @@
+LoadTool('gcc-generic', env)
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Bsd':'*.cpp', 'System/Posix':'*.cpp', 'System/Null':'NptNullAutoreleasePool.cpp NptNullSerialPort.cpp'}
+env['NPT_EXTRA_LIBS']=['pthread']
+if env['shared']:
+ env['NPT_EXTRA_LIBS'] += ['dl']
diff --git a/lib/libUPnP/Neptune/Build/Targets/x86_64-unknown-linux/Config.scons b/lib/libUPnP/Neptune/Build/Targets/x86_64-unknown-linux/Config.scons
new file mode 100644
index 0000000..d76d35b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Targets/x86_64-unknown-linux/Config.scons
@@ -0,0 +1,7 @@
+LoadTool('gcc-generic', env)
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Bsd':'*.cpp', 'System/Posix':'*.cpp', 'System/Null':'NptNullSerialPort.cpp'}
+env['NPT_EXTRA_LIBS']=['pthread']
+if env['shared']:
+ env['NPT_EXTRA_LIBS'] += ['dl']
diff --git a/lib/libUPnP/Neptune/Build/Tools/SCons/gcc-generic.py b/lib/libUPnP/Neptune/Build/Tools/SCons/gcc-generic.py
new file mode 100644
index 0000000..eb57c6a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Build/Tools/SCons/gcc-generic.py
@@ -0,0 +1,34 @@
+import os
+
+def generate(env, gcc_cross_prefix=None, gcc_strict=True, gcc_stop_on_warning=None):
+ if gcc_stop_on_warning == None: gcc_stop_on_warning = env['stop_on_warning']
+
+ ### compiler flags
+ if gcc_strict:
+ env.AppendUnique(CCFLAGS = ['-pedantic', '-Wall', '-W', '-Wundef', '-Wno-long-long'])
+ env.AppendUnique(CFLAGS = ['-Wmissing-prototypes', '-Wmissing-declarations'])
+ else:
+ env.AppendUnique(CCFLAGS = ['-Wall'])
+
+ compiler_defines = ['-D_REENTRANT']
+ env.AppendUnique(CCFLAGS = compiler_defines)
+ #env.AppendUnique(CPPFLAGS = compiler_defines)
+
+ if env['build_config'] == 'Debug':
+ env.AppendUnique(CCFLAGS = '-g')
+ else:
+ env.AppendUnique(CCFLAGS = '-O3')
+
+ if gcc_stop_on_warning:
+ env.AppendUnique(CCFLAGS = ['-Werror'])
+
+ if gcc_cross_prefix:
+ env['ENV']['PATH'] += os.environ['PATH']
+ env['AR'] = gcc_cross_prefix+'-ar'
+ env['RANLIB'] = gcc_cross_prefix+'-ranlib'
+ env['CC'] = gcc_cross_prefix+'-gcc'
+ env['CXX'] = gcc_cross_prefix+'-g++'
+ env['LINK'] = gcc_cross_prefix+'-g++'
+
+ if gcc_cross_prefix:
+ env['ENV']['PATH'] = os.environ['PATH'] + ':' + env['ENV']['PATH']
diff --git a/lib/libUPnP/Neptune/Documents/Automatic/NeptuneErrorCodes.txt b/lib/libUPnP/Neptune/Documents/Automatic/NeptuneErrorCodes.txt
new file mode 100644
index 0000000..4dc10fe
--- /dev/null
+++ b/lib/libUPnP/Neptune/Documents/Automatic/NeptuneErrorCodes.txt
@@ -0,0 +1,108 @@
+
+-20000 ==> NPT_ERROR_INVALID_PARAMETERS
+-20001 ==> NPT_ERROR_PERMISSION_DENIED
+-20002 ==> NPT_ERROR_OUT_OF_MEMORY
+-20003 ==> NPT_ERROR_NO_SUCH_NAME
+-20004 ==> NPT_ERROR_NO_SUCH_PROPERTY
+-20005 ==> NPT_ERROR_NO_SUCH_ITEM
+-20006 ==> NPT_ERROR_NO_SUCH_CLASS
+-20007 ==> NPT_ERROR_OVERFLOW
+-20008 ==> NPT_ERROR_INTERNAL
+-20009 ==> NPT_ERROR_INVALID_STATE
+-20010 ==> NPT_ERROR_INVALID_FORMAT
+-20011 ==> NPT_ERROR_INVALID_SYNTAX
+-20012 ==> NPT_ERROR_NOT_IMPLEMENTED
+-20013 ==> NPT_ERROR_NOT_SUPPORTED
+-20014 ==> NPT_ERROR_TIMEOUT
+-20015 ==> NPT_ERROR_WOULD_BLOCK
+-20016 ==> NPT_ERROR_TERMINATED
+-20017 ==> NPT_ERROR_OUT_OF_RANGE
+-20018 ==> NPT_ERROR_OUT_OF_RESOURCES
+-20019 ==> NPT_ERROR_NOT_ENOUGH_SPACE
+-20020 ==> NPT_ERROR_INTERRUPTED
+-20021 ==> NPT_ERROR_CANCELLED
+
+-20100 ==> NPT_ERROR_LIST_EMPTY
+-20101 ==> NPT_ERROR_LIST_OPERATION_ABORTED
+-20102 ==> NPT_ERROR_LIST_OPERATION_CONTINUE
+
+-20200 ==> NPT_ERROR_NO_SUCH_FILE
+-20201 ==> NPT_ERROR_FILE_NOT_OPEN
+-20202 ==> NPT_ERROR_FILE_BUSY
+-20203 ==> NPT_ERROR_FILE_ALREADY_OPEN
+-20204 ==> NPT_ERROR_FILE_NOT_READABLE
+-20205 ==> NPT_ERROR_FILE_NOT_WRITABLE
+-20206 ==> NPT_ERROR_FILE_NOT_DIRECTORY
+-20207 ==> NPT_ERROR_FILE_ALREADY_EXISTS
+-20208 ==> NPT_ERROR_FILE_NOT_ENOUGH_SPACE
+-20209 ==> NPT_ERROR_DIRECTORY_NOT_EMPTY
+
+-20300 ==> NPT_ERROR_READ_FAILED
+-20301 ==> NPT_ERROR_WRITE_FAILED
+-20302 ==> NPT_ERROR_EOS
+
+-20400 ==> NPT_ERROR_CONNECTION_RESET
+-20401 ==> NPT_ERROR_CONNECTION_ABORTED
+-20402 ==> NPT_ERROR_CONNECTION_REFUSED
+-20403 ==> NPT_ERROR_CONNECTION_FAILED
+-20404 ==> NPT_ERROR_HOST_UNKNOWN
+-20405 ==> NPT_ERROR_SOCKET_FAILED
+-20406 ==> NPT_ERROR_GETSOCKOPT_FAILED
+-20407 ==> NPT_ERROR_SETSOCKOPT_FAILED
+-20408 ==> NPT_ERROR_SOCKET_CONTROL_FAILED
+-20409 ==> NPT_ERROR_BIND_FAILED
+-20410 ==> NPT_ERROR_LISTEN_FAILED
+-20411 ==> NPT_ERROR_ACCEPT_FAILED
+-20412 ==> NPT_ERROR_ADDRESS_IN_USE
+-20413 ==> NPT_ERROR_NETWORK_DOWN
+-20414 ==> NPT_ERROR_NETWORK_UNREACHABLE
+
+-20500 ==> NPT_ERROR_NO_SUCH_INTERFACE
+
+-20600 ==> NPT_ERROR_XML_INVALID_NESTING
+-20601 ==> NPT_ERROR_XML_TAG_MISMATCH
+
+-20800 ==> NPT_ERROR_HTTP_INVALID_RESPONSE_LINE
+-20801 ==> NPT_ERROR_HTTP_INVALID_REQUEST_LINE
+-20802 ==> NPT_ERROR_HTTP_NO_PROXY
+-20803 ==> NPT_ERROR_HTTP_INVALID_REQUEST
+-20804 ==> NPT_ERROR_HTTP_METHOD_NOT_SUPPORTED
+
+-20900 ==> NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN
+-20901 ==> NPT_ERROR_CALLBACK_NOTHING_PENDING
+
+-21000 ==> NPT_ERROR_NO_SUCH_SERIAL_PORT
+-21001 ==> NPT_ERROR_SERIAL_PORT_NOT_OPEN
+-21002 ==> NPT_ERROR_SERIAL_PORT_ALREADY_OPEN
+-21003 ==> NPT_ERROR_SERIAL_PORT_BUSY
+
+-21101 ==> NPT_ERROR_INVALID_PASSWORD
+-21102 ==> NPT_ERROR_TLS_INVALID_HANDSHAKE
+-21103 ==> NPT_ERROR_TLS_INVALID_PROTOCOL_MESSAGE
+-21104 ==> NPT_ERROR_TLS_INVALID_HMAC
+-21105 ==> NPT_ERROR_TLS_INVALID_VERSION
+-21106 ==> NPT_ERROR_TLS_INVALID_SESSION
+-21107 ==> NPT_ERROR_TLS_NO_CIPHER
+-21108 ==> NPT_ERROR_TLS_BAD_CERTIFICATE
+-21109 ==> NPT_ERROR_TLS_INVALID_KEY
+-21110 ==> NPT_ERROR_TLS_NO_CLIENT_RENEGOTIATION
+-21111 ==> NPT_ERROR_TLS_INVALID_FINISHED_MESSAGE
+-21112 ==> NPT_ERROR_TLS_NO_CERTIFICATE_DEFINED
+-21113 ==> NPT_ERROR_TLS_ALERT_HANDSHAKE_FAILED
+-21114 ==> NPT_ERROR_TLS_ALERT_BAD_CERTIFICATE
+-21115 ==> NPT_ERROR_TLS_ALERT_INVALID_VERSION
+-21116 ==> NPT_ERROR_TLS_ALERT_BAD_RECORD_MAC
+-21117 ==> NPT_ERROR_TLS_ALERT_DECODE_ERROR
+-21118 ==> NPT_ERROR_TLS_ALERT_DECRYPT_ERROR
+-21119 ==> NPT_ERROR_TLS_ALERT_ILLEGAL_PARAMETER
+-21120 ==> NPT_ERROR_TLS_ALERT_UNEXPECTED_MESSAGE
+-21121 ==> NPT_ERROR_TLS_CERTIFICATE_FAILURE
+-21122 ==> NPT_ERROR_TLS_CERTIFICATE_NO_TRUST_ANCHOR
+-21123 ==> NPT_ERROR_TLS_CERTIFICATE_BAD_SIGNATURE
+-21124 ==> NPT_ERROR_TLS_CERTIFICATE_NOT_YET_VALID
+-21125 ==> NPT_ERROR_TLS_CERTIFICATE_EXPIRED
+-21126 ==> NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED
+-21127 ==> NPT_ERROR_TLS_CERTIFICATE_INVALID_CHAIN
+-21128 ==> NPT_ERROR_TLS_CERTIFICATE_UNSUPPORTED_DIGEST
+-21129 ==> NPT_ERROR_TLS_CERTIFICATE_INVALID_PRIVATE_KEY
+-21130 ==> NPT_ERROR_TLS_DNS_NAME_MISMATCH
diff --git a/lib/libUPnP/Neptune/Documents/Manuals/Neptune Logging.doc b/lib/libUPnP/Neptune/Documents/Manuals/Neptune Logging.doc
new file mode 100644
index 0000000..90a827f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Documents/Manuals/Neptune Logging.doc
Binary files differ
diff --git a/lib/libUPnP/Neptune/Extras/Data/TLS-Trust-Anchors-base.crt b/lib/libUPnP/Neptune/Extras/Data/TLS-Trust-Anchors-base.crt
new file mode 100644
index 0000000..6abdbbb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Data/TLS-Trust-Anchors-base.crt
@@ -0,0 +1,3382 @@
+Verisign/RSA Secure Server CA
+=============================
+-----BEGIN CERTIFICATE-----
+MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
+IDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVy
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQL
+EyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUA
+A4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1Xp
+sSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJ
+VCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw4jrg7HFG
+mhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2
+qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
+-----END CERTIFICATE-----
+
+GTE CyberTrust Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
+Q29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAw
+WhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9u
+MRwwGgYDVQQDExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
+gQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH
+6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswk
+wB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEP
+I2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGvU9oUtCG4
+1tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY
+-----END CERTIFICATE-----
+
+GTE CyberTrust Global Root
+==========================
+-----BEGIN CERTIFICATE-----
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
+Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
+A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
+MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
+Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
+IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
+sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
+HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
+AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
+M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
+NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
+-----END CERTIFICATE-----
+
+Thawte Personal Basic CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs
+dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMY
+VGhhd3RlIFBlcnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0
+aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpB
+MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhh
+d3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x
+ITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZcGVyc29u
+YWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+C
+FeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJ
+l+A1OFdKwPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY
+0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAt4plrsD16
+iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7c8a914phXAPjLSeoF+CEhULcXpvG
+t7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN
+92NWod8isQ==
+-----END CERTIFICATE-----
+
+Thawte Personal Premium CA
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs
+dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMa
+VGhhd3RlIFBlcnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1p
+dW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQG
+EwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoT
+EVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlz
+aW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3DQEJARYb
+cGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ
+Ztn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ
+8/JE2dWIEt12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicR
+FTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GB
+AGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIHb4Vnjt4rueIXsDqg8A6iAJrf8xQV
+brvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+W
+jS9Q2wfD6h+rM+D1KzGJ
+-----END CERTIFICATE-----
+
+Thawte Personal Freemail CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs
+dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMb
+VGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVl
+bWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNV
+BAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
+ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
+aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJ
+ARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
+gYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6W
+ZBrCFG5ErHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgk
+CGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
+AAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjPMPuoSpaKH2JCI4wXD/S6ZJwXrEcp
+352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK
+/qarigd1iwzdUYRr5PjRzneigQ==
+-----END CERTIFICATE-----
+
+Thawte Server CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
+AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
+b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
+BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
+c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
+A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
+ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
+/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
+1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
+GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
+GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
+-----END CERTIFICATE-----
+
+Thawte Premium Server CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
+AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
+ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
+AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
+VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
+aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
+cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
+aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
+Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
+qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
+SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
+8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
+UCemDaYj+bvLpgcUQg==
+-----END CERTIFICATE-----
+
+Equifax Secure CA
+=================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
+ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
+MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
+B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
+fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
+8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
+CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
+A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
+spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
+zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
+BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
+70+sB3c4
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 1
+=======================================
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
+MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
+NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
+o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
+IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
+ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
+kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
+RbyhkwS7hp86W0N6w4pl
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 3
+=======================================
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
+MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
+VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
+xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
+IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
+AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
+up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
+mPnHfxsb1gYgAlihw6ID
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 2
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJ1
+czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0
+YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBS
+b290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4
+NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UE
+BxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjER
+MA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEW
+EmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLGJrbn
+pT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZ
+PdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGA
+vqPYUrBEzUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5y
+P4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn7pTKBBMFYgZw
+I7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAojeyP2n714Z5
+VEkxlTMr89EJFEliYIalsBHiUMIdBlc+LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2
+vAd5ZWRzfdd5ynvVWlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX
+8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q
+gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2kYtdo+o56T9II
+2pPc8JIRetDccpMMc5NihWjQ9A==
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 4
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJ1
+czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0
+YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBS
+b290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2
+MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UE
+BxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjER
+MA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEW
+EmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANx18IzA
+dZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva
+3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9
+kVySVGkl5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP
+17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCvbK4iNC7Va26D
+unm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAtTYOXeFhKFoR
+ZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT
+4EOvkTvRyyzYdFQ6HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV
+6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q
+10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK
+1GSYsyapMMj9puyrliGtf8J4tg==
+-----END CERTIFICATE-----
+
+Verisign Class 1 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTla
+MF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3Mg
+MSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEF
+AAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw
+0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7
+NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf
+7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnx
+giJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0A
+NACY89FxlA==
+-----END CERTIFICATE-----
+
+Verisign Class 2 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAy
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6
+Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/
+S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIobK/o5wXTX
+XtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUY
+YAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2
+lw0Xd8rY
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
+TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
+WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
+Tqj/ZA1k
+-----END CERTIFICATE-----
+
+Verisign Class 1 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd
+k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq
+WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB
+MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM
+XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC
+lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ
+-----END CERTIFICATE-----
+
+Verisign Class 2 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
+cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
+Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
+c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
+cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
+Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
+c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx
+nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC
+wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA
+ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK
+1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk
+LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
+FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
+lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
+MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
+1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
+Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
+-----END CERTIFICATE-----
+
+Verisign Class 4 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4
+xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH
+qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB
+MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF
+WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB
+ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp
+-----END CERTIFICATE-----
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+ValiCert Class 1 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
+MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
+GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
+DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
+lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
+icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
+Orf1LXLI
+-----END CERTIFICATE-----
+
+ValiCert Class 2 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
+CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
+ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
+SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
+UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
+W9ViH0Pd
+-----END CERTIFICATE-----
+
+RSA Root Certificate 1
+======================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
+3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
+BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
+3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
+V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
+on+jjBXu
+-----END CERTIFICATE-----
+
+Verisign Class 1 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E
+bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ
+rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+
+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB
+FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
+y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
+ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h
+a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc
+D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
+-----END CERTIFICATE-----
+
+Verisign Class 2 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
+azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
+c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
+aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6
+tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7
+C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS
+0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs
+Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0
+JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
+0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
+sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx
+JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j
+GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Verisign Class 4 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
+tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
+8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
+Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
+Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
+mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
+RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
+UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+
+Entrust.net Secure Server CA
+============================
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
+cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
+ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
+A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
+eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
+dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
+aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
+gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
+ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
+CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
+dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
+NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
+HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
+BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
+Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
+n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
+Entrust.net Secure Personal CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8v
+Q1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1
+c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJV
+UzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRf
+Q0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5
+OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdv
+kHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGp
+OZ5V+Pux5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTm
+T173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkwggEVMIHkoIHh
+oIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3
+dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBs
+aWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50
+cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg
+KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNVHRAEJDAigA8x
+OTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU
+xPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1Ud
+EwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K
+8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6h
+URzzwy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYG
+JqibGapEPHayXOw=
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
+AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
+gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
+AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
+oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
+o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
+2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
+OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+Equifax Secure Global eBusiness CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
+bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
+HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
+b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
+PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
+qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
+hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
+BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
+MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
+I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
+NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+
+Equifax Secure eBusiness CA 1
+=============================
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
+LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
+ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
+IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
+1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
+IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
+MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
+Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
+AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
+lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+
+Equifax Secure eBusiness CA 2
+=============================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
+ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
+MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
+DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
+2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
+BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
+JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
+A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
+uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
+jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
+78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
+V+GRMOrN
+-----END CERTIFICATE-----
+
+Visa International Global Root 2
+================================
+-----BEGIN CERTIFICATE-----
+MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMxDTALBgNVBAoT
+BFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIw
+EAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYD
+VQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZp
+Y2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW
+73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1
+t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm7Igbthkn
+GziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhl
+V7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYE
+FJ59SzS/ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0G
+CSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdpNSYx/scuhMKZ
+YdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQkIqUs38oW26sTTMs7WXcFsziza6k
+PWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOe
+yti12HvOdUVmB/RtLdh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8
+ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G
+-----END CERTIFICATE-----
+
+AddTrust Low-Value Services Root
+================================
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+AddTrust Public Services Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+AddTrust Qualified Certificates Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
+-----END CERTIFICATE-----
+
+Verisign Time Stamping Authority CA
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCBwTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZl
+cmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWdu
+IFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UE
+ChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNV
+BAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSww
+KgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhj
+zCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6o
+v8uQjI11S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEA
+MEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZl
+cmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC52ZXJpc2lnbi5jb20v
+cGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRw
+Oi8vb2NzcC52ZXJpc2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2
+DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea
+w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU58dzq6wf7iWb
+wBbtt8pb8BQ=
+-----END CERTIFICATE-----
+
+Thawte Time Stamping CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
+A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcg
+Q0EwHhcNOTcwMTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNV
+BAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEd
+MBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBp
+bmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+o
+J9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR5zDWQQD9
+nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzAR
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCo
+uqoEiYbC9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCe
+d/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJSdM=
+-----END CERTIFICATE-----
+
+Entrust.net Global Secure Server CA
+===================================
+-----BEGIN CERTIFICATE-----
+MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGluY29ycC4gYnkgcmVmLiAobGlt
+aXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE
+AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0w
+MDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0G
+A1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh
+Yi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRy
+dXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3
+DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55l
+xyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439P
+mrkDQYC2dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEB
+BAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0VudHJ1c3QubmV0
+MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0
+cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMT
+MUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV
+BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD
+VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr
+47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w
+AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbv
+H9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3
+a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw==
+-----END CERTIFICATE-----
+
+Entrust.net Global Secure Personal CA
+=====================================
+-----BEGIN CERTIFICATE-----
+MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcx
+NjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQl
+hK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKkl
+Wb1m9fkn5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNV
+HR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAwPgYDVQQLFDd3
+d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUw
+IwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5l
+dCBDbGllbnQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
+IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAM
+BgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQF
+AAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xK
+p9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQ
+Gof4T4HHdguEOnKdzmVml64mXg==
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+AOL Time Warner Root Certification Authority 1
+==============================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMxHTAbBgNVBAoT
+FEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNhIE9ubGluZSBJbmMuMTcwNQYD
+VQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAy
+MDUyOTA2MDAwMFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wg
+VGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMu
+QU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8
+hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkG
+IBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93
+f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQI
+fHNlIAqhBC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNj
+MGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+XxIwHwYDVR0j
+BBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA
+A4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u
+0FIy2VkyvNp5ctZ7CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf
+WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX
+n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoWH1iCC+GWaQVL
+juyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S
+-----END CERTIFICATE-----
+
+AOL Time Warner Root Certification Authority 2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMxHTAbBgNVBAoT
+FEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNhIE9ubGluZSBJbmMuMTcwNQYD
+VQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAy
+MDUyOTA2MDAwMFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wg
+VGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMu
+QU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8
+TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWsi4SVqBax
+7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17n
+OirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2w
+TPDaRrbqJS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rS
+AG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxmlJ85per5n0/xQ
+pCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFhEVsVS6kkUfykXPcXnbDS+gfpj1bk
+GoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuW
+CpTehTacyH+BCQJJKg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex
+MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4G
+A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7
++z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI
+5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcC
+tQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ
+68W/ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3
+p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5O8t1wswv
+ziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD062KRffaJ00psUjf5BHklka9
+bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4o
+GKQWDzH9OmwjkyB24f0HhdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2
+uBOLZ8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=
+-----END CERTIFICATE-----
+
+beTRUSTed Root CA
+=================
+-----BEGIN CERTIFICATE-----
+MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJXVzESMBAGA1UE
+ChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBDQXMxGjAYBgNVBAMTEWJlVFJV
+U1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMC
+V1cxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYD
+VQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0
+c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgz
+eubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCg
+c0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNn
+mrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5
+c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8w
+ggFZBgNVHSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFS
+ZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFu
+Y2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBv
+ZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJl
+IGZvdW5kIGF0IGJlVFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t
+L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0
+L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQxCzAJBgNVBAYT
+AldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3e
+KjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR
++csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/b
+ow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ
+1gMe1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWu
+GVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpGEK5BV2Vs
+PyMQPyEQWbfkQN0mDCP2qq4=
+-----END CERTIFICATE-----
+
+beTRUSTed Root CA-Baltimore Implementation
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwliZVRSVVNUZWQx
+GzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0Et
+QmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVow
+ZjESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNV
+BAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ
++2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8Co
+Cd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9fHBOB1Bir
+lNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNe
+DsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOC
+Ah4wggIaMA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJ
+KIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNlIG9mIHRoaXMg
+Q2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVudCBhbmQgYWNjZXB0YW5jZSBvZiB0
+aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwg
+dGhlIENlcnRpZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0
+eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl
+LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDBB
+BggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2lu
+ZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR
+3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6s
+vfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyX
+EHu67RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfq
+jjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5dUX2xZ/2j
+vTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py05yc493EG931t3GzUwWJBtDL
+SoDByFOQtTwxiBdQn8nEDovYqAJjDQ==
+-----END CERTIFICATE-----
+
+beTRUSTed Root CA - Entrust Implementation
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwliZVRSVVNUZWQx
+GzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0Eg
+LSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1ow
+ZjESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNV
+BAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0c
+S12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE7
+0mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkbhepxKYhB
+MvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1i
+JAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOC
+AwUwggMBMIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYB
+BQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNyZWF0
+ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9u
+IFByYWN0aWNlIFN0YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj
+aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0
+cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUFBwIBFjZodHRw
+czovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZI
+AYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEb
+MBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAt
+IEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0
+MTEwODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44
+iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNVHRMEBTAD
+AQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEAKrgX
+zh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevd
+kObRVlTa4y0MnxEylCIBevZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/
+T220Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2kXgCl
+zMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYhxKlkqu9FNtEaZnz4
+6TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w==
+-----END CERTIFICATE-----
+
+beTRUSTed Root CA - RSA Implementation
+======================================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBiMRIwEAYDVQQK
+EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMmYmVUUlVT
+VGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEy
+MTEwNzI1WjBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB
+czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRuj
+brWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTu
+lh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xs
+N+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQh
+hlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMB
+AAGjggIYMIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAAD
+CSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNf
+c2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIBOhqCATZSZWxpYW5jZSBvbiBvciB1
+c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2Nl
+cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv
+bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS
+ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNU
+ZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9p
+bmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAd
+BgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTB
+mMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05
+pmuKmET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqN
+Wz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNMm2+fG8oe
+qqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8ymmFei74pnykkiFY5LKjSq5YD
+WtRIn7lAhAuYaPsBQ9Yb4gmxlxw=
+-----END CERTIFICATE-----
+
+RSA Security 2048 v3
+====================
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
+ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
+MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
+BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
+Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
+WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
+KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
+FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
+v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
+0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
+VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
+nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
+pKnXwiJPZ9d37CAFYd4=
+-----END CERTIFICATE-----
+
+RSA Security 1024 v3
+====================
+-----BEGIN CERTIFICATE-----
+MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
+ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAy
+MjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
+BgNVBAsTFFJTQSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV
+3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4m
+mdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1Blq
+FikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAf
+BgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUM
+X96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBD
+leMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNu
+mU4/iXgDmMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E=
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Global CA 2
+====================
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
+H4z1Ir+rzoPz4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+UTN-USER First-Network Applications
+===================================
+-----BEGIN CERTIFICATE-----
+MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp
+BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5
+WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T
+YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB
+cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug
+mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj
+DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu
+Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi
+P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE
+j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w
+HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j
+cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
+CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
+IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK
+RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp
+xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq
+DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 1
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
+v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
+DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
+sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
+8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
+o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
+GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
+VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
+3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
+Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
+fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
+f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
+qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
+RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
+gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
+6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
+FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
+Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
+B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
+aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
+T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
+JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
+zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
+ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
+1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
+GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
+Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
+cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
+-----END CERTIFICATE-----
+
+Visa eCommerce Root
+===================
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+TC TrustCenter, Germany, Class 2 CA
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
+EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
+U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
+bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
+ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
+YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
+aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
+MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
+hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs
+qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N
+u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
+LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf
+/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2
+9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac
+ASZ4smZHcFFk
+-----END CERTIFICATE-----
+
+TC TrustCenter, Germany, Class 3 CA
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
+EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
+U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
+bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
+ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
+YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
+aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
+MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
+hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN
+2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7
+7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
+LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B
+u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm
+5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS
+CdS7kjXvD9s0
+-----END CERTIFICATE-----
+
+Certum Root CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+Comodo Secure Services root
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
+RR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+Comodo Trusted Services root
+============================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
+9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+IPS Chained CAs root
+====================
+-----BEGIN CERTIFICATE-----
+MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
+EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
+Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
+Qi02MDkyOTQ1MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEy
+MjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJ
+QmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwu
+MSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJ
+UFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBD
+QSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBz
+QG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQgvJhPUOtopKdJ
+C7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCBhYEFcYGdtJUZqV92NC5jNzVXjrQf
+Qj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQID
+AQABo4IEQzCCBD8wHQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC
+AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE
+CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBw
+dWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g
+IEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNV
+HQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF
+BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGC
+NwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud
+EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZp
+Y2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8v
+d3d3Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMvaXBz
+MjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3dy5pcHMuZXMvaXBz
+MjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5l
+cy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz
+LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5p
+cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz
+L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw
+Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hAK+/b
+lkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M9
+2GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9
+-----END CERTIFICATE-----
+
+IPS CLASE1 root
+===============
+-----BEGIN CERTIFICATE-----
+MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
+EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
+Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
+Qi02MDkyOTQ1MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqG
+SIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFow
+ggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx
+LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoU
+Imlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFT
+RTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkq
+hkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5BlmvXSHU0lq4
+oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBSYmL9Yzt9fuzuOOpi9GyocY3h6YvJ
+P8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQW
+BBTrsxl588GlHKzcuh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb
+adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
+BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBz
+LmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQL
+EyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0Eg
+Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p
+cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMB
+BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB
+BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0R
+BBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBBBglghkgB
+hvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5l
+cy8wKQYJYIZIAYb4QgECBBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIB
+BAQtFitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCGSAGG
++EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25DTEFTRTEuaHRtbD8w
+PAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5o
+dG1sPzA6BglghkgBhvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT
+RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIw
+MDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
+Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l
+cy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1urxUq2
+ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmO
+DszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9UkE6tsSU=
+-----END CERTIFICATE-----
+
+IPS CLASE3 root
+===============
+-----BEGIN CERTIFICATE-----
+MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
+EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
+Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
+Qi02MDkyOTQ1MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqG
+SIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFow
+ggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx
+LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoU
+Imlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFT
+RTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkq
+hkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49NzjaY2uQARIwo
+2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY8jjsbJ0gA8DvqqPGZARRLXgNo9Ko
+OtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQW
+BBS4k/8uy9wsjqLnev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj
+mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
+BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBz
+LmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQL
+EyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0Eg
+Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p
+cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMB
+BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB
+BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0R
+BBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBBBglghkgB
+hvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5l
+cy8wKQYJYIZIAYb4QgECBBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIB
+BAQtFitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCGSAGG
++EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25DTEFTRTMuaHRtbD8w
+PAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5o
+dG1sPzA6BglghkgBhvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT
+RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIw
+MDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
+Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l
+cy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc4gYt
+fibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUE
+NPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkOE7LFRVA=
+-----END CERTIFICATE-----
+
+IPS CLASEA1 root
+================
+-----BEGIN CERTIFICATE-----
+MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
+EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
+Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
+Qi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ
+KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMy
+WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9u
+YTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENM
+QVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8w
+DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2mdd81u4D/u6zJf
+X5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4WwdByOgF9H5fahGRpEiqLJpxq339fWU
+oTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNV
+HQ4EFgQUZyaW56G/2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47
+3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2Vydmlj
+ZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0G
+A1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQ
+UyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA
+bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsG
+AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
+FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw
+GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC
+BglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3
+dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7Bglg
+hkgBhvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmww
+QAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNMQVNF
+QTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdh
+bENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv
+cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lw
+czIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz
+MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw
+Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINmyq0e
+B81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5bi
+KcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG
+-----END CERTIFICATE-----
+
+IPS CLASEA3 root
+================
+-----BEGIN CERTIFICATE-----
+MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
+EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
+Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
+Qi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ
+KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUw
+WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9u
+YTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENM
+QVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8w
+DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uGBiJ2MwwSbUhW
+YdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHUVqLyjRGZ/fZ98cfEXgIqmuJKtROK
+AP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNV
+HQ4EFgQUHp9XUEe2YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8
+2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2Vydmlj
+ZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0G
+A1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQ
+UyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA
+bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsG
+AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
+FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw
+GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC
+BglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3
+dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7Bglg
+hkgBhvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmww
+QAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNMQVNF
+QTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdh
+bENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv
+cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lw
+czIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz
+MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw
+Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB/MjD
+81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9S
+KcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv
+-----END CERTIFICATE-----
+
+IPS Servidores root
+===================
+-----BEGIN CERTIFICATE-----
+MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJD
+RUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYG
+A1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3
+DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMx
+CzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcG
+A1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD
+Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqG
+SIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3PqHILVik
+gDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Eh
+im51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GB
+ACzzw3lYJN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2
+/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58GNCr+Lh3B0Zx
+8coLY1xq+XKU1QFPoNtC
+-----END CERTIFICATE-----
+
+IPS Timestamping root
+=====================
+-----BEGIN CERTIFICATE-----
+MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVTMRIwEAYDVQQI
+EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
+Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
+Qi02MDkyOTQ1MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1
+MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQH
+EwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu
+bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsT
+K0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQ
+UyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEW
+D2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLjuVqWajOY2ycJi
+oGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4Efdo/BdApWgnMjvEp+ZCccWZ73b/
+K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0Gm
+qaMCAwEAAaOCBIAwggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC
+AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ
+BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu
+ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5J
+LkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB
+/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG
+CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK
+KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVz
+MBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5n
+IENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC
+BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8vd3d3
+Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCGSAGG+EIBAwQ4FjZo
+dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJ
+YIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu
+Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lU
+aW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy
+MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMv
+aXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH
+MAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoe
+FAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWT
+s/zif/WN87GphV+I3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU=
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 1 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw
+NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88
+7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9
+EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl
+0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645
+2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa
+HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT
+iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9
+28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV
+yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR
+vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P
+qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z
+IRlXvVWa
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA
+=============================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
+ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
+HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
+bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
+vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
+jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
+C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
+vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
+22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
+HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
+dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
+BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
+EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
+MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
+nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
+iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
+-----END CERTIFICATE-----
+
+TDC Internet Root CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
+ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
+NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
+ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
+xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
+znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
+5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
+otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
+AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
+VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
+MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
+AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
+UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
+CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
+gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
+O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
+Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
+-----END CERTIFICATE-----
+
+TDC OCES Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
+ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
+MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
+nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
+zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
+iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
+dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
+3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
+5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
+ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
+cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
+Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
+LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
+MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
+aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
+MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
+NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
+A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
+A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
+AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
+AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
+-----END CERTIFICATE-----
+
+UTN DATACorp SGC Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
+BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
+MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
+HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
+dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
+raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
+wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
+9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
+33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
+DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
+BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
+LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
+DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
+I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
+EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
+DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
+-----END CERTIFICATE-----
+
+UTN USERFirst Email Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0
+BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05
+OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx
+FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
+ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz
+dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx
+B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8
+om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG
+TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl
+yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE
+AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV
+HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
+bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
+AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne
+xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+
+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV
+NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ
+w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
+-----END CERTIFICATE-----
+
+UTN USERFirst Hardware Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
+nfhmqA==
+-----END CERTIFICATE-----
+
+UTN USERFirst Object Root CA
+============================
+-----BEGIN CERTIFICATE-----
+MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb
+BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz
+NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx
+HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy
+dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR
+loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ
+w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu
+lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7
+RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL
+BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8
+ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly
+c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
+DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
+NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO
+PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE
+qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG
+hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
+-----END CERTIFICATE-----
+
+Camerfirma Chambers of Commerce Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
+erfutGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+Camerfirma Global Chambersign Root
+==================================
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+NetLock Qualified (Class QA) Root
+=================================
+-----BEGIN CERTIFICATE-----
+MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn
+eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0
+bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0
+LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0
+dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP
+aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV
+CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e
+8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb
+m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ
+0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM
+0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
+HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
+YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
+biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p
+a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz
+YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg
+YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg
+ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov
+L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr
+Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0
+aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg
+YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0
+IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3
+DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN
+wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg
+W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc
+R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
+5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
+-----END CERTIFICATE-----
+
+NetLock Notary (Class A) Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
+EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
+ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
+DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
+EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
+VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
+cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
+D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
+z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
+/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
+tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
+4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
+A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
+Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
+bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
+IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
+LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
+ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
+IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
+IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
+b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
+bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
+Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
+bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
+ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
+ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
+CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
+KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
+8CgHrTwXZoi1/baI
+-----END CERTIFICATE-----
+
+NetLock Business (Class B) Root
+===============================
+-----BEGIN CERTIFICATE-----
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
+VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
+VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
+bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
+VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
+o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
+1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
+HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
+RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
+dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
+ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
+c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
+YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
+Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
+bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
+IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
+YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
+cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
+43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
+stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
+-----END CERTIFICATE-----
+
+NetLock Express (Class C) Root
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
+KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
+BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
+ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
+W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
+euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
+DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
+RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
+YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
+IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
+aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
+ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
+emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
+IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
+UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
+YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
+xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
+gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+StartCom Ltd.
+=============
+-----BEGIN CERTIFICATE-----
+MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT
+BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsT
+EUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoX
+DTM1MDMxMDE3Mzc0OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcT
+BUVpbGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3JpdHkgRGVw
+LjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAfBgkqhkiG9w0B
+CQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOe
+yEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+
+o5c5s7XvIywI6Nivcy+5yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2
+IhULpNYILzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0GA1Ud
+DgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOWzL3+MtUNjIExtpid
+jShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWls
+YXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkw
+JwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS
+YWRtaW5Ac3RhcnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV
+HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8GCWCGSAGG+EIB
+DQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAyBglghkgBhvhCAQQEJRYjaHR0
+cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5jcmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9j
+ZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJYIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9y
+Zy9pbmRleC5waHA/YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhB
+OlP1ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p00UOpO6w
+NnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLbcCOxgN8aIDjnfg==
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
+g14=
+-----END CERTIFICATE-----
+
+Firmaprofesional Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
+GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
+Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
+ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
+MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
+OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
+ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
+j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
+lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
+3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
+NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
+KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
+AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
+ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
+u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
+wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
+7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
+VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
+-----END CERTIFICATE-----
+
+Wells Fargo Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
+bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
+MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
+x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
+E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
+OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
+sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
+YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
+BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
+ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
+m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
+OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
+x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
+tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 1
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
+MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
+MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
+NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
+AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
+b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
+7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
+cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
+WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
+haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
+MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
+MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
+jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
+MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
+VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
+vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
+OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
+1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
+nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
+x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
+NY6E0F/6MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+Certplus Class 2 Primary CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+DST ACES CA X6
+==============
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
+oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+SwissSign Platinum CA - G2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw
+HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM
+U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu
+669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF
+eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne
+WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo
+j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6
+8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T
+aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy
+domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D
++m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV
+CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
+zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
+IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1
+Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3
+NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4
+U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8
+KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl
+9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B
+aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs
+OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY
+Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci
+IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+DigiNotar Root CA
+=================
+-----BEGIN CERTIFICATE-----
+MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQG
+EwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEgMB4G
+CSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwHhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgx
+OTIxWjBfMQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90
+YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3
+DQEBAQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B8cp86Yxq
+7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXYtsMW2YiwsYcdcNqGtA8U
+i3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIlHgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8
+ZkqQfioLBQftFl9VkHXYRskbg+IIvvEjzJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEq
+bYRAhU52mXyC8/O3AlnUJgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4
+iHomGgVMktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXva5pk
+XuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57pK6kwe6AYHw4YC+Vb
+qdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMipuih2TkGl/VujQKQjBR7P4DNG5y6
+xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovTyD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHc
+BmfFlHqabWJMfczgZICynkeOowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC
+jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXyfJ9oHbtdzno5
+wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBoY6pFITlIYXg23PFDk9Qlx/KA
+ZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHoM/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedT
+FLJgQT2EkTFoPSdE2+Xe9PpjRchMPpj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKf
+yvBovWsdst+Nbwed2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoA
+ZbwH/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQlnQ7KN+ZQ
+/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jEO1hZibCMjFCz2IbLaKPE
+CudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU9jQZjHkJNsphFyUXC4KYcwx3dMPVDceo
+EkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+WellsSecure Public Root Certificate Authority
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
+tylv2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+IGC/A
+=====
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
+VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
+Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
+MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
+EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
+STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
+TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
+So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
+HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
+frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
+tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
+egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
+iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
+q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
+MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
+lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
+0mBWWg==
+-----END CERTIFICATE-----
+
+Security Communication EV RootCA1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 2 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
+MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
+IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
+xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
+Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
+SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
+dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
+KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
+TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
+JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
+vQ==
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 3 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
+MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
+yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
+6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
+uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
+2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
+O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
+yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
+IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
+092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
+5A==
+-----END CERTIFICATE-----
+
+TC TrustCenter Universal CA I
+=============================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
+IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
+MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
+VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
+JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
+qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
+xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
+ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
+gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
+BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
+1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
+vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
+ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
+ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
+7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
+-----END CERTIFICATE-----
+
+Deutsche Telekom Root CA 2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+ComSign CA
+==========
+-----BEGIN CERTIFICATE-----
+MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD
+EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy
+MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp
+Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q
+ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy
+P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN
+GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk
+YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM
+rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy
+oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P
+AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+
+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2
+QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI
+mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb
+/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG
+zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
+AGegcQCCSA==
+-----END CERTIFICATE-----
+
+ComSign Secured CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
+AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
+NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
+QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
+49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
+7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
+kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
+9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
+AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
+U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
+j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
+AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
+BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
+FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
+51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
+OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+Buypass Class 2 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
+MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
+cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
+0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
+0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
+uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
+1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
+7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
+fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
+wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+
+Buypass Class 3 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
+MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
+ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
+n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
+AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
+1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
+pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
+EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
+htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
+el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+ApplicationCA - Japanese Government
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
diff --git a/lib/libUPnP/Neptune/Extras/Data/TLS-Trust-Anchors-extended.crt b/lib/libUPnP/Neptune/Extras/Data/TLS-Trust-Anchors-extended.crt
new file mode 100644
index 0000000..4b6e555
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Data/TLS-Trust-Anchors-extended.crt
@@ -0,0 +1,358 @@
+ABAecom (sub., Am. Bankers Assn.) Root CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAwgYkxCzAJBgNV
+BAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3RvbjEXMBUGA1UEChMOQUJBLkVD
+T00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWlu
+QGRpZ3NpZ3RydXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYD
+VQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5F
+Q09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1p
+bkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVD
+BwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1j
+Vv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNf
+WiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtx
+A6k4ShZsiSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94
+Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQgwDQYJKoZI
+hvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0kqS8Kfv2kRLD4VAe9G52dyntQJHsR
+W0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJh
+koHWG9YA8A6eKHegTYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm
+/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/
+O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 1
+==============================================
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
+MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
+acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
+MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
+U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
+TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
+aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
+yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
+Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
+8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
+W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
+BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
+sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
+q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
+B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
+nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
+MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
+dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
+LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
+x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
+QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
+5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
+AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
+Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
+Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
+9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
+UrbnBEI=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+
+S-TRUST Authentication and Encryption Root CA 2005 PN
+=====================================================
+-----BEGIN CERTIFICATE-----
+MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
+BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh
+cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT
+LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w
+NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk
+ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj
+aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp
+b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob
+4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL
+g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf
+eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3
+KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB
+/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv
+bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU
+D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD
+pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08
+P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA
+nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit
+F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b
+Hz2eBIPdltkdOpQ=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+
+AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
+======================================
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
+AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
+LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
+HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
+U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
+IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
+yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
+2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
+4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
+2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
+8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
+HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
+Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
+5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
+czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
+ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
+BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
+cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
+AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
+EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
+/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
+MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
+3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
+eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
+/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
+RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
+Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+TUBITAK UEKAE Kok Sertifika Hizmet Saglayicisi - Surum 3
+=============================================================================================================================
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+CNNIC ROOT
+==========
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
+mxE=
+-----END CERTIFICATE-----
+
+EBG Elektronik Sertifika Hizmet Saglayicisi
+==========================================================================
+-----BEGIN CERTIFICATE-----
+MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
+QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
+Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
+ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
+IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
+X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
+gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
+eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
+TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
+Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
+uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
+qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
+ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
+Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
+Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
+FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
+zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
+XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
+bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
+RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
+1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
+2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
+Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
+AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
+-----END CERTIFICATE-----
diff --git a/lib/libUPnP/Neptune/Extras/Scripts/CodeScanner.py b/lib/libUPnP/Neptune/Extras/Scripts/CodeScanner.py
new file mode 100644
index 0000000..e06c0ef
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Scripts/CodeScanner.py
@@ -0,0 +1,150 @@
+#! /usr/bin/python
+
+import os
+import os.path
+import re
+import sys
+
+ErrorPattern = re.compile('([A-Z]{3}_ERROR_[A-Z_0-9]+)\s+=?\s*\(?([A-Z_0-9-][A-Z_0-9-+ ]+[A-Z_0-9])')
+LoggerPattern = re.compile('NPT_SET_LOCAL_LOGGER\s*\([ "]*(\S+)[ "]*\)')
+NakedErrorPattern = re.compile('return.*[ \(]..._FAILURE')
+FilePatternH = re.compile('^.*\.h$')
+FilePatternC = re.compile('^.*\.(c|cpp)$')
+
+Errors = {}
+Codes = {}
+Loggers = []
+
+def ResolveErrors():
+ keep_going = True
+ while keep_going:
+ keep_going = False
+ for key in Errors.keys():
+ value = Errors[key]
+ if type(value) is str:
+ elements = [x.strip() for x in value.split('-')]
+ if len(elements[0]) == 0:
+ first = 0
+ else:
+ first = elements[0]
+ if Errors.has_key(first):
+ first = Errors[first]
+ if not type(first) is str:
+ second = int(elements[1])
+ Errors[key] = first-second
+ keep_going = True
+
+
+def AnalyzeErrorCodes(file):
+ input = open(file)
+ for line in input.readlines():
+ m = ErrorPattern.search(line)
+ if m:
+ Errors[m.group(1)] = m.group(2)
+ input.close()
+
+def ScanErrorCodes(top):
+ for root, dirs, files in os.walk(top):
+ for file in files:
+ if FilePatternH.match(file):
+ AnalyzeErrorCodes(os.path.join(root, file))
+
+ ResolveErrors()
+ for key in Errors:
+ #print key,"==>",Errors[key]
+ if (key.find("ERROR_BASE") > 1): continue
+ if Codes.has_key(Errors[key]):
+ raise Exception("duplicate error code: "+ str(key) +" --> " + str(Errors[key]) + "=" + Codes[Errors[key]])
+ Codes[Errors[key]] = key
+
+ sorted_keys = Codes.keys()
+ sorted_keys.sort()
+ sorted_keys.reverse()
+ last = 0
+ for code in sorted_keys:
+ if type(code) != int:
+ continue
+ if code != last-1:
+ print
+ print code,"==>", Codes[code]
+ last = code
+
+def AnalyzeLoggers(file):
+ input = open(file)
+ for line in input.readlines():
+ m = LoggerPattern.search(line)
+ if m:
+ if m.group(1) not in Loggers:
+ Loggers.append(m.group(1))
+ input.close()
+
+def ScanLoggers(top):
+ for root, dirs, files in os.walk(top):
+ for file in files:
+ if FilePatternC.match(file):
+ AnalyzeLoggers(os.path.join(root, file))
+
+ Loggers.sort()
+ for logger in Loggers:
+ print logger
+
+def AnalyzeNakedErrors(file, prefix):
+ line_number = 0
+ input = open(file)
+ for line in input.readlines():
+ line_number += 1
+ m = NakedErrorPattern.search(line)
+ if m:
+ print file[len(prefix):],line_number," --> ", line,
+ input.close()
+
+def ScanNakedErrors(top):
+ for root, dirs, files in os.walk(top):
+ for file in files:
+ if FilePatternC.match(file):
+ AnalyzeNakedErrors(os.path.join(root, file), top)
+
+def FindTabsInFile(file):
+ input = open(file)
+ for line in input.readlines():
+ if line.find('\t') >= 0:
+ print "TAB found in", file
+ input.close()
+ return
+ input.close()
+
+def FindTabs(top):
+ for root, dirs, files in os.walk(top):
+ for file in files:
+ if FilePatternC.match(file) or FilePatternH.match(file):
+ FindTabsInFile(os.path.join(root, file))
+
+####################################################
+# main
+####################################################
+sys.argv.reverse()
+sys.argv.pop()
+action = None
+top = None
+while len(sys.argv):
+ arg = sys.argv.pop()
+ if arg == '--list-error-codes':
+ action = ScanErrorCodes
+ elif arg == '--list-loggers':
+ action = ScanLoggers
+ elif arg == '--list-naked-errors':
+ action = ScanNakedErrors
+ elif arg == '--find-tabs':
+ action = FindTabs
+ elif top == None:
+ top = arg
+ else:
+ raise "unexpected argument " + arg
+
+if not action or not top:
+ print "CodeScanner {--list-error-codes | --list-loggers | --find-tabs} <directory-root>"
+ sys.exit(1)
+
+action(top)
+
+
diff --git a/lib/libUPnP/Neptune/Extras/Scripts/GenErrorMap.py b/lib/libUPnP/Neptune/Extras/Scripts/GenErrorMap.py
new file mode 100644
index 0000000..c2eb99e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Scripts/GenErrorMap.py
@@ -0,0 +1,146 @@
+#! /usr/bin/python
+
+import os
+import os.path
+import re
+import sys
+
+ErrorPattern = re.compile('([A-Z]{3}_ERROR_[A-Z_0-9]+)\s+=?\s*\(?([A-Z_0-9-][A-Z_0-9-+ ]+[A-Z_0-9])')
+FilePatternH = re.compile('^.*\.h$')
+FilePatternC = re.compile('^.*\.(c|cpp)$')
+
+Errors = {}
+Codes = {}
+
+ERROR_MAP_HEADER = """/*****************************************************************
+|
+| Neptune - Result Code Map
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| NPT_ResultText
++---------------------------------------------------------------------*/
+const char*
+NPT_ResultText(NPT_Result result)
+{
+ switch (result) {
+ case NPT_SUCCESS: return "SUCCESS";
+ case NPT_FAILURE: return "FAILURE";
+"""
+
+ERROR_MAP_FOOTER = """
+ default: return "UNKNOWN";
+ }
+}
+"""
+
+def ResolveErrors():
+ keep_going = True
+ while keep_going:
+ keep_going = False
+ for key in Errors.keys():
+ value = Errors[key]
+ if type(value) is str:
+ elements = [x.strip() for x in value.split('-')]
+ if len(elements[0]) == 0:
+ first = 0
+ else:
+ first = elements[0]
+ if Errors.has_key(first):
+ first = Errors[first]
+ if not type(first) is str:
+ second = int(elements[1])
+ Errors[key] = first-second
+ keep_going = True
+
+
+def AnalyzeErrorCodes(file):
+ input = open(file)
+ for line in input.readlines():
+ m = ErrorPattern.search(line)
+ if m:
+ Errors[m.group(1)] = m.group(2)
+ input.close()
+
+def ScanErrorCodes(top):
+ print ERROR_MAP_HEADER
+
+ for root, dirs, files in os.walk(top):
+ for file in files:
+ if FilePatternH.match(file):
+ AnalyzeErrorCodes(os.path.join(root, file))
+
+ ResolveErrors()
+ for key in Errors:
+ #print key,"==>",Errors[key]
+ if (key.find("ERROR_BASE") > 1): continue
+ if Codes.has_key(Errors[key]):
+ raise "duplicate error code: "+ str(key) +" --> " + str(Errors[key]) + "=" + Codes[Errors[key]]
+ Codes[Errors[key]] = key
+
+ sorted_keys = Codes.keys()
+ sorted_keys.sort()
+ sorted_keys.reverse()
+ last = 0
+ for code in sorted_keys:
+ #if code != last-1:
+ # print
+ print ' case %s: return "%s";' % (Codes[code],Codes[code])
+ last = code
+
+ print ERROR_MAP_FOOTER
+
+####################################################
+# main
+####################################################
+sys.argv.reverse()
+sys.argv.pop()
+action = None
+top = None
+while len(sys.argv):
+ arg = sys.argv.pop()
+ if top == None:
+ top = arg
+ else:
+ raise "unexpected argument " + arg
+
+if top is None:
+ print "GenErrorMap.py <directory-root>"
+ sys.exit(1)
+
+ScanErrorCodes(top)
+
+
diff --git a/lib/libUPnP/Neptune/Extras/Scripts/GenTrustAnchorsTables.py b/lib/libUPnP/Neptune/Extras/Scripts/GenTrustAnchorsTables.py
new file mode 100644
index 0000000..237d7bb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Scripts/GenTrustAnchorsTables.py
@@ -0,0 +1,138 @@
+#! /usr/bin/env python
+
+###
+### Generate trust anchor tables from a text file
+### like, for example, TLS-Trust-Anchors-base.crt
+## and TLS-Trust-Anchors-extended.crt located under Extras/Data
+###
+
+### imports
+import sys
+import base64
+
+### generate a C file with bult-in TLS trust anchors
+FILE_HEADER = """/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ """
+
+if len(sys.argv) != 3:
+ print "usage: GenTrustAnchosTable.py <input-file> <category>"
+ print " where category may be 'Base', 'Extended', or other"
+ sys.exit(1)
+
+INPUT_FILE = sys.argv[1]
+CERT_CATEGORY = sys.argv[2]
+
+digest_oid_pattern = "\x2a\x86\x48\x86\xf7\x0d\x01\x01"
+
+in_cert = False
+prev = ''
+prev_prev = ''
+index = 0
+Certs = []
+CertNames = []
+CertComments = []
+for line in open(sys.argv[1]).readlines():
+ if line.startswith('-----BEGIN CERTIFICATE-----'):
+ in_cert = True
+ b64 = ''
+ continue;
+ if line.startswith('-----END CERTIFICATE-----'):
+ cert = base64.decodestring(b64);
+ if not digest_oid_pattern in cert:
+ sys.stderr.write("-------- skipping cert (digest not supported) -------\n")
+ continue
+ Certs.append(cert)
+ cert_name = 'NptTlsTrustAnchor_%s_%04d' % (CERT_CATEGORY, index)
+ #cert_comment = eval('"'+prev_prev.rstrip('\r\n')+'"')
+ cert_comment = prev_prev.rstrip('\r\n')
+ CertNames.append(cert_name)
+ CertComments.append(cert_comment)
+ out = open(CERT_CATEGORY+'/'+cert_name+'.cpp', 'w+b')
+ out.write(FILE_HEADER)
+ out.write('/* %s */\n' % (cert_comment))
+ out.write('const unsigned char %s_Data[%d] = {\n' % (cert_name, len(cert)))
+ counter = 0
+ sep = ''
+ for byte in cert:
+ out.write('%s0x%02x' % (sep, ord(byte)))
+ counter += 1
+ sep = ','
+ if counter == 8:
+ out.write('\n')
+ counter = 0
+ in_cert = False
+ out.write('};\n')
+ out.write('const unsigned int %s_Size = %d;\n' % (cert_name, len(cert)))
+ index += 1
+ out.close()
+ continue
+ if in_cert:
+ b64 += line.rstrip('\r\n')
+ else:
+ prev_prev = prev
+ prev = line
+
+out = open('NptTlsDefaultTrustAnchors'+CERT_CATEGORY+'.cpp', 'w+b')
+out.write(FILE_HEADER)
+out.write("/* This file is automatically generated by GenTrustAnchorsTables.py, do not edit */\n\n")
+out.write('#include "NptTls.h"\n')
+
+total_size = 0
+for i in xrange(0, len(CertNames)):
+ out.write('#include "'+CERT_CATEGORY+'/'+CertNames[i]+'.cpp" /* '+CertComments[i]+' */\n')
+ total_size += len(Certs[i])
+out.write("/* total anchors size ="+ str(total_size)+" */\n\n")
+
+out.write('const NPT_TlsTrustAnchorData NptTlsDefaultTrustAnchors%s[%s] = {\r\n' % (CERT_CATEGORY, 1+len(Certs)))
+sep = ' '
+for i in xrange(0, len(Certs)):
+ out.write('%s{ %s_Data, %s_Size} /* %s */' % (sep, CertNames[i], CertNames[i], CertComments[i]))
+ sep = ',\r\n '
+out.write(sep+'{0, 0} /* sentinel */\n')
+out.write('};\n')
+out.close()
+
+out = open('NptTlsDefaultTrustAnchors'+CERT_CATEGORY+'.h', 'w+b')
+out.write(FILE_HEADER)
+out.write("/* This file is automatically generated by GenTrustAnchorsTables.py, do not edit */\n\n")
+out.write('#include "NptTls.h"\n\n')
+out.write('extern const NPT_TlsTrustAnchorData NptTlsDefaultTrustAnchors%s[%d];\n\n' % (CERT_CATEGORY, 1+len(Certs)))
+for i in xrange(0, len(CertNames)):
+ out.write('/* '+CertComments[i]+' */\n')
+ out.write('extern const unsigned int %s_Size;\n' % (CertNames[i]))
+ out.write('extern const unsigned char %s_Data[];\n\n' % (CertNames[i]))
+
+out.close()
+ \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Extras/Tools/Logging/NeptuneLogConsole.py b/lib/libUPnP/Neptune/Extras/Tools/Logging/NeptuneLogConsole.py
new file mode 100644
index 0000000..c91ba2b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Tools/Logging/NeptuneLogConsole.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+
+from socket import *
+from optparse import OptionParser
+
+UDP_ADDR = "0.0.0.0"
+UDP_PORT = 7724
+BUFFER_SIZE = 65536
+#HEADER_KEYS = ['Logger', 'Level', 'Source-File', 'Source-Function', 'Source-Line', 'TimeStamp']
+HEADER_KEYS = {
+ 'mini': ('Level'),
+ 'standard': ('Logger', 'Level', 'Source-Function'),
+ 'long': ('Logger', 'Level', 'Source-File', 'Source-Line', 'Source-Function'),
+ 'all': ('Logger', 'Level', 'Source-File', 'Source-Line', 'Source-Function', 'TimeStamp'),
+ 'custom': ()
+}
+
+Senders = {}
+
+class LogRecord:
+ def __init__(self, data):
+ offset = 0
+ self.headers = {}
+ for line in data.split("\r\n"):
+ offset += len(line)+2
+ if ':' not in line: break
+ key,value=line.split(":",1)
+ self.headers[key] = value.strip()
+ self.body = data[offset:]
+
+ def __getitem__(self, index):
+ return self.headers[index]
+
+ def format(self, sender_index, keys):
+ parts = ['['+str(sender_index)+']']
+ if 'Level' in keys:
+ parts.append('['+self.headers['Level']+']')
+ if 'Logger' in keys:
+ parts.append(self.headers['Logger'])
+ if 'TimeStamp' in keys:
+ parts.append(self.headers['TimeStamp'])
+ if 'Source-File' in keys:
+ if 'Source-Line' in keys:
+ parts.append(self.headers['Source-File']+':'+self.headers['Source-Line'])
+ else:
+ parts.append(self.headers['Source-File'])
+ if 'TimeStamp' in keys:
+ parts.append(self.headers['TimeStamp'])
+ if 'Source-Function' in keys:
+ parts.append(self.headers['Source-Function'])
+ parts.append(self.body)
+ return ' '.join(parts)
+
+class Listener:
+ def __init__(self, format='standard', port=UDP_PORT):
+ self.socket = socket(AF_INET,SOCK_DGRAM)
+ self.socket.bind((UDP_ADDR, port))
+ self.format_keys = HEADER_KEYS[format]
+
+ def listen(self):
+ while True:
+ data,addr = self.socket.recvfrom(BUFFER_SIZE)
+ sender_index = len(Senders.keys())
+ if addr in Senders:
+ sender_index = Senders[addr]
+ else:
+ print "### NEW SENDER:", addr
+ Senders[addr] = sender_index
+
+ record = LogRecord(data)
+ print record.format(sender_index, self.format_keys)
+
+
+### main
+parser = OptionParser(usage="%prog [options]")
+parser.add_option("-p", "--port", dest="port", help="port number to listen on", type="int", default=UDP_PORT)
+parser.add_option("-f", "--format", dest="format", help="log format (mini, standard, long, or all)", choices=('mini', 'standard', 'long', 'all'), default='standard')
+(options, args) = parser.parse_args()
+
+print "Listening on port", options.port
+l = Listener(format=options.format, port=options.port)
+l.listen()
diff --git a/lib/libUPnP/Neptune/Extras/Tools/Testing/MakeUrlList.py b/lib/libUPnP/Neptune/Extras/Tools/Testing/MakeUrlList.py
new file mode 100644
index 0000000..27128e1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Tools/Testing/MakeUrlList.py
@@ -0,0 +1,16 @@
+import urllib2
+import simplejson
+
+# This example request includes an optional API key which you will need to
+words = open('/usr/share/dict/words').readlines()
+for word in words:
+ word = word.rstrip()
+ url = ('http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q='+word+'+https&userip=67.169.84.240')
+ #print url
+ #print word.rstrip()
+ request = urllib2.Request(url, None, {'Referer': 'http://test.com'})
+ response = urllib2.urlopen(request)
+
+ results = simplejson.load(response)
+ for result in results['responseData']['results']:
+ print result['unescapedUrl']
diff --git a/lib/libUPnP/Neptune/Extras/Tools/Testing/axtls-crash-url.txt b/lib/libUPnP/Neptune/Extras/Tools/Testing/axtls-crash-url.txt
new file mode 100644
index 0000000..3e519de
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Tools/Testing/axtls-crash-url.txt
@@ -0,0 +1 @@
+https://my.epilepsy.com/irody/healthvault.php
diff --git a/lib/libUPnP/Neptune/Extras/Tools/Testing/http-urls.txt b/lib/libUPnP/Neptune/Extras/Tools/Testing/http-urls.txt
new file mode 100644
index 0000000..76590f4
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Tools/Testing/http-urls.txt
@@ -0,0 +1,3037 @@
+http://1abirritante.blogspot.com/
+http://1hiphopucit.com/2010/01/most-memorable-2010-grammy-performances-videos/
+http://1smootshort.blogspot.com/
+http://84.234.17.46/index/abbot
+http://8emere-veille.over-blog.com/article-tour-d-horizon-sur-les-pratiques-des-sages-femmes-et-les-accouchements-a-domicile-49918720.html
+http://a2f-filters.com/
+http://aac.asm.org/cgi/content/short/49/7/2887
+http://aapc.org/content/aapc-accredited-centers
+http://aaronic.xanga.com/
+http://aaru-tuesday.blogspot.com/
+http://abaculus.net/
+http://abaff.wordpress.com/
+http://abampere.com.ar/
+http://abanicarte.blogspot.com/
+http://abanicarte.blogspot.com/2010/02/sorteooooooooo.html
+http://abask.com.au/
+http://abastardize.d0m.us/j1208z21-money-clip-art-free.html
+http://abbys-table.com/
+http://abdielsroom.blogspot.com/
+http://abditory08.tumblr.com/
+http://abecedariumnyc.com/
+http://aberdevine.spaces.live.com/
+http://aberrator.astronomy.net/
+http://abey-s.blogspot.com/
+http://abhorrer.skyrock.com/
+http://abigail-breslin.net/
+http://abisomeone.blogspot.com/
+http://ablushofrose.com/index.html
+http://ablyasiancuisine.com/
+http://abobradiario.blogspot.com/
+http://abolisher.xwlegacy.net/main.htm
+http://abolitionist-john-brown.blogspot.com/
+http://abortion-not.org/
+http://abpweb.tre.state.ma.us/
+http://abraum.net/
+http://abridgedseries.wikia.com/
+http://abscond.org/
+http://absent-mindedly.tumblr.com/
+http://absenteeism.org/
+http://absenter.org/
+http://absi-usa.com/
+http://absinthe.msjekyll.com/
+http://absinthian-alchemist.deviantart.com/art/sasori-GB-color-61376639
+http://absolutist.com/
+http://absolutist.com/bubbles/
+http://absolver.sourceforge.net/
+http://absorb.it/
+http://abstentious.blogspot.com/
+http://abstract.desktopnexus.com/
+http://abstractedmind.com/
+http://abstractioned.com/
+http://abstractor.tv/
+http://abstrusegoose.com/
+http://absurditiesabounding.blogspot.com/
+http://absurdlycool.com/
+http://abundantia-im.com/
+http://abwall.com/ABROMA
+http://abyss.sourceforge.net/
+http://abyssopelagic.deviantart.com/
+http://acacin.deviantart.com/
+http://academicals.blogspot.com/
+http://acanaus.org/
+http://acanthaceous.tumblr.com/
+http://acanthologies.blogspot.com/
+http://acapulcobeachresort.com/
+http://acarainstitute.org/
+http://acarainstitute.wordpress.com/
+http://acarol.woz.org/
+http://accent.gmu.edu/
+http://accessify.com/
+http://accessorius.tumblr.com/
+http://accidentalism.blogspot.com/
+http://accidierecords.blogspot.com/
+http://accismus.com/
+http://acclaimmag.com/
+http://acclivitysoftware.com/
+http://accommodatingly.livejournal.com/
+http://accordionspieler.blogspot.com/
+http://accosted.net/
+http://accountinginfo.com/study/accrual-101.htm
+http://accoutertire.net/
+http://accrescent.com/
+http://accrescent.com/about/careers/
+http://accuratepregnancytests.com/
+http://accursedshare.blogspot.com/
+http://ace.nd.edu/
+http://acemetric.blogspot.com/
+http://acemetric.blogspot.com/2009/11/rickys-volume-cutter-with-leader-steel.html
+http://acephala.org/
+http://acephalous.typepad.com/
+http://acerbicbubblegum.blogspot.com/
+http://acerbity.org/
+http://acetification.yoyohost.com/index.html
+http://acetose.blogger.com.br/
+http://acetylsalicylate.blogspot.com/
+http://achango.com/
+http://achilleanfrailty.blogspot.com/
+http://achingdebts.com/
+http://achromatous.deviantart.com/
+http://achromic-instantanist.blogspot.com/
+http://achtel.com/
+http://achtel.com/Castoro/
+http://acmatic.tumblr.com/
+http://acnekit.neutrogena.com/
+http://acronyms.thefreedictionary.com/HTTPS
+http://acsap.army.mil/
+http://activismchange.com/internet-activism/circumcision-foreskin-restoration-www-sites-2087816.html
+http://adaa.adobe.com/
+http://adaeakins.2424blog.com/
+http://adamchaney.com/
+http://adc.bmj.com/content/50/1/76.full.pdf
+http://addagram.mytestbench.com/WORD.LST
+http://addons.eventscripts.com/addons/view/AceRatesPython
+http://addons.oscommerce.com/info/1233
+http://adodb.sourceforge.net/
+http://adsabs.harvard.edu/abs/2010ApJS..189..240C
+http://advaitavedantameditations.blogspot.com/2006/04/how-religion-and-often-spirituality.html
+http://aem.asm.org/cgi/content/full/74/22/6832
+http://afsjournals.org/doi/abs/10.1577/H05-002.1
+http://aidandabet.org/
+http://ajrcmb.atsjournals.org/cgi/content/short/31/5/491
+http://ajs.sagepub.com/content/13/2/128.full.pdf%3Fck%3Dnck
+http://alabut.com/
+http://alaurenabele.com/
+http://alicewhite.wordpress.com/
+http://alienabduction247.com/
+http://allaboutaboriginalart.blogspot.com/
+http://almaer.com/blog/jst-javascript-templates
+http://almaer.com/blog/keeping-ssh-sessions-alive-with-mac-os-x-terminal
+http://alouche.net/
+http://alternativehealing.org/ci%20wu%20jia.htm
+http://altmedicine.about.com/od/healthquizzesandtools/a/hypochlorhydria.htm
+http://amadeusza.mysquare.in.th/post/2901/Korea+WC+FEVER
+http://ambiguousalliteration.blogspot.com/
+http://ame-www.usc.edu/bio/udwadia/papers/A_new_perspective.pdf
+http://andreasviklund.com/learn/how-to-change-the-andreas01-header-image/
+http://andrewisaacs.com/
+http://anglicansablaze.blogspot.com/
+http://animal.discovery.com/videos/animal-armageddon-acanthodian.html
+http://animaldiversity.ummz.umich.edu/site/accounts/pictures/Abrocomidae.html
+http://answers.encyclopedia.com/question/unique-chordata-112774.html
+http://answers.yahoo.com/question/index?qid=20100107152620AA3WTbL
+http://answers.yahoo.com/question/index?qid=20100427035320AAGnFEz
+http://anthro.palomar.edu/change/change_3.htm
+http://anthromuseum.missouri.edu/minigalleries/handaxes/intro.shtml
+http://anthurium.miami.edu/home.htm
+http://antoine.frostburg.edu/chem/senese/101/history/faq/antoines-elements.shtml
+http://aob.oxfordjournals.org/cgi/reprint/os-22/4/593.pdf
+http://aoc.yg.com/item/acheronian-chestguard-of-the-keeper?h=hlIlr1yx
+http://app.buyaccessible.gov/baw/
+http://apparitionabolishers.com/
+http://appworld.blackberry.com/webstore/content/12527
+http://archaeology.about.com/od/hterms/g/handaxe.htm
+http://archimer.ifremer.fr/doc/2003/publication-706.pdf
+http://ard.bmj.com/content/36/4/343.full.pdf
+http://armorgames.com/community/thread/3351423/quick-legend-z7-guide
+http://article.pubs.nrc-cnrc.gc.ca/ppv/RPViewDoc?issn=1480-3291&volume=47&issue=21&startPage=3989
+http://articles.latimes.com/2007/nov/25/nation/na-shoot25
+http://articles.latimes.com/2010/aug/01/entertainment/la-ca-fcc-ruling-20100801
+http://arturovasquez.wordpress.com/
+http://arxiv.org/pdf/hep-th/0601189
+http://ashango.org/
+http://ashleyangell.com/
+http://askjan.org/media/Psychiatric.html
+http://assets.cambridge.org/97805217/81176/index/9780521781176_index.pdf
+http://assets.cambridge.org/97805218/83030/index/9780521883030_index.pdf
+http://authors.library.caltech.edu/10999/
+http://authors.library.caltech.edu/8141/
+http://avalon.law.yale.edu/18th_century/sp1795.asp
+http://avirubin.com/absent.pdf
+http://azucar.dokyun.jp/archive/l-72161.html
+http://barney.gonzaga.edu/~aburton/crochet2.html
+http://benblogged.com/?p=16
+http://benjaminsterling.com/web-20-is-not-a-design-aesthetic/
+http://bible.cc/matthew/23-12.htm
+http://bigthink.com/ideas/21472
+http://biology.unm.edu/ccouncil/Biology_124/Summaries/Macromol.html
+http://bitbucket.org/jespern/bitbucket/issue/1754/abort-http-error-500-internal-server-error
+http://bitbucket.org/openid/ab/wiki/Home
+http://blackboard.unc.edu/
+http://blankcanvasradio.podomatic.com/
+http://blog.absenter.org/
+http://blog.aspire2wealth.net/
+http://blog.brandverity.com/
+http://blog.goo-net.com/corvette/archive/16
+http://blog.mises.org/3725/we-want-to-protect-you-from-wal-mart/
+http://blog.qlep.com/blog.php/23010/31752?categ=1&year=2010&month=9
+http://blog.thevenao.com/2009/12/abrase.html
+http://blog.tmcnet.com/blog/tom-keating/mobile-phones/new-treo-680-smartphone-for-mobile-accomplishers.asp
+http://blog.vovici.com/blog/bid/43159/X-Marks-the-MR-Spot-Abbreviate-Market-Research-as-MRX
+http://blog.zap2it.com/frominsidethebox/2006/11/review-my-boys.html
+http://blogs.alfresco.com/wp/wabson/2010/02/25/adding-custom-aspect-support-in-alfresco-share/
+http://blogs.alternet.org/speakeasy/2010/08/23/black-man-who-looked-vaguely-muslimish-accosted-at-ny-anti-islam-protest/
+http://blogs.chron.com/sciguy/archives/2010/03/new_yawk_accent_fading_linguists_say_what_of_the_t.html
+http://blogs.computerworld.com/digg_dug_buried_how_linux_news_disappears
+http://blogs.dion.ne.jp/aide/archives/2007869.html
+http://blogs.dion.ne.jp/family/archives/841907.html
+http://blogs.houstonpress.com/rocks/2008/08/turning_the_screw_5th_ward_boy.php
+http://blogs.msdn.com/b/brada/
+http://blogs.msdn.com/b/ie/archive/2008/04/23/what-happened-to-operation-aborted.aspx
+http://blogs.nwaonline.com/slophouse/2010/09/fayetteville-abuzz-as-game-week-begins/
+http://blogs.securiteam.com/index.php/archives/826
+http://blogs.telegraph.co.uk/news/danielhannan/100048633/david-cameron-is-right-the-eu-is-treating-turkey-abominably/
+http://blogs.ubc.ca/lillienne/
+http://blue.regence.com/trgmedpol/radiology/rad41.html
+http://boards.lineage.com/showthread.php?s=2a02494d1277ba035a81e07e2196f6d8&p=192354
+http://boston.indymedia.org/feature/display/187924
+http://botanical.com/botanical/mgmh/w/wormwo37.html
+http://botany.csdl.tamu.edu/FLORA/imaxxaca.htm
+http://botany.cz/cs/zelkova-abelicea/
+http://brianinmunich.com/
+http://brsts.com/
+http://bryantmanning.typepad.com/
+http://bugs.endian.com/roadmap_page.php
+http://buyback.abebooks.com/
+http://bytes.com/topic/python/answers/24185-counting-unicode-graphemes-python
+http://ca.wiktionary.org/wiki/abdicant
+http://cactiguide.com/cactus/?genus=Acanthocereus
+http://cadlab.hanyang.ac.kr/zboard/view.php?id=course03&page=1&sn1=&divpage=1&pgi=&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=10&pgi=
+http://cafehayek.com/2007/05/stealth_site.html
+http://cagrid.org/display/knowledgebase/Using+Abstract+Schema+Types
+http://cal.vet.upenn.edu/projects/derm/Home/ADNEXAL/follic/infun.htm
+http://caliban.mpiz-koeln.mpg.de/haeckel/challenger/Acantharia/Acantharia.htm
+http://caliban.mpiz-koeln.mpg.de/haeckel/challenger/Chap06.htm
+http://calphotos.berkeley.edu/browse_imgs/plant_sci_8.html
+http://calphotos.berkeley.edu/browse_imgs/reptile_sci_1.html
+http://calphotos.berkeley.edu/flora/sci-A.html
+http://caltecheerl.library.caltech.edu/208/
+http://caltecheerl.library.caltech.edu/329/
+http://cameochemicals.noaa.gov/chemical/2981
+http://cameraobscura.busdraghi.net/2007/modern-accademism-photo-quai/
+http://canadiansabreast.abcn.ca/
+http://cancerres.aacrjournals.org/content/59/18/4529.short
+http://candidapage.com/aldehyde.shtml
+http://candidengineer.blogspot.com/
+http://carcin.oxfordjournals.org/content/18/7/1351.short
+http://casesjournal.com/content/2/1/9328
+http://catholic-resources.org/Bible/History-Abraham.htm
+http://catsthegang.com/webboard/view.php?topic=9
+http://cd.textfiles.com/suzybatari2/wordwork/dicwords/wordlist.txt
+http://cdnl.kaist.ac.kr/LABjournal/25.pdf
+http://ch-recommend02.jugem.jp/?eid=5112
+http://chemicalland21.com/info/VERMICIDES.htm
+http://chemicalland21.com/specialtychem/finechem/ACENAPHTHENE.htm
+http://chestjournal.chestpubs.org/content/112/4/1132.full.pdf
+http://chestofbooks.com/animals/zoology/Life/Plate-XI-Common-Starfish-Asterias-Rubens-Linn.html
+http://chestofbooks.com/reference/Encyclopedia-Of-Practical-Receipts-And-Processes/
+http://childrenswellnessfoundation.org/information_center/packing_your_own_food_storage/packing_with_oxygen_absorbers.htm
+http://christianmetalrealm.niceboard.com/christian-metal-realm-f4/mastedon-john-elefante-t13944.htm
+http://chronicle.com/
+http://chuma.cas.usf.edu/~garey/rotacanth.html
+http://churchandliturgy.blogspot.com/
+http://ci.nii.ac.jp/naid/110001013069
+http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.164.1837&rep=rep1&type=pdf
+http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.40.799
+http://cl.aist-nara.ac.jp/~yotaro-w/blog/blosxom.cgi/newyork/20070716.htm
+http://classiclit.about.com/od/literaryterms/Glossary_Terms.htm
+http://climateprediction.net/science/pubs/martlet.pdf
+http://climateprogress.org/2010/02/18/ocean-acidification-study-mass-extinction-of-marine-life-nature-geoscience/
+http://climateprogress.org/2010/06/01/record-heat-wave-may/
+http://clipmarks.com/clipmark/E004BF23-BDFE-475B-9C6C-E9E9229AD051/
+http://closingablaze.com/
+http://code.google.com/apis/gadgets/docs/fundamentals.html
+http://code.google.com/p/accessive/
+http://code.google.com/p/amor-ros-pkg/downloads/detail?name=rosinstall-hg-patch
+http://code.google.com/p/furigana-injector/issues/detail?id=27
+http://comics.com/lil_abner_classics/
+http://commons.wikimedia.org/wiki/Acineta_(Orchidaceae)
+http://community-2.webtv.net/Toomuwik/Abrasax/
+http://community.livejournal.com/absonant
+http://community.livejournal.com/hold_my_pocket
+http://confluence.atlassian.com/display/JIRA/Running+JIRA+over+SSL+or+HTTPS
+http://consc.net/misc/achromat.html
+http://content.karger.com/ProdukteDB/produkte.asp?Aktion=ShowFulltext&ArtikelNr=18107&Ausgabe=225582&ProduktNr=224164
+http://convention3.allacademic.com/meta/p74323_index.html
+http://converter.eu/capacitance/
+http://courses.cs.vt.edu/~cs2604/SummerII_2005/Homework/4/LargeDictionary.txt
+http://cricket.sourceforge.net/aberrant/rrd_hw.htm
+http://cseweb.ucsd.edu/classes/fa08/cse130/pa6/words
+http://cseweb.ucsd.edu/~goguen/pps/manif.ps
+http://cssmayo.com/preview/chocotheme/
+http://cvm.msu.edu/alumni-friends/continuing-education/r-and-t
+http://cvu.rediris.es/pub/bscw.cgi/0/475136
+http://cyncity.typepad.com/cyn_city/2004/07/anish_kapoors_c_1.html
+http://daniel.lorch.cc/docs/ajax_simple/
+http://daringfireball.net/2010/07/improved_regex_for_matching_urls
+http://dashengchemical.en.chemnet.com/
+http://davesgarden.com/guides/pf/go/756/
+http://davidrothman.net/OpenMedSpel%20100.dic
+http://dawninfo.samhsa.gov/
+http://dcrp.ced.berkeley.edu/programs/undergraduate
+http://de.academic.ru/dic.nsf/meyers/112602/Quaddel
+http://dealbook.blogs.nytimes.com/2010/09/16/setback-for-ackman-in-stuyvesant-town-bid/
+http://delong.typepad.com/sdj/2006/11/when_books_atta.html
+http://delta-intkey.com/angio/www/acanthac.htm
+http://delta-intkey.com/angio/www/aceracea.htm
+http://delta-intkey.com/angio/www/achariac.htm
+http://delta-intkey.com/britin/col/www/staphyli.htm
+http://dermatology.cdlib.org/124/case_presentations/acanthoma/arida.html
+http://dermatology.cdlib.org/1504/case_presentations/sorafenib_acne/fleta.html
+http://desicritics.org/2009/12/20/110556.php
+http://desire4wealth.seesaa.net/article/10945172.html
+http://detail.en.china.cn/provide/detail,1083837120.html
+http://developer.apple.com/library/mac/
+http://dialogic.blogspot.com/
+http://diaryofaneccentric.wordpress.com/
+http://dictionary.die.net/ablest
+http://dictionary.reference.com/browse/Aberrate
+http://dictionary.reference.com/wordoftheday/archive/2010/08/10.html
+http://dictionary.reverso.net/french-english/abscisse
+http://dictionary.sensagent.com/abscind/en-en/
+http://dictionary.sensagent.com/acoumeter/en-en/
+http://dictionnaire.reverso.net/francais-anglais/acidifiant
+http://digital.csic.es/handle/10261/9248
+http://digitalcommons.unl.edu/cgi/viewcontent.cgi?article=1001&context=onlinedictinvertzoology
+http://digitallibrary.amnh.org/dspace/handle/2246/1561
+http://digitallibrary.amnh.org/dspace/handle/2246/687
+http://disneyparks.disney.go.com/blog/2010/05/interactive-image-sun-sets-over-spaceship-earth/
+http://divinecosmos.com/
+http://dmna.state.ny.us/forts/fortsM_P/nycForts.htm
+http://docs.elgg.org/wiki/Https_login_turned_on_accidently
+http://docs.jquery.com/UI/Accordion
+http://doi.ieeecomputersociety.org/10.1109/SNPD-SAWN.2005.22
+http://dominique.co.kr/
+http://download-llnw.oracle.com/javase/1.5.0/docs/guide/net/articles/connection_release.html
+http://download-llnw.oracle.com/javase/tutorial/collections/interfaces/examples/dictionary.txt
+http://dps.dgs.virginia.gov/DPS/DownLoad/UPS%20Accessorial%20Fees.pdf
+http://drexfiles.wordpress.com/category/sternbach/
+http://drools-java-rules-engine.46999.n3.nabble.com/from-accumulate-somevar-td834882.html
+http://dsal.uchicago.edu/dictionaries/macdonell/
+http://dsc.discovery.com/news/2008/09/19/plants-stress-aspirin.html
+http://dspace.anu.edu.au/bitstream/1885/41633/1/WP16.pdf
+http://dspace.itg.be/handle/10390/2668
+http://eap.ucop.edu/
+http://earthquake.usgs.gov/learn/glossary/?term=accretionary%20wedge
+http://ebooks.adelaide.edu.au/i/irving/washington/i72a/part17.html
+http://ec.europa.eu/education/lifelong-learning-policy/doc48_en.htm
+http://ec3.state.nm.us/ucp/
+http://eccocosavedo.blogspot.com/2009/11/lo-sfruttamento-delle-masse-accresce.html
+http://ecos.fws.gov/speciesProfile/profile/speciesProfile.action?spcode=G01J
+http://edis.ifas.ufl.edu/fe752
+http://education.yahoo.com/reference/dictionary/entry/acarpous
+http://education.yahoo.com/reference/dictionary/entry/achlorophyllous
+http://egreyes.blogspot.com/
+http://egyrace.com/vb/archive/index.php/t-102338.html
+http://email.secureserver.net/
+http://emedicine.medscape.com/article/1072536-overview
+http://emo-skittles.deviantart.com/
+http://en.academic.ru/dic.nsf/enwiki/1095705
+http://en.academic.ru/dic.nsf/enwiki/431924
+http://en.p-10.ru/guide/academy/
+http://en.scientificcommons.org/58853044
+http://en.wiktionary.org/wiki/Abderite
+http://encyclopediadramatica.com/I_accidentally_X
+http://english.peopledaily.com.cn/90001/90782/7114409.html
+http://entertainment.timesonline.co.uk/tol/arts_and_entertainment/books/article4799560.ece
+http://entnemdept.ufl.edu/creatures/misc/bees/tracheal_mite.htm
+http://environmentalchemistry.com/yogi/chemicals/cn/Acetyl%A0Peroxide.html
+http://envirowonk.com/content/view/182/1/
+http://eprints.iisc.ernet.in/6760/
+http://eprints.lib.hokudai.ac.jp/dspace/bitstream/2115/3112/1/KJ00002377096.pdf
+http://eprints.lib.hokudai.ac.jp/dspace/bitstream/2115/36748/1/22_2_p247-257.pdf
+http://eprints.qut.edu.au/5172/
+http://eprints.utas.edu.au/3043/5/5_geochemistry.pdf
+http://eprints.utm.my/8116/1/8116.pdf
+http://es.kioskea.net/faq/132-ie-problemas-para-acceder-a-paginas-seguras-https-ssl
+http://esa.un.org/iys/achievable.shtml
+http://escholarship.org/uc/item/01p476qd.pdf
+http://escholarship.org/uc/item/7j58b5r1.pdf
+http://escholarship.org/uc/item/9m24b935.pdf
+http://estore.honda.com/
+http://ethnicity.rutgers.edu/~jlynch/Texts/absalom.html
+http://evangelicalapologist.blogspot.com/
+http://exhibitanewsboston.com/
+http://exoticpets.about.com/cs/rarespecies/p/landsnails.htm
+http://extension.missouri.edu/publications/displaypub.aspx?p=g7701
+http://extension.missouri.edu/xplor/envqual/eq0401.htm
+http://extension.oregonstate.edu/catalog/pdf/ec/ec1560-e.pdf
+http://ezinearticles.com/?Abrotanum---For-a-Child-Failing-to-Thrive&id=4722980
+http://ezinearticles.com/?Transportation-and-Logistics---Accessorial-Fees-Can-Sink-a-Business&id=3645676
+http://ezinearticles.com/?What-is-Acarophobia?&id=1487926
+http://f2.org/humour/language/oddwords.html
+http://f89jclass.blogspot.com/
+http://faculty.lagcc.cuny.edu/garyrichmond/PDF_Research/CA%2022%20(2)%202008%20-1.%20Cultural%20Pragmatims.pdf
+http://familydoctor.org/online/famdocen/home/healthy/firstaid/basics/205.html
+http://fashion-holic.269g.net/article/2751961.html
+http://fc.barcelona.com/eric_abidal
+http://featurekong.com/screenshots/feature/f7.html
+http://fedexfreight.fedex.com/AccessorialRates.pdf?link=3
+http://fedoraproject.org/wiki/Releases/11/FeatureList
+http://feis-crs.org/downloads/Crs3Keywords.pdf
+http://fetus.ucsfmedicalcenter.org/twin/learn_more_trap.asp
+http://ffxi.somepage.com/itemdb/abjuration.php
+http://fightcps.com/
+http://fightthesmears.com/articles/15/wildaccusations.html
+http://files.codes-sources.com/fichier.aspx?id=32452&f=ods5.txt
+http://financial-dictionary.thefreedictionary.com/Accrual+Accounting
+http://fishbase.org/summary/SpeciesSummary.php?id=268
+http://foodday.ca/food-day-2010/events/les-jardins-sauvages-saint-roch-de-lachigan-quebec/
+http://forrestandabbie.blogspot.com/
+http://forteanswest.com/wordpress-mu/blog/tag/events/
+http://forum.soft32.com/mac/Advantages-video-card-upgrade-ftopict109979.html
+http://forum.synology.com/enu/viewtopic.php?f=38&t=21008
+http://forum.tunisia.com/hotels/4908-hotels-sbeitla-kasserine-2.html
+http://forum.xda-developers.com/showthread.php?t=790560&page=6
+http://forum2.mobile-review.com/showthread.php?p=890454
+http://forums.achaea.com/
+http://forums.alliedmods.net/showthread.php?t=99871
+http://forums.macrumors.com/showthread.php?t=1007056
+http://forums.msexchange.org/fb.aspx?m=1800413566
+http://forums.techarena.in/vista-music-video/891864.htm
+http://forums.theplanet.com/lofiversion/index.php/t34983.html
+http://fr.wiktionary.org/wiki/ablactation
+http://freelanceswitch.com/clients/the-ultimate-design-brief/
+http://french.about.com/od/verb_conjugations/a/acheter.htm
+http://frienditto.livejournal.com/
+http://frontierhistory.blogspot.com/
+http://fscimage.fishersci.com/msds/00140.htm
+http://g6pddeficiency.org/index.php?cmd=contraindicated
+http://galaxiesablaze.com/
+http://gallery.theopalgroup.com/selectoracle/
+http://gawker.com/5479763/vampyre-for-president-absconded-with-child-bride-after-youtube-proposal
+http://gawker.com/5618515/wikileaks-founder-julian-assange-accused-then-immediately-un+accused-of-rape
+http://geography.about.com/b/2010/09/07/internet-access-less-than-universal.htm
+http://geology.com/articles/racetrack-playa-sliding-rocks.shtml
+http://geology.geoscienceworld.org/cgi/content/abstract/36/5/355
+http://georges.dolisi.free.fr/Terminologie/A/abouchement.htm
+http://german.about.com/library/blcase_acc2.htm
+http://get.adobe.com/reader/
+http://ghr.nlm.nih.gov/condition/achondroplasia
+http://ghr.nlm.nih.gov/condition=methylmalonicacidemia
+http://gigaom.com/collaboration/is-email-a-curse-or-a-boon/
+http://github.com/dominikh/weechat-ruby
+http://gizmodo.com/5583639/lawsuit-accusing-apple-and-att-of-an-iphone-monopoly-granted-class+action-status
+http://gizmodo.com/5600013/full+size-man-gives-tour-of-his-absurdly-tiny-house
+http://glambone.blogspot.com/
+http://globalvoicesonline.org/2009/08/01/iran-leading-reformist-abthai-on-trial/
+http://gmailblog.blogspot.com/2010/01/default-https-access-for-gmail.html
+http://goatconnection.com/articles/publish/article_72.shtml
+http://gonexc.wordpress.com/
+http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html
+http://gop.com/index.php/learn/accomplishment/
+http://grammar.ccc.commnet.edu/grammar/abbreviations.htm
+http://granniepannie.blogspot.com/2007/01/every-word-in-english-language.html
+http://grasasyaceites.revistas.csic.es/index.php/grasasyaceites/article/download/130/130
+http://grungecake.com/
+http://guide.hfea.gov.uk/
+http://gulliver.trb.org/publications/tcrp/tcrp_lrd_01.pdf
+http://hab.hrsa.gov/tools/palliative/
+http://hackademix.net/2010/07/28/abe-patrols-the-routes-to-your-routers/
+http://hacks.mozilla.org/2010/09/hardware-acceleration/
+http://hal.archives-ouvertes.fr/inria-00269209/en/
+http://hal.inria.fr/inria-00269209
+http://hal.inria.fr/inria-00336464/fr/
+http://harperteen.com/search/index.aspx?kw=abhorsen
+http://hazen.ciw.edu/trilobites
+http://hcesocal.ache.org/
+http://hel.univ.gda.pl/info/helmarinestation.htm
+http://helpdeskgeek.com/how-to/windows-was-unable-to-find-a-certificate-to-log-you-on-to-the-network/
+http://history.nasa.gov/SP-4205/ch4-2.html
+http://history.wisc.edu/sommerville/367/Coppe%20Fiery.htm
+http://historywillabsolvemike.blogspot.com/
+http://home-and-garden.webshots.com/photo/2759085770056833250bYXsNY
+http://home.earthlink.net/~dick156/
+http://home.global.co.za/~peabrain/achatina.htm
+http://home.howstuffworks.com/abelia.htm
+http://home.netcom.com/~dewmusic/
+http://home.online.no/~araronse/Mycenakey/acicula.htm
+http://home.wanadoo.nl/marco.langbroek/acheul.html
+http://homepage.mac.com/cparada/GML/MapAchaeansTrojans.html
+http://homepages.rootsweb.ancestry.com/~sam/terms.html
+http://howellabie.blogspot.com/
+http://hr.depaul.edu/ContributionFolder/Documents/Benefits/Manager%20FMLA%20%20Disability%20FAQs.pdf
+http://httpd.apache.org/docs/2.0/programs/ab.html
+http://hub.hku.hk/handle/10722/77012
+http://hubpages.com/hub/Famous-Aborigines
+http://humphreys.korea.army.mil/Passports
+http://humrep.oxfordjournals.org/cgi/content/short/15/7/1597
+http://hypebeast.com/2009/06/kanye-west-feat-glc-consequence-spaceship-video/
+http://hyves.mn/419/luau-activities/luau-birthday-cake.html
+http://hyves.mn/614/sketchers-postage/sketchers-shindigs-miracle.html
+http://iafdb.travel.state.gov/
+http://ibatis.apache.org/about.html
+http://ibatis.apache.org/tools/abator/
+http://icb.oxfordjournals.org/content/46/4/508.full
+http://ifla.org/IV/ifla71/papers/061e-Audunson.pdf
+http://ihasahotdog.com/2008/12/06/funny-dog-pictures-is-abomin-iz-snow-puppy/
+http://ilearn.sfsu.edu/
+http://imagine.gsfc.nasa.gov/docs/ask_astro/answers/001106a.html
+http://importance.corante.com/archives/2006/03/20/kitchen_academy_the_hollywood_cookbook_and_guest_chef_michael_montilla_march_18th.php
+http://informahealthcare.com/doi/pdf/10.3109/17453679709004002
+http://insects.ummz.lsa.umich.edu/ACARINA/
+http://intotheinfrastructure.blogspot.com/
+http://inventors.about.com/od/qrstartinventors/a/orgone.htm
+http://ipm.illinois.edu/diseases/rpds/610.pdf
+http://is-academia.epfl.ch/
+http://isi.kfupm.edu.sa/journals/pdf/A/acidic_properties_of_hzsm_5_using_aceton_seddigi_isi_000177929800002.pdf
+http://islamicstudies.stanford.edu/
+http://issues.apache.org/jira/browse/WICKET-609
+http://italiasalute.leonardo.it/news.asp?ID=6862
+http://itjobsinpittsburgh.blogspot.com/
+http://jama.ama-assn.org/cgi/reprint/100/22/1766.pdf
+http://java.ociweb.com/mark/programming/Abator.html
+http://java.ociweb.com/mark/programming/iBATIS.html
+http://jazzyshade.blog58.fc2.com/blog-entry-14.html
+http://jb.asm.org/cgi/content/short/187/16/5782
+http://jb.asm.org/cgi/reprint/17/1/1.pdf
+http://jcb.rupress.org/content/65/1/51.full.pdf
+http://jcp.bmj.com/content/41/7/716.full.pdf
+http://jdr.sagepub.com/cgi/content/abstract/80/9/1828
+http://jem.rupress.org/content/89/6/681.full.pdf
+http://jenniverse.com/boppin%20main.html
+http://jesseliberty.com/2010/07/29/12-absolutely-and-insanely-essential-utilities-for-programmers/
+http://jezebel.com/5597755/self+absorbed-columnist-masters-redefines-the-art-of-crap-emails
+http://jinmachem.en.alibaba.com/
+http://jmedicalcasereports.com/content/2/1/372
+http://jmedicalcasereports.com/content/4/1/36
+http://jmg.bmj.com/content/27/4/277.1.full.pdf
+http://jmibanez.livejournal.com/
+http://jn.nutrition.org/cgi/content/full/129/1/9
+http://johnabuzz.blogspot.com/
+http://joi.jlc.jst.go.jp/JST.JSTAGE/cl/2009.804?from=Google
+http://journal.media-culture.org.au/index.php/mcjournal/article/view/46
+http://journals.cambridge.org/abstract_S0007485300054419
+http://journals.iucr.org/b/issues/2000/06/00/bm0031/bm0031.pdf
+http://jpet.aspetjournals.org/content/243/2/686.short
+http://jvi.asm.org/cgi/content/abstract/77/13/7182
+http://jw-chem.en.alibaba.com/
+http://karmatics.com/aardvark/
+http://karyan-ism.blogspot.com/
+http://kb2.adobe.com/cps/142/tn_14213.html
+http://kdk-interview.seesaa.net/article/4323100.html
+http://kidney.niddk.nih.gov/kudiseases/pubs/tubularacidosis/
+http://kidshealth.org/teen/sexual_health/contraception/abstinence.html
+http://kimballsoftware.com/abnet/
+http://kisa.ca/scrabble/index.html
+http://kissacloud.blogspot.com/
+http://kkeita5129.blog8.fc2.com/blog-entry-196.html
+http://knol.google.com/k/making-a-chroma-key-on-a-low-budget
+http://knowyourmeme.com/memes/i-accidentally
+http://kotaku.com/5583103/keeping-abreast-of-final-fantasy-xivs-character-customization
+http://labs.mininova.org/wordmatch/wordlist.txt
+http://lakersblog.latimes.com/lakersblog/2010/09/luke-walton-is-not-taken-aback-by-his-summer-regimen.html
+http://languagelog.ldc.upenn.edu/nll/?p=1849
+http://latimesblogs.latimes.com/lanow/2010/09/absconded-parolee-named-prime-suspect-in-slaying-of-valley-village-woman.html
+http://law.jrank.org/pages/7663/Inquisitorial-System.html
+http://lds.org/pa/display/0,17884,4645-1,00.html
+http://learningcsharpisfun.blogspot.com/
+http://legal-dictionary.thefreedictionary.com/accessory
+http://letras.terra.com.br/abacinate/
+http://lgca.obs.ujf-grenoble.fr/perso/amanceau/pdf/GCA-Matynia-2010_EA.pdf
+http://library.duke.edu/uarchives/history/histnotes/julian_abele.html
+http://library.thinkquest.org/CR0215471/acid_rain.htm
+http://lifeabundantly-alim.blogspot.com/
+http://lifemoreabundant.wordpress.com/
+http://lilandra.com/blog/
+http://lisar.lss.wisc.edu/
+http://listography.com/acatalepsia
+http://littera-abactor.livejournal.com/7748.html
+http://loftednest.blogspot.com/
+http://lostandfoundandconnectionsabound.blogspot.com/
+http://macapper.com/2007/09/29/rage-button-design-license-winners/
+http://macromite.wordpress.com/
+http://mail.google.com/mail/help/about_whatsnew.html
+http://mail.google.com/support/bin/answer.py?hl=en&answer=50220
+http://maki6544.seesaa.net/article/14531052.html
+http://mall.turnpike.net/C/cs/ns.htm
+http://mamchenkov.net/wordpress/wp-content/domains.txt
+http://marchforabolition.org/
+http://marenda.biz/
+http://marineengineparts.com/shopsite_sc/store/html/page348.html
+http://mathieu.abassin.free.fr/
+http://mathworld.wolfram.com/AbelianGroup.html
+http://mathworld.wolfram.com/Abscissa.html
+http://mattmcgill.me/
+http://mayren.blogspot.com/
+http://mbe.oxfordjournals.org/cgi/content/abstract/21/10/1950
+http://mcb.asm.org/cgi/content/abstract/24/17/7795
+http://mediamatters.org/research/201005060034
+http://mediamatters.org/research/201008050016
+http://medical-dictionary.thefreedictionary.com/abdominocentesis
+http://medind.nic.in/iaf/t03/i2/iaft03i2p54.pdf
+http://mgames.absolutist.com/
+http://microbewiki.kenyon.edu/index.php/Acetobacter
+http://microbewiki.kenyon.edu/index.php/Brucella_abortus
+http://milwaukeeachiever.org/
+http://mises.org/books/Theory_Money_Credit/Contents.aspx
+http://missourifamilies.org/features/nutritionarticles/nut68.htm
+http://mkweb.bcgsc.ca/carpalx/words.txt
+http://mmabbasi.com/
+http://mobilerspirit.seesaa.net/article/24597571.html
+http://mocoloco.com/fresh2/2010/07/11/radarrr-floorlamp-by-ingo-maurer.php
+http://mollus.oxfordjournals.org/cgi/content/short/72/3/295
+http://moodle.uniag.sk/node/50
+http://mootools.net/docs/more/Fx/Fx.Accordion
+http://msds.chem.ox.ac.uk/AC/acenaphthene.html
+http://msds.chem.ox.ac.uk/CO/copper_acetoarsenite.html
+http://msds.chem.ox.ac.uk/glovesbychemical.html
+http://msexchangeteam.com/archive/2010/02/04/453946.aspx
+http://msmobiles.com/news.php/9212.html
+http://mwave.irq.hu/passportcontrol.eu/index.php?nyelv=eng&modul=menupontok&kod=1142
+http://my.barackobama.com/barackspeech
+http://my.clevelandclinic.org/heart/services/tests/procedures/ablation.aspx
+http://my.speedtv.com/achatcialisfranceg
+http://my.speedtv.com/achetercialisenfranceg
+http://mydocs.epri.com/docs/public/000000000001018363.pdf
+http://mysite.verizon.net/cbladey/irish/HomePage.triads.html
+http://mystuff.buildabear.com/
+http://nadeausoftware.com/node/79
+http://nat2pred.rit.albany.edu/
+http://nemo-nusquam.blogspot.com/
+http://net.educause.edu/edudomain/eligibility.asp
+http://neuromonitoring1.blogspot.com/2008/11/abret-changes-eligibility-requirement.html
+http://new.music.yahoo.com/kanye-west/news/kanye-west-i-bled-hard-over-swift-debacle--61988565
+http://news.bbc.co.uk/2/hi/programmes/newsnight/2968458.stm
+http://news.bookweb.org/news/trade-show-season-continues-mba-mpiba-siba
+http://news.cnet.com/8301-1001_3-20012992-92.html
+http://news.cnet.com/8301-30685_3-20007455-264.html
+http://news.firedoglake.com/2010/09/27/waxmans-abhorrent-broadband-bill-follows-google-verizon-deal/
+http://news.perlfoundation.org/tpf_steering_committee_draft_2_report_template.pdf
+http://nginx.org/en/docs/http/configuring_https_servers.html
+http://nicolas.hognon.com/blog/
+http://nieer.org/resources/research/AbecedarianStudy.pdf
+http://nikukyu.seesaa.net/article/17372742.html
+http://nixcraft.com/shell-scripting/14457-making-basic-http-request.html
+http://nobelprize.org/nobel_prizes/chemistry/laureates/1994/olah-lecture.pdf
+http://noemata.net/pre.txt/dict/eng.txt
+http://notabasement.com/
+http://nov55.com/ntyg.html
+http://ntacf.en.chemnet.com/
+http://ntp.niehs.nih.gov/index.cfm?objectid=03ECD36E-9470-D6B6-C224F9B7E6F4726C
+http://ntp.niehs.nih.gov/ntp/roc/eleventh/profiles/s001acet.pdf
+http://ntp.niehs.nih.gov/ntp/roc/eleventh/profiles/s162soot.pdf
+http://oceanacidification.wordpress.com/
+http://ojeriza7.tripod.com/est.taigan/
+http://old.nabble.com/gprof-time-accumulation-problem-td19125108.html
+http://online.unitconverterpro.com/conversion-tables/convert-alpha/capacitance.html
+http://online.wsj.com/article/SB10001424052748703686304575228582377071698.html
+http://onlinelibrary.wiley.com/doi/10.1002/adsc.200900099/pdf
+http://onlooker.g.hatena.ne.jp/syoboneko/?word=*%5B%E6%A4%9C%E7%B4%A2%E3%82%B5%E3%82%A4%E3%83%88%5D
+http://openmoney.info/sophia/index.html
+http://openmoney.info/techne/overview.html
+http://orbi.ulg.ac.be/handle/2268/28664
+http://orbi.ulg.ac.be/handle/2268/31952
+http://osdir.com/ml/culture.language.word-of-the-day/2004-01/msg00006.html
+http://outofbounds.nbcsports.com/2010/07/-espn-mysteriously-pulls.html.php
+http://p2pfoundation.net/Wealth_Acknowledgment_Systems
+http://pages.cs.wisc.edu/~bsettles/abner/
+http://pandasthumb.org/archives/2005/04/down-with-phyla-1.html
+http://paolorivera.blogspot.com/
+http://parasitology.informatik.uni-wuerzburg.de/login/n/h/0008.html
+http://patentabsurdity.com/
+http://patientoptout.com/
+http://paulgalvin.spaces.live.com/blog/
+http://pcp.oxfordjournals.org/content/1/1/63.full.pdf
+http://pearlcrescent.com/
+http://pen.sagepub.com/content/32/3/276.abstract
+http://penelope.uchicago.edu/Thayer/E/Roman/Texts/secondary/SMIGRA*/Abolla.html
+http://penelope.uchicago.edu/Thayer/L/Roman/Texts/Pliny_the_Elder/8*.html
+http://people.whitman.edu/~yancey/fish.html
+http://peperonity.com/go/sites/mview/achus.airtel
+http://petrology.oxfordjournals.org/cgi/reprint/27/5/1215.pdf
+http://phdb.moph.go.th/ewtadmin/ewt/hss_it/ewt_dl.php?nid=193
+http://phlegmfatale.blogspot.com/
+http://phrontistery.info/a.html
+http://phrontistery.info/shapes.html
+http://physics.nist.gov/Pubs/SP811/appenB9.html
+http://piex.publ.kth.se/modules/noun-animals.leo.txt
+http://plants.ifas.ufl.edu/node/23
+http://plants.usda.gov/java/profile?symbol=ABPR3
+http://plato.stanford.edu/entries/abstract-objects/
+http://plugins.jquery.com/project/Absolutize
+http://pokemonacanthite.com/
+http://pokemonacanthite.com/pokemon.php
+http://pond.dnr.cornell.edu/nyfish/Acipenseridae/acipenseridae.html
+http://portal.opengeospatial.org/files/?artifact_id=6716
+http://possibilitiesabound.blogspot.com/
+http://potency.berkeley.edu/chempages/ACETOXIME.html
+http://prawfsblawg.blogs.com/prawfsblawg/2008/08/laws-of-war-and.html
+http://precedings.nature.com/documents/4378/version/1
+http://prezi.com/yxvtypx-aani/activity-stream/
+http://products.howstuffworks.com/kidde-nighthawk-ac-combination-smoke-co-alarm-kn-cosm-ib-900-0114-review.htm
+http://profile.fanbox.com/
+http://profiles.friendster.com/newfiagirlfunk
+http://projectabronia.com/
+http://projecteuclid.org/euclid.bams/1183485614
+http://proxy-list.wo.tc/
+http://prr.hec.gov.pk/Chapters/1809-8.pdf
+http://prst-ab.aps.org/speced/HB2002
+http://ps25condo.com/builder.htm
+http://psyweb.com/Documents/00000003.jsp
+http://pt.wiktionary.org/wiki/abric%C3%B3
+http://pthree.org/2010/04/18/chromium-removing-http/
+http://pubchem.ncbi.nlm.nih.gov/summary/summary.cgi?cid=10972
+http://pubs.acs.org/doi/abs/10.1021/ba-1968-0075.ch020
+http://qazyfiction.com/above-ground/
+http://qjmed.oxfordjournals.org/cgi/content/full/95/9/559
+http://qjmed.oxfordjournals.org/cgi/issue_pdf/backmatter_pdf/1/4.pdf
+http://ramahinternational.org/
+http://ramsabode.wordpress.com/
+http://rapradar.com/2010/01/31/the-dreams-abrupted-grammy-speech/
+http://reefkeeping.com/issues/2003-07/hcs3/index.php
+http://relays.tycoelectronics.com/schrack/relays/pcb.asp
+http://religion.russ.ru/books/20020709-gb.html
+http://repositorio.uac.pt/bitstream/10400.3/252/1/pp_49_62_Palmero_etal_25.pdf
+http://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/74365/1/chc027_057_1.pdf
+http://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/76548/1/chd052_2_482.pdf
+http://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/76840/1/chd057_4_310.pdf
+http://research.opt.indiana.edu/Library/AchromatizingEye/AchromatizingEye.html
+http://researchblogging.org/blog/home/id/1079
+http://researchcommons.waikato.ac.nz/handle/10289/128
+http://researchnews.osu.edu/archive/absconc.htm
+http://resourcecentre.abacus.com.sg/
+http://respiratory-research.com/content/7/1/93
+http://reviews.cnet.com/4520-6449_7-6548193-1.html
+http://rexwordpuzzle.blogspot.com/2009/12/saturday-dec-5-2009-squawk-on-street.html
+http://ridingabuttertub.com/
+http://rmc.library.cornell.edu/abolitionism/abolitionists.htm
+http://ronclick.wordpress.com/
+http://rst.gsfc.nasa.gov/Intro/Part2_4.html
+http://rstb.royalsocietypublishing.org/content/357/1423/871.full.pdf
+http://rstb.royalsocietypublishing.org/content/364/1516/511.short
+http://russia.rin.ru/cgi-bin/guestbook_e.pl?page=3
+http://rzlab.ucr.edu/debian/wordlist
+http://scholarspace.manoa.hawaii.edu/handle/10125/3342
+http://scholarworks.umass.edu/dissertations/AAI9408273/
+http://sci-toys.com/ingredients/soft_drinks.html
+http://scienceblogs.com/aardvarchaeology/2007/05/the_unbearable_abstruseness_of_1.php
+http://scienceblogs.com/pharyngula/2010/04/spock_was_not_a_chordate.php
+http://scienceblogs.com/pharyngula/2010/06/attention_perversely_assertive.php
+http://scifun.chem.wisc.edu/chemweek/pdf/aceticacid.pdf
+http://scobleizer.com/2010/06/06/why-mark-zuckerberg-should-have-a-carol-bartz-moment/
+http://scripturetext.com/luke/14-11.htm
+http://scuba.about.com/
+http://searchsoftwarequality.techtarget.com/sDefinition/0,,sid92_gci214006,00.html
+http://secure2.tx.acer.com/FixMyAcer3/FixMyAcer.aspx
+http://seperis.livejournal.com/341124.html
+http://serc.carleton.edu/microbelife/extreme/acidic/index.html
+http://serverfault.com/questions/184646/a-secure-standard-iptables-rule-set-for-a-basic-https-webserver
+http://share-ride.a-thera.jp/article/918976.html
+http://shell.cas.usf.edu/motta/Papers%20for%20Website%20Fix/Motta_The%20mechanics%20and%20functions%20of%20jaw%20protrusion%20in%20teleost%20fishes-a%20review.pdf
+http://sherwoodparkbiz.com/
+http://shlang.com/factoids/latin.fact
+http://shop.pdcbs.com/index_tracks.cfm
+http://showtime.arkansasonline.com/spellingbee/site/images/pre_suf_comb.pdf
+http://si-pddr.si.edu/dspace/handle/10088/5246
+http://simtk.org/home/nast
+http://singapuras.ru/sayang.php?shows
+http://singlifessong.tumblr.com/
+http://sites.google.com/site/bgsasfpfcvsas/matching-christmas-pajamas-for-kids-matching-christmas-pajamas-for-kids
+http://sites.google.com/site/ckinwipjyikgg/straw-beach-bags-and-totes-sondra-roberts-straw-beach-bags-and-totes
+http://sites.google.com/site/ofbhcbkajqavp/codeena-purse-hanger---codeena-purse-hangers---codeena-purse-hangers-codeena-purse-hanger
+http://slafc.cites.fsu.edu/index.cfm?fuseaction=incites.list
+http://slakethirst.com/2006/11/19/the-lucien-gaudin/
+http://slavesofacademe.blogspot.com/
+http://smtp25.blogspot.com/
+http://snowball.tartarus.org/algorithms/french/output.txt
+http://soaringbear.com/biomed/herbmethod.html
+http://soloround.blogspot.com/
+http://sourceforge.net/projects/abalone/
+http://species-identification.org/species.php?species_group=mollusca&id=525
+http://species.wikimedia.org/wiki/Acanthopterygii
+http://species.wikimedia.org/wiki/Achariaceae
+http://splchkngsmstxt.googlecode.com/files/english-words.95
+http://sports.yahoo.com/nfl/blog/shutdown_corner/post/The-absurdly-premature-2010-playoff-picture-Wee?urn=nfl-271708
+http://sportsmedicine.about.com/cs/injuries/a/abrasions.htm
+http://squirrelmail.org/plugin_view.php?id=61
+http://stackoverflow.com/questions/1625468/how-do-i-accomplish-http-tunneling-by-making-use-of-iis-web-server
+http://stackoverflow.com/questions/323200/is-a-https-query-string-secure
+http://stackoverflow.com/questions/363285/https-with-wcf-error-could-not-find-base-address-that-matches-scheme-https
+http://staggsbrook.blogspot.com/
+http://stallions.abac.edu/
+http://stanhopea.autrevie.com/Acineta.html
+http://stargate.wikia.com/wiki/Acastus_Kolya
+http://starwars.wikia.com/wiki/Acclamator_I-class_assault_ship
+http://starwars.wikia.com/wiki/Acclamator_II-class_assault_ship
+http://stayingabreast.com/
+http://stnweb.cas.org/
+http://stockcharts.com/education/indicatoranalysis/indic_accumdistline.html
+http://stommel.tamu.edu/~baum/skb_dict.html
+http://strikingachordthemovie.com/
+http://stroke.ahajournals.org/cgi/reprint/STROKEAHA.108.532473v1.pdf
+http://summer-abroad.ucdavis.edu/
+http://support.github.com/discussions/repos/3296-unpack-failed-unpack-objects-abnormal-exit-using-https
+http://support.microsoft.com/kb/253498
+http://support.sightmax.com/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=355
+http://svn.automattic.com/wpcom-themes/test-data.2010-08-02.xml
+http://swg.stratics.com/content/gameplay/guides/guides.php?Cat=659&uid=683
+http://swtor.com/community/showthread.php?t=138325
+http://tcask.blogspot.com/
+http://teachingamericanhistory.org/library/index.asp?document=1049
+http://techcrunch.com/2009/08/10/facebook-acquires-friendfeed/
+http://techcrunch.com/2010/07/09/google-parking-open-spot/
+http://tel.archives-ouvertes.fr/tel-00222084/en/
+http://television.gearlive.com/tvenvy/article/q107-watch-britney-spears-new-video/
+http://tersesystems.com/2004/03/12/managing-information
+http://tetrasg.com/2010/05/19/sf4-choco-blanka-gama-no-abura-interview/
+http://tgiab.com/
+http://theaccretionarywedge.wordpress.com/
+http://thebbps.com/articles/content/super-bowl-xli-winner.html
+http://theberry.com/2010/07/13/i-think-their-plastic-surgeon-used-a-butter-knife-28-photos/
+http://thedailywtf.com/articles/database-abnormalization-101.aspx
+http://themedicalbiochemistrypage.org/nerves.html
+http://theotherpages.org/poems/dryden03.html
+http://thesaurus.com/browse/abstinent
+http://thesaurus.com/browse/sharp+cornered
+http://thesis.library.caltech.edu/1602/
+http://thesis.library.caltech.edu/606/
+http://thesplendorofthechurch.blogspot.com/2009/09/exchange-with-baptist-on-sola-scriptura.html
+http://thinks.com/words/tomswift.htm
+http://timesofindia.indiatimes.com/india/Centre-to-slap-abetment-of-suicide-charge-on-Rathore/articleshow/5397038.cms
+http://timpanogos.wordpress.com/2006/08/15/texas-adds-financial-literacy-standards/
+http://tinycode.com/fatdict
+http://tinyrock.com/docs/Dictionary.pdf
+http://tlt.its.psu.edu/suggestions/international/keyboards/mackey.html
+http://tmani.seesaa.net/article/4725522.html
+http://todd.jackman.villanova.edu/HumanEvol/HomageToMickey.pdf
+http://tolweb.org/Acanthaceae/20878
+http://tolweb.org/Acanthocephala/20452
+http://tolweb.org/Acanthopterygii/15094
+http://tolweb.org/Acari
+http://tolweb.org/Acariformes
+http://tolweb.org/Gnathostomata/14843
+http://tools.ietf.org/html/draft-zourzouvillys-bliss-ach-http-api-00
+http://tools.ietf.org/html/rfc783
+http://toothwalker.org/optics/chromatic.html
+http://toptropicals.com/catalog/uid/achras_zapota.htm
+http://torrentfreak.com/police-in-file-sharing-raids-across-europe-wikileaks-host-targeted-100907/
+http://toxsci.oxfordjournals.org/cgi/content/short/47/2/144
+http://translation.babylon.com/english/to-french/ab_intestate_succession/
+http://tribune.com.pk/story/47523/dpo-given-a-day-to-arrest-last-absconder/
+http://tropicalpets.com/
+http://trueslant.com/matthewsteinglass/
+http://tryingtofollow.com/2008/11/10/moving-beyond-pro-birth/
+http://ts.nist.gov/weightsandmeasures/metric/lc1136a.cfm
+http://tvtropes.org/pmwiki/pmwiki.php/Main/ABNegative
+http://tvtropes.org/pmwiki/pmwiki.php/Main/ReptilesAreAbhorrent
+http://twit88.com/blog/2007/10/16/cain-abel-a-useful-hacking-tool/
+http://twitition.com/vzkp6
+http://twitter.com/AceMetric
+http://ubuntuforums.org/showthread.php?t=1267366
+http://uhpress.wordpress.com/books-in-series/insects-of-hawaii/
+http://umcg.eldoc.ub.rug.nl/root/2007/Deteofana/?pLanguage=en&pFullItemRecord=ON
+http://umech.mit.edu/aja/posters/aro02/aro02.html
+http://unique-names.com/random-word.php
+http://us.toluna.com/polls/690666/Celine-Dion-accoucher-deux-jumeaux-en-pensez.htm
+http://usa.mapexdrums.com/hardware/stands/index.asp
+http://usa.nidek.com/products/wavefront-aberrometer
+http://usadrugstoretoday.com/categories/anti-acidity.htm
+http://users.erols.com/whitaker/dictpage.htm
+http://users.telenet.be/patrickdesmedt/forums/gastenboek/gastenboek.html
+http://users.tinyonline.co.uk/gswithenbank/animalaj.htm
+http://users.tinyonline.co.uk/gswithenbank/unuwords.htm
+http://usmilitary.about.com/od/punitivearticles/a/mcm86.htm
+http://usspringpromo.acer.com/
+http://varun.accosted.net/
+http://vator.tv/person/buy-demadex-generic-demadex
+http://vegkitchen.com/tips/calcium.htm
+http://vendor.academy.com/
+http://verbmall.blogspot.com/2010/08/abstemious-or-temulent.html
+http://verycuriousmind.wordpress.com/2009/03/13/travel-jewish-barbados/
+http://videokeman.com/mariah-carey/butterfly-mariah-carey/
+http://viewhigh.blogspot.com/
+http://vimeo.com/11120883
+http://vimeo.com/3510011
+http://vincenthomedev.wordpress.com/2007/08/21/vs2008-beta-2-wpf-designer-cider-features/
+http://voices.washingtonpost.com/plum-line/2010/08/rand_pauls_accuser_clarifies_k.html
+http://voltechs.com/files/uploads/nodupewords
+http://vrmlworld.net/
+http://wapedia.mobi/en/Abiogenesis?t=5.
+http://wareabouts.wordpress.com/
+http://web.lemoyne.edu/~GIUNTA/lavtable.html
+http://web.me.com/aliciabailey/abecedariangallery/index.htm
+http://web.mit.edu/press/2010/seaswarm.html
+http://web.presby.edu/writingcenter/guides/bio1.html
+http://web.uni-plovdiv.bg/bechev/Bechev_pdfs/ZooNotes_Suppl%201_Mycetophilidae_BG.pdf
+http://webaccelerator.google.com/
+http://webaccelerator.google.com/support.html
+http://webdesign.about.com/od/http/g/bldefhttps.htm
+http://weblogs.asp.net/andrewrea/archive/2010/08/10/wcf-could-not-find-a-base-address-that-matches-scheme-https.aspx
+http://weblogs.asp.net/infinitiesloop/archive/2006/11/02/Dealing-with-IE-_2600_quot_3B00_Operation-Aborted_2600_quot_3B002E00_-Or_2C00_-how-to-Crash-IE.aspx
+http://weblogs.mozillazine.org/gerv/archives/2009/06/how_to_accomplish_it.html
+http://webmineral.com/data/Acetamide.shtml
+http://webs.lander.edu/rsfox/invertebrates/clypeaster.html
+http://weitz.de/hunchentoot/
+http://westbyte.com/ida/
+http://whatis.techtarget.com/definition/0,,sid9_gci551355,00.html
+http://whatis.techtarget.com/definition/0,,sid9_gci551470,00.html
+http://whatis.techtarget.com/definition/0,,sid9_gci555424,00.html
+http://whc.unesco.org/en/tentativelists/1302/
+http://whitepapers.businessweek.com/detail/PROD/1101279595_989.html
+http://whitney.org/Exhibitions/GeorgiaOKeeffe
+http://wiccimm.deviantart.com/
+http://wiki.answers.com/Q/How_rare_is_ab_negative_blood
+http://wiki.answers.com/Q/What_word_contains_all_vowels_in_alphabetical_order
+http://wiki.ffxiclopedia.org/wiki/Achamoth
+http://wiki.forum.nokia.com/index.php/Getting_started_with_Sensors_through_Sensor_module_in_pys60
+http://wiki.forum.nokia.com/index.php/How_to_get_accelerometer_data_of_N900_using_Qt
+http://wikibin.org/articles/malik-abongo-obama.html
+http://wisplants.uwsp.edu/scripts/Detail.asp?Spcode=AMATUB
+http://wn.com/Condo_For_Sale_757_Capp_Street_San_Francisco,_CA_$825000_Shelly_Sutherland
+http://wordcraft.infopop.cc/dictionary/part1.htm
+http://wordinfo.info/units/view/8/ip:1
+http://wordsdomination.com/abandonee.html
+http://wordsmith.org/words/abderian.html
+http://wsr.byu.edu/content/warning-signs-emotional-abuse
+http://wsu.edu/~dee/GLOSSARY/ABSOLUTE.HTM
+http://www-stat.wharton.upenn.edu/~buja/STAT-541/dict.dat
+http://www.1031exchangeadvantage.com/
+http://www.1800petmeds.com/Methigel+Urinary+Acidifier-prod10470.html
+http://www.1902encyclopedia.com/A/ARA/arachnida-04.html
+http://www.1911encyclopedia.org/Achaemenes
+http://www.1a-wirbellose.de/shrimps_crayfish.html
+http://www.1on1mandarin.com/blog/
+http://www.1stsubaruparts.com/
+http://www.2020site.org/trees/spruce.html
+http://www.4atvtires.com/
+http://www.89fm.com.br/promo/?ID=234&cipralex
+http://www.89fm.com.br/promo/?ID=517
+http://www.89fm.com.br/promo/?id=516
+http://www.a-connect.de/namalk.php
+http://www.a-z-dictionaries.com/blog/a-collection-of-word-oddities-and-trivia-page-6/
+http://www.aa.com/
+http://www.aa.com/contactAA/viewEmailFormAccess.do?eventName=customerRelations
+http://www.aa.com/reservation/roundTripSearchAccess.do
+http://www.aal.net/
+http://www.aam-us.org/
+http://www.aam-us.org/aviso/index.cfm
+http://www.aam.com/
+http://www.aandacatering.com/
+http://www.aani.net/
+http://www.aardvark.co.za/
+http://www.aardwolf.com/
+http://www.aardwolf.com/wiki/
+http://www.aardwolfpublishing.com/
+http://www.aaronite.com/
+http://www.aaronitepartners.co.uk/
+http://www.aaup.org/AAUP/pubsres/academe/
+http://www.ab-negative.com/
+http://www.ab6.net/
+http://www.aba.com/
+http://www.aba.com/abaef/teachchildrentosave.htm
+http://www.abac.edu/
+http://www.abac.edu/admissions/
+http://www.abaca.com/
+http://www.abaca.com/solutions_gateway.html
+http://www.abacausa.com/
+http://www.abacay.com/
+http://www.abacinate.net/
+http://www.abacistgroup.com/
+http://www.abacusbank.com/
+http://www.abacuslaw.com/
+http://www.abacuspub.com/
+http://www.abalonefarm.com/
+http://www.abamahotelresort.com/
+http://www.abandonment.net/faq.html
+http://www.abanet.org/
+http://www.abanet.org/lsd/
+http://www.abanic.cl/
+http://www.abante-tonite.com/
+http://www.abante.com.ph/
+http://www.abantes.net/
+http://www.abaris-inc.com/
+http://www.abaris.com/
+http://www.abaris.com/ShowSitePage.asp?SIPCharID=HOME
+http://www.abarisgroup.com/
+http://www.abas-software.com/en/aktuelles/10/cebit2010live.htm
+http://www.abas-software.com/en/index.htm
+http://www.abasaccessories.com/
+http://www.abaser.es/
+http://www.abashed.org/
+http://www.abashevents.com/
+http://www.abate.com/
+http://www.abate.org/
+http://www.abateflorida.com/
+http://www.abatement.com/
+http://www.abateonline.org/
+http://www.abatis-hdf.com/
+http://www.abatonbookcompany.com/
+http://www.abatonhealingarts.com/
+http://www.abator.com/
+http://www.abattoir.net/
+http://www.abaxial.net/
+http://www.abb.com/
+http://www.abb.us/
+http://www.abb.us/controlproducts
+http://www.abba-story.com/
+http://www.abba-world.net/
+http://www.abbacy.com.au/
+http://www.abbasihotel.com/
+http://www.abbasite.com/
+http://www.abbatial-saint-germain-hotel.com/
+http://www.abbeyroadonlinemastering.com/
+http://www.abbotmanagement.com/
+http://www.abbott.com/
+http://www.abbreviations.com/
+http://www.abbybank.com/
+http://www.abcdrp.com/
+http://www.abcirclepro.com/
+http://www.abcone.co.uk/
+http://www.abderian.net/ufp13/
+http://www.abderite.co.uk/
+http://www.abderite.co.uk/news.html
+http://www.abdicate.net/
+http://www.abdicate.net/cal.aspx
+http://www.abdiel.ca/
+http://www.abdielproductions.com/
+http://www.abdn.ac.uk/
+http://www.abdominales.es/
+http://www.abduct.com/
+http://www.abeam.com/
+http://www.abeam.com/global/taiwan.html
+http://www.abeamtech.com/
+http://www.abebooks.com/
+http://www.abed.com/
+http://www.abelegreenhouse.com/
+http://www.abelia.com/
+http://www.abeliangroup.com/
+http://www.abelite.com/
+http://www.abelreels.com/
+http://www.abelstrees.com/
+http://www.abelstrees.com/contact.html
+http://www.aberdeeninc.com/abcatg/AberNAS.htm
+http://www.aberdonian.com/
+http://www.aberia-marble.co.uk/
+http://www.aberrantart.com/
+http://www.aberrantgames.com/
+http://www.abet.org/
+http://www.abet.org/forms.shtml
+http://www.abetlaminati.com/
+http://www.abfilmsgpw.com/
+http://www.abherbz.com/
+http://www.abidanceconsulting.com/
+http://www.abidingglory.com/
+http://www.abidingradio.org/
+http://www.abiliosantana.com/
+http://www.abilo.net/
+http://www.abir.bm/
+http://www.abirwarriorarts.com/
+http://www.abjective.net/
+http://www.abjectly.com/
+http://www.abjustice.com/
+http://www.abkmachinery.com/products/forming-section.html
+http://www.ablate.net/
+http://www.ablegaterecruitment.com/
+http://www.ablepsia.tk/
+http://www.ablerartglass.com/
+http://www.ablermeat.com/
+http://www.ablest.com/
+http://www.abloom.com/
+http://www.abloombangkok.com/
+http://www.abloomflorist.net/
+http://www.abloomlincoln.com/
+http://www.abluentmedia.com/
+http://www.abluentmedia.com/resources/BeatportImport.xls
+http://www.ablutiondayspa.com/
+http://www.ably.com.tw/
+http://www.ablyresources.com/
+http://www.abna.ir/data.asp?lang=3&Id=179755
+http://www.abnet.org/
+http://www.abnetincnj.com/
+http://www.abo-ncle.org/
+http://www.abody.co.uk/
+http://www.abolitionistapproach.com/
+http://www.abominable.cc/
+http://www.aboriginalartonline.com/
+http://www.abortion.com/
+http://www.abortionno.org/Resources/fastfacts.html
+http://www.abound.com/
+http://www.abounding.org/
+http://www.aboundinggraceministries.org/
+http://www.aboundingjoy.com/
+http://www.aboundinglove.org/
+http://www.aboundlogic.com/
+http://www.about.com/
+http://www.aboutroatanrealestate.com/
+http://www.aboveboardelectronics.com/
+http://www.aboveboardgames.net/
+http://www.aboveboardroofing.com/
+http://www.abrabks.com/
+http://www.abrace1.com/
+http://www.abragem.com/
+http://www.abrahamic-faith.com/
+http://www.abramis.co.uk/
+http://www.abrashgallerie.com/
+http://www.abraxascorp.com/
+http://www.abraxasrecords.com/
+http://www.abraxasyfs.com/
+http://www.abreaction.net/
+http://www.abresist.com/
+http://www.abret.com/
+http://www.abret.org/
+http://www.abrico.lu/
+http://www.abroach.com/
+http://www.abroad.ufic.ufl.edu/
+http://www.abrook.com/
+http://www.abrooktec.com/
+http://www.abrooktech.com/
+http://www.abrupt.org/
+http://www.absalomsystems.com/
+http://www.absampere.com/
+http://www.absarokaranch.com/
+http://www.absciss.com/
+http://www.abscissa.com/
+http://www.abscisse-image.fr/
+http://www.abscons.org/
+http://www.abscreativegroup.com/
+http://www.absentation.altpro.net/
+http://www.absicorp.com/
+http://www.absiltd.com/
+http://www.absinth.com/
+http://www.absinthe.se/
+http://www.absinthebuyersguide.com/
+http://www.absit.com/
+http://www.absitomen.com/
+http://www.absolutelyabigails.com/
+http://www.absolutetotalcare.com/
+http://www.absolution-online.com/
+http://www.absolver.co.uk/
+http://www.absolvitor.com/
+http://www.abson.biz/
+http://www.absonblaza.co.uk/
+http://www.absoninc.com/
+http://www.absorbables.com/
+http://www.absorbentprinting.com/
+http://www.absorbentproductsltd.com/
+http://www.absorption.com/
+http://www.absquatulate.com/
+http://www.abstemious.org/
+http://www.abstergent.com/
+http://www.abstractive.ca/
+http://www.abstruselayouts.com/
+http://www.abstrusion.org/
+http://www.abstrusion.org/gallery.php
+http://www.absurdness.us/
+http://www.abtcoclaims.com/
+http://www.abthai.co.th/
+http://www.abuliasavant.com/
+http://www.abundancypartners.co.uk/
+http://www.abundantearth.com/store/recycledproducts.html
+http://www.abundanthealth.com/
+http://www.aburton.ukfsn.org/
+http://www.abut.edu.ag/
+http://www.abvolt.com/
+http://www.abvolt.com/research/Multitone%20detect-IEEE.pdf
+http://www.abwab-sy.com/
+http://www.abwabmag.com/
+http://www.abyc.org/
+http://www.abysmal.com/
+http://www.abyssalengine.com/
+http://www.abyssinian.org/
+http://www.ac-corporation.com.ph/
+http://www.acacia-africa.com/
+http://www.acacia.org/
+http://www.academia.edu/
+http://www.academist.moy.su/
+http://www.acadia-pharm.com/
+http://www.acadia.national-park.com/
+http://www.acadia.org/
+http://www.acadiacafe.com/
+http://www.acadiahospital.org/
+http://www.acadian-cajun.com/
+http://www.acadian.com/
+http://www.acajouhotel.com/
+http://www.acajoutrinidad.com/
+http://www.acaleph.nl/
+http://www.acamaronline.com/
+http://www.acanthacollection.com/
+http://www.acanthus477.com/
+http://www.acanthusantiques.com/
+http://www.acanthusinfotech.com/
+http://www.acapulco.com/
+http://www.acapulco.com/en/
+http://www.acapulcorestaurants.com/
+http://www.acaramedspas.com/
+http://www.acarayoga.com/
+http://www.acca.org/
+http://www.acca.org/quality/
+http://www.accaglobal.com/
+http://www.accedecapital.com/
+http://www.accedemold.com/
+http://www.accelenet.com/
+http://www.accelerando.net/
+http://www.accelerando.org/
+http://www.accelerantdesign.com/
+http://www.accelerative.net/
+http://www.accentonline.com/
+http://www.accentual.com/freemote/
+http://www.accentuality.com/
+http://www.accentuallighting.com/
+http://www.accentuateservices.com/
+http://www.accentuatestaffing.com/
+http://www.accentuatewritersforum.com/
+http://www.accentus.ca/
+http://www.accentus.com/
+http://www.accessexcellence.org/AB/GG/hammerling_s.php
+http://www.accessmedicine.com/resourceTOC.aspx?resourceID=56
+http://www.accessnational.com/
+http://www.accessnationalbank.com/
+http://www.accessnationalonline.com/
+http://www.accidentalcreative.com/
+http://www.accidentalhedonist.com/
+http://www.accidentfund.com/
+http://www.accinge1.net/
+http://www.accipitergallery.com/
+http://www.accipiterradar.com/
+http://www.accipitres.it/
+http://www.accipitres.it/phpBB2/
+http://www.accite.co.uk/
+http://www.acclaim-music.com/
+http://www.acclaim.com/
+http://www.acclaimability.com/
+http://www.acclaimability.com/en/contact/1.asp
+http://www.acclamation.com/
+http://www.acclimate.com/
+http://www.acclimatedsounds.com/
+http://www.accoladecompetition.org/
+http://www.accoladesupport.com/
+http://www.accolehouse.50megs.com/
+http://www.accolentdriedherbs.com/
+http://www.accolentdriedherbs.com/aboutusingherbs.htm
+http://www.accolentmediation.com/
+http://www.accommodatingly.com/
+http://www.accommodatingly.com/newblog/?page_id=111
+http://www.accommodator.net/
+http://www.accompanyvideo.com/
+http://www.accomplicetheshow.com/
+http://www.accomplishmentcoaching.com/
+http://www.accordancebible.com/
+http://www.accordancebible.com/57377
+http://www.accordant.com/
+http://www.accordant.net/
+http://www.accordent.com/
+http://www.accordent.com/products/capture-station.aspx
+http://www.accordha.org.uk/
+http://www.accordionist.org/
+http://www.accordmortgages.com/
+http://www.accorporation.com/
+http://www.accountably.co.uk/
+http://www.accountedge.com/
+http://www.accoy.com/
+http://www.accoyshirts.com/
+http://www.accredhome.com/
+http://www.accrete.ca/
+http://www.accretewebsolutions.ca/
+http://www.accretive-networks.net/
+http://www.accretivehealth.com/
+http://www.accretivesolutions.com/
+http://www.accretivetechnology.com/
+http://www.accroachcode.com/
+http://www.accruesev.com/
+http://www.accruevacations.com/
+http://www.accumulate.com.au/
+http://www.accumulategroup.com/webb/pdf/FactSheetAccumulateAuthenticationSolution.pdf
+http://www.accumulatingmoney.com/
+http://www.accursedfarms.com/
+http://www.accustomedchaos.com/
+http://www.acediamusic.org/
+http://www.acehardware.com/acerewards/index.jsp
+http://www.aceldama.co.uk/
+http://www.aceldama.com/~tomr/
+http://www.acelogic.co.uk/
+http://www.acelogic.co.uk/web/
+http://www.acelogix.com/
+http://www.acentricvideo.com/
+http://www.acephalia.tk/
+http://www.acephalous.net/
+http://www.acer.com/
+http://www.aceray.com/
+http://www.aceray.com/cgi-bin/aarray_catalog/aarray_catalog.cgi?sku=184
+http://www.acerbatteryrecall.com/
+http://www.acerbicnoise.com/
+http://www.acerra-associates.com/
+http://www.acerragroup.com/
+http://www.acerraphotography.com/
+http://www.acessence.com/
+http://www.acestates.com/
+http://www.acestates.eu/
+http://www.acetateworld.com/
+http://www.acetonitrile.cn/
+http://www.acetum.it/
+http://www.acetum.it/index4.htm
+http://www.acetyl-acetone.com/
+http://www.acgme.org/adspublic/
+http://www.achaea.com/
+http://www.achatesbostons.com/
+http://www.achatespower.com/
+http://www.achatinidae.com/
+http://www.ache.org/
+http://www.ache.org/career.cfm
+http://www.achen.com/
+http://www.acherarms.com/
+http://www.acherecords.com/
+http://www.achievable.org/
+http://www.achievabledream.org/
+http://www.achievement.org/galleryachieve.html
+http://www.achiever.com/
+http://www.achieverplus.com/
+http://www.achievesolutions.net/
+http://www.achigan.net/
+http://www.achill-fieldschool.com/
+http://www.achingbrain.net/stuff/php/akismet
+http://www.achorcenter.org/
+http://www.achorclublambs.com/
+http://www.achra.org/
+http://www.achroma.co.uk/
+http://www.achromat.org/
+http://www.achromat.org/what_is_achromatopsia.html
+http://www.achromatopsia.org/
+http://www.achromic.co.uk/
+http://www.achromicpoint.com/
+http://www.achusemeis.com/
+http://www.achyobejas.net/
+http://www.acidicband.com/
+http://www.acidokyl.com/acides-acidifiants-alcalinisants.aspx
+http://www.acidoticracing.com/
+http://www.acidproof.com/
+http://www.acidproof.net/
+http://www.acidproofindia.com/
+http://www.acig.org/artman/publish/article_282.shtml
+http://www.aciniccell.org/definitions.html
+http://www.aciniccell.org/overview.html
+http://www.acis.com/
+http://www.acis.com/trips/
+http://www.ackerdrill.com/
+http://www.ackerwines.com/
+http://www.ackmanziff.com/
+http://www.acle.aplf.com/
+http://www.acle.org/
+http://www.aclysformacion.com/
+http://www.acmatic.be/
+http://www.acme.com/
+http://www.acme.com/software/thttpd/
+http://www.acmemarkets.com/
+http://www.acmicinteractive.com/
+http://www.acmite.com.au/
+http://www.acmite.com/
+http://www.acnetalks.com/pimple-types/severe-acne/acne-nodules.htm
+http://www.acnodegroup.co.za/
+http://www.acnodegroup.co.za/group_web.asp
+http://www.acnodes.com/
+http://www.acock.com/
+http://www.acronymfinder.com/
+http://www.acronymfinder.com/HTTPS.html
+http://www.acsensor.com/
+http://www.acss.ws/Upload/XML/Research/406.pdf
+http://www.acucise.com/
+http://www.adcorp.org/
+http://www.adjudication.co.uk/
+http://www.adobe.com/
+http://www.advance-health.com/nacetylcysteine.html
+http://www.advancedhealthplan.com/foods.html
+http://www.advancedortho.net/pdf/hip_arthro_labrum.pdf
+http://www.adweek.com/aw/content_display/news/agency/e3i38fc3a9296f214d350a5e4b37a99ef84
+http://www.aeaicc.com/
+http://www.aei-international.com/
+http://www.afeas.org/
+http://www.afoats.af.mil/
+http://www.afsloansonline.com/
+http://www.ahm-ownerlink.com/SEO/HondaRecall.asp
+http://www.aicpa.org/
+http://www.aim.org/
+http://www.aims4claims.com/
+http://www.ajcn.org/cgi/content/abstract/81/5/1018
+http://www.akey.com/
+http://www.akrinteractive.com/
+http://www.alabama.gov/
+http://www.alanwood.net/pesticides/class_acaricides.html
+http://www.albanycounty.com/achor/
+http://www.alcohol-soft.com/
+http://www.aldokkan.com/religion/field.htm
+http://www.algaebase.org/SpeciesDetail.lasso?species_id=1422
+http://www.algaecal.com/calcium-absorption.html
+http://www.alhadi.com/
+http://www.aliensofthesea.com/
+http://www.allaboardtoys.com/
+http://www.allaboutturkey.com/sozlukmit1.htm
+http://www.allacademic.com/meta/p111097_index.html
+http://www.allkpop.com/2010/04/thongs-condoms-kisses-and-super-junior
+http://www.allmeasures.com/
+http://www.allwords.com/word-acescence.html
+http://www.alma.edu/michiganacademy/
+http://www.alonspeakers.com/
+http://www.alphadictionary.com/rusgrammar/prepacc.html
+http://www.amateurtransplants.net/
+http://www.amazon.com/Abhorsen-Trilogy-Box-Set/dp/0060734191
+http://www.amazon.com/Acacia-War-Mein-Book/dp/0385506066
+http://www.amazon.com/Accelerando-Singularity-Charles-Stross/dp/0441012841
+http://www.amazon.com/Citizens-Chronicle-Revolution-Simon-Schama/dp/0679726101
+http://www.amazon.com/Leviton-5243-W-Duplex-Combination-Commercial/dp/B000ZOJL1U
+http://www.amazon.com/Lives-Cell-Notes-Biology-Watcher/dp/0140047433
+http://www.amazon.com/Michael-Abrashs-Graphics-Programming-Special/dp/1576101746
+http://www.amazon.com/Plug-In-Extend-a-Chime/dp/B00004WKY5
+http://www.amazon.com/Powers-Horror-Abjection-European-Perspectives/dp/0231053479
+http://www.amazon.com/Unseen-Academicals-Discworld-Terry-Pratchett/dp/0061161705
+http://www.ameraccord.com/
+http://www.americanchronicle.com/articles/40279
+http://www.americanexpress.com/
+http://www.americanexpress.com/cards/online_guarantee/
+http://www.americanpregnancy.org/pregnancycomplications/placentalabruption.html
+http://www.amerimerc.com/swimming-pool-liners.htm
+http://www.ametsoc.org/meet/ann/callforpapers.html
+http://www.aminoacids-protein.com/
+http://www.amnesty.org/en/death-penalty
+http://www.ams.org/bull/1923-29-07/S0002-9904-1923-03727-0/S0002-9904-1923-03727-0.pdf
+http://www.amsa.org/healingthehealer/breathing.cfm
+http://www.amset.info/exchange/
+http://www.amy.hi-ho.ne.jp/cgi-bin/user/hi-lo/ziten.cgi?action=view&data=2
+http://www.anabrico.com/p_links2.html
+http://www.analog.com/en/mems/high-g-accelerometers/adis16223/products/product.html
+http://www.analog.com/en/press-release/6_14_10_RMS_Detector_Accurately_Measures_Large_Cre/press.html
+http://www.analog.com/en/press-release/6_7_10_ADI_Digital_Temp_Sensors_Achieve_Highest/press.html
+http://www.anchornetbank.com/
+http://www.ancientlibrary.com/gazetteer/0004.html
+http://www.ancientlibrary.com/smith-bio/0012.html
+http://www.ancientscripts.com/alphabet.html
+http://www.andilinks.com/handcrafted-jewelry.shtm
+http://www.andrew.ac.jp/cgibin/club/icehocky/keiji2.plx
+http://www.ane.pl/pdf/7011.pdf
+http://www.angelfire.com/de/BobSanders/HMSV&A81.html
+http://www.angelfire.com/ga2/AMS/
+http://www.angelfire.com/mi/dinosaurs/tailbone.html
+http://www.angellis.net/Web/PDfiles/repgens.pdf
+http://www.animelyrics.com/anime/elfenlied/lilium.htm
+http://www.annals.org/content/120/3/207.full
+http://www.annualreviews.org/doi/pdf/10.1146/annurev.pa.22.040182.001045
+http://www.anselmstudyhouse.com/index.php/Worldviews/Australian-federal-election-2010.html
+http://www.answering-islam.org/Authors/Farooq_Ibrahim/abrogation.htm
+http://www.answering-islam.org/BehindVeil/btv10.html
+http://www.answers.com/topic/abaft
+http://www.antimoon.com/forum/t2346-135.htm
+http://www.antique-prints.de/shop/catalog.php?lang=ENG&list=KAT09
+http://www.aoa.org/documents/CPG-18.pdf
+http://www.aocd.org/skin/dermatologic_diseases/acanthosis_nigrica.html
+http://www.aocoa.com/
+http://www.apartmentscapetown.com/
+http://www.apoggi.com/shopsite_sc/ic-decorative-pieces.htm
+http://www.apologeticsindex.org/440-aberrant-aberration-aberrational
+http://www.appliedmedical.com/images/products/SC01071D%20Acucise%20RP35%20System_745.pdf
+http://www.appropriate-economics.org/materials/financial_crises_in_emerging_markets_-_Chang_n_Velasco.pdf
+http://www.aprelium.com/
+http://www.aprelium.com/abyssws/
+http://www.aquacon.com/acclimation.html
+http://www.arabpsynet.com/edictbooks/a.ef.pdf
+http://www.arachnology.be/pages/society/Eurosoc.html
+http://www.arapahoebasin.com/
+http://www.arcadia.edu/
+http://www.arcadia.edu/abroad/
+http://www.architettisenzatetto.net/blog/post/index/122/lAbruzzo-Ulteriore
+http://www.archive.org/details/PL001_960
+http://www.archive.org/details/StrandMagazine_030
+http://www.archive.org/details/coinageoflydiape00headrich
+http://www.archive.org/details/softrayedbonyfis00bige
+http://www.archive.org/details/tvquran.com...abkar
+http://www.archive.org/stream/afrenchenglishd01unkngoog/afrenchenglishd01unkngoog_djvu.txt
+http://www.archive.org/stream/dictionaryofmedi02mruoft/dictionaryofmedi02mruoft_djvu.txt
+http://www.archive.org/stream/pronunciationpr00mackgoog/pronunciationpr00mackgoog_djvu.txt
+http://www.arkive.org/bennetts-chinchilla-rat/abrocoma-bennettii/
+http://www.arkive.org/cretan-zelkova/zelkova-abelicea/
+http://www.arnewsline.org/
+http://www.art-arena.com/achaem.html
+http://www.arthurspools.com/
+http://www.articlesbase.com/diseases-and-conditions-articles/cephalic-disorder-causes-symptoms-and-treatments-426613.html
+http://www.articlesbase.com/information-technology-articles/techniques-of-lighting-a-chroma-key-shot-1327424.html
+http://www.articlesbase.com/parenting-articles/the-best-way-of-ablactation-for-babies-3114592.html
+http://www.artlex.com/ArtLex/a/abstraction.html
+http://www.asanltr.com/newsletter/01-4/articles/Abrin&RicinRev.htm
+http://www.ascendacoustics.com/
+http://www.ascendfcu.org/
+http://www.ascensionortho.com/
+http://www.ascensionparish.net/
+http://www.ask.com/questions-about/Ab-Negative-Blood-Type
+http://www.ask.com/questions-about/Ketosis-Symptoms
+http://www.askdrsears.com/html/10/t102200.asp
+http://www.associatepublisher.com/e/a/ac/acclamator-class_assault_ship.htm
+http://www.assumption.edu/
+http://www.astronomie.be/registax/
+http://www.atfi.ca/
+http://www.athomeny.com/links.htm
+http://www.atlassolutions.com/
+http://www.atsdr.cdc.gov/tfacts21.html
+http://www.atvisit.com/
+http://www.audioreview.com/cat/speakers/floorstanding-speakers/acarian-systems/alon-iv/PRD_123836_1594crx.aspx
+http://www.ausnz.accaglobal.com/
+http://www.aussie.com.au/insurance/accident-insurance.htm
+http://www.austinisd.org/academics/parentconnection/docs/PC_Campus_Flyer.pdf
+http://www.austlii.edu.au/au/legis/wa/consol_act/rcnncpa1929413/
+http://www.authorize.net/
+http://www.avaaz.org/en/stay_strong_obama/
+http://www.avaaz.org/fr/eu_gmo
+http://www.avaaz.org/fr/save_copenhagen
+http://www.avatarspiritmedia.net/aboutus.php
+http://www.avpmusic.com/
+http://www.axetaxesnotjobs.com/
+http://www.azharabidi.com/
+http://www.babylon.com/definition/Abigeat/English
+http://www.backacherfarm.com/
+http://www.ballyfitness.com/
+http://www.bamu.net/try.php
+http://www.baniabidi.com/
+http://www.bartleby.com/107/201.html
+http://www.bartleby.com/107/248.html
+http://www.bartleby.com/218/0121.html
+http://www.bartleby.com/268/6/18.html
+http://www.bartleby.com/268/9/28.html
+http://www.basschouten.com/blog1.php/2010/03/02/presenting-direct2d-hardware-acceleratio
+http://www.batturd.com/
+http://www.bbc.co.uk/news/uk-wales-11403282
+http://www.bbc.co.uk/news/world-europe-11236158
+http://www.bcbsal.org/
+http://www.bcbsr.com/greek/gcase.html
+http://www.belmontabbeycollege.edu/
+http://www.berghahnbooks.com/title.php?rowtag=ReinhardtClaims
+http://www.berkeleybop.org/obo/FBsp:00000438.owl
+http://www.besthongkong.com/index.php?cPath=10
+http://www.bestjobsus.com/bt-empd-ablest.htm
+http://www.beyondveg.com/tu-j-l/raw-cooked/raw-cooked-3i.shtml
+http://www.bible-history.com/latin/latin_a.html
+http://www.bicycleman.com/recumbents/recumbent_glossary.htm
+http://www.bigislandabalone.com/
+http://www.biolib.cz/en/taxonsubtaxa/id14948/
+http://www.bioline.org.br/abstract?jp02040
+http://www.biologie.uni-hamburg.de/b-online/vascular/acanth.htm
+http://www.biology-direct.com/content/3/1/26
+http://www.biomedcentral.com/1471-2148/1/9
+http://www.bionicbooks.com/
+http://www.biosci.ohio-state.edu/~acarolog/summerProgram/
+http://www.biosoil.ru/fee/2006/N-161/N-161.pdf
+http://www.birdmites.org/terminology.html
+http://www.birdsnways.com/wisdom/ww60e.htm
+http://www.bis.org/publ/bcbs174.htm
+http://www.bittbox.com/general-web-design/have-a-website-its-time-to-add-a-webclip-icon
+http://www.biyokulule.com/view_content.php?articleid=2429
+http://www.blackhat.com/
+http://www.blackratstudios.com/
+http://www.blastabrade.com/
+http://www.blessedcause.org/aborticide/adoption.htm
+http://www.blessedcause.org/aborticide/survivor.htm
+http://www.bloggang.com/viewdiary.php?id=dontno-trips-confused&month=06-2005&date=07&group=8&blog=1
+http://www.blogger.com/terms.g
+http://www.blogoteca.com/bolaextra/index.php?cod=2314
+http://www.blueblitz.net/20090124187/articles/january-2009/okluschen.html
+http://www.bmj.com/content/321/7276/1591.full
+http://www.body-kit.com/index2.html
+http://www.bodybuilding.com/store/accelerative/musclespeed.html
+http://www.boedeker.com/acetal_p.htm
+http://www.bos.frb.org/bankinfo/qau/wp/2008/qau0806.pdf
+http://www.boston.com/lifestyle/green/greenblog/
+http://www.boston.com/news/local/massachusetts/articles/2010/09/05/worcester_auction_has_historians_and_collectors_abuzz/
+http://www.botanical.com/botanical/mgmh/a/absce001.html
+http://www.botany.hawaii.edu/faculty/carr/acanth.htm
+http://www.botany.hawaii.edu/faculty/wong/bot201/deuteromycota/deuteromycota.htm
+http://www.bottomlinesox.com/
+http://www.bouldercreekacademy.net/
+http://www.bounderrvsource.com/rv-search2-new-and-used.asp?new_search=1&status=2&sidelink=1
+http://www.bozemanmove.com/
+http://www.brainwashed.com/chalk/chalkother.html
+http://www.bravotv.com/top-chef/season-6/about
+http://www.breastenlargementnewyork.com/silicone-vs-saline-implants.html
+http://www.breitbart.com/article.php?id=080813192458.ud84hj9h
+http://www.brighthub.com/health/technology/articles/64495.aspx
+http://www.brillonline.nl/public/abrogation
+http://www.britannica.com/EBchecked/topic/119446/Civil-Wars-of-Granada
+http://www.brjb.com.br/files/brjb_112_4201006_id2.pdf
+http://www.bryoecol.mtu.edu/chapters_VOL2/4-4Invertebrates_Annelids.pdf
+http://www.bsbi.org.uk/Viola.pdf
+http://www.bt.cdc.gov/agent/abrin/
+http://www.btinternet.com/~negativecharisma/bodies/lake.pdf
+http://www.btlnet.com/p/physiotherapy/combination-therapy/btl-4000-combi-topline/btl-4800lm2-combi-topline-p4800-314v100/&menu=785444&function=8
+http://www.buccaneerbass.com/
+http://www.buddhanet.net/pdf_file/rebirthscience.pdf
+http://www.buildabear.com/
+http://www.businessdictionary.com/definition/accessoriness.html
+http://www.businesswire.com/news/home/20100922006020/it/
+http://www.butterfliesandmoths.org/species?l=1725
+http://www.buzzle.com/articles/coloring-gray-hair-how-to-color-gray-hair.html
+http://www.bwcmg.co.uk/
+http://www.c-s-p.org/flyers/9781847183545-sample.pdf
+http://www.cabatuan.net/
+http://www.cactus-art.biz/schede/FEROCACTUS/Ferocactus_acanthoides/Ferocactus_acanthodes/Ferocactus_acanthodes.htm
+http://www.cairn.info/revue-francaise-de-sociologie-2006-5-page-3.htm
+http://www.calacademy.org/
+http://www.caldwell.edu/
+http://www.calvin.edu/
+http://www.camacdonald.com/birding/Sampler7aAccentors.htm
+http://www.campabnaki.org/
+http://www.cancerci.com/content/9/1/14
+http://www.capincorporated.com/
+http://www.car-accidents.com/
+http://www.caranddriver.com/reviews/car/03q3/volvo_s60r_awd-road_test
+http://www.careerbuilder.com/JobSeeker/Jobs/JobDetails.aspx?job_did=J8G5SW5WCM3F1GD8GK2
+http://www.careerlab.com/art_homeruns.htm
+http://www.carinsurance.com/CoverageDefinitions.aspx
+http://www.carolinawinesupply.com/products/lab.htm
+http://www.catchpenny.org/accretion.html
+http://www.cato-at-liberty.org/has-obamacares-unpopularity-caused-abject-panic-at-the-white-house/
+http://www.catsclem.nl/medisch/medacc.htm
+http://www.cbc.ca/canada/story/2010/09/17/senators-oilsands-tour.html
+http://www.cbgnetwork.org/408.html
+http://www.cbsnews.com/stories/2002/10/11/eveningnews/main525342.shtml
+http://www.ccaesq.com/
+http://www.ccel.org/ccel/pearse/morefathers/files/eutropius_breviarium_2_text.htm
+http://www.ccohs.ca/oshanswers/prevention/orgperox.html
+http://www.ccopnet.com/CCOP/docs/NCI_Cancer_Bulletin_091305.pdf
+http://www.cdbaby.com/cd/AaronCarter
+http://www.cdc.gov/eid/content/14/7/pdfs/1046.pdf
+http://www.cdc.gov/mmwr/preview/mmwrhtml/mm5907a1.htm
+http://www.cdc.gov/nchs/ndi.htm
+http://www.cdc.gov/ncidod/dbmd/diseaseinfo/brucellosis_g.htm
+http://www.cdc.gov/niosh/ipcsneng/neng0000.html
+http://www.cdc.gov/niosh/npg/npgd0002.html
+http://www.cdfa.ca.gov/phpps/ppd/entomology/surveys_state_parks.html
+http://www.cdriindia.org/messageboard.asp?curtpage=45&cat_code=&name=
+http://www.cedamar.org/
+http://www.cefe.cnrs.fr/coev/pdf/selosse/A24.pdf
+http://www.celanese.com/index/productsmarkets_index/products_markets_basicchemicals.htm
+http://www.celanese.com/textile_glossary_filament_acetate.pdf
+http://www.celaneseacetate.com/
+http://www.cell-guide.com/products/aclys.html
+http://www.cell.com/abstract/S0092-8674(10)00180-7
+http://www.cem.msu.edu/~reusch/VirtTxtJml/Spectrpy/UV-Vis/spectrum.htm
+http://www.cenargen.embrapa.br/ica13/
+http://www.census1891.com/occupations-a.htm
+http://www.cerebellar-abiotrophy.org/
+http://www.cerebromente.org.br/n12/opiniao/pensamento_i.htm
+http://www.cerlabs.com/experiments/1087540703X.pdf
+http://www.cfainc.org/breeds/profiles/abyssinian.html
+http://www.cfsph.iastate.edu/Factsheets/pdfs/acariasis.pdf
+http://www.cfsph.iastate.edu/Factsheets/pdfs/brucellosis_abortus.pdf
+http://www.cfsph.iastate.edu/FastFacts/pdfs/acariasis_F.pdf
+http://www.championpetfoods.com/
+http://www.championpetfoods.com/acana/
+http://www.changbioscience.com/abie/abie.html
+http://www.chartattack.com/news/80240/ten-reasons-dan-achen-was-cool
+http://www.chea.org/
+http://www.chem-online.org/carbohydrate/chitosan-olgosaccharide.htm
+http://www.chem.purdue.edu/chemsafety/Chem/poisongases.htm
+http://www.chem.ucalgary.ca/courses/351/Carey/Ch21/ch21-5-1.html
+http://www.chem.unep.ch/irptc/sids/oecdsids/102-01-21.pdf
+http://www.chemindustry.com/chemicals/0194202.html
+http://www.chemistryexplained.com/A-Ar/Acetylcholine.html
+http://www.chicagobears.com/news/NewsStory.asp?story_id=6977
+http://www.chichester-corporate-challenge.org.uk/
+http://www.chichester-corporate-challenge.org.uk/2.html
+http://www.chile.ird.fr/pdf/isagPDF/eissen.pdf
+http://www.china.org.cn/environment/pics/2008-06/19/content_15856699.htm
+http://www.chinatravel.com/sichuan/chengdu/food/husband-and-wife-lung-slices-(fuqi-feipian)/
+http://www.chivasom.com/about-chiva-som/
+http://www.chorion.co.uk/
+http://www.choteauacantha.com/
+http://www.christian-thinktank.com/baduseot.html
+http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome
+http://www.chron.com/disp/story.mpl/metropolitan/7018025.html
+http://www.chron.com/disp/story.mpl/metropolitan/7018322.html
+http://www.chron.com/disp/story.mpl/nation/7207482.html
+http://www.chron.com/disp/story.mpl/sports/bb/7066422.html
+http://www.ciae.nic.in/apd_m.htm
+http://www.cigna.com/healthinfo/nord1093.html
+http://www.cigna.com/healthinfo/nord81.html
+http://www.cimca.ca/
+http://www.cisco.com/en/US/products/hw/contnetw/ps792/products_configuration_example09186a0080094068.shtml
+http://www.cjh.org/p/34
+http://www.cla.purdue.edu/english/theory/psychoanalysis/kristevaabject.html
+http://www.clackamas-orchids.com/misc.html
+http://www.clarkeus.com/products/sanders/fa-8model.aspx
+http://www.classictruckshop.com/clubs.php
+http://www.clearandsmoothskin.com/
+http://www.clearing.org/cgi/archive.cgi?/hilton/helatrobus.memo
+http://www.clinchem.org/cgi/content/abstract/41/2/200
+http://www.clinicalgeriatrics.com/
+http://www.closerlookatstemcells.org/Submit_a_Clinic.htm
+http://www.cn-software.com/en/cnstats/
+http://www.cnr.vt.edu/efish/families/acipenseridae.html
+http://www.coafcu.org/
+http://www.coasthotels.com/
+http://www.colby.edu/chemistry/Grants/CH141L4Crfall2002.pdf
+http://www.colorjack.com/studio/
+http://www.compdatasurveys.com/
+http://www.computing.net/answers/security/no-access-to-https-sites/17081.html
+http://www.computing.net/answers/windows-7/https-not-accessible-errormessage/2691.html
+http://www.comunecampagnano.it/gnu/accessless/
+http://www.configurarequipos.com/tema2485576-8-0.html
+http://www.consumerlab.com/reviews/Alpha-Lipoic_Acid_Supplements/alphalipoic/
+http://www.copywriterjournalist.com/
+http://www.corner.net/
+http://www.correios.com.br/servicos/cep/
+http://www.cortland.edu/herp/keys/glossary.htm
+http://www.cosmeticsdatabase.com/ingredient.php?ingred06=706569
+http://www.coursehero.com/file/3313481/words9common/
+http://www.cowabduction.com/
+http://www.cpca.org/resources/findclinic/
+http://www.cprh.pe.gov.br/central_servicos/cadastro_consultores/lista_de_consultores_pessoas_fisicas/ctudo-centr-inven-resid-list-fisic-vis.asp?id=665
+http://www.creditacceptance.com/
+http://www.crepescompany.com/
+http://www.crosswordmanblog.com/2009/12/nyt-saturday-12509-post-under.html
+http://www.cruzine.com/2010/09/07/abstract-photos/
+http://www.crwflags.com/fotw/flags/ge-abkha.html
+http://www.crystalinks.com/aboriginals.html
+http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15451-s01/lectures/lect11/hash-code/dict/bigwords
+http://www.cs.cmu.edu/~adg/adg-psstimages.html
+http://www.cs.duke.edu/courses/fall04/cps006/assign/01_jotto/code/data/words6_common.txt
+http://www.cs.duke.edu/courses/fall04/cps006/assign/01_jotto/code/data/words7_common.txt
+http://www.cs.duke.edu/csed/tapestry/data/mobyhugewords.txt
+http://www.cs.duke.edu/~ola/ap/bogwords
+http://www.cs.loyola.edu/~lawrie/CS201/F04/labs/L8/dict.txt
+http://www.cs.nmsu.edu/~hfugal/cs167/labs/words.txt
+http://www.cs.princeton.edu/introcs/data/wordlist.txt
+http://www.cs.princeton.edu/introcs/datafiles/words.utf-8.txt
+http://www.cs.rutgers.edu/~decarlo/abstract.html
+http://www.cs.unc.edu/Research/vrpn/obtaining_vrpn.html
+http://www.cs.uwaterloo.ca/~david/cs448/words.txt
+http://www.cspeirce.com/menu/library/aboutcsp/richmond/shepperson.pdf
+http://www.cspnetworks.net/
+http://www.ctahr.hawaii.edu/oc/freepubs/pdf/OF-20.pdf
+http://www.ctahr.hawaii.edu/oc/freepubs/pdf/PD-39.pdf
+http://www.ctds.info/acidic-foods.html
+http://www.culturaapicola.com.ar/apuntes/revistaselectronicas/apidologie/38-6/06.pdf
+http://www.cvmbs.colostate.edu/clinsci/wing/abdomtra.html
+http://www.cyberlipid.org/glycer/glyc0005.htm
+http://www.cybersource.com/
+http://www.d20srd.org/srd/variant/classes/specialistwizardvariants.htm
+http://www.dadsworksheets.com/v1/Worksheets/Addition.html
+http://www.dailymail.co.uk/news/worldnews/article-1277397/Abstentionist-TD-Jim-McDaid-issues-bogus-sick-note.html
+http://www.dailymail.co.uk/sport/football/article-1263590/Barcelonas-Abidal-talks-battle-fronts-faces-Arsenal-Real-Madrid-week.html
+http://www.dailymail.co.uk/tvshowbiz/article-1052851/I-say-What-bounder--All-dandy-comic-legend-Terry-Thomas-really-liked-jolly-eager-girls.html
+http://www.dailymotion.com/video/x4gred_jodhaa-abkar-part-3_shortfilms
+http://www.dailytech.com/NASA+Study+Acknowledges+Solar+Cycle+Not+Man+Responsible+for+Past+Warming/article15310.htm
+http://www.damprid.com/
+http://www.dana-farber.org/res/clinical/trials-info/default.html
+http://www.danagioia.net/essays/eaccentual.htm
+http://www.danielbachhuber.com/2010/04/08/a-canonical-reading-list-for-the-future-of-news/
+http://www.danielmoorepoetry.com/
+http://www.daniweb.com/forums/thread3123.html
+http://www.davidanthonydurham.com/novels/acacia.html
+http://www.daviddarling.info/encyclopedia/A/abducens_nerve.html
+http://www.daviddarling.info/encyclopedia/A/achon.html
+http://www.daviddarling.info/encyclopedia/A/acidophile.html
+http://www.dc.state.fl.us/Absconder/search.asp
+http://www.dcboee.org/voter_info/absentee_ballot/ab_step1.asp
+http://www.deccanchronicle.com/dc-comment/abetment-azadi-673
+http://www.deepwaterhorizonresponse.com/
+http://www.definitions.net/definition/accusation
+http://www.democracyarsenal.org/2006/02/a_conservative_.html
+http://www.demodex.info/faq.htm
+http://www.demodexsolutions.com/vpasp6.5/shopaff.asp?affid=3&id=35
+http://www.denisdutton.com/language_crimes.htm
+http://www.dennisdeancatering.com/
+http://www.dennishollingsworth.us/archives/2005_06.html
+http://www.desertbloomherbs.com/medglossary.html
+http://www.desiringgod.org/Blog/2069_Why_I_Abominate_the_Prosperity_Gospel/
+http://www.desmogblog.com/federal-report-scorns-canadas-climate-change-plan-for-exaggerating-carbon-cuts
+http://www.desmogblog.com/global-warming-theory-debunked
+http://www.desmogblog.com/how-can-i-get-on-amys-guest-list
+http://www.desmogblog.com/inhofe-aid-vs-sej-its-not-about-science
+http://www.desmogblog.com/new-poll-68-of-americans-support-aggressive-international-climate-treaty
+http://www.desmogblog.com/our-resource-page-for-the-intergovernmental-panel-on-climate-change
+http://www.desmogblog.com/white-house-set-to-expand-mountaintop-coal-mining
+http://www.destination360.com/middle-east/united-arab-emirates/al-ain-hotels
+http://www.developercenter.ir/forum/archive/index.php/t-4374.html
+http://www.devoniantimes.org/who/pages/acanthodians.html
+http://www.dexadine.com/
+http://www.dexadine.com/acerose.html
+http://www.diamondway-buddhism.org/default.asp?col=01&t=dharmanames.htm
+http://www.dictionarist.com/absolvent
+http://www.diino.com/
+http://www.dimango.com/dc-record-a-chime.htm
+http://www.dimensionengineering.com/accelerometers.htm
+http://www.dipteristsforum.org.uk/wiki/families:brachycera:acalyptrates:campichoetidae
+http://www.dir.ca.gov/dwc/eams/eams.htm
+http://www.dirjournal.com/info/abandoned-places-in-the-world/
+http://www.discogs.com/Disintegrator-Target-Terminated/release/77143
+http://www.diss.fu-berlin.de/diss/receive/FUDISS_thesis_000000000251?lang=en
+http://www.districtlines.com/4801-Adopt-A-Chree-Baseball-Tee-Black-w-White-T-Shirt/chree
+http://www.diytrade.com/china/4/manufacturers/458257/main/ShangHai_Catherine_Abstersion_Technology_Co_Ltd.html
+http://www.dmtc.com/
+http://www.dmu.edu/abaton/
+http://www.dmv.state.va.us/webdoc/pdf/dmv141.pdf
+http://www.doiserbia.nb.rs/ft.aspx?id=1450-91560906411Z
+http://www.dolmetsch.com/defsa.htm
+http://www.doowoptaxi.com/
+http://www.dooy.salford.ac.uk/ground.motives.html
+http://www.dowcorning.com/content/etronics/etronicscoat/
+http://www.dpreview.com/learn/?/Glossary/Optical/chromatic_aberration_01.htm
+http://www.drbilllong.com/2008Words/ShouldII.html
+http://www.drinksforum.com/winemaking/Anything-better-then-the-standard-acid-test-kit-1918-.htm
+http://www.drthauna.com/
+http://www.drugbank.ca/drugs/DB01092
+http://www.drugs.com/cdi/pernox-lotion.html
+http://www.dutchesstourism.com/PDF/farmfreshmap2007.pdf
+http://www.dyndns.com/support/abuse.html
+http://www.dyndns.com/support/clients/
+http://www.eappi.org/
+http://www.earlham.edu/~peters/fos/newsletter/09-02-09.htm
+http://www.earthlife.net/inverts/acanthocephala.html
+http://www.eastwestcenter.org/fileadmin/stored/pdfs//ECONwp070.pdf
+http://www.easytogrowbulbs.com/index.asp?PageAction=VIEWPROD&ProdID=458
+http://www.eboncall.org/CATs/2463.htm
+http://www.ebud.net/book/showcoll.asp?no=286
+http://www.eccouncil.org/
+http://www.ecfmg.org/acculturation/index.html
+http://www.eclipsesoundtrack.com/2009/02/20/new-deluxe-twilight-cddvd/
+http://www.ecologyandsociety.org/vol11/iss1/art1/
+http://www.econabrasives.com/
+http://www.econlib.org/library/Mises/msTApp.html
+http://www.economist.com/blogs/easternapproaches/2010/09/putin_valdai
+http://www.economist.com/node/16943589
+http://www.economistacademic.com/
+http://www.ecst.csuchico.edu/~ranger/samples/wordlist.txt
+http://www.edjurist.com/
+http://www.edoj.org.eg/vol001/00101/08/8.html
+http://www.edscolding.co.uk/
+http://www.eeob.iastate.edu/faculty/DrewesC/htdocs/Lvgen4.htm
+http://www.efm.leeds.ac.uk/~mark/ISIabbr/
+http://www.eje.cz/pdfarticles/261/eje_100_4_609_Sueyoshi.pdf
+http://www.elephantjournal.com/2010/04/feeling-depressed-maybe-youre-jus-self-absorbed-catrina-mcfate/
+http://www.elmhurst.edu/~chm/vchembook/624diabetes.html
+http://www.elroy.net/ehr/abortion.html
+http://www.emedicinehealth.com/abscess/article_em.htm
+http://www.emnrd.state.nm.us/mmd/aml/AMLwildlife.htm
+http://www.employer-employee.com/absent.html
+http://www.emsdiasum.com/microscopy/products/chemicals/acetate.aspx
+http://www.enceinte.com/
+http://www.encyclo.co.uk/define/Ablutionary
+http://www.encyclo.co.uk/define/Ma%60bar
+http://www.encyclo.co.uk/define/Siskin
+http://www.encyclopedia.com/doc/1O225-acockbill.html
+http://www.english-test.net/sat/vocabulary/words/027/sat-definitions.php
+http://www.enjoythemusic.com/magazine/equipment/0502/aloncapri.htm
+http://www.enotes.com/public-health-encyclopedia/acculturation
+http://www.ento.csiro.au/education/allies/acarina.htm
+http://www.enviroliteracy.org/article.php/1130.html
+http://www.eol.org/pages/1159170
+http://www.epa.gov/IRIS/subst/0442.htm
+http://www.epa.gov/IRIS/subst/0443.htm
+http://www.epa.gov/acidrain/reducing/
+http://www.epa.gov/iris/subst/0321.htm
+http://www.epa.gov/ttnatw01/hlthef/acetalde.html
+http://www.epidendra.org/taxones/index.html
+http://www.epigee.org/guide/abortifacient.html
+http://www.epigee.org/guide/abstain.html
+http://www.epilepsy.com/EPILEPSY/seizure_atonic
+http://www.erowid.org/archive/rhodium/chemistry/pcp.shulgin.html
+http://www.erowid.org/archive/rhodium/pdf/p-no2phch2cl.nitroethanate.alkylation.pdf
+http://www.erowid.org/chemicals/absinthe/absinthe_law.shtml
+http://www.erowid.org/plants/wormwood/wormwood.shtml
+http://www.esic.edu/meet/empresas_detalle.cfm?id_empresa=62
+http://www.eso.org/public/news/eso0316/
+http://www.estimulanet.com/2010/07/como-achar-uma-twitcan-ao-vivo.html
+http://www.etap.org/demo/biology_files/lesson6/instructiontutor_last.html
+http://www.etc.edu.cn/academist/hkk/hkk.htm
+http://www.ethicon360.com/products/surgicel-family-absorbable-hemostats
+http://www.ethicurean.com/2010/02/19/acid-soil/
+http://www.ethnologue.com/show_country.asp?name=cd
+http://www.ethnologue.com/show_language.asp?code=aca
+http://www.etsy.com/shop/Abundancy
+http://www.etsy.com/shop/Accessorius
+http://www.etsy.com/shop/shayaaron
+http://www.etsybead.wordpress.com/
+http://www.eurekalert.org/pub_releases/2010-03/nocs-dso030810.php
+http://www.everydiet.org/diet/acid-alkaline-diets
+http://www.exclassics.com/foxe/foxegls2.htm
+http://www.exeter1031.com/
+http://www.exoticanimal.net/drugbook/BookInformation/DrugTradename.html
+http://www.expand.com/products/products.aspx?url=products
+http://www.explorebiodiversity.com/Hawaii/BiodiversityForgotten/Wildlife/Inverts/Tree%20Snails.htm
+http://www.exploringnature.org/db/detail.php?dbID=13&detID=2473
+http://www.exrx.net/Lists/ExList/HipsWt.html
+http://www.exrx.net/WeightTraining/Myths.html
+http://www.extrememontana.com/
+http://www.ezakwantu.com/Gallery%20African%20Weapons%20-%20Central%20African%20Weapons.htm
+http://www.fabjob.com/caterer.asp
+http://www.face-thefuture.com/
+http://www.facebook.com/Acmatic
+http://www.facebook.com/ablatitious
+http://www.facebook.com/group.php?gid=111530035529061
+http://www.facebook.com/group.php?gid=170705003744
+http://www.facebook.com/group.php?gid=89008772451&v=wall
+http://www.facebook.com/pages/Absurd-Recordings/73878424304
+http://www.facebook.com/shmula
+http://www.facebook.com/sitemap.php?type=pages&id=1468
+http://www.fairmont.com/EN_FA/Property/
+http://www.faithcomesbyhearing.com/acclaimer-portable-video-player
+http://www.family-vacation-getaways-at-los-angeles-theme-parks.com/Build-A-Bear-Store.html
+http://www.fanfiction.net/u/386600/Deadwoodpecker
+http://www.faslink.org/fasmain.htm
+http://www.fcgapultoscollection.com/antique.html
+http://www.fda.gov/ICECI/ComplianceManuals/CompliancePolicyGuidanceManual/ucm074471.htm
+http://www.feld.com/wp/archives/2010/06/mailing-out-patent-absurdity.html
+http://www.fema.gov/oer/reference/
+http://www.fenwaywest.com/
+http://www.fgf.org.eg/CIT.aspx
+http://www.fgf.org.eg/CIT_Showpage.aspx?PageID=131
+http://www.findanexpert.unimelb.edu.au/researcher/person15972.html
+http://www.findtheword.info/resultat.php?stype=contains&sword=F
+http://www.findtheword.info/resultat.php?stype=contains&sword=W
+http://www.findtheword.info/resultat.php?stype=ends&sword=C
+http://www.findtheword.info/resultat.php?stype=ends&sword=I
+http://www.firstworldwar.com/source/greece_constantineabdication.htm
+http://www.fishbase.org/summary/speciessummary.php?id=4604
+http://www.fishbase.org/summary/speciessummary.php?id=4744
+http://www.fishlore.com/acclimating-tropicalfish.htm
+http://www.flavinscorner.com/abc.htm
+http://www.flexabed.com/
+http://www.flickr.com/groups/lumix-g1/
+http://www.flickr.com/photos/26427625@N03/3953330580/
+http://www.flickr.com/photos/abnegate/4651984274/
+http://www.flickr.com/photos/absenter/
+http://www.flickr.com/photos/abulic_monkey/
+http://www.flickr.com/photos/acetonic/4538815962/
+http://www.flickr.com/photos/acetonic/5031262918/
+http://www.flickr.com/photos/dinesh_valke/2891857287/
+http://www.flickr.com/photos/ericinsf/2151184576/
+http://www.flickr.com/photos/galeriapehuen/2645432099/
+http://www.flickr.com/photos/microagua/3604665652/
+http://www.flickr.com/photos/sickilla/4939962672/
+http://www.flickr.com/photos/smacdonald/2141012038/
+http://www.flickr.com/photos/swaidan/3609141676/
+http://www.flickr.com/photos/theta444/76186482/
+http://www.flickr.com/photos/vaporslave/5032046657/
+http://www.flickr.com/photos/zz77/3280996694/
+http://www.floridata.com/ref/a/acal_his.cfm
+http://www.floridata.com/ref/a/achi_mil.cfm
+http://www.floridata.com/ref/b/bras_ole_kale.cfm
+http://www.floswimming.org/videos/coverage/athlete/234033/831-matt-grevers
+http://www.flower-garden-bulbs.com/acidanthera.html
+http://www.fmylife.com/work/133145
+http://www.fns.usda.gov/cnd/guidance/special_dietary_needs.pdf
+http://www.foodaddictsanonymous.org/frequently-asked-questions
+http://www.foodsubs.com/Soyprod.html
+http://www.footstompin.com/products/cds/in_a_bleeze
+http://www.forabodiesonly.com/
+http://www.forcon.ca/learning/alcohol.html
+http://www.fordham.edu/halsall/med/wiet.html
+http://www.fordham.edu/halsall/mod/modsbook05.html
+http://www.fordham.edu/halsall/source/anjou.html
+http://www.foreignword.com/glossary/plongeon/eng/defa.htm
+http://www.foresight.org/updates/Background1.html
+http://www.fortunecity.com/roswell/jekyll/75/index.html
+http://www.forumancientcoins.com/board/index.php?topic=54203.0;wap2
+http://www.fossilsites.com/STATES/NS.HTM
+http://www.fourdir.com/abenaki.htm
+http://www.fourdir.com/achomawi.htm
+http://www.fourmilab.ch/etexts/einstein/E_mc2/www/
+http://www.foxnews.com/politics/2010/04/18/palin-taken-aback-obamas-like-remark/
+http://www.fpa.org.uk/Findaclinic
+http://www.fpg.unc.edu/~abc/
+http://www.franklin-porterville.com/
+http://www.freecsstemplates.org/preview/accomplishable/
+http://www.freedownloadmanager.org/
+http://www.freepatentsonline.com/6660298.html
+http://www.freesound.org/usersViewSingle.php?id=37876
+http://www.freewebs.com/lostworldamericanbulldogs/
+http://www.friendshipinn.fsnet.co.uk/
+http://www.froghollowpress.com/catalogue.html
+http://www.frommers.com/destinations/paris/A25357.html
+http://www.fsc.yorku.ca/york/istheory/wiki/index.php/Absorptive_capacity_theory
+http://www.funnyordie.com/videos/c5839db13b/tom-cruise-is-a-cockblock-from-the-backeast-brothers-evan-ferrante-foleyspond-and-ross-kohn
+http://www.fwhc.org/abortion/mtxinfo.htm
+http://www.galleries.com/minerals/property/habits.htm
+http://www.galleries.com/minerals/sulfides/acanthit/acanthit.htm
+http://www.gallup.com/poll/135764/americans-acceptance-gay-relations-crosses-threshold.aspx
+http://www.gamedev.net/community/forums/topic.asp?topic_id=527170
+http://www.gamedev.net/reference/articles/article1698.asp
+http://www.gameo.org/encyclopedia/contents/E238790.html
+http://www.gardenguides.com/243-acidanthera-details-garden-basics-flower-bulb-acidanthera-bicolor.html
+http://www.gardenguides.com/487-southernwood-artemesia-abrotanum.html
+http://www.garfield.library.upenn.edu/merton/matthewii.pdf
+http://www.gasresources.net/DisposalBioClaims.htm
+http://www.geardiary.com/2010/08/03/fha-deals-housing-market-a-blow/
+http://www.genome.gov/11508982
+http://www.genome.jp/kegg-bin/get_htext?htext=br08301.keg&filedir=&hier=4
+http://www.genpink.com/fun-friday-round-up-the-shoe-edition/
+http://www.geog.umontreal.ca/donnees/geo2142/09%20-%20classification%20canadienne%20&%20USA.ppt
+http://www.geschichteinchronologie.ch/atmosphaerenfahrt/10-01_three-Van-Allen-radiation-belts-NASA-ENGL.html
+http://www.gesneriads.ca/genach.htm
+http://www.gigwise.com/features/42982/In-The-Bag?---Dan-Le-Sac-vs-Scroobius-Pip
+http://www.gigwise.com/photos/41125/Before-They-Were-Famous---Can-You-Guess-Whos-Who
+http://www.gillabstract.com/
+http://www.girlsforachange.org/
+http://www.glaucus.org.uk/Sturgeon.htm
+http://www.globalbillacceptors.com/
+http://www.globalsemesters.com/
+http://www.globenewswire.com/newsroom/?d=71415
+http://www.glomarketclothes.com/
+http://www.glossary.com/dictionary.php?q=Amidopyrine
+http://www.goabove.com/
+http://www.goatworld.com/articles/health/commondiseases.shtml
+http://www.godammit.com/2010/07/19/achingly-cool/
+http://www.gods-kingdom-ministries.org/weblog/WebPostingII.cfm?LogID=25
+http://www.godweb.org/godisable.htm
+http://www.golden-gate-park.com/index.php/photos/image_full/73/P200/
+http://www.goldenpaints.com/technicaldata/absorb.php
+http://www.goldsea.com/Air/Issues/Identity/identity.html
+http://www.goldsovereigns.co.uk/forsaleelizabethii.html
+http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=139394
+http://www.gopc.net/
+http://www.gov.hk/en/residents/immigration/
+http://www.grandcanyonlodges.com/
+http://www.grandprixgroup.com/gpi/magoffroad/classified/Question.asp?GID=242
+http://www.greatharborrental.com/
+http://www.greatlakesships.org/
+http://www.greattowait.com/
+http://www.guardian.co.uk/books/2010/may/15/britain-lost-cities-gavin-stamp
+http://www.guardian.co.uk/books/booksblog/2010/jul/29/book-depository-map
+http://www.guardian.co.uk/commentisfree/2010/sep/10/x-factor-miss-world-1970
+http://www.guardian.co.uk/environment/2010/jun/08/forest-emissions-bonn-climate-talks
+http://www.guardian.co.uk/stage/2010/sep/19/accomplice-review
+http://www.guardian.co.uk/technology/pda/2010/sep/02/apple-itunes-ping
+http://www.guardian.co.uk/world/2010/jan/04/wootton-bassett-islam4uk-parade-troops
+http://www.guildofbookworkers.org/gallery/abecedarium/contents.htm
+http://www.gunatit.com/
+http://www.gutenberg.org/ebooks/22790
+http://www.gutenberg.org/files/16119/16119-h/16119-h.htm
+http://www.gvrr.com/
+http://www.gwydir.demon.co.uk/insects/acalyptratae.htm
+http://www.gynalternatives.com/ablation.htm
+http://www.haaretz.com/news/diplomacy-defense/fayyad-ayalon-meeting-ends-abruptly-over-two-state-solution-dispute-1.315049
+http://www.haier.com.hr/wp-content/plugins/wp-publications-archive/openfile.php?action=open&file=81
+http://www.haier.com/products/more.asp?epcID=5
+http://www.halfbakery.com/idea/Wide-Area_20Remote_20games
+http://www.happiness-project.com/happiness_project/2009/01/quiz-are-you-a-moderator-or-an-abstainer.html
+http://www.hazegray.org/faq/slang1.htm
+http://www.hc-sc.gc.ca/dhp-mps/prodnatur/legislation/docs/complian-conform_guide-eng.php
+http://www.hc-sc.gc.ca/fniah-spnia/nihb-ssna/provide-fournir/pharma-prod/med-list/84-00-eng.php
+http://www.healingdaily.com/oral-chelation/N-acetyl-cysteine%20(NAC)-for-detoxification-what-it-is.htm
+http://www.health.harvard.edu/newsweek/Abdominal-fat-and-what-to-do-about-it.htm
+http://www.health.harvard.edu/newsweek/What-are-bioidentical-hormones.htm
+http://www.health.harvard.edu/press_releases/acetaminophen_overdose
+http://www.healthscout.com/ency/68/642/main.html
+http://www.heavens-above.com/
+http://www.hechimadoh.net/positive/nicky/nicky.cgi?DATE=200610?MODE=MONTH
+http://www.heliopan.de/produkte/nahlinsen.shtml
+http://www.hellebores.org/hellebores.html
+http://www.hellebores.org/structure.html
+http://www.helleniccomserve.com/greeksgoingeast.html
+http://www.henriabele.com/
+http://www.henriettesherbal.com/eclectic/kings/achillea.html
+http://www.henriettesherbal.com/eclectic/sturtevant/aberia.html
+http://www.hepatitis-central.com/hcv/glossary/A.html
+http://www.heraldry-online.org.uk/boyd/boyd-arms.htm
+http://www.herbaltherapeutics.net/MMV-I.pdf
+http://www.herbmed.org/herbs/Herb98.htm
+http://www.herbs2000.com/herbs/herbs_yarrow.htm
+http://www.hermanradtke.com/blog/using-absolute-urls-in-the-view/
+http://www.hermesabrasives.com/
+http://www.hermitary.com/solitude/acedia.html
+http://www.hibiscus.org/species/amanihot.php
+http://www.hichem.com/info_cascode/
+http://www.hiddenhurt.co.uk/
+http://www.himalayangardens.com/achimenes-blue-spark.html
+http://www.hinduonnet.com/fline/fl2321/stories/20061103000106600.htm
+http://www.hipfai.com/
+http://www.hismajestycarpetservice.com/
+http://www.historians.org/resources/Family_Leave_Policies.doc
+http://www.historybuff.com/library/reftype.html
+http://www.historyplace.com/speeches/edward.htm
+http://www.hitmanforum.com/forum/index.php?showtopic=50716
+http://www.hixie.ch/tests/evil/acid/004/
+http://www.hoacandalucia.es/webfirmas/WEBHOAC/cadiz-entrega-firmas-contra-siniestralidad-laboral.htm
+http://www.hockeys.co.uk/
+http://www.hollywoodreporter.com/hr/content_display/news/e3if1d3902d12574ec222961f1deec0fd2b
+http://www.homedepot.com/webapp/wcs/stores/servlet/ProductDisplay?productId=100003545&catalogId=10053&storeId=10051&langId=-1
+http://www.hondapartsdeals.com/
+http://www.hornady.com/
+http://www.hort.purdue.edu/newcrop/CropFactSheets/onga.html
+http://www.hort.purdue.edu/newcrop/cropfactsheets/muskdana.html
+http://www.hort.purdue.edu/newcrop/morton/sapodilla.html
+http://www.hort.uconn.edu/plants/a/acasie/acasie1.html
+http://www.hostelsclub.com/
+http://www.hotboudin.com/
+http://www.hotelabbatialsaintgermain.com/
+http://www.houseplansaz.com/
+http://www.howmuchisenough.net/
+http://www.hp-lexicon.org/atlas/gazetteer/gazetteer-a.html
+http://www.hp-lexicon.org/atlas/gazetteer/gazetteer-n.html
+http://www.hrspatients.org/patients/treatments/cardiac_ablation.asp
+http://www.hss.edu/conditions_pelvic-acetabulum-fractures.asp
+http://www.httpwatch.com/features.htm
+http://www.huffingtonpost.com/2009/07/29/house-republicans-unveil-_n_247301.html
+http://www.huffingtonpost.com/kamran-pasha/sitara-achakzai-martyr-fo_b_186744.html
+http://www.hummerhub.com/
+http://www.huntfor.com/arthistory/c17th-mid19th/academism.htm
+http://www.hvacpartsoutlet.com/troubleshootafrozenevaporatoraccoil.aspx
+http://www.hwupgrade.it/articoli/videogiochi/1735/starcraft-ii-blizzard-si-accinge-a-riscrivere-la-storia-degli-rts_index.html
+http://www.hww.ca/hww2.asp?id=48
+http://www.i3s.unice.fr/~acher/
+http://www.ibdb.com/production.php?id=13288
+http://www.iberia.com/
+http://www.ibishotel.com/gb/hotel-1734-hotel-arcadia-jakarta/index.shtml
+http://www.ibm.com/developerworks/db2/library/techarticle/0303abelite/0303abelite.html
+http://www.ices.dk/products/fiche/Plankton/SHEET114.PDF
+http://www.ics.uci.edu/~kay/wordlist.txt
+http://www.ideadata.org/
+http://www.idosi.org/abr/1(3-4)/2.pdf
+http://www.idrc.ca/acacia/
+http://www.iesabroad.org/
+http://www.ietf.org/rfc/rfc2818.txt
+http://www.ikramabidi.com/
+http://www.illawarrakungfu.com.au/
+http://www.illusionsgallery.com/Accolade.html
+http://www.ilovelanguages.com/IDP/files/German.txt
+http://www.ilpi.com/organomet/monsanto.html
+http://www.ilsoftware.it/articoli.asp?id=5860
+http://www.imachordata.com/
+http://www.imachordata.com/?p=199
+http://www.imanet.org/
+http://www.imdb.com/title/tt0149568/
+http://www.imdb.com/title/tt0271349/
+http://www.imdb.com/title/tt0381942/
+http://www.imdb.com/title/tt0423409/
+http://www.imdb.com/title/tt0809504/
+http://www.imdb.com/title/tt1197624/
+http://www.imm.ac.cn/journal/ccl/1606/160612-747-04-0456-p4.pdf
+http://www.immohit.ch/
+http://www.inachord.org/
+http://www.inchem.org/documents/iarc/suppl7/analgesicmx&phenacetin.html
+http://www.inchem.org/documents/icsc/icsc/eics1024.htm
+http://www.inchem.org/documents/pims/plant/abruspre.htm
+http://www.incorporate.com/c_corporation.html
+http://www.indeed.com/salary/q-Specimen-Accessioner-l-Knoxville,-TN.html
+http://www.indeed.com/salary/q-Specimen-Accessioner-l-Smyrna,-GA.html
+http://www.independent.co.uk/opinion/commentators/johann-hari/johann-hari-catholics-its-you-this-pope-has-abused-2074029.html
+http://www.indiamart.com/accusizecarbide/
+http://www.indiesummer.net/
+http://www.indymedia.org.nz/article/67766/battery-hen-farm-horror
+http://www.infidels.org/library/modern/kyle_gerkin/objections_sustained/obj3.html
+http://www.informationweek.com/blog/main/archives/2010/04/how_well_do_hos.html
+http://www.informaworld.com/index/909605422.pdf
+http://www.informaworld.com/index/917891343.pdf
+http://www.infosecwriters.com/text_resources/pdf/secure_linksys_wrt54g.pdf
+http://www.infovisual.info/01/009_en.html
+http://www.ingentaconnect.com/content/bgbm/will/2006/00000036/00000001/art00028
+http://www.ingentaconnect.com/content/esa/aesa/1957/00000050/00000001/art00010
+http://www.ingentaconnect.com/content/wnars/aiep/2009/00000039/00000002/art00006
+http://www.inhs.uiuc.edu/~mjwetzel/ENCH/MarEnchList.html
+http://www.inspectapedia.com/aircond/ACCoilFrost.htm
+http://www.instantssl.com/ssl-certificate-products/https.html
+http://www.intelligentactuator.com/
+http://www.intotheblue.co.uk/flying-experiences/vintage-aeroplanes/spitfire-flights/spitfire-flying-experience/
+http://www.investopedia.com/terms/a/accrualaccounting.asp
+http://www.iowaschoolprofiles.com/
+http://www.ipsl.jussieu.fr/~jomce/acidification/paper/Orr_OnlineNature04095.pdf
+http://www.ir.metu.edu.tr/iom/pdf/unhcr2.pdf
+http://www.iranchamber.com/history/achaemenids/achaemenids.php
+http://www.isa.org.jm/files/documents/EN/ScientificGlossary.htm
+http://www.islamreview.com/articles/quransdoctrine.shtml
+http://www.islandnet.com/~egbird/dict/a.htm
+http://www.islandnet.com/~egbird/dict/words.pdf
+http://www.iso.org/iso/iso_catalogue/management_standards/certification/choosing_a_certification_body.htm
+http://www.israelnationalnews.com/news/news.aspx/136373
+http://www.issg.org/database/species/ecology.asp?si=64
+http://www.istyles.com/abolisher-ipod-nano-skin-p-22903.html
+http://www.italianaccordion.com/
+http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=64270
+http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=69662
+http://www.itsasnap.org/
+http://www.ittiofauna.org/webmuseum/pesciossei/acipenseriformes/acipenseridae/acipenser/acipenser.htm
+http://www.jackals-forge.com/abom.html
+http://www.jacn.org/cgi/content/full/20/3/239
+http://www.jal.co.jp/en/jmb/earn/travel/journey/internet_shopping/
+http://www.janaleighmusic.com/cgi-bin/guestbook/guestbook.cgi?records_per_page=10&first_record_to_display=20
+http://www.jannah.com/learn/ablution.html
+http://www.jannederveenpieterse.com/pdf/Pa%20Glob%20multicult.pdf
+http://www.japanable.com/board.php?mode=2&prevmode=1&cat=11&thread=241&search=
+http://www.japanable.com/board.php?mode=2&prevmode=3&cat=16&thread=767&search=
+http://www.japanable.com/board.php?mode=2&prevmode=4&cat=5&thread=58&search=
+http://www.javascriptkit.com/cutpastejava.shtml
+http://www.jbc.org/content/172/2/825.full.pdf
+http://www.jbc.org/content/262/31/14990.short
+http://www.jbc.org/content/276/21/18375.full
+http://www.jbc.org/content/278/39/37799.abstract
+http://www.jbc.org/content/64/2/379.full.pdf
+http://www.jci.org/articles/view/38248
+http://www.jcrows.com/remarkableraspberry.html
+http://www.jeffachen.com/
+http://www.jefflewis.net/factoids.html
+http://www.jegsworks.com/lessons/databases/tablesqueries/ex1.htm
+http://www.jenniecooks.com/
+http://www.jewishencyclopedia.com/view.jsp?artid=134&letter=G
+http://www.jewsagainstzionism.com/resources/onlinebooks/holocaust%20victims%20accuse.pdf
+http://www.jiaci.org/issues/vol16issue03/7.pdf
+http://www.jimbyrd.com/the-dichotomy-of-maya-angelou
+http://www.jimmunol.org/cgi/reprint/166/2/1169.pdf
+http://www.jklcompany.com/a.html
+http://www.jlr.org/cgi/content/abstract/30/3/454
+http://www.jneurosci.org/cgi/content/full/17/23/9133
+http://www.joabbess.com/
+http://www.johnva.com/
+http://www.joiegatlin.com/
+http://www.joyforelders.com/
+http://www.joyfulabode.com/
+http://www.js4ir.com/
+http://www.jtbaker.com/msds/englishhtml/a0302.htm
+http://www.jtbaker.com/msds/englishhtml/a5508.htm
+http://www.k12studentinsurance.com/
+http://www.kb.cert.org/vuls/id/261869
+http://www.keithablow.com/
+http://www.kgs.ku.edu/Publications/Bulletins/157_5/index.html
+http://www.khorrami.com/
+http://www.kinetics.nsc.ru/comp/comp2009/vas1.pdf
+http://www.kitchen-worktops-london.co.uk/
+http://www.kitchenaidconversations.com/forums/topic.asp?TOPIC_ID=6663
+http://www.kitchenaidconversations.com/forums/topic.asp?TOPIC_ID=6803
+http://www.kokogiak.com/logolepsy/ow_a.html
+http://www.kortlandt.nl/publications/art218e.pdf
+http://www.kountrylife.com/cgi-bin/topic.cgi?bd=forum&th=145787
+http://www.krvs.org/
+http://www.kundalini-yoga-info.com/Ek_Ackhari_Chand.html
+http://www.kyla.co.uk/other/rexx1.htm
+http://www.la-palma-tourismus.com/en/apocynaceae/module/family.htm
+http://www.lacajou.com/
+http://www.lamf.net/
+http://www.landryandarcari.com/
+http://www.laprensatoledo.com/Stories/2010/043010/obama.htm
+http://www.last.fm/event/1373585+Winterschein+Festival
+http://www.last.fm/group/People+with+inconsistent+musical+taste+-+who+yet+prove+a+certain+indy-attitude/forum/11482/_/472926/3
+http://www.last.fm/music/ART+ABSCONs
+http://www.latinoreview.com/news/huge-watchmen-article-talks-about-watchmen-5024
+http://www.law.yale.edu/faculty/AChua.htm
+http://www.lawyerthai.com/eng/view.php?topic=30
+http://www.leadershiplecture.com/
+http://www.leavingacademia.com/
+http://www.lef.org/Vitamins-Supplements/Item00758/Super-Absorbable-Soy-Isoflavones.html
+http://www.legalplanning.net/
+http://www.legioneocculta.com/
+http://www.lethalpestsolutions.com/
+http://www.leucrotapress.com/AbaculusIII.html
+http://www.levitonproducts.com/catalog/dept_id_600.htm
+http://www.lexique.org/listes/liste_mots.txt
+http://www.lhla.org/
+http://www.liaisonsabroad.com/italy/macerata.html
+http://www.liberation.fr/economie/0101647750-l-agence-moody-s-abaisse-d-un-cran-la-note-de-l-irlande
+http://www.lifesitenews.com/abortiontypes/
+http://www.light-measurement.com/reflection-absorption/
+http://www.lighthouse.cc/links/overnight.html
+http://www.lightplanet.com/mormons/response/qa/
+http://www.lil-abner.com/
+http://www.linuxjapan.com/linuxdhcpserver/
+http://www.literateur.com/2010/01/an-interview-with-sir-christopher-ricks-part-i/
+http://www.literature.org/authors/darwin-charles/the-descent-of-man/chapter-10.html
+http://www.liveaquaria.com/PIC/article.cfm?aid=157
+http://www.livejournal.com/userinfo.bml?user=capslock_dn
+http://www.liverpuncher.com/fan-photos/4.html
+http://www.livescience.com/environment/disaster-death-toll-2010-100311.html
+http://www.livetext.com/
+http://www.livingthetruth.com/
+http://www.livius.org/aa-ac/achaemenians/achaemenians.html
+http://www.livius.org/aa-ac/achaemenians/inscriptions.html
+http://www.livius.org/cao-caz/carthage/carthage_t01.html
+http://www.lonelyabolitionist.com/
+http://www.luminous-landscape.com/reviews/cameras/achromatic.shtml
+http://www.lyricsondemand.com/onehitwonders/achybreakyheartlyrics.html
+http://www.maa.com/
+http://www.madoverlord.com/lotsofwords.txt
+http://www.magenta.gr/en/mon2pol/en_mon2pol_pro.htm
+http://www.maine.gov/cgi-bin/online/AbsenteeBallot/index.pl
+http://www.maizegdb.org/ancillary/Burnham/c10p271to277.pdf
+http://www.majidabbasi.ir/
+http://www.maketunes.com/forums/collab-projects
+http://www.malvaceae.info/Genera/Abutilon/galleryH.html
+http://www.maplandia.com/algeria/jijel/places-achira-bou-asli.html
+http://www.maplandia.com/brazil/amapa/macapa/
+http://www.maplandia.com/united-arab-emirates/shariqah/sharjah/accommodation/al-marrifa-international-school/
+http://www.mapress.com/zootaxa/2006f/z01296p068f.pdf
+http://www.mapress.com/zootaxa/2007f/z01443p016f.pdf
+http://www.mapress.com/zootaxa/2010/f/zt02415p053.pdf
+http://www.mapress.com/zootaxa/taxa/Acari.html
+http://www.marchofdimes.com/professionals/14332_1154.asp
+http://www.marchofdimes.com/professionals/14332_1204.asp
+http://www.marchofdimes.com/professionals/14332_1209.asp
+http://www.marco.com/automated/2.html
+http://www.maricopa.edu/disclosure/
+http://www.marinelifephotography.com/fishes/surgeonfishes/surgeonfishes.htm
+http://www.marines.mil/unit/imef/Pages/MarineabsorbsIEDblast,walksaway.aspx
+http://www.marinespecies.org/aphia.php?p=taxdetails&id=130499
+http://www.mariobadescu.com/Drying-Lotion
+http://www.marmet-meteorites.com/id41.html
+http://www.marmuseum.ca/MillsUpdateSept04.html
+http://www.marottadental.com/atlantis_abutment.htm
+http://www.marxists.org/history/cuba/archive/castro/1953/10/16.htm
+http://www.marxists.org/reference/archive/hegel/works/se/abstract.htm
+http://www.massresources.org/pages.cfm?contentID=38&pageID=17&subpages=yes&dynamicID=605
+http://www.masud.co.uk/ISLAM/ahm/default.htm
+http://www.math.sjsu.edu/~foster/dictionary.txt
+http://www.math.sjsu.edu/~foster/half_dictionary.txt
+http://www.math.toronto.edu/jjchew/scrabble/lists/common-7.html
+http://www.math.toronto.edu/jjchew/scrabble/lists/common-8.html
+http://www.math.uaa.alaska.edu/~afkjm/cs109cs/Exercises/Exercise14_files/bigwords.txt
+http://www.maty.com/
+http://www.mavensecurity.com/Achilles/
+http://www.mavi1.org/web_security/wordlists/english.txt
+http://www.maxim-ic.com/app-notes/index.mvp/id/3768
+http://www.maxpagesplus.com/hydroquinone
+http://www.mayoclinic.com/health/lactobacillus/NS_patient-acidophilus
+http://www.mayoclinic.com/health/placental-abruption/DS00623
+http://www.mayoclinic.org/atrial-fibrillation-ablation/
+http://www.mb.com.ph/articles/266807/aani-harvest-festival-starts-friday
+http://www.mbm.net.au/health/cosmetics/a.html
+http://www.mcm.asso.fr/site02/inedit/cd260123.htm
+http://www.mcsweeneys.net/2010/8/26adams.html
+http://www.mdidea.com/products/new/new025.html
+http://www.mdpi.com/1420-3049/12/9/2181/
+http://www.mdpi.org/molecules/papers/11070574.pdf
+http://www.meddean.luc.edu/lumen/MedEd/grossanatomy/h_n/cn/cn1/cn6.htm
+http://www.medhelp.org/posts/Gastroenterology/Pain-in-Abdomin-middle-upper-right-quadrant/show/233989
+http://www.mediaite.com/tv/new-black-panther-chief-malik-shabazz-on-king-samirs-kill-white-babies-comment/
+http://www.medical-glossary.com/definition/abdominoposterior.html
+http://www.medicine.mcgill.ca/mjm/issues/v02n02/aspirin.html
+http://www.medicineatyourfeet.com/Dodonaea_viscosa.pdf
+http://www.medicinenet.com/abscessed_tooth/article.htm
+http://www.medicinenet.com/acetaminophen/article.htm
+http://www.medicinenet.com/achalasia/article.htm
+http://www.medicinenet.com/achondroplasia/article.htm
+http://www.medicinenet.com/boils/article.htm
+http://www.medilexicon.com/
+http://www.medilexicon.com/medicaldictionary.php?t=124
+http://www.medrapid.info/disease/22801
+http://www.medrapid.info/disease/45184
+http://www.medrapid.info/disease/49845
+http://www.medscape.com/viewarticle/558719_6
+http://www.medscape.com/viewarticle/576875
+http://www.medterms.com/script/main/art.asp?articlekey=10663
+http://www.medterms.com/script/main/art.asp?articlekey=2105
+http://www.medterms.com/script/main/art.asp?articlekey=25533
+http://www.medterms.com/script/main/art.asp?articlekey=39716
+http://www.medterms.com/script/main/art.asp?articlekey=6990
+http://www.medword.com/omd/A_text.txt
+http://www.medword.com/uspa.html
+http://www.meetbarackobama.com/
+http://www.meforum.org/1754/peace-or-jihad-abrogation-in-islam
+http://www.memidex.com/acknowledgable
+http://www.mendelweb.org/MWpeaslee.html
+http://www.merck.com/mmhe/sec12/ch159/ch159b.html
+http://www.mercksource.com/pp/us/cns/cns_hl_dorlands.jspzQzpgzEzzSzppdocszSzuszSzcommonzSzdorlandszSzdorlandzSz000000060zPzhtm
+http://www.meredy.com/annebaxter/
+http://www.merip.org/mer/mer202/hopkins.html
+http://www.merriam-webster.com/dictionary/abiogenist
+http://www.mesh-key.com/news.html
+http://www.metal-archives.com/band.php?id=15813
+http://www.metal-archives.com/band.php?id=1900
+http://www.metal-archives.com/band.php?id=4374
+http://www.metal-archives.com/band.php?id=78916
+http://www.metal-archives.com/browseL.php?l=A
+http://www.metalzone.com.br/podcast/index.php?id=9
+http://www.meteorites.wustl.edu/gra06128.htm
+http://www.metmuseum.org/toah/hd/abba/hd_abba.htm
+http://www.metmuseum.org/toah/hd/acha/hd_acha.htm
+http://www.metrolyrics.com/excoriating-abdominal-emanation-lyrics-carcass.html
+http://www.metrolyrics.com/fearless-lyrics-taylor-swift.html
+http://www.metrolyrics.com/love-religion-lyrics-u96.html
+http://www.metropolismag.com/story/20100618/our-2010-neocon-visual-diary
+http://www.metrosun.com/
+http://www.michigan.gov/dnr/0,1607,7-153-10370_12145_12203-33009--,00.html
+http://www.microsoft.com/windows/windowsmedia/player/11/readme.aspx
+http://www.midiaindependente.org/pt/blue/2007/01/371879.shtml
+http://www.millidge.com/
+http://www.mindat.org/loc-2137.html
+http://www.mindat.org/min-454.html
+http://www.minerals.net/gemstone/gemstone/tourmali/tourmali.htm
+http://www.missingmoney.com/
+http://www.mlive.com/opinion/grand-rapids/index.ssf/2010/09/editorial_find_a_way_to_accomm.html
+http://www.mnemonicdictionary.com/word/abash
+http://www.mnemonicdictionary.com/word/acarpous
+http://www.mnemonicdictionary.com/word/acerbity
+http://www.mnhn.fr/museum/front/medias/publication/9801_g07n1a4.pdf
+http://www.mnsu.edu/emuseum/cultural/oldworld/europe/abkhasians.html
+http://www.mnsu.edu/emuseum/cultural/southamerica/abipon.html
+http://www.mobot.org/mobot/research/apweb/orders/lauralesweb.htm
+http://www.mobot.org/mobot/research/apweb/orders/malpighialesweb.htm
+http://www.modelmayhem.com/1116993
+http://www.moldbaseball.com/eng/
+http://www.mono-project.com/Accessibility
+http://www.moshimoshimusic.com/news/2006/09/25/hot-club-on-radio1
+http://www.motherbedford.com/Whiskey.htm
+http://www.motherearthnews.com/Do-It-Yourself/1976-09-01/How-To-Build-A-Cider-Press.aspx
+http://www.mountainretreatorg.net/eschatology/abomin.shtml
+http://www.mrmen.com/
+http://www.msnbc.msn.com/id/36713115
+http://www.mum.org/midolsads.htm
+http://www.mumbaipolice.org/Absconder_List.htm
+http://www.mushroomexpert.com/helvella_acetabulum.html
+http://www.musicminusone.com/
+http://www.musicscotland.com/cd/jeana-leslie-siobhan-miller-in-bleeze.html
+http://www.musingsonthevine.com/tips_rate.shtml
+http://www.mycollector.com/
+http://www.myfoxny.com/dpp/news/local_news/new_york_state/chefs-call-proposed-new-york-salt-ban-absurd-20100310-akd
+http://www.mykirklands.com/content/discussions/1370/
+http://www.myspace.com/666acephalous
+http://www.myspace.com/abacay
+http://www.myspace.com/yokoabsorbing
+http://www.n-abler.org/
+http://www.nabro.unl.edu/articles/20002012/download/Vasant.pdf
+http://www.nairaland.com/nigeria/topic-185510.32.html
+http://www.namcogames.com/iphone_games/ridge_racer
+http://www.namcogames.com/pc_games/mishap
+http://www.nandor.org/math/chemwords/spelldistinctlist.htm
+http://www.nap.edu/books/0309074347/html/
+http://www.nasa.gov/multimedia/imagegallery/image-feature_1620.html
+http://www.nasa.gov/topics/solarsystem/features/titan20100603.html
+http://www.native-languages.org/abenaki.htm
+http://www.native-languages.org/achagua.htm
+http://www.native-languages.org/achumawi.htm
+http://www.naturalhealthwizards.com/ConstituentsofMedicinalPlantsSample.pdf
+http://www.nature.com/ijo/journal/v27/n6/full/0802296a.html
+http://www.nature.com/nature/journal/v182/n4651/abs/1821745a0.html
+http://www.nature.com/nm/journal/v16/n7/full/nm.2175.html
+http://www.nature.com/nphoton/journal/vaop/ncurrent/abs/nphoton.2009.189.html
+http://www.nature.com/scientificamericanmind/journal/v21/n3/full/scientificamericanmind0710-10.html
+http://www.navy.mil/
+http://www.ncadp.org/
+http://www.ncbi.nlm.nih.gov/pmc/articles/PMC1180424/
+http://www.ncemi.org/cse/cse0805.htm
+http://www.ndepend.com/Metrics.aspx
+http://www.nealstephenson.com/anathem/acknow.htm
+http://www.neilbrand.com/
+http://www.neirr.org/s7-aber2.html
+http://www.netartreview.net/monthly/0705_3.html
+http://www.netdoctor.co.uk/diseases/facts/diabeticacidosis.htm
+http://www.nettam.com/convert.html
+http://www.neuroanatomy.wisc.edu/virtualbrain/BrainStem/13VNAN.html
+http://www.newadvent.org/cathen/01007e.htm
+http://www.newcriterion.com/articles.cfm/Aboriginal-sin--5337
+http://www.newgrounds.com/collection/retardedanimalbabies
+http://www.newpig.com/
+http://www.newscientist.com/article/dn18361-innovation-what-use-is-a-smartbook.html
+http://www.newsweek.com/2009/06/26/a-biology-of-mental-disorder.html
+http://www.newworldencyclopedia.org/entry/Achomawi
+http://www.nexentastor.org/boards/2/topics/772
+http://www.nga.gov/education/american/abstract.shtm
+http://www.nhm.ac.uk/hosted_sites/acarology/
+http://www.nhm.ac.uk/hosted_sites/acarology/zhang/
+http://www.nies.go.jp/chiiki1/protoz/morpho/colpoda.htm
+http://www.nies.go.jp/chiiki1/protoz/toxicity/chemical/phenol.htm
+http://www.ninds.nih.gov/disorders/cephalic_disorders/detail_cephalic_disorders.htm
+http://www.nj.com/news/index.ssf/2010/09/charges_added_against_doctor_a.html
+http://www.nlm.nih.gov/medlineplus/abdominalpain.html
+http://www.nmfs.noaa.gov/pr/species/fish/shortnosesturgeon.htm
+http://www.nola.com/news/gulf-oil-spill/index.ssf/2010/07/27000_abandoned_oil_and_gas_we.html
+http://www.npr.org/templates/story/story.php?storyId=123898317
+http://www.nps.gov/acad/
+http://www.nps.gov/history/mwac/bottle_glass/botglass.pdf
+http://www.ntsb.gov/alerts/SA_006.pdf
+http://www.nysaes.cornell.edu/ent/biocontrol/weedfeeders/cyphocleonus.html
+http://www.nytimes.com/2010/09/08/business/08bedbug.html
+http://www.nytimes.com/2010/09/22/us/22church.html
+http://www.o3magazine.com/4/a/0/2.html
+http://www.oaanews.org/
+http://www.objectmentor.com/resources/articles/oodmetrc.pdf
+http://www.obscure-abhorrence.com/
+http://www.ocean-acidification.net/
+http://www.ockers.be/Glossary%20of%20animal%20names%20in%20Latin,%20English,%20Dutch,%20German,%20French.xls
+http://www.oclock.info/links/manufactures/
+http://www.odh.ohio.gov/pdf/idcm/scabies.pdf
+http://www.odi.org.uk/resources/download/1369.pdf
+http://www.oecd.org/document/57/0,3343,en_2649_201185_45159737_1_1_1_1,00.html
+http://www.offtempo.com/attic-abasement-in-studio-on-hollow-earth-radio/
+http://www.ogj.com/index/article-display/284410/articles/oil-gas-journal/volume-105/issue-6/transportation/decommissioning-1-neb-case-study-shows-abandonment-pitfalls.html
+http://www.ohhla.com/anonymous/canibus/jacker/poet_two.can.txt
+http://www.ohloh.net/forums/10/topics/727
+http://www.oie.int/esp/normes/mmanual/2008/pdf/2.09.08_MANGE.pdf
+http://www.oilempire.us/abiotic.html
+http://www.okstate.edu/sas/v8/saspdf/accole/c01.pdf
+http://www.onesuite.com/
+http://www.onlynaturalpet.com/products/Vetri-Science-Acetylator/125001.aspx
+http://www.onpoint247.com/
+http://www.openswan.org/download/umlrootfs/psk-crack-dictionary
+http://www.opm.gov/oca/leave/html/annual.asp
+http://www.opticsinfobase.org/abstract.cfm?URI=ao-27-15-3161
+http://www.optimalearning.com/
+http://www.optonlaser.com/
+http://www.ora.nsysu.edu.tw/discussion/repost.asp?head_num=8485&board_num=11&board_name=%BA%F4%AD%B6%AB%D8%C4%B3
+http://www.oracle.com/technetwork/database/express-edition/downloads/index.html
+http://www.orchidspecies.com/indexa-anat.htm
+http://www.oregonlive.com/portland/index.ssf/2010/06/close_friend_says_portland_mas.html
+http://www.organic-chemistry.org/namedreactions/acetoacetic-ester-synthesis.shtm
+http://www.orgonelab.org/contracep.htm
+http://www.orgsyn.org/orgsyn/prep.asp?prep=cv1p0318
+http://www.originalabsinthe.com/
+http://www.orijen.ca/
+http://www.oscars.org/about/employment/index.html
+http://www.osha.gov/SLTC/etools/oilandgas/glossary_of_terms/glossary_of_terms_a.html
+http://www.osha.gov/SLTC/healthguidelines/aceticanhydride/recognition.html
+http://www.ou.edu/cas/archsur/OKArtifacts/abrader.htm
+http://www.ourbrickwalls.com/subpage14.html1.html
+http://www.outdooralabama.com/fishing/freshwater/license/
+http://www.oxforddictionaries.com/page/178
+http://www.oxid.it/
+http://www.oxygenee.com/absinthe-effect/victims.html
+http://www.ozanimals.com/Reptile/Southern-Death-Adder/Acanthophis/antarcticus.html
+http://www.ozcoasts.org.au/coastal/introduction.jsp
+http://www.paessler.com/knowledgebase/en/topic/5903-how-to-auto-acknowledge-a-down-sensor-in-prtg
+http://www.paienchem.com/
+http://www.palaeos.com/Vertebrates/Lists/Glossary/Glossary.html
+http://www.paperretriever.com/
+http://www.paresearch.org/
+http://www.paulgraham.com/accgen.html
+http://www.paypal.co.uk/
+http://www.pbministries.org/books/pink/Hebrews/hebrews_019.htm
+http://www.pbs.org/speak/ahead/mediapower/media/
+http://www.pbs.org/wgbh/aia/part3/3h85.html
+http://www.pbs.org/wgbh/aia/part4/4narr2.html
+http://www.pbs.org/wgbh/nova/abyss/
+http://www.peabody.yale.edu/scipubs/bulletins_postillas/ypmP065_1962.pdf
+http://www.peacehealth.org/kbase/nord/nord1089.htm
+http://www.pedseye.com/EsotropiaA.htm
+http://www.pem.org/yinyutang/
+http://www.pensitoreview.com/2010/09/19/christine-odonnell-abruptly-cancels-fox-appearance-in-wake-of-embezzlement-complaint/
+http://www.pesticideinfo.org/Detail_Chemical.jsp?Rec_Id=PC38206
+http://www.petersen.org/default.cfm?DocID=1013&ExhibitTitle=Cars%20%26%20Guitars
+http://www.petsnails.co.uk/problems/mites.html
+http://www.petsnails.co.uk/species/achatina_fulica.html
+http://www.pfaf.org/user/Plant.aspx?LatinName=Abobra%20tenuifolia
+http://www.pfeil-verlag.de/07pala/pdf/3_80d08.pdf
+http://www.pharmainfo.in/jpsr/Documents/Volumes/Vol1Issue3/pdf/jpsr01030909.pdf
+http://www.phon.ucl.ac.uk/home/wells/poznan04_wells.pdf
+http://www.phpdeveloper.org/news/8315
+http://www.phpdeveloper.org/news/8499
+http://www.phrases.org.uk/meanings/gone-for-a-burton.html
+http://www.phrases.org.uk/meanings/taken-aback.html
+http://www.physics.gatech.edu/people/faculty/ulandman/27_landman_et_al1976.pdf
+http://www.physionet.org/physiotools/deid/dict/sno_edited.txt
+http://www.phytopathology.net/Portal/Stemphylium_botryosum
+http://www.pianoaccompanists.com/
+http://www.picsearch.com/pictures/plants/garden%20plants/plants%20a-al/acaena.html
+http://www.picsearch.com/pictures/plants/garden%20plants/plants%20a-al/achimenes.html
+http://www.plannedparenthood.org/health-topics/birth-control/abstinence-4215.htm
+http://www.plantcell.org/cgi/content/abstract/2/3/245
+http://www.plantoftheweek.org/week196.shtml
+http://www.plantoftheweek.org/week262.shtml
+http://www.plantoftheweek.org/week469.shtml
+http://www.plantphysiol.org/cgi/content/abstract/77/3/786
+http://www.plantstogrow.com/botany/alpa_list/list_2.htm
+http://www.plasticstrends.net/index.php?option=com_content&task=view&id=12&Itemid=1
+http://www.playfire.com/a/forum/general-discussion/thread/31070
+http://www.playingwithlukas.com/
+http://www.playrf.com/GameGuide/item/Recipe_mix_ancient.asp
+http://www.plosmedicine.org/article/info%3Adoi%2F10.1371%2Fjournal.pmed.1000068
+http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0008144
+http://www.plu.edu/
+http://www.pmel.noaa.gov/co2/OA/
+http://www.pnas.org/content/77/10/5789.abstract
+http://www.pnas.org/content/81/13/4023.abstract
+http://www.podiobooks.com/title/vatican-abdicator
+http://www.policyarchive.org/handle/10207/bitstreams/18976.pdf
+http://www.politico.com/click/stories/1009/potus_goes_ringless_at_presser.html
+http://www.politico.com/news/stories/1109/29347.html
+http://www.polity.org.za/article/administrative-adjudication-of-road-traffic-offences-act-461998-amendment-administrative-abjudication-of-road-traffic-regulations-gazette-no-33039-regulation-212-2010-03-31
+http://www.polyvore.com/fly_abandonedly_into_sun/set?id=6876077
+http://www.pool1.com/
+http://www.poolsaboveground.com/
+http://www.port80software.com/products/httpzip/
+http://www.portalesmedicos.com/diccionario_medico/index.php/Abarticular
+http://www.positiveabstention.com/
+http://www.powerlabs.org/chemlabs/acetylide.htm
+http://www.powerlineblog.com/archives/2009/09/024440.php
+http://www.ppws.vt.edu/scott/weed_id/accvi.htm
+http://www.priestsforlife.org/testimony/stanekbakercongress.htm
+http://www.primestaffers.com/
+http://www.primordialperformance.com/store/liver-juice.html
+http://www.princeton.edu/~batke/itl/denise/abbasids.htm
+http://www.princeton.edu/~oa/safety/altitude.html
+http://www.prlog.org/10879849-compare-and-purchase-the-right-metrologic-barcode-scanner.html
+http://www.proactiv.com/aboutacne/howacnehappens.php
+http://www.probertencyclopaedia.com/browse/BA.HTM
+http://www.prochoice.org/
+http://www.programmableweb.com/api/mnemotechniques-abbreviator
+http://www.project-syndicate.org/commentary/fuller4/English
+http://www.prosnore.com/
+http://www.protectabed.com/
+http://www.protectyourmove.gov/consumer/awareness/glossary/glossary.htm
+http://www.prototypejs.org/api/position
+http://www.ptcny.com/clients/ABRET/index.html
+http://www.publichealth.va.gov/exposures/agentorange/conditions/chloracne.asp
+http://www.publish.csiro.au/paper/BT04101.htm
+http://www.pubquizhelp.com/animals/adject.html
+http://www.purificationtech.com/
+http://www.purplesage.org.uk/profiles/yarrow.htm
+http://www.puzzlers.org/pub/wordlists/allwords2.txt
+http://www.pyramidacceptors.com/
+http://www.qando.net/details.aspx?entry=8468
+http://www.qando.net/details.aspx?entry=8547
+http://www.qbn.com/topics/621697/
+http://www.questionsquestions.net/docs04/peakoil1.html
+http://www.quinapalus.com/UKMAC.txt
+http://www.quiplabs.com/products_lists/acid_detergents.htm
+http://www.r8ny.com/blog/barry_popik/kellner_64_camp_36.html
+http://www.rachelsvineyard.org/
+http://www.rain-tree.com/abuta.htm
+http://www.rain-tree.com/huacapu.htm
+http://www.rakuten.co.jp/accolle/
+http://www.rarediseases.org/search/rdbdetail_abstract.html?disname=Ablepharon%20Macrostomia%20Syndrome
+http://www.ratedproxy.com/
+http://www.rburton.com/
+http://www.rcathutch.com/
+http://www.rdchemicals.com/chemicals.php?mode=details&mol_id=7477
+http://www.readwriteweb.com/cloud/2010/09/a-cloud-computing-milestone-ya.php
+http://www.realself.com/ingredient/acetamide-mea
+http://www.refactory.com/miniploppapers/FT_Patts.pdf
+http://www.refindia.net/rlinks/rlinks/presult.phtml?category=Small_links.htm
+http://www.reftek.com/PDF/130-SMRecorders.pdf
+http://www.rejoiceministries.org/devotion.php
+http://www.renlearn.com/
+http://www.rentokil.com/blog/phobias-pest-fears-and-their-scientific-names/
+http://www.resonant.org/
+http://www.resultspundit.com/the-admission-committee-for-professional-courses-gujarat-acpc-cut-off-marks-2008/
+http://www.reubensaccomplice.com/
+http://www.rewindabiosis.net/
+http://www.rexresearch.com/crosse/crosse.htm
+http://www.reyessyndrome.org/pdfs/medicationscontainingaspirin.pdf
+http://www.reztone.com/
+http://www.rfc-editor.org/rfc/rfc1350.txt
+http://www.rhaa.com/
+http://www.rheuma-online.de/a-z/a/achillobursitis.html
+http://www.rhinebeckhealth.com/store/probiotics-and-acidophilous-c-192.html
+http://www.rightnation.us/forums/index.php?autocom=blog&blogid=47&showentry=2869
+http://www.rinkworks.com/words/oddities.shtml
+http://www.robertwalkerart.com/
+http://www.rockdiscography.com/death/absonant/
+http://www.rogers.com/web/Rogers.portal?_nfpb=true&_pageLabel=contactus_page
+http://www.roguetaxidermy.com/members_detail.php?id=118
+http://www.ronakchemicals.com/
+http://www.rootsweb.ancestry.com/~rigenweb/ocupaton.html
+http://www.rosacea-control.com/z.php
+http://www.roseindia.net/webservices/buildingsimplewebservice.shtml
+http://www.rotana.com/hotelaccom-5-4-2.htm
+http://www.roughtype.com/archives/2009/09/accidentally_on.php
+http://www.roxanegay.com/
+http://www.rpgfan.com/reviews/Star_Ocean_First_Departure/index.html
+http://www.rsc.org/publishing/journals/CP/article.asp?doi=b404889j
+http://www.rsf.ie/election.htm
+http://www.ruf.rice.edu/~bioslabs/studies/quant.html
+http://www.russianlessons.net/grammar/nouns_accusative.php
+http://www.rxn.com/~net282/MOOOCT93.LST.txt
+http://www.sacred-texts.com/alc/cc/cc05.htm
+http://www.safefetus.com/search.asp?SearchType=1&letter=a
+http://www.sage-femme.be/
+http://www.sahuc-hotels.com/
+http://www.sailormoonabridged.com/
+http://www.salagram.net/parishad100.htm
+http://www.salon.com/news/opinion/glenn_greenwald/2010/04/06/iraq
+http://www.samaritanspurse.org/index.php/OCC/Pack_A_Shoe_Box/
+http://www.samrabay.com/
+http://www.sanmartin.gov.ar/sitio/noticias/noticias.asp?id=2337
+http://www.santanarow.com/blog/tags/tag/Fashion/P10/
+http://www.santander.co.uk/
+http://www.satavto.by/soft/dreambox_800/TV_codes.pdf
+http://www.satramana.org/
+http://www.sba.gov/aboutsba/sbaprograms/8abd/index.html
+http://www.sbe.virginia.gov/cms/Voter_Information/Local_Voter_Registration_Offices/Index.asp
+http://www.sbtinc.com/
+http://www.scielo.br/scielo.php?pid=S0100-204X2009000800009&script=sci_arttext
+http://www.scielo.br/scielo.php?pid=S0100-879X2005000400008&script=sci_arttext
+http://www.scielo.br/scielo.php?pid=S0103-63512007000100004&script=sci_arttext
+http://www.scielo.cl/scielo.php?pid=S0717-97072005000400003&script=sci_arttext
+http://www.science-projects.com/Acetabularia.htm
+http://www.sciencedaily.com/releases/2007/11/071121144937.htm
+http://www.sciencemag.org/cgi/content/full/327/5968/1004
+http://www.sciencemag.org/cgi/content/short/267/5196/362
+http://www.sciencemag.org/cgi/content/short/312/5777/1183
+http://www.sciencemag.org/cgi/content/short/328/5979/753
+http://www.scientificamerican.com/article.cfm?id=ancient-ocean-acidification-intimates-long-recovery-from-climate-change
+http://www.score.org/pdf/OPEN%20Govt%20Accomplished%20Govt%20Contractor%206-1.pdf
+http://www.scotcourts.gov.uk/sheriff/small_claims/SmallClaimsChapters/Appendix%202.pdf
+http://www.scotcourts.gov.uk/sheriff/small_claims/forms/going_to_court.pdf
+http://www.scrabble-assoc.com/boards/dictionary/10-15-20030401.txt
+http://www.scribd.com/doc/10269033/-Kristeva-Abjection-Short-Version
+http://www.scribd.com/doc/240281/MerriamWebsters-a-Dictionary-of-Prefixes-Suffixes-And-Combining-Forms
+http://www.scribd.com/doc/28150322/Spanmed-Spanish-English-Medical-Glossary-a-C
+http://www.scribd.com/doc/3478360/Thorpes-Dictionary-of-Applied-Chemistry-Vol1
+http://www.seabbatical.com/
+http://www.searchenginejournal.com/askcom-google-sign-35-billion-search-advertising-deal/5951/
+http://www.seaslugforum.net/find/cresacic
+http://www.seborabsinth.com/
+http://www.seedandfeed.org/
+http://www.sekj.org/PDF/anbf35/anbf35-119p.pdf
+http://www.sekj.org/PDF/anbf35/anbf35-175p.pdf
+http://www.sel.barc.usda.gov/acari/content/trachealmites.html
+http://www.senocular.com/flash/tutorials/listenersasbroadcaster/
+http://www.sensum.be/en/resto/show/l-achepot
+http://www.sequoiarecords.com/x118cd/The+Nine+Worlds.html
+http://www.seriouseats.com/2009/11/folklore-argentine-grill-offal-parrillada-chicago-il.html
+http://www.seychelles.net/acajou/
+http://www.sfedit.net/abstract.pdf
+http://www.sfflavour.com/pr-en-14.htm
+http://www.sfu.ca/biology/faculty/hart/publications/Zootaxa.pdf
+http://www.shadymeadowsgundogs.com/
+http://www.shaneacker.com/
+http://www.shaunabram.com/
+http://www.shaw.ca/en-ca/AboutShaw/TermsofUse/AcceptableUsePolicyInternet.htm
+http://www.shawnachor.com/
+http://www.shipmodul.com/en/connections.html
+http://www.shmula.com/
+http://www.shmula.com/about-peter-abilla
+http://www.sigma-aldrich.com/saws.nsf/Home?OpenFrameset
+http://www.sing365.com/music/lyric.nsf/Butterfly-lyrics-Mariah-Carey/F8A74EDAF07A6CD248256862001363CB
+http://www.sisterzeus.com/Abortif.htm
+http://www.skincancer.org/actinic-keratosis-and-other-precancers.html
+http://www.skylighter.com/mall/chemicals.asp
+http://www.skylighter.com/skylighter_info_pages/article.asp?Item=12
+http://www.slate.com/id/2166941/
+http://www.slate.com/id/2243218/
+http://www.slendertoneusa.com/
+http://www.slideshare.net/VaniaCaldeira/plexo-lombar
+http://www.slideshare.net/cloudera/20100806-cloudera-10-hadoopable-problems-webinar-4931616
+http://www.slipstream.com/our_solutions/faqproduct.html
+http://www.slsa.com.au/default.aspx?s=beachmgmtandsafetyprog
+http://www.slu.edu/colleges/AS/languages/classical/latin/tchmat/readers/jacobs/aes-h.html
+http://www.smallaxe.net/
+http://www.smartfees.com.au/
+http://www.smarthome.com/5081/Plug-In-Extend-A-Chime/p.aspx
+http://www.smashboards.com/showthread.php?t=85449
+http://www.smnnews.com/board/showthread.php?t=240601
+http://www.smokefarm.org/abactors.html
+http://www.snapnetwork.org/
+http://www.snooth.com/wine/valle-dellacate-il-frappato-2007/
+http://www.socialpulse.com/Albinism_Achromia_Albino
+http://www.softpedia.com/get/Multimedia/Graphic/Graphic-Others/Aberrater.shtml
+http://www.solarmirror.com/fom/fom-serve/cache/43.html
+http://www.solstation.com/x-objects/achernar.htm
+http://www.sonoworld.com/fetus/page.aspx?id=308
+http://www.sonycreativesoftware.com/products/acidfamily.asp
+http://www.sootoday.com/content/directory/search.asp?NAICS=620000-624410
+http://www.soros.org/
+http://www.soundclick.com/abalienation
+http://www.soundfighter.com/
+http://www.sourcewatch.org/index.php?title=Acetoin
+http://www.sourjazz.com/
+http://www.sparknotes.com/nofear/lit/the-canterbury-tales/pardoners-tale/
+http://www.spartacus.schoolnet.co.uk/Lslavery33.htm
+http://www.spatial.com/
+http://www.speedingupwebsite.com/2010/02/21/html-sprites-new-weapon-against-http-requests/
+http://www.sperinos.com/
+http://www.spiked-online.com/index.php/site/article/8783/
+http://www.spillking.com/
+http://www.spiraldynamics.org/resources_assessments.htm
+http://www.spiritabreast.com/
+http://www.spittlevixens.com/reen/linsky.html
+http://www.sport-fitness-advisor.com/acclimatization-to-altitude.html
+http://www.sportsci.org/encyc/heataccl/heataccl.html
+http://www.spring.org.uk/2010/06/gain-self-insight-through-abstract-thinking.php
+http://www.springerlink.com/index/X207718300683578.pdf
+http://www.springerlink.com/link.asp?id=100158
+http://www.squash.ca/e/story_detail.cfm?id=1094
+http://www.squidoo.com/abbavideos
+http://www.sriconsulting.com/CEH/Public/Reports/605.5000/
+http://www.sroking.com/ipb/index.php?showtopic=464
+http://www.sssbjt.hr/acphee/25106.pdf
+http://www.staahl.se/
+http://www.staff.uni-marburg.de/~b_morpho/imhtopic.html
+http://www.stageaccompany.com/
+http://www.standardabrasives.com/
+http://www.starprovisions.com/
+http://www.starwars.com/databank/starship/republicassaultship/index.html
+http://www.state.gov/t/pm/wra/
+http://www.stereophile.com/floorloudspeakers/293acarian/
+http://www.steveclayton.com/acetal.php
+http://www.stevieawards.com/aba/
+http://www.strabismus.org/esotropia_eye_turns_in.html
+http://www.straightdope.com/columns/read/753/what-are-the-three-english-words-ending-in-gry
+http://www.strecorsoc.org/docs/on_coppe.html
+http://www.studentsguide.in/microbiology/drinking-water-sewage-microbiology/coliforms-and-their-differentiation.html
+http://www.studytoanswer.net/origins/abiogenesis.html
+http://www.style-productions.net/?page=media_info&id=52
+http://www.stylecaster.com/news/5177/street-style-fashion-week-09-gossip-girls-taylor-momsen
+http://www.submission.org/ablution.html
+http://www.substanceabusepolicy.com/content/1/1/14
+http://www.sunbrella.com/na/above_deck.php
+http://www.sundown.pair.com/SundownShores/HillsofDream/heart2.htm
+http://www.suntimes.com/news/politics/obama/familytree/545461,BSX-News-wotreex09.stng
+http://www.supercw.com/blog/?p=371
+http://www.supershipbottom.com/
+http://www.sustainablelifemedia.com/content/column/brands/the_shifting_psychology_of_sustainability
+http://www.sutrobaths.com/
+http://www.suuntosports.com/discussions/forum_posts.asp?TID=157
+http://www.swpc.noaa.gov/dregion/index.html
+http://www.sykes.net.au/sykes/acetol.htm
+http://www.sylvansoftware.com/instanttext.htm
+http://www.synerondental.com/
+http://www.synonyms.net/srandom.aspx
+http://www.synonyms.net/synonym/light
+http://www.tac.mta.ca/tac/reprints/articles/3/tr3abs.html
+http://www.tahoeaccommodator.com/
+http://www.tailwags.com/
+http://www.takingliberty.us/TLHome.html
+http://www.talesofpirates.tk/
+http://www.talkgraphics.com/showthread.php?19545-Car-Tutorials
+http://www.talkorigins.org/faqs/abioprob/
+http://www.tamingthebeast.net/articles4/cart-abandonment.htm
+http://www.tara.tcd.ie/handle/2262/40176
+http://www.taylorgibbs.co.uk/
+http://www.teamfourstar.com/
+http://www.techdirt.com/articles/20100514/1410159429.shtml
+http://www.techdis.ac.uk/resources/sites/accessibilityessentials3/index.html
+http://www.technion.ac.il/~keinanj/pub/53.pdf
+http://www.telegraph.co.uk/culture/film/7165045/Quentin-Tarantino-interview-All-my-movies-are-achingly-personal.html
+http://www.telegraph.co.uk/culture/theatre/theatre-reviews/8013927/Accomplice-various-locations-London-Wanderlust-Royal-Court-review.html
+http://www.telegraph.co.uk/news/uknews/crime/6637812/Murderer-Jane-Andrews-absconds-from-prison.html
+http://www.telegraph.co.uk/news/worldnews/europe/sweden/7978318/Wikileaks-founder-admits-sexual-relations-with-accuser.html
+http://www.telegraph.co.uk/news/worldnews/europe/turkey/7933144/Groom-accidentally-kills-three-relatives-at-wedding.html
+http://www.tellusconsultants.com/Thread/ACANTH.HTM
+http://www.temptalia.com/nars-exhibit-a-blush-review-photos-swatches
+http://www.terrypratchettbooks.com/
+http://www.testden.com/
+http://www.testmybrain.org/
+http://www.textlog.de/10879.html
+http://www.textlog.de/9516.html
+http://www.the-night.net/absinthe/wormwood.htm
+http://www.theabreact.com/
+http://www.theaccidentalnegotiator.com/
+http://www.theatlantic.com/food/archive/2010/05/scenes-from-a-boil-order/39790/
+http://www.thebigm.com/
+http://www.thecaribbeanamphibian.com/
+http://www.thedoctorsdoctor.com/diseases/aciniccell_ca.htm
+http://www.thefire.org/contest.essay.php
+http://www.thefreedictionary.com/Abatable
+http://www.thefreedictionary.com/color
+http://www.thefreedictionary.com/law-abiding
+http://www.thegoodscentscompany.com/data/rw1007331.html
+http://www.thegoodscentscompany.com/data/rw1020611.html
+http://www.thehackerslibrary.com/?p=419
+http://www.theheart.org/documents/sitestructure/en/content/programs/995291/PDF/THO_Trans_Montalescot_DAPT_In_Brief_SF66117%203-4.pdf
+http://www.thehindu.com/news/national/article580788.ece
+http://www.theinquirer.net/inquirer/news/1000724/microsoft-told-abandon-vista
+http://www.thejamushop.com/demodex_faq.htm
+http://www.thelatinlibrary.com/plautus/menaechmi.shtml
+http://www.thelatinlibrary.com/plautus/pseudolus.shtml
+http://www.thelocalking.com/kuala-lumpur/eat--drink-makan-makan/ipoh-old-town-kopitiam.html
+http://www.thenatsblog.com/2009-articles/june/nats-10th-pick-preview-chad-jenkins.html
+http://www.thenazareneway.com/Institutes%20of%20John%20Cassian/book_10_the%20_spirit_of_accidie.htm
+http://www.theobjectivestandard.com/index.asp
+http://www.theoi.com/Text/StatiusAchilleid1A.html
+http://www.theonion.com/articles/virgin-mary-nightlight-stares-accusingly-as-christ,10235/
+http://www.theonion.com/articles/webbrowser-history-a-chronicle-of-couples-unspoken,1432/
+http://www.thepaleodiet.com/nutritional_tools/acid.shtml
+http://www.thepilot.com/news/2010/jun/18/former-resident-recalls-run-in-with-etheridge/
+http://www.thepoultrysite.com/FeaturedArticle/FATopic.asp?Display=246
+http://www.theregister.co.uk/2010/03/05/binge_drinking_ads/
+http://www.thereligionofpeace.com/Quran/015-slavery.htm
+http://www.thieme-connect.com/ejournals/abstract/synlett/doi/10.1055/s-2002-19774
+http://www.thoughtsfromthejockstrap.com/articles-2009/february/nba-players-and-infomercials-theyre-fantastic.html
+http://www.thrivent.com/
+http://www.thujone.info/Thujone-Cause.pdf
+http://www.time.com/time/health/article/0,8599,2014332,00.html
+http://www.timesonline.co.uk/tol/news/science/biology_evolution/article7101533.ece
+http://www.tinmantech.com/html/oxy-acetylene_torch.php
+http://www.tjhsst.edu/~dtran/words.list
+http://www.tm.mahidol.ac.th/seameo/2006_37_spp3/37sup3_184.pdf
+http://www.tmbl.gu.se/staff/FredrikPleijelP.html
+http://www.tmz.com/2010/09/13/vince-neil-jessica-radovicz-assault-battery-elevator-las-vegas-hilton-police/
+http://www.tnr.com/blog/jonathan-chait/75346/helen-handbasket
+http://www.tobacco.org/History/Tobacco_History.html
+http://www.tobul.com/
+http://www.toledoblade.com/article/20100313/SPORTS11/3130418/0/rss06
+http://www.tollundman.dk/bevaring-i-mosen.asp
+http://www.tomisimo.org/?p=519
+http://www.topendsports.com/testing/tests/DEXA.htm
+http://www.traceytechnologies.com/
+http://www.tradewindsfruit.com/achira.htm
+http://www.tradimed.com/
+http://www.trafficticketdefensewa.com/
+http://www.transformationsjournal.org/journal/issue_14/editorial.shtml
+http://www.transitionsabroad.com/
+http://www.translatorscafe.com/cafe/tools.asp?pn=unitcnv
+http://www.trauma.org/index.php/main/images/C13/
+http://www.travelodge.co.uk/search_and_book/hotel_overview.php?hotel_id=1
+http://www.trilogyonline.com/
+http://www.tritonwaterjet.com/
+http://www.triviacountry.com/44_Language.htm
+http://www.trueknowledge.com/q/what_does_http_stand_for
+http://www.truthaboutabs.com/abdominal-fat-loss-program-questions.html
+http://www.tucsonastronomy.org/
+http://www.tvquran.com/en/abkar.htm
+http://www.typoscriptics.de/soroban/links.html
+http://www.ub.uit.no/munin/handle/10037/2291
+http://www.ucc.ie/celt/online/T103006.html
+http://www.uexpress.com/dearabby/
+http://www.ufocasebook.com/Manhattan.html
+http://www.ugandasafarisafrica.com/
+http://www.uic.edu/depts/accc/software/regina/rexxrule.html
+http://www.umass.edu/microbio/chime/ir-spect/
+http://www.umm.edu/surgery-info/glossary.htm
+http://www.unc.edu/depts/wcweb/handouts/abstracts.html
+http://www.unc.edu/~rowlett/units/dictA.html
+http://www.uni-graz.at/~katzer/engl/Arte_abr.html
+http://www.unidep.edu.mx/(S(r4toav554zdpelaik30npy45))/Noticia.aspx?Plantel_Id=2&parm=6&Id_Noticia=1091
+http://www.unidep.edu.mx/Noticia.aspx?Plantel_Id=22&parm=6&Id_Noticia=1142
+http://www.unidep.edu.mx/Noticia.aspx?Plantel_Id=22&parm=6&Id_Noticia=813&keppra
+http://www.unionpacific.jobs/careers/explore/prof/finance.shtml
+http://www.unisci.com/stories/20014/1214011.htm
+http://www.unitconversion.org/
+http://www.unitconverter.org/
+http://www.universalis.fr/encyclopedie/accrescent/
+http://www.unl.edu/agnicpls/gpcn/gpcna.html
+http://www.unrv.com/economy/wine-chart.php
+http://www.upbeatrecords.net/
+http://www.uploadcity.com/?q=2+salopes+poilues+a+baiser
+http://www.urbandictionary.com/define.php?term=aberdonian
+http://www.urbandictionary.com/define.php?term=hentai
+http://www.usafa.af.mil/
+http://www.usc.es/congresos/ecsoc/10/GOS/a012/a012.pdf
+http://www.users.globalnet.co.uk/~loxias/medea/medeaintro.htm
+http://www.uspto.gov/web/patents/classification/uspcindex/indexa.htm
+http://www.usshunley.starfleetuk.org/
+http://www.ustream.tv/recorded/6328178
+http://www.uwo.ca/cns/resident/pocketbook/approach/akineticmutism.htm
+http://www.uzmantv.com/gusul-abdesti-nasil-alinir
+http://www.v-zool.kiev.ua/pdfs/2004/1/02.pdf
+http://www.v8central.com/snitz3403/topic.asp?TOPIC_ID=21468
+http://www.v8central.com/snitz3403/topic.asp?TOPIC_ID=29102
+http://www.vaccountancy.com/
+http://www.vanbruntgallery.com/
+http://www.vandyke.com/
+http://www.vaporrecords.com/
+http://www.vark.com/
+http://www.vaticanassassin.com/
+http://www.vclcomponents.com/ASP/Networking_Tools/HTTP/AbsoluteHTTP-info.html
+http://www.vdh.state.va.us/PandemicFlu/powerpoint/2008/Culture%20Preparedness%20CBERS.ppt
+http://www.vegsource.com/talk/eat2live/messages/72197.html
+http://www.vegsource.com/talk/eat2live/messages/80449.html
+http://www.verisign.com/support/contact/seal-abuse/index.html
+http://www.versatilevinegar.org/todaysvinegar.html
+http://www.vetmu.com/index.php?option=com_content&view=article&id=157:2009-08-02-13-55-21&catid=39:winbookclubcom&Itemid=84
+http://www.vetriscience.com/acetylator.php
+http://www.vgl.ucdavis.edu/genomic/cerebellar/
+http://www.virginia.edu/academicalvillage/
+http://www.virtualcities.com/ons/al/n/alnc601.htm
+http://www.visitachill.com/
+http://www.vitaminstohealth.com/probiotic-acidophilus-supplement.html
+http://www.vivaolinux.com.br/dica/Procurando-e-achando-pacotes-para-Linux
+http://www.vivisection-absurd.org.uk/
+http://www.vivo.colostate.edu/hbooks/pathphys/digestion/smallgut/absorb_sugars.html
+http://www.vmac.ca/index.php?predatair
+http://www.vulnerabilityassessment.co.uk/passwords.txt
+http://www.w3.org/TR/XMLHttpRequest/
+http://www.wabash.edu/
+http://www.wailanasands.com/
+http://www.walkingonacloud.com/
+http://www.washingtoncitypaper.com/blogs/sexist/2010/05/10/lionel-tiger-you-had-me-at-acidulous-hostility/
+http://www.washingtonpost.com/wp-dyn/content/article/2010/02/01/AR2010020102628.html
+http://www.washingtonpost.com/wp-dyn/content/article/2010/05/04/AR2010050404118.html
+http://www.washingtontimes.com/news/2010/sep/20/embezzlement-accusation-frivolous-odonnell-says/
+http://www.washingtontimes.com/weblogs/watercooler/2010/jan/14/martha-coakley-devout-catholics-probably-shouldnt-/
+http://www.wavetecvision.com/
+http://www.wcaty.org/
+http://www.web-books.com/MoBio/Free/Ch4G.htm
+http://www.web-radio.fm/st_me.cfm
+http://www.webdesignbooth.com/35-absolutely-useful-firefox-plugins-for-web-designers-and-developers/
+http://www.webexhibits.org/causesofcolor/2B.html
+http://www.webmasterworld.com/forum9/9913.htm
+http://www.webmd.com/a-to-z-guides/anemia-hereditary-spherocytic-hemolytic
+http://www.webmd.com/migraines-headaches/guide/migraine-treatments
+http://www.webmd.com/oral-health/guide/abscessed-tooth
+http://www.weichtiere.at/english/gastropoda/terrestrial/achatinidae.html
+http://www.wetwebmedia.com/acanthurtngs.htm
+http://www.wetwebmedia.com/besttgsreefs.htm
+http://www.wgu.edu/
+http://www.wharfedale.co.uk/Products/ProductSeries/tabid/77/PID/20/language/en-GB/Default.aspx
+http://www.whoi.edu/page.do?cid=9986&pid=12455&tid=282
+http://www.whoi.edu/page.do?pid=12455
+http://www.wholeworldbotanicals.com/herbal_abuta
+http://www.wikihow.com/Make-a-Chinese-Sliding-Knot
+http://www.wildwnc.org/education/trees/silver-maple-acer-saccharinum-aceraceae-maple-family
+http://www.wildwnc.org/education/trees/sugar-maple-acer-saccharum-aceraceae-maple-family
+http://www.windowsitpro.com/article/windows-7/finally-microsoft-admits-to-2009-delivery-for-windows-7.aspx
+http://www.wired.com/epicenter/2010/03/microsoft-google-congress-china/
+http://www.wired.com/science/discoveries/magazine/17-10/st_coffee
+http://www.wired.com/threatlevel/2010/03/jethro-sentencing/
+http://www.wisdomworld.org/additional/christianity/ChristosSophiaAchamoth.html
+http://www.withoutabox.com/
+http://www.wjgnet.com/1007-9327/14/3579.asp
+http://www.wjgnet.com/1007-9327/9/874.asp
+http://www.wkabsystem.com/
+http://www.wktv.com/news/local/24th-Congressional-Commercials-go-from-introductory-to-accusatory-103548204.html
+http://www.wliw.org/blog/exclusives/david-garrett/326/
+http://www.wobblyscotties.com/
+http://www.wordnik.com/words/abstemious
+http://www.wordreference.com/definition/abstemiously
+http://www.wordreference.com/definition/accusation
+http://www.wordreference.com/fren/acidifiant
+http://www.wordwebonline.com/en/ABSENT
+http://www.wordwebonline.com/en/ACCOUCHEUSE
+http://www.workinsports.com/makeawish/
+http://www.worldthroughthelens.com/family-history/old-occupations.php
+http://www.worldwidewords.org/backissues/wbi091003.txt
+http://www.wortig.com/
+http://www.wowhead.com/item=33585/achromic-trousers-of-the-naaru
+http://www.wowhead.com/item=39759/ablative-chitin-girdle
+http://www.wowhead.com/item=40332/abetment-bracers
+http://www.wowhead.com/npc=15928/thaddius
+http://www.wowjobs.ca/jobs-acclaim+ability+management-jobs
+http://www.wrongdiagnosis.com/a/achlorhydria/symptoms.htm
+http://www.wsacs.org/
+http://www.wsu.edu/~campbelld/amlit/poenotes.html
+http://www.wunderland.com/WTS/Andy/Nanofiction.html
+http://www.wwnorton.com/college/english/nael/NOA/pdf/27636_17th_U12_Coppe-1-4.pdf
+http://www.www.grownative.org/plants/details.asp?id=741205725
+http://www.xeem.info/proxy/top25.php
+http://www.xexoxial.org/is/abecedarium/by/peter_lamborn_wilson
+http://www.xhamster.com/movies/214569/2_salopes_poilues_a_baiser.html
+http://www.yeap.de/blog2.0/archives/111-Mission-Kubuntu-Migration-Accomplished.html
+http://www.yellodyno.com/
+http://www.yellowstonemotel.com/
+http://www.youngwomenshealth.org/abstinence.html
+http://www.youraccompanist.com/
+http://www.yourdictionary.com/absolvent
+http://www.youtube.com/user/Abnormalized
+http://www.youtube.com/user/TutuOnAbridger
+http://www.youtube.com/user/digchicksvids
+http://www.youtube.com/watch?v=-tM6ReoAL2I
+http://www.yugiohabridged.com/
+http://www.zefrank.com/xmas/
+http://www.zei.de/download/zei_wp/B02-28.pdf
+http://www.zeiss.com/C12575690045D103/EmbedTitelIntern/MasterDiopters/$File/MasterDiopters.pdf
+http://www.zen6741.zen.co.uk/quinapalus/misps/_a.txt
+http://www.zhumoji.cn/en/jianjie.htm
+http://www.zildjian.com/en-us/artists/artistDetail.ad2?artistID=2885
+http://www.zmuc.dk/inverweb/staff/PDF/Rogers%20et%20al.%202006.pdf
+http://www.zoologie.umh.ac.be/asef/pdf/2006_42_01/compact/Sueyoshi_ASEF_2006_42_1_1_26_compact.pdf
+http://www.zoology.ubc.ca/courses/bio332/labs/apiproject/greg/index.htm
+http://www.zsf.jcu.cz/jab/1_4/patockabs.pdf
+http://www02.abb.com/global/inabb/inabb506.nsf/0/3aa188b1e072466a652574e300418e11/$file/Cafe+HR+On+Internet.pdf
+http://www1.astrazeneca-us.com/pi/accolate.pdf
+http://www2.chemistry.msu.edu/courses/cem852/classics/Chapter2.pdf
+http://www2.dupont.com/Plastics/en_US/Products/Delrin/Delrin.html
+http://www2.potsdam.edu/hansondj/Controversies/1110387548.html
+http://www2.warwick.ac.uk/fac/arts/english/people/parttimetutors/dramandahopkins/downloads/aref_metrics_web_version.pdf
+http://www273.pair.com/med/words/animal_adjectives.htm
+http://www3.interscience.wiley.com/journal/104025982/abstract
+http://www3.interscience.wiley.com/journal/104545937/abstract
+http://www3.ntu.edu.sg/home/ecmli/
+http://www4.fao.org/asfa/asfa.htm
+http://wwwbio200.nsm.buffalo.edu/labs/tutor/earthworm/
+http://wwwling.arts.kuleuven.be/genling/abundant/
+http://ypdcrime.com/penal.law/article125.htm
+http://yupa.yonsei.ac.kr/bview.asp?bt=arim02&idx=164&lasix
+http://zhenxi-korea.com/index_en_adult.htm
+
diff --git a/lib/libUPnP/Neptune/Extras/Tools/Testing/https-urls.txt b/lib/libUPnP/Neptune/Extras/Tools/Testing/https-urls.txt
new file mode 100644
index 0000000..068bcea
--- /dev/null
+++ b/lib/libUPnP/Neptune/Extras/Tools/Testing/https-urls.txt
@@ -0,0 +1,5974 @@
+https://015d8fb.netsolstores.com/index.asp?PageAction=VIEWPROD&amp;ProdID=639
+https://1000607.secureresellerservices.com/reseller/terms-merchant.aspx
+https://1083.extraawards.com/cwa/login.do
+https://163.150.129.123
+https://192.168.2.1/
+https://1stmariner.mybankhq.com/scraped_user/login
+https://1stmarinercommunity.mybankhq.com/answers
+https://2028.globalsign.com/
+https://209.195.146.79/mb.asp
+https://247livesupport.biz
+https://247livesupport.biz/ticket/index.php?_m=news&amp;_a=view
+https://2unblocksites.com/
+https://365.rsaconference.com/blogs/rsa-conference-blog/2010/02/28/keynotes-tracking-the-industry
+https://3enabled.portallogin.net/portalWeb/partner/common/login/begin.do
+https://4846938711.secure-loancenter.com/WebApp/FullAppLogin.aspx
+https://4myact.mobi/60401/mlogin.xhtml
+https://65.55.12.249/about/corporatecitizenship/us/default.mspx
+https://65.55.21.250/mspress/books/5339.aspx
+https://69.151.40.114/moodle
+https://8564700917349138647-a-pressatgoogle-com-s-sites.googlegroups.com/a/pressatgoogle.com/googlebookssettlement/revised-settlement-faq/RevisedSettlementFAQ.pdf?attachauth=ANoY7cppMgVs3RJ4qjfhb4aQsnhDsElYwZiDO_BVrAW_vp7Gmg5CsYlDTkMbArA_qz3Z6wXMX9vqBUUX6JyYMQX2BYanxCPvrX1Gt54U9fvQpHJFya1CA-aDweVlsduC1LJcMbvVJBwUA6Km7g_iT0D6fkuGvEP9qc9c6dUg3da0_JFSYjJmpi4ATyq2mI-FkkiW72WkjUpHfjwCCDdHc1iFpfg3SQiZZH5L-66AIjlMDYn5FO0REDZn6S6dpT_IjHhTWHUvYD48&amp;attredirects=0
+https://85broads.webex.com/85broads/lsr.php?AT=pb&amp;SP=EC&amp;rID=14445802&amp;rKey=06b478e6b294772c
+https://C2WSBLI.secure.fundsxpress.com/start/C2WSBLI
+https://GTC.dor.ga.gov
+https://Howdy.tamu.edu/
+https://MilitaryCAC.com
+https://Securecitizens1st.onlineaccess1.com/CitizensFNBOnline/Authentication/Login.aspx
+https://TSSOMoodle.norc.org
+https://a069-webapps7.nyc.gov/healthinslink/home.aspx
+https://a248.e.akamai.net/f/248/47562/14d/ig.rsys4.net/responsysimages/sears/__RS_CP__/20100913_SRS_BAU_fashion%20insider%20pass.pdf?lid=download_savings_pass_cta&amp;rioptype=SC&amp;sid=IOx20100914SRSBAUTRACTORSG3T4MTNH&amp;eml=105581023&amp;ruid=1001674
+https://a5w.insurance.arkansas.gov/Online_Email_Registration/welcome_page.a5w
+https://aacoprod.aacounty.org/PACInternetMenu/servlet/PACInternetMenuServlet?EVENT=PACMenu_OnLoad&amp;PAGENAME=Robin
+https://aacounty.munisselfservice.com/citizens/default.aspx
+https://aalf.fldfs.com/
+https://aarphealthcare.com/products/discounts/health-essentials
+https://aarpmedicareplans.healthline.com/
+https://abdracingwerks.com/Merchant2/merchant.mv
+https://abmanage.com/webaccess/cgi-bin/welcome.cgi
+https://abmwi.secure.fundsxpress.com/start/resetpass.pile/identify?iid=ABMWI
+https://academicjobs.columbia.edu/applicants/Central?quickFind=52306
+https://academy.mises.org/
+https://academy.oracle.com/
+https://acaweb.brevardcounty.us/CitizenAccess/
+https://acc.dau.mil/
+https://acc.pair.com/
+https://access.brotherhoodmutual.com
+https://access.brotherhoodmutual.com/
+https://access.hoovers.com/hvweb/login.html?url=http://premium.hoovers.com/subscribe/
+https://access.ocwen.com
+https://access.redhat.com
+https://access.redhat.com/downloads/
+https://access.usbank.com/
+https://access.wisconsin.gov
+https://access.wisconsin.gov/access/
+https://accessUT.utexas.edu/
+https://account.activestate.com/signin/?next=http%3A//community.activestate.com/main
+https://account.authorize.net/
+https://account.healthvault.com/default.aspx
+https://account.healthvault.com:443/auth.aspx?actionqs=https%3a%2f%2faccount.healthvault.com%3a443%2fstatus.aspx%3fcode%3dCookiesDisabled
+https://account.lego.com/en-US/Signup.aspx?ReturnUrl=http%3a%2f%2fwww.lego.com%2fen-US%2fdefault.aspx
+https://account.live.com/
+https://account.live.com/ResetPassword.aspx
+https://account.login.aol.com/opr/_cqr/opr/opr.psp?sitedomain=www.dailyfinance.com&amp;authLev=1&amp;siteState=OrigUrl%3Dhttp%253A%252F%252Fwww.dailyfinance.com%252Fportfolios%252Fmyportfolios&amp;lang=en&amp;locale=us
+https://account.prweb.com/prweb/login.php
+https://account.woot.com/signup?returnurl=http://deals.woot.com
+https://accountaccess.countryinvestment.com/weblink/Logon/frmLogon.aspx
+https://accounting.quickbooks.com/
+https://accountmanager.att.com/wps/myportal/mysbc/home?referralAppID=SBC
+https://accounts.comodo.com/cfp/management/signup?identifier=cis.pro_pc.r1.with_trial
+https://accounts.craigslist.org
+https://accounts.craigslist.org/login/signup
+https://accounts.key.com/
+https://accountview.lpl.com/Default.aspx?SiteID=5746
+https://ace.cbp.dhs.gov/
+https://aces2.lsac.org/YourStatus/membership/AppStatIdMe.aspx?guid=Zda5f%2BdwlU8%3D
+https://acis.as.cmu.edu/gale2/open/Schedule/SOCServlet
+https://acis.as.cmu.edu/sio/
+https://acme.com/
+https://acquia.com/category/tags/acquia-drupal-planet/feed
+https://acquiawebinars.webex.com/acquiawebinars/onstage/g.php?t=a&amp;d=663242719
+https://acquisition.army.mil/
+https://acs.silkroad.com/
+https://act.alz.org/site/Donation2?idb=177812810&df_id=1740&1740.donation=form1
+https://action.aarp.org/site/SPageNavigator/AdvocacyCenterDonation
+https://ad.doubleclick.net/clk;224419492;48171779;u?http://hello.zecco.com/landing/stocktwits01/
+https://adcenter.looksmart.com/help
+https://addisonavenue.com
+https://addisonavenue.com/securitykey/
+https://addons.mozilla.org
+https://addons.mozilla.org/en-US/firefox/addon/3408/
+https://addons.mozilla.org/en-US/firefox/addon/3481/
+https://addons.mozilla.org/en-US/firefox/addon/5809/
+https://addons.mozilla.org/en-US/firefox/addon/8023/
+https://addons.mozilla.org/firefox/addon/525
+https://addthis.com/bookmark.php?v=250&amp;amp;username=xa-4b4b7ba36c9933e9
+https://adfarm.mediaplex.com/ad/ck/6878-38920-3408-45
+https://admin.1and1.com/
+https://admin.adobe.acrobat.com/_a227210/p47731487/
+https://admin.connectpro.acrobat.com/_a791863308/p40652716/
+https://admin.hrw.org/zh-hans/news/2010/08/19
+https://admin.na4.acrobat.com/_a833642795/devoutreachlaunch/
+https://admin.paybox.com
+https://admin.qsl.net/index.php
+https://admin.register365.com
+https://admin.register365.com/login.php
+https://admin.simplyhosting.com/login.php
+https://admin.webadvantage.com.au/login/index.jsp
+https://admin.wosbee.com/cas/
+https://admin1.paybox.com/
+https://adminfo.ucsadm.oregonstate.edu/prod/OSU_ADMTAM.P_tcs_splash_page
+https://administration.corp.westpac.com.au/coe/pub/signin.htm
+https://admission.uoguelph.ca/Template.aspx?SiteID=c2a9b7c3-1df5-495e-8b43-83245c48b4a2
+https://admissions.arizona.edu/contacts/default.aspx
+https://admissions.columbia.edu/
+https://adpaas.army.mil/
+https://ads.bicsi.org/abmc.aspx?b=44&amp;z=12
+https://ads.youtube.com/
+https://adserve.bizrate.com/pp/content/tal/publisherID-32386/assetID-349/assetTypeID-9/placementID-1/showProducts-4/showRandom-0/start-1/sort-default/cache-1/noLog-1/standAlone-1/onlyOffers-1/categoryID-/tokenID-7X/keyword-anti-aging/style-
+https://advertise.latimes.com/portal/page/portal/LA%2520Times
+https://advertiser.simply.com/en/insys/simply.php?insysname=REG365-B2_NLB&amp;PR=DRIE00
+https://advertisers.federatedmedia.net/explore/view/boingboing
+https://advertising.bostonglobemedia.com/classified
+https://advertising.microsoft.com/bing-shopping-merchant
+https://adviseronline.amp.com.au
+https://advisor.scottrade.com/
+https://advocate.patientcompass.com/portal/
+https://adwords.google.co.uk/select/Login?sourceid=awo&amp;subid=ww-en_uk-et-about&amp;hl=en_GB&amp;medium=link
+https://adwords.google.com/select/main?cmd=Login
+https://aetc.tomoye.com/CommunityBrowser.aspx?id=51&view=a&lang=en-US
+https://aetna.providerpreference.com/
+https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html
+https://affiliate.insureme.com/HomePage.aspx
+https://affiliate.mercola.com/
+https://affiliates.nexcess.net/idevaffiliate.php?id=926
+https://affiliates.playspan.com/
+https://affiliateservices.gecompany.com/
+https://afgnic.coccaregistry.net/
+https://afp.transamerica.com/myta/
+https://agency.columbuslife.com/Security/
+https://agent.insureme.com
+https://agent.insureme.com/
+https://agent.mutualtrust.com/content/FinancialAchievements.aspx
+https://agentapps.americanrepublic.com/ss_coverageinfo.aspx
+https://agentinfo.unitedpaymentservices.com/default.aspx?tabid=528
+https://agents.acadiainsurance.com/portal/server.pt
+https://agree2.com/users/pelle
+https://agriculture.sc.gov/Content.aspx?MenuID=46
+https://agrilifebookstore.org/publications_details.cfm?whichpublication=2838&amp;orderby=pubnumber&amp;SIMPLESEARCH=redmon&amp;criteriastring=SIMPLESEARCH%3Dredmon
+https://aigtravel.co.il/Templates/Stage1/Stage1.aspx?campaign=5&amp;partner=5
+https://airheads.arubanetworks.com
+https://airheads.arubanetworks.com/vBulletin/forumdisplay.php?s=84a48c18a9e19b2c27952af905fefa5a&amp;f=115
+https://airport.unimelb.edu.au/commerce/
+https://ais2.tiaa-cref.org/cgi-bin/WebObjects/IOESEmplWeb
+https://ais4.tiaa-cref.org/jrs/Register.do?targetUrl=https://ais4.tiaa-cref.org/selfservices/secureresource/redirect.do?targetURL=https://ais2.tiaa-cref.org/cgi-bin/WebObjects.exe/ContactTIAA
+https://ajcdelivers.com
+https://akocomm.us.army.mil/scg/
+https://alchemy.saclay.inria.fr/site/
+https://aldoi.gov/specialtylicenserenewals/default.aspx
+https://alert.loudoun.gov/index.php?CCheck=1
+https://alert.montgomerycountymd.gov/
+https://alerts.vzw.com/guest/verizon/overview.do
+https://algoaccess.algorithmics.com/index.html
+https://alioth.debian.org/users/candrews-guest/
+https://allstatefinancialgroup.net/leasing/application.html
+https://ally.myvurv.com/MAIN/careerportal/default.cfm?szUniqueCareerPortalID=8e81adab-e094-453c-87d4-e4f6ff2f787a&amp;szIsJobBoard=0
+https://altfarm.mediaplex.com/ad/ck/4770-26990-1193-7?mpt=1&amp;co=1NONE&amp;lg=en&amp;us=0&amp;mpvc=
+https://alumni.thomsonreuters.com/
+https://alumni.wfu.edu
+https://alumni.wfu.edu/giving/
+https://alumnionline.stern.nyu.edu/default.aspx?Page=CCPGClubHome&amp;ClubID=46&amp;WebsiteID=45&amp;TemplateId=13&amp;PageDetailID=211
+https://amateamwork.ama-assn.org/publicpanelagenda/PanelAgenda.aspx
+https://american.redcross.org/site/Donation2?idb=227870958&amp;df_id=4437&amp;4437.donation=form1&amp;JServSessionIdr004=b7o3wn4pp1.app234a
+https://amnesia.boum.org/about/
+https://amp.ppservice.com.au/home.aspx
+https://ampfp.amp.com.au
+https://ampfp.amp.com.au/wps/portal?iid=HP0001:promolinks:01:plannerportal
+https://analysiscenter.veracode.com/
+https://analytics.postrank.com/2009/feed/44889f8fad9aa99500fc8116d0ae8933
+https://ancldap.state.ak.us/dsgw/bin/csearch?context=dsgw
+https://androscogginbank.mortgagewebcenter.com/
+https://andyswebtools.com/uploads/3026/Tax_evasion_cost.pdf
+https://animated.messaging.vzw.com/vge/index.html
+https://aniscartujo.com/ssltunnel/
+https://annualcreditreport.transunion.com/fa/securityFreeze/landing
+https://annuities.myaccount.pacificlife.com/public/myaccount/my_index.html
+https://answers.cpa.state.tx.us/
+https://answers.launchpad.net/bzr-svn/+question/11299
+https://anubis.iseclab.org/?action=result&amp;task_id=1afbf3e5ad9e0ae5411de570a52a82edf
+https://aoc.custhelp.com/cgi-bin/aoc.cfg/php/enduser/ask.php?
+https://apac.globalsign.com/contact/
+https://apcourseaudit.epiconline.org/ledger/
+https://api.addthis.com/oexchange/0.8/forward/twitter/offer?url=https://www.starbucks.com/card&amp;username=starbucks&amp;title=@Starbucks
+https://api.filesanywhere.com/fawapi.asmx
+https://api.jangomail.com
+https://api.jangomail.com/transactionalemailtest.aspx
+https://app.adify.com/SignIn.aspx?ReturnUrl=%2fMemberPages%2fReports%2fDefault.aspx
+https://app.applyyourself.com/?id=purduegrad
+https://app.e2ma.net/app/view:Join/signupId:59778/acctId:34812
+https://app.etapestry.com/hosted/IntelligenceSquared/OnlineRegistration.html
+https://app.expressemailmarketing.com/Survey.aspx?SFID=44796
+https://app.it.okstate.edu/directory/
+https://app.liquidplanner.com/signup_a/197/8b0f76e9013600f64f3ac66f188e99525b7945c6
+https://app.mitto.com/tools/safari/mitto-safari.safariextz
+https://app.mt.gov/cal/html/event?eventCollectionCode=DOA
+https://app.shelter-mortgage.com/app/index.asp
+https://app.shoeboxed.com/login.htm
+https://app.streamsend.com/public/EWg5/0st/subscribe/
+https://app1.hongkongpost.com/SSL/eform/e_redirect.htm?formid=POS800
+https://app2.outtask.com/?host=ctm
+https://app2.whitehouse.gov/ppo/
+https://applications.spectrum-health.org/ets/
+https://applications.usbank.com/oad/begin?locationCode=8069&amp;entryMode=return
+https://apply.auto-owners.com
+https://apply.auto-owners.com/
+https://apply.collier.k12.fl.us/appentry/AppEntry.exe?Action=Hint
+https://apply.virtualbank.com/depositapplications/ApplyECertificateofDeposit.aspx
+https://apply07.grants.gov/apply/logincontrol.jsp?goto=./secured/ApplicantLogin.jsp&amp;loginpage=/jsp/ApplicantLoginGetID.jsp
+https://appotential.collegeboard.com/loginGetAction.do
+https://appraisalfoundation.sharefile.com/d-sc509109e42d46b0b
+https://appro.myappro.com/APPROOnline/V43/ASB/
+https://apps.collegeboard.com/cbsearchmd/searchMDirectoryLogin.jsp
+https://apps.commerce.yale.edu/arts/music/showSelectTickets.do
+https://apps.dot.state.nc.us/dot/directory/
+https://apps.fldfs.com/eservice/Default.aspx
+https://apps.gov/cloud/advantage/main/start_page.do
+https://apps.grad.uci.edu/ogsa//index.cfm?action=log_in&amp;CFID=1178445&amp;CFTOKEN=88870584
+https://apps.iowacollegeaid.gov/common/default.aspx?cmd=wizInfoView
+https://apps.lakewoodcityschools.org/moodle
+https://apps.niehs.nih.gov/webteam/index.cfm
+https://apps.nyhealth.gov/statistics/prevention/quality_indicators/
+https://apps.opm.gov/deathinservice/index.cfm
+https://apps.peoplechart.com/hypertension/
+https://apps.phmic.com/jobapp/JobApp.aspx
+https://apps.sa.ucsb.edu//insurancewaiver/login.asp
+https://apps.sd.gov/applications/PH93Morbidity/secure/index.asp
+https://apps.sph.harvard.edu/apps/bph/
+https://apps.state.or.us/fsestimate/
+https://apps.tamu-commerce.edu/advancementGiving/giving100.asp
+https://apps.tdi.state.tx.us/pcci/pcci_search.jsp
+https://apps.tpwd.state.tx.us/bora/home.seam
+https://apps.travelers.com/selectservicectr/index.aspx
+https://apps.wfubmc.edu/emlook/webform1.aspx
+https://apps2.collegeboard.com/olrWebApp/find_meeting.jsp
+https://apps2.iuf.indiana.edu/og-prd/SelectAccounts.do?method=enter&amp;campus=IUPUI&amp;school=LIBR&amp;campaignCode=GNILIB3
+https://appsec.helpwithmybank.gov/olcc_form/
+https://appsec.occ.gov/publicaccesslink/palMain.aspx?
+https://appserv.northropgrumman.com/RFIFormsWeb/getForm.do?formId=2
+https://appsext7.dos.state.ny.us/nydos/selSearchType.do
+https://aptanastudio.tenderapp.com/discussions/problems/1306-aptana-pydev-refuses-to-stop-at-breakpoints?unresolve=true
+https://ara-1.c3pki.chamb.disa.mil/ara/Key
+https://arber.arb.ca.gov/Welcome.arb?prg=tru
+https://archives.iupui.edu
+https://aristotle.oneonta.edu/moodle
+https://arp.sos.ky.gov/business/arp/
+https://as00.estara.com/ep/?ulbid=706419
+https://asap.melloninvestor.com/asap/
+https://asc.llnl.gov/tsf/
+https://asd.fema.gov/inter/hportal/home.htm
+https://aseensfip.asee.org/
+https://asia.neco.navy.mil/
+https://ask.census.gov/cgi-bin/askcensus.cfg/php/enduser/std_alp.php
+https://ask.census2010.gov/cgi-bin/askcensus2010.cfg/php/enduser/std_alp.php
+https://askhrc.army.mil/
+https://askmass.securesites.net/credit.html
+https://asmoodle.asmadrid.org/moodle/login/index.php
+https://asp.orderfacilitator.com/of01/
+https://asp.scheduling.com/portals01/hfifl0279/provider.jsp
+https://asp3.humanic.com/pls/star/hapss_index.apss
+https://assets.americafirst.com/iframe/select-employee-group.html
+https://assignment.wou.edu.my
+https://assignment.wou.edu.my/onlineTutor.asp
+https://assist.dhss.delaware.gov/PGM/ASP/SC001.asp
+https://association.drupal.org/user/Laura_Scott
+https://assurelink.assurity.com
+https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase
+https://atc.analyzertech.org
+https://atvantage.lexisnexis.com/
+https://atyourservice.sentry.com
+https://atyourservice.sentry.com/
+https://atyourserviceonline.ucop.edu
+https://auctions.godaddy.com
+https://auctions.godaddy.com/
+https://auctionsignon.fcc.gov/
+https://austin-utexas.custhelp.com/
+https://auth.apps.state.nd.us/dot/cnst/cars/login.do
+https://auth.beliefnet.com/Users/LogOff
+https://auto-loans.wellsfargo.com/car-loan-application/main/begin.do
+https://auto.21st.com
+https://auto.21st.com/AutoQuote/home.do?method=getHome
+https://avc01.onceanddone.com/
+https://awb.venulex.com/ForSale/tabid/113/Default.aspx
+https://awc.alumni.purdue.edu/
+https://awebproxyprd.ins.state.ny.us/onepage/StartForm.jsp?link=/LICAppsAlice/LIC_SCR_Providers.jsp
+https://axess.stanford.edu/
+https://axptravel.americanexpress.com/consumertravel/travel.do?a=book-flights
+https://az.gov/services_tourism_mapstravel.html
+https://azdemo.az.gov/
+https://b2b.babyeinstein.com/B2B/Legal/MerchantPolicy.asp
+https://b2b.verizonwireless.com/tbmb/
+https://backoffice.iveri.co.za/
+https://backup.cse.ucdavis.edu
+https://backup.filesanywhere.com
+https://backup.filesanywhere.com/
+https://badtrans.monkeybrains.net/
+https://baltimore.customerservicerequest.org
+https://baltimore.customerservicerequest.org/web_intake_balt/Controller
+https://bamweb.bamservices.com/resourcecentral/user/userlogin.aspx
+https://banana.access-health.com/index.html
+https://bank.etrade.com/index.cfm?
+https://bankcardservices.mycardinfo.com
+https://banking.calbanktrust.com/eLogin.jsp
+https://banking.commercebank.com/
+https://banking.ingdirect.com/savings/initial.vm?type=3000
+https://banking.vectrabank.com/setmvnt/Welcome.do
+https://bankingtech.com/bankingtech/homepage.do
+https://bankmw.mortgagewebcenter.com/Default.asp?bhcp=1
+https://bankonline.nationwidebank.com/bankonline/login.do
+https://bankstreetbooks.com/account.php
+https://banquo.duhs.duke.edu/oit/gift.nsf/draftagreement
+https://banweb.ous.edu/oitprd/owa/bwskalog.P_DispLoginNon
+https://banweb.pdx.edu/pls/oprd/twbkwbis.P_WWWLogin
+https://base.firstroi.com/custom/fi/fnbdixonca/fb/disclosure/April-2010-Letter-on-Website-4-10.pdf
+https://basement.dartmouth.edu/blitz/
+https://basic.esplanner.com/
+https://basieproject.org/stable/basie/basie/mail/5106/
+https://baylake.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://bbkicb.bbkonline.com/CorpBank/
+https://bcaccess2fl.dcf.state.fl.us/accountStatus/jsp/common/welcome.faces
+https://bccPortal.lakecountyfl.gov:442/
+https://bcchr.co.charlotte.fl.us/
+https://bccmail.lakecountyfl.gov/owa
+https://be.freelancersunion.org/jobs/
+https://beaunet.beaumont.edu/portal/pls/portal/patients_pay_online.convers_pkg.login_form
+https://beheer.thuiswinkel.org/businesspartner/index.asp?bedrijfid=1307
+https://bespin.mozilla.com/
+https://bestbuyteach.scholarshipamerica.org/
+https://betasiteqa.websense.com/content/support-forum-login.aspx?ReturnUrl=/forums/
+https://biblio.csusm.edu/learn
+https://bids.dallascityhall.com/webapp/VSSPROD/Advantage
+https://biglumber.com/x/web?keyring=6216
+https://bigtent.webex.com
+https://billing.justhost.com/checkorder/
+https://billing.microsoft.com/
+https://billing.thetigerhost.com/register.php
+https://billingthetigerhost.com/cart.php?a=add&amp;domain=register
+https://billpay.golden1.com/cw411/build/static/generic/EAP_demo_v1.html?cfwver=20080403_1028-CFWEB411
+https://billpaydemo.metavante.com/csp/CSPServlet/DemoLogin?brId=1532
+https://biolincc.nhlbi.nih.gov/home/
+https://biz.tigerdirect.com/secure/b2blogin.asp
+https://bkchky.secure.fundsxpress.com/start/BKCHKY
+https://bkgfin.dbf.state.ga.us/SOCLicenseRenewal.html
+https://blackboard.amherst.edu/webapps/login
+https://blackboard.purdue.edu/webct/logon/8056011
+https://blackboard.vcu.edu/webapps/portal/frameset.jsp
+https://blic.iowa.gov/default.aspx?
+https://blog.amedd.army.mil/tsg/
+https://blog.cacert.org/2009/11/442.html
+https://blogs.accenture.com/Accenture_Development_Partnerships/default.aspx
+https://blogs.apache.org/foundation/entry/the_asf_hits_its_millionth
+https://blogs.secondlife.com/thread/17426
+https://blogs.verisign.com/ecommerce/2009/12/ecommerce-times-discusses-reco.php
+https://blogs.worldbank.org/edutech/apps4dev
+https://blueprints.edge.launchpad.net/ubuntu/+spec/desktop-maverick-rootless-x
+https://blueprints.launchpad.net/ubuntu/
+https://bluesource.bluecoat.com
+https://bluesource.bluecoat.com/partnersupport/bluetouch
+https://bmv.informe.org/interactive/dl.html
+https://bnycash.bankofny.com/
+https://bob.sovereignbank.com/wcmfd/wcmpw/CustomerLogin
+https://bofacapital.bankofamerica.com
+https://boinc.berkeley.edu/translate/
+https://boltyboy69.wufoo.com/forms/health-20-startup-information/
+https://bondholders.bnymellon.com/bh/BondWebSite.nsf/pages/home?opendocument
+https://bookseller.wiley.com
+https://bookstore.mayoclinic.com/products/books/details.cfm?mpid=38&amp;trkid=21242S128004040
+https://bookstore.transportation.org/
+https://boomerang.ca.gov/boomerang/
+https://boran-openerp.googlecode.com/svn/trunk
+https://bosebill.salliemae.com/NetPay/Products/RASC/RC/Admissions/1111/Gateway.aspx
+https://boss.vvc.edu/moodle
+https://bostonglobe.com/newsroom/OtherServices/reprints.stm
+https://bp09.internet-ebanking.com/servlet/tpservlet?transactiontype=UserInqAuthActionBean&amp;USERID=6F9DE889EC82E97BAE7454024382E8BE&amp;FIID=3236
+https://brgov.com/apps/insprequest
+https://bridges.torproject.org/
+https://brinksinc.tms.hrdepartment.com
+https://brinksinc.tms.hrdepartment.com/
+https://broker.ampbanking.com
+https://bsd.officedepot.com/
+https://btjunkie.org/torrent/ACS-Law-leaked-emails-TPB/3952f3e0383f99512ba8fb533be8f3a593b747021f6a
+https://bto.bluecoat.com
+https://bto.bluecoat.com/login
+https://buddyguy.com/shop/checkout/
+https://bugs.adobe.com/flashplayer/
+https://bugs.eclipse.org/bugs/show_bug.cgi?id=263708
+https://bugs.eclipse.org/bugs/show_bug.cgi?id=92250
+https://bugs.edge.launchpad.net/ubuntu/+source/usb-creator/+bug/645818
+https://bugs.freedesktop.org/
+https://bugs.launchpad.net/bugs/383368
+https://bugs.launchpad.net/ubuntu/+source/avahi/+bug/94940
+https://bugs.launchpad.net/xserver-xorg-video-intel/+bug/177492
+https://bugs.webkit.org/show_bug.cgi?id=26824
+https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=4644
+https://bugzilla.balabit.com/
+https://bugzilla.filesystems.org/
+https://bugzilla.mozilla.org
+https://bugzilla.mozilla.org/show_bug.cgi?id=570283
+https://bugzilla.novell.com/show_bug.cgi?id=413534
+https://bugzilla.redhat.com/show_bug.cgi?id=304031
+https://bugzilla.redhat.com/show_bug.cgi?id=520888
+https://bugzilla.redhat.com/show_bug.cgi?id=537450
+https://bugzilla.samba.org
+https://bugzilla.samba.org/show_bug.cgi?id=7222
+https://bugzilla.wikimedia.org/
+https://bugzilla.zimbra.com
+https://build.opensuse.org/package/live_build_log?arch=i586&amp;package=gsa-
+https://building.scgov.net/OSG/InitContext.jsp?cachename=Sarasota
+https://buildsecurityin.us-cert.gov/portal/
+https://business.highbeam.com/register
+https://business.loftmail.com/
+https://business.macu.com/index.php
+https://business.texas.gov/oog/bizq
+https://business.verizonwireless.com/b2b/jsp/popups/optin.jsp?sourceSite=Care
+https://businessbillpay.americafirst.com/cwsb/wps?sp=11414&amp;rq=home
+https://businesscenter.gemoney.com/DealerLocator/DealerSearch.do
+https://businessfilings.sos.ca.gov/
+https://businessonline.motorola.com/Login.aspx?error=NoLogin1&amp;ReturnUrl=/default.asp
+https://businessonline.tdbank.com/corporatebankingweb/core/login.aspx
+https://businessonline.westpac.com.au/esis/Login/SrvPage
+https://businessportal.mibank.com
+https://businessportal.mibank.com
+https://businessportal.mibank.com/oracleAccessManager/securid-forms-adforest/securid-std-login.html
+https://buy.entrust.net/buy/index.cfm?csrtype1=ucc&amp;csrtype2=ucc&amp;certlife1=1&amp;certlife2=1&amp;resellernum=20080325
+https://buy.garmin.com/shop/category/all
+https://buy.iasb.org/TIMSSeCommerce/Timssnet/Publications/TNT_Publications.cfm?subsystem=SUB&amp;primary_id=00029&amp;secondary_id=&amp;action=long&amp;format=table&amp;related_prod_flag=0
+https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/buyLandingPage
+https://buy.wsj.com/shopandbuy/order/subscribe.jsp?trackCode=aaabt0gs
+https://buy.zimbra.com/
+https://buzzcard.blackboard.com/webapps/portal/frameset.jsp
+https://bzl.cis6200.jp/e/
+https://c2g.aspgov.com/sarcc2gcx/Index.jsp
+https://ca.secunia.com/
+https://cabig.nci.nih.gov/
+https://cadence.enterprisebanker.com/wcmfd/wcmpw/CustomerLogin
+https://caenjobs-hertz.icims.com/jobs/intro
+https://cafe.steampowered.com/
+https://cafile.ss.ca.gov/CalOnline/
+https://calendar.purdue.edu/
+https://calomel.org/nginx.html
+https://cals.evergreen.edu/patroninfo~S2/
+https://camel2.usc.edu/AdmOnlineApplication/
+https://camolist.com/
+https://campaigns2.documatix.com/campaign/survey.aspx?id=6C50809A685942B3
+https://campus.acm.org/Public/login_genpubqj.cfm?rdr=http://portal.acm.org/portal.cfm?&amp;promo=QJPUB&amp;offering=200&amp;form_type=PUB&amp;CFID=106228682&amp;CFTOKEN=32888033
+https://campus.texarkanacollege.edu
+https://camtools.cam.ac.uk/
+https://cap.scandinavian.net/
+https://captive.delawareinsurance.gov/Default.aspx
+https://card.ml.com/MLRewardsCenter/Security+Center.htm
+https://career.berkeley.edu/business/business.stm
+https://careers-firstrust.icims.com/jobs/intro
+https://careers-standardbanks.icims.com
+https://careers-webmd.icims.com/
+https://careers.asbhawaii.com/apply/client_asb/listreqs.aspx
+https://careers.bremer.com/
+https://careers.collegeboard.com/index.html
+https://careers.firstcomp.com/%40management/
+https://careers.gartner.com
+https://careers.jpmorganchase.com/
+https://careers.lowes.com/
+https://careers.microsoft.com/JobDetails.aspx?ss=&amp;pg=0&amp;so=&amp;rw=10&amp;jid=23687&amp;jlang=EN
+https://careers.navyfcu.org/psp/psext/NFCU_APPLICANT_DATA/HRMS/c/HRS_HRAM.HRS_CE.GBL?Page=HRS_CE_HM_PRE&amp;Action=A&amp;SiteId=2
+https://careers.nytco.com/TAM/nyt_docs/TAM/candidate.html
+https://careers.owens-minor.com/OA_HTML/RF.jsp?function_id=14296&amp;resp_id=23350&amp;resp_appl_id=800&amp;security_group_id=0&amp;lang_code=US&amp;params=raZGtHeMaQQVwGf74jTDz26NOzbbb7iU4yoM1U95b-8IfrJ2p6uOPZBhJTCDBPSR&amp;oas=6t6bAuWttuGcvDzU6Arbmg..
+https://careers.peopleclick.com/careerscp/client_aig/agfs/search.do?functionName=getSearchCriteria
+https://careers.quinnipiac.edu
+https://careers.rbshr.com/
+https://careers.redhat.com/ext
+https://careers.transunion.com/psc/HC89/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL?Page=HRS_CE_HM_PRE&amp;Action=A&amp;SiteId=3?
+https://careers.unicef.org/sap/bc/webdynpro/sap/hrrcf_a_unreg_job_search?sap-client=100&amp;sap-language=EN&amp;rcfContext=UNCF&amp;sap-wd-configid=ZUSEARCH
+https://careers.vanguard.com/vgcareers/jobs/internships.shtml
+https://careers.verizonwireless.com/erphrprd/home/careerhome1.html
+https://careerservices.oakland.edu/csmoodle
+https://carenet.fnfismd.com/usbank/ACCLogin.jsp
+https://carfinance.netcars.co.uk/news/articles/1738/german-financial-civil-war-in-china-continues.htm
+https://carmen.osu.edu/
+https://cart.globalscape.com/gscart/cart.aspx
+https://cas.hss.edu/extranet/extranet.htm
+https://cas.hull.ac.uk/csus.cas/login?service=https://portal.hull.ac.uk/uPortal/Login
+https://catalog.ama-assn.org/Catalog
+https://catalog.library.cornell.edu
+https://catalysttools.washington.edu/survey/?sid=22768&amp;owner=jscholl
+https://cats.cacert.org/
+https://cb-olb.cascadebank.com/
+https://cbccla.secure.fundsxpress.com/start/CBCCLA
+https://cbcm.commerzbank.com/en/site/home/index.jsp
+https://cbsnews.custhelp.com
+https://cbt.ttu.edu/index.php
+https://cc.readytalk.com/cc/playback/Playback.do?id=h4vup9
+https://ccbg.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://ccip.idmpp.cybertrust.com/vault/index.html
+https://ccipweb2.idm.cybertrust.com/AdminServices/en_US/help/deactivate-accounts-form-help.jsp
+https://ccop.nci.nih.gov/
+https://ccpe.sph.harvard.edu/
+https://ccrs.pmi.org
+https://ccrs.pmi.org/
+https://cdcshoppingcart.uchicago.edu/Cart/Cart.aspx
+https://cdn.sunlife.com/static/canada/AdvisorMatch/Sunlife_AdvisorMatch_Classic.html?utm_source=FindanAdv&amp;utm_medium=org&amp;utm_campaign=amcamp&amp;DCSext.lang=en-Ca&amp;DCSext.event_title=FAA(en-Ca)%20:%20Advisor%20Match%20:%20clk&amp;DCSext.event_type=Lead%20intent
+https://cdqualitymeasures.thomsonreuters.com/dct/
+https://cdr.ffiec.gov/public/
+https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jce_policy-6-oth-JPR@CDS-CDS_Developer
+https://ceas.com/uploads/The%20Case%20for%20CEAS%20-%20Solving%20the%20Dilemma%20of%20Post%20Disaster%20Access.pdf
+https://celtic.inshealth.com/ehi/Alliance?allid=Cel26959&amp;agentid=111066
+https://centier.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://ceo.experioronline.com/default.asp?STATE=NC
+https://cert.webtrust.org/ViewSeal?id=527
+https://certification.pmi.org/
+https://certifiedpayments.net/Index.aspx?BureauCode=1560231
+https://certs.godaddy.com/anonymous/repository.seam
+https://cet-learn.gocetech.com
+https://cf51.site-secure.com/bank0025/contact_us.cfm
+https://cfc.executiveboard.com/Public/TopConsumerBankingProductTrends.pdf
+https://cfprod.ais.fsu.edu/dsa/HealthInsurance/
+https://chaostreff.ch/gallery/WTH
+https://charliecard.mbta.com/CharlieCardWebProgram/pages/index.jsp
+https://chart.donhr.navy.mil/
+https://charterone.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://chaseonline.chase.com/chaseonline/reidentify/sso_reidentify.jsp?LOB=RBGLogon
+https://chat.ally.com/hc/LPallychat/?cmd=file&amp;file=visitorWantsToChat&amp;site=LPallychat&amp;byhref=1&amp;SESSIONVAR!skill=general-service-english
+https://chat.citizensbanking.com/CBCommercial/hppcwis.dll?varUserRequest=REQ_WEBCHAT_MAIN&amp;varUserLanguage=english
+https://chatwithourteam.com/licence/1001/open_chat.cgi?lang=eh&amp;params=HUB%20HUB%20HUB%20-%20WEB%20HOSTING%20HUB%20-%20HUB%20HUB%20HUB&amp;groups=0
+https://check.torproject.org/
+https://checkimage.mibank.com/decisionpay/brand/mipdecpay
+https://checkout.google.co.uk/
+https://checkout.google.com/files/privacy.html?hl=en-GB
+https://checkout.google.com/seller/acceptance_logos.html
+https://checkout.its.uiowa.edu/AboutLaptop.aspx
+https://chess.army.mil/ascp/commerce/download/lotus_forms_viewer.jsp
+https://childsupport.tarrantcounty.com/
+https://chitika.com/publishers.php?refid=dreteh
+https://choice.thrivent.com/cp/choice_search.aspx
+https://choosecu.colorado.edu/
+https://chp.solucient.com/
+https://chrome.google.com/extensions/detail/olkgcckojdoebokfkgknjhejfhodcbgm
+https://chronicle.com/blogPost/Teaching-With-Technology/4547
+https://chtvts05.secureaps.com/WebCaptureWeb/
+https://cibng.ibanking-services.com/cib/CEBMainServlet/Login?FIORG=140&amp;FIFID=121301028
+https://cicada.clarku.edu
+https://cilabs.illinois.edu/system/files/u268/faucet.html
+https://circleofsharing.cancer.org/default.aspx
+https://cisco.hosted.jivesoftware.com/
+https://cissecure.nci.nih.gov/factsheet/FactsheetSearch.aspx?FSType=1.2
+https://citizensbanking.tms.hrdepartment.com/
+https://citizensbankri.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://citrix.ocwen.com
+https://claiminfo.allstate.com/AllstateCTSNGClaimInfoSSWeb/Anon/GlassClaims/ExitToLynx.aspx
+https://claims.nhes.state.nh.us/weblogic/Home.jsp
+https://clasenhancements.thinkculturalhealth.org/
+https://class.wfbschools.com
+https://classadz.vdata.com/Ogden
+https://classes.maynardschools.org
+https://classified.washpost.com/advportal/css.portal?_nfpb=true&amp;_pageLabel=cssAds&amp;nid=roll_classifieds
+https://clc.executiveboard.com/Public/AboutThePractice.aspx
+https://clclaimreporting.travelers.com/clrpt/logonagent.asp
+https://clear.thomsonreuters.com/
+https://clicktoverify.truste.com/pvr.php?page=validate&amp;url=luxsci.com&amp;sealid=102
+https://client.anpac.info/ClientServices/
+https://client.harrismycfo.com/common/Login.jhtml
+https://client.pointandpay.net/dmv_consumerui/welcome.do?PartnerCD=5030
+https://clientconnect.silverplume.com/Portal/Login.aspx
+https://clientconnection.worldbank.org/servlet/main?menuPK=234032&amp;pagePK=232663&amp;piPK=234033
+https://clientlogin.ibb.ubs.com/AuthSSO/html/request_login.html
+https://clients.bracewellgiuliani.com/login.asp
+https://clients.ezpzhosting.co.uk/aff.php?aff=030&amp;finaldestination=http://www.ezpzhosting.co.uk/drupal-hosting/
+https://climatefriendly.com/projects
+https://clinical.sjmprofessional.com/
+https://clinicalinquirer.infosolutions.mckesson.com/
+https://clmiddlemarket.onebeacon.com/
+https://cloudcomputing.sys-con.com/
+https://club.nintendo.com/
+https://cm.netteller.com/login2008/enroll.aspx?fi=PROVIDENTBANKING&amp;bn=54f35b4b941c12d6&amp;burlid=d747504e985a05e5
+https://cm.rsaconference.com/US10/catalog/profile.do?SESSION_ID=4829&amp;ts=1267163362911
+https://cmblreg.cpa.state.tx.us/reg-pd/index.cfm
+https://cmbs-admin.soltn.cdc.nicusa.com/ne/cust-admin/login.html
+https://cmesvle.cutwater.org
+https://cms-prod-edit.alaska.edu/hr/edit.xml
+https://cms.bis.gov.uk/go-science/news/go-science-now#gsn14sep
+https://cms.bridgewater.edu
+https://cms.greatwesternbank.com/
+https://cms.paypal.com/ca/cgi-bin/?&cmd=_render-content&content_ID=developer/solutions_ent_ecommerceplatforms
+https://cms.paypal.com/us/cgi-bin/?&cmd=_render-content&content_ID=ua/AcceptableUse_full
+https://cmt.research.microsoft.com/VLDB2011/
+https://cne.coderedweb.com/Default.aspx?groupid=GZ3FCvhYKAngN%2bUadEx%2b%2fA%3d%3d
+https://co.clickandpledge.com/Default.aspx?WID=9978
+https://code.edge.launchpad.net/~vcs-imports/scribus/trunk
+https://code.google.com/p/wami/
+https://code.launchpad.net/bzr
+https://collaboration.bus.emory.edu/course/Richard_Makadok/ACAC/Information/CallForPapers.aspx
+https://collada.org/public_forum/
+https://college.usc.edu/cf/GNC/donate-form.cfm
+https://collegesave4u.s.upromise.com
+https://collegesave4u.s.upromise.com/
+https://collegesavings.myaccount.pacificlife.com/public/myaccount/my_index.html
+https://columbiabank.webcashmgmt.com/wcmfd/wcmpw/CustomerLogin
+https://command.onlinebank.com/1785MBFinancial/
+https://commapps.collegeboard.com/sma/servlet/independent
+https://commerce.barrons.com/auth/forgotpass
+https://commerce.cashnet.com/psupay
+https://commerce.cpsma.berkeley.edu/tickets/tickets/production.aspx?productionNumber=6323
+https://commerce.earthlink.net/www.slatersoftware.com/Merchant2/merchant.mvc?Session_ID=633ffe606bda0332af925ef016bf8252&Screen=OINF&Store_Code=slatersoftware
+https://commerce.guidestar.org/GuideStar/newaccount.aspx
+https://commerce.health.state.ny.us/hpn/
+https://commerce.mbta.com/
+https://commerce.metapress.com/content/45u6287u37x5566n/resource-secured/?target=fulltext.pdf&sid=mdd4fp45zi5jqs45pnjgx2f2&sh=www.springerlink.com
+https://commerce.pair.com/alhadeff/coney/join.html
+https://commerce.paltalk.com/mpt/MyPalTalkHome.jsp
+https://commerce.sars.gov.za/roe/SingleDates.asp
+https://commerce.uk.reuters.com/purchase/advancedSearch.do?symbol=DELL.O
+https://commerce.wsj.com/registration/do/student/stage1;jsessionid=jL4IaxoWSBX1m6flwY0+lQ**.jboss1
+https://commercial.wachovia.com/Online/Financial/Business/Service?action=Login
+https://commons.era.nih.gov/commons/reference/submitReferenceLetter.do?mode=new
+https://commonsdemo.era.nih.gov/commons-demo/
+https://community.bentley.edu/olc/pub/BTT/events/event_order.cgi?tmpl=events&amp;event=2211420
+https://community.cacert.org/board/motions.php?motion=m20100327.1
+https://community.cacert.org:443/board/motions.php?motion=m20090912.1
+https://community.collegeboard.com/index.jspa
+https://community.dynamics.com/
+https://community.dynatrace.com/community/display/PUB/Combining+Analytics+with+Performance+Management+Data
+https://community.mcafee.com/thread/28179
+https://community.modwest.com
+https://community.privacyassociation.org/eWeb/DynamicPage.aspx?expires=yes&amp;Site=iapp&amp;WebKey=2e3963ab-6acc-482c-956c-a52cdc56bf04
+https://community.qualys.com/community/blindelephant
+https://communityfoodbank.com/shop/product.php?productid=4&amp;cat=1&amp;page=1
+https://communitystore.mozilla.org/faq
+https://comnatbk.securesites.net/right.php/pid/16
+https://compete.netacad.net/moodle
+https://compliance.merchant-info.com/
+https://computation.llnl.gov/home/
+https://computing.llnl.gov/tutorials/pthreads/
+https://conexion.bital.com.mx/clabe/default.htm
+https://confluence.uhi.ac.uk/confluence/display/~eo00ta/JANET+SSL+Certificate+Notes
+https://connect.e-signing.be/documents/e-Signing_HandwrittenEquivalentSignaturePolicy_EN_v1.1.pdf
+https://connect.mckesson.com/portal/site/smo/template.LOGIN/?cid=mckcom
+https://connect.microsoft.com/VisualStudio/feedback/CreateFeedback.aspx
+https://connect.oildex.com/relations/orcHome.jsp?OPERATOROILDEXID=ODX000054161000
+https://connect.uwaterloo.ca
+https://connection.standard.com
+https://connectra.km.kongsberg.com/Login/Login
+https://connhub2.connect.uwaterloo.ca
+https://consultantjournal.freshbooks.com/signup/
+https://consumer.eassuranthealth.com/im/consumer/ease/AgentLink.aspx?ID=091BD1D6400D541EF0ABB8C6BBC0F5B7
+https://consumerreports.secure-donor.com/consumerreports?source=1027222221
+https://contact.dhs.gov/DynaForm.aspx?FormID=foia
+https://contact.tsa.dhs.gov/DynaForm.aspx?FormID=10
+https://content.pncmc.com/live/pnc/careers/main/index.html
+https://content.putnam.com/content/assembler/Shareholder/individual_investor/html/products/mutualfunds/mutualfunds.htm
+https://contributions.coremedia.com/trillr1
+https://control.valueweb.net/control/thawte/faq.html
+https://controlpanel.msoutlookonline.net/asp/administrator/Login.asp
+https://controlpanel.netfirms.com
+https://cordis.europa.eu/emmfp7/index.cfm
+https://core.forge.funambol.org/wiki/BuildingFunambolV8
+https://core.trac.wordpress.org
+https://core.trac.wordpress.org/changeset/12581
+https://corp.bankofamerica.com/public/public.portal?_pd_page_label=/support/contact/index&amp;icamefrom=cihome
+https://corpbank.electracard.com/corpbank/enrollment/enroll_welcome.jsp
+https://corporate.visa.com/utility/contactus.jsp
+https://corporates.ehbox.com/home.php?source=HOTEL&sourceId=143
+https://corporatetraining.nwtc.edu/
+https://corps.sos.wa.gov/llc/pages/startpage.aspx
+https://cotweet.com/
+https://councils.glgroup.com/app/AccountProfileInfo.aspx
+https://countrybank.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://countryfinancial.promo.eprize.com/roadtripsandguitarpicks/
+https://courselink.uoguelph.ca/
+https://courses.che.tamu.edu
+https://courses.hua.edu/moodle
+https://courses.utexas.edu/
+https://courses.vlacs.org
+https://coursesite.lehigh.edu
+https://courseworks.columbia.edu/
+https://courtlink.lexisnexis.com/Billing/Login.asp?OriginalPage=%2FCLIP%2FClipMenu%2Easp
+https://covkc.agencies.virginia.gov/vdh/courses/Clinicians/Influenza in Virginia 2010-2011/player.html
+https://cp.apps4rent.com
+https://cp.apps4rent.com/
+https://cp.databasepower.net
+https://cpanel.ihosturdomain.com
+https://cprodmasx.att.com/commonLogin/igate_wam/controller.do?TAM_OP=login&amp;USERNAME=unauthenticated&amp;ERROR_CODE=0x00000000&amp;ERROR_TEXT=Successful%20completion&amp;METHOD=GET&amp;URL=%2Fpkmsvouchfor%3FATT%26https%3A%2F%2Faccountmanager.att.com%2Fwps%2Fmyportal%2Fmysbc%2Fhome%3FreferralAppID%3DSBC&amp;REFERER=&amp;HOSTNAME=cprodmasx.att.com&amp;AUTHNLEVEL=&amp;FAILREASON=&amp;OLDSESSION=
+https://crash.state.co.us/
+https://crc.daveramsey.com
+https://creditcards.iberiabank.com
+https://creditcards.tdcardservices.com/TD_InstantApp/Application.do?promoCode=ER
+https://creditsummary.ilr.cornell.edu/studentCS/regentry.php
+https://crm.infusionsoft.com/go/poddemo/pod1
+https://crm.orionondemand.com/crm/forms/B07071C70x6G0x6702fG4
+https://crm.rbsworldpay.com/cgi-bin/rbsworldpay.cfg/php/enduser/std_adp.php?p_faqid=957&p_created=1236165204&p_topview=1
+https://crmatsap.sap.com/home/b2c/b2c/init.do?language=en&amp;shop=eco_gc_e
+https://crn.farmersinsurance.com/crlocator/
+https://cs.mtmercy.edu/moodle
+https://cs.uccs.edu/~chow/pub/cybertrust/nsf04524.pdf
+https://cs2p.ida.org/
+https://cscclaims.chubb.com/
+https://cscloss.chubb.com/
+https://csg.ohsu.edu
+https://csg1.onlinebank.com/0072UnitedBank/AccountOpening
+https://csm.cybertrust.com.au/customerCenter/customerCenter/index.do
+https://csusb-csm.symplicity.com
+https://csusb-csm.symplicity.com/
+https://ctools.umich.edu/
+https://ctxagw1.gmacinsurance.com/CitrixLogonPoint/GMACILogonPoint/
+https://cuacs8.mck.ncsu.edu/moodle
+https://cuathome.gtefcu.org/
+https://cubmail.cc.columbia.edu/
+https://cuconnect.colorado.edu/uPortal/
+https://culink.colorado.edu/
+https://cunet-learn.gocetech.com
+https://cuonline.ncua.gov/CreditUnionOnline/Login.aspx
+https://currituckeoc.com/resolution/
+https://customer.automation.mckesson.com/
+https://customercare.acer-euro.com/
+https://customercare.allstate.com/Anon/Login/Login.aspx
+https://customercare.webmd.com/ics/support/default.asp?deptID=18003
+https://customercenter.auto-owners.com
+https://customercenter.auto-owners.com/
+https://customerportal.mckesson.com/
+https://customers.autonomy.com/
+https://customers.esri.com/index.cfm?event=general.dspHelp&amp;topic=softwareDownloads
+https://customers.machighway.com/cart.php
+https://customerservice.baldwinandlyons.com/blweb/login2.asp
+https://customerservice.sovereignbank.com
+https://customerservice.sovereignbank.com/cgi-bin/sovereignbank.cfg/php/enduser/ps_start_search.php?p_sid=DcBzBLtj
+https://cuvermont.com/
+https://cvmas05.cvmsolutions.com/fluor/new_vendor_registration.asp
+https://cw411.checkfreeweb.com/cw411/wps?sp=10616&amp;rq=home
+https://cwsb40.checkfreeweb.com/cwsb/wps?rq=home&amp;sp=10617
+https://dallasnews.regsignup.com/tdmnoffer_main
+https://danversbank.andera.com/index.cfm?fiid=316AE3B9C8D84AA78E3FCA8C077C377C
+https://danversbank.mortgagewebcenter.com/
+https://danversbank.webexone.com/
+https://dartix.dartmouth.edu/online/?brand=THEHOP
+https://dashboard.wordpress.com/wp-admin/profile.php
+https://data.webmd.com/sdclive/sdcform.aspx?formid=l2uRegistration
+https://datatracker.ietf.org/drafts/
+https://davematthewsband.shop.musictoday.com/ShopperLookup.aspx?co=false&amp;target=Default.aspx
+https://davidson-tn.mygovonline.com/mod.php?mod=motors
+https://dawninfo.samhsa.gov/default.asp
+https://dbappserv.cis.upenn.edu/home/?q=node/8
+https://dbserv.ad.cl.cam.ac.uk/Administration/
+https://dc-demo.dev.c--g.net/
+https://dcapps.putnam.com/dc-partner-web/security/SponsorLogin.jsf
+https://dcc.godaddy.com/default.aspx?isc=cjchst199t&amp;ci=11269&amp;activeview=incomingaccountchange
+https://dcc.securepaynet.net/default.aspx?prog_id=MosoTechnology
+https://dcf-access.dcf.state.fl.us/access2florida/access/scrflwelcome.do?performAction=init
+https://dcportal.putnam.com/dc-ph2-participant-web/Login.htm
+https://dealer.drivefinancial.com
+https://dealer.drivefinancial.com/
+https://dealer.lionbank.com/lionpay2
+https://decipher.sanger.ac.uk/application/
+https://deed.wilco.org/localization/menu.asp
+https://deekayen.net/taxonomy/term/27/0
+https://deimos.apple.com/WebObjects/Core.woa/Browse/purdue.edu
+https://delecorp.delaware.gov/tin/GINameSearch.jsp
+https://demandbase.demandbase.com/
+https://demandbase.ilinc.com/join/ctbyfwc
+https://demo-trunk.ofbiz.apache.org/googlecheckout/control/main?externalLoginKey=EL574014938014
+https://demo.netteller.com/banrbank/default.cfm?tmppageld=1029
+https://denebleo.sec.gov/tcr/add.action?c=3
+https://denver.mwdbe.com/FrontEnd/VendorSearchPublic.asp?SessionID=26131705487873321426172360534662&amp;TN=Denver
+https://depositaccounts.gpo.gov/
+https://derf.homelinux.org/
+https://dev.cacert.cl/wiki/birdshack/Minutes20091216EssenSoftwareMiniTOP
+https://dev.mozilla.jp/abouthacks/
+https://dev.openwrt.org/wiki/GetSource
+https://developer.mindtouch.com/Special:UserLogin?r=http://developer.mindtouch.com/en
+https://developer.mozilla.org
+https://developer.mozilla.org/
+https://developer.mozilla.org/En/HTTP_Access_Control
+https://developer.mozilla.org/en/Aardvark_(external)
+https://developer.mozilla.org/en/CSS/position
+https://developer.mozilla.org/en/XMLHttpRequest
+https://developer.omniture.com/node/2572
+https://developer.paypal-portal.com/thread/46133;jsessionid=2ABCF1DD8CD9C2AC1DDB12F419E6A868.node0
+https://developer.paypal.com/
+https://developer.skype.com/jira/secure/CreateIssue.jspa?pid=10190&amp;issuetype=30 Request SILK IP License
+https://developer.sonyericsson.com/site/global/home/p_home.jsp
+https://developer.sprint.com/site/global/community/events/previous_events.jsp
+https://development.standards.ieee.org/
+https://dhr.ky.gov/DHRWeb/RS?AC=2
+https://di.ft.cashedge.com/jsp/oao/relc/cashedge/oao_index.jsp?homeid=99992337
+https://dia-hfd.iowa.gov/DIA_HFD/Home.do
+https://dia.iowa.gov/scg/
+https://diary.keele.ac.uk/egroupware/login.php
+https://dias.navyfcu.org/mindbox/mbui.nsf/AppHome?OpenAgent
+https://dibels.uoregon.edu/dibelsinfo.php
+https://dice.fldfs.com/public/pb_index.asp
+https://diews.massmutual.com/disability/ews-login/login.jsp
+https://digitalid.safescrypt.com/global/services/globalserver/search.htm
+https://digitalmedia.citigroup.net/digitalmedia/view/viewEvent.jhtml?eventid=8867&amp;contentid=39101&amp;embedded=false
+https://direct.53.com/logon53Direct.jsp
+https://direct.imagedepositgateway.com/3044MultiFactorAuthenticationWebClient/Default.aspx?ReturnUrl=%2f3044MerchantCaptureWebClient%2fDefault.aspx
+https://direct.transunion.com/
+https://direct.transunion.com?
+https://directory.amherst.edu/
+https://directory.columbia.edu
+https://directory.columbia.edu
+https://directory.columbia.edu/people/
+https://directory.purdue.edu/directory-bin/nph-update.pl
+https://diss.state.de.us/DWS/public.diss
+https://dist.eugridpma.info/distribution/igtf/1.31/CHANGES
+https://diversity.llnl.gov
+https://dlenote.ed.gov/empn/index.jsp
+https://dmvdhr.sc.gov/DriverHistoryRecords/Interactive/CDBLogin.aspx
+https://dnbweb1.blackbaud.com/OPXDONATE/AddDonor.asp?cguid=4B1EBB7A%2DAF2B%2D4A68%2DAB41%2DB7B5D71749BC&amp;sTarget=https%3A%2F%2Fdnbweb1%2Eblackbaud%2Ecom%2FOPXDONATE%2Fdonate%2Easp%3Fcguid%3D4B1EBB7A%252DAF2B%252D4A68%252DAB41%252DB7B5D71749BC%26dpid%3D4758&amp;sid=D9F9439D%2D575A%2D456C%2D953A%2DCC9F389F6C01
+https://dnrlicensing.sc.gov/DNRLicensing/EntryPage.aspx
+https://dns.l4x.org/listserv.cybertrust.com
+https://doa.wi.gov/DHSSurveys/TakeSurvey.aspx?SurveyID=7lL0lmmK
+https://docline.gov/loansome/login.cfm
+https://docs.google.com/Doc?docid=0AQvxLfqt-A6iZGQ5bWRmc3ZfOGY0ejN3dGQ3&amp;hl=en
+https://docstore.fedex.com/diils
+https://docstore.kinkos.com/gpoexpress
+https://documentservices.bnymellon.com/WebConnect/login/login.aspx
+https://dod411.gds.disa.mil
+https://dodpke.com/
+https://doj.mt.gov/ApplicantSelfScheduling/Applicants/ApplicantHome.aspx
+https://donate.americanheart.org/ecommerce/aha/aha_index.jsp
+https://donate.barackobama.com/
+https://donate.perlfoundation.org/index.pl?node=Contribution+FAQ
+https://donate.pih.org/page/contribute/haiti-contribution?source=earthquake&amp;subsource=6monthreport
+https://donate.purdue.edu
+https://donate.spectrum-health.org/NetCommunity/SSLPage.aspx?pid=206&amp;srcid=210
+https://dors.mo.gov/tax/coreg/index.jsp
+https://dorweb.revenue.delaware.gov/licrenew/
+https://dowjones.taleo.net/careersection/djexternal/jobsearch.ftl?lang=en
+https://dpronline.delaware.gov/MyLicense%20Enterprise/Login.aspx
+https://dpsemailnotify.iowa.gov/
+https://dragon.enterasys.com/user.php
+https://drupal.org/node/78838
+https://dsiweb1.standard.net/select_pub.asp?uid=0
+https://dspace.mit.edu/
+https://dspace.sunyconnect.suny.edu/handle/1951/44805
+https://dss.un.org/
+https://dssapp.dss.mo.gov/ccrate/
+https://dtvsupport.fcc.gov/dtvtools/index.htm?module=qry&amp;srchtype=TL
+https://du9vuv1lh0wjj.cloudfront.net/safari/memonic_safari_extension_1_0_0.safariextz
+https://duckduckgo.com/?t=yegg
+https://duckweb.uoregon.edu/
+https://dwreports.mckesson.com/clientreports/
+https://dwss.nv.gov/index.php?option=com_content&amp;task=view&amp;id=50&amp;Itemid=126
+https://e-access.compassbank.com/bbw/cmserver/welcome/default/verify.cfm
+https://e-obmen.net
+https://e-reports-ext.llnl.gov/pdf/240009.pdf
+https://e.rkmc.com/
+https://e3.ky.gov/
+https://eaccess.bankersbankcard.com/therightbank/action/login
+https://eagle.ncosc.net
+https://eap2.guidestone.org/login.aspx
+https://eapply4ui.edd.ca.gov/eddcomm/frmFraudStart.htm
+https://eapps.naic.org/cis/
+https://eastwestbank.webcashmgmt.com/wcmfd/wcmpw/CustomerLogin
+https://ebank.pinnbank.com/Pbi_Pbi1961/Pbi1961.asp?Rt=104913912&amp;LogonBy=Connect3&amp;PRMAccess=Account&amp;Enroll=True
+https://ebank.unitedsecuritybank.com/PBI_PBI1961/pbi1961.asp?Rt=121141495&amp;LogonBy=Connect3&amp;PRMAccess=Account&amp;afc=1override=true
+https://ebg.sunlife.com/
+https://ebidmarketplace.com/
+https://ebill.auto-owners.com/ebilling/public/help/general/PrivacyPractice.htm
+https://ebill.lus.org:8701/SelfService/SSvcController/login
+https://ebill.pbcwater.com/Faq/contactus.aspx
+https://ebiz.rlicorp.com/members
+https://ebiznet.sbc.com/calnetinfo/RiderB/GTE/BGTE_Frame.htm
+https://ebpp.texasonline.state.tx.us/ebpp/EbppMain?action=create_new&amp;app_id=29&amp;agency_id=11&amp;ddn=comw
+https://ebpp3.wellsfargo.com/ds/WFF
+https://ebranch.wescom.org
+https://ebranch.wescom.org/ebranch/login/NewUser_Account.aspx?organization=132166C6-7ECC-48e5-9461-5AB2055FE4A3
+https://ebuilder.dom.com
+https://ebuilder.dom.com/
+https://ebusiness.memphistn.gov/OA_HTML/OA.jsp?OAFunc=PON_ABSTRACT_PAGE
+https://ebusiness.unigroupinc.net/PortalsWeb/CommandProcessor?agent=u0001
+https://ebyepass.airtran.com/FindReservation.aspx
+https://ec.consumerreports.org/ec/cro/order.htm?INTKEY=I61HLL0
+https://eca.verisign.com/
+https://ecap-ws-prod.usps.com/entreg/loginView.do
+https://ecardone.com/
+https://ecash.arl-tsg.com/bri-comm/
+https://ecash.fsbnm.com/cashman/
+https://ecf.ca7.uscourts.gov/
+https://ecf.cand.uscourts.gov/cand/09cv2292/files/09cv2292-ORDER.pdf
+https://ecf.mad.uscourts.gov/
+https://ecf.mowd.uscourts.gov/cgi-bin/show_public_doc?2010cv4154-9
+https://echannel.stateauto.com/agentsite
+https://ecl.collegeboard.com/account/AccountProfile2.jsp?applicationId=0&amp;destinationpage=https://myorganizer.collegeboard.com/my_organizer/MyOrganizer.jsp
+https://ecom.dfckc.com/PBI_PBI1961/pbi1961.asp?Rt=101006699&amp;LogonBy=Connect3&amp;PRMAccess=Account&amp;user=true&amp;Enroll=true
+https://ecom.homefederal.com/PBI_PBI1961/Pbi1961.asp?Rt=291471134&amp;LogonBy=Connect3&amp;PrmAccess=&amp;User=True&amp;SPTN=57454C5330C24436A6A762B9211B3252&amp;WCI=forgotpswd
+https://ecom.yahoo.com/dir/express/intro/
+https://ecomm.metrocouncil.org/secure/Go-To/index.htm
+https://ecommerce.gmacinsurance.com/searchQuotes/SearchQuotes.jsp
+https://ecorpla1.com/EBC_EBC1961/EBC1961.ASP?WCI=Process&amp;WCE=Request&amp;RID=3000&amp;RTN=122228003&amp;mfa=2
+https://ecpa.cpa.state.tx.us/edcr/EdcrSearch.jsp
+https://ecpa/cong/Index.jsp
+https://edeposit.centralbancompany.com
+https://edeposit.opensolutionsimagearchive.com/Monarch.aspx
+https://edge.launchpad.net/~canonical-dx-team/+archive/une
+https://edir.alaska.edu
+https://edir.alaska.edu/
+https://edis.commerce.state.nc.us/docs/countyProfile/PA/42017.pdf
+https://edis.usitc.gov
+https://edis.usitc.gov/
+https://edit.europe.yahoo.com/forgotroot?done=http%3A%2F%2Fmail.yahoo.com&amp;src=ym&amp;partner=&amp;intl=us
+https://edit.yahoo.com/config/eval_register?.done=http%3A%2F%2Fanswers.yahoo.com&amp;.src=knowsrch&amp;.intl=us
+https://edms.cern.ch/file/722398/1.2/gLite-3-UserGuide.html
+https://eeda.sws.iastate.edu
+https://eee.uci.edu/
+https://efbn.ocgov.com/eFBNweb/default.aspx
+https://efilepay.idr.iowa.gov/iao_aaa/welcome.asp
+https://efiling.uscis.dhs.gov/efile/
+https://efolio.morgankeegan.com/escripts/default.asp
+https://eformrs.com/
+https://eforms.metlife.com/wcm8/OIDAction.do?OID=3226
+https://efts.uchc.edu/
+https://egov.azdes.gov/CMSInternet/main.aspx?menu=8&amp;id=56
+https://egov.dnrec.delaware.gov/egovpublic/dnrec/disp?doc=LoginScreen&amp;deptPath=public&amp;op=showDefault&amp;dept=5
+https://egov.immigration.gov/cris/jsps/index.jsp
+https://egov.kboc.ks.gov/egov/Login.aspx
+https://egov.ksbn.ks.gov/egov/
+https://egov.state.wy.us
+https://egov.uscis.gov/cris/Dashboard.do
+https://egoveast.aspgov.com/sarcc2gcx/Index.jsp
+https://ehealth-edit.ky.gov/board
+https://ehsehplp03.niehs.nih.gov/ambra-registration/register.action
+https://ehsehplp03.niehs.nih.gov:/ambra-registration/register.action
+https://eics.navyfcu.org/navyfcunews.nsf/61a94a14281b1bda852569ad0064b858/9f62533b0bffa33385256bf1005097a4?OpenDocument
+https://eid.colostate.edu/filesharing/login.aspx
+https://einet.logika.net/view/dr_submit.gst?d=
+https://einvoice2.ipayxepay.net/clarian/index.jsp
+https://eis.ftc.gov
+https://ejuror.iowa.gov/ejuror/do/start
+https://elb.mvpbanking.com/cgi-bin/dlogin.pl
+https://elearn.mesquiteisd.org
+https://elearn.mi-emsis.org
+https://elearn.wschiro.edu
+https://elearning.pbu.edu
+https://elearning.psu.edu/elearning/people/49/all
+https://elearning.stjohns.k12.fl.us
+https://elearning.sunyopt.edu
+https://elections.cira.ca/2010/campaign/topic/92/en
+https://elicense1-secure.com.ohio.gov/
+https://elicensing.iowaabd.com/
+https://elicvirtual.courts.state.md.us/license/index_disclaimer.jsp
+https://email.secureserver.net/login.php
+https://email.vzwshop.com/servlet/formlink/f?NFOQU&amp;SOURCEID=WEB_DGF_VZW_SUPPORTNAV
+https://emailus.sbc.com/ermsfp/emailus?service=external/Home
+https://emailwire.com/release/47868-Financial-Stocks-Fell-on-Tuesday-Citigroup-Inc-Bank-of-America-Corporation-American-International-Group-Inc-BBT-Corporation.html
+https://emem.vfw.org/ssl/NewMember.aspx
+https://employee.wageworks.com/Employee/SelfId.aspx?SelfIDMode=Forgot
+https://employer.ontargetjobs.com/Public/Login.aspx?ReturnUrl=/Protected/Home.aspx?partner_id=bizjournals&amp;partner_id=bizjournals
+https://employer.wageworks.com/
+https://empowerasp.lendingsvcs.com/colonial.consumer/GreaterTexasFCU.aspx
+https://ems.authorize.net/oap/home.aspx?SalesRepID=98&amp;ResellerID=17240
+https://emt.askadmissions.net/purdue/ask.aspx?cid=3171&amp;did=2
+https://encrypt.emdhealthchoice.org/searchable/main.action
+https://encrypted.google.com
+https://encrypted.google.com/search?hl=en&amp;q=filetype%3Artf+%7C+filetype%3Appt+%7C+filetype%3Apptx+%7C+filetype%3Acsv+%7C+filetype%3Axls+%7C+filetype%3Axlsx+%7C+filetype%3Adocx+%7C+filetype%3Adoc+%7C+filetype%3Apdf+%22this+document+is+confidential%22&amp;btnG=Search&amp;aq=f&amp;aqi=&amp;aql=&amp;oq=&amp;gs_rfai=
+https://enet1.cobbetts.com/staff/
+https://engineering.purdue.edu/ABE/
+https://engineering.purdue.edu/ProPractice/AboutUs/index.html
+https://engineering.purdue.edu/~jabraham/
+https://enrol.dss.mil/enrol/lang-en/SYS_login.asp
+https://enroll.navimedix.com/enrollment/shared/office-search
+https://enterprise2.openbank.com/fi1426a_auth/user/slogon
+https://enterprisecenter.verizon.com/enterprisesolutions/default/signIn.do
+https://enterprisecenter.verizonbusiness.com/enterprisesolutions/default/selfreg/enrollmentProfileInfo.do?TARGET=http://www.verizonwireless.com/b2c/businessSolutions/mybiz/vecOverview.jsp&amp;s=vzw
+https://entp.hud.gov/idapp/html/hicostlook.cfm
+https://epartner.farmersinsurance.com
+https://epass.nc.gov/ePASS/cw/PlayerPage.do?
+https://epass.oocea.com/Corporate/travel/tollcalculator.aspx
+https://epay-cl.travelers.com/epay/selfenroll.aspx?AppCN=EPAYPDEMC
+https://epay.dallascityhall.com
+https://epay.gatech.edu/C20793_ustores/web/store_main.jsp?STOREID=78
+https://epayments.cityofmemphis.org/traffic/
+https://epht.oregon.gov/epht/ClickThrough.aspx?q=Asthma&amp;Mode=Public
+https://epic.epd.gov.hk/eForm/pages/datadownload/downloadMain.jsp?lang=eng
+https://epl.collegeboard.com/epl/updateUser.do
+https://epoch.oreilly.com/shop/cart.orm
+https://eportal.molinahealthcare.com/eportal/providers/ProviderSearch.aspx?RedirectFrom=MolinaStaticWeb&amp;State=WA
+https://eprimevest.automatedfinancial.com
+https://eprints.soas.ac.uk/
+https://eproc.nassaucountyny.gov/MainBidBoard
+https://eps.onebeacon.com/wps/myportal/obcustomer
+https://erecruit.nga.mil/EXPROD/erecruit_browsercheck.html
+https://erecruit.per.state.vt.us/psp/SELFSERVE/EMPLOYEE/HRMS/c/ROLE_EMPLOYEE.HR_EMPLOYEE_INTRO.GBL?Page=HR_EMPLOYEE_INTROAction=U
+https://erecruit.who.int/public/hrd-cl-vac-view.asp?o_c=1000&amp;jobinfo_uid_c=23488&amp;vaclng=en
+https://erecruiting.eads.com/sap(bD1lbiZjPTAwMSZkPW1pbg==)/bc/bsp/sap/hrrcf_unrg_appl/application.do?PARAM=cGluc3RfZ3VpZD00QzU3MkUxOEJFNzAyQkVDRTEwMDAwMDBDMkNFMTYzRg%3d%3d&amp;BspClient=001&amp;sapclient=001&amp;BspLanguage=EN&amp;rcfContext=INAPPL
+https://erecruitment.wto.org/public/hrd-cl-vac-view.asp?jobinfo_uid_c=3475&amp;vaclng=en
+https://erp-portal-prd.itap.purdue.edu/irj/portal
+https://erwin.volkswagen.de/erwin/showOnlineServices.do
+https://es.opm.gov/usastaffing/login.asp
+https://escrow.com/support/calculator.asp
+https://esd.melloninvestor.com/
+https://esecure.ubat.com/pbi_pbi1961/pbi1961.asp?rt=072403347&amp;logonby=connect3&amp;prmaccess=account
+https://eservice.metlife.com
+https://eservice.metlife.com/open/registration.htm
+https://eservices.aegonins.com/ext_site/erecruitframe.html
+https://eservices.idrf.state.ia.us/taxrefund/index.jsp
+https://eservices.iowa.gov/iowaparks/index.php?pgname=cabins
+https://eservices2.aegonins.com/ext_site/eservicesframe.html
+https://esos.state.nv.us/Corps/
+https://esp.srcponline.com/UnityBank/Signin.asp
+https://espanol.53.com
+https://espanol.53.com/
+https://espanol.mworld.com
+https://espanol.mworld.com/m/m.w?lp=Help&amp;sp=VC&amp;pid=356&amp;fwd=1
+https://esrs.symplicity.com/government/
+https://essentialconnection.huntington.com/OA_HTML/RF.jsp?function_id=1010219&amp;resp_id=23350&amp;resp_appl_id=800&amp;security_group_id=0&amp;lang_code=US&amp;params=W25pZupPjf3P-UC4Gq1oMYnXUHNmJ5Kmn8lfNI.2HhGNyAsDK6XWp634VpGa89mUARJ8F4HW842DK2Je2iPV-rQ1QECGsBHMPLdSfCCrGM0&amp;oas=4IEfxUchINXsC5DYHPVMIg..
+https://est3.webcashmgmt.com/sunwest/customer.asp
+https://esta.cbp.dhs.gov/esta/esta.html?_flowExecutionKey=_c70A26BF4-DF19-B722-FF83-977381210863_k1AD1988F-128A-EF6E-67F8-622E54B37F14
+https://estatements.sovereignbank.com
+https://estmtgd.fidelityifs.com/830003PositivePay
+https://esupport.fcc.gov/vpd-data/login!input.action
+https://etax.dor.ga.gov/inctax/corporate_tax_index_page.aspx
+https://etimebanker.bankofthewest.com/
+https://etraining.wto.org/
+https://eu.battle.net/
+https://eu.globalsign.com/company/press/100602-tbs-internet-partners-with-globalsign.html
+https://eureka.westmont.edu
+https://ev.globalsign.com/
+https://eval.webex.com/mw0306lb/mywebex/default.do?service=1&amp;siteurl=eval&amp;nomenu=true&amp;main_url=%2Fmc0805lb%2Fe.do%3Fsiteurl%3Deval%26AT%3DMI%26EventID%3D148247802%26UID%3D0%26Host%3Decec5d5b7d42434d%26RG%3D1%26FrameSet%3D2
+https://event.meetingstream.com/eventRegistration/EventLobbyServlet?target=registration.jsp&amp;eventid=201830&amp;sessionid=1&amp;key=2733920BC3D06C813CED0F9A53C8C817&amp;sourcepage=register
+https://event.on24.com/eventRegistration/EventLobbyServlet?target=registration.jsp&amp;eventid=158995&amp;sessionid=1&amp;key=6B91AA5A37DBE11D7D5F446B3DAB38FD&amp;partnerref=fn&amp;sourcepage=register
+https://events.amherst.edu/upcoming/
+https://events.deloitte-canada.12hna.com/preferences/
+https://events.umn.edu/
+https://everbankrewards.com/redeem.asp
+https://eview.fedexkinkos.com/
+https://evolve.elsevier.com/
+https://ewcm.pfizer.com/sites/publicom/_layouts/FormServer.aspx?XsnLocation=https://ewcm.pfizer.com/sites/publicom/FormServerTemplates/Transom5AAprod.xsn&amp;DefaultItemOpen=1
+https://eweb1.sba.gov/livemeeting/Dec09/
+https://ework.phila.gov/revenue/default.asp
+https://exams.spb.ca.gov/exams/myexam_start.cfm
+https://exchange.amherst.edu/
+https://exchange.memphistn.gov
+https://exchange.purdue.edu/
+https://exg4.exghost.com/
+https://eximonline.exim.gov/apps/bap
+https://exmail.oregonstate.edu/exchange/
+https://exp.naic.org/psp/fnpexp/NAICCUST/?cmd=login
+https://experiencechicago.uchicago.edu
+https://expresslane.apple.com/
+https://expresstradelc.regions.com/icc
+https://ext01.montgomerycountymd.gov/entp/s1p/esubpublic/newsubscriber.do
+https://extapps.ama-assn.org/doctorfinder/home.jsp
+https://extended-validation-ssl.thawte.com/
+https://external-apps.naic.org/insData/index.jsp
+https://extpga01.chubb.com/login
+https://extpws09.chubb.com/claims/eloss/index.html
+https://extra.herald.com/heraldsubscription/Index.aspx?promocode=WTV5
+https://extranet.enterasys.com/
+https://extranet.iaisweb.org
+https://extranet.iaisweb.org/index.cfm
+https://extranet.telin.nl/docuserver/dscgi/ds.py/Get/File-11272
+https://ezpauth.louislibraries.org/authen/ezproxylogin_louis_lsu.x?url=https://louis.hosts.atlas-sys.com/illiad/LUU/firsttime.html
+https://fa.keiseruniversity.edu/
+https://facultystaff.richmond.edu/~rdominey/301/local/Titrimetry_Methods.pdf
+https://fairfieldcountybank.com/contact_us/contact_us.php
+https://fairfieldcountybank.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://faithnomore.firebrandlive.com/checkout/
+https://familyhistory.hhs.gov/
+https://familyweekend.su.wfu.edu/home.php
+https://farmingtonbankct.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://fas.missouri.edu/fas/fas
+https://fastapp.usbank.com/fastapp/en_us/requests/checkingRates.jsp?src=homedropdown
+https://fastcu.com/
+https://favorites.live.com/quickadd.aspx?marklet=1&amp;mkt=en-us&amp;url=http://ecommerce-software-review.toptenreviews.com/index.html&amp;title=eCommerce Software Review 2010
+https://faw.phoenix.edu/
+https://fba-inbound.amazonaws.com/doc/2007-05-10/FBAInboundService.wsdl
+https://fcbnm.com/first/personal/
+https://fda.yorkcast.com/webcast/Catalog/pages/catalog.aspx?catalogId=6d6af3ca-6175-4c3c-869f-7f556bbede9e&amp;folderId=59671b09-1255-425e-a855-cc4f28d9f83a&amp;rootDynamicFolderId=6d6af3ca-6175-4c3c-869f-7f556bbede9e
+https://fdicsurvey.inquisiteasp.com/fdic/cgi-bin/qwebcorporate.dll?M58TRS
+https://federalreserve.myvurv.com/MAIN/careerportal/default.cfm?szUniqueCareerPortalID=ada5a6cb-b2f8-45aa-a867-e926929b2fdd&amp;szIsJobBoard=0
+https://fedgov.webex.com/fedgov/lsr.php?AT=pb&amp;SP=MC&amp;rID=15691877&amp;rKey=86ce4057229fcdae
+https://fedorahosted.org/liveusb-creator/
+https://fedoraproject.org/wiki/EPEL
+https://feedback.healthvault.com/default.aspx?productkey=healthvaultwebsite
+https://feedback.modwest.com
+https://fellowship.llnl.gov/
+https://fellowshipcouncil.org/directory/browse2.php
+https://ffce.webcashmgmt.com/wcmfd/wcmpw/CustomerLogin
+https://ffcw.webcashmgmt.com/wcmfd/wcmpw/CustomerLogin
+https://ffelpreports.floridastudentfinancialaid.org/FFELP/
+https://fidirect.citigroup.com/public/login.cgi?t=/
+https://fieldnet.massmutual.com/fldnet/public/index.html
+https://fighterace.ketsujin.com/
+https://fileandserve.lexisnexis.com
+https://fileonline.1040.com/default.aspx?did=98782
+https://filesanywhere.webex.com/
+https://filesv7.wcn.co.uk/company/tandf/internet.html
+https://fin.oaks.ohio.gov/psp/fnprd_internal/?cmd=login
+https://finaidonline.collegeboard.com/
+https://finance.duke.edu/resources/docs/financial_reports.pdf
+https://finance.siemens.com/financialservices/hq/en/newspress/Pages/newspress_1305512.aspx
+https://finance.tamu.edu/fdcg/changepassword/changepassword.asp
+https://financial.wellsfargo.com/canada/en/index.html
+https://financialaid.arizona.edu/
+https://financialaid.tamu.edu/cgs/
+https://financialcryptography.com/mt/archives/001201.html
+https://fireupsales.ilinc.com/join/xpstfsf
+https://firstapp2.firstmarkservices.com/citizensbank/consumer/
+https://firstassess.net/Education
+https://firstbankingcenter.ebanking-services.com/
+https://firstcitizensbank.mortgagewebcenter.com
+https://firstcitizensbank.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1&amp;bhcp=1
+https://firstorder.aspenhedge.com/sov420/FirstOrder/index.do
+https://fiserv.storedstatement.com/estatements/index.jsp?id=TheVillageBank
+https://fishhunt.dfw.wa.gov/
+https://fjallfoss.fcc.gov/oetcf/eas/reports/GenericSearch.cfm
+https://flagline.securesites.com/cgi-bin/ushop.pl?id=1tuvalu&amp;url=http://www.flagline.com/countries.html
+https://flair.dbf.state.fl.us/
+https://flattr.com/privacy
+https://flv19.securesites.net/secure/subsform.shtml
+https://fmx.cpa.state.tx.us/fmx/travel/textravel/trans/personal.php
+https://fnbcms5.lionbank.com/cashman/
+https://folio.iupui.edu
+https://fool.mint.com/login.event?action=S&amp;utm_source=pf_body&amp;utm_medium=image&amp;utm_content=mint_logo&amp;utm_campaign=motleyfool
+https://form.analog.com/Form_Pages/corporate/parts.aspx
+https://forms.customs.gov/customsrf/getformharness.aspformName=cf-434-print.xft&amp;preference=PDF
+https://forms.health.columbia.edu/content/accommodation-letter-request-form
+https://forms.house.gov/hoyer/webforms/zip_auth.shtm
+https://forms.house.gov/schock/contact-form.shtml
+https://forms.hush.com/f/help
+https://forms.netsuite.com/app/site/crm/externalcasepage.nl?compid=455843&formid=1&h=240bd5f3c2a77faf8f53
+https://forms.rapidssl.com/websurveys/servlet/ActionMultiplexer?Action_ID=ACT2000&amp;WSD_surveyInfoID=992&amp;WSD_mode=3&amp;toc=9K29J-992-05-26
+https://forms.us-cert.gov/report/
+https://forms.verisign.com/websurveys/servlet/ActionMultiplexer?Action_ID=ACT2000&amp;WSD_mode=3&amp;WSD_surveyInfoID=943&amp;toc=AAAAA-943-01-26&amp;brand=01&amp;country=26&amp;oldToc=w29810323919638016&amp;cid=47D9F8084F78B063
+https://forms.westpac.com.au/Forms/TranSav.nsf/f_tranSavAcc?OpenForm&amp;referrer=http%3A//www.westpac.com.au/HomepageAlternative/
+https://fortknox.nexitybank.com/PDI_PDI1962/pdi1962.ASP?Accounttype=UserApp44&amp;Path=D:\ITI\PDI\PDI1962\applications&amp;session=1&amp;homepage=http://www.nexitybank.com
+https://fortress.wa.gov/esd/worksource/Employment.aspx
+https://forum.flattr.com
+https://forum.flattr.com/showthread.php?tid=186
+https://forum.openwrt.org/viewtopic.php?id=15201
+https://forum.st.cs.uni-saarland.de
+https://forums.addons.mozilla.org/
+https://forums.comodo.com/index.php?action=register
+https://forums.keele.ac.uk
+https://forums.theplanet.com/index.php?s=8d9957b73e0740b3e1cfe85c8d3e0a7e&amp;
+https://forxa.mancomun.org/frs/?group_id=205
+https://foto.tntpost.nl/111/world-press-photo/
+https://fotos.vanouwerkerk.nl/index.php?albumID=127
+https://fpcweb.fpc.state.fl.us/
+https://fqdnofsharepointserver
+https://freeinternetpress.com/
+https://freemyfeed.com
+https://freemyfeed.com/
+https://freeriatools.adobe.com/flex/student.php
+https://freesslproxy.com/
+https://freshout.lighthouseapp.com/projects/14687/tickets/84-conflict-between-flutter-and-wp-e-commerce
+https://friendfeed.com/account/create
+https://frostmomentum.com/
+https://ftcpublic.commentworks.com/ftc/reverb/
+https://fulfillment.healthaffairs.org/?p=haj&amp;f=paid&amp;r=ind
+https://fundstransfer.cashedge.com/jsp/oao/relc/cashedge/oao_index.jsp?homeid=99992110
+https://futurefinance.wsj.com/index.php
+https://fw.ky.gov/license/olpsintro.aspx
+https://fx1.oanda.com/help/128bit.html
+https://fx2.oanda.com/mod_perl/fxcontest/fxcontest.pl
+https://fxtrade.oanda.ca/your_account/fxtrade/register/individual/beforeyoubegin
+https://fxtrade.oanda.com/forex_trading/fxgame/fxgame_beta.shtml
+https://g2b.marylandmva.com/fr19/login.aspx?deptid=21
+https://ga.hostgator.com/affiliate_create
+https://ga.issproxy.com/
+https://gaefile.dor.ga.gov/HelpLinks/welcome.htm
+https://garage.maemo.org/
+https://gateway.fundsxpress.com/ABMWI/features.htm
+https://gateway.purdue.edu
+https://gaucho1.isc.ucsb.edu/dr
+https://gauchospace.ucsb.edu/courses
+https://gbgm-umc.org/umw/corinthians/maps.stm
+https://gc21shop.inwent.org/Business-and-Communication/Financial-Management.html
+https://gctinvestorreporting.bnymellon.com/Home.jsp
+https://genmills.inno-360.com/briefs/?published=1
+https://genographic.nationalgeographic.com/genographic/atlas.html
+https://getcurrency.com/
+https://getopenid.com/
+https://getsatisfaction.com/technorati
+https://gilletts.com.au/checkout.php
+https://giselfservice.prudential.com/
+https://gisllc.lightport.com
+https://git.wiki.kernel.org/index.php/GitSurvey2010
+https://github.com/gknauss/buzzclock/
+https://give.liveunited.org/page/contribute/donatenow
+https://givejusttherightgift.com/Corporate_Gifts.php
+https://giving.hss.edu/NetCommunity/SSLPage.aspx?pid=226&amp;srcid=184
+https://giving.mit.edu/givenow/DisplayCat.dyn?catcode=CS&amp;subcatcode=SL&amp;subsubcatcode=DP
+https://glassfish.dev.java.net/
+https://global.etrade.com/e/t/intl/page?nav=3&subnav=4&screen=1&language=en&country=gl
+https://global1.onlinebank.com/vtg/dologinfihosted.htm?banknr=1299
+https://globaljobs-hertz.icims.com/jobs/intro
+https://globalsign.prontossl.com/
+https://gm.bankofny.com
+https://gm.bankofny.com/FX/Default.aspx
+https://gmail.google.com/support/bin/answer.py?answer=10350
+https://go.boardbooks.com/nbt/
+https://goes-app.cbp.dhs.gov/
+https://golearn.csd.disa.mil/
+https://goodsam.healthstatus.com
+https://goodsam.healthstatus.com/
+https://goodsam.org/flowers/index.php
+https://goodsam.vendormate.com
+https://google.com/adplanner/site_profile?s=markmail.org&amp;b=1
+https://gosystemrs.fasttax.com
+https://got-jdm.com/login.html
+https://gp2.newkirkone.com/millimancalcs/control.aspx?navdest=ToolboxSelfEmployedContribution&amp;format=3
+https://gpo.unisourcelink.com/login.html
+https://gradebook.collier.k12.fl.us/default.asp
+https://gradschool.ufl.edu/gims/gatorlink/presiteentry.asp
+https://grants-event.webex.com/grants-event/lsr.php?AT=pb&amp;SP=EC&amp;rID=1513097&amp;rKey=8ee8b38684268cfb
+https://grants.hrsa.gov/webExternal/FundingOppDetails.asp?FundingCycleId=E24F384A-7290-49D0-A393-EED7F542B618
+https://grants.ojp.usdoj.gov/
+https://graph.facebook.com/oauth/authorize...
+https://grasac.org/gks/gks_about.php
+https://gray.secure-host.com/dgl/host/host.html
+https://grc.com/x/ne.dll?bh0bkyd2
+https://greenhosting.mysslshop.com/page/products/Thawte
+https://grossreceiptstax.delaware.gov/grtpublic/
+https://grrlawyers.cwwebs.com:1025
+https://grumpy.uccs.edu/moodle
+https://grweb.ics.forth.gr/english/1617-B-2005.html
+https://gsbapps.stanford.edu/researchpapers/library/RP2060%20&%2083.pdf
+https://gsfc.myguarantyhome.org/
+https://gsfc.mylenderhome.org/
+https://gtc.dor.ga.gov
+https://gtc.dor.ga.gov/
+https://gtefcu.custhelp.com/cgi-bin/gtefcu.cfg/php/enduser/chat.php?p_sid=AlIZvWuj
+https://gtsemployer.mbafocus.com/HBS/Employers/Login.aspx?jprid=206
+https://gtwebapps.gatech.edu/cfeis/pportal/bin/ParentPortal.html
+https://guardian.co.tt/business/business/2010/09/18/nicholas-chair-new-cl-financial-board
+https://guest.cvent.com/EVENTS/Register/IdentityConfirmation.aspx?e=c6554982-632d-4218-8c77-636ee772baff
+https://gullfoss2.fcc.gov/coresWeb/publicHome.do
+https://gw.tn.gov/
+https://gwwebics.louisville.edu/gw/webacc
+https://gystc.kennesaw.edu/northeast
+https://gzs.org-on.net/
+https://h10078.www1.hp.com/cda/hpms/display/main/hpms_content.jsp?zn=bto&cp=1-10_4000_100__
+https://hacks.mozilla.org/2010/07/firefox-4-beta-1-is-here-whats-in-it-for-web-developers/
+https://handbook.unimelb.edu.au/view/2008/202-AF
+https://har2009.org/program/events/151.en.html
+https://harkin.senate.gov/c/index.cfm
+https://harmonia.dmv.state.ny.us/pirp/
+https://havedreams.ejoinme.org/MyPages/HaveDreamsChicagoMarathon2010DreamTeam/tabid/212830/Default.aspx
+https://hazards.fema.gov/femaportal/kmz/FEMA_NFHL_v2.4.kmz
+https://hclion.hernandocounty.us/bldsys/
+https://health-first.patientcompass.com/hc/sp/healthfirst/blindPayment
+https://health.ucsd.edu/women/child/events-pre/online-childbirth-education.htm
+https://healthinfo.health-first.org/security/formslogin.asp?/MyPersonalHealth/EncryptDefault.asp?FROM=Personalization
+https://healthletter.mayoclinic.com/NL/print/landing.cfm?trkid=20909S143519960
+https://healthmanager.mayoclinic.com/default.aspx
+https://healthri.mylicense.com/Verification/
+https://healthview.dukehealth.org/wps/portal/makeAppointments
+https://helix-server.helixcommunity.org/
+https://helixcommunity.org/
+https://heller.house.gov/Contact/
+https://help.cbp.gov/app/answers/detail/a_id/450/~/container-security-initiative-(csi),-operation-safe-commerce-program-(osc)
+https://help.cse.ucdavis.edu
+https://help.forge.funambol.org/
+https://help.hushmail.com/forums/222841-the-basics
+https://help.ubuntu.com/community/AspireOne
+https://help.ubuntu.com/community/BasicChroot
+https://help.ubuntu.com/community/IptablesHowTo
+https://help.ubuntu.com/community/ReportingBugs
+https://help.us.army.mil/cgi-bin/akohd.cfg/php/enduser/std_adp.php?p_faqid=264&amp;p_created=1265301652&amp;p_sid=8NmO_qXj&amp;p_accessibility=0&amp;p_redirect=&amp;p_lva=46&amp;p_sp=cF9zcmNoPTEmcF9zb3J0X2J5PSZwX2dyaWRzb3J0PSZwX3Jvd19jbnQ9MSwxJnBfcHJvZHM9MCZwX2NhdHM9JnBfcHY9JnBfY
+https://helpdesk.egnyte.com/categories/567-community-discussions
+https://helpdesk.ma.rhul.ac.uk/
+https://hermes.opensuse.org/feeds/25549.rdf
+https://hfcarweb-ext.health-first.org/thinclient-ext/home.asp
+https://hfcis.cdph.ca.gov/default.aspx
+https://hfradpacs1.health-first.org/
+https://hfvo1-auth.health-first.org/vo/servlet/portal?render=on
+https://hfwa.centraltechnology.net/iowadnr/harvest/mainHarvest.do
+https://hinds.ms.ezgov.com/ezproperty/index.jsp
+https://hks-harvard-csm.symplicity.com/calendar/index.php?ss=allevents&amp;_ksl=1&amp;s=&amp;cck=1&amp;au=&amp;ck=
+https://hls.gehealthcare.com/content/gehc/unfiltered/docs/guides/compliance_quickstartguide.pdf
+https://hoesiweb.scif.com/SelfRegistration/signUp.do?type=MTAxNTY6dHlwZS5lbWFpbDoxMA==&amp;orgGroupType=MTA2MzQ6UE9MSUNZSE9MREVSOjEy
+https://holdmail.usps.com
+https://home.americanexpress.com/home/open.shtml
+https://home.comcast.net/~lthompson221/Splusdiscrete2.pdf
+https://home.dcma.mil
+https://home.dcma.mil/dcma-pi/customer.htm
+https://home.eastmancu.org/
+https://home.eease.adp.com/recruit/?id=468575
+https://home.eease.com/recruit/?id=525396
+https://home.ingdirect.com
+https://home.ingdirect.com/index.html
+https://home.modernhealthcare.com/clickshare/authenticateUserSubscription.do?CSProduct=modernhealthcare&amp;CSAuthReq=1:473393548506563:AID|IDAID=20100607/NEWS/100609969|ID=:556AC29EE701F6E2E787F31E792282A0&amp;AID=20100607/NEWS/100609969&amp;title=HITS%20Brief1%20-%20Consumer-privacy%20groups%20petition%20Congress&amp;ID=&amp;CSTargetURL=http%3A%2F%2Fwww.modernhealthcare.com%2Fapps%2Fpbcs.dll%2Flogin%3FAssignSessionID%3D473393548506563%26AID%3D20100607%2FNEWS%2F100609969
+https://home.nashuatelegraph.com/clickshare/authenticateUserSubscription.do?CSProduct=nashua&amp;CSTargetURL=http://telegraphneighbors.com
+https://home2.pennmutual.com/csc/Challenge.html?type=Client&amp;intPage=https://home2.pennmutual.com/csc/Challenge.html&amp;cms_rx_site=PML_Public&amp;layoutid=3&amp;contentType=1
+https://homebank.psecu.com/activation/activation.aspx
+https://homebank.sactocu.org/UA2004/faq-mfa.htm#pp7
+https://homebuying.searchcompareapply.co.uk/mortgages/Default.aspx?alvs=461828150
+https://homefederalbank.mortgagewebcenter.com/
+https://homeworkhelp.ilc.org/
+https://honor.icsalabs.com/pipermail/firewall-wizards/2006-October/019956.html
+https://host1.medcohealth.com/medco/consumer/assistive.jsp?BV_SessionID=@@@@0776091176.1285526296-mm531596473523@@@@&amp;BV_EngineID=ccciadeliidkhghcfklcgffdghfdfkh.0&amp;loc=GNAVHDR
+https://host15.webserver1010.com/latin-host/order_form.htm
+https://host15.webserveralpha.com/latin-host/order_form.htm
+https://host2.spiderweave.com/strangemusicinc/mm5/merchant.mvc?Session_ID=a8eb255d8e53a339abd38f2e99727a87&Screen=OINF&Store_Code=SMTNS
+https://host5.ebusiness32.com/turbanpluswholesale/Merchant5/merchant.mvc?Session_ID=fda2e6d7152964cafcebc7e44cac5e9b&Screen=OINF&Store_Code=TPW
+https://host8.webnethost.net/mountainguides/Merchant2/merchant.mvc?Session_ID=6e6bbb174a44318bc59c9408e44f8eaf&Screen=OINF&Store_Code=IMGS
+https://hostedjobs.openhire.com/epostings/jobs/submit.cfm?fuseaction=careeropps&amp;company_id=15948&amp;version=1
+https://hosting.intermedia.net/support/kb/
+https://hostingconnection.godaddy.com/Home.aspx
+https://hostingmanager.secureserver.net/
+https://hotjobs.login.yahoo.com/login.php
+https://hps.org/membersonly/
+https://hr.eas.commerce.gov/HANS/RSVP/RSVPLogin.aspx
+https://hraccess.tsa.dhs.gov/
+https://hrapps.fsu.edu/class_specs_public/index.cfm?fuseaction=view.detail&amp;pp=USPS2&amp;JOB_CLASS_CODE=1012
+https://hrcp.transunion.com/
+https://hrms.highmark.com/psp/recruit/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL/
+https://hronline.newcastle.edu.au/pls/wssprod/uonerecruit.vac_details?pi_vacancy_ref=1336
+https://hrss.external.lmco.com/hrss/benefits/site/applicants/nb/regionSelect.html
+https://hs67.order-vault.net/berrypatchusa.com/cgi-bin/mivavm/mm5/merchant.mvc?Session_ID=7d4656881606d8a14ab02dbc4c5ed662&Screen=OINF&Store_Code=B
+https://hseep.dhs.gov/
+https://hserv.washington.edu/courses
+https://https://www.rbccm.com/privatebanksolutions/
+https://hub.ihosturdomain.com:2083
+https://hub.ihosturdomain.com:2096
+https://hvccapp.hvcc.edu/pls/PROD/bwskalog.P_DispLoginNon
+https://hypersonic.bluecoat.com/login
+https://i-site-state.naic.org/
+https://i-site.naic.org/
+https://i7lp.integral7.com/durango/do/login?ownername=cisco&amp;channel=cisco&amp;basechannel=integral7
+https://iagentpilot.explorer-insurance.com/
+https://iapps.courts.state.ny.us/fbem/mainframe.html
+https://ias.itap.purdue.edu/gradsch/PROGRAM_INSTRUCTIONS/program_list.html
+https://iasext.wesleyan.edu/directory_public/f?p=100:3:
+https://ib.nab.com.au/nabib/index.jsp
+https://ibank.hepsiian.com/ipdxcv/index.jsf?NBT-PROD
+https://ibank.horiconbank.com
+https://ibank.pcs-sd.net/onlinebanking/login.r?t-bank=114915803
+https://ibanking.summitbankdirect.com
+https://ibs.secure-banking.com/cgi-bin/hbproxy.exe/1114/signon
+https://ibs5.secure-banking.com/ibspics/1219/forms/enrollment/enrollment_nbt.html
+https://icapture.regions.com/
+https://icelive.theice.com/ice_files/default.htm
+https://icfirstaccess.health-first.org/portal/index.jsp
+https://icg.citi.com/
+https://ichfarv7web1.health-first.org/arsys/home
+https://ichfctxweb1.health-first.org/
+https://icintranet.health-first.org/physicians
+https://icomp.wvinsurance.gov/iaims/Secure/Login.aspx
+https://icpshrapp.health-first.org/selfservice/signon.html
+https://icrs.informe.org/nei-sos-icrs/ICRS?MainPage
+https://icsafetyzone.health-first.org/hf/elogin.aspx
+https://icwww.health-first.org/applications/remote_auth/patientcompassauth.cfm
+https://id2.s.nfl.com/fans/register?returnTo=
+https://id3410.securedata.net/milestoneproducts/Merchant2/merchant.mvc?Session_ID=5575aeb219fc2772811b52b60eb7df6d&Screen=OINF&Store_Code=MSP1
+https://idals.iowa.gov/FARMS/
+https://idcenter.services.optimum.net/MyAccountStatic
+https://ideas.utexas.edu
+https://ideas.utexas.edu/
+https://identi.ca/main/register
+https://identityprotector.sovereignbank.com/sovereignidpro/
+https://idnforums.intuit.com/messageview.aspx?catid=50&threadid=11829
+https://idoc.collegeboard.com/idoc/index.jsp
+https://idp.godaddy.com/shopper_new.aspx?ci=10530&amp;spkey=GDSWNET-CORPWEB160
+https://idp.securepaynet.net/shopper_new.aspx?isc=VTZ_B&amp;ci=10530&amp;prog_id=cyberspacehq&amp;spkey=SPSWNET-CORPWEB140
+https://idprotect.verisign.com
+https://idprotect.verisign.com/
+https://ifap.ed.gov
+https://ifap.ed.gov/dlsguides/2008DLSchGuide.html
+https://ig5.i-grasp.com/fe/tpl_universityofhull01.asp
+https://iirsubmission.pfizer.com/
+https://ilearn.warnerpacific.edu
+https://ill.ulib.iupui.edu/ILLiad/IUP/ULArticleDeliveryService.pdf
+https://imagelink.fult.com/fultonilb
+https://images.equator.com/images/pressreleases/20091201-REOInsider.pdf
+https://images.hertz.com/pdfs/green_initiatives_2010.pdf
+https://imo.im/
+https://implicit.harvard.edu/implicit/demo/
+https://improv.health.wyo.gov/complaintreport.aspx
+https://independentbank.ebanking-services.com/nubi/signin.aspx
+https://indianalocalgovreform.iu.edu/contactform/Default.aspx
+https://indiavisa.travisaoutsourcing.com/
+https://indinero.com/
+https://info.ahrq.gov/cgi-bin/ahrq.cfg/php/enduser/std_alp.php
+https://info.kingcounty.gov/elections/mailballottracking.aspx
+https://info.westpac.com.au/lifetimeprotect/?wbc-vanity=www.westpac.com.au/lifetimeprotect
+https://infocomp.fluidhosting.com/ssl.audioenglish.net/new_account.php
+https://infopass.uscis.gov/info_sp.php
+https://inform.bankofny.com
+https://inform.bnymellon.com/TACS-AG/processRedirectUid.do?successRedirect=https://inform.bnymellon.com/
+https://informalclasses.org/
+https://informationpolicy.iu.edu
+https://infosec.navy.mil
+https://infotree.library.ohiou.edu/scripts/login.html
+https://infrastructure.drupal.org/drupal.org-style-guide/prototype/modules_detail.html
+https://ingrfsb.com/donate/
+https://inlportal.inl.gov/portal/server.pt?open=514&objID=1269&mode=2&featurestory=DA_549448
+https://inlportal.inl.gov/portal/server.pt?open=514&objID=1555&mode=2&featurestory=DA_144483
+https://innovation.ed.gov/
+https://innovue2.innovestsystems.com/WestCoastTrust/
+https://inq.applyyourself.com/?ID=harvardsph&amp;pid=465&amp;Source=ADMISSIONSPORTAL
+https://inquiries.redhat.com/go/redhat/satellite-best-experience?sc_cid=70160000000SoJ1AAK
+https://insclientaccess.bbandt.com/ins/clientaccess/custsignon.asp
+https://inside.sfsu.edu/
+https://insight.solucient.com/clinical/login.html
+https://insightfinancialcu.com/
+https://institute.reasons.org
+https://institutional.americancentury.com/institutional/index.jsp
+https://institutional.vanguard.com/
+https://insurance.illinois.gov/applications/pension/
+https://insurance.ky.gov/eservices/default.aspx
+https://insurance.libertymutual.com/quote/displayLoginNewQuote.do?openForgotQuoteModal=true
+https://insurance.mo.gov/consumer/complaints/eform.htm
+https://insured.stateauto.com/claims/default.asp
+https://intacct.coursehost.com/Engine/Intranets/Course/PrivateCourses.asp?LID=1&ky=d_BPDiQVRgHzDiPRUmf_DgHzkr7Omqvz
+https://integrabank.enterprisebanker.com/wcmfd/wcmpw/CustomerLogin
+https://interactive.marylandtaxes.com/individuals/unclaim/default.aspx
+https://interactive.web.insurance.ca.gov/contactCSD/ContactUs.jsp
+https://interland3.donorperfect.net/weblink/weblink.aspx?name=sdfb&amp;id=1
+https://intermountain.net/portal/site/mdvsi/
+https://internships.llnl.gov
+https://internships.llnl.gov/lsp/
+https://intranet.entrust.com
+https://intranet.ics.uci.edu/index.phtml/?topic=%3CBIG%3EPlease+login%21%3C%2FBIG%3E%0A&amp;state__=wcapp.help%2F%2F1285525535%2F%2F%2F%2F%2F%26ac6800c13eb14a90a0d57a0f68a5cbd6
+https://intranet.rasmussen.edu/horde/imp/login.php?Horde=098ab8bda453c5aa9fe7f8ab53407e25
+https://intranet.terry.uga.edu
+https://intranet.terry.uga.edu/
+https://intranet.tma.osd.mil/Home/
+https://intraweb.newcastle.edu.au/oda/App/IasaQualifications.aspx?ReferringSystem=IASA
+https://inversor.sba.com.ar/?198
+https://invest.etrade.com.au/Affiliates/LinkRedirect.aspx?SOURCE=hsbc1&amp;ACTION=hsbchome
+https://investing.schwab.com/trading/start?orig=chome&amp;pos=topnav&amp;ebmk=acq
+https://investor.etrade.com/annuals.cfm
+https://investor.verisign.com?tid=info-for
+https://investsmarket.com
+https://iowaelectrical.gov/index.php/pages/home
+https://iowaonline.state.ia.us/dompvs/default.aspx
+https://ipa-mn-web.ipa.go.jp/b/0001/fu/0/input_email.jsp
+https://ipa-rcpt.ipa.go.jp/event_entry/index/4/
+https://ipath.com/Merchant2/merchant.mvc?Screen=CTGY&Category_Code=hemp
+https://ipayables.regions.com
+https://ipboys.com
+https://ipet.wes.army.mil/
+https://ipo.llnl.gov/
+https://ipoengine.adwebtech.com/new/ITAct.asp
+https://iportal.fldfs.com/ifile/default.asp
+https://ipp.developer.intuit.com/sdk/qbms/Documentation/Merchant_Service_Center
+https://iprc.mckesson.com/berlexweborder/appSecBerlexLoginReq.jsp
+https://ipro.americancentury.com/ipro/index.jsp
+https://ipxp.healthalliance.org/content/applicationintro/
+https://iquote.insurix.com/
+https://iris.sovereignbank.com/wcmfd/wcmpw/CustomerLogin
+https://iris.va.gov/scripts/iris.cfg/php.exe/enduser/std_adp.php?p_faqid=380
+https://isc.sans.edu/myisc.html
+https://isc.sans.org/diary.html?storyid=7333
+https://isd-chatterbox.com/Ott1
+https://isis.naic.org/publiclyrated/SVOSecurities.do
+https://isohunt.com/
+https://isp.housingauthority.gov.hk/ispWeb/?locale=en_US
+https://issues.apache.org/bugzilla/show_bug.cgi?id=48843
+https://issues.apache.org/jira/browse/RAMPART-209
+https://issues.asterisk.org/roadmap_page.php
+https://ist-staff.berkeley.edu/mvp
+https://ist.uwaterloo.ca/projects/desktop_rollover/ordering_process/metafore/
+https://itrain.cityofmadison.com/fditrain
+https://iua.americancentury.com/iua/index.jsp
+https://ivhuonline.org/moodle
+https://iwc.uwo.ca/
+https://iwr.hillsboroughcounty.org/hcwdweb/
+https://iwsolve.partners.extranet.microsoft.com/sdps/
+https://jadedpixel.lighthouseapp.com/projects/11599/tickets/74-patch-paymentech-orbital-gateway
+https://jas.travelers.com/get-a-quote-now/route.html?sponsor=default&amp;path=request&amp;lob=AUTO
+https://java3d.dev.java.net/
+https://javacc.dev.java.net/
+https://jboss.webex.com/jboss/onstage/g.php?AT=VR&amp;RecordingID=33678602&amp;recordKey=E77D73F5A3446E8752E329F6439C8D987E78CAE1EA1BD200694D6E16EADCE927
+https://jc.activeoutdoorsolutions.com/mn_customer/
+https://jccsmoodle.sdcoe.net
+https://jcecash.arl-tsg.com/bri-comm/
+https://jdk-distros.dev.java.net/
+https://je-s.rcuk.ac.uk/JESHANDBOOK/jesHelp.aspx?m=s&s=711
+https://jersey.dev.java.net/nonav/documentation/latest/user-guide.html
+https://jha.loanspq.com/consumer/login/default.aspx?LenderID=76863fa6ad58475dbc7a3c97f339d619
+https://jira.jboss.org/browse/ORG-519%3Bjsessionid=7C060A44CAC4AD0D81285E9116A5D0E0?page=com.atlassian.jira.plugin.system.issuetabpanels%253Achangehistory-tabpanel
+https://jira.secondlife.com/
+https://jira.skype.com/browse/SCW?
+https://jmesi.army.mil/
+https://jna.dev.java.net/
+https://jobcenterofwisconsin.com/
+https://jobs-aerojet.icims.com/jobs/intro?sn=aerojet.jobs
+https://jobs-hersheys.icims.com/
+https://jobs-middlesexsavings.icims.com/jobs/intro
+https://jobs.agencies.virginia.gov/
+https://jobs.brassring.com/EN/ASP/TG/cim_home.asp?sec=1&partnerid=281&siteid=50
+https://jobs.carleton.edu/postings/261
+https://jobs.commerceinsurance.com/
+https://jobs.fsu.edu/Content/OmniShell.cfm
+https://jobs.gaijinpot.com/
+https://jobs.hrd.state.ma.us/
+https://jobs.lexingtonky.gov/
+https://jobs.llnl.gov
+https://jobs.llnl.gov/prod_index.html
+https://jobs.mapfreusa.com/
+https://jobs.mt.gov/jobs/login.seek
+https://jobs.myflorida.com/joblist.html
+https://jobs.okstate.edu
+https://jobs.qualcomm.com/public/jobSearch.xhtml
+https://jobs.ubs.com/1033/asp/tg/cim_advsearch.asp?partnerid=25008&amp;siteid=5012
+https://jobs.ucop.edu
+https://jobs.ufl.edu/applicants/jsp/shared/search/Search_css.jsp
+https://jobs.wm.edu
+https://jobs2.mednet.ucla.edu/css_external/CSSPage_Welcome.ASP
+https://jobsearch.siemens.biz/career?company=Siemens
+https://joe262.com/2010/06/11/comodo-cut-it-out-already/
+https://jogl.dev.java.net/
+https://johnsonbank.bankreports.net/usr/env1/html/portal/isc_login.cgi
+https://johnsonins.secureclient.net/Home/Welcome/tabid/131411/Default.aspx?returnurl=%2fDefault.aspx
+https://join.gtefcu.org/
+https://join.secondlife.com?lang=en-US
+https://journaltimes-dot-com.bloxcms.com/app/subscriber_services/new_subscription/
+https://justice.oregon.gov/unclaimed/index.aspx
+https://jxta.dev.java.net/
+https://jyskebank.com/wps/wcm/connect/78afab804ea95a95bc2abc446fa0a92d/107500_ANBEFALINGSLISTE.pdf?MOD=AJPERES
+https://k2.secure-banking.com/secured/11001199/1122/MasterCardApplication.htm
+https://karelia.fogbugz.com/default.asp?sandvox.2.1918.1
+https://kb.iu.edu/data/afol.html
+https://kc.mcafee.com/corporate/index?page=content&id=kb50602
+https://kcextranet.kingcounty.gov/psp/SVCP1/SELFSERVICE/HRMS/?cmd=login
+https://kentucky-edit.ky.gov/helpcenter/Pages/homeworkhelp.aspx
+https://kepler-project.org/
+https://keyserver.pgp.com/vkd/DownloadKey.event?keyid=0xBE30B1F1771BEE4B
+https://keyserver2.pgp.com/vkd/SubmitSearch.event?SearchCriteria=krebsonsecurity%40gmail.com
+https://kiosk.per-se.com/start/login.jsp
+https://knol.google.com/k/-/-/3jhi1zdzvxj3f/9
+https://knowledge.fdnet.com/
+https://knowledge.geotrust.com/support/knowledge-base/index?page=answers
+https://knowledge.opentext.com/
+https://knowledge.rapidssl.com/support/ssl-certificate-support/index.html
+https://knowledge.verisign.com.au/support/ssl-certificates-support/index.html
+https://knowledge.verisign.com.hk/support/ssl-certificates-support/index.html
+https://knowledge.verisign.com.sg/support/ssl-certificates-support/index.html
+https://knowledge.verisign.com.tw/support/ssl-certificates-support/index.html
+https://knowledge.verisign.com/support/ssl-certificates-support/index.html
+https://knowledgebase-enterasys.talismaonline.com/
+https://knowledgecenter.kennametal.com
+https://kr.globalsign.com/dc/request01.jsp
+https://ks.train.org/DesktopShell.aspx
+https://ksgnotes1.harvard.edu/login.nsf/Redirect?OpenAgent
+https://kshealth.kdhe.state.ks.us/VolunteerRegistry
+https://ksn.faa.gov/km/teams/two/default.aspx
+https://labor.tennesseeanytime.org/labor/
+https://lakecity2.caaweb.com
+https://lakecitybank.automatedfinancial.com/self_enrollment.html
+https://lakecitybank.webcashmgmt.com/wcmfd/wcmpw/CustomerLogin
+https://lakegovprod2.msha.gov/MIIN/MIINLookup.aspx
+https://land.secondlife.com/en-US/developed-property.php
+https://larch.kingcounty.gov:17000/HPRO90/signon.html
+https://larcmoodle.sdsu.edu
+https://lasers.llnl.gov
+https://lasers.llnl.gov/
+https://lastpass.com/
+https://launchpad.net/bugs/330814
+https://launchpad.net/bugs/58487
+https://lawmail1.stanford.edu/
+https://lawschool.westlaw.com/shared/signon09.asp?path=%2fDesktopDefault.aspx
+https://lawyers.justia.com/signup?ref=cornell
+https://lcaus.livesitehost.com/pages/book_consulting_magazine
+https://ldr.executiveboard.com/Public/PDFs/HR_Practice_MeetingSeriesNewsRelease-Final.pdf
+https://ldrd.llnl.gov/
+https://leahfraser.wordpress.com/
+https://learning.avidonline.org
+https://learning.healthcarefirst.com/learning
+https://learning.mkblack.com/moodle
+https://learning.riverdale.edu
+https://learningcenter.iil.com/Saba/Web/Main/goto/Catalog
+https://learningnetwork.cisco.com/people/bmerchan
+https://lecture-feedback.cl.cam.ac.uk/feedback
+https://leebank.org/pbi_pbi1961/PBi1961.asp?Rt=211870870&amp;LogonBy=Connect3&amp;PrmAccess=Account&amp;enroll=true
+https://legacy.mail.ufl.edu/OWA/redir.aspx?C=37378a78526149a3875d028d34451529&amp;URL=http%3a%2f%2fwww.oup.com%2fus%2fcatalog%2fgeneral%2fsubject%2fPolitics%2fAmericanPolitics%2fForeignDefensePolicy%2f%3fview%3dusa%26ci%3d9780195394481
+https://legal.qualcomm.com/
+https://leibniz.stanford.edu/friends/
+https://leo.aithent.com/
+https://lescot.webex.com/mw0306lb/mywebex/default.do?siteurl=lescot
+https://lettreenligne.laposte.fr/lpl/accueil.action
+https://lever2000smalltouches.onlinepromo.com/sweeps_index.aspx
+https://lgusd.eschoolsolutions.com/logOnInitAction.do
+https://lhs.cyberu.com/client/lhs/default.aspx
+https://lib.stanford.edu/miller-library-marine-biology
+https://libertybankiowa.imagebankingsystem.com/ilockboxnet/
+https://libpac.leegov.com/polaris
+https://library-ext.llnl.gov/
+https://library.newcastle.edu.au/patroninfo~S0/
+https://license.l1idbiometrics.com
+https://licensing.azboc.gov/datamart/mainMenu.do;jsessionid=SGKHGsi3eaNQK+q_PDTg_XifiEGF+5Fsw8sHMO+lAXM=
+https://life.myaccount.pacificlife.com
+https://life.myaccount.pacificlife.com/
+https://link1.securebanksolutions.com/chat2.php?im=general@richwoodbank.com&amp;group=044106588&amp;brand=044106588
+https://list.auckland.ac.nz/mailman/listinfo/thawte-renew
+https://list.nih.gov/archives/health-it.html
+https://list.xs4all.nl/mailman/listinfo/volunteersteam-whatthehack
+https://lists.cacert.org/wws/arc/cacert/2010-05/msg00002.html
+https://lists.cs.columbia.edu/cucslists/listinfo/colloquium
+https://lists.epa.gov/read/all_forums/
+https://lists.internet2.edu/sympa/arc/shibboleth-dev/2002-07/msg00059.html
+https://lists.launchpad.net/multi-touch-dev/msg00218.html
+https://lists.mozilla.org/listinfo/announce
+https://lists.owasp.org/pipermail/owasp-belgium/2005-September/000070.html
+https://lists.purdue.edu/
+https://lists.samba.org/mailman/listinfo/samba-technical
+https://lists.secondlife.com/cgi-bin/mailman/listinfo/sldev-commits
+https://lists.sourceforge.net/lists/listinfo/exslfo-discussion
+https://lists.uaf.edu:8025/mailman/listinfo/supportua-l
+https://lists.ubuntu.com/mailman/listinfo/ubuntu-news
+https://lists.wikimedia.org/mailman/listinfo/daily-article-l
+https://listserv.cybertrust.com/pipermail/ticsa-info/2005-October/000028.html
+https://listserv.heanet.ie/cgi-bin/wa?A0=COMMERCE
+https://listserv.icsalabs.com/pipermail/nomenclature/2006-May/000004.html
+https://listserv.uc.edu/cgi-bin/wa.exe?SUBED1=TAXPROF&amp;A=1
+https://listservpublic.med.nyu.edu/scripts/wa.exe?SUBED1=MARL&amp;A=1
+https://litigator.lexisnexis.com/Litigator.aspx
+https://livechat.boldchat.com/aid/213708960246032234/bc.chat?cwdid=1510987354470768194&amp;vr=&amp;vn=&amp;vi=wtc&amp;ve=&amp;vp=&amp;iq=
+https://liveols.rcog.org.uk/membersarea/multievents/displayEvent.asp?Type=Full&amp;Code=xke
+https://lms.neumont.edu
+https://lms.wou.edu.my
+https://lms1.inovatech.edu/moodle
+https://loanconsolidation.ed.gov/loancalc/servlet/Controller?controller_task=startCalculator
+https://loans.agfcredit.com/CustomerService/Payment?Command=AccountInformation
+https://loans.pyramaxbank.com
+https://loans.pyramaxbank.com/
+https://loans.southside.com
+https://loans.southside.com/calculator/calculator.asp
+https://loans.utep.edu/
+https://loansandlines.usbank.com/loanslines/applyNow.do?methodToCall=display&amp;APPL_PROD_ID=59&amp;src=homedropdown
+https://localhost/TestSite/default.aspx
+https://localtechwire.com/business/local_tech_wire/news/blogpost/8272339/
+https://locator.aarp.org/vmis/sites/tax_aide_locator.jsp
+https://locator.ice.gov
+https://lockbox.prosperitybanktx.com/DocumentArchive/DocumentEnquiry
+https://lockbox.therightbank.com/CustomerService/Welcome.aspx?ReturnUrl=%2fCustomerService%2fMainFrame.aspx
+https://logicmail.org/ota
+https://login.allstate.com/auth/login
+https://login.autodns.com/
+https://login.bankanytime.com/login/
+https://login.coderedweb.com/codereddataentry/Default.aspx?groupid=k41AvfshY1V4Jn4iuXtbbg==
+https://login.liboff.ohsu.edu/login?url=http://www.accessmedicine.com/home.aspx
+https://login.live.com/login.srf?wa=wsignin1.0&amp;rpsnv=11&amp;ct=1285537883&amp;rver=6.0.5286.0&amp;wp=MBI_SSL&amp;wreply=https:%2F%2Fconnect.microsoft.com%2Fdashboard%2F&amp;lc=1033&amp;id=64416
+https://login.metafilter.com/
+https://login.pilothsa.com/login.aspx?4X/90cwOlL4EEEiuYjqGMuGc9F5GlbBlA9YEEMoKTyKSeEv6i89qj9j29M8
+https://login.quicken.com/login?dest=http://investing.quicken.com/Index.asp
+https://login.salesforce.com/
+https://login.silverlight.net/login/signin.aspx?returnurl=http://forums.silverlight.net/default.aspx
+https://login.skype.com/account/signup-form
+https://login.solucient.com/accountadminpublic/login/login.aspx?returnurl=https://my.solucient.com/
+https://login.yahoo.com?.done=http%3A%2F%2Fanswers.yahoo.com&amp;.src=knowsrch&amp;.intl=us
+https://longandfosterins.agentinsure.com/
+https://longtermcare.genworth.com/SimpleEngine/private/loginAARP.do
+https://louis.hosts.atlas-sys.com/illiad/LUU/logon.html
+https://louisville.affinitycircles.com/louisville/auth/login
+https://louisville.edu/financialaid/
+https://louisvilleky.t2hosted.com/cit/index.aspx
+https://lpdaac.usgs.gov/
+https://lrp.webex.com/mw0306lb/mywebex/default.do?nomenu=true&amp;siteurl=lrp&amp;service=6&amp;main_url=https%3A%2F%2Flrp.webex.com%2Fec0605lb%2Feventcenter%2Fevent%2FeventAction.do%3FtheAction%3Ddetail%26confViewID%3D693329751%26siteurl%3Dlrp%26%26%26
+https://lss.at.ufl.edu
+https://lss.at.ufl.edu/
+https://lsu.louislibraries.org:5203/uhtbin/cgisirsi/0/0/0/38/X/POWER_SEARCH
+https://lty.s.upromise.com/8368.do
+https://luxsci.com/perl/member/login.pl?settheme=1
+https://m.diginsite.com/republicbank/
+https://m.filesanywhere.com
+https://m.filesanywhere.com/
+https://m.gtefcu.org
+https://m.hush.com/
+https://m.my100bank.com/locations
+https://m1.melloninvestor.com/mellonone/login.jsp
+https://m2proxy.atlassian.com/repository/public
+https://m360.mnspe.org/event.aspx?eventID=20160
+https://macosx.com/order/vip/index.html
+https://mail.dunn-carney.com/exchweb/bin/redir.asp?URL=http://www.legalnewsline.com/news/204642-attorney-scruggs-will-face-uphill-very-public-battle
+https://mail.google.com
+https://mail.google.com/mail/?shva=1#apps/in%3Ainbox+in%3Aimportant
+https://mail.haywoodnc.net/owa
+https://mail.highlandcc.edu/owa/auth/logon.aspx?url=https://mail.highlandcc.edu/owa/&amp;reason=0
+https://mail.hynescommunications.com/owa/redir.aspx?C=13ea2e962a3748179c653febc9899841&amp;URL=http%3A%2F%2Fwww.nytimes.com%2Fgwire%2F2010%2F05%2F14%2F14greenwire-biomass-industry-sees-chilling-message-in-epas-60072.html
+https://mail.internet2.edu/wws/arc/i2-news/2010-02/msg00002.html
+https://mail.montgomerycountymd.gov/exchweb/bin/redir.asp?URL=http://www.montgomerycountymd.gov/apps/CFWworkshop/index.cfm
+https://mail.msnbc.com/owa/redir.aspx?C=bcc4246611e246d684e515ae54312f92&amp;URL=http://msnbc.com
+https://mail.okstate.edu
+https://mail.smugmug.net/mailman/listinfo
+https://mail.thefacebook.com/owa/redir.aspx?C=13556ad3b53c49fdbd850d13d9758130&amp;URL=http%3a%2f%2fwww.causes.com%2fnewark
+https://mail.umn.edu/
+https://mail.uoguelph.ca/
+https://mail.wvstateu.edu/
+https://mailadmin.operationenterprise.com/users/
+https://mailman.stanford.edu/mailman/listinfo/liberationtech
+https://mailorderhawaii.com/mm5/merchant.mvc?Screen=OINF
+https://mailservices.uwaterloo.ca/webmail/
+https://manage.dynect.net/
+https://manage.ixwebhosting.com/
+https://manage.slicehost.com/customers/new?referrer=f1fe08ea5984afe497b2a8a009ad1ad2
+https://manager.paypal.com/
+https://mandtbank.spatialpoint.com/PrxInput.aspx
+https://marcom.broadridge.com/iso_ordering/login.html
+https://marketintelligence.lexisnexis.com/login/login.aspx?ReturnUrl=%2fhome.aspx
+https://markets.independentagent.com/bigimarkets/eProfile/ProfileLogin.jsp
+https://maryland.geosolinc.com/
+https://maryland.mylicense.com/
+https://math.webwork.rochester.edu/moodle
+https://maven-repository.dev.java.net/
+https://maxsource.maxor.com/dhha_refill.aspx
+https://mc.manuscriptcentral.com/cs-ieee
+https://mcgccxag.co.mchenry.il.us/vpn/index.html
+https://mckesson.subscribenet.com/
+https://mcmoodle.madison.k12.al.us
+https://mcp.microsoft.com/authenticate/validatemcp.aspx
+https://mcsdmv.ne.gov/mcsmain.htm
+https://mcvr.mo.gov/elections/voterlookup/
+https://mdbnc.dhmh.md.gov/bswe/logon.aspx
+https://measure.middlebury.edu
+https://mechbank.com/mechbank/mbwebsite.nsf/About/financials
+https://media.blackhat.com/bh-eu-10/presentations/Lindsay_Nava/BlackHat-EU-2010-Lindsay-Nava-IE8-XSS-Filters-slides.pdf
+https://media.ksc.nasa.gov/
+https://meetings.norc.org/hp2020/
+https://meltwaternews.com/magenta/xml/html/14/31/102854.html
+https://member.aetna.com/MbrLanding/login.fcc
+https://member.ghc.org/open/pwdReset/who.jhtml
+https://member.rodale.com/membercenter/mvc/createUser?site=womenshealth&amp;returnUrl=http%3A%2F%2Fwww.womenshealthmag.com/
+https://member.vsb.org/vsbportal/
+https://member.webmd.com/newsletters/newsletters.aspx
+https://members.assuranthealth.com/Dashboard
+https://members.canada.com/
+https://members.cunamutual.com/insurance&amp;investments/autohome/home.asp?dest=homequote&amp;SITE=03718470&amp;imgid=cubanners%2Fban02950002%2Egif
+https://members.kaiserpermanente.org/kpweb/selectregion.do?gt=/kpweb/selectphysician/entrypage.do
+https://members.oreilly.com
+https://members.oreilly.com/
+https://members.pscufs.com
+https://members.pscufs.com/education/iivs/index.php
+https://membership.ama-assn.org/JoinRenew/search.jsp?checkXwho=done
+https://merchant-apply.com/oscommercemf
+https://merchant.calweb.com/nbr/cgi-bin/display-reg.cgi?Register=99cent%20Stolen%20Bike%20Registry
+https://merchant.interspire.com/
+https://merchant.paypal.com/cgi-bin/marketingweb?cmd=_render-content&amp;content_ID=merchant/home&amp;nav=2
+https://merchant.paypal.com/cgi-bin/marketingweb?cmd=_render-content&content_ID=merchant/donations
+https://merchant.paypal.com/cgi-bin/marketingweb?cmd=_render-content&content_ID=merchant/wp_standard
+https://merchant.shopping.com/enroll/app
+https://merchant.sortprice.com/merchant/WatchMaxx.com
+https://merchant.thefind.com
+https://merchant.thefind.com/
+https://merchant.trialpay.com/register/
+https://merchant.wmtransfer.com/conf/guide.asp
+https://merchants.gamersfirst.com/
+https://mercury.educ.kent.edu/ABLEPrograms/login.cfm
+https://merrillmarketintelligence.ml.com/
+https://messaging.allstate.com/encompass/contact_form_mess.asp?claims
+https://metbank.applicantharbor.com/
+https://metlocator.metlife.com/metlocator/execute/Search?searchType=findDentistMetLife&amp;newSearch=true
+https://metro.dev.java.net/
+https://mfa.teachersfcu.org/
+https://mhportal.theplanet.com/
+https://mibank.bankreports.net
+https://mibank.bankreports.net
+https://mibusinessonlinebanking.ebanking-services.com/
+https://mice.cs.columbia.edu/recruit/recruitRegister.php?no_header=1&amp;new=1
+https://michaelbay.com/
+https://microsite.accenture.com/sustainability/Documents/Accenture_UNGC_Study_2010.pdf
+https://military.wufoo.com/forms/m7x0p9/
+https://militarybankonline.bankofamerica.com/efs/servlet/military/login.jsp
+https://militarycac.com/errors2.htm#new_profile
+https://mindworks.wildmind.org/moodle
+https://miravista.memberstatements.com/login/registration.cfm
+https://mises.org/lostpapers.asp
+https://mix.oracle.com/
+https://mmaglobal.com/member/research
+https://mmi.bnymellon.com/
+https://mms.mckesson.com/html/
+https://mobileumail.wfu.edu/
+https://mocp.microsoftonline.com/site/Default.aspx?sourcesystem=bpostry&presignincountry=FRA
+https://momaext.moma.org/cgi-bin/lansaweb?procfun+lfdonation+lfdnrin+pre+eng
+https://money.strands.com/
+https://monroebank1.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://moodle.aces.org
+https://moodle.acs-k12.org
+https://moodle.bethanywv.edu
+https://moodle.cbl.umces.edu
+https://moodle.concordia.ca/moodle
+https://moodle.cs.vt.edu
+https://moodle.cs.wwu.edu
+https://moodle.district833.org
+https://moodle.drew.edu
+https://moodle.earlham.edu
+https://moodle.earlham.edu/
+https://moodle.franklincollege.edu
+https://moodle.gfs.org
+https://moodle.goshen.edu
+https://moodle.hs.iastate.edu/mymoodle
+https://moodle.insttech.washington.edu
+https://moodle.kent.k12.wa.us
+https://moodle.kent.k12.wa.us/staffdev
+https://moodle.kunaschools.org
+https://moodle.kzoo.edu
+https://moodle.kzoo.edu/
+https://moodle.lakewoodcityschools.org/moodle
+https://moodle.lblesd.k12.or.us
+https://moodle.lblesd.k12.or.us/lebanon
+https://moodle.lclark.edu
+https://moodle.lehigh.edu
+https://moodle.life.illinois.edu
+https://moodle.life.uiuc.edu
+https://moodle.mcpasd.k12.wi.us
+https://moodle.mgargylls.com/
+https://moodle.millikin.edu
+https://moodle.mlc-wels.edu/moodle
+https://moodle.mtwp.net
+https://moodle.muhstigers.org
+https://moodle.nau.edu/prd
+https://moodle.nebo.edu/moodle
+https://moodle.northcentral.edu
+https://moodle.olatheschools.com
+https://moodle.oxy.edu
+https://moodle.pennmanor.net
+https://moodle.quincy.edu
+https://moodle.salemstate.edu/moodle
+https://moodle.simpson.edu/moodle
+https://moodle.soph.uab.edu
+https://moodle.student.graland.org
+https://moodle.svps.k12.az.us
+https://moodle.the-bac.edu
+https://moodle.uaa.alaska.edu
+https://moodle.ucsf.edu
+https://moodle.umn.edu
+https://moodle.uncc.edu
+https://moodle.usmk12.org
+https://moodle.waldotech.org
+https://moodle.warwicksd.org
+https://moodle.washington.edu
+https://moodle.wesleyan.edu
+https://moodlems.district112.org
+https://mortgage.chase.com/pages/other/prequal_form.jsp?TYPE=R
+https://mortgage.citybankonline.com/faq.aspx
+https://mortgage.huntington.com/
+https://mortgage.integrabank.com/home/19116/landscape?jpid=SSLoanStart
+https://mortgageapplication.bremer.com
+https://mortgageapplication.bremer.com/login.aspx?LO=&amp;Redirect=http://www.bremer.com
+https://mortgagebankingsolutions.projectpath.com/login
+https://mortgages.allstatebank.com/home/14812/landscape?jpid=LogIn&amp;loginmode=registered
+https://moss.calpoly.edu/its/csa/Pages/Operations/ops_log.aspx
+https://moversguide.usps.com/mgservice/ECOA
+https://mozillalabs.com/
+https://mpv.orcasnet.com/login/ufcu
+https://mrc.mytotalmoneymakeover.com
+https://mrmcd.net/schedule/mrmcd111b/event/2731.en.html
+https://mrp1.cunetbranch.com/swk/mrp_0589/
+https://msdn.microsoft.com/en-us/subscriptions/manage
+https://msds.open.ac.uk/your-record/p14.dll?STUDENTHOME
+https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032454433&amp;Culture=en-US
+https://mshv.physicianswellnessnetwork.com/order/am
+https://msinfluentials.com/blogs/jesper/archive/2009/08.aspx
+https://mss.aarp.org/servlet/wppdispatcher?keycode=U5HAC3&amp;packageid=&amp;componentid=&amp;whocalled=promo_enroll
+https://mtnamerica1.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://mutualfunds.myaccount.pacificlife.com/public/myaccount/my_index.html
+https://mvp.support.microsoft.com/communities/mvp.aspx?product=1&amp;competency=Access
+https://mvr.ehawaii.gov/renewals/kauai
+https://mwe.dllr.state.md.us/default.asp?SessionUID=a
+https://mxmerchant.com/
+https://my-db.pair.com/phpMyAdmin/
+https://my-tie.net/
+https://my.advocatehealth.com/portalentry.cfm
+https://my.bioiq.com/
+https://my.boatus.com/default.asp?targetUrl=members/update1.asp#stop3
+https://my.care.org/site/Donation2?df_id=6900&6900.donation=form1&s_src=170760460000&s_subsrc=170760460000&source=170760460000&channel=170760460000
+https://my.ccbn.com/login/login.asp?destination='/desktop.asp'
+https://my.compete.com/plans/
+https://my.doculivery.com/External/ccps/Login.aspx
+https://my.dom.com/externalPortalWebApp/oneTwoThreeEnrollment/RegistrationController.jpf
+https://my.ecwid.com
+https://my.ecwid.com/cp#register
+https://my.firehost.com/login
+https://my.fool.com/Profile
+https://my.fsf.org/donate/patron
+https://my.garmin.com
+https://my.garmin.com/rma/recallLanding.faces
+https://my.globalhrresearch.com/MVP-APP/index.cfm?fuseaction=career_center.job_board&amp;access_key=globalhrTIB&amp;passcode=globalhrTIB
+https://my.guidestone.org/login/login.aspx
+https://my.investmentscorecard.com/
+https://my.mandriva.com/register/
+https://my.modwest.com/upgrade/request_addon.phtml
+https://my.money.co.uk/signup.htm
+https://my.naic.org/
+https://my.ne.gov/ICSLogin/?%22https://my.ne.gov/%22
+https://my.nssi.com/
+https://my.onebeacon.com/
+https://my.pair.com
+https://my.pair.com/
+https://my.pbworks.com/
+https://my.pmi.org/pages/default.aspx
+https://my.screenname.aol.com/_cqr/login/login.psp?siteId=careerbuilder&amp;authLev=1&amp;siteState=LoginType%3d1
+https://my.silobreaker.com/Secure/Login.aspx?ReturnUrl=%2fdefault.aspx
+https://my.travelers.com/custregportalmain.asp?AppCN=PLCUS&amp;Track=NAV
+https://my.ufl.edu/psp/ps/EMPLOYEE/SA/c/UF_SF_CUSTOM.UF_SS_PERM_VIEW.GBL?UF_SA&amp;FolderPath=PORTAL_ROOT_OBJECT.UF_SA_SELF_SERVICE.UF_SS_PERM_VIEW_GBL&amp;IsFolder=false&amp;IgnoreParamTempl=FolderPath%2cIsFolder
+https://my.uga.edu/uPortal/render.userLayoutRootNode.uP
+https://my.usajobs.gov/login.aspx?redirect=https%3a%2f%2fmy.usajobs.gov%2fhome.aspx
+https://my.vcu.edu/
+https://my.webroot.com/?action=login
+https://my.wou.edu.my
+https://my.wou.edu.my/download/important_info/Student Handbook July 2010 Edition.pdf
+https://myAlaska.state.ak.us
+https://myAlaska.state.ak.us/myPFDInfo
+https://mya.godaddy.com/default.aspx
+https://mya.securepaynet.net/products/accountlist.aspx?isc=rsplan10&amp;ci=1815&amp;product=hosting&amp;prog_id=MosoTechnology
+https://myaccessaccount.dcf.state.fl.us/Login.aspx
+https://myaccount.ascensus.com/rplink/Logon.cfm?CookieChecked=1
+https://myaccount.bellsouth.com/apps/cpr/home/login/cprLogin
+https://myaccount.bitdefender.com/site/MyAccount/login/
+https://myaccount.citysearch.com
+https://myaccount.gafri.com
+https://myaccount.latimes.com/index.jsp
+https://myaccount.nationalparks.org/SSLPage.aspx?pid=411
+https://myaccount.santanderconsumerusa.com
+https://myaccount.santanderconsumerusa.com/CAMTerms.aspx
+https://myaccount.verizonwireless.com/clp/login
+https://myaccounts.navyfcu.org/cgi-bin/ifsewwwc?Logon&amp;target=015
+https://myalaska.state.ak.us
+https://myalaska.state.ak.us/home/app
+https://mybeacon.nc.gov
+https://mybenefits.metlife.com
+https://mybenefits.metlife.com/
+https://mychart.challiance.org/mychart/
+https://mychart.sutterhealth.org/
+https://mychartweb.ohsu.edu/mychart/
+https://mycommunity.leveragesoftware.com/login.aspx
+https://myeap.eap.ucop.edu/travelhealth
+https://myforms.us.army.mil/wps/PA_1_0_FL/documents/FCMP_FAQ.html
+https://mygrantinfo.csac.ca.gov/
+https://mygre.ets.org/
+https://myhcc.highlandcc.edu/selfservice/Home.aspx
+https://myhealth.lhs.org/myhealth/
+https://myinvoice.csd.disa.mil/index.html
+https://mylifestages.org/MyLifeStages/
+https://mylocalgov.com/cityofphiladelphiapa/pubbizinqpi.asp?first=1
+https://mymail.doir.wa.gov.au/exchange
+https://mymortgage.regionsmortgage.com/upmb/disp
+https://mynetworksupport.motorola.com/index.asp
+https://myonlineaccounts2.abbeynational.co.uk/ffStatic/html/logon.html
+https://myoutlook.accenture.com/cgi-bin/accenture.cfg/php/enduser/acct_login.php?p_next_page=doc_serve.php&amp;2=mo_sub_english
+https://myows.com/
+https://mypay.dfas.mil/
+https://myplan.nwservicecenter.com/iApp/isc/cmd/Login
+https://mypoints.com/emp/u/centers/gamesCenter.vm
+https://mypriority.tuoadvantage.com/Connect.aspx?Action=CCS
+https://mypurdue.purdue.edu/
+https://myreports.combined.com/eipApp/jsp/servlets/logon.jsp
+https://myrewardzone.bestbuy.com/premier/viewDetails.jspx?tc=CPN_35204
+https://myrisk.fmglobal.com
+https://myrisk.fmglobal.com/portal/server.pt
+https://myscemployee.sc.gov/
+https://myservice.thrivent.com/portal/mythrivent
+https://myservices.onebeacon.com/locator/agency.faces
+https://mysky.sky.com/
+https://mystate.wvstateu.edu
+https://mysupport.mcafee.com
+https://mysupport.mcafee.com/eservice/productdocuments.aspx?strPage=2
+https://myusccollege.usc.edu/
+https://myvoteinfo.voteks.org/
+https://mywn.ebilling.com
+https://mywn.ebilling.com/
+https://na6.salesforce.com/secur/login_portal.jsp?orgId=00D400000009hQR&amp;portalId=06040000000D6Nb&amp;startURL=/apex/PRMPartnerUnivTab%3F%26stURLmLa%3Dhttp%253A%252F%252Fmylearn%252Evmware%252Ecom%252Fportals%252Fpartners%252F%253Fmenu%253Dhome
+https://nac.samhsa.gov/index.aspx
+https://narac.llnl.gov/
+https://nationalgrid-massachusetts.custhelp.com/cgi-bin/nationalgrid_massachusetts.cfg/php/enduser/std_alp.php?p_prods=33%2C36&amp;prod_lvl1=33&amp;prod_lvl2=36&amp;p_pv=2.36
+https://nationalgrid-newhampshire.custhelp.com/cgi-bin/nationalgrid_newhampshire.cfg/php/enduser/std_alp.php?p_prods=30%2C32&amp;prod_lvl1=30&amp;prod_lvl2=32&amp;p_pv=2.32
+https://nationalgrid-newyork.custhelp.com/cgi-bin/nationalgrid_newyork.cfg/php/enduser/std_alp.php?p_prods=22%2C23%2C26&amp;prod_lvl1=22&amp;prod_lvl2=23&amp;prod_lvl3=26&amp;p_pv=3.26
+https://nationalgrid-rhodeisland.custhelp.com/cgi-bin/nationalgrid_rhodeisland.cfg/php/enduser/std_alp.php?p_prods=38%2C39&amp;prod_lvl1=38&amp;prod_lvl2=39&amp;p_pv=2.39
+https://nationwide.olaccess.com
+https://nationwide.olaccess.com/
+https://navinet.navimedix.com
+https://navinet.navimedix.com/Main.asp
+https://nbp1.cunetbranch.com/amgcu/
+https://ncasdss.ncosc.net
+https://ncid.nc.gov
+https://ndex.ci.newark.nj.us/dsweb/View/Collection-6426
+https://ndr-efs.ne.gov/revefs/allPages/login.faces
+https://ne-phonebook.ne.gov/PhoneBook/faces/welcome.jsp
+https://nebraska.gov/NEDED/agtour/
+https://ned.nih.gov/search/viewdetails.aspx?NIHID=0010051249
+https://neo.beaumont.edu/employee
+https://net.educause.edu/ResourceOrderCheckout/2587?ITEMID=ERM086W&amp;ERM086W=1
+https://netfiles.uiuc.edu/dtcook/www/CCCnewsletter/5-1/Orend.htm
+https://netforum.avectra.com/eWeb/DynamicPage.aspx?Site=TAF&amp;WebCode=RPCriteria
+https://netforum.nspe.org/eWeb/DynamicPage.aspx?WebCode=LoginRequired&amp;Site=MemberProf&amp;redirectURL=https://netforum.nspe.org/eweb/startpage.aspx
+https://netidadmin.cit.cornell.edu/NetIDManagement/PasswordCheck
+https://netview.verid.com/transact
+https://networks-academy.nokiasiemensnetworks.com/nsninternet/contact.jsp
+https://nevadafederal.agentinsure.com/
+https://nevadafederal.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://nevadatreasurer.gov/UnclaimedProperty.htm
+https://new.aol.com/productsweb/?promocode=827686
+https://new.gafri.com/gafriagent
+https://new.thatsmybank.com/applications/online-banking.html?page=24537&amp;type=page&amp;id=24537
+https://newalliancebank.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://newhire.state.co.us/newhire/do/
+https://newjersey.mylicense.com/verification
+https://news.fidelity.com/
+https://newsday.boocoo.com/auction/Index.asp
+https://newyorkchildsupport.com/child_support_services.html
+https://newyorkchildsupport.com/non_custodial_parent_info.html
+https://nfnapps.nwservicecenter.com/webapp/tdw
+https://ngapps.nationalgridus.com/ferc/reportmenu.aspx
+https://ngc.taleo.net/careersection/ngc_pro/jobsearch.ftl?lang=en
+https://ngpc-permits.ne.gov/NGPC-PS/faces/public/welcome
+https://nhworksjobmatch.nhes.nh.gov
+https://nhworksjobmatch.nhes.nh.gov/
+https://ninite.com/
+https://nisd.schoolnet.com/Outreach/Content/ServeAttachment.aspx?outreach_content_id=32496a8d-e91a-438b-b360-6de5480b9dd4
+https://nisecure.nationwide.com/eClaims/Reporting/Auto/Secure/begin.asp
+https://njlmn.rutgers.edu/
+https://nl-1stmariners.streamlendvelocity.net/netlendv/client/applications/consumer/?utm_source=Hmpge&amp;utm_medium=WLT&amp;utm_campaign=OpnLoan
+https://nni-learn.gocetech.com
+https://no.de/
+https://noagendapodcast.appspot.com/
+https://nocall.wisconsin.gov/web/home.asp
+https://nomoreclipboard.com/nmc_healthvault_action.php?action=L
+https://nonet9pub.pminsco.com/onlinebilling/
+https://northerntrust.custhelp.com/cgi-bin/northerntrust.cfg/php/enduser/doc_serve.php?gsntcom&amp;2=about_contactus
+https://northwestern.illiad.oclc.org/illiad/illiad.dll
+https://norwaysavingsbank.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://notify.arkansas.gov/
+https://npado.org/login_form?template_id=template.2006-03-03.9127348942
+https://npers.ne.gov/whalecomfb0318c98356c776ad65/whalecom0/SelfService/
+https://npo.networkforgood.org/Donate/Donate.aspx?npoSubscriptionId=1003202
+https://nppes.cms.hhs.gov/
+https://nsbe.networkats.com/members_online/members/renewmember.asp?action=start
+https://ntsmoodle.com
+https://nuhr.northwestern.edu/psp/hr89prod_ss/EMPLOYEE/HRMS/c/ROLE_EMPLOYEE.NW_SS_TRN_REDIRECT.GBL?course=DCW003
+https://nvapps.state.nv.us/NEATS/Recruiting/ViewJobsHome.aep
+https://nwsb.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://nyprescriptionsaver.fhsc.com/
+https://oa.doria.fi/bitstream/handle/10024/2973/disputer.pdf?sequence=2
+https://oar.senate.gov/index.cfm?go=showLogin&amp;applicationUUID=34694A79-1321-0E2B-0EB70DD800A0663B
+https://oasis.northgrum.com/general/docs/SBLOlist.pdf
+https://oasisweb.uga.edu
+https://ob.bremer.com/bremer/login.aspx
+https://oc.okstate.edu
+https://ocalert.net/index.php?CCheck=1
+https://ocd.sovereignbank.com/ct/
+https://oceanbank.webcashmgmt.com/wcmfd/wcmpw/BusinessLogin
+https://ociaccess.oci.wi.gov/ProducerInfo/PrdInfo.oci
+https://ocsconnect.mms.gov/
+https://oden.cbuc.cat/backcob/cobertesback.php?isbn=0471476110&amp;institucio=CBUC
+https://odr.bbb.org/odrweb/public/ComplaintRedirect.aspx?military=1
+https://ohana.iteams.org/learn
+https://ohiobusinessgateway.ohio.gov/OBG/
+https://ohiomeansjobs.com/omj/
+https://oi.cajamadrid.es/
+https://ola.orcasnet.com/olt/culogin/lafcu/
+https://olc.meridiantech.edu
+https://olg.campusnet.net/OnLineGiving/Login.aspx?id=55StwqfAfMI4iAiYjWmailwKfk/Q1ugL9wi7xqdI3qC8UCetC1OfAQ==&amp;fg=
+https://olui2.fs.ml.com/Login/Login.aspx?SITESRC=MLD
+https://oncourse.iu.edu
+https://oncourse.iu.edu/portal
+https://ondemand.halogensoftware.com/charlotte_county/sessionServlet
+https://ondemand.ufcu.org/hbnet/login/NewUser_Account.aspx?organization=FB366962-6E2E-4C57-91D0-23F36957C653&amp;lang=english
+https://one.ubuntu.com/
+https://onesource.ubs.com/
+https://onestart.iu.edu
+https://onestart.iu.edu/my2-prd/portal/0
+https://onestop.delaware.gov/osbrlpublic/Home.jsp
+https://oneunited.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1&amp;pmc=Public Website
+https://online-banking.eurohypo.com/mod/WebObjects/ehoba.woa
+https://online.aam.com/portal/page/portal30/CA_SUPPLIER/F_SUPPLIER_COMMON/F_SUPPLIER_COMMON_REQUESTFORMS/iSupplier%20Portal%20FAQ%20-%20External%20Portal.pdf
+https://online.btfunds.com.au/retailinvestor/investor
+https://online.cefcmi.com
+https://online.citibank.com/US/JRS/pands/detail.do?ID=OnlineBankingOverview
+https://online.compassweb.com/cpc/servlet/compass/login.jsp
+https://online.corp.westpac.com.au/
+https://online.cpp.com/
+https://online.dacotahbank.com/forms/access_agreement.htm
+https://online.dns.pt/imagens/site/home_290/fotos/79021759982250550415.pdf
+https://online.doi.sc.gov/Eng/Public/Common/OnlineServices.aspx
+https://online.dollarbank.com
+https://online.dollarbank.com/mobileolb.html
+https://online.educaid.com/borroweraccess/studentsignon.cfm
+https://online.elancard.com/customizedPricing/elan/home.do?locationId=2912
+https://online.firsttechcu.com/
+https://online.fsbct.com/EBC_EBC1961/EBC1961.asp?wci=process&amp;wce=request&amp;rid=3000&amp;rtn=211170347&amp;MFA=2
+https://online.gtcc.edu
+https://online.hsbc.com.au/utility/rates/index.html
+https://online.icnfull.com/fnp/?action=SUBSCRIPTION&amp;list_source=SHOMEP&amp;a_edition_code=P
+https://online.kitco.com/bullion/
+https://online.ksde.org/teal/cert_search.aspx
+https://online.libertymutual.com/eServiceWeb2/UrlResolver?uri=register
+https://online.my100bank.com/MB/musagetips
+https://online.mymetrobank.com/login.aspx
+https://online.nikao-ministries.org
+https://online.nwf.org/site/Donation2?df_id=8060
+https://online.penson.com/
+https://online.portal.nokiasiemensnetworks.com
+https://online.safeauto.com/process/retrieveaquote/Login.aspx
+https://online.statefarm.com/apps/AskSF/
+https://online.thatsmybank.com/cgi-bin/hbproxy.exe/1079/signon
+https://online.virtualbank.com
+https://online.wellsfargo.com/common/html/wibdisc.html
+https://online.westpac.com.au/esis/Login/SrvPage/?h3&amp;app=wol&amp;referrer=http%3A%2F%2Fwww.westpac.com.au%2FHomepageAlternative%2F
+https://online.woodforest.com/wnb/
+https://online1.elancard.com/oad/begin?locationCode=12745
+https://onlineacceptance.appliedbank.com/displayPLAOffer.do?packType=3120
+https://onlineacceptance2.appliedbank.com/displaySecureCardOffer.do?packType=3142
+https://onlineaccess.mycreditcard.cc/express
+https://onlineaccess2.mycreditcard.cc/victoriassecret
+https://onlineaccountservices.appliedbank.com/displayEnrollment.do
+https://onlineapp.cardservice.com/default.asp?agent='csi/prec'
+https://onlineatnsb.com/pbi_pbi1961/pbi1961.asp?Rt=211274515&amp;LogonBy=Connect3&amp;PRMAccess=Account&amp;enroll=true
+https://onlinebanking.asbhawaii.com/ASB/ForgottenPassword/ForgotYourPassword.aspx
+https://onlinebanking.bankoftexas.com/onlinebanking/
+https://onlinebanking.capitalone.com/
+https://onlinebanking.huntington.com/
+https://onlinebanking.mandtbank.com/
+https://onlinebanking.trustcobank.com/fi13573/pb/logon
+https://onlinebanking.ubt.com/pbi_pbi1961/pbi1961.asp?Rt=104910795&amp;LogonBy=Connect3&amp;prmaccess=Account&amp;afc=2&amp;override=true
+https://onlineeast3.bankofamerica.com/cgi-bin/ias/0/E/EnrollEntryPoint?stateCode=&amp;locale=en_US&amp;cm_re=OLB-General-_-Infocenter-_-OG16LT001S_Homepage_ReadyToEnroll
+https://onlinefamily.norton.com/familysafety/loginStart.fs?inid=us_2010June_NOF
+https://onlinefincompany.com/
+https://onlineimagelockbox.regions.com/
+https://onlineinvesting.usbank.com/
+https://onlineinvesting.westpac.com.au/
+https://onlinejobs.yorkcountygov.com
+https://onlinencr.com/online/pioneersb/personal/selfenroll.asp
+https://onlinentid.rit.edu
+https://onlineservice.cinfin.com/b2c/Registration/DirectBillPolicyHolders.aspx
+https://onlineservice3.progressive.com/ols/OnlineServices.aspx?page=AccountServices.ApplicationStart&amp;OfferingId=OnLineServices&amp;SessionStart=TRUE&amp;TitleID=Help
+https://onlineservice3.progressiveagent.com/ols/OnlineServices.aspx?page=AccountServices.ApplicationStart&amp;OfferingId=OnLineServices&amp;SessionStart=TRUE&amp;TitleID=Register
+https://onlineservices.ubs.com/olsauth/ex/pbl/ubso/dl
+https://onlineservices.wachovia.com/auth/AuthService?action=presentLogin&amp;url=https%3a//onlineservices.wachovia.com/NASApp/NavApp/Titanium%3faction%3dreturnHome
+https://onlinetraining.tsl.state.tx.us
+https://onyx.ets.org/K-12Community.htm
+https://openhealthworkbench.projects.openhealthtools.org/
+https://openid.luxsci.com/openid/v2/signin?token_url=https://luxsci.com/perl/member/members.pl%3flogin%3d1%26%26default_target%3d1%26openid_login%3d1
+https://openinnovation.generalmills.com/
+https://opennet.salliemae.com/apploansummary/?loanprogram=SOSL&amp;InstLndrID=900902&amp;CobrandingID=regions&amp;dtd_cell=SMLRSOPTLPSS7419
+https://opensvn.csie.org/
+https://opentreasury.ideascale.com/a/ideafactory.do?discussionID=16534
+https://opm.princeton.edu/forms/contact-helpdesk.html
+https://opp.retirementpartner.com
+https://ops.ietf.org/lists/multi6
+https://optin.chemicalbankmi.com
+https://orbit.theplanet.com/
+https://orca.bpn.gov
+https://order.barrons.com/sub/xdef/002/6BCWCD_OOT
+https://order.kagi.com/?2WL
+https://order.panamalaw.org/merchant_application.php
+https://order.shinjiru.com
+https://order.shinjiru.com/
+https://order.wsj.com/sub/xdef/053/dec09_OOT32
+https://orderstatus.att.com/orderstatus/landing.do?lid=Wireline+Check+Status+Link&amp;lpos=Wireline+section
+https://orderupdate.intuit.com/corporate1.asp?topic=corporate
+https://oregoneft.net/web/Welcome.asp
+https://oreillyschool.com/enroll/
+https://org2.democracyinaction.org/o/5420/t/9547/shop/custom.jsp?donate_page_KEY=1974
+https://osap.site-ym.com/?page=Corporate
+https://oscar.symplicity.com/
+https://oscar.uscourts.gov/
+https://osfantweb.osfa.state.la.us/
+https://oss.ticketmaster.com/html/pack_home.htmI?l=EN&amp;team=agganis
+https://osufoundation.org/giving/online_gift.shtml
+https://otto.vanouwerkerk.com/pages/disclaimer.php
+https://ourcpa.cpa.state.tx.us/staxpayersearch/SlsTxpyrSearch.jsp
+https://owa.aacc.org/owa/redir.aspx?C=e01bb6fcf909400ba05cb973b274cb24&amp;URL=http%3a%2f%2fwww.labtestsonline.org%2f
+https://owa.mba.wfu.edu/
+https://owa.purdue.edu
+https://owa.usar.army.mil
+https://ozone.owens.edu/
+https://p1.kvcc.edu/moodle
+https://p12.secure.hostingprod.com/@nghscarroll.org/moodle/ssl/moodle
+https://p1pe.doe.virginia.gov/reportcard/
+https://pacer.login.uscourts.gov/cgi-bin/login.pl?court_id=07ca
+https://pacsusergroup.carestreamhealth.com/
+https://pages.huntington-email.com/page.aspx?QS=c76003443ff9837de62c52ff333f69f1dd6a2e3b94871624
+https://pagseguro.uol.com.br/
+https://painpolicy.bcg.wisc.edu
+https://panel.webfaction.com
+https://panopticlick.eff.org/
+https://parentalcontrols.aol.com/
+https://parkbankonline.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://partner.microsoft.com/global/productssolutions/servers/40108498
+https://partners.fortinet.com
+https://partners.sophos.com/
+https://partnerselecthallway.motorola.com
+https://pas.nwservicecenter.com/iApp/pas/cmd/PensDTLogin
+https://passport.gatech.edu/
+https://passport.texascapitalbank.com/banknow.aspx
+https://pathpro.pmi.org/
+https://patientcenter.minuteclinic.com/
+https://pay.gov/paygov/forms/formInstance.html?agencyFormId=28122981
+https://pay.usbank.com/default.aspx?id=Legacy_Emanuel_Online_Pmt
+https://pay.york.cuny.edu
+https://pay.york.cuny.edu/
+https://paydotcom.com/compare.php
+https://payment.progressiveagent.com/expresspay
+https://payments.amazon.com/sdui/sdui/business/cba
+https://payments.appliedbank.com/home.do
+https://payments.auctionpay.com/ver3/?id=w025322
+https://payments.bankofamerica.com/epaybill/StartAction.do?OSFAFFELP
+https://payments.billmatrix.com/ConcordConsumerWeb/Welcome.aspx
+https://payments.ehawaii.gov/propertytax/kauai/
+https://payments.phmic.com/phbips/index.jsp
+https://paymentshmic.billmatrix.com/Entrypage.aspx
+https://paymentslge.billmatrix.com/Welcome.aspx?PAYUSERACCOUNT
+https://paynow7.speedpay.com/commercewest/index.asp
+https://payroll.regions.com/servlet/gateway?action=login&amp;SC=9CCB08EC69ACD2FB6F99174A9CE578E9
+https://pb.schools.org/cgi-bin/mcw000.cgi?MCWSTART
+https://pb2.schools.org/cgi-bin/mcw000.cgi?MCWSTART
+https://pbbopeep.petsbest.com/plans/illnessaccidentplans.aspx
+https://pci.qualys.com/
+https://pcm.metavante.com/pcma/MainServlet/Logon?id=1A
+https://pcws.wal-mart.com/cws/seeker.html
+https://pd.acm.org/ek_courses.cfm?crs=85909
+https://pdb.nipr.com/ACR/SignIn
+https://pembacws.pemba.utk.edu
+https://people.creighton.edu/~mlm22940/writings/ohara/steps.html)
+https://peoplefirst.myflorida.com
+https://peoplefirst.myflorida.com/
+https://perezhilton.com/
+https://perfectmoney.com
+https://perfectmoney.com/login.html
+https://permits.nashville.gov/kivanet/citizen/index.cfm
+https://personal.paypal.com/cgi-bin/marketingweb?cmd=_render-content&amp;content_ID=marketing_us/How_does_PayPal_work
+https://personal.vanguard.com/us/FundsSnapshot?FundId=0029&FundIntExt=INT
+https://petinsurancestore.com/parsers/GadgetParser.aspx?brandid=4
+https://pets.petfirsthealthcare.com/kroger/KPFA/enrollment.aspx
+https://pf.newyorklife.com/cns/NYLServlet?nylforward=launch&amp;url=http%3A%2F%2Fwww.newyorklife.com%2Fnyl%2Fv%2Findex.jsp%3Fvgnextoid%3D8f50ce94229d2210a2b3019d221024301cacRCRD
+https://pfweb.phonefactor.com
+https://pgp.custhelp.com/
+https://phe.uncg.edu
+https://philosophy-data.uchicago.edu/index-faculty.cfm#Cohen
+https://phljobs.mycmsc.com/phljobs/signon.html
+https://phmic.hr-onesource.com/Members/
+https://phobos.apple.com/WebObjects/MZFinance.woa/wa/redeemLandingPage
+https://photo.spokesmanreview.com/
+https://phr.webvet.com/
+https://phx.corporate-ir.net/phoenix.zhtml?c=120257&amp;p=irol-irhome
+https://pib4.secure-banking.com/74467-001/AutoEnrollmentIdentify.faces
+https://picture.vzw.com/login.do
+https://pincdn.s3.amazonaws.com/assets/51f120ddc2dc65377559be673f84743b/Road-Work-Ahead-vUS.pdf
+https://pip.verisignlabs.com/
+https://placead.nytimes.com/default.asp?CategoryID=NYTCAR
+https://planaccess.countryinvestment.com/index.aspx
+https://planhr.retirementexpress.com
+https://player.helixcommunity.org/
+https://plumasbank.com/
+https://pm.safeauto.com/Login.aspx
+https://pnccashcon.solutions-corporate.com/
+https://pokerplayersalliance.org/jointoday.php
+https://pol6.fdnet.com/Fluor/
+https://pomidka.com/shop/passwordreminder.php
+https://port.hull.ac.uk/
+https://portal.aadsasweb.org/
+https://portal.acm.org/poplogin.cfm?dl=Portal&amp;coll=Portal&amp;want_href=portal.cfm&amp;CFID=106228682&amp;CFTOKEN=32888033
+https://portal.acs.org/portal/acs/corg/memberapp?_nfpb=true&amp;_pageLabel=mapp_member_login_page
+https://portal.adp.com/
+https://portal.blackboardconnectcty.com/41097291
+https://portal.cpa.state.tx.us/
+https://portal.dcma.mil
+https://portal.eccouncil.org/forum/login_user.asp?Redirect=/Default.asp
+https://portal.harleysvillegroup.com
+https://portal.hpd.global.extranet.reuters.com/auth/login.aspx
+https://portal.hpd.global.reuters.com/auth/login.aspx
+https://portal.hsbc.com.mx/aptrix/AplicacionesPub.nsf/Content/ASTDC
+https://portal.ipc.org/Purchase/ProductDetail.aspx?Product_code=d31f9a38-b486-db11-a4eb-005056875b22
+https://portal.ksg.harvard.edu/NetPartnerStudent/logon.aspx?ReturnUrl=%2fNetPartnerStudent%2fPghome.aspx
+https://portal.maine.gov/refundstatus/
+https://portal.motorola.com/portal/site/supportcentral
+https://portal.ocfl.net
+https://portal.omni.fsu.edu/psp/sprdep/?cmd=login
+https://portal.opengeospatial.org/files/?artifact_id=7174
+https://portal.prnewswire.com
+https://portal.prnewswire.com/SystemAccess/BecomeAMember.aspx
+https://portal.rlicorp.com
+https://portal.ucbi.com/envelope/clientxfer
+https://portal.voxel.net
+https://portal.voxel.net/
+https://portal.zf.com
+https://portal01.state.nj.us/http://portal20.sa.state.nj.us:8080/amserver/UI/Login?gw=portal01.state.nj.us&amp;org=snj
+https://portal7.secure-banking.com/60696/PassmarkSignIn.faces
+https://portalxw.bisoex.state.me.us/dhhs-apps/rcare/
+https://portfolioonline.metavante.com/mpo/main/UserLogon?bankNumber=1A&amp;subProduct=
+https://post.craigslist.org/inl
+https://postalinspectors.uspis.gov/
+https://postdocs.llnl.gov/
+https://ppi.ets.org/ppi/applicant/
+https://pptform.state.gov/?submit=COMPLETE%2BFORM%2BDS-82%2BOnline
+https://practice.sph.umich.edu/mphtc/site.php?module=courses
+https://practicefocus.mckesson.com/
+https://prd4p.it.state.wi.us/renewal/logon
+https://pref.health.webmd.com/WebMD/WebMDSelection_MiniForm.asp?e=
+https://preferences.sbcmail.com/sbc/pc.asp?emailaddr=
+https://premier.sonetpremier.com/snghomepage/
+https://preregistration.spectrum-health.org/
+https://prerelease.adobe.com/callout/default.html?callid=%7BAEF64EB4-A977-4317-909A-14AD8014BA21%7D
+https://presentations.inxpo.com/Shows/Cisco/CiscoEurope/Website/index.html?AffiliateKey=12644&amp;AffiliateData=experience
+https://press.verisign.com/easyir/customrel.do?easyirid=AFC0FF0DB5C560D3&amp;version=live&amp;prid=663528&amp;releasejsp=custom_97
+https://preview.bicsi.org/connect.aspx
+https://print.lakecitybank.com/contact-us/
+https://print.wsj.com/print-registration/docs/dowjonesb.html
+https://privacyassist.bankofamerica.com/
+https://privatewealth.mellon.com/web/public/vp1/pwm/clientaccess?id=1
+https://pro-webs.net/
+https://prodinfo.putnam.com/prodinfoapp/application/managerIndex.jsf?managerId=2701
+https://products.geotrust.com/orders/rapidssl.do?ref=454848RAP60985
+https://products.secureserver.net/products/reseller/tour/index.html?ci=11901&amp;app%5Fhdr=
+https://products.thawte.com/geocenter/reseller/logon.do
+https://products.verisign.com/geocenter/reseller/logon.do
+https://profile.ea.com/acctcreate.do
+https://profile.microsoft.com/RegSysProfileCenter/wizard.aspx?wizid=4cf69fb0-9c57-4e24-b3fa-73360f7b40f7&amp;lcid=1033
+https://profileonline.collegeboard.com
+https://profileonline.collegeboard.com/
+https://profiler.trondent.com/ctm/main.asp
+https://profnet.prnewswire.com/
+https://programs.iowadnr.gov/animalfeedingoperations/
+https://progressivece7.recruitmax.com/MAIN/careerportal/default.cfm?szUn
+https://projectfinance-models.moodys.com
+https://projects.coin-or.org/CHiPPS
+https://projects.forum.nokia.com/home
+https://projects.honeynet.org/honeysnap/
+https://projekte.tm.uka.de/trac/OppBSD/wiki/OppBSDFeatures
+https://promos.thecheesecakefactory.com/share/#take-action
+https://proofwriter.ets.org/
+https://proposalcentral.altum.com/
+https://protected.fatcow.com/jhsgwo/cgi-bin/shop.pl/SID=1237547355.613/page=email.html
+https://protocol.llnl.gov/
+https://provcon.providence.org/lawson/portal
+https://provider.eassuranthealth.com/ppechannel_enu/
+https://provider.ghc.org/open/index.jhtml
+https://prowl.coloradocollege.edu
+https://proxy.org/
+https://psaltery-dd.wellsfargo.com/about/corporate/executive_officers/oman
+https://psi.secunia.com/
+https://psychweb.uoregon.edu/expsystem
+https://pub.needlebase.com/actions/visualizer/V2Visualizer.do?domain=Metal-Index
+https://public.nrharural.org/imispublic/Core/AccountManagement/Index.aspx
+https://publicaffairs.llnl.gov
+https://publicaffairs.llnl.gov/com/discovery_center.html
+https://publicaffairs.llnl.gov/news/news_releases/2010/NR-10-08-05.html
+https://publications.worldbank.org/register/?return_url=/extop/pvt/home
+https://publish.associatedcontent.com/signup.shtml
+https://publish.doc.gov/ohrm/DOCHROC/index.htm
+https://publish.ovi.com/login
+https://publisher.simply.com/en/newpublisher.php?PR=DRIE30
+https://publisher.smowtion.com/users/signup/admin114
+https://publishers.kontera.com/
+https://puborder.ncjrs.gov/askojp/
+https://pulse.clarian.org/clarian/layoutTemplates/html/access/outside_Loginform.jsp
+https://pumas.gsfc.nasa.gov/
+https://purchase.allstate.com/motorcycle/retrievequote.aspx
+https://purchase.travelguard.biz/sea/singapore/bin/purchase.jsp
+https://pusd.riddlefixer.com/dlp-dev
+https://pwgsc-pm.webex.com/mw0306l/mywebex/default.do?service=1&amp;siteurl=pwgsc-pm&amp;nomenu=true&amp;main_url=/mc0805l/e.do%3Fsiteurl%3Dpwgsc-pm%26AT%3DMI%26EventID%3D137226117%26UID%3D0%26Host%3D7fdb5010235503291c171e%26RG%3D1%26FrameSet%3D2
+https://pwwmd.denvergov.org/ipayment-client/payment
+https://pycisc.sbtpg.com/index.aspx
+https://qlc.intuit.com/app/full_page
+https://qualitymanagementtools.medstat.com/
+https://quarantine.sph.harvard.edu
+https://questions.medicare.gov/cgi-bin/medicare.cfg/php/enduser/ask.php?refer=http://www.medicare.gov/help/sitehelp.asp
+https://quicken.custhelp.com/app/contact/plvl1/win/
+https://quicken.intuit.com/commerce/checkout/shoppingcart.jsp
+https://quickenonline.intuit.com/quickenweb/external/fi-select.jsf
+https://quickstart.collegeboard.com/posweb/login.jsp
+https://quikfm.vcu.edu/
+https://quote.allstate.com
+https://quote.allstate.com/?quote=ep
+https://quote.americancollectors.com/AcctMgmt/S/Quote/
+https://quote.constructaquote.com/quote/yourdetails.aspx
+https://quote.farmers.com/FFQWeb/ffq/ffq3.jsf
+https://r2r.providence.org/
+https://r3.lexis.com/amlsolutions
+https://ra.collegeboard.com/eps/login.jsp
+https://rabbit.vm.its.uwo.ca/WCCS/default.aspx?type=searchByKeywordsFrameset&amp;keywords=Noon
+https://randazza.wordpress.com/2010/09/26/excellent-question-carl/
+https://ranger.homelinux.com/n4tpa
+https://rapportive.com/extensions/safari/Rapportive-1.1.safariextz
+https://raq92.secure-access.net/owner.shopdemo2.precisionweb.net/edit-field-labels.php?area_id=9
+https://raysrs.raytheon.com/
+https://rbserver.gtfcu.org
+https://rbserver.gtfcu.org/servlet/SLogin?template=/2/en/sloginsc.vm&amp;login=true
+https://rcant.rcconnect.com/initialapp/resumeform.asp?jobid=10839&amp;emid=
+https://rccustomers.travelers.com/riskcontrol/rcpublicdocs.nsf/0/90A77D2E42732205852575150076774C/$FILE/A0048%20registration_quick_guide-Account.pdf
+https://rcfp376.securesites.net/rcfp.org/secure/orders/index.php
+https://rdms.metavante.com/rdms/RDMSServlet/Logon?bankid=98
+https://real.flofr.com/
+https://rebgui.svn.codeplex.com/svn/dictionary/American.dat
+https://records.txdps.state.tx.us/DPS_WEB/SorNew/index.aspx
+https://recruit.trovix.com/jobhostmaster/jobhost/ListJobPosts.do?accountId=de85ad313f8598db1c42b567a3df24a00497ba22&amp;searchLocation=33880&amp;searchCategory=0&amp;searchStatus=0&amp;action=search
+https://recruiter.kenexa.com/wescom/cc/Home.ss
+https://recruiting.level3.com/ENG/Candidates/default.cfm
+https://recruitment.biomerieux.com/home.html
+https://redelivery.usps.com
+https://reedelsevier.taleo.net/careersection/50/moresearch.ftl?lang=en
+https://register.apple.com/cgi-bin/WebObjects/GlobaliReg.woa
+https://register.cviog.uga.edu
+https://register.cviog.uga.edu/Continuity/CourseListing.asp?master_id=414&amp;master_version=1&amp;course_area=COD&amp;course_number=112&amp;course_subtitle=00
+https://register.facebook.com/find-friends/
+https://register.go.com/ABCNews/sweepstakes/FallConcert2010/register
+https://register.mentalhealthscreening.org/intro.aspx?MEID=20
+https://register.mitre.org/site/contact/
+https://register.rockthevote.com/?partner=2149&amp;source=embed-rtv234x60v1
+https://registration.ft.com/registration/login/logout?location=
+https://registration.lycos.com/signup.php?m_PR=33&amp;m_DL_USA_Angelfire_Basic_NoAds_Monthly_Plan=1&amp;m_UP=1
+https://registry.prometric.com/registry/public
+https://remitpoint.metavante.com/lakecitybank
+https://remote.cadencebanking.com:8443/iCapWeb/
+https://remote.doir.wa.gov.au
+https://remote.mfbank.com/WebCaptureWeb/MerchantCapture.do?appId=EBI1450&amp;FID=084201621
+https://remotecapture.frostbank.com
+https://remotedep.vikingbank.com/
+https://renderman.pixar.com/
+https://renewals.symantec.com
+https://renewals.symantec.com/
+https://reo.calbanktrust.com/PropertyList.aspx?Entity=3
+https://reorder.harland.net/
+https://reorder.libertysite.com/login.asp
+https://reports.energy.gov/BlackoutFinal-Web.pdf
+https://reports.environmentalleader.com/login/
+https://reports.web.analytics.yahoo.com/optout,OptOut.vm?domain=a.analytics.yahoo.com
+https://research.tdwaterhouse.ca/research/public/Markets/NewsArticle/1314-N24242966-1
+https://research.wsulibs.wsu.edu:8443/dspace/bitstream/2376/100/1/b_urgun_050503.pdf
+https://researcher.ibm.com/researcher/view.php?person=almaden-laura
+https://reserves.ulib.iupui.edu/
+https://retailclaimdispatch.dom.com
+https://retailupgrades.intel.com/Page.aspx?Name=Upgrade
+https://retire.oppenheimerfunds.com/cps/app?cmpid=invhp_contribution_processing_system
+https://retireefehb.opm.gov/index.asp
+https://retirementstrategy.mworld.com/retirement/estimatingneeds/calculator.asp
+https://revenue.alabama.gov/refunds/refundstatus.aspx
+https://revenuestateco.custhelp.com/cgi-bin/revenuestateco.cfg/php/enduser/std_alp.php
+https://rfes.utpa.edu/
+https://rhn.redhat.com
+https://rhn.redhat.com/rhn/users/CreateUser.do?account_type=into_org
+https://risk.lexis.com/investigativeportal
+https://risque.itns.purdue.edu
+https://risque.itns.purdue.edu/RisqueTickets
+https://risusergroup.carestreamhealth.com/
+https://ritdml.rit.edu/handle/1850/2136
+https://rlinet.rlicorp.com/sites/rlipress/Pages/Default.aspx
+https://rn.ftc.gov/pls/dod/wsolcq$.startup?Z_ORG_CODE=PU01
+https://rocketbox.tenderapp.com/faqs
+https://rocklandtrust.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1&amp;bhcp=1
+https://rococoa.dev.java.net/
+https://roianalyst.alinean.com/microsoft/virtualization/
+https://rooms.iupui.edu:444/
+https://rooms.ulib.iupui.edu/studyrooms/index.php
+https://rpxnow.com/docs
+https://rt.cpan.org/
+https://rt.uwaterloo.ca/~wwwrt/cgi-bin/rtuser.pl
+https://rts.texasonline.state.tx.us/NASApp/txdotrts/common/jsp/txdot_vtr_main_menu.jsp
+https://ru-nbp.optimalresume.com/
+https://rusick2.msu.edu/
+https://rwjf.webex.com/ec0605l/eventcenter/recording/recordAction.do?theAction=poprecord&amp;actname=%2Feventcenter%2Fframe%2Fg.do&amp;apiname=lsr.php&amp;renewticket=0&amp;renewticket=0&amp;actappname=ec0605l&amp;entappname=url0107l&amp;needFilter=false&amp;&amp;isurlact=true&amp;entactname=%2FnbrRecordingURL.do&amp;rID=41159842&amp;rKey=a4d237de74a3b10f&amp;recordID=41159842&amp;rnd=6348785999&amp;siteurl=rwjf&amp;SP=EC&amp;AT=pb&amp;format=short
+https://s-edison.info.nih.gov/iEdison/37CFR401.jsp
+https://s.dolimg.com/toontown/en/account/registration.xml
+https://s0.bluestreak.com/ix.e?hr&amp;s=8024105&amp;n={ts '2010-09-26 14:51:27'}
+https://s044a90.ssa.gov/apps6z/i1020/main.html
+https://s100.copyright.com/AppDispatchServlet?publisherName=sageuk&amp;publication=L701&amp;title=Precarious%20beginnings%3A%20Gendered%20risk%20discourses%20in%20psychiatric%20research%20literature%20about%20postpartum%20depression&amp;publicationDate=08%2F27%2F2010&amp;author=Rebecca%20Godderis&amp;startPage=451&amp;contentID=10.1177%2F1363459309358595&amp;orderBeanReset=true&amp;publicationType=SS&amp;trimSize=234%20x%20156&amp;copyright=SAGE%20Publications&amp;isn=1363-4593&amp;endPage=466&amp;volumeNum=14&amp;issueNum=5&amp;article_permission=yes
+https://s1corp.webex.com/s1corp/onstage/g.php?t=a&amp;d=596200647
+https://s3.amazonaws.com/swt83/senateconservatives.com/uploads/scf_contribution_form.pdf
+https://sa.www4.irs.gov/irfof/lang/en/irfofgetstatus.jsp
+https://sa2.www4.irs.gov/irfof/lang/sp/irfofgetstatus.jsp
+https://sae.trustwave.com
+https://saer.llnl.gov/
+https://saf.wachovia.com/homeequity
+https://safe.nrao.edu/wiki/bin/view/Software/CasaDevUbuntu
+https://safety.army.mil/
+https://sakai.wfu.edu/portal/
+https://sales.farmbureaubank.com/
+https://sales.liveperson.net/hc/9551721/?cmd=file&amp;file=visitorWantsToChat&amp;site=9551721&amp;byhref=1&amp;AEPARAMS&amp;SESSIONVAR!StaticButtonNameNoScript=Generic
+https://sales.welchvillage.com/E-Commerce/itemList.aspx?node_id=46724
+https://salsa.democracyinaction.org/o/2215/t/7655/shop/custom.jsp?donate_page_KEY=3972
+https://sandbox1.byu.edu
+https://sante-enfants.org/
+https://sao.fraud.state.tx.us/hotline.aspx
+https://saprod.louisville.edu/
+https://sas.elluminate.com/p.jnlp?psid=2008-02-20.1127.M.9A1416A21DFCCF28E12CC933BCFCE1.vcr
+https://satprep.usnews.com/
+https://savannah.gnu.org/account/login.php?uri=/
+https://savings.eloan.com/savings?context=deposits&amp;sid=78E48820317AE7393490BA8377566F9C&amp;user=&amp;mcode=&amp;vid=
+https://sb.iigins.com/client_login/?aff_id=2149&amp;
+https://sbs-al.naic.org/Lion-Web/jsp/login/ext_provider_login.jsp
+https://sbs-ia.naic.org/Lion-Web/jsp/sbsreports/AgentLookup.jsp
+https://sbs-il.naic.org/Lion-Web/jsp/sbsreports/AgentLookup.jsp
+https://sbs-mo.naic.org/Lion-Web/jsp/sbsreports/AgentLookup.jsp
+https://sbs-nc.naic.org/Lion-Web/jsp/sbsreports/AgentLookup.jsp
+https://sbs-ri.naic.org/Lion-Web/jsp/sbsreports/AgentLookup.jsp
+https://scaccess.communityos.org/
+https://scf2010moodle.norc.org
+https://scgi.ebay.com/ebaymotors/ws/eBayISAPI.dll?RegisterEnterInfo
+https://scholarsbank.uoregon.edu/dspace/bitstream/1794/869/1/merchant.pdf
+https://scholarships.tamu.edu/
+https://scholarworks.iupui.edu
+https://scholarworks.iupui.edu/
+https://schoolalerts.iowa.gov
+https://schoolalerts.iowa.gov/
+https://schwabpt.com/pdflibrary/open.asp?id=010932
+https://sci.ats.hrsmart.com/cgi-bin/a/searchinternationaljobs.cgi
+https://sci.libertyreserve.com/?lr_acc=U5047139&amp;lr_amnt=10&amp;lr_currency=LRUSD&amp;lr_comments=12.107.176.9 h500&amp;lr_store=Proxy
+https://scifinder.cas.org/
+https://scims.keele.ac.uk/urd/sits.urd/run/siw_lgn
+https://scmagazine.wufoo.com/forms/trend-micro-inc/
+https://scprcontribute.publicradio.org
+https://sdhan.sd.gov/
+https://sdol.mastercard.com/wellsfargocards
+https://seal.globalsign.com/SiteSeal/siteSeal/profile/profile.do?p1=962a419a&p2=edec05107cb671f1b4e1ec1a61cc90c294af30adbdb34d062fec2f&p3=0ed87ae847f1f07bf81f24ab8571fa9fa02e1aff
+https://seal.starfieldtech.com/verifySeal?sealID=sJIRytC3SNx530m0c4nUYca5hZYL56xJQbeF5nmyblKFu1afMJZMi
+https://seal.verisign.com/splash?form_file=fdf/splash.fdf&amp;dn=WWW.DISCOVERBANK.COM&amp;lang=en
+https://sealinfo.thawte.com/thawtesplash?form_file=fdf/thawtesplash.fdf&dn=WWW.EKLASSIK.DE
+https://sealinfo.trust-network.cn/info?dn=www.expo2010.cn
+https://sealinfo.verisign.com/splash?form_file=fdf/splash.fdf&amp;type=GOLD&amp;sealid=1&amp;dn=www.libertymutual.com&amp;lang=en
+https://seals.networksolutions.com/siteseal_seek/siteseal?v_shortname=NETSP&amp;v_querytype=W&amp;v_search=www.richdadworld.com&amp;x=5&amp;y=5
+https://sealserver.trustkeeper.net/compliance/cert.php?code=w6oj3BWieJraByusmKaQ7ViTFoI8Ww&amp;style=normal&amp;size=105x54&amp;language=en
+https://sealserver.trustwave.com/compliance/cert.php?code=w6o8pBo5yJraVGcHKItmg3XmgYYgvC
+https://seamensbank.ebanking-services.com
+https://search.thawte.com/support/ssl-digital-certificates/index.html
+https://sears401k.ingplans.com/
+https://secondlife.com/my/account/?lang=en-US
+https://secunia.com/community/profile
+https://secure-2.dllr.state.md.us/NetClaims/Welcome.aspx
+https://secure-5.cedant.com/powerhomebiz/business/orderbanner.htm
+https://secure-alumni.bu.edu/olc/pub/BUAR/events/BUAR2305999.html
+https://secure-deanbank.com/Common/EnrollOnline/EnrollChoice.asp
+https://secure-email.starfinancial.com/s/login?b=starfinancial
+https://secure-firstbankak.com/Common/SignOn/Start.asp
+https://secure-myprovident.com/common/signon/start.asp
+https://secure-romabank.com/Common/SignOn/Start.asp
+https://secure-www.jnj.com/wps/wcm/jsp/contactUs.jsp
+https://secure-www.novell.com/center/regadmin/jsps/activate_app.jsp
+https://secure.53.com/mortgage/app/rates
+https://secure.abs.gov.au/websitedbs/D3310114.nsf/0/86158083b1e61cc5ca256ac5007eac24/$FILE/SenateReportCalendarYear2009Published.pdf
+https://secure.accesshorizon.com/cgi-bin/hbproxy.exe/1478/signon
+https://secure.acgov.org/
+https://secure.aclu.org/site/SPageServer?pagename=june_home
+https://secure.addthis.com/bookmark.php?v=250&amp;pub=getafreelancer
+https://secure.admin.illinois.edu/osfa/vjb/
+https://secure.ahima.org/ace/directory/default.aspx
+https://secure.ajws.org/site/Donation2?df_id=3460&3460.donation=form1
+https://secure.allstatebank.com/online/Allstate/retail/Login.asp
+https://secure.ally.com/allyWebClient/login.do
+https://secure.americanbaby.com/bhg/store/checkout/partner/?promoCode=I401VADF2&ordersrc=offersquest
+https://secure.americares.org/site/Donation2?df_id=5820
+https://secure.ampbanking.com/online/get-started.jsp
+https://secure.ampsecure.com.au/apply_to_win.aspx
+https://secure.andera.com/index.cfm?fiid=C7D7E3F4E2C14DB6990FB173A3380DAC
+https://secure.anpac.info/ClientServices//Login.aspx
+https://secure.apps.nd.gov/dhs/csi/login.aspx
+https://secure.apps.state.nd.us/gnf/onlineservices/lic/public/online/main.htm
+https://secure.arb.ca.gov/ssldoors/doors_reporting/reporting.php
+https://secure.asbonline.com/overdraft/index.aspx
+https://secure.ashop.com.au/checkout.asp?VD=56B479045604AD7D1C2938B817473DB8F0B4A91514B95149
+https://secure.austlii.edu.au/cgi-egate/contribute.cgi
+https://secure.authorize.net/
+https://secure.azstatejobs.gov/pljb/azgovjobs/mainjb/applicant/index.jsp
+https://secure.bancinternetgroup.com/2559/mirror/index.asp?page=2312
+https://secure.bankanytime.com/dexc/index.cgi
+https://secure.bankersinsurance.com/AgentSignup.aspx
+https://secure.bizjournals.com/subscribe/selectTerm?market=phoenix&amp;iana=csnav&amp;csrc=6310
+https://secure.bluehost.com/~carleeor/irata/cgi-local/shop.pl/SID=1245159944.308/page=email.html
+https://secure.bncollege.com/webapp/wcs/stores/servlet/FacultySplashLoginView?storeId=52084&amp;jspStoreDir=ConsumerDirectStorefrontAssetStore&amp;catalogId=10001&amp;langId=-1&amp;langId=-1&amp;krypto=2tCxhs6TtnbPbzfZYp3RqznhzBqdi70i5izuqBhMRJo63qAamgVi9mHHUxYl0Oz034M3nmcbZdth%0AzPH8pOX1qQ%3D%3D
+https://secure.botw.org/secure/signin.aspx
+https://secure.bpa.gov/TrainingResources/Login.aspx?ReturnUrl=%2fTrainingResources%2findex.aspx
+https://secure.brainpop.com/store/
+https://secure.bravofly.com/payment/html/certification_bravofly.html
+https://secure.broadwayfederalbank.com/index.asp
+https://secure.bswift.com/default.asp?abbrev=johnsonins
+https://secure.business.com/crm/Login.do
+https://secure.cacert.org/
+https://secure.camis.com/wa/
+https://secure.carlyforca.com/donate/
+https://secure.cbbank.com/cgi-bin/hbproxy.exe/1177/signon
+https://secure.cdle.state.co.us/CR100/
+https://secure.centralpacificbank.com/CPB/ForgottenPassword/ForgotYourPassword.aspx
+https://secure.chambermaster.com/directory/jsp/events/dlg/Public_AddReg.jsp?ccid=568&amp;eventid=1263
+https://secure.chasehosting.com/cart.php
+https://secure.churchmutual.com/index.aspx
+https://secure.ciachef.edu/Culinary%2520Math/CulinaryMath1/index.htm
+https://secure.citizens1st.com/cgi-bin/hbproxy.exe/1175/signon
+https://secure.clearcenter.com/portal/checkout1.jsp
+https://secure.co.yellowstone.mt.gov/clerk/secure_search.asp
+https://secure.collectinsure.com/selfserve/Login.asp
+https://secure.comodo.com/products/frontpage?&amp;area=SSL&amp;product=287
+https://secure.comodo.net/products/frontpage?ap=CompleteWebServices&amp;reseller=y&amp;area=Reseller&amp;product=29
+https://secure.consumersunion.org/site/Advocacy?id=1732
+https://secure.cox.com/Service/offers/FeaturedOffers.aspx
+https://secure.crs.org/site/Donation2?df_id=3181
+https://secure.customersvc.com/servlet/Show?WESPAGE=td/home.html&MSRSMAG=TD
+https://secure.defenders.org/site/Advocacy?id=1059
+https://secure.delicious.com/login
+https://secure.diigo.com/sign-in?referInfo=http%3A%2F%2Fwww.diigo.com
+https://secure.djnewsletters.com/OJ/OJGetInfo.aspx
+https://secure.domainbank.com/DDS/index.php?siteid=38206
+https://secure.donationreport.com/donate.html?key=57BKUYGCDV4V
+https://secure.dor.state.or.us/refund/index.cfm
+https://secure.dri.edu/Moodle
+https://secure.eff.org/site/Advocacy?alertId=389&pg=makeACall
+https://secure.electracash.net/Corporate/helpdesk.aspx
+https://secure.element5.com/shareit/checkout.html?productid=158384&js=-1&affiliateid=74141
+https://secure.entango.com/donate/bHqxGcDbM2g
+https://secure.entrust.com/forms/eac-demo/index.htm
+https://secure.eon-us.com/common/CallCenterMail/contact_lge_streetlight.asp
+https://secure.ethicspoint.com/domain/en/report_custom.asp?clientid=2584
+https://secure.eznettools.net/D305742/X367200/refs/orac.html
+https://secure.fabianrodriguez.com/blog/profil/&amp;wpmp_switcher=mobile
+https://secure.farmbureaubank.com/FarmBureauBankOnline/Authentication/Login.aspx?c=1
+https://secure.fastmex.com
+https://secure.filesanywhere.com/
+https://secure.firstbancorp.com
+https://secure.firstbancorp.com/business/merchant_services.aspx
+https://secure.freepress.net/site/SPageNavigator/NN_members
+https://secure.freerepublic.com/donate/
+https://secure.fundadmin.com/clients/
+https://secure.fundsxpress.com/piles/fxweb.pile/fx
+https://secure.ga3.org/03/donate_200901DYP
+https://secure.gamcare.org.uk/counselling
+https://secure.gettyimages.com.au/Account/signin.aspx
+https://secure.gettyimages.com/Account/signin.aspx
+https://secure.globalproblems-globalsolutions.org/site/Donation2?idb=1649881960&df_id=1240
+https://secure.glynn.com/UnitedBankVA/comments.asp
+https://secure.gotoassist.com/commerce/buy?catalog=3
+https://secure.groundspring.org/dn/index.php?aid=17054
+https://secure.haaretz.co.il/hasen/objects/pages/SubscribeEn.jhtml
+https://secure.health.columbia.edu
+https://secure.healthcareerweb.com/postajob/
+https://secure.healthx.com/hfhp.aspx
+https://secure.heritage.org/stocktransfer.cfm
+https://secure.highlandcc.edu/Site/Admissions/Request_Information.php
+https://secure.hometownannapolis.com/cgi-bin/dynsubscribe.pl?SEQ=COMBINED&amp;STEP=START&amp;LCODE=JAVAMENU
+https://secure.hostallstates.com/
+https://secure.hostgator.com/~billing/
+https://secure.hosting4less.com/codesigningsignup.html
+https://secure.hsabank.com/ibanking
+https://secure.humanesociety.org/site/Advocacy?pagename=homepage&id=4669
+https://secure.icandocs.org/icanweb/index1.asp
+https://secure.idg.com.au/subs/buy.php?id=1
+https://secure.ihaveaplaniowa.gov/default.aspx
+https://secure.imisfriendraising.com/registrant/SponsorSearch.aspx?EventID=9727&amp;LangPref=en-CA
+https://secure.in.gov/sos/bus_service/online_corps/name_search.aspx
+https://secure.indystar.com/circulation/
+https://secure.informaction.com/download/releases/noscript-2.0.3.2.xpi
+https://secure.ingdirect.com/myaccount/InitialINGDirect.html?command=displayLogin&amp;device=web&amp;local=en_US&amp;userType=Client
+https://secure.instantssl.com/renew/landing/index.html?u=
+https://secure.integrabank.com/contact/
+https://secure.internetretailer.com/IRCE2010/women-in-ecommerce/
+https://secure.iso.com/ils/1500/
+https://secure.johnsontrust.com/reliusweb/sponsor.aspx
+https://secure.kentucky.gov/portal/login.aspx
+https://secure.ket.org/support/
+https://secure.latimes.com/services/site/registration/
+https://secure.lds.org/units/login/0,8029,779-1,00.html
+https://secure.leapfile.com/fts/drop/custom/Index.jsp
+https://secure.livingthecountrylife.com/bhg/store/checkout/partner/index.jsp?promoCode=I6055LD12&_loopback=1&_requestid=33007
+https://secure.loanspq.com/Consumer/login/default.aspx?LenderID=96bbd9805da24cdc93e7837594f1f473
+https://secure.logmein.com/welcome/documentation/EN/pdf/Hamachi2/LogMeIn_Hamachi2_GettingStarted.pdf
+https://secure.logmeinrescue.com/
+https://secure.lonelyplanet.com/members/registration/new
+https://secure.lunarpages.com/tracking/cgi-bin/clickthru.cgi?id=webhosti
+https://secure.marylandmva.com/eMVAServices/VRR/AdminFee_Info.asp?sku=adminfee
+https://secure.mdausa.org/Gift.aspx
+https://secure.meetup.com/login/
+https://secure.metacafe.com/account/login/?token=619751e5212054f616c9d90a1077a58a&amp;action=register
+https://secure.mexadventure.com/app2/QuoteForm.cfm
+https://secure.military.com/leads/VALoan/VALoanLeadForm1.jsp
+https://secure.missingkids.com/missingkids/servlet/CybertipServlet?LanguageCountry=en_US
+https://secure.mydomain.com/
+https://secure.myprepaidbalance.com/default.asp
+https://secure.myspace.com/index.cfm?fuseaction=login.simpleform&amp;featureName=postToV3&amp;dest=http%3a%2f%2fwww.myspace.com%2fModules%2fPostTo%2fPages%2fdefault.aspx%3fu%3dhttp%253A%252F%252Fwww.sfsu.edu%252F%257Enews
+https://secure.nai.com/apps/downloads/my_products/login.asp?region=us&amp;segment=small
+https://secure.naifa.org/renewals/RenewalsMain.htm
+https://secure.nashville.gov/sportsplex/class_reg.htm
+https://secure.ncsoft.com/
+https://secure.netbilling.com/public/docs/agent/public/directmode/repinterface1.4.html
+https://secure.nickjrboost.com/index.php
+https://secure.nmmstream.net/anon.newmediamill/aspen/kcfinalenglishbookweb.pdf
+https://secure.nrai.com/private/efile/login.asp
+https://secure.nrdconline.org/site/Advocacy?id=1711
+https://secure.nypost.com/homedelivery/signup.htm
+https://secure.onid.oregonstate.edu/login?service=cws_osucal&amp;url=http%3A%2F%2Fcalendar.oregonstate.edu%2Fosu%2Fsubmit%2F
+https://secure.onlineaccess.net/cart/manage.php?ID=15ca6a998f1f6627692861cfa485ec22
+https://secure.onlineaccess1.com/midsouthbankonline/help/37_Online Help_Login.html
+https://secure.opinionlab.com/ccc01/o.asp?ID=WpkpVtTB
+https://secure.oxfamamerica.org/site/Donation2?df_id=3560
+https://secure.oxfordjournals.org/basket.html
+https://secure.pageuppeople.com/apply/315/applicationForm/
+https://secure.palgrave-journals.com/subscribe/ap
+https://secure.palmcoastd.com/pcd/document?ikey=020DA9H51
+https://secure.palmettobank.com/cgi-bin/hbproxy.exe/1112/signon
+https://secure.parents.com/bhg/store/checkout/partner/%3Bjsessionid%3DMOQC3AAMMBM0ACQCEARR42Q?promoCode=I710VNW02&DPSLogout=true&_requestid=19663
+https://secure.paypal.x.com/affil/pal=mayank_raja%40hotmail.com
+https://secure.pearljam.com/store/product.spring?sku=6285
+https://secure.perfect.com/website/ssr/ssrstep1.aspx?customerid=frbEMGR
+https://secure.peta.org/site/Donation2?df_id=4500&amp;4500.donation=form1&amp;set.custom.Campaign_Code=H10JWCXXXXG&amp;autologin=true
+https://secure.pf.com/Eletter.asp?product=ILR
+https://secure.phila.gov/PaymentCenter/AccountLookup/
+https://secure.piryx.com/donate/DZR8yeIn/Fallon-for-Congress/
+https://secure.plaind.com/webgateway/TransactionType.asp
+https://secure.plimus.com/jsp/developer_login.jsp
+https://secure.post.harvard.edu/olc/pub/HAA/onlinegiving/showGivingForm.jsp?form_id=103
+https://secure.presidential.com/ovrdraft.htm
+https://secure.publicbroadcasting.net/kalw/default/form.pledgemain
+https://secure.pulseaccess.net/cadencebanking/consumer/
+https://secure.qgiv.com/cps_donors/?key=MRLAQ6SSBMWCRN3R2P9R
+https://secure.registerapi.com/KM/KnowledgeBase/script_view_document.php?data_id=827
+https://secure.reotrainingsolutions.com/moodle
+https://secure.rewardstep.com/b2r/RazrLogin.do?bankUrl=GORewards&amp;browse=1&amp;varid=RAZR_FD&amp;num=1&amp;zip=1&amp;programid=1
+https://secure.rodale.com/webapp/wcs/stores/servlet/OaeEntryPage?storeId=10057&amp;mktOfferId=HLH31125&amp;keycode=117906&amp;cm_mmc=Military%20-_-Product-_-Hidden%20Fast%20Food%20Fixes-_-Cook%20This%20Not%20That%20RL
+https://secure.sces.org/PDIC/GatewayServlet?hptAppId=ICFJREG%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&amp;hptExec=Y
+https://secure.sell.com/registration/?b=http%3A%2F%2Fwww.sell.com%2Fmystuff%2F
+https://secure.sharefile.com
+https://secure.sharefile.com/
+https://secure.shareit.com/shareit/checkout.html?PRODUCT%5B300248273%5D=1
+https://secure.sheffieldfinancial.com/newLoanApplication.aspx
+https://secure.shopfitter.com/thawte.htm
+https://secure.sitbetter.com/geoforward.php
+https://secure.skipjack.com/
+https://secure.smartoutline.com/Pages/Topics/Products/Business/BusinessOverview.asp
+https://secure.societyinsurance.com/agentservices/default.aspx
+https://secure.sophos.com/security/notifications/
+https://secure.sos.state.ga.us/myverification/
+https://secure.southside.com
+https://secure.southside.com/OnlineBanking/Authentication/Login.aspx
+https://secure.spacegrant.org/vasts
+https://secure.spine-health.com/
+https://secure.ssa.gov/apps6z/i1020/main.html
+https://secure.starfinancial.com/cgi-bin/hbproxy.exe/1111/signon
+https://secure.stormer.us/~dansie/cgi-bin/remote_hosting.pl?login
+https://secure.tcfexpress.com/tcf/OnlineBanking/index.jsp
+https://secure.teladoc.com/secure/member/healthvault.php
+https://secure.thebenefitbank.com/ums?task=request_password_reset
+https://secure.thepaymentwindow.com/epayments/default.asp?siteId=11165&amp;siteLoc=REG93E8FE78
+https://secure.tibbank.com/internetbanking/enroll/?formName=personal
+https://secure.townnews.com/wdnweb.com/subscriber_services/
+https://secure.travelers.com/about-us/careers/Careers-Marketing.aspx
+https://secure.trust-guard.com/certificates/www.iportis.com
+https://secure.tucson.com/ezaccess/
+https://secure.tx.acer.com/RCDB/Main.aspx?brand=acer
+https://secure.tx.acer.com/RCDB/Main.aspx?brand=emachines
+https://secure.txdps.state.tx.us/DPS_WEB/Support/Faq/popup.aspx?QuestionID=100
+https://secure.ubt.com/opt
+https://secure.ufsdata.com/pbi_pbi1961/pbi1961.asp?rt=075902104&amp;logonby=connect3&amp;prmaccess=account&amp;enroll=true
+https://secure.umassfive.org/
+https://secure.unicef.ca/portal/SmartDefault.aspx?at=1277&amp;nbnets=5
+https://secure.unicefusa.org/site/Donation2?df_id=8320&amp;8320.donation=form1
+https://secure.usnews.com/premium/login?referer=/premium/weekly.jsp
+https://secure.utah.gov/cas/search?page=searchMenu
+https://secure.valisinternational.com/?pg=join
+https://secure.vandyke.com/cgi-bin/subscribe.php
+https://secure.vermont.gov/dmv/express
+https://secure.versaedge.com/jpackages_cart/checkout.php
+https://secure.vetcentric.com/eStore/index.cfm?eStoreVetID=MjEyMTQ5&amp;CatalogBrowse=true&amp;eStore=true
+https://secure.vitamix.com/acb/stores/4/Vita-Mix-5200-Deluxe-Package-P749C0.aspx?SID=4&amp;COUPON=06-001023
+https://secure.volagratis.com/payment/html/certification_volagratis.html
+https://secure.webhostinghub.com/whub/choose_domain.php
+https://secure.webwiz.co.uk/clientarea/
+https://secure.whatsnextillinois.org/College_Planning/Applications_and_Transcripts/Applications_and_Transcripts.aspx
+https://secure.wikileaks.org/wiki/Wikileaks
+https://secure.wikimedia.org/otrs/index.pl?Action=AgentTicketZoom&amp;TicketNumber=2010090110001238
+https://secure.wilink.com/asp/NA000237/hqgold/NA000237_search_ENG.asp?target=NA000237
+https://secure.worldcommunitygrid.org/ms/viewMyProfile.do
+https://secure.wvinsurance.gov/Agents
+https://secure.www.alumniconnections.com/olc/pub/GAUB/event/showEventForm.jsp?form_id=3553
+https://secure.yourpatriot.com/ou/mickmulvaney/865/donate.aspx
+https://secure.zurichna.com/zus/zurichus.nsf/pages/My+Zurich?OpenDocument&amp;login
+https://secure02.bankhost.com/cardviewonlinenow/united
+https://secure02.kidshealth.org/classroom/kh_misc/tip.html
+https://secure02.principal.com/forms/corporate/401kchallenge.htm
+https://secure1.ddpdelta.org/ddpca_secure/ddic/ddic_service_request.asp
+https://secure1.inmotionhosting.com/cgi-bin/gby/clickthru.cgi?id=whgeeks&amp;page=8
+https://secure1.mfbank.com/PBI_PBI1961/PBI1961.asp?Rt=084201621&amp;LogonBy=Connect3&amp;PRMAccess=Account&amp;User=True&amp;WCI=FtuLogon&amp;WCE=Show&amp;Enroll=True
+https://secure1.spokesmanreview.com/webbase/en/net47/jsp/WebBaseMain.do
+https://secure2.360training.com/vu3/index.cfm?event=home&amp;cid=2173
+https://secure2.arcot.com/vpas/VBCVBV_vbvisa/enroll/index.jsp?locale=en_US&amp;bankid=1890
+https://secure2.convio.net/uwo/site/Donation2?df_id=2800&amp;2800.donation=form1
+https://secure2.fundsxpress.com/secure/SZNABCRM/employment.htm
+https://secure2.johnsonintl.com/PositivePayV4/
+https://secure2.matchbin.com/pages/business_directory
+https://secure2.presidential.com/PBM_App
+https://secure2.thestreet.com/cap/prm.do?PID=PRFR-0003&amp;OID=001382
+https://secure2.wbur.org/wburdefault.asp?P=ONPOINTWEB&amp;C=FR
+https://secure3.convio.net/fbnyc/site/Advocacy?cmd=display&amp;page=UserAction&amp;id=125
+https://secure3.thestreet.com/StoreFront/
+https://secure3.webaccess1.com/forms/308201/card_application.html
+https://secure4.amfam.com/MyAccount/enrollment/main.do
+https://secure4.arcot.com/vpas/cbkz38mc/i18n/en_US/index.html
+https://secure4.bankersinsurance.com
+https://secure4.bankersinsurance.com/Consumer/
+https://secure4.billerweb.com/sai/JustPayIt/jpt.do
+https://secure4.tibbank.com/ilockboxnet/
+https://secure40.securewebsession.com/lotting.site.aplus.net/cgi-bin/mivavm?/mm5/merchant.mvc+Session_ID=7cfca18a6d5cde25b83dd02bd438d567&Screen=OINF&Order=0&Store_Code=NPAG
+https://secure5.arcot.com/vpas/fisa001845mc_MC/enroll/index.jsp?locale=en_US&amp;bankid=2336
+https://secure5.onlineaccess1.com/FirstBancorpOnline_TEST/DEMO/demo.htm
+https://secure53.onlineaccess1.com/vikingBankOnline/Authentication/Login.aspx
+https://secureaccess.iberiabank.com/merchantcapturewebclient/default.aspx
+https://secureapp.dhs.state.ia.us/childsupport/welcome.asp
+https://secureapps.regions.com/oao/app01.aspx?type=prefplus
+https://securebank.regions.com/login.aspx
+https://securecitizens1st.onlineaccess1.com/OnlineEnrollment/Online_Banking_Enrollment.html
+https://secured.insurance.ohio.gov/Secured/OdiLogon/SecuredLogon.aspx
+https://secured.kenexa.com/bbt/cc/Home.ss?ccid=bupJEdUjsTs%3D
+https://secureemail.cascadebank.com/websafe/pxenroll
+https://secureevents.webex.com/mw0305l/mywebex/default.do?siteurl=secureevents&amp;service=6
+https://secureforms.c3vault1.com/forms/midcountrybank/overdraft-privilege.asp
+https://securemail-chemicalbankmi.com/s/login?b=chemicalbank
+https://securemail-greatwesternbank.com/s/login?b=greatwesternbank
+https://securemail-leebank.com
+https://securemail.yourcommunitybank.com
+https://securentrycorp.calbanktrust.com/
+https://securentrycorp.vectrabank.com/
+https://securepay.tdbank.com/cgi/tdbankExpress-bin/vortex.cgi
+https://securepostplaza.tntpost.nl/tracktrace/
+https://secureprocessing.net/Order.html
+https://securerpc.chemicalbankmi.com/
+https://securestore2.hosting4less.com/digitalanarchy/mm5/merchant.mvc?Session_ID=10714166d509c602a089148ee3d9ba8d&Screen=OINF&Store_Code=DA
+https://securetabs.net/checkout.html
+https://secureweb2.hqda.pentagon.mil/vdas_armyposturestatement/2010/information_papers/index.asp
+https://security.buffalo.edu/certificates/outlook2003/thawte
+https://security.drupal.org/frontpage
+https://security.ingemployeebenefits-us.com/eSecurity/tiles/employer_login.jsp
+https://securitycenter.verisign.com/celp/enroll/outsideSearch?application_locale=VRSN_US&amp;originator=VeriSign:CELP
+https://segue.middlebury.edu/view/html/site/segue
+https://select.gateway.com/store/loginscreen.html?
+https://select.nytimes.com/mem/email.html
+https://self-evident.org/?p=851
+https://selfserve.thebenefitbank.com/
+https://selfservice.combinedinsurance.com
+https://selfservice.combinedinsurance.com/app/self-service-web/security.html?userType=customer&amp;siteLanguage=en&amp;siteCountry=us
+https://selfservice.ibb.ubs.com/idm/user/ubs/ubs_selfServiceWelcome.jsp
+https://selfservice.lakecountyfl.gov/mssbcc/
+https://selfsolve.apple.com/GetWarranty.do
+https://sell.freddiemac.com/
+https://sellercentral.amazon.com/
+https://sellout.woot.com/Member/YourAccount.aspx
+https://senateconservatives.com/takeamericaback
+https://sentry.isc.upenn.edu/intouch/
+https://server.db.kvk.nl/TST-BIN/FU/TSWS001@?BUTT=30224104
+https://server.iad.liveperson.net/hc/66651396/?cmd=file&amp;file=visitorWantsToChat&amp;site=66651396&amp;byhref=1&amp;ref=chatbubble
+https://server14.cey-ebanking.com/CLKCCM/125107626/login.asp?ID=902317179
+https://server2.ufsdata.com/mbi_mbi1151/mbi1151.aspx?RTN=075909945&amp;RID=3002
+https://server29.cey-ebanking.com/CLKPCB/125107626/form-enrollment.asp
+https://service.esri.com/index.cfm?fa=homepage.feedback.customer_serviceform
+https://service.futurequest.net/rss/index.php?_m=knowledgebase&amp;_a=view&amp;kbcategoryid=6
+https://service.govdelivery.com/service/multi_subscribe.html?code=USFRBNEWYORK&amp;origin
+https://service.liveperson.net/hc/s-2967437/web/m-DI/ticketlogin/inboxcontroller.jsp?cmd=newmsg
+https://service.o2online.de/portal/commerce/displayHardwareDetails?cid=NewCustomerWebshopPostpaid&hwid=4510+020109+00&tid=N-HWO-H-NC-20&o2_type=goto&o2_label=flash/aktionen-milestone-linkurl2
+https://service.thrivent.com/apps/locate/AdvSearchAction.do
+https://service.usatoday.com/shop/index.html
+https://servicearizona.com/webapp/vehicle/plates/start.do
+https://servicecenter.verisign.com/
+https://serviceonline.ameriprise.com/portal/site/serviceonline/public/ManageYourPolicy?PartnerID=Ford
+https://services.autex.com/common/main.jsp
+https://services.georgia.gov/dhr/cspp/do/public/Welcome;jsessionid=cf0d1e9e75a08ffffffffc5d3c9e28e6400d:ymHt
+https://services.google.com/fb/forms/rusales/
+https://services.myngc.com/sites/OneISP/Pages/Login.aspx
+https://services.ptcmysore.gov.in/emo
+https://services.wakegov.com/obl
+https://services.westpac.com.au/calculators/savings/comparison/
+https://services.wsj.com/Gryphon/jsp/retentionController.jsp?page=9936
+https://services.wsje.com/ssl/subscriptions/index.asp
+https://services3.cic.gc.ca/epayweb/Welcome.do?lang=fr
+https://servicing.capitalone.com/c1/login.aspx?CountryCode=CA
+https://sh.webhire.com/public/880/
+https://shaduc.wordpress.com/
+https://sharehcm.state.nm.us/psp/nmhp89/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL
+https://sharis.myguestaccount.com/login/newuser.jsp
+https://sharp.ks.gov/ESS/signon.html
+https://shipit.ubuntu.com/
+https://shoemoney.infusionsoft.com/go/adversity/
+https://shop.computerstore.psu.edu/category.cfm/computers/softwaredatamath
+https://shop.ingdirect.com
+https://shop.ingdirect.com/
+https://shop.theanimalrescuesite.com/
+https://shop.thechildhealthsite.com/
+https://shop.thehungersite.com/
+https://shop.therainforestsite.com/
+https://shop.vipreantivirus.com/582/cookie?affiliate=12653&amp;redirectto=https%3a%2f%2fwww.cleverbridge.com%2f582%2fpurl-VIPREPremium
+https://shopmdot.ms.gov/shopmdot/default.aspx?StoreIndex=0
+https://shopplugin.net/store/
+https://shopstaywell.com/OA_HTML/ibeHome_arr.jsp?dbprod_prod=BQIa-cJi_mFuiIkskGdykijm:S&amp;dbprod_prod_pses=ZG349D8575990215905208B7BF96D7FA951FD4EC5506E275FF764C2B8F6926A345379C93706D63BC993A8AB6C3CD7C42E72E8ABAF1E1503832901FCC5DF183EAB6
+https://signin.ebay.com/ebaymotors/ws/eBayISAPI.dll?SignIn
+https://signin.evri.com/openid/v2/signin?token_url=http%3a//www.evri.com%3a80/%3bjsessionid%3dwup1ibn9o9mj%3fwicket%3abookmarkablePage%3d%3acom.evri.portal.web.account.RpxAuthenticationPage%26return_url%3d/%253Bjsessionid%253Dwup1ibn9o9mj
+https://signup.cj.com/member/brandedPublisherSignUp.do?air_refmerchantid=1121438
+https://signup.cleveland.com/dashboard/edit.html?openid_tos_check=1&amp;return_to=http%3A%2F%2Fwww.cleveland.com%2Fbrowns%2Findex.ssf%2F2010%2F09%2Fis_it_really_time_to_ponder_th.html
+https://signup.hostgator.com/hg/dedicated-13
+https://signup.live.com/
+https://signup.wosbee.com
+https://signup.wosbee.com/
+https://signup1.pair.com/signup.pl?n,D
+https://signups.myspace.com/index.cfm?fuseaction=signup
+https://silver.health.utah.gov/
+https://sisc.eservice.metlife.com/open/indexhtml.jsp
+https://sisweb.ohsu.edu/SISPRD/twbkwbis.P_WWWLogin
+https://site.com/
+https://sitecanary.com/
+https://siteexplorer.search.yahoo.com/search?p=3wishes.com
+https://sitekey.bankofamerica.com/
+https://sitepoint.com/bookstore/go/157
+https://sites.fastspring.com/amanitadesign/instant/machinarium
+https://sites.google.com/site/kotukotuzimiti/
+https://sites.secure.force.com/appexchange/listingDetail?listingId=a0N300000024L4CEAU
+https://sites.stockpoint.com/dain/newspaper.asp?site=D&amp;Mode=Insurance&amp;Story=20090125/025e0137.xml
+https://sites.target.com/site/en/corporate/page.jsp?contentId=PRD03-005171
+https://siteseal.thawte.com/support/index.html?page=content&amp;id=SO12658
+https://siteuptime.com/prem_statistics.php?Id=3804&amp;UserId=21624
+https://sjobs.brassring.com/1033/ASP/TG/cim_home.asp?partnerid=25084&siteid=5129
+https://skydrive.live.com/sharefavorite.aspx%2f.SharedFavorites??marklet=1&amp;mkt=en-us&amp;url=http%3a%2f%2fwww.colliersheriff.org%2findex.aspx%3fpage%3d2213&amp;title=Sign+up+for+News+and+Press+Releases&amp;top=1
+https://slacportal.slac.stanford.edu/
+https://slacspace.slac.stanford.edu/sites/lcls/Pages/Default.aspx#crossLink
+https://smallbusiness.dnb.com/webapp/wcs/stores/servlet/sealtarget?storeId=10001&amp;Language=EN&amp;sealID=18FD8C35-BB74-4EAE-821E-678DA7ED71F3&amp;key=804336709&amp;country=US&amp;cmeid=EOR100276
+https://smarticon.geotrust.com/smarticonprofile?Referer=http://berkshirebank.com
+https://smartmall.net-smart-inc.com/chamber/shop/viewcart.cfm
+https://smartrac.nashville.gov/newvendorlogin.aspx
+https://smartserve.org/
+https://smp-01.verizonbusiness.com/certinfo/certified.do?CERTID=070107KR800
+https://smpconsole.cybertrust.com/certinfo/certified.do?CERTID=120105G800
+https://snap.icwgroup.com/Agent.html
+https://solutions.mckinsey.com/ClimateDesk/default.aspx
+https://solutions.opentext.com
+https://solutionsfinder.ingdirect.com/SolutionsFinder/index/welcome.vm?s=EZO
+https://songcontest.nasa.gov/top40.aspx
+https://sourceforge.net/apps/mediawiki/pdl/index.php?title=Installing_PDL_on_Windows
+https://sp.onlinelibrary.wiley.com/secure/redirect.pl
+https://spamadmin.operationenterprise.com/
+https://spanish.metbank.com/
+https://sparks.hks.harvard.edu/ics
+https://specialreports.fcc.gov/wcb/Form477/
+https://spectator.org/donate
+https://spotlite.acsgs.com
+https://spreadsheets.google.com/viewform?key=0Aru_R294Ok9DcDNBZXZqQklvcDFpYTVfUUR0RldRUmc&amp;hl=en
+https://spreadsheets0.google.com/viewform?formkey=dFdqSlZaVjJVOVFUSTZPdXFOOXZsd3c6MQ
+https://spreadsheets1.google.com/a/google.com/viewform?hl=en&amp;formkey=dGdfTTA2eGhFT0c0SDVLXzMzMFNwUUE6MA#gid=0
+https://spselearning.sps.k12.mo.us
+https://squareup.com/
+https://srv111.services.gc.ca/INT_01.aspx?lang=f
+https://ssd.collegeboard.com/ssd/coordinator/SefAction.action
+https://ssd.eff.org/book/export/html/14
+https://ssl-certificate-center-enterprise.thawte.com/vcce/enterprise/enterprise_account_enroll?application_locale=THAWTE_US
+https://ssl-certificate-center.thawte.com/process/retail/thawte_trial_initial?application_locale=THAWTE_US
+https://ssl-certificate-center.verisign.com.au/process/retail/console_login?application_locale=VRSN_AU
+https://ssl-certificate-center.verisign.com.hk/process/retail/console_login?application_locale=VRSN_HK
+https://ssl-certificate-center.verisign.com.sg/process/retail/console_login?application_locale=VRSN_SG
+https://ssl-certificate-center.verisign.com/process/retail/console_login?application_locale=VRSN_US
+https://ssl.banknd.nd.gov/contact_us/index.html
+https://ssl.bbibiofuels.com/bmm/subscribe-payment.jsp
+https://ssl.bing.com/rewards/signup/SEGetStarted?form=MRWHPG&amp;publ=Bingblog&amp;crea=EML_MRWHPG_Rewards_PreviewPS0921_Bingblog_1x1
+https://ssl.doas.state.ga.us/VendorDB/mainframe.jsp
+https://ssl.drgnetwork.com/ecom/chp/cgi/subcustserv/start?org=CHP&amp;publ=HL
+https://ssl.drqueue.org/redmine/projects/drqueue/wiki/Connecting_Blender_25_to_DrQueue
+https://ssl.facebook.com/roadblock/?next=http%3A%2F%2Fwww.facebook.com%2Fn%2F%3Fprofile.php%26id%3D560604315%26v%3Dwall%26story_fbid%3D152839801416646%26mid%3D3089ccaG20530307G56e7e7dG37%26n_m%3Delinora%2540alum.wellesley.edu%26d
+https://ssl.healthcentral.com/special-offers/Synvisc/
+https://ssl.isr.umich.edu/hrs/start.php
+https://ssl.linksynergy.com/php-bin/reg/sregister.shtml?mid=24462&amp;no_r=1
+https://ssl.propel.com/
+https://ssl.rand.org/cgi-bin/cart.pl?look%7Cpubs
+https://ssl.sc.gov/SpendingTransparency/BudgetTransparencyMain.aspx
+https://ssl.search.live.com/listings/ListingCenter.aspx
+https://ssl.selectpayment.com/mp/hawthornbank/login/page.aspx
+https://ssl.trustwave.com/ssl-premium-ev.php?rsid=8beb7f54df
+https://ssl.whoglue.net/nasbic/search/default2.cfm?showSearchForm=yes
+https://ssl13.cyzap.net/dzapps/dbzap.bin/apps/assess/webmembers/tool?pToolCode=TAB9&amp;pCategory1=TAB9_CERTSEARCH&amp;Webid=SAFEKIDSCERTSQL
+https://ssl3.ama-assn.org/apps/hr/x-check/amajobs.cgi?position=1170
+https://ssl4.nevadafederal.org/SilverLink/Login/LoginHelp.aspx
+https://ssl4.westserver.net/johnsonwoolenmills/mm5/merchant.mvc?Session_ID=b01d645f4144c8914d6fe57b9dce59c7&Screen=OINF&Store_Code=JWM
+https://sso.forum.nokia.com/login?locale=en&amp;service=http://www.forum.nokia.com/dynamic/j_acegi_cas_security_check
+https://sso.tamus.edu/
+https://ssol.columbia.edu
+https://ssol.columbia.edu/
+https://ssoweb.scif.com/PasswordReset/passwordResetIndex.jsp
+https://st.llnl.gov
+https://staff.owens-minor.com/companyinfo/whoisom/locations/Pages/HODirections.aspx
+https://staging.ubat.com/PERSONAL/mortgagesfixed.aspx
+https://standard.boocoo.com/auction/index.asp
+https://standard.cotweet.com/login
+https://stanfordwho.stanford.edu/auth/lookup
+https://stanfordyou.stanford.edu/
+https://start.cortera.com/company/research/k5k9jwr1r/commerce-center-commercial-builders-inc/
+https://start.shoeboxed.com/Register?r=try&amp;step=0&amp;chosenPlan=business&amp;schedule=monthly
+https://startribunejobs-rs.madgexjb.com/Logon/Logon.aspx
+https://startright.bokf.com
+https://statedept.connectsolutions.com/uscenter
+https://statejobs.utah.gov/
+https://statements.asbonline.com/iStatementsDemo/Portal/CustomerSummary.aspx
+https://statements.univest.net/WEBEMS/Welcome.aspx?ReturnUrl=/webems/MainFrame.aspx
+https://statewide.oneeapp.org/
+https://static.zumbox.com/mk_private_secure.html
+https://stats.clearcard.com/solutions/ProductsAndServices?content=faq
+https://steamcommunity.com/
+https://stgssoweb.scif.com/PasswordReset/passwordResetIndex.jsp
+https://stillwater.sharepoint.okstate.edu/Policies/Shared%20Documents/Forms/AllItems.aspx
+https://store.acronis.com/325/purl-atih2010-en??x-medium=PAD&amp;x-campaign=100654
+https://store.activestate.com/
+https://store.adobe.com/cfusion/store/index.cfm?store=OLS-EDU
+https://store.apple.com/1-800-MY-APPLE/WebObjects/AppleStore?orderStatusSelfService=yes
+https://store.bitdefender.com/order/checkout.php?PRODS=4525100&amp;QTY=1&amp;CART=2&amp;OPTIONS4525100=h-3u-1y&amp;CURR=USD&amp;LANG=EN&amp;COUPON=CNET25&amp;AFFILIATE=9996
+https://store.buysub.com/webapp/wcs/stores/servlet/CategoryDisplay?storeId=50101&amp;catalogId=10701&amp;categoryId=13152&amp;mod=BOL_hpp_tnav_alert
+https://store.devilsdue.net/
+https://store.ets.org/servlet/ControllerServlet?Action=DisplayHelpPage&amp;Env=BASE&amp;Locale=en_US&amp;SiteID=ets
+https://store.healthdesign.org/customer/account/login/
+https://store.indigorose.com/399/?scope=checkout&amp;cart=33449&amp;quantity_33449=1
+https://store.law.com/registration/register.asp?SubscribeTo=lbw&amp;w=lbw
+https://store.mattel.com/transition.aspx?TransitionID=57
+https://store.nexternal.com/usatoday/storefront/blackhawks-nhl-preview---2010-special-edition-p15597.aspx
+https://store.ovi.com/register?accessUri=
+https://store.playstation.com/accounts/register/beginNewAccountRegistrationFlow.action
+https://store.qoop.com/privacy_policy.php
+https://store.samhsa.gov/pages/searchResult/mental+health+statistics/
+https://store.stardock.com/checkout
+https://store.thirdwire.com/store.htm
+https://store.truste.com/privacy_services_aff/WebsiteNav
+https://store.udap.com/merchant.mvc?Screen=PROD&Product_Code=4CO&Category_Code=
+https://store.valueweb.com/servlet/captai12/Checkout?smode=checkout
+https://store.volusion.com/ShoppingCart.asp?ProductCode=CER-T01
+https://store01.prostores.com/servlet/psistor00/Checkout?smode=checkout
+https://store1.adobe.com/cfusion/store/index.cfm?store=OLS-US&amp;view=ols_cat&amp;catType=SUPPORT&amp;NR=0#loc=en_us&amp;rangeUpper=6%2C0%2C65%2C0&amp;HTMLVerRedirect=true&amp;returnURL=%2Fcfusion%2Fstore%2Fhtml%2Findex%2Ecfm%3Fstore%3DOLS%2DUS%26event%3DdisplaySupport%26catalogOID%3D27810&amp;view=ols_cat&amp;store=OLS-US&amp;catType=TRAINING&amp;catID=TRAINING&amp;catOID=27212&amp;NR=0&amp;viewName=Adobe%20Store%20%2D%20North%20America&amp;pageNotFound=0
+https://store6.esellerate.net/store/checkout/CustomLayout.aspx?s=STR6104314888&pc=&page=OnePageCatalog.htm
+https://stpeter.im/
+https://strategis.ic.gc.ca/sc_mrksv/cipo/copyright-filing/application/frndoc/cp_filing_form-f.html
+https://strobe.uwaterloo.ca/~twiki/bin/view/MyPC/WebHome
+https://student.paypal.com/us/cgi-bin/marketingweb?cmd=_render-content&amp;content_ID=marketing_us/student_accounts&amp;nav=0.2.2
+https://student.uofdjesuit.org/moodle
+https://student.wou.edu.my
+https://studentaid2.ed.gov/getmoney/scholarship/scholarship_search_select.asp?13817/
+https://studenthealthoc.sa.ucsb.edu
+https://studenthealthoc.sa.ucsb.edu/
+https://studentloan.citibank.com/s/slcsite/
+https://students.flashpointacademy.com/moodledev
+https://students.oakwoodschool.org
+https://students.terry.uga.edu/
+https://studentservices.uwo.ca/secure/index.cfm
+https://studio.atlassian.com/browse/APL
+https://submit.symantec.com/dispute/
+https://submitcii.dhs.gov/pcii/contact.do;jsessionid=1AE68F2E7FB3A99D11CE9CF1A7119AEC
+https://subs.iht.com/
+https://subs.timeinc.net/CampaignHandler/tdmisc?source_id=6
+https://subscribe.haymarketmedia.com/scm/?form=paid
+https://subscribe.hearstmags.com/subscribe/splits/smartmoney/smy_footer
+https://subscribe.newsday.com/Circulation/
+https://subscribe.pcspublink.com/subscribeFormGeneric.asp?track=JHOME8&amp;pub=SPRT&amp;term=6
+https://subscribe.usatoday.com/welcomesw.jsp?POE=FOOTER
+https://subscription.washpost.com/subscriberservices/subscriber.portal?state=welcome&amp;oscode=RPWS
+https://subscriptions.ahrq.gov/service/multi_subscribe.html?code=USAHRQ
+https://subscriptions.cms.hhs.gov/service/subscribe.html?code=USCMS_556
+https://subscriptions.nationalpost.com/new_devel/index_sub1.html
+https://sugru.com
+https://summitbank.applicantharbor.com/
+https://summitonline.summitstatebank.com
+https://sundial.stanford.edu/
+https://supervisor.ets.org/supervisor/
+https://suppliercenter.homedepot.com/wps/portal
+https://suppliernet.external.lmco.com/suppliernet/security/index.cfm
+https://supply.itt.com/
+https://supplychain.llnl.gov/
+https://support.ccbill.com
+https://support.ccbill.com/
+https://support.comodo.com
+https://support.comodo.com/?group=comodo
+https://support.creativecommons.org/other/corporate
+https://support.cubecart.com/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=24&nav=0,2
+https://support.cybertrust.com/
+https://support.developer.motorola.com/cgi-bin/motodev.cfg/php/enduser/std_adp.php?p_faqid=568&md_data=dXJsPWh0dHBzJTNBJTJGJTJGZGV2ZWxvcGVyLm1vdG9yb2xhLmNvbQ%3D%3D
+https://support.eukhost.com/
+https://support.fortinet.com
+https://support.hostasaurus.com/kb/51
+https://support.live.com/eform.aspx?productKey=wlid
+https://support.mayfirst.org/ticket/232
+https://support.merchantplus.com/partners/idevaffiliate.php?id=1053
+https://support.mozilla.com/en-US/questions/750116
+https://support.nature.org/site/ConsProfileUser?op.dispConsPasswd=
+https://support.oanda.com/mod_perl/crm/user/user_login
+https://support.playspan.com
+https://support.practicepartner.com/customer/login.aspx
+https://support.quickenhealth.com/cgi-bin/quickenhealth.cfg/php/enduser/cci/homepage.php
+https://support.quickenmedical.com/cgi-bin/quickenmedical.cfg/php/enduser/std_alp.php
+https://support.reviewsforjoomla.com/
+https://support.sagepay.com/apply/default.aspx?PartnerID=C74D7B82-E9EB-4FBD-93DB-76F0F551C802&amp;PromotionCode=osc223
+https://support.sas.com/edu/prodcourses.html?code=CI&amp;ctry=US
+https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;folderID=233
+https://support.si.edu/05/give_now?qp_source=cm%5f%5f%5fsupportsi
+https://support.sitelutions.com/index.php?_m=tickets&amp;_a=submit
+https://support.skype.com
+https://support.ssaihq.com/it/support-resources/65-corporate-calendaring-system/113-configure-evolution-to-use-the-corporate-calendar-system
+https://support.steampowered.com/kb_article.php?ref=1223-qroc-4460
+https://support.steampowered.com/kb_article.php?ref=4462-UIOB-0425
+https://support.steampowered.com/kb_article.php?ref=8830-EOBN-8013
+https://support.thesslstore.com/index.php?_m=tickets&amp;_a=submit
+https://support.thetigerhost.com
+https://support.thetigerhost.com/
+https://support.turnkeywebtools.com/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=48
+https://support.ubt.com/Scripts/rightnow.cfg/php.exe/enduser/std_alp.php
+https://support.zabbix.com
+https://support.zabbix.com/
+https://support.zimbra.com/supportlogin.php
+https://supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doHome
+https://supportforums.cisco.com/thread/2038226
+https://supportforums.motorola.com/thread/18045
+https://survey.ally.com/wix/p815178671.aspx
+https://survey.deloitte.com/wsb.dll/1769/Ginnie_Mae_RFS_Issuer_Testing.htm
+https://survey.idphnet.com/survey/surveys/9WT9EN
+https://survey.vovici.com/se.ashx?s=1C1FC2A84C5DC06E
+https://surveys.bus.oregonstate.edu/BsgSurvey2_0/main.aspx?SurveyID=3262
+https://svartifoss2.fcc.gov/coresWeb/publicHome.do
+https://svc.mt.gov/statejobsearch/searchresults.aspx?size=0
+https://svcalt.mt.gov/PhotoGallery/PhotoInfo.asp?id=345
+https://svn.apache.org/repos/asf/myfaces/extensions/cdi/
+https://svn.cacert.org/CAcert/Policies/TTPAssistedAssurancePolicy.html
+https://svn.cse.ucdavis.edu
+https://svn.cse.ucdavis.edu/trac/UCDPloneSkin
+https://svn.einsteintoolkit.org/manifest/branches/ET_2010_06/einsteintoolkit.th
+https://svn.forge.osor.eu/svn/peppol/Documents/Release%20Documentation/Release%20snapshots/0.9.5/PEPPOL%20Java%20Core%20Library%20Developer%20guide.doc
+https://svn.mindtouch.com/source/public/dekiwiki/trunk/src/contrib/mindtouch.contrib.openid/OpenIDService.cs
+https://svn.parrot.org/parrot/trunk/
+https://svn.sarforge.informatik.hu-berlin.de/svn/berlinroofnet/BerlinRoofNet/trunk/simulation/distsim/wrapper
+https://svn.tools.ietf.org/area/ops/trac/wiki/
+https://svn.torproject.org/svn/torflow/branches/gsoc2008/
+https://svn.wso2.org/repos/wso2/trunk/carbon/products/brs/docs/xdoc/source-repository.xml
+https://swarm.internet.com/mt-search.cgi?blog_id=17&tag=Commerce&limit=20&IncludeBlogs=17
+https://sws.dos.state.fl.us/dlis_secure/librarycard/librarycard.html
+https://syllabus.uga.edu/Browse.aspx
+https://sympa-roc.inria.fr/wws/info/fresnel
+https://system.alphassl.com/direct_en/directalphassl.do?domain=tmusa000_usd
+https://system.globalsign.com/pc/public/certificate/order.do?territory=uk&goodsKindCode=PS1&goodsRequestKindCode=New&language=English&currency=GBP
+https://system.netsuite.com/app/site/crm/externalleadpage.nl?compid=3099
+https://systems.cs.colorado.edu/projects/softmac
+https://systemus.globalsign.com/direct_en/directdvhigh.do?domain=systemus.globalsign.com&amp;pid=PAR12299
+https://sznabcrm.secure.fundsxpress.com/start/SZNABCRM
+https://tampabay.boocoo.com/auction/index.asp
+https://tap.dor.mt.gov/
+https://tas-renault.taleo.net/careersection/303/moresearch.ftl?lang=fr_fr
+https://taxapp2.state.fl.us/survey/txinquiry.cfm
+https://taxnet.ides.state.il.us/Login/Default.aspx
+https://tbe.taleo.net/NA5/ats/servlet/Rss?org=MTVNETWORKS&amp;cws=1&amp;WebPage=SRCHR&amp;WebVersion=0&amp;_rss_version=2
+https://tcbwa.com/
+https://tctechcrunch.wordpress.com/2010/09/01/truth-is-lies/
+https://tcva.fms.treas.gov/
+https://tderec.ijob.com/recruit/servlet/com.lawson.ijob.QuickCandidate?vendor=228&amp;fullmode=true
+https://tdsc.53.com/mcsc/activate
+https://tdweb1m.rtsintranet.com/tdsovprod/index.jsp
+https://teachercred.ctc.ca.gov/teachers/PersonalSearchProxy
+https://team.ddifrontline.com/index.php?var=f16ffefc06976a9a80c281b84f72cf4b
+https://team1.sos.state.tx.us/voterws/viw/faces/SearchSelectionVoter.jsp
+https://techlib.biomerieux.com/wcm/techlib/techlib/storyboard/login/loginForm.jsp?lang=en
+https://technet.microsoft.com/subscriptions/cc294422.aspx
+https://telemarketing.donotcall.gov
+https://telemarketing.donotcall.gov/
+https://tell.gao.gov/uew/
+https://tellercentennial.llnl.gov/
+https://tepin.aiki.de/
+https://termlife.allstate.com/StartQuote.aspx?ZipKey=s068IS5rp7yIBnjrwrntCQ%3d%3d
+https://testcicada.clarku.edu
+https://testdrive.verisign.com/services/JilandaSecureSmartECommerceTelcoInfoSecurityFinancialandInfrastructural/digitalidCenter.htm
+https://testpilot.mozillalabs.com/
+https://testportal.lakecountyfl.gov
+https://texnet.cpa.state.tx.us/TXN_StartPage.asp
+https://text.vzw.com/
+https://text1.vzw.com/text/jsp/txtintl_overview.jsp
+https://textalert.ema.dc.gov/index.php?CCheck=1
+https://thatsmybank.mortgagewebcenter.com/ApplyNowHE/Application.asp?PID=1&amp;
+https://thebrandbank.vendormate.com/vm/login.do
+https://thejoojoo.com/
+https://themoscowdiaries.wordpress.com/
+https://thepiratebay.org/
+https://theplace.southern.edu/newaccount.php
+https://theprovidentbank.ebanking-services.com/nubi/signin.aspx
+https://therightwhey.myemeraldstore.com/store/actionwheylanding.php
+https://thesslstore.com/thawte.aspx
+https://thrivent.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://tickets.asiasociety.org/
+https://tickets.esbnyc.com/
+https://tickets.hostgator.com/
+https://tickets.mtmg.co.uk/index.php?_m=tickets&amp;_a=submit&amp;languageid=1
+https://tickets.mysticseaport.org/management/default.asp
+https://timssnet.allenpress.com/ECOMAMI/timssnet/web/AboutAMI/career.cfm
+https://tipit.to/wikileaks.org
+https://tips.fbi.gov/
+https://toc.taleo.net/careersection/2/profile.ftl?lang=en
+https://toefl-registration.ets.org/TOEFLWeb/extISERLogonPrompt.do
+https://tokens.regions.com/
+https://tomcat.itap.purdue.edu:8445/ICSWeb/Trouble
+https://tools.cisco.com/gdrp/coiga/showsurvey.do?surveyCode=589&amp;keyCode=163891_6
+https://tools.cleanpowerfinance.com/
+https://tools.ietf.org/html/rfc4112
+https://top.capitalonebank.com/cashplus/
+https://tor-svn.freehaven.net/svn trunk/python/
+https://torproj.xpdm.us/dist/
+https://tower.dartmouth.edu/htmldb/groucho/f?p=133:20:2695863688230026
+https://towerii.ksinsurance.org/kid/agentapplicationrequest.do
+https://towernet.capitalonebank.com/loginpage.html
+https://trac.cakephp.org/ticket/3296
+https://trac.macports.org/ticket/18583
+https://trac.torproject.org/projects/tor/ticket/1620
+https://tradeking.webex.com/
+https://tradeweb.autex.com/autexui/login.faces/
+https://training.policy-studies.com/moodle
+https://training.sap.com
+https://training.thebenefitbank.com/
+https://training.vlacs.org
+https://transactrls.transamerica.com/general/contact_us_login.aspx
+https://translations.launchpad.net/
+https://transunion.icentera.com/library/template/welcome.html
+https://travelregistration.state.gov
+https://travelregistration.state.gov/
+https://travelregistration.state.gov/ibrs/ui/
+https://treas-mgt.frostbank.com/rdp/cgi-bin/welcome.cgi
+https://trialx.com/
+https://tridata.ebanking-services.com
+https://trifid.moriarty.k12.nm.us/moodle/
+https://trust-center.verisign.com.au/process/retail/trust_initial?application_locale=VRSN_AU
+https://trust-center.verisign.com.sg/process/retail/trust_initial?application_locale=VRSN_SG
+https://trust-center.verisign.com/process/retail/trust_initial?application_locale=VTC_US
+https://trusted-web-seal.cybertrust.ne.jp/seal/getScript?host_name=markezine.jp&type=2
+https://trustmark-hr.silkroad.com/epostings/index.cfm?version=2&amp;company_id=15808
+https://trustnowessentials.usbank.com/TNE/login.jsp
+https://trustreporter.com/TRv3/?bankabvr=FFBC
+https://trustsealinfo.verisign.com/splash?form_file=fdf/splash.fdf&amp;dn=www.foxrater.com&amp;lang=en
+https://tso.oakland.edu/admismoodle
+https://tspace.library.utoronto.ca/handle/1807/22848
+https://tspace.library.utoronto.ca/handle/1807/5568
+https://tts.sec.gov/oiea/QuestionsAndComments.html
+https://turing.library.northwestern.edu/login?url=http://newfirstsearch.oclc.org/dbname=ArticleFirst;done=referer;FSIP
+https://tutor.wou.edu.my
+https://tverify.cacert.org
+https://twiki.cern.ch/twiki/bin/view/Atlas/SoftwareDevelopmentWorkBookSVN
+https://twiki.sonologic.nl/Har/RandomPictures
+https://twitter.com
+https://twitter.com/GOVsites/commerce-and-economic
+https://twitter.com/abbynormal0ne
+https://txapps.texas.gov/tolapp/txdl/welcome.dl?locale=en_US
+https://txcomp.tdi.state.tx.us/TXCOMPWeb/common/home.jsp
+https://txcpa.cpa.state.tx.us/up/Search.jsp
+https://txsmartbuy.texasonline.state.tx.us
+https://txsmartbuy.texasonline.state.tx.us/tolapp/cpa
+https://ua-web.uadv.uci.edu/eGiving/CreditCard.asp?areaSupport=Donald Bren School of Information and Computer Sciences
+https://ua.collierschools.com:8444/CCPS/jsps/login/Login.jsf
+https://uaccess.schedule.arizona.edu/psp/uazsaprd2/UA_SCHEDULE/HRMS/h/?tab=DEFAULT
+https://uatpp.assuranthealthsales.com/ppechannel_enu/start.swe?SWECmd=Login&amp;_sn=CCR08ETwef44t4qD4y9Q15By9oaoJSP.ml-Ek-.AfWg_&amp;SWEHo=uatpp.assuranthealthsales.com&amp;SWETS=1244208559
+https://uatprovider.eassuranthealth.com/ppechannel_enu/start.swe
+https://ubat.mortgagewebcenter.com/ApplyNowHE/Application.asp?PID=1
+https://ubatevents.webex.com/ubatevents/onstage/g.php?t=a&amp;d=660235188
+https://ubersmith.voxel.net/
+https://uccconnect.sos.ca.gov
+https://uccconnect.sos.ca.gov/
+https://ucclaim-wi.org/InternetInitialClaims/default.asp
+https://ucsystems.ethicspointvp.com/custom/ucs_ccc/default.asp
+https://ufcu.mortgagewebcenter.com/ApplyNow/Application.asp?PID=1
+https://ugsp.nih.gov/
+https://ui.labor.state.ny.us/
+https://uiconnect.ne.gov/uiconnect/faces/jsp/center.jsp
+https://uics.delawareworks.com/Forms/Form_WL1.aspx
+https://uk.globalsign.com/company/map.html
+https://umbraco.svn.codeplex.com/svn
+https://umdrive.memphis.edu/mbensman/public/history1.html
+https://umnas6.umonitor.com/glacier/welcome.do?bid=6GLr45FFg67
+https://umnasg2.umonitor.com/integra/welcome.do
+https://uncjobs.northcarolina.edu/applicants/jsp/shared/Welcome_css.jsp
+https://uniqueedtechie.blogspot.com
+https://unitedalert.com/?reg&amp;state=nj&amp;bcsi_scan_4D27AB0EC8D2AB1F=cL6j/RCkiWHOPG98XoICWFaFPjYkAAAA1WrkCA==
+https://universities.cbord.com/solutions/solution.asp?id=38
+https://unp.un.org/Details.aspx?pid=20621
+https://uplink.in.gov/CSS/CSSLogon.htm
+https://ups.managehr.com/Home.htm
+https://us.etrade.com/e/t/banking
+https://us.mcafee.com/root/login.asp?
+https://usa.visa.com/personal/security/vbv/index.html
+https://usasma.bliss.army.mil/
+https://usbank.visabuxx.com/index.cfm?src=homedropdown
+https://usccollege.usc.edu/secure/Graduate_Program_Form/index.cfm
+https://usconnect.usc.edu/
+https://usd.swreg.org/soft_shop/48953/shopscr3.shtml
+https://usercenter.checkpoint.com/
+https://users.djindexes.com/
+https://usjobs-hertz.icims.com/jobs/intro
+https://usmap.cnet.navy.mil/usmapss/static/banner.jsp;jsessionid=a07ddac130d7c35391c518344d45b614cc32d7cf0e38.e34KbNyNbx4Oa40Tb34KchqMaN90n6jAmljGr5XDqQLvpAe
+https://uspeacegov.securesites.com/contribute/contribution.cgi
+https://usw.salvationarmy.org/national/ndos.nsf/fm_ndos_search?OpenForm
+https://utahhelps.utah.gov/
+https://utdirect.utexas.edu/utdirect/
+https://utilities.ocfl.net/OCUD/
+https://uwangel.uwaterloo.ca/uwangel/frames.aspx
+https://va.train.org
+https://va.train.org/DesktopModules/Documents/ViewDocument.aspx?lcmsItemID=34
+https://vault.melloninvestor.com/isd/
+https://vcart.velocitypayment.com/fdic/
+https://vendorapp.hillsboroughcounty.org
+https://verify.llronline.com/OnlineVerification/Main.aspx
+https://verify.theworknumber.com/cgi-mv/twndatabase_secure.asp
+https://verisign.taleo.net/careersection/2/jobsearch.ftl?lang=en
+https://verisignevents.webex.com/
+https://vewa-net.de/wiki/doku.php?id=treffen:kommende:2010-10-02_aachen
+https://vignette.vbgov.com/file_source/dept/planning/Project%20-%20P&amp;I/P&amp;I%20Docs/Res&amp;CommApp.pdf
+https://vipmanager.verisign.com/vipmgr/createtrialaccount.v
+https://vipmobile.verisign.com/help.v
+https://visalink.com.au/FrontPage.aspx?from=lonelyplanetinternet
+https://vitkar.gtf.gatech.edu/awc_parents/MakeAGift.aspx?alloc=557858
+https://vmail.purdue.edu/mycallpilot
+https://voicemail.lakecountyfl.gov/
+https://voltage-ps-0000.alliancebankna.com/login
+https://volunteers.serv.sd.gov/VolunteerMobilizer/
+https://vovici.com/wsb.dll/s/10a97g44a54
+https://vpfn.tamu.edu/exchange/
+https://vpfnexternal.tamu.edu/sites/travel/default.aspx
+https://vpfninternal.tamu.edu/sites/e-commerce/default.aspx
+https://vpn.york.cuny.edu/
+https://vrsn.client.shareholder.com/common/download/sec.cfm?companyid=VRSN&fid=1193125-07-154202&cik=1014473
+https://vznavigator.vzw.com/index.html
+https://w1.buysub.com/loc/WIR/ATGFailsafe
+https://w2.eff.org/donate/random.php?s_src=http%3A%2F%2Fwww.eff.org%2Ffront&amp;s_subsrc=navbar
+https://w3-markup.com/
+https://w3.nexis.com/printcdsc/
+https://w50a.asihealth.com/assurant-cdhpweb/memberLogin.do
+https://wager2.sbgglobal.com/login/SBGGLOBAL?module=ForgotPassword
+https://wahmcart.com/cgi-bin/index.cgi?adminid=2517&amp;pid=6690&amp;quickbuy=1
+https://wallst.chase.com/chase_public/framesetcp.asp?YYY90_07jxc08Qo5YAUz3qbue2I6NJlR/7NLOuwFnZI7ffnlL+az66D9GRE1hlc0b+ITrArF2isOxF8CM=
+https://wallstreet.rjf.com/investor/
+https://wasteexchange.wastereduction.gov.hk/english/index.php
+https://watch.wsp.wa.gov/
+https://water.vbgov.com/
+https://watiam.uwaterloo.ca/idm/user/activate.jsp
+https://wausaudl.com/WDDL?key=ex79yknh
+https://wawf.eb.mil
+https://wawf.eb.mil/
+https://wawftraining.eb.mil
+https://wawftraining.eb.mil/
+https://waystohelp.stjude.org/sjVPortal/public/event/page/displayEventPage.do?eventId=102965&amp;programId=401
+https://wbiprod.storedvalue.com/WBI/lookupservlet?language=en
+https://wci.llnl.gov/
+https://wcma.businesscenter.ml.com/BCPrivate/asp/WCMALogin.aspx?ReturnUrl=/bcprivate/default.aspx
+https://wcmscontrib.acs.org/PublicWebSite/careers/whatchemistsdo/index.htm
+https://wcu.mycmsc.com/psp/wcuhrprd/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL?Page=HRS_CE_HM_PRE&amp;Action=A&amp;SiteId=1
+https://wcu.qualtrics.com/SE?SID=SV_cVljMCSbH8JRw3i
+https://wd.kyepsb.net/EPSB.WebApps/KECI/
+https://wdesecure.k12.wy.us/public_ed/schools.html
+https://web.austin.utexas.edu/diia/treg/index.cfm
+https://web.da-us.citibank.com/cgi-bin/citifi/portal/ps/detail.do?M_M=S&amp;BS_Id=CitiMobile
+https://web.jupas.edu.hk/jupas/html/index.html
+https://web.memberclicks.com/mc/quickForm/viewForm.do?orgId=ahcj&amp;formId=84633
+https://web.provbank.com/index.html
+https://web.quickenbillpay.com/csp/CSPServlet/MemFASignup?brId=1055&amp;eventName=MemFASignupRSEvent&amp;promoCode=FMFR
+https://web1.ncaa.org/eligibilitycenter/common/
+https://web1.secureinternetbank.com/pbi_pbi1961/pbi1961.asp?Rt=275071288&amp;LogonBy=connect3&amp;PRMACCESS=Portfolio&amp;WCI=ForgotPswd
+https://web1.zixmail.net/s/login?b=summitbankdirect
+https://web2.mph.net/moodle
+https://web2.secureinternetbank.com/pbi_pbi1961/pbi1961.asp?Rt=211170211&amp;LogonBy=connect3&amp;PRMACCESS=Portfolio
+https://web2.sys-con.com/
+https://web3.secureinternetbank.com/pbi_pbi1961/pbi1961.asp?Rt=073901725&amp;LogOnBy=connect3&amp;PRMACCESS=Account
+https://web4.secureinternetbank.com/pbi_pbi1961/pbi1961.asp?Rt=091905114&amp;LogonBy=connect3&amp;PRMACCESS=Account&amp;enroll=true
+https://web5.secureinternetbank.com/pbi_pbi1961/pbi1961.asp?Rt=071909363&amp;LogonBy=connect3&amp;PRMACCESS=Account&amp;enroll=true
+https://web6.secureinternetbank.com/pbi_pbi1961/pbi1961.asp?Rt=291970033&amp;LogonBy=connect3&amp;PRMACCESS=Account&amp;enroll=true
+https://web7.secureinternetbank.com/pbi_pbi1961/pbi1961.asp?Rt=011501682&amp;LogonBy=connect3&amp;PRMACCESS=Portfolio&amp;WCI=ForgotPswd
+https://web8.secureinternetbank.com/pbi_pbi1961/pbi1961.asp?Rt=111017979&amp;LogonBy=connect3&amp;PRMACCESS=Portfolio
+https://webaccess.charlescounty.org
+https://webaccess.hernandocounty.us
+https://webaccess.superiorbag.com/Sovereign_login.a4d
+https://webaccounts.esri.com/cas/index.cfm
+https://webadmin.cdproject.net/en-US/MyCDP/Anonymous/Login.aspx
+https://webadvisor.uoguelph.ca/
+https://webapp.cdp-ky.com/NCENVPBL/ESTABLISHMENT/ShowESTABLISHMENTTablePage.aspx?ESTTST_CTY=44
+https://webapp.iecdb.iowa.gov/
+https://webapp.louisville.edu/infomart/summaryOfAccount/setupSummaryOfAccount.cfm
+https://webapp.myappro.com/webapp/ubt/
+https://webapp01.dhss.mo.gov/FCSRWebRegistration/welcome.aspx
+https://webapp01.seminolecountyfl.gov/EmployeeAccess/Login.aspx
+https://webapp1.ode.state.oh.us/cncs/
+https://webapp2.ode.state.oh.us/reportcard/archives/
+https://webapplications.acs.org/applications/give/
+https://webapps.multibandusa.com/mbem/mbemdealer
+https://webapps.sph.harvard.edu/cfdocs/worldmap/map.cfm
+https://webapps.uta.edu/UtaSfs/Application?cmd=feedescr
+https://webapps1.csus.edu/faid_general/
+https://webappsprod01.exim.gov/apps/usmap/usmap.nsf
+https://webbank.fcbanking.com/InternetBanking2/pages/hw_pages/Login.jsp
+https://webbankingforbusiness.mandtbank.com/customerservice/myprofile/SbbForgotPasscode.aspx
+https://webcenter.elendersolutions.com/webcenter/
+https://webclaims.zurichna.com/mainpage.aspx
+https://webclass.remc1.net
+https://webforms.edcc.eu/form/view/edcc/bg
+https://webgate.ec.europa.eu/idb
+https://webgate.ec.europa.eu/transparency/regrin/welcome.do?locale=en#en
+https://webgw.aacounty.org/
+https://weblogin.bu.edu/webnew/alumnew
+https://webmail.apps4rent.com
+https://webmail.apps4rent.com/
+https://webmail.bracewellgiuliani.com/
+https://webmail.capitol-college.edu/horde3/imp/login.php
+https://webmail.co.collin.tx.us/exchange/
+https://webmail.co.mchenry.il.us
+https://webmail.cse.ucdavis.edu
+https://webmail.dartmouth.edu/
+https://webmail.doi.sc.gov/
+https://webmail.hermes.cam.ac.uk/
+https://webmail.hhs.gov/
+https://webmail.ihosturdomain.com
+https://webmail.ithaca.edu/
+https://webmail.iu.edu/horde/imp/login.php
+https://webmail.networking4all.com/
+https://webmail.operationenterprise.com/
+https://webmail.oregonstate.edu/imp/login.php
+https://webmail.pair.com/
+https://webmail.purdue.edu/
+https://webmail.scgnet.us/owa/
+https://webmail.sph.harvard.edu/gw/webacc
+https://webmail1.ifc.org/mail/r/WB371574/Home/kozak%20tables/blog/,%20http:/www.eria.org/research/images/pdf/PDF%20No.5/No,5-2-China.pdf
+https://webprod.cio.sc.gov/SCSGDirectoryWeb/login.do?currentTime=2010-01-20%2019:45:07.63&amp;persist=false&amp;returnURL=https://webprod.cio.sc.gov/eLeaveStrutsWeb/processMySCgovLoginEpilogue.do&amp;favoriteURL=http://www.state.sc.us/eLeave&amp;favoriteDesc=eLeave
+https://webservices.sos.state.tx.us/vrapp/index.asp
+https://webtrac.co.cal.md.us/
+https://webtrac.leegov.com
+https://webvpn.purdue.edu
+https://webvpn.purdue.edu/
+https://webwork.math.ohio-state.edu
+https://wei.secstate.wa.gov/osos/secure/pages/Onlinevoterregistration.aspx
+https://wesep.wesleyan.edu/cgi-perl/session.cgi
+https://wesleyan.hosts.atlas-sys.com/illiad/logon.html
+https://westpacinvoicefinance.qvalent.com/LoginView
+https://wfa.kronostm.com/index.jsp?locale=en_US&amp;applicationName=YumBrandsReqExt&amp;SEQ=jobDetails&amp;POSTING_ID=434261529&amp;WT.mc_id=0417209Twintern_Wild_Card
+https://wfb.dor.state.ma.us/webfile/wsi/Public/WebForms/WebFileSplash.aspx
+https://wfis.wellsfargo.com/wis
+https://whois.nic.name/
+https://whos.amung.us/pro
+https://wideword.net
+https://wiki.cacert.org/events/20101012Canberra
+https://wiki.doit.wisc.edu/confluence/download/attachments/52734212/65bbb.html
+https://wiki.ece.cmu.edu/index.php/Graduate_Orientation
+https://wiki.har2009.org/w/index.php?title=Main_Page&amp;action=purge
+https://wiki.internet2.edu/confluence/display/secguide/Home;jsessionid=98D43A96C81CC64C24F38E09B88095E6
+https://wiki.mozilla.org/MozCamp/Utrecht
+https://wiki.physik.fu-berlin.de/linux-minidisc/doku.php
+https://wiki.secondlife.com/wiki/Knowledge_Base
+https://wiki.songbirdnest.com/Developer/Articles/Builds/Contributed_Builds#Linux
+https://wiki.st.cs.uni-saarland.de/
+https://wiki.tools.ietf.org/html/rfc2706
+https://wiki.ubuntu.com/Accessibility
+https://wiki.ubuntu.com/HardyReleaseNotes
+https://wiki.ubuntu.com/ffmpeg
+https://wikis.utexas.edu/display/bbsupport
+https://win.wfu.edu/directory.html
+https://winfinance.tradeonlineservices.com/siteminderagent/forms/login.fcc
+https://winqual.microsoft.com/member/softwarelogo/certifiedlist.aspx
+https://wintrade.westpac.com.au/esis/Login/SrvPage
+https://wip-chase.chase.com/online/investments/financial-advisor.htm
+https://wipl.in/members/
+https://wist.echo.nasa.gov/~wist/api/imswelcome/
+https://wit.twc.state.tx.us/WORKINTEXAS/wtx?pageid=BROWSE_POST_BY_TEXT&amp;ctx=1266458546366
+https://wmq.etimspayments.com/pbw/include/dc_parking/input.jsp?ticketType=P
+https://wnjpin.state.nj.us/uiclaim/home_full.html
+https://wolverineaccess.umich.edu
+https://wolverineaccess.umich.edu/
+https://woodle.wooster.edu
+https://workready.mo.gov/
+https://worksmart.ded.mo.gov/index.cfm?frpath=documents/view_items.cfm?MenuID=5186andCategoryID=1
+https://world.ccavenue.com/
+https://worldview.gallup.com/signin/login.aspx
+https://wp11.calhfa.ca.gov/ApprovedLenders/
+https://writerep.house.gov/writerep/welcome.shtml
+https://ws07.grants.gov:446/app-s2s-server/services/
+https://wsdvps2.wsdsecure.com/~sausalito.org/join/joinnow
+https://wso2.org/wiki/display/~hydrocodone
+https://wsvprd1b.theorytest.direct.gov.uk/Dispatcher?webContext=DSACandidateWeb&amp;webApp=DSAHome&amp;requestedAction=register
+https://wth.blinkenarea.org/pictures/
+https://wush.net/websvn/mindprod/listing.php?repname=mindprod&amp;path=/com/mindprod/
+https://ww10.bankofinternet.com
+https://ww10.bankofinternet.com/
+https://ww2.advocatehealth.com/cgi-bin/pexs/pexs.pl?type=new
+https://ww2.boatus.com/tow/towupgrade1.asp
+https://ww2.doh.state.fl.us/downloadnet/Main.aspx
+https://ww2.kheaa.com/
+https://ww3.freddiemac.com/corporate/
+https://ww4.aitsafe.com/
+https://ww4.ed.state.nh.us/reporting/SAUList.asp
+https://ww6.i-csr.net/active/signon.asp?ak=585692160
+https://wwfcu.org/
+https://wws.itc.or.jp/seminar_guide_n/indexS.html
+https://www-01.tax.state.oh.us/PROD/TaxMailWeb/global_emailus.html
+https://www-304.ibm.com/jct03004c/support/electronic/portal/!ut/p/_s.7_0_A/7_0_CI?category=0&amp;locale=en_US
+https://www-604.chartisinsurance.com/login_674_163640.html
+https://www-931.ibm.com/bin/subscriptions/walk_small_steps.cgi?cl=USEN&amp;nid=10911
+https://www-935.ibm.com/services/in/index.wss/offering/its/z1002699
+https://www-amsweb-ext.imf.org/press-ext/reg.aspx
+https://www-au.computershare.com/Investor/LoginHolder.asp?bhjs=1&amp;fla=1&amp;issuerid=SCAUAMP&amp;theme=SCAUAMP1
+https://www-beta.vectrabank.com/personal-banking/innovative-solutions/id-theft.jsp
+https://www-eng.llnl.gov
+https://www-eng.llnl.gov/
+https://www-envirinfo.llnl.gov/siteAnnualReports.php
+https://www-er.ucsd.edu/givetoucsd/secure/paymenttran/onlinegiving.asp?sk=113
+https://www-gs.llnl.gov/
+https://www-pls.llnl.gov
+https://www-pls.llnl.gov/
+https://www-s.fujitsu.com/global/about/ir/reqrep/
+https://www-ssrl.slac.stanford.edu/URAWI/Login.html
+https://www-test.math.wisc.edu/moodle
+https://www-uk.computershare.com/Investor/Default.asp
+https://www-us.computershare.com/investor/plans/planslist.asp?stype=dspp&amp;cc=us&amp;lang=en&amp;bhjs=1&amp;fla=1&amp;theme=cpu
+https://www.1010ez.med.va.gov/sec/vha/1010ez/
+https://www.12wonderwebservices.com/aLogIn.php
+https://www.1fbusa.com
+https://www.1fbusa.com/
+https://www.1stfinancialfcu.org/
+https://www.211texas.org/211/
+https://www.21st.com
+https://www.23andme.com/about/corporate/
+https://www.24-7cardaccess.com/24-7CardAccess/
+https://www.247virtualassistant.com/
+https://www.24x7loans.com/NorStatesBankAuto/default.aspx
+https://www.2checkout.com/cgi-bin/buyers/orderpage.2c?sid=68038
+https://www.2p9.com/MayoClinic/HealthSource/0703Camp/landing.cfm?trkid=20910S143519990
+https://www.2turniton.com/
+https://www.3dcart.com/merchant-esolutions-shopping-cart.htm
+https://www.401kplanaccess.com/apb.asp
+https://www.401ksave.net/srtweb/Web_Logon.aspx?&amp;logonurl=&amp;logouturl=&amp;ssn=&amp;pin=&amp;userid=&amp;skinid=OUT&amp;menuid=&amp;langid=&amp;contentid=&amp;safeencpwd=
+https://www.4yourtype.com/custinfo.asp
+https://www.53.com/wps/portal/promo/?promo_id=csrreport
+https://www.6figurejobs.com/Index.cfm?100k=1&amp;home=1
+https://www.800-insurance.com/program/getautoquote/drivers/
+https://www.95599.cn/en/corporate-banking/deposit/corporate-demand-deposit/
+https://www.AnnasFalls.com
+https://www.CardMemberServices.net/TrustCoBank
+https://www.Chase.com/chf/mortgage/mortgage-cash-back
+https://www.ConcordGroupIns.com/SelfService
+https://www.FTCComplaintAssistant.gov
+https://www.GovDeals.com/index.cfm?fa=Main.Login
+https://www.JpfNet.com/JpfNet/JPF/viewContent?id=c373e911d463c3bbe1b1001438be3f8d
+https://www.MetLifeAutoQuote.com/indexToq.html?oc_id=al000100
+https://www.MetroBank.blilk.com
+https://www.MouseMatrix.com/
+https://www.MovingInsurance.com/policyapp/index.asp
+https://www.MyCardStatement.com/promo/MyCardStatement_FI.swf
+https://www.OBRESecureClear.state.il.us
+https://www.PHLY.com/myphly/newuser.aspx
+https://www.PfizerHelpfulAnswers.com
+https://www.Putnam.com
+https://www.Putnam.com/articles/
+https://www.SpectorSoft.com/purchase/step1.asp?TheProduct=1
+https://www.TCNB.com/SmallBusiness/CheckImageRequest
+https://www.aa.com/AAdvantage/quickEnroll.do?v_locale=en_US&v_mobileUAFlag=AA
+https://www.aa.com/aa/reservation/flightCheckInViewReservationsAccess.do
+https://www.aaai.org/scripts/Contact/contact.php
+https://www.aacargo.com/utility/survey.jhtml;jsessionid=REHBYLM0LAAS2CSOQMVSFEY
+https://www.aacountytaxsale.com/
+https://www.aaintl.com/payment_options.cfm
+https://www.aaohn.org/membership/corporate-partnerships.html
+https://www.aarphealthcare.com/products/discounts/hearing
+https://www.ab.bluecross.ca/aboutus/aboriginal-scholarships.html
+https://www.abaconline.org/v4/index.php
+https://www.abc.army.mil/
+https://www.abfab.co.uk/secure/checkout.aspx
+https://www.abileneteachersfcu.org/
+https://www.abilityservicesnetwork.com/
+https://www.abms.org/WC/login.aspx
+https://www.abo.fi/student/en/exchange
+https://www.abraham-hickslawofattraction.com/lawofattractionsource/subscriptions.php
+https://www.abso.com/jobboard/yourcommunitybank/yourcommunitybank.htm
+https://www.absorb.it/virtual-id
+https://www.abtrustweb.com/logon/frmLogon.asp
+https://www.abundantharvestorganics.com/
+https://www.academynetspace.com/compete
+https://www.acallforhelp.info/
+https://www.acapulcogoldny.com/
+https://www.acc.com/
+https://www.acca-business.org/dom/
+https://www.accessallstate.com/
+https://www.accessamerica.com/integration_start.asp?accamnum=F032594&amp;target=new&amp;Start_Page=products&amp;referrer=createlink
+https://www.accessdata.fda.gov/scripts/medwatch/medwatch-online.htm
+https://www.accesshorizon.com/checkup/secure-checkup.cfm
+https://www.accesskansas.org/mailman/listinfo/insurance-regulatory-notices
+https://www.accessnet.state.nj.us/
+https://www.accordhr.com/
+https://www.account3000.com/usbank/
+https://www.accountonline.com/
+https://www.acecybersecurity.com/
+https://www.acert.1stiocmd.army.mil/index.jsp
+https://www.aci-hq.com/loginpage.php?resource=/index2.php
+https://www.aclj.org/Petition/Default.aspx?sc=3466&ac=1
+https://www.acmemarkets.com/eCommerceWeb/AboutAlbertsonsAction.do?action=getContactUs
+https://www.acnecomplex.com/
+https://www.acquisition.gov/far/index.html
+https://www.acrobat.com/
+https://www.acsa-arch.org/about/calendar.aspx
+https://www.acsinformedhealth.com/index.aspx
+https://www.activehealthphr.net/dtc
+https://www.activepursuit.com
+https://www.acurafinancialservices.com/
+https://www.adbusters.org/magazine/87/brain-east-west.html
+https://www.addthis.com/bookmark.php?v=250&amp;username=xa-4b4ca479374b93a5
+https://www.adobe.com/cfusion/event/index.cfm?loc=en_us&amp;id=1606033&amp;event=register_no_session
+https://www.adrinform.com
+https://www.advantagebankonline.com/
+https://www.advisorcentral.com/
+https://www.advisorclient.com/AdvisorClientWeb/logon.do
+https://www.advisorlynx.com/secure/main/login.aspx?Guid=f5fd9cf2-4874-4ea5-91ec-edbf99762fb0
+https://www.adwebtech.com/ecommerce.html
+https://www.aepnewsupplier.com/Supplier/Supplier_FAQ.aspx
+https://www.aesoponline.com/login2.asp
+https://www.aetna.com/pssel/loginPssel.fcc
+https://www.aetnapharmacists.com/login.php
+https://www.affinityfcu.org/site/business_banking_merchant.html
+https://www.afford.com
+https://www.afge-casetrack.org/login.aspx?ReturnUrl=%2fDefault.aspx
+https://www.afge.org/Index.cfm?page=Login
+https://www.afms.mil/sg/index.htm
+https://www.afternic.com/nescrowBegin.php
+https://www.agfinance.com/Loans/IAPBL?Command=appform&amp;newPage=y
+https://www.agronomy.org/
+https://www.agronomy.org/publications/jeq/abstracts/39/4/1224
+https://www.ahd.com/order_form.php
+https://www.ahimastore.org
+https://www.ahimastore.org/ProductDetailMembership.aspx
+https://www.ahip.org/Bookstore/ShoppingCart.aspx
+https://www.ahm-ownerlink.com/
+https://www.aibonline.org/schoolofbaking/certificationcourses/
+https://www.aict.ualberta.ca/
+https://www.aip.org/pay/donate/
+https://www.airfiji.com.fj
+https://www.airteller.com/sbr
+https://www.akronchildrens.org/
+https://www.alabamainteractive.org/child_labor_certificate/
+https://www.alamotitle.com/
+https://www.alarysbermuda.com
+https://www.alaska.edu/scholars/secure/index.xml
+https://www.alaskausa.org/
+https://www.alertpay.com/Documents/AlertPay_Integration_Guide.pdf
+https://www.alerts.equifax.com/
+https://www.allaboutloans.co.uk/#secureapplication
+https://www.alldaychemist.com/
+https://www.allegiancetech.com/App/ActiveSurvey/Open/Take.aspx?preview=1&amp;ESurveyId=9LKnmmMJm8m3G2&amp;cid=9LKnm4M228902852
+https://www.alliancebank.com/index.html
+https://www.alliancebanknaonline.com/onlineserv/CM/
+https://www.allianceeverywhere.com/home/products
+https://www.allianz.com/en/press/news/business_news/asset_management/news_2010-09-14.html
+https://www.allpar.com/forums/index.php?s=360e47ce02244fb555e29a727e38c6e4&amp;app=core&amp;module=global&amp;section=login
+https://www.allstate.com/commercialauto/default.aspx
+https://www.allstatemotorclub.com
+https://www.allstatemotorclub.com/
+https://www.ally.com/open-account/?INTCMPID=topNav_openAccount
+https://www.alternet.org/
+https://www.alumniconnections.com/olc/membersonly/PCT/mypage.jsp
+https://www.amalgamatedbank.blilk.com/Core/Authentication/MFAUsername.aspx
+https://www.amazon.com/dp/B001CZ9ZEE?tag=comea-20&amp;camp=213381&amp;creative=390973&amp;linkCode=as4&amp;creativeASIN=B001CZ9ZEE&amp;adid=0J1BQ0CHFWKP6EZ3GKP5&amp;
+https://www.american.edu/soc/news/sebert.cfm
+https://www.americancollectors.com/My-Account/22/secure__true/
+https://www.americanfunds.com/default-home.htm
+https://www.americanheart.org/presenter.jhtml?identifier=3063522
+https://www.ameriprise.com/mashops
+https://www.amherst.edu/people/facstaff/istavans
+https://www.amhsparta.org/moodle
+https://www.amia.org/cmiobootcamp
+https://www.amnic.net/
+https://www.amocofcu.org/
+https://www.amp.com.au/wps/portal/au/AMPAUProduct3C?vigurl=/vgn-ext-templating/v/index.jsp%3Fvgnextoid%3D73bbaeea65932210VgnVCM10000083d20d0aRCRD
+https://www.ams.org/cgi-bin/amsuser/accountmaint.pl/AskNew
+https://www.amsoil.com/StoreFront/shoppingcart.aspx
+https://www.amtrust.com/
+https://www.anchorbank.com/consumerloanapplication.asp
+https://www.annualcreditreport.com
+https://www.annualcreditreport.com/cra/index.jsp
+https://www.anonymousspeech.com/
+https://www.ansica.org/wwwversion2/outside/
+https://www.answersbyassurant.com/GMPortal/Manage+your+costs/insurance+costs/choosing+a+plan/survey.htm
+https://www.anthem.com/health-insurance/login/registration
+https://www.aoins.com/
+https://www.apache-ssl.org/cgi/cert-export
+https://www.aphlnet.org/eweb/DynamicPage.aspx?webcode=EventInfo&amp;RegPath=EventRegFees&amp;REg_evt_key=1c053ad5-82de-40a7-8b65-98c228a8655a
+https://www.apple.com/investor/
+https://www.applebank.com/uploadedFiles/fact_sheet_-_internet.pdf
+https://www.appleeducationaffiliates.com/t.aspx?kbid=1039&amp;p=http%3a%2f%2fstore.apple.com%2fus_edu_210880%2fgo%2fhome%3faosid%3dp211%26cid%3dAOS-US-CAMPUS-ADF%26kbid%3d1039%26m%3d215%26i%3d789&amp;m=215&amp;i=789
+https://www.apply2jobs.com/ccbg
+https://www.applyonlinenow.com/USCCapp/Ctl/entry?sc=UABHER&amp;cm_sp=Cons-CC-_-BAU%20Homepage%20CMS%20Default%20Ads-_-CC16LT003F_HP-Def-Masthead_dep-101_mst_cr_state_arn2h2d4_o.jpg
+https://www.applyrightnow.com/welcome/DynamicApp?bank=trustcobank
+https://www.applytexas.org/adappc/gen/c_start.WBX
+https://www.applyweb.com/apply/eou/menu.html
+https://www.apps.asiapacific.hsbc.com/1/2/inm2/do-not-call?WABFormEntryCommand=cmd_init
+https://www.apps4rent.com/reseller_signup1.html
+https://www.arcasearch.com/us/xx/?paper=rjt
+https://www.arin.net/
+https://www.arin.net/abuse.html
+https://www.arisehealthsolutions.com/
+https://www.ark.org/sos/ofs/docs/index.php
+https://www.arkbar.com/WhatsNew/ViewWhatsNew.aspx?Id=19
+https://www.arribamexicoinsurance.net/Consumer/interface/Home_Page.Asp?ProducerCode=73050
+https://www.artemis-ju.eu/attachments/70/ARTEMIS_Work_Programme_2009.pdf
+https://www.arvest.com/
+https://www.asbhawaii.asbnet.blilk.com
+https://www.asbnow.com/
+https://www.asbonline.com/customerservice/
+https://www.asc.gov/National-Registry/NationalRegistry.aspx
+https://www.ascentex.com/websales/
+https://www.ascomp.de/index.php?php=prog&amp;page=desc&amp;prog=backupmaker
+https://www.ashprogram.com
+https://www.asisonline.org/store/program_detail.xml?id=109314763
+https://www.asisvcs.com/services/ce/cehome.asp?as_prog_state=CE12IA&amp;CPCat=1216INS
+https://www.assuranthealthsales.com
+https://www.atbatt.com/account.asp
+https://www.atlanticsouthernbank.com/
+https://www.att.com/olam/forgotPasswordAction.olamexecute?forgotPasswordActionEvent=forgotPasswordStep1
+https://www.austadmin.com.au/CGI-BIN/LANSAWEB?PROCFUN+IWLOG+IWLOG10+IMP+FUNCPARMS+S1AZPLNID(A0160):SL+S1AZAPTYP(A0030):EOL
+https://www.auto.bbb.org/scripts/cgiip.exe/WService=wsbroker1/stats/arbstats.w
+https://www.autodns2.de/index.php
+https://www.autolease.no
+https://www.automation.siemens.com/_en/portal/meetSiemens.htm?pageKey=Page_0
+https://www.automotivesurf.com
+https://www.avuedigitalservices.com/
+https://www.aw2.army.mil
+https://www.ayes.org/ayesinfo/schoolinfo/schoolinfo
+https://www.ayured.com/moodle
+https://www.azbn.gov/MyServices/Login.asp
+https://www.azdes.gov/faa/cash.asp
+https://www.azed.gov/ess/SpecialProjects/transition/
+https://www.azgu.gov/osteoboard/login.aspx?ReturnUrl=/osteoboard/Default.aspx
+https://www.aztaxes.gov
+https://www.aztaxes.gov/
+https://www.babymint.com/shop/SHP_ParentDetail.aspx?pID=1316
+https://www.babysigns.com/
+https://www.baisidirect.com/login.html
+https://www.bams.com/merchant-advance.html
+https://www.bamsaccess.net/
+https://www.bamshare.com
+https://www.bancsabadell.com/
+https://www.bangoronlinebanking.com/onlineserv/HB/STDReg.cgi?STDRegStep1=yes&amp;runmode=REGISTRATION
+https://www.bangortreasury.com/
+https://www.bankadviser.com/americanstate/index000462854.cfm?x=bhkg9QN,bkgtm2w8
+https://www.bankatfirst.com/stayprotected/form.asp
+https://www.bankatunited.com/home/consumerinfo.php
+https://www.bankcardoffer.com/sb
+https://www.bankeft.com/
+https://www.bankforeclosuressale.com/login.php
+https://www.bankinfosecurity.com/register.php
+https://www.banking.hsbc.com.au/cgi-bin/doSecure
+https://www.bankmw.com/pdf/ExcessiveExpenditurePolicy.pdf
+https://www.bankofamerica.com
+https://www.bankofamerica.com/smallbusiness/index.jsp
+https://www.bankofengland.co.uk/publications/mediacentre/ssl/login.aspx
+https://www.bankofgranite.com/estatement/
+https://www.bankofky.com/
+https://www.bankofkyhb.com/onlineserv/CM/
+https://www.bankofmarin.com/index.php/business/merchant-services
+https://www.bankoftexas.com/contact
+https://www.bankofthepacific.com/page.php?id=67
+https://www.bankofthewest.com/
+https://www.bankplus.net/
+https://www.bankri.com/Personal/Overview/tabid/159/Default.aspx
+https://www.banksafe.com/check.cfm
+https://www.barclaycardus.com/app/japply/banking/marketing/rangedcma/contracts.html
+https://www.barclays-step.com
+https://www.bartendergirl.com/elearning
+https://www.batchadvantage.qvalent.com/LoginView
+https://www.baylake.com/info/Contact_Us.htm
+https://www.baylorhealth.com/mybaylor/Pages/handwashingvideo.aspx
+https://www.bbb.org/online/consumer/cks.aspx?ID=1060418151012
+https://www.bbt.com/bbt/apps/contact/trust.asp
+https://www.bbvacompass.com/special/200910/touch/
+https://www.bcbswy.com/
+https://www.bea.gov/efile
+https://www.beamalife.com/insurance/online_insurance_quote
+https://www.beaumonthospitals.com/news-story-beaumont-hospitals-launches-new-liver-transplant-program
+https://www.becu.org/online-banking.aspx
+https://www.bellsouth.com/apps/cpr/home/reg/displayRegistrationPage?regFlowType=bus&amp;regDestURL=&amp;regDestURL=https%3A%2F%2Fwww.bellsouth.com%2Fapps%2Febpp%2Fhome%2Fsbsbillview%3FbusUnit%3DSBS
+https://www.benefitscheckup.org/snap.cfm?partner_id=56
+https://www.benefitssf.org/(S(yo51o5flo4uwihnx5ka5dc45))/Default.aspx
+https://www.benjenonline.com/moodle
+https://www.berdonclaimsllc.com/unitedhealthcare/ProviderSubmit.aspx
+https://www.berkshireassociates.com/BALANCEtrak/jobapplication/applicantjobs.aspx?cid=32&amp;reset=1
+https://www.berkshirebankib.com
+https://www.berkshirebankib.com/onlineserv/CM/
+https://www.bestlittle.com
+https://www.beta.army.mil/Programs/apple/Lists/Categories/Category.aspx?CategoryId=1&amp;Name=iPhone
+https://www.bicsi.org/pdf/rcdd/Why%20Hire%20a%20BICSI%20RCDD.pdf
+https://www.bigtent.com
+https://www.bigtent.com/usr/files/18562431_2_00_BigTent_Press_Release_-_Saving_Dinner_Chooses_BigTent.pdf
+https://www.billingorchard.com/clients/
+https://www.billmelater.com
+https://www.billmelater.com/help/index.xhtml
+https://www.billpaysite.com/V2/Demo.aspx?instID=39380
+https://www.billpaysitedemo.com/GuidedConsumerDemo/nonenrollment/
+https://www.bills.com/mortgage/mortgage_quote/
+https://www.binck.com/gekko/common/inloggen.aspx?brand=binckbank&amp;culture=en-US
+https://www.bioiq.com
+https://www.bioiq.com/employee-wellness-screening-programs
+https://www.birthpoolinabox.co.uk/
+https://www.biz.indygov.org/dce/permits/
+https://www.bizjournals.com/phoenix/account/sign_in/?uri=%2Fphoenix%2F
+https://www.bkbank.com/
+https://www.blackberry.com/Downloads/entry.do?code=A8BAA56554F96369AB93E4F3BB068C22
+https://www.blackhat.com
+https://www.blackhat.com/BlackHatRSS.xml
+https://www.bliss.army.mil/
+https://www.blm.gov/adoptahorse/
+https://www.blogcatalog.com/exposure/
+https://www.blogger.com/comment.g?blogID=32069983&amp;postID=7700898613544617311
+https://www.blueshieldca.com/bsc/aboutbsc/corporate-info/index.jhtml
+https://www.bluetooth.org/
+https://www.bmmreg.com/Engaged/
+https://www.bmwgroupfs.com/
+https://www.boarddocs.com/md/chrlsco/Board.nsf/PrivateFrame?OpenFrameSet&amp;login
+https://www.boatus-insurance.com/insappNew/Default.asp
+https://www.boatus.com/join/join3.asp
+https://www.bof.nl/2010/07/27/save-the-date-ontmoet-cory-doctorow/
+https://www.borsheims.com/borsheims/CorporateGifts.htm
+https://www.bossierchamber.com/
+https://www.botc.com/index.cfm
+https://www.boucheron.com/
+https://www.boucheron.com/watch/mec-bat-watch-large-model,46088.html
+https://www.boucheron.com/watch/reflet-xl-limited-edition-watch-in-steel-and-pink-gold,42070.html
+https://www.bouchey.com/BOUCHEY/WEB/me.get?web.home&amp;SSLREDIRECT=5bc9d993156fe6f766566b14290a9ae3306d8ee03340772baf949fb707
+https://www.bpn.gov/ccr/default.aspx
+https://www.brainshark.com/brainshark/brainshark.net/portal/home.aspx?companyid=15873
+https://www.braintrauma.org/products-page/checkout/
+https://www.brandinst.com/memberservices/forgot.asp
+https://www.brandinstitute.com/memberservices/register.asp
+https://www.braveryhearts.com/hospitals.html
+https://www.bremer.com/obfbenrollment
+https://www.brfoodbank.org/
+https://www.bribeline.org/bribelineHome.jsp
+https://www.brightstartadvisor.com/
+https://www.broadwaybank.com/LoanImprovementProcessWeb/
+https://www.brokeroffice.com/quote/start.jsp?login=jfcline
+https://www.brokersxpress.com/new_account.asp?HSA_APP=TRUE&amp;ASID=2465&amp;BRANCHID=544
+https://www.brokescholar.com/index.cfm
+https://www.brooklinebank.com/home/personal
+https://www.bschool.nus.edu.sg/Departments/BussPolicy/BY%20papers/e-commerce%20readiness.pdf
+https://www.bsi.bund.de/cae/servlet/contentblob/471390/publicationFile/31053/ecom_es_pdf.pdf
+https://www.bsu.edu/webapps2/quest/
+https://www.btg-bestellservice.de/pdf/80201000.pdf
+https://www.btsecurethinking.com/wp-login.php
+https://www.bu.edu/link/bin/uiscgi_studentlink.pl/1239033388?ModuleName=univ_final_exam1.pl
+https://www.budget.com/budgetWeb/feedback/feedbackrouter.ex?feedbackhome=display-contactus
+https://www.budgetpulse.com/
+https://www.busey.com/home/home?vhelp
+https://www.buseyil.com/onlineserv/HB/ForgottenPW.html
+https://www.buseyrewards.com/myrewards/enduser/login/begin.do?ts=12457860571836658001
+https://www.businessbillpay-e.com/DemoV2/Subscribers/Default.aspx?instID=39174&amp;dualauth=1
+https://www.businessdirect.att.com/portal/smallbusiness/index.jsp
+https://www.businessextraa.com/PublicHomeAction.do
+https://www.businessfinancecoach.com/
+https://www.businessonlineaccess.web-cashplus.com/Cashplus/
+https://www.businessweek.com/
+https://www.buxfer.com/
+https://www.buydomains.com/find-premium-domains/domain-details.jsp?domain=azbanking.com&amp;utm_source=TDFS&amp;utm_medium=click&amp;utm_campaign=tucows&amp;traffic_id=TUCOWS
+https://www.buypenton.com/ProductDisplay.aspx?SubjectCode=MUM
+https://www.buzin.net/engine/start/order/services.html
+https://www.bwin.com/football
+https://www.bxs.com/inview/
+https://www.cablevisionpanel.com/R.aspx?a=111
+https://www.cacert.org/index.php?id=3
+https://www.cahps.ahrq.gov/default.asp
+https://www.calaware.org/index.php
+https://www.calcas.com/web/ccmc/my-account;jsessionid=08efa4daf8f48067b75fc3c6769a?p_p_id=58&amp;p_p_lifecycle=1&amp;p_p_url_type=0&amp;p_p_state=normal&amp;p_p_mode=view&amp;p_p_col_id=column-4&amp;p_p_col_pos=2&amp;p_p_col_count=3&amp;saveLastPath=0&amp;_58_struts_action=%2Flogin%2Fcreate_account
+https://www.calcoastcu.org/
+https://www.cambeywest.com/subscribe/?p=frp&amp;f=paid&amp;s=I101HBNK
+https://www.cambridgetrust.com/BusinessBanking/MerchantServices.aspx
+https://www.cancer.org/involved/donate/donateonlinenow/index
+https://www.capbluecross.com/Wellness
+https://www.capebankonline2.com/onlineserv/HB/ForgottenPW.html
+https://www.capitalareafoodbank.org
+https://www.capitalareafoodbank.org/learn/
+https://www.capitalbank-us.com/business_banking/business_products/merchant_services/merchant_services.html
+https://www.capitalconservator.com/open-account/
+https://www.capitaliq.com/
+https://www.capitalone.com/
+https://www.capturemyassets.com/collectinsure/index.asp
+https://www.cardinalbank.com/index.asp
+https://www.cardinalbank2.com/onlineserv/HB/Login.cgi?runmode=REGISTRATION
+https://www.cardmemberservices.com/ccp/index.jsp?pg_name=ccpmapp/cms/shared/page/privacy_policy
+https://www.cardmemberservices.net/
+https://www.cardonationservices.com/14/donate-a-car-House-Rabbit-Society/
+https://www.cardonebanking.com/landingPages/application.aspx?sourceCode=10415000
+https://www.carecredit.com/cardholderagreement/
+https://www.careerbuilder.com/share/login.aspx?sc_cmp2=JS_Nav_MyCB_Login
+https://www.caremark.com/wps/portal
+https://www.carinsurance.com/LoginExternal.aspx
+https://www.carolinachamber.org/members/register.html
+https://www.carolinainn.com/bend-dining-merchant-trader.php
+https://www.carolines.com
+https://www.carolines.com/
+https://www.carterfcu.org/rates.html
+https://www.caselitesoftware.com/
+https://www.cashu.com/site/findReseller
+https://www.catalogchoice.org/tos
+https://www.cathaybank.com/
+https://www.cba.ca.gov/cbt_public
+https://www.cbsbank.com/
+https://www.cbttrade.com/cbt2/xsplash.nsf?Opendatabase&amp;Login
+https://www.ccbg.com/opt-in
+https://www.cccssf.org/education/publications_seniors.html
+https://www.ccnow.com/cgi-local/checkout.cgi
+https://www.cco.purdue.edu/Student/major.shtml
+https://www.ccutx.org/
+https://www.cdafoundation.org/popup/give/where_to_give/donations_form
+https://www.cdlsusa.org/secure/donation.asp
+https://www.cdproject.net/CDPResults/Clean%20energy%20trends%20in%20emerging%20markets%20ENGLISH.pdf
+https://www.cec.purdue.edu/eC2K/Heading.asp?heading_id=19
+https://www.cee.siemens.com/web/bulgaria/bg/corporate/portal/rabota/Pages/rabota_kariera.aspx
+https://www.cefcu.com/
+https://www.celtic-net.com/application/login.asp?WhichApp=S&amp;agentid=1588
+https://www.centierhb.com/onlineserv/HB/ForgottenPW.html
+https://www.centralauctionhouse.com/rfp.php?cid=81
+https://www.centralbank.com/
+https://www.centralbank.net/pages/bankingCategory.aspx?tid=246
+https://www.centralbankofindia.co.in/site/MainSite.aspx?status=1&menu_id=17
+https://www.centralbk.com/
+https://www.centralbnk.com/ssl/AppHomeMortgage.asp
+https://www.centralpacificbank.com/
+https://www.centurynetbank.com/go/business/banking-services/merchant-services
+https://www.certs4less.com/cs-thawte-java.html
+https://www.cey-ebanking.com/clkpcb/125107626/
+https://www.cfa.com/
+https://www.cfbvertrieb.de/cfbnet/pso/login/login.asp
+https://www.cfda.gov/
+https://www.cfefa.org/
+https://www.cff.org/GetInvolved/ManyWaysToGive/Donate/
+https://www.cgimoportal.com/autoquote/AUTO_distributed.pdf
+https://www.charge.com/signupfree.aspx
+https://www.charlescounty.org/secure/acctinquiry/selection.jsp
+https://www.charlescountycns.com/_admin
+https://www.charlestillman.org/donate.php
+https://www.charter.com/order/offers.aspx?productitem=2
+https://www.charterone.com/forms/contactus.aspx
+https://www.charteroneonline.com/en.html
+https://www.chase.com
+https://www.chase.com/chf/mortgage/keeping-your-home
+https://www.chase.com/wamuwelcome3/
+https://www.chasebonus.com/
+https://www.chcoc.gov/Transmittals/TransmittalDetails.aspx?TransmittalID=2653
+https://www.cheap-jsp-hosting.com/java-code-signing.jsp
+https://www.check-finder.com/cflogin.htm
+https://www.checkagain.com/CheckAGAIN.WEB/Login.aspx?BnkInfo=LCB
+https://www.checkgiftbalance.com/
+https://www.checkmytrip.com/ITN/LoginServlet?SITE=ITN&LANGUAGE=US
+https://www.checkpoint.com/partners/login/cpo.jsp?redirect=/services/education/cpo/index.html
+https://www.checkpointusa.org/
+https://www.checksconnect.com
+https://www.checksconnect.com/
+https://www.chevrontexacocards.com/consumergen2/login.do?subActionId=1000&amp;clientId=chevron&amp;langId=en&amp;accountType=generic
+https://www.chillingeffects.org/chillingeffects.org?print=yes
+https://www.chittenden.com/
+https://www.chubb.com/personal/insurance.jsp#/Automobiles
+https://www.chubbcollectorcar.com/index.htm
+https://www.cia.gov/library/publications/the-world-factbook/appendix/appendix-a.html
+https://www.cia.gov/library/publications/the-world-factbook/fields/2108.html
+https://www.cia.gov/library/publications/the-world-factbook/geos/aa.html
+https://www.cia.gov/library/publications/the-world-factbook/geos/sh.html
+https://www.cia.gov/library/publications/the-world-factbook/rankorder/2102rank.html
+https://www.cia.gov/library/publications/the-world-factbook/rankorder/2187rank.html
+https://www.cia.gov/library/reports/Executive%20Summary_OIG%20Report.pdf
+https://www.cibcrunforthecure.com/html/personal_page.asp?track=3009852&amp;languageid=1
+https://www.cinfin.com/contact_us/SendMail.aspx?to=investor_inquiries@cinfin.com
+https://www.circsource.com/store/Subscribe.html?offerId=1026
+https://www.cirroenergy.com/guard/
+https://www.cisco.com/en/US/products/sw/secursw/ps2086/index.html
+https://www.cisecurity.org/tools2/metrics/CIS_Security_Metrics_v1.0.0.pdf
+https://www.citicards.com/cards/wv/cardDetail.do?screenID=940
+https://www.citigroupai.com/cai/instPortal/
+https://www.citigroupgeo.com/
+https://www.citizencorps.gov/cert/
+https://www.citizensbank.com/forms/contactus.aspx
+https://www.citizensbanking.com/secure/secureEmail.aspx?id=638
+https://www.citizensbankonline.com
+https://www.citizensbankonline.com/en.html
+https://www.citizensfla.com/about/depopinfo.cfm
+https://www.citrixonline.com/newsroom.tmpl?nrgp=gotoassist
+https://www.citybankonline.com/index.html
+https://www.cityfeet.com/Advertise/Default.aspx?PartnerPath=nytimes/
+https://www.civicnet.net/landing/civil_court_records.html
+https://www.ckbproducts.com/checkout_shipping.php
+https://www.clarityaccounting.com/features
+https://www.clarkeamerican.com
+https://www.clarkeamerican.com/caccp/catalogview.jsp?exp=P
+https://www.clearwateranalytics.com/SVBAssetManagement
+https://www.clevelandfed.org/Research/Review/1998/98-q4-santos.pdf
+https://www.clickbank.com/login.htm
+https://www.clickdmv.ne.gov/regrenew/
+https://www.clickssl.com/order/orderprocess.aspx?p=16&amp;pp=67&amp;isnew=false
+https://www.clickvue.com/bp/fsbct0724.html
+https://www.clicshop.com/Scripts/Caisse/Payer.asp?b=6220&Language=2
+https://www.clixgalore.com/MerchantSignup.aspx
+https://www.clsa.com/corporate-access/investor-forums.php
+https://www.clsau.com/index.php
+https://www.cmpinc.net/2010PHGConference/savethedate.aspx
+https://www.cms.gov/HIPAAGenInfo/Downloads/HIPAALaw.pdf
+https://www.cms.gov/OfficeofLegislation/Downloads/AccountableCareOrganization.pdf
+https://www.cnic.navy.mil/Kitsap/index.htm
+https://www.cnic.navy.mil/guantanamo/index.htm
+https://www.co.dutchess.ny.us/CivilServiceInformationSystem/ApplicantWeb/Public/frmAnnouncementList.aspx
+https://www.cobizfinancial.com/
+https://www.codeplex.com/site/register
+https://www.cognistar.com/loginGate/csLogin.cfm
+https://www.collectinsure.com/submitChange.html
+https://www.college.columbia.edu/adr/
+https://www.collegeadvantage.com/
+https://www.collegedata.com/cs/login/login_login_tmpl.jhtml?method=input
+https://www.collincountytx.gov/rsp-bin/ESCROWRM.pgm
+https://www.colonydirect.com/pbi_pbi1961/pbi1961.asp?RT=061202672&amp;logonby=connect3&amp;prmaccess=account&amp;afc=1234&amp;override=true&amp;enroll=true
+https://www.colorado.gov/apps/dor/dmv/vehicle/registration/renewal/welcome.jsf
+https://www.columbiabankonline.com/
+https://www.com.state.oh.us/dfi/
+https://www.comapps.ohio.gov/admn/admn_apps/admn/pressroom/
+https://www.commerce.commarts.com/
+https://www.commerce.state.ak.us/occ/olr/Start.cfm
+https://www.commercecares.com/CWEB/Enrollment/S2_PolPAC.jsp?enrollme.x=68&amp;enrollme.y=24
+https://www.commerzbank-kundenbeirat.de
+https://www.commerzbank-kundenbeirat.de/
+https://www.commerzbank.com/en/hauptnavigation/institutions/about_us/about_us.html
+https://www.commerzbank.de/de/hauptnavigation/home/home.html
+https://www.commerzbanking.de/P-Portal1/XML/IFILPortal/pgf.html?Tab=994151&amp;Doc=/en/GB/sitesubs/dialog/serviceseite_dialog.htm
+https://www.commonapp.org/
+https://www.commserv.ucsb.edu/residents/order_service/
+https://www.communityatcp.org/SSLPage.aspx?pid=1238
+https://www.comodo.com/login/comodo-members.php
+https://www.companyworld.com/en/main.htm
+https://www.companyworld.de/de/main.htm
+https://www.compbenefits.com/general_contact.asp
+https://www.compete.com/developer/
+https://www.completecampaigns.com/FR/contribute.asp?campaignid=TranVanCongress
+https://www.completessl.com/account/index.php
+https://www.compliance-helpline.com/northgrum.jsp
+https://www.compliancehelpline.com/welcomeRLI.jsp
+https://www.conferenceplus.com/confcenter/PinCode/Pin_Code.aspx?100046&amp;o=UiLmrZrFUKbJEy&amp;contactID=111016871&amp;gwkey=R43FFF37L2
+https://www.confidentialbanking.com/forms/order1.php
+https://www.confluence.hull.ac.uk/display/portalhull/Home
+https://www.connectcommerce.com/secure/partner_app_alt.html?ccmid=K216143
+https://www.connectnd.us/psp/ndrp/?cmd=login
+https://www.conservationtraining.org
+https://www.consumer.ago.mo.gov/
+https://www.consumeraffairs.com/php/a_report.php
+https://www.consumercardaccess.com/main/spectrum/Home
+https://www.continuinged.purdue.edu/distance/
+https://www.controlpanellive.co.uk/
+https://www.cool.army.mil/
+https://www.copilot.com/
+https://www.corpbank.biz/CorpBank/
+https://www.corpbanknet.com/CapsUser/MERPAY/merpay.payment.onpayment.poppup.do
+https://www.corpgov.deloitte.com/site/us/template.REGISTER/
+https://www.corpgov.deloitte.com:443/site/us/template.LOGIN/;jsessionid=F1kLMgzZ0hjndB4gv7kCd2LKPRBnHMByT77ZTBsZjpQwKKsT79HY!2053521530!NONE
+https://www.corporatelegalexchange.com/
+https://www.corpretail.com/RetailBank/?presentID=40&amp;headID=23
+https://www.countmyfish.noaa.gov/aboutus/organization/who_needs_angler_registry.html
+https://www.countrybank.com/onlineserv/HB/Login.cgi?r
+https://www.courts.mo.gov/casenet/base/welcome.do
+https://www.cpa2biz.com/myaccount/default.jsp?tabName=ONLINE_LEARNING
+https://www.cpbid.com/lms
+https://www.cphins.com
+https://www.cphins.com/Default.aspx?tabid=63
+https://www.cpsc.gov/cgibin/incident.aspx
+https://www.createspace.com/
+https://www.credit-suisse.com/ch/private_equity/en/dlj_merchant_banking_partners.jsp
+https://www.credit.com/r/score_compass/af=p41404&amp;ag=
+https://www.creditkarma.com/
+https://www.cresco.no
+https://www.crops.org/
+https://www.cryo-cell.ws/cryo-cell/giftcertificate.cfm
+https://www.cs.auckland.ac.nz/research/conferences/vldb08/index.php/VLDB_08
+https://www.cs.bsu.edu/moodle
+https://www.cs.drexel.edu/%7ecrorres/Archimedes/contents.html
+https://www.cs.hmc.edu/~keller/jazz/improvisor/
+https://www.cs.usfca.edu/moodle
+https://www.cse.ca.gov/ChildSupport/cse/guidelineCalculator
+https://www.csp.noaa.gov/policies/DOC_Breach_Notification_Plan.pdf
+https://www.csusbalumni.com/jointheassociation.htm
+https://www.ctf.org/index.php?option=com_dtdonate&amp;Itemid=100042
+https://www.ctfs.com/
+https://www.ctreasurydirect.com/ibsweb/cmserver/welcome/Harrisburg/verify.cfm
+https://www.cu.edu/psc/expensesystem/index.html
+https://www.cu.edu:443/ums/cof/faq.html
+https://www.cuabroad.cornell.edu/
+https://www.cualum.org/events/
+https://www.cucardsonline.com/EN/home.htm
+https://www.culpepercounty.gov/applications/biapps/schbiindex.htm
+https://www.cuny.edu/prepare
+https://www.cusys.edu/policies/General/email.html
+https://www.cusys.edu:443/faculty/fac_handbook/
+https://www.cvs.com/CVSApp/msnhealthvault/msnhealth_authentication_info.jsp
+https://www.cwwebs.com/payment.html
+https://www.cybergrants.com/boa/branch.html
+https://www.cybertrust.ne.jp/pki/news/091201.html
+https://www.cytiva.com/eb/tpl.asp
+https://www.dalpay.com/en/support/
+https://www.dansie.net/cgi-bin/faq.pl?faq=23
+https://www.danversbank.com/personal/personal_solutions/deposit_rates/
+https://www.darby-direct.com/cds.html
+https://www.dartmouth.edu/~blackboard/new_bb61_index.php
+https://www.dartmouthcollegefund.org/dcf.php?apc=A11WX&amp;utm_source=dhome&amp;utm_medium=web&amp;utm_campaign=dhome_web
+https://www.datapipe.com/resources-update-credit-card-information.htm
+https://www.daveramsey.com/store/Books/dave-s-bestsellers/Financial-Peace-Revisited/prod445.html
+https://www.daybydayscrubs.com/products.php?uniformname=labcoats&amp;cat=9
+https://www.dcs.state.or.us/case_info/case_status_login.asp
+https://www.deadiversion.usdoj.gov/NTBI/NTBI-PUB.pub;jsessionid=FC8B06160B3A10CDF2F38D6AD248BB3D?_flowExecutionKey=_c02A7D495-D551-01D7-4586-E537CDE8E469_k7CA1839A-CBB4-E11D-E44F-89441D4799C3
+https://www.dealeraccesssystem.com/sovereign
+https://www.dealertrack.com/portal/solutions/dealers/sales/bookout.aspx?sc_lang=en
+https://www.deanbank.com/personal-credit-loans-apply-consumer-loan.htm
+https://www.decktrade.com/
+https://www.deloitte.com/view/en_US/us/Insights/Browse-by-Content-Type/podcasts/651af75f65905210VgnVCM100000ba42f00aRCRD.htm
+https://www.delta.com/traveling_checkin/index.jsp?fpe=bau
+https://www.deltadentalins.com/PD/providerDirectory.do?action=s01
+https://www.deluxe-card.com/index.cfm?clientkey=deluxe105648&amp;dlxlinkid=text
+https://www.deluxe-check-order.com/ReorderHome.jsp
+https://www.deluxe.com/
+https://www.deluxeforms.com/brp.cfm?referringurl=http%3A%2F%2Fwww.sovereignbank.com%2Fbusiness%2Ffocus%2Ffocbussrv.asp&amp;useragent=Mozilla%2F4.0+%28compatible%3B+MSIE+6.0%3B+Windows+NT+5.1%29&amp;brpcode=79&amp;ipaddress=141.158.20.2&amp;requestedurl=http%3A%2F%2Fwww.deluxeforms.com%2Fbrp.cfm%3Fbrpcode%3D79
+https://www.demandbase.com/signup_freecontacts_a.html?leadSource=Home_Page&amp;campaign=70140000000Fm29
+https://www.democracynow.org/checkout
+https://www.det.nsw.edu.au/employment/
+https://www.det.nsw.edu.au/vsearch/wwwdet/?QueryText=accreditation&refine=new&Paging=true&ResultStart=21
+https://www.devere-group.com/
+https://www.deverefundplatform.com/
+https://www.deviceanywhere.com/nokia_vdl/Nokia_virtual_developer_lab.html
+https://www.dfsvalley.com/MoreAboutSecurity.aspx
+https://www.difxs.com/DIF/Home.aspx
+https://www.digicert.com/easy-csr/exchange2007.htm?rid=011592
+https://www.diginsite.com/demos/mamwhkq7/ib/CF411/Payment_Center/Path4/default.html
+https://www.digitalsociety.org/2010/06/endangering-digital-commerce/
+https://www.diproductsite.com/security_microsite/
+https://www.directadmin.com/clients
+https://www.directory.harvard.edu/phonebook/
+https://www.disasterassistance.gov/
+https://www.discoverbank.com/bankac/loginreg/login
+https://www.discovercard.com/cardmembersvcs/acqs/app/getapp?sc=MORE
+https://www.discoveryonlinebanking.co.za
+https://www.diversalertnetwork.org/myaccount/login.asp?redirect=report
+https://www.dmachoice.org/MPS/
+https://www.dmasonfinancial.com/moodlelms/moodle
+https://www.dmdc.osd.mil/vmet/owa/vmet_web_display.login
+https://www.dmgov.org/pt/
+https://www.dmme.virginia.gov/commerce/
+https://www.dmneedition.com/
+https://www.dmnsubscriber.com/
+https://www.dmr.nd.gov/ndgs//
+https://www.dna-alumni.com
+https://www.dnbnor.com/presse/resultater/q2_resultat_2010_live.html
+https://www.dnbnor.dk
+https://www.dnbnor.lu
+https://www.dnbnor.no
+https://www.dnbnor.no/om_oss/enheter/dnbnor_skadeforsikring/
+https://www.dnbnor.se
+https://www.dnc.gov.hk/public/dncquery
+https://www.dnr.sc.gov/license/login_screen
+https://www.dnspark.net/
+https://www.dnwstats.com
+https://www.documentexpress.hsbc.com/
+https://www.dodpke.com/InstallRoot/
+https://www.dogfunk.com/dogfunk/user/login.html?prev_page=profile
+https://www.dollarbank.com/adtracker/adtrack.aspx?CampaignName=OnlineTop&amp;CampaignType=O&amp;ForwardURL=http%3a%2f%2fonline.dollarbank.com
+https://www.dolphinsecure.com/
+https://www.dom.com/sign-in-keycust.jsp
+https://www.domain.ficora.fi/
+https://www.domainsiren.com/client/cart.php?a=view
+https://www.domainthenet.com/account/manage/?lang=en
+https://www.donatefast.com/consumerreports/index.cfm?cuid=0027222223
+https://www.donation-net.net/donation/donation1.cfm?dn=1243&amp;source=8&amp;CFID=8101544&amp;CFTOKEN=33192489
+https://www.donhr.navy.mil/
+https://www.donkeyinternet.net/blog/globalsign-announce-unlimited-server-licensing/
+https://www.donotcall.gov
+https://www.donotcall.gov/default.aspx
+https://www.dontstayin.com/pages/findyourfriends
+https://www.doradls.state.co.us/index.php
+https://www.dotbridge.com/
+https://www.downeysavingsonlinebanking.com/onlineserv/HB/Signon.cgi
+https://www.dps.state.oh.us/bmv/VehSetID.aspx
+https://www.dreambigrewards.com/
+https://www.dreamspark.com/wayf/wayf.aspx
+https://www.drivethrustuff.com/
+https://www.drop.com.au/
+https://www.dropbox.com
+https://www.dropbox.com/
+https://www.drumbeat.org/project/open-web-education-alliance
+https://www.drweilvitaminadvisor.com/vitamin_advisor?aid=888813&amp;aparam=mohpVA_EDH_Footer
+https://www.dscoduc.com/wp-login.php
+https://www.dss.mil/diss/documents/sar.pdf
+https://www.duats.com/
+https://www.dunkindonuts.com/aboutus/
+https://www.durablescrubs.com/products.php?cat=8&amp;scrubsname=Prints
+https://www.dynadot.com/domain/transfer.html
+https://www.dyndns.com/account/resetpass/
+https://www.e-gold.com/acct/login.html
+https://www.e-junkie.com/ecom/gb.php?c=cart&amp;i=553499&amp;cl=88539&amp;ejc=2
+https://www.e-onlinedata.com/12wonder
+https://www.e-pmi.com/e-PMI
+https://www.e-secure-it.com/index.asp?period=w
+https://www.eandi.org/
+https://www.earthlab.com/createprofile/reg.aspx
+https://www.ease.mo.gov/
+https://www.easternbank.com/
+https://www.eastwestbank.com/English/PB_WLending.asp
+https://www.eastwestbankhb.com/onlineserv/HB/demo.html
+https://www.ebankhost.net/974/ftu.htm
+https://www.ebaypartnernetwork.com/PublisherRegPSA
+https://www.ebaypartnernetwork.com/files/hub/en-US/index.html
+https://www.ebenefits.va.gov/ebenefits-portal/
+https://www.ebidsourcing.com/displayPublicBusinessDirectoryVendorDetails.do?statewide=Yes&amp;doValidateToken=false&amp;menu_id=2.7.1.1.1.1&amp;vendorId=206049&amp;contractHolder=Yes
+https://www.ebtedge.com/gov/portal/merchant-public/MerchantRegistration.do
+https://www.eccouncil.org/about_us/dod_8570/ctl/edit/mid/1082.aspx#AGDC
+https://www.eccu.org/
+https://www.ecfa.org/Join.aspx
+https://www.ecom01.fiservboston.com/PBI_PBI1961/pbi1961.asp?Rt=021210057&amp;LogonBy=Connect3&amp;PRMAccess=Account&amp;Enroll=True&amp;AccessId=True
+https://www.economistsubscriptions.com/ecom919/global/
+https://www.econsumer.equifax.ca/ca/view/common/nje.jsp
+https://www.econsumer.equifax.com/consumer/sitepage.ehtml?EFX_PARAMS=EFX_VALUES&amp;CMP=KNC-Google&amp;HBX_PK=%3Cequifax%3E&amp;HBX_OU=50
+https://www.ecorphost.net/EBC_EBC1961/EBC1961.ASP?WCI=Process&amp;WCE=Request&amp;RID=3000&amp;RTN=042101174&amp;MFA=2
+https://www.ecri.org/Conferences/Pages/Annual_Conference.aspx
+https://www.ecsi.net/cgi-bin/bcgi.exe?blogm7
+https://www.ecwid.com
+https://www.edinfo.state.ia.us/data/financereport.asp
+https://www.educause.edu/Shibboleth.sso/DS?target=https%3A%2F%2Fwww.educause.edu%2Fshib_login%2Fnode%2F720
+https://www.educonnection.org/ecommunity/educonnection/article.page?item_id=40748024
+https://www.efanniemae.com/sf/formsdocs/forms/pdf/sellingtrans/appraisalfaqs.pdf
+https://www.efanniemae.com/sf/guides/ssg/annltrs/pdf/2009/0902.pdf
+https://www.efanniemae.com/sf/refmaterials/approvedprojects/
+https://www.efax.com/en/efax/twa/numberPortingLanding
+https://www.eff.org/deeplinks/2010/09/censorship-internet-takes-center-stage-online
+https://www.efileshare.com/login.asp
+https://www.efinancial.com
+https://www.efinancial.com/smartquoteefc.aspx?source=389-707
+https://www.efinancialnews.com/register
+https://www.efinplan.com/
+https://www.efirstbank.com/
+https://www.eftps.com/eftps/
+https://www.eftps.gov
+https://www.eftps.gov/
+https://www.egov.nh.gov/NCharge/Public/NHRecovery/default.asp?form_name=survey
+https://www.ehealthinsurance.com/ehi/AccountCenter.ds
+https://www.ekemper.com
+https://www.ekemper.com/
+https://www.eloan.com/s/show/contact?sid=78E48820317AE7393490BA8377566F9C&amp;user=&amp;mcode=&amp;vid=
+https://www.emeraldsecure.com/tellafriend.cfm?SSLID=43162
+https://www.emerchantview.com/MerchantClientWeb/
+https://www.emisaccess.co.uk/
+https://www.empiredistrict.com/
+https://www.emploisetc.ca/toolbox/quizzes/quizzes_home.do?lang=fr
+https://www.emploisetc.gc.ca/toolbox/quizzes/quizzes_home.do?lang=fr
+https://www.employees.org/webcharset.html
+https://www.employflorida.com/
+https://www.employri.org/
+https://www.empresas.hsbc.com.ar/ModAdmin/Seguridad/loginUsuarios.asp?WT.ac=HBAR_e100901PCB04CMB
+https://www.encompassinsurance.com/billpay/login.asp
+https://www.encorebank.com/
+https://www.energystar.gov/index.cfm?fuseaction=mesa.showRequestUsername
+https://www.engr.utexas.edu/classrooms/
+https://www.enroute-computer.com/
+https://www.enterasys.com/acctmgmt/register.aspx
+https://www.entrust.com
+https://www.entrust.com/fraud-intelligence/index.htm
+https://www.entrust.net/customer/profile.cfm?domain=www.vectrabank.com
+https://www.epag.de/en/login
+https://www.epassporte.com/secure/jsp/Questions.jsp
+https://www.epdq.co.uk/app_form.htm
+https://www.epls.gov/epls/servlet/EPLSDebar
+https://www.epointsystem.org
+https://www.epointsystem.org/trac/website/blog
+https://www.epromos.com/login.do
+https://www.epropertytax.com/DataCenter/login.aspx?ReturnUrl=%2fdatacenter%2fAppMenu.aspx
+https://www.epropper.com/
+https://www.epss-fp7.org/epss/EPSS-Userguide.pdf
+https://www.equator.com
+https://www.equator.com/index.cfm?event=public.homepage&homepage=buyers
+https://www.erieinsurance.com/Applications/SiteAdvantage/Default.aspx?searchType=agent
+https://www.esa.doc.gov/index.cfm
+https://www.escortradar.com/register/product_registration.asp
+https://www.escrow.com/support/calculator.asp
+https://www.esd.wsd.gov.hk/esd/bnc/updatePersonalParticulars/requestEcertNote.do?pageFlag=1
+https://www.esdal.com/
+https://www.essexbank.com/
+https://www.estoregfoa.org/scriptcontent/index.cfm
+https://www.ethnoservice.com/
+https://www.ets.org/portal/site/iserpraxis/menuitem.1b7fdbe6788d618e6c41265a7beb1509
+https://www.etsms.com/
+https://www.eukhost.com/whmcs/clientarea.php
+https://www.euroland.com/factsheet/N-DNB/factsheethtml.asp?lang=Norwegian
+https://www.eventbuilder.com/gsb
+https://www.events-google.com/google/frontend/reg/thome.csp?pageID=17227&amp;eventID=79
+https://www.everydayminerals.com/
+https://www.everydaysource.com/member/myaccount#MyAccountShow
+https://www.everythingtrackandfield.com/ssl/AtcChkOutAlphaSignIn.aspx?ReturnPage=CustProfileMain.aspx
+https://www.ewealthmanager.com
+https://www.ewebcart.com/sslverify/
+https://www.examiner.com/x-867-LowCarb-Lifestyle-Examiner~y2008m11d12-If-lowcarb-is-so-dead-then-why-are-so-many-new-blogs-in-November-2008
+https://www.exchange.iu.edu/
+https://www.exchangebank.com/Default.aspx
+https://www.exchangebnkonline.com/onlineserv/HB/ForgottenPW.html
+https://www.execsearches.com/ssl/Client-Login-Non-Profit-Jobs/SignIn-Customers-JobSeekers.asp
+https://www.expansys.com.hk/ft.aspx?k=60035
+https://www.expensify.com/
+https://www.experian.com/freeze/center.html
+https://www.experionsystems.com/gsx/156144/ims_web.xjsp
+https://www.expertflyer.com
+https://www.export.gov/safehrbr/login.aspx
+https://www.externalaffairs.uga.edu/os/makegift?1=1&amp;unit=32&amp;amount=50&amp;otheramt=0
+https://www.ezbusinesscardmanagement.com/
+https://www.ezcardinfo.com
+https://www.ezcardinfo.com/login.aspx?ReturnUrl=%2fdefault.aspx%3fb%3dpalmettobank&amp;b=palmettobank
+https://www.ezsubscription.com/cty/subscribe.asp
+https://www.faasafety.gov/wings/pppinfo/
+https://www.fabricdepot.com/
+https://www.facebook.com
+https://www.facebook.com/
+https://www.factstuitionaid.com/FACTS/gaapp
+https://www.fagenuniversity.com/moodle
+https://www.fairfaxcounty.gov/bosclerk/speaker_bos.htm
+https://www.familycord.com/giftcard.cfm
+https://www.fanmanlighting.com/shop/pc/viewcontent.asp?idpage=11
+https://www.farmbureaubank.com/appsdeposits/fbmember.aspx
+https://www.fastlane.nsf.gov/
+https://www.fastspring.com/blog/
+https://www.fauquierbank.com/page.asp?goto=O%2F%15%08I%7B%0A
+https://www.fbcinc.com/nist_autosec/atreg1.aspx
+https://www.fbo.gov
+https://www.fbo.gov/?s=opportunity&mode=form&id=5a861c05eb2c4993a78b5220719f1811&tab=core&_cview=0
+https://www.fbo.gov/index?s=opportunity&mode=form&id=11548c3688dcf3bba3fd4a798166950a&tab=core&_cview=1
+https://www.fbo.gov/index?s=opportunity&mode=form&tab=core&id=4f05b3253e42fa9489a06a99c86b72a8
+https://www.fbodaily.com/subscription/sub.html
+https://www.fbten.com/
+https://www.fcbweb.net/commercial-banking/merchant-card-services/
+https://www.fcc.gov/nors/disaster/
+https://www.fcg.pentagon.mil/
+https://www.fdic.gov/EDIE/index.html
+https://www.fdm.army.mil/
+https://www.febala.com/personalbanking.htm#savings
+https://www.fecwatch.org/cmteprofiles/overview.php?cmte=HENE&cmteid=H07&cycle=2010
+https://www.federalreporting.gov/federalreporting/faq.do
+https://www.federalreserve.gov/apps/mortcalc/
+https://www.ffb.com/
+https://www.ffiec.gov
+https://www.ffii.de/Spenden/
+https://www.fhb.com/
+https://www.fi-web.com/msbweblink/Logon/frmLogon.aspx
+https://www.fiabusinesscard.com/
+https://www.fiatecodrivefleet.com/
+https://www.fiddhttps://www.fiddlersgreen.net/models/aircraft/Piper-L4-Grasshopper.html
+https://www.fiddlersgreen.net/models/Buildings/Roberts-Roost.html
+https://www.fidelity.com/
+https://www.fidelityaccountview.com/av/lca/
+https://www.fido.gov/facadatabase/public.asp
+https://www.filesanywhere.com/index.html
+https://www.finametrica.com
+https://www.financialcryptography.com/mt/archives/000581.html
+https://www.financialengines.com/
+https://www.financialtimes.net/TRIP2//
+https://www.first-state.net/index.cfm
+https://www.firstacceptancecorp.com/CustomerLogin.aspx
+https://www.firstambank.com/
+https://www.firstbankak.com/home/loc/alo#totem
+https://www.firstbankingcenter.com/about-us/contact-us.html
+https://www.firstcitizens.com/washington/
+https://www.firstcitizensbank.com/index.html
+https://www.firstcloverleafbank.com/
+https://www.firstcomp.com/fcmarketing/assets/pdf/news/best_places_to_work_2006.pdf
+https://www.firstdata.com/en_us/customer-center/merchants/support/first-data-global-gateway-api-software-landing
+https://www.firstdatapartners.com/citi/customer-care/index.php
+https://www.firstinterstatebank.com/
+https://www.firstmerit.com/personal/index.aspx
+https://www.firstmeritIB.com/Enroll.aspx
+https://www.firstmeritib.com/
+https://www.firstplacebank.com/
+https://www.firstpremier.blilk.com/Core/Authentication/MFAUsername.aspx
+https://www.firstrepublic.com/private_wealth_management/call_back.asp
+https://www.firstrepublichb.com/onlineserv/HB
+https://www.firstrust.com/About-Firstrust/Financial-Information/99/
+https://www.firstusa.com/cgi-bin/webcgi/webserve.cgi?card=CRCF&amp;page_type=appterms
+https://www.fis.dowjones.com/login.aspx
+https://www.fiservdmecom1.net/PBI_PBI1961/Pbi1961.asp?Rt=073922429&amp;LogonBy=connect3&amp;PRMAccess=Account&amp;enroll=true
+https://www.fiservdmecom3.net/PBI_PBI1961/pbi1961.asp?Rt=091408598&amp;LogonBy=connect3&amp;PRMAccess=Account&amp;user=true%0A
+https://www.fiservdmecorp3.net/EBC_EBC1961/EBC1961.ASP?WCI=Process&amp;WCE=Request&amp;RID=3000&amp;RTN=091408598
+https://www.fiservla6.com/PBI1961.asp?Rt=122042205&amp;LogonBy=Connect3&amp;PRMAccess=Account&amp;URL=Start.htm
+https://www.five9.com/
+https://www.fl-ag-online.com/customer/f05home.aspx
+https://www.flatworldknowledge.com/user/login?destination=user%2Fregister
+https://www.fleet.ford.com/showroom/2011fleetshowroom/2011-transittaxi.asp
+https://www.flightstats.com/attmes/Attendant/homeDisplay.do?
+https://www.flmowner.com/servlet/ContentServer?pagename=Owner/Page/AccountOverviewPage
+https://www.florencesavings.com/
+https://www.floridacommerce.org/
+https://www.floridajobs.org/appeals/
+https://www.floridastudentfinancialaidsg.org/UA/SAWSTUA_uaform.asp
+https://www.flrules.org/Default.asp
+https://www.fmjfee.com/i901fee/
+https://www.fnb-online.com/Corporate/TreasuryManagement/MerchantServices.aspx
+https://www.fnbrf.com/business-merchant-services.htm
+https://www.fnmoc.navy.mil/
+https://www.folioinvesting.com/
+https://www.fool.com/secure/login.aspx
+https://www.foragentsonly.com/aqn/default.aspx
+https://www.fordpartner.com/partnerweb/login.do
+https://www.foreclosuredatabank.com/joinnow.htm
+https://www.forefieldkt.com/kt/htmlnl.aspx?type=fmkt&amp;id=3104&amp;mid=137621&amp;iplf=ix&amp;ciid=147689&amp;emailid=3816f08c-817d-4658-b2ed-e05b471b9544
+https://www.foremost.com/products/mobile-home/get-mobile-home-estimate.asp
+https://www.forge.funambol.org/scdocs/ddUsingSVN_command-line
+https://www.formrouter.net/circulation@AJC/subscribe.aspx
+https://www.formsite.com/cars-on-line/Edit/secure_index.html
+https://www.forparentsofsmartkids.org/moodle
+https://www.fortify.net/sslcheck.html
+https://www.forwardhealth.wi.gov/WIPortal/Default.aspx?tpHome=1
+https://www.foundation.umn.edu/pls/dmsn/online_giving.start_null
+https://www.foundationbank.org/contact_us/content/contact/contact_us.html
+https://www.foxrentacar.com/Phoenix.html
+https://www.fpds.gov
+https://www.fpds.gov/dbsight/search.do?s=FPDSNG.COM&amp;indexName=awardfull&amp;templateName=awardSearch&amp;q=%22federal+communications+commission%22&amp;rss=1&amp;feed=atom0.3 &lt;https://www.fpds.gov/dbsight/search.do?s=FPDSNG.COM&amp;indexName=awardfull&amp;templateName=awardSearch&amp;q=%22federal+communications+commission%22&amp;rss=1&amp;feed=atom0.3&gt;
+https://www.fractalbrew.com/labs/prefox/
+https://www.fracturedatlas.org/site/contribute/donate
+https://www.franklintempleton.com/retail/pages/generic_content/global_nav/about_us/company_main.jsf
+https://www.frbcorporateonline.com
+https://www.frbcorporateonline.com/
+https://www.freeauthnet.com/application.php
+https://www.freebase.com/api/account/logout?mw_cookie_scope=domain&amp;onsucceed=http%3A%2F%2Fwww.freebase.com%2F
+https://www.freelancer.com/users/api/keys.php
+https://www.freelancersinsuranceco.com/fic/secure/
+https://www.freerewardchecking.com/
+https://www.freeze.equifax.com/Freeze/jsp/SFF_PersonalIDInfo.jsp
+https://www.frostbank.com/mobile/Pages/index.html
+https://www.frsb.net/
+https://www.fs.ml.com/publish/public/privacy_security/privacy_security.asp
+https://www.fsafeds.com/fsafeds/index.asp
+https://www.fsd.gov
+https://www.fsd.gov/
+https://www.fsscc.org/
+https://www.fsvsecurecard.com/fsv/websites/CentralBank2/home.asp
+https://www.ft.com/cms/s/0/e37fdcce-c027-11df-b77d-00144feab49a.html
+https://www.ftasia.net/cgi-bin/ftasianew.cgi/fess/index_html?t=fta25&amp;sie=Nh8IPBZ8L4VEa18VUdfojzzpTSrsc7du
+https://www.ftccomplaintassistant.gov/
+https://www.ftlatest.com/bs-trial-FT9-2009/default.asp?source=620
+https://www.ftnewspaper.com/cgi-bin/ftusa.cgi/showWorldMap
+https://www.fundraisingbynet.net/fbn/contributeFederal.asp?guidWidgetTracker=585A58&amp;guidRegistration=565A5C57
+https://www.fxpro.com
+https://www.g4sgroup.net/global/login
+https://www.gaiaonlinehelp.com
+https://www.gaiaonlinehelp.com/ics/support/default.asp?deptID=5694&amp;task=knowledge&amp;questionID=380
+https://www.gainskeeper.com/Login.aspx
+https://www.game.co.uk/Checkout/Basket/
+https://www.gao.gov/cgi-bin/fraudnet.cgi
+https://www.gardensavingsfcu.org/rates-yields
+https://www.gartner.com/SignIn.jsp?call=homepage
+https://www.gdd.de
+https://www.geniusis.net/additional-year-free-on-all-globalsign-certificates/
+https://www.genworthfinancialsecurities.com/
+https://www.geotrust.com/about/contact/support-form/
+https://www.gerberlife.com/gl/view/service_center/self_service/enroll.jsp
+https://www.getdropbox.com/referrals/NTU3MTI2MTk
+https://www.gffg.com/personal/ProductsAndServices/Banking/WaysToBank/OnlineBankingSecurity/
+https://www.gibill.va.gov/wave/index.do
+https://www.gibill2.va.gov/
+https://www.giftrecords.duke.edu/howto.cfm
+https://www.gifts.duke.edu/af16/
+https://www.ginniemae.gov/subscribe/signup.asp?Section=Subscribe
+https://www.girlsinc-online.org/
+https://www.girlsinthegame.org/donate
+https://www.gizmocall.com/
+https://www.gkis.net/basispro/loginReminder.aspx
+https://www.glacierbank.com/loanapp
+https://www.glassclaim.com/fnolpages/policyHolder_Info.jsp?inclno=122076&amp;oc_id=al000123
+https://www.glgroup.com/Lead-Capture-Form.aspx
+https://www.globalinformationnetwork.com/
+https://www.globalprecision.com
+https://www.globalsign.net/digital_certificate/certificates.cfm
+https://www.globalsignrestoration.com/back-lit-signs.html
+https://www.globessl.com/SSL-Certificates,Thawte.htm
+https://www.gmacagency.com/news/_docs/appointment.asp
+https://www.gmacfs.com/account/us/en/login.html
+https://www.go-retire.com/nbt/srtweb1.htm
+https://www.goacta.org/events/athena.cfm
+https://www.godaddy.com
+https://www.godaddy.com/ecommerce/merchant-accounts.aspx?isc=ggngen20&app_hdr=&ci=2648
+https://www.godaddyconnections.com/ResourceView.aspx?resourceid=114&amp;ci=15424
+https://www.godaddymobile.com/
+https://www.golden1.com/aboutus/link.aspx?id=87
+https://www.golifestore.com/
+https://www.gomr.mms.gov/PDFs/2001/2001-066.pdf
+https://www.google.com/accounts/
+https://www.google.com/adplanner/site_profile?s=markmail.org&amp;b=1
+https://www.google.com/adsense/support/bin/answer.py?hl=en&answer=10035
+https://www.googleapis.com/buzz/v1/activities/search?q=bontq.com
+https://www.gopak.co.uk/
+https://www.gotomeeting.com/t/G2_home/LM?Redirect=http://www.gotomeeting.com/&amp;_sf=2
+https://www.gotomycard.com/
+https://www.gotomypc.com/downloads/pdf/m/GoToMyPC_Corporate_Security_White_Paper.pdf
+https://www.gotowebinar.com/tgw/G2_HP?Target=w/g2wlp.tmpl
+https://www.govbenefits.gov/
+https://www.govdocs.com/service/multi_subscribe.html?code=USFRBNEWYORK&amp;origin
+https://www.governmentbids.com/cgi/en/free.alert.trial?link=alert_home
+https://www.governmentjobs.com/js_login.cfm?&amp;TopHeader=calvert&amp;
+https://www.govloans.gov/
+https://www.govone.com/mibank
+https://www.govport.com/citationpay/entry.cfm
+https://www.grangeinsurance.com/
+https://www.gravityfinancial.com/
+https://www.grc.com/x/ne.dll?bh0bkyd2
+https://www.greatamericanbonds.com/index.html
+https://www.greatamericantrucker.com/
+https://www.greatlodge.com/oh/license/welcome
+https://www.greatwesternbank.com/
+https://www.growfinancial.org/
+https://www.gs1ca.org/apps/events/registration.asp?EventID=EVT-422&amp;PvLng=64
+https://www.gsaadvantage.gov/advgsa/main_pages/start_page.jsp
+https://www.gsb.org/
+https://www.gssa.state.co.us/Companies.nsf/RH?OpenForm
+https://www.gtefcu.org/
+https://www.gteind.com/new_accessories/stock/nut_bolt_gasket
+https://www.gteinvestmentgroup.org/
+https://www.gtesystems.com/cpanel
+https://www.gtesystems.com:8443/
+https://www.guardiananytime.com
+https://www.guardiananytime.com/
+https://www.guardianflexplan.com/
+https://www.guardianinvestor.com
+https://www.guardianlife.com/GuardianLife/ControllerServlet?request.app=ftprequest&amp;request.entry=ftprequest.display.home
+https://www.guardianretirement.com/participant/index.asp?flash=trust
+https://www.guidedstudies.com/moodle
+https://www.guidegecko.com/singapore/river-area-hotels/swissotel-merchant-court/p,608167738
+https://www.guidestone.org/aboutus/securecontactform.aspx?subject=default
+https://www.gunadiframework.com/apps/osu/online/signup.aspx?Type=Notetaker
+https://www.gurufocus.com/membership/upgrade.php?nl=nl1
+https://www.h-net.org/donations/
+https://www.habitat.org/cd/giving/donate.aspx?link=1
+https://www.hackinthebox.org/modules.php?op=modload&amp;name=News&amp;file=article&amp;sid=35995
+https://www.hairclippy.com/
+https://www.hampdenbank.com/
+https://www.hangarhosting.net/customers/aff.php?aff=008
+https://www.hangseng.com/contactus/eng/form.asp?subjCde=OSMEBS&amp;fr=ins&amp;prd=&amp;msg=
+https://www.hanmi.com/Hanmi/
+https://www.harborone.com/
+https://www.harleysvillegroup.com/cont/cont_1.html
+https://www.harleysvillesavings.com/overdraft/Default.aspx
+https://www.harleysvillesavingsbank.com/Common/SignOn/ChallengeResponse.asp
+https://www.harrahslouisianadowns.com/casinos/harrahs-louisiana-downs/casino-misc/racetrack-detail.html
+https://www.harrisbank.com
+https://www.harvardpilgrim.org/portal/page?_pageid=213,201483&amp;_dad=portal&amp;_schema=PORTAL
+https://www.hd-money.com/info/Merchant.aspx
+https://www.health-first.org/applications/pwss/index.cfm?fuseaction=accountActivationDN
+https://www.health.harvard.edu/customers/login.php
+https://www.health.wyo.gov/main/admin.html
+https://www.health2con.com/login.html
+https://www.healthadvance-online.com/register.asp?doctorid=73034
+https://www.healthcareforallohio.org/Home_Page.html
+https://www.healthearizona.org/app/Default.aspx
+https://www.healthnet.com/portal/home.do
+https://www.healthonnet.org/HONcode/Conduct.html?HONConduct322521
+https://www.healthy-voices.com/Portal/p.aspx
+https://www.healthykids.org/
+https://www.heart360.org/
+https://www.heartlandbankonline.com/pages/PB_CA_InterestPlus.html
+https://www.hellohealth.com/
+https://www.helpinghandonline.org/donate.aspx?proid=75
+https://www.herald.co.uk/undying/card.html
+https://www.hernandotaxsale.com
+https://www.hertz.com/rentacar/emember/login.do
+https://www.hfc.com/
+https://www.hhs.purdue.edu
+https://www.hhs.purdue.edu/
+https://www.highmark.com/hmk2/index.shtml
+https://www.highmarkbcbs.com
+https://www.highmarkbcbs.com/cgi-bin/inetcgi/chm/jsp/findInsurance.do?tab=0
+https://www.highmarkblueshield.com/cgi-bin/inetcgi/chm/jsp/findInsurance.do?tab=0
+https://www.highmarkhealth.com
+https://www.highmarkonhealthreform.com
+https://www.hkirc.hk/
+https://www.hl7.org/store/index.cfm?ref=nav
+https://www.hmpadmin.com/portal/index.html
+https://www.hmsteamstore.com/shoppingcart.asp
+https://www.homefederal.com/company_information/contact_us/
+https://www.homefederalbank.com/contactus.htm
+https://www.homefederalonlinebank.com/onlineserv/HB/demo.html
+https://www.homenow.com/secure/consumer/default.asp
+https://www.homestead.com/~site/Signup/SignupCookieTest.ffhtml?PID=947&URL=/~site/Signup/StartCCRSignup.ffhtml
+https://www.homestreet.com
+https://www.hometownquotes.com/affiliates/index.cfm?action=customers.edit
+https://www.hometrustbanking.blilk.com
+https://www.hon.ch/HONcode/Conduct.html?HONConduct404691
+https://www.hondafinancialservices.com/
+https://www.honeynet.org/node/539
+https://www.horacemann.com/resources/fellowships/default.aspx
+https://www.hotelthailand.net/mybooking.cfm
+https://www.howtogeek.com/howto/windows-vista/disable-aero-on-windows-vista/
+https://www.hpso.com/customer-service/email-registration.jsf
+https://www.hrc.army.mil/site/education/index.html
+https://www.hsbc.am/1/2/ALL_SITE_PAGES/internetbanking
+https://www.hsbc.com.ar/Forms/Solicitud/PFS/eNews/default.asp?WT.ac=HBAR_e100901FNB01ALL
+https://www.hsbc.com.mt/1/2/
+https://www.hsbc.com.mx/1/2/idv.Authentication?nextPage=HUB_IDV_REGISTRATION
+https://www.hsbc.com.vn/1/2/personal_en
+https://www.hsbc.fr/1/2/hsbc-france/particuliers/login.
+https://www.hsbc.gr/1/2/ALL_SITE_PAGES/internetbanking
+https://www.hsbc.kz/1/2/ALL_SITE_PAGES/internetbanking
+https://www.hsbc.pl/1/2/ALL_SITE_PAGES/internetbanking
+https://www.hsbc.ru/1/2/ALL_SITE_PAGES/internetbanking
+https://www.hsbccreditcard.com/ecare/loginform?locale=en_US&amp;brand=UP_000_000?cmd_DisplayLogin=
+https://www.hsdl.org/hslog/?q=node/4593
+https://www.hsfinancial.ca
+https://www.hsfinancial.ca/quote-reminder
+https://www.hsh.com/lsmailto.html
+https://www.hsr.gov
+https://www.hss.edu/secure/prs-appointment-request.asp
+https://www.hthtravelinsurance.com/login/login.cfm
+https://www.htsmerchant.com/docs/downloads/HW_WebPay_Integration_Guide.pdf
+https://www.https//appraisalfoundation.sharefile.com/d-s45a44c61f6743679
+https://www.httpwatch.com/demos/ajax_cdn/
+https://www.hudson.org/files/documents/2008%20Index%20-%20Low%20Res.pdf
+https://www.huntington.com/pas/HNB1700.htm
+https://www.hushmail.com
+https://www.hushmail.com/
+https://www.hushtools.com/
+https://www.hvcc.edu
+https://www.hvcc.edu/enroll.html
+https://www.hvfcu.org/business-services/merchant-services
+https://www.i-sight01.com/i-sight/WVWC.nsf/CaptureWeb
+https://www.iaai.com/
+https://www.iacourtcommissions.org/icc/SearchLawyer.do
+https://www.iardc.org/index.html
+https://www.ibanksystems.com/ibankv4/ksLoginFrame.cfm?agclient=ctm
+https://www.ibc.com/en-us/Pages/default.aspx
+https://www.ibm.com/developerworks/mydeveloperworks/blogs/WCSelfHelp/?lang=en
+https://www.ibm.com/developerworks/university/academicinitiative/
+https://www.ibsnetaccess.com
+https://www.ibsnetaccess.com/NASApp/NetAccess/LoginDisplay
+https://www.icephr.com/
+https://www.icsdelivery.com/wmblair/formNew3.asp
+https://www.id-protection-service.com/itm_web?rtn=11131300
+https://www.ideals.illinois.edu/handle/2142/16949
+https://www.identitysecure.com/global/scripts/promo.asp?ref=IBCRDROSPAG0001
+https://www.idfpr.com/DPR/licenselookup/default.asp
+https://www.idr.iowa.gov/ChangeForm/start.asp
+https://www.idrive.com/idrivee/jsp/ide_freesignup.jsp
+https://www.idselector.com/
+https://www.iesabroad.org/IES/Scholarships_and_Aid/financialAid.html
+https://www.ietf.org/registration/ietf79/ietfreg.py
+https://www.ihr.com/ihr/promotion/linkorderform.html
+https://www.iiaba.net/cbsupx/education/evtpreview.aspx?evt=9959
+https://www.iiblp.org/index.php?main_page=login
+https://www.iil.com/pm/Assessment_Tool_Demo/welcome.htm
+https://www.ilapld.com/Training.aspx
+https://www.ileaseavaya.com/
+https://www.illinoistrooper.com/Online_PIC.asp
+https://www.ilmiodono.it/it/?intcid=NASCE-ILMIODONO-IT--UN-SITO-WEB-AL-SERVIZIO-DELLE-ORGANIZZAZIONI-NON-PROFIT
+https://www.imageremit.com/sovereign/
+https://www.imcovered.com/Default.aspx?ref=schools
+https://www.imf.org/external/cntpst/index.aspx
+https://www.imfbookstore.org
+https://www.imfbookstore.org/
+https://www.imglobal.com/travelinsurance/index.cfm?imgac=14785
+https://www.immediatealert.com/
+https://www.imperial.ac.uk/alumni/SSLPage.aspx?pid=1455
+https://www.imperialfire.com/
+https://www.indiana.edu/~phishing/browser-recon/?06c59e851f73
+https://www.indiana.edu/~tedfrick/plagiarism/item1.html
+https://www.indigorose.com/customers/login.php
+https://www.indure.org/
+https://www.infinityauto.com/index.jsp
+https://www.infinityconferences.com/InfiniBase/Reg/NIH4/pregnancymtg
+https://www.informationassuranceexpo.com/index.php?option=com_content&view=article&id=14
+https://www.informationshield.net/mm5/merchant.mvc?Session_ID=fc3ac2f5b55720f3f3b812e712f7cd4f&Screen=OINF&Store_Code=ISOS
+https://www.informe.org/moses/
+https://www.infosecisland.com/blogview/6646-Better-Security-Through-Sacrificing-Maidens.html
+https://www.ingfunds.com/investor/content/accounts/default.aspx
+https://www.ingservicecenter.com/
+https://www.inhope.org/%20
+https://www.insight.com/pages/landingpage.web?id=7061
+https://www.insightcustomercare.com/
+https://www.inspire.com/groups/pregnancy-and-parenting/search/?query=nicu
+https://www.instantssl.com
+https://www.instantssl.com/login.html
+https://www.instantssl.it/pagina.asp?id=127
+https://www.institutedfa.com/
+https://www.insurancequotes.org/access-account
+https://www.insurbanc.com/smartforms/contact.php
+https://www.insurewithbbt.com?ReferralSource=DP
+https://www.integralblue.com/blog/wp-login.php
+https://www.integrity-helpline.com/RedCross.jsp
+https://www.intellicorp.net/branding/niai/default.asp
+https://www.internet-estatements.com/centralbnk/
+https://www.internetsecure.com/cgi-bin/certified.mhtml?merchant_number=7505
+https://www.intl-alliance.com/store/index.php?main_page=
+https://www.introplay.com/
+https://www.investorannex.com/Modules/Users/Investor/ForgotPassword/enter.php
+https://www.investorlearning.ca/ilcdev/
+https://www.investors.com/Secure/MyIBD/MyAlerts.aspx
+https://www.iowadnr.gov/tip/
+https://www.iowadonorregistry.org/index.php?option=com_donor&amp;task=register&amp;Itemid=28
+https://www.iowaonline.state.ia.us/csac/yctc/college_list.asp
+https://www.iowava.org/
+https://www.ipa.go.jp/about/inquiry/mailform01.html
+https://www.iportis.com/signup.php
+https://www.ipp.gov/
+https://www.ips.state.nc.us/ips/pubmain.asp
+https://www.iris.gov.hk/eservices/welcome.jsp?language=en
+https://www.isbnj.com/bridge/disclosures/ib/custom_pre_registration.html
+https://www.isc.org/software/bind/documentation/arm95
+https://www.isecpartners.com/files/iSEC_Aurora_Response_Recommendations.pdf
+https://www.isg.rhul.ac.uk/etiss/localinfo
+https://www.isis.ufl.edu/cgi-bin/nirvana?MDASTRAN=RSI-GPA
+https://www.ismfast.com/FastPage.php?id=ef08083f678ce5c9c7456569f75241b6
+https://www.issa.org/
+https://www.issaonline.com/store/viewcart.cfm
+https://www.issatrainer.com
+https://www.issatrainer.com/services/seminars/seminar_enroll.cfm?seminar_id=212
+https://www.issuerdirect.com/
+https://www.istockanalyst.com/premium/signupttod.aspx?prid=4
+https://www.it-isac.org/
+https://www.it-solutions.siemens.com/B2B/IT/EN/GLOBAL/PRESS/Pages/press.aspx
+https://www.it.dev.duke.edu/tools/corpmoves
+https://www.itacsentinel.com/TDBank/ordernow.aspx?From=TDB2
+https://www.itap.purdue.edu/directory/
+https://www.itos.uga.edu/slCatalog/index.do
+https://www.iucu.org/
+https://www.iulzi.com/
+https://www.iverified.com/
+https://www.iwhois.com/whois/gte.com
+https://www.ixwebhosting.com/templates/ix/v2/affiliate/clickthru.cgi?id=websiteoffice&amp;campaign=whr-homepage
+https://www.jafco.org/
+https://www.jagcnet.army.mil/
+https://www.jangomail.com/ContactForm.asp
+https://www.javelinstrategy.com/research/Brochure-194
+https://www.jetblue.com/manageflights/checkin/
+https://www.jetpens.com/
+https://www.jinfocard.org/minishop2
+https://www.jlbghealth.com/get-instant-health-insurance-quotes
+https://www.jnjcosat.com/
+https://www.jobsatcu.com/
+https://www.johnsonbankcm.com/onlineserv/HB/Signon.cgi
+https://www.jostens.com/sitehelp/legal.asp
+https://www.jpackage.org/bugzilla/show_bug.cgi?id=324
+https://www.jpmorganchase.com/
+https://www.jscape.com/support/index.php?_m=knowledgebase&amp;_a=viewarticle&amp;kbarticleid=260
+https://www.juniper.com/app/japply/lp/TnCs.jsp?prodidreq=CCMPS24211
+https://www.justcallhome.com/ecom/login.html
+https://www.justice.gov.uk/publications/corporate-information.htm
+https://www.juststats.com/track?c1b471a5fd8a046ace73554c6ddaec4a7&amp;sid=banners
+https://www.jvast.com/torute/pages/sslseal/
+https://www.k-12.state.tn.us/tcertinf/EducatorSearch.asp
+https://www.kable.com/pub/aspc/renew.asp
+https://www.kaiserpermanente.org/
+https://www.kalahari.co.ke/checkout/page_templates/search.aspx?searchText=Lifelines%3A+The+Black+Book+of+Proverbs&navigationid=632&displayShop=books
+https://www.kansasjoblink.com/ada/
+https://www.kansasworks.com/ada/
+https://www.kanzabank.com
+https://www.kapco.com/
+https://www.kasasa.com/cash/provider/frsb
+https://www.kb.cert.org/vuls/
+https://www.kdor.org/voterregistration/Default.aspx
+https://www.key.com/html/international-ach-transaction-iat.html
+https://www.key.com/html/online-banking-options.html
+https://www.kfwebs.net/urlshortener/
+https://www.killingtonchamber.com/
+https://www.kimbellart.org/Education/Lectures-Programs/Lectures.aspx?tid=1
+https://www.kintera.org/site/c.mgLPIYOzGlF/b.5706305/k.5CBC/Partner_Registration/apps/ka/rg/default.asp?kntaw41261=2F2CF59C545A4378B017530358134066
+https://www.kiplinger.com/store/gift/
+https://www.kitsapbank.com/default.aspx?v=9e332369-033c-4393-b1ca-4b0050ed8f20
+https://www.kiwibank.co.nz/mobile/index.asp
+https://www.klartext.commerzbank.de
+https://www.klubershop.com/
+https://www.kone.com/en_NT/MyKone/MyKoneBackground/0,,content=31602,00.html
+https://www.kpmg.com/Global/en/IssuesAndInsights/RSSFeeds/Pages/International-Corporate-Tax.aspx
+https://www.kuro5hin.org/comments/2009/1/23/23821/1280/4#4
+https://www.kybank.com/personal-banking/overdraft.aspx
+https://www.kyfb.com/
+https://www.labcorp.com/.PatientBilling/pdf/PatientBillingHelp.pdf
+https://www.lafayettela.gov/Etrakit/index.asp
+https://www.lafcu.org/onlineserv/HB/ForgottenPW.html
+https://www.lakecitybank.com/business-banking/merchant-services/
+https://www.lanb.com/personal/application.asp?type=deposit
+https://www.landmarkbank.com/
+https://www.lannendesignshosting.com/whmcs/cart.php?a=add&amp;pid=21
+https://www.lateralfood.com/store/index.php?route=account/login
+https://www.law.arizona.edu/Alumni/onlinegiving.cfm
+https://www.law.columbia.edu/center_program/Tax_Policy
+https://www.law.northwestern.edu/ewc/details.cfm?EventID=9722
+https://www.law.stanford.edu/library/digitalreserves/
+https://www.lawguru.com/answers/privacy
+https://www.lcaus.com/investmentplatform
+https://www.lcoc.com/
+https://www.ldev.com/helpdesk/
+https://www.leaderbank.com/mortgage_loan_app.asp
+https://www.leewayinfo.com
+https://www.leewayinfo.com/LWinfo_forms.html
+https://www.left-bank.com/event/ical
+https://www.legacy.com/obitmessenger/default.asp?sentby=580
+https://www.legacybank.com/
+https://www.legislature.mi.gov/(S(vkx4id453imfze45m2ogrl45))/mileg.aspx?page=Register
+https://www.lendingclub.com/press/lending-club-introduces-the-first.jsp
+https://www.lenslenders.ca
+https://www.letsmeetregistration.net/forms/eig/2010.php
+https://www.leukemia-lymphoma.org/all_donate?item_id=8072&amp;utm_source=BOAwebsite&amp;utm_medium=website&amp;utm_campaign=BankofAmerica_Promo
+https://www.lewrockwell.com/donate/
+https://www.lexisnexis.com/prospectportfolio
+https://www.lib.uwo.ca/blogs/digitalscholarly/
+https://www.liberty.edu/libertycounsel/index.cfm
+https://www.libertybankiowa.blilk.com/index.asp?
+https://www.libertybankiowa.com/calculators/default.aspx
+https://www.libertyhill.org/changela
+https://www.libertyreserve.com/en/signup/step1/index.aspx
+https://www.life-insurance-service.com/insurance/lb_new_quote/cw_huntington
+https://www.lifeclinic.com/HealthVault/
+https://www.liferay.com/home;jsessionid=B15FEE134871A79EC86F76E25B4ABD02.node-1?p_auth=1HqytIxm&amp;p_p_auth=rAYpNZ6f&amp;p_p_id=82&amp;p_p_lifecycle=1&amp;p_p_state=normal&amp;p_p_mode=view&amp;_82_struts_action=%2flanguage%2fview&amp;languageId=zh_CN
+https://www.lifewiseor.com/
+https://www.ligminchalearning.com/courses
+https://www.likassquare.com.my/accommodation.html
+https://www.lincolninst.edu/pubs/dl/55_Chapman98.pdf
+https://www.linkedin.com/secure/register?trk=hb_join
+https://www.linktogether.com/member/cathy65brook
+https://www.linode.com/members/linode/network.cfm
+https://www.lionbank.com/personal_overdraft.asp
+https://www.liquidweb.com/drupal-hosting.html?utm_content=Drupal&amp;utm_campaign=AffiliateProgram&amp;utm_source=AffiliateProgram&amp;utm_medium=Banner&amp;RID=Drupal
+https://www.listbox.com/member/archive/247/=now
+https://www.livedocx.com/user/account_registration.aspx
+https://www.livelook.com
+https://www.livingbalancesheet.com
+https://www.livingbalancesheet.com/lbs
+https://www.llnl.gov/annual09/
+https://www.lmpeople.com
+https://www.lmpeople.com/
+https://www.loanliner.com/LoanRequest/CLPPresenter/GettingStarted.aspx?CUID=10402067&amp;LoanFormId=4489876509292164429&amp;ChannelId=2941122005140152812&amp;LocationId=9488722005140152728&amp;IsFramed=F
+https://www.loanprospector.com/lp-credit/IndexServlet
+https://www.loans24.net/atl/clientSelect.do?clientID=7473
+https://www.lockfox.com/Plan-Selection
+https://www.lonestar529.com/
+https://www.longislandferry.com/
+https://www.lordofultima.com/en/user/register
+https://www.lotuslive.com/en/businesspartners/
+https://www.loyaltygateway.com/preferred/rewards/SignInServlet?bank_id=51235
+https://www.lsba.org/2007MemberLogin/MemberLogin.asp?DR=Fastcase
+https://www.lulu.com/commerce/
+https://www.lvlcc.com/
+https://www.machshav.com/pipermail/mobike/
+https://www.macromedia.com/go/getflash/
+https://www.macu.com/onlineserv/HB/ForgottenPW.html
+https://www.macuweb.org/onlineforms/insurancequote.aspx
+https://www.magicbooks.org/cms
+https://www.mahealthconnector.org/portal/site/connector/menuitem.0c5d8e0f63bf313ea6c05667d6468a0c/
+https://www.mail2web.com
+https://www.mainaccount.com/sii/Login.html
+https://www.maine.gov/cgi-bin/online/AbsenteeBallot/index.pl
+https://www.mainsourceinsurance.com/templates/30/loader.asp?SiteKey=550297984&amp;key=3400
+https://www.mairie-marseille.fr/vdm/cms/Environnement/Gestion
+https://www.mals-e.com/admin/create.htm
+https://www.manpower.usmc.mil/stoploss
+https://www.marchofdimes.com/howtohelp/donate_online.asp
+https://www.marcorubio.com/most-important-donate/?gclid=CLqfnvT3naQCFQ8E5QodlxKtDg
+https://www.marylandsail.org/Screening/Default.aspx
+https://www.massbankers.org/
+https://www.massmutual.com/csso/accountaccess
+https://www.math.wisc.edu/moodle
+https://www.mathclass.org/wqs/k.asp?state=2
+https://www.mauiweb1.com/0235/
+https://www.mbc.edu/ssl/security/
+https://www.mbf.com.au/HealthInsurance/Healthinsuranceoptions/Corporateplans/Corporatelogin
+https://www.mbp.state.md.us/mbp_mz_2009/index.aspx
+https://www.mbvtonline.com/onlineserv/HB/Signon.cgi
+https://www.mc4.army.mil/about.asp
+https://www.mcafeeasap.com/intl/EN/asp_home/myaccount.asp
+https://www.mcafeegsl.com
+https://www.mcafeesecure.com/RatingVerify?ref=iportis.com
+https://www.mcgraw-hill-sales.com/2009_GreeningCorpAmerica.pdf
+https://www.mckesson.fr/
+https://www.mcpressonline.com/security/general/e-commerce-security-its-not-getting-any-easier.html
+https://www.mcssl.com/SYS/?m=102393&amp;c=l
+https://www.mdinsurance.state.md.us/complaints/jsp/complaints/PcComplaintInfo.jsp?mode=true
+https://www.me.com/gallery/
+https://www.medicalcountermeasures.gov/BARDA/MCM/panflu/factsheet.aspx
+https://www.memberheadquarters.com/Login.aspx?bid=10164
+https://www.mercbank.com/
+https://www.merchantconnect.com/
+https://www.merchante-solutions.com/jsp/custom/banner_login.jsp
+https://www.merchantexpress.com/preAppPage.htm
+https://www.merchantriskcouncil.org/
+https://www.merchantsbank.com/winona/form-contact-us.htm
+https://www.merchantscapture.blilk.com/index.asp?
+https://www.meridell.com/home.shtml
+https://www.meridianbank.com/
+https://www.meridianpacificproperties.com/mailinglists/emailus
+https://www.mesh.com/
+https://www.metasploit.com/redmine/projects/framework
+https://www.metbank.com/personal/estatement/
+https://www.metcalfbank.com/OnlineAccountOpening/
+https://www.metlifeautoquote.com/indexToq.html?oc_id=al3740
+https://www.metlifece.com/evite_v4/evite.asp?id=charlotte09281010
+https://www.metlifeinvestors.com/
+https://www.metronetbankingonline.com/onlineserv/HB/demo.html
+https://www.metrorevenueservices.org/Registration/
+https://www.mfmnow.com/Supported.aspx
+https://www.mi.ngb.army.mil
+https://www.mibank.com
+https://www.mibank.com/mibank/Ads/ci.mireo.statement
+https://www.mibankrewards.com/home.asp?
+https://www.mibbit.com/?server=irc.mozilla.org&amp;channel=%23firefox
+https://www.michworks.org/
+https://www.microplace.com/
+https://www.microsoft.com/china/whdc/winlogo/drvsign/crosscert.mspx
+https://www.microsoftelearning.com/
+https://www.mid.state.ms.us/consumer/online_complaint.aspx
+https://www.midatlanticdeltadental.com/DeltaDental/link/contact_us/contact_us.asp
+https://www.midcarolinabank.com/
+https://www.middleburgbank.com/personal/banking/personal-checking/fox-free-checking/
+https://www.middleburgbankonline.com/onlineserv/HB/ForgottenPW.html
+https://www.midfirst.com/
+https://www.milfordbank.wblnk.com
+https://www.milfordbank.wblnk.com/
+https://www.minnesotaworks.net/
+https://www.miretirement.com
+https://www.miretirement.com/
+https://www.missionbicycle.com/bike_festival
+https://www.missouricareersource.com/mcs/mcs/default.seek
+https://www.missouriorgandonor.com/odpublicsite/Default.aspx
+https://www.mitrust.com
+https://www.mitrust.com/mibank/solutions.cfm?objectID=23C212B3-8592-4E46-9B4ABEEE0B5BCD0F
+https://www.mixx.com/login
+https://www.mmaglobal.com/forums/message-board/north-americaglobal-committee-forums/research-and-metrics
+https://www.modemexpress.com/servlet/Checkout?smode=checkout
+https://www.modularmerchant.com/shopping-cart-hosting-options.php
+https://www.monarchbank.com/mbindex.php
+https://www.monarchbankonline.com/onlineserv/HB/ForgottenPW.html
+https://www.moneybookers.com/app/my_account.pl
+https://www.moneyfundsdirect.com/mfd
+https://www.moneygram.com/
+https://www.moneymanagement.org/Utility/Online-Counseling-Form.aspx?RCTAG=UP
+https://www.moneynowusa.com/prefill_app.php
+https://www.moneysupermarket.com/c/customer-care/
+https://www.moneytrackin.com/signup
+https://www.monroecountybank.com/cgi-bin/hb.exe?control=1114.txt&amp;act=login&amp;v1=demo&amp;v2=123456&amp;Click%2BHere%2Bto%2BTest%2BDrive%2BMCB-OnLine%2BPersonal%2BBanking.x=39&amp;Click%2BHere%2Bto%2BTest%2BDrive%2BMCB-OnLine%2BPersonal%2BBanking.y=18
+https://www.monsanto.ca/
+https://www.montanabankers.com/indexsecure.php
+https://www.montgomerycountymd.gov/apps/dot/Call_N_Ride/index.asp
+https://www.morgankeegan.com/ca/mkca.aspx
+https://www.motionindustries.com/
+https://www.motorola.com/worp/campaigns/phone-registration/USA/
+https://www.mountainsidefinancial.com/apply.php
+https://www.mpayy.com/developer-tools-and-api/mobile-payments-api
+https://www.mrwsecure.com/pft/cart.php?mode=checkout
+https://www.ms-ezpay.com/
+https://www.ms.gov/dfa/ace/W2EFTDispatcher
+https://www.msu.edu/user/schwenkl/abtrbng/stablw.htm
+https://www.msu.edu/~grawbur1/iahweb.html
+https://www.msu.edu/~karjalae/internet96.htm
+https://www.msufcu.org/business/p_merchantprocessing.html
+https://www.mtamaryland.com/store/
+https://www.mtb.com/personal/Pages/Index.aspx
+https://www.mtnhse.com/mm5/merchant.mvc?Screen=OINF&Store_Code=M
+https://www.mturk.com/mturk/welcome
+https://www.mvsb.com/contact_us/quick_help.php
+https://www.mworld.com/m/ic/bulletin.asp
+https://www.myaccount.ascensus.com/pacificlife
+https://www.myaccountaccess.com/elanCard/login.do?theme=elan2&amp;loc=12745
+https://www.myads.com/tou.html
+https://www.myallianceonline.com/onlineserv/HB/ForgottenPW.html
+https://www.myalliedpolicy.com
+https://www.myarcelormittal.com/
+https://www.mybenefits.ny.gov/selfservice/
+https://www.mybiotifulbag.us/index.php
+https://www.mycardstatement.com/default.aspx?b=bannerbank
+https://www.myciscocommunity.com/community/technology/collaboration
+https://www.myclientline.net/
+https://www.myctfs.com/
+https://www.mydatapipe.com/
+https://www.myersreport.com/researchgroup.asp?cat=20
+https://www.myfico.com/SystemAccess/Login.aspx
+https://www.myflexonline.com/Login/Welcome.aspx
+https://www.myfloridacounty.com/cse-pay-now/addCases.do;jsessionid=aRuXOgFls977
+https://www.myfloridadeferredcomp.com/SOFweb/index.htm
+https://www.myfloridajobs.com/
+https://www.myfloridalicense.com/wl11.asp?mode=0&amp;SID=
+https://www.mygreatwest.com/default.aspx
+https://www.myhealth.va.gov/mhv-portal-web/anonymous.portal;jsessionid=tHFLJ1LKT046X7frHjVyY0hZ1t7pnWC46T1NLGnq8tv3QW69JVzL!-1590491306?_nfpb=true&amp;_pageLabel=rxRefillHome
+https://www.myhospitalplan.com/
+https://www.myisic.com/MyISIC/Travel/Main.aspx?MenuID=5000
+https://www.mymedicare.gov
+https://www.mymedicare.gov/
+https://www.mymedlab.com/
+https://www.mymetrobankcc.com/
+https://www.mymra.com/Motorcycle_Insurance_Quote.htm
+https://www.mynefcu.org/account-category.cfm?type=58&cat=1
+https://www.mynewloanstatus.com/Login.aspx?Company=EB
+https://www.mynortonaccount.com/amsweb/redirect.do?tok=&amp;fpage=orderHistory&amp;product_lang=EN
+https://www.myopenid.com/signup?affiliate_id=57748
+https://www.myoperationhope.org
+https://www.myoperationhope.org/myoh/
+https://www.myphrinfo.com/
+https://www.mypopularbanking.com/cs/ContentServer?childpagename=NA%2FLayout&c=BP_LandingPage_C&pagename=bp%2Fcommon%2FWrapper&cid=1234207644767
+https://www.mypuppyschool.ca/
+https://www.myroms.org/wiki/index.php/Subversion
+https://www.mysite.co.uk/myadmin/xsell.php
+https://www.myspectrumhealth.org/ForgotUsername.aspx
+https://www.mysteryshops.com/
+https://www.mystreetscape.com/
+https://www.mystudentbody.com/login.asp
+https://www.mytotalmoneymakeover.com
+https://www.mytotalmoneymakeover.com?featuresOnly
+https://www.myu.umn.edu/
+https://www.myvirtualmerchant.com/VirtualMerchant/download/developerGuide.pdf
+https://www.myvitaldata.com/
+https://www.naedafinancial.com/Speedpay.aspx
+https://www.namcogames.com/
+https://www.nano.org.uk/payments/
+https://www.naplesart.org/content/festivals-opportunities
+https://www.nasb.com/
+https://www.nasi.org/civicrm/event/info?reset=1&amp;id=120
+https://www.natassembly.org/
+https://www.nationalcustomercare.com/account/us/en/login.html
+https://www.nationalgridus.com
+https://www.nationalgridus.com/nantucket/safety_call.asp?wt.mc_id=811fromNanHP
+https://www.nationalresourcedirectory.gov/nrd/public/DisplayPage.do?parentFolderId=6574
+https://www.nationwide.com/access/web/login.htm?WT.svl=todo.401k
+https://www.nationwidebankmortgage.com/custserv/form-login.aspx
+https://www.navycollege.navy.mil/
+https://www.navyfamily.navy.mil/
+https://www.navyfcu.org/pdf/press-releases/2010/USA_Merger.pdf
+https://www.navyfederal.org/about/about.php
+https://www.navyreserve.navy.mil/
+https://www.nb.com/
+https://www.nccaminfo.org/herbs/herbs.asp
+https://www.nccob.org/Online/NMLS/LicenseSearch.aspx
+https://www.nccte.org/publications/infosynthesis/r&amp;dreport/Taxonomy_Dykeman.pdf
+https://www.ncesc1.com/individual/webInitialClaims/applyBegin.asp
+https://www.ncourt.com/forms/GA/navigation.aspx?Juris=GAMuscogee
+https://www.nctreasurer.com/dsthome/StateAndLocalGov
+https://www.ndtourism.com/whatdo/events/
+https://www.ndworkforceconnection.com/
+https://www.nearlyfreespeech.net/about/faq
+https://www.neatoshop.com/checkout
+https://www.nebraska.gov/sos/corp/corpsearch.cgi
+https://www.neco.navy.mil
+https://www.neco.navy.mil/romii/login.aspx
+https://www.nedbankonline.com/
+https://www.nemoc.navy.mil/site/satellite/
+https://www.neotrope.com/s2p-order/application.shtml
+https://www.netforumondemand.com/eWeb/DynamicPage.aspx?Site=taf&amp;WebCode=Brochures&amp;SID=1&amp;VID=1&amp;CID=85&amp;DID=116&amp;CIDQS=&amp;Taxonomy=False&amp;specialSearch=False
+https://www.netionline.com/
+https://www.netit.financial-net.com/boulderdamcu/
+https://www.netspend.com/
+https://www.netteller.com/superiorbank/login.cfm
+https://www.networkautomation.com/account/login/?customerLogin_referer=http://forums%2Enetworkautomation%2Ecom%2Fforum%2Findex%2Ecfm%3Fforumid%3D1
+https://www.networkforgood.org/donation/MakeDonation.aspx?ORGID2=521343924
+https://www.networking4all.com/fr/certificats+ssl/
+https://www.networksolutions.com/manage-it/index.jsp
+https://www.networkworld.com/newsletters/stor/2009/080309stor2.html
+https://www.networthiq.com/occupation/InternetWebEcom
+https://www.netzclub.net/tarif.html
+https://www.nevadalegalnews.com/corporatekits/order_corporate_kit.php
+https://www.nevadatax.nv.gov/web/
+https://www.newalliancebank.com/our-community-involvement
+https://www.newgenerationhosting.com/ssl.php
+https://www.newresourcebank.com
+https://www.newresourcebank.com/personal-overview/
+https://www.newresourcebankonline.com/onlineserv/HB/demo.html
+https://www.newsgator.com/ngs/order1.aspx
+https://www.newyorkfed.org
+https://www.newyorkfed.org/registration/stats/shla/2010/form.cfm
+https://www.newyorklife.com/genreq05
+https://www.nexusmail.uwaterloo.ca/
+https://www.nfaap.org/netFORUM/eweb/aapssologin.aspx?nfredirect=http%3A%2F%2Fpediatrics.aappublications.org%2F&amp;nfvendor=pediatrics
+https://www.nfc.usda.gov/personal/ep_warning.asp
+https://www.nflplayercare.com/
+https://www.nhsb.wblnk.com/
+https://www.nic.co/
+https://www.nic.es/
+https://www.nic.im/
+https://www.nic.org.mt/
+https://www.nic.pe/
+https://www.nic.sl/
+https://www.nic.switch.ch
+https://www.nic.switch.ch/
+https://www.nicb.org/multimedia/staged-videos/staged-accident-videos
+https://www.nicb.org/theft_and_fraud_awareness/vincheck/vincheck
+https://www.nichd.nih.gov/health/clinicalresearch/cccert/default.aspx?ic=NCCAM
+https://www.nightowl.net/
+https://www.nipr.com/html/nrlWelcome.html
+https://www.nlstalkingbooks.org/
+https://www.nm.ngb.army.mil/
+https://www.nmi.com/
+https://www.nmprc.state.nm.us/mhconlineform.htm
+https://www.nmtw.org
+https://www.nmtw.org/
+https://www.nocall.ago.mo.gov/
+https://www.nordlandsbanken.no
+https://www.norstatesbank.com/index.html
+https://www.northerntrust.com/pws/jsp/display2.jsp?TYPE=spiffs_splash.xsl&amp;XML=promotion/SPIFF/1193065709945_576.xml
+https://www.northrim.com/home/home
+https://www.northwestsavingsbank.com/app_mortgage_prequalify.htm
+https://www.notableweb.net/ssl_govtjob/job.php
+https://www.notams.jcs.mil/
+https://www.notchnet2.com/~aircraft/pre_qualify.php
+https://www.novapublishers.com/
+https://www.novaworld.com/Login.aspx?r=https://www.novaworld.com/Forums/Default.aspx
+https://www.novaworld2.com/index.php?idtag=4c9f9dfdd24cf&amp;do=/public/login/
+https://www.nozasearch.com/
+https://www.npdb-hipdb.hrsa.gov
+https://www.npdb-hipdb.hrsa.gov/ext/AgentRegInput.jsp
+https://www.npm.org/assets/verify.html
+https://www.nrccwdt.org/resources/resources.html
+https://www.nrotc.navy.mil/
+https://www.nrsservicecenter.com/iApp/ret/content/landing.do?Role=None&amp;Site=Ohio457
+https://www.nslds.ed.gov/nslds_FAP/secure/logon.jsp
+https://www.nssc.nasa.gov/portal/site/customerservice
+https://www.numericacu.com/loans-lines/numerica-direct-merchant.php
+https://www.nurseweek.com/anti/form3.html
+https://www.nuvellcustomercare.com/account/us/en/login.html
+https://www.nvvetboard.us/GLSuiteWeb/HomeFrame.aspx
+https://www.nwa.com/AOPSSDWeb/ici/PnrSubmitAdvisory.do?loadactivatetrans
+https://www.nwbank.com/BusinessServices/?fuseaction=article&articleid=4566
+https://www.nwbankcm.com/onlineserv/HB/ForgottenPW.html
+https://www.nypbt.com/
+https://www.nysdot.gov/
+https://www.nytadvertising.com/was/ATWWeb/ProcessorAction.do?l1Id=7&amp;l2Id=45
+https://www.nytimes.com/2010/06/24/technology/24google.html?hp
+https://www.nytimesathome.com/offer.php?id=31&amp;SPTR_ID=hdNYT&amp;MediaCode=W31AK&amp;CMP=33KKJ
+https://www.nytimesee.com?MediaCode=Internal&amp;CampaignName=nytimes
+https://www.obopay.com/consumer/FinancialInstitutionAction.do
+https://www.obre.state.il.us/loansurvey/scriptcheck.asp
+https://www.oci.ga.gov/secapps/PortalLogin.aspx
+https://www.ocps.net
+https://www.officialpayments.com/pc_template_standard.jsp?JSESSIONID=GLJjGgvJCbNJknb!-1764618328!-894890742Official Payments Corp
+https://www.ohiobwc.com/bwccommon/forms/BWCForms/nlbwc/IWForms.asp
+https://www.ohioic.com/news/news2010/news1_10.html
+https://www.ohloh.net/accounts/candrews
+https://www.ohsu.edu/foundation/giving/default.cfm?dcode=61&amp;src=SON_WEB
+https://www.ok.gov/triton/modules/formbuilder/form.php?form_id=d0e95e54ac434d75085a8ab7510ac81cc4cc1703d115e4a2abbf0c620f5154f1
+https://www.oldcitypublishing.com/Checkout.bok?smode=checkout
+https://www.omfn.com/Logon/forgot_password.asp
+https://www.on-lineenterprise.com/mbi_mbi1151/mbi1151.aspx?RID=3000&amp;RT=011302742
+https://www.on-site.com/blog/jake_harrington/2010/09/gables_corporate_accommodations_launches_paperless_online_leasing_site
+https://www.oneida.com/customer/account/
+https://www.onesourcelogin.com/
+https://www.oneunitedonline.com/onlineserv/HB/Login.cgi?runmode=REGISTRATION
+https://www.online.dns.pt/
+https://www.onlinebankingreport.com/account/login.html?PHPSESSID=201009261415242122569257
+https://www.onlinebanktours.com/oec/?b=556&amp;c=6057
+https://www.onlinecardaccess.com/whitaker
+https://www.onpointcu.com/
+https://www.openadaptor.org/adopters.html
+https://www.opendns.com/start
+https://www.openeco.org/
+https://www.openlab.ipa.go.jp/modules/information/index.php
+https://www.openprovider.co.uk/about-openprovider/news/security-updates-from-verisign-geotrust-thawte-and-rapidssl
+https://www.opensourcesupportdesk.com/
+https://www.oplates.com/
+https://www.opm.gov/video_Library/Recruitment/Hiring/VetAppAuth/VetAppAuth.html
+https://www.oppapers.com/join.php
+https://www.oppenheimerfunds.com/the_rochester_way/index.jsp?bctid=424626413001
+https://www.oprah.com/ownshow/plug_form.html?plug_id=216
+https://www.optimalresume.com/LoadCareerCenters.php
+https://www.optoutprescreen.com/
+https://www.optus.com.au/portal/site/aboutoptus/menuitem.8ec78f21a99f2c66d0b61a108c8ac7a0/?vgnextoid=befcbab5610b1110VgnVCM10000029867c0aRCRD
+https://www.ordermychecks.com/
+https://www.oregondmv.com/online/index.htm
+https://www.originatorpro.com/monroebank
+https://www.osfaffelp.org/StudentCounseling/home.aspx
+https://www.osha.gov/dcsp/alliances/regional/reg3/greater_hazleton_annualreport_2007-2008.html
+https://www.ottawachamber.ca/privacy-statement.html
+https://www.outlook.com/
+https://www.ovationtravel.com/
+https://www.overseasvotefoundation.org/
+https://www.overstock.com/checkout
+https://www.owasp.org/index.php/Category:OWASP_Video
+https://www.owb.com/
+https://www.owens.edu/quicklinks_home.php
+https://www.oxhp.com/
+https://www.pacificlife.com/Resource/Contact+Us/ContactForm.htm
+https://www.pacificlife.planlab.us/RothConversionTool/
+https://www.packtpub.com/drupal-7-create-and-operate-website-quickly-and-efficiently/book?utm_source=drupal.org&amp;utm_medium=link&amp;utm_content=pod&amp;utm_campaign=mdb_004646
+https://www.pair.com/submit.html
+https://www.pairnic.com/
+https://www.paramountfinance.com/
+https://www.parcel2go.com/
+https://www.parkbank.com
+https://www.parkbankonline.com/personal_banking/default.aspx
+https://www.parknationalbank.com
+https://www.parkvale.com/home/home?vhelp
+https://www.patientsite.org/
+https://www.pattersondental.com/ContactUs/LocateBranchOffice
+https://www.pay.gov/paygov/forms/formInstance.html?agencyFormId=28122981
+https://www.paybill.com/payccu/
+https://www.paybox.com/v2/back/index.html
+https://www.paycardsolutions.com/spectrum
+https://www.paycarlylefinance.com/payment.aspx
+https://www.payloadz.com
+https://www.paymentexpress.com/
+https://www.payments-govonesolutions.com/eb/welcome.asp?ws=0C268E193B1A426F8B208C5F29C1677C005
+https://www.paypal-business.co.uk/getrefundedforchristmas.asp?source=oscommercefreefees
+https://www.paypal-community.com/t5/Products-and-services/If-I-cancel-my-merchant-account-will-the-rolling-reserve-be/m-p/42759
+https://www.paypal-france.fr/marchands/solutions-paiement/paypal-integral.php
+https://www.paypal-labs.com
+https://www.paypal-labs.com/integrationwizard/ecpayflow/code.php
+https://www.paypal-media.com/releasedetail.cfm?ReleaseID=421888
+https://www.paypal-portal.com/developer/directory/
+https://www.paypal-shopping.com/shop-stores.html
+https://www.paypal-xinnovate.com/index.html
+https://www.paypal.com
+https://www.paypal.com/
+https://www.paypal.com/cgi-bin/webscr%22
+https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/popup/OLCWhatIsPayPal-outside
+https://www.paypalobjects.com/en_US/pdf/PP_Option_Datasheet.pdf
+https://www.payway.com.au/core/LoginView
+https://www.pbsnetaccess.com/customer/?portfolio=msb
+https://www.pcbanker.com/personal/depositnew/StartNew.asp
+https://www.pcbanking2g.hsbc.com.ar/1/2/?WT.ac=HBAR_e100901PCB03PFS
+https://www.pciapply.com/pci_fi_login.aspx
+https://www.pcisecuritystandards.org/docs/pci_saq_c.doc
+https://www.pcnbonline.com/onlineserv/HB/
+https://www.pcsbanking.net/onlinebanking/loginfp.r?t-bank=113122655
+https://www.pdrbookstore.com/ProdDetails.asp?ID=9781563637506&amp;mlc=F8606PH02&amp;cmpid=BAC-pdrhealth-house&amp;attr=2010-NPD-728
+https://www.pearljam.com/phpbb/user/login
+https://www.pedsnurses.org/career-center-items/corporate-membership-information.html
+https://www.penfed.org/
+https://www.pennmutual.com/htkwebsite/pages/HTK_Public/misc/home/index_4780.html
+https://www.peoples.com/
+https://www.peoplesbancorp.com/
+https://www.peoplesbank-wa.com/index.cfm?pageID=438
+https://www.peoplesbankar.com/
+https://www.peoplesbanknc.com/content/index.php?frommobile=true
+https://www.peoplestrustfcu.org/
+https://www.perfectmoney.com/signup.html
+https://www.performbetter.com/ssl/AtcChkOutAlphaSignIn.aspx?ReturnPage=CustProfileMain.aspx
+https://www.personal-plans.com/ddeepa/ddeepa?FUNCTIONALITY=MY_ACCOUNT&amp;CLIENT=IEEE
+https://www.pesnax.eu
+https://www.pesnax.eu/service/cart.php?gid=8
+https://www.petcareinsurance.com/(qi1csb45ohjopi55t5hohg55)/sc_step1.aspx?Country=2&amp;Partner=15
+https://www.petinsurancestore.com
+https://www.petinsurancestore.com/parsers/GadgetParser.aspx?brandid=4
+https://www.petsbest.com/enroll/default.aspx?EnrollmentIntent=getquote
+https://www.petzoompetpark.com/
+https://www.pfd.state.ak.us/
+https://www.pfizerpro.com/sites/ppro/pages/content/home.aspx
+https://www.pgcalc.com/giftcalcs?ref=qqq6jmILTTg%3d
+https://www.pgworks.com/index.aspx?NID=59
+https://www.phin.state.ok.us/Inspections/
+https://www.phish-no-phish.com/en_domainthenet/
+https://www.phly.com/fw/RenewIndividual.aspx?SourceSite=FW&amp;Association=IDEA
+https://www.photoshop.com/
+https://www.piclife.com/getaquote/Avemco/step/1/
+https://www.piersystem.com/go/inquiry/2430
+https://www.pin1.harvard.edu/pin/authenticate?__authen_application=FAS_GOV_WEBSITE_TEST
+https://www.pioneersb.com/aboutus.asp
+https://www.pitux.com/php/siteRevendeurs/index.php
+https://www.plainblack.com/uploads/Fo/jO/FojOrLgm-TzaTkLG8RLMWA/WebGUI-Primer.pdf
+https://www.planservices.com/regions/
+https://www.plimus.com/jsp/buynow.jsp?contractId=1677352
+https://www.pmf.opm.gov/
+https://www.pmrts.samhsa.gov/pmrts/
+https://www.pnc.com/webapp/sec/ProductsAndService.do?siteArea=/pnccorp/PNC/Home/Personal/Online+Banking/Mobile+Banking
+https://www.pnfp.com/
+https://www.points.com/static/corporate/index.html
+https://www.points2u.com/danversmyworld/faq.asp
+https://www.policyarchive.org/
+https://www.pomidka.com/shop/order.php?step=2&amp;pid=34
+https://www.popscrubs.com/
+https://www.popularscrubs.com/products.php?landau-uniformname=Urbane&amp;cat=36
+https://www.postbanken.no
+https://www.powerhomebiz.com/business/orderbanner.htm
+https://www.powerofaction.com/conversion/
+https://www.precisionweb.net/billing/cart.php?carttpl=boxes
+https://www.premiertransitional.com/premier/secure/training/moodle
+https://www.premierwestbank.com/index.html
+https://www.prepaidfinancialservices.com/
+https://www.prepaidtuition.com/solutionsapp/ms/instructions.asp
+https://www.presidentialpcbanking.com/onlineserv/HB/Signon.cgi
+https://www.prime-project.eu/
+https://www.priorityhealth.com/secure
+https://www.prisonlegalnews.org/22532_displayArticle.aspx
+https://www.privacyassociation.org/events_and_programs/iapp_privacy_academy/
+https://www.privacyenforcement.net/
+https://www.privacyguard.com/global/scripts/promo.asp?ref=KROGRURLDDM0003
+https://www.privatebank.citibank.com/cwsportal/appmanager/pbgportal/anondesktop?_nfpb=true&portlet_7_1_actionOverride=%252Fportlets%252Flogin%252Fmain%252FrsaLoginURL&_windowLabel=portlet_7_1&_pageLabel=Login_page
+https://www.prodryers.com/servlet/Checkout?smode=checkout
+https://www.progressive.com/online-customer-service.aspx
+https://www.propay.com/products-services/accept-payments/merchant-account/
+https://www.propeller.com/ajax/security/propellersignin/?c=?&amp;next=/
+https://www.prosperitybank.com/index.cfm
+https://www.prosperitybanktx.com/overdraft-privilege.asp
+https://www.protectyourincome.com/disabilityinsurance/
+https://www.providence.org/RESOURCES/LOSANGELES/REG/REG.ASP
+https://www.providentbanking.com/personalBanking_Checking_InternetChecking.cfm
+https://www.providesupport.com?messenger=wholesaleins
+https://www.psacommunities.org/fs/apps/?app=22
+https://www.psc.state.ms.us/Complaint/Start.aspx
+https://www.psob.gov/
+https://www.psts.itap.purdue.edu/Shop/Index.aspx
+https://www.publicvpn.com/support/VPNMTU.zip
+https://www.pulaskibank.org/creditapp/affiliate/login.cfm
+https://www.pulse-eft.com/rpr00011/group/consumer/atmlocator.html
+https://www.pulsenetwork.com/public/consumers/pulse-atm-locator.html
+https://www.purdue.edu/mobile/index.html
+https://www.putnam.com/individual/index.html?startpage=EPICOLLEGE
+https://www.pwcmoneytree.com/MTPublic/ns/moneytree/filesource/exhibits/National_MoneyTree_full_year_Q4_2008_Final.pdf
+https://www.qccart.net/administration/index.php3?ID=814
+https://www.qtrade.ca/investor/en/visitormain.jsp
+https://www.quick-super.com.au/LoginView
+https://www.quickenonline.intuit.com/
+https://www.quickinfo247.com/21505/CB
+https://www.quitnow.net/lockheedmartin/
+https://www.quizzle.com/
+https://www.quote-and-apply.com/amigo/?referid=23532
+https://www.quotit.net/eproIFP/webPages/infoEntry/infoEntry.asp?license_no=T5SZMV
+https://www.qwealthreport.com/signup.php
+https://www.radiogodaddy.com/gdshop/live/default.asp
+https://www.raeseforsenate.org/donate/
+https://www.rafzar.com/node/22
+https://www.rapid-billing.com/pricing.html
+https://www.rapidssl.com/test/rapidssl.htm
+https://www.rascal.columbia.edu/
+https://www.ratepoint.com/signin/
+https://www.rbccm.com/about/cid-202541.html
+https://www.rbcinsight.com/Index.asp
+https://www.rbfcu.org/
+https://www.rbfcurewards.com/index.html
+https://www.rbsmorgans.com/
+https://www.rcfp.org/news/2007/0814-con-fivejo.html
+https://www.rcuconnect.org/
+https://www.rdccheck21.com/webclient/login.do
+https://www.realestate.siemens.com/hq/en/press/press.html
+https://www.realportal.com/portal/members/index.cfm?action=show_login
+https://www.reaxys.com/
+https://www.red-e4.com/odp/mspca.aspx?SID=60c6c2f3-726d-41a9-9c33-66d6875592f8&amp;CNID=&amp;oo=1
+https://www.redhat.com/wapps/partnerlocator/web/home.html
+https://www.redunicre.pt/archive/doc/Redunicre_E-Commerce_-_Integration_Guide__v_1.3_.pdf
+https://www.refworks.com/RWSingle/newusersecurity.asp
+https://www.regions.com
+https://www.regions.com/personal_banking.rf
+https://www.register.bg
+https://www.register.com/myaccount/productdisplay.rcmx
+https://www.register.net.id/
+https://www.register365.com/order/login_register.php
+https://www.registryrocket.com/default.asp?ec=5103184A-8C21-4EFA-ACA0-0
+https://www.regulation-e.com/form/OptInConfirm_HNB.aspx?kc=HNB7391285
+https://www.relayhealth.com/
+https://www.research.ibm.com/haifa/
+https://www.resourcesglobal.com/index.php?page=02EL00&amp;lang=usen
+https://www.responsiblesports.com/default.aspx
+https://www.results-resultats.ca/donate/GeoTrust.asp
+https://www.retirementaccountlogin.com/firstmerit/
+https://www.revenue.state.il.us/app/cgpi/servlet/1099GInquiry?_CWSKEY=5820913091264106693065&amp;_CWSREQ=01253
+https://www.revisor.mn.gov/statutes/?id=582&amp;view=chapter&amp;year=2009&amp;keyword_type=all&amp;keyword=real+property+foreclosure+deficiency+judgment
+https://www.revolutionmoneyexchange.com/
+https://www.revolutiontt.net/goodwillweekend.php
+https://www.rewardsnow.com/frontierrewards/
+https://www.ri.gov/cgi-bin/taxation/refund/status.cgi
+https://www.richdadcoaching.com
+https://www.richdadcoaching.com/
+https://www.ridgefieldbank.wblnk.com/
+https://www.risingvision.net/rising/1C-CA-OpenTalisPt.asp
+https://www.riverbed.com
+https://www.rkb.us/
+https://www.rmda.army.mil/organization/foia.shtml
+https://www.rmktonline.com/weblink
+https://www.roadloans.com
+https://www.roadloans.com/default.aspx?=from-corporate-home
+https://www.rochesterredcross.org/donate/donate.asp
+https://www.rockauto.com
+https://www.rocketprofit.com/signup.html?referid=32131
+https://www.rocklandtrustonline.com/Enrollment/ProjectFrame.aspx?mode=enrollment
+https://www.rockvillebank.com/index.cfm?mobileredirect=false
+https://www.roguecc.edu/Workforce/
+https://www.rsslogix.com/feeds/enroll.aspx?a=c00fc155842b9d21
+https://www.rtco.com/s/ol/login.asp
+https://www.rushcard.com/
+https://www.rvdpi.gov.hk/epayment/public/pihHome.do?req_locale=en_US
+https://www.safecu.org/small_business/merchant_services/index.aspx
+https://www.safelinkwireless.com/EnrollmentPublic/home.aspx
+https://www.safeware.com/Home.aspx
+https://www.sagewatch.com/buyerprotection/httpswww-pinnacleconcepts-biz/
+https://www.salesforce.com/form/event/marketing_adoption_archived.jsp?d=70130000000DarI
+https://www.salliemae.com/about/news_info/research/credit_card_study/
+https://www.sancarloschamber.org/textpages/art_wine.aspx
+https://www.sao.wa.gov/EN/Investigations/Whistleblower/Pages/default.aspx
+https://www.sap.com/campaign/2009_11_CROSS_BI_WORKS_FOR_ME/index.epx?URL_ID=CRM-GM09-SMP-TC_BIWORBAN&amp;kNtBzmUK9zU=1
+https://www.savvy-u.com
+https://www.saxby.org/Contribute.aspx
+https://www.sbbt.com/
+https://www.sbli.com/get_life_insurance_quote.aspx
+https://www.scanalert.com/RatingVerify?ref=www.fatcow.com
+https://www.scbos.sc.gov/
+https://www.scbsolutions.com/express/index.php?cPath=32&amp;SCBsid=f78e71ad07065ca819a28cce9c63160c
+https://www.scdmvonline.com/dmvpublic/
+https://www.scheelssports.com/webapp/wcs/stores/servlet/ScheelsWalleyeUniversityView?storeId=10001&catalogId=10001&langId=-1&krypto=TFPgy5K47Pwq4LCxPS5efiLF8wHU8vrD4RBAYhawsN92jn5FFb6etCD%2BRBCDemjjcXts9DkD1GBb%0At91WXkSMpMGeqzFnHeOW&ddkey=ClickInfo
+https://www.scholarsedge529.com/
+https://www.sciamdigital.com/index.cfm?fa=Account.ViewLogin&amp;sc=digital_topnav
+https://www.science.gov/scigov/?viewId=FederalRegulationsView
+https://www.sciencedirect.com/science?_ob=RegistrationURL&amp;_method=display&amp;_type=guest&amp;_returnURL=http%3A%2F%2Fwww.sciencedirect.com%2Fscience%3F&amp;_acct=C000050221&amp;_version=1&amp;_userid=10&amp;md5=45e26359c93486a3badd56805f2eba73
+https://www.scitoyscatalog.com/Merchant2/merchant.mvc?Screen=CTGY&Store_Code=SC&Category_Code=R
+https://www.scl-secure.co.uk/
+https://www.scorecardrewards.com/general_logon.asp
+https://www.scotiaitrade.com/pages/home/main.shtml
+https://www.scriptlance.com/
+https://www.scrubsbypeaches.com/products.php?cat=7
+https://www.sctax.org/refundstatus/refund.aspx
+https://www.sdn.sap.com/irj/boc
+https://www.seaport.northropgrumman.com/
+https://www.seas.upenn.edu/about-seas/room-reservation/
+https://www.sector9.com/
+https://www.secure-access.net/neomail/
+https://www.secure-fastcharge.com/docs/downloads/FC_card_present_transactions_guide.pdf
+https://www.secure-linux-server.com/%7Eadmin16/forms/order1.php
+https://www.secure-ssl-server.net/confidentialbanking/forms/order1.php
+https://www.secure.awbank.net/secure/optin.asp
+https://www.secure.nic.gs/
+https://www.secure128.com/whythawte.aspx
+https://www.securebankcentral.com/PBI_PBI1961/pbi1961.asp?Rt=103109714&amp;LogonBy=Connect3&amp;PRMAccess=Account&amp;afc=3&amp;enroll=true
+https://www.securecheckout.billmelater.com/paycapture-content/fetch?hash=2D83126M&amp;content=/bmlbweb/td_bmlbiw.html
+https://www.securechemicalbankmi.com/onlineserv/HB/Signon.cgi
+https://www.securecms.com/ICASSP2005/NSF_Veeravalli.pdf
+https://www.securecoding.cert.org/confluence/display/seccode/CERT+Secure+Coding+Standards
+https://www.securedcontact.com/contactus/ContactUs?lang=EN&amp;brand=FC&amp;region=US
+https://www.securehorizons.com/ourplans/findaphysician.html
+https://www.secureinsforms.com/MyPolicy/Login/MainMenu.asp?target=AcctInfo
+https://www.securepaynet.net/gdshop/hosting/stats_landing.asp?prog%5Fid=domainspricedright&amp;app%5Fhdr=1387&amp;ci=6622
+https://www.securesuite.net/efunds/registration/welcome.jsp?partner=1114901370fisaprc137
+https://www.secureyoursitenow.co.uk/compare-globalsign-ssl-certificates/
+https://www.securitiesinterlink6.com/cinfin/servlet/SvltApplicationMain?arch=c&amp;entity=cinfin
+https://www.securitymetrics.com/site_certificate.adp?s=66%2e166%2e4%2e217&amp;i=362032
+https://www.seedcode.com/ccp51/cgi-bin/cp-app.cgi?usr=51F2641&rnd=1822&rrc=N&affl=&cip=&act=&aff=&pg=ste_chkout_proc&secure=Y
+https://www.sella.it/
+https://www.send2press.com/ecom/index.php
+https://www.sendinc.com/
+https://www.sendoutcards.com
+https://www.sendoutcards.com/cgi-bin/trncustomer.pl?home_page:
+https://www.sentryins.com/
+https://www.server.wpcomp.com/~bmmaster/mm5/merchant.mvc?Session_ID=733a4092ae307c5c6c712c5bd0d03950&Screen=OCST&Store_Code=BT
+https://www.servertastc.com/verisign/
+https://www.servertastic.com
+https://www.servertastic.com/
+https://www.servertatic.com/ssl-certificates/extended-validation/
+https://www.service.merrillcard.com/
+https://www.servicesonline.opm.gov
+https://www.servicesonline.opm.gov/
+https://www.sevencorners.com/insurance/liaisoninternational/HWKY8S8
+https://www.sfninc.com/
+https://www.sfonline.org/
+https://www.sfsp.net/fspeventregistration/secureeventform.cfm?id=2364&requesttimeout=99999
+https://www.sfsu.edu/online/enr_analysis.htm
+https://www.sharcnet.ca/my/front/
+https://www.sharefile.com/trial/p1g.aspx?src=blog
+https://www.shareholderaccountingsoftware.com/tspweb/fcnb/mysignon.asp?M=Shareholder+Account+Access
+https://www.shelter-mortgage.com/find_branch_transition.asp
+https://www.shelterinsurance.com/
+https://www.shiftreload.com.au/show_basket.asp
+https://www.shinjiru.com.my/myorder
+https://www.shipsurance.com/coverage_order_start.asp
+https://www.shmktpl.com/search.asp?src=166009&amp;res=2
+https://www.shoeboxed.com.au
+https://www.shoeboxed.com.au/pricing/
+https://www.shop.speakingofspeech.com/
+https://www.shopmadriver.com/e-commerce/grplogin2.aspx
+https://www.shoppbs.org/coreg/index.jsp?step=ot&amp;clickid=topnav_trackOrder_txt
+https://www.shopstaywell.com/OA_MEDIA/arc/wpt.html
+https://www.siam.org/membership/corporate.php
+https://www.siemens.co.kr/kor/jobs/jobs.asp
+https://www.signatureny.web-access.com/signat/cgi-bin/welcome.cgi
+https://www.signup4.net/Public/ap.aspx?EID=FISE58E
+https://www.siia.net/events/prereg.asp?eventid=1256
+https://www.simplehelix.com/hosting/aff.php?aff=345
+https://www.simplescripts.com/page/id:6-uG0zuh0
+https://www.sircon.com/resource/layout.jsp?page=texasLps&amp;sc=lqhjfskq&amp;type=texas
+https://www.site-secure.com/cgi-bin/cgig342.exe/united/SID/GetLogon
+https://www.sixapart.com/about/jobs/
+https://www.skoobadesign.com/login.php
+https://www.slaveunion.com/zc/
+https://www.smsd.tv/moodle
+https://www.snapnames.com/store/extended.action?ig=585
+https://www.snewsnet.com/News%20&%20Features/Financial%20News
+https://www.snl.com/irweblinkx/corporateprofile.aspx?iid=100334
+https://www.snowcrest.net/mailcontrol/login.php
+https://www.socialsecurity.gov/oig/public_fraud_reporting/form.htm
+https://www.societyinsight.com/si_login.aspx?brandingid=1410
+https://www.softwink.com/papers/Sagan-NFISSA
+https://www.soils.org/
+https://www.sos.ca.gov/nvrc/fedform/
+https://www.sos.mo.gov/BusinessEntity/BusinessEntitiesOnline/Help/MO/NoticeFictitious.aspx?dtm=692175925925926
+https://www.sos.ok.gov/gov/proposed_questions.aspx
+https://www.sos.state.co.us/Voter/secuVoterHome.do;jsessionid=0000nNkPtCG0dqQdbp_svhjMqpC:121vl9gps
+https://www.sos.state.ia.us/AgReport/index.aspx
+https://www.sos.wa.gov/corps/OrderDocs.aspx
+https://www.southern.edu/Pages/mobileapps.aspx
+https://www.southernnevadahealthdistrict.org/certificates/forms/bc-active.php
+https://www.southside.com/contact.htm
+https://www.sovereignbank.com/institutional/merchant-microsite/first-data-FD300-multi-merchant-credit-card-terminal.asp
+https://www.sovereignbank.exchangelnk.com/
+https://www.sovtradeiq.com/
+https://www.sparkfun.com/commerce/product_info.php?products_id=7938
+https://www.spdrs.com/product/fund.seam?ticker=spy
+https://www.spectorsoft.com/purchase/step1.asp?TheProduct=4
+https://www.spectrum-health.org/jobs/ets/
+https://www.speedforsale.com/supraparts/speed-sale-factory-reprogramming-limit-increase-more-p-87.html?osCsid=osndjdr5ea0uai2hgb93s54jd2
+https://www.spire-banking.com/
+https://www.spiritualityhealth.com/shop
+https://www.sponsorinsight.com/regions/index.cfm
+https://www.sportsbikeshop.co.uk/motorcycle_parts/checkout
+https://www.sportscarmarket.com/my-scm/my-subscriptions
+https://www.square1financial.com/
+https://www.ssbbartgroup.com/index.php
+https://www.ssfcu.org/
+https://www.ssl247.co.uk/myssl/forgottenPassword
+https://www.sslcommerz.com.bd
+https://www.ssldonkey.co.uk/ssl-certificates/globalsign-ssl/domainssl-wildcard/
+https://www.ssllabs.com/ssldb/index.html
+https://www.ssllayer.com/
+https://www.sslrenewals.com
+https://www.sslreseller.com/globalsign
+https://www.sslshopper.com/certificate-key-matcher.html
+https://www.sss.gov/RegVer/wfRegistration.aspx
+https://www.sstregister.org/sellers/
+https://www.standard.net/digital
+https://www.standardbanks.com/infocenter/overdraft_options.aspx
+https://www.stanford.edu/group/codex/cgi-bin/wordpress/
+https://www.stanstedexpress.com/secure/ServiceUpdates.asp
+https://www.starbucks.com/card/rewards
+https://www.starbuckscardb2b.com/
+https://www.starfinancial.com/private-advisory/advisor-profiles
+https://www.startssl.com/?app=1
+https://www.starwoodhotels.com/corporate/directory/new-hotels/all/detail.html
+https://www.state.nj.us/treas/administration/vehicle_complaint.shtml
+https://www.state.sd.us/eforms/secure/eforms/E1830V2-WCFRI.pdf
+https://www.stateauto.com/employee/intapp.htm
+https://www.statejournal.com/subscribe2.cfm
+https://www.statementlook.com/stlk/pst?CID=AAAA3750001&amp;PID=STATE&amp;TRANTYPE=STMT_SIGNIN
+https://www.stn-international.org/stn_fts_cil.html
+https://www.stnfunds.macg.com/login.aspx?TPA=z393
+https://www.stockgifts.duke.edu/
+https://www.stompy.com/
+https://www.stoplosspay.army.mil
+https://www.strsoh.org/pdfs/40-304.pdf
+https://www.studentloan.com/
+https://www.stweed-nyse.com/
+https://www.subarugenuineparts.com/product_info.php?products_id=1407
+https://www.submitreport.com/columbiauniversity.jsp
+https://www.subscriber-service.com/sptimes/newsletters/signup.asp
+https://www.subscriber-services.com/sfchron/ns/nssplash.asp?pid=37
+https://www.subscriptionbridge.com
+https://www.success.tid.gov.hk/tid/eng/blics/index.jsp
+https://www.summitbankdirect.com/privacy-policy
+https://www.sunhealth.org/recipes1/index.cfm?content=recipeindex&amp;RecipeID=45
+https://www.sunlife.ca/slfglobal/v/index.jsp?vgnextoid=5e0004d2024ad010vgnprod1000067c7d09fRCRD&amp;vgnLocale=en_CA
+https://www.sunnbnj.com/home/personal
+https://www.sunnet.sunlife.com/signin/mysunlife/home.wca
+https://www.suntrust.com/portal/server.pt/community/online_banking/401
+https://www.superchoice.com.au/amp/
+https://www.superiorfg.com/Main/SQ/SFGLogin.aspx
+https://www.superiorpromos.com/company_info/testimonials
+https://www.surveymonkey.com/s/2GV6FC3
+https://www.survs.com/survey/MUPYR8UJ4B
+https://www.susquehanna.net/PersonalBanking/onlineServices/IbOnlineEnrollmentForm/IBEnrollmentSelection.aspx
+https://www.suzeorman.com/
+https://www.suzukifs.com/account/us/en/login.html
+https://www.svb.com/careers/welcome.asp
+https://www.svbaccounts.com/
+https://www.svbconnect.com/
+https://www.svgopen.org/2010/participate.shtml
+https://www.swacuflash.org/pdf/Companies_We_Serve.pdf
+https://www.swe.siemens.com/belux/portal/nl/jobsite/Pages/jobsite.aspx
+https://www.swgsb.org/directors/default.aspx
+https://www.swiftcommunity.net/blogs/28/blogdetail/21312
+https://www.swifttrans.com
+https://www.symlin.com/pdf/SYMLIN_Medication_Guide.pdf
+https://www.t-mobile.nl
+https://www.t-refer.com/t-refer/AMNSASOF-1
+https://www.t-shirthumor.com/Merchant2/merchant.mvc?Screen=OINF&Order=1
+https://www.ta-retirement.com/
+https://www.tafensw.edu.au/library/studylinks/welcome.htm
+https://www.tai.org.au/documents/dp_fulltext/DP90.pdf
+https://www.talkingquality.ahrq.gov/
+https://www.tamperseal.com/checkout_shipping.php
+https://www.tamu-commerce.edu/teacher/jobfairs.htm
+https://www.target.com/gp/flex/sign-in.html?ie=UTF8&amp;opt=o&amp;action=sign-out&amp;page=%2F
+https://www.target.com:443/gp/redirect.html?location=https://redcard.target.com/redcard/rc_main.jsp&amp;token=ADB6F1B5CE23BEDE2855CB195F59EDFB68240C7D
+https://www.taxview.state.co.us/default.aspx
+https://www.tba.org/onsiteinfo/lawtech2003.html
+https://www.tbkdionline.com/onlineserv/HB/Signon.cgi
+https://www.tbs-internet.com/php/espaceClients/pages/compteClient.php
+https://www.tcfusa.org/donation-checkout.php
+https://www.tcw.com/About_TCW/Our_People/Corporate_Management.aspx
+https://www.tdecu.org/
+https://www.teachingwithtech.org/moodletech
+https://www.teamITS.com/internet/webhosting/order.php
+https://www.teamholeinthewall.org/sslpage.aspx?pid=349
+https://www.techcu.com
+https://www.techni-tool.com/content/resources/articles/Green%20Corrosion%20With%20Rosin%20Flux.html
+https://www.technicalindicatorindex.com/register.asp
+https://www.telehealthconnect.com/
+https://www.telfort.nl/app/websms/
+https://www.tennesseeanytime.org/foil/foilprog?act=gotoIndex
+https://www.testexchangeconnectivity.com/
+https://www.texascapitalbank.blilk.com/index.asp?
+https://www.texascapitalbank.com/personal-banking.aspx
+https://www.texasonline.state.tx.us/NASApp/tdi/TdiARManager
+https://www.texastuitionpromisefund.com/
+https://www.tfcu.coop/#/join-us
+https://www.tfhrc.gov/crt/publications.cfm
+https://www.thankyou.com/
+https://www.thatsmybank.com/contact-us.html
+https://www.thawte.com
+https://www.thawte.com/leadgen.html?a=AKUBQ-989-04-26
+https://www.the-cloak.com/login.html
+https://www.the-infoshop.com/cgi-bin/makeorder_e.cgi
+https://www.theabfm.org/
+https://www.theadvocates.org/
+https://www.thebankofgreenecounty.com/
+https://www.thebeneficial.com/
+https://www.thebrandbank.com/home/internet
+https://www.thechamberalliance.com/
+https://www.thecontinentalbank.com/onserv_app-my-choice-checking.asp
+https://www.thedatabank.com/dpg/309/mtglist.asp?formid=meet
+https://www.theformsgroup.net/secureforms/hawthornbank_enroll.html
+https://www.thegabrielinstitute.com/
+https://www.theice.com/webinars.jhtml
+https://www.thelivingjarboe.com/swans/checkout.html
+https://www.theloanz.com/
+https://www.thenatc.org/
+https://www.thepaypalblog.com
+https://www.thepaypalblog.com/2008/10/micropayments-pricing-for-merchants/comment-page-1/
+https://www.theprovidentbank.com
+https://www.theprovidentbank.com/providentadvisory/
+https://www.therightbank.com/home/business/products/estatements/pwreset
+https://www.thesslstore.com/geotrust/true-businessid-with-ev.aspx
+https://www.thetigerhost.com/billing/clientarea.php
+https://www.thinkculturalhealth.hhs.gov
+https://www.thinkglobal.us/forms/showcase?id=499
+https://www.thomsonboardlink.com/BOD/Logon.aspx
+https://www.thomsononeim.com/s-log_in.asp
+https://www.thrivent.com/insurance/index.html
+https://www.thrivent.com/magazine/
+https://www.thriventbankonline.com/onlineserv/HB/Signon.cgi
+https://www.ticketmaster.com/checkout/order
+https://www.ticketreturn.com/prod2/images/DicksSG%20Ad.jpg
+https://www.tierra.net/products/ssl/verisign
+https://www.timesplus.co.uk/iam/app/subscription?execution=e1s1
+https://www.tipsubmit.com/WebTips.aspx?AgencyID=563
+https://www.titleassistance.com/
+https://www.tombihn.com/Merchant2/merchant.mvc?Screen=ONESTEP&Store_Code=001
+https://www.toptrophy.co.uk/
+https://www.torproject.org
+https://www.torproject.org/bridges
+https://www.torproject.org/torusers
+https://www.totallyglobalsign.com/evpromo
+https://www.tpars.com/PROD/login.asp?fi=0759a
+https://www.tradeking.com/FAQ/Accounts/basic.tmpl
+https://www.trademonster.com/index.jsp
+https://www.tradeonlineservices.com/logon/startup.html?JPI=true
+https://www.tradeshowregistrar.com/ep4/?event=DSE2010
+https://www.train.org/Competencies/confidentiality.htm
+https://www.training.nih.gov/
+https://www.training.nsw.gov.au/individuals/index.html#Apprenticeships_&amp;_Traineeships
+https://www.training.nsw.gov.au/programs_services/funded_other/acp/index.html
+https://www.transamericaadvisor.com/wps/portal/tci
+https://www.transamericaannuities.com/Default.aspx
+https://www.transamericafunds.com/wps/portal/tam
+https://www.transamericaworksite.com/wps/portal/twm/kcxml/04_Sj9SPykssy0xPLMnMz0vM0Y_QjzKLD4o3DzQHSZnFB8Q7e-hHwoSC9L31fT3yc1P1A_QLciPKHR0VFQEB7GMo/delta/base64xml/L3dJdyEvd0ZNQUFzQUMvNElVRS82X1JfOFBC
+https://www.transfirst.com/translink/login.aspx?branding=MSFG
+https://www.transfirst.net/translink/login.aspx?branding=CBT
+https://www.transunion.com/direct/industrysolutions/healthcare/financialSummary.page?
+https://www.travelersnj.com/agent_information/index.asp
+https://www.travelinsuranceservices.com/select2007/select07_step1.asp?32701
+https://www.travelks.com/s/index.cfm?aid=184
+https://www.treasura.com/TNetUI/THomson/en-us/FrameworkLogin.aspx
+https://www.treasurydirect.gov/indiv/products/prod_eebonds_glance.htm
+https://www.trendbeta.com/
+https://www.trianglestrings.com/store/cart.php?m=checkout
+https://www.tripprep.com/scripts/main/default.asp
+https://www.tripsandpicks.com/?WT.mc_id=208
+https://www.triwest.com/
+https://www.tropo.com/
+https://www.truecredit.com/user/returnUser.jsp?cb=TransUnion&amp;loc=1484&amp;bn=null
+https://www.truste.org/pvr.php?page=complaint
+https://www.trustedcomputinggroup.org/home
+https://www.trustedsource.org/en/feedback/url
+https://www.trustthecheck.com/business/default.aspx
+https://www.trustthetick.com/
+https://www.trustwave.com/downloads/Trustwave-Trusted-Commerce.pdf
+https://www.truthpublishing.com/Articles.asp?ID=46
+https://www.twentyfeet.com/app/#Register
+https://www.twigger.nl
+https://www.twinstarcu.com/business/merchant-card-services
+https://www.twitter.com/allaboutukloans
+https://www.txabusehotline.org/
+https://www.txn.banking.pcfinancial.ca/
+https://www.typekey.com/t/typekey/login?v=1.0&amp;t=5ccfdfdecb1b8c24f72f87f22dc46a39d273f189&amp;lang=en_US&amp;_return=http%3A%2F%2Fwww.Visible-Banking.com%2F2010%2F04%2Fvisible-banking-social-media-watch-series-twitter-facebook-youtube-and-blogs-tracking-2000-initiativ.html&amp;_portal=typepad
+https://www.ua2go.com/ci/Login.jsp?return_to=easy_checkin
+https://www.uakjobs.com/
+https://www.ub-businessonline.blilk.com/Core/Authentication/MFAUsername.aspx?
+https://www.ubat.com/offices.aspx
+https://www.ubhonline.com/%20%20
+https://www.ucbi.com/forms/mortgageapplication.aspx
+https://www.uchooserewards.com/members/home.php?sid=40XXdKrlo40&amp;popup=t
+https://www.ucl.ac.uk/news/scriefullreport.pdf
+https://www.ue.org/home.aspx
+https://www.uedtrust.org/
+https://www.ufcu.org/forms/mailto.php?name=members
+https://www.uhctogether.com/oxhp
+https://www.uhgiving.org/SSLPage.aspx?pid=731
+https://www.ui.labor.mo.gov/som/
+https://www.uibenefits.dol.ks.gov/
+https://www.uifoundation.org/GiveToIowa/WebObjects/GiveToIowa.woa/wa/goTo?area=dm
+https://www.uitax.dol.ks.gov/brloginregsel.asp
+https://www.ukti.gov.uk
+https://www.uktradeinvest.gov.uk/
+https://www.ultirecruit.com/CAS1002/jobboard/ListJobs.aspx?_VT=ExtCan
+https://www.umb.com/
+https://www.umgnashville.com/shop/checkout/
+https://www.unc.edu/ar-bin/websub/index.pl?page=main&amp;def1=School%20of%20Government%20Helpdesk
+https://www.undp.org.br/licitacoes/ListarAvisos.asp
+https://www.unibet.com/betting/
+https://www.unionbank.com/commercial/products/cash/Merchant_Card/index.jsp
+https://www.unionpluscard.com/up/CustomerCare?cmd_DisplayLogin=
+https://www.univest.net/univest_service_center.aspx
+https://www.unjspf.org
+https://www.update.microsoft.com/
+https://www.ups.com/content/us/en/shipping/international/documents/intl_forms/us_origin.html
+https://www.upsploit.com/index.php/advisories/view/UPS-2010-0002
+https://www.urmc.rochester.edu/purchasing/survival.cfm
+https://www.urs.apply2jobs.com/index.cfm
+https://www.us-ca.org/PressReleaseUsca.aspx?cc=EEMQ-BT9K
+https://www.us-cert.gov
+https://www.us.army.mil
+https://www.us.army.mil/suite/login/welcome.html
+https://www.usa.gov/
+https://www.usaa.com/inet/ent_utils/McStaticPages?key=bank_main
+https://www.usaemergencysupply.com/emergency_supplies/oxygen_absorbers.htm
+https://www.usaemergencysupply.com/information_center/storage_life_of_foods.htm
+https://www.usarmyjrotc.com/
+https://www.usbankrewards.com/ShowRewards.aspx
+https://www.uschamber.com/join/business/donate.htm
+https://www.uschambersmallbusinessnation.com/join-us/#benefits
+https://www.usemafs.com/webapp/wcs/stores/servlet/UseMAFS/Internetbill.html
+https://www.usfa.dhs.gov/applications/feedback/mediacorps.jsp
+https://www.usgbc.org/ShowFile.aspx?DocumentID=1992
+https://www.uso.org/donate/custom.aspx?id=565&amp;
+https://www.uspirg.org/home/reports/report-archives/transportation/transportation2/road-work-ahead-holding-government-accountable-for-fixing-americas-crumbling-roads-and-bridges
+https://www.ustda.gov/consultantdb/
+https://www.uswellness.com/
+https://www.utexas.edu/provost/housing/
+https://www.uuc.edu/md177
+https://www.uvest.com/pyramaxbank/view.htm
+https://www.uwo.ca/its/guardian/
+https://www.valleynationalbank.com/comment.asp
+https://www.vaporgenie.com/
+https://www.vbankworksonline.com/onlineserv/HB/demo.html
+https://www.vbcareers4gov.com/applicants/jsp/shared/frameset/Frameset.jsp?time=1219173420093
+https://www.vbulletin.com/order/
+https://www.vcujobs.com/applicants/jsp/shared/frameset/Frameset.jsp?time=1149109953093
+https://www.vectrabank.com/personal-banking/innovative-solutions/online-banking.jsp?p=security
+https://www.velocitypayment.com/vbills/lookup/bankofamerica/celtic
+https://www.vericrestfinancial.com/
+https://www.verifi.com/fraud-and-risk-management/merchant-co-op.html
+https://www.verisign.co.jp/repository/CPS3.4/CPS3.4_eng.pdf
+https://www.verisign.com/cgi-bin/go.cgi?a=w45290160530800000
+https://www.verisignsecured.com/uk/
+https://www.verizon.net/central/vzc.portal?_nfpb=true&_pageLabel=vzc_help_policies&id=AcceptableUse
+https://www.verizonwireless.com/vzwapp/prepay/loginform?prepay=PREPAY+LOGIN
+https://www.verksamt.se/portal/en_GB/web/international/faq/e-commerce
+https://www.vetsecure.com/serravet.com/login/
+https://www.vfd-accfb.org
+https://www.vfd-accfb.org/home.aspx
+https://www.vfi-web.com/tcbWeblink
+https://www.vikingagents.com
+https://www.vikingagents.com/servlet/AgentRegistrationServlet?actionf=display&amp;dirty=true
+https://www.vikingbank.com/Page.aspx?hid=621
+https://www.village-bank.blilk.com/Core/Authentication/MFAUsername.aspx
+https://www.village-bankhb.com/onlineserv/HB/Signon.cgi
+https://www.vinelink.com/vinelink/siteInfoAction.do?siteId=44900
+https://www.virtuahealthmanager.org/
+https://www.virtualbank.com/Secure/ClientLogin.aspx
+https://www.virusbtn.com/register/index
+https://www.virwox.com/
+https://www.visaextras.com/
+https://www.visaprepaidprocessing.com/vectrabank/bulkgift/
+https://www.visarite.com/OrderFormChinaTBStep1.asp
+https://www.vistfc.com/
+https://www.visualwebgui.com/Gizmox/Store/Cart/tabid/259/Default.aspx?addtocart=p.15,q.1
+https://www.vital.no
+https://www.vmware.com/tryvmware/index.php?p=free-esxi&amp;lp=1
+https://www.vnbconnect.com
+https://www.volunteering-hk.org/individual_reg/form
+https://www.voyage.gc.ca/forms_formulaires/emergency_urgence-eng.asp
+https://www.voyage2.gc.ca/Registration_inscription/Register_Inscrire/Login_ouvrir-une-session-fra.aspx?fwd=true&amp;hash=YML8xm437ktlcAKRDX4453Q6161
+https://www.vsc3.newyorklife.com/VSCRegWebApp/login
+https://www.vtfwdsales.com/
+https://www.vworker.com/RentACoder/DotNet/default.aspx?blnDidRacRedirectToVworker_RequestParm=true
+https://www.wachovia.com/foundation/v/index.jsp?vgnextoid=653efbfaba0aa110VgnVCM1000004b0d1872RCRD
+https://www.wachovia.com:443/foundation/v/index.jsp?vgnextoid=177a0a741fc2b110VgnVCM100000617d6fa2RCRD
+https://www.wageworks.com
+https://www.wageworks.com/webcuv/
+https://www.wahoofitness.com/
+https://www.waitlistcheck.com/
+https://www.walgreens.com/pharmacy/healthvault/welcome.jsp
+https://www.warrantydirect.com/login.aspx
+https://www.washingtonpost.com/wp-dyn/content/article/2010/09/18/AR2010091803935.html
+https://www.washingtontimes.com/news/2010/sep/18/maher-digs-odonnell-witchcraft-clip/
+https://www.watsonhall.com/resources/downloads/casestudy-financial-ecommerce.pdf
+https://www.wavesecure.com/
+https://www.wawftraining.com
+https://www.wbcc.org
+https://www.wcb.com/onlineserv/CM/
+https://www.wcc.ne.gov/apps/IPUBA0003Afrm.aspx
+https://www.wcinstruction.net/onlinecourses
+https://www.wcs.org/getinvolved/donations/57423/donate_now?form-wcs_program=Other&amp;form-wcs_program_other=WCS%20Canada
+https://www.wdfi.org/apps/franchiseefiling/
+https://www.web-hosting-top.com/web-hosting/login
+https://www.web2carz.com/USATODAY
+https://www.webcontrolcenter.com/customer.aspx
+https://www.webfaction.com/signup
+https://www.webmaillive.co.uk
+https://www.webmaillive.co.uk/
+https://www.webroot.com/registration/manualRegistration.php
+https://www.websense.com/site/footer/legalinfo.html#conduct
+https://www.websterbank.com/about-webster/webster/terms-conditions/important-information-about-insuring-your-deposits-through-the-FDIC.html
+https://www.websteronline.com/
+https://www.wecompareinsurance.com/take_application?coverage_id=1
+https://www.weeklystandard.com/articles/dakota-dreaming
+https://www.wellmed.com/miniq/connect.aspx?siteid=healthvision&amp;toolid=379&amp;emailloc=2&amp;noprefill=true&amp;tellafriend=false&amp;dosendemail=false&amp;sponsorid=50618
+https://www.wellsfargo.com/downloads/pdf/biz/merchant/guide_operating.pdf
+https://www.wellsfargo401konline.com/tl002/SplashAuth.asp
+https://www.wellsfargoadvisors.com
+https://www.wellsfargoadvisors.com/
+https://www.wellsfargofinancialcards.com/fdr_wf.service?TRANTYPE=STMT_SIGNIN&amp;CID=AAAA3574001&amp;PID=STATE
+https://www.wellsfargoleasing.com/
+https://www.welltheon.com/
+https://www.wesabe.com/groups
+https://www.wesleyan.edu/student/
+https://www.westfield-bank.com/home/home
+https://www.westfieldbank.com/personalbanking/e-guide/index.html
+https://www.westfieldbank.org/onlineserv/CM/
+https://www.westpacinsurance.com.au/homecontent/
+https://www.wf.com
+https://www.wfmu.org/marathon/pledge.php
+https://www.whereismypov.com/
+https://www.whitehatsec.com/
+https://www.wholesaleinsurance.net/life-insurance-quotes
+https://www.wiki.ed.ac.uk/display/Services/University+eDiary+-+Mobile+devices
+https://www.wikinvest.com/account/login?rt=aHR0cHM6Ly93d3cud2lraW52ZXN0LmNvbS8,
+https://www.wikispaces.com/user/join?goto=http://digiteen.wikispaces.com%2F%3FresponseToken%3D802182439965e024a741834fa379d951
+https://www.wildlifedepartment.com/forget1/OnlineSales.aspx
+https://www.window.state.tx.us/accmaint/changeaddress.html
+https://www.wipl.in/members/index.php
+https://www.wireless.att.com/business/authenticate/
+https://www.wirelessamberalerts.org
+https://www.wirelessamberalerts.org/index.jsp
+https://www.wise-corporate-ebanking.com/
+https://www.wisegeek.com/freelance-writing-jobs.htm
+https://www.wizard101.com/
+https://www.wliinc12.com/westhollywoodcacoc/cwt/External/WCPages/jointhechamber/Join_the_Chamber.aspx
+https://www.wmalumni.com/general/login.asp?
+https://www.woodlandfinancialwellness.com/
+https://www.woopra.com/members/settings/newsletters.jsp
+https://www.worcesterchamber.org/
+https://www.word.com.au/checkout.aspx
+https://www.workforcesafety.com/online-services/onlineservices.asp
+https://www.worldlingo.com/
+https://www.worldtravelcenter.com/eng/policies/admin.cfm
+https://www.worldtrips.com/quotes/atlas/?referid=23532
+https://www.wsfsbank.com/hela.aspx
+https://www.wso2.org/forum/thread/4978
+https://www.wvcrime.com:8443/Reporter/menu.wvcrime
+https://www.wy.ngb.army.mil/army/
+https://www.wyndhamvacationresorts.com/
+https://www.wyomingatwork.com
+https://www.wyomingatwork.com/
+https://www.x.com/docs/DOC-1136
+https://www.xe.com/fx/
+https://www.xing.com/net/socialcommerce/
+https://www.xoom.com
+https://www.xoom.com/argentina
+https://www.xstreetsl.com
+https://www.xstreetsl.com/modules.php?name=Currency&file=charts
+https://www.yamahagenuineparts.com/
+https://www.yammer.com/home/bookmarklet?t=Welcome%20to%20ABB&amp;u=http%3a%2f%2fwww.abb.com%2fcawp%2fabbzh252%2fe1d71cc7979eaf7fc1256ae700474df0.aspx%3fv%3d7182A%26leftdb%3dglobal%2fABBZH%2fABBZH252.NSF%26e%3dus%26leftmi%3d76465d8d53273699c12571920030dbef
+https://www.ycmi2.co.uk/44/Calculate.mvc
+https://www.york.cuny.edu
+https://www.york.cuny.edu/login_form
+https://www.yourbankrewards.com/index.html
+https://www.yourplanaccess.net/nwsb/default.aspx?check=true
+https://www.zacks.com/my_account/
+https://www.zapplication.org/index.php
+https://www.zazzle.com/livejournal*
+https://www.zionsbank.com/biz/equipment_leasing.jsp?leftNav=bf_bfinance&amp;topNav=bfinance
+https://www.zoompass.com/
+https://www.zoovy.com/compatible-integration-review/google-checkout/index.html
+https://www.zumbox.com
+https://www.zumbox.com/signIn
+https://www.zurichnac.com/choosetheright/
+https://www.zurichvlr.com/signin.aspx
+https://www0.bankofamerica.com/home-loans/mortgage-purchase.go
+https://www01.AnswerFinancial.com/InformationCenter/InformationCenter?a=RETAIL
+https://www01.answerfinancial.com/home.aspx?a=huntington
+https://www010.streetevents.com/loginAll.asp
+https://www06.sbc.com/myaccount/Controller?pf=frameworkEntry&amp;e=feSignUp
+https://www1.bankofamerica.com/efulfillment/documents/05-11-3000ED.20081201.htm#f5
+https://www1.columbia.edu/sec/dlc/oed/
+https://www1.duats.com/
+https://www1.ethz.ch/id/services/list/ssl/cacert
+https://www1.gotomeeting.com/register/989609496
+https://www1.gototraining.com/training/trainings.tmpl
+https://www1.ietf.org/mailman/listinfo/irtf-announce
+https://www1.iowajobs.org/jobs/employer/businessDirectory.seek
+https://www1.ks.wildlifelicense.com/index_br.php
+https://www1.nationalgridus.com/masselectric/stormcenter/?WT.mc_id=outagecentralside
+https://www1.nga.mil/Pages/FamilyResources.aspx
+https://www1.rbcbankusa.com/cgi-bin/rbaccess/rbunxcgi?F6=1&F7=NS&F21=IB&F22=CN&REQUEST=CenturaClientSignin&LANGUAGE=ENGLISH
+https://www1.state.nj.us/TYTR_COARS/JSP/page1.jsp
+https://www10.informe.org/ifw/atv-snow/
+https://www11.ingretirementplans.com/sfservices/myretirementwizard/mrw.jsp?mrwKSDC#TopOfPage
+https://www118.livemeeting.com/cc/partners1/view?id=3637&amp;fmt=dll&amp;pw=a59c82
+https://www119.livemeeting.com/cc/winserver_usergroup/view?id=Q78FXW&amp;pw=SqPq4%60P
+https://www124.americanexpress.com/cards/loyalty.do?page=clearblue.prospect
+https://www14.ameriprise.com/AutoQuoteWebInter/AQFrontServlet?request_type=un_auth_init&amp;RefID=11m-ad
+https://www154.safesecureweb.com/tallacte/merchant2/merchant.mvc?Session_ID=0893834a9571cc7ea8f62ca7466d52c7&Screen=OINF&Store_Code=001
+https://www169.safesecureweb.com/thestorefor/merchant2/merchant.mvc?Session_ID=9697418b27b10acd8b91c80b93239739&Screen=OUSL&Store_Code=TEWS
+https://www2.2checkout.com/documentation/privacy_feb7_2005.htm
+https://www2.aspcapetinsurance.com
+https://www2.aspcapetinsurance.com/
+https://www2.banksafe.com/yourbank/ts/pdf/How_to_Use_eStatements.pdf
+https://www2.commerzbank.com/konzern/niederlassungen/index.cfm
+https://www2.commerzbank.de/konzern/niederlassungen/index.cfm
+https://www2.compu-quote.com/ezleadsplus/introhab.asp?ORGSITE=ezLeadsplus&amp;BRKRCDE=HSF
+https://www2.consumer.org.hk/ccweb/caseweb.nsf/EnglishComplaint?OpenForm
+https://www2.dpi.state.wi.us/safr/
+https://www2.fdic.gov/drrip/afi/index.asp
+https://www2.fl.wildlifelicense.com/start.php
+https://www2.fsco.gov.on.ca/drappnotify/showcompanies.dr
+https://www2.gotomeeting.com/register/985238170
+https://www2.iid.state.ia.us/iidweb/agents/licensing/default.asp
+https://www2.ing-usa.com/portal/public/
+https://www2.iraservicecenter.com/rc/default.aspx?OrgNbr=4993
+https://www2.itap.purdue.edu/DFA/JobPosting/JobSearch.cfm
+https://www2.lanb.com/access/demo/index.asp
+https://www2.manheim.com/signup/step_one?WT.svl=m_home_signup&amp;language_selected=en
+https://www2.netxclient.com/universal2/login.htm
+https://www2.netxselect.com/home_56J.htm
+https://www2.site-secure.com/
+https://www2.ultirecruit.com/sus1001/JobBoard/ListJobs.aspx
+https://www2.usbank.com/cgi_w2/cfm/emailUs.cfm
+https://www2.viaklix.com/
+https://www2.wildlifelicense.com/fl/
+https://www201.americanexpress.com/MobileWeb/iphone-app.jsp
+https://www209.americanexpress.com/merchant/singlevoice/USEng/FrontServlet?request_type=navigate&page=merchantBasicsHome&activepage=merchant
+https://www213.americanexpress.com/PowerLabsWeb/un/landingpage.htm
+https://www22.verizon.com/myaccount/
+https://www227.safesecureweb.com/operajourneys/merchant2/merchant.mvc?Session_ID=bc42f766584625554a401d277023cd3e&Screen=OINF&Store_Code=OJ
+https://www248.safesecureweb.com/sstsuperstore/merchant2/merchant.mvc?Session_ID=2bb77f42293be15f2a0e64bc535861d5&Screen=OINF&Store_Code=E
+https://www3.bankofamerica.com/contact/?lob=fc&amp;contact_returnto=http%3A%2F%2Fwww%2Ebankofamerica%2Ecom%2Fcontact%2F%3Fstatecheck%3DNC%26page%3Dsmbiz
+https://www3.financialtrans.com/tf/FANWeb?tx=Disclaim&amp;cz=81200171807001111
+https://www3.imsa.edu/
+https://www3.indygov.org/SEPERMITprod/servlet/VAS
+https://www3.ing-usa.com/customer/public/
+https://www3.myalliedpolicy.com/Templates/index.cfm
+https://www3.sctax.org/esales
+https://www3.tiaa-cref.org/iracalcs/comparison_calc.jsp?tc_lnk=rightnav
+https://www3.ultirecruit.com/COM1022/JobBoard/Default.aspx
+https://www3.wildlifelicense.com/co/start.php
+https://www312.safesecureweb.com/drmcgillicudzu82/merchant2/merchant.mvc?Session_ID=aafd2a0117e9c9f0ea5ba08c836ede3f&Screen=OINF&Store_Code=drmgenstore
+https://www364.safesecureweb.com/randzcom/merchant2/merchant.mvc?Session_ID=ea3248f1d2514f794b5eb2945d134299&Screen=OINF&Store_Code=RZ-VELCRO
+https://www3683.ntrs.com/ptl/pcl/login
+https://www380.safesecureweb.com/jamesjoy/merchant2/merchant.mvc?Session_ID=3d9cc03cd99a685ecf00b126047e7290&Screen=OINF&Store_Code=JJC
+https://www4.bankofamerica.com/hub/index.action?template=signin
+https://www4.fdic.gov/STARSMAIL/index.asp
+https://www4.harrisbank.com/
+https://www4.symantec.com/events/controller?c=listing
+https://www4.ultirecruit.com/GRE1015/JobBoard/listjobs.aspx?Page=Browse
+https://www4.usbank.com/internetBanking/RequestRouter?requestCmdId=DisplayLoginPage
+https://www4.wildlifelicense.com/fl/start.php
+https://www5.bankofamerica.com/credit-cards/cardoverview.action?context_id=overview_page
+https://www5.fsco.gov.on.ca/pensionemail/
+https://www5.informe.org/cgi-bin/online/bmv/drr/index.pl
+https://www5.malone.edu/mxmail
+https://www59.safesecureweb.com/mvsoft/merchant.mvc?Session_ID=8dcd5654bb3c0e6938774c26f30f5142&Screen=OINF&Store_Code=MS
+https://www6.bankofamerica.com/hub/index.action?template=signin
+https://www6.glic.com/app60/SR/servlet/Controller?requestid=LoginServlet&amp;requestbcomp=LoginObject
+https://www6.hsmv.state.fl.us/DLCheck/main.jsp
+https://www6.licensing.gov.hk/eullp/llp-status/web/welcome/index.html?lang=en
+https://www6.state.nj.us/commerce/CEG_LCI/pdf/liccert.pdf
+https://www7.hsmv.state.fl.us/VirtualOffice/faces/lobby.jsp
+https://www77.ssldomain.com/wheatmark/merchant2/merchant.mvc?Session_ID=81db7536ef014198b0d61c379ad23368&Screen=OINF
+https://www8.garmin.com/registration/choose_prod.jsp?type=unit&amp;regID=
+https://www8.student-1.com/SSS/
+https://wwwa.applyonlinenow.com/USCCapp/Ctl/entry?directMail=true&amp;sc=UAASWI
+https://wwwa.managerewardsonline.fiacardservices.com/RMSapp/Ctl/entry?pid=dcbrwd
+https://wwwapps.tdi.state.tx.us/inter/perlroot/commish/employee/esearch.html
+https://wwwe.auto-graphics.com/njlc/index.aspx
+https://wwwesi83a.ntrs.com/viaSelfSrvcUserAdmin/FDSChallenge.do?returnUrl=https://www.northerntrust.com/closeWindow.html
+https://wwwn.applyonlinenow.com/USCCapp/Ctl/entry?sc=FAAX3H
+https://wwwn.managerewardsonline.com/RMSapp/Ctl/link?eid=755B329D
+https://wwwnet1.state.nj.us/docm/ttu/njpublications/OrderForm.aspx
+https://wwwrs.massmutual.com/journey/Login.aspx
+https://wwws.loc.gov/hr/employment/slhrform/slfaq.html
+https://wwws.mint.com/login.event?task=S&amp;source=quicken
+https://xchanger.org/
+https://xpress.epaysol.com/ct/?bid=110114098
+https://xythos.uiowa.edu/
+https://xyzsharepoint.xyz.net/sites/sitename
+https://y10online.federalreserve.gov/Y10Web/showY10Login.do
+https://yearbookavenue.jostens.com/email.asp
+https://zendough.p.delivery.net/m/p/zen/signup.asp
+https://zephyr.bvdep.com/
+https://zerowing.idsoftware.com/svn/radiant/GtkRadiant/trunk/COMPILING
+https://zeustracker.abuse.ch/
+https://zulu.ssc.nasa.gov/mrsid/
+https://zurich.secure.force.com/automotivebusiness?WT.mc_id=OR013019M7SZNACRhome
diff --git a/lib/libUPnP/Neptune/LICENSE b/lib/libUPnP/Neptune/LICENSE
new file mode 100644
index 0000000..b2c9815
--- /dev/null
+++ b/lib/libUPnP/Neptune/LICENSE
@@ -0,0 +1,29 @@
+Neptune C++ Runtime System
+--------------------------
+
+This software is provided under the following license:
+
+* Copyright (c) 2002-2016, Axiomatic Systems, LLC.
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+* * Neither the name of the <organization> nor the
+* names of its contributors may be used to endorse or promote products
+* derived from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/lib/libUPnP/Neptune/README.md b/lib/libUPnP/Neptune/README.md
new file mode 100644
index 0000000..6154aae
--- /dev/null
+++ b/lib/libUPnP/Neptune/README.md
@@ -0,0 +1 @@
+#Neptune C++ Runtime [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Build Status](https://travis-ci.org/plutinosoft/Neptune.svg)](https://travis-ci.org/plutinosoft/Neptune)
diff --git a/lib/libUPnP/Neptune/SConstruct b/lib/libUPnP/Neptune/SConstruct
new file mode 100644
index 0000000..373e606
--- /dev/null
+++ b/lib/libUPnP/Neptune/SConstruct
@@ -0,0 +1 @@
+SConscript('Build/Boot.scons')
diff --git a/lib/libUPnP/Neptune/Source/Apps/MiniHttpServer/MiniHttpServer.cpp b/lib/libUPnP/Neptune/Source/Apps/MiniHttpServer/MiniHttpServer.cpp
new file mode 100644
index 0000000..59afba5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/MiniHttpServer/MiniHttpServer.cpp
@@ -0,0 +1,92 @@
+/*****************************************************************
+|
+| Mini HTTP Server
+|
+| (c) 2001-2009 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+
+/*----------------------------------------------------------------------
+| MiniServer
++---------------------------------------------------------------------*/
+static void
+MiniServer(const char* root, unsigned int port, bool verbose)
+{
+ NPT_HttpServer server(port);
+ NPT_InputStreamReference input;
+ NPT_OutputStreamReference output;
+ NPT_HttpRequestContext context;
+
+ NPT_HttpFileRequestHandler* file_handler = new NPT_HttpFileRequestHandler("/", root, true);
+ server.AddRequestHandler(file_handler, "/", true);
+
+ for (;;) {
+ if (verbose) NPT_Console::Output("waiting for connection...\n");
+ NPT_Result result = server.WaitForNewClient(input,
+ output,
+ &context);
+ if (verbose) NPT_Console::OutputF("WaitForNewClient returned %d (%s)\n", result, NPT_ResultText(result));
+ if (NPT_FAILED(result)) return;
+
+ result = server.RespondToClient(input, output, context);
+ if (verbose) NPT_Console::OutputF("RespondToClient returned %d (%s)\n", result, NPT_ResultText(result));
+
+ input = NULL;
+ output = NULL;
+ }
+
+ delete file_handler;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** argv)
+{
+ NPT_String file_root;
+ unsigned int port = 8000;
+ bool verbose = false;
+
+ while (const char* arg = *++argv) {
+ if (NPT_StringsEqual(arg, "--help") ||
+ NPT_StringsEqual(arg, "-h")) {
+ NPT_Console::Output("usage: minihttpserver [--file-root <dir>] [--port <port>] [--verbose]\n");
+ return 0;
+ } else if (NPT_StringsEqual(arg, "--file-root")) {
+ arg = *++argv;
+ if (arg == NULL) {
+ NPT_Console::Output("ERROR: missing argument for --root option\n");
+ return 1;
+ }
+ file_root = arg;
+ } else if (NPT_StringsEqual(arg, "--port")) {
+ arg = *++argv;
+ if (arg == NULL) {
+ NPT_Console::Output("ERROR: missing argument for --port option\n");
+ return 1;
+ }
+ NPT_ParseInteger(arg, port, true);
+ } else if (NPT_StringsEqual(arg, "--verbose")) {
+ verbose = true;
+ }
+ }
+
+ if (file_root.GetLength() == 0) {
+ NPT_File::GetWorkingDir(file_root);
+ }
+
+ if (verbose) {
+ NPT_Console::OutputF("Starting server on port %d, root=%s\n", port, file_root.GetChars());
+ }
+ MiniServer(file_root, port, verbose);
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Apps/NetBench/NetBench.cpp b/lib/libUPnP/Neptune/Source/Apps/NetBench/NetBench.cpp
new file mode 100644
index 0000000..29d876a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/NetBench/NetBench.cpp
@@ -0,0 +1,256 @@
+/*****************************************************************
+|
+| Neptune Utilities - Network Benchmark utility
+|
+| (c) 2001-2013 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include <stdio.h>
+
+/*----------------------------------------------------------------------
+| Config
++---------------------------------------------------------------------*/
+const unsigned int STATS_WINDOW_SIZE = 100;
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(void)
+{
+ fprintf(stderr,
+ "NetBench [options] <url>\n"
+ "\n"
+ " Options:\n"
+ " --threads <n> : use <n> independent threads for requests\n"
+ " --max-requests <n> : stop after <n> requests\n"
+ " --max-time <n> : stop after <n> seconds\n"
+ " --ssl-client-cert <filename> : load client TLS certificate from <filename> (PKCS12)\n"
+ " --ssl-client-cert-password <password> : optional password for the client cert\n"
+ );
+}
+
+/*----------------------------------------------------------------------
+| Worker
++---------------------------------------------------------------------*/
+class Worker : public NPT_Thread
+{
+public:
+ Worker(const char* url,
+ NPT_TlsContext* tls_context,
+ unsigned int tls_options) :
+ m_Url(url),
+ m_Connector(NULL),
+ m_Iterations(0),
+ m_Failures(0),
+ m_Done(false),
+ m_ShouldStop(false)
+ {
+ if (tls_context) {
+ m_Connector = new NPT_HttpTlsConnector(*tls_context, tls_options);
+ m_Client.SetConnector(m_Connector);
+ }
+ }
+
+ ~Worker() {
+ delete m_Connector;
+ }
+
+ void Run() {
+ // get the document
+ NPT_HttpRequest request(m_Url, NPT_HTTP_METHOD_GET);
+
+ while (!m_ShouldStop) {
+ NPT_HttpResponse* response = NULL;
+
+ NPT_Result result = m_Client.SendRequest(request, response);
+ if (NPT_FAILED(result)) {
+ ++m_Failures;
+ continue;
+ }
+
+ // load body
+ NPT_HttpEntity* entity = response->GetEntity();
+ if (entity != NULL) {
+ NPT_DataBuffer body;
+ result = entity->Load(body);
+ if (NPT_FAILED(result)) {
+ ++m_Failures;
+ continue;
+ }
+ }
+
+ ++m_Iterations;
+ delete response;
+ }
+ }
+
+ NPT_HttpUrl m_Url;
+ NPT_HttpClient m_Client;
+ NPT_HttpClient::Connector* m_Connector;
+ NPT_UInt32 m_Iterations;
+ NPT_UInt32 m_Failures;
+ volatile bool m_Done;
+ volatile bool m_ShouldStop;
+};
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // check command line
+ if (argc < 2) {
+ PrintUsageAndExit();
+ return 1;
+ }
+
+ // init options
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ unsigned int tls_options = NPT_HttpTlsConnector::OPTION_ACCEPT_SELF_SIGNED_CERTS | NPT_HttpTlsConnector::OPTION_ACCEPT_HOSTNAME_MISMATCH;
+#else
+ unsigned int tls_options = 0;
+#endif
+ const char* tls_cert_filename = NULL;
+ const char* tls_cert_password = NULL;
+ const char* url = NULL;
+ unsigned int threads = 1;
+ unsigned int max_requests = 0;
+ unsigned int max_time = 0;
+
+ // parse command line
+ ++argv;
+ const char* arg;
+ while ((arg = *argv++)) {
+ if (NPT_StringsEqual(arg, "--threads")) {
+ NPT_ParseInteger(*argv++, threads);
+ if (threads < 1) threads = 1;
+ } else if (NPT_StringsEqual(arg, "--max-requests")) {
+ NPT_ParseInteger(*argv++, max_requests);
+ } else if (NPT_StringsEqual(arg, "--max-time")) {
+ NPT_ParseInteger(*argv++, max_time);
+ } else if (NPT_StringsEqual(arg, "--ssl-client-cert")) {
+ tls_cert_filename = *argv++;
+ if (tls_cert_filename == NULL) {
+ fprintf(stderr, "ERROR: missing argument after --ssl-client-cert option\n");
+ return 1;
+ }
+ } else if (NPT_StringsEqual(arg, "--ssl-client-cert-password")) {
+ tls_cert_password = *argv++;
+ if (tls_cert_password == NULL) {
+ fprintf(stderr, "ERROR: missing argument after --ssl-client-cert-password option\n");
+ return 1;
+ }
+ } else if (url == NULL) {
+ url = arg;
+ } else {
+ fprintf(stderr, "ERROR: unexpected argument '%s'\n", arg);
+ return 1;
+ }
+ }
+
+ // load a client cert if needed
+ NPT_TlsContext* tls_context = NULL;
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ if (tls_options || tls_cert_filename) {
+ tls_context = new NPT_TlsContext(NPT_TlsContext::OPTION_VERIFY_LATER | NPT_TlsContext::OPTION_ADD_DEFAULT_TRUST_ANCHORS/* | NPT_TlsContext::OPTION_NO_SESSION_CACHE*/);
+ if (tls_cert_filename) {
+ NPT_DataBuffer cert;
+ NPT_Result result = NPT_File::Load(tls_cert_filename, cert);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to load client cert from file %s (%d)\n", tls_cert_filename, result);
+ return 1;
+ }
+ result = tls_context->LoadKey(NPT_TLS_KEY_FORMAT_PKCS12, cert.GetData(), cert.GetDataSize(), tls_cert_password);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to parse client cert (%d)\n", result);
+ return 1;
+ }
+ }
+ }
+#endif
+
+ NPT_Array<Worker*> workers;
+ for (unsigned int i=0; i<threads; i++) {
+ Worker* worker = new Worker(url, tls_context, tls_options);
+ workers.Add(worker);
+ worker->Start();
+ }
+
+ NPT_TimeStamp start_time;
+ NPT_System::GetCurrentTimeStamp(start_time);
+
+ struct {
+ unsigned int request_count;
+ unsigned int failure_count;
+ NPT_TimeStamp timestamp;
+ } stats[STATS_WINDOW_SIZE];
+ unsigned int cursor = 0;
+ for (unsigned int loop = 0; true; loop++) {
+ unsigned int total_requests = 0;
+ unsigned int total_failures = 0;
+ bool all_done = true;
+ for (unsigned int i=0; i<threads; i++) {
+ total_requests += workers[i]->m_Iterations;
+ total_failures += workers[i]->m_Failures;
+ if (!workers[i]->m_Done) all_done = false;
+ }
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ stats[cursor].timestamp = now;
+ stats[cursor].request_count = total_requests;
+ stats[cursor].failure_count = total_failures;
+
+ int newest = cursor;
+ int oldest = (cursor+1)%STATS_WINDOW_SIZE;
+ if (loop < STATS_WINDOW_SIZE) {
+ oldest = 0;
+ }
+ unsigned int reqs_in_window = stats[newest].request_count - stats[oldest].request_count;
+ NPT_TimeStamp window_duration = stats[newest].timestamp - stats[oldest].timestamp;
+ double rate = 0.0;
+ if (window_duration.ToMillis()) {
+ rate = 1000.0*(double)reqs_in_window/(double)window_duration.ToMillis();
+ }
+ printf("\rReqs: %d - Fail: %d - Rate: %.2f tps", total_requests, total_failures, (float)rate);
+ fflush(stdout);
+
+ cursor = (cursor+1)%STATS_WINDOW_SIZE;
+
+ if (max_time && (now-start_time).ToSeconds() >= max_time) {
+ break;
+ }
+ if (max_requests && total_requests >= max_requests) {
+ break;
+ }
+ if (all_done) {
+ break;
+ }
+ NPT_System::Sleep(0.1);
+ }
+ printf("\n");
+
+ for (unsigned int i=0; i<threads; i++) {
+ workers[i]->m_ShouldStop = true;
+ }
+
+ for (unsigned int i=0; i<threads; i++) {
+ workers[i]->Wait();
+ delete workers[i];
+ }
+
+ delete tls_context;
+
+ return 0;
+}
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Apps/NetConfig/NetConfig.cpp b/lib/libUPnP/Neptune/Source/Apps/NetConfig/NetConfig.cpp
new file mode 100644
index 0000000..072b49b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/NetConfig/NetConfig.cpp
@@ -0,0 +1,126 @@
+/*****************************************************************
+|
+| Neptune Utilities - Network Configuration Dump
+|
+| (c) 2001-2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(NPT_CONFIG_HAVE_STDLIB_H)
+#include <stdlib.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRING_H)
+#include <string.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STDIO_H)
+#include <stdio.h>
+#endif
+
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(void)
+{
+ fprintf(stderr,
+ "usage: NetConfig\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| PrintFlags
++---------------------------------------------------------------------*/
+static void
+PrintFlags(NPT_Flags flags)
+{
+ if (flags & NPT_NETWORK_INTERFACE_FLAG_LOOPBACK) {
+ printf("LOOPBACK ");
+ }
+ if (flags & NPT_NETWORK_INTERFACE_FLAG_PROMISCUOUS) {
+ printf("PROMISCUOUS ");
+ }
+ if (flags & NPT_NETWORK_INTERFACE_FLAG_BROADCAST) {
+ printf("BROADCAST ");
+ }
+ if (flags & NPT_NETWORK_INTERFACE_FLAG_MULTICAST) {
+ printf("MULTICAST ");
+ }
+ if (flags & NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT) {
+ printf("POINT-TO-POINT ");
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char**)
+{
+ // check command line
+ if (argc < 1) {
+ PrintUsageAndExit();
+ }
+
+ NPT_List<NPT_NetworkInterface*> interfaces;
+ NPT_Result result = NPT_NetworkInterface::GetNetworkInterfaces(interfaces);
+ if (NPT_FAILED(result)) {
+ printf("GetNetworkInterfaces() failed\n");
+ return 0;
+ }
+ NPT_List<NPT_NetworkInterface*>::Iterator iface = interfaces.GetFirstItem();
+ unsigned int index = 0;
+ while (iface) {
+ printf("Interface %d: -------------------------------------\n", index);
+ printf(" name = %s\n", (*iface)->GetName().GetChars());
+ printf(" flags = %x [ ", (*iface)->GetFlags());
+ PrintFlags((*iface)->GetFlags());
+ printf("]\n");
+ printf(" mac = %s (type=%d)\n", (*iface)->GetMacAddress().ToString().GetChars(), (*iface)->GetMacAddress().GetType());
+
+ // print all addresses
+ NPT_List<NPT_NetworkInterfaceAddress>::Iterator nwifaddr =
+ (*iface)->GetAddresses().GetFirstItem();
+ unsigned int addr_index = 0;
+ while (nwifaddr) {
+ printf(" address %d:\n", addr_index);
+ printf(" primary address = ");
+ printf("%s\n", nwifaddr->GetPrimaryAddress().ToString().GetChars());
+ if ((*iface)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_BROADCAST) {
+ printf(" broadcast address = ");
+ printf("%s\n", nwifaddr->GetBroadcastAddress().ToString().GetChars());
+ }
+ if ((*iface)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT) {
+ printf(" destination address = ");
+ printf("%s\n", nwifaddr->GetDestinationAddress().ToString().GetChars());
+ }
+ printf(" netmask = ");
+ printf("%s\n", nwifaddr->GetNetMask().ToString().GetChars());
+ ++nwifaddr;
+ ++addr_index;
+ }
+
+ ++iface;
+ ++index;
+ }
+
+ return 0;
+}
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Apps/NetEcho/NetEcho.cpp b/lib/libUPnP/Neptune/Source/Apps/NetEcho/NetEcho.cpp
new file mode 100644
index 0000000..6443ba0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/NetEcho/NetEcho.cpp
@@ -0,0 +1,168 @@
+/*****************************************************************
+|
+| Neptune Utilities - Network Echo Server
+|
+| (c) 2001-2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(NPT_CONFIG_HAVE_STDLIB_H)
+#include <stdlib.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRING_H)
+#include <string.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STDIO_H)
+#include <stdio.h>
+#endif
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef enum {
+ SERVER_TYPE_UNKNOWN,
+ SERVER_TYPE_UDP,
+ SERVER_TYPE_TCP
+} ServerType;
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static struct {
+ bool verbose;
+} Options;
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(void)
+{
+ fprintf(stderr,
+ "usage: NetEcho udp|tcp <port>\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| UdpServerLoop
++---------------------------------------------------------------------*/
+static void
+UdpServerLoop(int port)
+{
+ NPT_UdpSocket listener;
+
+ // info
+ if (Options.verbose) {
+ printf("listening on port %d\n", port);
+ }
+
+ NPT_Result result = listener.Bind(NPT_SocketAddress(NPT_IpAddress::Any, port));
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: Bind() failed (%d : %s)\n", result, NPT_ResultText(result));
+ return;
+ }
+
+ // packet loop
+ NPT_DataBuffer packet(32768);
+ NPT_SocketAddress address;
+
+ do {
+ result = listener.Receive(packet, &address);
+ if (NPT_SUCCEEDED(result)) {
+ if (Options.verbose) {
+ NPT_String ip = address.GetIpAddress().ToString();
+ printf("Received %d bytes from %s:%d\n", packet.GetDataSize(), ip.GetChars(), address.GetPort());
+ }
+
+ listener.Send(packet, &address);
+ }
+ } while (NPT_SUCCEEDED(result));
+}
+
+/*----------------------------------------------------------------------
+| TcpServerLoop
++---------------------------------------------------------------------*/
+static void
+TcpServerLoop(int port)
+{
+ NPT_TcpServerSocket listener;
+
+ NPT_Result result = listener.Bind(NPT_SocketAddress(NPT_IpAddress::Any, port));
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: Bind() failed (%d : %s)\n", result, NPT_ResultText(result));
+ return;
+ }
+
+ NPT_Socket* client;
+
+ for (;;) {
+ printf("waiting for client on port %d\n", port);
+ result = listener.WaitForNewClient(client);
+ NPT_SocketInfo socket_info;
+ client->GetInfo(socket_info);
+ printf("client connected from %s port %d\n",
+ socket_info.remote_address.GetIpAddress().ToString().GetChars(),
+ socket_info.remote_address.GetPort());
+ NPT_InputStreamReference input;
+ client->GetInputStream(input);
+ NPT_OutputStreamReference output;
+ client->GetOutputStream(output);
+ do {
+ char buffer[1024];
+ NPT_Size bytes_read;
+ result = input->Read(buffer, sizeof(buffer), &bytes_read);
+ if (NPT_SUCCEEDED(result)) {
+ printf("read %d bytes\n", bytes_read);
+ output->Write(buffer, bytes_read);
+ }
+ } while (NPT_SUCCEEDED(result));
+ delete client;
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // check command line
+ if (argc != 3) {
+ PrintUsageAndExit();
+ }
+
+ // init options
+ Options.verbose = true;
+ ServerType server_type = SERVER_TYPE_UNKNOWN;
+ int port = -1;
+
+ // parse command line
+ if (!strcmp(argv[1], "udp")) {
+ server_type = SERVER_TYPE_UDP;
+ } else if (!strcmp(argv[1], "tcp")) {
+ server_type = SERVER_TYPE_TCP;
+ } else {
+ fprintf(stderr, "ERROR: unknown server type\n");
+ exit(1);
+ }
+
+ port = strtoul(argv[2], NULL, 10);
+
+ switch (server_type) {
+ case SERVER_TYPE_TCP: TcpServerLoop(port); break;
+ case SERVER_TYPE_UDP: UdpServerLoop(port); break;
+ default: break;
+ }
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp b/lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp
new file mode 100644
index 0000000..4dc0a31
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp
@@ -0,0 +1,279 @@
+/*****************************************************************
+|
+| Neptune Utilities - Network 'Get' Client
+|
+| (c) 2001-2010 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include <stdio.h>
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(void)
+{
+ fprintf(stderr,
+ "NetGet [options] <url>\n"
+ "\n"
+ " Options:\n"
+ " --verbose : print verbose information\n"
+ " --no-body-output : do not output the response body\n"
+ " --http-1-1 : use HTTP 1.1\n"
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ " --ssl-client-cert <filename> : load client TLS certificate from <filename> (PKCS12)\n"
+ " --ssl-client-cert-password <password> : optional password for the client cert\n"
+ " --ssl-accept-self-signed-certs : accept self-signed server certificates\n"
+ " --ssl-accept-hostname-mismatch : accept server certificates that don't match\n"
+#endif
+ " --show-proxy : show the proxy that will be used for the connection\n");
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // check command line
+ if (argc < 2) {
+ PrintUsageAndExit();
+ return 1;
+ }
+
+ // init options
+ bool verbose = false;
+ bool no_body_output = false;
+ bool show_proxy = false;
+ bool url_set = false;
+ bool http_1_1 = false;
+ NPT_HttpUrl url;
+ NPT_HttpClient::Connector* connector = NULL;
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ NPT_TlsContext* tls_context = NULL;
+ const char* tls_cert_filename = NULL;
+ const char* tls_cert_password = NULL;
+ unsigned int tls_options = 0;
+#endif
+
+ // parse command line
+ ++argv;
+ const char* arg;
+ while ((arg = *argv++)) {
+ if (NPT_StringsEqual(arg, "--verbose")) {
+ verbose = true;
+ } else if (NPT_StringsEqual(arg, "--show-proxy")) {
+ show_proxy = true;
+ } else if (NPT_StringsEqual(arg, "--no-body-output")) {
+ no_body_output = true;
+ } else if (NPT_StringsEqual(arg, "--http-1-1")) {
+ http_1_1 = true;
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ } else if (NPT_StringsEqual(arg, "--ssl-client-cert")) {
+ tls_cert_filename = *argv++;
+ if (tls_cert_filename == NULL) {
+ fprintf(stderr, "ERROR: missing argument after --ssl-client-cert option\n");
+ return 1;
+ }
+ } else if (NPT_StringsEqual(arg, "--ssl-client-cert-password")) {
+ tls_cert_password = *argv++;
+ if (tls_cert_password == NULL) {
+ fprintf(stderr, "ERROR: missing argument after --ssl-client-cert-password option\n");
+ return 1;
+ }
+ } else if (NPT_StringsEqual(arg, "--ssl-accept-self-signed-certs")) {
+ tls_options |= NPT_HttpTlsConnector::OPTION_ACCEPT_SELF_SIGNED_CERTS;
+ } else if (NPT_StringsEqual(arg, "--ssl-accept-hostname-mismatch")) {
+ tls_options |= NPT_HttpTlsConnector::OPTION_ACCEPT_HOSTNAME_MISMATCH;
+#endif
+ } else if (!url_set) {
+ NPT_Result result = url.Parse(arg);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to parse URL (%d:%s)\n", result, NPT_ResultText(result));
+ return 1;
+ }
+ url_set = true;
+ } else {
+ fprintf(stderr, "ERROR: unexpected argument '%s'\n", arg);
+ return 1;
+ }
+ }
+
+ if (show_proxy) {
+ NPT_HttpProxyAddress proxy;
+ NPT_HttpProxySelector* selector = NPT_HttpProxySelector::GetDefault();
+ if (selector) {
+ NPT_Result result = selector->GetProxyForUrl(url, proxy);
+ if (NPT_FAILED(result) && result != NPT_ERROR_HTTP_NO_PROXY) {
+ fprintf(stderr, "ERROR: proxy selector error (%d:%s)\n", result, NPT_ResultText(result));
+ return 1;
+ }
+ }
+ if (proxy.GetHostName().IsEmpty()) {
+ printf("PROXY: none\n");
+ } else {
+ printf("PROXY: %s:%d\n", proxy.GetHostName().GetChars(), proxy.GetPort());
+ }
+ }
+
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ // load a client cert if needed
+ if (tls_options || tls_cert_filename) {
+ tls_context = new NPT_TlsContext(NPT_TlsContext::OPTION_VERIFY_LATER | NPT_TlsContext::OPTION_ADD_DEFAULT_TRUST_ANCHORS);
+
+ if (tls_cert_filename) {
+ NPT_DataBuffer cert;
+ NPT_Result result = NPT_File::Load(tls_cert_filename, cert);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to load client cert from file %s (%d)\n", tls_cert_filename, result);
+ return 1;
+ }
+ result = tls_context->LoadKey(NPT_TLS_KEY_FORMAT_PKCS12, cert.GetData(), cert.GetDataSize(), tls_cert_password);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to parse client cert (%d)\n", result);
+ return 1;
+ }
+ }
+
+ connector = new NPT_HttpTlsConnector(*tls_context, tls_options);
+ }
+#endif
+
+ // get the document
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_GET);
+ NPT_HttpClient client;
+ NPT_HttpResponse* response;
+ if (http_1_1) {
+ request.SetProtocol(NPT_HTTP_PROTOCOL_1_1);
+ }
+ if (connector) {
+ client.SetConnector(connector);
+ }
+
+ NPT_TimeStamp before_request;
+ NPT_System::GetCurrentTimeStamp(before_request);
+
+ NPT_Result result = client.SendRequest(request, response);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: SendRequest failed (%d:%s)\n", result, NPT_ResultText(result));
+ return 1;
+ }
+
+ NPT_TimeStamp before_body;
+ NPT_System::GetCurrentTimeStamp(before_body);
+
+ // show the request info
+ if (verbose) {
+ printf("#REQUEST: protocol=%s\n", request.GetProtocol().GetChars());
+
+ // show headers
+ NPT_HttpHeaders& headers = request.GetHeaders();
+ NPT_List<NPT_HttpHeader*>::Iterator header = headers.GetHeaders().GetFirstItem();
+ while (header) {
+ printf("%s: %s\n",
+ (const char*)(*header)->GetName(),
+ (const char*)(*header)->GetValue());
+ ++header;
+ }
+ }
+
+ // show response info
+ if (verbose) {
+ printf("\n#RESPONSE: protocol=%s, code=%d, reason=%s\n",
+ response->GetProtocol().GetChars(),
+ response->GetStatusCode(),
+ response->GetReasonPhrase().GetChars());
+
+ // show headers
+ NPT_HttpHeaders& headers = response->GetHeaders();
+ NPT_List<NPT_HttpHeader*>::Iterator header = headers.GetHeaders().GetFirstItem();
+ while (header) {
+ printf("%s: %s\n",
+ (const char*)(*header)->GetName(),
+ (const char*)(*header)->GetValue());
+ ++header;
+ }
+ }
+
+ // show entity
+ NPT_Size body_size = 0;
+ NPT_HttpEntity* entity = response->GetEntity();
+ if (entity != NULL) {
+ if (verbose) {
+ printf("\n#ENTITY: length=%lld, type=%s, encoding=%s\n",
+ entity->GetContentLength(),
+ entity->GetContentType().GetChars(),
+ entity->GetContentEncoding().GetChars());
+ }
+
+ if (verbose) {
+ NPT_InputStreamReference body_stream;
+ entity->GetInputStream(body_stream);
+ if (!body_stream.IsNull()) {
+ NPT_LargeSize size;
+ body_stream->GetSize(size);
+ printf("Loading body stream (declared: %lld bytes)\n", size);
+ }
+ }
+ NPT_DataBuffer body;
+ result =entity->Load(body);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to load entity (%d)\n", result);
+ } else {
+ body_size = body.GetDataSize();
+ if (verbose) printf("\n#BODY: loaded %d bytes\n", (int)body_size);
+
+ // dump the body
+ if (!no_body_output) {
+ NPT_OutputStreamReference output;
+ NPT_File standard_out(NPT_FILE_STANDARD_OUTPUT);
+ standard_out.Open(NPT_FILE_OPEN_MODE_WRITE);
+ standard_out.GetOutputStream(output);
+ output->Write(body.GetData(), body.GetDataSize());
+ }
+ }
+ }
+
+ NPT_TimeStamp after_body;
+ NPT_System::GetCurrentTimeStamp(after_body);
+
+ if (verbose) {
+ unsigned int request_latency = (unsigned int)(before_body-before_request).ToMillis();
+ unsigned int body_load_time = (unsigned int)(after_body-before_body).ToMillis();
+ unsigned int total_load_time = (unsigned int)(after_body-before_request).ToMillis();
+ unsigned int body_throughput = 0;
+ if (body_size && body_load_time) {
+ body_throughput = (unsigned int)(((8.0 * (double)body_size)/1000.0)/((double)body_load_time/1000.0));
+ }
+ unsigned int total_throughput = 0;
+ if (body_size && total_load_time) {
+ total_throughput = (unsigned int)(((8.0 * (double)body_size)/1000.0)/((double)total_load_time/1000.0));
+ }
+
+ printf("\n-----------------------------------------------------------\n");
+ printf("TIMING:\n");
+ printf(" Request Latency = %d ms\n", request_latency);
+ printf(" Body Load Time = %d ms\n", body_load_time);
+ printf(" Total Load Time = %d ms\n", total_load_time);
+ printf(" Body Throughput = %d kbps\n", body_throughput);
+ printf(" Total Throughput = %d kbps\n", total_throughput);
+ }
+
+ delete response;
+ delete connector;
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ delete tls_context;
+#endif
+
+ return 0;
+}
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp b/lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp
new file mode 100644
index 0000000..5fc719f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp
@@ -0,0 +1,218 @@
+/*****************************************************************
+|
+| Neptune Utilities - Network Ping Client
+|
+| (c) 2001-2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(NPT_CONFIG_HAVE_STDLIB_H)
+#include <stdlib.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRING_H)
+#include <string.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STDIO_H)
+#include <stdio.h>
+#endif
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef enum {
+ CLIENT_TYPE_UNKNOWN,
+ CLIENT_TYPE_UDP,
+ CLIENT_TYPE_TCP
+} ClientType;
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static struct {
+ bool verbose;
+} Options;
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(void)
+{
+ fprintf(stderr,
+ "usage: NetPing udp|tcp <hostname> <port>\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| UdpPing
++---------------------------------------------------------------------*/
+static void
+UdpPing(const char* hostname, int port)
+{
+ NPT_UdpSocket sender;
+ NPT_Result result;
+
+ // build ping packet
+ NPT_DataBuffer packet;
+ const char* packet_data = "PING";
+ packet.SetData((NPT_Byte*)packet_data, 4);
+
+ // resolve hostname
+ NPT_IpAddress ip_address;
+ result = ip_address.ResolveName(hostname);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to resolve name\n");
+ return;
+ }
+
+ // get the current timestamp
+ NPT_TimeStamp before;
+ NPT_System::GetCurrentTimeStamp(before);
+
+ // send the packet
+ sender.Connect(NPT_SocketAddress(ip_address, port));
+ sender.Send(packet);
+ //NPT_SocketAddress destination_address(ip_address, port);
+ //sender.Send(packet, &destination_address);
+ NPT_SocketInfo socket_info;
+ sender.GetInfo(socket_info);
+ printf("send from %s:%d to %s:%d\n",
+ socket_info.local_address.GetIpAddress().ToString().GetChars(),
+ socket_info.local_address.GetPort(),
+ socket_info.remote_address.GetIpAddress().ToString().GetChars(),
+ socket_info.remote_address.GetPort());
+ //sender.Connect(NPT_SocketAddress(ip_address, port));
+ NPT_SocketAddress destination_address(ip_address, port);
+ sender.Send(packet, &destination_address);
+ //NPT_SocketInfo socket_info;
+ //sender.GetInfo(socket_info);
+ //NPT_Debug("sent from %s:%d to %s:%d\n",
+ // socket_info.local_address.GetIpAddress().ToString().GetChars(),
+ // socket_info.local_address.GetPort(),
+ // socket_info.remote_address.GetIpAddress().ToString().GetChars(),
+ // socket_info.remote_address.GetPort());
+ printf("send %d bytes\n", 4);
+
+ // receive response
+ NPT_DataBuffer response(32768);
+ result = sender.Receive(response);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to receive response (%d)\n", result);
+ return;
+ }
+ sender.GetInfo(socket_info);
+ printf("RESPONSE: %d bytes from %s:%d\n",
+ response.GetDataSize(),
+ socket_info.remote_address.GetIpAddress().ToString().GetChars(),
+ socket_info.remote_address.GetPort());
+
+ NPT_TimeStamp after;
+ NPT_System::GetCurrentTimeStamp(after);
+ NPT_TimeInterval i = after-before;
+ printf("RTT: %f ms\n", ((float)i)*1000.0f);
+}
+
+/*----------------------------------------------------------------------
+| TcpPing
++---------------------------------------------------------------------*/
+static void
+TcpPing(const char* hostname, int port)
+{
+ NPT_TcpClientSocket sender;
+ NPT_Result result;
+
+ // resolve name
+ NPT_IpAddress ip_address;
+ result = ip_address.ResolveName(hostname);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to resolve name\n");
+ return;
+ }
+
+ // connect to server
+ result = sender.Connect(NPT_SocketAddress(ip_address, port));
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: Connect() failed (%d)\n", result);
+ return;
+ }
+ NPT_OutputStreamReference output;
+
+ // get the current timestamp
+ NPT_TimeStamp before;
+ NPT_System::GetCurrentTimeStamp(before);
+
+ // send the ping
+ sender.GetOutputStream(output);
+ output->Write("PING", 4);
+
+ // receive response
+ NPT_InputStreamReference input;
+ sender.GetInputStream(input);
+ char buffer[1024];
+
+ NPT_Size bytes_read;
+ result = input->Read(buffer, sizeof(buffer), &bytes_read);
+ if (NPT_SUCCEEDED(result)) {
+ printf("read %d bytes\n", bytes_read);
+ } else {
+ fprintf(stderr, "ERROR: Read() failed (%d)\n", result);
+ }
+
+ NPT_TimeStamp after;
+ NPT_System::GetCurrentTimeStamp(after);
+ NPT_TimeInterval i = after-before;
+ printf("RTT: %f ms\n", ((float)i)*1000.0f);
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // check command line
+ if (argc != 4) {
+ PrintUsageAndExit();
+ }
+
+ // init options
+ Options.verbose = false;
+ ClientType client_type = CLIENT_TYPE_UNKNOWN;
+ int port = -1;
+ char* hostname = NULL;
+
+ // parse command line
+ if (!strcmp(argv[1], "udp")) {
+ client_type = CLIENT_TYPE_UDP;
+ } else if (!strcmp(argv[1], "tcp")) {
+ client_type = CLIENT_TYPE_TCP;
+ } else {
+ fprintf(stderr, "ERROR: unknown client type\n");
+ exit(1);
+ }
+
+ hostname = argv[2];
+ port = strtoul(argv[3], NULL, 10);
+
+ switch (client_type) {
+ case CLIENT_TYPE_TCP: TcpPing(hostname, port); break;
+ case CLIENT_TYPE_UDP: UdpPing(hostname, port); break;
+ default: break;
+ }
+
+ return 0;
+}
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Apps/NetPump/NetPump.cpp b/lib/libUPnP/Neptune/Source/Apps/NetPump/NetPump.cpp
new file mode 100644
index 0000000..7189062
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/NetPump/NetPump.cpp
@@ -0,0 +1,683 @@
+/*****************************************************************
+|
+| Neptune Utilities - Network Data Pump
+|
+| (c) 2001-2002 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(NPT_CONFIG_HAVE_STDLIB_H)
+#include <stdlib.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRING_H)
+#include <string.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STDIO_H)
+#include <stdio.h>
+#endif
+
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef enum {
+ ENDPOINT_TYPE_UDP_CLIENT,
+ ENDPOINT_TYPE_UDP_SERVER,
+ ENDPOINT_TYPE_TCP_CLIENT,
+ ENDPOINT_TYPE_TCP_SERVER,
+ ENDPOINT_TYPE_MULTICAST_CLIENT,
+ ENDPOINT_TYPE_MULTICAST_SERVER,
+ ENDPOINT_TYPE_FILE,
+ ENDPOINT_TYPE_SERIAL_PORT
+} EndPointType;
+
+typedef enum {
+ ENDPOINT_DIRECTION_IN,
+ ENDPOINT_DIRECTION_OUT
+} EndPointDirection;
+
+typedef struct {
+ EndPointType type;
+ EndPointDirection direction;
+ union {
+ struct {
+ int port;
+ bool reuse_addr;
+ } udp_server;
+ struct {
+ char* hostname;
+ int port;
+ } udp_client;
+ struct {
+ int port;
+ bool reuse_addr;
+ } tcp_server;
+ struct {
+ char* hostname;
+ int port;
+ } tcp_client;
+ struct {
+ char* groupname;
+ int port;
+ bool reuse_addr;
+ } multicast_server;
+ struct {
+ char* groupname;
+ int port;
+ int ttl;
+ } multicast_client;
+ struct {
+ char* name;
+ } file;
+ struct {
+ char* name;
+ unsigned int speed;
+ } serial_port;
+ } info;
+} EndPoint;
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define PUMP_DEFAULT_PACKET_SIZE 16384
+#define PUMP_MAX_PACKET_SIZE 65536
+#define PUMP_MAX_UNDERFLOW 5000
+#define PUMP_MIN_SLEEP 10
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static struct {
+ bool verbose;
+ bool show_progress;
+} Options;
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(void)
+{
+ fprintf(stderr,
+ "usage: NetPump [options] <input endpoint> <output endpoint>, \n"
+ "where each endpoint is:\n"
+ " udp [client <hostname> <port>]|[server <port> [-r]]\n"
+ " or\n"
+ " tcp [client <hostname> <port>]|[server <port> [-r]]\n"
+ " or\n"
+ " multicast [client <groupname> <port> <ttl>]|[server <groupname> <port> [-r]]\n"
+ " or\n"
+ " file [<filename>|" NPT_FILE_STANDARD_INPUT "|" NPT_FILE_STANDARD_OUTPUT "|" NPT_FILE_STANDARD_ERROR "\n"
+ " or\n"
+ " serial <portname> <speed>\n"
+ "\n"
+ "options are:\n"
+ " -r: when used for udp, tcp or multicast server endpoints, do not set reuse_address\n"
+ " --verbose: show more info\n"
+ " --show-progress: show progress\n"
+ " --packet-size <packet_size>: send by burst of <packet_size> (default: %d)"
+ "\n", PUMP_DEFAULT_PACKET_SIZE);
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| GetEndPointStreams
++---------------------------------------------------------------------*/
+static NPT_Result
+GetEndPointStreams(EndPoint* endpoint,
+ NPT_InputStreamReference* input_stream,
+ NPT_OutputStreamReference* output_stream)
+{
+ // default return values
+ if (input_stream) *input_stream = NULL;
+ if (output_stream) *output_stream = NULL;
+
+ switch (endpoint->type) {
+ case ENDPOINT_TYPE_MULTICAST_SERVER:
+ case ENDPOINT_TYPE_UDP_SERVER:
+ break; // not used with streams
+
+ case ENDPOINT_TYPE_UDP_CLIENT:
+ {
+ NPT_UdpSocket sender;
+
+ // info
+ if (Options.verbose) {
+ printf("sending to %s on port %d\n",
+ endpoint->info.udp_client.hostname,
+ endpoint->info.udp_client.port);
+ }
+
+ // resolve name
+ NPT_IpAddress address;
+ NPT_CHECK(address.ResolveName(endpoint->info.udp_client.hostname));
+
+ // connect socket
+ NPT_CHECK(sender.Connect(NPT_SocketAddress(address,
+ endpoint->info.udp_client.port)));
+
+ // get the streams
+ if (input_stream) {
+ NPT_CHECK(sender.GetInputStream(*input_stream));
+ }
+ if (output_stream) {
+ NPT_CHECK(sender.GetOutputStream(*output_stream));
+ }
+
+ return NPT_SUCCESS;
+ }
+ break;
+
+ case ENDPOINT_TYPE_TCP_CLIENT:
+ {
+ NPT_TcpClientSocket client;
+
+ // info
+ if (Options.verbose) {
+ printf("connecting to %s on port %d\n",
+ endpoint->info.tcp_client.hostname,
+ endpoint->info.tcp_client.port);
+ }
+
+ // resolve the name
+ NPT_IpAddress address;
+ NPT_CHECK(address.ResolveName(endpoint->info.tcp_client.hostname));
+
+ // connect
+ NPT_CHECK(client.Connect(NPT_SocketAddress(address,
+ endpoint->info.tcp_client.port)));
+
+ // info
+ if (Options.verbose) {
+ printf("connected\n");
+ }
+
+ // get the streams
+ if (input_stream) {
+ NPT_CHECK(client.GetInputStream(*input_stream));
+ }
+ if (output_stream) {
+ NPT_CHECK(client.GetOutputStream(*output_stream));
+ }
+
+ return NPT_SUCCESS;
+ }
+ break;
+
+ case ENDPOINT_TYPE_MULTICAST_CLIENT:
+ {
+ NPT_UdpMulticastSocket sender;
+
+ // info
+ if (Options.verbose) {
+ printf("sending to %s on port %d\n",
+ endpoint->info.multicast_client.groupname,
+ endpoint->info.multicast_client.port);
+ }
+
+ // set time to live
+ NPT_CHECK(sender.SetTimeToLive(endpoint->info.multicast_client.ttl));
+
+ // resolve name
+ NPT_IpAddress address;
+ NPT_CHECK(address.ResolveName(endpoint->info.multicast_client.groupname));
+
+ // connect socket
+ NPT_CHECK(sender.Connect(NPT_SocketAddress(address, endpoint->info.multicast_client.port)));
+
+ // get the streams
+ if (input_stream) {
+ NPT_CHECK(sender.GetInputStream(*input_stream));
+ }
+ if (output_stream) {
+ NPT_CHECK(sender.GetOutputStream(*output_stream));
+ }
+
+ return NPT_SUCCESS;
+ }
+ break;
+
+ case ENDPOINT_TYPE_TCP_SERVER:
+ {
+ NPT_TcpServerSocket server;
+ NPT_Socket* client;
+
+ // info
+ if (Options.verbose) {
+ printf("waiting for client on port %d %s\n",
+ endpoint->info.tcp_server.port,
+ endpoint->info.tcp_server.reuse_addr?"":"(reuse_addr=false)");
+ }
+
+ // bind to the address
+ NPT_CHECK(server.Bind(NPT_SocketAddress(NPT_IpAddress::Any, endpoint->info.tcp_server.port),
+ endpoint->info.tcp_server.reuse_addr));
+
+ // wait for connection
+ NPT_CHECK(server.WaitForNewClient(client));
+
+ // info
+ if (Options.verbose) {
+ printf("client connected\n");
+ }
+
+ // get the streams
+ if (input_stream) {
+ NPT_CHECK(client->GetInputStream(*input_stream));
+ }
+ if (output_stream) {
+ NPT_CHECK(client->GetOutputStream(*output_stream));
+ }
+
+ delete client;
+ return NPT_SUCCESS;
+ }
+ break;
+
+ case ENDPOINT_TYPE_FILE:
+ {
+ // create a file object
+ NPT_File file(endpoint->info.file.name);
+ if (endpoint->direction == ENDPOINT_DIRECTION_IN) {
+ NPT_CHECK(file.Open(NPT_FILE_OPEN_MODE_READ |
+ NPT_FILE_OPEN_MODE_UNBUFFERED));
+ } else {
+ NPT_CHECK(file.Open(NPT_FILE_OPEN_MODE_WRITE |
+ NPT_FILE_OPEN_MODE_CREATE|
+ NPT_FILE_OPEN_MODE_UNBUFFERED));
+ }
+
+ // get the streams
+ if (input_stream) {
+ NPT_CHECK(file.GetInputStream(*input_stream));
+ }
+ if (output_stream) {
+ NPT_CHECK(file.GetOutputStream(*output_stream));
+ }
+
+ return NPT_SUCCESS;
+ }
+ break;
+
+ case ENDPOINT_TYPE_SERIAL_PORT:
+ {
+ // create a serial port object
+ NPT_SerialPort serial_port(endpoint->info.serial_port.name);
+ NPT_CHECK(serial_port.Open(endpoint->info.serial_port.speed));
+
+ // get the streams
+ if (input_stream) {
+ NPT_CHECK(serial_port.GetInputStream(*input_stream));
+ }
+ if (output_stream) {
+ NPT_CHECK(serial_port.GetOutputStream(*output_stream));
+ }
+
+ return NPT_SUCCESS;
+ }
+ break;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| GetEndPointUdpSocket
++---------------------------------------------------------------------*/
+static NPT_Result
+GetEndPointUdpSocket(EndPoint* endpoint, NPT_UdpSocket*& udp_socket)
+{
+ // default return values
+ udp_socket = NULL;
+
+ switch (endpoint->type) {
+ case ENDPOINT_TYPE_UDP_SERVER:
+ {
+ udp_socket = new NPT_UdpSocket();
+
+ // info
+ if (Options.verbose) {
+ printf("listening on port %d %s\n",
+ endpoint->info.udp_server.port,
+ endpoint->info.udp_server.reuse_addr?"":"(reuse_addr=false)");
+ }
+
+ // listen on port, any addr
+ return udp_socket->Bind(NPT_SocketAddress(NPT_IpAddress::Any, endpoint->info.udp_server.port),
+ endpoint->info.udp_server.reuse_addr);
+ }
+ break;
+
+ case ENDPOINT_TYPE_MULTICAST_SERVER:
+ {
+ NPT_UdpMulticastSocket* udp_multicast_socket = new NPT_UdpMulticastSocket();
+ udp_socket = udp_multicast_socket;
+
+ // info
+ if (Options.verbose) {
+ printf("listening on port %d %s\n",
+ endpoint->info.multicast_server.port,
+ endpoint->info.multicast_server.reuse_addr?"":"(reuse_addr=false)");
+ }
+
+ // listen on port, any addr
+ NPT_CHECK(udp_socket->Bind(NPT_SocketAddress(NPT_IpAddress::Any, endpoint->info.multicast_server.port),
+ endpoint->info.multicast_server.reuse_addr));
+
+ // info
+ if (Options.verbose) {
+ printf("joining multicast group %s\n", endpoint->info.multicast_server.groupname);
+ }
+
+ // resolve name
+ NPT_IpAddress address;
+ NPT_CHECK(address.ResolveName(endpoint->info.multicast_server.groupname));
+
+ // join the group
+ NPT_CHECK(udp_multicast_socket->JoinGroup(address));
+
+ return NPT_SUCCESS;
+ }
+ break;
+
+ default:
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // check command line
+ if (argc < 2) {
+ PrintUsageAndExit();
+ }
+
+ // init endpoints
+ EndPoint in_endpoint;
+ in_endpoint.direction = ENDPOINT_DIRECTION_IN;
+ EndPoint out_endpoint;
+ out_endpoint.direction = ENDPOINT_DIRECTION_OUT;
+ EndPoint* current_endpoint = &in_endpoint;
+
+ // init other parameters
+ unsigned int packet_size = PUMP_DEFAULT_PACKET_SIZE;
+
+ // init options
+ Options.verbose = false;
+ Options.show_progress = false;
+
+ // parse command line
+ argv++;
+ char* arg;
+ while ((arg = *argv++)) {
+ if (current_endpoint == NULL) {
+ printf("ERROR: unexpected argument (%s)\n", arg);
+ exit(1);
+ }
+
+ if (NPT_StringsEqual(arg, "--packet-size")) {
+ packet_size = strtoul(*argv++, NULL, 10);
+ if (packet_size == 0 || packet_size > PUMP_MAX_PACKET_SIZE) {
+ fprintf(stderr, "ERROR: invalid packet size\n");
+ return 1;
+ }
+ continue;
+ } else if (NPT_StringsEqual(arg, "--verbose")) {
+ Options.verbose = true;
+ continue;
+ } else if (NPT_StringsEqual(arg, "--show-progress")) {
+ Options.show_progress = true;
+ continue;
+ } else if (NPT_StringsEqual(arg, "udp")) {
+ if (argv[0] && argv[1]) {
+ if (NPT_StringsEqual(argv[0], "server")) {
+ if (current_endpoint->direction == ENDPOINT_DIRECTION_OUT){
+ printf("ERROR: cannot use 'udp server' as output\n");
+ exit(1);
+ }
+ current_endpoint->type = ENDPOINT_TYPE_UDP_SERVER;
+ current_endpoint->info.udp_server.port = strtoul(argv[1], NULL, 10);
+ argv += 2;
+ if (argv[0] && NPT_StringsEqual(argv[0], "-r")) {
+ current_endpoint->info.udp_server.reuse_addr = false;
+ ++argv;
+ } else {
+ current_endpoint->info.udp_server.reuse_addr = true;
+ }
+ } else if (NPT_StringsEqual(argv[0], "client")) {
+ if (current_endpoint->direction == ENDPOINT_DIRECTION_IN) {
+ printf("ERROR: cannot use 'udp client' as input\n");
+ exit(1);
+ }
+ if (argv[2]) {
+ current_endpoint->type = ENDPOINT_TYPE_UDP_CLIENT;
+ current_endpoint->info.udp_client.hostname = argv[1];
+ current_endpoint->info.udp_client.port = strtoul(argv[2], NULL, 10);
+ argv += 3;
+ } else {
+ printf("ERROR: missing argument for 'udp client'\n");
+ exit(1);
+ }
+ }
+ } else {
+ printf("ERROR: missing argument for 'udp' endpoint\n");
+ exit(1);
+ }
+ } else if (NPT_StringsEqual(arg, "multicast")) {
+ if (argv[0] && argv[1]) {
+ if (NPT_StringsEqual(argv[0], "server")) {
+ if (current_endpoint->direction == ENDPOINT_DIRECTION_OUT){
+ printf("ERROR: cannot use 'multicast server' as output\n");
+ exit(1);
+ }
+ if (argv[2]) {
+ current_endpoint->type = ENDPOINT_TYPE_MULTICAST_SERVER;
+ current_endpoint->info.multicast_server.groupname = argv[1];
+ current_endpoint->info.multicast_server.port = strtoul(argv[2], NULL, 10);
+ argv += 3;
+ } else {
+ printf("ERROR: missing argument for 'multicast server'\n");
+ exit(1);
+ }
+ if (argv[0] && NPT_StringsEqual(argv[0], "-r")) {
+ current_endpoint->info.multicast_server.reuse_addr = false;
+ ++argv;
+ } else {
+ current_endpoint->info.multicast_server.reuse_addr = true;
+ }
+ } else if (NPT_StringsEqual(argv[0], "client")) {
+ if (current_endpoint->direction == ENDPOINT_DIRECTION_IN) {
+ printf("ERROR: cannot use 'udp client' as input\n");
+ exit(1);
+ }
+ if (argv[2] && argv[3]) {
+ current_endpoint->type = ENDPOINT_TYPE_MULTICAST_CLIENT;
+ current_endpoint->info.multicast_client.groupname = argv[1];
+ current_endpoint->info.multicast_client.port = strtoul(argv[2], NULL, 10);
+ current_endpoint->info.multicast_client.ttl = strtoul(argv[3], NULL, 10);
+ argv += 4;
+ } else {
+ printf("ERROR: missing argument for 'multicast client'\n");
+ exit(1);
+ }
+ }
+ } else {
+ printf("ERROR: missing argument for 'multicast' endpoint\n");
+ exit(1);
+ }
+ } else if (NPT_StringsEqual(arg, "tcp")) {
+ if (argv[0] && argv[1]) {
+ if (NPT_StringsEqual(argv[0], "server")) {
+ current_endpoint->type = ENDPOINT_TYPE_TCP_SERVER;
+ current_endpoint->info.tcp_server.port = strtoul(argv[1], NULL, 10);
+ argv += 2;
+ if (argv[0] && NPT_StringsEqual(argv[0], "-r")) {
+ current_endpoint->info.tcp_server.reuse_addr = false;
+ ++argv;
+ } else {
+ current_endpoint->info.tcp_server.reuse_addr = true;
+ }
+ } else if (NPT_StringsEqual(argv[0], "client")) {
+ if (argv[2]) {
+ current_endpoint->type = ENDPOINT_TYPE_TCP_CLIENT;
+ current_endpoint->info.tcp_client.hostname = argv[1];
+ current_endpoint->info.tcp_client.port = strtoul(argv[2], NULL, 10);
+ argv += 3;
+ } else {
+ printf("ERROR: missing argument for 'tcp client'\n");
+ exit(1);
+ }
+ }
+ } else {
+ printf("ERROR: missing argument for 'tcp' endpoint\n");
+ exit(1);
+ }
+ } else if (NPT_StringsEqual(arg, "file")) {
+ if (argv[0]) {
+ current_endpoint->type = ENDPOINT_TYPE_FILE;
+ current_endpoint->info.file.name = *argv++;
+ } else {
+ printf("ERROR: missing argument for 'file' endpoint\n");
+ exit(1);
+ }
+ } else if (NPT_StringsEqual(arg, "serial")) {
+ if (argv[0]) {
+ current_endpoint->type = ENDPOINT_TYPE_SERIAL_PORT;
+ current_endpoint->info.serial_port.name = *argv++;
+ } else {
+ printf("ERROR: missing argument for 'serial' endpoint\n");
+ exit(1);
+ }
+ if (argv[0]) {
+ int speed = 0;
+ if (NPT_FAILED(NPT_ParseInteger(*argv++, speed))) {
+ printf("ERROR: invalid speed for 'serial' endpoint\n");
+ exit(1);
+ }
+ current_endpoint->info.serial_port.speed = (unsigned int)speed;
+ } else {
+ printf("ERROR: missing argument for 'serial' endpoint\n");
+ exit(1);
+ }
+ } else {
+ printf("ERROR: invalid argument (%s)\n", arg);
+ exit(1);
+ }
+
+ if (current_endpoint == &in_endpoint) {
+ current_endpoint = &out_endpoint;
+ } else {
+ current_endpoint = NULL;
+ }
+ }
+
+ if (current_endpoint) {
+ printf("ERROR: missing endpoint specification\n");
+ exit(1);
+ }
+
+ // data pump
+ NPT_Result result;
+
+ // allocate buffer
+ unsigned char* buffer;
+ buffer = (unsigned char*)malloc(packet_size);
+ if (buffer == NULL) {
+ printf("ERROR: out of memory\n");
+ exit(1);
+ }
+
+ // get output stream
+ NPT_OutputStreamReference out;
+ result = GetEndPointStreams(&out_endpoint, NULL, &out);
+ if (NPT_FAILED(result)) {
+ printf("ERROR: failed to get stream for output (%d)\n", result);
+ exit(1);
+ }
+
+ unsigned long offset = 0;
+ unsigned long total = 0;
+ if (in_endpoint.type == ENDPOINT_TYPE_UDP_SERVER ||
+ in_endpoint.type == ENDPOINT_TYPE_MULTICAST_SERVER) {
+ NPT_UdpSocket* udp_socket;
+ result = GetEndPointUdpSocket(&in_endpoint, udp_socket);
+ if (NPT_FAILED(result)) {
+ printf("ERROR: failed to create UDP socket (%d : %s)\n", result, NPT_ResultText(result));
+ exit(1);
+ }
+
+ // packet loop
+ NPT_DataBuffer packet(32768);
+ NPT_SocketAddress address;
+
+ do {
+ result = udp_socket->Receive(packet, &address);
+ if (NPT_SUCCEEDED(result)) {
+ if (Options.verbose) {
+ NPT_String ip = address.GetIpAddress().ToString();
+ printf("Received %d bytes from %s\n", (int)packet.GetDataSize(), ip.GetChars());
+ }
+ result = out->Write(packet.GetData(), packet.GetDataSize(), NULL);
+ offset += packet.GetDataSize();
+ total += packet.GetDataSize();
+ }
+ } while (NPT_SUCCEEDED(result));
+ } else {
+ // get the input stream
+ NPT_InputStreamReference in;
+ result = GetEndPointStreams(&in_endpoint, &in, NULL);
+ if (NPT_FAILED(result)) {
+ printf("ERROR: failed to get stream for input (%d : %s)\n", result, NPT_ResultText(result));
+ exit(1);
+ }
+
+ // stream loop
+ do {
+ NPT_Size bytes_read;
+ NPT_Size bytes_written;
+
+ // send
+ result = in->Read(buffer, packet_size, &bytes_read);
+ if (Options.show_progress) {
+ printf("[%d]\r", (int)total);
+ }
+ if (NPT_SUCCEEDED(result) && bytes_read) {
+ result = out->Write(buffer, bytes_read, &bytes_written);
+ if (Options.show_progress) {
+ printf("[%d]\r", (int)total);
+ }
+ offset += bytes_written;
+ total += bytes_written;
+ } else {
+ break;
+ }
+ } while (NPT_SUCCEEDED(result));
+ }
+
+ if (NPT_FAILED(result)) {
+ printf("[%d] *******************\n", result);
+ exit(1);
+ }
+
+ delete[] buffer;
+ return 0;
+}
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Apps/NetResolve/NetResolve.cpp b/lib/libUPnP/Neptune/Source/Apps/NetResolve/NetResolve.cpp
new file mode 100644
index 0000000..524df04
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/NetResolve/NetResolve.cpp
@@ -0,0 +1,77 @@
+/*****************************************************************
+|
+| Neptune Utilities - Network Resolver Example
+|
+| (c) 2001-2011 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(NPT_CONFIG_HAVE_STDLIB_H)
+#include <stdlib.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRING_H)
+#include <string.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STDIO_H)
+#include <stdio.h>
+#endif
+
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(void)
+{
+ fprintf(stderr,
+ "usage: NetResolve <hostname>\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // check command line
+ if (argc != 2) {
+ PrintUsageAndExit();
+ }
+
+ NPT_List<NPT_IpAddress> addresses;
+ NPT_Result result = NPT_NetworkNameResolver::Resolve(argv[1], addresses);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: resolver failed (%d)\n", result);
+ return 1;
+ }
+
+ printf("found %d addresses:\n", addresses.GetItemCount());
+ unsigned int i=0;
+ for (NPT_List<NPT_IpAddress>::Iterator address = addresses.GetFirstItem();
+ address;
+ ++address) {
+ NPT_String addr_str = (*address).ToString();
+ printf("[%02d] %s\n", i, addr_str.GetChars());
+ ++i;
+ }
+ return 0;
+}
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Apps/ZipHttpServer/ZipHttpServer.cpp b/lib/libUPnP/Neptune/Source/Apps/ZipHttpServer/ZipHttpServer.cpp
new file mode 100644
index 0000000..65343a1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/ZipHttpServer/ZipHttpServer.cpp
@@ -0,0 +1,534 @@
+/*****************************************************************
+|
+| Virtual ZIP file HTTP Server
+|
+| (c) 2001-2014 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.ziphttpserver")
+
+/*----------------------------------------------------------------------
+| GetContentType
++---------------------------------------------------------------------*/
+struct FileTypeMapEntry {
+ const char* extension;
+ const char* mime_type;
+};
+static const FileTypeMapEntry
+DefaultFileTypeMap[] = {
+ {"xml", "text/xml" },
+ {"htm", "text/html" },
+ {"html", "text/html" },
+ {"c", "text/plain"},
+ {"h", "text/plain"},
+ {"txt", "text/plain"},
+ {"css", "text/css" },
+ {"gif", "image/gif" },
+ {"thm", "image/jpeg"},
+ {"png", "image/png"},
+ {"tif", "image/tiff"},
+ {"tiff", "image/tiff"},
+ {"jpg", "image/jpeg"},
+ {"jpeg", "image/jpeg"},
+ {"jpe", "image/jpeg"},
+ {"jp2", "image/jp2" },
+ {"png", "image/png" },
+ {"bmp", "image/bmp" },
+ {"aif", "audio/x-aiff"},
+ {"aifc", "audio/x-aiff"},
+ {"aiff", "audio/x-aiff"},
+ {"mpa", "audio/mpeg"},
+ {"mp2", "audio/mpeg"},
+ {"mp3", "audio/mpeg"},
+ {"m4a", "audio/mp4"},
+ {"wma", "audio/x-ms-wma"},
+ {"wav", "audio/x-wav"},
+ {"mpeg", "video/mpeg"},
+ {"mpg", "video/mpeg"},
+ {"mp4", "video/mp4"},
+ {"m4v", "video/mp4"},
+ {"m4f", "video/mp4"},
+ {"m4s", "video/mp4"},
+ {"ts", "video/MP2T"}, // RFC 3555
+ {"mov", "video/quicktime"},
+ {"wmv", "video/x-ms-wmv"},
+ {"asf", "video/x-ms-asf"},
+ {"avi", "video/x-msvideo"},
+ {"divx", "video/x-msvideo"},
+ {"xvid", "video/x-msvideo"},
+ {"doc", "application/msword"},
+ {"js", "application/javascript"},
+ {"m3u8", "application/x-mpegURL"},
+ {"pdf", "application/pdf"},
+ {"ps", "application/postscript"},
+ {"eps", "application/postscript"},
+ {"zip", "application/zip"},
+ {"mpd", "application/dash+xml"}
+};
+
+NPT_Map<NPT_String, NPT_String> FileTypeMap;
+
+static const char*
+GetContentType(const NPT_String& filename)
+{
+ int last_dot = filename.ReverseFind('.');
+ if (last_dot > 0) {
+ NPT_String extension = filename.GetChars()+last_dot+1;
+ extension.MakeLowercase();
+
+ NPT_String* mime_type;
+ if (NPT_SUCCEEDED(FileTypeMap.Get(extension, mime_type))) {
+ return mime_type->GetChars();
+ }
+ }
+
+ return "application/octet-stream";
+}
+
+/*----------------------------------------------------------------------
+| ZipRequestHandler
++---------------------------------------------------------------------*/
+class ZipRequestHandler : public NPT_HttpRequestHandler
+{
+public:
+ // constructors
+ ZipRequestHandler(const char* url_root,
+ const char* file_root) :
+ m_UrlRoot(url_root),
+ m_FileRoot(file_root) {}
+
+ // NPT_HttpRequestHandler methods
+ virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+private:
+ NPT_String m_UrlRoot;
+ NPT_String m_FileRoot;
+};
+
+/*----------------------------------------------------------------------
+| ZipRequestHandler::SetupResponse
++---------------------------------------------------------------------*/
+NPT_Result
+ZipRequestHandler::SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& response)
+{
+ NPT_HttpEntity* entity = response.GetEntity();
+ if (entity == NULL) return NPT_ERROR_INVALID_STATE;
+
+ // check the method
+ if (request.GetMethod() != NPT_HTTP_METHOD_GET &&
+ request.GetMethod() != NPT_HTTP_METHOD_HEAD) {
+ response.SetStatus(405, "Method Not Allowed");
+ return NPT_SUCCESS;
+ }
+
+ // set some default headers
+ response.GetHeaders().SetHeader(NPT_HTTP_HEADER_ACCEPT_RANGES, "bytes");
+
+ // declare HTTP/1.1 if the client asked for it
+ if (request.GetProtocol() == NPT_HTTP_PROTOCOL_1_1) {
+ response.SetProtocol(NPT_HTTP_PROTOCOL_1_1);
+ }
+
+ // default status
+ response.SetStatus(404, "Not Found");
+
+ // check that the request's path is an entry under the url root
+ if (!request.GetUrl().GetPath().StartsWith(m_UrlRoot)) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // compute the path relative to the URL root
+ NPT_String relative_path = NPT_Url::PercentDecode(request.GetUrl().GetPath().GetChars()+m_UrlRoot.GetLength());
+
+ // check that there is no '..' in the path, for security reasons
+ if (relative_path.Find("..") >= 0) {
+ NPT_LOG_INFO(".. in path is not supported");
+ return NPT_SUCCESS;
+ }
+ // check that the path does not end with a /
+ if (relative_path.EndsWith("/")) {
+ NPT_LOG_INFO("skipping paths that end in /");
+ return NPT_SUCCESS;
+ }
+ NPT_List<NPT_String> path_parts = relative_path.Split("/");
+
+ // walk down the path until we find a file
+ NPT_String path = m_FileRoot;
+ NPT_String subpath;
+ NPT_List<NPT_String>::Iterator fragment = path_parts.GetFirstItem();
+ bool anchor_found = false;
+ bool is_zip = false;
+ for (; fragment; ++fragment) {
+ if (!anchor_found) {
+ path += '/';
+ path += *fragment;
+
+ // get info about the file
+ NPT_FileInfo info;
+ NPT_File::GetInfo(path, &info);
+ if (info.m_Type == NPT_FileInfo::FILE_TYPE_DIRECTORY) {
+ continue;
+ } else if (info.m_Type == NPT_FileInfo::FILE_TYPE_REGULAR) {
+ anchor_found = true;
+ if (path.EndsWith(".zip", true)) {
+ // this is a zip file
+ is_zip = true;
+ }
+ } else {
+ return NPT_SUCCESS;
+ }
+ } else {
+ if (!subpath.IsEmpty()) {
+ subpath += '/';
+ }
+ subpath += *fragment;
+ }
+ }
+ NPT_LOG_FINE_3("is_zip=%d, path=%s, subpath=%s", (int)is_zip, path.GetChars(), subpath.GetChars());
+
+ // return now if no anchor was found
+ if (!anchor_found) {
+ return NPT_SUCCESS;
+ }
+
+ // deal with regular files
+ if (!is_zip) {
+ if (subpath.IsEmpty()) {
+ // open the file
+ NPT_File file(path);
+ NPT_Result result = file.Open(NPT_FILE_OPEN_MODE_READ);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE("file not found");
+ return NPT_SUCCESS;
+ }
+ NPT_InputStreamReference file_stream;
+ file.GetInputStream(file_stream);
+ entity->SetInputStream(file_stream, true);
+ entity->SetContentType(GetContentType(path));
+ response.SetStatus(200, "OK");
+ }
+ return NPT_SUCCESS;
+ }
+
+ // load the zip file
+ NPT_File file(path);
+ NPT_Result result = file.Open(NPT_FILE_OPEN_MODE_READ);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("failed to open file (%d)", result);
+ return result;
+ }
+ NPT_InputStreamReference zip_stream;
+ file.GetInputStream(zip_stream);
+ NPT_ZipFile* zip_file = NULL;
+ result = NPT_ZipFile::Parse(*zip_stream, zip_file);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("failed to parse zip file (%d)", result);
+ return result;
+ }
+
+ // look for the entry in the zip file
+ for (unsigned int i=0; i<zip_file->GetEntries().GetItemCount(); i++) {
+ NPT_ZipFile::Entry& entry = zip_file->GetEntries()[i];
+ if (subpath == entry.m_Name) {
+ // send the file
+ NPT_InputStream* file_stream = NULL;
+ result = NPT_ZipFile::GetInputStream(entry, zip_stream, file_stream);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("failed to get the file stream (%d)", result);
+ delete zip_file;
+ return result;
+ }
+ NPT_InputStreamReference file_stream_ref(file_stream);
+ entity->SetInputStream(file_stream_ref, true);
+ entity->SetContentType(GetContentType(subpath));
+ response.SetStatus(200, "OK");
+ break;
+ }
+ }
+
+ delete zip_file;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| ZipHttpWorker
++---------------------------------------------------------------------*/
+class ZipHttpServer;
+class ZipHttpWorker : public NPT_Thread {
+public:
+ // types
+ enum {
+ IDLE,
+ RUNNING,
+ DEAD
+ } State;
+
+ // constructor
+ ZipHttpWorker(unsigned int id, ZipHttpServer* server) :
+ m_Id(id),
+ m_Server(server),
+ m_State(IDLE),
+ m_Verbose(false) {}
+
+ // NPT_Runnable methods
+ virtual void Run();
+ NPT_Result Respond();
+
+ // members
+ unsigned int m_Id;
+ ZipHttpServer* m_Server;
+ NPT_SharedVariable m_State;
+ NPT_InputStreamReference m_InputStream;
+ NPT_OutputStreamReference m_OutputStream;
+ NPT_HttpRequestContext m_Context;
+ bool m_Verbose;
+};
+
+/*----------------------------------------------------------------------
+| ZipHttpServer
++---------------------------------------------------------------------*/
+class ZipHttpServer : public NPT_HttpServer {
+public:
+ ZipHttpServer(const char* file_root,
+ const char* url_root,
+ unsigned int port,
+ unsigned int threads);
+
+ void Loop();
+ void OnWorkerDone(ZipHttpWorker* worker);
+
+private:
+ NPT_Mutex m_Lock;
+ unsigned int m_Threads;
+ ZipRequestHandler* m_Handler;
+ NPT_List<ZipHttpWorker*> m_Workers;
+ NPT_List<ZipHttpWorker*> m_ReadyWorkers;
+ NPT_SharedVariable m_AllWorkersBusy;
+};
+
+/*----------------------------------------------------------------------
+| ZipHttpServer::ZipHttpServer
++---------------------------------------------------------------------*/
+ZipHttpServer::ZipHttpServer(const char* file_root,
+ const char* url_root,
+ unsigned int port,
+ unsigned int threads) :
+ NPT_HttpServer(port),
+ m_Threads(threads),
+ m_AllWorkersBusy(0)
+{
+ m_Handler = new ZipRequestHandler(url_root, file_root);
+ AddRequestHandler(m_Handler, url_root, true);
+
+ for (unsigned int i=0; i<threads; i++) {
+ ZipHttpWorker* worker = new ZipHttpWorker(i, this);
+ m_Workers.Add(worker);
+ m_ReadyWorkers.Add(worker);
+
+ // start threads unless we're single threaded
+ if (threads > 1) {
+ worker->Start();
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| ZipHttpServer::Loop
++---------------------------------------------------------------------*/
+void
+ZipHttpServer::Loop()
+{
+ for (;;) {
+ // wait until at least one worker is ready
+ if (m_AllWorkersBusy.GetValue() == 1) {
+ NPT_LOG_FINEST("all workers busy");
+ }
+ NPT_LOG_FINEST("waiting for a worker");
+ m_AllWorkersBusy.WaitUntilEquals(0);
+ NPT_LOG_FINEST("got a worker");
+
+ // pick a worker
+ m_Lock.Lock();
+ ZipHttpWorker* worker = NULL;
+ m_ReadyWorkers.PopHead(worker);
+ if (m_ReadyWorkers.GetItemCount() == 0) {
+ m_AllWorkersBusy.SetValue(1);
+ }
+ m_Lock.Unlock();
+
+ NPT_Result result = WaitForNewClient(worker->m_InputStream, worker->m_OutputStream, &worker->m_Context);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("WaitForNewClient returned %d", result);
+
+ // wait a bit before continuing
+ NPT_System::Sleep(NPT_TimeInterval(1.0));
+ }
+
+ if (m_Threads == 1) {
+ // single threaded
+ worker->Respond();
+ OnWorkerDone(worker);
+ } else {
+ worker->m_State.SetValue(ZipHttpWorker::RUNNING);
+ }
+ worker = NULL;
+ }
+
+}
+
+/*----------------------------------------------------------------------
+| ZipHttpWorker::OnWorkerDone
++---------------------------------------------------------------------*/
+void
+ZipHttpServer::OnWorkerDone(ZipHttpWorker* worker)
+{
+ NPT_LOG_FINEST_1("worker %d done", worker->m_Id);
+ m_Lock.Lock();
+ m_ReadyWorkers.Add(worker);
+ m_AllWorkersBusy.SetValue(0);
+ m_Lock.Unlock();
+}
+
+/*----------------------------------------------------------------------
+| ZipHttpWorker::Run
++---------------------------------------------------------------------*/
+void
+ZipHttpWorker::Run(void)
+{
+ NPT_LOG_FINE_1("worker %d started", m_Id);
+ for (;;) {
+ // wait while we're idle
+ NPT_LOG_FINER_1("worker %d waiting for work", m_Id);
+ m_State.WaitWhileEquals(IDLE);
+
+ NPT_LOG_FINER_1("worker %d woke up", m_Id);
+
+ if (m_State.GetValue() == DEAD) {
+ NPT_LOG_FINE_1("worker %d exiting", m_Id);
+ return;
+ }
+
+ // respond to the client
+ Respond();
+
+ // update our state
+ m_State.SetValue(IDLE);
+
+ // notify the server
+ m_Server->OnWorkerDone(this);
+ }
+}
+
+/*----------------------------------------------------------------------
+| ZipHttpWorker::Respond
++---------------------------------------------------------------------*/
+NPT_Result
+ZipHttpWorker::Respond()
+{
+ NPT_LOG_FINER_1("worker %d responding to request", m_Id);
+
+ NPT_Result result = m_Server->RespondToClient(m_InputStream, m_OutputStream, m_Context);
+
+ NPT_LOG_FINER_2("worker %d responded to request (%d)", m_Id, result);
+
+ m_InputStream = NULL;
+ m_OutputStream = NULL;
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** argv)
+{
+ NPT_String file_root;
+ NPT_String url_root = "/";
+ unsigned int port = 8000;
+ unsigned int threads = 5;
+ bool verbose = false;
+
+ while (const char* arg = *++argv) {
+ if (NPT_StringsEqual(arg, "--help") ||
+ NPT_StringsEqual(arg, "-h")) {
+ NPT_Console::Output("usage: ziphttpserver [--file-root <dir>] [--url-root <path>] [--port <port>] [--threads <n>] [--verbose]\n");
+ return 0;
+ } else if (NPT_StringsEqual(arg, "--file-root")) {
+ arg = *++argv;
+ if (arg == NULL) {
+ NPT_Console::Output("ERROR: missing argument for --file-root option\n");
+ return 1;
+ }
+ file_root = arg;
+ } else if (NPT_StringsEqual(arg, "--url-root")) {
+ arg = *++argv;
+ if (arg == NULL) {
+ NPT_Console::Output("ERROR: missing argument for --url-root option\n");
+ return 1;
+ }
+ url_root = arg;
+ } else if (NPT_StringsEqual(arg, "--port")) {
+ arg = *++argv;
+ if (arg == NULL) {
+ NPT_Console::Output("ERROR: missing argument for --port option\n");
+ return 1;
+ }
+ NPT_ParseInteger(arg, port, true);
+ } else if (NPT_StringsEqual(arg, "--threads")) {
+ arg = *++argv;
+ if (arg == NULL) {
+ NPT_Console::Output("ERROR: missing argument for --threads option\n");
+ return 1;
+ }
+ NPT_ParseInteger(arg, threads, true);
+ } else if (NPT_StringsEqual(arg, "--verbose")) {
+ verbose = true;
+ }
+ }
+
+ // sanity check on some parameters
+ if (threads == 0 || threads > 20) {
+ fprintf(stderr, "ERROR: --threads must be between 1 and 20");
+ return 1;
+ }
+
+ // ensure the URL root start with a /
+ if (!url_root.StartsWith("/")) {
+ url_root = "/"+url_root;
+ }
+
+ // initialize the file type map
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(DefaultFileTypeMap); i++) {
+ FileTypeMap[DefaultFileTypeMap[i].extension] =DefaultFileTypeMap[i].mime_type;
+ }
+
+ if (file_root.GetLength() == 0) {
+ NPT_File::GetWorkingDir(file_root);
+ }
+
+ if (verbose) {
+ NPT_Console::OutputF("Starting server on port %d, file-root=%s, url-root=%s, threads=%d\n",
+ port, file_root.GetChars(), url_root.GetChars(), threads);
+ }
+
+ ZipHttpServer* server = new ZipHttpServer(file_root, url_root, port, threads);
+ server->Loop();
+ delete server;
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/Neptune.cpp b/lib/libUPnP/Neptune/Source/Core/Neptune.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/Neptune.cpp
diff --git a/lib/libUPnP/Neptune/Source/Core/Neptune.h b/lib/libUPnP/Neptune/Source/Core/Neptune.h
new file mode 100644
index 0000000..8ea4fa1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/Neptune.h
@@ -0,0 +1,86 @@
+/*****************************************************************
+|
+| Neptune - Toplevel Include
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NEPTUNE_H_
+#define _NEPTUNE_H_
+
+/*----------------------------------------------------------------------
+| flags
++---------------------------------------------------------------------*/
+#define NPT_EXTERNAL_USE /* do not expose internal definitions */
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptCommon.h"
+#include "NptResults.h"
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptReferences.h"
+#include "NptStreams.h"
+#include "NptBufferedStreams.h"
+#include "NptFile.h"
+#include "NptNetwork.h"
+#include "NptSockets.h"
+#include "NptTime.h"
+#include "NptThreads.h"
+#include "NptSystem.h"
+#include "NptMessaging.h"
+#include "NptQueue.h"
+#include "NptSimpleMessageQueue.h"
+#include "NptSelectableMessageQueue.h"
+#include "NptXml.h"
+#include "NptStrings.h"
+#include "NptArray.h"
+#include "NptList.h"
+#include "NptMap.h"
+#include "NptStack.h"
+#include "NptUri.h"
+#include "NptHttp.h"
+#include "NptDataBuffer.h"
+#include "NptUtils.h"
+#include "NptRingBuffer.h"
+#include "NptBase64.h"
+#include "NptConsole.h"
+#include "NptLogging.h"
+#include "NptSerialPort.h"
+#include "NptVersion.h"
+#include "NptDynamicLibraries.h"
+#include "NptDynamicCast.h"
+#include "NptDigest.h"
+#include "NptCrypto.h"
+
+// optional modules
+#include "NptZip.h"
+#include "NptTls.h"
+
+#endif // _NEPTUNE_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptArray.h b/lib/libUPnP/Neptune/Source/Core/NptArray.h
new file mode 100644
index 0000000..721bac8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptArray.h
@@ -0,0 +1,522 @@
+/*****************************************************************
+|
+| Neptune - Arrays
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+#ifndef _NPT_ARRAY_H_
+#define _NPT_ARRAY_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#if defined(NPT_CONFIG_HAVE_NEW_H)
+#include <new>
+#endif
+#include "NptTypes.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ARRAY_INITIAL_MAX_SIZE = 128; // bytes
+
+/*----------------------------------------------------------------------
+| NPT_Array
++---------------------------------------------------------------------*/
+template <typename T>
+class NPT_Array
+{
+public:
+ // types
+ typedef T Element;
+ typedef T* Iterator;
+
+ // methods
+ NPT_Array<T>(): m_Capacity(0), m_ItemCount(0), m_Items(0) {}
+ explicit NPT_Array<T>(NPT_Cardinal count);
+ NPT_Array<T>(NPT_Cardinal count, const T& item);
+ NPT_Array<T>(const T* items, NPT_Cardinal item_count);
+ ~NPT_Array<T>();
+ NPT_Array<T>(const NPT_Array<T>& copy);
+ NPT_Array<T>& operator=(const NPT_Array<T>& copy);
+ bool operator==(const NPT_Array<T>& other) const;
+ bool operator!=(const NPT_Array<T>& other) const;
+ NPT_Cardinal GetItemCount() const { return m_ItemCount; }
+ NPT_Result Add(const T& item);
+ T& operator[](NPT_Ordinal pos) { return m_Items[pos]; }
+ const T& operator[](NPT_Ordinal pos) const { return m_Items[pos]; }
+ NPT_Result Erase(Iterator which);
+ NPT_Result Erase(NPT_Ordinal which) { return Erase(&m_Items[which]); }
+ NPT_Result Erase(Iterator first, Iterator last);
+ NPT_Result Erase(NPT_Ordinal first, NPT_Ordinal last) { return Erase(&m_Items[first], &m_Items[last]); }
+ NPT_Result Insert(Iterator where, const T& item, NPT_Cardinal count = 1);
+ NPT_Result Reserve(NPT_Cardinal count);
+ NPT_Cardinal GetCapacity() const { return m_Capacity; }
+ NPT_Result Resize(NPT_Cardinal count);
+ NPT_Result Resize(NPT_Cardinal count, const T& fill);
+ NPT_Result Clear();
+ bool Contains(const T& data) const;
+ Iterator GetFirstItem() const { return m_ItemCount?&m_Items[0]:NULL; }
+ Iterator GetLastItem() const { return m_ItemCount?&m_Items[m_ItemCount-1]:NULL; }
+ Iterator GetItem(NPT_Ordinal n) { return n<m_ItemCount?&m_Items[n]:NULL; }
+
+ // template list operations
+ // keep these template members defined here because MSV6 does not let
+ // us define them later
+ template <typename X>
+ NPT_Result Apply(const X& function) const
+ {
+ for (unsigned int i=0; i<m_ItemCount; i++) function(m_Items[i]);
+ return NPT_SUCCESS;
+ }
+
+ template <typename X, typename P>
+ NPT_Result ApplyUntil(const X& function, const P& predicate, bool* match = NULL) const
+ {
+ for (unsigned int i=0; i<m_ItemCount; i++) {
+ NPT_Result return_value;
+ if (predicate(function(m_Items[i]), return_value)) {
+ if (match) *match = true;
+ return return_value;
+ }
+ }
+ if (match) *match = false;
+ return NPT_SUCCESS;
+ }
+
+ template <typename X>
+ T* Find(const X& predicate, NPT_Ordinal n=0, NPT_Ordinal* pos = NULL) const
+ {
+ if (pos) *pos = -1;
+
+ for (unsigned int i=0; i<m_ItemCount; i++) {
+ if (predicate(m_Items[i])) {
+ if (pos) *pos = i;
+ if (n == 0) return &m_Items[i];
+ --n;
+ }
+ }
+ return NULL;
+ }
+
+protected:
+ // methods
+ T* Allocate(NPT_Cardinal count, NPT_Cardinal& allocated);
+
+ // members
+ NPT_Cardinal m_Capacity;
+ NPT_Cardinal m_ItemCount;
+ T* m_Items;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::NPT_Array<T>
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_Array<T>::NPT_Array(NPT_Cardinal count) :
+ m_Capacity(0),
+ m_ItemCount(0),
+ m_Items(0)
+{
+ Reserve(count);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::NPT_Array<T>
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_Array<T>::NPT_Array(const NPT_Array<T>& copy) :
+ m_Capacity(0),
+ m_ItemCount(0),
+ m_Items(0)
+{
+ Reserve(copy.GetItemCount());
+ for (NPT_Ordinal i=0; i<copy.m_ItemCount; i++) {
+ new ((void*)&m_Items[i]) T(copy.m_Items[i]);
+ }
+ m_ItemCount = copy.m_ItemCount;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::NPT_Array<T>
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_Array<T>::NPT_Array(NPT_Cardinal count, const T& item) :
+ m_Capacity(0),
+ m_ItemCount(count),
+ m_Items(0)
+{
+ Reserve(count);
+ for (NPT_Ordinal i=0; i<count; i++) {
+ new ((void*)&m_Items[i]) T(item);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::NPT_Array<T>
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_Array<T>::NPT_Array(const T* items, NPT_Cardinal item_count) :
+ m_Capacity(0),
+ m_ItemCount(item_count),
+ m_Items(0)
+{
+ Reserve(item_count);
+ for (NPT_Ordinal i=0; i<item_count; i++) {
+ new ((void*)&m_Items[i]) T(items[i]);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::~NPT_Array<T>
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_Array<T>::~NPT_Array()
+{
+ // remove all items
+ Clear();
+
+ // free the memory
+ ::operator delete((void*)m_Items);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::operator=
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Array<T>&
+NPT_Array<T>::operator=(const NPT_Array<T>& copy)
+{
+ // do nothing if we're assigning to ourselves
+ if (this == &copy) return *this;
+
+ // destroy all elements
+ Clear();
+
+ // copy all elements from the other object
+ Reserve(copy.GetItemCount());
+ m_ItemCount = copy.m_ItemCount;
+ for (NPT_Ordinal i=0; i<copy.m_ItemCount; i++) {
+ new ((void*)&m_Items[i]) T(copy.m_Items[i]);
+ }
+
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Clear
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_Array<T>::Clear()
+{
+ // destroy all items
+ for (NPT_Ordinal i=0; i<m_ItemCount; i++) {
+ m_Items[i].~T();
+ }
+
+ m_ItemCount = 0;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Allocate
++---------------------------------------------------------------------*/
+template <typename T>
+T*
+NPT_Array<T>::Allocate(NPT_Cardinal count, NPT_Cardinal& allocated)
+{
+ if (m_Capacity) {
+ allocated = 2*m_Capacity;
+ } else {
+ // start with just enough elements to fill
+ // NPT_ARRAY_INITIAL_MAX_SIZE worth of memory
+ allocated = NPT_ARRAY_INITIAL_MAX_SIZE/sizeof(T);
+ if (allocated == 0) allocated = 1;
+ }
+ if (allocated < count) allocated = count;
+
+ // allocate the items
+ return (T*)::operator new(allocated*sizeof(T));
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Reserve
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_Array<T>::Reserve(NPT_Cardinal count)
+{
+ if (count <= m_Capacity) return NPT_SUCCESS;
+
+ // (re)allocate the items
+ NPT_Cardinal new_capacity;
+ T* new_items = Allocate(count, new_capacity);
+ if (new_items == NULL) {
+ return NPT_ERROR_OUT_OF_MEMORY;
+ }
+ if (m_ItemCount && m_Items) {
+ for (unsigned int i=0; i<m_ItemCount; i++) {
+ // construct the copy
+ new ((void*)&new_items[i])T(m_Items[i]);
+
+ // destroy the item
+ m_Items[i].~T();
+ }
+ }
+ ::operator delete((void*)m_Items);
+ m_Items = new_items;
+ m_Capacity = new_capacity;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Add
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_Result
+NPT_Array<T>::Add(const T& item)
+{
+ // ensure capacity
+ NPT_Result result = Reserve(m_ItemCount+1);
+ if (result != NPT_SUCCESS) return result;
+
+ // store the item
+ new ((void*)&m_Items[m_ItemCount++]) T(item);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Erase
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_Result
+NPT_Array<T>::Erase(Iterator which)
+{
+ return Erase(which, which);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Erase
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_Array<T>::Erase(Iterator first, Iterator last)
+{
+ // check parameters
+ if (first == NULL || last == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // check the bounds
+ NPT_Ordinal first_index = (NPT_Ordinal)(NPT_POINTER_TO_LONG(first-m_Items));
+ NPT_Ordinal last_index = (NPT_Ordinal)(NPT_POINTER_TO_LONG(last-m_Items));
+ if (first_index >= m_ItemCount ||
+ last_index >= m_ItemCount ||
+ first_index > last_index) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // shift items to the left
+ NPT_Cardinal interval = last_index-first_index+1;
+ NPT_Cardinal shifted = m_ItemCount-last_index-1;
+ for (NPT_Ordinal i=first_index; i<first_index+shifted; i++) {
+ m_Items[i] = m_Items[i+interval];
+ }
+
+ // destruct the remaining items
+ for (NPT_Ordinal i=first_index+shifted; i<m_ItemCount; i++) {
+ m_Items[i].~T();
+ }
+
+ // update the item count
+ m_ItemCount -= interval;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Insert
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_Array<T>::Insert(Iterator where, const T& item, NPT_Cardinal repeat)
+{
+ // check bounds
+ NPT_Ordinal where_index = where?((NPT_Ordinal)NPT_POINTER_TO_LONG(where-m_Items)):m_ItemCount;
+ if (where > &m_Items[m_ItemCount] || repeat == 0) return NPT_ERROR_INVALID_PARAMETERS;
+
+ NPT_Cardinal needed = m_ItemCount+repeat;
+ if (needed > m_Capacity) {
+ // allocate more memory
+ NPT_Cardinal new_capacity;
+ T* new_items = Allocate(needed, new_capacity);
+ if (new_items == NULL) return NPT_ERROR_OUT_OF_MEMORY;
+ m_Capacity = new_capacity;
+
+ // move the items before the insertion point
+ for (NPT_Ordinal i=0; i<where_index; i++) {
+ new((void*)&new_items[i])T(m_Items[i]);
+ m_Items[i].~T();
+ }
+
+ // move the items after the insertion point
+ for (NPT_Ordinal i=where_index; i<m_ItemCount; i++) {
+ new((void*)&new_items[i+repeat])T(m_Items[i]);
+ m_Items[i].~T();
+ }
+
+ // use the new items instead of the current ones
+ ::operator delete((void*)m_Items);
+ m_Items = new_items;
+ } else {
+ // shift items after the insertion point to the right
+ for (NPT_Ordinal i=m_ItemCount; i>where_index; i--) {
+ new((void*)&m_Items[i+repeat-1])T(m_Items[i-1]);
+ m_Items[i-1].~T();
+ }
+ }
+
+ // insert the new items
+ for (NPT_Cardinal i=where_index; i<where_index+repeat; i++) {
+ new((void*)&m_Items[i])T(item);
+ }
+
+ // update the item count
+ m_ItemCount += repeat;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Resize
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_Array<T>::Resize(NPT_Cardinal size)
+{
+ if (size < m_ItemCount) {
+ // shrink
+ for (NPT_Ordinal i=size; i<m_ItemCount; i++) {
+ m_Items[i].~T();
+ }
+ m_ItemCount = size;
+ } else if (size > m_ItemCount) {
+ return Resize(size, T());
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Resize
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_Array<T>::Resize(NPT_Cardinal size, const T& fill)
+{
+ if (size < m_ItemCount) {
+ return Resize(size);
+ } else if (size > m_ItemCount) {
+ Reserve(size);
+ for (NPT_Ordinal i=m_ItemCount; i<size; i++) {
+ new ((void*)&m_Items[i]) T(fill);
+ }
+ m_ItemCount = size;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::Contains
++---------------------------------------------------------------------*/
+template <typename T>
+bool
+NPT_Array<T>::Contains(const T& data) const
+{
+ for (NPT_Ordinal i=0; i<m_ItemCount; i++) {
+ if (m_Items[i] == data) return true;
+ }
+
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::operator==
++---------------------------------------------------------------------*/
+template <typename T>
+bool
+NPT_Array<T>::operator==(const NPT_Array<T>& other) const
+{
+ // we need the same number of items
+ if (other.m_ItemCount != m_ItemCount) return false;
+
+ // compare all items
+ for (NPT_Ordinal i=0; i<m_ItemCount; i++) {
+ if (!(m_Items[i] == other.m_Items[i])) return false;
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Array<T>::operator!=
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+bool
+NPT_Array<T>::operator!=(const NPT_Array<T>& other) const
+{
+ return !(*this == other);
+}
+
+#endif // _NPT_ARRAY_H_
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptAutomaticCleaner.cpp b/lib/libUPnP/Neptune/Source/Core/NptAutomaticCleaner.cpp
new file mode 100644
index 0000000..9f677e4
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptAutomaticCleaner.cpp
@@ -0,0 +1,101 @@
+/*****************************************************************
+|
+| Neptune - Automatic Cleaner
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptAutomaticCleaner.h"
+#include "NptThreads.h"
+
+/*----------------------------------------------------------------------
+| NPT_AutomaticCleaner::NPT_AutomaticCleaner
++---------------------------------------------------------------------*/
+NPT_AutomaticCleaner::NPT_AutomaticCleaner() :
+ m_TlsContext(NULL),
+ m_HttpConnectionManager(NULL)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_AutomaticCleaner::~NPT_AutomaticCleaner
++---------------------------------------------------------------------*/
+NPT_AutomaticCleaner::~NPT_AutomaticCleaner()
+{
+ // When using TLS, the order to destroy singletons is important as
+ // connections may still need the TLS context up until they're
+ // cleaned up
+ delete m_HttpConnectionManager;
+ delete m_TlsContext;
+
+ // Finally we can destroy the rest such as the NPT_HttpClient::ConnectionCanceller
+ m_Singletons.Apply(NPT_ObjectDeleter<Singleton>());
+}
+
+/*----------------------------------------------------------------------
+| NPT_AutomaticCleaner::GetInstance
++---------------------------------------------------------------------*/
+NPT_AutomaticCleaner*
+NPT_AutomaticCleaner::GetInstance()
+{
+ return &Instance;
+}
+NPT_AutomaticCleaner NPT_AutomaticCleaner::Instance;
+
+/*----------------------------------------------------------------------
+| NPT_AutomaticCleaner::RegisterTlsContext
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AutomaticCleaner::RegisterTlsContext(Singleton* singleton)
+{
+ m_TlsContext = singleton;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AutomaticCleaner::RegisterHttpConnectionManager
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AutomaticCleaner::RegisterHttpConnectionManager(Singleton* singleton)
+{
+ m_HttpConnectionManager = singleton;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AutomaticCleaner::Register
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AutomaticCleaner::Register(Singleton *singleton)
+{
+ // Prevent double insertion
+ m_Singletons.Remove(singleton);
+ return m_Singletons.Insert(m_Singletons.GetFirstItem(), singleton);
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptAutomaticCleaner.h b/lib/libUPnP/Neptune/Source/Core/NptAutomaticCleaner.h
new file mode 100644
index 0000000..21ff7c0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptAutomaticCleaner.h
@@ -0,0 +1,74 @@
+/*****************************************************************
+|
+| Neptune - Automatic Cleaner
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+#ifndef _NPT_AUTOMATIC_CLEANER_H_
+#define _NPT_AUTOMATIC_CLEANER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptList.h"
+
+/*----------------------------------------------------------------------
+| NPT_AutomaticCleaner
++---------------------------------------------------------------------*/
+class NPT_AutomaticCleaner
+{
+public:
+ class Singleton {
+ public:
+ virtual ~Singleton() {}
+ };
+
+ static NPT_AutomaticCleaner* GetInstance();
+
+ // destructor
+ ~NPT_AutomaticCleaner();
+
+ // methods
+ NPT_Result Register(Singleton* singleton);
+ NPT_Result RegisterTlsContext(Singleton* singleton);
+ NPT_Result RegisterHttpConnectionManager(Singleton* singleton);
+
+private:
+ // class members
+ static NPT_AutomaticCleaner Instance;
+
+ // constructor
+ NPT_AutomaticCleaner();
+
+ // members
+ NPT_List<Singleton*> m_Singletons;
+ Singleton* m_TlsContext;
+ Singleton* m_HttpConnectionManager;
+};
+
+#endif // _NPT_AUTOMATIC_CLEANER_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptAutoreleasePool.h b/lib/libUPnP/Neptune/Source/Core/NptAutoreleasePool.h
new file mode 100644
index 0000000..6f704f7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptAutoreleasePool.h
@@ -0,0 +1,57 @@
+/*****************************************************************
+|
+| Neptune - AutoreleasePool
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_AUTORELEASE_POOL_H_
+#define _NPT_AUTORELEASE_POOL_H_
+
+/*----------------------------------------------------------------------
+| NPT_AutoreleasePoolInterface
++---------------------------------------------------------------------*/
+class NPT_AutoreleasePoolInterface
+{
+public:
+ virtual ~NPT_AutoreleasePoolInterface() {}
+};
+
+/*----------------------------------------------------------------------
+| NPT_AutoreleasePool
++---------------------------------------------------------------------*/
+class NPT_AutoreleasePool : public NPT_AutoreleasePoolInterface
+{
+public:
+ NPT_AutoreleasePool();
+ ~NPT_AutoreleasePool() override;
+
+private:
+ NPT_AutoreleasePoolInterface* m_Delegate;
+};
+
+#endif // _NPT_AUTORELEASE_POOL_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptBase64.cpp b/lib/libUPnP/Neptune/Source/Core/NptBase64.cpp
new file mode 100644
index 0000000..b5ecc25
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptBase64.cpp
@@ -0,0 +1,194 @@
+/*****************************************************************
+|
+| Neptune - Base64
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptBase64.h"
+#include "NptUtils.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+static const signed char NPT_Base64_Bytes[128] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0x3E, -1, -1, -1, 0x3F,
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, -1, -1, -1, 0x7F, -1, -1,
+ -1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
+ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, -1, -1, -1, -1, -1,
+ -1, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
+ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, -1, -1, -1, -1, -1
+};
+
+static const char NPT_Base64_Chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+const char NPT_BASE64_PAD_CHAR = '=';
+const char NPT_BASE64_PAD_BYTE = 0x7F;
+
+/*----------------------------------------------------------------------
+| NPT_Base64::Decode
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Base64::Decode(const char* base64,
+ NPT_Size size,
+ NPT_DataBuffer& data,
+ bool url_safe /* = false */)
+{
+ // estimate the data size
+ data.SetBufferSize(size);
+
+ // reset the buffer
+ data.SetDataSize(0);
+
+ // keep a pointer to the buffer
+ unsigned char* buffer = data.UseData();
+ NPT_Size data_size = 0;
+
+ // iterate over all characters
+ unsigned char codes[4];
+ unsigned int code_count = 0;
+ while (size--) {
+ unsigned char c = *base64++;
+ if (c >= NPT_ARRAY_SIZE(NPT_Base64_Bytes)) continue;
+ if (url_safe) {
+ // remap some characters and forbid the mapped variants
+ if (c == '-') {
+ c = '+';
+ } else if (c == '_') {
+ c = '/';
+ } else if (c == '+' || c == '/') {
+ c = 0; // will be ignored later
+ }
+ }
+ signed char code = NPT_Base64_Bytes[c];
+ if (code >= 0) {
+ // valid code
+ codes[code_count++] = code;
+ if (code_count == 4) {
+ // group complete
+ if (codes[0] == NPT_BASE64_PAD_BYTE || codes[1] == NPT_BASE64_PAD_BYTE) {
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+ if (codes[2] == NPT_BASE64_PAD_BYTE) {
+ // pad at char 3
+ if (codes[3] == NPT_BASE64_PAD_BYTE) {
+ // double padding
+ unsigned int packed = (codes[0]<<2)|(codes[1]>>4);
+ buffer[data_size++] = (unsigned char)packed;
+ } else {
+ // invalid padding
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+ } else if (codes[3] == NPT_BASE64_PAD_BYTE) {
+ // single padding
+ unsigned int packed = (codes[0]<<10)|(codes[1]<<4)|(codes[2]>>2);
+ buffer[data_size++] = (unsigned char)(packed >> 8);
+ buffer[data_size++] = (unsigned char)(packed );
+ } else {
+ // no padding
+ unsigned int packed = (codes[0]<<18)|(codes[1]<<12)|(codes[2]<<6)|codes[3];
+ buffer[data_size++] = (unsigned char)(packed >> 16);
+ buffer[data_size++] = (unsigned char)(packed >> 8);
+ buffer[data_size++] = (unsigned char)(packed );
+ }
+ code_count = 0;
+ }
+ }
+ }
+
+ if (code_count) return NPT_ERROR_INVALID_FORMAT;
+
+ // update the data size
+ data.SetDataSize(data_size);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Base64::Encode
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Base64::Encode(const NPT_Byte* data,
+ NPT_Size size,
+ NPT_String& base64,
+ NPT_Cardinal max_blocks_per_line /* = 0 */,
+ bool url_safe /* = false */)
+{
+ unsigned int block_count = 0;
+ unsigned int i = 0;
+
+ // reserve space for the string
+ base64.Reserve(4*((size+3)/3) + 2*(max_blocks_per_line?(size/(3*max_blocks_per_line)):0));
+ char* buffer = base64.UseChars();
+
+ // encode each byte
+ while (size >= 3) {
+ // output a block
+ *buffer++ = NPT_Base64_Chars[ (data[i ] >> 2) & 0x3F];
+ *buffer++ = NPT_Base64_Chars[((data[i ] & 0x03) << 4) | ((data[i+1] >> 4) & 0x0F)];
+ *buffer++ = NPT_Base64_Chars[((data[i+1] & 0x0F) << 2) | ((data[i+2] >> 6) & 0x03)];
+ *buffer++ = NPT_Base64_Chars[ data[i+2] & 0x3F];
+
+ size -= 3;
+ i += 3;
+ if (++block_count == max_blocks_per_line) {
+ *buffer++ = '\r';
+ *buffer++ = '\n';
+ block_count = 0;
+ }
+ }
+
+ // deal with the tail
+ if (size == 2) {
+ *buffer++ = NPT_Base64_Chars[ (data[i ] >> 2) & 0x3F];
+ *buffer++ = NPT_Base64_Chars[((data[i ] & 0x03) << 4) | ((data[i+1] >> 4) & 0x0F)];
+ *buffer++ = NPT_Base64_Chars[ (data[i+1] & 0x0F) << 2];
+ *buffer++ = NPT_BASE64_PAD_CHAR;
+ } else if (size == 1) {
+ *buffer++ = NPT_Base64_Chars[(data[i] >> 2) & 0x3F];
+ *buffer++ = NPT_Base64_Chars[(data[i] & 0x03) << 4];
+ *buffer++ = NPT_BASE64_PAD_CHAR;
+ *buffer++ = NPT_BASE64_PAD_CHAR;
+ }
+
+ // update the string size
+ NPT_ASSERT((NPT_Size)(buffer-base64.GetChars()) <= base64.GetCapacity());
+ base64.SetLength((NPT_Size)(buffer-base64.GetChars()));
+
+ // deal with url safe remapping
+ if (url_safe) {
+ base64.Replace('+','-');
+ base64.Replace('/','_');
+ }
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptBase64.h b/lib/libUPnP/Neptune/Source/Core/NptBase64.h
new file mode 100644
index 0000000..89950de
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptBase64.h
@@ -0,0 +1,68 @@
+/*****************************************************************
+|
+| Neptune - Base64
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+#ifndef _NPT_BASE64_H_
+#define _NPT_BASE64_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptDataBuffer.h"
+#include "NptStrings.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const NPT_Cardinal NPT_BASE64_MIME_BLOCKS_PER_LINE = 19;
+const NPT_Cardinal NPT_BASE64_PEM_BLOCKS_PER_LINE = 16;
+
+/*----------------------------------------------------------------------
+| NPT_Base64
++---------------------------------------------------------------------*/
+class NPT_Base64 {
+public:
+ // class methods
+ static NPT_Result Decode(const char* base64,
+ NPT_Size size,
+ NPT_DataBuffer& data,
+ bool url_safe = false);
+ static NPT_Result Encode(const NPT_Byte* data,
+ NPT_Size size,
+ NPT_String& base64,
+ NPT_Cardinal max_blocks_per_line = 0,
+ bool url_safe = false);
+
+private:
+ // this class is purely static
+ NPT_Base64();
+};
+
+#endif // _NPT_BASE64_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.cpp b/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.cpp
new file mode 100644
index 0000000..157a5bc
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.cpp
@@ -0,0 +1,471 @@
+/*****************************************************************
+|
+| Neptune - Buffered Streams
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptInterfaces.h"
+#include "NptConstants.h"
+#include "NptBufferedStreams.h"
+#include "NptUtils.h"
+#include "NptLogging.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.bufferedstreams")
+
+#define NPT_CHECK_NOLOGTIMEOUT(_x) \
+do { \
+ NPT_Result __result = (_x); \
+ if (__result != NPT_SUCCESS) { \
+ if (__result != NPT_ERROR_TIMEOUT && __result != NPT_ERROR_EOS) { \
+ NPT_CHECK_WARNING(__result); \
+ } \
+ return __result; \
+ } \
+} while(0)
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::NPT_BufferedInputStream
++---------------------------------------------------------------------*/
+NPT_BufferedInputStream::NPT_BufferedInputStream(NPT_InputStreamReference& source, NPT_Size buffer_size) :
+ m_Source(source),
+ m_Position(0),
+ m_SkipNewline(false),
+ m_Eos(false)
+{
+ // setup the read buffer
+ m_Buffer.data = NULL;
+ m_Buffer.offset = 0;
+ m_Buffer.valid = 0;
+ m_Buffer.size = buffer_size;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::~NPT_BufferedInputStream
++---------------------------------------------------------------------*/
+NPT_BufferedInputStream::~NPT_BufferedInputStream()
+{
+ // release the buffer
+ delete[] m_Buffer.data;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::SetBufferSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::SetBufferSize(NPT_Size size, bool force /* = false */)
+{
+ if (m_Buffer.data != NULL) {
+ // we already have a buffer
+ if (m_Buffer.size < size || force) {
+ // the current buffer is too small or we want to move
+ // existing data to the beginning of the buffer, reallocate
+ NPT_Byte* buffer = new NPT_Byte[size];
+ if (buffer == NULL) return NPT_ERROR_OUT_OF_MEMORY;
+
+ // copy existing data
+ NPT_Size need_to_copy = m_Buffer.valid - m_Buffer.offset;
+ if (need_to_copy) {
+ NPT_CopyMemory((void*)buffer,
+ m_Buffer.data+m_Buffer.offset,
+ need_to_copy);
+ }
+
+ // use the new buffer
+ delete[] m_Buffer.data;
+ m_Buffer.data = buffer;
+ m_Buffer.valid -= m_Buffer.offset;
+ m_Buffer.offset = 0;
+ }
+ }
+ m_Buffer.size = size;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::FillBuffer
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::FillBuffer()
+{
+ // shortcut
+ if (m_Eos) return NPT_ERROR_EOS;
+
+ // check that there is nothing left in the buffer and the buffer
+ // size is not 0
+ NPT_ASSERT(m_Buffer.valid == m_Buffer.offset);
+ NPT_ASSERT(m_Buffer.size != 0);
+
+ // allocate the read buffer if it has not been done yet
+ if (m_Buffer.data == NULL) {
+ m_Buffer.data = new NPT_Byte[m_Buffer.size];
+ if (m_Buffer.data == NULL) return NPT_ERROR_OUT_OF_MEMORY;
+ }
+
+ // refill the buffer
+ m_Buffer.offset = 0;
+ NPT_Result result = m_Source->Read(m_Buffer.data, m_Buffer.size, &m_Buffer.valid);
+ if (NPT_FAILED(result)) m_Buffer.valid = 0;
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::ReleaseBuffer
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::ReleaseBuffer()
+{
+ NPT_ASSERT(m_Buffer.size == 0);
+ NPT_ASSERT(m_Buffer.offset == m_Buffer.valid);
+
+ delete[] m_Buffer.data;
+ m_Buffer.data = NULL;
+ m_Buffer.offset = 0;
+ m_Buffer.valid = 0;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::ReadLine
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::ReadLine(char* buffer,
+ NPT_Size size,
+ NPT_Size* chars_read,
+ bool break_on_cr)
+{
+ NPT_Result result = NPT_SUCCESS;
+ char* buffer_start = buffer;
+ char* buffer_end = buffer_start+size-1;
+ bool skip_newline = false;
+
+ // check parameters
+ if (buffer == NULL || size < 1) {
+ if (chars_read) *chars_read = 0;
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // read until EOF or newline
+ for (;;) {
+ while (m_Buffer.offset != m_Buffer.valid) {
+ // there is some data left in the buffer
+ NPT_Byte c = m_Buffer.data[m_Buffer.offset++];
+ if (c == '\r') {
+ if (break_on_cr) {
+ skip_newline = true;
+ goto done;
+ }
+ } else if (c == '\n') {
+ if (m_SkipNewline && (buffer == buffer_start)) {
+ continue;
+ }
+ goto done;
+ } else {
+ if (buffer == buffer_end) {
+ result = NPT_ERROR_NOT_ENOUGH_SPACE;
+ goto done;
+ }
+ *buffer++ = c;
+ }
+ }
+
+ if (m_Buffer.size == 0 && !m_Eos) {
+ // unbuffered mode
+ if (m_Buffer.data != NULL) ReleaseBuffer();
+ while (NPT_SUCCEEDED(result = m_Source->Read(buffer, 1, NULL))) {
+ if (*buffer == '\r') {
+ if (break_on_cr) {
+ skip_newline = true;
+ goto done;
+ }
+ } else if (*buffer == '\n') {
+ goto done;
+ } else {
+ if (buffer == buffer_end) {
+ result = NPT_ERROR_NOT_ENOUGH_SPACE;
+ goto done;
+ }
+ ++buffer;
+ }
+ }
+ } else {
+ // refill the buffer
+ result = FillBuffer();
+ }
+ if (NPT_FAILED(result)) goto done;
+ }
+
+done:
+ // update the newline skipping state
+ m_SkipNewline = skip_newline;
+
+ // NULL-terminate the line
+ *buffer = '\0';
+
+ // return what we have
+ m_Position += (NPT_Size)(buffer-buffer_start);
+ if (chars_read) *chars_read = (NPT_Size)(buffer-buffer_start);
+ if (result == NPT_ERROR_EOS) {
+ m_Eos = true;
+ if (buffer != buffer_start) {
+ // we have reached the end of the stream, but we have read
+ // some chars, so do not return EOS now
+ return NPT_SUCCESS;
+ }
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::ReadLine
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::ReadLine(NPT_String& line,
+ NPT_Size max_chars,
+ bool break_on_cr)
+{
+ // clear the line
+ line.SetLength(0);
+
+ // reserve space for the chars
+ line.Reserve(max_chars);
+
+ // read the line
+ NPT_Size chars_read = 0;
+ NPT_Result result = ReadLine(line.UseChars(), max_chars, &chars_read, break_on_cr);
+ NPT_CHECK_NOLOGTIMEOUT(result);
+
+ // adjust the length of the string object
+ line.SetLength(chars_read);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ NPT_Result result = NPT_SUCCESS;
+ NPT_Size total_read = 0;
+ NPT_Size buffered;
+
+ // check for a possible shortcut
+ if (bytes_to_read == 0) return NPT_SUCCESS;
+
+ // skip a newline char if needed
+ if (m_SkipNewline) {
+ m_SkipNewline = false;
+ result = Read(buffer, 1, NULL);
+ if (NPT_FAILED(result)) goto done;
+ NPT_Byte c = *(NPT_Byte*)buffer;
+ if (c != '\n') {
+ buffer = (void*)((NPT_Byte*)buffer+1);
+ --bytes_to_read;
+ total_read = 1;
+ }
+ }
+
+ // compute how much is buffered
+ buffered = m_Buffer.valid-m_Buffer.offset;
+ if (bytes_to_read > buffered) {
+ // there is not enough in the buffer, take what's there
+ if (buffered) {
+ NPT_CopyMemory(buffer,
+ m_Buffer.data + m_Buffer.offset,
+ buffered);
+ buffer = (void*)((NPT_Byte*)buffer+buffered);
+ m_Buffer.offset += buffered;
+ bytes_to_read -= buffered;
+ total_read += buffered;
+ goto done;
+ }
+
+ // read the rest from the source
+ if (m_Buffer.size == 0) {
+ // unbuffered mode, read directly into the supplied buffer
+ if (m_Buffer.data != NULL) ReleaseBuffer(); // cleanup if necessary
+ NPT_Size local_read = 0;
+ result = m_Source->Read(buffer, bytes_to_read, &local_read);
+ if (NPT_SUCCEEDED(result)) {
+ total_read += local_read;
+ }
+ goto done;
+ } else {
+ // refill the buffer
+ result = FillBuffer();
+ if (NPT_FAILED(result)) goto done;
+ buffered = m_Buffer.valid;
+ if (bytes_to_read > buffered) bytes_to_read = buffered;
+ }
+ }
+
+ // get what we can from the buffer
+ if (bytes_to_read) {
+ NPT_CopyMemory(buffer,
+ m_Buffer.data + m_Buffer.offset,
+ bytes_to_read);
+ m_Buffer.offset += bytes_to_read;
+ total_read += bytes_to_read;
+ }
+
+done:
+ m_Position += total_read;
+ if (bytes_read) *bytes_read = total_read;
+ if (result == NPT_ERROR_EOS) {
+ m_Eos = true;
+ if (total_read != 0) {
+ // we have reached the end of the stream, but we have read
+ // some chars, so do not return EOS now
+ return NPT_SUCCESS;
+ }
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::Peek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::Peek(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ NPT_Result result = NPT_SUCCESS;
+ NPT_Size buffered;
+ NPT_Size new_size = m_Buffer.size?m_Buffer.size:NPT_BUFFERED_BYTE_STREAM_DEFAULT_SIZE;
+
+ // check for a possible shortcut
+ if (bytes_to_read == 0) return NPT_SUCCESS;
+
+ // compute how much is buffered
+ buffered = m_Buffer.valid-m_Buffer.offset;
+ if (bytes_to_read > buffered && buffered < new_size && !m_Eos) {
+ // we need more data than what we have
+ // switch to unbuffered mode and resize to force relocation
+ // of data to the beginning of the buffer
+ SetBufferSize(new_size, true);
+ // fill up the end of the buffer
+ result = FillBuffer();
+ // continue even if it failed
+ buffered = m_Buffer.valid;
+ }
+
+ // make sure we're returning what we can
+ if (bytes_to_read > buffered) bytes_to_read = buffered;
+
+ // get what we can from the buffer
+ NPT_CopyMemory(buffer,
+ m_Buffer.data + m_Buffer.offset,
+ bytes_to_read);
+
+ if (bytes_read) *bytes_read = bytes_to_read;
+ if (result == NPT_ERROR_EOS) {
+ m_Eos = true;
+ if (bytes_to_read != 0) {
+ // we have reached the end of the stream, but we have read
+ // some chars, so do not return EOS now
+ return NPT_SUCCESS;
+ }
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::Seek(NPT_Position offset)
+{
+ NPT_Result result;
+
+ if (offset >= m_Position &&
+ offset - m_Position < m_Buffer.valid - m_Buffer.offset) {
+ NPT_Position diff = offset - m_Position;
+ m_Buffer.offset += ((NPT_Size)diff);
+ m_Position = offset;
+ return NPT_SUCCESS;
+ }
+
+ result = m_Source->Seek(offset);
+ if (NPT_FAILED(result)) return result;
+
+ m_Buffer.offset = 0;
+ m_Buffer.valid = 0;
+ m_Eos = false;
+ m_Position = offset;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::Tell
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::Tell(NPT_Position& offset)
+{
+ offset = m_Position;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::GetSize(NPT_LargeSize& size)
+{
+ return m_Source->GetSize(size);
+}
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BufferedInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ NPT_LargeSize source_available = 0;
+ NPT_Result result = m_Source->GetAvailable(source_available);
+ if (NPT_SUCCEEDED(result)) {
+ available = m_Buffer.valid-m_Buffer.offset + source_available;
+ return NPT_SUCCESS;
+ } else {
+ available = m_Buffer.valid-m_Buffer.offset;
+ return available?NPT_SUCCESS:result;
+ }
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.h b/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.h
new file mode 100644
index 0000000..6e37051
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.h
@@ -0,0 +1,102 @@
+/*****************************************************************
+|
+| Neptune - Buffered Byte Stream
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_BUFFERED_STREAMS_H_
+#define _NPT_BUFFERED_STREAMS_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptStreams.h"
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptStrings.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| NPT_BufferedStream
++---------------------------------------------------------------------*/
+const NPT_Size NPT_BUFFERED_BYTE_STREAM_DEFAULT_SIZE = 4096;
+
+/*----------------------------------------------------------------------
+| NPT_BufferedInputStream
++---------------------------------------------------------------------*/
+class NPT_BufferedInputStream : public NPT_InputStream
+{
+public:
+ // constructors and destructor
+ NPT_BufferedInputStream(NPT_InputStreamReference& stream,
+ NPT_Size buffer_size = NPT_BUFFERED_BYTE_STREAM_DEFAULT_SIZE);
+ ~NPT_BufferedInputStream() override;
+
+ // methods
+ virtual NPT_Result ReadLine(NPT_String& line,
+ NPT_Size max_chars = 4096,
+ bool break_on_cr = false);
+ virtual NPT_Result ReadLine(char* buffer,
+ NPT_Size buffer_size,
+ NPT_Size* chars_read = NULL,
+ bool break_on_cr = false);
+ virtual NPT_Result SetBufferSize(NPT_Size size, bool force = false);
+ virtual NPT_Result Peek(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read);
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL) override;
+ NPT_Result Seek(NPT_Position offset) override;
+ NPT_Result Tell(NPT_Position& offset) override;
+ NPT_Result GetSize(NPT_LargeSize& size) override;
+ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+protected:
+ // members
+ NPT_InputStreamReference m_Source;
+ NPT_Position m_Position;
+ bool m_SkipNewline;
+ bool m_Eos;
+ struct {
+ NPT_Byte* data;
+ NPT_Size offset;
+ NPT_Size valid;
+ NPT_Size size;
+ } m_Buffer;
+
+ // methods
+ virtual NPT_Result FillBuffer();
+ virtual NPT_Result ReleaseBuffer();
+};
+
+typedef NPT_Reference<NPT_BufferedInputStream> NPT_BufferedInputStreamReference;
+
+#endif // _NPT_BUFFERED_STREAMS_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptCommon.cpp b/lib/libUPnP/Neptune/Source/Core/NptCommon.cpp
new file mode 100644
index 0000000..3a94380
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptCommon.cpp
@@ -0,0 +1,38 @@
+/*****************************************************************
+|
+| Neptune - Common Classes
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptCommon.h"
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptCommon.h b/lib/libUPnP/Neptune/Source/Core/NptCommon.h
new file mode 100644
index 0000000..9137d31
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptCommon.h
@@ -0,0 +1,169 @@
+/*****************************************************************
+|
+| Neptune - Common Definitions
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_COMMON_H_
+#define _NPT_COMMON_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| NPT_ObjectDeleter
++---------------------------------------------------------------------*/
+template <class T>
+class NPT_ObjectDeleter {
+public:
+ void operator()(T* object) const {
+ delete object;
+ }
+};
+
+/*----------------------------------------------------------------------
+| NPT_ObjectComparator
++---------------------------------------------------------------------*/
+template <class T>
+class NPT_ObjectComparator {
+public:
+ NPT_ObjectComparator(T& object) : m_Object(object) {}
+ bool operator()(const T& object) const {
+ return object == m_Object;
+ }
+private:
+ T& m_Object;
+};
+
+/*----------------------------------------------------------------------
+| NPT_ContainerFind
++---------------------------------------------------------------------*/
+template <typename T, typename P>
+NPT_Result NPT_ContainerFind(T& container,
+ const P& predicate,
+ typename T::Element& item,
+ NPT_Ordinal n=0)
+{
+ typename T::Iterator found = container.Find(predicate, n);
+ if (found) {
+ item = *found;
+ return NPT_SUCCESS;
+ } else {
+ return NPT_ERROR_NO_SUCH_ITEM;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_ContainerFind
++---------------------------------------------------------------------*/
+template <typename T, typename P>
+NPT_Result NPT_ContainerFind(T& container,
+ const P& predicate,
+ typename T::Iterator& iter,
+ NPT_Ordinal n=0)
+{
+ iter = container.Find(predicate, n);
+ return iter?NPT_SUCCESS:NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UntilResultEquals
++---------------------------------------------------------------------*/
+class NPT_UntilResultEquals
+{
+public:
+ // methods
+ NPT_UntilResultEquals(NPT_Result condition_result,
+ NPT_Result return_value = NPT_SUCCESS) :
+ m_ConditionResult(condition_result),
+ m_ReturnValue(return_value) {}
+ bool operator()(NPT_Result result, NPT_Result& return_value) const {
+ if (result == m_ConditionResult) {
+ return_value = m_ReturnValue;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+private:
+ // members
+ NPT_Result m_ConditionResult;
+ NPT_Result m_ReturnValue;
+};
+
+/*----------------------------------------------------------------------
+| NPT_UntilResultNotEquals
++---------------------------------------------------------------------*/
+class NPT_UntilResultNotEquals
+{
+public:
+ // methods
+ NPT_UntilResultNotEquals(NPT_Result condition_result) :
+ m_ConditionResult(condition_result) {}
+ bool operator()(NPT_Result result, NPT_Result& return_value) const {
+ if (result != m_ConditionResult) {
+ return_value = result;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+private:
+ // members
+ NPT_Result m_ConditionResult;
+};
+
+/*----------------------------------------------------------------------
+| NPT_PropertyValue
++---------------------------------------------------------------------*/
+class NPT_PropertyValue
+{
+ public:
+ // typedefs
+ typedef enum {UNKNOWN, INTEGER, STRING} Type;
+
+ // methods
+ NPT_PropertyValue() : m_Type(UNKNOWN), m_Integer(0) {}
+ NPT_PropertyValue(int value) : m_Type(INTEGER), m_Integer(value) {}
+ NPT_PropertyValue(const char* value) : m_Type(STRING), m_String(value) {}
+
+ // members
+ Type m_Type;
+ union {
+ int m_Integer;
+ const char* m_String;
+ };
+};
+
+#endif // _NPT_COMMON_H_
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptConfig.h b/lib/libUPnP/Neptune/Source/Core/NptConfig.h
new file mode 100644
index 0000000..e4be01e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptConfig.h
@@ -0,0 +1,381 @@
+/*****************************************************************
+|
+| Neptune - Configuration
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_CONFIG_H_
+#define _NPT_CONFIG_H_
+
+/*----------------------------------------------------------------------
+| defaults
++---------------------------------------------------------------------*/
+#define NPT_CONFIG_HAVE_ASSERT_H
+#define NPT_CONFIG_HAVE_STD_C
+#define NPT_CONFIG_HAVE_POSIX_TIME
+#define NPT_CONFIG_HAVE_ASSERT_H
+#define NPT_CONFIG_HAVE_STDLIB_H
+#define NPT_CONFIG_HAVE_STDIO_H
+#define NPT_CONFIG_HAVE_STDARG_H
+#define NPT_CONFIG_HAVE_STDINT_H
+#define NPT_CONFIG_HAVE_STRING_H
+#define NPT_CONFIG_HAVE_LIMITS_H
+
+/*----------------------------------------------------------------------
+| standard C runtime
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_HAVE_STD_C)
+#define NPT_CONFIG_HAVE_MALLOC
+#define NPT_CONFIG_HAVE_CALLOC
+#define NPT_CONFIG_HAVE_REALLOC
+#define NPT_CONFIG_HAVE_FREE
+#define NPT_CONFIG_HAVE_MEMCPY
+#define NPT_CONFIG_HAVE_MEMSET
+#define NPT_CONFIG_HAVE_MEMCMP
+#define NPT_CONFIG_HAVE_GETENV
+#define NPT_CONFIG_HAVE_SETENV
+#define NPT_CONFIG_HAVE_UNSETENV
+#if defined(TARGET_WINDOWS_STORE)
+#undef NPT_CONFIG_HAVE_GETENV
+#undef NPT_CONFIG_HAVE_SETENV
+#undef NPT_CONFIG_HAVE_UNSETENV
+#endif
+#define NPT_CONFIG_HAVE_READDIR_R
+#endif /* NPT_CONFIG_HAS_STD_C */
+
+#if defined(NPT_CONFIG_HAVE_POSIX_TIME)
+#define NPT_CONFIG_HAVE_GMTIME
+#define NPT_CONFIG_HAVE_GMTIME_R
+#define NPT_CONFIG_HAVE_LOCALTIME
+#define NPT_CONFIG_HAVE_LOCALTIME_R
+#define NPT_CONFIG_HAVE_TM_GMTOFF
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRING_H)
+#define NPT_CONFIG_HAVE_STRCMP
+#define NPT_CONFIG_HAVE_STRNCMP
+#define NPT_CONFIG_HAVE_STRDUP
+#define NPT_CONFIG_HAVE_STRLEN
+#define NPT_CONFIG_HAVE_STRCPY
+#define NPT_CONFIG_HAVE_STRNCPY
+#endif /* NPT_CONFIG_HAVE_STRING_H */
+
+#if defined(NPT_CONFIG_HAVE_STDIO_H)
+#define NPT_CONFIG_HAVE_SPRINTF
+#define NPT_CONFIG_HAVE_SNPRINTF
+#define NPT_CONFIG_HAVE_VSPRINTF
+#define NPT_CONFIG_HAVE_VSNPRINTF
+#endif /* NPT_CONFIG_HAVE_STDIO_H */
+
+#if defined(NPT_CONFIG_HAVE_LIMITS_H)
+#define NPT_CONFIG_HAVE_INT_MIN
+#define NPT_CONFIG_HAVE_INT_MAX
+#define NPT_CONFIG_HAVE_UINT_MAX
+#define NPT_CONFIG_HAVE_LONG_MIN
+#define NPT_CONFIG_HAVE_LONG_MAX
+#define NPT_CONFIG_HAVE_ULONG_MAX
+#endif
+
+/*----------------------------------------------------------------------
+| standard C++ runtime
++---------------------------------------------------------------------*/
+#define NPT_CONFIG_HAVE_NEW_H
+
+/*----------------------------------------------------------------------
+| defaults
++---------------------------------------------------------------------*/
+#define NPT_CONFIG_HAVE_SOCKADDR_SA_LEN
+
+/*----------------------------------------------------------------------
+| platform specifics
++---------------------------------------------------------------------*/
+/* Windows 32 */
+#if defined(_WIN32) || defined(_XBOX)
+#if !defined(STRICT)
+#define STRICT
+#endif
+#endif
+
+/* XBox */
+#if defined(_XBOX)
+#define NPT_CONFIG_THREAD_STACK_SIZE 0x10000
+#endif
+
+/* QNX */
+#if defined(__QNX__)
+#define NPT_CONFIG_HAVE_GETADDRINFO
+#endif
+
+/* cygwin */
+#if defined(__CYGWIN__)
+#undef NPT_CONFIG_HAVE_SOCKADDR_SA_LEN
+#endif
+
+/* linux */
+#if defined(__linux__)
+#define NPT_CONFIG_HAVE_GETADDRINFO
+//#define NPT_CONFIG_HAVE_GETIFADDRS // Linux has getifaddrs, but it doesn't return the MAC addrs
+ // in a convenient way, so we don't use it
+#undef NPT_CONFIG_HAVE_SOCKADDR_SA_LEN
+#define NPT_CONFIG_HAVE_ARPA_INET_H
+#define NPT_CONFIG_HAVE_INET_NTOP
+#define NPT_CONFIG_HAVE_INET_PTON
+#endif
+
+/* symbian */
+#if defined(__SYMBIAN32__)
+/* If defined, specify the stack size of each NPT_Thread. */
+#define NPT_CONFIG_THREAD_STACK_SIZE 0x14000
+#endif
+
+/* android */
+#if defined(ANDROID)
+#define NPT_CONFIG_HAVE_GETADDRINFO
+#undef NPT_CONFIG_HAVE_SOCKADDR_SA_LEN
+#define NPT_CONFIG_HAVE_ARPA_INET_H
+#define NPT_CONFIG_HAVE_INET_NTOP
+#define NPT_CONFIG_HAVE_INET_PTON
+#endif
+
+/* OSX and iOS */
+#if defined(__APPLE__)
+#define NPT_CONFIG_HAVE_GETADDRINFO
+#define NPT_CONFIG_HAVE_GETIFADDRS
+#define NPT_CONFIG_HAVE_AUTORELEASE_POOL
+#define NPT_CONFIG_HAVE_SOCKADDR_IN_SIN_LEN
+#define NPT_CONFIG_HAVE_ARPA_INET_H
+#define NPT_CONFIG_HAVE_INET_NTOP
+#define NPT_CONFIG_HAVE_INET_PTON
+#define NPT_CONFIG_HAVE_NET_IF_DL_H
+#define NPT_CONFIG_HAVE_SOCKADDR_DL
+#endif
+
+/*----------------------------------------------------------------------
+| compiler specifics
++---------------------------------------------------------------------*/
+/* GCC */
+#if defined(__GNUC__)
+#define NPT_LocalFunctionName __FUNCTION__
+#define NPT_COMPILER_UNUSED(p) (void)p
+#else
+#define NPT_COMPILER_UNUSED(p)
+#endif
+
+/* TriMedia C/C++ Compiler */
+#if defined(__TCS__)
+#undef NPT_CONFIG_HAVE_ASSERT_H
+#undef NPT_CONFIG_HAVE_SNPRINTF
+#undef NPT_CONFIG_HAVE_VSNPRINTF
+#endif
+
+/* palmos compiler */
+#if defined(__PALMOS__)
+#if __PALMOS__ <= 0x05000000
+#undef NPT_CONFIG_HAVE_ASSERT_H
+#undef NPT_CONFIG_HAVE_SNPRINTF
+#undef NPT_CONFIG_HAVE_VSNPRINTF
+#endif
+#endif
+
+/* Microsoft C/C++ Compiler */
+#if defined(_MSC_VER)
+#undef NPT_CONFIG_HAVE_STDINT_H
+#define NPT_CONFIG_HAVE_GETADDRINFO
+#define NPT_CONFIG_STAT_ST_CTIME_IS_ST_BIRTHTIME
+#define NPT_FORMAT_64 "I64"
+#define NPT_CONFIG_INT64_TYPE __int64
+#define NPT_INT64_MIN _I64_MIN
+#define NPT_INT64_MAX _I64_MAX
+#define NPT_UINT64_MAX _UI64_MAX
+#define NPT_INT64_C(_x) _x##i64
+#define NPT_UINT64_C(_x) _x##ui64
+#define NPT_LocalFunctionName __FUNCTION__
+#if !defined(_WIN32_WCE)
+#define NPT_fseek _fseeki64
+#define NPT_ftell _ftelli64
+#else
+#define NPT_fseek(a,b,c) fseek((a),(long)(b), (c))
+#define NPT_ftell ftell
+#endif
+#define NPT_stat NPT_stat_utf8
+#define NPT_stat_struct struct __stat64
+#if defined(_WIN64)
+typedef __int64 NPT_PointerLong;
+#else
+#if _MSC_VER >= 1400
+typedef __w64 long NPT_PointerLong;
+#else
+typedef long NPT_PointerLong;
+#endif
+#endif
+#define NPT_POINTER_TO_LONG(_p) ((NPT_PointerLong) (_p) )
+#if _MSC_VER >= 1400 && !defined(_WIN32_WCE)
+#define gmtime_r(a,b) gmtime_s(a,b)
+#define localtime_r(a,b) localtime_s(b,a)
+#define NPT_CONFIG_HAVE_FOPEN_S
+#define NPT_CONFIG_HAVE_FSOPEN
+#define NPT_CONFIG_HAVE_SHARE_H
+#define NPT_vsnprintf(s,c,f,a) _vsnprintf_s(s,c,_TRUNCATE,f,a)
+#define NPT_snprintf(s,c,f,...) _snprintf_s(s,c,_TRUNCATE,f,__VA_ARGS__)
+#define NPT_strncpy(d,s,c) strncpy_s(d,c+1,s,c)
+#define NPT_strcpy(d,s) strcpy_s(d,strlen(s)+1,s)
+#undef NPT_CONFIG_HAVE_GETENV
+#ifdef TARGET_WINDOWS_STORE
+#undef NPT_CONFIG_HAVE_GETENV
+#undef NPT_CONFIG_HAVE_DUPENV_S
+#undef NPT_CONFIG_HAVE_SETENV
+#undef NPT_CONFIG_HAVE_UNSETENV
+#undef NPT_CONFIG_HAVE_PUTENV_S
+#else
+#define NPT_CONFIG_HAVE_DUPENV_S
+#define dupenv_s _dupenv_s
+#undef NPT_CONFIG_HAVE_SETENV
+#undef NPT_CONFIG_HAVE_UNSETENV
+#define NPT_CONFIG_HAVE_PUTENV_S
+#define putenv_s _putenv_s
+#endif
+#else
+#undef NPT_CONFIG_HAVE_GMTIME_R
+#undef NPT_CONFIG_HAVE_LOCALTIME_R
+#define NPT_vsnprintf _vsnprintf
+#define NPT_snprintf _snprintf
+#endif
+#if defined(_DEBUG)
+#define _CRTDBG_MAP_ALLOC
+#endif
+#endif
+
+/* Windows CE */
+#if defined(_WIN32_WCE)
+#if defined(NPT_CONFIG_HAVE_FOPEN_S)
+#undef NPT_CONFIG_HAVE_FOPEN_S
+#endif
+#endif
+
+/* Symbian */
+#if defined(__SYMBIAN32__)
+#undef NPT_CONFIG_HAVE_NEW_H
+#include "e32std.h"
+#define explicit
+#define NPT_fseek fseek // no fseeko ?
+#define NPT_ftell ftell // no ftello ?
+#endif
+
+/* Android */
+#if defined(ANDROID)
+#if !defined(NPT_CONFIG_NO_RTTI)
+#define NPT_CONFIG_NO_RTTI
+#endif
+//#define NPT_ftell ftello64
+//#define NPT_fseek fseeko64
+#endif
+
+/* OSX and iOS */
+#if defined(__APPLE__)
+#include <TargetConditionals.h>
+#include <AvailabilityMacros.h>
+#if !defined(TARGET_OS_IPHONE) || !TARGET_OS_IPHONE
+#define NPT_CONFIG_HAVE_NET_IF_TYPES_H
+#if defined(MAC_OS_X_VERSION_10_6) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6)
+#define NPT_CONFIG_HAVE_STAT_ST_BIRTHTIME
+#endif
+#define NPT_CONFIG_HAVE_DEV_URANDOM
+#endif
+#endif
+
+/*----------------------------------------------------------------------
+| defaults
++---------------------------------------------------------------------*/
+#if !defined(NPT_FORMAT_64)
+#define NPT_FORMAT_64 "ll"
+#endif
+
+#if !defined(NPT_POINTER_TO_LONG)
+#define NPT_POINTER_TO_LONG(_p) ((long)(_p))
+#endif
+
+#if !defined(NPT_CONFIG_INT64_TYPE)
+#define NPT_CONFIG_INT64_TYPE long long
+#endif
+
+#if !defined(NPT_INT64_C)
+#define NPT_INT64_C(_x) _x##LL
+#endif
+
+#if !defined(NPT_UINT64_C)
+#define NPT_UINT64_C(_x) _x##ULL
+#endif
+
+#if !defined(NPT_snprintf)
+#define NPT_snprintf snprintf
+#endif
+
+#if !defined(NPT_strcpy)
+#define NPT_strcpy strcpy
+#endif
+
+#if !defined(NPT_strncpy)
+#define NPT_strncpy strncpy
+#endif
+
+#if !defined(NPT_vsnprintf)
+#define NPT_vsnprintf vsnprintf
+#endif
+
+#if !defined(NPT_LocalFunctionName)
+#define NPT_LocalFunctionName (NULL)
+#endif
+
+#if !defined(NPT_CONFIG_THREAD_STACK_SIZE)
+#define NPT_CONFIG_THREAD_STACK_SIZE 0
+#endif
+
+#if !defined(NPT_fseek)
+#define NPT_fseek fseeko
+#endif
+
+#if !defined(NPT_ftell)
+#define NPT_ftell ftello
+#endif
+
+#if !defined(NPT_stat)
+#define NPT_stat stat
+#endif
+
+#if !defined(NPT_stat_struct)
+#define NPT_stat_struct struct stat
+#endif
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#if defined(DMALLOC)
+#include <dmalloc.h>
+#endif
+
+#endif // _NPT_CONFIG_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptConsole.cpp b/lib/libUPnP/Neptune/Source/Core/NptConsole.cpp
new file mode 100644
index 0000000..bbd92dd
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptConsole.cpp
@@ -0,0 +1,67 @@
+/*****************************************************************
+|
+| Neptune - Console
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+
+#if defined(NPT_CONFIG_HAVE_STDARG_H)
+#include <stdarg.h>
+#endif
+
+#include "NptConfig.h"
+#include "NptConsole.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| NPT_ConsoleOutputFunction
++---------------------------------------------------------------------*/
+static void
+NPT_ConsoleOutputFunction(void*, const char* message)
+{
+ NPT_Console::Output(message);
+}
+
+/*----------------------------------------------------------------------
+| NPT_ConsoleOutputF
++---------------------------------------------------------------------*/
+void
+NPT_Console::OutputF(const char* format, ...)
+{
+ va_list args;
+ va_start(args, format);
+
+ NPT_FormatOutput(NPT_ConsoleOutputFunction, NULL, format, args);
+
+ va_end(args);
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptConsole.h b/lib/libUPnP/Neptune/Source/Core/NptConsole.h
new file mode 100644
index 0000000..6502a79
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptConsole.h
@@ -0,0 +1,55 @@
+/*****************************************************************
+|
+| Neptune - Console
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+/** @file
+* Header file for console support
+*/
+
+#ifndef _NPT_CONSOLE_H_
+#define _NPT_CONSOLE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| prototypes
++---------------------------------------------------------------------*/
+class NPT_Console {
+public:
+ // class methods
+ static void Output(const char* message);
+ static void OutputF(const char* format, ...);
+};
+
+
+#endif /* _NPT_CONSOLE_H_ */
diff --git a/lib/libUPnP/Neptune/Source/Core/NptConstants.h b/lib/libUPnP/Neptune/Source/Core/NptConstants.h
new file mode 100644
index 0000000..6618bf8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptConstants.h
@@ -0,0 +1,44 @@
+/*****************************************************************
+|
+| Neptune - Constants
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_CONSTANTS_H_
+#define _NPT_CONSTANTS_H_
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#ifndef NULL
+#define NULL 0
+#endif
+
+const int NPT_TIMEOUT_INFINITE = -1;
+
+#endif // _NPT_CONSTANTS_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptCrypto.cpp b/lib/libUPnP/Neptune/Source/Core/NptCrypto.cpp
new file mode 100644
index 0000000..20b128b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptCrypto.cpp
@@ -0,0 +1,833 @@
+/*****************************************************************
+|
+| Neptune - Message Digests
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*
+ Portions of this code are based on the code of LibTomCrypt
+ that was released into public domain by Tom St Denis.
+*/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptCrypto.h"
+#include "NptUtils.h"
+#include "NptTypes.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define NPT_AES_BLOCK_SIZE 16
+
+static const NPT_UInt32 TE0[256] = {
+ 0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL,
+ 0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL,
+ 0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL,
+ 0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL,
+ 0x8fcaca45UL, 0x1f82829dUL, 0x89c9c940UL, 0xfa7d7d87UL,
+ 0xeffafa15UL, 0xb25959ebUL, 0x8e4747c9UL, 0xfbf0f00bUL,
+ 0x41adadecUL, 0xb3d4d467UL, 0x5fa2a2fdUL, 0x45afafeaUL,
+ 0x239c9cbfUL, 0x53a4a4f7UL, 0xe4727296UL, 0x9bc0c05bUL,
+ 0x75b7b7c2UL, 0xe1fdfd1cUL, 0x3d9393aeUL, 0x4c26266aUL,
+ 0x6c36365aUL, 0x7e3f3f41UL, 0xf5f7f702UL, 0x83cccc4fUL,
+ 0x6834345cUL, 0x51a5a5f4UL, 0xd1e5e534UL, 0xf9f1f108UL,
+ 0xe2717193UL, 0xabd8d873UL, 0x62313153UL, 0x2a15153fUL,
+ 0x0804040cUL, 0x95c7c752UL, 0x46232365UL, 0x9dc3c35eUL,
+ 0x30181828UL, 0x379696a1UL, 0x0a05050fUL, 0x2f9a9ab5UL,
+ 0x0e070709UL, 0x24121236UL, 0x1b80809bUL, 0xdfe2e23dUL,
+ 0xcdebeb26UL, 0x4e272769UL, 0x7fb2b2cdUL, 0xea75759fUL,
+ 0x1209091bUL, 0x1d83839eUL, 0x582c2c74UL, 0x341a1a2eUL,
+ 0x361b1b2dUL, 0xdc6e6eb2UL, 0xb45a5aeeUL, 0x5ba0a0fbUL,
+ 0xa45252f6UL, 0x763b3b4dUL, 0xb7d6d661UL, 0x7db3b3ceUL,
+ 0x5229297bUL, 0xdde3e33eUL, 0x5e2f2f71UL, 0x13848497UL,
+ 0xa65353f5UL, 0xb9d1d168UL, 0x00000000UL, 0xc1eded2cUL,
+ 0x40202060UL, 0xe3fcfc1fUL, 0x79b1b1c8UL, 0xb65b5bedUL,
+ 0xd46a6abeUL, 0x8dcbcb46UL, 0x67bebed9UL, 0x7239394bUL,
+ 0x944a4adeUL, 0x984c4cd4UL, 0xb05858e8UL, 0x85cfcf4aUL,
+ 0xbbd0d06bUL, 0xc5efef2aUL, 0x4faaaae5UL, 0xedfbfb16UL,
+ 0x864343c5UL, 0x9a4d4dd7UL, 0x66333355UL, 0x11858594UL,
+ 0x8a4545cfUL, 0xe9f9f910UL, 0x04020206UL, 0xfe7f7f81UL,
+ 0xa05050f0UL, 0x783c3c44UL, 0x259f9fbaUL, 0x4ba8a8e3UL,
+ 0xa25151f3UL, 0x5da3a3feUL, 0x804040c0UL, 0x058f8f8aUL,
+ 0x3f9292adUL, 0x219d9dbcUL, 0x70383848UL, 0xf1f5f504UL,
+ 0x63bcbcdfUL, 0x77b6b6c1UL, 0xafdada75UL, 0x42212163UL,
+ 0x20101030UL, 0xe5ffff1aUL, 0xfdf3f30eUL, 0xbfd2d26dUL,
+ 0x81cdcd4cUL, 0x180c0c14UL, 0x26131335UL, 0xc3ecec2fUL,
+ 0xbe5f5fe1UL, 0x359797a2UL, 0x884444ccUL, 0x2e171739UL,
+ 0x93c4c457UL, 0x55a7a7f2UL, 0xfc7e7e82UL, 0x7a3d3d47UL,
+ 0xc86464acUL, 0xba5d5de7UL, 0x3219192bUL, 0xe6737395UL,
+ 0xc06060a0UL, 0x19818198UL, 0x9e4f4fd1UL, 0xa3dcdc7fUL,
+ 0x44222266UL, 0x542a2a7eUL, 0x3b9090abUL, 0x0b888883UL,
+ 0x8c4646caUL, 0xc7eeee29UL, 0x6bb8b8d3UL, 0x2814143cUL,
+ 0xa7dede79UL, 0xbc5e5ee2UL, 0x160b0b1dUL, 0xaddbdb76UL,
+ 0xdbe0e03bUL, 0x64323256UL, 0x743a3a4eUL, 0x140a0a1eUL,
+ 0x924949dbUL, 0x0c06060aUL, 0x4824246cUL, 0xb85c5ce4UL,
+ 0x9fc2c25dUL, 0xbdd3d36eUL, 0x43acacefUL, 0xc46262a6UL,
+ 0x399191a8UL, 0x319595a4UL, 0xd3e4e437UL, 0xf279798bUL,
+ 0xd5e7e732UL, 0x8bc8c843UL, 0x6e373759UL, 0xda6d6db7UL,
+ 0x018d8d8cUL, 0xb1d5d564UL, 0x9c4e4ed2UL, 0x49a9a9e0UL,
+ 0xd86c6cb4UL, 0xac5656faUL, 0xf3f4f407UL, 0xcfeaea25UL,
+ 0xca6565afUL, 0xf47a7a8eUL, 0x47aeaee9UL, 0x10080818UL,
+ 0x6fbabad5UL, 0xf0787888UL, 0x4a25256fUL, 0x5c2e2e72UL,
+ 0x381c1c24UL, 0x57a6a6f1UL, 0x73b4b4c7UL, 0x97c6c651UL,
+ 0xcbe8e823UL, 0xa1dddd7cUL, 0xe874749cUL, 0x3e1f1f21UL,
+ 0x964b4bddUL, 0x61bdbddcUL, 0x0d8b8b86UL, 0x0f8a8a85UL,
+ 0xe0707090UL, 0x7c3e3e42UL, 0x71b5b5c4UL, 0xcc6666aaUL,
+ 0x904848d8UL, 0x06030305UL, 0xf7f6f601UL, 0x1c0e0e12UL,
+ 0xc26161a3UL, 0x6a35355fUL, 0xae5757f9UL, 0x69b9b9d0UL,
+ 0x17868691UL, 0x99c1c158UL, 0x3a1d1d27UL, 0x279e9eb9UL,
+ 0xd9e1e138UL, 0xebf8f813UL, 0x2b9898b3UL, 0x22111133UL,
+ 0xd26969bbUL, 0xa9d9d970UL, 0x078e8e89UL, 0x339494a7UL,
+ 0x2d9b9bb6UL, 0x3c1e1e22UL, 0x15878792UL, 0xc9e9e920UL,
+ 0x87cece49UL, 0xaa5555ffUL, 0x50282878UL, 0xa5dfdf7aUL,
+ 0x038c8c8fUL, 0x59a1a1f8UL, 0x09898980UL, 0x1a0d0d17UL,
+ 0x65bfbfdaUL, 0xd7e6e631UL, 0x844242c6UL, 0xd06868b8UL,
+ 0x824141c3UL, 0x299999b0UL, 0x5a2d2d77UL, 0x1e0f0f11UL,
+ 0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL,
+};
+
+static const NPT_UInt32 Te4[256] = {
+ 0x63636363UL, 0x7c7c7c7cUL, 0x77777777UL, 0x7b7b7b7bUL,
+ 0xf2f2f2f2UL, 0x6b6b6b6bUL, 0x6f6f6f6fUL, 0xc5c5c5c5UL,
+ 0x30303030UL, 0x01010101UL, 0x67676767UL, 0x2b2b2b2bUL,
+ 0xfefefefeUL, 0xd7d7d7d7UL, 0xababababUL, 0x76767676UL,
+ 0xcacacacaUL, 0x82828282UL, 0xc9c9c9c9UL, 0x7d7d7d7dUL,
+ 0xfafafafaUL, 0x59595959UL, 0x47474747UL, 0xf0f0f0f0UL,
+ 0xadadadadUL, 0xd4d4d4d4UL, 0xa2a2a2a2UL, 0xafafafafUL,
+ 0x9c9c9c9cUL, 0xa4a4a4a4UL, 0x72727272UL, 0xc0c0c0c0UL,
+ 0xb7b7b7b7UL, 0xfdfdfdfdUL, 0x93939393UL, 0x26262626UL,
+ 0x36363636UL, 0x3f3f3f3fUL, 0xf7f7f7f7UL, 0xccccccccUL,
+ 0x34343434UL, 0xa5a5a5a5UL, 0xe5e5e5e5UL, 0xf1f1f1f1UL,
+ 0x71717171UL, 0xd8d8d8d8UL, 0x31313131UL, 0x15151515UL,
+ 0x04040404UL, 0xc7c7c7c7UL, 0x23232323UL, 0xc3c3c3c3UL,
+ 0x18181818UL, 0x96969696UL, 0x05050505UL, 0x9a9a9a9aUL,
+ 0x07070707UL, 0x12121212UL, 0x80808080UL, 0xe2e2e2e2UL,
+ 0xebebebebUL, 0x27272727UL, 0xb2b2b2b2UL, 0x75757575UL,
+ 0x09090909UL, 0x83838383UL, 0x2c2c2c2cUL, 0x1a1a1a1aUL,
+ 0x1b1b1b1bUL, 0x6e6e6e6eUL, 0x5a5a5a5aUL, 0xa0a0a0a0UL,
+ 0x52525252UL, 0x3b3b3b3bUL, 0xd6d6d6d6UL, 0xb3b3b3b3UL,
+ 0x29292929UL, 0xe3e3e3e3UL, 0x2f2f2f2fUL, 0x84848484UL,
+ 0x53535353UL, 0xd1d1d1d1UL, 0x00000000UL, 0xededededUL,
+ 0x20202020UL, 0xfcfcfcfcUL, 0xb1b1b1b1UL, 0x5b5b5b5bUL,
+ 0x6a6a6a6aUL, 0xcbcbcbcbUL, 0xbebebebeUL, 0x39393939UL,
+ 0x4a4a4a4aUL, 0x4c4c4c4cUL, 0x58585858UL, 0xcfcfcfcfUL,
+ 0xd0d0d0d0UL, 0xefefefefUL, 0xaaaaaaaaUL, 0xfbfbfbfbUL,
+ 0x43434343UL, 0x4d4d4d4dUL, 0x33333333UL, 0x85858585UL,
+ 0x45454545UL, 0xf9f9f9f9UL, 0x02020202UL, 0x7f7f7f7fUL,
+ 0x50505050UL, 0x3c3c3c3cUL, 0x9f9f9f9fUL, 0xa8a8a8a8UL,
+ 0x51515151UL, 0xa3a3a3a3UL, 0x40404040UL, 0x8f8f8f8fUL,
+ 0x92929292UL, 0x9d9d9d9dUL, 0x38383838UL, 0xf5f5f5f5UL,
+ 0xbcbcbcbcUL, 0xb6b6b6b6UL, 0xdadadadaUL, 0x21212121UL,
+ 0x10101010UL, 0xffffffffUL, 0xf3f3f3f3UL, 0xd2d2d2d2UL,
+ 0xcdcdcdcdUL, 0x0c0c0c0cUL, 0x13131313UL, 0xececececUL,
+ 0x5f5f5f5fUL, 0x97979797UL, 0x44444444UL, 0x17171717UL,
+ 0xc4c4c4c4UL, 0xa7a7a7a7UL, 0x7e7e7e7eUL, 0x3d3d3d3dUL,
+ 0x64646464UL, 0x5d5d5d5dUL, 0x19191919UL, 0x73737373UL,
+ 0x60606060UL, 0x81818181UL, 0x4f4f4f4fUL, 0xdcdcdcdcUL,
+ 0x22222222UL, 0x2a2a2a2aUL, 0x90909090UL, 0x88888888UL,
+ 0x46464646UL, 0xeeeeeeeeUL, 0xb8b8b8b8UL, 0x14141414UL,
+ 0xdedededeUL, 0x5e5e5e5eUL, 0x0b0b0b0bUL, 0xdbdbdbdbUL,
+ 0xe0e0e0e0UL, 0x32323232UL, 0x3a3a3a3aUL, 0x0a0a0a0aUL,
+ 0x49494949UL, 0x06060606UL, 0x24242424UL, 0x5c5c5c5cUL,
+ 0xc2c2c2c2UL, 0xd3d3d3d3UL, 0xacacacacUL, 0x62626262UL,
+ 0x91919191UL, 0x95959595UL, 0xe4e4e4e4UL, 0x79797979UL,
+ 0xe7e7e7e7UL, 0xc8c8c8c8UL, 0x37373737UL, 0x6d6d6d6dUL,
+ 0x8d8d8d8dUL, 0xd5d5d5d5UL, 0x4e4e4e4eUL, 0xa9a9a9a9UL,
+ 0x6c6c6c6cUL, 0x56565656UL, 0xf4f4f4f4UL, 0xeaeaeaeaUL,
+ 0x65656565UL, 0x7a7a7a7aUL, 0xaeaeaeaeUL, 0x08080808UL,
+ 0xbabababaUL, 0x78787878UL, 0x25252525UL, 0x2e2e2e2eUL,
+ 0x1c1c1c1cUL, 0xa6a6a6a6UL, 0xb4b4b4b4UL, 0xc6c6c6c6UL,
+ 0xe8e8e8e8UL, 0xddddddddUL, 0x74747474UL, 0x1f1f1f1fUL,
+ 0x4b4b4b4bUL, 0xbdbdbdbdUL, 0x8b8b8b8bUL, 0x8a8a8a8aUL,
+ 0x70707070UL, 0x3e3e3e3eUL, 0xb5b5b5b5UL, 0x66666666UL,
+ 0x48484848UL, 0x03030303UL, 0xf6f6f6f6UL, 0x0e0e0e0eUL,
+ 0x61616161UL, 0x35353535UL, 0x57575757UL, 0xb9b9b9b9UL,
+ 0x86868686UL, 0xc1c1c1c1UL, 0x1d1d1d1dUL, 0x9e9e9e9eUL,
+ 0xe1e1e1e1UL, 0xf8f8f8f8UL, 0x98989898UL, 0x11111111UL,
+ 0x69696969UL, 0xd9d9d9d9UL, 0x8e8e8e8eUL, 0x94949494UL,
+ 0x9b9b9b9bUL, 0x1e1e1e1eUL, 0x87878787UL, 0xe9e9e9e9UL,
+ 0xcecececeUL, 0x55555555UL, 0x28282828UL, 0xdfdfdfdfUL,
+ 0x8c8c8c8cUL, 0xa1a1a1a1UL, 0x89898989UL, 0x0d0d0d0dUL,
+ 0xbfbfbfbfUL, 0xe6e6e6e6UL, 0x42424242UL, 0x68686868UL,
+ 0x41414141UL, 0x99999999UL, 0x2d2d2d2dUL, 0x0f0f0f0fUL,
+ 0xb0b0b0b0UL, 0x54545454UL, 0xbbbbbbbbUL, 0x16161616UL,
+};
+
+static const NPT_UInt32 TD0[256] = {
+ 0x51f4a750UL, 0x7e416553UL, 0x1a17a4c3UL, 0x3a275e96UL,
+ 0x3bab6bcbUL, 0x1f9d45f1UL, 0xacfa58abUL, 0x4be30393UL,
+ 0x2030fa55UL, 0xad766df6UL, 0x88cc7691UL, 0xf5024c25UL,
+ 0x4fe5d7fcUL, 0xc52acbd7UL, 0x26354480UL, 0xb562a38fUL,
+ 0xdeb15a49UL, 0x25ba1b67UL, 0x45ea0e98UL, 0x5dfec0e1UL,
+ 0xc32f7502UL, 0x814cf012UL, 0x8d4697a3UL, 0x6bd3f9c6UL,
+ 0x038f5fe7UL, 0x15929c95UL, 0xbf6d7aebUL, 0x955259daUL,
+ 0xd4be832dUL, 0x587421d3UL, 0x49e06929UL, 0x8ec9c844UL,
+ 0x75c2896aUL, 0xf48e7978UL, 0x99583e6bUL, 0x27b971ddUL,
+ 0xbee14fb6UL, 0xf088ad17UL, 0xc920ac66UL, 0x7dce3ab4UL,
+ 0x63df4a18UL, 0xe51a3182UL, 0x97513360UL, 0x62537f45UL,
+ 0xb16477e0UL, 0xbb6bae84UL, 0xfe81a01cUL, 0xf9082b94UL,
+ 0x70486858UL, 0x8f45fd19UL, 0x94de6c87UL, 0x527bf8b7UL,
+ 0xab73d323UL, 0x724b02e2UL, 0xe31f8f57UL, 0x6655ab2aUL,
+ 0xb2eb2807UL, 0x2fb5c203UL, 0x86c57b9aUL, 0xd33708a5UL,
+ 0x302887f2UL, 0x23bfa5b2UL, 0x02036abaUL, 0xed16825cUL,
+ 0x8acf1c2bUL, 0xa779b492UL, 0xf307f2f0UL, 0x4e69e2a1UL,
+ 0x65daf4cdUL, 0x0605bed5UL, 0xd134621fUL, 0xc4a6fe8aUL,
+ 0x342e539dUL, 0xa2f355a0UL, 0x058ae132UL, 0xa4f6eb75UL,
+ 0x0b83ec39UL, 0x4060efaaUL, 0x5e719f06UL, 0xbd6e1051UL,
+ 0x3e218af9UL, 0x96dd063dUL, 0xdd3e05aeUL, 0x4de6bd46UL,
+ 0x91548db5UL, 0x71c45d05UL, 0x0406d46fUL, 0x605015ffUL,
+ 0x1998fb24UL, 0xd6bde997UL, 0x894043ccUL, 0x67d99e77UL,
+ 0xb0e842bdUL, 0x07898b88UL, 0xe7195b38UL, 0x79c8eedbUL,
+ 0xa17c0a47UL, 0x7c420fe9UL, 0xf8841ec9UL, 0x00000000UL,
+ 0x09808683UL, 0x322bed48UL, 0x1e1170acUL, 0x6c5a724eUL,
+ 0xfd0efffbUL, 0x0f853856UL, 0x3daed51eUL, 0x362d3927UL,
+ 0x0a0fd964UL, 0x685ca621UL, 0x9b5b54d1UL, 0x24362e3aUL,
+ 0x0c0a67b1UL, 0x9357e70fUL, 0xb4ee96d2UL, 0x1b9b919eUL,
+ 0x80c0c54fUL, 0x61dc20a2UL, 0x5a774b69UL, 0x1c121a16UL,
+ 0xe293ba0aUL, 0xc0a02ae5UL, 0x3c22e043UL, 0x121b171dUL,
+ 0x0e090d0bUL, 0xf28bc7adUL, 0x2db6a8b9UL, 0x141ea9c8UL,
+ 0x57f11985UL, 0xaf75074cUL, 0xee99ddbbUL, 0xa37f60fdUL,
+ 0xf701269fUL, 0x5c72f5bcUL, 0x44663bc5UL, 0x5bfb7e34UL,
+ 0x8b432976UL, 0xcb23c6dcUL, 0xb6edfc68UL, 0xb8e4f163UL,
+ 0xd731dccaUL, 0x42638510UL, 0x13972240UL, 0x84c61120UL,
+ 0x854a247dUL, 0xd2bb3df8UL, 0xaef93211UL, 0xc729a16dUL,
+ 0x1d9e2f4bUL, 0xdcb230f3UL, 0x0d8652ecUL, 0x77c1e3d0UL,
+ 0x2bb3166cUL, 0xa970b999UL, 0x119448faUL, 0x47e96422UL,
+ 0xa8fc8cc4UL, 0xa0f03f1aUL, 0x567d2cd8UL, 0x223390efUL,
+ 0x87494ec7UL, 0xd938d1c1UL, 0x8ccaa2feUL, 0x98d40b36UL,
+ 0xa6f581cfUL, 0xa57ade28UL, 0xdab78e26UL, 0x3fadbfa4UL,
+ 0x2c3a9de4UL, 0x5078920dUL, 0x6a5fcc9bUL, 0x547e4662UL,
+ 0xf68d13c2UL, 0x90d8b8e8UL, 0x2e39f75eUL, 0x82c3aff5UL,
+ 0x9f5d80beUL, 0x69d0937cUL, 0x6fd52da9UL, 0xcf2512b3UL,
+ 0xc8ac993bUL, 0x10187da7UL, 0xe89c636eUL, 0xdb3bbb7bUL,
+ 0xcd267809UL, 0x6e5918f4UL, 0xec9ab701UL, 0x834f9aa8UL,
+ 0xe6956e65UL, 0xaaffe67eUL, 0x21bccf08UL, 0xef15e8e6UL,
+ 0xbae79bd9UL, 0x4a6f36ceUL, 0xea9f09d4UL, 0x29b07cd6UL,
+ 0x31a4b2afUL, 0x2a3f2331UL, 0xc6a59430UL, 0x35a266c0UL,
+ 0x744ebc37UL, 0xfc82caa6UL, 0xe090d0b0UL, 0x33a7d815UL,
+ 0xf104984aUL, 0x41ecdaf7UL, 0x7fcd500eUL, 0x1791f62fUL,
+ 0x764dd68dUL, 0x43efb04dUL, 0xccaa4d54UL, 0xe49604dfUL,
+ 0x9ed1b5e3UL, 0x4c6a881bUL, 0xc12c1fb8UL, 0x4665517fUL,
+ 0x9d5eea04UL, 0x018c355dUL, 0xfa877473UL, 0xfb0b412eUL,
+ 0xb3671d5aUL, 0x92dbd252UL, 0xe9105633UL, 0x6dd64713UL,
+ 0x9ad7618cUL, 0x37a10c7aUL, 0x59f8148eUL, 0xeb133c89UL,
+ 0xcea927eeUL, 0xb761c935UL, 0xe11ce5edUL, 0x7a47b13cUL,
+ 0x9cd2df59UL, 0x55f2733fUL, 0x1814ce79UL, 0x73c737bfUL,
+ 0x53f7cdeaUL, 0x5ffdaa5bUL, 0xdf3d6f14UL, 0x7844db86UL,
+ 0xcaaff381UL, 0xb968c43eUL, 0x3824342cUL, 0xc2a3405fUL,
+ 0x161dc372UL, 0xbce2250cUL, 0x283c498bUL, 0xff0d9541UL,
+ 0x39a80171UL, 0x080cb3deUL, 0xd8b4e49cUL, 0x6456c190UL,
+ 0x7bcb8461UL, 0xd532b670UL, 0x486c5c74UL, 0xd0b85742UL,
+};
+
+static const NPT_UInt32 Td4[256] = {
+ 0x52525252UL, 0x09090909UL, 0x6a6a6a6aUL, 0xd5d5d5d5UL,
+ 0x30303030UL, 0x36363636UL, 0xa5a5a5a5UL, 0x38383838UL,
+ 0xbfbfbfbfUL, 0x40404040UL, 0xa3a3a3a3UL, 0x9e9e9e9eUL,
+ 0x81818181UL, 0xf3f3f3f3UL, 0xd7d7d7d7UL, 0xfbfbfbfbUL,
+ 0x7c7c7c7cUL, 0xe3e3e3e3UL, 0x39393939UL, 0x82828282UL,
+ 0x9b9b9b9bUL, 0x2f2f2f2fUL, 0xffffffffUL, 0x87878787UL,
+ 0x34343434UL, 0x8e8e8e8eUL, 0x43434343UL, 0x44444444UL,
+ 0xc4c4c4c4UL, 0xdedededeUL, 0xe9e9e9e9UL, 0xcbcbcbcbUL,
+ 0x54545454UL, 0x7b7b7b7bUL, 0x94949494UL, 0x32323232UL,
+ 0xa6a6a6a6UL, 0xc2c2c2c2UL, 0x23232323UL, 0x3d3d3d3dUL,
+ 0xeeeeeeeeUL, 0x4c4c4c4cUL, 0x95959595UL, 0x0b0b0b0bUL,
+ 0x42424242UL, 0xfafafafaUL, 0xc3c3c3c3UL, 0x4e4e4e4eUL,
+ 0x08080808UL, 0x2e2e2e2eUL, 0xa1a1a1a1UL, 0x66666666UL,
+ 0x28282828UL, 0xd9d9d9d9UL, 0x24242424UL, 0xb2b2b2b2UL,
+ 0x76767676UL, 0x5b5b5b5bUL, 0xa2a2a2a2UL, 0x49494949UL,
+ 0x6d6d6d6dUL, 0x8b8b8b8bUL, 0xd1d1d1d1UL, 0x25252525UL,
+ 0x72727272UL, 0xf8f8f8f8UL, 0xf6f6f6f6UL, 0x64646464UL,
+ 0x86868686UL, 0x68686868UL, 0x98989898UL, 0x16161616UL,
+ 0xd4d4d4d4UL, 0xa4a4a4a4UL, 0x5c5c5c5cUL, 0xccccccccUL,
+ 0x5d5d5d5dUL, 0x65656565UL, 0xb6b6b6b6UL, 0x92929292UL,
+ 0x6c6c6c6cUL, 0x70707070UL, 0x48484848UL, 0x50505050UL,
+ 0xfdfdfdfdUL, 0xededededUL, 0xb9b9b9b9UL, 0xdadadadaUL,
+ 0x5e5e5e5eUL, 0x15151515UL, 0x46464646UL, 0x57575757UL,
+ 0xa7a7a7a7UL, 0x8d8d8d8dUL, 0x9d9d9d9dUL, 0x84848484UL,
+ 0x90909090UL, 0xd8d8d8d8UL, 0xababababUL, 0x00000000UL,
+ 0x8c8c8c8cUL, 0xbcbcbcbcUL, 0xd3d3d3d3UL, 0x0a0a0a0aUL,
+ 0xf7f7f7f7UL, 0xe4e4e4e4UL, 0x58585858UL, 0x05050505UL,
+ 0xb8b8b8b8UL, 0xb3b3b3b3UL, 0x45454545UL, 0x06060606UL,
+ 0xd0d0d0d0UL, 0x2c2c2c2cUL, 0x1e1e1e1eUL, 0x8f8f8f8fUL,
+ 0xcacacacaUL, 0x3f3f3f3fUL, 0x0f0f0f0fUL, 0x02020202UL,
+ 0xc1c1c1c1UL, 0xafafafafUL, 0xbdbdbdbdUL, 0x03030303UL,
+ 0x01010101UL, 0x13131313UL, 0x8a8a8a8aUL, 0x6b6b6b6bUL,
+ 0x3a3a3a3aUL, 0x91919191UL, 0x11111111UL, 0x41414141UL,
+ 0x4f4f4f4fUL, 0x67676767UL, 0xdcdcdcdcUL, 0xeaeaeaeaUL,
+ 0x97979797UL, 0xf2f2f2f2UL, 0xcfcfcfcfUL, 0xcecececeUL,
+ 0xf0f0f0f0UL, 0xb4b4b4b4UL, 0xe6e6e6e6UL, 0x73737373UL,
+ 0x96969696UL, 0xacacacacUL, 0x74747474UL, 0x22222222UL,
+ 0xe7e7e7e7UL, 0xadadadadUL, 0x35353535UL, 0x85858585UL,
+ 0xe2e2e2e2UL, 0xf9f9f9f9UL, 0x37373737UL, 0xe8e8e8e8UL,
+ 0x1c1c1c1cUL, 0x75757575UL, 0xdfdfdfdfUL, 0x6e6e6e6eUL,
+ 0x47474747UL, 0xf1f1f1f1UL, 0x1a1a1a1aUL, 0x71717171UL,
+ 0x1d1d1d1dUL, 0x29292929UL, 0xc5c5c5c5UL, 0x89898989UL,
+ 0x6f6f6f6fUL, 0xb7b7b7b7UL, 0x62626262UL, 0x0e0e0e0eUL,
+ 0xaaaaaaaaUL, 0x18181818UL, 0xbebebebeUL, 0x1b1b1b1bUL,
+ 0xfcfcfcfcUL, 0x56565656UL, 0x3e3e3e3eUL, 0x4b4b4b4bUL,
+ 0xc6c6c6c6UL, 0xd2d2d2d2UL, 0x79797979UL, 0x20202020UL,
+ 0x9a9a9a9aUL, 0xdbdbdbdbUL, 0xc0c0c0c0UL, 0xfefefefeUL,
+ 0x78787878UL, 0xcdcdcdcdUL, 0x5a5a5a5aUL, 0xf4f4f4f4UL,
+ 0x1f1f1f1fUL, 0xddddddddUL, 0xa8a8a8a8UL, 0x33333333UL,
+ 0x88888888UL, 0x07070707UL, 0xc7c7c7c7UL, 0x31313131UL,
+ 0xb1b1b1b1UL, 0x12121212UL, 0x10101010UL, 0x59595959UL,
+ 0x27272727UL, 0x80808080UL, 0xececececUL, 0x5f5f5f5fUL,
+ 0x60606060UL, 0x51515151UL, 0x7f7f7f7fUL, 0xa9a9a9a9UL,
+ 0x19191919UL, 0xb5b5b5b5UL, 0x4a4a4a4aUL, 0x0d0d0d0dUL,
+ 0x2d2d2d2dUL, 0xe5e5e5e5UL, 0x7a7a7a7aUL, 0x9f9f9f9fUL,
+ 0x93939393UL, 0xc9c9c9c9UL, 0x9c9c9c9cUL, 0xefefefefUL,
+ 0xa0a0a0a0UL, 0xe0e0e0e0UL, 0x3b3b3b3bUL, 0x4d4d4d4dUL,
+ 0xaeaeaeaeUL, 0x2a2a2a2aUL, 0xf5f5f5f5UL, 0xb0b0b0b0UL,
+ 0xc8c8c8c8UL, 0xebebebebUL, 0xbbbbbbbbUL, 0x3c3c3c3cUL,
+ 0x83838383UL, 0x53535353UL, 0x99999999UL, 0x61616161UL,
+ 0x17171717UL, 0x2b2b2b2bUL, 0x04040404UL, 0x7e7e7e7eUL,
+ 0xbabababaUL, 0x77777777UL, 0xd6d6d6d6UL, 0x26262626UL,
+ 0xe1e1e1e1UL, 0x69696969UL, 0x14141414UL, 0x63636363UL,
+ 0x55555555UL, 0x21212121UL, 0x0c0c0c0cUL, 0x7d7d7d7dUL,
+};
+
+static const NPT_UInt32 rcon[] = {
+ 0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL,
+ 0x10000000UL, 0x20000000UL, 0x40000000UL, 0x80000000UL,
+ 0x1B000000UL, 0x36000000UL, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
+};
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define RORc(x, y) \
+ ( ((((NPT_UInt32)(x)&0xFFFFFFFFUL)>>(NPT_UInt32)(y)) | \
+ ((NPT_UInt32)(x)<<(NPT_UInt32)(32-(y)))) & 0xFFFFFFFFUL)
+
+#define Te0(x) TE0[x]
+#define Te1(x) RORc(TE0[x], 8)
+#define Te2(x) RORc(TE0[x], 16)
+#define Te3(x) RORc(TE0[x], 24)
+
+#define Td0(x) TD0[x]
+#define Td1(x) RORc(TD0[x], 8)
+#define Td2(x) RORc(TD0[x], 16)
+#define Td3(x) RORc(TD0[x], 24)
+
+#define Te4_0 0x000000FF & Te4
+#define Te4_1 0x0000FF00 & Te4
+#define Te4_2 0x00FF0000 & Te4
+#define Te4_3 0xFF000000 & Te4
+
+#define NPT_BYTE(x,n) (((unsigned char)((x) >> (8 * (n)))))
+
+/*----------------------------------------------------------------------
+| local utility functions
++---------------------------------------------------------------------*/
+static NPT_UInt32 setup_mix(NPT_UInt32 temp)
+{
+ return (Te4_3[NPT_BYTE(temp, 2)]) ^
+ (Te4_2[NPT_BYTE(temp, 1)]) ^
+ (Te4_1[NPT_BYTE(temp, 0)]) ^
+ (Te4_0[NPT_BYTE(temp, 3)]);
+}
+
+static NPT_UInt32 setup_mix2(NPT_UInt32 temp)
+{
+ return Td0(0xFF & Te4[NPT_BYTE(temp, 3)]) ^
+ Td1(0xFF & Te4[NPT_BYTE(temp, 2)]) ^
+ Td2(0xFF & Te4[NPT_BYTE(temp, 1)]) ^
+ Td3(0xFF & Te4[NPT_BYTE(temp, 0)]);
+}
+
+static inline NPT_UInt32 LOAD32H(const NPT_UInt8* p)
+{
+ return ((((NPT_UInt32)p[0])<<24) |
+ (((NPT_UInt32)p[1])<<16) |
+ (((NPT_UInt32)p[2])<< 8) |
+ (((NPT_UInt32)p[3]) ));
+}
+
+static inline void STORE32H(NPT_UInt32 x, NPT_UInt8* p)
+{
+ p[0] = (NPT_UInt8)(x>>24);
+ p[1] = (NPT_UInt8)(x>>16);
+ p[2] = (NPT_UInt8)(x>> 8);
+ p[3] = (NPT_UInt8)(x );
+}
+
+/*----------------------------------------------------------------------
+| NPT_AesBlockCipher
++---------------------------------------------------------------------*/
+class NPT_AesBlockCipher : public NPT_BlockCipher
+{
+public:
+ NPT_AesBlockCipher(const NPT_UInt8* key,
+ NPT_Size key_size);
+ NPT_Result ProcessBlock(const NPT_UInt8* , NPT_UInt8*) {
+ return NPT_ERROR_INTERNAL;
+ }
+ NPT_Size GetBlockSize() { return NPT_AES_BLOCK_SIZE; }
+ Algorithm GetAlgorithm() { return AES_128; }
+
+protected:
+ NPT_UInt32 m_eK[60];
+ NPT_UInt32 m_dK[60];
+ NPT_Cardinal m_RoundCount;
+};
+
+/*----------------------------------------------------------------------
+| NPT_AesBlockEncrypter
++---------------------------------------------------------------------*/
+class NPT_AesBlockEncrypter : public NPT_AesBlockCipher {
+public:
+ NPT_AesBlockEncrypter(const NPT_UInt8* key, NPT_Size key_size) :
+ NPT_AesBlockCipher(key, key_size) {}
+ Direction GetDirection() { return ENCRYPT; }
+ NPT_Result ProcessBlock(const NPT_UInt8* block_in, NPT_UInt8* block_out);
+};
+
+/*----------------------------------------------------------------------
+| NPT_AesBlockDecrypter
++---------------------------------------------------------------------*/
+class NPT_AesBlockDecrypter : public NPT_AesBlockCipher {
+public:
+ NPT_AesBlockDecrypter(const NPT_UInt8* key, NPT_Size key_size) :
+ NPT_AesBlockCipher(key, key_size) {}
+ Direction GetDirection() { return DECRYPT; }
+ NPT_Result ProcessBlock(const NPT_UInt8* block_in, NPT_UInt8* block_out);
+};
+
+/*----------------------------------------------------------------------
+| NPT_AesBlockCipher::NPT_AesBlockCipher
++---------------------------------------------------------------------*/
+NPT_AesBlockCipher::NPT_AesBlockCipher(const NPT_UInt8* key,
+ NPT_Size key_size)
+{
+ unsigned int i, j;
+ NPT_UInt32 temp;
+ NPT_UInt32 *rrk;
+
+ m_RoundCount = 10 + ((key_size/8)-2)*2;
+
+ /* setup the forward key */
+ i = 0;
+ NPT_UInt32* rk = m_eK;
+ rk[0] = LOAD32H(key );
+ rk[1] = LOAD32H(key + 4);
+ rk[2] = LOAD32H(key + 8);
+ rk[3] = LOAD32H(key + 12);
+ if (key_size == 16) {
+ j = 44;
+ for (;;) {
+ temp = rk[3];
+ rk[4] = rk[0] ^ setup_mix(temp) ^ rcon[i];
+ rk[5] = rk[1] ^ rk[4];
+ rk[6] = rk[2] ^ rk[5];
+ rk[7] = rk[3] ^ rk[6];
+ if (++i == 10) {
+ break;
+ }
+ rk += 4;
+ }
+ } else if (key_size == 24) {
+ j = 52;
+ rk[4] = LOAD32H(key + 16);
+ rk[5] = LOAD32H(key + 20);
+ for (;;) {
+ #ifdef _MSC_VER
+ temp = m_eK[rk - m_eK + 5];
+ #else
+ temp = rk[5];
+ #endif
+ rk[ 6] = rk[ 0] ^ setup_mix(temp) ^ rcon[i];
+ rk[ 7] = rk[ 1] ^ rk[ 6];
+ rk[ 8] = rk[ 2] ^ rk[ 7];
+ rk[ 9] = rk[ 3] ^ rk[ 8];
+ if (++i == 8) {
+ break;
+ }
+ rk[10] = rk[ 4] ^ rk[ 9];
+ rk[11] = rk[ 5] ^ rk[10];
+ rk += 6;
+ }
+ } else if (key_size == 32) {
+ j = 60;
+ rk[4] = LOAD32H(key + 16);
+ rk[5] = LOAD32H(key + 20);
+ rk[6] = LOAD32H(key + 24);
+ rk[7] = LOAD32H(key + 28);
+ for (;;) {
+ temp = rk[7];
+ rk[ 8] = rk[ 0] ^ setup_mix(temp) ^ rcon[i];
+ rk[ 9] = rk[ 1] ^ rk[ 8];
+ rk[10] = rk[ 2] ^ rk[ 9];
+ rk[11] = rk[ 3] ^ rk[10];
+ if (++i == 7) {
+ break;
+ }
+ temp = rk[11];
+ rk[12] = rk[ 4] ^ setup_mix(RORc(temp, 8));
+ rk[13] = rk[ 5] ^ rk[12];
+ rk[14] = rk[ 6] ^ rk[13];
+ rk[15] = rk[ 7] ^ rk[14];
+ rk += 8;
+ }
+ } else {
+ /* this can't happen */
+ return;
+ }
+
+ /* setup the inverse key now */
+ rk = m_dK;
+ rrk = m_eK + j - 4;
+
+ /* apply the inverse MixColumn transform to all round keys but the first and the last: */
+ /* copy first */
+ *rk++ = *rrk++;
+ *rk++ = *rrk++;
+ *rk++ = *rrk++;
+ *rk = *rrk;
+ rk -= 3; rrk -= 3;
+
+ for (i = 1; i < m_RoundCount; i++) {
+ rrk -= 4;
+ rk += 4;
+ temp = rrk[0];
+ rk[0] = setup_mix2(temp);
+ temp = rrk[1];
+ rk[1] = setup_mix2(temp);
+ temp = rrk[2];
+ rk[2] = setup_mix2(temp);
+ temp = rrk[3];
+ rk[3] = setup_mix2(temp);
+ }
+
+ /* copy last */
+ rrk -= 4;
+ rk += 4;
+ *rk++ = *rrk++;
+ *rk++ = *rrk++;
+ *rk++ = *rrk++;
+ *rk = *rrk;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AesBlockEncrypter::ProcessBlock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AesBlockEncrypter::ProcessBlock(const NPT_UInt8* pt, NPT_UInt8* ct)
+{
+ NPT_UInt32 s0, s1, s2, s3, t0, t1, t2, t3;
+ int Nr = m_RoundCount;
+ NPT_UInt32* rk = m_eK;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = LOAD32H(pt ); s0 ^= rk[0];
+ s1 = LOAD32H(pt + 4); s1 ^= rk[1];
+ s2 = LOAD32H(pt + 8); s2 ^= rk[2];
+ s3 = LOAD32H(pt + 12); s3 ^= rk[3];
+
+ for (int r = 0; ; r++) {
+ rk += 4;
+ t0 =
+ Te0(NPT_BYTE(s0, 3)) ^
+ Te1(NPT_BYTE(s1, 2)) ^
+ Te2(NPT_BYTE(s2, 1)) ^
+ Te3(NPT_BYTE(s3, 0)) ^
+ rk[0];
+ t1 =
+ Te0(NPT_BYTE(s1, 3)) ^
+ Te1(NPT_BYTE(s2, 2)) ^
+ Te2(NPT_BYTE(s3, 1)) ^
+ Te3(NPT_BYTE(s0, 0)) ^
+ rk[1];
+ t2 =
+ Te0(NPT_BYTE(s2, 3)) ^
+ Te1(NPT_BYTE(s3, 2)) ^
+ Te2(NPT_BYTE(s0, 1)) ^
+ Te3(NPT_BYTE(s1, 0)) ^
+ rk[2];
+ t3 =
+ Te0(NPT_BYTE(s3, 3)) ^
+ Te1(NPT_BYTE(s0, 2)) ^
+ Te2(NPT_BYTE(s1, 1)) ^
+ Te3(NPT_BYTE(s2, 0)) ^
+ rk[3];
+ if (r == Nr-2) {
+ break;
+ }
+ s0 = t0; s1 = t1; s2 = t2; s3 = t3;
+ }
+ rk += 4;
+
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Te4_3[NPT_BYTE(t0, 3)]) ^
+ (Te4_2[NPT_BYTE(t1, 2)]) ^
+ (Te4_1[NPT_BYTE(t2, 1)]) ^
+ (Te4_0[NPT_BYTE(t3, 0)]) ^
+ rk[0];
+ STORE32H(s0, ct);
+ s1 =
+ (Te4_3[NPT_BYTE(t1, 3)]) ^
+ (Te4_2[NPT_BYTE(t2, 2)]) ^
+ (Te4_1[NPT_BYTE(t3, 1)]) ^
+ (Te4_0[NPT_BYTE(t0, 0)]) ^
+ rk[1];
+ STORE32H(s1, ct+4);
+ s2 =
+ (Te4_3[NPT_BYTE(t2, 3)]) ^
+ (Te4_2[NPT_BYTE(t3, 2)]) ^
+ (Te4_1[NPT_BYTE(t0, 1)]) ^
+ (Te4_0[NPT_BYTE(t1, 0)]) ^
+ rk[2];
+ STORE32H(s2, ct+8);
+ s3 =
+ (Te4_3[NPT_BYTE(t3, 3)]) ^
+ (Te4_2[NPT_BYTE(t0, 2)]) ^
+ (Te4_1[NPT_BYTE(t1, 1)]) ^
+ (Te4_0[NPT_BYTE(t2, 0)]) ^
+ rk[3];
+ STORE32H(s3, ct+12);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AesBlockDecrypter::ProcessBlock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AesBlockDecrypter::ProcessBlock(const NPT_UInt8* ct, NPT_UInt8* pt)
+{
+ NPT_UInt32 s0, s1, s2, s3, t0, t1, t2, t3;
+
+ int Nr = m_RoundCount;
+ NPT_UInt32* rk = m_dK;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = LOAD32H(ct ); s0 ^= rk[0];
+ s1 = LOAD32H(ct + 4); s1 ^= rk[1];
+ s2 = LOAD32H(ct + 8); s2 ^= rk[2];
+ s3 = LOAD32H(ct + 12); s3 ^= rk[3];
+
+ for (int r = 0; ; r++) {
+ rk += 4;
+ t0 =
+ Td0(NPT_BYTE(s0, 3)) ^
+ Td1(NPT_BYTE(s3, 2)) ^
+ Td2(NPT_BYTE(s2, 1)) ^
+ Td3(NPT_BYTE(s1, 0)) ^
+ rk[0];
+ t1 =
+ Td0(NPT_BYTE(s1, 3)) ^
+ Td1(NPT_BYTE(s0, 2)) ^
+ Td2(NPT_BYTE(s3, 1)) ^
+ Td3(NPT_BYTE(s2, 0)) ^
+ rk[1];
+ t2 =
+ Td0(NPT_BYTE(s2, 3)) ^
+ Td1(NPT_BYTE(s1, 2)) ^
+ Td2(NPT_BYTE(s0, 1)) ^
+ Td3(NPT_BYTE(s3, 0)) ^
+ rk[2];
+ t3 =
+ Td0(NPT_BYTE(s3, 3)) ^
+ Td1(NPT_BYTE(s2, 2)) ^
+ Td2(NPT_BYTE(s1, 1)) ^
+ Td3(NPT_BYTE(s0, 0)) ^
+ rk[3];
+ if (r == Nr-2) {
+ break;
+ }
+ s0 = t0; s1 = t1; s2 = t2; s3 = t3;
+ }
+ rk += 4;
+
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Td4[NPT_BYTE(t0, 3)] & 0xff000000) ^
+ (Td4[NPT_BYTE(t3, 2)] & 0x00ff0000) ^
+ (Td4[NPT_BYTE(t2, 1)] & 0x0000ff00) ^
+ (Td4[NPT_BYTE(t1, 0)] & 0x000000ff) ^
+ rk[0];
+ STORE32H(s0, pt);
+ s1 =
+ (Td4[NPT_BYTE(t1, 3)] & 0xff000000) ^
+ (Td4[NPT_BYTE(t0, 2)] & 0x00ff0000) ^
+ (Td4[NPT_BYTE(t3, 1)] & 0x0000ff00) ^
+ (Td4[NPT_BYTE(t2, 0)] & 0x000000ff) ^
+ rk[1];
+ STORE32H(s1, pt+4);
+ s2 =
+ (Td4[NPT_BYTE(t2, 3)] & 0xff000000) ^
+ (Td4[NPT_BYTE(t1, 2)] & 0x00ff0000) ^
+ (Td4[NPT_BYTE(t0, 1)] & 0x0000ff00) ^
+ (Td4[NPT_BYTE(t3, 0)] & 0x000000ff) ^
+ rk[2];
+ STORE32H(s2, pt+8);
+ s3 =
+ (Td4[NPT_BYTE(t3, 3)] & 0xff000000) ^
+ (Td4[NPT_BYTE(t2, 2)] & 0x00ff0000) ^
+ (Td4[NPT_BYTE(t1, 1)] & 0x0000ff00) ^
+ (Td4[NPT_BYTE(t0, 0)] & 0x000000ff) ^
+ rk[3];
+ STORE32H(s3, pt+12);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BlockCipher::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BlockCipher::Create(Algorithm algorithm,
+ Direction direction,
+ const NPT_UInt8* key,
+ NPT_Size key_size,
+ NPT_BlockCipher*& cipher)
+{
+ cipher = NULL;
+ switch (algorithm) {
+ case AES_128:
+ if (key == NULL || key_size != 16) return NPT_ERROR_INVALID_PARAMETERS;
+ switch (direction) {
+ case ENCRYPT:
+ cipher = new NPT_AesBlockEncrypter(key, 16);
+ return NPT_SUCCESS;
+
+ case DECRYPT:
+ cipher = new NPT_AesBlockDecrypter(key, 16);
+ return NPT_SUCCESS;
+
+ default:
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ default:
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_BlockCipher::ProcessCbc
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BlockCipher::ProcessCbc(const NPT_UInt8* input, NPT_Size input_size, const NPT_UInt8* iv, NPT_DataBuffer& output)
+{
+ // this version only supports block sizes of 16
+ if (GetBlockSize() != 16) return NPT_ERROR_NOT_SUPPORTED;
+
+ // decrypt or encrypt depending on the direction of the cipher
+ NPT_UInt8 chain[16];
+ if (iv) {
+ NPT_CopyMemory(chain, iv, 16);
+ } else {
+ NPT_SetMemory(chain, 0, 16);
+ }
+ if (GetDirection() == ENCRYPT) {
+ // pad
+ unsigned int padding_size = 16-(input_size%16);
+ NPT_DataBuffer padded_input;
+ padded_input.SetDataSize(input_size+padding_size);
+ NPT_UInt8* plaintext = padded_input.UseData();
+ NPT_CopyMemory(plaintext, input, input_size);
+ for (unsigned int x=0; x<padding_size; x++) {
+ plaintext[input_size+x] = padding_size;
+ }
+
+ // process all blocks
+ unsigned int block_count = (input_size+padding_size)/16;
+ output.SetDataSize(block_count*16);
+ NPT_UInt8* ciphertext = output.UseData();
+ for (unsigned int x=0; x<block_count; x++) {
+ // xor with the chaining block
+ for (unsigned int y=0; y<16; y++) {
+ plaintext[y] ^= chain[y];
+ }
+
+ // encrypt the block
+ NPT_Result result = ProcessBlock(plaintext, ciphertext);
+ if (NPT_FAILED(result)) return result;
+
+ // chain and move forward to the next block
+ NPT_CopyMemory(chain, ciphertext, 16);
+ plaintext += 16;
+ ciphertext += 16;
+ }
+ } else {
+ // check that we have an integral number of blocks
+ if (input_size%16) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // process all blocks
+ unsigned int block_count = input_size/16;
+ output.SetBufferSize(block_count*16);
+ NPT_UInt8* plaintext = output.UseData();
+ const NPT_UInt8* ciphertext = input;
+ for (unsigned int x=0; x<block_count; x++) {
+ // decrypt block
+ NPT_Result result = ProcessBlock(ciphertext, plaintext);
+ if (NPT_FAILED(result)) return result;
+
+ // xor with the chaining block
+ for (unsigned int y=0; y<16; y++) {
+ plaintext[y] ^= chain[y];
+ }
+
+ // chain and move forward to the next block
+ NPT_CopyMemory(chain, ciphertext, 16);
+ plaintext += 16;
+ ciphertext += 16;
+ }
+
+ // padding
+ plaintext -= 16;
+ unsigned int padding_size = plaintext[15];
+ if (padding_size == 0 || padding_size > 16) {
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+ for (unsigned int y=0; y<padding_size; y++) {
+ if (plaintext[15-y] != padding_size) {
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+ }
+ output.SetDataSize(block_count*16 - padding_size);
+ }
+
+ return NPT_SUCCESS;
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptCrypto.h b/lib/libUPnP/Neptune/Source/Core/NptCrypto.h
new file mode 100644
index 0000000..04eb58f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptCrypto.h
@@ -0,0 +1,78 @@
+/*****************************************************************
+|
+| Neptune - Crypto
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_CRYPTO_H_
+#define _NPT_CRYPTO_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptDataBuffer.h"
+
+/*----------------------------------------------------------------------
+| NPT_BlockCipher
++---------------------------------------------------------------------*/
+class NPT_BlockCipher {
+public:
+ // types
+ typedef enum {
+ AES_128
+ } Algorithm;
+
+ typedef enum {
+ ENCRYPT,
+ DECRYPT
+ } Direction;
+
+ // factory
+ static NPT_Result Create(Algorithm algorithm,
+ Direction direction,
+ const NPT_UInt8* key,
+ NPT_Size key_size,
+ NPT_BlockCipher*& cipher);
+
+ // methods
+ virtual ~NPT_BlockCipher() {}
+ virtual NPT_Size GetBlockSize() = 0;
+ virtual Direction GetDirection() = 0;
+ virtual Algorithm GetAlgorithm() = 0;
+ virtual NPT_Result ProcessBlock(const NPT_UInt8* input, NPT_UInt8* output) = 0;
+ /**
+ * @param iv Initial vector (same size as cipher block size), or NULL for an IV made up of all zeros.
+ */
+ virtual NPT_Result ProcessCbc(const NPT_UInt8* input, NPT_Size input_size, const NPT_UInt8* iv, NPT_DataBuffer& output);
+
+protected:
+ NPT_BlockCipher() {} // don't instantiate directly
+};
+
+#endif // _NPT_CRYPTO_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDataBuffer.cpp b/lib/libUPnP/Neptune/Source/Core/NptDataBuffer.cpp
new file mode 100644
index 0000000..f5ab03c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDataBuffer.cpp
@@ -0,0 +1,256 @@
+/*****************************************************************
+|
+| Neptune - Data Buffer
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptDataBuffer.h"
+#include "NptUtils.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::NPT_DataBuffer
++---------------------------------------------------------------------*/
+NPT_DataBuffer::NPT_DataBuffer() :
+ m_BufferIsLocal(true),
+ m_Buffer(NULL),
+ m_BufferSize(0),
+ m_DataSize(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::NPT_DataBuffer
++---------------------------------------------------------------------*/
+NPT_DataBuffer::NPT_DataBuffer(NPT_Size bufferSize) :
+ m_BufferIsLocal(true),
+ m_Buffer(bufferSize?new NPT_Byte[bufferSize]:NULL),
+ m_BufferSize(bufferSize),
+ m_DataSize(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::NPT_DataBuffer
++---------------------------------------------------------------------*/
+NPT_DataBuffer::NPT_DataBuffer(const void* data, NPT_Size data_size, bool copy) :
+ m_BufferIsLocal(copy),
+ m_Buffer(copy?(data_size?new NPT_Byte[data_size]:NULL):reinterpret_cast<NPT_Byte*>(const_cast<void*>(data))),
+ m_BufferSize(data_size),
+ m_DataSize(data_size)
+{
+ if (copy && data_size) NPT_CopyMemory(m_Buffer, data, data_size);
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::NPT_DataBuffer
++---------------------------------------------------------------------*/
+NPT_DataBuffer::NPT_DataBuffer(const NPT_DataBuffer& other) :
+ m_BufferIsLocal(true),
+ m_Buffer(NULL),
+ m_BufferSize(other.m_DataSize),
+ m_DataSize(other.m_DataSize)
+{
+ if (m_BufferSize) {
+ m_Buffer = new NPT_Byte[m_BufferSize];
+ NPT_CopyMemory(m_Buffer, other.m_Buffer, m_BufferSize);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::~NPT_DataBuffer
++---------------------------------------------------------------------*/
+NPT_DataBuffer::~NPT_DataBuffer()
+{
+ Clear();
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::Clear
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DataBuffer::Clear()
+{
+ if (m_BufferIsLocal) {
+ delete[] m_Buffer;
+ }
+ m_Buffer = NULL;
+ m_DataSize = 0;
+ m_BufferSize = 0;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::operator=
++---------------------------------------------------------------------*/
+NPT_DataBuffer&
+NPT_DataBuffer::operator=(const NPT_DataBuffer& copy)
+{
+ // do nothing if we're assigning to ourselves
+ if (this != &copy) {
+ Clear();
+
+ m_BufferIsLocal = true;
+ m_BufferSize = copy.m_BufferSize;
+ m_DataSize = copy.m_DataSize;
+
+ if (m_BufferSize) {
+ m_Buffer = new NPT_Byte[m_BufferSize];
+ NPT_CopyMemory(m_Buffer, copy.m_Buffer, m_BufferSize);
+ }
+ }
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::operator==
++---------------------------------------------------------------------*/
+bool
+NPT_DataBuffer::operator==(const NPT_DataBuffer& other) const
+{
+ // check that the sizes match
+ if (m_DataSize != other.m_DataSize) return false;
+
+ return NPT_MemoryEqual(m_Buffer,
+ other.m_Buffer,
+ m_DataSize);
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::SetBuffer
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DataBuffer::SetBuffer(NPT_Byte* buffer, NPT_Size buffer_size)
+{
+ Clear();
+
+ // we're now using an external buffer
+ m_BufferIsLocal = false;
+ m_Buffer = buffer;
+ m_BufferSize = buffer_size;
+ m_DataSize = 0;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::SetBufferSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DataBuffer::SetBufferSize(NPT_Size buffer_size)
+{
+ if (m_BufferIsLocal) {
+ return ReallocateBuffer(buffer_size);
+ } else {
+ return NPT_ERROR_NOT_SUPPORTED; // you cannot change the
+ // buffer management mode
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::Reserve
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DataBuffer::Reserve(NPT_Size size)
+{
+ if (size <= m_BufferSize) return NPT_SUCCESS;
+
+ // try doubling the buffer to accomodate for the new size
+ NPT_Size new_size = m_BufferSize*2;
+ if (new_size < size) new_size = size;
+ return SetBufferSize(new_size);
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::SetDataSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DataBuffer::SetDataSize(NPT_Size size)
+{
+ if (size > m_BufferSize) {
+ // the buffer is too small, we need to reallocate it
+ if (m_BufferIsLocal) {
+ NPT_CHECK(ReallocateBuffer(size));
+ } else {
+ // we cannot reallocate an external buffer
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ }
+ m_DataSize = size;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::SetData
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DataBuffer::SetData(const NPT_Byte* data, NPT_Size size)
+{
+ if (size > m_BufferSize) {
+ if (m_BufferIsLocal) {
+ NPT_CHECK(ReallocateBuffer(size));
+ } else {
+ return NPT_ERROR_INVALID_STATE;
+ }
+ }
+ if (data) NPT_CopyMemory(m_Buffer, data, size);
+ m_DataSize = size;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer::ReallocateBuffer
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DataBuffer::ReallocateBuffer(NPT_Size size)
+{
+ // check that the existing data fits
+ if (m_DataSize > size) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // allocate a new buffer
+ NPT_Byte* newBuffer = new NPT_Byte[size];
+
+ // copy the contents of the previous buffer, if any
+ if (m_Buffer && m_DataSize) {
+ NPT_CopyMemory(newBuffer, m_Buffer, m_DataSize);
+ }
+
+ // destroy the previous buffer
+ delete[] m_Buffer;
+
+ // use the new buffer
+ m_Buffer = newBuffer;
+ m_BufferSize = size;
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDataBuffer.h b/lib/libUPnP/Neptune/Source/Core/NptDataBuffer.h
new file mode 100644
index 0000000..7e57c01
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDataBuffer.h
@@ -0,0 +1,83 @@
+/*****************************************************************
+|
+| Neptune - Datagram Packets
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_DATA_BUFFER_H_
+#define _NPT_DATA_BUFFER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptConstants.h"
+
+/*----------------------------------------------------------------------
+| NPT_DataBuffer
++---------------------------------------------------------------------*/
+class NPT_DataBuffer
+{
+ public:
+ // constructors & destructor
+ NPT_DataBuffer(); // size unknown until first set
+ NPT_DataBuffer(NPT_Size size); // initial size specified
+ NPT_DataBuffer(const void* data, NPT_Size size, bool copy = true); // initial data and size specified
+ NPT_DataBuffer(const NPT_DataBuffer& other);
+ virtual ~NPT_DataBuffer();
+
+ // operators
+ NPT_DataBuffer& operator=(const NPT_DataBuffer& copy);
+ bool operator==(const NPT_DataBuffer& other) const;
+
+ // data buffer handling methods
+ virtual NPT_Result SetBuffer(NPT_Byte* buffer, NPT_Size bufferSize);
+ virtual NPT_Result SetBufferSize(NPT_Size bufferSize);
+ virtual NPT_Size GetBufferSize() const { return m_BufferSize; }
+ virtual NPT_Result Reserve(NPT_Size size);
+ virtual NPT_Result Clear();
+
+ // data handling methods
+ virtual const NPT_Byte* GetData() const { return m_Buffer; }
+ virtual NPT_Byte* UseData() { return m_Buffer; };
+ virtual NPT_Size GetDataSize() const { return m_DataSize; }
+ virtual NPT_Result SetDataSize(NPT_Size size);
+ virtual NPT_Result SetData(const NPT_Byte* data, NPT_Size dataSize);
+
+ protected:
+ // members
+ bool m_BufferIsLocal;
+ NPT_Byte* m_Buffer;
+ NPT_Size m_BufferSize;
+ NPT_Size m_DataSize;
+
+ // methods
+ NPT_Result ReallocateBuffer(NPT_Size size);
+};
+
+#endif // _NPT_DATA_BUFFER_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDebug.cpp b/lib/libUPnP/Neptune/Source/Core/NptDebug.cpp
new file mode 100644
index 0000000..d9b7041
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDebug.cpp
@@ -0,0 +1,83 @@
+/*****************************************************************
+|
+| Neptune - Debug Utilities
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdarg.h>
+#include "NptUtils.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define NPT_DEBUG_LOCAL_BUFFER_SIZE 1024
+#define NPT_DEBUG_BUFFER_INCREMENT 4096
+#define NPT_DEBUG_BUFFER_MAX_SIZE 65536
+
+/*----------------------------------------------------------------------
+| NPT_Debug
++---------------------------------------------------------------------*/
+void
+NPT_Debug(const char* format, ...)
+{
+#if defined(NPT_DEBUG)
+ char local_buffer[NPT_DEBUG_LOCAL_BUFFER_SIZE];
+ unsigned int buffer_size = NPT_DEBUG_LOCAL_BUFFER_SIZE;
+ char* buffer = local_buffer;
+ va_list args;
+
+ va_start(args, format);
+
+ for(;;) {
+ int result;
+
+ /* try to format the message (it might not fit) */
+ result = NPT_FormatStringVN(buffer, buffer_size-1, format, args);
+ buffer[buffer_size-1] = 0; /* force a NULL termination */
+ if (result >= 0) break;
+
+ /* the buffer was too small, try something bigger */
+ buffer_size = (buffer_size+NPT_DEBUG_BUFFER_INCREMENT)*2;
+ if (buffer_size > NPT_DEBUG_BUFFER_MAX_SIZE) break;
+ if (buffer != local_buffer) delete[] buffer;
+ buffer = new char[buffer_size];
+ if (buffer == NULL) return;
+ }
+
+ NPT_DebugOutput(buffer);
+ if (buffer != local_buffer) delete[] buffer;
+
+ va_end(args);
+#else
+ NPT_COMPILER_UNUSED(format);
+#endif
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDebug.h b/lib/libUPnP/Neptune/Source/Core/NptDebug.h
new file mode 100644
index 0000000..d4973a2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDebug.h
@@ -0,0 +1,56 @@
+/*****************************************************************
+|
+| Neptune - Debug Utilities
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_DEBUG_H_
+#define _NPT_DEBUG_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+
+/*----------------------------------------------------------------------
+| standard macros
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_HAVE_ASSERT_H) && defined(NPT_DEBUG)
+#include <assert.h>
+#define NPT_ASSERT(x) assert(x)
+#else
+#define NPT_ASSERT(x) ((void)0)
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_Debug
++---------------------------------------------------------------------*/
+extern void NPT_Debug(const char* format, ...);
+extern void NPT_DebugOutput(const char* message);
+
+#endif // _NPT_DEBUG_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDefs.h b/lib/libUPnP/Neptune/Source/Core/NptDefs.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDefs.h
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDigest.cpp b/lib/libUPnP/Neptune/Source/Core/NptDigest.cpp
new file mode 100644
index 0000000..4e7fb74
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDigest.cpp
@@ -0,0 +1,685 @@
+/*****************************************************************
+|
+| Neptune - Message Digests
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*
+ Portions of this code are based on the code of LibTomCrypt
+ that was released into public domain by Tom St Denis.
+*/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptDigest.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define NPT_BASIC_DIGEST_BLOCK_SIZE 64
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define NPT_Digest_ROL(x, y) \
+( (((NPT_UInt32)(x) << (y)) | (((NPT_UInt32)(x) & 0xFFFFFFFFUL) >> (32 - (y)))) & 0xFFFFFFFFUL)
+#define NPT_Digest_ROR(x, y) \
+( ((((NPT_UInt32)(x)&0xFFFFFFFFUL)>>(NPT_UInt32)((y)&31)) | ((NPT_UInt32)(x)<<(NPT_UInt32)(32-((y)&31)))) & 0xFFFFFFFFUL)
+
+#define NPT_Sha1_F0(x,y,z) (z ^ (x & (y ^ z)))
+#define NPT_Sha1_F1(x,y,z) (x ^ y ^ z)
+#define NPT_Sha1_F2(x,y,z) ((x & y) | (z & (x | y)))
+#define NPT_Sha1_F3(x,y,z) (x ^ y ^ z)
+
+#define NPT_Sha1_FF0(a,b,c,d,e,i) e = (NPT_Digest_ROL(a, 5) + NPT_Sha1_F0(b,c,d) + e + W[i] + 0x5a827999UL); b = NPT_Digest_ROL(b, 30);
+#define NPT_Sha1_FF1(a,b,c,d,e,i) e = (NPT_Digest_ROL(a, 5) + NPT_Sha1_F1(b,c,d) + e + W[i] + 0x6ed9eba1UL); b = NPT_Digest_ROL(b, 30);
+#define NPT_Sha1_FF2(a,b,c,d,e,i) e = (NPT_Digest_ROL(a, 5) + NPT_Sha1_F2(b,c,d) + e + W[i] + 0x8f1bbcdcUL); b = NPT_Digest_ROL(b, 30);
+#define NPT_Sha1_FF3(a,b,c,d,e,i) e = (NPT_Digest_ROL(a, 5) + NPT_Sha1_F3(b,c,d) + e + W[i] + 0xca62c1d6UL); b = NPT_Digest_ROL(b, 30);
+
+#define NPT_Sha256_Ch(x,y,z) (z ^ (x & (y ^ z)))
+#define NPT_Sha256_Maj(x,y,z) (((x | y) & z) | (x & y))
+#define NPT_Sha256_S(x, n) NPT_Digest_ROR((x),(n))
+#define NPT_Sha256_R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
+#define NPT_Sha256_Sigma0(x) (NPT_Sha256_S(x, 2) ^ NPT_Sha256_S(x, 13) ^ NPT_Sha256_S(x, 22))
+#define NPT_Sha256_Sigma1(x) (NPT_Sha256_S(x, 6) ^ NPT_Sha256_S(x, 11) ^ NPT_Sha256_S(x, 25))
+#define NPT_Sha256_Gamma0(x) (NPT_Sha256_S(x, 7) ^ NPT_Sha256_S(x, 18) ^ NPT_Sha256_R(x, 3))
+#define NPT_Sha256_Gamma1(x) (NPT_Sha256_S(x, 17) ^ NPT_Sha256_S(x, 19) ^ NPT_Sha256_R(x, 10))
+
+
+#define NPT_Md5_F(x,y,z) (z ^ (x & (y ^ z)))
+#define NPT_Md5_G(x,y,z) (y ^ (z & (y ^ x)))
+#define NPT_Md5_H(x,y,z) (x ^ y ^ z)
+#define NPT_Md5_I(x,y,z) (y ^ (x | (~z)))
+
+#define NPT_Md5_FF(a,b,c,d,M,s,t) \
+ a = (a + NPT_Md5_F(b,c,d) + M + t); a = NPT_Digest_ROL(a, s) + b;
+
+#define NPT_Md5_GG(a,b,c,d,M,s,t) \
+ a = (a + NPT_Md5_G(b,c,d) + M + t); a = NPT_Digest_ROL(a, s) + b;
+
+#define NPT_Md5_HH(a,b,c,d,M,s,t) \
+ a = (a + NPT_Md5_H(b,c,d) + M + t); a = NPT_Digest_ROL(a, s) + b;
+
+#define NPT_Md5_II(a,b,c,d,M,s,t) \
+ a = (a + NPT_Md5_I(b,c,d) + M + t); a = NPT_Digest_ROL(a, s) + b;
+
+/*----------------------------------------------------------------------
+| NPT_BasicDigest
++---------------------------------------------------------------------*/
+class NPT_BasicDigest : public NPT_Digest
+{
+public:
+ NPT_BasicDigest();
+
+ // NPT_Digest methods
+ virtual NPT_Result Update(const NPT_UInt8* data, NPT_Size data_size);
+
+protected:
+ // methods
+ NPT_Result ComputeDigest(NPT_UInt32* state,
+ NPT_Cardinal state_count,
+ bool big_endian,
+ NPT_DataBuffer& digest);
+ virtual void CompressBlock(const NPT_UInt8* block) = 0;
+
+ // members
+ NPT_UInt64 m_Length;
+ NPT_UInt32 m_Pending;
+ NPT_UInt8 m_Buffer[NPT_BASIC_DIGEST_BLOCK_SIZE];
+};
+
+/*----------------------------------------------------------------------
+| NPT_BasicDigest::NPT_BasicDigest
++---------------------------------------------------------------------*/
+NPT_BasicDigest::NPT_BasicDigest() :
+ m_Length(0),
+ m_Pending(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_BasicDigest::Update
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BasicDigest::Update(const NPT_UInt8* data, NPT_Size data_size)
+{
+ while (data_size > 0) {
+ if (m_Pending == 0 && data_size >= NPT_BASIC_DIGEST_BLOCK_SIZE) {
+ CompressBlock(data);
+ m_Length += NPT_BASIC_DIGEST_BLOCK_SIZE * 8;
+ data += NPT_BASIC_DIGEST_BLOCK_SIZE;
+ data_size -= NPT_BASIC_DIGEST_BLOCK_SIZE;
+ } else {
+ unsigned int chunk = data_size;
+ if (chunk > (NPT_BASIC_DIGEST_BLOCK_SIZE - m_Pending)) {
+ chunk = NPT_BASIC_DIGEST_BLOCK_SIZE - m_Pending;
+ }
+ NPT_CopyMemory(&m_Buffer[m_Pending], data, chunk);
+ m_Pending += chunk;
+ data += chunk;
+ data_size -= chunk;
+ if (m_Pending == NPT_BASIC_DIGEST_BLOCK_SIZE) {
+ CompressBlock(m_Buffer);
+ m_Length += 8 * NPT_BASIC_DIGEST_BLOCK_SIZE;
+ m_Pending = 0;
+ }
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+
+/*----------------------------------------------------------------------
+| NPT_BasicDigest::ComputeDigest
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BasicDigest::ComputeDigest(NPT_UInt32* state,
+ NPT_Cardinal state_count,
+ bool big_endian,
+ NPT_DataBuffer& digest)
+{
+ // increase the length of the message
+ m_Length += m_Pending * 8;
+
+ // append the '1' bit
+ m_Buffer[m_Pending++] = 0x80;
+
+ // if there isn't enough space left for the size (8 bytes), then compress.
+ // then we can fall back to padding zeros and length encoding as normal.
+ if (m_Pending > NPT_BASIC_DIGEST_BLOCK_SIZE-8) {
+ while (m_Pending < NPT_BASIC_DIGEST_BLOCK_SIZE) {
+ m_Buffer[m_Pending++] = 0;
+ }
+ CompressBlock(m_Buffer);
+ m_Pending = 0;
+ }
+
+ // pad with zeroes up until the length
+ while (m_Pending < NPT_BASIC_DIGEST_BLOCK_SIZE-8) {
+ m_Buffer[m_Pending++] = 0;
+ }
+
+ // store length
+ if (big_endian) {
+ NPT_BytesFromInt64Be(&m_Buffer[NPT_BASIC_DIGEST_BLOCK_SIZE-8], m_Length);
+ } else {
+ NPT_BytesFromInt64Le(&m_Buffer[NPT_BASIC_DIGEST_BLOCK_SIZE-8], m_Length);
+ }
+ CompressBlock(m_Buffer);
+
+ // copy output
+ digest.SetDataSize(4*state_count);
+ NPT_UInt8* out = digest.UseData();
+ if (big_endian) {
+ for (unsigned int i = 0; i < state_count; i++) {
+ NPT_BytesFromInt32Be(out, state[i]);
+ out += 4;
+ }
+ } else {
+ for (unsigned int i = 0; i < state_count; i++) {
+ NPT_BytesFromInt32Le(out, state[i]);
+ out += 4;
+ }
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Sha1Digest
++---------------------------------------------------------------------*/
+class NPT_Sha1Digest : public NPT_BasicDigest
+{
+public:
+ NPT_Sha1Digest();
+
+ // NPT_Digest methods
+ virtual NPT_Result GetDigest(NPT_DataBuffer& digest);
+ virtual unsigned int GetSize() { return 20; }
+
+private:
+ // methods
+ virtual void CompressBlock(const NPT_UInt8* block);
+
+ // members
+ NPT_UInt32 m_State[5];
+};
+
+/*----------------------------------------------------------------------
+| NPT_Sha1Digest::NPT_Sha1Digest
++---------------------------------------------------------------------*/
+NPT_Sha1Digest::NPT_Sha1Digest()
+{
+ m_State[0] = 0x67452301UL;
+ m_State[1] = 0xefcdab89UL;
+ m_State[2] = 0x98badcfeUL;
+ m_State[3] = 0x10325476UL;
+ m_State[4] = 0xc3d2e1f0UL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Sha1Digest::CompressBlock
++---------------------------------------------------------------------*/
+void
+NPT_Sha1Digest::CompressBlock(const NPT_UInt8* block)
+{
+ NPT_UInt32 a,b,c,d,e,t,W[80];
+
+ // copy the 512-bit block into W[0..15]
+ for (unsigned int i = 0; i < 16; i++) {
+ W[i] = NPT_BytesToInt32Be(&block[4*i]);
+ }
+
+ // copy the state to local variables
+ a = m_State[0];
+ b = m_State[1];
+ c = m_State[2];
+ d = m_State[3];
+ e = m_State[4];
+
+ // expand it
+ unsigned int i;
+ for (i = 16; i < 80; i++) {
+ W[i] = NPT_Digest_ROL(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);
+ }
+
+ // compress
+ for (i = 0; i < 20; ) {
+ NPT_Sha1_FF0(a,b,c,d,e,i++); t = e; e = d; d = c; c = b; b = a; a = t;
+ }
+
+ for (; i < 40; ) {
+ NPT_Sha1_FF1(a,b,c,d,e,i++); t = e; e = d; d = c; c = b; b = a; a = t;
+ }
+
+ for (; i < 60; ) {
+ NPT_Sha1_FF2(a,b,c,d,e,i++); t = e; e = d; d = c; c = b; b = a; a = t;
+ }
+
+ for (; i < 80; ) {
+ NPT_Sha1_FF3(a,b,c,d,e,i++); t = e; e = d; d = c; c = b; b = a; a = t;
+ }
+
+ // store the variables back into the state
+ m_State[0] += a;
+ m_State[1] += b;
+ m_State[2] += c;
+ m_State[3] += d;
+ m_State[4] += e;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Sha1Digest::GetDigest
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Sha1Digest::GetDigest(NPT_DataBuffer& digest)
+{
+ return ComputeDigest(m_State, 5, true, digest);
+}
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+static const NPT_UInt32 NPT_Sha256_K[64] = {
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
+ 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
+ 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
+ 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
+ 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
+ 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
+ 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
+ 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
+ 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
+ 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
+};
+
+/*----------------------------------------------------------------------
+| NPT_Sha256Digest
++---------------------------------------------------------------------*/
+class NPT_Sha256Digest : public NPT_BasicDigest
+{
+public:
+ NPT_Sha256Digest();
+
+ // NPT_Digest methods
+ virtual NPT_Result GetDigest(NPT_DataBuffer& digest);
+ virtual unsigned int GetSize() { return 32; }
+
+private:
+ // methods
+ virtual void CompressBlock(const NPT_UInt8* block);
+
+ // members
+ NPT_UInt32 m_State[8];
+};
+
+/*----------------------------------------------------------------------
+| NPT_Sha256Digest::NPT_Sha256Digest
++---------------------------------------------------------------------*/
+NPT_Sha256Digest::NPT_Sha256Digest()
+{
+ m_State[0] = 0x6A09E667UL;
+ m_State[1] = 0xBB67AE85UL;
+ m_State[2] = 0x3C6EF372UL;
+ m_State[3] = 0xA54FF53AUL;
+ m_State[4] = 0x510E527FUL;
+ m_State[5] = 0x9B05688CUL;
+ m_State[6] = 0x1F83D9ABUL;
+ m_State[7] = 0x5BE0CD19UL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Sha256Digest::CompressBlock
++---------------------------------------------------------------------*/
+void
+NPT_Sha256Digest::CompressBlock(const NPT_UInt8* block)
+{
+ NPT_UInt32 S[8], W[64];
+
+ // copy the state into the local workspace
+ for (unsigned int i = 0; i < 8; i++) {
+ S[i] = m_State[i];
+ }
+
+ // copy the 512-bit block into W[0..15]
+ for (unsigned int i = 0; i < 16; i++) {
+ W[i] = NPT_BytesToInt32Be(&block[4*i]);
+ }
+
+ // fill W[16..63]
+ for (unsigned int i = 16; i < 64; i++) {
+ W[i] = NPT_Sha256_Gamma1(W[i - 2]) + W[i - 7] + NPT_Sha256_Gamma0(W[i - 15]) + W[i - 16];
+ }
+
+ // compress
+ for (unsigned int i = 0; i < 64; ++i) {
+ NPT_UInt32 t0 =
+ S[7] +
+ NPT_Sha256_Sigma1(S[4]) +
+ NPT_Sha256_Ch(S[4], S[5], S[6]) +
+ NPT_Sha256_K[i] +
+ W[i];
+ NPT_UInt32 t1 = NPT_Sha256_Sigma0(S[0]) + NPT_Sha256_Maj(S[0], S[1], S[2]);
+ S[3] += t0;
+ S[7] = t0 + t1;
+
+ NPT_UInt32 t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4];
+ S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;
+ }
+
+ // store the local variables back into the state
+ for (unsigned i = 0; i < 8; i++) {
+ m_State[i] += S[i];
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Sha256Digest::GetDigest
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Sha256Digest::GetDigest(NPT_DataBuffer& digest)
+{
+ return ComputeDigest(m_State, 8, true, digest);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Md5Digest
++---------------------------------------------------------------------*/
+class NPT_Md5Digest : public NPT_BasicDigest
+{
+public:
+ NPT_Md5Digest();
+
+ // NPT_Digest methods
+ virtual NPT_Result GetDigest(NPT_DataBuffer& digest);
+ virtual unsigned int GetSize() { return 16; }
+
+protected:
+ // methods
+ virtual void CompressBlock(const NPT_UInt8* block);
+
+ // members
+ NPT_UInt32 m_State[4];
+};
+
+/*----------------------------------------------------------------------
+| NPT_Md5Digest::NPT_Md5Digest
++---------------------------------------------------------------------*/
+NPT_Md5Digest::NPT_Md5Digest()
+{
+ m_State[0] = 0x67452301UL;
+ m_State[1] = 0xefcdab89UL;
+ m_State[2] = 0x98badcfeUL;
+ m_State[3] = 0x10325476UL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Md5Digest::CompressBlock
++---------------------------------------------------------------------*/
+void
+NPT_Md5Digest::CompressBlock(const NPT_UInt8* block)
+{
+ NPT_UInt32 a,b,c,d,W[16];
+
+ // copy the 512-bit block into W[0..15]
+ unsigned int i;
+ for (i = 0; i < 16; i++) {
+ W[i] = NPT_BytesToInt32Le(&block[4*i]);
+ }
+
+ // copy the state to local variables
+ a = m_State[0];
+ b = m_State[1];
+ c = m_State[2];
+ d = m_State[3];
+
+ // round 1
+ NPT_Md5_FF(a,b,c,d,W[ 0], 7,0xd76aa478UL)
+ NPT_Md5_FF(d,a,b,c,W[ 1],12,0xe8c7b756UL)
+ NPT_Md5_FF(c,d,a,b,W[ 2],17,0x242070dbUL)
+ NPT_Md5_FF(b,c,d,a,W[ 3],22,0xc1bdceeeUL)
+ NPT_Md5_FF(a,b,c,d,W[ 4], 7,0xf57c0fafUL)
+ NPT_Md5_FF(d,a,b,c,W[ 5],12,0x4787c62aUL)
+ NPT_Md5_FF(c,d,a,b,W[ 6],17,0xa8304613UL)
+ NPT_Md5_FF(b,c,d,a,W[ 7],22,0xfd469501UL)
+ NPT_Md5_FF(a,b,c,d,W[ 8], 7,0x698098d8UL)
+ NPT_Md5_FF(d,a,b,c,W[ 9],12,0x8b44f7afUL)
+ NPT_Md5_FF(c,d,a,b,W[10],17,0xffff5bb1UL)
+ NPT_Md5_FF(b,c,d,a,W[11],22,0x895cd7beUL)
+ NPT_Md5_FF(a,b,c,d,W[12], 7,0x6b901122UL)
+ NPT_Md5_FF(d,a,b,c,W[13],12,0xfd987193UL)
+ NPT_Md5_FF(c,d,a,b,W[14],17,0xa679438eUL)
+ NPT_Md5_FF(b,c,d,a,W[15],22,0x49b40821UL)
+
+ // round 2
+ NPT_Md5_GG(a,b,c,d,W[ 1], 5,0xf61e2562UL)
+ NPT_Md5_GG(d,a,b,c,W[ 6], 9,0xc040b340UL)
+ NPT_Md5_GG(c,d,a,b,W[11],14,0x265e5a51UL)
+ NPT_Md5_GG(b,c,d,a,W[ 0],20,0xe9b6c7aaUL)
+ NPT_Md5_GG(a,b,c,d,W[ 5], 5,0xd62f105dUL)
+ NPT_Md5_GG(d,a,b,c,W[10], 9,0x02441453UL)
+ NPT_Md5_GG(c,d,a,b,W[15],14,0xd8a1e681UL)
+ NPT_Md5_GG(b,c,d,a,W[ 4],20,0xe7d3fbc8UL)
+ NPT_Md5_GG(a,b,c,d,W[ 9], 5,0x21e1cde6UL)
+ NPT_Md5_GG(d,a,b,c,W[14], 9,0xc33707d6UL)
+ NPT_Md5_GG(c,d,a,b,W[ 3],14,0xf4d50d87UL)
+ NPT_Md5_GG(b,c,d,a,W[ 8],20,0x455a14edUL)
+ NPT_Md5_GG(a,b,c,d,W[13], 5,0xa9e3e905UL)
+ NPT_Md5_GG(d,a,b,c,W[ 2], 9,0xfcefa3f8UL)
+ NPT_Md5_GG(c,d,a,b,W[ 7],14,0x676f02d9UL)
+ NPT_Md5_GG(b,c,d,a,W[12],20,0x8d2a4c8aUL)
+
+ // round 3
+ NPT_Md5_HH(a,b,c,d,W[ 5], 4,0xfffa3942UL)
+ NPT_Md5_HH(d,a,b,c,W[ 8],11,0x8771f681UL)
+ NPT_Md5_HH(c,d,a,b,W[11],16,0x6d9d6122UL)
+ NPT_Md5_HH(b,c,d,a,W[14],23,0xfde5380cUL)
+ NPT_Md5_HH(a,b,c,d,W[ 1], 4,0xa4beea44UL)
+ NPT_Md5_HH(d,a,b,c,W[ 4],11,0x4bdecfa9UL)
+ NPT_Md5_HH(c,d,a,b,W[ 7],16,0xf6bb4b60UL)
+ NPT_Md5_HH(b,c,d,a,W[10],23,0xbebfbc70UL)
+ NPT_Md5_HH(a,b,c,d,W[13], 4,0x289b7ec6UL)
+ NPT_Md5_HH(d,a,b,c,W[ 0],11,0xeaa127faUL)
+ NPT_Md5_HH(c,d,a,b,W[ 3],16,0xd4ef3085UL)
+ NPT_Md5_HH(b,c,d,a,W[ 6],23,0x04881d05UL)
+ NPT_Md5_HH(a,b,c,d,W[ 9], 4,0xd9d4d039UL)
+ NPT_Md5_HH(d,a,b,c,W[12],11,0xe6db99e5UL)
+ NPT_Md5_HH(c,d,a,b,W[15],16,0x1fa27cf8UL)
+ NPT_Md5_HH(b,c,d,a,W[ 2],23,0xc4ac5665UL)
+
+ // round 4
+ NPT_Md5_II(a,b,c,d,W[ 0], 6,0xf4292244UL)
+ NPT_Md5_II(d,a,b,c,W[ 7],10,0x432aff97UL)
+ NPT_Md5_II(c,d,a,b,W[14],15,0xab9423a7UL)
+ NPT_Md5_II(b,c,d,a,W[ 5],21,0xfc93a039UL)
+ NPT_Md5_II(a,b,c,d,W[12], 6,0x655b59c3UL)
+ NPT_Md5_II(d,a,b,c,W[ 3],10,0x8f0ccc92UL)
+ NPT_Md5_II(c,d,a,b,W[10],15,0xffeff47dUL)
+ NPT_Md5_II(b,c,d,a,W[ 1],21,0x85845dd1UL)
+ NPT_Md5_II(a,b,c,d,W[ 8], 6,0x6fa87e4fUL)
+ NPT_Md5_II(d,a,b,c,W[15],10,0xfe2ce6e0UL)
+ NPT_Md5_II(c,d,a,b,W[ 6],15,0xa3014314UL)
+ NPT_Md5_II(b,c,d,a,W[13],21,0x4e0811a1UL)
+ NPT_Md5_II(a,b,c,d,W[ 4], 6,0xf7537e82UL)
+ NPT_Md5_II(d,a,b,c,W[11],10,0xbd3af235UL)
+ NPT_Md5_II(c,d,a,b,W[ 2],15,0x2ad7d2bbUL)
+ NPT_Md5_II(b,c,d,a,W[ 9],21,0xeb86d391UL)
+
+ // store the variables back into the state
+ m_State[0] += a;
+ m_State[1] += b;
+ m_State[2] += c;
+ m_State[3] += d;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Md5Digest::GetDigest
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Md5Digest::GetDigest(NPT_DataBuffer& digest)
+{
+ return ComputeDigest(m_State, 4, false, digest);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HmacDigest
+|
+| compute Digest(key XOR opad, Digest(key XOR ipad, data))
+| key is the MAC key
+| ipad is the byte 0x36 repeated 64 times
+| opad is the byte 0x5c repeated 64 times
+| and data is the data to authenticate
+|
++---------------------------------------------------------------------*/
+class NPT_HmacDigest : public NPT_Digest
+{
+public:
+ NPT_HmacDigest(NPT_Digest::Algorithm algorithm,
+ const NPT_UInt8* key,
+ NPT_Size key_size);
+ ~NPT_HmacDigest();
+
+ // NPT_Digest methods
+ virtual NPT_Result Update(const NPT_UInt8* data, NPT_Size data_size) {
+ return m_InnerDigest->Update(data, data_size);
+ }
+ virtual NPT_Result GetDigest(NPT_DataBuffer& buffer);
+ virtual unsigned int GetSize() { return m_InnerDigest->GetSize(); }
+
+private:
+ NPT_Digest* m_InnerDigest;
+ NPT_Digest* m_OuterDigest;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HmacDigest::NPT_HmacDigest
++---------------------------------------------------------------------*/
+NPT_HmacDigest::NPT_HmacDigest(NPT_Digest::Algorithm algorithm,
+ const NPT_UInt8* key,
+ NPT_Size key_size)
+{
+ NPT_Digest::Create(algorithm, m_InnerDigest);
+ NPT_Digest::Create(algorithm, m_OuterDigest);
+
+ NPT_UInt8 workspace[NPT_BASIC_DIGEST_BLOCK_SIZE];
+
+ // if the key is larger than the block size, use a digest of the key
+ NPT_DataBuffer hk;
+ if (key_size > NPT_BASIC_DIGEST_BLOCK_SIZE) {
+ NPT_Digest* key_digest = NULL;
+ NPT_Digest::Create(algorithm, key_digest);
+ key_digest->Update(key, key_size);
+ key_digest->GetDigest(hk);
+ key = hk.GetData();
+ key_size = hk.GetDataSize();
+ delete key_digest;
+ }
+
+ // compute key XOR ipad
+ for (unsigned int i = 0; i < key_size; i++) {
+ workspace[i] = key[i] ^ 0x36;
+ }
+ for (unsigned int i = key_size; i < NPT_BASIC_DIGEST_BLOCK_SIZE; i++) {
+ workspace[i] = 0x36;
+ }
+
+ // start the inner digest with (key XOR ipad)
+ m_InnerDigest->Update(workspace, NPT_BASIC_DIGEST_BLOCK_SIZE);
+
+ // compute key XOR opad
+ for (unsigned int i = 0; i < key_size; i++) {
+ workspace[i] = key[i] ^ 0x5c;
+ }
+ for (unsigned int i = key_size; i < NPT_BASIC_DIGEST_BLOCK_SIZE; i++) {
+ workspace[i] = 0x5c;
+ }
+
+ // start the outer digest with (key XOR opad)
+ m_OuterDigest->Update(workspace, NPT_BASIC_DIGEST_BLOCK_SIZE);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HmacDigest::~NPT_HmacDigest
++---------------------------------------------------------------------*/
+NPT_HmacDigest::~NPT_HmacDigest()
+{
+ delete m_InnerDigest;
+ delete m_OuterDigest;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HmacDigest::GetDigest
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HmacDigest::GetDigest(NPT_DataBuffer& mac)
+{
+ // finish the outer digest with the value of the inner digest
+ NPT_DataBuffer inner;
+ m_InnerDigest->GetDigest(inner);
+ m_OuterDigest->Update(inner.GetData(), inner.GetDataSize());
+
+ // return the value of the outer digest
+ return m_OuterDigest->GetDigest(mac);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Digest::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Digest::Create(Algorithm algorithm, NPT_Digest*& digest)
+{
+ switch (algorithm) {
+ case ALGORITHM_SHA1: digest = new NPT_Sha1Digest(); return NPT_SUCCESS;
+ case ALGORITHM_SHA256: digest = new NPT_Sha256Digest(); return NPT_SUCCESS;
+ case ALGORITHM_MD5: digest = new NPT_Md5Digest(); return NPT_SUCCESS;
+ default: return NPT_ERROR_NOT_SUPPORTED;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Hmac::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Hmac::Create(NPT_Digest::Algorithm algorithm,
+ const NPT_UInt8* key,
+ NPT_Size key_size,
+ NPT_Digest*& digest)
+{
+ switch (algorithm) {
+ case NPT_Digest::ALGORITHM_SHA1:
+ case NPT_Digest::ALGORITHM_MD5:
+ digest = new NPT_HmacDigest(algorithm, key, key_size);
+ return NPT_SUCCESS;
+ default: return NPT_ERROR_NOT_SUPPORTED;
+ }
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDigest.h b/lib/libUPnP/Neptune/Source/Core/NptDigest.h
new file mode 100644
index 0000000..85b744c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDigest.h
@@ -0,0 +1,78 @@
+/*****************************************************************
+|
+| Neptune - Message Digests
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_DIGEST_H_
+#define _NPT_DIGEST_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptDataBuffer.h"
+
+/*----------------------------------------------------------------------
+| NPT_Digest
++---------------------------------------------------------------------*/
+class NPT_Digest {
+public:
+ // types
+ typedef enum {
+ ALGORITHM_SHA1,
+ ALGORITHM_SHA256,
+ ALGORITHM_MD5
+ } Algorithm;
+
+ // factory
+ static NPT_Result Create(Algorithm algorithm, NPT_Digest*& digest);
+
+ // methods
+ virtual ~NPT_Digest() {}
+ virtual unsigned int GetSize() = 0;
+ virtual NPT_Result Update(const NPT_UInt8* data, NPT_Size data_size) = 0;
+ virtual NPT_Result GetDigest(NPT_DataBuffer& digest) = 0;
+
+protected:
+ NPT_Digest() {} // don't instantiate directly
+};
+
+class NPT_Hmac {
+public:
+ static NPT_Result Create(NPT_Digest::Algorithm algorithm,
+ const NPT_UInt8* key,
+ NPT_Size key_size,
+ NPT_Digest*& digest);
+
+private:
+ // methods
+ NPT_Hmac() {} // don't instantiate
+};
+
+#endif // _NPT_DIGEST_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDynamicCast.h b/lib/libUPnP/Neptune/Source/Core/NptDynamicCast.h
new file mode 100644
index 0000000..0acab88
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDynamicCast.h
@@ -0,0 +1,89 @@
+/*****************************************************************
+|
+| Neptune - Dynamic Cast Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_DYNAMIC_CAST_H_
+#define _NPT_DYNAMIC_CAST_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptCommon.h"
+#include "NptResults.h"
+#include "NptConfig.h"
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_NO_RTTI)
+#define NPT_DYNAMIC_CAST(_class,_object) \
+( ((_object)==0) ? 0 : reinterpret_cast<_class*>((_object)->DynamicCast(&_class::_class_##_class)) )
+#define NPT_IMPLEMENT_DYNAMIC_CAST(_class) \
+static int _class_##_class; \
+virtual void* DynamicCast(const void* class_anchor) { \
+ if (class_anchor == &_class::_class_##_class) { \
+ return static_cast<_class*>(this); \
+ } \
+ return NULL; \
+}
+#define NPT_IMPLEMENT_DYNAMIC_CAST_D(_class,_superclass)\
+static int _class_##_class; \
+virtual void* DynamicCast(const void* class_anchor) { \
+ if (class_anchor == &_class::_class_##_class) { \
+ return static_cast<_class*>(this); \
+ } else { \
+ return _superclass::DynamicCast(class_anchor); \
+ } \
+}
+#define NPT_IMPLEMENT_DYNAMIC_CAST_D2(_class,_superclass,_mixin)\
+static int _class_##_class; \
+virtual void* DynamicCast(const void* class_anchor) { \
+ if (class_anchor == &_class::_class_##_class) { \
+ return static_cast<_class*>(this); \
+ } else { \
+ void* sup = _superclass::DynamicCast(class_anchor); \
+ if (sup) return sup; \
+ return _mixin::DynamicCast(class_anchor); \
+ } \
+}
+#define NPT_DEFINE_DYNAMIC_CAST_ANCHOR(_class) int _class::_class_##_class = 0;
+
+#else
+
+#define NPT_DYNAMIC_CAST(_class,_object) dynamic_cast<_class*>(_object)
+#define NPT_IMPLEMENT_DYNAMIC_CAST(_class)
+#define NPT_IMPLEMENT_DYNAMIC_CAST_D(_class,_superclass)
+#define NPT_IMPLEMENT_DYNAMIC_CAST_D2(_class,_superclass,_mixin)
+#define NPT_DEFINE_DYNAMIC_CAST_ANCHOR(_class)
+
+#endif
+
+#endif // _NPT_DYNAMIC_CAST_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.cpp b/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.cpp
new file mode 100644
index 0000000..556a4d8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.cpp
@@ -0,0 +1,36 @@
+/*****************************************************************
+|
+| Neptune - Dynamic Libraries
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptDynamicLibraries.h"
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.h b/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.h
new file mode 100644
index 0000000..50186cc
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.h
@@ -0,0 +1,84 @@
+/*****************************************************************
+|
+| Neptune - Dynamic Libraries
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_DYNAMIC_LIBRARIES_H_
+#define _NPT_DYNAMIC_LIBRARIES_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define NPT_DYANMIC_LIBRARY_LOAD_FLAG_NOW 1
+
+/*----------------------------------------------------------------------
+| NPT_DynamicLibraryInterface
++---------------------------------------------------------------------*/
+class NPT_DynamicLibraryInterface
+{
+public:
+ virtual ~NPT_DynamicLibraryInterface() {}
+ virtual NPT_Result FindSymbol(const char* name, void*& symbol) = 0;
+ virtual NPT_Result Unload() = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_DynamicLibrary
++---------------------------------------------------------------------*/
+class NPT_DynamicLibrary : public NPT_DynamicLibraryInterface
+{
+public:
+ // class methods
+ static NPT_Result Load(const char* name, NPT_Flags flags, NPT_DynamicLibrary*& library);
+
+ // destructor
+ ~NPT_DynamicLibrary() override { delete m_Delegate; }
+
+ // NPT_DynamicLibraryInterface methods
+ NPT_Result FindSymbol(const char* name, void*& symbol) override {
+ return m_Delegate->FindSymbol(name, symbol);
+ }
+ NPT_Result Unload() override {
+ return m_Delegate->Unload();
+ }
+
+private:
+ // methods
+ NPT_DynamicLibrary(NPT_DynamicLibraryInterface* delegate) : m_Delegate(delegate) {}
+
+ // members
+ NPT_DynamicLibraryInterface* m_Delegate;
+};
+
+#endif // _NPT_DYNAMIC_LIBRARIES_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptFile.cpp b/lib/libUPnP/Neptune/Source/Core/NptFile.cpp
new file mode 100644
index 0000000..e88e180
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptFile.cpp
@@ -0,0 +1,409 @@
+/*****************************************************************
+|
+| Neptune - Files
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptFile.h"
+#include "NptUtils.h"
+#include "NptConstants.h"
+#include "NptStreams.h"
+#include "NptDataBuffer.h"
+#include "NptLogging.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.file")
+
+/*----------------------------------------------------------------------
+| NPT_FilePath::BaseName
++---------------------------------------------------------------------*/
+NPT_String
+NPT_FilePath::BaseName(const char* path, bool with_extension /* = true */)
+{
+ NPT_String result = path;
+ int separator = result.ReverseFind(Separator);
+ if (separator >= 0) {
+ result = path+separator+NPT_StringLength(Separator);
+ }
+
+ if (!with_extension) {
+ int dot = result.ReverseFind('.');
+ if (dot >= 0) {
+ result.SetLength(dot);
+ }
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_FilePath::DirName
++---------------------------------------------------------------------*/
+NPT_String
+NPT_FilePath::DirName(const char* path)
+{
+ NPT_String result = path;
+ int separator = result.ReverseFind(Separator);
+ if (separator >= 0) {
+ if (separator == 0) {
+ result.SetLength(NPT_StringLength(Separator));
+ } else {
+ result.SetLength(separator);
+ }
+ } else {
+ result.SetLength(0);
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_FilePath::FileExtension
++---------------------------------------------------------------------*/
+NPT_String
+NPT_FilePath::FileExtension(const char* path)
+{
+ NPT_String result = path;
+ int separator = result.ReverseFind('.');
+ if (separator >= 0) {
+ result = path+separator;
+ } else {
+ result.SetLength(0);
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_FilePath::Create
++---------------------------------------------------------------------*/
+NPT_String
+NPT_FilePath::Create(const char* directory, const char* basename)
+{
+ if (!directory || NPT_StringLength(directory) == 0) return basename;
+ if (!basename || NPT_StringLength(basename) == 0) return directory;
+
+ NPT_String result = directory;
+ if (!result.EndsWith(Separator) && basename[0] != Separator[0]) {
+ result += Separator;
+ }
+ result += basename;
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::CreateDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::CreateDir(const char* path, bool create_intermediate_dirs)
+{
+ NPT_String full_path = path;
+
+ // normalize path separators
+ full_path.Replace((NPT_FilePath::Separator[0] == '/')?'\\':'/', NPT_FilePath::Separator);
+
+ // remove superfluous delimiters at the end
+ full_path.TrimRight(NPT_FilePath::Separator);
+
+ // create intermediate directories if needed
+ if (create_intermediate_dirs) {
+ NPT_String dir_path;
+
+ // look for the next path separator
+ int separator = full_path.Find(NPT_FilePath::Separator, 1);
+ while (separator > 0) {
+ // copy the path up to the separator
+ dir_path = full_path.SubString(0, separator);
+
+ // create the directory non recursively
+ NPT_CHECK_WARNING(NPT_File::CreateDir(dir_path, false));
+
+ // look for the next delimiter
+ separator = full_path.Find(NPT_FilePath::Separator, separator + 1);
+ }
+ }
+
+ // create the final directory
+ NPT_Result result = NPT_File::CreateDir(full_path);
+
+ // return error only if file didn't exist
+ if (NPT_FAILED(result) && result != NPT_ERROR_FILE_ALREADY_EXISTS) {
+ return result;
+ }
+
+ return NPT_SUCCESS;
+}
+
+
+/*----------------------------------------------------------------------
+| NPT_File::RemoveDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::RemoveDir(const char* path, bool force_if_not_empty)
+{
+ NPT_String root_path = path;
+
+ // normalize path separators
+ root_path.Replace((NPT_FilePath::Separator[0] == '/')?'\\':'/', NPT_FilePath::Separator);
+
+ // remove superfluous delimiters at the end
+ root_path.TrimRight(NPT_FilePath::Separator);
+
+ // remove all entries in the directory if required
+ if (force_if_not_empty) {
+ // enumerate all entries
+ NPT_File dir(root_path);
+ NPT_List<NPT_String> entries;
+ NPT_CHECK_WARNING(dir.ListDir(entries));
+ for (NPT_List<NPT_String>::Iterator it = entries.GetFirstItem(); it; ++it) {
+ NPT_File::Remove(NPT_FilePath::Create(root_path, *it), true);
+ }
+ }
+
+ // remove the (now empty) directory
+ return NPT_File::RemoveDir(root_path);
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Load
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Load(const char* path, NPT_DataBuffer& buffer, NPT_FileInterface::OpenMode mode)
+{
+ // create and open the file
+ NPT_File file(path);
+ NPT_Result result = file.Open(mode);
+ if (NPT_FAILED(result)) return result;
+
+ // load the file
+ result = file.Load(buffer);
+
+ // close the file
+ file.Close();
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Load
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Load(const char* path, NPT_String& data, NPT_FileInterface::OpenMode mode)
+{
+ NPT_DataBuffer buffer;
+
+ // reset ouput params
+ data = "";
+
+ // create and open the file
+ NPT_File file(path);
+ NPT_Result result = file.Open(mode);
+ if (NPT_FAILED(result)) return result;
+
+ // load the file
+ result = file.Load(buffer);
+
+ if (NPT_SUCCEEDED(result) && buffer.GetDataSize() > 0) {
+ data.Assign((const char*)buffer.GetData(), buffer.GetDataSize());
+ data.SetLength(buffer.GetDataSize());
+ }
+
+ // close the file
+ file.Close();
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Save
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Save(const char* filename, NPT_String& data)
+{
+ NPT_DataBuffer buffer(data.GetChars(), data.GetLength());
+ return NPT_File::Save(filename, buffer);
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Save
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Save(const char* filename, const NPT_DataBuffer& buffer)
+{
+ // create and open the file
+ NPT_File file(filename);
+ NPT_Result result = file.Open(NPT_FILE_OPEN_MODE_WRITE | NPT_FILE_OPEN_MODE_CREATE | NPT_FILE_OPEN_MODE_TRUNCATE);
+ if (NPT_FAILED(result)) return result;
+
+ // load the file
+ result = file.Save(buffer);
+
+ // close the file
+ file.Close();
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Load
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Load(NPT_DataBuffer& buffer)
+{
+ NPT_InputStreamReference input;
+
+ // get the input stream for the file
+ NPT_CHECK_WARNING(GetInputStream(input));
+
+ // read the stream
+ return input->Load(buffer);
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Save
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Save(const NPT_DataBuffer& buffer)
+{
+ NPT_OutputStreamReference output;
+
+ // get the output stream for the file
+ NPT_CHECK_WARNING(GetOutputStream(output));
+
+ // write to the stream
+ return output->WriteFully(buffer.GetData(), buffer.GetDataSize());
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetInfo(NPT_FileInfo& info)
+{
+ if (m_IsSpecial) {
+ info.m_Type = NPT_FileInfo::FILE_TYPE_SPECIAL;
+ info.m_Size = 0;
+ info.m_Attributes = 0;
+ info.m_AttributesMask = 0;
+ return NPT_SUCCESS;
+ }
+ return GetInfo(m_Path.GetChars(), &info);
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetSize(NPT_LargeSize& size)
+{
+ // default value
+ size = 0;
+
+ // get the file info
+ NPT_FileInfo info;
+ NPT_Result result = GetInfo(info);
+ if (NPT_FAILED(result)) {
+ return result;
+ }
+
+ switch (info.m_Type) {
+ case NPT_FileInfo::FILE_TYPE_DIRECTORY: {
+ NPT_List<NPT_String> entries;
+ NPT_CHECK_WARNING(ListDir(entries));
+ size = entries.GetItemCount();
+ break;
+ }
+
+ case NPT_FileInfo::FILE_TYPE_REGULAR:
+ case NPT_FileInfo::FILE_TYPE_OTHER:
+ size = info.m_Size;
+ return NPT_SUCCESS;
+
+ default:
+ break;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetSize(const char* path, NPT_LargeSize& size)
+{
+ NPT_File file(path);
+ return file.GetSize(size);
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Remove
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Remove(const char* path, bool recurse /* = false */)
+{
+ NPT_FileInfo info;
+
+ // make sure the path exists
+ NPT_CHECK_WARNING(GetInfo(path, &info));
+
+ if (info.m_Type == NPT_FileInfo::FILE_TYPE_DIRECTORY) {
+ return RemoveDir(path, recurse);
+ } else {
+ return RemoveFile(path);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Rename
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Rename(const char* path)
+{
+ NPT_Result result = Rename(m_Path.GetChars(), path);
+ if (NPT_SUCCEEDED(result)) {
+ m_Path = path;
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::ListDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::ListDir(NPT_List<NPT_String>& entries)
+{
+ entries.Clear();
+ return ListDir(m_Path.GetChars(), entries);
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptFile.h b/lib/libUPnP/Neptune/Source/Core/NptFile.h
new file mode 100644
index 0000000..c6b2db2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptFile.h
@@ -0,0 +1,229 @@
+/*****************************************************************
+|
+| Neptune - Files
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_FILE_H_
+#define _NPT_FILE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptStreams.h"
+#include "NptTime.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ERROR_NO_SUCH_FILE = NPT_ERROR_BASE_FILE - 0;
+const int NPT_ERROR_FILE_NOT_OPEN = NPT_ERROR_BASE_FILE - 1;
+const int NPT_ERROR_FILE_BUSY = NPT_ERROR_BASE_FILE - 2;
+const int NPT_ERROR_FILE_ALREADY_OPEN = NPT_ERROR_BASE_FILE - 3;
+const int NPT_ERROR_FILE_NOT_READABLE = NPT_ERROR_BASE_FILE - 4;
+const int NPT_ERROR_FILE_NOT_WRITABLE = NPT_ERROR_BASE_FILE - 5;
+const int NPT_ERROR_FILE_NOT_DIRECTORY = NPT_ERROR_BASE_FILE - 6;
+const int NPT_ERROR_FILE_ALREADY_EXISTS = NPT_ERROR_BASE_FILE - 7;
+const int NPT_ERROR_FILE_NOT_ENOUGH_SPACE = NPT_ERROR_BASE_FILE - 8;
+const int NPT_ERROR_DIRECTORY_NOT_EMPTY = NPT_ERROR_BASE_FILE - 9;
+
+/**
+ * File open modes.
+ * Use a combination of these flags to indicate how a file should be opened
+ * Note all combinations of flags are valid or meaningful:
+ * If NPT_FILE_OPEN_MODE_WRITE is not set, then NPT_FILE_OPEN_MODE_CREATE,
+ * NPT_FILE_OPEN_MODE_TRUNCATE and NPT_FILE_OPEN_MODE_APPEND are ignored.
+ * If NPT_FILE_OPEN_MODE_APPEND is set, then NPT_FILE_OPEN_MODE_CREATE is
+ * automatically implied whether it is set or not.
+ * NPT_FILE_OPEN_MODE_CREATE and NPT_FILE_OPEN_MODE_TRUNCATE imply each
+ * other (if one is set, the other one is automatically implied)
+ */
+const unsigned int NPT_FILE_OPEN_MODE_READ = 0x01;
+const unsigned int NPT_FILE_OPEN_MODE_WRITE = 0x02;
+const unsigned int NPT_FILE_OPEN_MODE_CREATE = 0x04;
+const unsigned int NPT_FILE_OPEN_MODE_TRUNCATE = 0x08;
+const unsigned int NPT_FILE_OPEN_MODE_UNBUFFERED = 0x10;
+const unsigned int NPT_FILE_OPEN_MODE_APPEND = 0x20;
+
+const unsigned int NPT_FILE_ATTRIBUTE_READ_ONLY = 0x01;
+const unsigned int NPT_FILE_ATTRIBUTE_LINK = 0x02;
+
+#define NPT_FILE_STANDARD_INPUT "@STDIN"
+#define NPT_FILE_STANDARD_OUTPUT "@STDOUT"
+#define NPT_FILE_STANDARD_ERROR "@STDERR"
+
+/*----------------------------------------------------------------------
+| class references
++---------------------------------------------------------------------*/
+class NPT_DataBuffer;
+
+/*----------------------------------------------------------------------
+| NPT_FileInfo
++---------------------------------------------------------------------*/
+struct NPT_FileInfo
+{
+ // types
+ typedef enum {
+ FILE_TYPE_NONE,
+ FILE_TYPE_REGULAR,
+ FILE_TYPE_DIRECTORY,
+ FILE_TYPE_SPECIAL,
+ FILE_TYPE_OTHER
+ } FileType;
+
+ // constructor
+ NPT_FileInfo() : m_Type(FILE_TYPE_NONE), m_Size(0), m_AttributesMask(0), m_Attributes(0) {}
+
+ // members
+ FileType m_Type;
+ NPT_UInt64 m_Size;
+ NPT_Flags m_AttributesMask;
+ NPT_Flags m_Attributes;
+ NPT_TimeStamp m_CreationTime;
+ NPT_TimeStamp m_ModificationTime;
+};
+
+/*----------------------------------------------------------------------
+| NPT_FilePath
++---------------------------------------------------------------------*/
+class NPT_FilePath
+{
+public:
+ // class members
+ static const char* const Separator;
+
+ // class methods
+ static NPT_String BaseName(const char* path, bool with_extension = true);
+ static NPT_String DirName(const char* path);
+ static NPT_String FileExtension(const char* path);
+ static NPT_String Create(const char* directory, const char* base);
+
+private:
+ NPT_FilePath() {} // this class can't have instances
+};
+
+/*----------------------------------------------------------------------
+| NPT_FileInterface
++---------------------------------------------------------------------*/
+class NPT_FileInterface
+{
+public:
+ // types
+ typedef unsigned int OpenMode;
+
+ // constructors and destructor
+ virtual ~NPT_FileInterface() {}
+
+ // methods
+ virtual NPT_Result Open(OpenMode mode) = 0;
+ virtual NPT_Result Close() = 0;
+ virtual NPT_Result GetInputStream(NPT_InputStreamReference& stream) = 0;
+ virtual NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_File
++---------------------------------------------------------------------*/
+class NPT_File : public NPT_FileInterface
+{
+public:
+ // class methods
+ static NPT_Result GetRoots(NPT_List<NPT_String>& roots);
+ static NPT_Result GetSize(const char* path, NPT_LargeSize &size);
+ static NPT_Result GetInfo(const char* path, NPT_FileInfo* info = NULL);
+ static bool Exists(const char* path) { return NPT_SUCCEEDED(GetInfo(path)); }
+ static NPT_Result Remove(const char* path, bool recurse = false);
+ static NPT_Result RemoveFile(const char* path);
+ static NPT_Result RemoveDir(const char* path);
+ static NPT_Result RemoveDir(const char* path, bool force_if_not_empty);
+ static NPT_Result Rename(const char* from_path, const char* to_path);
+ static NPT_Result ListDir(const char* path, NPT_List<NPT_String>& entries, NPT_Ordinal start = 0, NPT_Cardinal count = 0);
+ static NPT_Result CreateDir(const char* path);
+ static NPT_Result CreateDir(const char* path, bool create_intermediate_dirs);
+ static NPT_Result GetWorkingDir(NPT_String& path);
+ static NPT_Result Load(const char* path, NPT_DataBuffer& buffer, NPT_FileInterface::OpenMode mode = NPT_FILE_OPEN_MODE_READ);
+ static NPT_Result Load(const char* path, NPT_String& data, NPT_FileInterface::OpenMode mode = NPT_FILE_OPEN_MODE_READ);
+ static NPT_Result Save(const char* path, NPT_String& data);
+ static NPT_Result Save(const char* path, const NPT_DataBuffer& buffer);
+
+ // constructors and destructor
+ NPT_File(const char* path);
+ ~NPT_File() override { delete m_Delegate; }
+
+ // methods
+ NPT_Result Load(NPT_DataBuffer& buffer);
+ NPT_Result Save(const NPT_DataBuffer& buffer);
+ const NPT_String& GetPath() { return m_Path; }
+ NPT_Result GetSize(NPT_LargeSize &size);
+ NPT_Result GetInfo(NPT_FileInfo& info);
+ NPT_Result ListDir(NPT_List<NPT_String>& entries);
+ NPT_Result Rename(const char* path);
+
+ // NPT_FileInterface methods
+ NPT_Result Open(OpenMode mode) override {
+ return m_Delegate->Open(mode);
+ }
+ NPT_Result Close() override {
+ return m_Delegate->Close();
+ }
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override {
+ return m_Delegate->GetInputStream(stream);
+ }
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override {
+ return m_Delegate->GetOutputStream(stream);
+ }
+
+ // operators
+ NPT_File& operator=(const NPT_File& file);
+
+protected:
+ // members
+ NPT_FileInterface* m_Delegate;
+ NPT_String m_Path;
+ bool m_IsSpecial;
+};
+
+/*----------------------------------------------------------------------
+| NPT_FileDateComparator
++---------------------------------------------------------------------*/
+class NPT_FileDateComparator {
+public:
+ NPT_FileDateComparator(const char* directory) : m_Directory(directory) {}
+ NPT_Int32 operator()(const NPT_String& file1, const NPT_String& file2) const {
+ NPT_FileInfo info1, info2;
+ if (NPT_FAILED(NPT_File::GetInfo(NPT_FilePath::Create(m_Directory, file1), &info1))) return -1;
+ if (NPT_FAILED(NPT_File::GetInfo(NPT_FilePath::Create(m_Directory, file2), &info2))) return -1;
+ return (info1.m_ModificationTime == info2.m_ModificationTime) ? 0 : (info1.m_ModificationTime < info2.m_ModificationTime ? -1 : 1);
+ }
+
+private:
+ NPT_String m_Directory;
+};
+
+#endif // _NPT_FILE_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptHash.cpp b/lib/libUPnP/Neptune/Source/Core/NptHash.cpp
new file mode 100644
index 0000000..05d6aa4
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptHash.cpp
@@ -0,0 +1,137 @@
+/*****************************************************************
+|
+| Neptune - Hashing
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptResults.h"
+#include "NptHash.h"
+
+/*----------------------------------------------------------------------
+| local constants
++---------------------------------------------------------------------*/
+// 32 bit magic FNV-1a prime
+const NPT_UInt32 NPT_FNV_32_PRIME = 0x01000193;
+
+/*----------------------------------------------------------------------
+| NPT_Fnv1aHash32
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_Fnv1aHash32(const NPT_UInt8* data, NPT_Size data_size, NPT_UInt32 hash_init)
+{
+ const NPT_UInt8* data_end = data + data_size;
+ NPT_UInt32 hash_value = hash_init;
+
+ while (data < data_end) {
+ hash_value ^= (NPT_UInt32)*data++;
+
+#if defined(NPT_CONFIG_FNV_HASH_USE_SHIFT_MUL)
+ hash_value += (hash_value<<1) + (hash_value<<4) + (hash_value<<7) + (hash_value<<8) + (hash_value<<24);
+#else
+ hash_value *= NPT_FNV_32_PRIME;
+#endif
+ }
+
+ return hash_value;
+}
+
+
+/*----------------------------------------------------------------------
+| NPT_Fnv1aHashStr32
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_Fnv1aHashStr32(const char* data, NPT_UInt32 hash_init)
+{
+ NPT_UInt32 hash_value = hash_init;
+
+ while (*data) {
+ hash_value ^= (NPT_UInt32)*data++;
+
+#if defined(NPT_CONFIG_FNV_HASH_USE_SHIFT_MUL)
+ hash_value += (hash_value<<1) + (hash_value<<4) + (hash_value<<7) + (hash_value<<8) + (hash_value<<24);
+#else
+ hash_value *= NPT_FNV_32_PRIME;
+#endif
+ }
+
+ return hash_value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_FnvHash32
++---------------------------------------------------------------------*/
+// 64 bit magic FNV-1a prime
+const NPT_UInt64 NPT_FNV_64_PRIME = 0x100000001b3ULL;
+
+/*----------------------------------------------------------------------
+| NPT_Fnv1aHash64
++---------------------------------------------------------------------*/
+NPT_UInt64
+NPT_Fnv1aHash64(const NPT_UInt8* data, NPT_Size data_size, NPT_UInt64 hash_init)
+{
+ const NPT_UInt8* data_end = data + data_size;
+ NPT_UInt64 hash_value = hash_init;
+
+ while (data < data_end) {
+ hash_value ^= (NPT_UInt64)*data++;
+
+#if defined(NPT_CONFIG_FNV_HASH_USE_SHIFT_MUL)
+ hash_value += (hash_value << 1) + (hash_value << 4) + (hash_value << 5) + (hash_value << 7) + (hash_value << 8) + (hash_value << 40);
+#else
+ hash_value *= NPT_FNV_64_PRIME;
+#endif
+ }
+
+ return hash_value;
+}
+
+
+/*----------------------------------------------------------------------
+| NPT_Fnv1aHashStr64
++---------------------------------------------------------------------*/
+NPT_UInt64
+NPT_Fnv1aHashStr64(const char* data, NPT_UInt64 hash_init)
+{
+ NPT_UInt64 hash_value = hash_init;
+
+ while (*data) {
+ hash_value ^= (NPT_UInt64)*data++;
+
+#if defined(NPT_CONFIG_FNV_HASH_USE_SHIFT_MUL)
+ hash_value += (hash_value << 1) + (hash_value << 4) + (hash_value << 5) + (hash_value << 7) + (hash_value << 8) + (hash_value << 40);
+#else
+ hash_value *= NPT_FNV_64_PRIME;
+#endif
+ }
+
+ return hash_value;
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptHash.h b/lib/libUPnP/Neptune/Source/Core/NptHash.h
new file mode 100644
index 0000000..d7b8776
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptHash.h
@@ -0,0 +1,83 @@
+/*****************************************************************
+|
+| Neptune - Hashing
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+#ifndef _NPT_HASH_H_
+#define _NPT_HASH_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| Fowler/Noll/Vo FNV-1a hash functions
++---------------------------------------------------------------------*/
+const NPT_UInt32 NPT_FNV1A_32_INIT = ((NPT_UInt32)0x811c9dc5);
+NPT_UInt32 NPT_Fnv1aHash32(const NPT_UInt8* data, NPT_Size data_size, NPT_UInt32 hash_init=NPT_FNV1A_32_INIT);
+NPT_UInt32 NPT_Fnv1aHashStr32(const char* data, NPT_UInt32 hash_init=NPT_FNV1A_32_INIT);
+const NPT_UInt64 NPT_FNV1A_64_INIT = ((NPT_UInt64)0xcbf29ce484222325ULL);
+NPT_UInt64 NPT_Fnv1aHash64(const NPT_UInt8* data, NPT_Size data_size, NPT_UInt64 hash_init=NPT_FNV1A_64_INIT);
+NPT_UInt64 NPT_Fnv1aHashStr64(const char* data, NPT_UInt64 hash_init=NPT_FNV1A_64_INIT);
+
+/*----------------------------------------------------------------------
+| NPT_Hash
++---------------------------------------------------------------------*/
+template <typename K>
+struct NPT_Hash
+{
+};
+
+template <>
+struct NPT_Hash<const char*>
+{
+ NPT_UInt32 operator()(const char* s) const { return NPT_Fnv1aHashStr32(s); }
+};
+
+template <>
+struct NPT_Hash<char*>
+{
+ NPT_UInt32 operator()(char* s) const { return NPT_Fnv1aHashStr32(s); }
+};
+
+template <>
+struct NPT_Hash<int>
+{
+ NPT_UInt32 operator()(int i) const { return NPT_Fnv1aHash32(reinterpret_cast<const NPT_UInt8*>(&i), sizeof(int)); }
+};
+
+template <>
+struct NPT_Hash<unsigned int>
+{
+ NPT_UInt32 operator()(unsigned int i) const { return NPT_Fnv1aHash32(reinterpret_cast<const NPT_UInt8*>(&i), sizeof(int)); }
+};
+
+#endif // _NPT_HASH_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp b/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
new file mode 100644
index 0000000..db2c507
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
@@ -0,0 +1,3483 @@
+/*****************************************************************
+|
+| Neptune - HTTP Protocol
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptHttp.h"
+#include "NptSockets.h"
+#include "NptBufferedStreams.h"
+#include "NptDebug.h"
+#include "NptVersion.h"
+#include "NptUtils.h"
+#include "NptFile.h"
+#include "NptSystem.h"
+#include "NptLogging.h"
+#include "NptTls.h"
+#include "NptStreams.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.http")
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const char* const NPT_HTTP_DEFAULT_403_HTML = "<html><head><title>403 Forbidden</title></head><body><h1>Forbidden</h1><p>Access to this URL is forbidden.</p></html>";
+const char* const NPT_HTTP_DEFAULT_404_HTML = "<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></html>";
+const char* const NPT_HTTP_DEFAULT_500_HTML = "<html><head><title>500 Internal Error</title></head><body><h1>Internal Error</h1><p>The server encountered an unexpected condition which prevented it from fulfilling the request.</p></html>";
+
+/*----------------------------------------------------------------------
+| NPT_HttpUrl::NPT_HttpUrl
++---------------------------------------------------------------------*/
+NPT_HttpUrl::NPT_HttpUrl(const char* url, bool ignore_scheme) :
+ NPT_Url(url)
+{
+ if (!ignore_scheme) {
+ if (GetSchemeId() != NPT_Uri::SCHEME_ID_HTTP &&
+ GetSchemeId() != NPT_Uri::SCHEME_ID_HTTPS) {
+ Reset();
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpUrl::NPT_HttpUrl
++---------------------------------------------------------------------*/
+NPT_HttpUrl::NPT_HttpUrl(const char* host,
+ NPT_UInt16 port,
+ const char* path,
+ const char* query,
+ const char* fragment) :
+ NPT_Url("http", host, port, path, query, fragment)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpUrl::ToString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_HttpUrl::ToString(bool with_fragment) const
+{
+ NPT_UInt16 default_port;
+ switch (m_SchemeId) {
+ case SCHEME_ID_HTTP: default_port = NPT_HTTP_DEFAULT_PORT; break;
+ case SCHEME_ID_HTTPS: default_port = NPT_HTTPS_DEFAULT_PORT; break;
+ default: default_port = 0;
+ }
+ return NPT_Url::ToStringWithDefaultPort(default_port, with_fragment);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeader::NPT_HttpHeader
++---------------------------------------------------------------------*/
+NPT_HttpHeader::NPT_HttpHeader(const char* name, const char* value):
+ m_Name(name),
+ m_Value(value)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeader::~NPT_HttpHeader
++---------------------------------------------------------------------*/
+NPT_HttpHeader::~NPT_HttpHeader()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeader::Emit
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpHeader::Emit(NPT_OutputStream& stream) const
+{
+ stream.WriteString(m_Name);
+ stream.WriteFully(": ", 2);
+ stream.WriteString(m_Value);
+ stream.WriteFully(NPT_HTTP_LINE_TERMINATOR, 2);
+ NPT_LOG_FINEST_2("header %s: %s", m_Name.GetChars(), m_Value.GetChars());
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeader::SetName
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpHeader::SetName(const char* name)
+{
+ m_Name = name;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeader::~NPT_HttpHeader
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpHeader::SetValue(const char* value)
+{
+ m_Value = value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders::NPT_HttpHeaders
++---------------------------------------------------------------------*/
+NPT_HttpHeaders::NPT_HttpHeaders()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders::~NPT_HttpHeaders
++---------------------------------------------------------------------*/
+NPT_HttpHeaders::~NPT_HttpHeaders()
+{
+ m_Headers.Apply(NPT_ObjectDeleter<NPT_HttpHeader>());
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpHeaders::Parse(NPT_BufferedInputStream& stream)
+{
+ NPT_String header_name;
+ NPT_String header_value;
+ bool header_pending = false;
+ NPT_String line;
+
+ while (NPT_SUCCEEDED(stream.ReadLine(line, NPT_HTTP_PROTOCOL_MAX_LINE_LENGTH))) {
+ if (line.GetLength() == 0) {
+ // empty line, end of headers
+ break;
+ }
+ if (header_pending && (line[0] == ' ' || line[0] == '\t')) {
+ // continuation (folded header)
+ header_value.Append(line.GetChars()+1, line.GetLength()-1);
+ } else {
+ // add the pending header to the list
+ if (header_pending) {
+ header_value.Trim();
+ AddHeader(header_name, header_value);
+ header_pending = false;
+ NPT_LOG_FINEST_2("header - %s: %s",
+ header_name.GetChars(),
+ header_value.GetChars());
+ }
+
+ // find the colon separating the name and the value
+ int colon_index = line.Find(':');
+ if (colon_index < 1) {
+ // invalid syntax, ignore
+ continue;
+ }
+ header_name = line.Left(colon_index);
+
+ // the field value starts at the first non-whitespace
+ const char* value = line.GetChars()+colon_index+1;
+ while (*value == ' ' || *value == '\t') {
+ value++;
+ }
+ header_value = value;
+
+ // the header is pending
+ header_pending = true;
+ }
+ }
+
+ // if we have a header pending, add it now
+ if (header_pending) {
+ header_value.Trim();
+ AddHeader(header_name, header_value);
+ NPT_LOG_FINEST_2("header %s: %s",
+ header_name.GetChars(),
+ header_value.GetChars());
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders::Emit
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpHeaders::Emit(NPT_OutputStream& stream) const
+{
+ // for each header in the list
+ NPT_List<NPT_HttpHeader*>::Iterator header = m_Headers.GetFirstItem();
+ while (header) {
+ // emit the header
+ NPT_CHECK_WARNING((*header)->Emit(stream));
+ ++header;
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders::GetHeader
++---------------------------------------------------------------------*/
+NPT_HttpHeader*
+NPT_HttpHeaders::GetHeader(const char* name) const
+{
+ // check args
+ if (name == NULL) return NULL;
+
+ // find a matching header
+ NPT_List<NPT_HttpHeader*>::Iterator header = m_Headers.GetFirstItem();
+ while (header) {
+ if ((*header)->GetName().Compare(name, true) == 0) {
+ return *header;
+ }
+ ++header;
+ }
+
+ // not found
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders::AddHeader
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpHeaders::AddHeader(const char* name, const char* value)
+{
+ return m_Headers.Add(new NPT_HttpHeader(name, value));
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders::RemoveHeader
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpHeaders::RemoveHeader(const char* name)
+{
+ bool found = false;
+
+ NPT_HttpHeader* header = NULL;
+ while ((header = GetHeader(name))) {
+ m_Headers.Remove(header);
+ delete header;
+ found = true;
+ }
+ return found?NPT_SUCCESS:NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders::SetHeader
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpHeaders::SetHeader(const char* name, const char* value, bool replace)
+{
+ NPT_HttpHeader* header = GetHeader(name);
+ if (header == NULL) {
+ return AddHeader(name, value);
+ } else if (replace) {
+ return header->SetValue(value);
+ } else {
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders::GetHeaderValue
++---------------------------------------------------------------------*/
+const NPT_String*
+NPT_HttpHeaders::GetHeaderValue(const char* name) const
+{
+ NPT_HttpHeader* header = GetHeader(name);
+ if (header == NULL) {
+ return NULL;
+ } else {
+ return &header->GetValue();
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntityBodyInputStream
++---------------------------------------------------------------------*/
+class NPT_HttpEntityBodyInputStream : public NPT_InputStream
+{
+public:
+ // constructor and desctructor
+ NPT_HttpEntityBodyInputStream(NPT_BufferedInputStreamReference& source,
+ NPT_LargeSize size,
+ bool size_is_known,
+ bool chunked,
+ NPT_HttpClient::Connection* connection,
+ bool should_persist);
+ ~NPT_HttpEntityBodyInputStream() override;
+
+ // methods
+ bool SizeIsKnown() { return m_SizeIsKnown; }
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL) override;
+ NPT_Result Seek(NPT_Position /*offset*/) override {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ NPT_Result Tell(NPT_Position& offset) override {
+ offset = m_Position;
+ return NPT_SUCCESS;
+ }
+ NPT_Result GetSize(NPT_LargeSize& size) override {
+ size = m_Size;
+ return NPT_SUCCESS;
+ }
+ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+private:
+ // methods
+ virtual void OnFullyRead();
+
+ // members
+ NPT_LargeSize m_Size;
+ bool m_SizeIsKnown;
+ bool m_Chunked;
+ NPT_HttpClient::Connection* m_Connection;
+ bool m_ShouldPersist;
+ NPT_Position m_Position;
+ NPT_InputStreamReference m_Source;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntityBodyInputStream::NPT_HttpEntityBodyInputStream
++---------------------------------------------------------------------*/
+NPT_HttpEntityBodyInputStream::NPT_HttpEntityBodyInputStream(
+ NPT_BufferedInputStreamReference& source,
+ NPT_LargeSize size,
+ bool size_is_known,
+ bool chunked,
+ NPT_HttpClient::Connection* connection,
+ bool should_persist) :
+ m_Size(size),
+ m_SizeIsKnown(size_is_known),
+ m_Chunked(chunked),
+ m_Connection(connection),
+ m_ShouldPersist(should_persist),
+ m_Position(0)
+{
+ if (size_is_known && size == 0) {
+ OnFullyRead();
+ } else {
+ if (chunked) {
+ m_Source = NPT_InputStreamReference(new NPT_HttpChunkedInputStream(source));
+ } else {
+ m_Source = source;
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntityBodyInputStream::~NPT_HttpEntityBodyInputStream
++---------------------------------------------------------------------*/
+NPT_HttpEntityBodyInputStream::~NPT_HttpEntityBodyInputStream()
+{
+ delete m_Connection;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntityBodyInputStream::OnFullyRead
++---------------------------------------------------------------------*/
+void
+NPT_HttpEntityBodyInputStream::OnFullyRead()
+{
+ m_Source = NULL;
+ if (m_Connection && m_ShouldPersist) {
+ m_Connection->Recycle();
+ m_Connection = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntityBodyInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntityBodyInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ if (bytes_read) *bytes_read = 0;
+
+ // return now if we've already reached the end
+ if (m_Source.IsNull()) return NPT_ERROR_EOS;
+
+ // clamp to the max possible read size
+ if (!m_Chunked && m_SizeIsKnown) {
+ NPT_LargeSize max_can_read = m_Size-m_Position;
+ if (max_can_read == 0) return NPT_ERROR_EOS;
+ if (bytes_to_read > max_can_read) bytes_to_read = (NPT_Size)max_can_read;
+ }
+
+ // read from the source
+ NPT_Size source_bytes_read = 0;
+ NPT_Result result = m_Source->Read(buffer, bytes_to_read, &source_bytes_read);
+ if (NPT_SUCCEEDED(result)) {
+ m_Position += source_bytes_read;
+ if (bytes_read) *bytes_read = source_bytes_read;
+ }
+
+ // check if we've reached the end
+ if (result == NPT_ERROR_EOS || (m_SizeIsKnown && (m_Position == m_Size))) {
+ OnFullyRead();
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntityBodyInputStream::GetAvaialble
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntityBodyInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ if (m_Source.IsNull()) {
+ available = 0;
+ return NPT_SUCCESS;
+ }
+ NPT_Result result = m_Source->GetAvailable(available);
+ if (NPT_FAILED(result)) {
+ available = 0;
+ return result;
+ }
+ if (available > m_Size-m_Position) {
+ available = m_Size-m_Position;
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::NPT_HttpEntity
++---------------------------------------------------------------------*/
+NPT_HttpEntity::NPT_HttpEntity() :
+ m_ContentLength(0),
+ m_ContentLengthIsKnown(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::NPT_HttpEntity
++---------------------------------------------------------------------*/
+NPT_HttpEntity::NPT_HttpEntity(const NPT_HttpHeaders& headers) :
+ m_ContentLength(0),
+ m_ContentLengthIsKnown(false)
+{
+ SetHeaders(headers);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::SetHeaders
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::SetHeaders(const NPT_HttpHeaders& headers)
+{
+ NPT_HttpHeader* header;
+
+ // Content-Length
+ header = headers.GetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH);
+ if (header != NULL) {
+ m_ContentLengthIsKnown = true;
+ NPT_LargeSize length;
+ if (NPT_SUCCEEDED(header->GetValue().ToInteger64(length))) {
+ m_ContentLength = length;
+ } else {
+ m_ContentLength = 0;
+ }
+ }
+
+ // Content-Type
+ header = headers.GetHeader(NPT_HTTP_HEADER_CONTENT_TYPE);
+ if (header != NULL) {
+ m_ContentType = header->GetValue();
+ }
+
+ // Content-Encoding
+ header = headers.GetHeader(NPT_HTTP_HEADER_CONTENT_ENCODING);
+ if (header != NULL) {
+ m_ContentEncoding = header->GetValue();
+ }
+
+ // Transfer-Encoding
+ header = headers.GetHeader(NPT_HTTP_HEADER_TRANSFER_ENCODING);
+ if (header != NULL) {
+ m_TransferEncoding = header->GetValue();
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::~NPT_HttpEntity
++---------------------------------------------------------------------*/
+NPT_HttpEntity::~NPT_HttpEntity()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::GetInputStream(NPT_InputStreamReference& stream)
+{
+ // reset output params first
+ stream = NULL;
+
+ if (m_InputStream.IsNull()) return NPT_FAILURE;
+
+ stream = m_InputStream;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::SetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::SetInputStream(const NPT_InputStreamReference& stream,
+ bool update_content_length /* = false */)
+{
+ m_InputStream = stream;
+
+ // get the content length from the stream
+ if (update_content_length && !stream.IsNull()) {
+ NPT_LargeSize length;
+ if (NPT_SUCCEEDED(stream->GetSize(length))) {
+ return SetContentLength(length);
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::SetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::SetInputStream(const void* data, NPT_Size data_size)
+{
+ NPT_MemoryStream* memory_stream = new NPT_MemoryStream(data, data_size);
+ NPT_InputStreamReference body(memory_stream);
+ return SetInputStream(body, true);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::SetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::SetInputStream(const char* string)
+{
+ if (string == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+ NPT_MemoryStream* memory_stream = new NPT_MemoryStream((const void*)string,
+ NPT_StringLength(string));
+ NPT_InputStreamReference body(memory_stream);
+ return SetInputStream(body, true);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::SetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::SetInputStream(const NPT_String& string)
+{
+ NPT_MemoryStream* memory_stream = new NPT_MemoryStream((const void*)string.GetChars(),
+ string.GetLength());
+ NPT_InputStreamReference body(memory_stream);
+ return SetInputStream(body, true);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::Load
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::Load(NPT_DataBuffer& buffer)
+{
+ // check that we have an input stream
+ if (m_InputStream.IsNull()) return NPT_ERROR_INVALID_STATE;
+
+ // load the stream into the buffer
+ if (m_ContentLength != (NPT_Size)m_ContentLength) return NPT_ERROR_OUT_OF_RANGE;
+ return m_InputStream->Load(buffer, (NPT_Size)m_ContentLength);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::SetContentLength
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::SetContentLength(NPT_LargeSize length)
+{
+ m_ContentLength = length;
+ m_ContentLengthIsKnown = true;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::SetContentType
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::SetContentType(const char* type)
+{
+ m_ContentType = type;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::SetContentEncoding
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::SetContentEncoding(const char* encoding)
+{
+ m_ContentEncoding = encoding;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity::SetTransferEncoding
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEntity::SetTransferEncoding(const char* encoding)
+{
+ m_TransferEncoding = encoding;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpMessage::NPT_HttpMessage
++---------------------------------------------------------------------*/
+NPT_HttpMessage::NPT_HttpMessage(const char* protocol) :
+ m_Protocol(protocol),
+ m_Entity(NULL)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpMessage::NPT_HttpMessage
++---------------------------------------------------------------------*/
+NPT_HttpMessage::~NPT_HttpMessage()
+{
+ delete m_Entity;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpMessage::SetEntity
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpMessage::SetEntity(NPT_HttpEntity* entity)
+{
+ if (entity != m_Entity) {
+ delete m_Entity;
+ m_Entity = entity;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpMessage::ParseHeaders
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpMessage::ParseHeaders(NPT_BufferedInputStream& stream)
+{
+ return m_Headers.Parse(stream);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequest::NPT_HttpRequest
++---------------------------------------------------------------------*/
+NPT_HttpRequest::NPT_HttpRequest(const NPT_HttpUrl& url,
+ const char* method,
+ const char* protocol) :
+ NPT_HttpMessage(protocol),
+ m_Url(url),
+ m_Method(method)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequest::NPT_HttpRequest
++---------------------------------------------------------------------*/
+NPT_HttpRequest::NPT_HttpRequest(const char* url,
+ const char* method,
+ const char* protocol) :
+ NPT_HttpMessage(protocol),
+ m_Url(url),
+ m_Method(method)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequest::SetUrl
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpRequest::SetUrl(const char* url)
+{
+ m_Url = url;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequest::SetUrl
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpRequest::SetUrl(const NPT_HttpUrl& url)
+{
+ m_Url = url;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequest::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpRequest::Parse(NPT_BufferedInputStream& stream,
+ const NPT_SocketAddress* endpoint,
+ NPT_HttpRequest*& request)
+{
+ // default return value
+ request = NULL;
+
+skip_first_empty_line:
+ // read the request line
+ NPT_String line;
+ NPT_CHECK_FINER(stream.ReadLine(line, NPT_HTTP_PROTOCOL_MAX_LINE_LENGTH));
+ NPT_LOG_FINEST_1("http request: %s", line.GetChars());
+
+ // cleanup lines that may contain '\0' as first character, clients such
+ // Spotify desktop app send SSDP M-SEARCH requests followed by an extra
+ // '\0' character which stays in the buffered stream and messes up parsing
+ // the next request.
+ while (line.GetLength() > 0 && line[0] == '\0') {
+ line = line.Erase(0, 1);
+ }
+
+ // when using keep-alive connections, clients such as XBox 360
+ // incorrectly send a few empty lines as body for GET requests
+ // so we try to skip them until we find something to parse
+ if (line.GetLength() == 0) goto skip_first_empty_line;
+
+ // check the request line
+ int first_space = line.Find(' ');
+ if (first_space < 0) {
+ NPT_LOG_FINE_1("http request: %s", line.GetChars());
+ return NPT_ERROR_HTTP_INVALID_REQUEST_LINE;
+ }
+ int second_space = line.Find(' ', first_space+1);
+ if (second_space < 0) {
+ NPT_LOG_FINE_1("http request: %s", line.GetChars());
+ return NPT_ERROR_HTTP_INVALID_REQUEST_LINE;
+ }
+
+ // parse the request line
+ NPT_String method = line.SubString(0, first_space);
+ NPT_String uri = line.SubString(first_space+1, second_space-first_space-1);
+ NPT_String protocol = line.SubString(second_space+1);
+
+ // create a request
+ bool proxy_style_request = false;
+ if (uri.StartsWith("http://", true)) {
+ // proxy-style request with absolute URI
+ request = new NPT_HttpRequest(uri, method, protocol);
+ proxy_style_request = true;
+ } else {
+ // normal absolute path request
+ request = new NPT_HttpRequest("http:", method, protocol);
+ }
+
+ // parse headers
+ NPT_Result result = request->ParseHeaders(stream);
+ if (NPT_FAILED(result)) {
+ delete request;
+ request = NULL;
+ return result;
+ }
+
+ // update the URL
+ if (!proxy_style_request) {
+ request->m_Url.SetScheme("http");
+ request->m_Url.ParsePathPlus(uri);
+ request->m_Url.SetPort(NPT_HTTP_DEFAULT_PORT);
+
+ // check for a Host: header
+ NPT_HttpHeader* host_header = request->GetHeaders().GetHeader(NPT_HTTP_HEADER_HOST);
+ if (host_header) {
+ request->m_Url.SetHost(host_header->GetValue());
+
+ // host sometimes doesn't contain port
+ if (endpoint) {
+ request->m_Url.SetPort(endpoint->GetPort());
+ }
+ } else {
+ // use the endpoint as the host
+ if (endpoint) {
+ request->m_Url.SetHost(endpoint->ToString());
+ } else {
+ // use defaults
+ request->m_Url.SetHost("localhost");
+ }
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequest::~NPT_HttpRequest
++---------------------------------------------------------------------*/
+NPT_HttpRequest::~NPT_HttpRequest()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequest::Emit
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpRequest::Emit(NPT_OutputStream& stream, bool use_proxy) const
+{
+ // write the request line
+ stream.WriteString(m_Method);
+ stream.WriteFully(" ", 1);
+ if (use_proxy) {
+ stream.WriteString(m_Url.ToString(false));
+ } else {
+ stream.WriteString(m_Url.ToRequestString());
+ }
+ stream.WriteFully(" ", 1);
+ stream.WriteString(m_Protocol);
+ stream.WriteFully(NPT_HTTP_LINE_TERMINATOR, 2);
+
+ // emit headers
+ m_Headers.Emit(stream);
+
+ // finish with an empty line
+ stream.WriteFully(NPT_HTTP_LINE_TERMINATOR, 2);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponse::NPT_HttpResponse
++---------------------------------------------------------------------*/
+NPT_HttpResponse::NPT_HttpResponse(NPT_HttpStatusCode status_code,
+ const char* reason_phrase,
+ const char* protocol) :
+ NPT_HttpMessage(protocol),
+ m_StatusCode(status_code),
+ m_ReasonPhrase(reason_phrase)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponse::~NPT_HttpResponse
++---------------------------------------------------------------------*/
+NPT_HttpResponse::~NPT_HttpResponse()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponse::SetStatus
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpResponse::SetStatus(NPT_HttpStatusCode status_code,
+ const char* reason_phrase,
+ const char* protocol)
+{
+ m_StatusCode = status_code;
+ m_ReasonPhrase = reason_phrase;
+ if (protocol) m_Protocol = protocol;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponse::SetProtocol
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpResponse::SetProtocol(const char* protocol)
+{
+ m_Protocol = protocol;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponse::Emit
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpResponse::Emit(NPT_OutputStream& stream) const
+{
+ // write the request line
+ stream.WriteString(m_Protocol);
+ stream.WriteFully(" ", 1);
+ stream.WriteString(NPT_String::FromInteger(m_StatusCode));
+ stream.WriteFully(" ", 1);
+ stream.WriteString(m_ReasonPhrase);
+ stream.WriteFully(NPT_HTTP_LINE_TERMINATOR, 2);
+
+ // emit headers
+ m_Headers.Emit(stream);
+
+ // finish with an empty line
+ stream.WriteFully(NPT_HTTP_LINE_TERMINATOR, 2);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponse::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpResponse::Parse(NPT_BufferedInputStream& stream,
+ NPT_HttpResponse*& response)
+{
+ // default return value
+ response = NULL;
+
+ // read the response line
+ NPT_String line;
+ NPT_CHECK_WARNING(stream.ReadLine(line, NPT_HTTP_PROTOCOL_MAX_LINE_LENGTH));
+
+ NPT_LOG_FINER_1("http response: %s", line.GetChars());
+
+ // check the response line
+ // we are lenient here, as we allow the response to deviate slightly from
+ // strict HTTP (for example, ICY servers response with a method equal to
+ // ICY insead of HTTP/1.X)
+ int first_space = line.Find(' ');
+ if (first_space < 1) return NPT_ERROR_HTTP_INVALID_RESPONSE_LINE;
+ int second_space = line.Find(' ', first_space+1);
+ if (second_space < 0) {
+ // some servers omit (incorrectly) the space and Reason-Code
+ // but we don't fail them just for that. Just check that the
+ // status code looks ok
+ if (line.GetLength() != 12) {
+ return NPT_ERROR_HTTP_INVALID_RESPONSE_LINE;
+ }
+ } else if (second_space-first_space != 4) {
+ // the status code is not of length 3
+ return NPT_ERROR_HTTP_INVALID_RESPONSE_LINE;
+ }
+
+ // parse the response line
+ NPT_String protocol = line.SubString(0, first_space);
+ NPT_String status_code = line.SubString(first_space+1, 3);
+ NPT_String reason_phrase = line.SubString(first_space+1+3+1,
+ line.GetLength()-(first_space+1+3+1));
+
+ // create a response object
+ NPT_UInt32 status_code_int = 0;
+ status_code.ToInteger(status_code_int);
+ response = new NPT_HttpResponse(status_code_int, reason_phrase, protocol);
+
+ // parse headers
+ NPT_Result result = response->ParseHeaders(stream);
+ if (NPT_FAILED(result)) {
+ delete response;
+ response = NULL;
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEnvProxySelector
++---------------------------------------------------------------------*/
+class NPT_HttpEnvProxySelector : public NPT_HttpProxySelector,
+ public NPT_AutomaticCleaner::Singleton
+{
+public:
+ static NPT_HttpEnvProxySelector* GetInstance();
+
+ // NPT_HttpProxySelector methods
+ NPT_Result GetProxyForUrl(const NPT_HttpUrl& url, NPT_HttpProxyAddress& proxy) override;
+
+private:
+ // class variables
+ static NPT_HttpEnvProxySelector* Instance;
+
+ // class methods
+ static void ParseProxyEnv(const NPT_String& env, NPT_HttpProxyAddress& proxy);
+
+ // members
+ NPT_HttpProxyAddress m_HttpProxy;
+ NPT_HttpProxyAddress m_HttpsProxy;
+ NPT_List<NPT_String> m_NoProxy;
+ NPT_HttpProxyAddress m_AllProxy;
+};
+NPT_HttpEnvProxySelector* NPT_HttpEnvProxySelector::Instance = NULL;
+
+/*----------------------------------------------------------------------
+| NPT_HttpEnvProxySelector::GetInstance
++---------------------------------------------------------------------*/
+NPT_HttpEnvProxySelector*
+NPT_HttpEnvProxySelector::GetInstance()
+{
+ if (Instance) return Instance;
+
+ NPT_SingletonLock::GetInstance().Lock();
+ if (Instance == NULL) {
+ // create the shared instance
+ Instance = new NPT_HttpEnvProxySelector();
+
+ // prepare for recycling
+ NPT_AutomaticCleaner::GetInstance()->Register(Instance);
+
+ // parse the http proxy settings
+ NPT_String http_proxy;
+ NPT_Environment::Get("http_proxy", http_proxy);
+ ParseProxyEnv(http_proxy, Instance->m_HttpProxy);
+ NPT_LOG_FINE_2("http_proxy: %s:%d", Instance->m_HttpProxy.GetHostName().GetChars(), Instance->m_HttpProxy.GetPort());
+
+ // parse the https proxy settings
+ NPT_String https_proxy;
+ if (NPT_FAILED(NPT_Environment::Get("HTTPS_PROXY", https_proxy))) {
+ NPT_Environment::Get("https_proxy", https_proxy);
+ }
+ ParseProxyEnv(https_proxy, Instance->m_HttpsProxy);
+ NPT_LOG_FINE_2("https_proxy: %s:%d", Instance->m_HttpsProxy.GetHostName().GetChars(), Instance->m_HttpsProxy.GetPort());
+
+ // parse the all-proxy settings
+ NPT_String all_proxy;
+ if (NPT_FAILED(NPT_Environment::Get("ALL_PROXY", all_proxy))) {
+ NPT_Environment::Get("all_proxy", all_proxy);
+ }
+ ParseProxyEnv(all_proxy, Instance->m_AllProxy);
+ NPT_LOG_FINE_2("all_proxy: %s:%d", Instance->m_AllProxy.GetHostName().GetChars(), Instance->m_AllProxy.GetPort());
+
+ // parse the no-proxy settings
+ NPT_String no_proxy;
+ if (NPT_FAILED(NPT_Environment::Get("NO_PROXY", no_proxy))) {
+ NPT_Environment::Get("no_proxy", no_proxy);
+ }
+ if (no_proxy.GetLength()) {
+ Instance->m_NoProxy = no_proxy.Split(",");
+ }
+ }
+ NPT_SingletonLock::GetInstance().Unlock();
+
+ return Instance;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEnvProxySelector::ParseProxyEnv
++---------------------------------------------------------------------*/
+void
+NPT_HttpEnvProxySelector::ParseProxyEnv(const NPT_String& env,
+ NPT_HttpProxyAddress& proxy)
+{
+ // ignore empty strings
+ if (env.GetLength() == 0) return;
+
+ NPT_String proxy_spec;
+ if (env.Find("://") >= 0) {
+ proxy_spec = env;
+ } else {
+ proxy_spec = "http://"+env;
+ }
+ NPT_Url url(proxy_spec);
+ proxy.SetHostName(url.GetHost());
+ proxy.SetPort(url.GetPort());
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpEnvProxySelector::GetProxyForUrl
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpEnvProxySelector::GetProxyForUrl(const NPT_HttpUrl& url,
+ NPT_HttpProxyAddress& proxy)
+{
+ NPT_HttpProxyAddress* protocol_proxy = NULL;
+ switch (url.GetSchemeId()) {
+ case NPT_Uri::SCHEME_ID_HTTP:
+ protocol_proxy = &m_HttpProxy;
+ break;
+
+ case NPT_Uri::SCHEME_ID_HTTPS:
+ protocol_proxy = &m_HttpsProxy;
+ break;
+
+ default:
+ return NPT_ERROR_HTTP_NO_PROXY;
+ }
+
+ // check for no-proxy first
+ if (m_NoProxy.GetItemCount()) {
+ for (NPT_List<NPT_String>::Iterator i = m_NoProxy.GetFirstItem();
+ i;
+ ++i) {
+ if ((*i) == "*") {
+ return NPT_ERROR_HTTP_NO_PROXY;
+ }
+ if (url.GetHost().EndsWith(*i, true)) {
+ if (url.GetHost().GetLength() == (*i).GetLength()) {
+ // exact match
+ return NPT_ERROR_HTTP_NO_PROXY;
+ }
+ if (url.GetHost().GetChars()[url.GetHost().GetLength()-(*i).GetLength()-1] == '.') {
+ // subdomain match
+ return NPT_ERROR_HTTP_NO_PROXY;
+ }
+ }
+ }
+ }
+
+ // check the protocol proxy
+ if (protocol_proxy->GetHostName().GetLength()) {
+ proxy = *protocol_proxy;
+ return NPT_SUCCESS;
+ }
+
+ // use the default proxy
+ proxy = m_AllProxy;
+
+ return proxy.GetHostName().GetLength()?NPT_SUCCESS:NPT_ERROR_HTTP_NO_PROXY;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpProxySelector::GetDefault
++---------------------------------------------------------------------*/
+static bool NPT_HttpProxySelector_ConfigChecked = false;
+static unsigned int NPT_HttpProxySelector_Config = 0;
+const unsigned int NPT_HTTP_PROXY_SELECTOR_CONFIG_NONE = 0;
+const unsigned int NPT_HTTP_PROXY_SELECTOR_CONFIG_ENV = 1;
+const unsigned int NPT_HTTP_PROXY_SELECTOR_CONFIG_SYSTEM = 2;
+NPT_HttpProxySelector*
+NPT_HttpProxySelector::GetDefault()
+{
+ if (!NPT_HttpProxySelector_ConfigChecked) {
+ NPT_String config;
+ if (NPT_SUCCEEDED(NPT_Environment::Get("NEPTUNE_NET_CONFIG_PROXY_SELECTOR", config))) {
+ if (config.Compare("noproxy", true) == 0) {
+ NPT_HttpProxySelector_Config = NPT_HTTP_PROXY_SELECTOR_CONFIG_NONE;
+ } else if (config.Compare("env", true) == 0) {
+ NPT_HttpProxySelector_Config = NPT_HTTP_PROXY_SELECTOR_CONFIG_ENV;
+ } else if (config.Compare("system", true) == 0) {
+ NPT_HttpProxySelector_Config = NPT_HTTP_PROXY_SELECTOR_CONFIG_SYSTEM;
+ } else {
+ NPT_HttpProxySelector_Config = NPT_HTTP_PROXY_SELECTOR_CONFIG_NONE;
+ }
+ }
+ NPT_HttpProxySelector_ConfigChecked = true;
+ }
+
+ switch (NPT_HttpProxySelector_Config) {
+ case NPT_HTTP_PROXY_SELECTOR_CONFIG_NONE:
+ // no proxy
+ return NULL;
+
+ case NPT_HTTP_PROXY_SELECTOR_CONFIG_ENV:
+ // use the shared instance
+ return NPT_HttpEnvProxySelector::GetInstance();
+
+ case NPT_HTTP_PROXY_SELECTOR_CONFIG_SYSTEM:
+ // use the sytem proxy selector
+ return GetSystemSelector();
+
+ default:
+ return NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpProxySelector::GetSystemSelector
++---------------------------------------------------------------------*/
+#if !defined(NPT_CONFIG_HAVE_SYSTEM_PROXY_SELECTOR)
+NPT_HttpProxySelector*
+NPT_HttpProxySelector::GetSystemSelector()
+{
+ return NULL;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_HttpStaticProxySelector
++---------------------------------------------------------------------*/
+class NPT_HttpStaticProxySelector : public NPT_HttpProxySelector
+{
+public:
+ // constructor
+ NPT_HttpStaticProxySelector(const char* http_propxy_hostname,
+ NPT_UInt16 http_proxy_port,
+ const char* https_proxy_hostname,
+ NPT_UInt16 htts_proxy_port);
+
+ // NPT_HttpProxySelector methods
+ NPT_Result GetProxyForUrl(const NPT_HttpUrl& url, NPT_HttpProxyAddress& proxy) override;
+
+private:
+ // members
+ NPT_HttpProxyAddress m_HttpProxy;
+ NPT_HttpProxyAddress m_HttpsProxy;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpStaticProxySelector::NPT_HttpStaticProxySelector
++---------------------------------------------------------------------*/
+NPT_HttpStaticProxySelector::NPT_HttpStaticProxySelector(const char* http_proxy_hostname,
+ NPT_UInt16 http_proxy_port,
+ const char* https_proxy_hostname,
+ NPT_UInt16 https_proxy_port) :
+ m_HttpProxy( http_proxy_hostname, http_proxy_port),
+ m_HttpsProxy(https_proxy_hostname, https_proxy_port)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpStaticProxySelector::GetProxyForUrl
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpStaticProxySelector::GetProxyForUrl(const NPT_HttpUrl& url,
+ NPT_HttpProxyAddress& proxy)
+{
+ switch (url.GetSchemeId()) {
+ case NPT_Uri::SCHEME_ID_HTTP:
+ proxy = m_HttpProxy;
+ break;
+
+ case NPT_Uri::SCHEME_ID_HTTPS:
+ proxy = m_HttpsProxy;
+ break;
+
+ default:
+ return NPT_ERROR_HTTP_NO_PROXY;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::NPT_HttpConnectionManager
++---------------------------------------------------------------------*/
+NPT_HttpConnectionManager::NPT_HttpConnectionManager() :
+ m_Lock(true),
+ m_MaxConnections(NPT_HTTP_CONNECTION_MANAGER_MAX_CONNECTION_POOL_SIZE),
+ m_MaxConnectionAge(NPT_HTTP_CONNECTION_MANAGER_MAX_CONNECTION_AGE)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::~NPT_HttpConnectionManager
++---------------------------------------------------------------------*/
+NPT_HttpConnectionManager::~NPT_HttpConnectionManager()
+{
+ // set abort flag and wait for thread to finish
+ m_Aborted.SetValue(1);
+ Wait();
+
+ m_Connections.Apply(NPT_ObjectDeleter<Connection>());
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::GetInstance
++---------------------------------------------------------------------*/
+NPT_HttpConnectionManager*
+NPT_HttpConnectionManager::GetInstance()
+{
+ if (Instance) return Instance;
+
+ NPT_SingletonLock::GetInstance().Lock();
+ if (Instance == NULL) {
+ // create the shared instance
+ Instance = new NPT_HttpConnectionManager();
+
+ // register to for automatic cleanup
+ NPT_AutomaticCleaner::GetInstance()->RegisterHttpConnectionManager(Instance);
+
+ // Start shared instance
+ Instance->Start();
+ }
+ NPT_SingletonLock::GetInstance().Unlock();
+
+ return Instance;
+}
+NPT_HttpConnectionManager* NPT_HttpConnectionManager::Instance = NULL;
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::Run
++---------------------------------------------------------------------*/
+void
+NPT_HttpConnectionManager::Run()
+{
+ // try to cleanup every 5 secs
+ while (m_Aborted.WaitUntilEquals(1, 5000) == NPT_ERROR_TIMEOUT) {
+ NPT_AutoLock lock(m_Lock);
+ Cleanup();
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::Cleanup
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpConnectionManager::Cleanup()
+{
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ NPT_TimeStamp delta((float)m_MaxConnectionAge);
+
+ NPT_List<Connection*>::Iterator tail = m_Connections.GetLastItem();
+ while (tail) {
+ if (now < (*tail)->m_TimeStamp + delta) break;
+ NPT_LOG_FINE_1("cleaning up connection (%d remain)", m_Connections.GetItemCount());
+ delete *tail;
+ m_Connections.Erase(tail);
+ tail = m_Connections.GetLastItem();
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::FindConnection
++---------------------------------------------------------------------*/
+NPT_HttpConnectionManager::Connection*
+NPT_HttpConnectionManager::FindConnection(NPT_SocketAddress& address)
+{
+ NPT_AutoLock lock(m_Lock);
+ Cleanup();
+
+ for (NPT_List<Connection*>::Iterator i = m_Connections.GetFirstItem();
+ i;
+ ++i) {
+ Connection* connection = *i;
+
+ NPT_SocketInfo info;
+ if (NPT_FAILED(connection->GetInfo(info))) continue;
+
+ if (info.remote_address == address) {
+ m_Connections.Erase(i);
+ return connection;
+ }
+ }
+
+ // not found
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::Track
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpConnectionManager::Track(NPT_HttpClient* client, NPT_HttpClient::Connection* connection)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ // look if already tracking client connections
+ ConnectionList* connections = NULL;
+ if (NPT_SUCCEEDED(m_ClientConnections.Get(client, connections))) {
+ // return immediately if connection is already associated with client
+ if (connections->Find(NPT_ObjectComparator<NPT_HttpClient::Connection*>(connection))) {
+ NPT_LOG_WARNING("Connection already associated to client.");
+ return NPT_SUCCESS;
+ }
+ connections->Add(connection);
+ return NPT_SUCCESS;
+ }
+
+ // new client connections
+ ConnectionList new_connections;
+
+ // add connection to new client connection list
+ new_connections.Add(connection);
+
+ // track new client connections
+ m_ClientConnections.Put(client, new_connections);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::UntrackConnection
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpConnectionManager::UntrackConnection(NPT_HttpClient::Connection* connection)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (!connection) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // look for connection by enumerating all client connections
+ NPT_List<NPT_Map<NPT_HttpClient*, ConnectionList>::Entry*>::Iterator entry =
+ m_ClientConnections.GetEntries().GetFirstItem();
+ while (entry) {
+ NPT_HttpClient*& client = (NPT_HttpClient*&)(*entry)->GetKey();
+ ConnectionList& connections = (ConnectionList&)(*entry)->GetValue();
+
+ // look for connection in client connection list
+ NPT_List<NPT_HttpClient::Connection*>::Iterator i =
+ connections.Find(NPT_ObjectComparator<NPT_HttpClient::Connection*>(connection));
+ if (i) {
+ // remove it
+ connections.Erase(i);
+
+ // untrack client if no more active connections for it
+ if (connections.GetItemCount() == 0) {
+ m_ClientConnections.Erase(client);
+ }
+
+ return NPT_SUCCESS;
+ }
+ ++entry;
+ }
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::Untrack
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpConnectionManager::Untrack(NPT_HttpClient::Connection* connection)
+{
+ // check first if ConnectionCanceller Instance has not been released already
+ // with static finalizers
+ if (Instance == NULL) return NPT_FAILURE;
+
+ return GetInstance()->UntrackConnection(connection);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::Recycle
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpConnectionManager::Recycle(NPT_HttpConnectionManager::Connection* connection)
+{
+ // Untrack connection
+ UntrackConnection(connection);
+
+ {
+ NPT_AutoLock lock(m_Lock);
+ Cleanup();
+
+ // remove older connections to make room
+ while (m_Connections.GetItemCount() >= m_MaxConnections) {
+ NPT_List<Connection*>::Iterator head = m_Connections.GetFirstItem();
+ if (!head) break;
+ delete *head;
+ m_Connections.Erase(head);
+ NPT_LOG_FINER("removing connection from pool to make some room");
+ }
+
+ if (connection) {
+
+ // label this connection with the current timestamp and flag
+ NPT_System::GetCurrentTimeStamp(connection->m_TimeStamp);
+ connection->m_IsRecycled = true;
+
+ // add the connection to the pool
+ m_Connections.Add(connection);
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::AbortConnections
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpConnectionManager::AbortConnections(NPT_HttpClient* client)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ ConnectionList* connections = NULL;
+ if (NPT_SUCCEEDED(m_ClientConnections.Get(client, connections))) {
+ for (NPT_List<NPT_HttpClient::Connection*>::Iterator i = connections->GetFirstItem();
+ i;
+ ++i) {
+ (*i)->Abort();
+ }
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::Connection::Connection
++---------------------------------------------------------------------*/
+NPT_HttpConnectionManager::Connection::Connection(NPT_HttpConnectionManager& manager,
+ NPT_SocketReference& socket,
+ NPT_InputStreamReference input_stream,
+ NPT_OutputStreamReference output_stream) :
+ m_Manager(manager),
+ m_IsRecycled(false),
+ m_Socket(socket),
+ m_InputStream(input_stream),
+ m_OutputStream(output_stream)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::Connection::~Connection
++---------------------------------------------------------------------*/
+NPT_HttpConnectionManager::Connection::~Connection()
+{
+ NPT_HttpConnectionManager::Untrack(this);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager::Connection::Recycle
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpConnectionManager::Connection::Recycle()
+{
+ return m_Manager.Recycle(this);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::NPT_HttpClient
++---------------------------------------------------------------------*/
+NPT_HttpClient::NPT_HttpClient(Connector* connector, bool transfer_ownership) :
+ m_ProxySelector(NPT_HttpProxySelector::GetDefault()),
+ m_ProxySelectorIsOwned(false),
+ m_Connector(connector),
+ m_ConnectorIsOwned(transfer_ownership),
+ m_Aborted(false)
+{
+ if (connector == NULL) {
+ m_Connector = new NPT_HttpTlsConnector();
+ m_ConnectorIsOwned = true;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::~NPT_HttpClient
++---------------------------------------------------------------------*/
+NPT_HttpClient::~NPT_HttpClient()
+{
+ if (m_ProxySelectorIsOwned) {
+ delete m_ProxySelector;
+ }
+ if (m_ConnectorIsOwned) {
+ delete m_Connector;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::SetConfig
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::SetConfig(const Config& config)
+{
+ m_Config = config;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::SetProxy
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::SetProxy(const char* http_proxy_hostname,
+ NPT_UInt16 http_proxy_port,
+ const char* https_proxy_hostname,
+ NPT_UInt16 https_proxy_port)
+{
+ if (m_ProxySelectorIsOwned) {
+ delete m_ProxySelector;
+ m_ProxySelector = NULL;
+ m_ProxySelectorIsOwned = false;
+ }
+
+ // use a static proxy to hold on to the settings
+ m_ProxySelector = new NPT_HttpStaticProxySelector(http_proxy_hostname,
+ http_proxy_port,
+ https_proxy_hostname,
+ https_proxy_port);
+ m_ProxySelectorIsOwned = true;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::SetProxySelector
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::SetProxySelector(NPT_HttpProxySelector* selector)
+{
+ if (m_ProxySelectorIsOwned && m_ProxySelector != selector) {
+ delete m_ProxySelector;
+ }
+ m_ProxySelector = selector;
+ m_ProxySelectorIsOwned = false;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::SetConnector
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::SetConnector(Connector* connector)
+{
+ if (m_ConnectorIsOwned && m_Connector != connector) {
+ delete m_Connector;
+ }
+ m_Connector = connector;
+ m_ConnectorIsOwned = false;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::SetTimeouts
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::SetTimeouts(NPT_Timeout connection_timeout,
+ NPT_Timeout io_timeout,
+ NPT_Timeout name_resolver_timeout)
+{
+ m_Config.m_ConnectionTimeout = connection_timeout;
+ m_Config.m_IoTimeout = io_timeout;
+ m_Config.m_NameResolverTimeout = name_resolver_timeout;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::SetUserAgent
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::SetUserAgent(const char* user_agent)
+{
+ m_Config.m_UserAgent = user_agent;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::TrackConnection
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::TrackConnection(Connection* connection)
+{
+ NPT_AutoLock lock(m_AbortLock);
+ if (m_Aborted) return NPT_ERROR_CANCELLED;
+ return NPT_HttpConnectionManager::GetInstance()->Track(this, connection);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::SendRequestOnce
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::SendRequestOnce(NPT_HttpRequest& request,
+ NPT_HttpResponse*& response,
+ NPT_HttpRequestContext* context /* = NULL */)
+{
+ // setup default values
+ NPT_Result result = NPT_SUCCESS;
+ response = NULL;
+
+ NPT_LOG_FINE_1("requesting URL %s", request.GetUrl().ToString().GetChars());
+
+ // get the address and port to which we need to connect
+ NPT_HttpProxyAddress proxy;
+ bool use_proxy = false;
+ if (m_ProxySelector) {
+ // we have a proxy selector, ask it to select a proxy for this URL
+ result = m_ProxySelector->GetProxyForUrl(request.GetUrl(), proxy);
+ if (NPT_FAILED(result) && result != NPT_ERROR_HTTP_NO_PROXY) {
+ NPT_LOG_WARNING_1("proxy selector failure (%d)", result);
+ return result;
+ }
+ use_proxy = !proxy.GetHostName().IsEmpty();
+ }
+
+ // connect to the server or proxy
+ Connection* connection = NULL;
+ bool http_1_1 = (request.GetProtocol() == NPT_HTTP_PROTOCOL_1_1);
+ NPT_Reference<Connection> cref;
+
+ // send the request to the server (in a loop, since we may need to reconnect with 1.1)
+ bool reconnect = false;
+ unsigned int watchdog = NPT_HTTP_MAX_RECONNECTS;
+ do {
+ cref = NULL;
+ connection = NULL;
+ NPT_LOG_FINE_3("calling connector (proxy:%s) (http 1.1:%s) (url:%s)",
+ use_proxy?"yes":"no", http_1_1?"yes":"no", request.GetUrl().ToStringWithDefaultPort(0).GetChars());
+ NPT_CHECK_WARNING(m_Connector->Connect(request.GetUrl(),
+ *this,
+ use_proxy?&proxy:NULL,
+ http_1_1,
+ connection));
+ NPT_LOG_FINE_1("got connection (reused: %s)", connection->IsRecycled()?"true":"false");
+
+ NPT_InputStreamReference input_stream = connection->GetInputStream();
+ NPT_OutputStreamReference output_stream = connection->GetOutputStream();
+
+ cref = connection;
+ reconnect = connection->IsRecycled();
+
+ // update context if any
+ if (context) {
+ NPT_SocketInfo info;
+ cref->GetInfo(info);
+ context->SetLocalAddress(info.local_address);
+ context->SetRemoteAddress(info.remote_address);
+ }
+
+ NPT_HttpEntity* entity = request.GetEntity();
+ NPT_InputStreamReference body_stream;
+
+ if (reconnect && entity && NPT_SUCCEEDED(entity->GetInputStream(body_stream)) && NPT_FAILED(body_stream->Seek(0))) {
+ // if body is not seekable, we can't afford to reuse a connection
+ // that could fail, so we reconnect a new one instead
+ NPT_LOG_FINE("rewinding body stream would fail ... create new connection");
+ continue;
+ }
+
+ // decide if this connection should persist
+ NPT_HttpHeaders& headers = request.GetHeaders();
+ bool should_persist = http_1_1;
+ if (!connection->SupportsPersistence()) {
+ should_persist = false;
+ }
+ if (should_persist) {
+ const NPT_String* connection_header = headers.GetHeaderValue(NPT_HTTP_HEADER_CONNECTION);
+ if (connection_header && (*connection_header == "close")) {
+ should_persist = false;
+ }
+ }
+
+ if (m_Config.m_UserAgent.GetLength()) {
+ headers.SetHeader(NPT_HTTP_HEADER_USER_AGENT, m_Config.m_UserAgent, false); // set but don't replace
+ }
+
+ result = WriteRequest(*output_stream.AsPointer(), request, should_persist, use_proxy);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE_1("failed to write request headers (%d)", result);
+ if (reconnect && !m_Aborted) {
+ if (!body_stream.IsNull()) {
+ // go back to the start of the body so that we can resend
+ NPT_LOG_FINE("rewinding body stream in order to resend");
+ result = body_stream->Seek(0);
+ if (NPT_FAILED(result)) {
+ NPT_CHECK_FINE(NPT_ERROR_HTTP_CANNOT_RESEND_BODY);
+ }
+ }
+ continue;
+ } else {
+ return result;
+ }
+ }
+
+ result = ReadResponse(input_stream,
+ should_persist,
+ request.GetMethod() != NPT_HTTP_METHOD_HEAD,
+ response,
+ &cref);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE_1("failed to parse the response (%d)", result);
+ if (reconnect && !m_Aborted /*&&
+ (result == NPT_ERROR_EOS ||
+ result == NPT_ERROR_CONNECTION_ABORTED ||
+ result == NPT_ERROR_CONNECTION_RESET ||
+ result == NPT_ERROR_READ_FAILED) GBG: don't look for specific error codes */) {
+ NPT_LOG_FINE("error is not fatal, retrying");
+ if (!body_stream.IsNull()) {
+ // go back to the start of the body so that we can resend
+ NPT_LOG_FINE("rewinding body stream in order to resend");
+ result = body_stream->Seek(0);
+ if (NPT_FAILED(result)) {
+ NPT_CHECK_FINE(NPT_ERROR_HTTP_CANNOT_RESEND_BODY);
+ }
+ }
+ continue;
+ } else {
+ // don't retry
+ return result;
+ }
+ }
+ break;
+ } while (reconnect && --watchdog && !m_Aborted);
+
+ // check that we have a valid connection
+ if (NPT_FAILED(result) && !m_Aborted) {
+ NPT_LOG_FINE("failed after max reconnection attempts");
+ return NPT_ERROR_HTTP_TOO_MANY_RECONNECTS;
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::WriteRequest
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::WriteRequest(NPT_OutputStream& output_stream,
+ NPT_HttpRequest& request,
+ bool should_persist,
+ bool use_proxy /* = false */)
+{
+ NPT_Result result = NPT_SUCCESS;
+
+ // add any headers that may be missing
+ NPT_HttpHeaders& headers = request.GetHeaders();
+
+ if (!should_persist) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONNECTION, "close", false); // set but don't replace
+ }
+
+ NPT_String host = request.GetUrl().GetHost();
+ NPT_UInt16 default_port = 0;
+ switch (request.GetUrl().GetSchemeId()) {
+ case NPT_Uri::SCHEME_ID_HTTP: default_port = NPT_HTTP_DEFAULT_PORT; break;
+ case NPT_Uri::SCHEME_ID_HTTPS: default_port = NPT_HTTPS_DEFAULT_PORT; break;
+ default: break;
+ }
+ if (request.GetUrl().GetPort() != default_port) {
+ host += ":";
+ host += NPT_String::FromInteger(request.GetUrl().GetPort());
+ }
+ headers.SetHeader(NPT_HTTP_HEADER_HOST, host, false); // set but don't replace
+
+ // get the request entity to set additional headers
+ NPT_InputStreamReference body_stream;
+ NPT_HttpEntity* entity = request.GetEntity();
+ if (entity && NPT_SUCCEEDED(entity->GetInputStream(body_stream))) {
+ // set the content length if known
+ if (entity->ContentLengthIsKnown()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH,
+ NPT_String::FromInteger(entity->GetContentLength()));
+ }
+
+ // content type
+ NPT_String content_type = entity->GetContentType();
+ if (!content_type.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_TYPE, content_type);
+ }
+
+ // content encoding
+ NPT_String content_encoding = entity->GetContentEncoding();
+ if (!content_encoding.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_ENCODING, content_encoding);
+ }
+
+ // transfer encoding
+ const NPT_String& transfer_encoding = entity->GetTransferEncoding();
+ if (!transfer_encoding.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_TRANSFER_ENCODING, transfer_encoding);
+ }
+ }
+
+ // create a memory stream to buffer the headers
+ NPT_MemoryStream header_stream;
+
+ // emit the request headers into the header buffer
+ request.Emit(header_stream, use_proxy && request.GetUrl().GetSchemeId()==NPT_Url::SCHEME_ID_HTTP);
+
+ // send the headers
+ NPT_CHECK_WARNING(output_stream.WriteFully(header_stream.GetData(), header_stream.GetDataSize()));
+
+ // send request body
+ if (entity && !body_stream.IsNull()) {
+ // check for chunked transfer encoding
+ NPT_OutputStream* dest = &output_stream;
+ if (entity->GetTransferEncoding() == NPT_HTTP_TRANSFER_ENCODING_CHUNKED) {
+ dest = new NPT_HttpChunkedOutputStream(output_stream);
+ }
+
+ NPT_LOG_FINE_1("sending body stream, %lld bytes", entity->GetContentLength()); //FIXME: Would be 0 for chunked encoding
+ NPT_LargeSize bytes_written = 0;
+
+ // content length = 0 means copy until input returns EOS
+ result = NPT_StreamToStreamCopy(*body_stream.AsPointer(), *dest, 0, entity->GetContentLength(), &bytes_written);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE_3("body stream only partially sent, %lld bytes (%d:%s)",
+ bytes_written,
+ result,
+ NPT_ResultText(result));
+ }
+
+ // flush to write out any buffered data left in chunked output if used
+ dest->Flush();
+
+ // cleanup (this will send zero size chunk followed by CRLF)
+ if (dest != &output_stream) delete dest;
+ }
+
+ // flush the output stream so that everything is sent to the server
+ output_stream.Flush();
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::ReadResponse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::ReadResponse(NPT_InputStreamReference& input_stream,
+ bool should_persist,
+ bool expect_entity,
+ NPT_HttpResponse*& response,
+ NPT_Reference<Connection>* cref /* = NULL */)
+{
+ NPT_Result result;
+
+ // setup default values
+ response = NULL;
+
+ // create a buffered stream for this socket stream
+ NPT_BufferedInputStreamReference buffered_input_stream(new NPT_BufferedInputStream(input_stream));
+
+ // parse the response
+ for (unsigned int watchcat = 0; watchcat < NPT_HTTP_MAX_100_RESPONSES; watchcat++) {
+ // parse the response
+ result = NPT_HttpResponse::Parse(*buffered_input_stream, response);
+ NPT_CHECK_FINE(result);
+
+ if (response->GetStatusCode() >= 100 && response->GetStatusCode() < 200) {
+ NPT_LOG_FINE_1("got %d response, continuing", response->GetStatusCode());
+ delete response;
+ response = NULL;
+ continue;
+ }
+ NPT_LOG_FINER_2("got response, code=%d, msg=%s",
+ response->GetStatusCode(),
+ response->GetReasonPhrase().GetChars());
+ break;
+ }
+
+ // check that we have a valid response
+ if (response == NULL) {
+ NPT_LOG_FINE("failed after max continuation attempts");
+ return NPT_ERROR_HTTP_TOO_MANY_RECONNECTS;
+ }
+
+ // unbuffer the stream
+ buffered_input_stream->SetBufferSize(0);
+
+ // decide if we should still try to reuse this connection later on
+ if (should_persist) {
+ const NPT_String* connection_header = response->GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_CONNECTION);
+ if (response->GetProtocol() == NPT_HTTP_PROTOCOL_1_1) {
+ if (connection_header && (*connection_header == "close")) {
+ should_persist = false;
+ }
+ } else {
+ if (!connection_header || (*connection_header != "keep-alive")) {
+ should_persist = false;
+ }
+ }
+ }
+
+ // create an entity if one is expected in the response
+ if (expect_entity) {
+ NPT_HttpEntity* response_entity = new NPT_HttpEntity(response->GetHeaders());
+
+ // check if the content length is known
+ bool have_content_length = (response->GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_CONTENT_LENGTH) != NULL);
+
+ // check for chunked Transfer-Encoding
+ bool chunked = false;
+ if (response_entity->GetTransferEncoding() == NPT_HTTP_TRANSFER_ENCODING_CHUNKED) {
+ chunked = true;
+ response_entity->SetTransferEncoding(NULL);
+ }
+
+ // prepare to transfer ownership of the connection if needed
+ Connection* connection = NULL;
+ if (cref) {
+ connection = cref->AsPointer();
+ cref->Detach(); // release the internal ref
+ // don't delete connection now so we can abort while readin response body,
+ // just pass ownership to NPT_HttpEntityBodyInputStream so it can recycle it
+ // when done if connection should persist
+ }
+
+ // create the body stream wrapper
+ NPT_InputStream* response_body_stream =
+ new NPT_HttpEntityBodyInputStream(buffered_input_stream,
+ response_entity->GetContentLength(),
+ have_content_length,
+ chunked,
+ connection,
+ should_persist);
+ response_entity->SetInputStream(NPT_InputStreamReference(response_body_stream));
+ response->SetEntity(response_entity);
+ } else {
+ if (should_persist && cref) {
+ Connection* connection = cref->AsPointer();
+ cref->Detach(); // release the internal ref
+ connection->Recycle();
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::SendRequest
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::SendRequest(NPT_HttpRequest& request,
+ NPT_HttpResponse*& response,
+ NPT_HttpRequestContext* context /* = NULL */)
+{
+ NPT_Cardinal watchdog = m_Config.m_MaxRedirects+1;
+ bool keep_going;
+ NPT_Result result;
+
+ // reset aborted flag
+ m_Aborted = false;
+
+ // default value
+ response = NULL;
+
+ // check that for GET requests there is no entity
+ if (request.GetEntity() != NULL &&
+ request.GetMethod() == NPT_HTTP_METHOD_GET) {
+ return NPT_ERROR_HTTP_INVALID_REQUEST;
+ }
+
+ do {
+ keep_going = false;
+ result = SendRequestOnce(request, response, context);
+ if (NPT_FAILED(result)) break;
+ if (response && m_Config.m_MaxRedirects &&
+ (request.GetMethod() == NPT_HTTP_METHOD_GET ||
+ request.GetMethod() == NPT_HTTP_METHOD_HEAD) &&
+ (response->GetStatusCode() == 301 ||
+ response->GetStatusCode() == 302 ||
+ response->GetStatusCode() == 303 ||
+ response->GetStatusCode() == 307)) {
+ // handle redirect
+ const NPT_String* location = response->GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_LOCATION);
+ if (location) {
+ // check for location fields that are not absolute URLs
+ // (this is not allowed by the standard, but many web servers do it
+ if (location->StartsWith("/") ||
+ (!location->StartsWith("http://", true) &&
+ !location->StartsWith("https://", true))) {
+ NPT_LOG_FINE_1("Location: header (%s) is not an absolute URL, using it as a relative URL", location->GetChars());
+ if (location->StartsWith("/")) {
+ NPT_LOG_FINE_1("redirecting to absolute path %s", location->GetChars());
+ request.GetUrl().ParsePathPlus(*location);
+ } else {
+ NPT_String redirect_path = request.GetUrl().GetPath();
+ int slash_pos = redirect_path.ReverseFind('/');
+ if (slash_pos >= 0) {
+ redirect_path.SetLength(slash_pos+1);
+ } else {
+ redirect_path = "/";
+ }
+ redirect_path += *location;
+ NPT_LOG_FINE_1("redirecting to absolute path %s", redirect_path.GetChars());
+ request.GetUrl().ParsePathPlus(redirect_path);
+ }
+ } else {
+ // replace the request url
+ NPT_LOG_FINE_1("redirecting to %s", location->GetChars());
+ request.SetUrl(*location);
+ // remove host header so it is replaced based on new url
+ request.GetHeaders().RemoveHeader(NPT_HTTP_HEADER_HOST);
+ }
+ keep_going = true;
+ delete response;
+ response = NULL;
+ }
+ }
+ } while (keep_going && --watchdog && !m_Aborted);
+
+ // check if we were bitten by the watchdog
+ if (watchdog == 0) {
+ NPT_LOG_WARNING("too many HTTP redirects");
+ return NPT_ERROR_HTTP_TOO_MANY_REDIRECTS;
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient::Abort
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpClient::Abort()
+{
+ NPT_AutoLock lock(m_AbortLock);
+ m_Aborted = true;
+
+ NPT_HttpConnectionManager::GetInstance()->AbortConnections(this);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequestContext::NPT_HttpRequestContext
++---------------------------------------------------------------------*/
+NPT_HttpRequestContext::NPT_HttpRequestContext(const NPT_SocketAddress* local_address,
+ const NPT_SocketAddress* remote_address)
+{
+ if (local_address) m_LocalAddress = *local_address;
+ if (remote_address) m_RemoteAddress = *remote_address;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::NPT_HttpServer
++---------------------------------------------------------------------*/
+NPT_HttpServer::NPT_HttpServer(NPT_UInt16 listen_port, bool cancellable) :
+ m_Socket(cancellable?NPT_SOCKET_FLAG_CANCELLABLE:0),
+ m_BoundPort(0),
+ m_ServerHeader("Neptune/" NPT_NEPTUNE_VERSION_STRING),
+ m_Run(true)
+{
+ m_Config.m_ListenAddress = NPT_IpAddress::Any;
+ m_Config.m_ListenPort = listen_port;
+ m_Config.m_IoTimeout = NPT_HTTP_SERVER_DEFAULT_IO_TIMEOUT;
+ m_Config.m_ConnectionTimeout = NPT_HTTP_SERVER_DEFAULT_CONNECTION_TIMEOUT;
+ m_Config.m_ReuseAddress = true;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::NPT_HttpServer
++---------------------------------------------------------------------*/
+NPT_HttpServer::NPT_HttpServer(NPT_IpAddress listen_address,
+ NPT_UInt16 listen_port,
+ bool cancellable) :
+ m_Socket(cancellable?NPT_SOCKET_FLAG_CANCELLABLE:0),
+ m_BoundPort(0),
+ m_ServerHeader("Neptune/" NPT_NEPTUNE_VERSION_STRING),
+ m_Run(true)
+{
+ m_Config.m_ListenAddress = listen_address;
+ m_Config.m_ListenPort = listen_port;
+ m_Config.m_IoTimeout = NPT_HTTP_SERVER_DEFAULT_IO_TIMEOUT;
+ m_Config.m_ConnectionTimeout = NPT_HTTP_SERVER_DEFAULT_CONNECTION_TIMEOUT;
+ m_Config.m_ReuseAddress = true;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::~NPT_HttpServer
++---------------------------------------------------------------------*/
+NPT_HttpServer::~NPT_HttpServer()
+{
+ m_RequestHandlers.Apply(NPT_ObjectDeleter<HandlerConfig>());
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::Bind
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::Bind()
+{
+ // check if we're already bound
+ if (m_BoundPort != 0) return NPT_SUCCESS;
+
+ // bind
+ NPT_Result result = m_Socket.Bind(
+ NPT_SocketAddress(m_Config.m_ListenAddress, m_Config.m_ListenPort),
+ m_Config.m_ReuseAddress);
+ if (NPT_FAILED(result)) return result;
+
+ // update the bound port info
+ NPT_SocketInfo info;
+ m_Socket.GetInfo(info);
+ m_BoundPort = info.local_address.GetPort();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::SetConfig
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::SetConfig(const Config& config)
+{
+ m_Config = config;
+
+ // check that we can bind to this listen port
+ return Bind();
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::SetListenPort
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::SetListenPort(NPT_UInt16 port, bool reuse_address)
+{
+ m_Config.m_ListenPort = port;
+ m_Config.m_ReuseAddress = reuse_address;
+ return Bind();
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::SetTimeouts
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::SetTimeouts(NPT_Timeout connection_timeout,
+ NPT_Timeout io_timeout)
+{
+ m_Config.m_ConnectionTimeout = connection_timeout;
+ m_Config.m_IoTimeout = io_timeout;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::SetServerHeader
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::SetServerHeader(const char* server_header)
+{
+ m_ServerHeader = server_header;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::Abort
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::Abort()
+{
+ m_Socket.Cancel();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::WaitForNewClient
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::WaitForNewClient(NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output,
+ NPT_HttpRequestContext* context,
+ NPT_Flags socket_flags)
+{
+ // ensure that we're bound
+ NPT_CHECK_FINE(Bind());
+
+ // wait for a connection
+ NPT_Socket* client;
+ NPT_LOG_FINE_2("waiting for new connection on %s:%d...",
+ (const char*)m_Config.m_ListenAddress.ToString(),
+ m_BoundPort);
+ NPT_Result result = m_Socket.WaitForNewClient(client, m_Config.m_ConnectionTimeout, socket_flags);
+ if (result != NPT_ERROR_TIMEOUT) {
+ NPT_CHECK_WARNING(result);
+ } else {
+ NPT_CHECK_FINE(result);
+ }
+ if (client == NULL) return NPT_ERROR_INTERNAL;
+
+ // get the client info
+ if (context) {
+ NPT_SocketInfo client_info;
+ client->GetInfo(client_info);
+
+ context->SetLocalAddress(client_info.local_address);
+ context->SetRemoteAddress(client_info.remote_address);
+
+ NPT_LOG_FINE_2("client connected (%s <- %s)",
+ client_info.local_address.ToString().GetChars(),
+ client_info.remote_address.ToString().GetChars());
+ }
+
+ // configure the socket
+ client->SetReadTimeout(m_Config.m_IoTimeout);
+ client->SetWriteTimeout(m_Config.m_IoTimeout);
+
+ // get the streams
+ client->GetInputStream(input);
+ client->GetOutputStream(output);
+
+ // we don't need the socket anymore
+ delete client;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::Loop
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::Loop(bool cancellable_sockets)
+{
+ NPT_InputStreamReference input;
+ NPT_OutputStreamReference output;
+ NPT_HttpRequestContext context;
+ NPT_Result result;
+
+ do {
+ // wait for a client to connect
+ NPT_Flags flags = cancellable_sockets?NPT_SOCKET_FLAG_CANCELLABLE:0;
+ result = WaitForNewClient(input, output, &context, flags);
+ NPT_LOG_FINE_2("WaitForNewClient returned %d (%s)",
+ result,
+ NPT_ResultText(result));
+ if (!m_Run) break;
+ if (result == NPT_ERROR_TIMEOUT) continue;
+
+ // respond to the client
+ if (NPT_SUCCEEDED(result)) {
+ // send a response
+ result = RespondToClient(input, output, context);
+ NPT_LOG_FINE_2("ResponToClient returned %d (%s)",
+ result,
+ NPT_ResultText(result));
+ } else {
+ NPT_LOG_FINE_2("WaitForNewClient returned %d (%s)",
+ result,
+ NPT_ResultText(result));
+ // if there was an error, wait a short time to avoid spinning
+ if (result != NPT_ERROR_TERMINATED) {
+ NPT_LOG_FINE("sleeping before restarting the loop");
+ NPT_System::Sleep(1.0);
+ }
+ }
+
+ // release the stream references so that the socket can be closed
+ input = NULL;
+ output = NULL;
+ } while (m_Run && result != NPT_ERROR_TERMINATED);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::HandlerConfig::HandlerConfig
++---------------------------------------------------------------------*/
+NPT_HttpServer::HandlerConfig::HandlerConfig(NPT_HttpRequestHandler* handler,
+ const char* path,
+ bool include_children,
+ bool transfer_ownership) :
+ m_Handler(handler),
+ m_Path(path),
+ m_IncludeChildren(include_children),
+ m_HandlerIsOwned(transfer_ownership)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::HandlerConfig::~HandlerConfig
++---------------------------------------------------------------------*/
+NPT_HttpServer::HandlerConfig::~HandlerConfig()
+{
+ if (m_HandlerIsOwned) delete m_Handler;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::AddRequestHandler
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::AddRequestHandler(NPT_HttpRequestHandler* handler,
+ const char* path,
+ bool include_children,
+ bool transfer_ownership)
+{
+ return m_RequestHandlers.Add(new HandlerConfig(handler, path, include_children, transfer_ownership));
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::FindRequestHandler
++---------------------------------------------------------------------*/
+NPT_HttpRequestHandler*
+NPT_HttpServer::FindRequestHandler(NPT_HttpRequest& request)
+{
+ NPT_String path = NPT_Uri::PercentDecode(request.GetUrl().GetPath());
+ for (NPT_List<HandlerConfig*>::Iterator it = m_RequestHandlers.GetFirstItem();
+ it;
+ ++it) {
+ HandlerConfig* config = *it;
+ if (config->m_IncludeChildren) {
+ if (path.StartsWith(config->m_Path)) {
+ return config->m_Handler;
+ }
+ } else {
+ if (path == config->m_Path) {
+ return config->m_Handler;
+ }
+ }
+ }
+
+ // not found
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::FindRequestHandlers
++---------------------------------------------------------------------*/
+NPT_List<NPT_HttpRequestHandler*>
+NPT_HttpServer::FindRequestHandlers(NPT_HttpRequest& request)
+{
+ NPT_List<NPT_HttpRequestHandler*> handlers;
+
+ for (NPT_List<HandlerConfig*>::Iterator it = m_RequestHandlers.GetFirstItem();
+ it;
+ ++it) {
+ HandlerConfig* config = *it;
+ if (config->m_IncludeChildren) {
+ if (request.GetUrl().GetPath(true).StartsWith(config->m_Path)) {
+ handlers.Add(config->m_Handler);
+ }
+ } else {
+ if (request.GetUrl().GetPath(true) == config->m_Path) {
+ handlers.Insert(handlers.GetFirstItem(), config->m_Handler);
+ }
+ }
+ }
+
+ return handlers;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::RespondToClient
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpServer::RespondToClient(NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output,
+ const NPT_HttpRequestContext& context)
+{
+ NPT_HttpRequest* request;
+ NPT_HttpResponse* response = NULL;
+ NPT_Result result = NPT_ERROR_NO_SUCH_ITEM;
+ bool terminate_server = false;
+
+ NPT_HttpResponder responder(input, output);
+ NPT_CHECK_WARNING(responder.ParseRequest(request, &context.GetLocalAddress()));
+ NPT_LOG_FINE_1("request, path=%s", request->GetUrl().ToRequestString(true).GetChars());
+
+ // prepare the response body
+ NPT_HttpEntity* body = new NPT_HttpEntity();
+
+ NPT_HttpRequestHandler* handler = FindRequestHandler(*request);
+ if (handler) {
+ // create a response object
+ response = new NPT_HttpResponse(200, "OK", NPT_HTTP_PROTOCOL_1_0);
+ response->SetEntity(body);
+
+ // ask the handler to setup the response
+ result = handler->SetupResponse(*request, context, *response);
+ }
+ if (result == NPT_ERROR_NO_SUCH_ITEM || handler == NULL) {
+ body->SetInputStream(NPT_HTTP_DEFAULT_404_HTML);
+ body->SetContentType("text/html");
+ if (response == NULL) {
+ response = new NPT_HttpResponse(404, "Not Found", NPT_HTTP_PROTOCOL_1_0);
+ } else {
+ response->SetStatus(404, "Not Found");
+ }
+ response->SetEntity(body);
+ if (handler) {
+ handler->Completed(NPT_ERROR_NO_SUCH_ITEM);
+ handler = NULL;
+ }
+ } else if (result == NPT_ERROR_PERMISSION_DENIED) {
+ body->SetInputStream(NPT_HTTP_DEFAULT_403_HTML);
+ body->SetContentType("text/html");
+ response->SetStatus(403, "Forbidden");
+ handler->Completed(NPT_ERROR_PERMISSION_DENIED);
+ handler = NULL;
+ } else if (result == NPT_ERROR_TERMINATED) {
+ // mark that we want to exit
+ terminate_server = true;
+ } else if (NPT_FAILED(result)) {
+ body->SetInputStream(NPT_HTTP_DEFAULT_500_HTML);
+ body->SetContentType("text/html");
+ response->SetStatus(500, "Internal Error");
+ handler->Completed(result);
+ handler = NULL;
+ }
+
+ // augment the headers with server information
+ if (m_ServerHeader.GetLength()) {
+ response->GetHeaders().SetHeader(NPT_HTTP_HEADER_SERVER, m_ServerHeader, false);
+ }
+
+ // send the response headers
+ result = responder.SendResponseHeaders(*response);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_2("SendResponseHeaders failed (%d:%s)", result, NPT_ResultText(result));
+ goto end;
+ }
+
+ // send the body
+ if (request->GetMethod() != NPT_HTTP_METHOD_HEAD) {
+ if (handler) {
+ result = handler->SendResponseBody(context, *response, *output);
+ } else {
+ // send body manually in case there was an error with the handler or no handler was found
+ NPT_InputStreamReference body_stream;
+ body->GetInputStream(body_stream);
+ if (!body_stream.IsNull()) {
+ result = NPT_StreamToStreamCopy(*body_stream, *output, 0, body->GetContentLength());
+ if (NPT_FAILED(result)) {
+ NPT_LOG_INFO_2("NPT_StreamToStreamCopy returned %d (%s)", result, NPT_ResultText(result));
+ goto end;
+ }
+ }
+ }
+ }
+
+ // flush
+ output->Flush();
+
+ // if we need to die, we return an error code
+ if (NPT_SUCCEEDED(result) && terminate_server) result = NPT_ERROR_TERMINATED;
+
+end:
+ // cleanup
+ delete response;
+ delete request;
+
+ if (handler) {
+ handler->Completed(result);
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponder::NPT_HttpResponder
++---------------------------------------------------------------------*/
+NPT_HttpResponder::NPT_HttpResponder(NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output) :
+ m_Input(new NPT_BufferedInputStream(input)),
+ m_Output(output)
+{
+ m_Config.m_IoTimeout = NPT_HTTP_SERVER_DEFAULT_IO_TIMEOUT;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponder::~NPT_HttpResponder
++---------------------------------------------------------------------*/
+NPT_HttpResponder::~NPT_HttpResponder()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer::Terminate
++---------------------------------------------------------------------*/
+void NPT_HttpServer::Terminate()
+{
+ m_Run = false;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponder::SetConfig
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpResponder::SetConfig(const Config& config)
+{
+ m_Config = config;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponder::SetTimeout
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpResponder::SetTimeout(NPT_Timeout io_timeout)
+{
+ m_Config.m_IoTimeout = io_timeout;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponder::ParseRequest
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpResponder::ParseRequest(NPT_HttpRequest*& request,
+ const NPT_SocketAddress* local_address)
+{
+ // rebuffer the stream in case we're using a keep-alive connection
+ m_Input->SetBufferSize(NPT_BUFFERED_BYTE_STREAM_DEFAULT_SIZE);
+
+ // parse the request
+ NPT_CHECK_FINE(NPT_HttpRequest::Parse(*m_Input, local_address, request));
+
+ // unbuffer the stream
+ m_Input->SetBufferSize(0);
+
+ // don't create an entity if no body is expected
+ if (request->GetMethod() == NPT_HTTP_METHOD_GET ||
+ request->GetMethod() == NPT_HTTP_METHOD_HEAD ||
+ request->GetMethod() == NPT_HTTP_METHOD_TRACE) {
+ return NPT_SUCCESS;
+ }
+
+ // set the entity info
+ NPT_HttpEntity* entity = new NPT_HttpEntity(request->GetHeaders());
+ if (entity->GetTransferEncoding() == NPT_HTTP_TRANSFER_ENCODING_CHUNKED) {
+ entity->SetInputStream(NPT_InputStreamReference(new NPT_HttpChunkedInputStream(m_Input)));
+ } else {
+ entity->SetInputStream(m_Input);
+ }
+ request->SetEntity(entity);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponder::SendResponseHeaders
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpResponder::SendResponseHeaders(NPT_HttpResponse& response)
+{
+ // add default headers
+ NPT_HttpHeaders& headers = response.GetHeaders();
+ if (response.GetProtocol() == NPT_HTTP_PROTOCOL_1_0) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONNECTION,
+ "close", false); // set but don't replace
+ }
+
+ // add computed headers
+ NPT_HttpEntity* entity = response.GetEntity();
+ if (entity) {
+ // content type
+ const NPT_String& content_type = entity->GetContentType();
+ if (!content_type.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_TYPE, content_type);
+ }
+
+ // content encoding
+ const NPT_String& content_encoding = entity->GetContentEncoding();
+ if (!content_encoding.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_ENCODING, content_encoding);
+ }
+
+ // transfer encoding
+ const NPT_String& transfer_encoding = entity->GetTransferEncoding();
+ if (!transfer_encoding.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_TRANSFER_ENCODING, transfer_encoding);
+ }
+
+ // set the content length if known
+ if (entity->ContentLengthIsKnown()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH,
+ NPT_String::FromInteger(entity->GetContentLength()));
+ } else if (transfer_encoding.IsEmpty() || transfer_encoding.Compare(NPT_HTTP_TRANSFER_ENCODING_CHUNKED, true)) {
+ // no content length, the only way client will know we're done
+ // is when we'll close the connection unless it's chunked encoding
+ headers.SetHeader(NPT_HTTP_HEADER_CONNECTION,
+ "close", true); // set and replace
+ }
+ } else {
+ // force content length to 0 if there is no message body
+ // (necessary for 1.1 or 1.0 with keep-alive connections)
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH, "0");
+ }
+
+ // create a memory stream to buffer the response line and headers
+ NPT_MemoryStream buffer;
+
+ // emit the response line
+ NPT_CHECK_WARNING(response.Emit(buffer));
+
+ // send the buffer
+ NPT_CHECK_WARNING(m_Output->WriteFully(buffer.GetData(), buffer.GetDataSize()));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequestHandler Dynamic Cast Anchor
++---------------------------------------------------------------------*/
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(NPT_HttpRequestHandler)
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequestHandler::SendResponseBody
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpRequestHandler::SendResponseBody(const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& response,
+ NPT_OutputStream& output)
+{
+ NPT_HttpEntity* entity = response.GetEntity();
+ if (entity == NULL) return NPT_SUCCESS;
+
+ NPT_InputStreamReference body_stream;
+ entity->GetInputStream(body_stream);
+ if (body_stream.IsNull()) return NPT_SUCCESS;
+
+ // check for chunked transfer encoding
+ NPT_OutputStream* dest = &output;
+ if (entity->GetTransferEncoding() == NPT_HTTP_TRANSFER_ENCODING_CHUNKED) {
+ dest = new NPT_HttpChunkedOutputStream(output);
+ }
+
+ // send the body
+ NPT_LOG_FINE_1("sending body stream, %lld bytes", entity->GetContentLength());
+ NPT_LargeSize bytes_written = 0;
+ NPT_Result result = NPT_StreamToStreamCopy(*body_stream, *dest, 0, entity->GetContentLength(), &bytes_written);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE_3("body stream only partially sent, %lld bytes (%d:%s)",
+ bytes_written,
+ result,
+ NPT_ResultText(result));
+ }
+
+ // flush to write out any buffered data left in chunked output if used
+ dest->Flush();
+
+ // cleanup (this will send zero size chunk followed by CRLF)
+ if (dest != &output) delete dest;
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpStaticRequestHandler::NPT_HttpStaticRequestHandler
++---------------------------------------------------------------------*/
+NPT_HttpStaticRequestHandler::NPT_HttpStaticRequestHandler(const void* data,
+ NPT_Size size,
+ const char* mime_type,
+ bool copy) :
+ m_MimeType(mime_type),
+ m_Buffer(data, size, copy)
+{}
+
+/*----------------------------------------------------------------------
+| NPT_HttpStaticRequestHandler::NPT_HttpStaticRequestHandler
++---------------------------------------------------------------------*/
+NPT_HttpStaticRequestHandler::NPT_HttpStaticRequestHandler(const char* document,
+ const char* mime_type,
+ bool copy) :
+ m_MimeType(mime_type),
+ m_Buffer(document, NPT_StringLength(document), copy)
+{}
+
+/*----------------------------------------------------------------------
+| NPT_HttpStaticRequestHandler::SetupResponse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpStaticRequestHandler::SetupResponse(NPT_HttpRequest& /*request*/,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& response)
+{
+ NPT_HttpEntity* entity = response.GetEntity();
+ if (entity == NULL) return NPT_ERROR_INVALID_STATE;
+
+ entity->SetContentType(m_MimeType);
+ entity->SetInputStream(m_Buffer.GetData(), m_Buffer.GetDataSize());
+
+ return NPT_SUCCESS;
+}
+
+const NPT_HttpFileRequestHandler_DefaultFileTypeMapEntry
+NPT_HttpFileRequestHandler_DefaultFileTypeMap[] = {
+ {"xml", "text/xml; charset=\"utf-8\"" },
+ {"htm", "text/html" },
+ {"html", "text/html" },
+ {"c", "text/plain"},
+ {"h", "text/plain"},
+ {"txt", "text/plain"},
+ {"css", "text/css" },
+ {"manifest", "text/cache-manifest"},
+ {"gif", "image/gif" },
+ {"thm", "image/jpeg"},
+ {"png", "image/png"},
+ {"tif", "image/tiff"},
+ {"tiff", "image/tiff"},
+ {"jpg", "image/jpeg"},
+ {"jpeg", "image/jpeg"},
+ {"jpe", "image/jpeg"},
+ {"jp2", "image/jp2" },
+ {"png", "image/png" },
+ {"bmp", "image/bmp" },
+ {"aif", "audio/x-aiff"},
+ {"aifc", "audio/x-aiff"},
+ {"aiff", "audio/x-aiff"},
+ {"flac", "audio/x-flac"},
+ {"mka", "audio/x-matroska"},
+ {"mpa", "audio/mpeg"},
+ {"mp2", "audio/mpeg"},
+ {"mp3", "audio/mpeg"},
+ {"m4a", "audio/mp4"},
+ {"wma", "audio/x-ms-wma"},
+ {"wav", "audio/x-wav"},
+ {"mkv", "video/x-matroska"},
+ {"mpeg", "video/mpeg"},
+ {"mpg", "video/mpeg"},
+ {"mp4", "video/mp4"},
+ {"m4v", "video/mp4"},
+ {"ts", "video/MP2T"}, // RFC 3555
+ {"mpegts", "video/MP2T"},
+ {"mov", "video/quicktime"},
+ {"qt", "video/quicktime"},
+ {"wmv", "video/x-ms-wmv"},
+ {"wtv", "video/x-ms-wmv"},
+ {"asf", "video/x-ms-asf"},
+ {"mkv", "video/x-matroska"},
+ {"mk3d", "video/x-matroska-3d"},
+ {"flv", "video/x-flv"},
+ {"avi", "video/x-msvideo"},
+ {"divx", "video/x-msvideo"},
+ {"xvid", "video/x-msvideo"},
+ {"doc", "application/msword"},
+ {"js", "application/javascript"},
+ {"m3u8", "application/x-mpegURL"},
+ {"pdf", "application/pdf"},
+ {"ps", "application/postscript"},
+ {"eps", "application/postscript"},
+ {"zip", "application/zip"}
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpFileRequestHandler::NPT_HttpFileRequestHandler
++---------------------------------------------------------------------*/
+NPT_HttpFileRequestHandler::NPT_HttpFileRequestHandler(const char* url_root,
+ const char* file_root,
+ bool auto_dir,
+ const char* auto_index) :
+ m_UrlRoot(url_root),
+ m_FileRoot(file_root),
+ m_DefaultMimeType("text/html"),
+ m_UseDefaultFileTypeMap(true),
+ m_AutoDir(auto_dir),
+ m_AutoIndex(auto_index)
+{
+}
+
+/*----------------------------------------------------------------------
+| helper functions FIXME: need to move these to a separate module
++---------------------------------------------------------------------*/
+static NPT_UInt32
+_utf8_decode(const char** str)
+{
+ NPT_UInt32 result;
+ NPT_UInt32 min_value;
+ unsigned int bytes_left;
+
+ if (**str == 0) {
+ return ~0;
+ } else if ((**str & 0x80) == 0x00) {
+ result = *(*str)++;
+ bytes_left = 0;
+ min_value = 0;
+ } else if ((**str & 0xE0) == 0xC0) {
+ result = *(*str)++ & 0x1F;
+ bytes_left = 1;
+ min_value = 0x80;
+ } else if ((**str & 0xF0) == 0xE0) {
+ result = *(*str)++ & 0x0F;
+ bytes_left = 2;
+ min_value = 0x800;
+ } else if ((**str & 0xF8) == 0xF0) {
+ result = *(*str)++ & 0x07;
+ bytes_left = 3;
+ min_value = 0x10000;
+ } else {
+ return ~0;
+ }
+
+ while (bytes_left--) {
+ if (**str == 0 || (**str & 0xC0) != 0x80) return ~0;
+ result = (result << 6) | (*(*str)++ & 0x3F);
+ }
+
+ if (result < min_value || (result & 0xFFFFF800) == 0xD800 || result > 0x10FFFF) {
+ return ~0;
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HtmlEncode
++---------------------------------------------------------------------*/
+static NPT_String
+NPT_HtmlEncode(const char* str, const char* chars)
+{
+ NPT_String encoded;
+
+ // check args
+ if (str == NULL) return encoded;
+
+ // reserve at least the size of the current uri
+ encoded.Reserve(NPT_StringLength(str));
+
+ // process each character
+ while (*str) {
+ NPT_UInt32 c = _utf8_decode(&str);
+ bool encode = false;
+ if (c < ' ' || c > '~') {
+ encode = true;
+ } else {
+ const char* match = chars;
+ while (*match) {
+ if (c == (NPT_UInt32)*match) {
+ encode = true;
+ break;
+ }
+ ++match;
+ }
+ }
+ if (encode) {
+ // encode
+ char hex[9];
+ encoded += "&#x";
+ unsigned int len = 0;
+ if (c > 0xFFFF) {
+ NPT_ByteToHex((unsigned char)(c>>24), &hex[0], true);
+ NPT_ByteToHex((unsigned char)(c>>16), &hex[2], true);
+ len = 4;
+ }
+ NPT_ByteToHex((unsigned char)(c>>8), &hex[len ], true);
+ NPT_ByteToHex((unsigned char)(c ), &hex[len+2], true);
+ hex[len+4] = ';';
+ encoded.Append(hex, len+5);
+ } else {
+ // no encoding required
+ encoded += (char)c;
+ }
+ }
+
+ return encoded;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpFileRequestHandler::SetupResponse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpFileRequestHandler::SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& /* context */,
+ NPT_HttpResponse& response)
+{
+ NPT_HttpEntity* entity = response.GetEntity();
+ if (entity == NULL) return NPT_ERROR_INVALID_STATE;
+
+ // check the method
+ if (request.GetMethod() != NPT_HTTP_METHOD_GET &&
+ request.GetMethod() != NPT_HTTP_METHOD_HEAD) {
+ response.SetStatus(405, "Method Not Allowed");
+ return NPT_SUCCESS;
+ }
+
+ // set some default headers
+ response.GetHeaders().SetHeader(NPT_HTTP_HEADER_ACCEPT_RANGES, "bytes");
+
+ // declare HTTP/1.1 if the client asked for it
+ if (request.GetProtocol() == NPT_HTTP_PROTOCOL_1_1) {
+ response.SetProtocol(NPT_HTTP_PROTOCOL_1_1);
+ }
+
+ // TODO: we need to normalize the request path
+
+ // check that the request's path is an entry under the url root
+ if (!request.GetUrl().GetPath(true).StartsWith(m_UrlRoot)) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // compute the filename
+ NPT_String filename = m_FileRoot;
+ NPT_String relative_path = NPT_Url::PercentDecode(request.GetUrl().GetPath().GetChars()+m_UrlRoot.GetLength());
+ filename += "/";
+ filename += relative_path;
+ NPT_LOG_FINE_1("filename = %s", filename.GetChars());
+
+ // get info about the file
+ NPT_FileInfo info;
+ NPT_File::GetInfo(filename, &info);
+
+ // check if this is a directory
+ if (info.m_Type == NPT_FileInfo::FILE_TYPE_DIRECTORY) {
+ NPT_LOG_FINE("file is a DIRECTORY");
+ if (m_AutoDir) {
+ if (m_AutoIndex.GetLength()) {
+ NPT_LOG_FINE("redirecting to auto-index");
+ filename += NPT_FilePath::Separator;
+ filename += m_AutoIndex;
+ if (NPT_File::Exists(filename)) {
+ NPT_String location = m_UrlRoot+"/"+m_AutoIndex;
+ response.SetStatus(302, "Found");
+ response.GetHeaders().SetHeader(NPT_HTTP_HEADER_LOCATION, location);
+ } else {
+ return NPT_ERROR_PERMISSION_DENIED;
+ }
+ } else {
+ NPT_LOG_FINE("doing auto-dir");
+
+ // get the dir entries
+ NPT_List<NPT_String> entries;
+ NPT_File::ListDir(filename, entries);
+
+ NPT_String html;
+ html.Reserve(1024+128*entries.GetItemCount());
+
+ NPT_String html_dirname = NPT_HtmlEncode(relative_path, "<>&");
+ html += "<hmtl><head><title>Directory Listing for /";
+ html += html_dirname;
+ html += "</title></head><body>";
+ html += "<h2>Directory Listing for /";
+ html += html_dirname;
+ html += "</h2><hr><ul>\r\n";
+ NPT_String url_base_path = NPT_HtmlEncode(request.GetUrl().GetPath(), "<>&\"");
+
+ for (NPT_List<NPT_String>::Iterator i = entries.GetFirstItem();
+ i;
+ ++i) {
+ NPT_String url_filename = NPT_HtmlEncode(*i, "<>&");
+ html += "<li><a href=\"";
+ html += url_base_path;
+ if (!url_base_path.EndsWith("/")) html += "/";
+ html += url_filename;
+ html += "\">";
+ html +=url_filename;
+
+ NPT_String full_path = filename;
+ full_path += "/";
+ full_path += *i;
+ NPT_File::GetInfo(full_path, &info);
+ if (info.m_Type == NPT_FileInfo::FILE_TYPE_DIRECTORY) html += "/";
+
+ html += "</a><br>\r\n";
+ }
+ html += "</ul></body></html>";
+
+ entity->SetContentType("text/html");
+ entity->SetInputStream(html);
+ return NPT_SUCCESS;
+ }
+ } else {
+ return NPT_ERROR_PERMISSION_DENIED;
+ }
+ }
+
+ // open the file
+ NPT_File file(filename);
+ NPT_Result result = file.Open(NPT_FILE_OPEN_MODE_READ);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE("file not found");
+ return NPT_ERROR_NO_SUCH_ITEM;
+ }
+ NPT_InputStreamReference stream;
+ file.GetInputStream(stream);
+
+ // check for range requests
+ const NPT_String* range_spec = request.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_RANGE);
+
+ // setup entity body
+ NPT_CHECK(SetupResponseBody(response, stream, range_spec));
+
+ // set the response body
+ entity->SetContentType(GetContentType(filename));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpFileRequestHandler::SetupResponseBody
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpFileRequestHandler::SetupResponseBody(NPT_HttpResponse& response,
+ NPT_InputStreamReference& stream,
+ const NPT_String* range_spec /* = NULL */)
+{
+ NPT_HttpEntity* entity = response.GetEntity();
+ if (entity == NULL) return NPT_ERROR_INVALID_STATE;
+
+ if (range_spec) {
+ const NPT_String* accept_range = response.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_ACCEPT_RANGES);
+
+ if (response.GetEntity()->GetTransferEncoding() == NPT_HTTP_TRANSFER_ENCODING_CHUNKED ||
+ (accept_range && accept_range->Compare("bytes"))) {
+ NPT_LOG_FINE("range request not supported");
+ response.SetStatus(416, "Requested Range Not Satisfiable");
+ return NPT_SUCCESS;
+ }
+
+ // measure the stream size
+ bool has_stream_size = false;
+ NPT_LargeSize stream_size = 0;
+ NPT_Result result = stream->GetSize(stream_size);
+ if (NPT_SUCCEEDED(result)) {
+ has_stream_size = true;
+ NPT_LOG_FINE_1("body size=%lld", stream_size);
+ if (stream_size == 0) return NPT_SUCCESS;
+ }
+
+ if (!range_spec->StartsWith("bytes=")) {
+ NPT_LOG_FINE("unknown range spec");
+ response.SetStatus(400, "Bad Request");
+ return NPT_SUCCESS;
+ }
+ NPT_String valid_range;
+ NPT_String range(range_spec->GetChars()+6);
+ if (range.Find(',') >= 0) {
+ NPT_LOG_FINE("multi-range requests not supported");
+ if (has_stream_size) {
+ valid_range = "bytes */";
+ valid_range += NPT_String::FromInteger(stream_size);
+ response.GetHeaders().SetHeader(NPT_HTTP_HEADER_CONTENT_RANGE, valid_range.GetChars());
+ }
+ response.SetStatus(416, "Requested Range Not Satisfiable");
+ return NPT_SUCCESS;
+ }
+ int sep = range.Find('-');
+ NPT_UInt64 range_start = 0;
+ NPT_UInt64 range_end = 0;
+ bool has_start = false;
+ bool has_end = false;
+ bool satisfied = false;
+ if (sep < 0) {
+ NPT_LOG_FINE("invalid syntax");
+ response.SetStatus(400, "Bad Request");
+ return NPT_SUCCESS;
+ } else {
+ if ((unsigned int)sep+1 < range.GetLength()) {
+ result = NPT_ParseInteger64(range.GetChars()+sep+1, range_end);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE("failed to parse range end");
+ return result;
+ }
+ range.SetLength(sep);
+ has_end = true;
+ }
+ if (sep > 0) {
+ result = range.ToInteger64(range_start);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE("failed to parse range start");
+ return result;
+ }
+ has_start = true;
+ }
+
+ if (!has_stream_size) {
+ if (has_start && range_start == 0 && !has_end) {
+ bool update_content_length = (entity->GetTransferEncoding() != NPT_HTTP_TRANSFER_ENCODING_CHUNKED);
+ // use the whole file stream as a body
+ return entity->SetInputStream(stream, update_content_length);
+ } else {
+ NPT_LOG_WARNING_2("file.GetSize() failed (%d:%s)", result, NPT_ResultText(result));
+ NPT_LOG_FINE("range request not supported");
+ response.SetStatus(416, "Requested Range Not Satisfiable");
+ return NPT_SUCCESS;
+ }
+ }
+
+ if (has_start) {
+ // some clients sends incorrect range_end equal to size
+ // we try to handle it
+ if (!has_end || range_end == stream_size) range_end = stream_size-1;
+ } else {
+ if (has_end) {
+ if (range_end <= stream_size) {
+ range_start = stream_size-range_end;
+ range_end = stream_size-1;
+ }
+ }
+ }
+ NPT_LOG_FINE_2("final range: start=%lld, end=%lld", range_start, range_end);
+ if (range_start > range_end) {
+ NPT_LOG_FINE("invalid range");
+ response.SetStatus(400, "Bad Request");
+ satisfied = false;
+ } else if (range_end >= stream_size) {
+ response.SetStatus(416, "Requested Range Not Satisfiable");
+ NPT_LOG_FINE("out of range");
+ satisfied = false;
+ } else {
+ satisfied = true;
+ }
+ }
+ if (satisfied && range_start != 0) {
+ // seek in the stream
+ result = stream->Seek(range_start);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_2("stream.Seek() failed (%d:%s)", result, NPT_ResultText(result));
+ satisfied = false;
+ }
+ }
+ if (!satisfied) {
+ if (!valid_range.IsEmpty()) response.GetHeaders().SetHeader(NPT_HTTP_HEADER_CONTENT_RANGE, valid_range.GetChars());
+ response.SetStatus(416, "Requested Range Not Satisfiable");
+ return NPT_SUCCESS;
+ }
+
+ // use a portion of the file stream as a body
+ entity->SetInputStream(stream, false);
+ entity->SetContentLength(range_end-range_start+1);
+ response.SetStatus(206, "Partial Content");
+ valid_range = "bytes ";
+ valid_range += NPT_String::FromInteger(range_start);
+ valid_range += "-";
+ valid_range += NPT_String::FromInteger(range_end);
+ valid_range += "/";
+ valid_range += NPT_String::FromInteger(stream_size);
+ response.GetHeaders().SetHeader(NPT_HTTP_HEADER_CONTENT_RANGE, valid_range.GetChars());
+ } else {
+ bool update_content_length = (entity->GetTransferEncoding() != NPT_HTTP_TRANSFER_ENCODING_CHUNKED);
+ // use the whole file stream as a body
+ entity->SetInputStream(stream, update_content_length);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpFileRequestHandler::GetContentType
++---------------------------------------------------------------------*/
+const char*
+NPT_HttpFileRequestHandler::GetDefaultContentType(const char* extension)
+{
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(NPT_HttpFileRequestHandler_DefaultFileTypeMap); i++) {
+ if (NPT_String::Compare(extension, NPT_HttpFileRequestHandler_DefaultFileTypeMap[i].extension, true) == 0) {
+ const char* type = NPT_HttpFileRequestHandler_DefaultFileTypeMap[i].mime_type;
+ NPT_LOG_FINE_1("using type from default list: %s", type);
+ return type;
+ }
+ }
+
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpFileRequestHandler::GetContentType
++---------------------------------------------------------------------*/
+const char*
+NPT_HttpFileRequestHandler::GetContentType(const NPT_String& filename)
+{
+ int last_dot = filename.ReverseFind('.');
+ if (last_dot > 0) {
+ NPT_String extension = filename.GetChars()+last_dot+1;
+ extension.MakeLowercase();
+
+ NPT_LOG_FINE_1("extension=%s", extension.GetChars());
+
+ NPT_String* mime_type;
+ if (NPT_SUCCEEDED(m_FileTypeMap.Get(extension, mime_type))) {
+ NPT_LOG_FINE_1("found mime type in map: %s", mime_type->GetChars());
+ return mime_type->GetChars();
+ }
+
+ // not found, look in the default map if necessary
+ if (m_UseDefaultFileTypeMap) {
+ const char* type = NPT_HttpFileRequestHandler::GetDefaultContentType(extension);
+ if (type) return type;
+ }
+ }
+
+ NPT_LOG_FINE("using default mime type");
+ return m_DefaultMimeType;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedInputStream::NPT_HttpChunkedInputStream
++---------------------------------------------------------------------*/
+NPT_HttpChunkedInputStream::NPT_HttpChunkedInputStream(
+ NPT_BufferedInputStreamReference& stream) :
+ m_Source(stream),
+ m_CurrentChunkSize(0),
+ m_Eos(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedInputStream::~NPT_HttpChunkedInputStream
++---------------------------------------------------------------------*/
+NPT_HttpChunkedInputStream::~NPT_HttpChunkedInputStream()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedInputStream::NPT_HttpChunkedInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpChunkedInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read /* = NULL */)
+{
+ // set the initial state of return values
+ if (bytes_read) *bytes_read = 0;
+
+ // check for end of stream
+ if (m_Eos) return NPT_ERROR_EOS;
+
+ // shortcut
+ if (bytes_to_read == 0) return NPT_SUCCESS;
+
+ // read next chunk size if needed
+ if (m_CurrentChunkSize == 0) {
+ // buffered mode
+ m_Source->SetBufferSize(4096);
+
+ NPT_String size_line;
+ NPT_CHECK_FINE(m_Source->ReadLine(size_line));
+
+ // decode size (in hex)
+ m_CurrentChunkSize = 0;
+ if (size_line.GetLength() < 1) {
+ NPT_LOG_WARNING("empty chunk size line");
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+ const char* size_hex = size_line.GetChars();
+ while (*size_hex != '\0' &&
+ *size_hex != ' ' &&
+ *size_hex != ';' &&
+ *size_hex != '\r' &&
+ *size_hex != '\n') {
+ int nibble = NPT_HexToNibble(*size_hex);
+ if (nibble < 0) {
+ NPT_LOG_WARNING_1("invalid chunk size format (%s)", size_line.GetChars());
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+ m_CurrentChunkSize = (m_CurrentChunkSize<<4)|nibble;
+ ++size_hex;
+ }
+ NPT_LOG_FINEST_1("start of chunk, size=%d", m_CurrentChunkSize);
+
+ // 0 = end of body
+ if (m_CurrentChunkSize == 0) {
+ NPT_LOG_FINEST("end of chunked stream, reading trailers");
+
+ // read footers until empty line
+ NPT_String footer;
+ do {
+ NPT_CHECK_FINE(m_Source->ReadLine(footer));
+ } while (!footer.IsEmpty());
+ m_Eos = true;
+
+ NPT_LOG_FINEST("end of chunked stream, done");
+ return NPT_ERROR_EOS;
+ }
+
+ // unbuffer source
+ m_Source->SetBufferSize(0);
+ }
+
+ // read no more than what's left in chunk
+ NPT_Size chunk_bytes_read;
+ if (bytes_to_read > m_CurrentChunkSize) bytes_to_read = m_CurrentChunkSize;
+ NPT_CHECK_FINE(m_Source->Read(buffer, bytes_to_read, &chunk_bytes_read));
+
+ // ready to go to next chunk?
+ m_CurrentChunkSize -= chunk_bytes_read;
+ if (m_CurrentChunkSize == 0) {
+ NPT_LOG_FINEST("reading end of chunk");
+
+ // when a chunk is finished, a \r\n follows
+ char newline[2];
+ NPT_CHECK_FINE(m_Source->ReadFully(newline, 2));
+ if (newline[0] != '\r' || newline[1] != '\n') {
+ NPT_LOG_WARNING("invalid end of chunk (expected \\r\\n)");
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+ }
+
+ // update output params
+ if (bytes_read) *bytes_read = chunk_bytes_read;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedInputStream::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpChunkedInputStream::Seek(NPT_Position /*offset*/)
+{
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedInputStream::Tell
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpChunkedInputStream::Tell(NPT_Position& offset)
+{
+ offset = 0;
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedInputStream::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpChunkedInputStream::GetSize(NPT_LargeSize& size)
+{
+ return m_Source->GetSize(size);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpChunkedInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ return m_Source->GetAvailable(available);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedOutputStream::NPT_HttpChunkedOutputStream
++---------------------------------------------------------------------*/
+NPT_HttpChunkedOutputStream::NPT_HttpChunkedOutputStream(NPT_OutputStream& stream) :
+ m_Stream(stream)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedOutputStream::~NPT_HttpChunkedOutputStream
++---------------------------------------------------------------------*/
+NPT_HttpChunkedOutputStream::~NPT_HttpChunkedOutputStream()
+{
+ // zero size chunk followed by CRLF (no trailer)
+ m_Stream.WriteFully("0" NPT_HTTP_LINE_TERMINATOR NPT_HTTP_LINE_TERMINATOR, 5);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedOutputStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpChunkedOutputStream::Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written)
+{
+ // default values
+ if (bytes_written) *bytes_written = 0;
+
+ // shortcut
+ if (bytes_to_write == 0) return NPT_SUCCESS;
+
+ // write the chunk header
+ char size[16];
+ size[15] = '\n';
+ size[14] = '\r';
+ char* c = &size[14];
+ unsigned int char_count = 2;
+ unsigned int value = bytes_to_write;
+ do {
+ unsigned int digit = (unsigned int)(value%16);
+ if (digit < 10) {
+ *--c = '0'+digit;
+ } else {
+ *--c = 'A'+digit-10;
+ }
+ char_count++;
+ value /= 16;
+ } while(value);
+ NPT_Result result = m_Stream.WriteFully(c, char_count);
+ if (NPT_FAILED(result)) return result;
+
+ // write the chunk data
+ result = m_Stream.WriteFully(buffer, bytes_to_write);
+ if (NPT_FAILED(result)) return result;
+
+ // finish the chunk
+ result = m_Stream.WriteFully(NPT_HTTP_LINE_TERMINATOR, 2);
+ if (NPT_SUCCEEDED(result) && bytes_written) {
+ *bytes_written = bytes_to_write;
+ }
+ return result;
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptHttp.h b/lib/libUPnP/Neptune/Source/Core/NptHttp.h
new file mode 100644
index 0000000..3d2a0d2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptHttp.h
@@ -0,0 +1,866 @@
+/*****************************************************************
+|
+| Neptune - HTTP Protocol
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_HTTP_H_
+#define _NPT_HTTP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptUri.h"
+#include "NptTypes.h"
+#include "NptList.h"
+#include "NptBufferedStreams.h"
+#include "NptSockets.h"
+#include "NptMap.h"
+#include "NptDynamicCast.h"
+#include "NptVersion.h"
+#include "NptTime.h"
+#include "NptThreads.h"
+#include "NptAutomaticCleaner.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const unsigned int NPT_HTTP_DEFAULT_PORT = 80;
+const unsigned int NPT_HTTPS_DEFAULT_PORT = 443;
+const unsigned int NPT_HTTP_INVALID_PORT = 0;
+
+const NPT_Timeout NPT_HTTP_CLIENT_DEFAULT_CONNECTION_TIMEOUT = 30000;
+const NPT_Timeout NPT_HTTP_CLIENT_DEFAULT_IO_TIMEOUT = 30000;
+const NPT_Timeout NPT_HTTP_CLIENT_DEFAULT_NAME_RESOLVER_TIMEOUT = 60000;
+const unsigned int NPT_HTTP_CLIENT_DEFAULT_MAX_REDIRECTS = 20;
+
+const NPT_Timeout NPT_HTTP_SERVER_DEFAULT_CONNECTION_TIMEOUT = NPT_TIMEOUT_INFINITE;
+const NPT_Timeout NPT_HTTP_SERVER_DEFAULT_IO_TIMEOUT = 60000;
+
+const unsigned int NPT_HTTP_CONNECTION_MANAGER_MAX_CONNECTION_POOL_SIZE = 5;
+const unsigned int NPT_HTTP_CONNECTION_MANAGER_MAX_CONNECTION_AGE = 30; // seconds
+const unsigned int NPT_HTTP_MAX_RECONNECTS = 10;
+const unsigned int NPT_HTTP_MAX_100_RESPONSES = 10;
+
+const int NPT_HTTP_PROTOCOL_MAX_LINE_LENGTH = 8192;
+const int NPT_HTTP_PROTOCOL_MAX_HEADER_COUNT = 100;
+
+#define NPT_HTTP_PROTOCOL_1_0 "HTTP/1.0"
+#define NPT_HTTP_PROTOCOL_1_1 "HTTP/1.1"
+#define NPT_HTTP_METHOD_GET "GET"
+#define NPT_HTTP_METHOD_HEAD "HEAD"
+#define NPT_HTTP_METHOD_POST "POST"
+#define NPT_HTTP_METHOD_PUT "PUT"
+#define NPT_HTTP_METHOD_OPTIONS "OPTIONS"
+#define NPT_HTTP_METHOD_DELETE "DELETE"
+#define NPT_HTTP_METHOD_TRACE "TRACE"
+
+#define NPT_HTTP_HEADER_HOST "Host"
+#define NPT_HTTP_HEADER_CONNECTION "Connection"
+#define NPT_HTTP_HEADER_USER_AGENT "User-Agent"
+#define NPT_HTTP_HEADER_SERVER "Server"
+#define NPT_HTTP_HEADER_CONTENT_LENGTH "Content-Length"
+#define NPT_HTTP_HEADER_CONTENT_TYPE "Content-Type"
+#define NPT_HTTP_HEADER_CONTENT_ENCODING "Content-Encoding"
+#define NPT_HTTP_HEADER_TRANSFER_ENCODING "Transfer-Encoding"
+#define NPT_HTTP_HEADER_LOCATION "Location"
+#define NPT_HTTP_HEADER_RANGE "Range"
+#define NPT_HTTP_HEADER_CONTENT_RANGE "Content-Range"
+#define NPT_HTTP_HEADER_COOKIE "Cookie"
+#define NPT_HTTP_HEADER_ACCEPT_RANGES "Accept-Ranges"
+#define NPT_HTTP_HEADER_CONTENT_RANGE "Content-Range"
+#define NPT_HTTP_HEADER_AUTHORIZATION "Authorization"
+
+#define NPT_HTTP_TRANSFER_ENCODING_CHUNKED "chunked"
+
+
+const int NPT_ERROR_HTTP_INVALID_RESPONSE_LINE = NPT_ERROR_BASE_HTTP - 0;
+const int NPT_ERROR_HTTP_INVALID_REQUEST_LINE = NPT_ERROR_BASE_HTTP - 1;
+const int NPT_ERROR_HTTP_NO_PROXY = NPT_ERROR_BASE_HTTP - 2;
+const int NPT_ERROR_HTTP_INVALID_REQUEST = NPT_ERROR_BASE_HTTP - 3;
+const int NPT_ERROR_HTTP_METHOD_NOT_SUPPORTED = NPT_ERROR_BASE_HTTP - 4;
+const int NPT_ERROR_HTTP_TOO_MANY_REDIRECTS = NPT_ERROR_BASE_HTTP - 5;
+const int NPT_ERROR_HTTP_TOO_MANY_RECONNECTS = NPT_ERROR_BASE_HTTP - 6;
+const int NPT_ERROR_HTTP_CANNOT_RESEND_BODY = NPT_ERROR_BASE_HTTP - 7;
+
+#define NPT_HTTP_LINE_TERMINATOR "\r\n"
+
+#if !defined(NPT_CONFIG_HTTP_DEFAULT_USER_AGENT)
+#define NPT_CONFIG_HTTP_DEFAULT_USER_AGENT "Neptune/" NPT_NEPTUNE_VERSION_STRING
+#endif
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef unsigned int NPT_HttpStatusCode;
+typedef NPT_UrlQuery NPT_HttpUrlQuery; // for backward compatibility
+
+/*----------------------------------------------------------------------
+| NPT_HttpUrl
++---------------------------------------------------------------------*/
+class NPT_HttpUrl : public NPT_Url {
+public:
+ // constructors
+ NPT_HttpUrl() {}
+ NPT_HttpUrl(const char* host,
+ NPT_UInt16 port,
+ const char* path,
+ const char* query = NULL,
+ const char* fragment = NULL);
+ NPT_HttpUrl(const char* url, bool ignore_scheme = false);
+
+ // methods
+ NPT_String ToString(bool with_fragment = true) const override;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpProtocol
++---------------------------------------------------------------------*/
+class NPT_HttpProtocol
+{
+public:
+ // class methods
+ const char* GetStatusCodeString(NPT_HttpStatusCode status_code);
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeader
++---------------------------------------------------------------------*/
+class NPT_HttpHeader {
+public:
+ // constructors and destructor
+ NPT_HttpHeader(const char* name, const char* value);
+ ~NPT_HttpHeader();
+
+ // methods
+ NPT_Result Emit(NPT_OutputStream& stream) const;
+ const NPT_String& GetName() const { return m_Name; }
+ const NPT_String& GetValue() const { return m_Value; }
+ NPT_Result SetName(const char* name);
+ NPT_Result SetValue(const char* value);
+
+private:
+ // members
+ NPT_String m_Name;
+ NPT_String m_Value;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaders
++---------------------------------------------------------------------*/
+class NPT_HttpHeaders {
+public:
+ // constructors and destructor
+ NPT_HttpHeaders();
+ ~NPT_HttpHeaders();
+
+ // methods
+ NPT_Result Parse(NPT_BufferedInputStream& stream);
+ NPT_Result Emit(NPT_OutputStream& stream) const;
+ const NPT_List<NPT_HttpHeader*>& GetHeaders() const { return m_Headers; }
+ NPT_HttpHeader* GetHeader(const char* name) const;
+ const NPT_String* GetHeaderValue(const char* name) const;
+ NPT_Result SetHeader(const char* name, const char* value, bool replace=true);
+ NPT_Result AddHeader(const char* name, const char* value);
+ NPT_Result RemoveHeader(const char* name);
+
+private:
+ // members
+ NPT_List<NPT_HttpHeader*> m_Headers;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpEntity
++---------------------------------------------------------------------*/
+class NPT_HttpEntity {
+public:
+ // constructors and destructor
+ NPT_HttpEntity();
+ NPT_HttpEntity(const NPT_HttpHeaders& headers);
+ virtual ~NPT_HttpEntity();
+
+ // methods
+ NPT_Result SetInputStream(const NPT_InputStreamReference& stream,
+ bool update_content_length = false);
+ NPT_Result SetInputStream(const void* data, NPT_Size size);
+ NPT_Result SetInputStream(const NPT_String& string);
+ NPT_Result SetInputStream(const char* string);
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ NPT_Result Load(NPT_DataBuffer& buffer);
+ NPT_Result SetHeaders(const NPT_HttpHeaders& headers);
+
+ // field access
+ NPT_Result SetContentLength(NPT_LargeSize length);
+ NPT_Result SetContentType(const char* type);
+ NPT_Result SetContentEncoding(const char* encoding);
+ NPT_Result SetTransferEncoding(const char* encoding);
+ NPT_LargeSize GetContentLength() { return m_ContentLength; }
+ const NPT_String& GetContentType() { return m_ContentType; }
+ const NPT_String& GetContentEncoding() { return m_ContentEncoding; }
+ const NPT_String& GetTransferEncoding() { return m_TransferEncoding;}
+ bool ContentLengthIsKnown() { return m_ContentLengthIsKnown; }
+
+private:
+ // members
+ NPT_InputStreamReference m_InputStream;
+ NPT_LargeSize m_ContentLength;
+ NPT_String m_ContentType;
+ NPT_String m_ContentEncoding;
+ NPT_String m_TransferEncoding;
+ bool m_ContentLengthIsKnown;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpMessage
++---------------------------------------------------------------------*/
+class NPT_HttpMessage {
+public:
+ // constructors and destructor
+ virtual ~NPT_HttpMessage();
+
+ // methods
+ const NPT_String& GetProtocol() const {
+ return m_Protocol;
+ }
+ NPT_Result SetProtocol(const char* protocol) {
+ m_Protocol = protocol;
+ return NPT_SUCCESS;
+ }
+ NPT_HttpHeaders& GetHeaders() {
+ return m_Headers;
+ }
+ const NPT_HttpHeaders& GetHeaders() const {
+ return m_Headers;
+ }
+ NPT_Result SetEntity(NPT_HttpEntity* entity);
+ NPT_HttpEntity* GetEntity() {
+ return m_Entity;
+ }
+ NPT_HttpEntity* GetEntity() const {
+ return m_Entity;
+ }
+ virtual NPT_Result ParseHeaders(NPT_BufferedInputStream& stream);
+
+protected:
+ // constructors
+ NPT_HttpMessage(const char* protocol);
+
+ // members
+ NPT_String m_Protocol;
+ NPT_HttpHeaders m_Headers;
+ NPT_HttpEntity* m_Entity;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequest
++---------------------------------------------------------------------*/
+class NPT_HttpRequest : public NPT_HttpMessage {
+public:
+ // class methods
+ static NPT_Result Parse(NPT_BufferedInputStream& stream,
+ const NPT_SocketAddress* endpoint,
+ NPT_HttpRequest*& request);
+
+ // constructors and destructor
+ NPT_HttpRequest(const NPT_HttpUrl& url,
+ const char* method,
+ const char* protocol = NPT_HTTP_PROTOCOL_1_0);
+ NPT_HttpRequest(const char* url,
+ const char* method,
+ const char* protocol = NPT_HTTP_PROTOCOL_1_0);
+ ~NPT_HttpRequest() override;
+
+ // methods
+ const NPT_HttpUrl& GetUrl() const { return m_Url; }
+ NPT_HttpUrl& GetUrl() { return m_Url; }
+ NPT_Result SetUrl(const char* url);
+ NPT_Result SetUrl(const NPT_HttpUrl& url);
+ const NPT_String& GetMethod() const { return m_Method; }
+ virtual NPT_Result Emit(NPT_OutputStream& stream, bool use_proxy=false) const;
+
+protected:
+ // members
+ NPT_HttpUrl m_Url;
+ NPT_String m_Method;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponse
++---------------------------------------------------------------------*/
+class NPT_HttpResponse : public NPT_HttpMessage {
+public:
+ // class methods
+ static NPT_Result Parse(NPT_BufferedInputStream& stream,
+ NPT_HttpResponse*& response);
+
+ // constructors and destructor
+ NPT_HttpResponse(NPT_HttpStatusCode status_code,
+ const char* reason_phrase,
+ const char* protocol = NPT_HTTP_PROTOCOL_1_0);
+ ~NPT_HttpResponse() override;
+
+ // methods
+ NPT_Result SetStatus(NPT_HttpStatusCode status_code,
+ const char* reason_phrase,
+ const char* protocol = NULL);
+ NPT_Result SetProtocol(const char* protocol);
+ NPT_HttpStatusCode GetStatusCode() const { return m_StatusCode; }
+ const NPT_String& GetReasonPhrase() const { return m_ReasonPhrase; }
+ virtual NPT_Result Emit(NPT_OutputStream& stream) const;
+
+protected:
+ // members
+ NPT_HttpStatusCode m_StatusCode;
+ NPT_String m_ReasonPhrase;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpProxyAddress
++---------------------------------------------------------------------*/
+class NPT_HttpProxyAddress
+{
+public:
+ NPT_HttpProxyAddress() : m_Port(NPT_HTTP_INVALID_PORT) {}
+ NPT_HttpProxyAddress(const char* hostname, NPT_UInt16 port) :
+ m_HostName(hostname), m_Port(port) {}
+
+ const NPT_String& GetHostName() const { return m_HostName; }
+ void SetHostName(const char* hostname) { m_HostName = hostname; }
+ NPT_UInt16 GetPort() const { return m_Port; }
+ void SetPort(NPT_UInt16 port) { m_Port = port; }
+
+private:
+ NPT_String m_HostName;
+ NPT_UInt16 m_Port;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpProxySelector
++---------------------------------------------------------------------*/
+class NPT_HttpProxySelector
+{
+public:
+ // class methods
+ static NPT_HttpProxySelector* GetDefault();
+ static NPT_HttpProxySelector* GetSystemSelector();
+
+ // methods
+ virtual ~NPT_HttpProxySelector() {};
+ virtual NPT_Result GetProxyForUrl(const NPT_HttpUrl& url, NPT_HttpProxyAddress& proxy) = 0;
+
+private:
+ // class members
+ static NPT_HttpProxySelector* m_SystemDefault;
+};
+
+class NPT_HttpRequestContext;
+
+/*----------------------------------------------------------------------
+| NPT_HttpClient
++---------------------------------------------------------------------*/
+class NPT_HttpClient {
+public:
+ // types
+ struct Config {
+ Config() : m_ConnectionTimeout( NPT_HTTP_CLIENT_DEFAULT_CONNECTION_TIMEOUT),
+ m_IoTimeout( NPT_HTTP_CLIENT_DEFAULT_CONNECTION_TIMEOUT),
+ m_NameResolverTimeout(NPT_HTTP_CLIENT_DEFAULT_NAME_RESOLVER_TIMEOUT),
+ m_MaxRedirects( NPT_HTTP_CLIENT_DEFAULT_MAX_REDIRECTS),
+ m_UserAgent( NPT_CONFIG_HTTP_DEFAULT_USER_AGENT) {}
+ NPT_Timeout m_ConnectionTimeout;
+ NPT_Timeout m_IoTimeout;
+ NPT_Timeout m_NameResolverTimeout;
+ NPT_Cardinal m_MaxRedirects;
+ NPT_String m_UserAgent;
+ };
+
+ class Connection {
+ public:
+ virtual ~Connection() {}
+ virtual NPT_InputStreamReference& GetInputStream() = 0;
+ virtual NPT_OutputStreamReference& GetOutputStream() = 0;
+ virtual NPT_Result GetInfo(NPT_SocketInfo& info) = 0;
+ virtual bool SupportsPersistence() { return false; }
+ virtual bool IsRecycled() { return false; }
+ virtual NPT_Result Recycle() { delete this; return NPT_SUCCESS; }
+ virtual NPT_Result Abort() { return NPT_ERROR_NOT_IMPLEMENTED; }
+ };
+
+ class Connector {
+ public:
+ virtual ~Connector() {}
+
+ virtual NPT_Result Connect(const NPT_HttpUrl& url,
+ NPT_HttpClient& client,
+ const NPT_HttpProxyAddress* proxy,
+ bool reuse, // whether we can reuse a connection or not
+ Connection*& connection) = 0;
+
+ protected:
+ NPT_Result TrackConnection(NPT_HttpClient& client,
+ Connection* connection) { return client.TrackConnection(connection); }
+ Connector() {} // don't instantiate directly
+ };
+
+ // class methods
+ static NPT_Result WriteRequest(NPT_OutputStream& output_stream,
+ NPT_HttpRequest& request,
+ bool should_persist,
+ bool use_proxy = false);
+ static NPT_Result ReadResponse(NPT_InputStreamReference& input_stream,
+ bool should_persist,
+ bool expect_entity,
+ NPT_HttpResponse*& response,
+ NPT_Reference<Connection>* cref = NULL);
+
+ /**
+ * @param connector Pointer to a connector instance, or NULL to use
+ * the default (TCP) connector.
+ * @param transfer_ownership Boolean flag. If true, the NPT_HttpClient object
+ * becomes the owner of the passed Connector and will delete it when it is
+ * itself deleted. If false, the caller keeps the ownership of the connector.
+ * This flag is ignored if the connector parameter is NULL.
+ */
+ NPT_HttpClient(Connector* connector = NULL, bool transfer_ownership = true);
+
+ virtual ~NPT_HttpClient();
+
+ // methods
+ NPT_Result SendRequest(NPT_HttpRequest& request,
+ NPT_HttpResponse*& response,
+ NPT_HttpRequestContext* context = NULL);
+ NPT_Result Abort();
+ const Config& GetConfig() const { return m_Config; }
+ NPT_Result SetConfig(const Config& config);
+ NPT_Result SetProxy(const char* http_proxy_hostname,
+ NPT_UInt16 http_proxy_port,
+ const char* https_proxy_hostname = NULL,
+ NPT_UInt16 https_proxy_port = 0);
+ NPT_Result SetProxySelector(NPT_HttpProxySelector* selector);
+ NPT_Result SetConnector(Connector* connector);
+ NPT_Result SetTimeouts(NPT_Timeout connection_timeout,
+ NPT_Timeout io_timeout,
+ NPT_Timeout name_resolver_timeout);
+ NPT_Result SetUserAgent(const char* user_agent);
+ NPT_Result SetOptions(NPT_Flags options, bool on);
+
+protected:
+ // methods
+ NPT_Result TrackConnection(Connection* connection);
+ NPT_Result SendRequestOnce(NPT_HttpRequest& request,
+ NPT_HttpResponse*& response,
+ NPT_HttpRequestContext* context = NULL);
+
+ // members
+ Config m_Config;
+ NPT_HttpProxySelector* m_ProxySelector;
+ bool m_ProxySelectorIsOwned;
+ Connector* m_Connector;
+ bool m_ConnectorIsOwned;
+ NPT_Mutex m_AbortLock;
+ bool m_Aborted;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpConnectionManager
++---------------------------------------------------------------------*/
+class NPT_HttpConnectionManager : public NPT_Thread,
+ public NPT_AutomaticCleaner::Singleton
+{
+public:
+ // singleton management
+ static NPT_HttpConnectionManager* GetInstance();
+
+ class Connection : public NPT_HttpClient::Connection
+ {
+ public:
+ Connection(NPT_HttpConnectionManager& manager,
+ NPT_SocketReference& socket,
+ NPT_InputStreamReference input_stream,
+ NPT_OutputStreamReference output_stream);
+ ~Connection() override;
+
+ // NPT_HttpClient::Connection methods
+ NPT_InputStreamReference& GetInputStream() override { return m_InputStream; }
+ NPT_OutputStreamReference& GetOutputStream() override { return m_OutputStream; }
+ NPT_Result GetInfo(NPT_SocketInfo& info) override { return m_Socket->GetInfo(info); }
+ bool SupportsPersistence() override { return true; }
+ bool IsRecycled() override { return m_IsRecycled; }
+ NPT_Result Recycle() override;
+ NPT_Result Abort() override { return m_Socket->Cancel(); }
+
+ // members
+ NPT_HttpConnectionManager& m_Manager;
+ bool m_IsRecycled;
+ NPT_TimeStamp m_TimeStamp;
+ NPT_SocketReference m_Socket;
+ NPT_InputStreamReference m_InputStream;
+ NPT_OutputStreamReference m_OutputStream;
+ };
+
+ // destructor
+ ~NPT_HttpConnectionManager() override;
+
+ // methods
+ Connection* FindConnection(NPT_SocketAddress& address);
+ NPT_Result Recycle(Connection* connection);
+ NPT_Result Track(NPT_HttpClient* client, NPT_HttpClient::Connection* connection);
+ NPT_Result AbortConnections(NPT_HttpClient* client);
+
+ // class methods
+ static NPT_Result Untrack(NPT_HttpClient::Connection* connection);
+
+private:
+ typedef NPT_List<NPT_HttpClient::Connection*> ConnectionList;
+
+ // class members
+ static NPT_HttpConnectionManager* Instance;
+
+ // constructor
+ NPT_HttpConnectionManager();
+
+ // NPT_Thread methods
+ void Run() override;
+
+ // methods
+ NPT_Result UntrackConnection(NPT_HttpClient::Connection* connection);
+ NPT_Result Cleanup();
+
+ // members
+ NPT_Mutex m_Lock;
+ NPT_Cardinal m_MaxConnections;
+ NPT_Cardinal m_MaxConnectionAge;
+ NPT_SharedVariable m_Aborted;
+ NPT_List<Connection*> m_Connections;
+ NPT_Map<NPT_HttpClient*, ConnectionList> m_ClientConnections;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequestContext
++---------------------------------------------------------------------*/
+class NPT_HttpRequestContext
+{
+public:
+ // constructor
+ NPT_HttpRequestContext() {}
+ NPT_HttpRequestContext(const NPT_SocketAddress* local_address,
+ const NPT_SocketAddress* remote_address);
+
+ // methods
+ const NPT_SocketAddress& GetLocalAddress() const { return m_LocalAddress; }
+ const NPT_SocketAddress& GetRemoteAddress() const { return m_RemoteAddress; }
+ void SetLocalAddress(const NPT_SocketAddress& address) {
+ m_LocalAddress = address;
+ }
+ void SetRemoteAddress(const NPT_SocketAddress& address) {
+ m_RemoteAddress = address;
+ }
+
+private:
+ // members
+ NPT_SocketAddress m_LocalAddress;
+ NPT_SocketAddress m_RemoteAddress;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpRequestHandler
++---------------------------------------------------------------------*/
+class NPT_HttpRequestHandler
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST(NPT_HttpRequestHandler)
+
+ // destructor
+ virtual ~NPT_HttpRequestHandler() {}
+
+ // methods
+ virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) = 0;
+
+ /**
+ * Override this method if you want to write the body yourself.
+ * The default implementation will simply write out the entity's
+ * input stream.
+ */
+ virtual NPT_Result SendResponseBody(const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ NPT_OutputStream& output);
+
+ /**
+ * A notification method called by the server upon completing the
+ * processing of a request.
+ */
+ virtual void Completed(NPT_Result /*result*/) {}
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpStaticRequestHandler
++---------------------------------------------------------------------*/
+class NPT_HttpStaticRequestHandler : public NPT_HttpRequestHandler
+{
+public:
+ // constructors
+ NPT_HttpStaticRequestHandler(const char* document,
+ const char* mime_type = "text/html",
+ bool copy = true);
+ NPT_HttpStaticRequestHandler(const void* data,
+ NPT_Size size,
+ const char* mime_type = "text/html",
+ bool copy = true);
+
+ // NPT_HttpRequestHandler methods
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+private:
+ NPT_String m_MimeType;
+ NPT_DataBuffer m_Buffer;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpFileRequestHandler_DefaultFileTypeMapEntry
++---------------------------------------------------------------------*/
+typedef struct NPT_HttpFileRequestHandler_DefaultFileTypeMapEntry {
+ const char* extension;
+ const char* mime_type;
+} NPT_HttpFileRequestHandler_FileTypeMapEntry;
+
+/*----------------------------------------------------------------------
+| NPT_HttpFileRequestHandler
++---------------------------------------------------------------------*/
+class NPT_HttpFileRequestHandler : public NPT_HttpRequestHandler
+{
+public:
+ // constructors
+ NPT_HttpFileRequestHandler(const char* url_root,
+ const char* file_root,
+ bool auto_dir = false,
+ const char* auto_index = NULL);
+
+ // NPT_HttpRequestHandler methods
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+ // class methods
+ static const char* GetDefaultContentType(const char* extension);
+
+ // accessors
+ NPT_Map<NPT_String,NPT_String>& GetFileTypeMap() { return m_FileTypeMap; }
+ void SetDefaultMimeType(const char* mime_type) {
+ m_DefaultMimeType = mime_type;
+ }
+ void SetUseDefaultFileTypeMap(bool use_default) {
+ m_UseDefaultFileTypeMap = use_default;
+ }
+
+ static NPT_Result SetupResponseBody(NPT_HttpResponse& response,
+ NPT_InputStreamReference& stream,
+ const NPT_String* range_spec = NULL);
+
+protected:
+ // methods
+ const char* GetContentType(const NPT_String& filename);
+
+private:
+ NPT_String m_UrlRoot;
+ NPT_String m_FileRoot;
+ NPT_Map<NPT_String, NPT_String> m_FileTypeMap;
+ NPT_String m_DefaultMimeType;
+ bool m_UseDefaultFileTypeMap;
+ bool m_AutoDir;
+ NPT_String m_AutoIndex;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpServer
++---------------------------------------------------------------------*/
+class NPT_HttpServer {
+public:
+ // types
+ struct Config {
+ NPT_Timeout m_ConnectionTimeout;
+ NPT_Timeout m_IoTimeout;
+ NPT_IpAddress m_ListenAddress;
+ NPT_UInt16 m_ListenPort;
+ bool m_ReuseAddress;
+ };
+
+ // constructors and destructor
+ NPT_HttpServer(NPT_UInt16 listen_port = NPT_HTTP_DEFAULT_PORT, bool cancellable = false);
+ NPT_HttpServer(NPT_IpAddress listen_address,
+ NPT_UInt16 listen_port = NPT_HTTP_DEFAULT_PORT,
+ bool cancellable = false);
+ virtual ~NPT_HttpServer();
+
+ // methods
+ NPT_Result SetConfig(const Config& config);
+ const Config& GetConfig() const { return m_Config; }
+ NPT_Result SetListenPort(NPT_UInt16 port, bool reuse_address = true);
+ NPT_Result SetTimeouts(NPT_Timeout connection_timeout, NPT_Timeout io_timeout);
+ NPT_Result SetServerHeader(const char* server_header);
+ NPT_Result Abort();
+ NPT_Result WaitForNewClient(NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output,
+ NPT_HttpRequestContext* context,
+ NPT_Flags socket_flags = 0);
+ NPT_Result Loop(bool cancellable_sockets=true);
+ NPT_UInt16 GetPort() { return m_BoundPort; }
+ void Terminate();
+
+ /**
+ * Add a request handler. By default the ownership of the handler is NOT transfered to this object,
+ * so the caller is responsible for the lifetime management of the handler object.
+ */
+ virtual NPT_Result AddRequestHandler(NPT_HttpRequestHandler* handler,
+ const char* path,
+ bool include_children = false,
+ bool transfer_ownership = false);
+ virtual NPT_HttpRequestHandler* FindRequestHandler(NPT_HttpRequest& request);
+ virtual NPT_List<NPT_HttpRequestHandler*> FindRequestHandlers(NPT_HttpRequest& request);
+
+ /**
+ * Parse the request from a new client, form a response, and send it back.
+ */
+ virtual NPT_Result RespondToClient(NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output,
+ const NPT_HttpRequestContext& context);
+
+protected:
+ // types
+ struct HandlerConfig {
+ HandlerConfig(NPT_HttpRequestHandler* handler,
+ const char* path,
+ bool include_children,
+ bool transfer_ownership = false);
+ ~HandlerConfig();
+
+ // methods
+ bool WillHandle(NPT_HttpRequest& request);
+
+ // members
+ NPT_HttpRequestHandler* m_Handler;
+ NPT_String m_Path;
+ bool m_IncludeChildren;
+ bool m_HandlerIsOwned;
+ };
+
+ // methods
+ NPT_Result Bind();
+
+ // members
+ NPT_TcpServerSocket m_Socket;
+ NPT_UInt16 m_BoundPort;
+ Config m_Config;
+ NPT_List<HandlerConfig*> m_RequestHandlers;
+ NPT_String m_ServerHeader;
+ bool m_Run;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponder
++---------------------------------------------------------------------*/
+class NPT_HttpResponder {
+public:
+ // types
+ struct Config {
+ NPT_Timeout m_IoTimeout;
+ };
+
+ // constructors and destructor
+ NPT_HttpResponder(NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output);
+ virtual ~NPT_HttpResponder();
+
+ // methods
+ NPT_Result SetConfig(const Config& config);
+ NPT_Result SetTimeout(NPT_Timeout io_timeout);
+ NPT_Result ParseRequest(NPT_HttpRequest*& request,
+ const NPT_SocketAddress* local_address = NULL);
+ NPT_Result SendResponseHeaders(NPT_HttpResponse& response);
+
+protected:
+ // members
+ Config m_Config;
+ NPT_BufferedInputStreamReference m_Input;
+ NPT_OutputStreamReference m_Output;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedInputStream
++---------------------------------------------------------------------*/
+class NPT_HttpChunkedInputStream : public NPT_InputStream
+{
+public:
+ // constructors and destructor
+ NPT_HttpChunkedInputStream(NPT_BufferedInputStreamReference& stream);
+ ~NPT_HttpChunkedInputStream() override;
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL) override;
+ NPT_Result Seek(NPT_Position offset) override;
+ NPT_Result Tell(NPT_Position& offset) override;
+ NPT_Result GetSize(NPT_LargeSize& size) override;
+ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+protected:
+ // members
+ NPT_BufferedInputStreamReference m_Source;
+ NPT_UInt32 m_CurrentChunkSize;
+ bool m_Eos;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpChunkedOutputStream
++---------------------------------------------------------------------*/
+class NPT_HttpChunkedOutputStream : public NPT_OutputStream
+{
+public:
+ // constructors and destructor
+ NPT_HttpChunkedOutputStream(NPT_OutputStream& stream);
+ ~NPT_HttpChunkedOutputStream() override;
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written = NULL) override;
+ NPT_Result Seek(NPT_Position /*offset*/) override { return NPT_ERROR_NOT_SUPPORTED;}
+ NPT_Result Tell(NPT_Position& offset) override { return m_Stream.Tell(offset); }
+ NPT_Result Flush() override { return m_Stream.Flush(); }
+
+protected:
+ // members
+ NPT_OutputStream& m_Stream;
+};
+
+#endif // _NPT_HTTP_H_
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptInterfaces.h b/lib/libUPnP/Neptune/Source/Core/NptInterfaces.h
new file mode 100644
index 0000000..b0bb264
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptInterfaces.h
@@ -0,0 +1,115 @@
+/*****************************************************************
+|
+| Neptune - Interfaces
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_INTERFACES_H_
+#define _NPT_INTERFACES_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptCommon.h"
+#include "NptResults.h"
+#include "NptConfig.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ERROR_NO_SUCH_INTERFACE = NPT_ERROR_BASE_INTERFACES - 0;
+
+/*----------------------------------------------------------------------
+| NPT_InterfaceId
++---------------------------------------------------------------------*/
+class NPT_InterfaceId
+{
+ public:
+ // methods
+ bool operator==(const NPT_InterfaceId& id) const {
+ return ((id.m_Id == m_Id) && (id.m_Version == m_Version));
+ }
+
+ // members
+ unsigned long m_Id;
+ unsigned long m_Version;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Polymorphic
++---------------------------------------------------------------------*/
+class NPT_Polymorphic
+{
+public:
+ // destructor
+ virtual ~NPT_Polymorphic() {}
+
+ // methods
+ virtual NPT_Result GetInterface(const NPT_InterfaceId& id,
+ NPT_Interface*& iface) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Interruptible
++---------------------------------------------------------------------*/
+class NPT_Interruptible
+{
+public:
+ // destructor
+ virtual ~NPT_Interruptible() {}
+
+ // methods
+ virtual NPT_Result Interrupt() = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Configurable
++---------------------------------------------------------------------*/
+class NPT_Configurable
+{
+public:
+ // destructor
+ virtual ~NPT_Configurable() {}
+
+ // methods
+ virtual NPT_Result SetProperty(const char* /*name*/,
+ const char* /*value*/) {
+ return NPT_ERROR_NO_SUCH_PROPERTY;
+ }
+ virtual NPT_Result SetProperty(const char* /*name*/,
+ int /*value*/) {
+ return NPT_ERROR_NO_SUCH_PROPERTY;
+ }
+ virtual NPT_Result GetProperty(const char* /*name*/,
+ NPT_PropertyValue& /*value*/) {
+ return NPT_ERROR_NO_SUCH_PROPERTY;
+ }
+};
+
+#endif // _NPT_INTERFACES_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptJson.cpp b/lib/libUPnP/Neptune/Source/Core/NptJson.cpp
new file mode 100644
index 0000000..300e210
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptJson.cpp
@@ -0,0 +1,37 @@
+/*****************************************************************
+|
+| Neptune - JSON
+|
+| Copyright (c) 2002-2012, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptJson.h"
+#include "NptUtils.h"
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptJson.h b/lib/libUPnP/Neptune/Source/Core/NptJson.h
new file mode 100644
index 0000000..699feef
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptJson.h
@@ -0,0 +1,42 @@
+/*****************************************************************
+|
+| Neptune - JSON
+|
+| Copyright (c) 2002-2012, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_JSON_H_
+#define _NPT_JSON_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptStrings.h"
+
+
+#endif // _NPT_JSON_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptList.cpp b/lib/libUPnP/Neptune/Source/Core/NptList.cpp
new file mode 100644
index 0000000..8879756
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptList.cpp
@@ -0,0 +1,34 @@
+/*****************************************************************
+|
+| Neptune - Lists
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
diff --git a/lib/libUPnP/Neptune/Source/Core/NptList.h b/lib/libUPnP/Neptune/Source/Core/NptList.h
new file mode 100644
index 0000000..37d1802
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptList.h
@@ -0,0 +1,704 @@
+/*****************************************************************
+|
+| Neptune - Lists
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_LIST_H_
+#define _NPT_LIST_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptResults.h"
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptCommon.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ERROR_LIST_EMPTY = NPT_ERROR_BASE_LIST - 0;
+const int NPT_ERROR_LIST_OPERATION_ABORTED = NPT_ERROR_BASE_LIST - 1;
+const int NPT_ERROR_LIST_OPERATION_CONTINUE = NPT_ERROR_BASE_LIST - 2;
+
+/*----------------------------------------------------------------------
+| NPT_List
++---------------------------------------------------------------------*/
+template <typename T>
+class NPT_List
+{
+protected:
+ class Item;
+
+public:
+ // types
+ typedef T Element;
+
+ class Iterator {
+ public:
+ Iterator() : m_Item(NULL) {}
+ explicit Iterator(Item* item) : m_Item(item) {}
+ Iterator(const Iterator& copy) : m_Item(copy.m_Item) {}
+ T& operator*() const { return m_Item->m_Data; }
+ T* operator->() const { return &m_Item->m_Data;}
+ Iterator& operator++() { // prefix
+ m_Item = m_Item->m_Next;
+ return (*this);
+ }
+ Iterator operator++(int) { // postfix
+ Iterator saved_this = *this;
+ m_Item = m_Item->m_Next;
+ return saved_this;
+ }
+ Iterator& operator--() { // prefix
+ m_Item = m_Item->m_Prev;
+ return (*this);
+ }
+ Iterator operator--(int) { // postfix
+ Iterator saved_this = *this;
+ m_Item = m_Item->m_Prev;
+ return saved_this;
+ }
+ operator bool() const {
+ return m_Item != NULL;
+ }
+ bool operator==(const Iterator& other) const {
+ return m_Item == other.m_Item;
+ }
+ bool operator!=(const Iterator& other) const {
+ return m_Item != other.m_Item;
+ }
+ void operator=(const Iterator& other) {
+ m_Item = other.m_Item;
+ }
+ void operator=(Item* item) {
+ m_Item = item;
+ }
+
+ private:
+ Item* m_Item;
+
+ // friends
+ friend class NPT_List<T>;
+ };
+
+ // methods
+ NPT_List<T>();
+ NPT_List<T>(const NPT_List<T>& list);
+ ~NPT_List<T>();
+ NPT_Result Add(const T& data);
+ NPT_Result Insert(const Iterator where, const T& data);
+ NPT_Result Remove(const T& data, bool all=false);
+ NPT_Result Erase(const Iterator position);
+ NPT_Result PopHead(T& data);
+ bool Contains(const T& data) const;
+ NPT_Result Clear();
+ NPT_Result Get(NPT_Ordinal index, T& data) const;
+ NPT_Result Get(NPT_Ordinal index, T*& data) const;
+ NPT_Cardinal GetItemCount() const { return m_ItemCount; }
+ Iterator GetFirstItem() const { return Iterator(m_Head); }
+ Iterator GetLastItem() const { return Iterator(m_Tail); }
+ Iterator GetItem(NPT_Ordinal index) const;
+
+ // list manipulation
+ NPT_Result Add(NPT_List<T>& list);
+ NPT_Result Remove(const NPT_List<T>& list, bool all=false);
+ NPT_Result Cut(NPT_Cardinal keep, NPT_List<T>& cut);
+
+ // item manipulation
+ NPT_Result Add(Item& item);
+ NPT_Result Detach(Item& item);
+ NPT_Result Insert(const Iterator where, Item& item);
+
+ // list operations
+ // keep these template members defined here because MSV6 does not let
+ // us define them later
+ template <typename X>
+ NPT_Result Apply(const X& function) const
+ {
+ Item* item = m_Head;
+ while (item) {
+ function(item->m_Data);
+ item = item->m_Next;
+ }
+
+ return NPT_SUCCESS;
+ }
+
+ template <typename X, typename P>
+ NPT_Result ApplyUntil(const X& function, const P& predicate, bool* match = NULL) const
+ {
+ Item* item = m_Head;
+ while (item) {
+ NPT_Result return_value;
+ if (predicate(function(item->m_Data), return_value)) {
+ if (match) *match = true;
+ return return_value;
+ }
+ item = item->m_Next;
+ }
+
+ if (match) *match = false;
+ return NPT_SUCCESS;
+ }
+
+ template <typename P>
+ Iterator Find(const P& predicate, NPT_Ordinal n=0) const
+ {
+ Item* item = m_Head;
+ while (item) {
+ if (predicate(item->m_Data)) {
+ if (n == 0) {
+ return Iterator(item);
+ }
+ --n;
+ }
+ item = item->m_Next;
+ }
+
+ return Iterator(NULL);
+ }
+
+ // Merge sort algorithm
+ // http://en.wikipedia.org/wiki/Mergesort
+ template <typename X>
+ NPT_Result Sort(const X& function)
+ {
+ if (GetItemCount() <= 1) return NPT_SUCCESS;
+
+ NPT_List<T> right;
+ NPT_CHECK(Cut(GetItemCount() >> 1, right));
+
+ // sort the left side
+ Sort(function);
+
+ // sort the right side
+ right.Sort(function);
+
+ // merge the two back inline
+ if (function(m_Tail->m_Data, right.m_Head->m_Data) > 0) {
+ Merge(right, function);
+ } else {
+ // append right
+ right.m_Head->m_Prev = m_Tail;
+ m_Tail->m_Next = right.m_Head;
+ m_Tail = right.m_Tail;
+ m_ItemCount += right.m_ItemCount;
+
+ right.m_ItemCount = 0;
+ right.m_Head = right.m_Tail = NULL;
+ }
+
+ return NPT_SUCCESS;
+ }
+
+ template <typename X>
+ NPT_Result Merge(NPT_List<T>& other, const X& function)
+ {
+ Iterator left = GetFirstItem();
+ Iterator right;
+ while (left && other.m_Head) {
+ if (function(*left, other.m_Head->m_Data) <= 0) {
+ ++left;
+ } else {
+ // remove head and insert it
+ Item* head = other.m_Head;
+ other.Detach(*head);
+ Insert(left, *head);
+ }
+ }
+
+ // add what's left of other if any
+ if (other.m_Head) {
+ other.m_Head->m_Prev = m_Tail;
+ if (m_Tail) m_Tail->m_Next = other.m_Head;
+ m_Tail = other.m_Tail;
+ if (!m_Head) m_Head = other.m_Head;
+ other.m_Head = other.m_Tail = NULL;
+ }
+ m_ItemCount += other.m_ItemCount;
+ other.m_ItemCount = 0;
+ return NPT_SUCCESS;
+ }
+
+ // operators
+ void operator=(const NPT_List<T>& other);
+ bool operator==(const NPT_List<T>& other) const;
+ bool operator!=(const NPT_List<T>& other) const;
+
+protected:
+ // types
+ class Item
+ {
+ public:
+ // methods
+ Item(const T& data) : m_Next(0), m_Prev(0), m_Data(data) {}
+
+ // members
+ Item* m_Next;
+ Item* m_Prev;
+ T m_Data;
+
+ // friends
+ //friend class NPT_List<T>;
+ //friend class NPT_List<T>::Iterator;
+ };
+
+ // members
+ NPT_Cardinal m_ItemCount;
+ Item* m_Head;
+ Item* m_Tail;
+};
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::NPT_List
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_List<T>::NPT_List() : m_ItemCount(0), m_Head(0), m_Tail(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::NPT_List
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_List<T>::NPT_List(const NPT_List<T>& list) : m_ItemCount(0), m_Head(0), m_Tail(0)
+{
+ *this = list;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::~NPT_List<T>
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_List<T>::~NPT_List()
+{
+ Clear();
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::operator=
++---------------------------------------------------------------------*/
+template <typename T>
+void
+NPT_List<T>::operator=(const NPT_List<T>& list)
+{
+ // cleanup
+ Clear();
+
+ // copy the new list
+ Item* item = list.m_Head;
+ while (item) {
+ Add(item->m_Data);
+ item = item->m_Next;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::operator==
++---------------------------------------------------------------------*/
+template <typename T>
+bool
+NPT_List<T>::operator==(const NPT_List<T>& other) const
+{
+ // quick test
+ if (m_ItemCount != other.m_ItemCount) return false;
+
+ // compare all elements one by one
+ Item* our_item = m_Head;
+ Item* their_item = other.m_Head;
+ while (our_item && their_item) {
+ if (our_item->m_Data != their_item->m_Data) return false;
+ our_item = our_item->m_Next;
+ their_item = their_item->m_Next;
+ }
+
+ return our_item == NULL && their_item == NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::operator!=
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+bool
+NPT_List<T>::operator!=(const NPT_List<T>& other) const
+{
+ return !(*this == other);
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Clear
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Clear()
+{
+ // delete all items
+ Item* item = m_Head;
+ while (item) {
+ Item* next = item->m_Next;
+ delete item;
+ item = next;
+ }
+
+ m_ItemCount = 0;
+ m_Head = NULL;
+ m_Tail = NULL;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Add
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Add(Item& item)
+{
+ // add element at the tail
+ if (m_Tail) {
+ item.m_Prev = m_Tail;
+ item.m_Next = NULL;
+ m_Tail->m_Next = &item;
+ m_Tail = &item;
+ } else {
+ m_Head = &item;
+ m_Tail = &item;
+ item.m_Next = NULL;
+ item.m_Prev = NULL;
+ }
+
+ // one more item in the list now
+ ++m_ItemCount;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Add
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Add(NPT_List<T>& list)
+{
+ // copy the new list
+ Item* item = list.m_Head;
+ while (item) {
+ Add(item->m_Data);
+ item = item->m_Next;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Add
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_Result
+NPT_List<T>::Add(const T& data)
+{
+ return Add(*new Item(data));
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::GetItem
++---------------------------------------------------------------------*/
+template <typename T>
+typename NPT_List<T>::Iterator
+NPT_List<T>::GetItem(NPT_Ordinal n) const
+{
+ Iterator result;
+ if (n >= m_ItemCount) return result;
+
+ result = m_Head;
+ for (unsigned int i=0; i<n; i++) {
+ ++result;
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Insert
++---------------------------------------------------------------------*/
+template <typename T>
+inline
+NPT_Result
+NPT_List<T>::Insert(Iterator where, const T&data)
+{
+ return Insert(where, *new Item(data));
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Insert
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Insert(Iterator where, Item& item)
+{
+ // insert the item in the list
+ Item* position = where.m_Item;
+ if (position) {
+ // insert at position
+ item.m_Next = position;
+ item.m_Prev = position->m_Prev;
+ position->m_Prev = &item;
+ if (item.m_Prev) {
+ item.m_Prev->m_Next = &item;
+ } else {
+ // this is the new head
+ m_Head = &item;
+ }
+
+ // one more item in the list now
+ ++m_ItemCount;
+ } else {
+ // insert at tail
+ return Add(item);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Erase
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Erase(Iterator position)
+{
+ if (!position) return NPT_ERROR_NO_SUCH_ITEM;
+ Detach(*position.m_Item);
+ delete position.m_Item;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Remove
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Remove(const T& data, bool all)
+{
+ Item* item = m_Head;
+ NPT_Cardinal matches = 0;
+
+ while (item) {
+ Item* next = item->m_Next;
+ if (item->m_Data == data) {
+ // we found a match
+ ++matches;
+
+ // detach item
+ Detach(*item);
+
+ // destroy the item
+ delete item;
+
+ if (!all) return NPT_SUCCESS;
+ }
+ item = next;
+ }
+
+ return matches?NPT_SUCCESS:NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Remove
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Remove(const NPT_List<T>& list, bool all)
+{
+ Item* item = list.m_Head;
+ while (item) {
+ Remove(item->m_Data, all);
+ item = item->m_Next;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Detach
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Detach(Item& item)
+{
+ // remove item
+ if (item.m_Prev) {
+ // item is not the head
+ if (item.m_Next) {
+ // item is not the tail
+ item.m_Next->m_Prev = item.m_Prev;
+ item.m_Prev->m_Next = item.m_Next;
+ } else {
+ // item is the tail
+ m_Tail = item.m_Prev;
+ m_Tail->m_Next = NULL;
+ }
+ } else {
+ // item is the head
+ m_Head = item.m_Next;
+ if (m_Head) {
+ // item is not the tail
+ m_Head->m_Prev = NULL;
+ } else {
+ // item is also the tail
+ m_Tail = NULL;
+ }
+ }
+
+ // one less item in the list now
+ --m_ItemCount;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Get
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Get(NPT_Ordinal index, T& data) const
+{
+ T* data_pointer;
+ NPT_CHECK(Get(index, data_pointer));
+ data = *data_pointer;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Get
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Get(NPT_Ordinal index, T*& data) const
+{
+ Item* item = m_Head;
+
+ if (index < m_ItemCount) {
+ while (index--) item = item->m_Next;
+ data = &item->m_Data;
+ return NPT_SUCCESS;
+ } else {
+ data = NULL;
+ return NPT_ERROR_NO_SUCH_ITEM;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::PopHead
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::PopHead(T& data)
+{
+ // check that we have an element
+ if (m_Head == NULL) return NPT_ERROR_LIST_EMPTY;
+
+ // copy the head item's data
+ data = m_Head->m_Data;
+
+ // discard the head item
+ Item* head = m_Head;
+ m_Head = m_Head->m_Next;
+ if (m_Head) {
+ m_Head->m_Prev = NULL;
+ } else {
+ m_Tail = NULL;
+ }
+ delete head;
+
+ // update the count
+ --m_ItemCount;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Contains
++---------------------------------------------------------------------*/
+template <typename T>
+bool
+NPT_List<T>::Contains(const T& data) const
+{
+ Item* item = m_Head;
+ while (item) {
+ if (item->m_Data == data) return true;
+ item = item->m_Next;
+ }
+
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| NPT_List<T>::Cut
++---------------------------------------------------------------------*/
+template <typename T>
+NPT_Result
+NPT_List<T>::Cut(NPT_Cardinal keep, NPT_List<T>& cut)
+{
+ cut.Clear();
+
+ // shortcut
+ if (keep >= GetItemCount()) return NPT_SUCCESS;
+
+ // update new counts first
+ cut.m_ItemCount = m_ItemCount-keep;
+ m_ItemCount = keep;
+
+ // look for the cut-point item
+ Item* item = m_Head;
+ while (keep--) { item = item->m_Next;}
+
+ // the cut list goes from the cut-point item to the tail
+ cut.m_Head = item;
+ cut.m_Tail = m_Tail;
+
+ // update the portion of the list we keep
+ if (item == m_Head) m_Head = NULL;
+ m_Tail = item->m_Prev;
+
+ // update the cut list
+ if (item->m_Prev) item->m_Prev->m_Next = NULL;
+ item->m_Prev = NULL;
+
+ return NPT_SUCCESS;
+}
+
+#endif // _NPT_LIST_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptLogging.cpp b/lib/libUPnP/Neptune/Source/Core/NptLogging.cpp
new file mode 100644
index 0000000..51d20e7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptLogging.cpp
@@ -0,0 +1,1555 @@
+/*****************************************************************
+|
+| Neptune - Logging Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+/** @file
+* Implementation file for logging
+*/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdarg.h>
+
+#include "NptLogging.h"
+#include "NptList.h"
+#include "NptStreams.h"
+#include "NptSockets.h"
+#include "NptUtils.h"
+#include "NptFile.h"
+#include "NptSystem.h"
+#include "NptConsole.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+//NPT_SET_LOCAL_LOGGER("neptune.logging")
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+class NPT_LogConsoleHandler : public NPT_LogHandler {
+public:
+ // enums
+ enum {
+ OUTPUT_TO_CONSOLE = 1,
+ OUTPUT_TO_DEBUG = 2
+ };
+
+ // class methods
+ static NPT_Result Create(const char* logger_name, NPT_LogHandler*& handler);
+
+ // methods
+ void Log(const NPT_LogRecord& record) override;
+
+private:
+ // members
+ NPT_UInt32 m_Outputs;
+ bool m_UseColors;
+ NPT_Flags m_FormatFilter;
+};
+
+class NPT_LogFileHandler : public NPT_LogHandler {
+public:
+ // class methods
+ static NPT_Result Create(const char* logger_name, NPT_LogHandler*& handler);
+
+ // methods
+ void Log(const NPT_LogRecord& record) override;
+
+private:
+ NPT_Result Open(bool append = true);
+
+private:
+ // members
+ bool m_Flush;
+ bool m_Append;
+ NPT_String m_Filename;
+ NPT_Flags m_FormatFilter;
+ NPT_LargeSize m_MaxFilesize;
+ NPT_OutputStreamReference m_Stream;
+};
+
+class NPT_LogTcpHandler : public NPT_LogHandler {
+public:
+ // class methods
+ static void FormatRecord(const NPT_LogRecord& record, NPT_String& msg);
+ static NPT_Result Create(const char* logger_name, NPT_LogHandler*& handler);
+
+ // methods
+ void Log(const NPT_LogRecord& record) override;
+
+private:
+ // constructor
+ NPT_LogTcpHandler() : m_Port(0) {}
+
+ // methods
+ NPT_Result Connect();
+
+ // members
+ NPT_String m_Host;
+ NPT_UInt16 m_Port;
+ NPT_OutputStreamReference m_Stream;
+};
+
+class NPT_LogUdpHandler : public NPT_LogHandler {
+public:
+ // class methods
+ static NPT_Result Create(const char* logger_name, NPT_LogHandler*& handler);
+
+ // methods
+ void Log(const NPT_LogRecord& record) override;
+
+private:
+ // members
+ NPT_UdpSocket m_Socket;
+ NPT_SocketAddress m_Target;
+};
+
+class NPT_LogNullHandler : public NPT_LogHandler {
+public:
+ // class methods
+ static NPT_Result Create(NPT_LogHandler*& handler);
+
+ // methods
+ void Log(const NPT_LogRecord& record) override;
+};
+
+class NPT_LogCustomHandler : public NPT_LogHandler {
+public:
+ // class methods
+ static NPT_Result SetCustomHandlerFunction(CustomHandlerExternalFunction function);
+ static NPT_Result Create(NPT_LogHandler*& handler);
+
+ // methods
+ void Log(const NPT_LogRecord& record) override;
+
+private:
+ static CustomHandlerExternalFunction s_ExternalFunction;
+};
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define NPT_LOG_HEAP_BUFFER_INCREMENT 4096
+#define NPT_LOG_STACK_BUFFER_MAX_SIZE 512
+#define NPT_LOG_HEAP_BUFFER_MAX_SIZE 65536
+
+#if !defined(NPT_CONFIG_LOG_CONFIG_ENV)
+#define NPT_CONFIG_LOG_CONFIG_ENV "NEPTUNE_LOG_CONFIG"
+#endif
+
+#if !defined(NPT_CONFIG_DEFAULT_LOG_CONFIG_SOURCE)
+#define NPT_CONFIG_DEFAULT_LOG_CONFIG_SOURCE "file:neptune-logging.properties"
+#endif
+
+#if !defined(NPT_CONFIG_DEFAULT_LOG_LEVEL)
+#define NPT_CONFIG_DEFAULT_LOG_LEVEL NPT_LOG_LEVEL_OFF
+#endif
+#define NPT_LOG_ROOT_DEFAULT_HANDLER "ConsoleHandler"
+#if !defined(NPT_CONFIG_DEFAULT_FILE_HANDLER_FILENAME)
+#define NPT_CONFIG_DEFAULT_LOG_FILE_HANDLER_FILENAME "_neptune.log"
+#endif
+
+#define NPT_LOG_TCP_HANDLER_DEFAULT_PORT 7723
+#define NPT_LOG_TCP_HANDLER_DEFAULT_CONNECT_TIMEOUT 5000 /* 5 seconds */
+
+#define NPT_LOG_UDP_HANDLER_DEFAULT_PORT 7724
+
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__APPLE__)
+#define NPT_LOG_CONSOLE_HANDLER_DEFAULT_COLOR_MODE false
+#else
+#define NPT_LOG_CONSOLE_HANDLER_DEFAULT_COLOR_MODE true
+#endif
+
+#ifndef NPT_CONFIG_DEFAULT_LOG_CONSOLE_HANDLER_OUTPUTS
+#define NPT_CONFIG_DEFAULT_LOG_CONSOLE_HANDLER_OUTPUTS OUTPUT_TO_DEBUG
+#endif
+
+#define NPT_LOG_FILE_HANDLER_MIN_RECYCLE_SIZE 1000000
+
+#define NPT_LOG_FORMAT_FILTER_NO_SOURCE 1
+#define NPT_LOG_FORMAT_FILTER_NO_TIMESTAMP 2
+#define NPT_LOG_FORMAT_FILTER_NO_FUNCTION_NAME 4
+#define NPT_LOG_FORMAT_FILTER_NO_LOGGER_NAME 8
+#define NPT_LOG_FORMAT_FILTER_NO_SOURCEPATH 16
+#define NPT_LOG_FORMAT_FILTER_NO_THREAD_ID 32
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static NPT_LogManager LogManager;
+
+/*----------------------------------------------------------------------
+| NPT_LogManagerAutoDisabler
++---------------------------------------------------------------------*/
+class NPT_LogManagerAutoDisabler
+{
+public:
+ NPT_LogManagerAutoDisabler() : m_WasEnabled(LogManager.IsEnabled()) {
+ LogManager.SetEnabled(false);
+ }
+ ~NPT_LogManagerAutoDisabler() {
+ LogManager.SetEnabled(m_WasEnabled);
+ }
+private:
+ bool m_WasEnabled;
+};
+
+/*----------------------------------------------------------------------
+| NPT_LogManagerAutoLocker
++---------------------------------------------------------------------*/
+class NPT_LogManagerAutoLocker
+{
+ public:
+ // methods
+ NPT_LogManagerAutoLocker(NPT_LogManager &manager) : m_Manager(manager) {
+ m_Manager.Lock();
+ }
+ ~NPT_LogManagerAutoLocker() {
+ m_Manager.Unlock();
+ }
+
+ private:
+ // members
+ NPT_LogManager& m_Manager;
+};
+
+/*----------------------------------------------------------------------
+| NPT_GetSystemLogConfig
++---------------------------------------------------------------------*/
+#if !defined(NPT_CONFIG_HAVE_SYSTEM_LOG_CONFIG)
+NPT_Result NPT_GetSystemLogConfig(NPT_String& /*config*/)
+{
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_LogHandler::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogHandler::Create(const char* logger_name,
+ const char* handler_name,
+ NPT_LogHandler*& handler)
+{
+ handler = NULL;
+
+ if (NPT_StringsEqual(handler_name, "NullHandler")) {
+ return NPT_LogNullHandler::Create(handler);
+ } else if (NPT_StringsEqual(handler_name, "FileHandler")) {
+ return NPT_LogFileHandler::Create(logger_name, handler);
+ } else if (NPT_StringsEqual(handler_name, "ConsoleHandler")) {
+ return NPT_LogConsoleHandler::Create(logger_name, handler);
+ } else if (NPT_StringsEqual(handler_name, "TcpHandler")) {
+ return NPT_LogTcpHandler::Create(logger_name, handler);
+ } else if (NPT_StringsEqual(handler_name, "UdpHandler")) {
+ return NPT_LogUdpHandler::Create(logger_name, handler);
+ } else if (NPT_StringsEqual(handler_name, "CustomHandler")) {
+ return NPT_LogCustomHandler::Create(handler);
+ }
+
+ return NPT_ERROR_NO_SUCH_CLASS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogHandler::SetCustomHandlerFunction
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogHandler::SetCustomHandlerFunction(CustomHandlerExternalFunction function)
+{
+ return NPT_LogCustomHandler::SetCustomHandlerFunction(function);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Log::GetLogLevel
++---------------------------------------------------------------------*/
+int
+NPT_Log::GetLogLevel(const char* name)
+{
+ if ( NPT_StringsEqual(name, "FATAL")) {
+ return NPT_LOG_LEVEL_FATAL;
+ } else if (NPT_StringsEqual(name, "SEVERE")) {
+ return NPT_LOG_LEVEL_SEVERE;
+ } else if (NPT_StringsEqual(name, "WARNING")) {
+ return NPT_LOG_LEVEL_WARNING;
+ } else if (NPT_StringsEqual(name, "INFO")) {
+ return NPT_LOG_LEVEL_INFO;
+ } else if (NPT_StringsEqual(name, "FINE")) {
+ return NPT_LOG_LEVEL_FINE;
+ } else if (NPT_StringsEqual(name, "FINER")) {
+ return NPT_LOG_LEVEL_FINER;
+ } else if (NPT_StringsEqual(name, "FINEST")) {
+ return NPT_LOG_LEVEL_FINEST;
+ } else if (NPT_StringsEqual(name, "ALL")) {
+ return NPT_LOG_LEVEL_ALL;
+ } else if (NPT_StringsEqual(name, "OFF")) {
+ return NPT_LOG_LEVEL_OFF;
+ } else {
+ return -1;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Log::GetLogLevelName
++---------------------------------------------------------------------*/
+const char*
+NPT_Log::GetLogLevelName(int level)
+{
+ switch (level) {
+ case NPT_LOG_LEVEL_FATAL: return "FATAL";
+ case NPT_LOG_LEVEL_SEVERE: return "SEVERE";
+ case NPT_LOG_LEVEL_WARNING: return "WARNING";
+ case NPT_LOG_LEVEL_INFO: return "INFO";
+ case NPT_LOG_LEVEL_FINE: return "FINE";
+ case NPT_LOG_LEVEL_FINER: return "FINER";
+ case NPT_LOG_LEVEL_FINEST: return "FINEST";
+ case NPT_LOG_LEVEL_OFF: return "OFF";
+ default: return "";
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Log::GetLogLevelAnsiColor
++---------------------------------------------------------------------*/
+const char*
+NPT_Log::GetLogLevelAnsiColor(int level)
+{
+ switch (level) {
+ case NPT_LOG_LEVEL_FATAL: return "31";
+ case NPT_LOG_LEVEL_SEVERE: return "31";
+ case NPT_LOG_LEVEL_WARNING: return "33";
+ case NPT_LOG_LEVEL_INFO: return "32";
+ case NPT_LOG_LEVEL_FINE: return "34";
+ case NPT_LOG_LEVEL_FINER: return "35";
+ case NPT_LOG_LEVEL_FINEST: return "36";
+ default: return NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Log::FormatRecordToStream
++---------------------------------------------------------------------*/
+void
+NPT_Log::FormatRecordToStream(const NPT_LogRecord& record,
+ NPT_OutputStream& stream,
+ bool use_colors,
+ NPT_Flags format_filter)
+{
+ const char* level_name = GetLogLevelName(record.m_Level);
+ NPT_String level_string;
+
+ /* format and emit the record */
+ if (level_name[0] == '\0') {
+ level_string = NPT_String::FromInteger(record.m_Level);
+ level_name = level_string;
+ }
+ if ((format_filter & NPT_LOG_FORMAT_FILTER_NO_SOURCE) == 0) {
+ unsigned int start = 0;
+ /* remove source file path if requested */
+ if (format_filter & NPT_LOG_FORMAT_FILTER_NO_SOURCEPATH) {
+ for (start = NPT_StringLength(record.m_SourceFile);
+ start;
+ --start) {
+ if (record.m_SourceFile[start-1] == '\\' ||
+ record.m_SourceFile[start-1] == '/') {
+ break;
+ }
+ }
+ }
+ stream.WriteString(record.m_SourceFile + start);
+ stream.Write("(", 1, NULL);
+ stream.WriteString(NPT_String::FromIntegerU(record.m_SourceLine));
+ stream.Write("): ", 3, NULL);
+ }
+ if ((format_filter & NPT_LOG_FORMAT_FILTER_NO_LOGGER_NAME) == 0) {
+ stream.Write("[", 1, NULL);
+ stream.WriteString(record.m_LoggerName);
+ stream.Write("] ", 2, NULL);
+ }
+ if ((format_filter & NPT_LOG_FORMAT_FILTER_NO_TIMESTAMP) == 0) {
+ NPT_String ts = NPT_DateTime(record.m_TimeStamp, true).ToString(NPT_DateTime::FORMAT_W3C,
+ NPT_DateTime::FLAG_EMIT_FRACTION |
+ NPT_DateTime::FLAG_EXTENDED_PRECISION);
+ stream.WriteString(ts.GetChars());
+ stream.Write(" ", 1);
+ }
+ if ((format_filter & NPT_LOG_FORMAT_FILTER_NO_FUNCTION_NAME) == 0) {
+ stream.WriteFully("[",1);
+ if (record.m_SourceFunction) {
+ stream.WriteString(record.m_SourceFunction);
+ }
+ stream.WriteFully("] ",2);
+ }
+ if ((format_filter & NPT_LOG_FORMAT_FILTER_NO_THREAD_ID) == 0) {
+ stream.Write("(", 1, NULL);
+ stream.WriteString(NPT_String::FromIntegerU(record.m_ThreadId));
+ stream.Write(") ", 2, NULL);
+ }
+ const char* ansi_color = NULL;
+ if (use_colors) {
+ ansi_color = GetLogLevelAnsiColor(record.m_Level);
+ if (ansi_color) {
+ stream.Write("\033[", 2, NULL);
+ stream.WriteString(ansi_color);
+ stream.Write(";1m", 3, NULL);
+ }
+ }
+ stream.WriteString(level_name);
+ if (use_colors && ansi_color) {
+ stream.Write("\033[0m", 4, NULL);
+ }
+ stream.Write(": ", 2, NULL);
+ stream.WriteString(record.m_Message);
+ stream.Write("\r\n", 2, NULL);
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::NPT_LogManager
++---------------------------------------------------------------------*/
+NPT_LogManager::NPT_LogManager() :
+ m_LockOwner(0),
+ m_LockRecursion(0),
+ m_Enabled(true),
+ m_Configured(false),
+ m_Root(NULL)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::~NPT_LogManager
++---------------------------------------------------------------------*/
+NPT_LogManager::~NPT_LogManager()
+{
+ /* destroy everything we've created */
+ for (NPT_List<NPT_Logger*>::Iterator i = m_Loggers.GetFirstItem();
+ i;
+ ++i) {
+ NPT_Logger* logger = *i;
+ delete logger;
+ }
+
+ /* destroy the root logger */
+ delete m_Root;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::GetDefault
++---------------------------------------------------------------------*/
+NPT_LogManager&
+NPT_LogManager::GetDefault()
+{
+ return LogManager;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::Lock
++---------------------------------------------------------------------*/
+void
+NPT_LogManager::Lock()
+{
+ NPT_Thread::ThreadId me = NPT_Thread::GetCurrentThreadId();
+ if (m_LockOwner != me) {
+ m_Lock.Lock();
+ m_LockOwner = me;
+ }
+ ++m_LockRecursion;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::Unlock
++---------------------------------------------------------------------*/
+void
+NPT_LogManager::Unlock()
+{
+ if (--m_LockRecursion == 0) {
+ m_LockOwner = (NPT_Thread::ThreadId)0;
+ m_Lock.Unlock();
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::Configure
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogManager::Configure(const char* config_sources)
+{
+ // exit if we're already initialized
+ if (m_Configured) return NPT_SUCCESS;
+
+ // prevent multiple threads from configuring at the same time
+ NPT_LogManagerAutoLocker lock(*this);
+ if (m_Configured) return NPT_SUCCESS;
+
+ // we need to be disabled while we configure ourselves
+ NPT_LogManagerAutoDisabler autodisabler;
+
+ // set some default config values
+ SetConfigValue(".handlers", NPT_LOG_ROOT_DEFAULT_HANDLER);
+
+ // see if the config sources have been set to non-default values
+ if (config_sources == NULL) {
+ config_sources = NPT_CONFIG_DEFAULT_LOG_CONFIG_SOURCE;
+ }
+ NPT_String config_sources_system;
+ if (NPT_SUCCEEDED(NPT_GetSystemLogConfig(config_sources_system))) {
+ config_sources = config_sources_system;
+ }
+ NPT_String config_sources_env;
+ if (NPT_SUCCEEDED(NPT_Environment::Get(NPT_CONFIG_LOG_CONFIG_ENV, config_sources_env))) {
+ config_sources = config_sources_env;
+ }
+
+ /* load all configs */
+ NPT_String config_source;
+ const char* cursor = config_sources;
+ const char* source = config_sources;
+ for (;;) {
+ if (*cursor == '\0' || *cursor == '|') {
+ if (cursor != source) {
+ config_source.Assign(source, (NPT_Size)(cursor-source));
+ config_source.Trim(" \t");
+ ParseConfigSource(config_source);
+ if (*cursor == '|') source = cursor+1;
+ }
+ if (*cursor == '\0') break;
+ }
+ cursor++;
+ }
+
+ /* create the root logger */
+ LogManager.m_Root = new NPT_Logger("", *this);
+ LogManager.m_Root->m_Level = NPT_CONFIG_DEFAULT_LOG_LEVEL;
+ LogManager.m_Root->m_LevelIsInherited = false;
+ ConfigureLogger(LogManager.m_Root);
+
+ // we're initialized now
+ m_Configured = true;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::ConfigValueIsBooleanTrue
++---------------------------------------------------------------------*/
+bool
+NPT_LogManager::ConfigValueIsBooleanTrue(NPT_String& value)
+{
+ return
+ value.Compare("true", true) == 0 ||
+ value.Compare("yes", true) == 0 ||
+ value.Compare("on", true) == 0 ||
+ value.Compare("1", true) == 0;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::ConfigValueIsBooleanFalse
++---------------------------------------------------------------------*/
+bool
+NPT_LogManager::ConfigValueIsBooleanFalse(NPT_String& value)
+{
+ return
+ value.Compare("false", true) == 0 ||
+ value.Compare("no", true) == 0 ||
+ value.Compare("off", true) == 0 ||
+ value.Compare("0", true) == 0;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::GetConfigValue
++---------------------------------------------------------------------*/
+NPT_String*
+NPT_LogManager::GetConfigValue(const char* prefix, const char* suffix)
+{
+ NPT_Size prefix_length = prefix?NPT_StringLength(prefix):0;
+ NPT_Size suffix_length = suffix?NPT_StringLength(suffix):0;
+ NPT_Size key_length = prefix_length+suffix_length;
+ for (NPT_List<NPT_LogConfigEntry>::Iterator i = LogManager.m_Config.GetFirstItem();
+ i;
+ ++i) {
+ NPT_LogConfigEntry& entry = *i;
+ if ((entry.m_Key.GetLength() == key_length) &&
+ (prefix == NULL || entry.m_Key.StartsWith(prefix)) &&
+ (suffix == NULL || entry.m_Key.EndsWith(suffix )) ) {
+ return &entry.m_Value;
+ }
+ }
+
+ // not found
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::SetConfigValue
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogManager::SetConfigValue(const char* key, const char* value)
+{
+ NPT_String* value_string = GetConfigValue(key, NULL);
+ if (value_string) {
+ /* the key already exists, replace the value */
+ *value_string = value;
+ } else {
+ /* the value does not already exist, create a new one */
+ NPT_CHECK(LogManager.m_Config.Add(NPT_LogConfigEntry(key, value)));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::ParseConfig
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogManager::ParseConfig(const char* config,
+ NPT_Size config_size)
+{
+ const char* cursor = config;
+ const char* line = config;
+ const char* separator = NULL;
+ NPT_String key;
+ NPT_String value;
+
+ /* parse all entries */
+ while (cursor <= config+config_size) {
+ /* separators are newlines, ';' or end of buffer */
+ if ( cursor == config+config_size ||
+ *cursor == '\n' ||
+ *cursor == '\r' ||
+ *cursor == ';') {
+ /* newline or end of buffer */
+ if (separator && line[0] != '#') {
+ /* we have a property */
+ key.Assign(line, (NPT_Size)(separator-line));
+ value.Assign(line+(separator+1-line), (NPT_Size)(cursor-(separator+1)));
+ key.Trim(" \t");
+ value.Trim(" \t");
+
+ SetConfigValue((const char*)key, (const char*)value);
+ }
+ line = cursor+1;
+ separator = NULL;
+ } else if (*cursor == '=' && separator == NULL) {
+ separator = cursor;
+ }
+ cursor++;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::ParseConfigFile
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogManager::ParseConfigFile(const char* filename)
+{
+ NPT_Result result;
+
+ /* load the file */
+ NPT_DataBuffer buffer;
+ result = NPT_File::Load(filename, buffer);
+ if (NPT_FAILED(result)) return result;
+
+ /* parse the config */
+ return ParseConfig((const char*)buffer.GetData(), buffer.GetDataSize());
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::ParseConfigSource
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogManager::ParseConfigSource(NPT_String& source)
+{
+ if (source.StartsWith("file:")) {
+ /* file source */
+ ParseConfigFile(source.GetChars()+5);
+ } else if (source.StartsWith("plist:")) {
+ /* property list source */
+ ParseConfig(source.GetChars()+6, source.GetLength()-6);
+ } else if (source.StartsWith("http:port=")) {
+ /* http configurator */
+ unsigned int port = 0;
+ NPT_Result result = NPT_ParseInteger(source.GetChars()+10, port, true);
+ if (NPT_FAILED(result)) return result;
+ new NPT_HttpLoggerConfigurator(port);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::HaveLoggerConfig
++---------------------------------------------------------------------*/
+bool
+NPT_LogManager::HaveLoggerConfig(const char* name)
+{
+ NPT_Size name_length = NPT_StringLength(name);
+ for (NPT_List<NPT_LogConfigEntry>::Iterator i = m_Config.GetFirstItem();
+ i;
+ ++i) {
+ NPT_LogConfigEntry& entry = *i;
+ if (entry.m_Key.StartsWith(name)) {
+ const char* suffix = entry.m_Key.GetChars()+name_length;
+ if (NPT_StringsEqual(suffix, ".level") ||
+ NPT_StringsEqual(suffix, ".handlers") ||
+ NPT_StringsEqual(suffix, ".forward")) {
+ return true;
+ }
+ }
+ }
+
+ /* no config found */
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::ConfigureLogger
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogManager::ConfigureLogger(NPT_Logger* logger)
+{
+ /* configure the level */
+ NPT_String* level_value = GetConfigValue(logger->m_Name,".level");
+ if (level_value) {
+ NPT_Int32 value;
+ /* try a symbolic name */
+ value = NPT_Log::GetLogLevel(*level_value);
+ if (value < 0) {
+ /* try a numeric value */
+ if (NPT_FAILED(level_value->ToInteger(value, false))) {
+ value = -1;
+ }
+ }
+ if (value >= 0) {
+ logger->m_Level = value;
+ logger->m_LevelIsInherited = false;
+ }
+ }
+
+ /* remove any existing handlers */
+ logger->DeleteHandlers();
+
+ /* configure the handlers */
+ NPT_String* handlers = GetConfigValue(logger->m_Name,".handlers");
+ if (handlers) {
+ const char* handlers_list = handlers->GetChars();
+ const char* cursor = handlers_list;
+ const char* name_start = handlers_list;
+ NPT_String handler_name;
+ NPT_LogHandler* handler;
+ for (;;) {
+ if (*cursor == '\0' || *cursor == ',') {
+ if (cursor != name_start) {
+ handler_name.Assign(name_start, (NPT_Size)(cursor-name_start));
+ handler_name.Trim(" \t");
+
+ /* create a handler */
+ if (NPT_SUCCEEDED(
+ NPT_LogHandler::Create(logger->m_Name, handler_name, handler))) {
+ logger->AddHandler(handler);
+ }
+
+ }
+ if (*cursor == '\0') break;
+ name_start = cursor+1;
+ }
+ ++cursor;
+ }
+ }
+
+ /* configure the forwarding */
+ NPT_String* forward = GetConfigValue(logger->m_Name,".forward");
+ if (forward && !ConfigValueIsBooleanTrue(*forward)) {
+ logger->m_ForwardToParent = false;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::FindLogger
++---------------------------------------------------------------------*/
+NPT_Logger*
+NPT_LogManager::FindLogger(const char* name)
+{
+ for (NPT_List<NPT_Logger*>::Iterator i = LogManager.m_Loggers.GetFirstItem();
+ i;
+ ++i) {
+ NPT_Logger* logger = *i;
+ if (logger->m_Name == name) {
+ return logger;
+ }
+ }
+
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogManager::GetLogger
++---------------------------------------------------------------------*/
+NPT_Logger*
+NPT_LogManager::GetLogger(const char* name)
+{
+ // exit now if the log manager is disabled
+ if (!LogManager.m_Enabled) return NULL;
+
+ /* check that the manager is initialized */
+ if (!LogManager.m_Configured) {
+ /* init the manager */
+ LogManager.Configure();
+ NPT_ASSERT(LogManager.m_Configured);
+ }
+
+ // auto lock until we return from this method
+ NPT_LogManagerAutoLocker lock(LogManager);
+
+ /* check if this logger is already configured */
+ NPT_Logger* logger = LogManager.FindLogger(name);
+ if (logger) return logger;
+
+ /* create a new logger */
+ logger = new NPT_Logger(name, LogManager);
+ if (logger == NULL) return NULL;
+
+ /* configure the logger */
+ LogManager.ConfigureLogger(logger);
+
+ /* find which parent to attach to */
+ NPT_Logger* parent = LogManager.m_Root;
+ NPT_String parent_name = name;
+ for (;;) {
+ NPT_Logger* candidate_parent;
+
+ /* find the last dot */
+ int dot = parent_name.ReverseFind('.');
+ if (dot < 0) break;
+ parent_name.SetLength(dot);
+
+ /* see if the parent exists */
+ candidate_parent = LogManager.FindLogger(parent_name);
+ if (candidate_parent) {
+ parent = candidate_parent;
+ break;
+ }
+
+ /* this parent name does not exist, see if we need to create it */
+ if (LogManager.HaveLoggerConfig(parent_name)) {
+ parent = GetLogger(parent_name);
+ break;
+ }
+ }
+
+ /* attach to the parent */
+ logger->SetParent(parent);
+
+ /* add this logger to the list */
+ LogManager.m_Loggers.Add(logger);
+
+ return logger;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Logger::NPT_Logger
++---------------------------------------------------------------------*/
+NPT_Logger::NPT_Logger(const char* name, NPT_LogManager& manager) :
+ m_Manager(manager),
+ m_Name(name),
+ m_Level(NPT_LOG_LEVEL_OFF),
+ m_LevelIsInherited(true),
+ m_ForwardToParent(true),
+ m_Parent(NULL)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_Logger::~NPT_Logger
++---------------------------------------------------------------------*/
+NPT_Logger::~NPT_Logger()
+{
+ /* remove external handlers before cleaning up */
+ m_Handlers.Remove(m_ExternalHandlers, true);
+
+ /* delete all handlers */
+ m_Handlers.Apply(NPT_ObjectDeleter<NPT_LogHandler>());
+}
+
+/*----------------------------------------------------------------------
+| NPT_Logger::DeleteHandlers
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Logger::DeleteHandlers()
+{
+ /* remove external handlers before cleaning up */
+ m_Handlers.Remove(m_ExternalHandlers, true);
+
+ /* delete all handlers and empty the list */
+ if (m_Handlers.GetItemCount()) {
+ m_Handlers.Apply(NPT_ObjectDeleter<NPT_LogHandler>());
+ m_Handlers.Clear();
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Logger::Log
++---------------------------------------------------------------------*/
+void
+NPT_Logger::Log(int level,
+ const char* source_file,
+ unsigned int source_line,
+ const char* source_function,
+ const char* msg,
+ ...)
+{
+ // this is a no-op if the log manager is disabled
+ if (!LogManager.IsEnabled()) return;
+
+ /* check the log level (in case filtering has not already been done) */
+ if (level < m_Level) return;
+
+ /* format the message */
+ char buffer[NPT_LOG_STACK_BUFFER_MAX_SIZE];
+ NPT_Size buffer_size = sizeof(buffer);
+ char* message = buffer;
+ int result;
+ va_list args;
+ for(;;) {
+ /* try to format the message (it might not fit) */
+ va_start(args, msg);
+ result = NPT_FormatStringVN(message, buffer_size-1, msg, args);
+ va_end(args);
+ if (result >= (int)(buffer_size-1)) result = -1;
+ message[buffer_size-1] = 0; /* force a NULL termination */
+ if (result >= 0) break;
+
+ /* the buffer was too small, try something bigger */
+ buffer_size = (buffer_size+NPT_LOG_HEAP_BUFFER_INCREMENT)*2;
+ if (buffer_size > NPT_LOG_HEAP_BUFFER_MAX_SIZE) break;
+ if (message != buffer) delete[] message;
+ message = new char[buffer_size];
+ if (message == NULL) return;
+ }
+
+ /* the message is formatted, publish it to the handlers */
+ NPT_LogRecord record;
+ NPT_Logger* logger = this;
+
+ /* setup the log record */
+ record.m_LoggerName = logger->m_Name,
+ record.m_Level = level;
+ record.m_Message = message;
+ record.m_SourceFile = source_file;
+ record.m_SourceLine = source_line;
+ record.m_SourceFunction = source_function;
+ NPT_System::GetCurrentTimeStamp(record.m_TimeStamp);
+ record.m_ThreadId = (NPT_UInt64)NPT_Thread::GetCurrentThreadId();
+
+ /* call all handlers for this logger and parents */
+ m_Manager.Lock();
+ m_Manager.SetEnabled(false); // prevent recursion
+ while (logger) {
+ /* call all handlers for the current logger */
+ for (NPT_List<NPT_LogHandler*>::Iterator i = logger->m_Handlers.GetFirstItem();
+ i;
+ ++i) {
+ NPT_LogHandler* handler = *i;
+ handler->Log(record);
+ }
+
+ /* forward to the parent unless this logger does not forward */
+ if (logger->m_ForwardToParent) {
+ logger = logger->m_Parent;
+ } else {
+ break;
+ }
+ }
+ m_Manager.SetEnabled(true);
+ m_Manager.Unlock();
+
+ /* free anything we may have allocated */
+ if (message != buffer) delete[] message;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Logger::AddHandler
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Logger::AddHandler(NPT_LogHandler* handler, bool transfer_ownership /* = true */)
+{
+ /* check parameters */
+ if (handler == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ /* keep track of what handlers we won't cleanup */
+ if (!transfer_ownership) m_ExternalHandlers.Add(handler);
+
+ return m_Handlers.Add(handler);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Logger::SetParent
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Logger::SetParent(NPT_Logger* parent)
+{
+ /* set our new parent */
+ m_Parent = parent;
+
+ /* find the first ancestor with its own log level */
+ NPT_Logger* logger = this;
+ while (logger->m_LevelIsInherited && logger->m_Parent) {
+ logger = logger->m_Parent;
+ }
+ if (logger != this) m_Level = logger->m_Level;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogNullHandler::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogNullHandler::Create(NPT_LogHandler*& handler)
+{
+ handler = new NPT_LogNullHandler();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogNullHandler::Log
++---------------------------------------------------------------------*/
+void
+NPT_LogNullHandler::Log(const NPT_LogRecord& /*record*/)
+{
+}
+
+
+NPT_LogHandler::CustomHandlerExternalFunction NPT_LogCustomHandler::s_ExternalFunction = NULL;
+/*----------------------------------------------------------------------
+| NPT_LogCustomHandler::SetCustomHandlerFunction
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogCustomHandler::SetCustomHandlerFunction(CustomHandlerExternalFunction function)
+{
+ s_ExternalFunction = function;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogCustomHandler::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogCustomHandler::Create(NPT_LogHandler*& handler)
+{
+ /* allocate a new object */
+ NPT_LogCustomHandler* instance = new NPT_LogCustomHandler();
+ handler = instance;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogCustomHandler::Log
++---------------------------------------------------------------------*/
+void
+NPT_LogCustomHandler::Log(const NPT_LogRecord& record)
+{
+ if (s_ExternalFunction) {
+ (*s_ExternalFunction)(&record);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogConsoleHandler::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogConsoleHandler::Create(const char* logger_name,
+ NPT_LogHandler*& handler)
+{
+ /* compute a prefix for the configuration of this handler */
+ NPT_String logger_prefix = logger_name;
+ logger_prefix += ".ConsoleHandler";
+
+ /* allocate a new object */
+ NPT_LogConsoleHandler* instance = new NPT_LogConsoleHandler();
+ handler = instance;
+
+ /* configure the object */
+ NPT_String* colors;
+ instance->m_UseColors = NPT_LOG_CONSOLE_HANDLER_DEFAULT_COLOR_MODE;
+ colors = LogManager.GetConfigValue(logger_prefix,".colors");
+ if (colors) {
+ if (NPT_LogManager::ConfigValueIsBooleanTrue(*colors)) {
+ instance->m_UseColors = true;
+ } else if (NPT_LogManager::ConfigValueIsBooleanFalse(*colors)) {
+ instance->m_UseColors = false;
+ }
+ }
+
+ NPT_String* outputs;
+ instance->m_Outputs = NPT_CONFIG_DEFAULT_LOG_CONSOLE_HANDLER_OUTPUTS;
+ outputs = LogManager.GetConfigValue(logger_prefix,".outputs");
+ if (outputs) {
+ outputs->ToInteger(instance->m_Outputs, true);
+ }
+
+ NPT_String* filter;
+ instance->m_FormatFilter = 0;
+ filter = LogManager.GetConfigValue(logger_prefix,".filter");
+ if (filter) {
+ filter->ToInteger(instance->m_FormatFilter, true);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogConsoleHandler::Log
++---------------------------------------------------------------------*/
+void
+NPT_LogConsoleHandler::Log(const NPT_LogRecord& record)
+{
+ NPT_MemoryStream memory_stream(4096);
+
+ NPT_Log::FormatRecordToStream(record, memory_stream, m_UseColors, m_FormatFilter);
+ memory_stream.Write("\0", 1);
+ if (m_Outputs & OUTPUT_TO_CONSOLE) {
+ NPT_Console::Output((const char*)memory_stream.GetData());
+ }
+ if (m_Outputs & OUTPUT_TO_DEBUG) {
+ NPT_DebugOutput((const char*)memory_stream.GetData());
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogFileHandler::Log
++---------------------------------------------------------------------*/
+void
+NPT_LogFileHandler::Log(const NPT_LogRecord& record)
+{
+ if (m_MaxFilesize > 0) {
+ /* get current file size */
+ NPT_LargeSize size;
+ NPT_File::GetSize(m_Filename, size);
+
+ /* time to recycle ? */
+ if (size > m_MaxFilesize) {
+ /* release stream to force a reopen later
+ and to be able to rename file */
+ m_Stream = NULL;
+
+ /* rename file using current time */
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ NPT_String suffix = NPT_DateTime(now, true).ToString(NPT_DateTime::FORMAT_W3C);
+ suffix.Replace(':', '_');
+ NPT_String new_name = NPT_FilePath::Create(
+ NPT_FilePath::DirName(m_Filename),
+ NPT_FilePath::BaseName(m_Filename, false) +
+ "-" +
+ suffix +
+ NPT_FilePath::FileExtension(m_Filename));
+
+ NPT_File::Rename(m_Filename, new_name);
+ }
+ }
+
+ /* try to reopen the file if it failed to open
+ previously or if we rotated it */
+ if (m_Stream.IsNull()) {
+ Open(m_Append);
+ }
+
+ if (m_Stream.AsPointer()) {
+ NPT_Log::FormatRecordToStream(record, *m_Stream, false, m_FormatFilter);
+ if (m_Flush) m_Stream->Flush();
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogFileHandler::Open
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogFileHandler::Open(bool append /* = true */)
+{
+ /* reset stream just in case */
+ m_Stream = NULL;
+
+ /* open the log file */
+ NPT_File file(m_Filename);
+ NPT_Result result = file.Open(NPT_FILE_OPEN_MODE_CREATE |
+ NPT_FILE_OPEN_MODE_READ |
+ NPT_FILE_OPEN_MODE_WRITE |
+ (append?NPT_FILE_OPEN_MODE_APPEND:NPT_FILE_OPEN_MODE_TRUNCATE));
+ if (NPT_FAILED(result)) return result;
+
+ NPT_CHECK(file.GetOutputStream(m_Stream));
+ /* seek to end */
+ if (append) {
+ NPT_LargeSize size;
+ NPT_CHECK(NPT_File::GetSize(m_Filename, size));
+ NPT_CHECK(m_Stream->Seek(size));
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogFileHandler::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogFileHandler::Create(const char* logger_name,
+ NPT_LogHandler*& handler)
+{
+ /* compute a prefix for the configuration of this handler */
+ NPT_String logger_prefix = logger_name;
+ logger_prefix += ".FileHandler";
+
+ /* allocate a new object */
+ NPT_LogFileHandler* instance = new NPT_LogFileHandler();
+ handler = instance;
+
+ /* filename */
+ NPT_String* filename_conf = LogManager.GetConfigValue(logger_prefix, ".filename");
+ if (filename_conf) {
+ instance->m_Filename = *filename_conf;
+ } else if (logger_name[0]) {
+ NPT_String filename_synth = logger_name;
+ filename_synth += ".log";
+ instance->m_Filename = filename_synth;
+ } else {
+ /* default name for the root logger */
+ instance->m_Filename = NPT_CONFIG_DEFAULT_LOG_FILE_HANDLER_FILENAME;
+ }
+
+ /* always flush flag */
+ NPT_String* flush = LogManager.GetConfigValue(logger_prefix, ".flush");
+ if (flush && NPT_LogManager::ConfigValueIsBooleanTrue(*flush)) {
+ instance->m_Flush = true;
+ } else {
+ instance->m_Flush = false;
+ }
+
+ /* append mode */
+ instance->m_Append = true;
+ NPT_String* append_mode = LogManager.GetConfigValue(logger_prefix, ".append");
+ if (append_mode && NPT_LogManager::ConfigValueIsBooleanFalse(*append_mode)) {
+ instance->m_Append = false;
+ }
+
+ /* filter */
+ NPT_String* filter;
+ instance->m_FormatFilter = 0;
+ filter = LogManager.GetConfigValue(logger_prefix,".filter");
+ if (filter) {
+ filter->ToInteger(instance->m_FormatFilter, true);
+ }
+
+ /* recycle */
+ NPT_String* recycle;
+ instance->m_MaxFilesize = 0;
+ recycle = LogManager.GetConfigValue(logger_prefix,".recycle");
+ if (recycle) {
+ NPT_ParseInteger64(*recycle, instance->m_MaxFilesize, true);
+ if (instance->m_MaxFilesize < NPT_LOG_FILE_HANDLER_MIN_RECYCLE_SIZE) {
+ instance->m_MaxFilesize = NPT_LOG_FILE_HANDLER_MIN_RECYCLE_SIZE;
+ }
+ }
+
+ /* open the log file */
+ return instance->Open(instance->m_Append);
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogTcpHandler::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogTcpHandler::Create(const char* logger_name, NPT_LogHandler*& handler)
+{
+ /* compute a prefix for the configuration of this handler */
+ NPT_String logger_prefix = logger_name;
+ logger_prefix += ".TcpHandler";
+
+ /* allocate a new object */
+ NPT_LogTcpHandler* instance = new NPT_LogTcpHandler();
+ handler = instance;
+
+ /* configure the object */
+ const NPT_String* hostname = LogManager.GetConfigValue(logger_prefix, ".hostname");
+ if (hostname) {
+ instance->m_Host = *hostname;
+ } else {
+ /* default hostname */
+ instance->m_Host = "localhost";
+ }
+ const NPT_String* port = LogManager.GetConfigValue(logger_prefix, ".port");
+ if (port) {
+ NPT_UInt32 port_int;
+ if (NPT_SUCCEEDED(port->ToInteger(port_int, true))) {
+ instance->m_Port = (NPT_UInt16)port_int;
+ } else {
+ instance->m_Port = NPT_LOG_TCP_HANDLER_DEFAULT_PORT;
+ }
+ } else {
+ /* default port */
+ instance->m_Port = NPT_LOG_TCP_HANDLER_DEFAULT_PORT;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogTcpHandler::Connect
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogTcpHandler::Connect()
+{
+ /* create a socket */
+ NPT_TcpClientSocket tcp_socket;
+
+ /* connect to the host */
+ NPT_IpAddress ip_address;
+ NPT_CHECK(ip_address.ResolveName(m_Host));
+ NPT_Result result = tcp_socket.Connect(NPT_SocketAddress(ip_address, m_Port),
+ NPT_LOG_TCP_HANDLER_DEFAULT_CONNECT_TIMEOUT);
+ if (NPT_FAILED(result)) {
+ return result;
+ }
+
+ /* get the stream */
+ return tcp_socket.GetOutputStream(m_Stream);
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogTcpHandler::Log
++---------------------------------------------------------------------*/
+void
+NPT_LogTcpHandler::FormatRecord(const NPT_LogRecord& record, NPT_String& msg)
+{
+ /* format the record */
+ const char* level_name = NPT_Log::GetLogLevelName(record.m_Level);
+ NPT_String level_string;
+
+ /* format and emit the record */
+ if (level_name[0] == '\0') {
+ level_string = NPT_String::FromIntegerU(record.m_Level);
+ level_name = level_string;
+ }
+ msg.Reserve(2048);
+ msg += "Logger: ";
+ msg += record.m_LoggerName;
+ msg += "\r\nLevel: ";
+ msg += level_name;
+ msg += "\r\nSource-File: ";
+ msg += record.m_SourceFile;
+ msg += "\r\nSource-Function: ";
+ msg += record.m_SourceFunction;
+ msg += "\r\nSource-Line: ";
+ msg += NPT_String::FromIntegerU(record.m_SourceLine);
+ msg += "\r\nThread-Id: ";
+ msg += NPT_String::FromIntegerU(record.m_ThreadId);
+ msg += "\r\nTimeStamp: ";
+ msg += NPT_DateTime(record.m_TimeStamp, true).ToString(NPT_DateTime::FORMAT_W3C,
+ NPT_DateTime::FLAG_EMIT_FRACTION |
+ NPT_DateTime::FLAG_EXTENDED_PRECISION);
+ msg += "\r\nContent-Length: ";
+ msg += NPT_String::FromIntegerU(NPT_StringLength(record.m_Message));
+ msg += "\r\n\r\n";
+ msg += record.m_Message;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogTcpHandler::Log
++---------------------------------------------------------------------*/
+void
+NPT_LogTcpHandler::Log(const NPT_LogRecord& record)
+{
+ // ensure we're connected
+ if (m_Stream.IsNull()) {
+ if (NPT_FAILED(Connect())) return;
+ }
+
+ // format the record
+ NPT_String msg;
+ FormatRecord(record, msg);
+
+ // log, and disconnect if this fails
+ if (NPT_FAILED(m_Stream->WriteString(msg))) {
+ m_Stream = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogUdpHandler::Create
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_LogUdpHandler::Create(const char* logger_name, NPT_LogHandler*& handler)
+{
+ /* compute a prefix for the configuration of this handler */
+ NPT_String logger_prefix = logger_name;
+ logger_prefix += ".UdpHandler";
+
+ /* allocate a new object */
+ NPT_LogUdpHandler* instance = new NPT_LogUdpHandler();
+ handler = instance;
+
+ /* configure the object */
+ const char* hostname = "localhost";
+ const NPT_String* hostname_prop = LogManager.GetConfigValue(logger_prefix, ".hostname");
+ if (hostname_prop) {
+ hostname = hostname_prop->GetChars();
+ }
+ NPT_UInt32 port = NPT_LOG_UDP_HANDLER_DEFAULT_PORT;
+ const NPT_String* port_prop = LogManager.GetConfigValue(logger_prefix, ".port");
+ if (port_prop) {
+ if (NPT_FAILED(port_prop->ToInteger(port, true))) {
+ port = NPT_LOG_UDP_HANDLER_DEFAULT_PORT;
+ }
+ }
+
+ // resolve the target hostname
+ NPT_IpAddress target_ip;
+ target_ip.ResolveName(hostname);
+ instance->m_Target.SetIpAddress(target_ip);
+ instance->m_Target.SetPort(port);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_LogUdpHandler::Log
++---------------------------------------------------------------------*/
+void
+NPT_LogUdpHandler::Log(const NPT_LogRecord& record)
+{
+ // format the record
+ NPT_String msg;
+ NPT_LogTcpHandler::FormatRecord(record, msg);
+
+ // send it in a datagram
+ NPT_DataBuffer buffer(msg.GetChars(), msg.GetLength()+1, false);
+ m_Socket.Send(buffer, &m_Target);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpLoggerConfigurator::NPT_HttpLoggerConfigurator
++---------------------------------------------------------------------*/
+NPT_HttpLoggerConfigurator::NPT_HttpLoggerConfigurator(NPT_UInt16 port, bool detached) :
+ NPT_Thread(detached)
+{
+ // create the server
+ m_Server = new NPT_HttpServer(port);
+
+ // attach a handler to response to the requests
+ m_Server->AddRequestHandler(this, "/", true);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpLoggerConfigurator::~NPT_HttpLoggerConfigurator
++---------------------------------------------------------------------*/
+NPT_HttpLoggerConfigurator::~NPT_HttpLoggerConfigurator()
+{
+ // TODO: send a command to the server to tell it to abort
+
+ // cleanup
+ delete m_Server;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpLoggerConfigurator::SetupResponse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpLoggerConfigurator::SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& response)
+{
+ // we only support GET here
+ if (request.GetMethod() != NPT_HTTP_METHOD_GET) return NPT_ERROR_HTTP_METHOD_NOT_SUPPORTED;
+
+ // construct the response message
+ NPT_String msg;
+
+ msg = "<ul>";
+ NPT_List<NPT_LogConfigEntry>& config = LogManager.GetConfig();
+ NPT_List<NPT_LogConfigEntry>::Iterator cit = config.GetFirstItem();
+ for (; cit; ++cit) {
+ NPT_LogConfigEntry& entry = (*cit);
+ msg += "<li>";
+ msg += entry.m_Key;
+ msg += "=";
+ msg += entry.m_Value;
+ msg += "</li>";
+ }
+ msg += "</ul>";
+
+ msg += "<ul>";
+ NPT_List<NPT_Logger*>& loggers = LogManager.GetLoggers();
+ NPT_List<NPT_Logger*>::Iterator lit = loggers.GetFirstItem();
+ for (;lit;++lit) {
+ NPT_Logger* logger = (*lit);
+ msg += "<li>";
+ msg += logger->GetName();
+ msg += ", level=";
+ msg += NPT_String::FromInteger(logger->GetLevel());
+
+ NPT_List<NPT_LogHandler*>& handlers = logger->GetHandlers();
+ NPT_List<NPT_LogHandler*>::Iterator hit = handlers.GetFirstItem();
+ msg += ", handlers=";
+ for (;hit;++hit) {
+ NPT_LogHandler* handler = (*hit);
+ msg += handler->ToString();
+ }
+ msg += "</li>";
+ }
+ msg += "</ul>";
+
+ // setup the response body
+ NPT_HttpEntity* entity = response.GetEntity();
+ entity->SetContentType("text/html");
+ entity->SetInputStream(msg);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpLoggerConfigurator::Run
++---------------------------------------------------------------------*/
+void
+NPT_HttpLoggerConfigurator::Run()
+{
+ for (;;) {
+ NPT_Result result;
+ result = m_Server->Loop();
+ if (NPT_FAILED(result)) {
+ break;
+ }
+ }
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptLogging.h b/lib/libUPnP/Neptune/Source/Core/NptLogging.h
new file mode 100644
index 0000000..cbd98ca
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptLogging.h
@@ -0,0 +1,524 @@
+/*****************************************************************
+|
+| Neptune - Logging Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+/** @file
+* Header file for logging
+*/
+
+#ifndef _NPT_LOGGING_H_
+#define _NPT_LOGGING_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptTime.h"
+#include "NptStrings.h"
+#include "NptList.h"
+#include "NptStreams.h"
+#include "NptThreads.h"
+#include "NptHttp.h"
+
+/*----------------------------------------------------------------------
+| class references
++---------------------------------------------------------------------*/
+class NPT_LogManager;
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+class NPT_LogRecord {
+public:
+ const char* m_LoggerName;
+ int m_Level;
+ const char* m_Message;
+ NPT_TimeStamp m_TimeStamp;
+ const char* m_SourceFile;
+ unsigned int m_SourceLine;
+ const char* m_SourceFunction;
+ NPT_UInt64 m_ThreadId;
+};
+
+class NPT_LogHandler {
+public:
+ typedef void(*CustomHandlerExternalFunction)(const NPT_LogRecord* record);
+
+ // class methods
+ static NPT_Result SetCustomHandlerFunction(CustomHandlerExternalFunction function);
+ static NPT_Result Create(const char* logger_name,
+ const char* handler_name,
+ NPT_LogHandler*& handler);
+
+ // methods
+ virtual ~NPT_LogHandler() {}
+ virtual void Log(const NPT_LogRecord& record) = 0;
+ virtual NPT_String ToString() { return ""; }
+};
+
+class NPT_Logger {
+public:
+ // methods
+ NPT_Logger(const char* name, NPT_LogManager& manager);
+ ~NPT_Logger();
+ void Log(int level,
+ const char* source_file,
+ unsigned int source_line,
+ const char* source_function,
+ const char* msg,
+ ...)
+#ifdef __GNUC__
+ __attribute__ ((format (printf, 6, 7)))
+#endif
+ ;
+
+ NPT_Result AddHandler(NPT_LogHandler* handler, bool transfer_ownership = true);
+ NPT_Result DeleteHandlers();
+ NPT_Result SetParent(NPT_Logger* parent);
+ const NPT_String& GetName() const { return m_Name; }
+ int GetLevel() const { return m_Level; }
+ bool GetForwardToParent() const { return m_ForwardToParent; }
+ NPT_List<NPT_LogHandler*>& GetHandlers() { return m_Handlers; }
+
+private:
+ // members
+ NPT_LogManager& m_Manager;
+ NPT_String m_Name;
+ int m_Level;
+ bool m_LevelIsInherited;
+ bool m_ForwardToParent;
+ NPT_Logger* m_Parent;
+ NPT_List<NPT_LogHandler*> m_Handlers;
+ NPT_List<NPT_LogHandler*> m_ExternalHandlers;
+
+ // friends
+ friend class NPT_LogManager;
+};
+
+typedef struct {
+ NPT_Logger* logger;
+ const char* name;
+} NPT_LoggerReference;
+
+class NPT_Log {
+public:
+ // class methods
+ static int GetLogLevel(const char* name);
+ static const char* GetLogLevelName(int level);
+ static const char* GetLogLevelAnsiColor(int level);
+ static void FormatRecordToStream(const NPT_LogRecord& record,
+ NPT_OutputStream& stream,
+ bool use_colors,
+ NPT_Flags format_filter);
+};
+
+class NPT_LogConfigEntry {
+public:
+ NPT_LogConfigEntry(const char* key, const char* value) :
+ m_Key(key), m_Value(value) {}
+ NPT_String m_Key;
+ NPT_String m_Value;
+};
+
+class NPT_LogManager {
+public:
+ // class methods
+ static NPT_LogManager& GetDefault();
+ static bool ConfigValueIsBooleanTrue(NPT_String& value);
+ static bool ConfigValueIsBooleanFalse(NPT_String& value);
+ static NPT_Logger* GetLogger(const char* name);
+
+ // methods
+ NPT_LogManager();
+ ~NPT_LogManager();
+ NPT_Result Configure(const char* config_sources = NULL);
+ NPT_String* GetConfigValue(const char* prefix, const char* suffix);
+ NPT_List<NPT_Logger*>& GetLoggers() { return m_Loggers; }
+ NPT_List<NPT_LogConfigEntry>& GetConfig() { return m_Config; }
+ void SetEnabled(bool enabled) { m_Enabled = enabled; }
+ bool IsEnabled() { return m_Enabled; }
+ void Lock();
+ void Unlock();
+
+private:
+ // methods
+ NPT_Result SetConfigValue(const char* key, const char* value);
+ NPT_Result ParseConfig(const char* config, NPT_Size config_size);
+ NPT_Result ParseConfigSource(NPT_String& source);
+ NPT_Result ParseConfigFile(const char* filename);
+ bool HaveLoggerConfig(const char* name);
+ NPT_Logger* FindLogger(const char* name);
+ NPT_Result ConfigureLogger(NPT_Logger* logger);
+
+ // members
+ NPT_Mutex m_Lock;
+ NPT_Thread::ThreadId m_LockOwner;
+ unsigned int m_LockRecursion;
+ bool m_Enabled;
+ bool m_Configured;
+ NPT_List<NPT_LogConfigEntry> m_Config;
+ NPT_List<NPT_Logger*> m_Loggers;
+ NPT_Logger* m_Root;
+};
+
+const unsigned short NPT_HTTP_LOGGER_CONFIGURATOR_DEFAULT_PORT = 6378;
+class NPT_HttpLoggerConfigurator : NPT_HttpRequestHandler, public NPT_Thread {
+public:
+ // constructor and destructor
+ NPT_HttpLoggerConfigurator(NPT_UInt16 port = NPT_HTTP_LOGGER_CONFIGURATOR_DEFAULT_PORT,
+ bool detached = true);
+ ~NPT_HttpLoggerConfigurator() override;
+
+ // NPT_Runnable (NPT_Thread) methods
+ void Run() override;
+
+private:
+ // NPT_HttpRequestHandler methods
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+ // members
+ NPT_HttpServer* m_Server;
+};
+
+NPT_Result NPT_GetSystemLogConfig(NPT_String& config);
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define NPT_LOG_LEVEL_FATAL 700
+#define NPT_LOG_LEVEL_SEVERE 600
+#define NPT_LOG_LEVEL_WARNING 500
+#define NPT_LOG_LEVEL_INFO 400
+#define NPT_LOG_LEVEL_FINE 300
+#define NPT_LOG_LEVEL_FINER 200
+#define NPT_LOG_LEVEL_FINEST 100
+
+#define NPT_LOG_LEVEL_OFF 32767
+#define NPT_LOG_LEVEL_ALL 0
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define NPT_LOG_GET_LOGGER(_logger) \
+ if ((_logger).logger == NULL) { \
+ (_logger).logger = NPT_LogManager::GetLogger((_logger).name); \
+ }
+
+#if defined(NPT_CONFIG_ENABLE_LOGGING)
+
+#define NPT_DEFINE_LOGGER(_logger, _name) static volatile NPT_LoggerReference _logger = { NULL, (_name) };
+
+#define NPT_LOG_X(_logger, _level, _argsx) \
+do { \
+ NPT_LOG_GET_LOGGER((_logger)) \
+ if ((_logger).logger && (_level) >= (_logger).logger->GetLevel()) { \
+ (_logger).logger->Log _argsx; \
+ } \
+} while(0)
+
+#define NPT_CHECK_LL(_logger, _level, _result) do { \
+ NPT_Result _x = (_result); \
+ if (_x != NPT_SUCCESS) { \
+ NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),"NPT_CHECK failed, result=%d (%s) [%s]", _x, NPT_ResultText(_x), #_result)); \
+ return _x; \
+ } \
+} while(0)
+
+#define NPT_CHECK_LABEL_LL(_logger, _level, _result, _label) do { \
+ NPT_Result _x = (_result); \
+ if (_x != NPT_SUCCESS) { \
+ NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),"NPT_CHECK failed, result=%d (%s) [%s]", _x, NPT_ResultText(_x), #_result)); \
+ goto _label; \
+ } \
+} while(0)
+#define NPT_CHECK_POINTER_LL(_logger, _level, _p) do { \
+ if ((_p) == NULL) { \
+ NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),"@@@ NULL pointer parameter")); \
+ return NPT_ERROR_INVALID_PARAMETERS; \
+ } \
+} while(0)
+#define NPT_CHECK_POINTER_LABEL_LL(_logger, _level, _p, _label) do { \
+ if ((_p) == NULL) { \
+ NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),"@@@ NULL pointer parameter")); \
+ goto _label; \
+ } \
+} while(0)
+
+#else /* NPT_CONFIG_ENABLE_LOGGING */
+
+#define NPT_DEFINE_LOGGER(_logger, _name)
+#define NPT_LOG_X(_logger, _level, _argsx)
+#define NPT_CHECK_LL(_logger, _level, _result) NPT_CHECK(_result)
+#define NPT_CHECK_LABEL_LL(_logger, _level, _result, _label) NPT_CHECK_LABEL((_result), _label)
+#define NPT_CHECK_POINTER_LL(_logger, _level, _p) NPT_CHECK_POINTER((_p))
+#define NPT_CHECK_POINTER_LABEL_LL(_logger, _level, _p, _label) NPT_CHECK_POINTER_LABEL((_p), _label)
+
+#endif /* NPT_CONFIG_ENABLE_LOGGING */
+
+#define NPT_SET_LOCAL_LOGGER(_name) NPT_DEFINE_LOGGER(_NPT_LocalLogger, (_name))
+#define NPT_CHECK_L(_level, _result) NPT_CHECK_LL(_NPT_LocalLogger, (_level), (_result))
+#define NPT_CHECK_LABEL_L(_level, _result, _label) NPT_CHECK_LABEL_LL(_NPT_LocalLogger, (_level), NULL, (_result), _label)
+
+/* NOTE: the following are machine-generated, do not edit */
+#define NPT_LOG_LL(_logger,_level,_msg) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg)))
+#define NPT_LOG(_level,_msg) NPT_LOG_LL((_NPT_LocalLogger),(_level),(_msg))
+#define NPT_LOG_L(_logger,_level,_msg) NPT_LOG_LL((_logger),(_level),(_msg))
+#define NPT_LOG_LL1(_logger,_level,_msg,_arg1) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg),(_arg1)))
+#define NPT_LOG_1(_level,_msg,_arg1) NPT_LOG_LL1((_NPT_LocalLogger),(_level),(_msg),(_arg1))
+#define NPT_LOG_L1(_logger,_level,_msg,_arg1) NPT_LOG_LL1((_logger),(_level),(_msg),(_arg1))
+#define NPT_LOG_LL2(_logger,_level,_msg,_arg1,_arg2) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg),(_arg1),(_arg2)))
+#define NPT_LOG_2(_level,_msg,_arg1,_arg2) NPT_LOG_LL2((_NPT_LocalLogger),(_level),(_msg),(_arg1),(_arg2))
+#define NPT_LOG_L2(_logger,_level,_msg,_arg1,_arg2) NPT_LOG_LL2((_logger),(_level),(_msg),(_arg1),(_arg2))
+#define NPT_LOG_LL3(_logger,_level,_msg,_arg1,_arg2,_arg3) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg),(_arg1),(_arg2),(_arg3)))
+#define NPT_LOG_3(_level,_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_NPT_LocalLogger),(_level),(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_L3(_logger,_level,_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_logger),(_level),(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_LL4(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg),(_arg1),(_arg2),(_arg3),(_arg4)))
+#define NPT_LOG_4(_level,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_NPT_LocalLogger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_L4(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_logger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_LL5(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5)))
+#define NPT_LOG_5(_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_NPT_LocalLogger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_L5(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_logger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_LL6(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6)))
+#define NPT_LOG_6(_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_NPT_LocalLogger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_L6(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_logger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_LL7(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7)))
+#define NPT_LOG_7(_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_NPT_LocalLogger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_L7(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_logger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_LL8(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8)))
+#define NPT_LOG_8(_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_NPT_LocalLogger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_L8(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_logger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_LL9(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9)))
+#define NPT_LOG_9(_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_NPT_LocalLogger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_L9(_logger,_level,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_logger),(_level),(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+
+#define NPT_LOG_FATAL(_msg) NPT_LOG_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg))
+#define NPT_LOG_FATAL_L(_logger,_msg) NPT_LOG_LL((_logger),NPT_LOG_LEVEL_FATAL,(_msg))
+#define NPT_LOG_FATAL_1(_msg,_arg1) NPT_LOG_LL1((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1))
+#define NPT_LOG_FATAL_L1(_logger,_msg,_arg1) NPT_LOG_LL1((_logger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1))
+#define NPT_LOG_FATAL_2(_msg,_arg1,_arg2) NPT_LOG_LL2((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_FATAL_L2(_logger,_msg,_arg1,_arg2) NPT_LOG_LL2((_logger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_FATAL_3(_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_FATAL_L3(_logger,_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_logger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_FATAL_4(_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_FATAL_L4(_logger,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_logger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_FATAL_5(_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_FATAL_L5(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_logger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_FATAL_6(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_FATAL_L6(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_logger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_FATAL_7(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_FATAL_L7(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_logger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_FATAL_8(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_FATAL_L8(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_logger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_FATAL_9(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_FATAL_L9(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_logger),NPT_LOG_LEVEL_FATAL,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_SEVERE(_msg) NPT_LOG_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg))
+#define NPT_LOG_SEVERE_L(_logger,_msg) NPT_LOG_LL((_logger),NPT_LOG_LEVEL_SEVERE,(_msg))
+#define NPT_LOG_SEVERE_1(_msg,_arg1) NPT_LOG_LL1((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1))
+#define NPT_LOG_SEVERE_L1(_logger,_msg,_arg1) NPT_LOG_LL1((_logger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1))
+#define NPT_LOG_SEVERE_2(_msg,_arg1,_arg2) NPT_LOG_LL2((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_SEVERE_L2(_logger,_msg,_arg1,_arg2) NPT_LOG_LL2((_logger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_SEVERE_3(_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_SEVERE_L3(_logger,_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_logger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_SEVERE_4(_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_SEVERE_L4(_logger,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_logger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_SEVERE_5(_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_SEVERE_L5(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_logger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_SEVERE_6(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_SEVERE_L6(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_logger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_SEVERE_7(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_SEVERE_L7(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_logger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_SEVERE_8(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_SEVERE_L8(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_logger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_SEVERE_9(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_SEVERE_L9(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_logger),NPT_LOG_LEVEL_SEVERE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_WARNING(_msg) NPT_LOG_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg))
+#define NPT_LOG_WARNING_L(_logger,_msg) NPT_LOG_LL((_logger),NPT_LOG_LEVEL_WARNING,(_msg))
+#define NPT_LOG_WARNING_1(_msg,_arg1) NPT_LOG_LL1((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1))
+#define NPT_LOG_WARNING_L1(_logger,_msg,_arg1) NPT_LOG_LL1((_logger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1))
+#define NPT_LOG_WARNING_2(_msg,_arg1,_arg2) NPT_LOG_LL2((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_WARNING_L2(_logger,_msg,_arg1,_arg2) NPT_LOG_LL2((_logger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_WARNING_3(_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_WARNING_L3(_logger,_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_logger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_WARNING_4(_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_WARNING_L4(_logger,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_logger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_WARNING_5(_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_WARNING_L5(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_logger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_WARNING_6(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_WARNING_L6(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_logger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_WARNING_7(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_WARNING_L7(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_logger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_WARNING_8(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_WARNING_L8(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_logger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_WARNING_9(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_WARNING_L9(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_logger),NPT_LOG_LEVEL_WARNING,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_INFO(_msg) NPT_LOG_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg))
+#define NPT_LOG_INFO_L(_logger,_msg) NPT_LOG_LL((_logger),NPT_LOG_LEVEL_INFO,(_msg))
+#define NPT_LOG_INFO_1(_msg,_arg1) NPT_LOG_LL1((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1))
+#define NPT_LOG_INFO_L1(_logger,_msg,_arg1) NPT_LOG_LL1((_logger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1))
+#define NPT_LOG_INFO_2(_msg,_arg1,_arg2) NPT_LOG_LL2((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_INFO_L2(_logger,_msg,_arg1,_arg2) NPT_LOG_LL2((_logger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_INFO_3(_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_INFO_L3(_logger,_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_logger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_INFO_4(_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_INFO_L4(_logger,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_logger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_INFO_5(_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_INFO_L5(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_logger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_INFO_6(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_INFO_L6(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_logger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_INFO_7(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_INFO_L7(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_logger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_INFO_8(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_INFO_L8(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_logger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_INFO_9(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_INFO_L9(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_logger),NPT_LOG_LEVEL_INFO,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_FINE(_msg) NPT_LOG_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg))
+#define NPT_LOG_FINE_L(_logger,_msg) NPT_LOG_LL((_logger),NPT_LOG_LEVEL_FINE,(_msg))
+#define NPT_LOG_FINE_1(_msg,_arg1) NPT_LOG_LL1((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1))
+#define NPT_LOG_FINE_L1(_logger,_msg,_arg1) NPT_LOG_LL1((_logger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1))
+#define NPT_LOG_FINE_2(_msg,_arg1,_arg2) NPT_LOG_LL2((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_FINE_L2(_logger,_msg,_arg1,_arg2) NPT_LOG_LL2((_logger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_FINE_3(_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_FINE_L3(_logger,_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_logger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_FINE_4(_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_FINE_L4(_logger,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_logger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_FINE_5(_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_FINE_L5(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_logger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_FINE_6(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_FINE_L6(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_logger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_FINE_7(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_FINE_L7(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_logger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_FINE_8(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_FINE_L8(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_logger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_FINE_9(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_FINE_L9(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_logger),NPT_LOG_LEVEL_FINE,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_FINER(_msg) NPT_LOG_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg))
+#define NPT_LOG_FINER_L(_logger,_msg) NPT_LOG_LL((_logger),NPT_LOG_LEVEL_FINER,(_msg))
+#define NPT_LOG_FINER_1(_msg,_arg1) NPT_LOG_LL1((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1))
+#define NPT_LOG_FINER_L1(_logger,_msg,_arg1) NPT_LOG_LL1((_logger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1))
+#define NPT_LOG_FINER_2(_msg,_arg1,_arg2) NPT_LOG_LL2((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_FINER_L2(_logger,_msg,_arg1,_arg2) NPT_LOG_LL2((_logger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_FINER_3(_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_FINER_L3(_logger,_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_logger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_FINER_4(_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_FINER_L4(_logger,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_logger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_FINER_5(_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_FINER_L5(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_logger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_FINER_6(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_FINER_L6(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_logger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_FINER_7(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_FINER_L7(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_logger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_FINER_8(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_FINER_L8(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_logger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_FINER_9(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_FINER_L9(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_logger),NPT_LOG_LEVEL_FINER,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_FINEST(_msg) NPT_LOG_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg))
+#define NPT_LOG_FINEST_L(_logger,_msg) NPT_LOG_LL((_logger),NPT_LOG_LEVEL_FINEST,(_msg))
+#define NPT_LOG_FINEST_1(_msg,_arg1) NPT_LOG_LL1((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1))
+#define NPT_LOG_FINEST_L1(_logger,_msg,_arg1) NPT_LOG_LL1((_logger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1))
+#define NPT_LOG_FINEST_2(_msg,_arg1,_arg2) NPT_LOG_LL2((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_FINEST_L2(_logger,_msg,_arg1,_arg2) NPT_LOG_LL2((_logger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2))
+#define NPT_LOG_FINEST_3(_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_FINEST_L3(_logger,_msg,_arg1,_arg2,_arg3) NPT_LOG_LL3((_logger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3))
+#define NPT_LOG_FINEST_4(_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_FINEST_L4(_logger,_msg,_arg1,_arg2,_arg3,_arg4) NPT_LOG_LL4((_logger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4))
+#define NPT_LOG_FINEST_5(_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_FINEST_L5(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5) NPT_LOG_LL5((_logger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5))
+#define NPT_LOG_FINEST_6(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_FINEST_L6(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6) NPT_LOG_LL6((_logger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6))
+#define NPT_LOG_FINEST_7(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_FINEST_L7(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7) NPT_LOG_LL7((_logger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7))
+#define NPT_LOG_FINEST_8(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_FINEST_L8(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8) NPT_LOG_LL8((_logger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8))
+#define NPT_LOG_FINEST_9(_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+#define NPT_LOG_FINEST_L9(_logger,_msg,_arg1,_arg2,_arg3,_arg4,_arg5,_arg6,_arg7,_arg8,_arg9) NPT_LOG_LL9((_logger),NPT_LOG_LEVEL_FINEST,(_msg),(_arg1),(_arg2),(_arg3),(_arg4),(_arg5),(_arg6),(_arg7),(_arg8),(_arg9))
+
+#define NPT_CHECK_FATAL(_result) NPT_CHECK_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_result))
+#define NPT_CHECK_FATAL_L(_logger,_result) NPT_CHECK_LL((_logger),NPT_LOG_LEVEL_FATAL,(_result))
+#define NPT_CHECK_SEVERE(_result) NPT_CHECK_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_result))
+#define NPT_CHECK_SEVERE_L(_logger,_result) NPT_CHECK_LL((_logger),NPT_LOG_LEVEL_SEVERE,(_result))
+#define NPT_CHECK_WARNING(_result) NPT_CHECK_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_result))
+#define NPT_CHECK_WARNING_L(_logger,_result) NPT_CHECK_LL((_logger),NPT_LOG_LEVEL_WARNING,(_result))
+#define NPT_CHECK_INFO(_result) NPT_CHECK_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_result))
+#define NPT_CHECK_INFO_L(_logger,_result) NPT_CHECK_LL((_logger),NPT_LOG_LEVEL_INFO,(_result))
+#define NPT_CHECK_FINE(_result) NPT_CHECK_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_result))
+#define NPT_CHECK_FINE_L(_logger,_result) NPT_CHECK_LL((_logger),NPT_LOG_LEVEL_FINE,(_result))
+#define NPT_CHECK_FINER(_result) NPT_CHECK_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_result))
+#define NPT_CHECK_FINER_L(_logger,_result) NPT_CHECK_LL((_logger),NPT_LOG_LEVEL_FINER,(_result))
+#define NPT_CHECK_FINEST(_result) NPT_CHECK_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_result))
+#define NPT_CHECK_FINEST_L(_logger,_result) NPT_CHECK_LL((_logger),NPT_LOG_LEVEL_FINEST,(_result))
+
+#define NPT_CHECK_LABEL_FATAL(_result,_label) NPT_CHECK_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_result),_label)
+#define NPT_CHECK_LABEL_FATAL_L(_logger,_result,_label) NPT_CHECK_LABEL_LL((_logger),NPT_LOG_LEVEL_FATAL,(_result),_label)
+#define NPT_CHECK_LABEL_SEVERE(_result,_label) NPT_CHECK_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_result),_label)
+#define NPT_CHECK_LABEL_SEVERE_L(_logger,_result,_label) NPT_CHECK_LABEL_LL((_logger),NPT_LOG_LEVEL_SEVERE,(_result),_label)
+#define NPT_CHECK_LABEL_WARNING(_result,_label) NPT_CHECK_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_result),_label)
+#define NPT_CHECK_LABEL_WARNING_L(_logger,_result,_label) NPT_CHECK_LABEL_LL((_logger),NPT_LOG_LEVEL_WARNING,(_result),_label)
+#define NPT_CHECK_LABEL_INFO(_result,_label) NPT_CHECK_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_result),_label)
+#define NPT_CHECK_LABEL_INFO_L(_logger,_result,_label) NPT_CHECK_LABEL_LL((_logger),NPT_LOG_LEVEL_INFO,(_result),_label)
+#define NPT_CHECK_LABEL_FINE(_result,_label) NPT_CHECK_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_result),_label)
+#define NPT_CHECK_LABEL_FINE_L(_logger,_result,_label) NPT_CHECK_LABEL_LL((_logger),NPT_LOG_LEVEL_FINE,(_result),_label)
+#define NPT_CHECK_LABEL_FINER(_result,_label) NPT_CHECK_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_result),_label)
+#define NPT_CHECK_LABEL_FINER_L(_logger,_result,_label) NPT_CHECK_LABEL_LL((_logger),NPT_LOG_LEVEL_FINER,(_result),_label)
+#define NPT_CHECK_LABEL_FINEST(_result,_label) NPT_CHECK_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_result),_label)
+#define NPT_CHECK_LABEL_FINEST_L(_logger,_result,_label) NPT_CHECK_LABEL_LL((_logger),NPT_LOG_LEVEL_FINEST,(_result),_label)
+
+#define NPT_CHECK_POINTER_FATAL(_p) NPT_CHECK_POINTER_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_p))
+#define NPT_CHECK_POINTER_FATAL_L(_logger,_p) NPT_CHECK_POINTER_LL(_logger,NPT_LOG_LEVEL_FATAL,(_p))
+#define NPT_CHECK_POINTER_SEVERE(_p) NPT_CHECK_POINTER_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_p))
+#define NPT_CHECK_POINTER_SEVERE_L(_logger,_p) NPT_CHECK_POINTER_LL(_logger,NPT_LOG_LEVEL_SEVERE,(_p))
+#define NPT_CHECK_POINTER_WARNING(_p) NPT_CHECK_POINTER_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_p))
+#define NPT_CHECK_POINTER_WARNING_L(_logger,_p) NPT_CHECK_POINTER_LL(_logger,NPT_LOG_LEVEL_WARNING,(_p))
+#define NPT_CHECK_POINTER_INFO(_p) NPT_CHECK_POINTER_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_p))
+#define NPT_CHECK_POINTER_INFO_L(_logger,_p) NPT_CHECK_POINTER_LL(_logger,NPT_LOG_LEVEL_INFO,(_p))
+#define NPT_CHECK_POINTER_FINE(_p) NPT_CHECK_POINTER_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_p))
+#define NPT_CHECK_POINTER_FINE_L(_logger,_p) NPT_CHECK_POINTER_LL(_logger,NPT_LOG_LEVEL_FINE,(_p))
+#define NPT_CHECK_POINTER_FINER(_p) NPT_CHECK_POINTER_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_p))
+#define NPT_CHECK_POINTER_FINER_L(_logger,_p) NPT_CHECK_POINTER_LL(_logger,NPT_LOG_LEVEL_FINER,(_p))
+#define NPT_CHECK_POINTER_FINEST(_p) NPT_CHECK_POINTER_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_p))
+#define NPT_CHECK_POINTER_FINEST_L(_logger,_p) NPT_CHECK_POINTER_LL(_logger,NPT_LOG_LEVEL_FINEST,(_p))
+
+#define NPT_CHECK_POINTER_LABEL_FATAL(_p,_label) NPT_CHECK_POINTER_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FATAL,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_FATAL_L(_logger,_p,_label) NPT_CHECK_POINTER_LABEL_LL(_logger,NPT_LOG_LEVEL_FATAL,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_SEVERE(_p,_label) NPT_CHECK_POINTER_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_SEVERE,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_SEVERE_L(_logger,_p,_label) NPT_CHECK_POINTER_LABEL_LL(_logger,NPT_LOG_LEVEL_SEVERE,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_WARNING(_p,_label) NPT_CHECK_POINTER_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_WARNING,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_WARNING_L(_logger,_p,_label) NPT_CHECK_POINTER_LABEL_LL(_logger,NPT_LOG_LEVEL_WARNING,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_INFO(_p,_label) NPT_CHECK_POINTER_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_INFO,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_INFO_L(_logger,_p,_label) NPT_CHECK_POINTER_LABEL_LL(_logger,NPT_LOG_LEVEL_INFO,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_FINE(_p, _label) NPT_CHECK_POINTER_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINE,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_FINE_L(_logger,_p,_label) NPT_CHECK_POINTER_LABEL_LL(_logger,NPT_LOG_LEVEL_FINE,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_FINER(_p,_label) NPT_CHECK_POINTER_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINER,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_FINER_L(_logger,_p,_label) NPT_CHECK_POINTER_LABEL_LL(_logger,NPT_LOG_LEVEL_FINER,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_FINEST(_p,_label) NNPT_CHECK_POINTER_LABEL_LL((_NPT_LocalLogger),NPT_LOG_LEVEL_FINEST,(_p),_label)
+#define NPT_CHECK_POINTER_LABEL_FINEST_L(_logger,_p,_label) NPT_CHECK_POINTER_LABEL_LL(_logger,NPT_LOG_LEVEL_FINEST,(_p),_label)
+
+#endif /* _NPT_LOGGING_H_ */
diff --git a/lib/libUPnP/Neptune/Source/Core/NptMap.h b/lib/libUPnP/Neptune/Source/Core/NptMap.h
new file mode 100644
index 0000000..75acbbe
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptMap.h
@@ -0,0 +1,807 @@
+/*****************************************************************
+|
+| Neptune - Maps
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+#ifndef _NPT_MAP_H_
+#define _NPT_MAP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptResults.h"
+#include "NptList.h"
+#include "NptHash.h"
+
+/*----------------------------------------------------------------------
+| NPT_Map
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+class NPT_Map
+{
+public:
+ // types
+ class Entry {
+ public:
+ // constructor
+ Entry(const K& key, const V& value) : m_Key(key), m_Value(value) {}
+ Entry(const K& key) : m_Key(key), m_Value() {}
+
+ // accessors
+ const K& GetKey() const { return m_Key; }
+ const V& GetValue() const { return m_Value; }
+
+ // operators
+ bool operator==(const Entry& other) const {
+ return m_Key == other.m_Key && m_Value == other.m_Value;
+ }
+
+ protected:
+ // methods
+ void SetValue(const V& value) { m_Value = value; }
+
+ // members
+ K m_Key;
+ V m_Value;
+
+ // friends
+ friend class NPT_Map<K,V>;
+ };
+
+ // constructors
+ NPT_Map<K,V>() {}
+ NPT_Map<K,V>(const NPT_Map<K,V>& copy);
+
+ // destructor
+ ~NPT_Map<K,V>();
+
+ // methods
+ NPT_Result Put(const K& key, const V& value);
+ NPT_Result Get(const K& key, V*& value) const; // WARNING: the second parameter is a POINTER on the value type!!!
+ bool HasKey(const K& key) const { return GetEntry(key) != NULL; }
+ bool HasValue(const V& value) const;
+ NPT_Result Erase(const K& key);
+ NPT_Cardinal GetEntryCount() const { return m_Entries.GetItemCount(); }
+ const NPT_List<Entry*>& GetEntries() const { return m_Entries; }
+ NPT_Result Clear();
+
+ // operators
+ V& operator[](const K& key);
+ const NPT_Map<K,V>& operator=(const NPT_Map<K,V>& copy);
+ bool operator==(const NPT_Map<K,V>& other) const;
+ bool operator!=(const NPT_Map<K,V>& other) const;
+
+private:
+ // types
+ typedef typename NPT_List<Entry*>::Iterator ListIterator;
+
+ // methods
+ Entry* GetEntry(const K& key) const;
+
+ // members
+ NPT_List<Entry*> m_Entries;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::NPT_Map<K,V>
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+NPT_Map<K,V>::NPT_Map(const NPT_Map<K,V>& copy)
+{
+ *this = copy;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::~NPT_Map<K,V>
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+NPT_Map<K,V>::~NPT_Map()
+{
+ // call Clear to ensure we delete all entry objects
+ Clear();
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::Clear
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+NPT_Result
+NPT_Map<K,V>::Clear()
+{
+ m_Entries.Apply(NPT_ObjectDeleter<Entry>());
+ m_Entries.Clear();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::GetEntry
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+typename NPT_Map<K,V>::Entry*
+NPT_Map<K,V>::GetEntry(const K& key) const
+{
+ typename NPT_List<Entry*>::Iterator entry = m_Entries.GetFirstItem();
+ while (entry) {
+ if ((*entry)->GetKey() == key) {
+ return *entry;
+ }
+ ++entry;
+ }
+
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::Put
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+NPT_Result
+NPT_Map<K,V>::Put(const K& key, const V& value)
+{
+ Entry* entry = GetEntry(key);
+ if (entry == NULL) {
+ // no existing entry for that key, create one
+ m_Entries.Add(new Entry(key, value));
+ } else {
+ // replace the existing entry for that key
+ entry->SetValue(value);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::Get
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+NPT_Result
+NPT_Map<K,V>::Get(const K& key, V*& value) const
+{
+ Entry* entry = GetEntry(key);
+ if (entry == NULL) {
+ // no existing entry for that key
+ value = NULL;
+ return NPT_ERROR_NO_SUCH_ITEM;
+ } else {
+ // found an entry with that key
+ value = &entry->m_Value;
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::HasValue
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+bool
+NPT_Map<K,V>::HasValue(const V& value) const
+{
+ ListIterator entry = m_Entries.GetFirstItem();
+ while (entry) {
+ if (value == (*entry)->m_Value) {
+ return true;
+ }
+ ++entry;
+ }
+
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::operator=
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+const NPT_Map<K,V>&
+NPT_Map<K,V>::operator=(const NPT_Map<K,V>& copy)
+{
+ // do nothing if we're assigning to ourselves
+ if (this == &copy) return copy;
+
+ // destroy all entries
+ Clear();
+
+ // copy all entries one by one
+ ListIterator entry = copy.m_Entries.GetFirstItem();
+ while (entry) {
+ m_Entries.Add(new Entry((*entry)->GetKey(), (*entry)->GetValue()));
+ ++entry;
+ }
+
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::Erase
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+NPT_Result
+NPT_Map<K,V>::Erase(const K& key)
+{
+ ListIterator entry = m_Entries.GetFirstItem();
+ while (entry) {
+ if ((*entry)->GetKey() == key) {
+ delete *entry; // do this before removing the entry from the
+ // list, because Erase() will invalidate the
+ // iterator item
+ m_Entries.Erase(entry);
+ return NPT_SUCCESS;
+ }
+ ++entry;
+ }
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::operator==
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+bool
+NPT_Map<K,V>::operator==(const NPT_Map<K,V>& other) const
+{
+ // quick test
+ if (m_Entries.GetItemCount() != other.m_Entries.GetItemCount()) return false;
+
+ // compare all entries to all other entries
+ ListIterator entry = m_Entries.GetFirstItem();
+ while (entry) {
+ V* value;
+ if (NPT_SUCCEEDED(other.Get((*entry)->m_Key, value))) {
+ // the other map has an entry for this key, check the value
+ if (!(*value == (*entry)->m_Value)) return false;
+ } else {
+ // the other map does not have an entry for this key
+ return false;
+ }
+ ++entry;
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::operator!=
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+bool
+NPT_Map<K,V>::operator!=(const NPT_Map<K,V>& other) const
+{
+ return !(*this == other);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Map<K,V>::operator[]
++---------------------------------------------------------------------*/
+template <typename K, typename V>
+V&
+NPT_Map<K,V>::operator[](const K& key)
+{
+ Entry* entry = GetEntry(key);
+ if (entry == NULL) {
+ // create a new "default" entry for this key
+ entry = new Entry(key);
+ m_Entries.Add(entry);
+ }
+
+ return entry->m_Value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF = NPT_Hash<K> >
+class NPT_HashMap
+{
+public:
+ // types
+ class Entry {
+ public:
+ // constructor
+ Entry(NPT_UInt32 hash_value, const K& key, const V& value) : m_HashValue(hash_value), m_Key(key), m_Value(value) {}
+ Entry(NPT_UInt32 hash_value, const K& key) : m_HashValue(hash_value), m_Key(key), m_Value() {}
+
+ // accessors
+ const K& GetKey() const { return m_Key; }
+ const V& GetValue() const { return m_Value; }
+ NPT_UInt32 GetHashValue() const { return m_HashValue; }
+
+ // operators
+ bool operator==(const Entry& other) const {
+ return m_HashValue == other.m_HashValue && m_Key == other.m_Key && m_Value == other.m_Value;
+ }
+
+ protected:
+ // methods
+ void SetValue(const V& value) { m_Value = value; }
+
+ // members
+ NPT_UInt32 m_HashValue;
+ K m_Key;
+ V m_Value;
+
+ // friends
+ friend class NPT_HashMap<K,V,HF>;
+ };
+
+ class Iterator {
+ public:
+ Iterator() : m_Entry(NULL), m_Map(NULL) {}
+ Iterator(Entry** entry, const NPT_HashMap<K,V,HF>* map) : m_Entry(entry), m_Map(map) {}
+ Iterator(const Iterator& copy) : m_Entry(copy.m_Entry), m_Map(copy.m_Map) {}
+ const Entry& operator*() const { return **m_Entry; }
+ Iterator& operator++() { // prefix
+ if (m_Map && m_Entry) {
+ do {
+ ++m_Entry;
+ if (m_Entry >= &m_Map->m_Buckets[1<<m_Map->m_BucketCountLog]) {
+ m_Entry = NULL;
+ } else {
+ if (*m_Entry) break;
+ }
+ } while (m_Entry);
+ }
+ return (*this);
+ }
+ Iterator operator++(int) { // postfix
+ Iterator saved_this = *this;
+ ++(*this);
+ return saved_this;
+ }
+ operator bool() const {
+ return m_Entry != NULL;
+ }
+ bool operator==(const Iterator& other) const {
+ return m_Map == other.m_Map && m_Entry == other.m_Entry;
+ }
+ bool operator!=(const Iterator& other) const {
+ return !(*this == other);
+ }
+ void operator=(const Iterator& other) {
+ m_Entry = other.m_Entry;
+ m_Map = other.m_Map;
+ }
+
+ private:
+ // friends
+ friend class NPT_HashMap<K,V,HF>;
+
+ // members
+ Entry** m_Entry;
+ const NPT_HashMap<K,V,HF>* m_Map;
+ };
+
+ // constructors
+ NPT_HashMap<K,V,HF>();
+ NPT_HashMap<K,V,HF>(const HF& hasher);
+ NPT_HashMap<K,V,HF>(const NPT_HashMap<K,V,HF>& copy);
+
+ // destructor
+ ~NPT_HashMap<K,V,HF>();
+
+ // methods
+ NPT_Result Put(const K& key, const V& value);
+ NPT_Result Get(const K& key, V*& value) const; // WARNING: the second parameter is a POINTER on the value type!!!
+ bool HasKey(const K& key) const { return GetEntry(key) != NULL; }
+ bool HasValue(const V& value) const;
+ NPT_Result Erase(const K& key);
+ NPT_Cardinal GetEntryCount() const { return m_EntryCount; }
+ Iterator GetEntries() const;
+ NPT_Result Clear();
+
+ // list operations
+ // keep these template members defined here because MSV6 does not let
+ // us define them later
+ template <typename X>
+ NPT_Result Apply(const X& function) const
+ {
+ for (int i=0; i<(1<<m_BucketCountLog); i++) {
+ if (m_Buckets[i]) {
+ function(m_Buckets[i]);
+ }
+ }
+ return NPT_SUCCESS;
+ }
+
+ // operators
+ V& operator[](const K& key);
+ const NPT_HashMap<K,V,HF>& operator=(const NPT_HashMap<K,V,HF>& copy);
+ bool operator==(const NPT_HashMap<K,V,HF>& other) const;
+ bool operator!=(const NPT_HashMap<K,V,HF>& other) const;
+
+private:
+ // methods
+ Entry* GetEntry(const K& key, NPT_UInt32* position=NULL) const;
+ NPT_Result AddEntry(Entry* entry);
+ void AllocateBuckets(unsigned int count_log);
+ void AdjustBuckets(NPT_Cardinal entry_count, bool allow_shrink=false);
+
+ // members
+ HF m_Hasher;
+ Entry** m_Buckets;
+ NPT_Cardinal m_BucketCountLog;
+ NPT_Cardinal m_EntryCount;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V>::NPT_HashMap
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+NPT_HashMap<K,V,HF>::NPT_HashMap() :
+ m_Buckets(NULL),
+ m_EntryCount(0)
+{
+ AllocateBuckets(4);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V>::NPT_HashMap
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+NPT_HashMap<K,V,HF>::NPT_HashMap(const HF& hasher) :
+ m_Hasher(hasher),
+ m_Buckets(NULL),
+ m_EntryCount(0)
+{
+ AllocateBuckets(4);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V>::NPT_HashMap
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+NPT_HashMap<K,V,HF>::NPT_HashMap(const NPT_HashMap<K,V,HF>& copy) :
+ m_Buckets(NULL),
+ m_BucketCountLog(0),
+ m_EntryCount(0)
+{
+ *this = copy;
+}
+
+/*----------------------------------------------------------------------
+| NPT_MapMap<K,V,HF>::NPT_HashMap
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+NPT_HashMap<K,V,HF>::~NPT_HashMap()
+{
+ for (int i=0; i<(1<<m_BucketCountLog); i++) {
+ delete m_Buckets[i];
+ }
+ delete[] m_Buckets;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::AllocateBuckets
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+void
+NPT_HashMap<K,V,HF>::AllocateBuckets(unsigned int count_log)
+{
+ m_Buckets = new Entry*[1<<count_log];
+ m_BucketCountLog = count_log;
+ for (int i=0; i<(1<<count_log); i++) {
+ m_Buckets[i] = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::AdjustBuckets
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+void
+NPT_HashMap<K,V,HF>::AdjustBuckets(NPT_Cardinal entry_count, bool allow_shrink)
+{
+ Entry** buckets = NULL;
+ unsigned int bucket_count = 1<<m_BucketCountLog;
+ if (2*entry_count >= bucket_count) {
+ // we need to grow
+ buckets = m_Buckets;
+ AllocateBuckets(m_BucketCountLog+1);
+ } else if (allow_shrink && (5*entry_count < bucket_count) && m_BucketCountLog > 4) {
+ // we need to shrink
+ buckets = m_Buckets;
+ AllocateBuckets(m_BucketCountLog-1);
+ }
+ if (buckets) {
+ m_EntryCount = 0;
+ for (unsigned int i=0; i<bucket_count; i++) {
+ if (buckets[i]) AddEntry(buckets[i]);
+ }
+ delete[] buckets;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::Clear
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+NPT_Result
+NPT_HashMap<K,V,HF>::Clear()
+{
+ if (m_Buckets) {
+ for (int i=0; i<(1<<m_BucketCountLog); i++) {
+ delete m_Buckets[i];
+ }
+ delete[] m_Buckets;
+ }
+ m_EntryCount = 0;
+ AllocateBuckets(4);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::GetEntries
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+typename NPT_HashMap<K,V,HF>::Iterator
+NPT_HashMap<K,V,HF>::GetEntries() const
+{
+ for (int i=0; i<(1<<m_BucketCountLog); i++) {
+ if (m_Buckets[i]) {
+ return Iterator(&m_Buckets[i], this);
+ }
+ }
+ return Iterator(NULL, this);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::GetEntry
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+typename NPT_HashMap<K,V,HF>::Entry*
+NPT_HashMap<K,V,HF>::GetEntry(const K& key, NPT_UInt32* position) const
+{
+ NPT_UInt32 hash_value = m_Hasher(key);
+ NPT_UInt32 mask = (1<<m_BucketCountLog)-1;
+ NPT_UInt32 cursor = hash_value & mask;
+ while (m_Buckets[cursor]) {
+ Entry* entry = m_Buckets[cursor];
+ if (entry->m_HashValue == hash_value &&
+ entry->m_Key == key) {
+ if (position) *position = cursor;
+ return entry;
+ }
+ cursor = (cursor + 1) & mask;
+ }
+
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::AddEntry
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+NPT_Result
+NPT_HashMap<K,V,HF>::AddEntry(Entry* entry)
+{
+ AdjustBuckets(m_EntryCount+1);
+
+ NPT_UInt32 hash_value = entry->m_HashValue;
+ NPT_UInt32 mask = (1<<m_BucketCountLog)-1;
+ NPT_UInt32 cursor = hash_value & mask;
+ while (m_Buckets[cursor]) {
+ cursor = (cursor + 1) & mask;
+ }
+ m_Buckets[cursor] = entry;
+ ++m_EntryCount;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::Put
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+NPT_Result
+NPT_HashMap<K,V,HF>::Put(const K& key, const V& value)
+{
+ Entry* entry = GetEntry(key);
+ if (entry == NULL) {
+ // no existing entry for that key, create one
+ return AddEntry(new Entry(m_Hasher(key), key, value));
+ } else {
+ // replace the existing entry for that key
+ entry->SetValue(value);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::Get
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+NPT_Result
+NPT_HashMap<K,V,HF>::Get(const K& key, V*& value) const
+{
+ Entry* entry = GetEntry(key);
+ if (entry == NULL) {
+ // no existing entry for that key
+ value = NULL;
+ return NPT_ERROR_NO_SUCH_ITEM;
+ } else {
+ // found an entry with that key
+ value = &entry->m_Value;
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::HasValue
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+bool
+NPT_HashMap<K,V,HF>::HasValue(const V& value) const
+{
+ for (int i=0; i<(1<<m_BucketCountLog); i++) {
+ if (m_Buckets[i] && m_Buckets[i]->m_Value == value) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::Erase
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+NPT_Result
+NPT_HashMap<K,V,HF>::Erase(const K& key)
+{
+ NPT_UInt32 position;
+ Entry* entry = GetEntry(key, &position);
+ if (entry == NULL) {
+ return NPT_ERROR_NO_SUCH_ITEM;
+ }
+
+ // mark the bucket as unoccupied
+ m_Buckets[position] = NULL;
+
+ // look for buckets that need to be relocated:
+ // there should be no empty bucket between an entry's ideal hash bucket
+ // and its actual bucket.
+ NPT_UInt32 mask = (1<<m_BucketCountLog)-1;
+ for (NPT_UInt32 cursor = (position+1) & mask; m_Buckets[cursor]; cursor = (cursor + 1) & mask) {
+ NPT_UInt32 target = m_Buckets[cursor]->m_HashValue & mask;
+ // check if target is between position and cursor (modulo the bucket array size)
+ // | position.target.cursor |
+ // |....cursor position.target.| or |.target..cursor position...|
+ if ( (position <= cursor) ?
+ ((position < target) && (target <= cursor)) :
+ ((position < target) || (target <= cursor)) ) {
+ continue;
+ }
+
+ // move the bucket back
+ m_Buckets[position] = m_Buckets[cursor];
+ m_Buckets[cursor] = NULL;
+ position = cursor;
+ }
+
+ // cleanup and adjust the counter and buckets
+ delete entry;
+ --m_EntryCount;
+ AdjustBuckets(m_EntryCount, true);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::operator=
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+const NPT_HashMap<K,V,HF>&
+NPT_HashMap<K,V,HF>::operator=(const NPT_HashMap<K,V,HF>& copy)
+{
+ // do nothing if we're assigning to ourselves
+ if (this == &copy) return copy;
+
+ // destroy all entries
+ Clear();
+
+ // prepare to receive all the entries
+ AdjustBuckets(copy.m_EntryCount);
+
+ // copy all entries
+ for (int i=0; i<1<<copy.m_BucketCountLog; i++) {
+ if (copy.m_Buckets[i]) {
+ AddEntry(new Entry(m_Hasher(copy.m_Buckets[i]->GetKey()),
+ copy.m_Buckets[i]->GetKey(),
+ copy.m_Buckets[i]->GetValue()));
+ }
+ }
+
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::operator==
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+bool
+NPT_HashMap<K,V,HF>::operator==(const NPT_HashMap<K,V,HF>& other) const
+{
+ // quick check
+ if (m_EntryCount != other.m_EntryCount) return false;
+
+ // compare all entries to all other entries
+ for (int i=0; i<(1<<m_BucketCountLog); i++) {
+ Entry* entry = m_Buckets[i];
+ if (entry == NULL) continue;
+ Entry* other_entry = other.GetEntry(entry->m_Key);
+ if (other_entry == NULL || !(other_entry->m_Value == entry->m_Value)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V,HF>::operator!=
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+bool
+NPT_HashMap<K,V,HF>::operator!=(const NPT_HashMap<K,V,HF>& other) const
+{
+ return !(*this == other);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HashMap<K,V>::operator[]
++---------------------------------------------------------------------*/
+template <typename K, typename V, typename HF>
+V&
+NPT_HashMap<K,V,HF>::operator[](const K& key)
+{
+ Entry* entry = GetEntry(key);
+ if (entry == NULL) {
+ // create a new "default" entry for this key
+ entry = new Entry(m_Hasher(key), key);
+ AddEntry(entry);
+ }
+
+ return entry->m_Value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_MapEntryValueDeleter
++---------------------------------------------------------------------*/
+template <class T>
+class NPT_MapEntryValueDeleter {
+public:
+ void operator()(T* entry) const {
+ delete entry->GetValue();
+ }
+};
+
+#endif // _NPT_MAP_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptMessaging.cpp b/lib/libUPnP/Neptune/Source/Core/NptMessaging.cpp
new file mode 100644
index 0000000..cffe1d1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptMessaging.cpp
@@ -0,0 +1,127 @@
+/*****************************************************************
+|
+| Neptune - Messaging System
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptMessaging.h"
+#include "NptDynamicCast.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(NPT_MessageHandler)
+const NPT_Message::Type NPT_Message::MessageType = "Generic Message";
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandler::HandleMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_MessageHandler::HandleMessage(NPT_Message* message)
+{
+ return message->Dispatch(this);
+}
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandlerProxy::NPT_MessageHandlerProxy
++---------------------------------------------------------------------*/
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(NPT_MessageHandlerProxy)
+NPT_MessageHandlerProxy::NPT_MessageHandlerProxy(NPT_MessageHandler* handler) :
+ m_Handler(handler),
+ m_ReferenceCount(1)
+{}
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandlerProxy::NPT_MessageHandlerProxy
++---------------------------------------------------------------------*/
+NPT_MessageHandlerProxy::~NPT_MessageHandlerProxy()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandlerProxy::OnMessage
++---------------------------------------------------------------------*/
+void
+NPT_MessageHandlerProxy::OnMessage(NPT_Message* message)
+{
+ m_Lock.Lock();
+ if (m_Handler) m_Handler->OnMessage(message);
+ m_Lock.Unlock();
+}
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandlerProxy::HandleMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_MessageHandlerProxy::HandleMessage(NPT_Message* message)
+{
+ NPT_Result result = NPT_SUCCESS;
+ m_Lock.Lock();
+ if (m_Handler) result = m_Handler->HandleMessage(message);
+ m_Lock.Unlock();
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandlerProxy::DetachHandler
++---------------------------------------------------------------------*/
+void
+NPT_MessageHandlerProxy::DetachHandler()
+{
+ m_Lock.Lock();
+ m_Handler = NULL;
+ m_Lock.Unlock();
+}
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandlerProxy::AddReference
++---------------------------------------------------------------------*/
+void
+NPT_MessageHandlerProxy::AddReference()
+{
+ m_Lock.Lock();
+ ++m_ReferenceCount;
+ m_Lock.Unlock();
+}
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandlerProxy::Release
++---------------------------------------------------------------------*/
+void
+NPT_MessageHandlerProxy::Release()
+{
+ m_Lock.Lock();
+ bool must_delete = (--m_ReferenceCount == 0);
+ m_Lock.Unlock();
+
+ if (must_delete) delete this;
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptMessaging.h b/lib/libUPnP/Neptune/Source/Core/NptMessaging.h
new file mode 100644
index 0000000..3da21a0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptMessaging.h
@@ -0,0 +1,230 @@
+/*****************************************************************
+|
+| Neptune - Messaging System
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_MESSAGING_H_
+#define _NPT_MESSAGING_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConstants.h"
+#include "NptTypes.h"
+#include "NptResults.h"
+#include "NptList.h"
+#include "NptThreads.h"
+#include "NptDynamicCast.h"
+
+/*----------------------------------------------------------------------
+| forward references
++---------------------------------------------------------------------*/
+class NPT_Message;
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandler
++---------------------------------------------------------------------*/
+class NPT_MessageHandler
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST(NPT_MessageHandler)
+
+ // methods
+ virtual ~NPT_MessageHandler() {}
+
+ // default message handler
+ virtual void OnMessage(NPT_Message*) {}
+
+ // this method is a central point of handling for received messages.
+ // it can be overloaded by subclasses that wish to process all
+ // incoming messages
+ virtual NPT_Result HandleMessage(NPT_Message* message);
+};
+
+/*----------------------------------------------------------------------
+| NPT_MessageHandlerProxy
++---------------------------------------------------------------------*/
+class NPT_MessageHandlerProxy : public NPT_MessageHandler
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST_D(NPT_MessageHandlerProxy, NPT_MessageHandler)
+
+ /**
+ * Create a proxy for a message handler.
+ * All calls to HandleMessage() and OnMessage() on the proxy
+ * are automatically forwarded to the handler.
+ * This class is useful in cases where a handler is passed
+ * asynchronously (for example in a message queue) and one wishes
+ * to guarantee right away that no more calls to the handler will be
+ * made (because, for example, the handler needs to be deleted).
+ *
+ * The proxy object keeps a pointer to the handler, but does not own it.
+ */
+ NPT_MessageHandlerProxy(NPT_MessageHandler* handler);
+
+ // destructor
+ ~NPT_MessageHandlerProxy() override;
+
+ // NPT_MessageHandler methods
+ void OnMessage(NPT_Message*) override;
+ NPT_Result HandleMessage(NPT_Message* message) override;
+
+ /**
+ * Detach the proxy from the handler implementation.
+ * After this call returns, calls will no longer be
+ * forwarded to the handler object. It is then safe, for example,
+ * to delete the handler.
+ */
+ void DetachHandler();
+
+ /**
+ * Increment the reference count
+ */
+ void AddReference();
+
+ /**
+ * Decrement the reference count and delete if 0
+ */
+ void Release();
+
+private:
+ // members
+ NPT_MessageHandler* m_Handler;
+ NPT_Cardinal m_ReferenceCount;
+ NPT_Mutex m_Lock;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Messsage
++---------------------------------------------------------------------*/
+class NPT_Message
+{
+public:
+ // types
+ typedef const char* Type;
+
+ // static members
+ static Type const MessageType;
+
+ // methods
+ virtual ~NPT_Message() {}
+ virtual Type GetType() { return MessageType; }
+ virtual NPT_Result Dispatch(NPT_MessageHandler* handler) {
+ return DefaultDeliver(handler);
+ }
+ // this method should really be called 'Deliver', but this would
+ // cause a problem when subclasses overload it
+ virtual NPT_Result DefaultDeliver(NPT_MessageHandler* handler) {
+ handler->OnMessage(this);
+ return NPT_SUCCESS;
+ }
+};
+
+/*----------------------------------------------------------------------
+| NPT_TerminateMesssage
++---------------------------------------------------------------------*/
+class NPT_TerminateMessage : public NPT_Message
+{
+public:
+ // methods
+ NPT_Result Dispatch(NPT_MessageHandler* /*handler*/) override {
+ return NPT_ERROR_TERMINATED;
+ }
+};
+
+/*----------------------------------------------------------------------
+| NPT_MessageQueue
++---------------------------------------------------------------------*/
+class NPT_MessageQueue
+{
+public:
+ // methods
+ virtual ~NPT_MessageQueue() {}
+ virtual NPT_Result PumpMessage(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+ virtual NPT_Result QueueMessage(NPT_Message* message,
+ NPT_MessageHandler* handler) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_MessageReceiver
++---------------------------------------------------------------------*/
+class NPT_MessageReceiver
+{
+public:
+ // methods
+ NPT_MessageReceiver() : m_Queue(NULL), m_Handler(NULL) {}
+ NPT_MessageReceiver(NPT_MessageHandler* handler) :
+ m_Queue(NULL), m_Handler(handler) {}
+ NPT_MessageReceiver(NPT_MessageQueue* queue) :
+ m_Queue(queue), m_Handler(NULL) {}
+ NPT_MessageReceiver(NPT_MessageHandler* handler,
+ NPT_MessageQueue* queue) :
+ m_Queue(queue), m_Handler(handler) {}
+ virtual ~NPT_MessageReceiver() {}
+ NPT_Result SetQueue(NPT_MessageQueue* queue) {
+ m_Queue = queue;
+ return NPT_SUCCESS;
+ }
+ NPT_Result SetHandler(NPT_MessageHandler* handler) {
+ m_Handler = handler;
+ return NPT_SUCCESS;
+ }
+ virtual NPT_Result PostMessage(NPT_Message* message) {
+ if (m_Queue) {
+ return m_Queue->QueueMessage(message, m_Handler);
+ } else {
+ return NPT_FAILURE;
+ }
+ }
+
+protected:
+ // members
+ NPT_MessageQueue* m_Queue;
+ NPT_MessageHandler* m_Handler;
+};
+
+/*----------------------------------------------------------------------
+| NPT_MessageBroadcaster
++---------------------------------------------------------------------*/
+class NPT_MessageBroadcaster
+{
+public:
+ // methods
+ NPT_MessageBroadcaster(NPT_Message* message) : m_Message(message) {}
+ NPT_Result operator()(NPT_MessageReceiver*& receiver) const {
+ receiver->PostMessage(m_Message);
+ return NPT_SUCCESS;
+ }
+
+private:
+ // members
+ NPT_Message* m_Message;
+};
+
+#endif // _NPT_MESSAGING_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptNetwork.cpp b/lib/libUPnP/Neptune/Source/Core/NptNetwork.cpp
new file mode 100644
index 0000000..1b8bde7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptNetwork.cpp
@@ -0,0 +1,438 @@
+/*****************************************************************
+|
+| Neptune - Network
+|
+| Copyright (c) 2002-2016, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptSockets.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::NPT_IpAddress
++---------------------------------------------------------------------*/
+NPT_IpAddress::NPT_IpAddress() :
+ m_Type(IPV4),
+ m_ScopeId(0)
+{
+ NPT_SetMemory(m_Address, 0, sizeof(m_Address));
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::NPT_IpAddress
++---------------------------------------------------------------------*/
+NPT_IpAddress::NPT_IpAddress(Type type) :
+ m_Type(type),
+ m_ScopeId(0)
+{
+ NPT_SetMemory(m_Address, 0, sizeof(m_Address));
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::NPT_IpAddress
++---------------------------------------------------------------------*/
+NPT_IpAddress::NPT_IpAddress(unsigned long address) :
+ m_Type(IPV4),
+ m_ScopeId(0)
+{
+ Set(address);
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::NPT_IpAddress
++---------------------------------------------------------------------*/
+NPT_IpAddress::NPT_IpAddress(unsigned char a,
+ unsigned char b,
+ unsigned char c,
+ unsigned char d) :
+ m_Type(IPV4),
+ m_ScopeId(0)
+{
+ NPT_SetMemory(&m_Address[0], 0, sizeof(m_Address));
+ m_Address[0] = a;
+ m_Address[1] = b;
+ m_Address[2] = c;
+ m_Address[3] = d;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::NPT_IpAddress
++---------------------------------------------------------------------*/
+NPT_IpAddress::NPT_IpAddress(Type type, const unsigned char* address, unsigned int size, NPT_UInt32 scope_id) :
+ m_Type(type),
+ m_ScopeId(scope_id)
+{
+ if (type == IPV6 && size == 16) {
+ NPT_CopyMemory(&m_Address[0], address, 16);
+ } else if (type == IPV4 && size == 4) {
+ NPT_CopyMemory(&m_Address[0], address, 4);
+ NPT_SetMemory(&m_Address[4], 0, 12);
+ m_ScopeId = 0;
+ } else {
+ NPT_SetMemory(&m_Address[0], 0, 16);
+ m_ScopeId = 0;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::AsLong
++---------------------------------------------------------------------*/
+unsigned long
+NPT_IpAddress::AsLong() const
+{
+ return
+ (((unsigned long)m_Address[0])<<24) |
+ (((unsigned long)m_Address[1])<<16) |
+ (((unsigned long)m_Address[2])<< 8) |
+ (((unsigned long)m_Address[3]));
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::AsBytes
++---------------------------------------------------------------------*/
+const unsigned char*
+NPT_IpAddress::AsBytes() const
+{
+ return m_Address;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::Set
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_IpAddress::Set(const unsigned char bytes[4])
+{
+ m_Type = IPV4;
+ m_Address[0] = bytes[0];
+ m_Address[1] = bytes[1];
+ m_Address[2] = bytes[2];
+ m_Address[3] = bytes[3];
+ NPT_SetMemory(&m_Address[4], 0, sizeof(m_Address)-4);
+ m_ScopeId = 0; // always 0 for IPv4
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::Set
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_IpAddress::Set(unsigned long address)
+{
+ m_Type = IPV4;
+ m_Address[0] = (unsigned char)((address >> 24) & 0xFF);
+ m_Address[1] = (unsigned char)((address >> 16) & 0xFF);
+ m_Address[2] = (unsigned char)((address >> 8) & 0xFF);
+ m_Address[3] = (unsigned char)((address ) & 0xFF);
+ NPT_SetMemory(&m_Address[4], 0, sizeof(m_Address)-4);
+ m_ScopeId = 0; // always 0 for IPv4
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::Set
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_IpAddress::Set(const unsigned char* bytes, unsigned int size, NPT_UInt32 scope_id)
+{
+ NPT_SetMemory(&m_Address[0], 0, sizeof(m_Address));
+ if (size == 4) {
+ m_Type = IPV4;
+ NPT_CopyMemory(&m_Address[0], bytes, 4);
+ m_ScopeId = 0; // always 0 for IPv4
+ } else if (size == 16) {
+ m_Type = IPV6;
+ NPT_CopyMemory(&m_Address[0], bytes, 16);
+ m_ScopeId = scope_id;
+ } else {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::operator==
++---------------------------------------------------------------------*/
+bool
+NPT_IpAddress::operator==(const NPT_IpAddress& other) const
+{
+ unsigned int bytes_to_check = (m_Type == IPV4)?4:16;
+ for (unsigned int i=0; i<bytes_to_check; i++) {
+ if (m_Address[i] != other.m_Address[i]) {
+ return false;
+ }
+ }
+ return m_Type == other.m_Type;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::ToUrlHost
++---------------------------------------------------------------------*/
+NPT_String
+NPT_IpAddress::ToUrlHost() const
+{
+ if (m_Type == IPV6) {
+ NPT_String result = "[";
+ result += ToString();
+ return result+"]";
+ } else {
+ return ToString();
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::IsUnspecified
++---------------------------------------------------------------------*/
+bool
+NPT_IpAddress::IsUnspecified() const
+{
+ for (unsigned int i=0; i<(unsigned int)(m_Type==IPV4?4:16); i++) {
+ if (m_Address[i]) return false;
+ }
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::IsLooppack
++---------------------------------------------------------------------*/
+bool
+NPT_IpAddress::IsLooppack() const
+{
+ if (m_Type == IPV4) {
+ return m_Address[0] == 127 &&
+ m_Address[1] == 0 &&
+ m_Address[2] == 0 &&
+ m_Address[3] == 1;
+ } else {
+ return m_Address[ 0] == 0 &&
+ m_Address[ 1] == 0 &&
+ m_Address[ 2] == 0 &&
+ m_Address[ 3] == 0 &&
+ m_Address[ 4] == 0 &&
+ m_Address[ 5] == 0 &&
+ m_Address[ 6] == 0 &&
+ m_Address[ 7] == 0 &&
+ m_Address[ 8] == 0 &&
+ m_Address[ 9] == 0 &&
+ m_Address[10] == 0 &&
+ m_Address[11] == 0 &&
+ m_Address[12] == 0 &&
+ m_Address[13] == 0 &&
+ m_Address[14] == 0 &&
+ m_Address[15] == 1;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::IsV4Compatible
++---------------------------------------------------------------------*/
+bool
+NPT_IpAddress::IsV4Compatible() const
+{
+ if (m_Type == IPV4) return true;
+ return m_Address[ 0] == 0 &&
+ m_Address[ 1] == 0 &&
+ m_Address[ 2] == 0 &&
+ m_Address[ 3] == 0 &&
+ m_Address[ 4] == 0 &&
+ m_Address[ 5] == 0 &&
+ m_Address[ 6] == 0 &&
+ m_Address[ 7] == 0 &&
+ m_Address[ 8] == 0 &&
+ m_Address[ 9] == 0 &&
+ m_Address[10] == 0 &&
+ m_Address[11] == 0 &&
+ !(m_Address[12] == 0 &&
+ m_Address[13] == 0 &&
+ m_Address[14] == 0 &&
+ m_Address[15] == 0) &&
+ !(m_Address[12] == 0 &&
+ m_Address[13] == 0 &&
+ m_Address[14] == 0 &&
+ m_Address[15] == 1);
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::IsV4Mapped
++---------------------------------------------------------------------*/
+bool
+NPT_IpAddress::IsV4Mapped() const
+{
+ if (m_Type == IPV4) return false;
+ return m_Address[ 0] == 0 &&
+ m_Address[ 1] == 0 &&
+ m_Address[ 2] == 0 &&
+ m_Address[ 3] == 0 &&
+ m_Address[ 4] == 0 &&
+ m_Address[ 5] == 0 &&
+ m_Address[ 6] == 0 &&
+ m_Address[ 7] == 0 &&
+ m_Address[ 8] == 0 &&
+ m_Address[ 9] == 0 &&
+ m_Address[10] == 0xFF &&
+ m_Address[11] == 0xFF;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::IsLinkLocal
++---------------------------------------------------------------------*/
+bool
+NPT_IpAddress::IsLinkLocal() const
+{
+ if (m_Type == IPV4) {
+ return m_Address[0] == 169 && m_Address[1] == 254;
+ } else {
+ return m_Address[0] == 0xFE && ((m_Address[1]&0xC0) == 0x80);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::IsSiteLocal
++---------------------------------------------------------------------*/
+bool
+NPT_IpAddress::IsSiteLocal() const
+{
+ if (m_Type == IPV4) return false;
+ return m_Address[0] == 0xFE && ((m_Address[1]&0xC0) == 0xC0);
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::IsUniqueLocal
++---------------------------------------------------------------------*/
+bool
+NPT_IpAddress::IsUniqueLocal() const
+{
+ if (m_Type == IPV4) {
+ return (m_Address[0] == 10) ||
+ (m_Address[0] == 172 && (m_Address[1]&0xF0) == 16) ||
+ (m_Address[0] == 192 && m_Address[1] == 168);
+ } else {
+ return ((m_Address[0] & 0xFE) == 0xFC);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::IsMulticast
++---------------------------------------------------------------------*/
+bool
+NPT_IpAddress::IsMulticast() const
+{
+ if (m_Type == IPV4) {
+ return (m_Address[0] & 0xF0) == 224;
+ } else {
+ return m_Address[0] == 0xFF;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_MacAddress::NPT_MacAddress
++---------------------------------------------------------------------*/
+NPT_MacAddress::NPT_MacAddress(Type type,
+ const unsigned char* address,
+ unsigned int length)
+{
+ SetAddress(type, address, length);
+}
+
+/*----------------------------------------------------------------------
+| NPT_MacAddress::SetAddress
++---------------------------------------------------------------------*/
+void
+NPT_MacAddress::SetAddress(Type type,
+ const unsigned char* address,
+ unsigned int length)
+{
+ m_Type = type;
+ if (length > NPT_NETWORK_MAX_MAC_ADDRESS_LENGTH) {
+ length = NPT_NETWORK_MAX_MAC_ADDRESS_LENGTH;
+ }
+ m_Length = length;
+ for (unsigned int i=0; i<length; i++) {
+ m_Address[i] = address[i];
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_MacAddress::ToString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_MacAddress::ToString() const
+{
+ NPT_String result;
+
+ if (m_Length) {
+ char s[3*NPT_NETWORK_MAX_MAC_ADDRESS_LENGTH];
+ const char hex[17] = "0123456789abcdef";
+ for (unsigned int i=0; i<m_Length; i++) {
+ s[i*3 ] = hex[m_Address[i]>>4];
+ s[i*3+1] = hex[m_Address[i]&0xf];
+ s[i*3+2] = ':';
+ }
+ s[3*m_Length-1] = '\0';
+ result = s;
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::NPT_NetworkInterface
++---------------------------------------------------------------------*/
+NPT_NetworkInterface::NPT_NetworkInterface(const char* name,
+ const NPT_MacAddress& mac,
+ NPT_Flags flags) :
+ m_Name(name),
+ m_MacAddress(mac),
+ m_Flags(flags)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::NPT_NetworkInterface
++---------------------------------------------------------------------*/
+NPT_NetworkInterface::NPT_NetworkInterface(const char* name,
+ NPT_Flags flags) :
+ m_Name(name),
+ m_Flags(flags)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::AddAddress
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::AddAddress(const NPT_NetworkInterfaceAddress& address)
+{
+ return m_Addresses.Add(address);
+}
+
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptNetwork.h b/lib/libUPnP/Neptune/Source/Core/NptNetwork.h
new file mode 100644
index 0000000..fb37f44
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptNetwork.h
@@ -0,0 +1,277 @@
+/*****************************************************************
+|
+| Neptune - Network
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_NETWORK_H_
+#define _NPT_NETWORK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptStrings.h"
+#include "NptList.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const unsigned int NPT_NETWORK_MAX_MAC_ADDRESS_LENGTH = 8;
+
+/*----------------------------------------------------------------------
+| flags
++---------------------------------------------------------------------*/
+#define NPT_NETWORK_INTERFACE_FLAG_LOOPBACK 0x01
+#define NPT_NETWORK_INTERFACE_FLAG_PROMISCUOUS 0x02
+#define NPT_NETWORK_INTERFACE_FLAG_BROADCAST 0x04
+#define NPT_NETWORK_INTERFACE_FLAG_MULTICAST 0x08
+#define NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT 0x10
+
+/*----------------------------------------------------------------------
+| workarounds
++---------------------------------------------------------------------*/
+#if defined(_WIN32)
+#if defined(SetPort)
+#undef SetPort
+#endif
+#endif
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef unsigned int NPT_IpPort;
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress
++---------------------------------------------------------------------*/
+class NPT_IpAddress
+{
+public:
+ // constants
+ typedef enum {
+ IPV4,
+ IPV6
+ } Type;
+
+ // class members
+ static const NPT_IpAddress Any;
+ static const NPT_IpAddress Loopback;
+
+ // constructors and destructor
+ NPT_IpAddress();
+ NPT_IpAddress(Type type);
+ NPT_IpAddress(unsigned long address);
+ NPT_IpAddress(unsigned char a, unsigned char b, unsigned char c, unsigned char d);
+ NPT_IpAddress(Type type, const unsigned char* address, unsigned int size, NPT_UInt32 scope_id = 0);
+
+ // accessors
+ Type GetType() const { return m_Type; }
+ NPT_UInt32 GetScopeId() const { return m_ScopeId; }
+
+ // methods
+ NPT_Result ResolveName(const char* name,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+ NPT_Result Parse(const char* name);
+ NPT_Result Set(unsigned long address);
+ NPT_Result Set(const unsigned char bytes[4]);
+ NPT_Result Set(const unsigned char* bytes, unsigned int size, NPT_UInt32 scope_id = 0);
+ const unsigned char* AsBytes() const;
+ unsigned long AsLong() const;
+ NPT_String ToString() const;
+ NPT_String ToUrlHost() const;
+
+ // address properties
+ bool IsUnspecified() const;
+ bool IsLooppack() const;
+ bool IsV4Compatible() const;
+ bool IsV4Mapped() const;
+ bool IsLinkLocal() const;
+ bool IsSiteLocal() const;
+ bool IsUniqueLocal() const;
+ bool IsMulticast() const;
+
+ // operators
+ bool operator==(const NPT_IpAddress& other) const;
+
+ // FIXME: temporary
+ NPT_String m_HostName;
+
+private:
+ // members
+ Type m_Type;
+ unsigned char m_Address[16];
+ NPT_UInt32 m_ScopeId; // IPv6 only
+};
+
+/*----------------------------------------------------------------------
+| NPT_MacAddress
++---------------------------------------------------------------------*/
+class NPT_MacAddress
+{
+public:
+ // typedef enum
+ typedef enum {
+ TYPE_UNKNOWN,
+ TYPE_LOOPBACK,
+ TYPE_ETHERNET,
+ TYPE_PPP,
+ TYPE_IEEE_802_11
+ } Type;
+
+ // constructors and destructor
+ NPT_MacAddress() : m_Type(TYPE_UNKNOWN), m_Length(0) {}
+ NPT_MacAddress(Type type,
+ const unsigned char* addr,
+ unsigned int length);
+
+ // methods
+ void SetAddress(Type type, const unsigned char* addr,
+ unsigned int length);
+ Type GetType() const { return m_Type; }
+ const unsigned char* GetAddress() const { return m_Address; }
+ unsigned int GetLength() const { return m_Length; }
+ NPT_String ToString() const;
+
+private:
+ // members
+ Type m_Type;
+ unsigned char m_Address[NPT_NETWORK_MAX_MAC_ADDRESS_LENGTH];
+ unsigned int m_Length;
+};
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterfaceAddress
++---------------------------------------------------------------------*/
+class NPT_NetworkInterfaceAddress
+{
+public:
+ // constructors and destructor
+ NPT_NetworkInterfaceAddress(const NPT_IpAddress& primary,
+ const NPT_IpAddress& broadcast,
+ const NPT_IpAddress& destination,
+ const NPT_IpAddress& netmask) :
+ m_PrimaryAddress(primary),
+ m_BroadcastAddress(broadcast),
+ m_DestinationAddress(destination),
+ m_NetMask(netmask) {}
+
+ // methods
+ const NPT_IpAddress& GetPrimaryAddress() const {
+ return m_PrimaryAddress;
+ }
+ const NPT_IpAddress& GetBroadcastAddress() const {
+ return m_BroadcastAddress;
+ }
+ const NPT_IpAddress& GetDestinationAddress() const {
+ return m_DestinationAddress;
+ }
+ const NPT_IpAddress& GetNetMask() const {
+ return m_NetMask;
+ }
+
+ bool IsAddressInNetwork(const NPT_IpAddress& address) {
+ if (m_PrimaryAddress.AsLong() == address.AsLong()) return true;
+ if (m_NetMask.AsLong() == 0) return false;
+ return (m_PrimaryAddress.AsLong() & m_NetMask.AsLong()) == (address.AsLong() & m_NetMask.AsLong());
+ }
+
+private:
+ // members
+ NPT_IpAddress m_PrimaryAddress;
+ NPT_IpAddress m_BroadcastAddress;
+ NPT_IpAddress m_DestinationAddress;
+ NPT_IpAddress m_NetMask;
+};
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface
++---------------------------------------------------------------------*/
+class NPT_NetworkInterface
+{
+public:
+ // class methods
+ static NPT_Result GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces);
+
+ // constructors and destructor
+ NPT_NetworkInterface(const char* name,
+ const NPT_MacAddress& mac,
+ NPT_Flags flags);
+ NPT_NetworkInterface(const char* name,
+ NPT_Flags flags);
+ ~NPT_NetworkInterface() {}
+
+ // methods
+ NPT_Result AddAddress(const NPT_NetworkInterfaceAddress& address);
+ const NPT_String& GetName() const {
+ return m_Name;
+ }
+ const NPT_MacAddress& GetMacAddress() const {
+ return m_MacAddress;
+ }
+ void SetMacAddress(NPT_MacAddress::Type type,
+ const unsigned char* addr,
+ unsigned int length) {
+ m_MacAddress.SetAddress(type, addr, length);
+ }
+ NPT_Flags GetFlags() const { return m_Flags; }
+ const NPT_List<NPT_NetworkInterfaceAddress>& GetAddresses() const {
+ return m_Addresses;
+ }
+
+ bool IsAddressInNetwork(const NPT_IpAddress& address) {
+ NPT_List<NPT_NetworkInterfaceAddress>::Iterator iter = m_Addresses.GetFirstItem();
+ while (iter) {
+ if ((*iter).IsAddressInNetwork(address)) return true;
+ ++iter;
+ }
+ return false;
+ }
+
+private:
+ // members
+ NPT_String m_Name;
+ NPT_MacAddress m_MacAddress;
+ NPT_Flags m_Flags;
+ NPT_List<NPT_NetworkInterfaceAddress> m_Addresses;
+};
+
+/*----------------------------------------------------------------------
+| NPT_NetworkNameResolver
++---------------------------------------------------------------------*/
+class NPT_NetworkNameResolver
+{
+public:
+ // class methods
+ static NPT_Result Resolve(const char* name,
+ NPT_List<NPT_IpAddress>& addresses,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+};
+
+#endif // _NPT_NETWORK_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptQueue.cpp b/lib/libUPnP/Neptune/Source/Core/NptQueue.cpp
new file mode 100644
index 0000000..bd68ad2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptQueue.cpp
@@ -0,0 +1,36 @@
+/*****************************************************************
+|
+| Neptune - Queue
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptQueue.h"
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptQueue.h b/lib/libUPnP/Neptune/Source/Core/NptQueue.h
new file mode 100644
index 0000000..ecfe1a9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptQueue.h
@@ -0,0 +1,94 @@
+/*****************************************************************
+|
+| Neptune - Queue
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_QUEUE_H_
+#define _NPT_QUEUE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptConstants.h"
+
+/*----------------------------------------------------------------------
+| NPT_QueueItem
++---------------------------------------------------------------------*/
+class NPT_QueueItem;
+
+/*----------------------------------------------------------------------
+| NPT_GenericQueue
++---------------------------------------------------------------------*/
+class NPT_GenericQueue
+{
+ public:
+ // class methods
+ static NPT_GenericQueue* CreateInstance(NPT_Cardinal max_items = 0);
+
+ // methods
+ virtual ~NPT_GenericQueue() {}
+ virtual NPT_Result Push(NPT_QueueItem* item,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+ virtual NPT_Result Pop(NPT_QueueItem*& item,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+ virtual NPT_Result Peek(NPT_QueueItem*& item,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+ protected:
+ // methods
+ NPT_GenericQueue() {}
+};
+
+/*----------------------------------------------------------------------
+| NPT_Queue
++---------------------------------------------------------------------*/
+template <class T>
+class NPT_Queue
+{
+ public:
+ // methods
+ NPT_Queue(NPT_Cardinal max_items = 0) :
+ m_Delegate(NPT_GenericQueue::CreateInstance(max_items)) {}
+ virtual ~NPT_Queue<T>() { delete m_Delegate; }
+ virtual NPT_Result Push(T* item, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) {
+ return m_Delegate->Push(reinterpret_cast<NPT_QueueItem*>(item), timeout);
+ }
+ virtual NPT_Result Pop(T*& item, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) {
+ return m_Delegate->Pop(reinterpret_cast<NPT_QueueItem*&>(item), timeout);
+ }
+ virtual NPT_Result Peek(T*& item, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) {
+ return m_Delegate->Peek(reinterpret_cast<NPT_QueueItem*&>(item), timeout);
+ }
+
+ protected:
+ // members
+ NPT_GenericQueue* m_Delegate;
+};
+
+#endif // _NPT_QUEUE_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptReferences.h b/lib/libUPnP/Neptune/Source/Core/NptReferences.h
new file mode 100644
index 0000000..c8e1f5a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptReferences.h
@@ -0,0 +1,173 @@
+/*****************************************************************
+|
+| Neptune - References
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+#ifndef _NPT_REFERENCES_H_
+#define _NPT_REFERENCES_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConstants.h"
+#include "NptThreads.h"
+
+/*----------------------------------------------------------------------
+| NPT_Reference
++---------------------------------------------------------------------*/
+template <typename T>
+class NPT_Reference
+{
+public:
+ // constructors and destructor
+ NPT_Reference() : m_Object(NULL), m_Counter(NULL), m_Mutex(NULL), m_ThreadSafe(true) {}
+ explicit NPT_Reference(T* object, bool thread_safe = true) :
+ m_Object(object),
+ m_Counter(object?new NPT_Cardinal(1):NULL),
+ m_Mutex((object && thread_safe)?new NPT_Mutex():NULL),
+ m_ThreadSafe(thread_safe) {}
+
+ NPT_Reference(const NPT_Reference<T>& ref) :
+ m_Object(ref.m_Object), m_Counter(ref.m_Counter), m_Mutex(ref.m_Mutex), m_ThreadSafe(ref.m_ThreadSafe) {
+ if (m_Mutex) m_Mutex->Lock();
+ if (m_Counter) ++(*m_Counter);
+ if (m_Mutex) m_Mutex->Unlock();
+ }
+
+ // this methods should be private, but this causes a problem on some
+ // compilers, because we need this function in order to implement
+ // the cast operator operator NPT_Reference<U>() below, which would
+ // have to be marked as a friend, and friend declarations with the
+ // same class name confuses some compilers
+ NPT_Reference(T* object, NPT_Cardinal* counter, NPT_Mutex* mutex, bool thread_safe) :
+ m_Object(object), m_Counter(counter), m_Mutex(mutex), m_ThreadSafe(thread_safe) {
+ if (m_Mutex) m_Mutex->Lock();
+ if (m_Counter) ++(*m_Counter);
+ if (m_Mutex) m_Mutex->Unlock();
+ }
+
+ ~NPT_Reference() {
+ Release();
+ }
+
+ // overloaded operators
+ NPT_Reference<T>& operator=(const NPT_Reference<T>& ref) {
+ if (this != &ref) {
+ Release();
+ m_Object = ref.m_Object;
+ m_Counter = ref.m_Counter;
+ m_Mutex = ref.m_Mutex;
+ m_ThreadSafe = ref.m_ThreadSafe;
+
+ if (m_Mutex) m_Mutex->Lock();
+ if (m_Counter) ++(*m_Counter);
+ if (m_Mutex) m_Mutex->Unlock();
+ }
+ return *this;
+ }
+ NPT_Reference<T>& operator=(T* object) {
+ Release();
+ m_Object = object;
+ m_Counter = object?new NPT_Cardinal(1):NULL;
+ m_Mutex = (object && m_ThreadSafe)?new NPT_Mutex():NULL;
+ return *this;
+ }
+ T& operator*() const { return *m_Object; }
+ T* operator->() const { return m_Object; }
+
+ bool operator==(const NPT_Reference<T>& ref) const {
+ return m_Object == ref.m_Object;
+ }
+ bool operator!=(const NPT_Reference<T>& ref) const {
+ return m_Object != ref.m_Object;
+ }
+
+ // overloaded cast operators
+ template <typename U> operator NPT_Reference<U>() {
+ return NPT_Reference<U>(m_Object, m_Counter, m_Mutex, m_ThreadSafe);
+ }
+
+ // methods
+ /**
+ * Returns the naked pointer value.
+ */
+ T* AsPointer() const { return m_Object; }
+
+ /**
+ * Returns the reference counter value.
+ */
+ NPT_Cardinal GetCounter() const { return *m_Counter; }
+
+ /**
+ * Returns whether this references a NULL object.
+ */
+ bool IsNull() const { return m_Object == NULL; }
+
+ /**
+ * Detach the reference from the shared object.
+ * The reference count is decremented, but the object is not deleted if the
+ * reference count becomes 0.
+ * After the method returns, this reference does not point to any shared object.
+ */
+ void Detach() {
+ Release(true);
+ }
+
+private:
+ // methods
+ void Release(bool detach_only = false) {
+ bool last_reference = false;
+ if (m_Mutex) m_Mutex->Lock();
+
+ if (m_Counter && --(*m_Counter) == 0) {
+ delete m_Counter;
+ if (!detach_only) delete m_Object;
+ last_reference = true;
+ }
+
+ m_Counter = NULL;
+ m_Object = NULL;
+
+ if (m_Mutex) {
+ NPT_Mutex* mutex = m_Mutex;
+ m_Mutex = NULL;
+ mutex->Unlock();
+ if (last_reference) delete mutex;
+ }
+
+ }
+
+ // members
+ T* m_Object;
+ NPT_Cardinal* m_Counter;
+ NPT_Mutex* m_Mutex;
+ bool m_ThreadSafe;
+};
+
+#endif // _NPT_REFERENCES_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptResults.cpp b/lib/libUPnP/Neptune/Source/Core/NptResults.cpp
new file mode 100644
index 0000000..cf87793
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptResults.cpp
@@ -0,0 +1,153 @@
+/*****************************************************************
+|
+| Neptune - Result Code Map
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| NPT_ResultText
++---------------------------------------------------------------------*/
+const char*
+NPT_ResultText(NPT_Result result)
+{
+ switch (result) {
+ case NPT_SUCCESS: return "SUCCESS";
+ case NPT_FAILURE: return "FAILURE";
+
+ case NPT_ERROR_INVALID_PARAMETERS: return "NPT_ERROR_INVALID_PARAMETERS";
+ case NPT_ERROR_PERMISSION_DENIED: return "NPT_ERROR_PERMISSION_DENIED";
+ case NPT_ERROR_OUT_OF_MEMORY: return "NPT_ERROR_OUT_OF_MEMORY";
+ case NPT_ERROR_NO_SUCH_NAME: return "NPT_ERROR_NO_SUCH_NAME";
+ case NPT_ERROR_NO_SUCH_PROPERTY: return "NPT_ERROR_NO_SUCH_PROPERTY";
+ case NPT_ERROR_NO_SUCH_ITEM: return "NPT_ERROR_NO_SUCH_ITEM";
+ case NPT_ERROR_NO_SUCH_CLASS: return "NPT_ERROR_NO_SUCH_CLASS";
+ case NPT_ERROR_OVERFLOW: return "NPT_ERROR_OVERFLOW";
+ case NPT_ERROR_INTERNAL: return "NPT_ERROR_INTERNAL";
+ case NPT_ERROR_INVALID_STATE: return "NPT_ERROR_INVALID_STATE";
+ case NPT_ERROR_INVALID_FORMAT: return "NPT_ERROR_INVALID_FORMAT";
+ case NPT_ERROR_INVALID_SYNTAX: return "NPT_ERROR_INVALID_SYNTAX";
+ case NPT_ERROR_NOT_IMPLEMENTED: return "NPT_ERROR_NOT_IMPLEMENTED";
+ case NPT_ERROR_NOT_SUPPORTED: return "NPT_ERROR_NOT_SUPPORTED";
+ case NPT_ERROR_TIMEOUT: return "NPT_ERROR_TIMEOUT";
+ case NPT_ERROR_WOULD_BLOCK: return "NPT_ERROR_WOULD_BLOCK";
+ case NPT_ERROR_TERMINATED: return "NPT_ERROR_TERMINATED";
+ case NPT_ERROR_OUT_OF_RANGE: return "NPT_ERROR_OUT_OF_RANGE";
+ case NPT_ERROR_OUT_OF_RESOURCES: return "NPT_ERROR_OUT_OF_RESOURCES";
+ case NPT_ERROR_NOT_ENOUGH_SPACE: return "NPT_ERROR_NOT_ENOUGH_SPACE";
+ case NPT_ERROR_INTERRUPTED: return "NPT_ERROR_INTERRUPTED";
+ case NPT_ERROR_CANCELLED: return "NPT_ERROR_CANCELLED";
+ case NPT_ERROR_LIST_EMPTY: return "NPT_ERROR_LIST_EMPTY";
+ case NPT_ERROR_LIST_OPERATION_ABORTED: return "NPT_ERROR_LIST_OPERATION_ABORTED";
+ case NPT_ERROR_LIST_OPERATION_CONTINUE: return "NPT_ERROR_LIST_OPERATION_CONTINUE";
+ case NPT_ERROR_NO_SUCH_FILE: return "NPT_ERROR_NO_SUCH_FILE";
+ case NPT_ERROR_FILE_NOT_OPEN: return "NPT_ERROR_FILE_NOT_OPEN";
+ case NPT_ERROR_FILE_BUSY: return "NPT_ERROR_FILE_BUSY";
+ case NPT_ERROR_FILE_ALREADY_OPEN: return "NPT_ERROR_FILE_ALREADY_OPEN";
+ case NPT_ERROR_FILE_NOT_READABLE: return "NPT_ERROR_FILE_NOT_READABLE";
+ case NPT_ERROR_FILE_NOT_WRITABLE: return "NPT_ERROR_FILE_NOT_WRITABLE";
+ case NPT_ERROR_FILE_NOT_DIRECTORY: return "NPT_ERROR_FILE_NOT_DIRECTORY";
+ case NPT_ERROR_FILE_ALREADY_EXISTS: return "NPT_ERROR_FILE_ALREADY_EXISTS";
+ case NPT_ERROR_FILE_NOT_ENOUGH_SPACE: return "NPT_ERROR_FILE_NOT_ENOUGH_SPACE";
+ case NPT_ERROR_DIRECTORY_NOT_EMPTY: return "NPT_ERROR_DIRECTORY_NOT_EMPTY";
+ case NPT_ERROR_READ_FAILED: return "NPT_ERROR_READ_FAILED";
+ case NPT_ERROR_WRITE_FAILED: return "NPT_ERROR_WRITE_FAILED";
+ case NPT_ERROR_EOS: return "NPT_ERROR_EOS";
+ case NPT_ERROR_CONNECTION_RESET: return "NPT_ERROR_CONNECTION_RESET";
+ case NPT_ERROR_CONNECTION_ABORTED: return "NPT_ERROR_CONNECTION_ABORTED";
+ case NPT_ERROR_CONNECTION_REFUSED: return "NPT_ERROR_CONNECTION_REFUSED";
+ case NPT_ERROR_CONNECTION_FAILED: return "NPT_ERROR_CONNECTION_FAILED";
+ case NPT_ERROR_HOST_UNKNOWN: return "NPT_ERROR_HOST_UNKNOWN";
+ case NPT_ERROR_SOCKET_FAILED: return "NPT_ERROR_SOCKET_FAILED";
+ case NPT_ERROR_GETSOCKOPT_FAILED: return "NPT_ERROR_GETSOCKOPT_FAILED";
+ case NPT_ERROR_SETSOCKOPT_FAILED: return "NPT_ERROR_SETSOCKOPT_FAILED";
+ case NPT_ERROR_SOCKET_CONTROL_FAILED: return "NPT_ERROR_SOCKET_CONTROL_FAILED";
+ case NPT_ERROR_BIND_FAILED: return "NPT_ERROR_BIND_FAILED";
+ case NPT_ERROR_LISTEN_FAILED: return "NPT_ERROR_LISTEN_FAILED";
+ case NPT_ERROR_ACCEPT_FAILED: return "NPT_ERROR_ACCEPT_FAILED";
+ case NPT_ERROR_ADDRESS_IN_USE: return "NPT_ERROR_ADDRESS_IN_USE";
+ case NPT_ERROR_NETWORK_DOWN: return "NPT_ERROR_NETWORK_DOWN";
+ case NPT_ERROR_NETWORK_UNREACHABLE: return "NPT_ERROR_NETWORK_UNREACHABLE";
+ case NPT_ERROR_HOST_UNREACHABLE: return "NPT_ERROR_HOST_UNREACHABLE";
+ case NPT_ERROR_NO_SUCH_INTERFACE: return "NPT_ERROR_NO_SUCH_INTERFACE";
+ case NPT_ERROR_XML_INVALID_NESTING: return "NPT_ERROR_XML_INVALID_NESTING";
+ case NPT_ERROR_XML_TAG_MISMATCH: return "NPT_ERROR_XML_TAG_MISMATCH";
+ case NPT_ERROR_HTTP_INVALID_RESPONSE_LINE: return "NPT_ERROR_HTTP_INVALID_RESPONSE_LINE";
+ case NPT_ERROR_HTTP_INVALID_REQUEST_LINE: return "NPT_ERROR_HTTP_INVALID_REQUEST_LINE";
+ case NPT_ERROR_HTTP_NO_PROXY: return "NPT_ERROR_HTTP_NO_PROXY";
+ case NPT_ERROR_HTTP_INVALID_REQUEST: return "NPT_ERROR_HTTP_INVALID_REQUEST";
+ case NPT_ERROR_HTTP_METHOD_NOT_SUPPORTED: return "NPT_ERROR_HTTP_METHOD_NOT_SUPPORTED";
+ case NPT_ERROR_HTTP_TOO_MANY_REDIRECTS: return "NPT_ERROR_HTTP_TOO_MANY_REDIRECTS";
+ case NPT_ERROR_HTTP_TOO_MANY_RECONNECTS: return "NPT_ERROR_HTTP_TOO_MANY_RECONNECTS";
+ case NPT_ERROR_HTTP_CANNOT_RESEND_BODY: return "NPT_ERROR_HTTP_CANNOT_RESEND_BODY";
+ case NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN: return "NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN";
+ case NPT_ERROR_CALLBACK_NOTHING_PENDING: return "NPT_ERROR_CALLBACK_NOTHING_PENDING";
+ case NPT_ERROR_NO_SUCH_SERIAL_PORT: return "NPT_ERROR_NO_SUCH_SERIAL_PORT";
+ case NPT_ERROR_SERIAL_PORT_NOT_OPEN: return "NPT_ERROR_SERIAL_PORT_NOT_OPEN";
+ case NPT_ERROR_SERIAL_PORT_ALREADY_OPEN: return "NPT_ERROR_SERIAL_PORT_ALREADY_OPEN";
+ case NPT_ERROR_SERIAL_PORT_BUSY: return "NPT_ERROR_SERIAL_PORT_BUSY";
+ case NPT_ERROR_INVALID_PASSWORD: return "NPT_ERROR_INVALID_PASSWORD";
+ case NPT_ERROR_TLS_INVALID_HANDSHAKE: return "NPT_ERROR_TLS_INVALID_HANDSHAKE";
+ case NPT_ERROR_TLS_INVALID_PROTOCOL_MESSAGE: return "NPT_ERROR_TLS_INVALID_PROTOCOL_MESSAGE";
+ case NPT_ERROR_TLS_INVALID_HMAC: return "NPT_ERROR_TLS_INVALID_HMAC";
+ case NPT_ERROR_TLS_INVALID_VERSION: return "NPT_ERROR_TLS_INVALID_VERSION";
+ case NPT_ERROR_TLS_INVALID_SESSION: return "NPT_ERROR_TLS_INVALID_SESSION";
+ case NPT_ERROR_TLS_NO_CIPHER: return "NPT_ERROR_TLS_NO_CIPHER";
+ case NPT_ERROR_TLS_BAD_CERTIFICATE: return "NPT_ERROR_TLS_BAD_CERTIFICATE";
+ case NPT_ERROR_TLS_INVALID_KEY: return "NPT_ERROR_TLS_INVALID_KEY";
+ case NPT_ERROR_TLS_NO_CLIENT_RENEGOTIATION: return "NPT_ERROR_TLS_NO_CLIENT_RENEGOTIATION";
+ case NPT_ERROR_TLS_INVALID_FINISHED_MESSAGE: return "NPT_ERROR_TLS_INVALID_FINISHED_MESSAGE";
+ case NPT_ERROR_TLS_NO_CERTIFICATE_DEFINED: return "NPT_ERROR_TLS_NO_CERTIFICATE_DEFINED";
+ case NPT_ERROR_TLS_ALERT_HANDSHAKE_FAILED: return "NPT_ERROR_TLS_ALERT_HANDSHAKE_FAILED";
+ case NPT_ERROR_TLS_ALERT_BAD_CERTIFICATE: return "NPT_ERROR_TLS_ALERT_BAD_CERTIFICATE";
+ case NPT_ERROR_TLS_ALERT_INVALID_VERSION: return "NPT_ERROR_TLS_ALERT_INVALID_VERSION";
+ case NPT_ERROR_TLS_ALERT_BAD_RECORD_MAC: return "NPT_ERROR_TLS_ALERT_BAD_RECORD_MAC";
+ case NPT_ERROR_TLS_ALERT_DECODE_ERROR: return "NPT_ERROR_TLS_ALERT_DECODE_ERROR";
+ case NPT_ERROR_TLS_ALERT_DECRYPT_ERROR: return "NPT_ERROR_TLS_ALERT_DECRYPT_ERROR";
+ case NPT_ERROR_TLS_ALERT_ILLEGAL_PARAMETER: return "NPT_ERROR_TLS_ALERT_ILLEGAL_PARAMETER";
+ case NPT_ERROR_TLS_ALERT_UNEXPECTED_MESSAGE: return "NPT_ERROR_TLS_ALERT_UNEXPECTED_MESSAGE";
+ case NPT_ERROR_TLS_CERTIFICATE_FAILURE: return "NPT_ERROR_TLS_CERTIFICATE_FAILURE";
+ case NPT_ERROR_TLS_CERTIFICATE_NO_TRUST_ANCHOR: return "NPT_ERROR_TLS_CERTIFICATE_NO_TRUST_ANCHOR";
+ case NPT_ERROR_TLS_CERTIFICATE_BAD_SIGNATURE: return "NPT_ERROR_TLS_CERTIFICATE_BAD_SIGNATURE";
+ case NPT_ERROR_TLS_CERTIFICATE_NOT_YET_VALID: return "NPT_ERROR_TLS_CERTIFICATE_NOT_YET_VALID";
+ case NPT_ERROR_TLS_CERTIFICATE_EXPIRED: return "NPT_ERROR_TLS_CERTIFICATE_EXPIRED";
+ case NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED: return "NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED";
+ case NPT_ERROR_TLS_CERTIFICATE_INVALID_CHAIN: return "NPT_ERROR_TLS_CERTIFICATE_INVALID_CHAIN";
+ case NPT_ERROR_TLS_CERTIFICATE_UNSUPPORTED_DIGEST: return "NPT_ERROR_TLS_CERTIFICATE_UNSUPPORTED_DIGEST";
+ case NPT_ERROR_TLS_CERTIFICATE_INVALID_PRIVATE_KEY: return "NPT_ERROR_TLS_CERTIFICATE_INVALID_PRIVATE_KEY";
+ case NPT_ERROR_TLS_DNS_NAME_MISMATCH: return "NPT_ERROR_TLS_DNS_NAME_MISMATCH";
+
+ default: return "UNKNOWN";
+ }
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptResults.h b/lib/libUPnP/Neptune/Source/Core/NptResults.h
new file mode 100644
index 0000000..274c545
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptResults.h
@@ -0,0 +1,163 @@
+/*****************************************************************
+|
+| Neptune - Result Codes
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_RESULTS_H_
+#define _NPT_RESULTS_H_
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#if defined(NPT_DEBUG)
+#include "NptDebug.h"
+#define NPT_CHECK(_x) \
+do { \
+ NPT_Result _result = (_x); \
+ if (_result != NPT_SUCCESS) { \
+ NPT_Debug("%s(%d): @@@ NPT_CHECK failed, result=%d (%s)\n", __FILE__, __LINE__, _result, NPT_ResultText(_result)); \
+ return _result; \
+ } \
+} while(0)
+#define NPT_CHECK_POINTER(_p) \
+do { \
+ if ((_p) == NULL) { \
+ NPT_Debug("%s(%d): @@@ NULL pointer parameter\n", __FILE__, __LINE__); \
+ return NPT_ERROR_INVALID_PARAMETERS; \
+ } \
+} while(0)
+#define NPT_CHECK_LABEL(_x, label) \
+do { \
+ NPT_Result _result = (_x); \
+ if (_result != NPT_SUCCESS) { \
+ NPT_Debug("%s(%d): @@@ NPT_CHECK failed, result=%d (%s)\n", __FILE__, __LINE__, _result, NPT_ResultText(_result)); \
+ goto label; \
+ } \
+} while(0)
+#define NPT_CHECK_POINTER_LABEL(_p, label) \
+do { \
+ if (_p == NULL) { \
+ NPT_Debug("%s(%d): @@@ NULL pointer parameter\n", __FILE__, __LINE__); \
+ goto label; \
+ } \
+} while(0)
+#else
+#define NPT_CHECK(_x) \
+do { \
+ NPT_Result _result = (_x); \
+ if (_result != NPT_SUCCESS) { \
+ return _result; \
+ } \
+} while(0)
+#define NPT_CHECK_POINTER(_p) \
+do { \
+ if ((_p) == NULL) return NPT_ERROR_INVALID_PARAMETERS; \
+} while(0)
+#define NPT_CHECK_LABEL(_x, label) \
+do { \
+ NPT_Result _result = (_x); \
+ if (_result != NPT_SUCCESS) { \
+ goto label; \
+ } \
+} while(0)
+#define NPT_CHECK_POINTER_LABEL(_p, label) \
+do { \
+ if ((_p) == NULL) { \
+ goto label; \
+ } \
+} while(0)
+#endif
+
+#define NPT_FAILED(result) ((result) != NPT_SUCCESS)
+#define NPT_SUCCEEDED(result) ((result) == NPT_SUCCESS)
+
+/*----------------------------------------------------------------------
+| result codes
++---------------------------------------------------------------------*/
+/** Result indicating that the operation or call succeeded */
+#define NPT_SUCCESS 0
+
+/** Result indicating an unspecififed failure condition */
+#define NPT_FAILURE (-1)
+
+#if !defined(NPT_ERROR_BASE)
+#define NPT_ERROR_BASE -20000
+#endif
+
+// error bases
+const int NPT_ERROR_BASE_GENERAL = NPT_ERROR_BASE-0;
+const int NPT_ERROR_BASE_LIST = NPT_ERROR_BASE-100;
+const int NPT_ERROR_BASE_FILE = NPT_ERROR_BASE-200;
+const int NPT_ERROR_BASE_IO = NPT_ERROR_BASE-300;
+const int NPT_ERROR_BASE_SOCKET = NPT_ERROR_BASE-400;
+const int NPT_ERROR_BASE_INTERFACES = NPT_ERROR_BASE-500;
+const int NPT_ERROR_BASE_XML = NPT_ERROR_BASE-600;
+const int NPT_ERROR_BASE_UNIX = NPT_ERROR_BASE-700;
+const int NPT_ERROR_BASE_HTTP = NPT_ERROR_BASE-800;
+const int NPT_ERROR_BASE_THREADS = NPT_ERROR_BASE-900;
+const int NPT_ERROR_BASE_SERIAL_PORT = NPT_ERROR_BASE-1000;
+const int NPT_ERROR_BASE_TLS = NPT_ERROR_BASE-1100;
+
+// general errors
+const int NPT_ERROR_INVALID_PARAMETERS = NPT_ERROR_BASE_GENERAL - 0;
+const int NPT_ERROR_PERMISSION_DENIED = NPT_ERROR_BASE_GENERAL - 1;
+const int NPT_ERROR_OUT_OF_MEMORY = NPT_ERROR_BASE_GENERAL - 2;
+const int NPT_ERROR_NO_SUCH_NAME = NPT_ERROR_BASE_GENERAL - 3;
+const int NPT_ERROR_NO_SUCH_PROPERTY = NPT_ERROR_BASE_GENERAL - 4;
+const int NPT_ERROR_NO_SUCH_ITEM = NPT_ERROR_BASE_GENERAL - 5;
+const int NPT_ERROR_NO_SUCH_CLASS = NPT_ERROR_BASE_GENERAL - 6;
+const int NPT_ERROR_OVERFLOW = NPT_ERROR_BASE_GENERAL - 7;
+const int NPT_ERROR_INTERNAL = NPT_ERROR_BASE_GENERAL - 8;
+const int NPT_ERROR_INVALID_STATE = NPT_ERROR_BASE_GENERAL - 9;
+const int NPT_ERROR_INVALID_FORMAT = NPT_ERROR_BASE_GENERAL - 10;
+const int NPT_ERROR_INVALID_SYNTAX = NPT_ERROR_BASE_GENERAL - 11;
+const int NPT_ERROR_NOT_IMPLEMENTED = NPT_ERROR_BASE_GENERAL - 12;
+const int NPT_ERROR_NOT_SUPPORTED = NPT_ERROR_BASE_GENERAL - 13;
+const int NPT_ERROR_TIMEOUT = NPT_ERROR_BASE_GENERAL - 14;
+const int NPT_ERROR_WOULD_BLOCK = NPT_ERROR_BASE_GENERAL - 15;
+const int NPT_ERROR_TERMINATED = NPT_ERROR_BASE_GENERAL - 16;
+const int NPT_ERROR_OUT_OF_RANGE = NPT_ERROR_BASE_GENERAL - 17;
+const int NPT_ERROR_OUT_OF_RESOURCES = NPT_ERROR_BASE_GENERAL - 18;
+const int NPT_ERROR_NOT_ENOUGH_SPACE = NPT_ERROR_BASE_GENERAL - 19;
+const int NPT_ERROR_INTERRUPTED = NPT_ERROR_BASE_GENERAL - 20;
+const int NPT_ERROR_CANCELLED = NPT_ERROR_BASE_GENERAL - 21;
+
+/* standard error codes */
+/* these are special codes to convey an errno */
+/* the error code is (SHI_ERROR_BASE_ERRNO - errno) */
+/* where errno is the positive integer from errno.h */
+const int NPT_ERROR_BASE_ERRNO = NPT_ERROR_BASE-2000;
+#define NPT_ERROR_ERRNO(e) (NPT_ERROR_BASE_ERRNO - (e))
+
+/*----------------------------------------------------------------------
+| functions
++---------------------------------------------------------------------*/
+const char* NPT_ResultText(int result);
+
+#endif // _NPT_RESULTS_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptRingBuffer.cpp b/lib/libUPnP/Neptune/Source/Core/NptRingBuffer.cpp
new file mode 100644
index 0000000..798176d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptRingBuffer.cpp
@@ -0,0 +1,269 @@
+/*****************************************************************
+|
+| Neptune - Ring Buffer
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptRingBuffer.h"
+#include "NptResults.h"
+#include "NptUtils.h"
+#include "NptStreams.h"
+
+/*----------------------------------------------------------------------
+| NPT_RingBuffer::NPT_RingBuffer
++---------------------------------------------------------------------*/
+NPT_RingBuffer::NPT_RingBuffer(NPT_Size size) :
+ m_BufferIsLocal(true),
+ m_Closed(false)
+{
+ m_Data.start = new unsigned char[size];
+ m_Data.end = m_Data.start + size;
+
+ m_In = m_Out = m_Data.start;
+}
+
+/*----------------------------------------------------------------------
+| NPT_RingBuffer::NPT_RingBuffer
++---------------------------------------------------------------------*/
+NPT_RingBuffer::NPT_RingBuffer(void* buffer, NPT_Size size) :
+ m_BufferIsLocal(false),
+ m_Closed(false)
+{
+ m_Data.start = (unsigned char*)buffer;
+ m_Data.end = m_Data.start + size;
+
+ m_In = m_Out = m_Data.start;
+}
+
+/*----------------------------------------------------------------------
+| NPT_RingBuffer::~NPT_RingBuffer
++---------------------------------------------------------------------*/
+NPT_RingBuffer::~NPT_RingBuffer()
+{
+ if (m_BufferIsLocal) delete[] m_Data.start;
+}
+
+/*----------------------------------------------------------------------
+| NPT_RingBuffer::GetContiguousSpace
++---------------------------------------------------------------------*/
+NPT_Size
+NPT_RingBuffer::GetContiguousSpace() const
+{
+ return
+ (m_In < m_Out) ?
+ (NPT_Size)(m_Out - m_In - 1) :
+ ((m_Out == m_Data.start) ?
+ (NPT_Size)(m_Data.end - m_In - 1) :
+ (NPT_Size)(m_Data.end - m_In));
+}
+
+/*----------------------------------------------------------------------
+| NPT_RingBuffer::GetSpace
++---------------------------------------------------------------------*/
+NPT_Size
+NPT_RingBuffer::GetSpace() const
+{
+ return
+ (m_In < m_Out) ?
+ (NPT_Size)(m_Out - m_In - 1) :
+ (NPT_Size)(m_Data.end - m_In + m_Out - m_Data.start - 1);
+}
+
+/*----------------------------------------------------------------------+
+| NPT_RingBuffer::Write
++----------------------------------------------------------------------*/
+NPT_Result
+NPT_RingBuffer::Write(const void* buffer, NPT_Size byte_count)
+{
+ if (m_Closed) return NPT_ERROR_WRITE_FAILED;
+
+ if (byte_count == 0) return NPT_SUCCESS;
+ if (m_In < m_Out) {
+ if (buffer) NPT_CopyMemory(m_In, buffer, byte_count);
+ m_In += byte_count;
+ if (m_In == m_Data.end) m_In = m_Data.start;
+ } else {
+ unsigned int chunk = (unsigned int)(m_Data.end - m_In);
+ if (chunk >= byte_count) chunk = byte_count;
+
+ if (buffer) NPT_CopyMemory(m_In, buffer, chunk);
+ m_In += chunk;
+ if (m_In == m_Data.end) m_In = m_Data.start;
+ if (chunk != byte_count) {
+ if (buffer) {
+ NPT_CopyMemory(m_In,
+ ((const char*)buffer)+chunk,
+ byte_count-chunk);
+ }
+ m_In += byte_count-chunk;
+ if (m_In == m_Data.end) m_In = m_Data.start;
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_RingBuffer::GetContiguousAvailable
++---------------------------------------------------------------------*/
+NPT_Size
+NPT_RingBuffer::GetContiguousAvailable() const
+{
+ return
+ (m_Out <= m_In) ?
+ (NPT_Size)(m_In-m_Out) :
+ (NPT_Size)(m_Data.end - m_Out);
+}
+
+/*----------------------------------------------------------------------
+| NPT_RingBuffer::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Size
+NPT_RingBuffer::GetAvailable() const
+{
+ return
+ (m_Out <= m_In) ?
+ (NPT_Size)(m_In-m_Out) :
+ (NPT_Size)(m_Data.end - m_Out + m_In - m_Data.start);
+}
+
+/*----------------------------------------------------------------------+
+| NPT_RingBuffer::Read
++----------------------------------------------------------------------*/
+NPT_Result
+NPT_RingBuffer::Read(void* buffer, NPT_Size byte_count)
+{
+ if (m_Closed) return NPT_ERROR_READ_FAILED;
+
+ if (byte_count == 0) return NPT_SUCCESS;
+ if (m_In > m_Out) {
+ if (buffer) NPT_CopyMemory(buffer, m_Out, byte_count);
+ m_Out += byte_count;
+ if (m_Out == m_Data.end) m_Out = m_Data.start;
+ } else {
+ unsigned int chunk = (unsigned int)(m_Data.end - m_Out);
+ if (chunk >= byte_count) chunk = byte_count;
+
+ if (buffer) NPT_CopyMemory(buffer, m_Out, chunk);
+ m_Out += chunk;
+ if (m_Out == m_Data.end) m_Out = m_Data.start;
+ if (chunk != byte_count) {
+ if (buffer) {
+ NPT_CopyMemory(((char*)buffer)+chunk, m_Out, byte_count-chunk);
+ }
+ m_Out += byte_count-chunk;
+ if (m_Out == m_Data.end) m_Out = m_Data.start;
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------+
+| NPT_RingBuffer::ReadByte
++----------------------------------------------------------------------*/
+unsigned char
+NPT_RingBuffer::ReadByte()
+{
+ unsigned char result = *m_Out++;
+ if (m_Out == m_Data.end) m_Out = m_Data.start;
+ return result;
+}
+
+/*----------------------------------------------------------------------+
+| NPT_RingBuffer::PeekByte
++----------------------------------------------------------------------*/
+unsigned char
+NPT_RingBuffer::PeekByte(NPT_Position offset)
+{
+ unsigned char *where;
+
+ where = m_Out+offset;
+ if (where >= m_Data.end) where -= (m_Data.end - m_Data.start);
+
+ return *where;
+}
+
+/*----------------------------------------------------------------------+
+| NPT_RingBuffer::MoveIn
++----------------------------------------------------------------------*/
+NPT_Result
+NPT_RingBuffer::MoveIn(NPT_Position offset)
+{
+ int fold;
+
+ m_In += offset;
+ fold = (int)(m_In - m_Data.end);
+ if (fold >= 0) {
+ m_In = m_Data.start + fold;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------+
+| NPT_RingBuffer::MoveOut
++----------------------------------------------------------------------*/
+NPT_Result
+NPT_RingBuffer::MoveOut(NPT_Position offset)
+{
+ int fold;
+
+ m_Out += offset;
+ fold = (int)(m_Out - m_Data.end);
+ if (fold >= 0) {
+ m_Out = m_Data.start + fold;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------+
+| NPT_RingBuffer::Flush
++----------------------------------------------------------------------*/
+NPT_Result
+NPT_RingBuffer::Flush()
+{
+ m_In = m_Out = m_Data.start;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------+
+| NPT_RingBuffer::Close
++----------------------------------------------------------------------*/
+NPT_Result
+NPT_RingBuffer::Close()
+{
+ m_Closed = true;
+ return NPT_SUCCESS;
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptRingBuffer.h b/lib/libUPnP/Neptune/Source/Core/NptRingBuffer.h
new file mode 100644
index 0000000..971e4a5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptRingBuffer.h
@@ -0,0 +1,83 @@
+/*****************************************************************
+|
+| Neptune - Ring Buffer
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_RING_BUFFER_H_
+#define _NPT_RING_BUFFER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptReferences.h"
+
+/*----------------------------------------------------------------------
+| NPT_RingBuffer
++---------------------------------------------------------------------*/
+class NPT_RingBuffer
+{
+ public:
+ // methods
+ NPT_RingBuffer(NPT_Size size);
+ NPT_RingBuffer(void* buffer, NPT_Size size);
+ virtual ~NPT_RingBuffer();
+ NPT_Size GetSpace() const;
+ NPT_Size GetContiguousSpace() const;
+ NPT_Result Write(const void* buffer, NPT_Size byte_count);
+ NPT_Size GetAvailable() const;
+ NPT_Size GetContiguousAvailable() const;
+ NPT_Result Read(void* buffer, NPT_Size byte_count);
+ unsigned char ReadByte();
+ unsigned char PeekByte(NPT_Position offset);
+ NPT_Result MoveIn(NPT_Position offset);
+ NPT_Result MoveOut(NPT_Position offset);
+ NPT_Result Flush();
+ NPT_Result Close();
+ bool IsClosed() { return m_Closed; }
+
+ // accessors
+ unsigned char* GetWritePointer() { return m_In; }
+ unsigned char* GetReadPointer() { return m_Out;}
+
+ private:
+ // members
+ struct {
+ unsigned char* start;
+ unsigned char* end;
+ } m_Data;
+ unsigned char* m_In;
+ unsigned char* m_Out;
+ bool m_BufferIsLocal;
+ bool m_Closed;
+};
+
+typedef NPT_Reference<NPT_RingBuffer> NPT_RingBufferReference;
+
+#endif // _NPT_RING_BUFFER_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptSelectableMessageQueue.h b/lib/libUPnP/Neptune/Source/Core/NptSelectableMessageQueue.h
new file mode 100644
index 0000000..56b55d0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptSelectableMessageQueue.h
@@ -0,0 +1,68 @@
+/*****************************************************************
+|
+| Neptune - Selectable Message Queue
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_SELECTABLE_MESSAGE_QUEUE_H_
+#define _NPT_SELECTABLE_MESSAGE_QUEUE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptMessaging.h"
+#include "NptSimpleMessageQueue.h"
+
+/*----------------------------------------------------------------------
+| NPT_SelectableMessageQueue
++---------------------------------------------------------------------*/
+class NPT_SelectableMessageQueue : public NPT_SimpleMessageQueue
+{
+public:
+ // methods
+ NPT_SelectableMessageQueue();
+ ~NPT_SelectableMessageQueue() override;
+
+ // NPT_MessageQueue methods
+ NPT_Result PumpMessage(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override;
+ NPT_Result QueueMessage(NPT_Message* message,
+ NPT_MessageHandler* handler) override;
+
+ // methods
+ int GetEventFd() { return m_Pipe[0]; }
+
+private:
+ // methods
+ NPT_Result FlushEvent();
+
+ // members
+ int m_Pipe[2];
+};
+
+
+#endif /* _NPT_SELECTABLE_MESSAGE_QUEUE_H_ */
diff --git a/lib/libUPnP/Neptune/Source/Core/NptSerialPort.h b/lib/libUPnP/Neptune/Source/Core/NptSerialPort.h
new file mode 100644
index 0000000..b543c11
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptSerialPort.h
@@ -0,0 +1,119 @@
+/*****************************************************************
+|
+| Neptune - Serial Ports
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_SERIAL_PORT_H_
+#define _NPT_SERIAL_PORT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptStreams.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ERROR_NO_SUCH_SERIAL_PORT = NPT_ERROR_BASE_SERIAL_PORT - 0;
+const int NPT_ERROR_SERIAL_PORT_NOT_OPEN = NPT_ERROR_BASE_SERIAL_PORT - 1;
+const int NPT_ERROR_SERIAL_PORT_ALREADY_OPEN = NPT_ERROR_BASE_SERIAL_PORT - 2;
+const int NPT_ERROR_SERIAL_PORT_BUSY = NPT_ERROR_BASE_SERIAL_PORT - 3;
+
+typedef enum {
+ NPT_SERIAL_PORT_PARITY_NONE,
+ NPT_SERIAL_PORT_PARITY_EVEN,
+ NPT_SERIAL_PORT_PARITY_ODD,
+ NPT_SERIAL_PORT_PARITY_MARK
+} NPT_SerialPortParity;
+
+typedef enum {
+ NPT_SERIAL_PORT_STOP_BITS_1,
+ NPT_SERIAL_PORT_STOP_BITS_1_5,
+ NPT_SERIAL_PORT_STOP_BITS_2
+} NPT_SerialPortStopBits;
+
+typedef enum {
+ NPT_SERIAL_PORT_FLOW_CONTROL_NONE,
+ NPT_SERIAL_PORT_FLOW_CONTROL_HARDWARE,
+ NPT_SERIAL_PORT_FLOW_CONTROL_XON_XOFF
+} NPT_SerialPortFlowControl;
+
+/*----------------------------------------------------------------------
+| NPT_SerialPortInterface
++---------------------------------------------------------------------*/
+class NPT_SerialPortInterface
+{
+public:
+ // constructors and destructor
+ virtual ~NPT_SerialPortInterface() {}
+
+ // methods
+ virtual NPT_Result Open(unsigned int speed,
+ NPT_SerialPortStopBits stop_bits,
+ NPT_SerialPortFlowControl flow_control,
+ NPT_SerialPortParity parity) = 0;
+ virtual NPT_Result Close() = 0;
+ virtual NPT_Result GetInputStream(NPT_InputStreamReference& stream) = 0;
+ virtual NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_SerialPort
++---------------------------------------------------------------------*/
+class NPT_SerialPort : public NPT_SerialPortInterface
+{
+public:
+ // constructors and destructor
+ NPT_SerialPort(const char* name);
+ ~NPT_SerialPort() override { delete m_Delegate; }
+
+ // NPT_SerialPortInterface methods
+ NPT_Result Open(unsigned int speed,
+ NPT_SerialPortStopBits stop_bits = NPT_SERIAL_PORT_STOP_BITS_1,
+ NPT_SerialPortFlowControl flow_control = NPT_SERIAL_PORT_FLOW_CONTROL_NONE,
+ NPT_SerialPortParity parity = NPT_SERIAL_PORT_PARITY_NONE) override {
+ return m_Delegate->Open(speed, stop_bits, flow_control, parity);
+ }
+ NPT_Result Close() override {
+ return m_Delegate->Close();
+ }
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override {
+ return m_Delegate->GetInputStream(stream);
+ }
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override {
+ return m_Delegate->GetOutputStream(stream);
+ }
+
+protected:
+ // members
+ NPT_SerialPortInterface* m_Delegate;
+};
+
+#endif // _NPT_SERIAL_PORT_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.cpp b/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.cpp
new file mode 100644
index 0000000..ef2298b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.cpp
@@ -0,0 +1,128 @@
+/*****************************************************************
+|
+| Neptune - Simple Message Queue
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptSimpleMessageQueue.h"
+#include "NptDebug.h"
+#include "NptLogging.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.message-queue")
+
+/*----------------------------------------------------------------------
+| NPT_SimpleMessageCapsule
++---------------------------------------------------------------------*/
+struct NPT_SimpleMessageCapsule
+{
+ NPT_SimpleMessageCapsule(NPT_Message* message,
+ NPT_MessageHandler* handler);
+ ~NPT_SimpleMessageCapsule();
+ NPT_Message* m_Message;
+ NPT_MessageHandler* m_Handler;
+ NPT_MessageHandlerProxy* m_Proxy;
+};
+
+/*----------------------------------------------------------------------
+| NPT_SimpleMessageCapsule::NPT_SimpleMessageCapsule
++---------------------------------------------------------------------*/
+NPT_SimpleMessageCapsule::NPT_SimpleMessageCapsule(NPT_Message* message,
+ NPT_MessageHandler* handler) :
+ m_Message(message),
+ m_Handler(handler),
+ m_Proxy(NPT_DYNAMIC_CAST(NPT_MessageHandlerProxy, handler))
+{
+ if (m_Proxy) m_Proxy->AddReference();
+}
+
+/*----------------------------------------------------------------------
+| NPT_SimpleMessageCapsule::~NPT_SimpleMessageCapsule
++---------------------------------------------------------------------*/
+NPT_SimpleMessageCapsule::~NPT_SimpleMessageCapsule()
+{
+ if (m_Proxy) m_Proxy->Release();
+}
+
+/*----------------------------------------------------------------------
+| NPT_SimpleMessageQueue::NPT_SimpleMessageQueue
++---------------------------------------------------------------------*/
+NPT_SimpleMessageQueue::NPT_SimpleMessageQueue()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_SimpleMessageQueue::~NPT_SimpleMessageQueue
++---------------------------------------------------------------------*/
+NPT_SimpleMessageQueue::~NPT_SimpleMessageQueue()
+{
+ // empty the queue
+ // TBD
+}
+
+/*----------------------------------------------------------------------
+| NPT_SimpleMessageQueue::QueueMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SimpleMessageQueue::QueueMessage(NPT_Message* message,
+ NPT_MessageHandler* handler)
+{
+ // push the message on the queue, with the handler reference
+ NPT_SimpleMessageCapsule* capsule = new NPT_SimpleMessageCapsule(message, handler);
+ NPT_Result result = m_Queue.Push(capsule);
+ if (NPT_FAILED(result)) delete capsule;
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SimpleMessageQueue::PumpMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SimpleMessageQueue::PumpMessage(NPT_Timeout timeout /* = NPT_TIMEOUT_INFINITE */)
+{
+ NPT_SimpleMessageCapsule* capsule;
+
+ NPT_LOG_FINEST_1("popping message from queue, timeout=%d", timeout);
+ NPT_Result result = m_Queue.Pop(capsule, timeout);
+ if (NPT_SUCCEEDED(result) && capsule) {
+ if (capsule->m_Handler && capsule->m_Message) {
+ result = capsule->m_Handler->HandleMessage(capsule->m_Message);
+ }
+ delete capsule->m_Message;
+ delete capsule;
+ } else {
+ NPT_LOG_FINEST_1("m_Queue.Pop() returned %d", result);
+ }
+
+ return result;
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.h b/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.h
new file mode 100644
index 0000000..ca43e89
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.h
@@ -0,0 +1,68 @@
+/*****************************************************************
+|
+| Neptune - Simple Message Queue
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_SIMPLE_MESSAGE_QUEUE_H_
+#define _NPT_SIMPLE_MESSAGE_QUEUE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptThreads.h"
+#include "NptMessaging.h"
+#include "NptQueue.h"
+
+/*----------------------------------------------------------------------
+| class references
++---------------------------------------------------------------------*/
+struct NPT_SimpleMessageCapsule;
+
+/*----------------------------------------------------------------------
+| NPT_SimpleMessageQueue
++---------------------------------------------------------------------*/
+class NPT_SimpleMessageQueue : public NPT_MessageQueue
+{
+ public:
+ // members
+ NPT_SimpleMessageQueue();
+ ~NPT_SimpleMessageQueue() override;
+
+ // NPT_MessageQueue methods
+ NPT_Result QueueMessage(NPT_Message* message,
+ NPT_MessageHandler* handler) override;
+ NPT_Result PumpMessage(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override;
+
+ private:
+ // members
+ NPT_Queue<NPT_SimpleMessageCapsule> m_Queue;
+};
+
+#endif // _NPT_SIMPLE_MESSAGE_QUEUE_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptSockets.cpp b/lib/libUPnP/Neptune/Source/Core/NptSockets.cpp
new file mode 100644
index 0000000..7958f61
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptSockets.cpp
@@ -0,0 +1,59 @@
+/*****************************************************************
+|
+| Neptune - Sockets
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptSockets.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| NPT_SocketAddress::ToString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_SocketAddress::ToString() const
+{
+ NPT_String s = m_IpAddress.ToString();
+ s += ':';
+ s += NPT_String::FromInteger(m_Port);
+ return s;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SocketAddress::operator==
++---------------------------------------------------------------------*/
+bool
+NPT_SocketAddress::operator==(const NPT_SocketAddress& other) const
+{
+ return (other.GetIpAddress().AsLong() == m_IpAddress.AsLong() &&
+ other.GetPort() == m_Port);
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptSockets.h b/lib/libUPnP/Neptune/Source/Core/NptSockets.h
new file mode 100644
index 0000000..899e1bf
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptSockets.h
@@ -0,0 +1,340 @@
+/*****************************************************************
+|
+| Neptune - Network Sockets
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_SOCKETS_H_
+#define _NPT_SOCKETS_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptStreams.h"
+#include "NptStrings.h"
+#include "NptDataBuffer.h"
+#include "NptNetwork.h"
+#include "NptThreads.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ERROR_CONNECTION_RESET = NPT_ERROR_BASE_SOCKET - 0;
+const int NPT_ERROR_CONNECTION_ABORTED = NPT_ERROR_BASE_SOCKET - 1;
+const int NPT_ERROR_CONNECTION_REFUSED = NPT_ERROR_BASE_SOCKET - 2;
+const int NPT_ERROR_CONNECTION_FAILED = NPT_ERROR_BASE_SOCKET - 3;
+const int NPT_ERROR_HOST_UNKNOWN = NPT_ERROR_BASE_SOCKET - 4;
+const int NPT_ERROR_SOCKET_FAILED = NPT_ERROR_BASE_SOCKET - 5;
+const int NPT_ERROR_GETSOCKOPT_FAILED = NPT_ERROR_BASE_SOCKET - 6;
+const int NPT_ERROR_SETSOCKOPT_FAILED = NPT_ERROR_BASE_SOCKET - 7;
+const int NPT_ERROR_SOCKET_CONTROL_FAILED = NPT_ERROR_BASE_SOCKET - 8;
+const int NPT_ERROR_BIND_FAILED = NPT_ERROR_BASE_SOCKET - 9;
+const int NPT_ERROR_LISTEN_FAILED = NPT_ERROR_BASE_SOCKET - 10;
+const int NPT_ERROR_ACCEPT_FAILED = NPT_ERROR_BASE_SOCKET - 11;
+const int NPT_ERROR_ADDRESS_IN_USE = NPT_ERROR_BASE_SOCKET - 12;
+const int NPT_ERROR_NETWORK_DOWN = NPT_ERROR_BASE_SOCKET - 13;
+const int NPT_ERROR_NETWORK_UNREACHABLE = NPT_ERROR_BASE_SOCKET - 14;
+const int NPT_ERROR_HOST_UNREACHABLE = NPT_ERROR_BASE_SOCKET - 15;
+const int NPT_ERROR_NOT_CONNECTED = NPT_ERROR_BASE_SOCKET - 16;
+
+const unsigned int NPT_SOCKET_FLAG_CANCELLABLE = 1; // make the socket cancellable
+
+/*----------------------------------------------------------------------
+| forward references
++---------------------------------------------------------------------*/
+class NPT_Socket;
+
+/*----------------------------------------------------------------------
+| NPT_SocketAddress
++---------------------------------------------------------------------*/
+class NPT_SocketAddress
+{
+public:
+ // constructors and destructor
+ NPT_SocketAddress() : m_Port(0) {}
+ NPT_SocketAddress(const NPT_IpAddress& address, NPT_IpPort port) :
+ m_IpAddress(address),
+ m_Port(port) {}
+
+ // methods
+ NPT_Result SetIpAddress(const NPT_IpAddress& address) {
+ m_IpAddress = address;
+ return NPT_SUCCESS;
+ }
+ const NPT_IpAddress& GetIpAddress() const {
+ return m_IpAddress;
+ }
+ NPT_Result SetPort(NPT_IpPort port) {
+ m_Port = port;
+ return NPT_SUCCESS;
+ }
+ NPT_IpPort GetPort() const {
+ return m_Port;
+ }
+ NPT_String ToString() const;
+
+ // operators
+ bool operator==(const NPT_SocketAddress& other) const;
+
+private:
+ // members
+ NPT_IpAddress m_IpAddress;
+ NPT_IpPort m_Port;
+};
+
+/*----------------------------------------------------------------------
+| NPT_SocketInfo
++---------------------------------------------------------------------*/
+typedef struct {
+ NPT_SocketAddress local_address;
+ NPT_SocketAddress remote_address;
+} NPT_SocketInfo;
+
+/*----------------------------------------------------------------------
+| NPT_SocketInterface
++---------------------------------------------------------------------*/
+class NPT_SocketInterface
+{
+ public:
+ virtual ~NPT_SocketInterface() {}
+
+ // interface methods
+ virtual NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true) = 0;
+ virtual NPT_Result Connect(const NPT_SocketAddress& address, NPT_Timeout timeout) = 0;
+ virtual NPT_Result WaitForConnection(NPT_Timeout timeout) = 0;
+ virtual NPT_Result GetInputStream(NPT_InputStreamReference& stream) = 0;
+ virtual NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) = 0;
+ virtual NPT_Result GetInfo(NPT_SocketInfo& info) = 0;
+ virtual NPT_Result SetReadTimeout(NPT_Timeout timeout) = 0;
+ virtual NPT_Result SetWriteTimeout(NPT_Timeout timeout) = 0;
+ virtual NPT_Result Cancel(bool shutdown=true) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_UdpSocketInterface
++---------------------------------------------------------------------*/
+class NPT_UdpSocketInterface
+{
+ public:
+ virtual ~NPT_UdpSocketInterface() {}
+
+ // methods
+ virtual NPT_Result Send(const NPT_DataBuffer& packet,
+ const NPT_SocketAddress* address = NULL) = 0;
+ virtual NPT_Result Receive(NPT_DataBuffer& packet,
+ NPT_SocketAddress* address = NULL) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_UdpMulticastSocketInterface
++---------------------------------------------------------------------*/
+class NPT_UdpMulticastSocketInterface
+{
+ public:
+ virtual ~NPT_UdpMulticastSocketInterface() {}
+
+ // methods
+ virtual NPT_Result JoinGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface) = 0;
+ virtual NPT_Result LeaveGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface) = 0;
+ virtual NPT_Result SetTimeToLive(unsigned char ttl) = 0;
+ virtual NPT_Result SetInterface(const NPT_IpAddress& iface) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TcpServerSocketInterface
++---------------------------------------------------------------------*/
+class NPT_TcpServerSocketInterface
+{
+ public:
+ virtual ~NPT_TcpServerSocketInterface() {}
+
+ // interface methods
+ virtual NPT_Result Listen(unsigned int max_clients) = 0;
+ virtual NPT_Result WaitForNewClient(NPT_Socket*& client,
+ NPT_Timeout timeout,
+ NPT_Flags flags) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Socket
++---------------------------------------------------------------------*/
+class NPT_Socket : public NPT_SocketInterface
+{
+public:
+ // static methods
+ static NPT_Result CancelBlockerSocket(NPT_Thread::ThreadId thread_id);
+
+ // constructor and destructor
+ explicit NPT_Socket(NPT_SocketInterface* delegate) : m_SocketDelegate(delegate) {}
+ ~NPT_Socket() override;
+
+ // delegate NPT_SocketInterface methods
+ NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true) override {
+ return m_SocketDelegate->Bind(address, reuse_address);
+ }
+ NPT_Result Connect(const NPT_SocketAddress& address,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_SocketDelegate->Connect(address, timeout);
+ }
+ NPT_Result WaitForConnection(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_SocketDelegate->WaitForConnection(timeout);
+ }
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override {
+ return m_SocketDelegate->GetInputStream(stream);
+ }
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override {
+ return m_SocketDelegate->GetOutputStream(stream);
+ }
+ NPT_Result GetInfo(NPT_SocketInfo& info) override {
+ return m_SocketDelegate->GetInfo(info);
+ }
+ NPT_Result SetReadTimeout(NPT_Timeout timeout) override {
+ return m_SocketDelegate->SetReadTimeout(timeout);
+ }
+ NPT_Result SetWriteTimeout(NPT_Timeout timeout) override {
+ return m_SocketDelegate->SetWriteTimeout(timeout);
+ }
+ NPT_Result Cancel(bool shutdown=true) override {
+ return m_SocketDelegate->Cancel(shutdown);
+ }
+
+protected:
+ // constructor
+ NPT_Socket() : m_SocketDelegate(NULL) {}
+
+ // members
+ NPT_SocketInterface* m_SocketDelegate;
+};
+
+typedef NPT_Reference<NPT_Socket> NPT_SocketReference;
+
+/*----------------------------------------------------------------------
+| NPT_UdpSocket
++---------------------------------------------------------------------*/
+class NPT_UdpSocket : public NPT_Socket,
+ public NPT_UdpSocketInterface
+{
+ public:
+ // constructor and destructor
+ NPT_UdpSocket(NPT_Flags flags=0);
+ ~NPT_UdpSocket() override;
+
+ // delegate NPT_UdpSocketInterface methods
+ NPT_Result Send(const NPT_DataBuffer& packet,
+ const NPT_SocketAddress* address = NULL) override {
+ return m_UdpSocketDelegate->Send(packet, address);
+ }
+ NPT_Result Receive(NPT_DataBuffer& packet,
+ NPT_SocketAddress* address = NULL) override {
+ return m_UdpSocketDelegate->Receive(packet, address);
+ }
+
+protected:
+ // constructor
+ NPT_UdpSocket(NPT_UdpSocketInterface* delegate);
+
+ // members
+ NPT_UdpSocketInterface* m_UdpSocketDelegate;
+};
+
+/*----------------------------------------------------------------------
+| NPT_UdpMulticastSocket
++---------------------------------------------------------------------*/
+class NPT_UdpMulticastSocket : public NPT_UdpSocket,
+ public NPT_UdpMulticastSocketInterface
+{
+public:
+ // constructor and destructor
+ NPT_UdpMulticastSocket(NPT_Flags flags=0);
+ ~NPT_UdpMulticastSocket() override;
+
+ // delegate NPT_UdpMulticastSocketInterface methods
+ NPT_Result JoinGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface =
+ NPT_IpAddress::Any) override {
+ return m_UdpMulticastSocketDelegate->JoinGroup(group, iface);
+ }
+ NPT_Result LeaveGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface =
+ NPT_IpAddress::Any) override {
+ return m_UdpMulticastSocketDelegate->LeaveGroup(group, iface);
+ }
+ NPT_Result SetTimeToLive(unsigned char ttl) override {
+ return m_UdpMulticastSocketDelegate->SetTimeToLive(ttl);
+ }
+ NPT_Result SetInterface(const NPT_IpAddress& iface) override {
+ return m_UdpMulticastSocketDelegate->SetInterface(iface);
+ }
+
+protected:
+ // members
+ NPT_UdpMulticastSocketInterface* m_UdpMulticastSocketDelegate;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TcpClientSocket
++---------------------------------------------------------------------*/
+class NPT_TcpClientSocket : public NPT_Socket
+{
+public:
+ // constructors and destructor
+ NPT_TcpClientSocket(NPT_Flags flags=0);
+ ~NPT_TcpClientSocket() override;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TcpServerSocket
++---------------------------------------------------------------------*/
+class NPT_TcpServerSocket : public NPT_Socket,
+ public NPT_TcpServerSocketInterface
+{
+public:
+ // constructors and destructor
+ NPT_TcpServerSocket(NPT_Flags flags=0);
+ ~NPT_TcpServerSocket() override;
+
+ // delegate NPT_TcpServerSocketInterface methods
+ NPT_Result Listen(unsigned int max_clients) override {
+ return m_TcpServerSocketDelegate->Listen(max_clients);
+ }
+ NPT_Result WaitForNewClient(NPT_Socket*& client,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE,
+ NPT_Flags flags = 0) override {
+ return m_TcpServerSocketDelegate->WaitForNewClient(client, timeout, flags);
+ }
+
+protected:
+ // members
+ NPT_TcpServerSocketInterface* m_TcpServerSocketDelegate;
+};
+
+#endif // _NPT_SOCKETS_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptStack.h b/lib/libUPnP/Neptune/Source/Core/NptStack.h
new file mode 100644
index 0000000..5078805
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptStack.h
@@ -0,0 +1,74 @@
+/*****************************************************************
+|
+| Neptune - Stack
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+#ifndef _NPT_STACK_H_
+#define _NPT_STACK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptResults.h"
+#include "NptTypes.h"
+#include "NptList.h"
+
+/*----------------------------------------------------------------------
+| NPT_Stack
++---------------------------------------------------------------------*/
+template <typename T>
+class NPT_Stack : public NPT_List<T>
+{
+public:
+ // methods
+ NPT_Result Push(const T& value) {
+ // NOTE: we must use the this-> accessor here because the standard
+ // requires it when the member to look up is in a parent template
+ return this->Add(value);
+ }
+
+ NPT_Result Peek(T& value) {
+ // NOTE: we must use the this-> accessor here because the standard
+ // requires it when the member to look up is in a parent template
+ if (this->m_ItemCount == 0) return NPT_ERROR_NO_SUCH_ITEM;
+ value = this->m_Tail->m_Data;
+ return NPT_SUCCESS;
+ }
+
+ NPT_Result Pop(T& value) {
+ // NOTE: we must use the this-> accessor here because the standard
+ // requires it when the member to look up is in a parent template
+ if (this->m_ItemCount == 0) return NPT_ERROR_NO_SUCH_ITEM;
+ typename NPT_List<T>::Iterator tail = this->GetLastItem();
+ value = *tail;
+ return this->Erase(tail);
+ }
+};
+
+#endif // _NPT_STACK_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptStreams.cpp b/lib/libUPnP/Neptune/Source/Core/NptStreams.cpp
new file mode 100644
index 0000000..79909fa
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptStreams.cpp
@@ -0,0 +1,724 @@
+/*****************************************************************
+|
+| Neptune - Byte Streams
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptStreams.h"
+#include "NptUtils.h"
+#include "NptConstants.h"
+#include "NptStrings.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const NPT_Size NPT_INPUT_STREAM_LOAD_DEFAULT_READ_CHUNK = 4096;
+const NPT_LargeSize NPT_INPUT_STREAM_LOAD_MAX_SIZE = 0x40000000; // 1GB
+
+/*----------------------------------------------------------------------
+| NPT_InputStream::Load
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_InputStream::Load(NPT_DataBuffer& buffer, NPT_Size max_read /* = 0 */)
+{
+ NPT_Result result;
+ NPT_LargeSize total_bytes_read;
+
+ // reset the buffer
+ buffer.SetDataSize(0);
+
+ // check the limits
+ if (max_read > NPT_INPUT_STREAM_LOAD_MAX_SIZE) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // try to get the stream size
+ NPT_LargeSize size;
+ if (NPT_SUCCEEDED(GetSize(size))) {
+ // make sure we don't read more than max_read
+ if (max_read && max_read < size) size = max_read;
+ if (size > NPT_INPUT_STREAM_LOAD_MAX_SIZE) {
+ return NPT_ERROR_OUT_OF_RANGE;
+ }
+ } else {
+ size = max_read;
+ }
+
+ // pre-allocate the buffer
+ if (size) NPT_CHECK(buffer.Reserve((NPT_Size)size));
+
+ // read the data from the file
+ total_bytes_read = 0;
+ do {
+ NPT_LargeSize available = 0;
+ NPT_LargeSize bytes_to_read;
+ NPT_Size bytes_read;
+ NPT_Byte* data;
+
+ // check if we know how much data is available
+ result = GetAvailable(available);
+ if (NPT_SUCCEEDED(result) && available) {
+ // we know how much is available
+ bytes_to_read = available;
+ } else {
+ bytes_to_read = NPT_INPUT_STREAM_LOAD_DEFAULT_READ_CHUNK;
+ }
+
+ // make sure we don't read more than what was asked
+ if (size != 0 && total_bytes_read+bytes_to_read>size) {
+ bytes_to_read = size-total_bytes_read;
+ }
+
+ // stop if we've read everything
+ if (bytes_to_read == 0) break;
+
+ // ensure that the buffer has enough space
+ if (total_bytes_read+bytes_to_read > NPT_INPUT_STREAM_LOAD_MAX_SIZE) {
+ buffer.SetBufferSize(0);
+ return NPT_ERROR_OUT_OF_RANGE;
+ }
+ NPT_CHECK(buffer.Reserve((NPT_Size)(total_bytes_read+bytes_to_read)));
+
+ // read the data
+ data = buffer.UseData()+total_bytes_read;
+ result = Read((void*)data, (NPT_Size)bytes_to_read, &bytes_read);
+ if (NPT_SUCCEEDED(result) && bytes_read != 0) {
+ total_bytes_read += bytes_read;
+ buffer.SetDataSize((NPT_Size)total_bytes_read);
+ }
+ } while(NPT_SUCCEEDED(result) && (size==0 || total_bytes_read < size));
+
+ if (result == NPT_ERROR_EOS) {
+ return NPT_SUCCESS;
+ } else {
+ return result;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_InputStream::ReadFully
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_InputStream::ReadFully(void* buffer, NPT_Size bytes_to_read)
+{
+ // shortcut
+ if (bytes_to_read == 0) return NPT_SUCCESS;
+
+ // read until failure
+ NPT_Size bytes_read;
+ while (bytes_to_read) {
+ NPT_Result result = Read(buffer, bytes_to_read, &bytes_read);
+ if (NPT_FAILED(result)) return result;
+ if (bytes_read == 0) return NPT_ERROR_INTERNAL;
+ NPT_ASSERT(bytes_read <= bytes_to_read);
+ bytes_to_read -= bytes_read;
+ buffer = (void*)(((NPT_Byte*)buffer)+bytes_read);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_InputStream::ReadUI64
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_InputStream::ReadUI64(NPT_UInt64& value)
+{
+ unsigned char buffer[8];
+
+ // read bytes from the stream
+ NPT_Result result;
+ result = ReadFully((void*)buffer, 8);
+ if (NPT_FAILED(result)) {
+ value = 0;
+ return result;
+ }
+
+ // convert bytes to value
+ value = NPT_BytesToInt64Be(buffer);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_InputStream::ReadUI32
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_InputStream::ReadUI32(NPT_UInt32& value)
+{
+ unsigned char buffer[4];
+
+ // read bytes from the stream
+ NPT_Result result;
+ result = ReadFully((void*)buffer, 4);
+ if (NPT_FAILED(result)) {
+ value = 0;
+ return result;
+ }
+
+ // convert bytes to value
+ value = NPT_BytesToInt32Be(buffer);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_InputStream::ReadUI24
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_InputStream::ReadUI24(NPT_UInt32& value)
+{
+ unsigned char buffer[3];
+
+ // read bytes from the stream
+ NPT_Result result;
+ result = ReadFully((void*)buffer, 3);
+ if (NPT_FAILED(result)) {
+ value = 0;
+ return result;
+ }
+
+ // convert bytes to value
+ value = NPT_BytesToInt24Be(buffer);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_InputStream::ReadUI16
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_InputStream::ReadUI16(NPT_UInt16& value)
+{
+ unsigned char buffer[2];
+
+ // read bytes from the stream
+ NPT_Result result;
+ result = ReadFully((void*)buffer, 2);
+ if (NPT_FAILED(result)) {
+ value = 0;
+ return result;
+ }
+
+ // convert bytes to value
+ value = NPT_BytesToInt16Be(buffer);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_InputStream::ReadUI08
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_InputStream::ReadUI08(NPT_UInt8& value)
+{
+ unsigned char buffer[1];
+
+ // read bytes from the stream
+ NPT_Result result;
+ result = ReadFully((void*)buffer, 1);
+ if (NPT_FAILED(result)) {
+ value = 0;
+ return result;
+ }
+
+ // convert bytes to value
+ value = buffer[0];
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_InputStream::Skip
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_InputStream::Skip(NPT_Size count)
+{
+ // get the current location
+ NPT_Position position;
+ NPT_CHECK(Tell(position));
+
+ // seek ahead
+ return Seek(position+count);
+}
+
+/*----------------------------------------------------------------------
+| NPT_OutputStream::WriteFully
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_OutputStream::WriteFully(const void* buffer, NPT_Size bytes_to_write)
+{
+ // shortcut
+ if (bytes_to_write == 0) return NPT_SUCCESS;
+
+ // write until failure
+ NPT_Size bytes_written;
+ while (bytes_to_write) {
+ NPT_Result result = Write(buffer, bytes_to_write, &bytes_written);
+ if (NPT_FAILED(result)) return result;
+ if (bytes_written == 0) return NPT_ERROR_INTERNAL;
+ NPT_ASSERT(bytes_written <= bytes_to_write);
+ bytes_to_write -= bytes_written;
+ buffer = (const void*)(((const NPT_Byte*)buffer)+bytes_written);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_OutputStream::WriteString
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_OutputStream::WriteString(const char* buffer)
+{
+ // shortcut
+ NPT_Size string_length;
+ if (buffer == NULL || (string_length = NPT_StringLength(buffer)) == 0) {
+ return NPT_SUCCESS;
+ }
+
+ // write the string
+ return WriteFully((const void*)buffer, string_length);
+}
+
+/*----------------------------------------------------------------------
+| NPT_OutputStream::WriteLine
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_OutputStream::WriteLine(const char* buffer)
+{
+ NPT_CHECK(WriteString(buffer));
+ NPT_CHECK(WriteFully((const void*)"\r\n", 2));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_OutputStream::WriteUI64
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_OutputStream::WriteUI64(NPT_UInt64 value)
+{
+ unsigned char buffer[8];
+
+ // convert value to bytes
+ NPT_BytesFromInt64Be(buffer, value);
+
+ // write bytes to the stream
+ return WriteFully((void*)buffer, 8);
+}
+
+/*----------------------------------------------------------------------
+| NPT_OutputStream::WriteUI32
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_OutputStream::WriteUI32(NPT_UInt32 value)
+{
+ unsigned char buffer[4];
+
+ // convert value to bytes
+ NPT_BytesFromInt32Be(buffer, value);
+
+ // write bytes to the stream
+ return WriteFully((void*)buffer, 4);
+}
+
+/*----------------------------------------------------------------------
+| NPT_OutputStream::WriteUI24
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_OutputStream::WriteUI24(NPT_UInt32 value)
+{
+ unsigned char buffer[3];
+
+ // convert value to bytes
+ NPT_BytesFromInt24Be(buffer, value);
+
+ // write bytes to the stream
+ return WriteFully((void*)buffer, 3);
+}
+
+/*----------------------------------------------------------------------
+| NPT_OutputStream::WriteUI16
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_OutputStream::WriteUI16(NPT_UInt16 value)
+{
+ unsigned char buffer[2];
+
+ // convert value to bytes
+ NPT_BytesFromInt16Be(buffer, value);
+
+ // write bytes to the stream
+ return WriteFully((void*)buffer, 2);
+}
+
+/*----------------------------------------------------------------------
+| NPT_OutputStream::WriteUI08
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_OutputStream::WriteUI08(NPT_UInt8 value)
+{
+ return WriteFully((void*)&value, 1);
+}
+
+/*----------------------------------------------------------------------
+| NPT_MemoryStream::NPT_MemoryStream
++---------------------------------------------------------------------*/
+NPT_MemoryStream::NPT_MemoryStream(NPT_Size initial_capacity) :
+ m_Buffer(initial_capacity),
+ m_ReadOffset(0),
+ m_WriteOffset(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_MemoryStream::NPT_MemoryStream
++---------------------------------------------------------------------*/
+NPT_MemoryStream::NPT_MemoryStream(const void* data, NPT_Size size) :
+ m_Buffer(data, size),
+ m_ReadOffset(0),
+ m_WriteOffset(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_MemoryStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_MemoryStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ // check for shortcut
+ if (bytes_to_read == 0) {
+ if (bytes_read) *bytes_read = 0;
+ return NPT_SUCCESS;
+ }
+
+ // clip to what's available
+ NPT_Size available = m_Buffer.GetDataSize();
+ if (m_ReadOffset+bytes_to_read > available) {
+ bytes_to_read = available-m_ReadOffset;
+ }
+
+ // copy the data
+ if (bytes_to_read) {
+ NPT_CopyMemory(buffer, (void*)(((char*)m_Buffer.UseData())+m_ReadOffset), bytes_to_read);
+ m_ReadOffset += bytes_to_read;
+ }
+ if (bytes_read) *bytes_read = bytes_to_read;
+
+ return bytes_to_read?NPT_SUCCESS:NPT_ERROR_EOS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_MemoryStream::InputSeek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_MemoryStream::InputSeek(NPT_Position offset)
+{
+ if (offset > m_Buffer.GetDataSize()) {
+ return NPT_ERROR_OUT_OF_RANGE;
+ } else {
+ m_ReadOffset = (NPT_Size)offset;
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_MemoryStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_MemoryStream::Write(const void* data,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written)
+{
+ NPT_CHECK(m_Buffer.Reserve(m_WriteOffset+bytes_to_write));
+
+ NPT_CopyMemory(m_Buffer.UseData()+m_WriteOffset, data, bytes_to_write);
+ m_WriteOffset += bytes_to_write;
+ if (m_WriteOffset > m_Buffer.GetDataSize()) {
+ m_Buffer.SetDataSize(m_WriteOffset);
+ }
+ if (bytes_written) *bytes_written = bytes_to_write;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_MemoryStream::OutputSeek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_MemoryStream::OutputSeek(NPT_Position offset)
+{
+ if (offset <= m_Buffer.GetDataSize()) {
+ m_WriteOffset = (NPT_Size)offset;
+ return NPT_SUCCESS;
+ } else {
+ return NPT_ERROR_OUT_OF_RANGE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_MemoryStream::SetDataSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_MemoryStream::SetDataSize(NPT_Size size)
+{
+ // update data amount in buffer
+ NPT_CHECK(m_Buffer.SetDataSize(size));
+
+ // adjust the read and write offsets
+ if (m_ReadOffset > size) m_ReadOffset = size;
+ if (m_WriteOffset > size) m_WriteOffset = size;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_StreamToStreamCopy
++---------------------------------------------------------------------*/
+const unsigned int NPT_STREAM_COPY_BUFFER_SIZE = 65536; // copy 64k at a time
+NPT_Result
+NPT_StreamToStreamCopy(NPT_InputStream& from,
+ NPT_OutputStream& to,
+ NPT_Position offset /* = 0 */,
+ NPT_LargeSize size /* = 0, 0 means the entire stream */,
+ NPT_LargeSize* bytes_written /* = NULL */)
+{
+ // default values
+ if (bytes_written) *bytes_written = 0;
+
+ // seek into the input if required
+ if (offset) {
+ NPT_CHECK(from.Seek(offset));
+ }
+
+ // allocate a buffer for the transfer
+ NPT_LargeSize bytes_transfered = 0;
+ NPT_Byte* buffer = new NPT_Byte[NPT_STREAM_COPY_BUFFER_SIZE];
+ NPT_Result result = NPT_SUCCESS;
+ if (buffer == NULL) return NPT_ERROR_OUT_OF_MEMORY;
+
+ // copy until an error occurs or the end of stream is reached
+ for (;;) {
+ // read some data
+ NPT_Size bytes_to_read = NPT_STREAM_COPY_BUFFER_SIZE;
+ NPT_Size bytes_read = 0;
+ if (size) {
+ // a max size was specified
+ if (size-bytes_transfered < NPT_STREAM_COPY_BUFFER_SIZE) {
+ bytes_to_read = (NPT_Size)(size-bytes_transfered);
+ }
+ }
+ result = from.Read(buffer, bytes_to_read, &bytes_read);
+ if (NPT_FAILED(result)) {
+ if (result == NPT_ERROR_EOS) result = NPT_SUCCESS;
+ break;
+ }
+ if (bytes_read == 0) continue;
+
+ NPT_Size buffer_bytes_to_write = bytes_read;
+ NPT_Byte* buffer_bytes = (NPT_Byte*)buffer;
+ while (buffer_bytes_to_write) {
+ NPT_Size buffer_bytes_written = 0;
+ result = to.Write(buffer_bytes, buffer_bytes_to_write, &buffer_bytes_written);
+ if (NPT_FAILED(result)) goto end;
+ NPT_ASSERT(buffer_bytes_written <= buffer_bytes_to_write);
+ buffer_bytes_to_write -= buffer_bytes_written;
+ if (bytes_written) *bytes_written += buffer_bytes_written;
+ buffer_bytes += buffer_bytes_written;
+ }
+
+ // update the counts
+ if (size) {
+ bytes_transfered += bytes_read;
+ if (bytes_transfered >= size) break;
+ }
+ }
+
+end:
+ // free the buffer and return
+ delete[] buffer;
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_StringOutputStream::NPT_StringOutputStream
++---------------------------------------------------------------------*/
+NPT_StringOutputStream::NPT_StringOutputStream(NPT_Size size) :
+ m_String(new NPT_String),
+ m_StringIsOwned(true)
+{
+ m_String->Reserve(size);
+}
+
+
+/*----------------------------------------------------------------------
+| NPT_StringOutputStream::NPT_StringOutputStream
++---------------------------------------------------------------------*/
+NPT_StringOutputStream::NPT_StringOutputStream(NPT_String* storage) :
+ m_String(storage),
+ m_StringIsOwned(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_StringOutputStream::~NPT_StringOutputStream
++---------------------------------------------------------------------*/
+NPT_StringOutputStream::~NPT_StringOutputStream()
+{
+ if (m_StringIsOwned) delete m_String;
+}
+
+/*----------------------------------------------------------------------
+| NPT_StringOutputStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StringOutputStream::Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written /* = NULL */)
+{
+ m_String->Append((const char*)buffer, bytes_to_write);
+ if (bytes_written) *bytes_written = bytes_to_write;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SubInputStream::NPT_SubInputStream
++---------------------------------------------------------------------*/
+NPT_SubInputStream::NPT_SubInputStream(NPT_InputStreamReference& source,
+ NPT_Position start,
+ NPT_LargeSize size) :
+ m_Source(source),
+ m_Position(0),
+ m_Start(start),
+ m_Size(size)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_SubInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SubInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ // default values
+ if (bytes_read) *bytes_read = 0;
+
+ // shortcut
+ if (bytes_to_read == 0) {
+ return NPT_SUCCESS;
+ }
+
+ // clamp to range
+ if (m_Position+bytes_to_read > m_Size) {
+ bytes_to_read = (NPT_Size)(m_Size - m_Position);
+ }
+
+ // check for end of substream
+ if (bytes_to_read == 0) {
+ return NPT_ERROR_EOS;
+ }
+
+ // seek inside the source
+ NPT_Result result;
+ result = m_Source->Seek(m_Start+m_Position);
+ if (NPT_FAILED(result)) {
+ return result;
+ }
+
+ // read from the source
+ NPT_Size source_bytes_read = 0;
+ result = m_Source->Read(buffer, bytes_to_read, &source_bytes_read);
+ if (NPT_SUCCEEDED(result)) {
+ m_Position += source_bytes_read;
+ if (bytes_read) *bytes_read = source_bytes_read;
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SubInputStream::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SubInputStream::Seek(NPT_Position position)
+{
+ if (position == m_Position) return NPT_SUCCESS;
+ if (position > m_Size) return NPT_ERROR_OUT_OF_RANGE;
+ m_Position = position;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SubInputStream::Tell
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SubInputStream::Tell(NPT_Position& position)
+{
+ position = m_Position;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SubInputStream::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SubInputStream::GetSize(NPT_LargeSize& size)
+{
+ size = m_Size;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SubInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SubInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ available = m_Size-m_Position;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_NullOutputStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NullOutputStream::Write(const void* /*buffer*/,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written /* = NULL */)
+{
+ if (bytes_written) *bytes_written = bytes_to_write;
+ return NPT_SUCCESS;
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptStreams.h b/lib/libUPnP/Neptune/Source/Core/NptStreams.h
new file mode 100644
index 0000000..bb22903
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptStreams.h
@@ -0,0 +1,321 @@
+/*****************************************************************
+|
+| Neptune - Byte Streams
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_STREAMS_H_
+#define _NPT_STREAMS_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptReferences.h"
+#include "NptConstants.h"
+#include "NptResults.h"
+#include "NptDataBuffer.h"
+#include "NptStrings.h"
+
+/*----------------------------------------------------------------------
+| class references
++---------------------------------------------------------------------*/
+class NPT_String;
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ERROR_READ_FAILED = NPT_ERROR_BASE_IO - 0;
+const int NPT_ERROR_WRITE_FAILED = NPT_ERROR_BASE_IO - 1;
+const int NPT_ERROR_EOS = NPT_ERROR_BASE_IO - 2;
+
+/*----------------------------------------------------------------------
+| NPT_InputStream
++---------------------------------------------------------------------*/
+class NPT_InputStream
+{
+ public:
+ // constructor and destructor
+ virtual ~NPT_InputStream() {};
+
+ // methods
+ virtual NPT_Result Load(NPT_DataBuffer& buffer, NPT_Size max_read = 0);
+ virtual NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL) = 0;
+ virtual NPT_Result ReadFully(void* buffer,
+ NPT_Size bytes_to_read);
+ virtual NPT_Result Seek(NPT_Position offset) = 0;
+ virtual NPT_Result Skip(NPT_Size offset);
+ virtual NPT_Result Tell(NPT_Position& offset) = 0;
+ virtual NPT_Result GetSize(NPT_LargeSize& size) = 0;
+ virtual NPT_Result GetAvailable(NPT_LargeSize& available) = 0;
+
+ // data access methods
+ NPT_Result ReadUI64(NPT_UInt64& value);
+ NPT_Result ReadUI32(NPT_UInt32& value);
+ NPT_Result ReadUI24(NPT_UInt32& value);
+ NPT_Result ReadUI16(NPT_UInt16& value);
+ NPT_Result ReadUI08(NPT_UInt8& value);
+};
+
+typedef NPT_Reference<NPT_InputStream> NPT_InputStreamReference;
+
+/*----------------------------------------------------------------------
+| NPT_OutputStream
++---------------------------------------------------------------------*/
+class NPT_OutputStream
+{
+public:
+ // constructor and destructor
+ virtual ~NPT_OutputStream() {};
+
+ // methods
+ virtual NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written = NULL) = 0;
+ virtual NPT_Result WriteFully(const void* buffer,
+ NPT_Size bytes_to_write);
+ virtual NPT_Result WriteString(const char* string_buffer);
+ virtual NPT_Result WriteLine(const char* line_buffer);
+ virtual NPT_Result Seek(NPT_Position offset) = 0;
+ virtual NPT_Result Tell(NPT_Position& offset) = 0;
+ virtual NPT_Result Flush() { return NPT_SUCCESS; }
+
+ // data access methods
+ NPT_Result WriteUI64(NPT_UInt64 value);
+ NPT_Result WriteUI32(NPT_UInt32 value);
+ NPT_Result WriteUI24(NPT_UInt32 value);
+ NPT_Result WriteUI16(NPT_UInt16 value);
+ NPT_Result WriteUI08(NPT_UInt8 value);
+};
+
+typedef NPT_Reference<NPT_OutputStream> NPT_OutputStreamReference;
+
+/*----------------------------------------------------------------------
+| NPT_StreamToStreamCopy
++---------------------------------------------------------------------*/
+NPT_Result NPT_StreamToStreamCopy(NPT_InputStream& from,
+ NPT_OutputStream& to,
+ NPT_Position offset = 0,
+ NPT_LargeSize size = 0, /* 0 means the entire stream */
+ NPT_LargeSize* bytes_written = NULL);
+
+/*----------------------------------------------------------------------
+| NPT_DelegatingInputStream
+|
+| Use this class as a base class if you need to inherit both from
+| NPT_InputStream and NPT_OutputStream which share the Seek and Tell
+| method. In this case, you override the base-specific version of
+| those methods, InputSeek, InputTell, instead of the Seek and Tell
+| methods.
++---------------------------------------------------------------------*/
+class NPT_DelegatingInputStream : public NPT_InputStream
+{
+public:
+ // NPT_InputStream methods
+ NPT_Result Seek(NPT_Position offset) override {
+ return InputSeek(offset);
+ }
+ NPT_Result Tell(NPT_Position& offset) override {
+ return InputTell(offset);
+ }
+
+private:
+ // methods
+ virtual NPT_Result InputSeek(NPT_Position offset) = 0;
+ virtual NPT_Result InputTell(NPT_Position& offset) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_DelegatingOutputStream
+|
+| Use this class as a base class if you need to inherit both from
+| NPT_InputStream and NPT_OutputStream which share the Seek and Tell
+| method. In this case, you override the base-specific version of
+| those methods, OutputSeek and OutputTell, instead of the Seek and
+| Tell methods.
++---------------------------------------------------------------------*/
+class NPT_DelegatingOutputStream : public NPT_OutputStream
+{
+public:
+ // NPT_OutputStream methods
+ NPT_Result Seek(NPT_Position offset) override {
+ return OutputSeek(offset);
+ }
+ NPT_Result Tell(NPT_Position& offset) override {
+ return OutputTell(offset);
+ }
+
+private:
+ // methods
+ virtual NPT_Result OutputSeek(NPT_Position offset) = 0;
+ virtual NPT_Result OutputTell(NPT_Position& offset) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_MemoryStream
++---------------------------------------------------------------------*/
+class NPT_MemoryStream :
+ public NPT_DelegatingInputStream,
+ public NPT_DelegatingOutputStream
+{
+public:
+ // constructor and destructor
+ NPT_MemoryStream(NPT_Size initial_capacity = 0);
+ NPT_MemoryStream(const void* data, NPT_Size size);
+ ~NPT_MemoryStream() override {}
+
+ // accessors
+ const NPT_DataBuffer& GetBuffer() const { return m_Buffer; }
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL) override;
+ NPT_Result GetSize(NPT_LargeSize& size) override {
+ size = m_Buffer.GetDataSize();
+ return NPT_SUCCESS;
+ }
+ NPT_Result GetAvailable(NPT_LargeSize& available) override {
+ available = (NPT_LargeSize)m_Buffer.GetDataSize()-m_ReadOffset;
+ return NPT_SUCCESS;
+ }
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written = NULL) override;
+
+ // methods delegated to m_Buffer
+ const NPT_Byte* GetData() const { return m_Buffer.GetData(); }
+ NPT_Byte* UseData() { return m_Buffer.UseData(); }
+ NPT_Size GetDataSize() const { return m_Buffer.GetDataSize(); }
+ NPT_Size GetBufferSize() const { return m_Buffer.GetBufferSize();}
+
+ // methods
+ NPT_Result SetDataSize(NPT_Size size);
+
+private:
+ // NPT_DelegatingInputStream methods
+ NPT_Result InputSeek(NPT_Position offset) override;
+ NPT_Result InputTell(NPT_Position& offset) override {
+ offset = m_ReadOffset;
+ return NPT_SUCCESS;
+ }
+
+ // NPT_DelegatingOutputStream methods
+ NPT_Result OutputSeek(NPT_Position offset) override;
+ NPT_Result OutputTell(NPT_Position& offset) override {
+ offset = m_WriteOffset;
+ return NPT_SUCCESS;
+ }
+
+protected:
+ // members
+ NPT_DataBuffer m_Buffer;
+ NPT_Size m_ReadOffset;
+ NPT_Size m_WriteOffset;
+};
+
+typedef NPT_Reference<NPT_MemoryStream> NPT_MemoryStreamReference;
+
+/*----------------------------------------------------------------------
+| NPT_StringOutputStream
++---------------------------------------------------------------------*/
+class NPT_StringOutputStream : public NPT_OutputStream
+{
+public:
+ // methods
+ NPT_StringOutputStream(NPT_Size size = 4096);
+ NPT_StringOutputStream(NPT_String* storage);
+ ~NPT_StringOutputStream() override ;
+
+ const NPT_String& GetString() const { return *m_String; }
+ NPT_Result Reset() { if (m_String) m_String->SetLength(0); return NPT_SUCCESS; }
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL) override;
+
+ NPT_Result Seek(NPT_Position /*offset*/) override { return NPT_ERROR_NOT_SUPPORTED; }
+ NPT_Result Tell(NPT_Position& offset) override { offset = m_String->GetLength(); return NPT_SUCCESS; }
+
+protected:
+ NPT_String* m_String;
+ bool m_StringIsOwned;
+};
+
+typedef NPT_Reference<NPT_StringOutputStream> NPT_StringOutputStreamReference;
+
+/*----------------------------------------------------------------------
+| NPT_SubInputStream
++---------------------------------------------------------------------*/
+class NPT_SubInputStream : public NPT_InputStream
+{
+public:
+ // constructor and destructor
+ NPT_SubInputStream(NPT_InputStreamReference& source,
+ NPT_Position start,
+ NPT_LargeSize size);
+
+ // methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL) override;
+ NPT_Result Seek(NPT_Position offset) override;
+ NPT_Result Tell(NPT_Position& offset) override;
+ NPT_Result GetSize(NPT_LargeSize& size) override;
+ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+private:
+ NPT_InputStreamReference m_Source;
+ NPT_Position m_Position;
+ NPT_Position m_Start;
+ NPT_LargeSize m_Size;
+};
+
+/*----------------------------------------------------------------------
+| NPT_NullOutputStream
++---------------------------------------------------------------------*/
+class NPT_NullOutputStream : public NPT_OutputStream
+{
+public:
+ // methods
+ NPT_NullOutputStream() {}
+ ~NPT_NullOutputStream() override {}
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL) override;
+
+ NPT_Result Seek(NPT_Position /*offset*/) override { return NPT_ERROR_NOT_SUPPORTED; }
+ NPT_Result Tell(NPT_Position& /*offset*/) override { return NPT_ERROR_NOT_SUPPORTED; }
+};
+
+typedef NPT_Reference<NPT_NullOutputStream> NPT_NullOutputStreamReference;
+
+#endif // _NPT_STREAMS_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptStrings.cpp b/lib/libUPnP/Neptune/Source/Core/NptStrings.cpp
new file mode 100644
index 0000000..819d9a2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptStrings.cpp
@@ -0,0 +1,1205 @@
+/*****************************************************************
+|
+| Neptune - String Objects
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptStrings.h"
+#include "NptResults.h"
+#include "NptUtils.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define NPT_STRINGS_WHITESPACE_CHARS "\r\n\t "
+
+const unsigned int NPT_STRING_FORMAT_BUFFER_DEFAULT_SIZE = 256;
+const unsigned int NPT_STRING_FORMAT_BUFFER_MAX_SIZE = 0x80000; // 512k
+
+/*----------------------------------------------------------------------
+| helpers
++---------------------------------------------------------------------*/
+inline char NPT_Uppercase(char x) {
+ return (x >= 'a' && x <= 'z') ? x&0xdf : x;
+}
+
+inline char NPT_Lowercase(char x) {
+ return (x >= 'A' && x <= 'Z') ? x^32 : x;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::EmptyString
++---------------------------------------------------------------------*/
+char NPT_String::EmptyString = '\0';
+
+/*----------------------------------------------------------------------
+| NPT_String::FromInteger
++---------------------------------------------------------------------*/
+NPT_String
+NPT_String::FromInteger(NPT_Int64 value)
+{
+ char str[32];
+ char* c = &str[31];
+ *c-- = '\0';
+
+ // handle the sign
+ bool negative = false;
+ if (value < 0) {
+ negative = true;
+ value = -value;
+ }
+
+ // process the digits
+ do {
+ int digit = (int)(value%10);
+ *c-- = '0'+digit;
+ value /= 10;
+ } while(value);
+
+ if (negative) {
+ *c = '-';
+ } else {
+ ++c;
+ }
+
+ return NPT_String(c);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::FromIntegerU
++---------------------------------------------------------------------*/
+NPT_String
+NPT_String::FromIntegerU(NPT_UInt64 value)
+{
+ char str[32];
+ char* c = &str[31];
+ *c = '\0';
+
+ // process the digits
+ do {
+ int digit = (int)(value%10);
+ *--c = '0'+digit;
+ value /= 10;
+ } while(value);
+
+ return NPT_String(c);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Format
++---------------------------------------------------------------------*/
+NPT_String
+NPT_String::Format(const char* format, ...)
+{
+ NPT_String result;
+ NPT_Size buffer_size = NPT_STRING_FORMAT_BUFFER_DEFAULT_SIZE; // default value
+
+ va_list args;
+
+ for(;;) {
+ /* try to format (it might not fit) */
+ result.Reserve(buffer_size);
+ char* buffer = result.UseChars();
+ va_start(args, format);
+ int f_result = NPT_FormatStringVN(buffer, buffer_size, format, args);
+ va_end(args);
+ if (f_result >= (int)(buffer_size)) f_result = -1;
+ if (f_result >= 0) {
+ result.SetLength(f_result);
+ break;
+ }
+
+ /* the buffer was too small, try something bigger */
+ /* (we don't trust the return value of NPT_FormatStringVN */
+ /* for the actual size needed) */
+ buffer_size *= 2;
+ if (buffer_size > NPT_STRING_FORMAT_BUFFER_MAX_SIZE) break;
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::NPT_String
++---------------------------------------------------------------------*/
+NPT_String::NPT_String(const char* str)
+{
+ if (str == NULL) {
+ m_Chars = NULL;
+ } else {
+ m_Chars = Buffer::Create(str);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::NPT_String
++---------------------------------------------------------------------*/
+NPT_String::NPT_String(const char* str, NPT_Size length)
+{
+ if (str == NULL || length == 0) {
+ m_Chars = NULL;
+ } else {
+ for (unsigned int i=0; i<length-1; i++) {
+ if (str[i] == '\0') {
+ if (i == 0) {
+ m_Chars = NULL;
+ return;
+ }
+ length = i;
+ break;
+ }
+ }
+ m_Chars = Buffer::Create(str, length);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::NPT_String
++---------------------------------------------------------------------*/
+NPT_String::NPT_String(const NPT_String& str)
+{
+ if (str.GetLength() == 0) {
+ m_Chars = NULL;
+ } else {
+ m_Chars = Buffer::Create(str.GetChars(), str.GetLength());
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::NPT_String
++---------------------------------------------------------------------*/
+NPT_String::NPT_String(char c, NPT_Cardinal repeat)
+{
+ if (repeat != 0) {
+ m_Chars = Buffer::Create(c, repeat);
+ } else {
+ m_Chars = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::SetLength
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::SetLength(NPT_Size length, bool pad)
+{
+ // special case for 0
+ if (length == 0) {
+ Reset();
+ return NPT_SUCCESS;
+ }
+
+ // reserve the space
+ Reserve(length);
+
+ // pad with spaces if necessary
+ char* chars = UseChars();
+ if (pad) {
+ unsigned int current_length = GetLength();
+ if (length > current_length) {
+ unsigned int pad_length = length-current_length;
+ NPT_SetMemory(chars+current_length, ' ', pad_length);
+ }
+ }
+
+ // update the length and terminate the buffer
+ GetBuffer()->SetLength(length);
+ chars[length] = '\0';
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::PrepareToWrite
++---------------------------------------------------------------------*/
+inline char*
+NPT_String::PrepareToWrite(NPT_Size length)
+{
+ NPT_ASSERT(length != 0);
+ if (m_Chars == NULL || GetBuffer()->GetAllocated() < length) {
+ // the buffer is too small, we need to allocate a new one.
+ NPT_Size needed = length;
+ if (m_Chars != NULL) {
+ NPT_Size grow = GetBuffer()->GetAllocated()*2;
+ if (grow > length) needed = grow;
+ delete GetBuffer();
+ }
+ m_Chars = Buffer::Create(needed);
+ }
+ GetBuffer()->SetLength(length);
+ return m_Chars;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Reserve
++---------------------------------------------------------------------*/
+void
+NPT_String::Reserve(NPT_Size allocate)
+{
+ if (m_Chars == NULL || GetBuffer()->GetAllocated() < allocate) {
+ // the buffer is too small, we need to allocate a new one.
+ NPT_Size needed = allocate;
+ if (m_Chars != NULL) {
+ NPT_Size grow = GetBuffer()->GetAllocated()*2;
+ if (grow > allocate) needed = grow;
+ }
+ NPT_Size length = GetLength();
+ char* copy = Buffer::Create(needed, length);
+ if (m_Chars != NULL) {
+ CopyString(copy, m_Chars);
+ delete GetBuffer();
+ } else {
+ copy[0] = '\0';
+ }
+ m_Chars = copy;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Assign
++---------------------------------------------------------------------*/
+void
+NPT_String::Assign(const char* str, NPT_Size length)
+{
+ if (str == NULL || length == 0) {
+ Reset();
+ } else {
+ for (unsigned int i=0; i<length-1; i++) {
+ if (str[i] == '\0') {
+ if (i == 0) {
+ Reset();
+ return;
+ } else {
+ length = i;
+ break;
+ }
+ }
+ }
+ PrepareToWrite(length);
+ CopyBuffer(m_Chars, str, length);
+ m_Chars[length] = '\0';
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::operator=
++---------------------------------------------------------------------*/
+NPT_String&
+NPT_String::operator=(const char* str)
+{
+ if (str == NULL) {
+ Reset();
+ } else {
+ NPT_Size length = StringLength(str);
+ if (length == 0) {
+ Reset();
+ } else {
+ CopyString(PrepareToWrite(length), str);
+ }
+ }
+
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::operator=
++---------------------------------------------------------------------*/
+NPT_String&
+NPT_String::operator=(const NPT_String& str)
+{
+ // do nothing if we're assigning to ourselves
+ if (this != &str) {
+ Assign(str.GetChars(), str.GetLength());
+ }
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::GetHash32
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_String::GetHash32() const
+{
+ return NPT_Fnv1aHashStr32(GetChars());
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::GetHash64
++---------------------------------------------------------------------*/
+NPT_UInt64
+NPT_String::GetHash64() const
+{
+ return NPT_Fnv1aHashStr64(GetChars());
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Append
++---------------------------------------------------------------------*/
+void
+NPT_String::Append(const char* str, NPT_Size length)
+{
+ // shortcut
+ if (str == NULL || length == 0) return;
+
+ // compute the new length
+ NPT_Size old_length = GetLength();
+ NPT_Size new_length = old_length + length;
+
+ // allocate enough space
+ Reserve(new_length);
+
+ // append the new string at the end of the current one
+ CopyBuffer(m_Chars+old_length, str, length);
+ m_Chars[new_length] = '\0';
+
+ // update the length
+ GetBuffer()->SetLength(new_length);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Compare
++---------------------------------------------------------------------*/
+int
+NPT_String::Compare(const char *s, bool ignore_case) const
+{
+ return NPT_String::Compare(GetChars(), s, ignore_case);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Compare
++---------------------------------------------------------------------*/
+int
+NPT_String::Compare(const char *s1, const char *s2, bool ignore_case)
+{
+ const char *r1 = s1;
+ const char *r2 = s2;
+
+ if (ignore_case) {
+ while (NPT_Uppercase(*r1) == NPT_Uppercase(*r2)) {
+ if (*r1++ == '\0') {
+ return 0;
+ }
+ r2++;
+ }
+ return NPT_Uppercase(*r1) - NPT_Uppercase(*r2);
+ } else {
+ while (*r1 == *r2) {
+ if (*r1++ == '\0') {
+ return 0;
+ }
+ r2++;
+ }
+ return (*r1 - *r2);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::CompareN
++---------------------------------------------------------------------*/
+int
+NPT_String::CompareN(const char *s, NPT_Size count, bool ignore_case) const
+{
+ return NPT_String::CompareN(GetChars(), s, count, ignore_case);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::CompareN
++---------------------------------------------------------------------*/
+int
+NPT_String::CompareN(const char* s1, const char *s2, NPT_Size count, bool ignore_case)
+{
+ const char* me = s1;
+
+ if (ignore_case) {
+ for (unsigned int i=0; i<count; i++) {
+ if (NPT_Uppercase(me[i]) != NPT_Uppercase(s2[i])) {
+ return NPT_Uppercase(me[i]) - NPT_Uppercase(s2[i]);
+ }
+ }
+ return 0;
+ } else {
+ for (unsigned int i=0; i<count; i++) {
+ if (me[i] != s2[i]) {
+ return (me[i] - s2[i]);
+ }
+ }
+ return 0;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Split
++---------------------------------------------------------------------*/
+NPT_List<NPT_String>
+NPT_String::Split(const char* separator) const
+{
+ NPT_List<NPT_String> result;
+ NPT_Size separator_length = NPT_StringLength(separator);
+
+ // sepcial case for empty separators
+ if (separator_length == 0) {
+ result.Add(*this);
+ return result;
+ }
+
+ int current = 0;
+ int next;
+ do {
+ next = Find(separator, current);
+ unsigned int end = (next>=0?(unsigned int)next:GetLength());
+ result.Add(SubString(current, end-current));
+ current = next+separator_length;
+ } while (next >= 0);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::SplitAny
++---------------------------------------------------------------------*/
+NPT_Array<NPT_String>
+NPT_String::SplitAny(const char* separator) const
+{
+ NPT_Array<NPT_String> result((GetLength()>>1)+1);
+
+ // sepcial case for empty separators
+ if (NPT_StringLength(separator) == 0) {
+ result.Add(*this);
+ return result;
+ }
+
+ int current = 0;
+ int next;
+ do {
+ next = FindAny(separator, current);
+ unsigned int end = (next>=0?(unsigned int)next:GetLength());
+ result.Add(SubString(current, end-current));
+ current = next+1;
+ } while (next >= 0);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Join
++---------------------------------------------------------------------*/
+NPT_String
+NPT_String::Join(NPT_List<NPT_String>& args, const char* separator)
+{
+ NPT_String output;
+ NPT_List<NPT_String>::Iterator arg = args.GetFirstItem();
+ while (arg) {
+ output += *arg;
+ if (++arg) output += separator;
+ }
+
+ return output;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::SubString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_String::SubString(NPT_Ordinal first, NPT_Size length) const
+{
+ if (first >= GetLength()) {
+ first = GetLength();
+ length = 0;
+ } else if (first+length >= GetLength()) {
+ length = GetLength()-first;
+ }
+ return NPT_String(GetChars()+first, length);
+}
+
+/*----------------------------------------------------------------------
+| NPT_StringStartsWith
+|
+| returns:
+| 1 if str starts with sub,
+| 0 if str is large enough but does not start with sub
+| -1 if str is too short to start with sub
++---------------------------------------------------------------------*/
+static inline int
+NPT_StringStartsWith(const char* str, const char* sub, bool ignore_case)
+{
+ if (ignore_case) {
+ while (NPT_Uppercase(*str) == NPT_Uppercase(*sub)) {
+ if (*str++ == '\0') {
+ return 1;
+ }
+ sub++;
+ }
+ } else {
+ while (*str == *sub) {
+ if (*str++ == '\0') {
+ return 1;
+ }
+ sub++;
+ }
+ }
+ return (*sub == '\0') ? 1 : (*str == '\0' ? -1 : 0);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::StartsWith
++---------------------------------------------------------------------*/
+bool
+NPT_String::StartsWith(const char *s, bool ignore_case) const
+{
+ if (s == NULL) return false;
+ return NPT_StringStartsWith(GetChars(), s, ignore_case) == 1;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::EndsWith
++---------------------------------------------------------------------*/
+bool
+NPT_String::EndsWith(const char *s, bool ignore_case) const
+{
+ if (s == NULL) return false;
+ NPT_Size str_length = NPT_StringLength(s);
+ if (str_length > GetLength()) return false;
+ return NPT_StringStartsWith(GetChars()+GetLength()-str_length, s, ignore_case) == 1;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Find
++---------------------------------------------------------------------*/
+int
+NPT_String::Find(const char* str, NPT_Ordinal start, bool ignore_case) const
+{
+ // check args
+ if (str == NULL || start >= GetLength()) return -1;
+
+ // skip to start position
+ const char* src = m_Chars + start;
+
+ // look for a substring
+ while (*src) {
+ int cmp = NPT_StringStartsWith(src, str, ignore_case);
+ switch (cmp) {
+ case -1:
+ // ref is too short, abort
+ return -1;
+ case 1:
+ // match
+ return (int)(src-m_Chars);
+ }
+ src++;
+ }
+
+ return -1;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Find
++---------------------------------------------------------------------*/
+int
+NPT_String::Find(char c, NPT_Ordinal start, bool ignore_case) const
+{
+ // check args
+ if (start >= GetLength()) return -1;
+
+ // skip to start position
+ const char* src = m_Chars + start;
+
+ // look for the character
+ if (ignore_case) {
+ while (*src) {
+ if (NPT_Uppercase(*src) == NPT_Uppercase(c)) {
+ return (int)(src-m_Chars);
+ }
+ src++;
+ }
+ } else {
+ while (*src) {
+ if (*src == c) return (int)(src-m_Chars);
+ src++;
+ }
+ }
+
+ return -1;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::FindAny
++---------------------------------------------------------------------*/
+int
+NPT_String::FindAny(const char* s, NPT_Ordinal start, bool ignore_case) const
+{
+ // check args
+ if (start >= GetLength()) return -1;
+
+ // skip to start position
+ const char* src = m_Chars + start;
+
+ // look for the character
+ if (ignore_case) {
+ while (*src) {
+ for (NPT_Size i=0; i<NPT_StringLength(s); i++) {
+ if (NPT_Uppercase(*src) == NPT_Uppercase(s[i])) {
+ return (int)(src-m_Chars);
+ }
+ }
+ src++;
+ }
+ } else {
+ while (*src) {
+ for (NPT_Size i=0; i<NPT_StringLength(s); i++) {
+ if (*src == s[i]) return (int)(src-m_Chars);
+ }
+ src++;
+ }
+ }
+
+ return -1;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ReverseFind
++---------------------------------------------------------------------*/
+int
+NPT_String::ReverseFind(const char* str, NPT_Ordinal start, bool ignore_case) const
+{
+ // check args
+ if (str == NULL || *str == '\0') return -1;
+
+ // look for a substring
+ NPT_Size my_length = GetLength();
+ NPT_Size str_length = NPT_StringLength(str);
+ int i=my_length-start-str_length;
+ const char* src = GetChars();
+ if (i<0) return -1;
+ for (;i>=0; i--) {
+ int cmp = NPT_StringStartsWith(src+i, str, ignore_case);
+ if (cmp == 1) {
+ // match
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ReverseFind
++---------------------------------------------------------------------*/
+int
+NPT_String::ReverseFind(char c, NPT_Ordinal start, bool ignore_case) const
+{
+ // check args
+ NPT_Size length = GetLength();
+ int i = length-start-1;
+ if (i < 0) return -1;
+
+ // look for the character
+ const char* src = GetChars();
+ if (ignore_case) {
+ for (;i>=0;i--) {
+ if (NPT_Uppercase(src[i]) == NPT_Uppercase(c)) {
+ return i;
+ }
+ }
+ } else {
+ for (;i>=0;i--) {
+ if (src[i] == c) return i;
+ }
+ }
+
+ return -1;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::MakeLowercase
++---------------------------------------------------------------------*/
+void
+NPT_String::MakeLowercase()
+{
+ // the source is the current buffer
+ const char* src = GetChars();
+
+ // convert all the characters of the existing buffer
+ char* dst = const_cast<char*>(src);
+ while (*dst != '\0') {
+ *dst = NPT_Lowercase(*dst);
+ dst++;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::MakeUppercase
++---------------------------------------------------------------------*/
+void
+NPT_String::MakeUppercase()
+{
+ // the source is the current buffer
+ const char* src = GetChars();
+
+ // convert all the characters of the existing buffer
+ char* dst = const_cast<char*>(src);
+ while (*dst != '\0') {
+ *dst = NPT_Uppercase(*dst);
+ dst++;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToLowercase
++---------------------------------------------------------------------*/
+NPT_String
+NPT_String::ToLowercase() const
+{
+ NPT_String result(*this);
+ result.MakeLowercase();
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToUppercase
++---------------------------------------------------------------------*/
+NPT_String
+NPT_String::ToUppercase() const
+{
+ NPT_String result(*this);
+ result.MakeUppercase();
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Replace
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::Replace(char a, char b)
+{
+ // check args
+ if (m_Chars == NULL || a == '\0' || b == '\0') return *this;
+
+ // we are going to modify the characters
+ char* src = m_Chars;
+
+ // process the buffer in place
+ while (*src) {
+ if (*src == a) *src = b;
+ src++;
+ }
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Replace
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::Replace(char a, const char* str)
+{
+ // check args
+ if (m_Chars == NULL || a == '\0' || str == NULL || str[0] == '\0') return *this;
+
+ // optimization
+ if (NPT_StringLength(str) == 1) return Replace(a, str[0]);
+
+ // we are going to create a new string
+ NPT_String dst;
+ char* src = m_Chars;
+
+ // reserve at least as much as input
+ dst.Reserve(GetLength());
+
+ // process the buffer
+ while (*src) {
+ if (*src == a) {
+ dst += str;
+ } else {
+ dst += *src;
+ }
+ src++;
+ }
+
+ Assign(dst.GetChars(), dst.GetLength());
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Replace
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::Replace(const char* before, const char* after)
+{
+ NPT_Size size_before = NPT_StringLength(before);
+ NPT_Size size_after = NPT_StringLength(after);
+ int index = Find(before);
+ while (index != NPT_STRING_SEARCH_FAILED) {
+ Erase(index, size_before);
+ Insert(after, index);
+ index = Find(before, index+size_after);
+ }
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Insert
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::Insert(const char* str, NPT_Ordinal where)
+{
+ // check args
+ if (str == NULL || where > GetLength()) return *this;
+
+ // measure the string to insert
+ NPT_Size str_length = StringLength(str);
+ if (str_length == 0) return *this;
+
+ // compute the size of the new string
+ NPT_Size old_length = GetLength();
+ NPT_Size new_length = str_length + GetLength();
+
+ // prepare to write the new string
+ char* src = m_Chars;
+ char* nst = Buffer::Create(new_length, new_length);
+ char* dst = nst;
+
+ // copy the beginning of the old string
+ if (where > 0) {
+ CopyBuffer(dst, src, where);
+ src += where;
+ dst += where;
+ }
+
+ // copy the inserted string
+ CopyString(dst, str);
+ dst += str_length;
+
+ // copy the end of the old string
+ if (old_length > where) {
+ CopyString(dst, src);
+ }
+
+ // use the new string
+ if (m_Chars) delete GetBuffer();
+ m_Chars = nst;
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Erase
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::Erase(NPT_Ordinal start, NPT_Cardinal count /* = 1 */)
+{
+ // check bounds
+ NPT_Size length = GetLength();
+ if (start+count > length) {
+ if (start >= length) return *this;
+ count = length-start;
+ }
+ if (count == 0) return *this;
+
+ CopyString(m_Chars+start, m_Chars+start+count);
+ GetBuffer()->SetLength(length-count);
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToInteger
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::ToInteger(int& value, bool relaxed) const
+{
+ return NPT_ParseInteger(GetChars(), value, relaxed);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToInteger
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::ToInteger(unsigned int& value, bool relaxed) const
+{
+ return NPT_ParseInteger(GetChars(), value, relaxed);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToInteger
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::ToInteger(long& value, bool relaxed) const
+{
+ return NPT_ParseInteger(GetChars(), value, relaxed);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToInteger
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::ToInteger(unsigned long& value, bool relaxed) const
+{
+ return NPT_ParseInteger(GetChars(), value, relaxed);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToInteger32
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::ToInteger32(NPT_Int32& value, bool relaxed) const
+{
+ return NPT_ParseInteger32(GetChars(), value, relaxed);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToInteger32
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::ToInteger32(NPT_UInt32& value, bool relaxed) const
+{
+ return NPT_ParseInteger32(GetChars(), value, relaxed);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToInteger64
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::ToInteger64(NPT_Int64& value, bool relaxed) const
+{
+ return NPT_ParseInteger64(GetChars(), value, relaxed);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToInteger64
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::ToInteger64(NPT_UInt64& value, bool relaxed) const
+{
+ return NPT_ParseInteger64(GetChars(), value, relaxed);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::ToFloat
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_String::ToFloat(float& value, bool relaxed) const
+{
+ return NPT_ParseFloat(GetChars(), value, relaxed);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::TrimLeft
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::TrimLeft()
+{
+ return TrimLeft(NPT_STRINGS_WHITESPACE_CHARS);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::TrimLeft
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::TrimLeft(char c)
+{
+ char s[2] = {c, 0};
+ return TrimLeft((const char*)s);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::TrimLeft
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::TrimLeft(const char* chars)
+{
+ if (m_Chars == NULL) return *this;
+ const char* s = m_Chars;
+ while (char c = *s) {
+ const char* x = chars;
+ while (*x) {
+ if (*x == c) break;
+ x++;
+ }
+ if (*x == 0) break; // not found
+ s++;
+ }
+ if (s == m_Chars) {
+ // nothing was trimmed
+ return *this;
+ }
+
+ // shift chars to the left
+ char* d = m_Chars;
+ GetBuffer()->SetLength(GetLength()-(NPT_Size)(s-d));
+ while ((*d++ = *s++)) {};
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::TrimRight
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::TrimRight()
+{
+ return TrimRight(NPT_STRINGS_WHITESPACE_CHARS);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::TrimRight
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::TrimRight(char c)
+{
+ char s[2] = {c, 0};
+ return TrimRight((const char*)s);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::TrimRight
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::TrimRight(const char* chars)
+{
+ if (m_Chars == NULL || m_Chars[0] == '\0') return *this;
+ char* tail = m_Chars+GetLength()-1;
+ char* s = tail;
+ while (s != m_Chars-1) {
+ const char* x = chars;
+ while (*x) {
+ if (*x == *s) {
+ *s = '\0';
+ break;
+ }
+ x++;
+ }
+ if (*x == 0) break; // not found
+ s--;
+ }
+ if (s == tail) {
+ // nothing was trimmed
+ return *this;
+ }
+ GetBuffer()->SetLength(1+(int)(s-m_Chars));
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Trim
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::Trim()
+{
+ TrimLeft();
+ return TrimRight();
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Trim
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::Trim(char c)
+{
+ char s[2] = {c, 0};
+ TrimLeft((const char*)s);
+ return TrimRight((const char*)s);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::Trim
++---------------------------------------------------------------------*/
+const NPT_String&
+NPT_String::Trim(const char* chars)
+{
+ TrimLeft(chars);
+ return TrimRight(chars);
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::operator+(const NPT_String&, const char*)
++---------------------------------------------------------------------*/
+NPT_String
+operator+(const NPT_String& s1, const char* s2)
+{
+ // shortcut
+ if (s2 == NULL) return NPT_String(s1);
+
+ // measure strings
+ NPT_Size s1_length = s1.GetLength();
+ NPT_Size s2_length = NPT_String::StringLength(s2);
+
+ // allocate space for the new string
+ NPT_String result;
+ char* start = result.PrepareToWrite(s1_length+s2_length);
+
+ // concatenate the two strings into the result
+ NPT_String::CopyBuffer(start, s1, s1_length);
+ NPT_String::CopyString(start+s1_length, s2);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::operator+(const NPT_String& , const char*)
++---------------------------------------------------------------------*/
+NPT_String
+operator+(const char* s1, const NPT_String& s2)
+{
+ // shortcut
+ if (s1 == NULL) return NPT_String(s2);
+
+ // measure strings
+ NPT_Size s1_length = NPT_String::StringLength(s1);
+ NPT_Size s2_length = s2.GetLength();
+
+ // allocate space for the new string
+ NPT_String result;
+ char* start = result.PrepareToWrite(s1_length+s2_length);
+
+ // concatenate the two strings into the result
+ NPT_String::CopyBuffer(start, s1, s1_length);
+ NPT_String::CopyString(start+s1_length, s2.GetChars());
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_String::operator+(const NPT_String& , char)
++---------------------------------------------------------------------*/
+NPT_String
+operator+(const NPT_String& s1, char c)
+{
+ // allocate space for the new string
+ NPT_String result;
+ result.Reserve(s1.GetLength()+1);
+
+ // append
+ result = s1;
+ result += c;
+
+ return result;
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptStrings.h b/lib/libUPnP/Neptune/Source/Core/NptStrings.h
new file mode 100644
index 0000000..c445b33
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptStrings.h
@@ -0,0 +1,358 @@
+/*****************************************************************
+|
+| Neptune - String Objects
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_STRINGS_H_
+#define _NPT_STRINGS_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#if defined(NPT_CONFIG_HAVE_NEW_H)
+#include <new>
+#endif
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptList.h"
+#include "NptArray.h"
+#include "NptDebug.h"
+#include "NptHash.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_STRING_SEARCH_FAILED = -1;
+
+/*----------------------------------------------------------------------
+| NPT_String
++---------------------------------------------------------------------*/
+class NPT_String
+{
+public:
+ // factories
+ static NPT_String FromInteger(NPT_Int64 value);
+ static NPT_String FromIntegerU(NPT_UInt64 value);
+ static NPT_String Format(const char* format, ...);
+
+ // constructors
+ NPT_String(const NPT_String& str);
+ NPT_String(const char* str);
+ NPT_String(const char* str, NPT_Size length);
+ NPT_String(char c, NPT_Cardinal repeat = 1);
+ NPT_String() : m_Chars(NULL) {}
+ ~NPT_String() { if (m_Chars) GetBuffer()->Destroy(); }
+
+ // string info and manipulations
+ bool IsEmpty() const { return m_Chars == NULL || GetBuffer()->GetLength() == 0; }
+ NPT_Size GetLength() const { return m_Chars ? GetBuffer()->GetLength() : 0; }
+ NPT_Size GetCapacity() const { return m_Chars ? GetBuffer()->GetAllocated() : 0; }
+ NPT_Result SetLength(NPT_Size length, bool pad = false);
+ void Assign(const char* chars, NPT_Size size);
+ void Append(const char* chars, NPT_Size size);
+ void Append(const char* s) { Append(s, StringLength(s)); }
+ int Compare(const char* s, bool ignore_case = false) const;
+ static int Compare(const char* s1, const char* s2, bool ignore_case = false);
+ int CompareN(const char* s, NPT_Size count, bool ignore_case = false) const;
+ static int CompareN(const char* s1, const char* s2, NPT_Size count, bool ignore_case = false);
+
+ // substrings
+ NPT_String SubString(NPT_Ordinal first, NPT_Size length) const;
+ NPT_String SubString(NPT_Ordinal first) const {
+ return SubString(first, GetLength());
+ }
+ NPT_String Left(NPT_Size length) const {
+ return SubString(0, length);
+ }
+ NPT_String Right(NPT_Size length) const {
+ return length >= GetLength() ?
+ *this :
+ SubString(GetLength()-length, length);
+ }
+ NPT_List<NPT_String> Split(const char* separator) const;
+ NPT_Array<NPT_String> SplitAny(const char* separator) const;
+ static NPT_String Join(NPT_List<NPT_String>& args, const char* separator);
+
+ // buffer management
+ void Reserve(NPT_Size length);
+
+ // hashing
+ NPT_UInt32 GetHash32() const;
+ NPT_UInt64 GetHash64() const;
+
+ // conversions
+ NPT_String ToLowercase() const;
+ NPT_String ToUppercase() const;
+ NPT_Result ToInteger(int& value, bool relaxed = true) const;
+ NPT_Result ToInteger(unsigned int& value, bool relaxed = true) const;
+ NPT_Result ToInteger(long& value, bool relaxed = true) const;
+ NPT_Result ToInteger(unsigned long& value, bool relaxed = true) const;
+ NPT_Result ToInteger32(NPT_Int32& value, bool relaxed = true) const;
+ NPT_Result ToInteger32(NPT_UInt32& value, bool relaxed = true) const;
+ NPT_Result ToInteger64(NPT_Int64& value, bool relaxed = true) const;
+ NPT_Result ToInteger64(NPT_UInt64& value, bool relaxed = true) const;
+ NPT_Result ToFloat(float& value, bool relaxed = true) const;
+
+ // processing
+ void MakeLowercase();
+ void MakeUppercase();
+ const NPT_String& Replace(char a, char b);
+ const NPT_String& Replace(char a, const char* b);
+
+ // search
+ int Find(char c, NPT_Ordinal start = 0, bool ignore_case = false) const;
+ int Find(const char* s, NPT_Ordinal start = 0, bool ignore_case = false) const;
+ int FindAny(const char* s, NPT_Ordinal start, bool ignore_case = false) const;
+ int ReverseFind(char c, NPT_Ordinal start = 0, bool ignore_case = false) const;
+ int ReverseFind(const char* s, NPT_Ordinal start = 0, bool ignore_case = false) const;
+ bool StartsWith(const char* s, bool ignore_case = false) const;
+ bool EndsWith(const char* s, bool ignore_case = false) const;
+
+ // editing
+ const NPT_String& Insert(const char* s, NPT_Ordinal where = 0);
+ const NPT_String& Erase(NPT_Ordinal start, NPT_Cardinal count = 1);
+ const NPT_String& Replace(const char* before, const char* after);
+ // void Replace(NPT_Ordinal start, NPT_Cardinal count, const char* s);
+ const NPT_String& TrimLeft();
+ const NPT_String& TrimLeft(char c);
+ const NPT_String& TrimLeft(const char* chars);
+ const NPT_String& TrimRight();
+ const NPT_String& TrimRight(char c);
+ const NPT_String& TrimRight(const char* chars);
+ const NPT_String& Trim();
+ const NPT_String& Trim(char c);
+ const NPT_String& Trim(const char* chars);
+
+ // type casting
+ operator char*() const { return m_Chars ? m_Chars: &EmptyString; }
+ operator const char* () const { return m_Chars ? m_Chars: &EmptyString; }
+ const char* GetChars() const { return m_Chars ? m_Chars: &EmptyString; }
+ char* UseChars() { return m_Chars ? m_Chars: &EmptyString; }
+
+ // operator overloading
+ NPT_String& operator=(const char* str);
+ NPT_String& operator=(const NPT_String& str);
+ NPT_String& operator=(char c);
+ const NPT_String& operator+=(const NPT_String& s) {
+ Append(s.GetChars(), s.GetLength());
+ return *this;
+ }
+ const NPT_String& operator+=(const char* s) {
+ Append(s);
+ return *this;
+ }
+ const NPT_String& operator+=(char c) {
+ Append(&c, 1);
+ return *this;
+ }
+ char operator[](int index) const {
+ NPT_ASSERT((unsigned int)index < GetLength());
+ return GetChars()[index];
+ }
+ char& operator[](int index) {
+ NPT_ASSERT((unsigned int)index < GetLength());
+ return UseChars()[index];
+ }
+
+ // friend operators
+ friend NPT_String operator+(const NPT_String& s1, const NPT_String& s2) {
+ return s1+s2.GetChars();
+ }
+ friend NPT_String operator+(const NPT_String& s1, const char* s2);
+ friend NPT_String operator+(const char* s1, const NPT_String& s2);
+ friend NPT_String operator+(const NPT_String& s, char c);
+ friend NPT_String operator+(char c, const NPT_String& s);
+
+protected:
+ // inner classes
+ class Buffer {
+ public:
+ // class methods
+ static Buffer* Allocate(NPT_Size allocated, NPT_Size length) {
+ void* mem = ::operator new(sizeof(Buffer)+allocated+1);
+ return new(mem) Buffer(allocated, length);
+ }
+ static char* Create(NPT_Size allocated, NPT_Size length=0) {
+ Buffer* shared = Allocate(allocated, length);
+ return shared->GetChars();
+ }
+ static char* Create(const char* copy) {
+ NPT_Size length = StringLength(copy);
+ Buffer* shared = Allocate(length, length);
+ CopyString(shared->GetChars(), copy);
+ return shared->GetChars();
+ }
+ static char* Create(const char* copy, NPT_Size length) {
+ Buffer* shared = Allocate(length, length);
+ CopyBuffer(shared->GetChars(), copy, length);
+ shared->GetChars()[length] = '\0';
+ return shared->GetChars();
+ }
+ static char* Create(char c, NPT_Cardinal repeat) {
+ Buffer* shared = Allocate(repeat, repeat);
+ char* s = shared->GetChars();
+ while (repeat--) {
+ *s++ = c;
+ }
+ *s = '\0';
+ return shared->GetChars();
+ }
+
+ // methods
+ char* GetChars() {
+ // return a pointer to the first char
+ return reinterpret_cast<char*>(this+1);
+ }
+ NPT_Size GetLength() const { return m_Length; }
+ void SetLength(NPT_Size length) { m_Length = length; }
+ NPT_Size GetAllocated() const { return m_Allocated; }
+ void Destroy() { ::operator delete((void*)this); }
+
+ private:
+ // methods
+ Buffer(NPT_Size allocated, NPT_Size length = 0) :
+ m_Length(length),
+ m_Allocated(allocated) {}
+
+ // members
+ NPT_Cardinal m_Length;
+ NPT_Cardinal m_Allocated;
+ // the actual string data follows
+
+ };
+
+ // members
+ char* m_Chars;
+
+private:
+ // friends
+ friend class Buffer;
+
+ // static members
+ static char EmptyString;
+
+ // methods
+ Buffer* GetBuffer() const {
+ return reinterpret_cast<Buffer*>(m_Chars)-1;
+ }
+ void Reset() {
+ if (m_Chars != NULL) {
+ delete GetBuffer();
+ m_Chars = NULL;
+ }
+ }
+ char* PrepareToWrite(NPT_Size length);
+ void PrepareToAppend(NPT_Size length, NPT_Size allocate);
+
+ // static methods
+ static void CopyString(char* dst, const char* src) {
+ while ((*dst++ = *src++)){}
+ }
+
+ static void CopyBuffer(char* dst, const char* src, NPT_Size size) {
+ while (size--) *dst++ = *src++;
+ }
+
+ static NPT_Size StringLength(const char* str) {
+ NPT_Size length = 0;
+ while (*str++) length++;
+ return length;
+ }
+};
+
+/*----------------------------------------------------------------------
+| external operators
++---------------------------------------------------------------------*/
+inline bool operator==(const NPT_String& s1, const NPT_String& s2) {
+ return s1.Compare(s2) == 0;
+}
+inline bool operator==(const NPT_String& s1, const char* s2) {
+ return s1.Compare(s2) == 0;
+}
+inline bool operator==(const char* s1, const NPT_String& s2) {
+ return s2.Compare(s1) == 0;
+}
+inline bool operator!=(const NPT_String& s1, const NPT_String& s2) {
+ return s1.Compare(s2) != 0;
+}
+inline bool operator!=(const NPT_String& s1, const char* s2) {
+ return s1.Compare(s2) != 0;
+}
+inline bool operator!=(const char* s1, const NPT_String& s2) {
+ return s2.Compare(s1) != 0;
+}
+inline bool operator<(const NPT_String& s1, const NPT_String& s2) {
+ return s1.Compare(s2) < 0;
+}
+inline bool operator<(const NPT_String& s1, const char* s2) {
+ return s1.Compare(s2) < 0;
+}
+inline bool operator<(const char* s1, const NPT_String& s2) {
+ return s2.Compare(s1) > 0;
+}
+inline bool operator>(const NPT_String& s1, const NPT_String& s2) {
+ return s1.Compare(s2) > 0;
+}
+inline bool operator>(const NPT_String& s1, const char* s2) {
+ return s1.Compare(s2) > 0;
+}
+inline bool operator>(const char* s1, const NPT_String& s2) {
+ return s2.Compare(s1) < 0;
+}
+inline bool operator<=(const NPT_String& s1, const NPT_String& s2) {
+ return s1.Compare(s2) <= 0;
+}
+inline bool operator<=(const NPT_String& s1, const char* s2) {
+ return s1.Compare(s2) <= 0;
+}
+inline bool operator<=(const char* s1, const NPT_String& s2) {
+ return s2.Compare(s1) >= 0;
+}
+inline bool operator>=(const NPT_String& s1, const NPT_String& s2) {
+ return s1.Compare(s2) >= 0;
+}
+inline bool operator>=(const NPT_String& s1, const char* s2) {
+ return s1.Compare(s2) >= 0;
+}
+inline bool operator>=(const char* s1, const NPT_String& s2) {
+ return s2.Compare(s1) <= 0;
+}
+
+/*----------------------------------------------------------------------
+| hashing
++---------------------------------------------------------------------*/
+template <>
+struct NPT_Hash<NPT_String>
+{
+ NPT_UInt32 operator()(const NPT_String& s) const { return s.GetHash32(); }
+};
+
+
+#endif // _NPT_STRINGS_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptSystem.cpp b/lib/libUPnP/Neptune/Source/Core/NptSystem.cpp
new file mode 100644
index 0000000..0d4e9b2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptSystem.cpp
@@ -0,0 +1,37 @@
+/*****************************************************************
+|
+| Neptune - System
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptSystem.h"
+
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptSystem.h b/lib/libUPnP/Neptune/Source/Core/NptSystem.h
new file mode 100644
index 0000000..224a058
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptSystem.h
@@ -0,0 +1,63 @@
+/*****************************************************************
+|
+| Neptune - System
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_SYSTEM_H_
+#define _NPT_SYSTEM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptTime.h"
+
+/*----------------------------------------------------------------------
+| NPT_System
++---------------------------------------------------------------------*/
+class NPT_System
+{
+public:
+ // methods
+ static NPT_Result GetProcessId(NPT_UInt32& id);
+ static NPT_Result GetMachineName(NPT_String& name);
+ static NPT_Result GetCurrentTimeStamp(NPT_TimeStamp& now);
+ static NPT_Result Sleep(const NPT_TimeInterval& duration);
+ static NPT_Result SleepUntil(const NPT_TimeStamp& when);
+ static NPT_Result SetRandomSeed(unsigned int seed);
+ static NPT_UInt32 GetRandomInteger();
+
+protected:
+ // constructor
+ NPT_System() {}
+};
+
+NPT_Result NPT_GetSystemMachineName(NPT_String& name);
+
+#endif // _NPT_SYSTEM_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptThreads.cpp b/lib/libUPnP/Neptune/Source/Core/NptThreads.cpp
new file mode 100644
index 0000000..25a867d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptThreads.cpp
@@ -0,0 +1,161 @@
+/*****************************************************************
+|
+| Neptune - Threads
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptThreads.h"
+
+/*----------------------------------------------------------------------
+| NPT_SingletonLock
++---------------------------------------------------------------------*/
+NPT_Mutex NPT_SingletonLock::Instance;
+
+/*----------------------------------------------------------------------
+| NPT_ThreadCallbackSlot::NPT_ThreadCallbackSlot
++---------------------------------------------------------------------*/
+NPT_ThreadCallbackSlot::NPT_ThreadCallbackSlot() :
+ m_CallbackArgs(NULL),
+ m_Shutdown(false),
+ m_NotificationHelper(NULL)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_ThreadCallbackSlot::Shutdown
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ThreadCallbackSlot::Shutdown()
+{
+ // protect against concurrent access
+ //FIXME: This will not work if another Thread has called ReceiveCallback with a timeout
+ NPT_AutoLock lock(m_ReadLock);
+
+ // signal we are shut down
+ m_Shutdown = true;
+
+ // clear up any pending callbacks
+ m_Pending.SetValue(0);
+ m_Ack.SetValue(1);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ThreadCallbackSlot::SetNotificationHelper
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ThreadCallbackSlot::SetNotificationHelper(NotificationHelper* helper)
+{
+ m_NotificationHelper = helper;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ThreadCallbackSlot::ReceiveCallback
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ThreadCallbackSlot::ReceiveCallback(NPT_ThreadCallbackReceiver& receiver,
+ NPT_Timeout timeout)
+{
+ // protect against concurrent access
+ //NPT_Debug("NPT_ThreadCallbackSlot::ReceiveCallback - read locking, timeout=%d\n", timeout);
+ NPT_AutoLock lock(m_ReadLock);
+
+ if (timeout) {
+ // wait until there is a pending callback
+ //NPT_Debug("NPT_ThreadCallbackSlot::ReceiveCallback - waiting...\n");
+ NPT_Result result = m_Pending.WaitUntilEquals(1, timeout);
+ if (NPT_FAILED(result)) return result; // don't log here because the result
+ // could be NPT_ERROR_TIMEOUT which
+ // is an expected normal case.
+ //NPT_Debug("NPT_ThreadCallbackSlot::ReceiveCallback - got it\n");
+ } else {
+ // see if something is pending
+ if (m_Pending.GetValue() == 0) {
+ //NPT_Debug("NPT_ThreadCallbackSlot::ReceiveCallback - nothing pending\n");
+ return NPT_ERROR_CALLBACK_NOTHING_PENDING;
+ }
+ }
+
+ // check if we have been shutdown
+ if (m_Shutdown) return NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN;
+
+ // process the callback
+ //NPT_Debug("NPT_ThreadCallbackSlot::ReceiveCallback - calling back\n");
+ receiver.OnCallback(const_cast<void*>(m_CallbackArgs));
+
+ // signal that we've processed the callback
+ m_Pending.SetValue(0);
+ m_Ack.SetValue(1);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ThreadCallbackSlot::SendCallback
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ThreadCallbackSlot::SendCallback(void* args)
+{
+ // protect against concurrent access
+ //NPT_Debug("NPT_ThreadCallbackSlot::SendCallback - write locking\n");
+ NPT_AutoLock lock(m_WriteLock);
+
+ // there should be nothing pending
+#if defined(NPT_DEBUG)
+ NPT_ASSERT(m_Pending.GetValue() == 0);
+#endif
+
+ // check if we have been shutdown
+ if (m_Shutdown) return NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN;
+
+ // put the callback args
+ m_CallbackArgs = args;
+ //NPT_Debug("NPT_ThreadCallbackSlot::SendCallback - signalling\n");
+ m_Pending.SetValue(1);
+
+ // call the helper before we wait
+ if (m_NotificationHelper) {
+ m_NotificationHelper->Notify();
+ }
+
+ // wait until the callback has been process, or we've been shutdown
+ //NPT_Debug("NPT_ThreadCallbackSlot::SendCallback - waiting...\n");
+ m_Ack.WaitUntilEquals(1);
+ //NPT_Debug("NPT_ThreadCallbackSlot::SendCallback - got it\n");
+
+ // done
+ m_Ack.SetValue(0);
+ m_CallbackArgs = NULL;
+
+ return m_Shutdown?NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN:NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptThreads.h b/lib/libUPnP/Neptune/Source/Core/NptThreads.h
new file mode 100644
index 0000000..b14568e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptThreads.h
@@ -0,0 +1,322 @@
+/*****************************************************************
+|
+| Neptune - Threads
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_THREADS_H_
+#define _NPT_THREADS_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptInterfaces.h"
+
+/*----------------------------------------------------------------------
+| error codes
++---------------------------------------------------------------------*/
+const int NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN = NPT_ERROR_BASE_THREADS-0;
+const int NPT_ERROR_CALLBACK_NOTHING_PENDING = NPT_ERROR_BASE_THREADS-1;
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_THREAD_PRIORITY_MIN = -15;
+const int NPT_THREAD_PRIORITY_IDLE = -15;
+const int NPT_THREAD_PRIORITY_LOWEST = -2;
+const int NPT_THREAD_PRIORITY_BELOW_NORMAL = -1;
+const int NPT_THREAD_PRIORITY_NORMAL = 0;
+const int NPT_THREAD_PRIORITY_ABOVE_NORMAL = 1;
+const int NPT_THREAD_PRIORITY_HIGHEST = 2;
+const int NPT_THREAD_PRIORITY_TIME_CRITICAL = 15;
+const int NPT_THREAD_PRIORITY_MAX = 15;
+
+/*----------------------------------------------------------------------
+| NPT_MutexInterface
++---------------------------------------------------------------------*/
+class NPT_MutexInterface
+{
+ public:
+ // methods
+ virtual ~NPT_MutexInterface() {}
+ virtual NPT_Result Lock() = 0;
+ virtual NPT_Result Unlock() = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Mutex
++---------------------------------------------------------------------*/
+class NPT_Mutex : public NPT_MutexInterface
+{
+ public:
+ // methods
+ NPT_Mutex(bool recursive = false);
+ ~NPT_Mutex() override { delete m_Delegate; }
+ NPT_Result Lock() override { return m_Delegate->Lock(); }
+ NPT_Result Unlock() override { return m_Delegate->Unlock(); }
+
+ private:
+ // members
+ NPT_MutexInterface* m_Delegate;
+};
+
+/*----------------------------------------------------------------------
+| NPT_AutoLock
++---------------------------------------------------------------------*/
+class NPT_AutoLock
+{
+ public:
+ // methods
+ NPT_AutoLock(NPT_Mutex &mutex) : m_Mutex(mutex) {
+ m_Mutex.Lock();
+ }
+ ~NPT_AutoLock() {
+ m_Mutex.Unlock();
+ }
+
+ private:
+ // members
+ NPT_Mutex& m_Mutex;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Lock
++---------------------------------------------------------------------*/
+template <typename T>
+class NPT_Lock : public T,
+ public NPT_Mutex
+{
+};
+
+/*----------------------------------------------------------------------
+| NPT_SingletonLock
++---------------------------------------------------------------------*/
+class NPT_SingletonLock
+{
+public:
+ static NPT_Mutex& GetInstance() {
+ return Instance;
+ }
+
+private:
+ static NPT_Mutex Instance;
+};
+
+/*----------------------------------------------------------------------
+| NPT_SharedVariableInterface
++---------------------------------------------------------------------*/
+class NPT_SharedVariableInterface
+{
+ public:
+ // methods
+ virtual ~NPT_SharedVariableInterface() {}
+ virtual void SetValue(int value)= 0;
+ virtual int GetValue() = 0;
+ virtual NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+ virtual NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_SharedVariable
++---------------------------------------------------------------------*/
+class NPT_SharedVariable : public NPT_SharedVariableInterface
+{
+ public:
+ // methods
+ NPT_SharedVariable(int value = 0);
+ ~NPT_SharedVariable() override { delete m_Delegate; }
+ void SetValue(int value) override {
+ m_Delegate->SetValue(value);
+ }
+ int GetValue() override {
+ return m_Delegate->GetValue();
+ }
+ NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_Delegate->WaitUntilEquals(value, timeout);
+ }
+ NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_Delegate->WaitWhileEquals(value, timeout);
+ }
+
+ private:
+ // members
+ NPT_SharedVariableInterface* m_Delegate;
+};
+
+/*----------------------------------------------------------------------
+| NPT_AtomicVariableInterface
++---------------------------------------------------------------------*/
+class NPT_AtomicVariableInterface
+{
+ public:
+ // methods
+ virtual ~NPT_AtomicVariableInterface() {}
+ virtual int Increment() = 0;
+ virtual int Decrement() = 0;
+ virtual int GetValue() = 0;
+ virtual void SetValue(int value) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_AtomicVariable
++---------------------------------------------------------------------*/
+class NPT_AtomicVariable : public NPT_AtomicVariableInterface
+{
+ public:
+ // methods
+ NPT_AtomicVariable(int value = 0);
+ ~NPT_AtomicVariable() override { delete m_Delegate; }
+ int Increment() override { return m_Delegate->Increment();}
+ int Decrement() override { return m_Delegate->Decrement();}
+ void SetValue(int value) override { m_Delegate->SetValue(value); }
+ int GetValue() override { return m_Delegate->GetValue(); }
+
+ private:
+ // members
+ NPT_AtomicVariableInterface* m_Delegate;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Runnable
++---------------------------------------------------------------------*/
+class NPT_Runnable
+{
+public:
+ virtual ~NPT_Runnable() {}
+ virtual void Run() = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_ThreadInterface
++---------------------------------------------------------------------*/
+class NPT_ThreadInterface: public NPT_Runnable, public NPT_Interruptible
+{
+ public:
+ // methods
+ ~NPT_ThreadInterface() override {}
+ virtual NPT_Result Start() = 0;
+ virtual NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+ virtual NPT_Result SetPriority(int /*priority*/) { return NPT_SUCCESS; }
+ virtual NPT_Result CancelBlockerSocket() = 0;
+ virtual NPT_Result GetPriority(int& priority) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Thread
++---------------------------------------------------------------------*/
+class NPT_Thread : public NPT_ThreadInterface
+{
+ public:
+ // types
+ typedef NPT_UInt64 ThreadId;
+
+ // class methods
+ static ThreadId GetCurrentThreadId();
+ static NPT_Result SetCurrentThreadPriority(int priority);
+ static NPT_Result GetCurrentThreadPriority(int& priority);
+
+ // methods
+ explicit NPT_Thread(bool detached = false);
+ explicit NPT_Thread(NPT_Runnable& target, bool detached = false);
+ ~NPT_Thread() override { delete m_Delegate; }
+
+ // cancel any socket that this thread may be waiting for
+ NPT_Result CancelBlockerSocket() override { return m_Delegate->CancelBlockerSocket(); }
+
+ // NPT_ThreadInterface methods
+ NPT_Result Start() override {
+ return m_Delegate->Start();
+ }
+ NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_Delegate->Wait(timeout);
+ }
+ NPT_Result SetPriority(int priority) override {
+ return m_Delegate->SetPriority(priority);
+ }
+ NPT_Result GetPriority(int& priority) override {
+ return m_Delegate->GetPriority(priority);
+ }
+
+ // NPT_Runnable methods
+ void Run() override {}
+
+ // NPT_Interruptible methods
+ NPT_Result Interrupt() override { return m_Delegate->Interrupt(); }
+
+ private:
+ // members
+ NPT_ThreadInterface* m_Delegate;
+};
+
+
+/*----------------------------------------------------------------------
+| NPT_ThreadCallbackReceiver
++---------------------------------------------------------------------*/
+class NPT_ThreadCallbackReceiver
+{
+public:
+ virtual ~NPT_ThreadCallbackReceiver() {}
+ virtual void OnCallback(void* args) = 0;
+};
+
+/*----------------------------------------------------------------------
+| NPT_ThreadCallbackSlot
++---------------------------------------------------------------------*/
+class NPT_ThreadCallbackSlot
+{
+public:
+ // types
+ class NotificationHelper {
+ public:
+ virtual ~NotificationHelper() {};
+ virtual void Notify(void) = 0;
+ };
+
+ // constructor
+ NPT_ThreadCallbackSlot();
+
+ // methods
+ NPT_Result ReceiveCallback(NPT_ThreadCallbackReceiver& receiver, NPT_Timeout timeout = 0);
+ NPT_Result SendCallback(void* args);
+ NPT_Result SetNotificationHelper(NotificationHelper* helper);
+ NPT_Result Shutdown();
+
+protected:
+ // members
+ volatile void* m_CallbackArgs;
+ volatile bool m_Shutdown;
+ NPT_SharedVariable m_Pending;
+ NPT_SharedVariable m_Ack;
+ NPT_Mutex m_ReadLock;
+ NPT_Mutex m_WriteLock;
+ NotificationHelper* m_NotificationHelper;
+};
+
+#endif // _NPT_THREADS_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptTime.cpp b/lib/libUPnP/Neptune/Source/Core/NptTime.cpp
new file mode 100755
index 0000000..d842259
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptTime.cpp
@@ -0,0 +1,714 @@
+/*****************************************************************
+|
+| Neptune - Time
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTime.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const char* const NPT_TIME_DAYS_SHORT[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
+const char* const NPT_TIME_DAYS_LONG[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
+const char* const NPT_TIME_MONTHS[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+
+static const NPT_Int32 NPT_TIME_MONTH_DAY[] = {-1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 };
+static const NPT_Int32 NPT_TIME_MONTH_DAY_LEAP[] = {-1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
+static const NPT_Int32 NPT_TIME_ELAPSED_DAYS_AT_MONTH[13] = {
+ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
+};
+
+const NPT_Int32 NPT_SECONDS_PER_DAY = (24L * 60L * 60L);
+const NPT_Int32 NPT_SECONDS_PER_YEAR = (365L * NPT_SECONDS_PER_DAY);
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define NPT_TIME_YEAR_IS_LEAP(_y) ((((_y)%4 == 0) && ((_y)%100 != 0)) || ((_y)%400 == 0))
+#define NPT_TIME_CHECK_BOUNDS(_var, _low, _high) do { \
+ if (((_var)<(_low)) || ((_var)>(_high))) { \
+ return NPT_ERROR_OUT_OF_RANGE; \
+ } \
+} while (0)
+
+/*----------------------------------------------------------------------
+| NPT_TimeStamp::NPT_TimeStamp
++---------------------------------------------------------------------*/
+NPT_TimeStamp::NPT_TimeStamp(const NPT_TimeStamp& timestamp)
+{
+ m_NanoSeconds = timestamp.m_NanoSeconds;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TimeStamp::NPT_TimeStamp
++---------------------------------------------------------------------*/
+NPT_TimeStamp::NPT_TimeStamp(double seconds)
+{
+ m_NanoSeconds = (NPT_Int64)(seconds * 1e9);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TimeStamp::operator+=
++---------------------------------------------------------------------*/
+NPT_TimeStamp&
+NPT_TimeStamp::operator+=(const NPT_TimeStamp& t)
+{
+ m_NanoSeconds += t.m_NanoSeconds;
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TimeStamp::operator-=
++---------------------------------------------------------------------*/
+NPT_TimeStamp&
+NPT_TimeStamp::operator-=(const NPT_TimeStamp& t)
+{
+ m_NanoSeconds -= t.m_NanoSeconds;
+ return *this;
+}
+
+/*----------------------------------------------------------------------
+| MatchString
++---------------------------------------------------------------------*/
+static int
+MatchString(const char* string, const char* const* list, unsigned int list_length)
+{
+ for (unsigned int i=0; i<list_length; i++) {
+ if (NPT_StringsEqual(string, list[i])) return i;
+ }
+
+ return -1;
+}
+
+/*----------------------------------------------------------------------
+| ElapsedLeapYearsSince1900
++---------------------------------------------------------------------*/
+static NPT_UInt32
+ElapsedLeapYearsSince1900(NPT_UInt32 year)
+{
+ if (year < 1901) return 0;
+ NPT_UInt32 years_since_1900 = year-1-1900; // not including the current year
+ return years_since_1900/4 -
+ years_since_1900/100 +
+ (years_since_1900+300)/400;
+}
+
+/*----------------------------------------------------------------------
+| ElapsedDaysSince1900
++---------------------------------------------------------------------*/
+static NPT_UInt32
+ElapsedDaysSince1900(const NPT_DateTime& date)
+{
+ // compute the number of days elapsed in the year
+ NPT_UInt32 day_count = NPT_TIME_ELAPSED_DAYS_AT_MONTH[date.m_Month-1] + date.m_Day - 1;
+
+ // adjust for leap years after february
+ if (NPT_TIME_YEAR_IS_LEAP(date.m_Year) && (date.m_Month > 2)) ++day_count;
+
+ // compute the total number of elapsed days
+ NPT_UInt32 leap_year_count = ElapsedLeapYearsSince1900(date.m_Year);
+ day_count += (date.m_Year-1900)*365 + leap_year_count;
+
+ return day_count;
+}
+
+/*----------------------------------------------------------------------
+| NPT_DateTime::NPT_DateTime
++---------------------------------------------------------------------*/
+NPT_DateTime::NPT_DateTime() :
+ m_Year(1970),
+ m_Month(1),
+ m_Day(1),
+ m_Hours(0),
+ m_Minutes(0),
+ m_Seconds(0),
+ m_NanoSeconds(0),
+ m_TimeZone(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_DateTime::NPT_DateTime
++---------------------------------------------------------------------*/
+NPT_DateTime::NPT_DateTime(const NPT_TimeStamp& timestamp, bool local)
+{
+ FromTimeStamp(timestamp, local);
+}
+
+/*----------------------------------------------------------------------
+| NPT_DateTime::ChangeTimeZone
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DateTime::ChangeTimeZone(NPT_Int32 timezone)
+{
+ if (timezone < -12*60 || timezone > 12*60) {
+ return NPT_ERROR_OUT_OF_RANGE;
+ }
+ NPT_TimeStamp ts;
+ NPT_Result result = ToTimeStamp(ts);
+ if (NPT_FAILED(result)) return result;
+ ts.SetNanos(ts.ToNanos()+(NPT_Int64)timezone*(NPT_Int64)60*(NPT_Int64)1000000000);
+
+ result = FromTimeStamp(ts);
+ m_TimeZone = timezone;
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_DateTime::FromTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DateTime::FromTimeStamp(const NPT_TimeStamp& ts, bool local)
+{
+ // number of seconds from the epoch (positive or negative)
+ NPT_Int64 seconds = ts.ToSeconds();
+
+ // check the range (we only allow up to 31 bits of negative range for seconds
+ // in order to have the same lower bound as the 32-bit gmtime() function)
+ if (seconds < 0 && (NPT_Int32)seconds != seconds) return NPT_ERROR_OUT_OF_RANGE;
+
+ // adjust for the timezone if necessary
+ NPT_Int32 timezone = 0;
+ if (local) {
+ timezone = GetLocalTimeZone();
+ seconds += timezone*60;
+ }
+
+ // adjust to the number of seconds since 1900
+ seconds += (NPT_Int64)NPT_SECONDS_PER_YEAR*70 +
+ (NPT_Int64)(17*NPT_SECONDS_PER_DAY); // 17 leap year between 1900 and 1970
+
+ // compute the years since 1900, not adjusting for leap years
+ NPT_UInt32 years_since_1900 = (NPT_UInt32)(seconds/NPT_SECONDS_PER_YEAR);
+
+ // compute the number of seconds elapsed in the current year
+ seconds -= (NPT_Int64)years_since_1900 * NPT_SECONDS_PER_YEAR;
+
+ // adjust for leap years
+ bool is_leap_year = false;
+ NPT_Int64 leap_years_since_1900 = ElapsedLeapYearsSince1900(years_since_1900+1900);
+ if (seconds < (leap_years_since_1900 * NPT_SECONDS_PER_DAY)) {
+ // not enough seconds in the current year to compensate, move one year back
+ seconds += NPT_SECONDS_PER_YEAR;
+ seconds -= leap_years_since_1900 * NPT_SECONDS_PER_DAY;
+ --years_since_1900;
+ if (NPT_TIME_YEAR_IS_LEAP(years_since_1900+1900) ) {
+ seconds += NPT_SECONDS_PER_DAY;
+ is_leap_year = true;
+ }
+ } else {
+ seconds -= leap_years_since_1900 * NPT_SECONDS_PER_DAY;
+ if (NPT_TIME_YEAR_IS_LEAP(years_since_1900+1900) ) {
+ is_leap_year = true;
+ }
+ }
+
+ // now we know the year
+ m_Year = years_since_1900+1900;
+
+ // compute the number of days since January 1 (0 - 365)
+ NPT_UInt32 day_of_the_year = (NPT_UInt32)(seconds/NPT_SECONDS_PER_DAY);
+
+ // compute the number of seconds in the current day
+ seconds -= day_of_the_year * NPT_SECONDS_PER_DAY;
+
+ // compute the number of months since January (0 - 11) and the day of month (1 - 31) */
+ const NPT_Int32* month_day = is_leap_year?NPT_TIME_MONTH_DAY_LEAP:NPT_TIME_MONTH_DAY;
+ NPT_UInt32 month;
+ for (month = 1; month_day[month] < (NPT_Int32)day_of_the_year ; month++) {}
+
+ // now we know the month and day
+ m_Month = month;
+ m_Day = day_of_the_year - month_day[month-1];
+
+ // compute the number of hours since midnight (0 - 23), minutes after the hour
+ // (0 - 59), seconds after the minute (0 - 59) and nanoseconds
+ m_Hours = (NPT_Int32)seconds/3600;
+ seconds -= m_Hours * 3600L;
+ m_Minutes = (NPT_Int32)seconds / 60;
+ m_Seconds = (NPT_Int32)seconds - m_Minutes * 60;
+ m_NanoSeconds = (NPT_Int32)(ts.ToNanos()%1000000000);
+ if (local) {
+ m_TimeZone = timezone;
+ } else {
+ m_TimeZone = 0;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| CheckDate
++---------------------------------------------------------------------*/
+static NPT_Result
+CheckDate(const NPT_DateTime& date)
+{
+ NPT_TIME_CHECK_BOUNDS(date.m_Year, NPT_DATETIME_YEAR_MIN, NPT_DATETIME_YEAR_MAX);
+ NPT_TIME_CHECK_BOUNDS(date.m_Month, 1, 12);
+ NPT_TIME_CHECK_BOUNDS(date.m_Day, 1, 31);
+ NPT_TIME_CHECK_BOUNDS(date.m_Hours, 0, 23);
+ NPT_TIME_CHECK_BOUNDS(date.m_Minutes, 0, 59);
+ NPT_TIME_CHECK_BOUNDS(date.m_Seconds, 0, 59);
+ NPT_TIME_CHECK_BOUNDS(date.m_NanoSeconds, 0, 999999999);
+ NPT_TIME_CHECK_BOUNDS(date.m_TimeZone, -12*60, 12*60);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_DateTime::ToTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DateTime::ToTimeStamp(NPT_TimeStamp& timestamp) const
+{
+ // default value
+ timestamp.SetNanos(0);
+
+ // check bounds
+ NPT_Result result = CheckDate(*this);
+ if (NPT_FAILED(result)) return result;
+
+ // compute the number of days elapsed since 1900
+ NPT_UInt32 days = ElapsedDaysSince1900(*this);
+
+ // compute the number of nanoseconds
+ NPT_Int64 seconds = (NPT_Int64)days * (24*60*60) +
+ (NPT_Int64)m_Hours * (60*60) +
+ (NPT_Int64)m_Minutes * (60) +
+ (NPT_Int64)m_Seconds;
+ seconds -= (NPT_Int64)m_TimeZone*60;
+
+ // adjust to the number of seconds since 1900
+ seconds -= (NPT_Int64)NPT_SECONDS_PER_YEAR*70 +
+ (NPT_Int64)(17*NPT_SECONDS_PER_DAY); // 17 leap year between 1900 and 1970
+
+ timestamp.FromNanos(seconds * 1000000000 + m_NanoSeconds);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| AppendNumber
++---------------------------------------------------------------------*/
+static void
+AppendNumber(NPT_String& output, NPT_UInt32 number, unsigned int digit_count)
+{
+ NPT_Size new_length = output.GetLength()+digit_count;
+ output.SetLength(new_length);
+ char* dest = output.UseChars()+new_length;
+ while (digit_count--) {
+ *--dest = '0'+(number%10);
+ number /= 10;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_DateTime::ToString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_DateTime::ToString(Format format, NPT_Flags flags) const
+{
+ NPT_String result;
+
+ if (NPT_FAILED(CheckDate(*this))) return result;
+
+ switch (format) {
+ case FORMAT_W3C:
+ AppendNumber(result, m_Year, 4);
+ result += '-';
+ AppendNumber(result, m_Month, 2);
+ result += '-';
+ AppendNumber(result, m_Day, 2);
+ result += 'T';
+ AppendNumber(result, m_Hours, 2);
+ result += ':';
+ AppendNumber(result, m_Minutes, 2);
+ result += ':';
+ AppendNumber(result, m_Seconds, 2);
+ if (flags & FLAG_EMIT_FRACTION) {
+ result += '.';
+ if (flags & FLAG_EXTENDED_PRECISION) {
+ // nanoseconds precision
+ AppendNumber(result, m_NanoSeconds, 9);
+ } else {
+ // only miliseconds precision
+ AppendNumber(result, m_NanoSeconds/1000000, 3);
+ }
+ }
+ if (m_TimeZone) {
+ NPT_UInt32 tz;
+ if (m_TimeZone > 0) {
+ result += '+';
+ tz = m_TimeZone;
+ } else {
+ result += '-';
+ tz = -m_TimeZone;
+ }
+ AppendNumber(result, tz/60, 2);
+ result += ':';
+ AppendNumber(result, tz%60, 2);
+ } else {
+ result += 'Z';
+ }
+ break;
+
+ case FORMAT_ANSI: {
+ // compute the number of days elapsed since 1900
+ NPT_UInt32 days = ElapsedDaysSince1900(*this);
+
+ // format the result
+ result.SetLength(24);
+ NPT_FormatString(result.UseChars(), result.GetLength()+1,
+ "%.3s %.3s%3d %.2d:%.2d:%.2d %d",
+ NPT_TIME_DAYS_SHORT[(days+1)%7],
+ NPT_TIME_MONTHS[m_Month-1],
+ m_Day,
+ m_Hours,
+ m_Minutes,
+ m_Seconds,
+ m_Year);
+ break;
+ }
+
+ case FORMAT_RFC_1036:
+ case FORMAT_RFC_1123: {
+ // compute the number of days elapsed since 1900
+ NPT_UInt32 days = ElapsedDaysSince1900(*this);
+
+ if (format == FORMAT_RFC_1036) {
+ result += NPT_TIME_DAYS_LONG[(days+1)%7];
+ result += ", ";
+ AppendNumber(result, m_Day, 2);
+ result += '-';
+ result += NPT_TIME_MONTHS[m_Month-1];
+ result += '-';
+ AppendNumber(result, m_Year%100, 2);
+ } else {
+ result += NPT_TIME_DAYS_SHORT[(days+1)%7];
+ result += ", ";
+ AppendNumber(result, m_Day, 2);
+ result += ' ';
+ result += NPT_TIME_MONTHS[m_Month-1];
+ result += ' ';
+ AppendNumber(result, m_Year, 4);
+ }
+ result += ' ';
+ AppendNumber(result, m_Hours, 2);
+ result += ':';
+ AppendNumber(result, m_Minutes, 2);
+ result += ':';
+ AppendNumber(result, m_Seconds, 2);
+ if (m_TimeZone) {
+ if (m_TimeZone > 0) {
+ result += " +";
+ AppendNumber(result, m_TimeZone/60, 2);
+ AppendNumber(result, m_TimeZone%60, 2);
+ } else {
+ result += " -";
+ AppendNumber(result, -m_TimeZone/60, 2);
+ AppendNumber(result, -m_TimeZone%60, 2);
+ }
+ } else {
+ result += " GMT";
+ }
+ break;
+ }
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_DateTime::FromString
++--------------------------------------------------------------------*/
+NPT_Result
+NPT_DateTime::FromString(const char* date, Format format)
+{
+ if (date == NULL || date[0] == '\0') return NPT_ERROR_INVALID_PARAMETERS;
+
+ // create a local copy to work with
+ NPT_String workspace(date);
+ char* input = workspace.UseChars();
+ NPT_Size input_size = workspace.GetLength();
+
+ switch (format) {
+ case FORMAT_W3C: {
+ if (input_size < 17 && input_size != 10) return NPT_ERROR_INVALID_SYNTAX;
+
+ // check separators
+ if (input[4] != '-' ||
+ input[7] != '-') {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+
+ // replace separators with terminators
+ input[4] = input[7] = '\0';
+
+ bool no_seconds = true;
+ if (input_size > 10) {
+ if (input[10] != 'T' ||
+ input[13] != ':') {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ input[10] = input[13] = '\0';
+ if (input[16] == ':') {
+ input[16] = '\0';
+ no_seconds = false;
+ if (input_size < 20) return NPT_ERROR_INVALID_SYNTAX;
+ } else {
+ m_Seconds = 0;
+ }
+ }
+
+
+ // parse CCYY-MM-DD fields
+ if (NPT_FAILED(NPT_ParseInteger(input, m_Year, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+5, m_Month, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+8, m_Day, false))) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+
+ // parse remaining fields if any
+ if (input_size > 10) {
+ // parse the timezone part
+ if (input[input_size-1] == 'Z') {
+ m_TimeZone = 0;
+ input[input_size-1] = '\0';
+ } else if (input[input_size-6] == '+' || input[input_size-6] == '-') {
+ if (input[input_size-3] != ':') return NPT_ERROR_INVALID_SYNTAX;
+ input[input_size-3] = '\0';
+ unsigned int hh, mm;
+ if (NPT_FAILED(NPT_ParseInteger(input+input_size-5, hh, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+input_size-2, mm, false))) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ if (hh > 59 || mm > 59) return NPT_ERROR_INVALID_SYNTAX;
+ m_TimeZone = hh*60+mm;
+ if (input[input_size-6] == '-') m_TimeZone = -m_TimeZone;
+ input[input_size-6] = '\0';
+ }
+
+ // parse fields
+ if (NPT_FAILED(NPT_ParseInteger(input+11, m_Hours, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+14, m_Minutes, false))) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ if (!no_seconds && input[19] == '.') {
+ char fraction[10];
+ fraction[9] = '\0';
+ unsigned int fraction_size = NPT_StringLength(&input[20]);
+ if (fraction_size == 0) return NPT_ERROR_INVALID_SYNTAX;
+ for (unsigned int i=0; i<9; i++) {
+ if (i < fraction_size) {
+ fraction[i] = input[20+i];
+ } else {
+ fraction[i] = '0';
+ }
+ }
+ if (NPT_FAILED(NPT_ParseInteger(fraction, m_NanoSeconds, false))) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ input[19] = '\0';
+ } else {
+ m_NanoSeconds = 0;
+ }
+ if (!no_seconds) {
+ if (NPT_FAILED(NPT_ParseInteger(input+17, m_Seconds, false))) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ }
+ }
+ break;
+ }
+
+ case FORMAT_RFC_1036:
+ case FORMAT_RFC_1123: {
+ if (input_size < 26) return NPT_ERROR_INVALID_SYNTAX;
+ // look for the weekday and separtor
+ const char* wday = input;
+ while (*input && *input != ',') {
+ ++input;
+ --input_size;
+ }
+ if (*input == '\0' || *wday == ',') return NPT_ERROR_INVALID_SYNTAX;
+ *input++ = '\0';
+ --input_size;
+
+ // look for the timezone
+ char* timezone = input+input_size-1;
+ unsigned int timezone_size = 0;
+ while (input_size && *timezone != ' ') {
+ --timezone;
+ ++timezone_size;
+ --input_size;
+ }
+ if (input_size == 0) return NPT_ERROR_INVALID_SYNTAX;
+ *timezone++ = '\0';
+
+ // check separators
+ if (input_size < 20) return NPT_ERROR_INVALID_SYNTAX;
+ unsigned int yl = input_size-18;
+ if (yl != 2 && yl != 4) return NPT_ERROR_INVALID_SYNTAX;
+ char sep;
+ int wday_index;
+ if (format == FORMAT_RFC_1036) {
+ sep = '-';
+ wday_index = MatchString(wday, NPT_TIME_DAYS_LONG, 7);
+ } else {
+ sep = ' ';
+ wday_index = MatchString(wday, NPT_TIME_DAYS_SHORT, 7);
+ }
+ if (input[0] != ' ' ||
+ input[3] != sep ||
+ input[7] != sep ||
+ input[8+yl] != ' ' ||
+ input[11+yl] != ':' ||
+ input[14+yl] != ':') {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ input[3] = input[7] = input[8+yl] = input[11+yl] = input[14+yl] = '\0';
+
+ // parse fields
+ m_Month = 1+MatchString(input+4, NPT_TIME_MONTHS, 12);
+ if (NPT_FAILED(NPT_ParseInteger(input+1, m_Day, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+8, m_Year, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+9+yl, m_Hours, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+12+yl, m_Minutes, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+15+yl, m_Seconds, false))) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+
+ // adjust short year lengths
+ if (yl == 2) m_Year += 1900;
+
+ // parse the timezone
+ if (NPT_StringsEqual(timezone, "GMT") ||
+ NPT_StringsEqual(timezone, "UT") ||
+ NPT_StringsEqual(timezone, "Z")) {
+ m_TimeZone = 0;
+ } else if (NPT_StringsEqual(timezone, "EDT")) {
+ m_TimeZone = -4*60;
+ } else if (NPT_StringsEqual(timezone, "EST") ||
+ NPT_StringsEqual(timezone, "CDT")) {
+ m_TimeZone = -5*60;
+ } else if (NPT_StringsEqual(timezone, "CST") ||
+ NPT_StringsEqual(timezone, "MDT")) {
+ m_TimeZone = -6*60;
+ } else if (NPT_StringsEqual(timezone, "MST") ||
+ NPT_StringsEqual(timezone, "PDT")) {
+ m_TimeZone = -7*60;
+ } else if (NPT_StringsEqual(timezone, "PST")) {
+ m_TimeZone = -8*60;
+ } else if (timezone_size == 1) {
+ if (timezone[0] >= 'A' && timezone[0] <= 'I') {
+ m_TimeZone = -60*(1+timezone[0]-'A');
+ } else if (timezone[0] >= 'K' && timezone[0] <= 'M') {
+ m_TimeZone = -60*(timezone[0]-'A');
+ } else if (timezone[0] >= 'N' && timezone[0] <= 'Y') {
+ m_TimeZone = 60*(1+timezone[0]-'N');
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ } else if (timezone_size == 5) {
+ int sign;
+ if (timezone[0] == '-') {
+ sign = -1;
+ } else if (timezone[0] == '+') {
+ sign = 1;
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ NPT_UInt32 tz;
+ if (NPT_FAILED(NPT_ParseInteger(timezone+1, tz, false))) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ unsigned int hh = (tz/100);
+ unsigned int mm = (tz%100);
+ if (hh > 59 || mm > 59) return NPT_ERROR_INVALID_SYNTAX;
+ m_TimeZone = sign*(hh*60+mm);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+
+ // compute the number of days elapsed since 1900
+ NPT_UInt32 days = ElapsedDaysSince1900(*this);
+ if ((int)((days+1)%7) != wday_index) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ m_NanoSeconds = 0;
+
+ break;
+ }
+
+ case FORMAT_ANSI: {
+ if (input_size != 24) return NPT_ERROR_INVALID_SYNTAX;
+
+ // check separators
+ if (input[3] != ' ' ||
+ input[7] != ' ' ||
+ input[10] != ' ' ||
+ input[13] != ':' ||
+ input[16] != ':' ||
+ input[19] != ' ') {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ input[3] = input[7] = input[10] = input[13] = input[16] = input[19] = '\0';
+ if (input[8] == ' ') input[8] = '0';
+
+ m_Month = 1+MatchString(input+4, NPT_TIME_MONTHS, 12);
+ if (NPT_FAILED(NPT_ParseInteger(input+8, m_Day, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+11, m_Hours, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+14, m_Minutes, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+17, m_Seconds, false)) ||
+ NPT_FAILED(NPT_ParseInteger(input+20, m_Year, false))) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+
+ // compute the number of days elapsed since 1900
+ NPT_UInt32 days = ElapsedDaysSince1900(*this);
+ if ((int)((days+1)%7) != MatchString(input, NPT_TIME_DAYS_SHORT, 7)) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ m_TimeZone = 0;
+ m_NanoSeconds = 0;
+ break;
+ }
+
+ default:
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return CheckDate(*this);
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptTime.h b/lib/libUPnP/Neptune/Source/Core/NptTime.h
new file mode 100644
index 0000000..ae02a48
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptTime.h
@@ -0,0 +1,156 @@
+/*****************************************************************
+|
+| Neptune - Time
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_TIME_H_
+#define _NPT_TIME_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptStrings.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define NPT_DATETIME_YEAR_MIN 1901
+#define NPT_DATETIME_YEAR_MAX 2262
+
+/*----------------------------------------------------------------------
+| NPT_TimeStamp
++---------------------------------------------------------------------*/
+class NPT_TimeStamp
+{
+ public:
+ // methods
+ NPT_TimeStamp(const NPT_TimeStamp& timestamp);
+ NPT_TimeStamp() : m_NanoSeconds(0) {}
+ NPT_TimeStamp(NPT_Int64 nanoseconds) : m_NanoSeconds(nanoseconds) {}
+ NPT_TimeStamp(double seconds);
+ NPT_TimeStamp& operator+=(const NPT_TimeStamp& time_stamp);
+ NPT_TimeStamp& operator-=(const NPT_TimeStamp& time_stamp);
+ bool operator==(const NPT_TimeStamp& t) const { return m_NanoSeconds == t.m_NanoSeconds; }
+ bool operator!=(const NPT_TimeStamp& t) const { return m_NanoSeconds != t.m_NanoSeconds; }
+ bool operator> (const NPT_TimeStamp& t) const { return m_NanoSeconds > t.m_NanoSeconds; }
+ bool operator< (const NPT_TimeStamp& t) const { return m_NanoSeconds < t.m_NanoSeconds; }
+ bool operator>=(const NPT_TimeStamp& t) const { return m_NanoSeconds >= t.m_NanoSeconds; }
+ bool operator<=(const NPT_TimeStamp& t) const { return m_NanoSeconds <= t.m_NanoSeconds; }
+
+ // accessors
+ void SetNanos(NPT_Int64 nanoseconds) { m_NanoSeconds = nanoseconds; }
+ void SetMicros(NPT_Int64 micros) { m_NanoSeconds = micros * 1000; }
+ void SetMillis(NPT_Int64 millis) { m_NanoSeconds = millis * 1000000; }
+ void SetSeconds(NPT_Int64 seconds) { m_NanoSeconds = seconds * 1000000000; }
+
+ // conversion
+ operator double() const { return (double)m_NanoSeconds/1E9; }
+ void FromNanos(NPT_Int64 nanoseconds) { m_NanoSeconds = nanoseconds; }
+ NPT_Int64 ToNanos() const { return m_NanoSeconds; }
+ NPT_Int64 ToMicros() const { return m_NanoSeconds/1000; }
+ NPT_Int64 ToMillis() const { return m_NanoSeconds/1000000; }
+ NPT_Int64 ToSeconds() const { return m_NanoSeconds/1000000000; }
+
+private:
+ // members
+ NPT_Int64 m_NanoSeconds;
+};
+
+/*----------------------------------------------------------------------
+| operator+
++---------------------------------------------------------------------*/
+inline
+NPT_TimeStamp
+operator+(const NPT_TimeStamp& t1, const NPT_TimeStamp& t2)
+{
+ NPT_TimeStamp t = t1;
+ return t += t2;
+}
+
+/*----------------------------------------------------------------------
+| operator-
++---------------------------------------------------------------------*/
+inline
+NPT_TimeStamp
+operator-(const NPT_TimeStamp& t1, const NPT_TimeStamp& t2)
+{
+ NPT_TimeStamp t = t1;
+ return t -= t2;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TimeInterval
++---------------------------------------------------------------------*/
+typedef NPT_TimeStamp NPT_TimeInterval;
+
+/*----------------------------------------------------------------------
+| NPT_DateTime
++---------------------------------------------------------------------*/
+class NPT_DateTime {
+public:
+ // types
+ enum Format {
+ FORMAT_ANSI,
+ FORMAT_W3C,
+ FORMAT_RFC_1123, // RFC 822 updated by RFC 1123
+ FORMAT_RFC_1036 // RFC 850 updated by RFC 1036
+ };
+
+ enum FormatFlags {
+ FLAG_EMIT_FRACTION = 1,
+ FLAG_EXTENDED_PRECISION = 2
+ };
+
+ // class methods
+ NPT_Int32 GetLocalTimeZone();
+
+ // constructors
+ NPT_DateTime();
+ NPT_DateTime(const NPT_TimeStamp& timestamp, bool local=false);
+
+ // methods
+ NPT_Result ChangeTimeZone(NPT_Int32 timezone);
+ NPT_Result FromTimeStamp(const NPT_TimeStamp& timestamp, bool local=false);
+ NPT_Result ToTimeStamp(NPT_TimeStamp& timestamp) const;
+ NPT_Result FromString(const char* date, Format format = FORMAT_ANSI);
+ NPT_String ToString(Format format = FORMAT_ANSI, NPT_Flags flags=0) const;
+
+ // members
+ NPT_Int32 m_Year; // year
+ NPT_Int32 m_Month; // month of the year (1-12)
+ NPT_Int32 m_Day; // day of the month (1-31)
+ NPT_Int32 m_Hours; // hours (0-23)
+ NPT_Int32 m_Minutes; // minutes (0-59)
+ NPT_Int32 m_Seconds; // seconds (0-59)
+ NPT_Int32 m_NanoSeconds; // nanoseconds (0-999999999)
+ NPT_Int32 m_TimeZone; // minutes offset from GMT
+};
+
+#endif // _NPT_TIME_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptTls.cpp b/lib/libUPnP/Neptune/Source/Core/NptTls.cpp
new file mode 100644
index 0000000..594adbd
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptTls.cpp
@@ -0,0 +1,1227 @@
+/*****************************************************************
+|
+| Neptune - TLS/SSL Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTls.h"
+#include "NptLogging.h"
+#include "NptUtils.h"
+#include "NptSockets.h"
+#include "NptSystem.h"
+#include "NptDigest.h"
+#include "NptAutomaticCleaner.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.tls")
+
+#if defined(NPT_CONFIG_ENABLE_TLS)
+#include "ssl.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const unsigned int NPT_TLS_CONTEXT_DEFAULT_SESSION_CACHE = 16;
+const unsigned int NPT_HTTP_TLS_CONNECTOR_MAX_PROXY_RESPONSE_SIZE = (16*1024);
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef NPT_Reference<NPT_TlsSessionImpl> NPT_TlsSessionImplReference;
+
+/*----------------------------------------------------------------------
+| SSL_DateTime_Before
++---------------------------------------------------------------------*/
+int
+SSL_DateTime_Before(const SSL_DateTime* t1, const SSL_DateTime* t2)
+{
+ if (t1->year == t2->year) {
+ if (t1->month == t2->month) {
+ if (t1->day == t2->day) {
+ return t1->hours*3600+t1->minutes*60+t1->seconds <
+ t2->hours*3600+t2->minutes*60+t2->seconds ? 1 : 0;
+ } else {
+ return t1->day < t2->day ? 1 : 0;
+ }
+ } else {
+ return t1->month < t2->month ? 1 : 0;
+ }
+ } else {
+ return t1->year < t2->year ? 1 : 0;
+ }
+}
+
+/*----------------------------------------------------------------------
+| SSL_DateTime_Now
++---------------------------------------------------------------------*/
+void
+SSL_DateTime_Now(SSL_DateTime* now)
+{
+ NPT_TimeStamp ts;
+ NPT_System::GetCurrentTimeStamp(ts);
+ NPT_DateTime dt;
+ dt.FromTimeStamp(ts);
+ now->year = dt.m_Year;
+ now->month = dt.m_Month;
+ now->day = dt.m_Day;
+ now->hours = dt.m_Hours;
+ now->minutes = dt.m_Minutes;
+ now->seconds = dt.m_Seconds;
+}
+
+/*----------------------------------------------------------------------
+| SSL_GetRandomSeed
++---------------------------------------------------------------------*/
+uint64_t
+SSL_GetRandomSeed()
+{
+ NPT_TimeStamp ts;
+ NPT_System::GetCurrentTimeStamp(ts);
+ return ts.ToNanos();
+}
+
+/*----------------------------------------------------------------------
+| SSL_Mutex_Create
++---------------------------------------------------------------------*/
+void
+SSL_Mutex_Create(NPT_Mutex** mutex)
+{
+ *mutex = new NPT_Mutex();
+}
+
+/*----------------------------------------------------------------------
+| SSL_Mutex_Destroy
++---------------------------------------------------------------------*/
+void
+SSL_Mutex_Destroy(NPT_Mutex* mutex)
+{
+ delete mutex;
+}
+
+/*----------------------------------------------------------------------
+| SSL_Mutex_Lock
++---------------------------------------------------------------------*/
+void
+SSL_Mutex_Lock(NPT_Mutex* mutex)
+{
+ mutex->Lock();
+}
+
+/*----------------------------------------------------------------------
+| SSL_Mutex_Lock
++---------------------------------------------------------------------*/
+void
+SSL_Mutex_Unlock(NPT_Mutex* mutex)
+{
+ mutex->Unlock();
+}
+
+/*----------------------------------------------------------------------
+| SSL_Sha256_ComputeDigest
++---------------------------------------------------------------------*/
+void
+SSL_Sha256_ComputeDigest(const unsigned char* data,
+ unsigned int data_size,
+ unsigned char* digest_value)
+{
+ NPT_Digest* digest = NULL;
+ NPT_Digest::Create(NPT_Digest::ALGORITHM_SHA256, digest);
+ digest->Update(data, data_size);
+ NPT_DataBuffer buffer;
+ digest->GetDigest(buffer);
+ NPT_CopyMemory(digest_value, buffer.GetData(), 32);
+ delete digest;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Tls::MatchDnsName
++---------------------------------------------------------------------*/
+bool
+NPT_Tls::MatchDnsName(const char* hostname, const char* dns_name)
+{
+ // NULL or empty names don't match anything
+ if (hostname == NULL || *hostname == '\0') return false;
+ if (dns_name == NULL || *dns_name == '\0') return false;
+
+ // check for wildcards */
+ if (dns_name[0] == '*') {
+ // wildcard match, expect '*.' at the start, we don't match '*foo.com'
+ if (dns_name[1] != '.') return false;
+
+ // skip the first component of the hostname
+ while (hostname[0] != '\0' && hostname[0] != '.') {
+ ++hostname;
+ }
+ if (hostname[0] == '.') ++hostname;
+
+ // compare the tails
+ return NPT_String::Compare(hostname, dns_name+2, true) == 0;
+ } else {
+ // full match
+ return NPT_String::Compare(hostname, dns_name, true) == 0;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Tls::MatchDnsNames
++---------------------------------------------------------------------*/
+bool
+NPT_Tls::MatchDnsNames(const char* hostname,
+ const NPT_List<NPT_String>& dns_names)
+{
+ // NULL or empty names don't match anything
+ if (hostname == NULL || *hostname == '\0') return false;
+
+ // check the dns names
+ for (NPT_List<NPT_String>::Iterator i = dns_names.GetFirstItem();
+ i;
+ ++i) {
+ if (MatchDnsName(hostname, (*i).GetChars())) return true;
+ }
+
+ // no match
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Tls_MapResult
++---------------------------------------------------------------------*/
+static NPT_Result
+NPT_Tls_MapResult(int err)
+{
+ switch (err) {
+ case SSL_ERROR_CONN_LOST: return NPT_ERROR_CONNECTION_ABORTED;
+ case SSL_ERROR_TIMEOUT: return NPT_ERROR_TIMEOUT;
+ case SSL_ERROR_EOS: return NPT_ERROR_EOS;
+ case SSL_CLOSE_NOTIFY: return NPT_ERROR_EOS;
+ case SSL_ERROR_NOT_SUPPORTED: return NPT_ERROR_NOT_SUPPORTED;
+ case SSL_ERROR_INVALID_HANDSHAKE: return NPT_ERROR_TLS_INVALID_HANDSHAKE;
+ case SSL_ERROR_INVALID_PROT_MSG: return NPT_ERROR_TLS_INVALID_PROTOCOL_MESSAGE;
+ case SSL_ERROR_INVALID_HMAC: return NPT_ERROR_TLS_INVALID_HMAC;
+ case SSL_ERROR_INVALID_VERSION: return NPT_ERROR_TLS_INVALID_VERSION;
+ case SSL_ERROR_INVALID_SESSION: return NPT_ERROR_TLS_INVALID_SESSION;
+ case SSL_ERROR_NO_CIPHER: return NPT_ERROR_TLS_NO_CIPHER;
+ case SSL_ERROR_BAD_CERTIFICATE: return NPT_ERROR_TLS_BAD_CERTIFICATE;
+ case SSL_ERROR_INVALID_KEY: return NPT_ERROR_TLS_INVALID_KEY;
+ case SSL_ERROR_FINISHED_INVALID: return NPT_ERROR_TLS_INVALID_FINISHED_MESSAGE;
+ case SSL_ERROR_NO_CERT_DEFINED: return NPT_ERROR_TLS_NO_CERTIFICATE_DEFINED;
+ case SSL_ERROR_NO_CLIENT_RENOG: return NPT_ERROR_TLS_NO_CLIENT_RENEGOTIATION;
+ case -SSL_ALERT_HANDSHAKE_FAILURE: return NPT_ERROR_TLS_ALERT_HANDSHAKE_FAILED;
+ case -SSL_ALERT_BAD_CERTIFICATE: return NPT_ERROR_TLS_ALERT_BAD_CERTIFICATE;
+ case -SSL_ALERT_INVALID_VERSION: return NPT_ERROR_TLS_ALERT_INVALID_VERSION;
+ case -SSL_ALERT_BAD_RECORD_MAC: return NPT_ERROR_TLS_ALERT_BAD_RECORD_MAC;
+ case -SSL_ALERT_DECODE_ERROR: return NPT_ERROR_TLS_ALERT_DECODE_ERROR;
+ case -SSL_ALERT_DECRYPT_ERROR: return NPT_ERROR_TLS_ALERT_DECRYPT_ERROR;
+ case -SSL_ALERT_ILLEGAL_PARAMETER: return NPT_ERROR_TLS_ALERT_ILLEGAL_PARAMETER;
+ case -SSL_ALERT_UNEXPECTED_MESSAGE: return NPT_ERROR_TLS_ALERT_UNEXPECTED_MESSAGE;
+ case SSL_X509_ERROR(X509_NOT_OK): return NPT_ERROR_TLS_CERTIFICATE_FAILURE;
+ case SSL_X509_ERROR(X509_VFY_ERROR_NO_TRUSTED_CERT): return NPT_ERROR_TLS_CERTIFICATE_NO_TRUST_ANCHOR;
+ case SSL_X509_ERROR(X509_VFY_ERROR_BAD_SIGNATURE): return NPT_ERROR_TLS_CERTIFICATE_BAD_SIGNATURE;
+ case SSL_X509_ERROR(X509_VFY_ERROR_NOT_YET_VALID): return NPT_ERROR_TLS_CERTIFICATE_NOT_YET_VALID;
+ case SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED): return NPT_ERROR_TLS_CERTIFICATE_EXPIRED;
+ case SSL_X509_ERROR(X509_VFY_ERROR_SELF_SIGNED): return NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED;
+ case SSL_X509_ERROR(X509_VFY_ERROR_INVALID_CHAIN): return NPT_ERROR_TLS_CERTIFICATE_INVALID_CHAIN;
+ case SSL_X509_ERROR(X509_VFY_ERROR_UNSUPPORTED_DIGEST): return NPT_ERROR_TLS_CERTIFICATE_UNSUPPORTED_DIGEST;
+ case SSL_X509_ERROR(X509_INVALID_PRIV_KEY): return NPT_ERROR_TLS_CERTIFICATE_INVALID_PRIVATE_KEY;
+ case 0: return NPT_SUCCESS;
+ default: return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsContextImpl
++---------------------------------------------------------------------*/
+class NPT_TlsContextImpl {
+public:
+ NPT_TlsContextImpl(NPT_Flags options) :
+ m_SSL_CTX(ssl_ctx_new(((options & NPT_TlsContext::OPTION_VERIFY_LATER)?SSL_SERVER_VERIFY_LATER:0) |
+ ((options & NPT_TlsContext::OPTION_REQUIRE_CLIENT_CERTIFICATE)?SSL_CLIENT_AUTHENTICATION:0),
+ (options & NPT_TlsContext::OPTION_NO_SESSION_CACHE)?0:NPT_TLS_CONTEXT_DEFAULT_SESSION_CACHE)) {}
+ ~NPT_TlsContextImpl() { ssl_ctx_free(m_SSL_CTX); }
+
+ NPT_Result LoadKey(NPT_TlsKeyFormat key_format,
+ const unsigned char* key_data,
+ NPT_Size key_data_size,
+ const char* password);
+ NPT_Result SelfSignCertificate(const char* common_name,
+ const char* organization,
+ const char* organizational_name);
+ NPT_Result AddTrustAnchor(const unsigned char* ta_data,
+ NPT_Size ta_data_size);
+
+ SSL_CTX* m_SSL_CTX;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsContextImpl::LoadKey
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsContextImpl::LoadKey(NPT_TlsKeyFormat key_format,
+ const unsigned char* key_data,
+ NPT_Size key_data_size,
+ const char* password)
+{
+ int object_type;
+ switch (key_format) {
+ case NPT_TLS_KEY_FORMAT_RSA_PRIVATE: object_type = SSL_OBJ_RSA_KEY; break;
+ case NPT_TLS_KEY_FORMAT_PKCS8: object_type = SSL_OBJ_PKCS8; break;
+ case NPT_TLS_KEY_FORMAT_PKCS12: object_type = SSL_OBJ_PKCS12; break;
+ default: return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ int result = ssl_obj_memory_load(m_SSL_CTX, object_type, key_data, key_data_size, password);
+ return NPT_Tls_MapResult(result);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsContextImpl::SelfSignCertificate
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsContextImpl::SelfSignCertificate(const char* common_name,
+ const char* organization,
+ const char* organizational_name)
+{
+ const char* dn[3] = {common_name, organization, organizational_name};
+ uint8_t* certificate = NULL;
+ int result = ssl_x509_create(m_SSL_CTX, 0, dn, &certificate);
+ if (result <= 0) {
+ if (certificate) {
+ ssl_mem_free(certificate);
+ }
+ return NPT_Tls_MapResult(result);
+ }
+ result = ssl_obj_memory_load(m_SSL_CTX, SSL_OBJ_X509_CERT, certificate, result, NULL);
+ ssl_mem_free(certificate);
+
+ return NPT_Tls_MapResult(result);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsContextImpl::AddTrustAnchor
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsContextImpl::AddTrustAnchor(const unsigned char* ta_data,
+ NPT_Size ta_data_size)
+{
+ int result = ssl_obj_memory_load(m_SSL_CTX, SSL_OBJ_X509_CACERT, ta_data, ta_data_size, NULL);
+ return NPT_Tls_MapResult(result);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsStreamAdapter
++---------------------------------------------------------------------*/
+struct NPT_TlsStreamAdapter
+{
+ static int Read(SSL_SOCKET* _self, void* buffer, unsigned int size) {
+ NPT_TlsStreamAdapter* self = (NPT_TlsStreamAdapter*)_self;
+ NPT_Size bytes_read = 0;
+ NPT_Result result = self->m_Input->Read(buffer, size, &bytes_read);
+ if (NPT_FAILED(result)) {
+ switch (result) {
+ case NPT_ERROR_EOS: return SSL_ERROR_EOS;
+ case NPT_ERROR_TIMEOUT: return SSL_ERROR_TIMEOUT;
+ default: return SSL_ERROR_CONN_LOST;
+ }
+ }
+ return bytes_read;
+ }
+
+ static int Write(SSL_SOCKET* _self, const void* buffer, unsigned int size) {
+ NPT_TlsStreamAdapter* self = (NPT_TlsStreamAdapter*)_self;
+ NPT_Size bytes_written = 0;
+ NPT_Result result = self->m_Output->Write(buffer, size, &bytes_written);
+ if (NPT_FAILED(result)) {
+ switch (result) {
+ case NPT_ERROR_EOS: return SSL_ERROR_EOS;
+ case NPT_ERROR_TIMEOUT: return SSL_ERROR_TIMEOUT;
+ default: return SSL_ERROR_CONN_LOST;
+ }
+ }
+ return bytes_written;
+ }
+
+ NPT_TlsStreamAdapter(NPT_InputStreamReference input,
+ NPT_OutputStreamReference output) :
+ m_Input(input), m_Output(output) {
+ m_Base.Read = Read;
+ m_Base.Write = Write;
+ }
+
+ SSL_SOCKET m_Base;
+ NPT_InputStreamReference m_Input;
+ NPT_OutputStreamReference m_Output;
+};
+
+
+/*----------------------------------------------------------------------
+| NPT_TlsSessionImpl
++---------------------------------------------------------------------*/
+class NPT_TlsSessionImpl {
+public:
+ NPT_TlsSessionImpl(SSL_CTX* context,
+ NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output) :
+ m_SSL_CTX(context),
+ m_SSL(NULL),
+ m_StreamAdapter(input, output) {}
+ virtual ~NPT_TlsSessionImpl() { ssl_free(m_SSL); }
+
+ // methods
+ virtual NPT_Result Handshake() = 0;
+ virtual NPT_Result GetHandshakeStatus();
+ virtual NPT_Result VerifyPeerCertificate();
+ virtual NPT_Result VerifyDnsNameMatch(const char* hostname);
+ virtual NPT_Result GetSessionId(NPT_DataBuffer& session_id);
+ virtual NPT_UInt32 GetCipherSuiteId();
+ virtual NPT_Result GetPeerCertificateInfo(NPT_TlsCertificateInfo& cert_info,
+ NPT_Ordinal position);
+
+ // members
+ SSL_CTX* m_SSL_CTX;
+ SSL* m_SSL;
+ NPT_TlsStreamAdapter m_StreamAdapter;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsSessionImpl::GetHandshakeStatus
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSessionImpl::GetHandshakeStatus()
+{
+ int status;
+ if (m_SSL == NULL || (status = ssl_handshake_status(m_SSL)) == SSL_NOT_OK) {
+ // no handshake done
+ return NPT_ERROR_INVALID_STATE;
+ }
+
+ return NPT_Tls_MapResult(status);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSessionImpl::VerifyPeerCertificate
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSessionImpl::VerifyPeerCertificate()
+{
+ if (m_SSL == NULL || ssl_handshake_status(m_SSL) == SSL_NOT_OK) {
+ // no handshake done
+ return NPT_ERROR_INVALID_STATE;
+ }
+
+ int result = ssl_verify_cert(m_SSL);
+ return NPT_Tls_MapResult(result);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSessionImpl::VerifyDnsNameMatch
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSessionImpl::VerifyDnsNameMatch(const char* hostname)
+{
+ if (hostname == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+ if (m_SSL == NULL || ssl_handshake_status(m_SSL) == SSL_NOT_OK) {
+ // no handshake done
+ return NPT_ERROR_INVALID_STATE;
+ }
+
+ // get the peer certificate
+ const SSL_X509_CERT* cert = ssl_get_peer_cert(m_SSL, 0);
+ if (cert == NULL) return NPT_ERROR_NO_SUCH_ITEM;
+
+ // try the common name
+ const char* common_name = ssl_cert_get_dn(cert, SSL_X509_CERT_COMMON_NAME);
+ if (common_name && NPT_Tls::MatchDnsName(hostname, common_name)) return NPT_SUCCESS;
+
+ // try all the alt DNS names
+ const char* alt_name = NULL;
+ for (unsigned int i=0; (alt_name=ssl_cert_get_subject_alt_dnsname(cert, i)); i++) {
+ if (NPT_Tls::MatchDnsName(hostname, alt_name)) return NPT_SUCCESS;
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSessionImpl::GetSessionId
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSessionImpl::GetSessionId(NPT_DataBuffer& session_id)
+{
+ if (m_SSL == NULL || ssl_handshake_status(m_SSL) == SSL_NOT_OK) {
+ // no handshake done
+ session_id.SetDataSize(0);
+ return NPT_ERROR_INVALID_STATE;
+ }
+
+ // return the session id
+ session_id.SetData(ssl_get_session_id(m_SSL),
+ ssl_get_session_id_size(m_SSL));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSessionImpl::GetCipherSuiteId
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_TlsSessionImpl::GetCipherSuiteId()
+{
+ if (m_SSL == NULL || ssl_handshake_status(m_SSL) == SSL_NOT_OK) {
+ // no handshake done
+ return 0;
+ }
+
+ return ssl_get_cipher_id(m_SSL);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSessionImpl::GetPeerCertificateInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSessionImpl::GetPeerCertificateInfo(NPT_TlsCertificateInfo& cert_info,
+ NPT_Ordinal position)
+{
+ if (m_SSL == NULL || ssl_handshake_status(m_SSL) == SSL_NOT_OK) {
+ // no handshake done
+ return NPT_ERROR_INVALID_STATE;
+ }
+
+ // find the certificate at the requested index
+ const SSL_X509_CERT* cert = ssl_get_peer_cert(m_SSL, position);
+ if (cert == NULL) return NPT_ERROR_NO_SUCH_ITEM;
+
+ // get the certificate fields
+ cert_info.subject.common_name = ssl_cert_get_dn(cert, SSL_X509_CERT_COMMON_NAME);
+ cert_info.subject.organization = ssl_cert_get_dn(cert, SSL_X509_CERT_ORGANIZATION);
+ cert_info.subject.organizational_name = ssl_cert_get_dn(cert, SSL_X509_CERT_ORGANIZATIONAL_NAME);
+ cert_info.issuer.common_name = ssl_cert_get_dn(cert, SSL_X509_CA_CERT_COMMON_NAME);
+ cert_info.issuer.organization = ssl_cert_get_dn(cert, SSL_X509_CA_CERT_ORGANIZATION);
+ cert_info.issuer.organizational_name = ssl_cert_get_dn(cert, SSL_X509_CA_CERT_ORGANIZATIONAL_NAME);
+
+ ssl_cert_get_fingerprints(cert, cert_info.fingerprint.md5, cert_info.fingerprint.sha1);
+ SSL_DateTime not_before, not_after;
+ ssl_cert_get_validity_dates(cert, &not_before, &not_after);
+ cert_info.issue_date.m_Year = not_before.year;
+ cert_info.issue_date.m_Month = not_before.month;
+ cert_info.issue_date.m_Day = not_before.day;
+ cert_info.issue_date.m_Hours = not_before.hours;
+ cert_info.issue_date.m_Minutes = not_before.minutes;
+ cert_info.issue_date.m_Seconds = not_before.seconds;
+ cert_info.issue_date.m_NanoSeconds = 0;
+ cert_info.issue_date.m_TimeZone = 0;
+ cert_info.expiration_date.m_Year = not_after.year;
+ cert_info.expiration_date.m_Month = not_after.month;
+ cert_info.expiration_date.m_Day = not_after.day;
+ cert_info.expiration_date.m_Hours = not_after.hours;
+ cert_info.expiration_date.m_Minutes = not_after.minutes;
+ cert_info.expiration_date.m_Seconds = not_after.seconds;
+ cert_info.expiration_date.m_NanoSeconds = 0;
+ cert_info.expiration_date.m_TimeZone = 0;
+
+ // alternate names
+ cert_info.alternate_names.Clear();
+ const char* alt_name = NULL;
+ for (unsigned int i=0; (alt_name=ssl_cert_get_subject_alt_dnsname(cert, i)); i++) {
+ cert_info.alternate_names.Add(NPT_String(alt_name));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsClientSessionImpl
++---------------------------------------------------------------------*/
+class NPT_TlsClientSessionImpl : public NPT_TlsSessionImpl {
+public:
+ NPT_TlsClientSessionImpl(SSL_CTX* context,
+ NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output) :
+ NPT_TlsSessionImpl(context, input, output) {}
+
+ // methods
+ virtual NPT_Result Handshake();
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsClientSessionImpl::Handshake
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsClientSessionImpl::Handshake()
+{
+ if (m_SSL == NULL) {
+ // we have not created the client object yet
+ m_SSL = ssl_client_new(m_SSL_CTX, &m_StreamAdapter.m_Base, NULL, 0);
+ }
+
+ int result = ssl_handshake_status(m_SSL);
+ return NPT_Tls_MapResult(result);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsServerSessionImpl
++---------------------------------------------------------------------*/
+class NPT_TlsServerSessionImpl : public NPT_TlsSessionImpl {
+public:
+ NPT_TlsServerSessionImpl(SSL_CTX* context,
+ NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output) :
+ NPT_TlsSessionImpl(context, input, output) {}
+
+ // methods
+ virtual NPT_Result Handshake();
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsServerSessionImpl::Handshake
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsServerSessionImpl::Handshake()
+{
+ if (m_SSL == NULL) {
+ // we have not created the server object yet
+ m_SSL = ssl_server_new(m_SSL_CTX, &m_StreamAdapter.m_Base);
+ }
+
+ uint8_t* data = NULL;
+ int result;
+ while ((result = ssl_handshake_status(m_SSL)) == SSL_NOT_OK) {
+ result = ssl_read(m_SSL, &data);
+ if (result != SSL_OK) break;
+ if (data != NULL) {
+ NPT_LOG_WARNING("got data during handshake???");
+ return NPT_ERROR_INTERNAL;
+ }
+ }
+ return NPT_Tls_MapResult(result);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsInputStream
++---------------------------------------------------------------------*/
+class NPT_TlsInputStream : public NPT_InputStream {
+public:
+ NPT_TlsInputStream(NPT_TlsSessionImplReference& session) :
+ m_Session(session),
+ m_Position(0),
+ m_RecordCacheData(NULL),
+ m_RecordCacheSize(0) {}
+
+ // NPT_InputStream methods
+ virtual NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL);
+ virtual NPT_Result Seek(NPT_Position) { return NPT_ERROR_NOT_SUPPORTED; }
+ virtual NPT_Result Tell(NPT_Position& offset) { offset = m_Position; return NPT_SUCCESS; }
+ virtual NPT_Result GetSize(NPT_LargeSize& size) { size=0; return NPT_ERROR_NOT_SUPPORTED; }
+ virtual NPT_Result GetAvailable(NPT_LargeSize& available);
+
+private:
+ NPT_TlsSessionImplReference m_Session;
+ NPT_Position m_Position;
+ uint8_t* m_RecordCacheData;
+ NPT_Size m_RecordCacheSize;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ // setup default values
+ if (bytes_read) *bytes_read = 0;
+
+ // quick check for edge case
+ if (bytes_to_read == 0) return NPT_SUCCESS;
+
+ // read a new record if we don't have one cached
+ if (m_RecordCacheData == NULL) {
+ int ssl_result;
+ do {
+ ssl_result = ssl_read(m_Session->m_SSL, &m_RecordCacheData);
+ } while (ssl_result == 0);
+ if (ssl_result < 0) {
+ return NPT_Tls_MapResult(ssl_result);
+ }
+ m_RecordCacheSize = ssl_result;
+ }
+
+ // we now have data in cache
+ if (bytes_to_read > m_RecordCacheSize) {
+ // read at most what's in the cache
+ bytes_to_read = m_RecordCacheSize;
+ }
+ NPT_CopyMemory(buffer, m_RecordCacheData, bytes_to_read);
+ if (bytes_read) *bytes_read = bytes_to_read;
+
+ // update the record cache
+ m_RecordCacheSize -= bytes_to_read;
+ if (m_RecordCacheSize == 0) {
+ // nothing left in the cache
+ m_RecordCacheData = NULL;
+ } else {
+ // move the cache pointer
+ m_RecordCacheData += bytes_to_read;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsInputStream::GetAvailable(NPT_LargeSize& /*available*/)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsOutputStream
++---------------------------------------------------------------------*/
+class NPT_TlsOutputStream : public NPT_OutputStream {
+public:
+ NPT_TlsOutputStream(NPT_TlsSessionImplReference& session) :
+ m_Session(session),
+ m_Position(0) {}
+
+ // NPT_OutputStream methods
+ virtual NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written = NULL);
+ virtual NPT_Result Seek(NPT_Position) { return NPT_ERROR_NOT_SUPPORTED; }
+ virtual NPT_Result Tell(NPT_Position& offset) { offset = m_Position; return NPT_SUCCESS; }
+
+private:
+ NPT_TlsSessionImplReference m_Session;
+ NPT_Position m_Position;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsOutputStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsOutputStream::Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written)
+{
+ // setup default values
+ if (bytes_written) *bytes_written = 0;
+
+ // quick check for edge case
+ if (bytes_to_write == 0) return NPT_SUCCESS;
+
+ // write some data
+ int ssl_result;
+ do {
+ ssl_result = ssl_write(m_Session->m_SSL, (const uint8_t*)buffer, bytes_to_write);
+ } while (ssl_result == 0);
+ if (ssl_result < 0) {
+ return NPT_Tls_MapResult(ssl_result);
+ }
+ m_Position += ssl_result;
+ if (bytes_written) *bytes_written = (NPT_Size)ssl_result;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Tls::GetDefaultTrustAnchors
++---------------------------------------------------------------------*/
+const NPT_TlsTrustAnchorData*
+NPT_Tls::GetDefaultTrustAnchors(NPT_Ordinal indx)
+{
+ if (indx == 0) {
+ return NptTlsDefaultTrustAnchorsBase;
+ } else if (indx == 2) {
+ return NptTlsDefaultTrustAnchorsExtended;
+ } else {
+ return NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsContext::NPT_TlsContext
++---------------------------------------------------------------------*/
+NPT_TlsContext::NPT_TlsContext(NPT_Flags options) :
+ m_Impl(new NPT_TlsContextImpl(options))
+{
+ if (options & OPTION_ADD_DEFAULT_TRUST_ANCHORS) {
+ const NPT_TlsTrustAnchorData* ta = NPT_Tls::GetDefaultTrustAnchors(0);
+ if (ta) {
+ AddTrustAnchors(ta);
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsContext::~NPT_TlsContext
++---------------------------------------------------------------------*/
+NPT_TlsContext::~NPT_TlsContext()
+{
+ delete m_Impl;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsContext::LoadKey
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsContext::LoadKey(NPT_TlsKeyFormat key_format,
+ const unsigned char* key_data,
+ NPT_Size key_data_size,
+ const char* password)
+{
+ return m_Impl->LoadKey(key_format, key_data, key_data_size, password);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsContext::SelfSignCertificate
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsContext::SelfSignCertificate(const char* common_name,
+ const char* organization,
+ const char* organizational_name)
+{
+ return m_Impl->SelfSignCertificate(common_name, organization, organizational_name);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsContext::AddTrustAnchor
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsContext::AddTrustAnchor(const unsigned char* ta_data,
+ NPT_Size ta_data_size)
+{
+ return m_Impl->AddTrustAnchor(ta_data, ta_data_size);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsContext::AddTrustAnchors
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsContext::AddTrustAnchors(const NPT_TlsTrustAnchorData* anchors,
+ NPT_Cardinal anchor_count)
+{
+ if (anchors == NULL) return NPT_SUCCESS;
+ for (unsigned int i=0;
+ anchor_count ?
+ (i<anchor_count) :
+ (anchors[i].cert_data && anchors[i].cert_size);
+ i++) {
+ // add the trust anchor and ignore the error
+ m_Impl->AddTrustAnchor(anchors[i].cert_data, anchors[i].cert_size);
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::NPT_TlsSession
++---------------------------------------------------------------------*/
+NPT_TlsSession::NPT_TlsSession(NPT_TlsContext& context,
+ NPT_TlsSessionImpl* impl) :
+ m_Context(context),
+ m_Impl(impl),
+ m_InputStream(new NPT_TlsInputStream(m_Impl)),
+ m_OutputStream(new NPT_TlsOutputStream(m_Impl))
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::~NPT_TlsSession
++---------------------------------------------------------------------*/
+NPT_TlsSession::~NPT_TlsSession()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::Handshake
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSession::Handshake()
+{
+ return m_Impl->Handshake();
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::GetHandshakeStatus
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSession::GetHandshakeStatus()
+{
+ return m_Impl->GetHandshakeStatus();
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::VerifyPeerCertificate
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSession::VerifyPeerCertificate()
+{
+ return m_Impl->VerifyPeerCertificate();
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::VerifyDnsNameMatch
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSession::VerifyDnsNameMatch(const char* hostname)
+{
+ return m_Impl->VerifyDnsNameMatch(hostname);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsClientSession::GetSessionId
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSession::GetSessionId(NPT_DataBuffer& session_id)
+{
+ return m_Impl->GetSessionId(session_id);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::GetCipherSuiteId
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_TlsSession::GetCipherSuiteId()
+{
+ return m_Impl->GetCipherSuiteId();
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::GetPeerCertificateInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSession::GetPeerCertificateInfo(NPT_TlsCertificateInfo& cert_info,
+ unsigned int position)
+{
+ return m_Impl->GetPeerCertificateInfo(cert_info, position);
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSession::GetInputStream(NPT_InputStreamReference& stream)
+{
+ stream = m_InputStream;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession::GetOutputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_TlsSession::GetOutputStream(NPT_OutputStreamReference& stream)
+{
+ stream = m_OutputStream;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsClientSession::NPT_TlsClientSession
++---------------------------------------------------------------------*/
+NPT_TlsClientSession::NPT_TlsClientSession(NPT_TlsContext& context,
+ NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output) :
+ NPT_TlsSession(context, new NPT_TlsClientSessionImpl(context.m_Impl->m_SSL_CTX, input, output))
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_TlsServerSession::NPT_TlsServerSession
++---------------------------------------------------------------------*/
+NPT_TlsServerSession::NPT_TlsServerSession(NPT_TlsContext& context,
+ NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output) :
+ NPT_TlsSession(context, new NPT_TlsServerSessionImpl(context.m_Impl->m_SSL_CTX, input, output))
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpTlsConnector::DefaultTlsContext
++---------------------------------------------------------------------*/
+NPT_TlsContext* NPT_HttpTlsConnector::DefaultTlsContext = NULL;
+
+/*----------------------------------------------------------------------
+| NPT_HttpTlsConnector::NPT_HttpTlsConnector
++---------------------------------------------------------------------*/
+NPT_HttpTlsConnector::NPT_HttpTlsConnector(NPT_Flags options) :
+ m_TlsContext(GetDefaultTlsContext()),
+ m_Options(options)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpTlsConnector::NPT_HttpTlsConnector
++---------------------------------------------------------------------*/
+NPT_HttpTlsConnector::NPT_HttpTlsConnector(NPT_TlsContext& tls_context, NPT_Flags options) :
+ m_TlsContext(tls_context),
+ m_Options(options)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpTlsConnector::GetDefaultTlsContext
++---------------------------------------------------------------------*/
+NPT_TlsContext&
+NPT_HttpTlsConnector::GetDefaultTlsContext()
+{
+ if (DefaultTlsContext == NULL) {
+ NPT_SingletonLock::GetInstance().Lock();
+ if (DefaultTlsContext == NULL) {
+ DefaultTlsContext = new NPT_TlsContext(NPT_TlsContext::OPTION_VERIFY_LATER |
+ NPT_TlsContext::OPTION_ADD_DEFAULT_TRUST_ANCHORS);
+
+ // Prepare for recycling
+ NPT_AutomaticCleaner::GetInstance()->RegisterTlsContext(DefaultTlsContext);
+ }
+ NPT_SingletonLock::GetInstance().Unlock();
+ }
+
+ return *DefaultTlsContext;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpTlsConnector::VerifyPeer
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpTlsConnector::VerifyPeer(NPT_TlsClientSession& session, const char* hostname)
+{
+ // verify the certificate
+ NPT_Result result = session.VerifyPeerCertificate();
+ if (NPT_FAILED(result)) {
+ if (result == NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED) {
+ if (!m_Options && OPTION_ACCEPT_SELF_SIGNED_CERTS) {
+ // self-signed certs are not acceptable
+ NPT_LOG_FINE("rejecting self-signed certificate");
+ return result;
+ }
+ } else {
+ NPT_LOG_WARNING_2("TLS certificate verification failed (%d:%s)", result, NPT_ResultText(result));
+ return result;
+ }
+ }
+
+ // chech the DNS name
+ if (!(m_Options & OPTION_ACCEPT_HOSTNAME_MISMATCH)) {
+ // check the hostname
+ result = session.VerifyDnsNameMatch(hostname);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_2("TLS certificate does not match DNS name (%d:%s)", result, NPT_ResultText(result));
+ return NPT_ERROR_TLS_DNS_NAME_MISMATCH;
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+#endif // defined(NPT_CONFIG_ENABLE_TLS)
+
+/*----------------------------------------------------------------------
+| NPT_HttpSimpleTlsConnection
++---------------------------------------------------------------------*/
+class NPT_HttpSimpleTlsConnection : public NPT_HttpClient::Connection
+{
+public:
+ NPT_InputStreamReference& GetInputStream() override {
+ return m_InputStream;
+ }
+ NPT_OutputStreamReference& GetOutputStream() override {
+ return m_OutputStream;
+ }
+
+ // members
+ NPT_InputStreamReference m_InputStream;
+ NPT_OutputStreamReference m_OutputStream;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpTlsConnector::Connect
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HttpTlsConnector::Connect(const NPT_HttpUrl& url,
+ NPT_HttpClient& client,
+ const NPT_HttpProxyAddress* proxy,
+ bool reuse,
+ NPT_HttpClient::Connection*& connection)
+{
+ // default values
+ connection = NULL;
+
+ // local reference holders
+ NPT_InputStreamReference input_stream;
+ NPT_OutputStreamReference output_stream;
+
+ // decide which server we need to connect to
+ const char* peer_hostname = (const char*)url.GetHost();
+ const char* server_hostname;
+ NPT_UInt16 server_port;
+ if (proxy) {
+ // the proxy is set
+ server_hostname = (const char*)proxy->GetHostName();
+ server_port = proxy->GetPort();
+ } else {
+ // no proxy: connect directly
+ server_hostname = peer_hostname;
+ server_port = url.GetPort();
+ }
+
+ // resolve the server address
+ NPT_IpAddress ip_address;
+ NPT_CHECK_FINE(ip_address.ResolveName(server_hostname, client.GetConfig().m_NameResolverTimeout));
+
+ // check if we can reuse a connection
+ // TODO: with this we don't yet support reusing a connection to a proxy
+ NPT_SocketAddress socket_address(ip_address, server_port);
+ NPT_HttpConnectionManager* connection_manager = NPT_HttpConnectionManager::GetInstance();
+ if (!proxy && reuse) {
+ NPT_LOG_FINE("looking for a connection to reuse");
+ connection = connection_manager->FindConnection(socket_address);
+ if (connection) {
+ NPT_LOG_FINE("reusing connection");
+ // track connection immediately so we can abort it later
+ NPT_CHECK_FINE(Connector::TrackConnection(client, connection));
+ return NPT_SUCCESS;
+ }
+ }
+
+ // create a socket
+ NPT_LOG_FINE_2("TLS connector will connect to %s:%d", server_hostname, server_port);
+ NPT_TcpClientSocket* tcp_socket = new NPT_TcpClientSocket(NPT_SOCKET_FLAG_CANCELLABLE);
+ NPT_SocketReference socket(tcp_socket);
+ tcp_socket->SetReadTimeout(client.GetConfig().m_IoTimeout);
+ tcp_socket->SetWriteTimeout(client.GetConfig().m_IoTimeout);
+
+ // create a connection object for the socket so we can abort it during connect
+ // even though streams are not valid yet
+ NPT_Reference<NPT_HttpConnectionManager::Connection> cref(new NPT_HttpConnectionManager::Connection(*connection_manager,
+ socket,
+ input_stream,
+ output_stream));
+ // track connection immediately before connecting so we can abort immediately it if necessary
+ NPT_CHECK_FINE(Connector::TrackConnection(client, cref.AsPointer()));
+
+ // connect to the server
+ NPT_CHECK_FINE(tcp_socket->Connect(socket_address, client.GetConfig().m_ConnectionTimeout));
+
+ // get the streams
+ NPT_InputStreamReference raw_input;
+ NPT_OutputStreamReference raw_output;
+ NPT_CHECK_FINE(tcp_socket->GetInputStream(raw_input));
+ NPT_CHECK_FINE(tcp_socket->GetOutputStream(raw_output));
+
+ if (url.GetSchemeId() == NPT_Url::SCHEME_ID_HTTPS) {
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ if (proxy) {
+ // RFC 2817 CONNECT
+ NPT_String connect_host = url.GetHost() + ":" + NPT_String::FromInteger(url.GetPort());
+ NPT_String connect = "CONNECT " + connect_host + " HTTP/1.1\r\n"
+ "Host: " + connect_host + "\r\n\r\n";
+ NPT_Result result = raw_output->WriteFully(connect.GetChars(), connect.GetLength());
+ if (NPT_FAILED(result)) return result;
+ NPT_String connect_response;
+ connect_response.Reserve(1024);
+ bool connect_ok = false;
+ for (unsigned int x=0; x<NPT_HTTP_TLS_CONNECTOR_MAX_PROXY_RESPONSE_SIZE; x++) {
+ connect_response.Reserve(x+1);
+ result = raw_input->Read(connect_response.UseChars()+x, 1);
+ if (NPT_FAILED(result)) return result;
+ if (connect_response.GetChars()[x] == '\n') {
+ connect_response.SetLength(x+1);
+ if (!connect_ok) {
+ // check the connection result
+ NPT_LOG_FINE_1("proxy response: %s", connect_response.GetChars());
+ if (connect_response.GetLength() < 12) {
+ return NPT_ERROR_HTTP_INVALID_RESPONSE_LINE;
+ }
+ if (!connect_response.StartsWith("HTTP/1.")) {
+ return NPT_ERROR_HTTP_INVALID_RESPONSE_LINE;
+ }
+ if (connect_response[8] != ' ') {
+ return NPT_ERROR_HTTP_INVALID_RESPONSE_LINE;
+ }
+ NPT_String status_code = connect_response.SubString(9, 3);
+ if (status_code != "200") {
+ NPT_LOG_WARNING_1("proxy response is not 200 (%s)", status_code.GetChars());
+ return NPT_ERROR_HTTP_INVALID_RESPONSE_LINE;
+ }
+ connect_ok = true;
+ } else {
+ if (connect_response.EndsWith("\r\n\r\n")) {
+ // this is the end, my friend
+ break;
+ }
+ }
+ }
+ }
+ if (!connect_ok) {
+ return NPT_ERROR_HTTP_INVALID_RESPONSE_LINE;
+ }
+ }
+
+ // setup the TLS connection
+ NPT_TlsClientSession tls_session(m_TlsContext, raw_input, raw_output);
+ NPT_Result result = tls_session.Handshake();
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_2("TLS handshake failed (%d:%s)", result, NPT_ResultText(result));
+ return result;
+ }
+ result = VerifyPeer(tls_session, peer_hostname);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_2("VerifyPeer failed (%d:%s)", result, NPT_ResultText(result));
+ return result;
+ }
+
+ // return the TLS streams
+ tls_session.GetInputStream(input_stream);
+ tls_session.GetOutputStream(output_stream);
+#else
+ return NPT_ERROR_NOT_SUPPORTED;
+#endif
+ } else {
+ input_stream = raw_input;
+ output_stream = raw_output;
+ }
+
+ // update connection streams
+ cref->m_InputStream = input_stream;
+ cref->m_OutputStream = output_stream;
+
+ connection = cref.AsPointer();
+ cref.Detach(); // release the internal ref
+
+ return NPT_SUCCESS;
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptTls.h b/lib/libUPnP/Neptune/Source/Core/NptTls.h
new file mode 100644
index 0000000..d5459d6
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptTls.h
@@ -0,0 +1,304 @@
+/*****************************************************************
+|
+| Neptune - TLS/SSL Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_TLS_H_
+#define _NPT_TLS_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptStreams.h"
+#include "NptTime.h"
+#include "NptHttp.h"
+
+/*----------------------------------------------------------------------
+| error codes
++---------------------------------------------------------------------*/
+const NPT_Result NPT_ERROR_INVALID_PASSWORD = (NPT_ERROR_BASE_TLS-1);
+const NPT_Result NPT_ERROR_TLS_INVALID_HANDSHAKE = (NPT_ERROR_BASE_TLS-2);
+const NPT_Result NPT_ERROR_TLS_INVALID_PROTOCOL_MESSAGE = (NPT_ERROR_BASE_TLS-3);
+const NPT_Result NPT_ERROR_TLS_INVALID_HMAC = (NPT_ERROR_BASE_TLS-4);
+const NPT_Result NPT_ERROR_TLS_INVALID_VERSION = (NPT_ERROR_BASE_TLS-5);
+const NPT_Result NPT_ERROR_TLS_INVALID_SESSION = (NPT_ERROR_BASE_TLS-6);
+const NPT_Result NPT_ERROR_TLS_NO_CIPHER = (NPT_ERROR_BASE_TLS-7);
+const NPT_Result NPT_ERROR_TLS_BAD_CERTIFICATE = (NPT_ERROR_BASE_TLS-8);
+const NPT_Result NPT_ERROR_TLS_INVALID_KEY = (NPT_ERROR_BASE_TLS-9);
+const NPT_Result NPT_ERROR_TLS_NO_CLIENT_RENEGOTIATION = (NPT_ERROR_BASE_TLS-10);
+const NPT_Result NPT_ERROR_TLS_INVALID_FINISHED_MESSAGE = (NPT_ERROR_BASE_TLS-11);
+const NPT_Result NPT_ERROR_TLS_NO_CERTIFICATE_DEFINED = (NPT_ERROR_BASE_TLS-12);
+const NPT_Result NPT_ERROR_TLS_ALERT_HANDSHAKE_FAILED = (NPT_ERROR_BASE_TLS-13);
+const NPT_Result NPT_ERROR_TLS_ALERT_BAD_CERTIFICATE = (NPT_ERROR_BASE_TLS-14);
+const NPT_Result NPT_ERROR_TLS_ALERT_INVALID_VERSION = (NPT_ERROR_BASE_TLS-15);
+const NPT_Result NPT_ERROR_TLS_ALERT_BAD_RECORD_MAC = (NPT_ERROR_BASE_TLS-16);
+const NPT_Result NPT_ERROR_TLS_ALERT_DECODE_ERROR = (NPT_ERROR_BASE_TLS-17);
+const NPT_Result NPT_ERROR_TLS_ALERT_DECRYPT_ERROR = (NPT_ERROR_BASE_TLS-18);
+const NPT_Result NPT_ERROR_TLS_ALERT_ILLEGAL_PARAMETER = (NPT_ERROR_BASE_TLS-19);
+const NPT_Result NPT_ERROR_TLS_ALERT_UNEXPECTED_MESSAGE = (NPT_ERROR_BASE_TLS-20);
+const NPT_Result NPT_ERROR_TLS_CERTIFICATE_FAILURE = (NPT_ERROR_BASE_TLS-21);
+const NPT_Result NPT_ERROR_TLS_CERTIFICATE_NO_TRUST_ANCHOR = (NPT_ERROR_BASE_TLS-22);
+const NPT_Result NPT_ERROR_TLS_CERTIFICATE_BAD_SIGNATURE = (NPT_ERROR_BASE_TLS-23);
+const NPT_Result NPT_ERROR_TLS_CERTIFICATE_NOT_YET_VALID = (NPT_ERROR_BASE_TLS-24);
+const NPT_Result NPT_ERROR_TLS_CERTIFICATE_EXPIRED = (NPT_ERROR_BASE_TLS-25);
+const NPT_Result NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED = (NPT_ERROR_BASE_TLS-26);
+const NPT_Result NPT_ERROR_TLS_CERTIFICATE_INVALID_CHAIN = (NPT_ERROR_BASE_TLS-27);
+const NPT_Result NPT_ERROR_TLS_CERTIFICATE_UNSUPPORTED_DIGEST = (NPT_ERROR_BASE_TLS-28);
+const NPT_Result NPT_ERROR_TLS_CERTIFICATE_INVALID_PRIVATE_KEY = (NPT_ERROR_BASE_TLS-29);
+const NPT_Result NPT_ERROR_TLS_DNS_NAME_MISMATCH = (NPT_ERROR_BASE_TLS-30);
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const unsigned int NPT_TLS_NULL_WITH_NULL_NULL = 0x00;
+const unsigned int NPT_TLS_RSA_WITH_RC4_128_MD5 = 0x04;
+const unsigned int NPT_TLS_RSA_WITH_RC4_128_SHA = 0x05;
+const unsigned int NPT_TLS_RSA_WITH_AES_128_CBC_SHA = 0x2F;
+const unsigned int NPT_TLS_RSA_WITH_AES_256_CBC_SHA = 0x35;
+
+/*----------------------------------------------------------------------
+| class references
++---------------------------------------------------------------------*/
+class NPT_TlsContextImpl;
+class NPT_TlsSessionImpl;
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef enum {
+ NPT_TLS_KEY_FORMAT_RSA_PRIVATE,
+ NPT_TLS_KEY_FORMAT_PKCS8,
+ NPT_TLS_KEY_FORMAT_PKCS12
+} NPT_TlsKeyFormat;
+
+struct NPT_TlsTrustAnchorData {
+ const unsigned char* cert_data;
+ unsigned int cert_size;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Tls
++---------------------------------------------------------------------*/
+class NPT_Tls
+{
+public:
+ static const NPT_TlsTrustAnchorData* GetDefaultTrustAnchors(NPT_Ordinal indx=0);
+ static bool MatchDnsNames(const char* hostname,
+ const NPT_List<NPT_String>& dns_names);
+ static bool MatchDnsName(const char* hostname, const char* dns_name);
+
+private:
+ NPT_Tls() {}; // don't instantiate
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsContext
++---------------------------------------------------------------------*/
+class NPT_TlsContext : public NPT_AutomaticCleaner::Singleton
+{
+public:
+ enum {
+ OPTION_VERIFY_LATER = 1,
+ OPTION_REQUIRE_CLIENT_CERTIFICATE = 2,
+ OPTION_ADD_DEFAULT_TRUST_ANCHORS = 4,
+ OPTION_NO_SESSION_CACHE = 8
+ };
+ NPT_TlsContext(NPT_Flags options=0);
+ ~NPT_TlsContext() override;
+
+ // methods
+ NPT_Result LoadKey(NPT_TlsKeyFormat key_format,
+ const unsigned char* key_data,
+ NPT_Size key_data_size,
+ const char* password);
+
+ NPT_Result SelfSignCertificate(const char* common_name,
+ const char* organization,
+ const char* organizational_name);
+
+ /**
+ * Add one trust anchor
+ */
+ NPT_Result AddTrustAnchor(const unsigned char* ta_data,
+ NPT_Size ta_data_size);
+ /**
+ * Add one or more trust anchors, from a list
+ * @param anchors Array of trust anchor data
+ * @param anchor_count Number of anchors in the array, or 0 if the array
+ * is terminated by a 'sentinel' (an anchor data with the field cert_data set
+ * to NULL and the field cert_size set to 0).
+ */
+ NPT_Result AddTrustAnchors(const NPT_TlsTrustAnchorData* anchors,
+ NPT_Cardinal anchor_count = 0);
+
+protected:
+ NPT_TlsContextImpl* m_Impl;
+
+ // friends
+ friend class NPT_TlsSession;
+ friend class NPT_TlsClientSession;
+ friend class NPT_TlsServerSession;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsCertificateInfo
++---------------------------------------------------------------------*/
+struct NPT_TlsCertificateInfo
+{
+ struct _subject {
+ NPT_String common_name;
+ NPT_String organization;
+ NPT_String organizational_name;
+ } subject;
+ struct _issuer {
+ NPT_String common_name;
+ NPT_String organization;
+ NPT_String organizational_name;
+ } issuer;
+ struct _fingerprint {
+ unsigned char sha1[20];
+ unsigned char md5[16];
+ } fingerprint;
+ NPT_DateTime issue_date;
+ NPT_DateTime expiration_date;
+ NPT_List<NPT_String> alternate_names;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsSession
++---------------------------------------------------------------------*/
+class NPT_TlsSession
+{
+public:
+ virtual ~NPT_TlsSession();
+ virtual NPT_Result Handshake();
+ virtual NPT_Result GetHandshakeStatus();
+ virtual NPT_Result GetPeerCertificateInfo(NPT_TlsCertificateInfo& info, NPT_Ordinal position=0);
+ virtual NPT_Result VerifyPeerCertificate();
+ virtual NPT_Result VerifyDnsNameMatch(const char* hostname);
+ virtual NPT_Result GetSessionId(NPT_DataBuffer& session_id);
+ virtual NPT_UInt32 GetCipherSuiteId();
+ virtual NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ virtual NPT_Result GetOutputStream(NPT_OutputStreamReference& stream);
+
+protected:
+ NPT_TlsSession(NPT_TlsContext& context,
+ NPT_TlsSessionImpl* impl);
+
+ NPT_TlsContext& m_Context;
+ NPT_Reference<NPT_TlsSessionImpl> m_Impl;
+ NPT_InputStreamReference m_InputStream;
+ NPT_OutputStreamReference m_OutputStream;
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsClientSession
++---------------------------------------------------------------------*/
+class NPT_TlsClientSession : public NPT_TlsSession
+{
+public:
+ NPT_TlsClientSession(NPT_TlsContext& context,
+ NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output);
+};
+
+/*----------------------------------------------------------------------
+| NPT_TlsServerSession
++---------------------------------------------------------------------*/
+class NPT_TlsServerSession : public NPT_TlsSession
+{
+public:
+ NPT_TlsServerSession(NPT_TlsContext& context,
+ NPT_InputStreamReference& input,
+ NPT_OutputStreamReference& output);
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpTlsConnector
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_ENABLE_TLS)
+class NPT_HttpTlsConnector : public NPT_HttpClient::Connector
+{
+public:
+ enum {
+ OPTION_ACCEPT_SELF_SIGNED_CERTS = 1,
+ OPTION_ACCEPT_HOSTNAME_MISMATCH = 2
+ };
+ NPT_HttpTlsConnector(NPT_Flags options = 0);
+ NPT_HttpTlsConnector(NPT_TlsContext& tls_context, NPT_Flags options = 0);
+ virtual ~NPT_HttpTlsConnector() {}
+ NPT_TlsContext& GetTlsContext() { return m_TlsContext; }
+ virtual NPT_Result Connect(const NPT_HttpUrl& url,
+ NPT_HttpClient& client,
+ const NPT_HttpProxyAddress* proxy,
+ bool reuse,
+ NPT_HttpClient::Connection*& connection);
+
+ virtual NPT_Result VerifyPeer(NPT_TlsClientSession& session,
+ const char* hostname);
+
+private:
+ // class methods
+ static NPT_TlsContext& GetDefaultTlsContext();
+
+ // class members
+ static NPT_TlsContext* DefaultTlsContext;
+
+ // members
+ NPT_TlsContext& m_TlsContext;
+ NPT_Flags m_Options;
+};
+#else
+class NPT_HttpTlsConnector : public NPT_HttpClient::Connector
+{
+public:
+ ~NPT_HttpTlsConnector() override {}
+ NPT_Result Connect(const NPT_HttpUrl& url,
+ NPT_HttpClient& client,
+ const NPT_HttpProxyAddress* proxy,
+ bool reuse,
+ NPT_HttpClient::Connection*& connection) override;
+};
+#endif
+
+/*----------------------------------------------------------------------
+| Trust Anchors
++-----------------------------------------------------------------*/
+/**
+ * Arrays of trust anchors (each array element is of type NPT_TlsTrustAnchorData
+ * and the last element is a terminator element: the cert_data field is NULL
+ * and the cert_size field is 0
+ */
+#if defined(NPT_CONFIG_ENABLE_TLS)
+#include "NptTlsDefaultTrustAnchorsBase.h"
+#include "NptTlsDefaultTrustAnchorsExtended.h"
+#endif
+
+#endif // _NPT_TLS_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptTlsDefaultTrustAnchorsBase.h b/lib/libUPnP/Neptune/Source/Core/NptTlsDefaultTrustAnchorsBase.h
new file mode 100644
index 0000000..170cdb2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptTlsDefaultTrustAnchorsBase.h
@@ -0,0 +1,583 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* This file is automatically generated by GenTrustAnchorsTables.py, do not edit */
+
+#include "NptTls.h"
+
+extern const NPT_TlsTrustAnchorData NptTlsDefaultTrustAnchorsBase[137];
+
+/* Verisign/RSA Secure Server CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0000_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0000_Data[];
+
+/* GTE CyberTrust Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0001_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0001_Data[];
+
+/* GTE CyberTrust Global Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0002_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0002_Data[];
+
+/* Thawte Personal Basic CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0003_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0003_Data[];
+
+/* Thawte Personal Premium CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0004_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0004_Data[];
+
+/* Thawte Personal Freemail CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0005_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0005_Data[];
+
+/* Thawte Server CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0006_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0006_Data[];
+
+/* Thawte Premium Server CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0007_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0007_Data[];
+
+/* Equifax Secure CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0008_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0008_Data[];
+
+/* Digital Signature Trust Co. Global CA 1 */
+extern const unsigned int NptTlsTrustAnchor_Base_0009_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0009_Data[];
+
+/* Digital Signature Trust Co. Global CA 3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0010_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0010_Data[];
+
+/* Digital Signature Trust Co. Global CA 2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0011_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0011_Data[];
+
+/* Digital Signature Trust Co. Global CA 4 */
+extern const unsigned int NptTlsTrustAnchor_Base_0012_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0012_Data[];
+
+/* Verisign Class 1 Public Primary Certification Authority */
+extern const unsigned int NptTlsTrustAnchor_Base_0013_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0013_Data[];
+
+/* Verisign Class 2 Public Primary Certification Authority */
+extern const unsigned int NptTlsTrustAnchor_Base_0014_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0014_Data[];
+
+/* Verisign Class 3 Public Primary Certification Authority */
+extern const unsigned int NptTlsTrustAnchor_Base_0015_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0015_Data[];
+
+/* Verisign Class 1 Public Primary Certification Authority - G2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0016_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0016_Data[];
+
+/* Verisign Class 2 Public Primary Certification Authority - G2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0017_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0017_Data[];
+
+/* Verisign Class 3 Public Primary Certification Authority - G2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0018_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0018_Data[];
+
+/* Verisign Class 4 Public Primary Certification Authority - G2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0019_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0019_Data[];
+
+/* GlobalSign Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0020_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0020_Data[];
+
+/* GlobalSign Root CA - R2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0021_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0021_Data[];
+
+/* ValiCert Class 1 VA */
+extern const unsigned int NptTlsTrustAnchor_Base_0022_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0022_Data[];
+
+/* ValiCert Class 2 VA */
+extern const unsigned int NptTlsTrustAnchor_Base_0023_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0023_Data[];
+
+/* RSA Root Certificate 1 */
+extern const unsigned int NptTlsTrustAnchor_Base_0024_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0024_Data[];
+
+/* Verisign Class 1 Public Primary Certification Authority - G3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0025_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0025_Data[];
+
+/* Verisign Class 2 Public Primary Certification Authority - G3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0026_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0026_Data[];
+
+/* Verisign Class 3 Public Primary Certification Authority - G3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0027_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0027_Data[];
+
+/* Verisign Class 4 Public Primary Certification Authority - G3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0028_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0028_Data[];
+
+/* Entrust.net Secure Server CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0029_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0029_Data[];
+
+/* Entrust.net Secure Personal CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0030_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0030_Data[];
+
+/* Entrust.net Premium 2048 Secure Server CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0031_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0031_Data[];
+
+/* Baltimore CyberTrust Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0032_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0032_Data[];
+
+/* Equifax Secure Global eBusiness CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0033_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0033_Data[];
+
+/* Equifax Secure eBusiness CA 1 */
+extern const unsigned int NptTlsTrustAnchor_Base_0034_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0034_Data[];
+
+/* Equifax Secure eBusiness CA 2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0035_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0035_Data[];
+
+/* Visa International Global Root 2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0036_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0036_Data[];
+
+/* AddTrust Low-Value Services Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0037_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0037_Data[];
+
+/* AddTrust External Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0038_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0038_Data[];
+
+/* AddTrust Public Services Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0039_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0039_Data[];
+
+/* AddTrust Qualified Certificates Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0040_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0040_Data[];
+
+/* Verisign Time Stamping Authority CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0041_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0041_Data[];
+
+/* Thawte Time Stamping CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0042_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0042_Data[];
+
+/* Entrust.net Global Secure Server CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0043_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0043_Data[];
+
+/* Entrust.net Global Secure Personal CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0044_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0044_Data[];
+
+/* Entrust Root Certification Authority */
+extern const unsigned int NptTlsTrustAnchor_Base_0045_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0045_Data[];
+
+/* AOL Time Warner Root Certification Authority 1 */
+extern const unsigned int NptTlsTrustAnchor_Base_0046_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0046_Data[];
+
+/* AOL Time Warner Root Certification Authority 2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0047_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0047_Data[];
+
+/* beTRUSTed Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0048_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0048_Data[];
+
+/* beTRUSTed Root CA-Baltimore Implementation */
+extern const unsigned int NptTlsTrustAnchor_Base_0049_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0049_Data[];
+
+/* beTRUSTed Root CA - Entrust Implementation */
+extern const unsigned int NptTlsTrustAnchor_Base_0050_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0050_Data[];
+
+/* beTRUSTed Root CA - RSA Implementation */
+extern const unsigned int NptTlsTrustAnchor_Base_0051_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0051_Data[];
+
+/* RSA Security 2048 v3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0052_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0052_Data[];
+
+/* RSA Security 1024 v3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0053_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0053_Data[];
+
+/* GeoTrust Global CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0054_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0054_Data[];
+
+/* GeoTrust Global CA 2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0055_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0055_Data[];
+
+/* GeoTrust Universal CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0056_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0056_Data[];
+
+/* GeoTrust Universal CA 2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0057_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0057_Data[];
+
+/* UTN-USER First-Network Applications */
+extern const unsigned int NptTlsTrustAnchor_Base_0058_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0058_Data[];
+
+/* America Online Root Certification Authority 1 */
+extern const unsigned int NptTlsTrustAnchor_Base_0059_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0059_Data[];
+
+/* America Online Root Certification Authority 2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0060_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0060_Data[];
+
+/* Visa eCommerce Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0061_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0061_Data[];
+
+/* TC TrustCenter, Germany, Class 2 CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0062_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0062_Data[];
+
+/* TC TrustCenter, Germany, Class 3 CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0063_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0063_Data[];
+
+/* Certum Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0064_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0064_Data[];
+
+/* Comodo AAA Services root */
+extern const unsigned int NptTlsTrustAnchor_Base_0065_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0065_Data[];
+
+/* Comodo Secure Services root */
+extern const unsigned int NptTlsTrustAnchor_Base_0066_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0066_Data[];
+
+/* Comodo Trusted Services root */
+extern const unsigned int NptTlsTrustAnchor_Base_0067_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0067_Data[];
+
+/* IPS Chained CAs root */
+extern const unsigned int NptTlsTrustAnchor_Base_0068_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0068_Data[];
+
+/* IPS CLASE1 root */
+extern const unsigned int NptTlsTrustAnchor_Base_0069_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0069_Data[];
+
+/* IPS CLASE3 root */
+extern const unsigned int NptTlsTrustAnchor_Base_0070_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0070_Data[];
+
+/* IPS CLASEA1 root */
+extern const unsigned int NptTlsTrustAnchor_Base_0071_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0071_Data[];
+
+/* IPS CLASEA3 root */
+extern const unsigned int NptTlsTrustAnchor_Base_0072_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0072_Data[];
+
+/* IPS Servidores root */
+extern const unsigned int NptTlsTrustAnchor_Base_0073_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0073_Data[];
+
+/* IPS Timestamping root */
+extern const unsigned int NptTlsTrustAnchor_Base_0074_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0074_Data[];
+
+/* QuoVadis Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0075_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0075_Data[];
+
+/* QuoVadis Root CA 2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0076_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0076_Data[];
+
+/* QuoVadis Root CA 3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0077_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0077_Data[];
+
+/* Security Communication Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0078_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0078_Data[];
+
+/* Sonera Class 1 Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0079_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0079_Data[];
+
+/* Sonera Class 2 Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0080_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0080_Data[];
+
+/* Staat der Nederlanden Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0081_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0081_Data[];
+
+/* TDC Internet Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0082_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0082_Data[];
+
+/* TDC OCES Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0083_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0083_Data[];
+
+/* UTN DATACorp SGC Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0084_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0084_Data[];
+
+/* UTN USERFirst Email Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0085_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0085_Data[];
+
+/* UTN USERFirst Hardware Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0086_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0086_Data[];
+
+/* UTN USERFirst Object Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0087_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0087_Data[];
+
+/* Camerfirma Chambers of Commerce Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0088_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0088_Data[];
+
+/* Camerfirma Global Chambersign Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0089_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0089_Data[];
+
+/* NetLock Qualified (Class QA) Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0090_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0090_Data[];
+
+/* NetLock Notary (Class A) Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0091_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0091_Data[];
+
+/* NetLock Business (Class B) Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0092_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0092_Data[];
+
+/* NetLock Express (Class C) Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0093_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0093_Data[];
+
+/* XRamp Global CA Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0094_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0094_Data[];
+
+/* Go Daddy Class 2 CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0095_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0095_Data[];
+
+/* Starfield Class 2 CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0096_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0096_Data[];
+
+/* StartCom Ltd. */
+extern const unsigned int NptTlsTrustAnchor_Base_0097_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0097_Data[];
+
+/* StartCom Certification Authority */
+extern const unsigned int NptTlsTrustAnchor_Base_0098_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0098_Data[];
+
+/* Firmaprofesional Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0099_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0099_Data[];
+
+/* Wells Fargo Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0100_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0100_Data[];
+
+/* Swisscom Root CA 1 */
+extern const unsigned int NptTlsTrustAnchor_Base_0101_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0101_Data[];
+
+/* DigiCert Assured ID Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0102_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0102_Data[];
+
+/* DigiCert Global Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0103_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0103_Data[];
+
+/* DigiCert High Assurance EV Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0104_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0104_Data[];
+
+/* Certplus Class 2 Primary CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0105_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0105_Data[];
+
+/* DST Root CA X3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0106_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0106_Data[];
+
+/* DST ACES CA X6 */
+extern const unsigned int NptTlsTrustAnchor_Base_0107_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0107_Data[];
+
+/* SwissSign Platinum CA - G2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0108_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0108_Data[];
+
+/* SwissSign Gold CA - G2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0109_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0109_Data[];
+
+/* SwissSign Silver CA - G2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0110_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0110_Data[];
+
+/* GeoTrust Primary Certification Authority */
+extern const unsigned int NptTlsTrustAnchor_Base_0111_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0111_Data[];
+
+/* thawte Primary Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0112_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0112_Data[];
+
+/* VeriSign Class 3 Public Primary Certification Authority - G5 */
+extern const unsigned int NptTlsTrustAnchor_Base_0113_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0113_Data[];
+
+/* SecureTrust CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0114_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0114_Data[];
+
+/* Secure Global CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0115_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0115_Data[];
+
+/* COMODO Certification Authority */
+extern const unsigned int NptTlsTrustAnchor_Base_0116_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0116_Data[];
+
+/* DigiNotar Root CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0117_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0117_Data[];
+
+/* Network Solutions Certificate Authority */
+extern const unsigned int NptTlsTrustAnchor_Base_0118_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0118_Data[];
+
+/* WellsSecure Public Root Certificate Authority */
+extern const unsigned int NptTlsTrustAnchor_Base_0119_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0119_Data[];
+
+/* IGC/A */
+extern const unsigned int NptTlsTrustAnchor_Base_0120_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0120_Data[];
+
+/* Security Communication EV RootCA1 */
+extern const unsigned int NptTlsTrustAnchor_Base_0121_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0121_Data[];
+
+/* TC TrustCenter Class 2 CA II */
+extern const unsigned int NptTlsTrustAnchor_Base_0122_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0122_Data[];
+
+/* TC TrustCenter Class 3 CA II */
+extern const unsigned int NptTlsTrustAnchor_Base_0123_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0123_Data[];
+
+/* TC TrustCenter Universal CA I */
+extern const unsigned int NptTlsTrustAnchor_Base_0124_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0124_Data[];
+
+/* Deutsche Telekom Root CA 2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0125_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0125_Data[];
+
+/* ComSign CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0126_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0126_Data[];
+
+/* ComSign Secured CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0127_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0127_Data[];
+
+/* Cybertrust Global Root */
+extern const unsigned int NptTlsTrustAnchor_Base_0128_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0128_Data[];
+
+/* Buypass Class 2 CA 1 */
+extern const unsigned int NptTlsTrustAnchor_Base_0129_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0129_Data[];
+
+/* Buypass Class 3 CA 1 */
+extern const unsigned int NptTlsTrustAnchor_Base_0130_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0130_Data[];
+
+/* certSIGN ROOT CA */
+extern const unsigned int NptTlsTrustAnchor_Base_0131_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0131_Data[];
+
+/* ApplicationCA - Japanese Government */
+extern const unsigned int NptTlsTrustAnchor_Base_0132_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0132_Data[];
+
+/* GeoTrust Primary Certification Authority - G3 */
+extern const unsigned int NptTlsTrustAnchor_Base_0133_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0133_Data[];
+
+/* thawte Primary Root CA - G2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0134_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0134_Data[];
+
+/* GeoTrust Primary Certification Authority - G2 */
+extern const unsigned int NptTlsTrustAnchor_Base_0135_Size;
+extern const unsigned char NptTlsTrustAnchor_Base_0135_Data[];
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptTlsDefaultTrustAnchorsExtended.h b/lib/libUPnP/Neptune/Source/Core/NptTlsDefaultTrustAnchorsExtended.h
new file mode 100644
index 0000000..005a6f0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptTlsDefaultTrustAnchorsExtended.h
@@ -0,0 +1,91 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* This file is automatically generated by GenTrustAnchorsTables.py, do not edit */
+
+#include "NptTls.h"
+
+extern const NPT_TlsTrustAnchorData NptTlsDefaultTrustAnchorsExtended[14];
+
+/* ABAecom (sub., Am. Bankers Assn.) Root CA */
+extern const unsigned int NptTlsTrustAnchor_Extended_0000_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0000_Data[];
+
+/* Taiwan GRCA */
+extern const unsigned int NptTlsTrustAnchor_Extended_0001_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0001_Data[];
+
+/* TURKTRUST Certificate Services Provider Root 1 */
+extern const unsigned int NptTlsTrustAnchor_Extended_0002_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0002_Data[];
+
+/* TURKTRUST Certificate Services Provider Root 2 */
+extern const unsigned int NptTlsTrustAnchor_Extended_0003_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0003_Data[];
+
+/* OISTE WISeKey Global Root GA CA */
+extern const unsigned int NptTlsTrustAnchor_Extended_0004_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0004_Data[];
+
+/* S-TRUST Authentication and Encryption Root CA 2005 PN */
+extern const unsigned int NptTlsTrustAnchor_Extended_0005_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0005_Data[];
+
+/* Microsec e-Szigno Root CA */
+extern const unsigned int NptTlsTrustAnchor_Extended_0006_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0006_Data[];
+
+/* Certigna */
+extern const unsigned int NptTlsTrustAnchor_Extended_0007_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0007_Data[];
+
+/* AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. */
+extern const unsigned int NptTlsTrustAnchor_Extended_0008_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0008_Data[];
+
+/* ePKI Root Certification Authority */
+extern const unsigned int NptTlsTrustAnchor_Extended_0009_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0009_Data[];
+
+/* TUBITAK UEKAE Kok Sertifika Hizmet Saglayicisi - Surum 3 */
+extern const unsigned int NptTlsTrustAnchor_Extended_0010_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0010_Data[];
+
+/* CNNIC ROOT */
+extern const unsigned int NptTlsTrustAnchor_Extended_0011_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0011_Data[];
+
+/* EBG Elektronik Sertifika Hizmet Saglayicisi */
+extern const unsigned int NptTlsTrustAnchor_Extended_0012_Size;
+extern const unsigned char NptTlsTrustAnchor_Extended_0012_Data[];
+
diff --git a/lib/libUPnP/Neptune/Source/Core/NptTypes.h b/lib/libUPnP/Neptune/Source/Core/NptTypes.h
new file mode 100644
index 0000000..4c82174
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptTypes.h
@@ -0,0 +1,149 @@
+/*****************************************************************
+|
+| Neptune - Types
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_TYPES_H_
+#define _NPT_TYPES_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+
+/*----------------------------------------------------------------------
+| sized types (this assumes that ints are 32 bits)
++---------------------------------------------------------------------*/
+typedef NPT_CONFIG_INT64_TYPE NPT_Int64;
+typedef unsigned NPT_CONFIG_INT64_TYPE NPT_UInt64;
+typedef unsigned int NPT_UInt32;
+typedef int NPT_Int32;
+typedef unsigned short NPT_UInt16;
+typedef short NPT_Int16;
+typedef unsigned char NPT_UInt8;
+typedef char NPT_Int8;
+typedef float NPT_Float;
+
+/*----------------------------------------------------------------------
+| named types
++---------------------------------------------------------------------*/
+typedef int NPT_Result;
+typedef unsigned int NPT_Cardinal;
+typedef unsigned int NPT_Ordinal;
+typedef NPT_UInt32 NPT_Size;
+typedef NPT_UInt64 NPT_LargeSize;
+typedef NPT_Int32 NPT_Offset;
+typedef NPT_UInt64 NPT_Position;
+typedef NPT_Int32 NPT_Timeout;
+typedef void NPT_Interface;
+typedef NPT_UInt8 NPT_Byte;
+typedef NPT_UInt32 NPT_Flags;
+typedef void* NPT_Any;
+typedef const void* NPT_AnyConst;
+
+/*----------------------------------------------------------------------
+| limits
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_HAVE_LIMITS_H)
+#include <limits.h>
+#endif
+
+#if !defined(NPT_INT_MIN)
+#if defined(NPT_CONFIG_HAVE_INT_MIN)
+#define NPT_INT_MIN INT_MIN
+#endif
+#endif
+
+#if !defined(NPT_INT_MAX)
+#if defined(NPT_CONFIG_HAVE_INT_MAX)
+#define NPT_INT_MAX INT_MAX
+#endif
+#endif
+
+#if !defined(NPT_UINT_MAX)
+#if defined(NPT_CONFIG_HAVE_UINT_MAX)
+#define NPT_UINT_MAX UINT_MAX
+#endif
+#endif
+
+#if !defined(NPT_LONG_MIN)
+#if defined(NPT_CONFIG_HAVE_LONG_MIN)
+#define NPT_LONG_MIN LONG_MIN
+#endif
+#endif
+
+#if !defined(NPT_LONG_MAX)
+#if defined(NPT_CONFIG_HAVE_LONG_MAX)
+#define NPT_LONG_MAX LONG_MAX
+#endif
+#endif
+
+#if !defined(NPT_ULONG_MAX)
+#if defined(NPT_CONFIG_HAVE_ULONG_MAX)
+#define NPT_ULONG_MAX ULONG_MAX
+#endif
+#endif
+
+#if !defined(NPT_INT32_MAX)
+#define NPT_INT32_MAX 0x7FFFFFFF
+#endif
+
+#if !defined(NPT_INT32_MIN)
+#define NPT_INT32_MIN (-NPT_INT32_MAX - 1)
+#endif
+
+#if !defined(NPT_UINT32_MAX)
+#define NPT_UINT32_MAX 0xFFFFFFFF
+#endif
+
+#if !defined(NPT_INT64_MAX)
+#if defined(NPT_CONFIG_HAVE_LLONG_MAX)
+#define NPT_INT64_MAX LLONG_MAX
+#else
+#define NPT_INT64_MAX 0x7FFFFFFFFFFFFFFFLL
+#endif
+#endif
+
+#if !defined(NPT_INT64_MIN)
+#if defined(NPT_CONFIG_HAVE_LLONG_MIN)
+#define NPT_INT64_MIN LLONG_MIN
+#else
+#define NPT_INT64_MIN (-NPT_INT64_MAX - 1LL)
+#endif
+#endif
+
+#if !defined(NPT_UINT64_MAX)
+#if defined(NPT_CONFIG_HAVE_ULLONG_MAX)
+#define NPT_UINT64_MAX ULLONG_MAX
+#else
+#define NPT_UINT64_MAX 0xFFFFFFFFFFFFFFFFULL
+#endif
+#endif
+
+#endif // _NPT_TYPES_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptUri.cpp b/lib/libUPnP/Neptune/Source/Core/NptUri.cpp
new file mode 100644
index 0000000..e4a7c3b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptUri.cpp
@@ -0,0 +1,912 @@
+/*****************************************************************
+|
+| Neptune - URI
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ***************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptUri.h"
+#include "NptUtils.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| NPT_Uri::ParseScheme
++---------------------------------------------------------------------*/
+NPT_Uri::SchemeId
+NPT_Uri::ParseScheme(const NPT_String& scheme)
+{
+ if (scheme == "http") {
+ return SCHEME_ID_HTTP;
+ } else if (scheme == "https") {
+ return SCHEME_ID_HTTPS;
+ } else {
+ return SCHEME_ID_UNKNOWN;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Uri::SetScheme
++---------------------------------------------------------------------*/
+void
+NPT_Uri::SetScheme(const char* scheme)
+{
+ m_Scheme = scheme;
+ m_Scheme.MakeLowercase();
+ m_SchemeId = ParseScheme(m_Scheme);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Uri::SetSchemeFromUri
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Uri::SetSchemeFromUri(const char* uri)
+{
+ const char* start = uri;
+ char c;
+ while ((c =*uri++)) {
+ if (c == ':') {
+ m_Scheme.Assign(start, (NPT_Size)(uri-start-1));
+ m_Scheme.MakeLowercase();
+ m_SchemeId = ParseScheme(m_Scheme);
+ return NPT_SUCCESS;
+ } else if ((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') ||
+ (c == '+') ||
+ (c == '.') ||
+ (c == '-')) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ return NPT_ERROR_INVALID_SYNTAX;
+}
+
+/*----------------------------------------------------------------------
+Appendix A. Collected ABNF for URI
+
+ URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
+
+ hier-part = "//" authority path-abempty
+ / path-absolute
+ / path-rootless
+ / path-empty
+
+ URI-reference = URI / relative-ref
+
+ absolute-URI = scheme ":" hier-part [ "?" query ]
+
+ relative-ref = relative-part [ "?" query ] [ "#" fragment ]
+
+ relative-part = "//" authority path-abempty
+ / path-absolute
+ / path-noscheme
+ / path-empty
+
+ scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+
+ authority = [ userinfo "@" ] host [ ":" port ]
+ userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
+ host = IP-literal / IPv4address / reg-name
+ port = *DIGIT
+
+ IP-literal = "[" ( IPv6address / IPvFuture ) "]"
+
+ IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
+
+ IPv6address = 6( h16 ":" ) ls32
+ / "::" 5( h16 ":" ) ls32
+ / [ h16 ] "::" 4( h16 ":" ) ls32
+ / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
+ / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
+ / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
+ / [ *4( h16 ":" ) h16 ] "::" ls32
+ / [ *5( h16 ":" ) h16 ] "::" h16
+ / [ *6( h16 ":" ) h16 ] "::"
+
+ h16 = 1*4HEXDIG
+ ls32 = ( h16 ":" h16 ) / IPv4address
+ IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
+ dec-octet = DIGIT ; 0-9
+ / %x31-39 DIGIT ; 10-99
+ / "1" 2DIGIT ; 100-199
+ / "2" %x30-34 DIGIT ; 200-249
+ / "25" %x30-35 ; 250-255
+
+ reg-name = *( unreserved / pct-encoded / sub-delims )
+
+ path = path-abempty ; begins with "/" or is empty
+ / path-absolute ; begins with "/" but not "//"
+ / path-noscheme ; begins with a non-colon segment
+ / path-rootless ; begins with a segment
+ / path-empty ; zero characters
+
+ path-abempty = *( "/" segment )
+ path-absolute = "/" [ segment-nz *( "/" segment ) ]
+ path-noscheme = segment-nz-nc *( "/" segment )
+ path-rootless = segment-nz *( "/" segment )
+ path-empty = 0<pchar>
+
+ segment = *pchar
+ segment-nz = 1*pchar
+ segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
+ ; non-zero-length segment without any colon ":"
+
+ pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
+
+ query = *( pchar / "/" / "?" )
+
+ fragment = *( pchar / "/" / "?" )
+
+ pct-encoded = "%" HEXDIG HEXDIG
+
+ unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ reserved = gen-delims / sub-delims
+ gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
+ sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
+ / "*" / "+" / "," / ";" / "="
+
+---------------------------------------------------------------------*/
+
+#define NPT_URI_ALWAYS_ENCODE " !\"<>\\^`{|}"
+
+/*----------------------------------------------------------------------
+| NPT_Uri::PathCharsToEncode
++---------------------------------------------------------------------*/
+const char* const
+NPT_Uri::PathCharsToEncode = NPT_URI_ALWAYS_ENCODE "?#[]";
+
+/*----------------------------------------------------------------------
+| NPT_Uri::QueryCharsToEncode
++---------------------------------------------------------------------*/
+const char* const
+NPT_Uri::QueryCharsToEncode = NPT_URI_ALWAYS_ENCODE "#[]";
+
+/*----------------------------------------------------------------------
+| NPT_Uri::FragmentCharsToEncode
++---------------------------------------------------------------------*/
+const char* const
+NPT_Uri::FragmentCharsToEncode = NPT_URI_ALWAYS_ENCODE "[]";
+
+/*----------------------------------------------------------------------
+| NPT_Uri::UnsafeCharsToEncode
++---------------------------------------------------------------------*/
+const char* const
+NPT_Uri::UnsafeCharsToEncode = NPT_URI_ALWAYS_ENCODE;
+
+/*----------------------------------------------------------------------
+| NPT_Uri::PercentEncode
++---------------------------------------------------------------------*/
+NPT_String
+NPT_Uri::PercentEncode(const char* str, const char* chars, bool encode_percents)
+{
+ NPT_String encoded;
+
+ // check args
+ if (str == NULL) return encoded;
+
+ // reserve at least the size of the current uri
+ encoded.Reserve(NPT_StringLength(str));
+
+ // process each character
+ char escaped[3];
+ escaped[0] = '%';
+ while (unsigned char c = *str++) {
+ bool encode = false;
+ if (encode_percents && c == '%') {
+ encode = true;
+ } else if (c < ' ' || c > '~') {
+ encode = true;
+ } else {
+ const char* match = chars;
+ while (*match) {
+ if (c == *match) {
+ encode = true;
+ break;
+ }
+ ++match;
+ }
+ }
+ if (encode) {
+ // encode
+ NPT_ByteToHex(c, &escaped[1], true);
+ encoded.Append(escaped, 3);
+ } else {
+ // no encoding required
+ encoded += c;
+ }
+ }
+
+ return encoded;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Uri::PercentDecode
++---------------------------------------------------------------------*/
+NPT_String
+NPT_Uri::PercentDecode(const char* str)
+{
+ NPT_String decoded;
+
+ // check args
+ if (str == NULL) return decoded;
+
+ // reserve at least the size of the current uri
+ decoded.Reserve(NPT_StringLength(str));
+
+ // process each character
+ while (unsigned char c = *str++) {
+ if (c == '%') {
+ // needs to be unescaped
+ unsigned char unescaped;
+ if (NPT_SUCCEEDED(NPT_HexToByte(str, unescaped))) {
+ decoded += unescaped;
+ str += 2;
+ } else {
+ // not a valid escape sequence, just keep the %
+ decoded += c;
+ }
+ } else {
+ // no unescaping required
+ decoded += c;
+ }
+ }
+
+ return decoded;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery::NPT_UrlQuery
++---------------------------------------------------------------------*/
+NPT_UrlQuery::NPT_UrlQuery(const char* query)
+{
+ Parse(query);
+}
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery::UrlEncode
++---------------------------------------------------------------------*/
+NPT_String
+NPT_UrlQuery::UrlEncode(const char* str, bool encode_percents)
+{
+ NPT_String encoded = NPT_Uri::PercentEncode(
+ str,
+ ";/?:@&=+$," /* reserved as defined in RFC 2396 */
+ "\"#<>\\^`{|}", /* other unsafe chars */
+ encode_percents);
+ encoded.Replace(' ','+');
+
+ return encoded;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery::UrlDecode
++---------------------------------------------------------------------*/
+NPT_String
+NPT_UrlQuery::UrlDecode(const char* str)
+{
+ NPT_String decoded(str);
+ decoded.Replace('+', ' ');
+ return NPT_Uri::PercentDecode(decoded);
+}
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery::Field::Field
++---------------------------------------------------------------------*/
+NPT_UrlQuery::Field::Field(const char* name, const char* value, bool encoded)
+{
+ if (encoded) {
+ m_Name = name;
+ m_Value = value;
+ } else {
+ m_Name = UrlEncode(name);
+ m_Value = UrlEncode(value);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery::ToString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_UrlQuery::ToString()
+{
+ NPT_String encoded;
+ bool separator = false;
+ for (NPT_List<Field>::Iterator it = m_Fields.GetFirstItem();
+ it;
+ ++it) {
+ Field& field = *it;
+ if (separator) encoded += "&";
+ separator = true;
+ encoded += field.m_Name;
+ encoded += "=";
+ encoded += field.m_Value;
+ }
+
+ return encoded;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_UrlQuery::Parse(const char* query)
+{
+ const char* cursor = query;
+ NPT_String name;
+ NPT_String value;
+ bool in_name = true;
+ do {
+ if (*cursor == '\0' || *cursor == '&') {
+ AddField(name, value, true);
+ name.SetLength(0);
+ value.SetLength(0);
+ in_name = true;
+ } else if (*cursor == '=' && in_name) {
+ in_name = false;
+ } else {
+ if (in_name) {
+ name += *cursor;
+ } else {
+ value += *cursor;
+ }
+ }
+ } while (*cursor++);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery::AddField
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_UrlQuery::AddField(const char* name, const char* value, bool encoded)
+{
+ return m_Fields.Add(Field(name, value, encoded));
+}
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery::SetField
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_UrlQuery::SetField(const char* name, const char* value, bool encoded)
+{
+ NPT_String ename;
+ if (encoded) {
+ ename = name;
+ } else {
+ ename = UrlEncode(name);
+ }
+ for (NPT_List<Field>::Iterator it = m_Fields.GetFirstItem();
+ it;
+ ++it) {
+ Field& field = *it;
+ if (field.m_Name == ename) {
+ if (encoded) {
+ field.m_Value = value;
+ } else {
+ field.m_Value = UrlEncode(value);
+ }
+ return NPT_SUCCESS;
+ }
+ }
+
+ // field not found, add it
+ return AddField(name, value, encoded);
+}
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery::GetField
++---------------------------------------------------------------------*/
+const char*
+NPT_UrlQuery::GetField(const char* name)
+{
+ NPT_String ename = UrlEncode(name);
+ for (NPT_List<Field>::Iterator it = m_Fields.GetFirstItem();
+ it;
+ ++it) {
+ Field& field = *it;
+ if (field.m_Name == ename) return field.m_Value;
+ }
+
+ // field not found
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef enum {
+ NPT_URL_PARSER_STATE_START,
+ NPT_URL_PARSER_STATE_SCHEME,
+ NPT_URL_PARSER_STATE_LEADING_SLASH,
+ NPT_URL_PARSER_STATE_HOST,
+ NPT_URL_PARSER_STATE_HOST_IPV6_ADDR,
+ NPT_URL_PARSER_STATE_PORT,
+ NPT_URL_PARSER_STATE_PATH,
+ NPT_URL_PARSER_STATE_QUERY
+} NPT_UrlParserState;
+
+/*----------------------------------------------------------------------
+| NPT_Url::NPT_Url
++---------------------------------------------------------------------*/
+NPT_Url::NPT_Url() :
+ m_HostIsIpv6Address(false),
+ m_Port(NPT_URL_INVALID_PORT),
+ m_Path("/"),
+ m_HasQuery(false),
+ m_HasFragment(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::NPT_Url
++---------------------------------------------------------------------*/
+NPT_Url::NPT_Url(const char* url, NPT_UInt16 default_port) :
+ m_HostIsIpv6Address(false),
+ m_Port(NPT_URL_INVALID_PORT),
+ m_HasQuery(false),
+ m_HasFragment(false)
+{
+ // try to parse
+ if (NPT_FAILED(Parse(url, default_port))) {
+ Reset();
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Url::Parse(const char* url, NPT_UInt16 default_port)
+{
+ // check parameters
+ if (url == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // set the uri scheme
+ NPT_Result result = SetSchemeFromUri(url);
+ if (NPT_FAILED(result)) return result;
+
+ // set the default port
+ if (default_port) {
+ m_Port = default_port;
+ } else {
+ switch (m_SchemeId) {
+ case SCHEME_ID_HTTP: m_Port = NPT_URL_DEFAULT_HTTP_PORT; break;
+ case SCHEME_ID_HTTPS: m_Port = NPT_URL_DEFAULT_HTTPS_PORT; break;
+ default: break;
+ }
+ }
+
+ // move to the scheme-specific part
+ url += m_Scheme.GetLength()+1;
+
+ // intialize the parser
+ NPT_UrlParserState state = NPT_URL_PARSER_STATE_START;
+ const char* mark = url;
+
+ // parse the URL
+ char c;
+ do {
+ c = *url++;
+ switch (state) {
+ case NPT_URL_PARSER_STATE_START:
+ if (c == '/') {
+ state = NPT_URL_PARSER_STATE_LEADING_SLASH;
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case NPT_URL_PARSER_STATE_LEADING_SLASH:
+ if (c == '/') {
+ state = NPT_URL_PARSER_STATE_HOST;
+ mark = url;
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case NPT_URL_PARSER_STATE_HOST_IPV6_ADDR:
+ if (c == ']') {
+ state = NPT_URL_PARSER_STATE_HOST;
+ }
+ break;
+
+ case NPT_URL_PARSER_STATE_HOST:
+ if (c == '[' && url == mark+1) {
+ // start of an IPv6 address
+ state = NPT_URL_PARSER_STATE_HOST_IPV6_ADDR;
+ } else if (c == ':' || c == '/' || c == '\0' || c == '?' || c == '#') {
+ NPT_Size host_length = (NPT_Size)(url-1-mark);
+ if (host_length > 2 && mark[0] == '[' && mark[host_length-1] == ']') {
+ m_Host.Assign(mark+1, host_length-2);
+ m_HostIsIpv6Address = true;
+ } else {
+ m_Host.Assign(mark, host_length);
+ m_HostIsIpv6Address = false;
+ }
+ if (c == ':') {
+ mark = url;
+ m_Port = 0;
+ state = NPT_URL_PARSER_STATE_PORT;
+ } else {
+ mark = url-1;
+ state = NPT_URL_PARSER_STATE_PATH;
+ }
+ }
+ break;
+
+ case NPT_URL_PARSER_STATE_PORT:
+ if (c >= '0' && c <= '9') {
+ unsigned int val = m_Port*10+(c-'0');
+ if (val > 65535) {
+ m_Port = NPT_URL_INVALID_PORT;
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ m_Port = val;
+ } else if (c == '/' || c == '\0') {
+ mark = url-1;
+ state = NPT_URL_PARSER_STATE_PATH;
+ } else {
+ // invalid character
+ m_Port = NPT_URL_INVALID_PORT;
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case NPT_URL_PARSER_STATE_PATH:
+ if (*mark) {
+ return ParsePathPlus(mark);
+ }
+ break;
+
+ default:
+ break;
+ }
+ } while (c);
+
+ // if we get here, the path is implicit
+ m_Path = "/";
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::NPT_Url
++---------------------------------------------------------------------*/
+NPT_Url::NPT_Url(const char* scheme,
+ const char* host,
+ NPT_UInt16 port,
+ const char* path,
+ const char* query,
+ const char* fragment) :
+ m_Host(host),
+ m_HostIsIpv6Address(false),
+ m_Port(port),
+ m_Path(path),
+ m_HasQuery(query != NULL),
+ m_Query(query),
+ m_HasFragment(fragment != NULL),
+ m_Fragment(fragment)
+{
+ SetScheme(scheme);
+
+ // deal with IPv6 addresses
+ if (m_Host.StartsWith("[") && m_Host.EndsWith("]")) {
+ m_HostIsIpv6Address = true;
+ m_Host = m_Host.SubString(1, m_Host.GetLength()-2);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::Reset
++---------------------------------------------------------------------*/
+void
+NPT_Url::Reset()
+{
+ m_Host.SetLength(0);
+ m_HostIsIpv6Address = false;
+ m_Port = 0;
+ m_Path.SetLength(0);
+ m_HasQuery = false;
+ m_Query.SetLength(0);
+ m_HasFragment = false;
+ m_Fragment.SetLength(0);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::IsValid
++---------------------------------------------------------------------*/
+bool
+NPT_Url::IsValid() const
+{
+ switch (m_SchemeId) {
+ case SCHEME_ID_HTTP:
+ case SCHEME_ID_HTTPS:
+ return m_Port != NPT_URL_INVALID_PORT && !m_Host.IsEmpty();
+ break;
+
+ default:
+ return !m_Scheme.IsEmpty();
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::SetHost
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Url::SetHost(const char* host)
+{
+ const char* port;
+ if (*host == '[') {
+ const char* host_end = host+1;
+ while (*host_end && *host_end != ']') ++host_end;
+ if (*host_end != ']') {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ port = host_end+1;
+ if (*port && *port != ':') {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ m_Host.Assign(host+1, (NPT_Size)(host_end-host-1));
+ m_HostIsIpv6Address = true;
+ } else {
+ port = host;
+ while (*port && *port != ':') port++;
+ m_Host.Assign(host, (NPT_Size)(port-host));
+ m_HostIsIpv6Address = false;
+ }
+
+ if (*port) {
+ unsigned int port_number;
+ // parse the port number but ignore errors (be lenient)
+ if (NPT_SUCCEEDED(NPT_ParseInteger(port+1, port_number, false))) {
+ if (port_number > 65535) {
+ return NPT_ERROR_OUT_OF_RANGE;
+ }
+ m_Port = (NPT_UInt16)port_number;
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::SetPort
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Url::SetPort(NPT_UInt16 port)
+{
+ m_Port = port;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::SetPath
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Url::SetPath(const char* path, bool encoded)
+{
+ if (encoded) {
+ m_Path = path;
+ } else {
+ m_Path = PercentEncode(path, PathCharsToEncode);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::ParsePathPlus
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Url::ParsePathPlus(const char* path_plus)
+{
+ // check parameters
+ if (path_plus == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // reset any existing values
+ m_Path.SetLength(0);
+ m_Query.SetLength(0);
+ m_Fragment.SetLength(0);
+ m_HasQuery = false;
+ m_HasFragment = false;
+
+#ifdef _WIN32
+ // Skip the leading '/' if there is an absolute path starting with
+ // a drive letter on Windows.
+ if (path_plus[0] == '/' &&
+ ((path_plus[1] >= 'a' && path_plus[1] <= 'z') ||
+ (path_plus[1] >= 'A' && path_plus[1] <= 'Z')) &&
+ path_plus[2] == ':')
+ {
+ ++path_plus;
+ }
+#endif
+
+ // intialize the parser
+ NPT_UrlParserState state = NPT_URL_PARSER_STATE_PATH;
+ const char* mark = path_plus;
+
+ // parse the path+
+ char c;
+ do {
+ c = *path_plus++;
+ switch (state) {
+ case NPT_URL_PARSER_STATE_PATH:
+ if (c == '\0' || c == '?' || c == '#') {
+ if (path_plus-1 > mark) {
+ m_Path.Append(mark, (NPT_Size)(path_plus-1-mark));
+ }
+ if (c == '?') {
+ m_HasQuery = true;
+ state = NPT_URL_PARSER_STATE_QUERY;
+ mark = path_plus;
+ } else if (c == '#') {
+ m_HasFragment = true;
+ m_Fragment = path_plus;
+ return NPT_SUCCESS;
+ }
+ }
+ break;
+
+ case NPT_URL_PARSER_STATE_QUERY:
+ if (c == '\0' || c == '#') {
+ m_Query.Assign(mark, (NPT_Size)(path_plus-1-mark));
+ if (c == '#') {
+ m_HasFragment = true;
+ m_Fragment = path_plus;
+ }
+ return NPT_SUCCESS;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } while (c);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::SetQuery
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Url::SetQuery(const char* query, bool encoded)
+{
+ if (encoded) {
+ m_Query = query;
+ } else {
+ m_Query = PercentEncode(query, QueryCharsToEncode);
+ }
+ m_HasQuery = query!=NULL && NPT_StringLength(query)>0;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::SetFragment
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Url::SetFragment(const char* fragment, bool encoded)
+{
+ if (encoded) {
+ m_Fragment = fragment;
+ } else {
+ m_Fragment = PercentEncode(fragment, FragmentCharsToEncode);
+ }
+ m_HasFragment = fragment!=NULL;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::ToRequestString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_Url::ToRequestString(bool with_fragment) const
+{
+ NPT_String result;
+ NPT_Size length = m_Path.GetLength()+1;
+ if (m_HasQuery) length += 1+m_Query.GetLength();
+ if (with_fragment) length += 1+m_Fragment.GetLength();
+ result.Reserve(length);
+
+ if (m_Path.IsEmpty()) {
+ result += "/";
+ } else {
+#if defined(_WIN32)
+ // prepend a '/' if the path starts with the drive letter on Windows
+ if (((m_Path[0] >= 'a' && m_Path[0] <= 'z') ||
+ (m_Path[0] >= 'A' && m_Path[0] <= 'Z')) &&
+ m_Path[1] == ':')
+ {
+ result += "/";
+ }
+#endif
+ result += m_Path;
+ }
+ if (m_HasQuery) {
+ result += "?";
+ result += m_Query;
+ }
+ if (with_fragment && m_HasFragment) {
+ result += "#";
+ result += m_Fragment;
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::ToStringWithDefaultPort
++---------------------------------------------------------------------*/
+NPT_String
+NPT_Url::ToStringWithDefaultPort(NPT_UInt16 default_port, bool with_fragment) const
+{
+ NPT_String result;
+ NPT_String request = ToRequestString(with_fragment);
+ NPT_Size length = m_Scheme.GetLength()+3+m_Host.GetLength()+6+request.GetLength();
+
+ if (m_HostIsIpv6Address) {
+ length += 2;
+ }
+
+ result.Reserve(length);
+ result += m_Scheme;
+ result += "://";
+ if (m_HostIsIpv6Address) {
+ result += "[";
+ }
+ result += m_Host;
+ if (m_HostIsIpv6Address) {
+ result += "]";
+ }
+ if (m_Port != default_port) {
+ NPT_String port = NPT_String::FromInteger(m_Port);
+ result += ":";
+ result += port;
+ }
+ result += request;
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Url::ToString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_Url::ToString(bool with_fragment) const
+{
+ return ToStringWithDefaultPort(0, with_fragment);
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptUri.h b/lib/libUPnP/Neptune/Source/Core/NptUri.h
new file mode 100644
index 0000000..f3661c0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptUri.h
@@ -0,0 +1,322 @@
+/*****************************************************************
+|
+| Neptune - URI
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_URI_H_
+#define _NPT_URI_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptStrings.h"
+#include "NptList.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const NPT_UInt16 NPT_URL_INVALID_PORT = 0;
+const NPT_UInt16 NPT_URL_DEFAULT_HTTP_PORT = 80;
+const NPT_UInt16 NPT_URL_DEFAULT_HTTPS_PORT = 443;
+
+/*----------------------------------------------------------------------
+| NPT_Uri
++---------------------------------------------------------------------*/
+class NPT_Uri {
+public:
+ // types
+ typedef enum {
+ SCHEME_ID_UNKNOWN,
+ SCHEME_ID_HTTP,
+ SCHEME_ID_HTTPS
+ } SchemeId;
+
+ // constants. use as a parameter to Encode()
+ static const char* const PathCharsToEncode;
+ static const char* const QueryCharsToEncode;
+ static const char* const FragmentCharsToEncode;
+ static const char* const UnsafeCharsToEncode;
+
+ // class methods
+ static NPT_String PercentEncode(const char* str, const char* chars, bool encode_percents=true);
+ static NPT_String PercentDecode(const char* str);
+ static SchemeId ParseScheme(const NPT_String& scheme);
+
+ // methods
+ NPT_Uri() : m_SchemeId(SCHEME_ID_UNKNOWN) {}
+ virtual ~NPT_Uri() {}
+ const NPT_String& GetScheme() const {
+ return m_Scheme;
+ }
+ void SetScheme(const char* scheme);
+ NPT_Result SetSchemeFromUri(const char* uri);
+ SchemeId GetSchemeId() const {
+ return m_SchemeId;
+ }
+
+protected:
+ // members
+ NPT_String m_Scheme;
+ SchemeId m_SchemeId;
+};
+
+/*----------------------------------------------------------------------
+| NPT_UrlQuery
++---------------------------------------------------------------------*/
+class NPT_UrlQuery
+{
+public:
+ // class methods
+ static NPT_String UrlEncode(const char* str, bool encode_percents=true);
+ static NPT_String UrlDecode(const char* str);
+
+ // types
+ struct Field {
+ Field(const char* name, const char* value, bool encoded);
+ NPT_String m_Name;
+ NPT_String m_Value;
+ };
+
+ // constructor
+ NPT_UrlQuery() {}
+ NPT_UrlQuery(const char* query);
+
+ // accessors
+ NPT_List<Field>& GetFields() { return m_Fields; }
+
+ // methods
+ NPT_Result Parse(const char* query);
+ NPT_Result SetField(const char* name, const char* value, bool encoded=false);
+ NPT_Result AddField(const char* name, const char* value, bool encoded=false);
+ const char* GetField(const char* name);
+ NPT_String ToString();
+
+private:
+ // members
+ NPT_List<Field> m_Fields;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Url
++---------------------------------------------------------------------*/
+class NPT_Url : public NPT_Uri {
+public:
+ /**
+ * Default constructor. This does not construct a valid URL, but an
+ * uninitialized one that can later be initialized to a valid URL by
+ * parsing or setting some of its fields.
+ */
+ NPT_Url();
+
+ /**
+ * Construct a URL by parsing an input string in its fully encoded form.
+ * If an error occurs during parsing (such as an invalid syntax), the
+ * URL will be in an invalid state (a call to IsValid() will return false).
+ *
+ * @param url The URL string in its encoded form
+ * @param default_port The default port number, or 0 if not specified
+ */
+ NPT_Url(const char* url, NPT_UInt16 default_port = 0);
+
+ /**
+ * Construct a URL from its components. When constructing a URL from
+ * components, the components are assumed to be passed in their non-encoded
+ * form, and will thus be encoded automatically.
+ *
+ * @param scheme The URL scheme
+ * @param host The host name (enclose with [ and ] for IPv6 addresses)
+ * @param port The port number
+ * @param path The path
+ * @param query The query, if any, or NULL
+ * @param fragment The fragment, if any, or NULL
+ */
+ NPT_Url(const char* scheme,
+ const char* host,
+ NPT_UInt16 port,
+ const char* path,
+ const char* query = NULL,
+ const char* fragment = NULL);
+
+ /**
+ * Parse a URL from its fully encoded form.
+ *
+ * @param url The URL string in its encoded form
+ * @param default port The defautl port number, or 0 if not specified
+ */
+ NPT_Result Parse(const char* url, NPT_UInt16 default_port = 0);
+
+ /**
+ * Parse just the path plus optional query and fragment from a fully encoded form.
+ *
+ * @param path_plus The URL path plus optional query and fragment
+ */
+ NPT_Result ParsePathPlus(const char* path_plus);
+
+ /**
+ * Returns the host part of the URL, in its encoded form
+ */
+ const NPT_String& GetHost() const { return m_Host; }
+
+ /**
+ * Returns the port number of the URL.
+ */
+ NPT_UInt16 GetPort() const { return m_Port; }
+
+ /**
+ * Returns the path part of the URL, in its encoded form
+ */
+ const NPT_String& GetPath() const { return m_Path; }
+
+ /**
+ * Returns the path part of the URL, in its encoded or decoded form
+ */
+ NPT_String GetPath(bool decoded) const { return decoded?NPT_Uri::PercentDecode(m_Path):m_Path;}
+
+ /**
+ * Returns the query part of the URL, in its encoded form
+ */
+ const NPT_String& GetQuery() const { return m_Query; }
+
+ /**
+ * Returns the fragment part of the URL, in its encoded form
+ */
+ const NPT_String& GetFragment() const { return m_Fragment; }
+
+ /**
+ * Returns whether the URL is valid or not. Invalid URLs are uninitialized or
+ * not fully initialized URLs.
+ *
+ * @return true if the URL is valid, false if it is not.
+ */
+ virtual bool IsValid() const;
+
+ /**
+ * Resets a URL to an uninitialized state.
+ */
+ void Reset();
+
+ /**
+ * Returns whether the URL has a query part or not.
+ *
+ * @return true if the URL has a query part, false if it does not.
+ */
+ bool HasQuery() const { return m_HasQuery; }
+
+ /**
+ * Returns whether the URL has a fragment part or not.
+ *
+ * @return true if the URL has a fragment part, false if it does not.
+ */
+ bool HasFragment() const { return m_HasFragment; }
+
+ /**
+ * Sets the host part of the URL.
+ *
+ * @param host The host part of the URL (enclose with [ and ] for IPv6 addresses)
+ */
+ NPT_Result SetHost(const char* host);
+
+ /**
+ * Sets the port number of the URL.
+ *
+ * @param port The port number of the URL
+ */
+ NPT_Result SetPort(NPT_UInt16 port);
+
+ /**
+ * Sets the path part of the URL.
+ *
+ * @param path The path part of the URL
+ * @param encoded Boolean flag indicating whether the path parameter is
+ * already encoded or not. If it is not already encoded, it will be
+ * automatically encoded.
+ */
+ NPT_Result SetPath(const char* path, bool encoded=false);
+
+ /**
+ * Sets the query part of the URL.
+ *
+ * @param query The query part of the URL
+ * @param encoded Boolean flag indicating whether the query parameter is
+ * already encoded or not. If it is not already encoded, it will be
+ * automatically encoded.
+ */
+ NPT_Result SetQuery(const char* query, bool encoded=false);
+
+ /**
+ * Sets the fragment part of the URL.
+ *
+ * @param query The fragment part of the URL
+ * @param encoded Boolean flag indicating whether the fragment parameter is
+ * already encoded or not. If it is not already encoded, it will be
+ * automatically encoded.
+ */
+ NPT_Result SetFragment(const char* fragment, bool encoded=false);
+
+ /**
+ * Return the string representation of the URL in a way that can be used in
+ * an HTTP request (i.e just the portion of the URL starting with the path)
+ *
+ * @param with_fragment Boolean flag specifiying whether the fragment part of
+ * the URL should be included in the returned string or not.
+ */
+ virtual NPT_String ToRequestString(bool with_fragment = false) const;
+
+ /**
+ * Return the string representation of the URL.
+ *
+ * @param default_port default port number for the scheme. If the port number of
+ * the URL is not equal to the default port, then port number is explicitely
+ * included in the string representation of the URL.
+ * @param with_fragment Boolean flag specifiying whether the fragment part of
+ * the URL should be included in the returned string or not.
+ */
+ virtual NPT_String ToStringWithDefaultPort(NPT_UInt16 default_port, bool with_fragment = true) const;
+
+ /**
+ * Return the string representation of the URL.
+ *
+ * @param with_fragment Boolean flag specifiying whether the fragment part of
+ * the URL should be included in the returned string or not.
+ */
+ virtual NPT_String ToString(bool with_fragment = true) const;
+
+protected:
+ // members
+ NPT_String m_Host;
+ bool m_HostIsIpv6Address;
+ NPT_UInt16 m_Port;
+ NPT_String m_Path;
+ bool m_HasQuery;
+ NPT_String m_Query;
+ bool m_HasFragment;
+ NPT_String m_Fragment;
+};
+
+#endif // _NPT_URI_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptUtils.cpp b/lib/libUPnP/Neptune/Source/Core/NptUtils.cpp
new file mode 100644
index 0000000..f427f8b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptUtils.cpp
@@ -0,0 +1,957 @@
+/*****************************************************************
+|
+| Neptune - Utils
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <math.h>
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptDebug.h"
+#include "NptUtils.h"
+#include "NptResults.h"
+
+#if defined(NPT_CONFIG_HAVE_LIMITS_H)
+#include <limits.h>
+#endif
+
+#ifdef TARGET_WINDOWS_STORE
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#include <windows.h>
+#endif
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const unsigned int NPT_FORMAT_LOCAL_BUFFER_SIZE = 1024;
+const unsigned int NPT_FORMAT_BUFFER_INCREMENT = 4096;
+const unsigned int NPT_FORMAT_BUFFER_MAX_SIZE = 65536;
+
+/*----------------------------------------------------------------------
+| NPT_BytesToInt64Be
++---------------------------------------------------------------------*/
+NPT_UInt64
+NPT_BytesToInt64Be(const unsigned char* bytes)
+{
+ return
+ ( ((NPT_UInt64)bytes[0])<<56 ) |
+ ( ((NPT_UInt64)bytes[1])<<48 ) |
+ ( ((NPT_UInt64)bytes[2])<<40 ) |
+ ( ((NPT_UInt64)bytes[3])<<32 ) |
+ ( ((NPT_UInt64)bytes[4])<<24 ) |
+ ( ((NPT_UInt64)bytes[5])<<16 ) |
+ ( ((NPT_UInt64)bytes[6])<<8 ) |
+ ( ((NPT_UInt64)bytes[7]) );
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesToInt32Be
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_BytesToInt32Be(const unsigned char* bytes)
+{
+ return
+ ( ((NPT_UInt32)bytes[0])<<24 ) |
+ ( ((NPT_UInt32)bytes[1])<<16 ) |
+ ( ((NPT_UInt32)bytes[2])<<8 ) |
+ ( ((NPT_UInt32)bytes[3]) );
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesToInt24Be
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_BytesToInt24Be(const unsigned char* bytes)
+{
+ return
+ ( ((NPT_UInt32)bytes[0])<<16 ) |
+ ( ((NPT_UInt32)bytes[1])<<8 ) |
+ ( ((NPT_UInt32)bytes[2]) );
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesToInt16Be
++---------------------------------------------------------------------*/
+NPT_UInt16
+NPT_BytesToInt16Be(const unsigned char* bytes)
+{
+ return
+ ( ((NPT_UInt16)bytes[0])<<8 ) |
+ ( ((NPT_UInt16)bytes[1]) );
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesToInt64Le
++---------------------------------------------------------------------*/
+NPT_UInt64
+NPT_BytesToInt64Le(const unsigned char* bytes)
+{
+ return
+ ( ((NPT_UInt64)bytes[7])<<56 ) |
+ ( ((NPT_UInt64)bytes[6])<<48 ) |
+ ( ((NPT_UInt64)bytes[5])<<40 ) |
+ ( ((NPT_UInt64)bytes[4])<<32 ) |
+ ( ((NPT_UInt64)bytes[3])<<24 ) |
+ ( ((NPT_UInt64)bytes[2])<<16 ) |
+ ( ((NPT_UInt64)bytes[1])<<8 ) |
+ ( ((NPT_UInt64)bytes[0]) );
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesToInt32Le
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_BytesToInt32Le(const unsigned char* bytes)
+{
+ return
+ ( ((NPT_UInt32)bytes[3])<<24 ) |
+ ( ((NPT_UInt32)bytes[2])<<16 ) |
+ ( ((NPT_UInt32)bytes[1])<<8 ) |
+ ( ((NPT_UInt32)bytes[0]) );
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesToInt24Le
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_BytesToInt24Le(const unsigned char* bytes)
+{
+ return
+ ( ((NPT_UInt32)bytes[2])<<16 ) |
+ ( ((NPT_UInt32)bytes[1])<<8 ) |
+ ( ((NPT_UInt32)bytes[0]) );
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesToInt16Le
++---------------------------------------------------------------------*/
+NPT_UInt16
+NPT_BytesToInt16Le(const unsigned char* bytes)
+{
+ return
+ ( ((NPT_UInt16)bytes[1])<<8 ) |
+ ( ((NPT_UInt16)bytes[0]) );
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesFromInt64Be
++---------------------------------------------------------------------*/
+void
+NPT_BytesFromInt64Be(unsigned char* buffer, NPT_UInt64 value)
+{
+ buffer[0] = (unsigned char)(value>>56) & 0xFF;
+ buffer[1] = (unsigned char)(value>>48) & 0xFF;
+ buffer[2] = (unsigned char)(value>>40) & 0xFF;
+ buffer[3] = (unsigned char)(value>>32) & 0xFF;
+ buffer[4] = (unsigned char)(value>>24) & 0xFF;
+ buffer[5] = (unsigned char)(value>>16) & 0xFF;
+ buffer[6] = (unsigned char)(value>> 8) & 0xFF;
+ buffer[7] = (unsigned char)(value ) & 0xFF;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesFromInt32Be
++---------------------------------------------------------------------*/
+void
+NPT_BytesFromInt32Be(unsigned char* buffer, NPT_UInt32 value)
+{
+ buffer[0] = (unsigned char)(value>>24) & 0xFF;
+ buffer[1] = (unsigned char)(value>>16) & 0xFF;
+ buffer[2] = (unsigned char)(value>> 8) & 0xFF;
+ buffer[3] = (unsigned char)(value ) & 0xFF;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesFromInt24Be
++---------------------------------------------------------------------*/
+void
+NPT_BytesFromInt24Be(unsigned char* buffer, NPT_UInt32 value)
+{
+ buffer[0] = (unsigned char)(value>>16) & 0xFF;
+ buffer[1] = (unsigned char)(value>> 8) & 0xFF;
+ buffer[2] = (unsigned char)(value ) & 0xFF;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesFromInt16Be
++---------------------------------------------------------------------*/
+void
+NPT_BytesFromInt16Be(unsigned char* buffer, NPT_UInt16 value)
+{
+ buffer[0] = (unsigned char)((value>> 8) & 0xFF);
+ buffer[1] = (unsigned char)((value ) & 0xFF);
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesFromInt64Le
++---------------------------------------------------------------------*/
+void
+NPT_BytesFromInt64Le(unsigned char* buffer, NPT_UInt64 value)
+{
+ buffer[7] = (unsigned char)(value>>56) & 0xFF;
+ buffer[6] = (unsigned char)(value>>48) & 0xFF;
+ buffer[5] = (unsigned char)(value>>40) & 0xFF;
+ buffer[4] = (unsigned char)(value>>32) & 0xFF;
+ buffer[3] = (unsigned char)(value>>24) & 0xFF;
+ buffer[2] = (unsigned char)(value>>16) & 0xFF;
+ buffer[1] = (unsigned char)(value>> 8) & 0xFF;
+ buffer[0] = (unsigned char)(value ) & 0xFF;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesFromInt32Le
++---------------------------------------------------------------------*/
+void
+NPT_BytesFromInt32Le(unsigned char* buffer, NPT_UInt32 value)
+{
+ buffer[3] = (unsigned char)(value>>24) & 0xFF;
+ buffer[2] = (unsigned char)(value>>16) & 0xFF;
+ buffer[1] = (unsigned char)(value>> 8) & 0xFF;
+ buffer[0] = (unsigned char)(value ) & 0xFF;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesFromInt24Le
++---------------------------------------------------------------------*/
+void
+NPT_BytesFromInt24Le(unsigned char* buffer, NPT_UInt32 value)
+{
+ buffer[2] = (unsigned char)(value>>16) & 0xFF;
+ buffer[1] = (unsigned char)(value>> 8) & 0xFF;
+ buffer[0] = (unsigned char)(value ) & 0xFF;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BytesFromInt16Le
++---------------------------------------------------------------------*/
+void
+NPT_BytesFromInt16Le(unsigned char* buffer, NPT_UInt16 value)
+{
+ buffer[1] = (unsigned char)((value>> 8) & 0xFF);
+ buffer[0] = (unsigned char)((value ) & 0xFF);
+}
+
+#if !defined(NPT_CONFIG_HAVE_SNPRINTF)
+/*----------------------------------------------------------------------
+| NPT_FormatString
++---------------------------------------------------------------------*/
+int
+NPT_FormatString(char* /*str*/, NPT_Size /*size*/, const char* /*format*/, ...)
+{
+ NPT_ASSERT(0); // not implemented yet
+ return 0;
+}
+#endif // NPT_CONFIG_HAVE_SNPRINTF
+
+/*----------------------------------------------------------------------
+| NPT_NibbleToHex
++---------------------------------------------------------------------*/
+char
+NPT_NibbleToHex(unsigned int nibble, bool uppercase /* = true */)
+{
+ NPT_ASSERT(nibble < 16);
+ if (uppercase) {
+ return (nibble < 10) ? ('0' + nibble) : ('A' + (nibble-10));
+ } else {
+ return (nibble < 10) ? ('0' + nibble) : ('a' + (nibble-10));
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_HexToNibble
++---------------------------------------------------------------------*/
+int
+NPT_HexToNibble(char hex)
+{
+ if (hex >= 'a' && hex <= 'f') {
+ return ((hex - 'a') + 10);
+ } else if (hex >= 'A' && hex <= 'F') {
+ return ((hex - 'A') + 10);
+ } else if (hex >= '0' && hex <= '9') {
+ return (hex - '0');
+ } else {
+ return -1;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_ByteToHex
++---------------------------------------------------------------------*/
+void
+NPT_ByteToHex(NPT_Byte b, char* buffer, bool uppercase)
+{
+ buffer[0] = NPT_NibbleToHex((b>>4) & 0x0F, uppercase);
+ buffer[1] = NPT_NibbleToHex(b & 0x0F, uppercase);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HexToByte
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HexToByte(const char* buffer, NPT_Byte& b)
+{
+ int nibble_0 = NPT_HexToNibble(buffer[0]);
+ if (nibble_0 < 0) return NPT_ERROR_INVALID_SYNTAX;
+
+ int nibble_1 = NPT_HexToNibble(buffer[1]);
+ if (nibble_1 < 0) return NPT_ERROR_INVALID_SYNTAX;
+
+ b = (nibble_0 << 4) | nibble_1;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HexToBytes
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_HexToBytes(const char* hex,
+ NPT_DataBuffer& bytes)
+{
+ // check the size
+ NPT_Size len = NPT_StringLength(hex);
+ if ((len%2) != 0) return NPT_ERROR_INVALID_PARAMETERS;
+ NPT_Size bytes_size = len / 2;
+ NPT_Result result = bytes.SetDataSize(bytes_size);
+ if (NPT_FAILED(result)) return result;
+
+ // decode
+ for (NPT_Ordinal i=0; i<bytes_size; i++) {
+ result = NPT_HexToByte(hex+(i*2), *(bytes.UseData()+i));
+ if (NPT_FAILED(result)) return result;
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HexString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_HexString(const unsigned char* data,
+ NPT_Size data_size,
+ const char* separator,
+ bool uppercase)
+{
+ NPT_String result;
+
+ // quick check
+ if (data == NULL || data_size == 0) return result;
+
+ // set the result size
+ NPT_Size separator_length = separator?NPT_StringLength(separator):0;
+ result.SetLength(data_size*2+(data_size-1)*separator_length);
+
+ // build the string
+ const unsigned char* src = data;
+ char* dst = result.UseChars();
+ while (data_size--) {
+ NPT_ByteToHex(*src++, dst, uppercase);
+ dst += 2;
+ if (data_size) {
+ NPT_CopyMemory(dst, separator, separator_length);
+ dst += separator_length;
+ }
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ParseFloat
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseFloat(const char* str, float& result, bool relaxed)
+{
+ // safe default value
+ result = 0.0f;
+
+ // check params
+ if (str == NULL || *str == '\0') {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // ignore leading whitespace
+ if (relaxed) {
+ while (*str == ' ' || *str == '\t') {
+ str++;
+ }
+ }
+ if (*str == '\0') {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // check for sign
+ bool negative = false;
+ if (*str == '-') {
+ // negative number
+ negative = true;
+ str++;
+ } else if (*str == '+') {
+ // skip the + sign
+ str++;
+ }
+
+ // parse the digits
+ bool after_radix = false;
+ bool empty = true;
+ float value = 0.0f;
+ float decimal = 10.0f;
+ char c;
+ while ((c = *str++)) {
+ if (c == '.') {
+ if (after_radix || (*str < '0' || *str > '9')) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ } else {
+ after_radix = true;
+ }
+ } else if (c >= '0' && c <= '9') {
+ empty = false;
+ if (after_radix) {
+ value += (float)(c-'0')/decimal;
+ decimal *= 10.0f;
+ } else {
+ value = 10.0f*value + (float)(c-'0');
+ }
+ } else if (c == 'e' || c == 'E') {
+ // exponent
+ if (*str == '+' || *str == '-' || (*str >= '0' && *str <= '9')) {
+ int exponent = 0;
+ if (NPT_SUCCEEDED(NPT_ParseInteger(str, exponent, relaxed))) {
+ value *= (float)pow(10.0f, (float)exponent);
+ break;
+ } else {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ } else {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ } else {
+ if (relaxed) {
+ break;
+ } else {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ }
+ }
+
+ // check that the value was non empty
+ if (empty) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // return the result
+ result = negative ? -value : value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ParseInteger64
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseInteger64(const char* str, NPT_Int64& result, bool relaxed, NPT_Cardinal* chars_used)
+{
+ // safe default value
+ result = 0;
+ if (chars_used) *chars_used = 0;
+
+ if (str == NULL) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // ignore leading whitespace
+ if (relaxed) {
+ while (*str == ' ' || *str == '\t') {
+ str++;
+ if (chars_used) (*chars_used)++;
+ }
+ }
+ if (*str == '\0') {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // check for sign
+ bool negative = false;
+ if (*str == '-') {
+ // negative number
+ negative = true;
+ str++;
+ if (chars_used) (*chars_used)++;
+ } else if (*str == '+') {
+ // skip the + sign
+ str++;
+ if (chars_used) (*chars_used)++;
+ }
+
+ // check for overflows
+ NPT_Int64 max = NPT_INT64_MAX/10;
+
+ // adjust the max for overflows when the value is negative
+ if (negative && ((NPT_INT64_MAX%10) == /* DISABLES CODE */ (9))) ++max;
+
+ // parse the digits
+ bool empty = true;
+ NPT_Int64 value = 0;
+ char c;
+ while ((c = *str++)) {
+ if (c >= '0' && c <= '9') {
+ if (value < 0 || value > max) return NPT_ERROR_OVERFLOW;
+ value = 10*value + (c-'0');
+ if (value < 0 && (!negative || value != NPT_INT64_MIN)) return NPT_ERROR_OVERFLOW;
+ empty = false;
+ if (chars_used) (*chars_used)++;
+ } else {
+ if (relaxed) {
+ break;
+ } else {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ }
+ }
+
+ // check that the value was non empty
+ if (empty) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // return the result
+ result = negative ? -value : value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ParseInteger64
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseInteger64(const char* str, NPT_UInt64& result, bool relaxed, NPT_Cardinal* chars_used)
+{
+ // safe default value
+ result = 0;
+ if (chars_used) *chars_used = 0;
+
+ if (str == NULL) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // ignore leading whitespace
+ if (relaxed) {
+ while (*str == ' ' || *str == '\t') {
+ str++;
+ if (chars_used) (*chars_used)++;
+ }
+ }
+ if (*str == '\0') {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // parse the digits
+ bool empty = true;
+ NPT_UInt64 value = 0;
+ char c;
+ while ((c = *str++)) {
+ if (c >= '0' && c <= '9') {
+ NPT_UInt64 new_value;
+ if (value > NPT_UINT64_MAX/10) return NPT_ERROR_OVERFLOW;
+ new_value = 10*value + (c-'0');
+ if (new_value < value) return NPT_ERROR_OVERFLOW;
+ value = new_value;
+ empty = false;
+ if (chars_used) (*chars_used)++;
+ } else {
+ if (relaxed) {
+ break;
+ } else {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ }
+ }
+
+ // check that the value was non empty
+ if (empty) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // return the result
+ result = value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ParseInteger32
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseInteger32(const char* str, NPT_Int32& value, bool relaxed, NPT_Cardinal* chars_used)
+{
+ NPT_Int64 value_64;
+ NPT_Result result = NPT_ParseInteger64(str, value_64, relaxed, chars_used);
+ value = 0;
+ if (NPT_SUCCEEDED(result)) {
+ if (value_64 < NPT_INT32_MIN || value_64 > NPT_INT32_MAX) {
+ return NPT_ERROR_OVERFLOW;
+ }
+ value = (NPT_Int32)value_64;
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ParseInteger32
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseInteger32(const char* str, NPT_UInt32& value, bool relaxed, NPT_Cardinal* chars_used)
+{
+ NPT_UInt64 value_64;
+ NPT_Result result = NPT_ParseInteger64(str, value_64, relaxed, chars_used);
+ value = 0;
+ if (NPT_SUCCEEDED(result)) {
+ if (value_64 > (NPT_UInt64)NPT_UINT32_MAX) return NPT_ERROR_OVERFLOW;
+ value = (NPT_UInt32)value_64;
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ParseInteger
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseInteger(const char* str, long& value, bool relaxed, NPT_Cardinal* chars_used)
+{
+ NPT_Int64 value_64;
+ NPT_Result result = NPT_ParseInteger64(str, value_64, relaxed, chars_used);
+ value = 0;
+ if (NPT_SUCCEEDED(result)) {
+#if NPT_ULONG_MAX != NPT_UINT64_MAX
+ if (value_64 < NPT_LONG_MIN || value_64 > NPT_LONG_MAX) {
+ return NPT_ERROR_OVERFLOW;
+ }
+#endif
+ value = (long)value_64;
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ParseInteger
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseInteger(const char* str, unsigned long& value, bool relaxed, NPT_Cardinal* chars_used)
+{
+ NPT_UInt64 value_64;
+ NPT_Result result = NPT_ParseInteger64(str, value_64, relaxed, chars_used);
+ value = 0;
+ if (NPT_SUCCEEDED(result)) {
+#if NPT_ULONG_MAX != NPT_UINT64_MAX
+ if (value_64 > NPT_ULONG_MAX) {
+ return NPT_ERROR_OVERFLOW;
+ }
+#endif
+ value = (unsigned long)value_64;
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ParseInteger
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseInteger(const char* str, int& value, bool relaxed, NPT_Cardinal* chars_used)
+{
+ NPT_Int64 value_64;
+ NPT_Result result = NPT_ParseInteger64(str, value_64, relaxed, chars_used);
+ value = 0;
+ if (NPT_SUCCEEDED(result)) {
+ if (value_64 < NPT_INT_MIN || value_64 > NPT_INT_MAX) {
+ return NPT_ERROR_OVERFLOW;
+ }
+ value = (int)value_64;
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ParseInteger
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseInteger(const char* str, unsigned int& value, bool relaxed, NPT_Cardinal* chars_used)
+{
+ NPT_UInt64 value_64;
+ NPT_Result result = NPT_ParseInteger64(str, value_64, relaxed, chars_used);
+ value = 0;
+ if (NPT_SUCCEEDED(result)) {
+ if (value_64 > NPT_UINT_MAX) {
+ return NPT_ERROR_OVERFLOW;
+ }
+ value = (unsigned int)value_64;
+ }
+ return result;
+}
+
+#if !defined(NPT_CONFIG_HAVE_STRCPY)
+/*----------------------------------------------------------------------
+| NPT_CopyString
++---------------------------------------------------------------------*/
+void
+NPT_CopyString(char* dst, const char* src)
+{
+ while(*dst++ = *src++);
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_FormatOutput
++---------------------------------------------------------------------*/
+void
+NPT_FormatOutput(void (*function)(void* parameter, const char* message),
+ void* function_parameter,
+ const char* format,
+ va_list args)
+{
+ char local_buffer[NPT_FORMAT_LOCAL_BUFFER_SIZE];
+ unsigned int buffer_size = NPT_FORMAT_LOCAL_BUFFER_SIZE;
+ char* buffer = local_buffer;
+
+ for(;;) {
+ int result;
+
+ /* try to format the message (it might not fit) */
+ result = NPT_FormatStringVN(buffer, buffer_size-1, format, args);
+ buffer[buffer_size-1] = 0; /* force a NULL termination */
+ if (result >= 0) break;
+
+ /* the buffer was too small, try something bigger */
+ buffer_size = (buffer_size+NPT_FORMAT_BUFFER_INCREMENT)*2;
+ if (buffer_size > NPT_FORMAT_BUFFER_MAX_SIZE) break;
+ if (buffer != local_buffer) delete[] buffer;
+ buffer = new char[buffer_size];
+ if (buffer == NULL) return;
+ }
+
+ (*function)(function_parameter, buffer);
+ if (buffer != local_buffer) delete[] buffer;
+}
+
+/*----------------------------------------------------------------------
+| local types
++---------------------------------------------------------------------*/
+typedef enum {
+ NPT_MIME_PARAMETER_PARSER_STATE_NEED_NAME,
+ NPT_MIME_PARAMETER_PARSER_STATE_IN_NAME,
+ NPT_MIME_PARAMETER_PARSER_STATE_NEED_EQUALS,
+ NPT_MIME_PARAMETER_PARSER_STATE_NEED_VALUE,
+ NPT_MIME_PARAMETER_PARSER_STATE_IN_VALUE,
+ NPT_MIME_PARAMETER_PARSER_STATE_IN_QUOTED_VALUE,
+ NPT_MIME_PARAMETER_PARSER_STATE_NEED_SEPARATOR
+} NPT_MimeParameterParserState;
+
+/*----------------------------------------------------------------------
+| NPT_ParseMimeParameters
+|
+| From RFC 822 and RFC 2045
+|
+| ; ( Octal, Decimal.)
+| CHAR = <any ASCII character> ; ( 0-177, 0.-127.)
+| ALPHA = <any ASCII alphabetic character>
+| ; (101-132, 65.- 90.)
+| ; (141-172, 97.-122.)
+| DIGIT = <any ASCII decimal digit> ; ( 60- 71, 48.- 57.)
+| CTL = <any ASCII control ; ( 0- 37, 0.- 31.)
+| character and DEL> ; ( 177, 127.)
+| CR = <ASCII CR, carriage return> ; ( 15, 13.)
+| LF = <ASCII LF, linefeed> ; ( 12, 10.)
+| SPACE = <ASCII SP, space> ; ( 40, 32.)
+| HTAB = <ASCII HT, horizontal-tab> ; ( 11, 9.)
+| <"> = <ASCII quote mark> ; ( 42, 34.)
+| CRLF = CR LF
+|
+| LWSP-char = SPACE / HTAB ; semantics = SPACE
+|
+| linear-white-space = 1*([CRLF] LWSP-char) ; semantics = SPACE
+| ; CRLF => folding
+|
+| parameter := attribute "=" value
+|
+| attribute := token
+| ; Matching of attributes
+| ; is ALWAYS case-insensitive.
+|
+| value := token / quoted-string
+|
+| token := 1*<any (US-ASCII) CHAR except SPACE, CTLs, or tspecials>
+|
+| tspecials := "(" / ")" / "<" / ">" / "@" /
+| "," / ";" / ":" / "\" / <">
+| "/" / "[" / "]" / "?" / "="
+|
+| quoted-string = <"> *(qtext/quoted-pair) <">; Regular qtext or
+| ; quoted chars.
+|
+| qtext = <any CHAR excepting <">, ; => may be folded
+| "\" & CR, and including
+| linear-white-space>
+|
+| quoted-pair = "\" CHAR ; may quote any char
+|
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseMimeParameters(const char* encoded,
+ NPT_Map<NPT_String, NPT_String>& parameters)
+{
+ // check parameters
+ if (encoded == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // reserve some space
+ NPT_String param_name;
+ NPT_String param_value;
+ param_name.Reserve(64);
+ param_value.Reserve(64);
+
+ NPT_MimeParameterParserState state = NPT_MIME_PARAMETER_PARSER_STATE_NEED_NAME;
+ bool quoted_char = false;
+ for (;;) {
+ char c = *encoded++;
+ if (!quoted_char && (c == 0x0A || c == 0x0D)) continue; // ignore EOL chars
+ switch (state) {
+ case NPT_MIME_PARAMETER_PARSER_STATE_NEED_NAME:
+ if (c == '\0') break; // END
+ if (c == ' ' || c == '\t') continue; // ignore leading whitespace
+ if (c < ' ') return NPT_ERROR_INVALID_SYNTAX; // CTLs are invalid
+ param_name += c; // we're not strict: accept all other chars
+ state = NPT_MIME_PARAMETER_PARSER_STATE_IN_NAME;
+ break;
+
+ case NPT_MIME_PARAMETER_PARSER_STATE_IN_NAME:
+ if (c < ' ') return NPT_ERROR_INVALID_SYNTAX; // END or CTLs are invalid
+ if (c == ' ') {
+ state = NPT_MIME_PARAMETER_PARSER_STATE_NEED_EQUALS;
+ } else if (c == '=') {
+ state = NPT_MIME_PARAMETER_PARSER_STATE_NEED_VALUE;
+ } else {
+ param_name += c; // we're not strict: accept all other chars
+ }
+ break;
+
+ case NPT_MIME_PARAMETER_PARSER_STATE_NEED_EQUALS:
+ if (c < ' ') return NPT_ERROR_INVALID_SYNTAX; // END or CTLs are invalid
+ if (c == ' ' || c == '\t') continue; // ignore leading whitespace
+ if (c != '=') return NPT_ERROR_INVALID_SYNTAX;
+ state = NPT_MIME_PARAMETER_PARSER_STATE_NEED_VALUE;
+ break;
+
+ case NPT_MIME_PARAMETER_PARSER_STATE_NEED_VALUE:
+ if (c < ' ') return NPT_ERROR_INVALID_SYNTAX; // END or CTLs are invalid
+ if (c == ' ' || c == '\t') continue; // ignore leading whitespace
+ if (c == '"') {
+ state = NPT_MIME_PARAMETER_PARSER_STATE_IN_QUOTED_VALUE;
+ } else {
+ param_value += c; // we're not strict: accept all other chars
+ state = NPT_MIME_PARAMETER_PARSER_STATE_IN_VALUE;
+ }
+ break;
+
+ case NPT_MIME_PARAMETER_PARSER_STATE_IN_QUOTED_VALUE:
+ if (quoted_char) {
+ quoted_char = false;
+ if (c == '\0') return NPT_ERROR_INVALID_SYNTAX;
+ param_value += c; // accept all chars
+ break;
+ } else if (c == '\\') {
+ quoted_char = true;
+ break;
+ } else if (c == '"') {
+ // add the parameter to the map
+ param_name.TrimRight();
+ param_value.TrimRight();
+ parameters[param_name] = param_value;
+ param_name.SetLength(0);
+ param_value.SetLength(0);
+ state = NPT_MIME_PARAMETER_PARSER_STATE_NEED_SEPARATOR;
+ } else if (c < ' ') {
+ return NPT_ERROR_INVALID_SYNTAX; // END or CTLs are invalid
+ } else {
+ param_value += c; // we're not strict: accept all other chars
+ }
+ break;
+
+ case NPT_MIME_PARAMETER_PARSER_STATE_IN_VALUE:
+ if (c == '\0' || c == ';') {
+ // add the parameter to the map
+ param_name.TrimRight();
+ param_value.TrimRight();
+ parameters[param_name] = param_value;
+ param_name.SetLength(0);
+ param_value.SetLength(0);
+ state = NPT_MIME_PARAMETER_PARSER_STATE_NEED_NAME;
+ } else if (c < ' ') {
+ // CTLs are invalid
+ return NPT_ERROR_INVALID_SYNTAX;
+ } else {
+ param_value += c; // we're not strict: accept all other chars
+ }
+ break;
+
+ case NPT_MIME_PARAMETER_PARSER_STATE_NEED_SEPARATOR:
+ if (c == '\0') break;
+ if (c < ' ') return NPT_ERROR_INVALID_SYNTAX; // CTLs are invalid
+ if (c == ' ' || c == '\t') continue; // ignore whitespace
+ if (c != ';') return NPT_ERROR_INVALID_SYNTAX;
+ state = NPT_MIME_PARAMETER_PARSER_STATE_NEED_NAME;
+ break;
+ }
+ if (c == '\0') break; // end of buffer
+ }
+
+ return NPT_SUCCESS;
+}
+
+#ifdef TARGET_WINDOWS_STORE
+std::wstring win32ConvertUtf8ToW(const std::string &text)
+{
+ if (text.empty())
+ {
+ return L"";
+ }
+
+ int bufSize = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, text.c_str(), -1, NULL, 0);
+ if (bufSize == 0)
+ return L"";
+ wchar_t *converted = new wchar_t[bufSize];
+ if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, text.c_str(), -1, converted, bufSize) != bufSize)
+ {
+ delete[] converted;
+ return L"";
+ }
+
+ std::wstring Wret(converted);
+ delete[] converted;
+
+ return Wret;
+}
+#endif
diff --git a/lib/libUPnP/Neptune/Source/Core/NptUtils.h b/lib/libUPnP/Neptune/Source/Core/NptUtils.h
new file mode 100644
index 0000000..89b2e29
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptUtils.h
@@ -0,0 +1,235 @@
+/*****************************************************************
+|
+| Neptune Utils
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_UTILS_H_
+#define _NPT_UTILS_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptStrings.h"
+#include "NptMap.h"
+#include "NptDataBuffer.h"
+#include "NptHash.h"
+
+#if defined (NPT_CONFIG_HAVE_STDIO_H)
+#include <stdio.h>
+#endif
+
+#if defined (NPT_CONFIG_HAVE_STRING_H)
+#include <string.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STDARG_H)
+#include <stdarg.h>
+#endif
+
+#if defined(TARGET_WINDOWS_STORE)
+#include <string>
+#endif
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define NPT_ARRAY_SIZE(_a) (sizeof(_a)/sizeof((_a)[0]))
+
+/*----------------------------------------------------------------------
+| byte I/O
++---------------------------------------------------------------------*/
+extern void NPT_BytesFromInt64Be(unsigned char* buffer, NPT_UInt64 value);
+extern void NPT_BytesFromInt32Be(unsigned char* buffer, NPT_UInt32 value);
+extern void NPT_BytesFromInt24Be(unsigned char* buffer, NPT_UInt32 value);
+extern void NPT_BytesFromInt16Be(unsigned char* buffer, NPT_UInt16 value);
+extern NPT_UInt64 NPT_BytesToInt64Be(const unsigned char* buffer);
+extern NPT_UInt32 NPT_BytesToInt32Be(const unsigned char* buffer);
+extern NPT_UInt32 NPT_BytesToInt24Be(const unsigned char* buffer);
+extern NPT_UInt16 NPT_BytesToInt16Be(const unsigned char* buffer);
+
+extern void NPT_BytesFromInt64Le(unsigned char* buffer, NPT_UInt64 value);
+extern void NPT_BytesFromInt32Le(unsigned char* buffer, NPT_UInt32 value);
+extern void NPT_BytesFromInt24Le(unsigned char* buffer, NPT_UInt32 value);
+extern void NPT_BytesFromInt16Le(unsigned char* buffer, NPT_UInt16 value);
+extern NPT_UInt64 NPT_BytesToInt64Le(const unsigned char* buffer);
+extern NPT_UInt32 NPT_BytesToInt32Le(const unsigned char* buffer);
+extern NPT_UInt32 NPT_BytesToInt24Le(const unsigned char* buffer);
+extern NPT_UInt16 NPT_BytesToInt16Le(const unsigned char* buffer);
+
+/*----------------------------------------------------------------------
+| conversion utilities
++---------------------------------------------------------------------*/
+extern NPT_Result
+NPT_ParseFloat(const char* str, float& result, bool relaxed = true);
+
+extern NPT_Result
+NPT_ParseInteger(const char* str, long& result, bool relaxed = true, NPT_Cardinal* chars_used = 0);
+
+extern NPT_Result
+NPT_ParseInteger(const char* str, unsigned long& result, bool relaxed = true, NPT_Cardinal* chars_used = 0);
+
+extern NPT_Result
+NPT_ParseInteger(const char* str, int& result, bool relaxed = true, NPT_Cardinal* chars_used = 0);
+
+extern NPT_Result
+NPT_ParseInteger(const char* str, unsigned int& result, bool relaxed = true, NPT_Cardinal* chars_used = 0);
+
+extern NPT_Result
+NPT_ParseInteger32(const char* str, NPT_Int32& result, bool relaxed = true, NPT_Cardinal* chars_used = 0);
+
+extern NPT_Result
+NPT_ParseInteger32(const char* str, NPT_UInt32& result, bool relaxed = true, NPT_Cardinal* chars_used = 0);
+
+extern NPT_Result
+NPT_ParseInteger64(const char* str, NPT_Int64& result, bool relaxed = true, NPT_Cardinal* chars_used = 0);
+
+extern NPT_Result
+NPT_ParseInteger64(const char* str, NPT_UInt64& result, bool relaxed = true, NPT_Cardinal* chars_used = 0);
+
+/*----------------------------------------------------------------------
+| formatting
++---------------------------------------------------------------------*/
+void
+NPT_FormatOutput(void (*function)(void* parameter, const char* message),
+ void* function_parameter,
+ const char* format,
+ va_list args);
+
+void NPT_ByteToHex(NPT_Byte b, char* buffer, bool uppercase=false);
+NPT_Result NPT_HexToByte(const char* buffer, NPT_Byte& b);
+NPT_Result NPT_HexToBytes(const char* hex, NPT_DataBuffer& bytes);
+NPT_String NPT_HexString(const unsigned char* data,
+ NPT_Size data_size,
+ const char* separator = NULL,
+ bool uppercase=false);
+char NPT_NibbleToHex(unsigned int nibble, bool uppercase = true);
+int NPT_HexToNibble(char hex);
+
+/*----------------------------------------------------------------------
+| parsing
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ParseMimeParameters(const char* encoded,
+ NPT_Map<NPT_String, NPT_String>& parameters);
+
+/*----------------------------------------------------------------------
+| environment variables
++---------------------------------------------------------------------*/
+class NPT_Environment {
+public:
+ static NPT_Result Get(const char* name, NPT_String& value);
+ static NPT_Result Set(const char* name, const char* value);
+};
+// compat for older APIs
+#define NPT_GetEnvironment(_x,_y) NPT_Environment::Get(_x,_y)
+
+/*----------------------------------------------------------------------
+| string utils
++---------------------------------------------------------------------*/
+#if defined (NPT_CONFIG_HAVE_STDIO_H)
+#include <stdio.h>
+#endif
+
+#if defined (NPT_CONFIG_HAVE_STRING_H)
+#include <string.h>
+#endif
+
+#if defined (NPT_CONFIG_HAVE_SNPRINTF)
+#define NPT_FormatString NPT_snprintf
+#else
+int NPT_FormatString(char* str, NPT_Size size, const char* format, ...);
+#endif
+
+#if defined(NPT_CONFIG_HAVE_VSNPRINTF)
+#define NPT_FormatStringVN(s,c,f,a) NPT_vsnprintf(s,c,f,a)
+#else
+extern int NPT_FormatStringVN(char *buffer, size_t count, const char *format, va_list argptr);
+#endif
+
+#if defined(NPT_CONFIG_HAVE_MEMCPY)
+#define NPT_CopyMemory memcpy
+#else
+extern void NPT_CopyMemory(void* dest, void* src, NPT_Size size);
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRCMP)
+#define NPT_StringsEqual(s1, s2) (strcmp((s1), (s2)) == 0)
+#else
+extern int NPT_StringsEqual(const char* s1, const char* s2);
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRNCMP)
+#define NPT_StringsEqualN(s1, s2, n) (strncmp((s1), (s2), (n)) == 0)
+#else
+extern int NPT_StringsEqualN(const char* s1, const char* s2, unsigned long size);
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRLEN)
+#define NPT_StringLength(s) (NPT_Size)(strlen(s))
+#else
+extern unsigned long NPT_StringLength(const char* s);
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRCPY)
+#define NPT_CopyString(dst, src) ((void)NPT_strcpy((dst), (src)))
+#else
+extern void NPT_CopyString(char* dst, const char* src);
+#endif
+
+/**
+ * Copy up to n characters from src to dst.
+ * The destination buffer will be null-terminated, so it must
+ * have enough space for n+1 characters (n from the source plus
+ * the null terminator).
+ */
+#if defined(NPT_CONFIG_HAVE_STRNCPY)
+#define NPT_CopyStringN(dst, src, n) \
+do { ((void)NPT_strncpy((dst), (src), n)); (dst)[(n)] = '\0'; } while(0)
+#else
+extern int NPT_CopyStringN(char* dst, const char* src, unsigned long n);
+#endif
+
+#if defined(NPT_CONFIG_HAVE_MEMSET)
+#define NPT_SetMemory memset
+#else
+extern void NPT_SetMemory(void* dest, int c, NPT_Size size);
+#endif
+
+#if defined(NPT_CONFIG_HAVE_MEMCMP)
+#define NPT_MemoryEqual(s1, s2, n) (memcmp((s1), (s2), (n)) == 0)
+#else
+extern int NPT_MemoryEqual(const void* s1, const void* s2, unsigned long n);
+#endif
+
+#if defined(TARGET_WINDOWS_STORE)
+std::wstring win32ConvertUtf8ToW(const std::string &text);
+#endif
+
+#endif // _NPT_UTILS_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptVersion.h b/lib/libUPnP/Neptune/Source/Core/NptVersion.h
new file mode 100644
index 0000000..ad34d90
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptVersion.h
@@ -0,0 +1,41 @@
+/*****************************************************************
+|
+| Neptune - Version Info
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_VERSION_H_
+#define _NPT_VERSION_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#define NPT_NEPTUNE_VERSION 0x01010300
+#define NPT_NEPTUNE_VERSION_STRING "1.1.3"
+
+#endif // _NPT_VERSION_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptXml.cpp b/lib/libUPnP/Neptune/Source/Core/NptXml.cpp
new file mode 100644
index 0000000..d6b95ca
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptXml.cpp
@@ -0,0 +1,2611 @@
+/*****************************************************************
+|
+| Neptune - Xml Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptXml.h"
+#include "NptUtils.h"
+#include "NptMap.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| local compilation flags
++---------------------------------------------------------------------*/
+//#define NPT_XML_PARSER_DEBUG
+#ifdef NPT_XML_PARSER_DEBUG
+#define NPT_XML_Debug_0(s) NPT_Debug(s)
+#define NPT_XML_Debug_1(s,x0) NPT_Debug(s,x0)
+#define NPT_XML_Debug_2(s,x0,x1) NPT_Debug(s,x0,x1)
+#define NPT_XML_Debug_3(s,x0,x1,x2) NPT_Debug(s,x0,x1,x2)
+#define NPT_XML_Debug_4(s,x0,x1,x2,x3) NPT_Debug(s,x0,x1,x2,x3)
+#else
+#define NPT_XML_Debug_0(s)
+#define NPT_XML_Debug_1(s,x0)
+#define NPT_XML_Debug_2(s,x0,x1)
+#define NPT_XML_Debug_3(s,x0,x1,x2)
+#define NPT_XML_Debug_4(s,x0,x1,x2,x3)
+#endif
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+static const NPT_String
+NPT_XmlNamespaceUri_Xml("http://www.w3.org/XML/1998/namespace");
+
+/*----------------------------------------------------------------------
+| NPT_XmlAttributeFinder
++---------------------------------------------------------------------*/
+class NPT_XmlAttributeFinder
+{
+public:
+ // if 'namespc' is NULL, we're looking for ANY namespace
+ // if 'namespc' is '\0', we're looking for NO namespace
+ // if 'namespc' is non-empty, look for that SPECIFIC namespace
+ NPT_XmlAttributeFinder(const NPT_XmlElementNode& element,
+ const char* name,
+ const char* namespc) :
+ m_Element(element), m_Name(name), m_Namespace(namespc) {}
+
+ bool operator()(const NPT_XmlAttribute* const & attribute) const {
+ if (attribute->m_Name == m_Name) {
+ if (m_Namespace) {
+ const NPT_String& prefix = attribute->GetPrefix();
+ if (m_Namespace[0] == '\0') {
+ // match if the attribute has NO namespace
+ return prefix.IsEmpty();
+ } else {
+ // match if the attribute has the SPECIFIC namespace
+ // we're looking for
+ if (prefix.IsEmpty()) {
+ // attributes without a prefix don't have a namespace
+ return false;
+ } else {
+ const NPT_String* namespc = m_Element.GetNamespaceUri(prefix);
+ return namespc && *namespc == m_Namespace;
+ }
+ }
+ } else {
+ // ANY namespace will match
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+private:
+ const NPT_XmlElementNode& m_Element;
+ const char* m_Name;
+ const char* m_Namespace;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlAttributeFinderWithPrefix
++---------------------------------------------------------------------*/
+class NPT_XmlAttributeFinderWithPrefix
+{
+public:
+ NPT_XmlAttributeFinderWithPrefix(const char* prefix, const char* name) :
+ m_Prefix(prefix?prefix:""), m_Name(name) {}
+
+ bool operator()(const NPT_XmlAttribute* const & attribute) const {
+ return attribute->m_Prefix == m_Prefix && attribute->m_Name == m_Name;
+ }
+
+private:
+ const char* m_Prefix;
+ const char* m_Name;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlTagFinder
++---------------------------------------------------------------------*/
+class NPT_XmlTagFinder
+{
+public:
+ // if 'namespc' is NULL, we're looking for ANY namespace
+ // if 'namespc' is '\0', we're looking for NO namespace
+ // if 'namespc' is non-empty, look for that SPECIFIC namespace
+ NPT_XmlTagFinder(const char* tag, const char* namespc) :
+ m_Tag(tag), m_Namespace(namespc) {}
+
+ bool operator()(const NPT_XmlNode* const & node) const {
+ const NPT_XmlElementNode* element = node->AsElementNode();
+ if (element && element->m_Tag == m_Tag) {
+ if (m_Namespace) {
+ // look for a SPECIFIC namespace or NO namespace
+ const NPT_String* namespc = element->GetNamespace();
+ if (namespc) {
+ // the element has a namespace, match if it is equal to
+ // what we're looking for
+ return *namespc == m_Namespace;
+ } else {
+ // the element does not have a namespace, match if we're
+ // looking for NO namespace
+ return m_Namespace[0] == '\0';
+ }
+ } else {
+ // ANY namespace will match
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+private:
+ const char* m_Tag;
+ const char* m_Namespace;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlTextFinder
++---------------------------------------------------------------------*/
+class NPT_XmlTextFinder
+{
+public:
+ bool operator()(const NPT_XmlNode* const & node) const {
+ return node->AsTextNode() != NULL;
+ }
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlNamespaceCollapser
++---------------------------------------------------------------------*/
+class NPT_XmlNamespaceCollapser
+{
+public:
+ NPT_XmlNamespaceCollapser(NPT_XmlElementNode* element) :
+ m_Root(element) {}
+
+ void operator()(NPT_XmlNode*& node) const {
+ NPT_XmlElementNode* element = node->AsElementNode();
+ if (element == NULL) return;
+
+ // collapse the namespace for this element
+ CollapseNamespace(element, element->GetPrefix());
+
+ // collapse the namespaces for the attributes
+ NPT_List<NPT_XmlAttribute*>::Iterator item = element->GetAttributes().GetFirstItem();
+ while (item) {
+ NPT_XmlAttribute* attribute = *item;
+ CollapseNamespace(element, attribute->GetPrefix());
+ ++item;
+ }
+
+ // recurse to the children
+ element->GetChildren().Apply(*this);
+ }
+
+private:
+ // methods
+ void CollapseNamespace(NPT_XmlElementNode* element, const NPT_String& prefix) const;
+
+ // members
+ NPT_XmlElementNode* m_Root;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlNamespaceCollapser::CollapseNamespace
++---------------------------------------------------------------------*/
+void
+NPT_XmlNamespaceCollapser::CollapseNamespace(NPT_XmlElementNode* element,
+ const NPT_String& prefix) const
+{
+ if (m_Root->m_NamespaceMap == NULL ||
+ (m_Root->m_NamespaceMap->GetNamespaceUri(prefix) == NULL && prefix != "xml")) {
+ // the root element does not have that prefix in the map
+ const NPT_String* uri = element->GetNamespaceUri(prefix);
+ if (uri) m_Root->SetNamespaceUri(prefix, uri->GetChars());
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlAttribute::NPT_XmlAttribute
++---------------------------------------------------------------------*/
+NPT_XmlAttribute::NPT_XmlAttribute(const char* name, const char* value) :
+ m_Value(value)
+{
+ const char* cursor = name;
+ while (char c = *cursor++) {
+ if (c == ':') {
+ unsigned int prefix_length = (unsigned int)(cursor-name)-1;
+ m_Prefix.Assign(name, prefix_length);
+ name = cursor;
+ break;
+ }
+ }
+ m_Name = name;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::NPT_XmlElementNode
++---------------------------------------------------------------------*/
+NPT_XmlElementNode::NPT_XmlElementNode(const char* prefix, const char* tag) :
+ NPT_XmlNode(ELEMENT),
+ m_Prefix(prefix),
+ m_Tag(tag),
+ m_NamespaceMap(NULL),
+ m_NamespaceParent(NULL)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::NPT_XmlElementNode
++---------------------------------------------------------------------*/
+NPT_XmlElementNode::NPT_XmlElementNode(const char* tag) :
+ NPT_XmlNode(ELEMENT),
+ m_NamespaceMap(NULL),
+ m_NamespaceParent(NULL)
+{
+ const char* cursor = tag;
+ while (char c = *cursor++) {
+ if (c == ':') {
+ unsigned int prefix_length = (unsigned int)(cursor-tag)-1;
+ m_Prefix.Assign(tag, prefix_length);
+ tag = cursor;
+ break;
+ }
+ }
+ m_Tag = tag;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::~NPT_XmlElementNode
++---------------------------------------------------------------------*/
+NPT_XmlElementNode::~NPT_XmlElementNode()
+{
+ m_Children.Apply(NPT_ObjectDeleter<NPT_XmlNode>());
+ m_Attributes.Apply(NPT_ObjectDeleter<NPT_XmlAttribute>());
+ delete m_NamespaceMap;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::SetParent
++---------------------------------------------------------------------*/
+void
+NPT_XmlElementNode::SetParent(NPT_XmlNode* parent)
+{
+ // update our parent
+ m_Parent = parent;
+
+ // update out namespace linkage
+ NPT_XmlElementNode* parent_element =
+ parent?parent->AsElementNode():NULL;
+ NPT_XmlElementNode* namespace_parent;
+ if (parent_element) {
+ namespace_parent =
+ parent_element->m_NamespaceMap ?
+ parent_element:
+ parent_element->m_NamespaceParent;
+ } else {
+ namespace_parent = NULL;
+ }
+ if (namespace_parent != m_NamespaceParent) {
+ m_NamespaceParent = namespace_parent;
+ RelinkNamespaceMaps();
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::AddChild
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlElementNode::AddChild(NPT_XmlNode* child)
+{
+ if (child == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+ child->SetParent(this);
+ return m_Children.Add(child);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::GetChild
++---------------------------------------------------------------------*/
+NPT_XmlElementNode*
+NPT_XmlElementNode::GetChild(const char* tag, const char* namespc, NPT_Ordinal n) const
+{
+ // remap the requested namespace to match the semantics of the finder
+ // and allow for "" to also mean NO namespace
+ if (namespc == NULL || namespc[0] == '\0') {
+ namespc = ""; // for the finder, empty string means NO namespace
+ } else if (namespc[0] == '*' && namespc[1] == '\0') {
+ namespc = NULL; // for the finder, NULL means ANY namespace
+ }
+
+ // find the child
+ NPT_List<NPT_XmlNode*>::Iterator item;
+ item = m_Children.Find(NPT_XmlTagFinder(tag, namespc), n);
+ return item?(*item)->AsElementNode():NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::AddAttribute
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlElementNode::AddAttribute(const char* name,
+ const char* value)
+{
+ if (name == NULL || value == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+ return m_Attributes.Add(new NPT_XmlAttribute(name, value));
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::SetAttribute
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlElementNode::SetAttribute(const char* prefix,
+ const char* name,
+ const char* value)
+{
+ if (name == NULL || value == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ /* see if this attribute is already set */
+ NPT_List<NPT_XmlAttribute*>::Iterator attribute;
+ attribute = m_Attributes.Find(NPT_XmlAttributeFinderWithPrefix(prefix, name));
+ if (attribute) {
+ // an attribute with this name and prefix already exists,
+ // change its value
+ (*attribute)->SetValue(value);
+ return NPT_SUCCESS;
+ }
+ return m_Attributes.Add(new NPT_XmlAttribute(prefix, name, value));
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::SetAttribute
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlElementNode::SetAttribute(const char* name, const char* value)
+{
+ return SetAttribute(NULL, name, value);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::GetAttribute
++---------------------------------------------------------------------*/
+const NPT_String*
+NPT_XmlElementNode::GetAttribute(const char* name, const char* namespc) const
+{
+ // remap the requested namespace to match the semantics of the finder
+ // and allow for "" to also mean NO namespace
+ if (namespc == NULL || namespc[0] == '\0') {
+ namespc = ""; // for the finder, empty string means NO namespace
+ } else if (namespc[0] == '*' && namespc[1] == '\0') {
+ namespc = NULL; // for the finder, NULL means ANY namespace
+ }
+
+ // find the attribute
+ NPT_List<NPT_XmlAttribute*>::Iterator attribute;
+ attribute = m_Attributes.Find(NPT_XmlAttributeFinder(*this, name, namespc));
+ if (attribute) {
+ return &(*attribute)->GetValue();
+ } else {
+ return NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::AddText
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlElementNode::AddText(const char* text)
+{
+ return AddChild(new NPT_XmlTextNode(NPT_XmlTextNode::CHARACTER_DATA, text));
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::GetText
++---------------------------------------------------------------------*/
+const NPT_String*
+NPT_XmlElementNode::GetText(NPT_Ordinal n) const
+{
+ NPT_List<NPT_XmlNode*>::Iterator node;
+ node = m_Children.Find(NPT_XmlTextFinder(), n);
+ return node?&(*node)->AsTextNode()->GetString():NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::MakeStandalone
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlElementNode::MakeStandalone()
+{
+ NPT_XmlNamespaceCollapser collapser(this);
+ NPT_XmlNode* node_pointer = this;
+ collapser(node_pointer);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::RelinkNamespaceMaps
++---------------------------------------------------------------------*/
+void
+NPT_XmlElementNode::RelinkNamespaceMaps()
+{
+ // update our children so that they can inherit the right
+ // namespace map
+ NPT_List<NPT_XmlNode*>::Iterator item = m_Children.GetFirstItem();
+ while (item) {
+ NPT_XmlElementNode* element = (*item)->AsElementNode();
+ if (element) {
+ if (m_NamespaceMap) {
+ // we have a map, so our children point to us
+ element->SetNamespaceParent(this);
+ } else {
+ // we don't have a map, so our children point to
+ // where we also point
+ element->SetNamespaceParent(m_NamespaceParent);
+ }
+ }
+ ++item;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::SetNamespaceParent
++---------------------------------------------------------------------*/
+void
+NPT_XmlElementNode::SetNamespaceParent(NPT_XmlElementNode* parent)
+{
+ m_NamespaceParent = parent;
+ RelinkNamespaceMaps();
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::SetNamespaceUri
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlElementNode::SetNamespaceUri(const char* prefix, const char* uri)
+{
+ // ensure that we have a namespace map
+ if (m_NamespaceMap == NULL) {
+ m_NamespaceMap = new NPT_XmlNamespaceMap();
+ RelinkNamespaceMaps();
+ }
+
+ return m_NamespaceMap->SetNamespaceUri(prefix, uri);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::GetNamespaceUri
++---------------------------------------------------------------------*/
+const NPT_String*
+NPT_XmlElementNode::GetNamespaceUri(const char* prefix) const
+{
+ if (m_NamespaceMap) {
+ // look in our namespace map first
+ const NPT_String* namespc = m_NamespaceMap->GetNamespaceUri(prefix);
+ if (namespc) {
+ if (namespc->IsEmpty()) {
+ return NULL;
+ } else {
+ return namespc;
+ }
+ }
+ }
+
+ // look into our parent's namespace map
+ if (m_NamespaceParent) {
+ return m_NamespaceParent->GetNamespaceUri(prefix);
+ } else {
+ // check if this is a well-known namespace
+ if (prefix[0] == 'x' &&
+ prefix[1] == 'm' &&
+ prefix[2] == 'l' &&
+ prefix[3] == '\0') {
+ return &NPT_XmlNamespaceUri_Xml;
+ }
+
+ // not found
+ return NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::GetNamespace
++---------------------------------------------------------------------*/
+const NPT_String*
+NPT_XmlElementNode::GetNamespace() const
+{
+ return GetNamespaceUri(m_Prefix);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode::GetNamespacePrefix
++---------------------------------------------------------------------*/
+const NPT_String*
+NPT_XmlElementNode::GetNamespacePrefix(const char* uri) const
+{
+ NPT_XmlNamespaceMap* namespace_map =
+ m_NamespaceMap?
+ m_NamespaceMap:
+ (m_NamespaceParent?
+ m_NamespaceParent->m_NamespaceMap:
+ NULL);
+
+ if (namespace_map) {
+ return namespace_map->GetNamespacePrefix(uri);
+ } else {
+ return NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlTextNode::NPT_XmlTextNode
++---------------------------------------------------------------------*/
+NPT_XmlTextNode::NPT_XmlTextNode(TokenType token_type, const char* text) :
+ NPT_XmlNode(TEXT),
+ m_TokenType(token_type),
+ m_Text(text)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlAccumulator
++---------------------------------------------------------------------*/
+class NPT_XmlAccumulator {
+public:
+ NPT_XmlAccumulator();
+ ~NPT_XmlAccumulator();
+ void Append(char c);
+ void Append(const char* s);
+ void AppendUTF8(unsigned int c);
+ void Reset() { m_Valid = 0; }
+ const char* GetString();
+ NPT_Size GetSize() const { return m_Valid; }
+ const unsigned char* GetBuffer() const { return m_Buffer; }
+
+private:
+ // methods
+ void Allocate(NPT_Size size);
+
+ // members
+ unsigned char* m_Buffer;
+ NPT_Size m_Allocated;
+ NPT_Size m_Valid;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlAccumulator::NPT_XmlAccumulator
++---------------------------------------------------------------------*/
+NPT_XmlAccumulator::NPT_XmlAccumulator() :
+ m_Buffer(NULL),
+ m_Allocated(0),
+ m_Valid(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlAccumulator::~NPT_XmlAccumulator
++---------------------------------------------------------------------*/
+NPT_XmlAccumulator::~NPT_XmlAccumulator()
+{
+ delete[] m_Buffer;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlAccumulator::Allocate
++---------------------------------------------------------------------*/
+void
+NPT_XmlAccumulator::Allocate(NPT_Size size)
+{
+ // check if we have enough
+ if (m_Allocated >= size) return;
+
+ // compute new size
+ do {
+ m_Allocated = m_Allocated ? m_Allocated * 2 : 32;
+ } while (m_Allocated < size);
+
+ // reallocate
+ unsigned char* new_buffer = new unsigned char[m_Allocated];
+ NPT_CopyMemory(new_buffer, m_Buffer, m_Valid);
+ delete[] m_Buffer;
+ m_Buffer = new_buffer;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlAccumulator::Append
++---------------------------------------------------------------------*/
+inline void
+NPT_XmlAccumulator::Append(char c)
+{
+ NPT_Size needed = m_Valid+1;
+ if (needed > m_Allocated) Allocate(needed);
+ m_Buffer[m_Valid++] = c;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlAccumulator::Append
++---------------------------------------------------------------------*/
+void
+NPT_XmlAccumulator::Append(const char* s)
+{
+ char c;
+ while ((c = *s++)) Append(c);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlAccumulator::AppendUTF8
++---------------------------------------------------------------------*/
+inline void
+NPT_XmlAccumulator::AppendUTF8(unsigned int c)
+{
+ NPT_Size needed = m_Valid+4; // allocate 4 more chars
+ if (needed > m_Allocated) Allocate(needed);
+
+ if (c <= 0x7F) {
+ // 000000-00007F -> 1 char = 0xxxxxxx
+ m_Buffer[m_Valid++] = (char)c;
+ } else if (c <= 0x7FF) {
+ // 000080-0007FF -> 2 chars = 110zzzzx 10xxxxxx
+ m_Buffer[m_Valid++] = 0xC0|(c>>6 );
+ m_Buffer[m_Valid++] = 0x80|(c&0x3F);
+ } else if (c <= 0xFFFF) {
+ // 000800-00FFFF -> 3 chars = 1110zzzz 10zxxxxx 10xxxxxx
+ m_Buffer[m_Valid++] = 0xE0| (c>>12 );
+ m_Buffer[m_Valid++] = 0x80|((c&0xFC0)>>6);
+ m_Buffer[m_Valid++] = 0x80| (c&0x3F );
+ } else if (c <= 0x10FFFF) {
+ // 010000-10FFFF -> 4 chars = 11110zzz 10zzxxxx 10xxxxxx 10xxxxxx
+ m_Buffer[m_Valid++] = 0xF0| (c>>18 );
+ m_Buffer[m_Valid++] = 0x80|((c&0x3F000)>>12);
+ m_Buffer[m_Valid++] = 0x80|((c&0xFC0 )>> 6);
+ m_Buffer[m_Valid++] = 0x80| (c&0x3F );
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlAccumulator::GetString
++---------------------------------------------------------------------*/
+inline const char*
+NPT_XmlAccumulator::GetString()
+{
+ // ensure that the buffer is NULL terminated
+ Allocate(m_Valid+1);
+ m_Buffer[m_Valid] = '\0';
+ return (const char*)m_Buffer;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlNamespaceMap::~NPT_XmlNamespaceMap
++---------------------------------------------------------------------*/
+NPT_XmlNamespaceMap::~NPT_XmlNamespaceMap()
+{
+ m_Entries.Apply(NPT_ObjectDeleter<Entry>());
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlNamespaceMap::SetNamespaceUri
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlNamespaceMap::SetNamespaceUri(const char* prefix, const char* uri)
+{
+ NPT_List<Entry*>::Iterator item = m_Entries.GetFirstItem();
+ while (item) {
+ if ((*item)->m_Prefix == prefix) {
+ // the prefix is already in the map, update the value
+ (*item)->m_Uri = uri;
+ return NPT_SUCCESS;
+ }
+ ++item;
+ }
+
+ // the prefix is not in the map, add it
+ return m_Entries.Add(new Entry(prefix, uri));
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlNamespaceMap::GetNamespaceUri
++---------------------------------------------------------------------*/
+const NPT_String*
+NPT_XmlNamespaceMap::GetNamespaceUri(const char* prefix)
+{
+ NPT_List<Entry*>::Iterator item = m_Entries.GetFirstItem();
+ while (item) {
+ if ((*item)->m_Prefix == prefix) {
+ // match
+ return &(*item)->m_Uri;
+ }
+ ++item;
+ }
+
+ // the prefix is not in the map
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlNamespaceMap::GetNamespacePrefix
++---------------------------------------------------------------------*/
+const NPT_String*
+NPT_XmlNamespaceMap::GetNamespacePrefix(const char* uri)
+{
+ NPT_List<Entry*>::Iterator item = m_Entries.GetFirstItem();
+ while (item) {
+ if ((*item)->m_Uri == uri) {
+ // match
+ return &(*item)->m_Prefix;
+ }
+ ++item;
+ }
+
+ // the uri is not in the map
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| character map
+|
+| flags:
+| 1 --> any char
+| 2 --> whitespace
+| 4 --> name
+| 8 --> content
+| 16 --> value
++---------------------------------------------------------------------*/
+#define NPT_XML_USE_CHAR_MAP
+#if defined(NPT_XML_USE_CHAR_MAP)
+// NOTE: this table is generated by the ruby script 'XmlCharMap.rb'
+static const unsigned char NPT_XmlCharMap[256] = {
+ 0, // 0 0x00
+ 0, // 1 0x01
+ 0, // 2 0x02
+ 0, // 3 0x03
+ 0, // 4 0x04
+ 0, // 5 0x05
+ 0, // 6 0x06
+ 0, // 7 0x07
+ 0, // 8 0x08
+ 1|2|8|16, // 9 0x09
+ 1|2|8|16, // 10 0x0a
+ 0, // 11 0x0b
+ 0, // 12 0x0c
+ 1|2|8|16, // 13 0x0d
+ 0, // 14 0x0e
+ 0, // 15 0x0f
+ 0, // 16 0x10
+ 0, // 17 0x11
+ 0, // 18 0x12
+ 0, // 19 0x13
+ 0, // 20 0x14
+ 0, // 21 0x15
+ 0, // 22 0x16
+ 0, // 23 0x17
+ 0, // 24 0x18
+ 0, // 25 0x19
+ 0, // 26 0x1a
+ 0, // 27 0x1b
+ 0, // 28 0x1c
+ 0, // 29 0x1d
+ 0, // 30 0x1e
+ 0, // 31 0x1f
+ 1|2|8|16, // 32 0x20 ' '
+ 1|8|16, // 33 0x21 '!'
+ 1|8|16, // 34 0x22 '"'
+ 1|8|16, // 35 0x23 '#'
+ 1|8|16, // 36 0x24 '$'
+ 1|8|16, // 37 0x25 '%'
+ 1, // 38 0x26 '&'
+ 1|8|16, // 39 0x27 '''
+ 1|8|16, // 40 0x28 '('
+ 1|8|16, // 41 0x29 ')'
+ 1|8|16, // 42 0x2a '*'
+ 1|8|16, // 43 0x2b '+'
+ 1|8|16, // 44 0x2c ','
+ 1|4|8|16, // 45 0x2d '-'
+ 1|4|8|16, // 46 0x2e '.'
+ 1|8|16, // 47 0x2f '/'
+ 1|4|8|16, // 48 0x30 '0'
+ 1|4|8|16, // 49 0x31 '1'
+ 1|4|8|16, // 50 0x32 '2'
+ 1|4|8|16, // 51 0x33 '3'
+ 1|4|8|16, // 52 0x34 '4'
+ 1|4|8|16, // 53 0x35 '5'
+ 1|4|8|16, // 54 0x36 '6'
+ 1|4|8|16, // 55 0x37 '7'
+ 1|4|8|16, // 56 0x38 '8'
+ 1|4|8|16, // 57 0x39 '9'
+ 1|4|8|16, // 58 0x3a ':'
+ 1|8|16, // 59 0x3b ';'
+ 1, // 60 0x3c '<'
+ 1|8|16, // 61 0x3d '='
+ 1|8|16, // 62 0x3e '>'
+ 1|8|16, // 63 0x3f '?'
+ 1|8|16, // 64 0x40 '@'
+ 1|4|8|16, // 65 0x41 'A'
+ 1|4|8|16, // 66 0x42 'B'
+ 1|4|8|16, // 67 0x43 'C'
+ 1|4|8|16, // 68 0x44 'D'
+ 1|4|8|16, // 69 0x45 'E'
+ 1|4|8|16, // 70 0x46 'F'
+ 1|4|8|16, // 71 0x47 'G'
+ 1|4|8|16, // 72 0x48 'H'
+ 1|4|8|16, // 73 0x49 'I'
+ 1|4|8|16, // 74 0x4a 'J'
+ 1|4|8|16, // 75 0x4b 'K'
+ 1|4|8|16, // 76 0x4c 'L'
+ 1|4|8|16, // 77 0x4d 'M'
+ 1|4|8|16, // 78 0x4e 'N'
+ 1|4|8|16, // 79 0x4f 'O'
+ 1|4|8|16, // 80 0x50 'P'
+ 1|4|8|16, // 81 0x51 'Q'
+ 1|4|8|16, // 82 0x52 'R'
+ 1|4|8|16, // 83 0x53 'S'
+ 1|4|8|16, // 84 0x54 'T'
+ 1|4|8|16, // 85 0x55 'U'
+ 1|4|8|16, // 86 0x56 'V'
+ 1|4|8|16, // 87 0x57 'W'
+ 1|4|8|16, // 88 0x58 'X'
+ 1|4|8|16, // 89 0x59 'Y'
+ 1|4|8|16, // 90 0x5a 'Z'
+ 1|8|16, // 91 0x5b '['
+ 1|8|16, // 92 0x5c '\'
+ 1|8|16, // 93 0x5d ']'
+ 1|8|16, // 94 0x5e '^'
+ 1|4|8|16, // 95 0x5f '_'
+ 1|8|16, // 96 0x60 '`'
+ 1|4|8|16, // 97 0x61 'a'
+ 1|4|8|16, // 98 0x62 'b'
+ 1|4|8|16, // 99 0x63 'c'
+ 1|4|8|16, // 100 0x64 'd'
+ 1|4|8|16, // 101 0x65 'e'
+ 1|4|8|16, // 102 0x66 'f'
+ 1|4|8|16, // 103 0x67 'g'
+ 1|4|8|16, // 104 0x68 'h'
+ 1|4|8|16, // 105 0x69 'i'
+ 1|4|8|16, // 106 0x6a 'j'
+ 1|4|8|16, // 107 0x6b 'k'
+ 1|4|8|16, // 108 0x6c 'l'
+ 1|4|8|16, // 109 0x6d 'm'
+ 1|4|8|16, // 110 0x6e 'n'
+ 1|4|8|16, // 111 0x6f 'o'
+ 1|4|8|16, // 112 0x70 'p'
+ 1|4|8|16, // 113 0x71 'q'
+ 1|4|8|16, // 114 0x72 'r'
+ 1|4|8|16, // 115 0x73 's'
+ 1|4|8|16, // 116 0x74 't'
+ 1|4|8|16, // 117 0x75 'u'
+ 1|4|8|16, // 118 0x76 'v'
+ 1|4|8|16, // 119 0x77 'w'
+ 1|4|8|16, // 120 0x78 'x'
+ 1|4|8|16, // 121 0x79 'y'
+ 1|4|8|16, // 122 0x7a 'z'
+ 1|8|16, // 123 0x7b '{'
+ 1|8|16, // 124 0x7c '|'
+ 1|8|16, // 125 0x7d '}'
+ 1|8|16, // 126 0x7e '~'
+ 1|8|16, // 127 0x7f
+ 1|8|16, // 128 0x80
+ 1|8|16, // 129 0x81
+ 1|8|16, // 130 0x82
+ 1|8|16, // 131 0x83
+ 1|8|16, // 132 0x84
+ 1|8|16, // 133 0x85
+ 1|8|16, // 134 0x86
+ 1|8|16, // 135 0x87
+ 1|8|16, // 136 0x88
+ 1|8|16, // 137 0x89
+ 1|8|16, // 138 0x8a
+ 1|8|16, // 139 0x8b
+ 1|8|16, // 140 0x8c
+ 1|8|16, // 141 0x8d
+ 1|8|16, // 142 0x8e
+ 1|8|16, // 143 0x8f
+ 1|8|16, // 144 0x90
+ 1|8|16, // 145 0x91
+ 1|8|16, // 146 0x92
+ 1|8|16, // 147 0x93
+ 1|8|16, // 148 0x94
+ 1|8|16, // 149 0x95
+ 1|8|16, // 150 0x96
+ 1|8|16, // 151 0x97
+ 1|8|16, // 152 0x98
+ 1|8|16, // 153 0x99
+ 1|8|16, // 154 0x9a
+ 1|8|16, // 155 0x9b
+ 1|8|16, // 156 0x9c
+ 1|8|16, // 157 0x9d
+ 1|8|16, // 158 0x9e
+ 1|8|16, // 159 0x9f
+ 1|8|16, // 160 0xa0
+ 1|8|16, // 161 0xa1
+ 1|8|16, // 162 0xa2
+ 1|8|16, // 163 0xa3
+ 1|8|16, // 164 0xa4
+ 1|8|16, // 165 0xa5
+ 1|8|16, // 166 0xa6
+ 1|8|16, // 167 0xa7
+ 1|8|16, // 168 0xa8
+ 1|8|16, // 169 0xa9
+ 1|8|16, // 170 0xaa
+ 1|8|16, // 171 0xab
+ 1|8|16, // 172 0xac
+ 1|8|16, // 173 0xad
+ 1|8|16, // 174 0xae
+ 1|8|16, // 175 0xaf
+ 1|8|16, // 176 0xb0
+ 1|8|16, // 177 0xb1
+ 1|8|16, // 178 0xb2
+ 1|8|16, // 179 0xb3
+ 1|8|16, // 180 0xb4
+ 1|8|16, // 181 0xb5
+ 1|8|16, // 182 0xb6
+ 1|8|16, // 183 0xb7
+ 1|8|16, // 184 0xb8
+ 1|8|16, // 185 0xb9
+ 1|8|16, // 186 0xba
+ 1|8|16, // 187 0xbb
+ 1|8|16, // 188 0xbc
+ 1|8|16, // 189 0xbd
+ 1|8|16, // 190 0xbe
+ 1|8|16, // 191 0xbf
+ 1|4|8|16, // 192 0xc0
+ 1|4|8|16, // 193 0xc1
+ 1|4|8|16, // 194 0xc2
+ 1|4|8|16, // 195 0xc3
+ 1|4|8|16, // 196 0xc4
+ 1|4|8|16, // 197 0xc5
+ 1|4|8|16, // 198 0xc6
+ 1|4|8|16, // 199 0xc7
+ 1|4|8|16, // 200 0xc8
+ 1|4|8|16, // 201 0xc9
+ 1|4|8|16, // 202 0xca
+ 1|4|8|16, // 203 0xcb
+ 1|4|8|16, // 204 0xcc
+ 1|4|8|16, // 205 0xcd
+ 1|4|8|16, // 206 0xce
+ 1|4|8|16, // 207 0xcf
+ 1|4|8|16, // 208 0xd0
+ 1|4|8|16, // 209 0xd1
+ 1|4|8|16, // 210 0xd2
+ 1|4|8|16, // 211 0xd3
+ 1|4|8|16, // 212 0xd4
+ 1|4|8|16, // 213 0xd5
+ 1|4|8|16, // 214 0xd6
+ 1|8|16, // 215 0xd7
+ 1|4|8|16, // 216 0xd8
+ 1|4|8|16, // 217 0xd9
+ 1|4|8|16, // 218 0xda
+ 1|4|8|16, // 219 0xdb
+ 1|4|8|16, // 220 0xdc
+ 1|4|8|16, // 221 0xdd
+ 1|4|8|16, // 222 0xde
+ 1|4|8|16, // 223 0xdf
+ 1|4|8|16, // 224 0xe0
+ 1|4|8|16, // 225 0xe1
+ 1|4|8|16, // 226 0xe2
+ 1|4|8|16, // 227 0xe3
+ 1|4|8|16, // 228 0xe4
+ 1|4|8|16, // 229 0xe5
+ 1|4|8|16, // 230 0xe6
+ 1|4|8|16, // 231 0xe7
+ 1|4|8|16, // 232 0xe8
+ 1|4|8|16, // 233 0xe9
+ 1|4|8|16, // 234 0xea
+ 1|4|8|16, // 235 0xeb
+ 1|4|8|16, // 236 0xec
+ 1|4|8|16, // 237 0xed
+ 1|4|8|16, // 238 0xee
+ 1|4|8|16, // 239 0xef
+ 1|4|8|16, // 240 0xf0
+ 1|4|8|16, // 241 0xf1
+ 1|4|8|16, // 242 0xf2
+ 1|4|8|16, // 243 0xf3
+ 1|4|8|16, // 244 0xf4
+ 1|4|8|16, // 245 0xf5
+ 1|4|8|16, // 246 0xf6
+ 1|8|16, // 247 0xf7
+ 1|4|8|16, // 248 0xf8
+ 1|4|8|16, // 249 0xf9
+ 1|4|8|16, // 250 0xfa
+ 1|4|8|16, // 251 0xfb
+ 1|4|8|16, // 252 0xfc
+ 1|4|8|16, // 253 0xfd
+ 1|4|8|16, // 254 0xfe
+ 1|4|8|16 // 255 0xff
+};
+#endif // defined(NPT_XML_USE_CHAR_MAP)
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#if defined (NPT_XML_USE_CHAR_MAP)
+#define NPT_XML_CHAR_IS_ANY_CHAR(c) (NPT_XmlCharMap[c] & 1)
+#define NPT_XML_CHAR_IS_WHITESPACE(c) (NPT_XmlCharMap[c] & 2)
+#define NPT_XML_CHAR_IS_NAME_CHAR(c) (NPT_XmlCharMap[c] & 4)
+#define NPT_XML_CHAR_IS_ENTITY_REF_CHAR(c) (NPT_XML_CHAR_IS_NAME_CHAR((c)) || ((c) == '#'))
+#define NPT_XML_CHAR_IS_CONTENT_CHAR(c) (NPT_XmlCharMap[c] & 8)
+#define NPT_XML_CHAR_IS_VALUE_CHAR(c) (NPT_XmlCharMap[c] & 16)
+#else
+#define NPT_XML_CHAR_IS_WHITESPACE(c) \
+((c) == ' ' || (c) == '\t' || (c) == 0x0D || (c) == 0x0A)
+
+#define NPT_XML_CHAR_IS_ANY_CHAR(c) \
+(NPT_XML_CHAR_IS_WHITESPACE((c)) || ((c) >= 0x20))
+
+#define NPT_XML_CHAR_IS_DIGIT(c) \
+((c) >= '0' && (c) <= '9')
+
+#define NPT_XML_CHAR_IS_LETTER(c) \
+(((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z') || ((c) >= 0xC0 && (c) <= 0xD6) || ((c) >= 0xD8 && (c) <= 0xF6) || ((c) >= 0xF8))
+
+#define NPT_XML_CHAR_IS_NAME_CHAR(c) \
+(NPT_XML_CHAR_IS_DIGIT((c)) || NPT_XML_CHAR_IS_LETTER((c)) || (c) == '.' || (c) == '-' || (c) == '_' || (c) == ':')
+
+#define NPT_XML_CHAR_IS_ENTITY_REF_CHAR(c) \
+(NPT_XML_CHAR_IS_NAME_CHAR((c)) || ((c) == '#'))
+
+#define NPT_XML_CHAR_IS_CONTENT_CHAR(c) \
+(NPT_XML_CHAR_IS_ANY_CHAR((c)) && ((c) != '&') && ((c) != '<'))
+
+#define NPT_XML_CHAR_IS_VALUE_CHAR(c) \
+(NPT_XML_CHAR_IS_ANY_CHAR((c)) && ((c) != '&') && ((c) != '<'))
+
+#endif // defined(NPT_XML_USE_CHAR_MAP)
+
+/*----------------------------------------------------------------------
+| NPT_XmlStringIsWhitespace
++---------------------------------------------------------------------*/
+static bool
+NPT_XmlStringIsWhitespace(const char* s, NPT_Size size)
+{
+ for (NPT_Size x=0; x<size; x++) {
+ if (!NPT_XML_CHAR_IS_WHITESPACE((int)s[x])) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlProcessor class
++---------------------------------------------------------------------*/
+class NPT_XmlProcessor {
+public:
+ // constructor and destructor
+ NPT_XmlProcessor(NPT_XmlParser* parser);
+
+ // methods
+ NPT_Result ProcessBuffer(const char* buffer, NPT_Size size);
+ void Reset();
+
+private:
+ // types
+ typedef enum {
+ CONTEXT_NONE,
+ CONTEXT_OPEN_TAG,
+ CONTEXT_CLOSE_TAG,
+ CONTEXT_ATTRIBUTE,
+ CONTEXT_VALUE_SINGLE_QUOTE,
+ CONTEXT_VALUE_DOUBLE_QUOTE
+ } Context;
+
+ typedef enum {
+ STATE_IN_INIT,
+ STATE_IN_BOM_EF,
+ STATE_IN_BOM_BB,
+ STATE_IN_WHITESPACE,
+ STATE_IN_NAME,
+ STATE_IN_NAME_SPECIAL,
+ STATE_IN_VALUE_START,
+ STATE_IN_VALUE,
+ STATE_IN_TAG_START,
+ STATE_IN_EMPTY_TAG_END,
+ STATE_IN_CONTENT,
+ STATE_IN_PROCESSING_INSTRUCTION_START,
+ STATE_IN_PROCESSING_INSTRUCTION,
+ STATE_IN_PROCESSING_INSTRUCTION_END,
+ STATE_IN_COMMENT,
+ STATE_IN_COMMENT_END_1,
+ STATE_IN_COMMENT_END_2,
+ STATE_IN_DTD,
+ STATE_IN_DTD_MARKUP_DECL,
+ STATE_IN_DTD_MARKUP_DECL_END,
+ STATE_IN_CDATA,
+ STATE_IN_CDATA_END_1,
+ STATE_IN_CDATA_END_2,
+ STATE_IN_SPECIAL,
+ STATE_IN_ENTITY_REF
+ } State;
+
+ // members
+ NPT_XmlParser* m_Parser;
+ State m_State;
+ Context m_Context;
+ bool m_SkipNewline;
+ NPT_XmlAccumulator m_Name;
+ NPT_XmlAccumulator m_Value;
+ NPT_XmlAccumulator m_Text;
+ NPT_XmlAccumulator m_Entity;
+
+ // methods
+#ifdef NPT_XML_PARSER_DEBUG
+ const char* StateName(State state) {
+ switch (state) {
+ case STATE_IN_INIT: return "IN_INIT";
+ case STATE_IN_BOM_EF: return "IN_BOM_EF";
+ case STATE_IN_BOM_BB: return "IN_BOM_BB";
+ case STATE_IN_WHITESPACE: return "IN_WHITESPACE";
+ case STATE_IN_NAME: return "IN_NAME";
+ case STATE_IN_NAME_SPECIAL: return "IN_NAME_SPECIAL";
+ case STATE_IN_VALUE_START: return "IN_VALUE_START";
+ case STATE_IN_VALUE: return "IN_VALUE";
+ case STATE_IN_TAG_START: return "IN_TAG_START";
+ case STATE_IN_EMPTY_TAG_END: return "IN_EMPTY_TAG_END";
+ case STATE_IN_CONTENT: return "IN_CONTENT";
+ case STATE_IN_PROCESSING_INSTRUCTION_START: return "IN_PROCESSING_INSTRUCTION_START";
+ case STATE_IN_PROCESSING_INSTRUCTION: return "IN_PROCESSING_INSTRUCTION";
+ case STATE_IN_PROCESSING_INSTRUCTION_END: return "IN_PROCESSING_INSTRUCTION_END";
+ case STATE_IN_COMMENT: return "IN_COMMENT";
+ case STATE_IN_COMMENT_END_1: return "IN_COMMENT_END_1";
+ case STATE_IN_COMMENT_END_2: return "IN_COMMENT_END_2";
+ case STATE_IN_DTD: return "IN_DTD";
+ case STATE_IN_DTD_MARKUP_DECL: return "IN_DTD_MARKUP_DECL";
+ case STATE_IN_DTD_MARKUP_DECL_END: return "IN_DTD_MARKUP_DECL_END";
+ case STATE_IN_CDATA: return "IN_CDATA";
+ case STATE_IN_CDATA_END_1: return "IN_CDATA_END_1";
+ case STATE_IN_CDATA_END_2: return "IN_CDATA_END_2";
+ case STATE_IN_SPECIAL: return "IN_SPECIAL";
+ case STATE_IN_ENTITY_REF: return "IN_ENTITY_REF";
+ }
+ return "UNKNOWN";
+ }
+
+ const char* ContextName(Context context) {
+ switch (context) {
+ case CONTEXT_NONE: return "NONE";
+ case CONTEXT_OPEN_TAG: return "OPEN_TAG";
+ case CONTEXT_CLOSE_TAG: return "CLOSE_TAG";
+ case CONTEXT_ATTRIBUTE: return "ATTRIBUTE";
+ case CONTEXT_VALUE_SINGLE_QUOTE: return "VALUE_SINGLE_QUOTE";
+ case CONTEXT_VALUE_DOUBLE_QUOTE: return "VALUE_DOUBLE_QUOTE";
+ }
+ return "UNKNOWN";
+ }
+#endif /* NPT_XML_PARSER_DEBUG */
+
+ inline void SetState(State state) {
+ NPT_XML_Debug_3("\nstate transition: %s to %s [ctx=%s]\n",
+ StateName(m_State),
+ StateName(state),
+ ContextName(m_Context));
+ m_State = state;
+ }
+
+ inline void SetState(State state, Context context) {
+ NPT_XML_Debug_4("\nstate transition: %s [ctx=%s] to %s [ctx=%s]\n",
+ StateName(m_State),
+ ContextName(m_Context),
+ StateName(state),
+ ContextName(context));
+ m_State = state;
+ m_Context = context;
+ }
+
+ NPT_Result ResolveEntity(NPT_XmlAccumulator& source,
+ NPT_XmlAccumulator& destination);
+ NPT_Result FlushPendingText();
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlProcessor::NPT_XmlProcessor
++---------------------------------------------------------------------*/
+NPT_XmlProcessor::NPT_XmlProcessor(NPT_XmlParser* parser) :
+ m_Parser(parser),
+ m_State(STATE_IN_INIT),
+ m_Context(CONTEXT_NONE),
+ m_SkipNewline(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlProcessor::Reset
++---------------------------------------------------------------------*/
+void
+NPT_XmlProcessor::Reset()
+{
+ m_State = STATE_IN_INIT;
+ m_Context = CONTEXT_NONE;
+ m_SkipNewline = false;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlProcessor::ResolveEntity
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlProcessor::ResolveEntity(NPT_XmlAccumulator& source,
+ NPT_XmlAccumulator& destination)
+{
+ const char* entity = (const char*)source.GetString();
+
+ if (NPT_StringsEqual(entity, "lt")) {
+ destination.Append('<');
+ } else if (NPT_StringsEqual(entity, "gt")) {
+ destination.Append('>');
+ } else if (NPT_StringsEqual(entity, "amp")) {
+ destination.Append('&');
+ } else if (NPT_StringsEqual(entity, "quot")) {
+ destination.Append('"');
+ } else if (NPT_StringsEqual(entity, "apos")) {
+ destination.Append('\'');
+ } else if (entity[0] == '#') {
+ int i=1;
+ int base = 10;
+ if (entity[1] == 'x') {
+ i++;
+ base = 16;
+ }
+ int parsed = 0;
+ while (char c = entity[i++]) {
+ int digit = -1;
+ if (c>='0' && c<='9') {
+ digit = c-'0';
+ } else if (base == 16) {
+ if (c >= 'a' && c <= 'f') {
+ digit = 10+c-'a';
+ } else if (c >= 'A' && c <= 'F') {
+ digit = 10+c-'A';
+ }
+ }
+ if (digit == -1) {
+ // invalid char, leave the entity unparsed
+ destination.Append(source.GetString());
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ parsed = base*parsed+digit;
+ }
+ destination.AppendUTF8(parsed);
+ } else {
+ // unknown entity, leave as-is
+ destination.Append(source.GetString());
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlProcessor::FlushPendingText
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlProcessor::FlushPendingText()
+{
+ if (m_Text.GetSize() > 0) {
+ NPT_CHECK(m_Parser->OnCharacterData(m_Text.GetString(),
+ m_Text.GetSize()));
+ m_Text.Reset();
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlProcessor::ProcessBuffer
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlProcessor::ProcessBuffer(const char* buffer, NPT_Size size)
+{
+ unsigned char c;
+
+ while (size-- && (c = *buffer++)) {
+ NPT_XML_Debug_1("[%c]", (c == '\n' || c == '\r') ? '#' : c);
+
+ // normalize line ends
+ if (m_SkipNewline) {
+ m_SkipNewline = false;
+ if (c == '\n') continue;
+ }
+ if (c == '\r') {
+ m_SkipNewline = true;
+ c = '\n';
+ }
+
+ // process the character
+ switch (m_State) {
+ case STATE_IN_INIT:
+ if (NPT_XML_CHAR_IS_WHITESPACE(c)) {
+ SetState(STATE_IN_WHITESPACE);
+ break;
+ } else if (c == '<') {
+ SetState(STATE_IN_TAG_START);
+ break;
+ } else if (c == 0xEF) {
+ SetState(STATE_IN_BOM_EF);
+ break;
+ }
+ return NPT_ERROR_INVALID_SYNTAX;
+
+ case STATE_IN_BOM_EF:
+ if (c == 0xBB) {
+ SetState(STATE_IN_BOM_BB);
+ break;
+ }
+ return NPT_ERROR_INVALID_SYNTAX;
+
+ case STATE_IN_BOM_BB:
+ if (c == 0xBF) {
+ SetState(STATE_IN_WHITESPACE);
+ break;
+ }
+ return NPT_ERROR_INVALID_SYNTAX;
+
+ case STATE_IN_WHITESPACE:
+ if (NPT_XML_CHAR_IS_WHITESPACE(c)) break;
+ switch (m_Context) {
+ case CONTEXT_NONE:
+ if (c == '<') {
+ SetState(STATE_IN_TAG_START);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case CONTEXT_ATTRIBUTE:
+ if (c == '/') {
+ SetState(STATE_IN_EMPTY_TAG_END, CONTEXT_NONE);
+ } else if (c == '>') {
+ SetState(STATE_IN_CONTENT, CONTEXT_NONE);
+ } else if (NPT_XML_CHAR_IS_NAME_CHAR(c)) {
+ m_Name.Reset();
+ m_Name.Append(c);
+ SetState(STATE_IN_NAME);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case CONTEXT_CLOSE_TAG:
+ if (c == '>') {
+ NPT_CHECK(FlushPendingText());
+ NPT_CHECK(m_Parser->OnEndElement(m_Name.GetString()));
+ SetState(STATE_IN_CONTENT, CONTEXT_NONE);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ default:
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_NAME:
+ if (NPT_XML_CHAR_IS_NAME_CHAR(c)) {
+ m_Name.Append(c);
+ break;
+ }
+ switch (m_Context) {
+ case CONTEXT_ATTRIBUTE:
+ if (c == '=') {
+ m_Value.Reset();
+ SetState(STATE_IN_VALUE_START);
+ } else if (!NPT_XML_CHAR_IS_WHITESPACE(c)) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case CONTEXT_OPEN_TAG:
+ if (c == '>' || c == '/' || NPT_XML_CHAR_IS_WHITESPACE(c)) {
+ NPT_CHECK(FlushPendingText());
+ NPT_CHECK(m_Parser->OnStartElement(m_Name.GetString()));
+ m_Name.Reset();
+ if (c == '>') {
+ SetState(STATE_IN_CONTENT, CONTEXT_NONE);
+ } else if (c == '/') {
+ SetState(STATE_IN_EMPTY_TAG_END);
+ } else {
+ SetState(STATE_IN_WHITESPACE, CONTEXT_ATTRIBUTE);
+ }
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case CONTEXT_CLOSE_TAG:
+ if (c == '>') {
+ NPT_CHECK(FlushPendingText());
+ NPT_CHECK(m_Parser->OnEndElement(m_Name.GetString()));
+ SetState(STATE_IN_CONTENT, CONTEXT_NONE);
+ } else if (NPT_XML_CHAR_IS_WHITESPACE(c)) {
+ SetState(STATE_IN_WHITESPACE);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ default:
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_NAME_SPECIAL:
+ if (NPT_XML_CHAR_IS_NAME_CHAR(c) || (c == '[')) {
+ m_Name.Append(c);
+
+ const unsigned char* nb = m_Name.GetBuffer();
+ if (m_Name.GetSize() == 2) {
+ if (nb[0] == '-' &&
+ nb[1] == '-') {
+ m_Name.Reset();
+ SetState(STATE_IN_COMMENT, CONTEXT_NONE);
+ break;
+ }
+ } else if (m_Name.GetSize() == 7) {
+ if (nb[0] == '[' &&
+ nb[1] == 'C' &&
+ nb[2] == 'D' &&
+ nb[3] == 'A' &&
+ nb[4] == 'T' &&
+ nb[5] == 'A' &&
+ nb[6] == '[') {
+ m_Name.Reset();
+ SetState(STATE_IN_CDATA, CONTEXT_NONE);
+ break;
+ }
+ }
+ break;
+ }
+ if (NPT_XML_CHAR_IS_WHITESPACE(c)) {
+ const char* special = m_Name.GetString();
+ if (special && NPT_StringsEqual(special, "DOCTYPE")) {
+ SetState(STATE_IN_DTD, CONTEXT_NONE);
+ } else {
+ SetState(STATE_IN_SPECIAL, CONTEXT_NONE);
+ }
+ m_Name.Reset();
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_VALUE_START:
+ if (NPT_XML_CHAR_IS_WHITESPACE(c)) break;
+ if (c == '"') {
+ m_Value.Reset();
+ SetState(STATE_IN_VALUE, CONTEXT_VALUE_DOUBLE_QUOTE);
+ } else if (c == '\'') {
+ m_Value.Reset();
+ SetState(STATE_IN_VALUE, CONTEXT_VALUE_SINGLE_QUOTE);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_VALUE:
+ if ((c == '"' && m_Context == CONTEXT_VALUE_DOUBLE_QUOTE) ||
+ (c == '\'' && m_Context == CONTEXT_VALUE_SINGLE_QUOTE)) {
+ NPT_CHECK(m_Parser->OnElementAttribute(m_Name.GetString(),
+ m_Value.GetString()));
+ SetState(STATE_IN_WHITESPACE, CONTEXT_ATTRIBUTE);
+ } else if (c == '&') {
+ m_Entity.Reset();
+ SetState(STATE_IN_ENTITY_REF);
+ } else if (NPT_XML_CHAR_IS_WHITESPACE(c)) {
+ m_Value.Append(' ');
+ } else if (NPT_XML_CHAR_IS_VALUE_CHAR(c)) {
+ m_Value.Append(c);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_TAG_START:
+ m_Name.Reset();
+ if (c == '!') {
+ SetState(STATE_IN_NAME_SPECIAL, CONTEXT_NONE);
+ } else if (c == '?') {
+ SetState(STATE_IN_PROCESSING_INSTRUCTION, CONTEXT_NONE);
+ } else if (c == '/') {
+ SetState(STATE_IN_NAME, CONTEXT_CLOSE_TAG);
+ } else if (NPT_XML_CHAR_IS_NAME_CHAR(c)) {
+ m_Name.Append(c);
+ SetState(STATE_IN_NAME, CONTEXT_OPEN_TAG);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_EMPTY_TAG_END:
+ if (c == '>') {
+ NPT_CHECK(FlushPendingText());
+ NPT_CHECK(m_Parser->OnEndElement(NULL));
+ SetState(STATE_IN_CONTENT, CONTEXT_NONE);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_ENTITY_REF:
+ switch (m_Context) {
+ case CONTEXT_VALUE_SINGLE_QUOTE:
+ case CONTEXT_VALUE_DOUBLE_QUOTE:
+ if (c == ';') {
+ NPT_CHECK(ResolveEntity(m_Entity, m_Value));
+ SetState(STATE_IN_VALUE);
+ } else if (NPT_XML_CHAR_IS_ENTITY_REF_CHAR(c)) {
+ m_Entity.Append(c);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case CONTEXT_NONE:
+ if (c == ';') {
+ NPT_CHECK(ResolveEntity(m_Entity, m_Text));
+ SetState(STATE_IN_CONTENT);
+ } else if (NPT_XML_CHAR_IS_ENTITY_REF_CHAR(c)) {
+ m_Entity.Append(c);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ default:
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_COMMENT:
+ if (c == '-') {
+ SetState(STATE_IN_COMMENT_END_1);
+ } else if (!NPT_XML_CHAR_IS_ANY_CHAR(c)) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_COMMENT_END_1:
+ if (c == '-') {
+ SetState(STATE_IN_COMMENT_END_2);
+ } else if (NPT_XML_CHAR_IS_ANY_CHAR(c)) {
+ SetState(STATE_IN_COMMENT);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_COMMENT_END_2:
+ if (c == '>') {
+ SetState(STATE_IN_CONTENT, CONTEXT_NONE);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_CONTENT:
+ if (c == '<') {
+ SetState(STATE_IN_TAG_START, CONTEXT_NONE);
+ } else if (c == '&') {
+ m_Entity.Reset();
+ SetState(STATE_IN_ENTITY_REF);
+ } else {
+ m_Text.Append(c);
+ }
+ break;
+
+ case STATE_IN_PROCESSING_INSTRUCTION_START:
+ break;
+
+ case STATE_IN_PROCESSING_INSTRUCTION_END:
+ if (c == '>') {
+ SetState(STATE_IN_WHITESPACE, CONTEXT_NONE);
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_PROCESSING_INSTRUCTION:
+ if (c == '?') {
+ SetState(STATE_IN_PROCESSING_INSTRUCTION_END);
+ }
+ break;
+
+ case STATE_IN_DTD:
+ if (NPT_XML_CHAR_IS_WHITESPACE(c)) break;
+ if (c == '[') {
+ SetState(STATE_IN_DTD_MARKUP_DECL);
+ } else if (c == '>') {
+ SetState(STATE_IN_WHITESPACE, CONTEXT_NONE);
+ }
+ break;
+
+ case STATE_IN_DTD_MARKUP_DECL:
+ if (c == ']') {
+ SetState(STATE_IN_DTD_MARKUP_DECL_END);
+ }
+ break;
+
+ case STATE_IN_DTD_MARKUP_DECL_END:
+ if (c == '>') {
+ SetState(STATE_IN_WHITESPACE, CONTEXT_NONE);
+ } else if (!NPT_XML_CHAR_IS_WHITESPACE(c)) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ break;
+
+ case STATE_IN_CDATA:
+ if (c == ']') {
+ SetState(STATE_IN_CDATA_END_1);
+ } else {
+ m_Text.Append(c);
+ }
+ break;
+
+ case STATE_IN_CDATA_END_1:
+ if (c == ']') {
+ SetState(STATE_IN_CDATA_END_2);
+ } else {
+ m_Text.Append(']');
+ m_Text.Append(c);
+ SetState(STATE_IN_CDATA);
+ }
+ break;
+
+ case STATE_IN_CDATA_END_2:
+ if (c == '>') {
+ SetState(STATE_IN_CONTENT, CONTEXT_NONE);
+ } else {
+ m_Text.Append("]]");
+ m_Text.Append(c);
+ SetState(STATE_IN_CDATA);
+ }
+ break;
+
+ case STATE_IN_SPECIAL:
+ if (c == '>') {
+ SetState(STATE_IN_WHITESPACE, CONTEXT_NONE);
+ }
+ break;
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::NPT_XmlParser
++---------------------------------------------------------------------*/
+NPT_XmlParser::NPT_XmlParser(bool keep_whitespace /* = false */) :
+ m_Root(NULL),
+ m_CurrentElement(NULL),
+ m_KeepWhitespace(keep_whitespace)
+{
+ m_Processor = new NPT_XmlProcessor(this);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::~NPT_XmlParser
++---------------------------------------------------------------------*/
+NPT_XmlParser::~NPT_XmlParser()
+{
+ Reset();
+ delete m_CurrentElement;
+ delete m_Processor;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::Reset
++---------------------------------------------------------------------*/
+void
+NPT_XmlParser::Reset()
+{
+ // delete anything that has been created
+ NPT_XmlNode* walker = m_CurrentElement;
+ while (walker && walker->GetParent()) {
+ walker = walker->GetParent();
+ }
+ delete walker;
+ m_CurrentElement = NULL;
+
+ m_Processor->Reset();
+
+ m_Root = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlParser::Parse(NPT_InputStream& stream,
+ NPT_Size& size,
+ NPT_XmlNode*& node,
+ bool incremental /* = false */)
+{
+ NPT_Result result;
+
+ // start with a known state
+ m_Root = NULL;
+ node = NULL;
+ if (!incremental) {
+ Reset();
+ }
+
+ // use a buffer on the stack
+ char buffer[1024];
+
+ // read a buffer and parse it until the end of the stream
+ NPT_Size max_bytes_to_read = size;
+ size = 0;
+ do {
+ NPT_Size bytes_read;
+ NPT_Size bytes_to_read = sizeof(buffer);
+ if (max_bytes_to_read != 0 &&
+ size+bytes_to_read > max_bytes_to_read) {
+ bytes_to_read = max_bytes_to_read-size;
+ }
+ result = stream.Read(buffer, bytes_to_read, &bytes_read);
+ if (NPT_SUCCEEDED(result)) {
+ // update the counter
+ size += bytes_read;
+
+ // parse the buffer
+ result = m_Processor->ProcessBuffer(buffer, bytes_read);
+ if (NPT_FAILED(result)) break;
+ } else {
+ break;
+ }
+ } while(NPT_SUCCEEDED(result) &&
+ (max_bytes_to_read == 0 || size < max_bytes_to_read));
+
+ // return a tree if we have one
+ node = m_Root;
+ if (incremental) {
+ return result;
+ } else {
+ if (NPT_FAILED(result) && result != NPT_ERROR_EOS) {
+ delete m_Root;
+ m_Root = NULL;
+ node = NULL;
+ return result;
+ } else {
+ return m_Root?NPT_SUCCESS:NPT_ERROR_XML_NO_ROOT;
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlParser::Parse(NPT_InputStream& stream,
+ NPT_XmlNode*& node,
+ bool incremental /* = false */)
+{
+ NPT_Size max_read = 0; // no limit
+ return Parse(stream, max_read, node, incremental);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlParser::Parse(const char* xml,
+ NPT_XmlNode*& node,
+ bool incremental /* = false */)
+{
+ NPT_Size size = NPT_StringLength(xml);
+
+ return Parse(xml, size, node, incremental);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlParser::Parse(const char* xml,
+ NPT_Size size,
+ NPT_XmlNode*& node,
+ bool incremental /* = false */)
+{
+ // start with a known state
+ m_Root = NULL;
+ node = NULL;
+ if (!incremental) {
+ Reset();
+ }
+
+ // parse the buffer
+ NPT_Result result = m_Processor->ProcessBuffer(xml, size);
+
+ // return a tree if we have one
+ node = m_Root;
+ if (incremental) {
+ return result;
+ } else {
+ if (NPT_FAILED(result)) {
+ delete m_Root;
+ m_Root = NULL;
+ node = NULL;
+ return result;
+ } else {
+ return m_Root?NPT_SUCCESS:NPT_ERROR_XML_NO_ROOT;
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::OnStartElement
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlParser::OnStartElement(const char* name)
+{
+ NPT_XML_Debug_1("\nNPT_XmlParser::OnStartElement: %s\n", name);
+
+ // we cannot start an element if we already have a root
+ if (m_Root) {
+ return NPT_ERROR_XML_MULTIPLE_ROOTS;
+ }
+
+ // create new node
+ NPT_XmlElementNode* node = new NPT_XmlElementNode(name);
+
+ // add node to tree
+ if (m_CurrentElement) {
+ // add the new node
+ m_CurrentElement->AddChild(node);
+ }
+ m_CurrentElement = node;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::OnElementAttribute
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlParser::OnElementAttribute(const char* name, const char* value)
+{
+ NPT_XML_Debug_2("\nNPT_XmlParser::OnElementAttribute: name=%s, value='%s'\n",
+ name, value);
+
+ if (m_CurrentElement == NULL) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+
+ // check if this is a namespace attribute
+ if (name[0] == 'x' &&
+ name[1] == 'm' &&
+ name[2] == 'l' &&
+ name[3] == 'n' &&
+ name[4] == 's' &&
+ (name[5] == '\0' || name[5] == ':')) {
+ // namespace definition
+ m_CurrentElement->SetNamespaceUri((name[5] == ':')?name+6:"", value);
+ } else {
+ m_CurrentElement->AddAttribute(name, value);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::OnEndElement
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlParser::OnEndElement(const char* name)
+{
+ NPT_XML_Debug_1("\nNPT_XmlParser::OnEndElement: %s\n", name ? name : "NULL");
+
+ if (m_CurrentElement == NULL) return NPT_ERROR_XML_TAG_MISMATCH;
+
+ // check that the name matches (if there is a name)
+ if (name) {
+ const char* prefix = name;
+ unsigned int prefix_length = 0;
+ const char* tag = name;
+ const char* cursor = name;
+ while (char c = *cursor++) {
+ if (c == ':') {
+ prefix_length = (unsigned int)(cursor-name)-1;
+ tag = cursor;
+ }
+ }
+ // check that the name and prefix length match
+ if (m_CurrentElement->GetTag() != tag ||
+ m_CurrentElement->GetPrefix().GetLength() != prefix_length) {
+ return NPT_ERROR_XML_TAG_MISMATCH;
+ }
+
+ // check the prefix
+ const char* current_prefix = m_CurrentElement->GetPrefix().GetChars();
+ for (unsigned int i=0; i<prefix_length; i++) {
+ if (current_prefix[i] != prefix[i]) {
+ return NPT_ERROR_XML_TAG_MISMATCH;
+ }
+ }
+ }
+
+ // pop up the stack
+ NPT_XmlNode* parent = m_CurrentElement->GetParent();
+ if (parent) {
+ m_CurrentElement = parent->AsElementNode();
+ } else {
+ if (m_Root) {
+ // this should never happen
+ delete m_CurrentElement;
+ m_CurrentElement = NULL;
+ return NPT_ERROR_XML_MULTIPLE_ROOTS;
+ } else {
+ m_Root = m_CurrentElement;
+ m_CurrentElement = NULL;
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser::OnCharacterData
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlParser::OnCharacterData(const char* data, NPT_Size size)
+{
+ NPT_XML_Debug_1("\nNPT_XmlParser::OnCharacterData: %s\n", data);
+
+ // check that we have a current element
+ if (m_CurrentElement == NULL) {
+ // we do not allow non-whitespace outside an element content
+ if (!NPT_XmlStringIsWhitespace(data, size)) {
+ return NPT_ERROR_XML_INVALID_NESTING;
+ }
+
+ // ignore whitespace
+ return NPT_SUCCESS;
+ }
+
+ // ignore whitespace if applicable
+ if (m_KeepWhitespace || !NPT_XmlStringIsWhitespace(data, size)) {
+ // add the text to the current element
+ m_CurrentElement->AddText(data);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlAttributeWriter
++---------------------------------------------------------------------*/
+class NPT_XmlAttributeWriter
+{
+public:
+ NPT_XmlAttributeWriter(NPT_XmlSerializer& serializer) : m_Serializer(serializer) {}
+ void operator()(NPT_XmlAttribute*& attribute) const {
+ m_Serializer.Attribute(attribute->GetPrefix(),
+ attribute->GetName(),
+ attribute->GetValue());
+ }
+
+private:
+ // members
+ NPT_XmlSerializer& m_Serializer;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlNodeWriter
++---------------------------------------------------------------------*/
+class NPT_XmlNodeWriter
+{
+public:
+ NPT_XmlNodeWriter(NPT_XmlSerializer& serializer) :
+ m_Serializer(serializer), m_AttributeWriter(serializer) {
+ m_Serializer.StartDocument();
+ }
+ void operator()(NPT_XmlNode*& node) const {
+ if (NPT_XmlElementNode* element = node->AsElementNode()) {
+ const NPT_String& prefix = element->GetPrefix();
+ const NPT_String& tag = element->GetTag();
+ m_Serializer.StartElement(prefix, tag);
+ element->GetAttributes().Apply(m_AttributeWriter);
+
+ // emit namespace attributes
+ if (element->m_NamespaceMap) {
+ NPT_List<NPT_XmlNamespaceMap::Entry*>::Iterator item =
+ element->m_NamespaceMap->m_Entries.GetFirstItem();
+ while (item) {
+ if ((*item)->m_Prefix.IsEmpty()) {
+ // default namespace
+ m_Serializer.Attribute(NULL, "xmlns", (*item)->m_Uri);
+ } else {
+ // namespace with prefix
+ m_Serializer.Attribute("xmlns", (*item)->m_Prefix, (*item)->m_Uri);
+ }
+ ++item;
+ }
+ }
+
+ element->GetChildren().Apply(*this);
+ m_Serializer.EndElement(prefix, tag);
+ } else if (NPT_XmlTextNode* text = node->AsTextNode()) {
+ m_Serializer.Text(text->GetString());
+ }
+ }
+
+private:
+ // members
+ NPT_XmlSerializer& m_Serializer;
+ NPT_XmlAttributeWriter m_AttributeWriter;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlNodeCanonicalWriter
++---------------------------------------------------------------------*/
+class NPT_XmlNodeCanonicalWriter
+{
+public:
+ // types
+ struct MapChainLink {
+ MapChainLink(MapChainLink* parent) : m_Parent(parent) {}
+ MapChainLink* m_Parent;
+ NPT_Map<NPT_String, NPT_String> m_RenderedNamespaces;
+ };
+
+ // constructor
+ NPT_XmlNodeCanonicalWriter(NPT_XmlSerializer& serializer,
+ MapChainLink* map_chain = NULL) :
+ m_MapChain(map_chain),
+ m_Serializer(serializer) {
+ m_Serializer.StartDocument();
+ }
+ void operator()(NPT_XmlNode*& node) const;
+
+private:
+ // types
+ struct SortedAttributeList {
+ // types
+ struct Entry {
+ const NPT_String* m_NamespaceUri;
+ const NPT_XmlAttribute* m_Attribute;
+ };
+
+ // methods
+ void Add(const NPT_String* namespace_uri,
+ const NPT_XmlAttribute* attribute);
+ void Emit(NPT_XmlSerializer& serializer);
+
+ // members
+ NPT_List<Entry> m_Entries;
+ };
+
+ struct SortedNamespaceList {
+ // types
+ struct Entry {
+ const NPT_String* m_NamespacePrefix;
+ const NPT_String* m_NamespaceUri;
+ };
+
+ // methods
+ void Add(const NPT_String* prefix, const NPT_String* uri);
+ void Emit(NPT_XmlSerializer& serializer);
+
+ // members
+ NPT_List<Entry> m_Entries;
+ };
+
+ // methods
+ const NPT_String* GetNamespaceRenderedForPrefix(const NPT_String& prefix) const;
+
+ // members
+ MapChainLink* m_MapChain;
+ NPT_XmlSerializer& m_Serializer;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlNodeCanonicalWriter::SortedAttributeList::Add
++---------------------------------------------------------------------*/
+void
+NPT_XmlNodeCanonicalWriter::SortedAttributeList::Add(
+ const NPT_String* namespace_uri,
+ const NPT_XmlAttribute* attribute)
+{
+ // transform empty strings into NULL pointers
+ if (namespace_uri && namespace_uri->IsEmpty()) namespace_uri = NULL;
+
+ // find the namespace insertion position
+ NPT_List<Entry>::Iterator entry = m_Entries.GetFirstItem();
+ for (; entry; ++entry) {
+ // decide if we insert now or move on
+ const NPT_String* other_namespace_uri = entry->m_NamespaceUri;
+ if (namespace_uri &&
+ (other_namespace_uri == NULL || *namespace_uri > *other_namespace_uri)) {
+ // this namespace uri is greater than the other, skip
+ continue;
+ } else if ((namespace_uri == NULL && other_namespace_uri == NULL) ||
+ (namespace_uri && other_namespace_uri &&
+ *namespace_uri == *other_namespace_uri)) {
+ // namespace uris match, compare the names
+ const NPT_XmlAttribute* other_attribute = entry->m_Attribute;
+ if (attribute->GetName() > other_attribute->GetName()) continue;
+ }
+ break;
+ }
+
+ Entry new_entry = {namespace_uri, attribute};
+ m_Entries.Insert(entry, new_entry);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlNodeCanonicalWriter::SortedAttributeList::Emit
++---------------------------------------------------------------------*/
+void
+NPT_XmlNodeCanonicalWriter::SortedAttributeList::Emit(NPT_XmlSerializer& serializer)
+{
+ for (NPT_List<Entry>::Iterator i = m_Entries.GetFirstItem(); i; ++i) {
+ serializer.Attribute(i->m_Attribute->GetPrefix(),
+ i->m_Attribute->GetName(),
+ i->m_Attribute->GetValue());
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlNodeCanonicalWriter::SortedNamespaceList::Add
++---------------------------------------------------------------------*/
+void
+NPT_XmlNodeCanonicalWriter::SortedNamespaceList::Add(const NPT_String* prefix,
+ const NPT_String* uri)
+{
+ // find the namespace insertion position
+ NPT_List<Entry>::Iterator entry = m_Entries.GetFirstItem();
+ if (prefix && !prefix->IsEmpty()) {
+ for (; entry; ++entry) {
+ // decide if we insert now or move on
+ if (entry->m_NamespacePrefix && *prefix <= *entry->m_NamespacePrefix) {
+ break;
+ }
+ }
+ } else {
+ prefix = NULL;
+ }
+
+ Entry new_entry = {prefix, uri};
+ m_Entries.Insert(entry, new_entry);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlNodeCanonicalWriter::SortedNamespaceList::Emit
++---------------------------------------------------------------------*/
+void
+NPT_XmlNodeCanonicalWriter::SortedNamespaceList::Emit(NPT_XmlSerializer& serializer)
+{
+ for (NPT_List<Entry>::Iterator i = m_Entries.GetFirstItem(); i; ++i) {
+ const NPT_String* key = i->m_NamespacePrefix;
+ const NPT_String* value = i->m_NamespaceUri;
+ if (key == NULL) {
+ serializer.Attribute(NULL, "xmlns", *value);
+ } else if (*key != "xml" || *value != NPT_XmlNamespaceUri_Xml) {
+ serializer.Attribute("xmlns", *key, *value);
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlNodeCanonicalWriter::GetNamespaceRenderedForPrefix
++---------------------------------------------------------------------*/
+const NPT_String*
+NPT_XmlNodeCanonicalWriter::GetNamespaceRenderedForPrefix(const NPT_String& prefix) const
+{
+ for (MapChainLink* link = m_MapChain;
+ link;
+ link = link->m_Parent) {
+ NPT_String* uri;
+ if (NPT_SUCCEEDED(link->m_RenderedNamespaces.Get(prefix, uri))) {
+ return uri;
+ }
+ }
+
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlNodeCanonicalWriter::operator()
++---------------------------------------------------------------------*/
+void
+NPT_XmlNodeCanonicalWriter::operator()(NPT_XmlNode*& node) const
+{
+ MapChainLink map_link(m_MapChain);
+
+ if (NPT_XmlElementNode* element = node->AsElementNode()) {
+ const NPT_String& prefix = element->GetPrefix();
+ const NPT_String& tag = element->GetTag();
+
+ // process namespaces
+ const NPT_String* namespace_uri = element->GetNamespace();
+ const NPT_String* rendered = GetNamespaceRenderedForPrefix(prefix);
+ if (namespace_uri && namespace_uri->IsEmpty()) namespace_uri = NULL;
+ if (prefix.IsEmpty()) {
+ // default namespace
+ if (rendered == NULL) {
+ // default namespace not rendered
+ if (namespace_uri) {
+ map_link.m_RenderedNamespaces.Put("", *namespace_uri);
+ }
+ } else {
+ // default namespace already rendered
+ const char* compare;
+ if (namespace_uri) {
+ compare = namespace_uri->GetChars();
+ } else {
+ compare = "";
+ }
+ if (*rendered != compare) {
+ // the rendered default namespace had a different uri
+ map_link.m_RenderedNamespaces.Put("", compare);
+ }
+ }
+ } else {
+ // explicit namespace
+ // NOTE: namespace_uri should not be an empty string, but we test just
+ // in case the XML document is not compliant
+ if (namespace_uri && (rendered == NULL || *rendered != *namespace_uri)) {
+ // namespace prefix not rendered or rendered with a different value
+ map_link.m_RenderedNamespaces.Put(prefix, *namespace_uri);
+ }
+ }
+
+ // process attributes
+ SortedAttributeList prefixed_attributes;
+ SortedAttributeList naked_attributes;
+ for (NPT_List<NPT_XmlAttribute*>::Iterator attribute = element->GetAttributes().GetFirstItem();
+ attribute;
+ ++attribute) {
+ const NPT_String& a_prefix = (*attribute)->GetPrefix();
+ if (a_prefix.IsEmpty()) {
+ // naked attribute
+ naked_attributes.Add(NULL, *attribute);
+ } else {
+ // decide if we need to render this namespace declaration
+ namespace_uri = element->GetNamespaceUri(a_prefix);
+ if (namespace_uri) {
+ rendered = GetNamespaceRenderedForPrefix(a_prefix);;
+ if (rendered == NULL || *rendered != *namespace_uri) {
+ // namespace not rendered or rendered with a different value
+ map_link.m_RenderedNamespaces.Put(a_prefix, *namespace_uri);
+ }
+ prefixed_attributes.Add(namespace_uri, *attribute);
+ }
+ }
+ }
+
+ // start of element
+ m_Serializer.StartElement(prefix, tag);
+
+ // namespace declarations
+ if (map_link.m_RenderedNamespaces.GetEntryCount()) {
+ SortedNamespaceList namespaces;
+ NPT_List<NPT_Map<NPT_String, NPT_String>::Entry*>::Iterator entry =
+ map_link.m_RenderedNamespaces.GetEntries().GetFirstItem();
+ while (entry) {
+ const NPT_String& key = (*entry)->GetKey();
+ const NPT_String& value = (*entry)->GetValue();
+ namespaces.Add(&key, &value);
+ ++entry;
+ }
+ namespaces.Emit(m_Serializer);
+ }
+
+ // attributes
+ naked_attributes.Emit(m_Serializer);
+ prefixed_attributes.Emit(m_Serializer);
+
+ // children
+ MapChainLink* chain;
+ if (map_link.m_RenderedNamespaces.GetEntryCount()) {
+ chain = &map_link;
+ } else {
+ chain = m_MapChain;
+ }
+ element->GetChildren().Apply(NPT_XmlNodeCanonicalWriter(m_Serializer, chain));
+
+ // end of element
+ m_Serializer.EndElement(prefix, tag);
+ } else if (NPT_XmlTextNode* text = node->AsTextNode()) {
+ m_Serializer.Text(text->GetString());
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::NPT_XmlSerializer
++---------------------------------------------------------------------*/
+NPT_XmlSerializer::NPT_XmlSerializer(NPT_OutputStream* output,
+ NPT_Cardinal indentation,
+ bool shrink_empty_elements,
+ bool add_xml_decl) :
+ m_Output(output),
+ m_ElementPending(false),
+ m_Depth(0),
+ m_Indentation(indentation),
+ m_ElementHasText(false),
+ m_ShrinkEmptyElements(shrink_empty_elements),
+ m_AddXmlDecl(add_xml_decl)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::~NPT_XmlSerializer
++---------------------------------------------------------------------*/
+NPT_XmlSerializer::~NPT_XmlSerializer()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::StartDocument
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::StartDocument()
+{
+ if (!m_AddXmlDecl) return NPT_SUCCESS;
+
+ return m_Output->WriteString("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::EndDocument
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::EndDocument()
+{
+ return m_ElementPending?NPT_ERROR_INVALID_STATE:NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::EscapeChar
++---------------------------------------------------------------------*/
+void
+NPT_XmlSerializer::EscapeChar(unsigned char c, char* text)
+{
+ *text++ = '&';
+ *text++ = '#';
+ *text++ = 'x';
+ int c0 = c>>4;
+ int c1 = c&0xF;
+ if (c0) {
+ *text++ = c0 >= 10 ? 'A'+(c0-10) : '0'+c0;
+ }
+ *text++ = c1 >= 10 ? 'A'+(c1-10) : '0'+c1;
+ *text++ = ';';
+ *text = '\0';
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::ProcessPending
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::ProcessPending()
+{
+ if (!m_ElementPending) return NPT_SUCCESS;
+ m_ElementPending = false;
+ return m_Output->Write(">", 1);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::OutputEscapedString
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::OutputEscapedString(const char* text, bool attribute)
+{
+ const char* start = text;
+ char escaped[7];
+ while (char c = *text) {
+ const char* insert = NULL;
+ switch (c) {
+ case '\r': {
+ EscapeChar(c, escaped);
+ insert = escaped;
+ break;
+ }
+ case '\n':
+ case '\t':
+ if (attribute) {
+ EscapeChar(c, escaped);
+ insert = escaped;
+ }
+ break;
+
+ case '&' : insert = "&amp;"; break;
+ case '<' : insert = "&lt;"; break;
+ case '>' : if (!attribute) insert = "&gt;"; break;
+ case '"' : if (attribute) insert = "&quot;"; break;
+ default :
+ break;
+ }
+ if (insert) {
+ // output pending chars
+ if (start != text) m_Output->WriteFully(start, (NPT_Size)(text-start));
+ m_Output->WriteString(insert);
+ start = ++text;
+ } else {
+ ++text;
+ }
+ }
+ if (start != text) {
+ m_Output->WriteFully(start, (NPT_Size)(text-start));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::OutputIndentation
++---------------------------------------------------------------------*/
+void
+NPT_XmlSerializer::OutputIndentation(bool start)
+{
+ if (m_Depth || !start) m_Output->Write("\r\n", 2);
+
+ // ensure we have enough chars in the prefix string
+ unsigned int prefix_length = m_Indentation*m_Depth;
+ if (m_IndentationPrefix.GetLength() < prefix_length) {
+ unsigned int needed = prefix_length-m_IndentationPrefix.GetLength();
+ for (unsigned int i=0; i<needed; i+=16) {
+ m_IndentationPrefix.Append(" ", 16);
+ }
+ }
+
+ // print the indentation prefix
+ m_Output->WriteFully(m_IndentationPrefix.GetChars(), prefix_length);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::StartElement
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::StartElement(const char* prefix, const char* name)
+{
+ ProcessPending();
+ if (m_Indentation) OutputIndentation(true);
+ m_ElementPending = true;
+ m_ElementHasText = false;
+ m_Depth++;
+ m_Output->Write("<", 1);
+ if (prefix && prefix[0]) {
+ m_Output->WriteString(prefix);
+ m_Output->Write(":", 1);
+ }
+ return m_Output->WriteString(name);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::EndElement
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::EndElement(const char* prefix, const char* name)
+{
+ m_Depth--;
+
+ if (m_ElementPending) {
+ // this element has no children
+ m_ElementPending = false;
+ if (m_ShrinkEmptyElements) {
+ return m_Output->WriteFully("/>", 2);
+ } else {
+ m_Output->Write(">",1);
+ }
+ }
+
+ if (m_Indentation && !m_ElementHasText) OutputIndentation(false);
+ m_ElementHasText = false;
+ m_Output->WriteFully("</", 2);
+ if (prefix && prefix[0]) {
+ m_Output->WriteString(prefix);
+ m_Output->Write(":", 1);
+ }
+ m_Output->WriteString(name);
+ return m_Output->Write(">", 1);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::Attribute
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::Attribute(const char* prefix, const char* name, const char* value)
+{
+ m_Output->Write(" ", 1);
+ if (prefix && prefix[0]) {
+ m_Output->WriteString(prefix);
+ m_Output->Write(":", 1);
+ }
+ m_Output->WriteString(name);
+ m_Output->WriteFully("=\"", 2);
+ OutputEscapedString(value, true);
+ return m_Output->Write("\"", 1);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::Text
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::Text(const char* text)
+{
+ ProcessPending();
+ m_ElementHasText = true;
+ return OutputEscapedString(text, false);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::CdataSection
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::CdataSection(const char* data)
+{
+ ProcessPending();
+ m_ElementHasText = true;
+ m_Output->WriteFully("<![CDATA[", 9);
+ m_Output->WriteString(data);
+ return m_Output->WriteFully("]]>", 3);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer::Comment
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlSerializer::Comment(const char* comment)
+{
+ ProcessPending();
+ m_Output->WriteFully("<!--", 4);
+ m_Output->WriteString(comment);
+ return m_Output->WriteFully("-->", 3);
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlWriter::Serialize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlWriter::Serialize(NPT_XmlNode& node,
+ NPT_OutputStream& output,
+ bool add_xml_decl)
+{
+ NPT_XmlSerializer serializer(&output, m_Indentation, true, add_xml_decl);
+ NPT_XmlNodeWriter node_writer(serializer);
+ NPT_XmlNode* node_pointer = &node;
+ node_writer(node_pointer);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_XmlCanonicalizer::Serialize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_XmlCanonicalizer::Serialize(NPT_XmlNode& node,
+ NPT_OutputStream& output,
+ bool add_xml_decl)
+{
+ // create a serializer with no indentation and no shrinking of empty elements
+ NPT_XmlSerializer serializer(&output, 0, false, add_xml_decl);
+
+ // serialize the node
+ NPT_XmlNodeCanonicalWriter node_writer(serializer);
+ NPT_XmlNode* node_pointer = &node;
+ node_writer(node_pointer);
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/Core/NptXml.h b/lib/libUPnP/Neptune/Source/Core/NptXml.h
new file mode 100644
index 0000000..cd06a88
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptXml.h
@@ -0,0 +1,391 @@
+/*****************************************************************
+|
+| Neptune - Xml Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_XML_H_
+#define _NPT_XML_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptList.h"
+#include "NptStrings.h"
+#include "NptStreams.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ERROR_XML_INVALID_NESTING = NPT_ERROR_BASE_XML - 0;
+const int NPT_ERROR_XML_TAG_MISMATCH = NPT_ERROR_BASE_XML - 1;
+const int NPT_ERROR_XML_NO_ROOT = NPT_ERROR_BASE_XML - 2;
+const int NPT_ERROR_XML_MULTIPLE_ROOTS = NPT_ERROR_BASE_XML - 3;
+
+#define NPT_XML_ANY_NAMESPACE "*"
+#define NPT_XML_NO_NAMESPACE NULL
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class NPT_XmlProcessor;
+
+/*----------------------------------------------------------------------
+| NPT_XmlAttribute
++---------------------------------------------------------------------*/
+class NPT_XmlAttribute
+{
+ public:
+ // methods
+ NPT_XmlAttribute(const char* name, const char* value);
+ NPT_XmlAttribute(const char* prefix, const char* name, const char* value) :
+ m_Prefix(prefix), m_Name(name), m_Value(value) {}
+ const NPT_String& GetPrefix() const { return m_Prefix; }
+ const NPT_String& GetName() const { return m_Name; }
+ const NPT_String& GetValue() const { return m_Value; }
+ void SetValue(const char* value) { m_Value = value; }
+
+ private:
+ // members
+ NPT_String m_Prefix;
+ NPT_String m_Name;
+ NPT_String m_Value;
+
+ NPT_XmlAttribute(const NPT_XmlAttribute& attribute) :
+ m_Prefix(attribute.m_Prefix),
+ m_Name(attribute.m_Name),
+ m_Value(attribute.m_Value) {}
+ NPT_XmlAttribute& operator=(const NPT_XmlAttribute& a);
+
+ // friends
+ friend class NPT_XmlAttributeFinder;
+ friend class NPT_XmlAttributeFinderWithPrefix;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlNamespaceMap
++---------------------------------------------------------------------*/
+class NPT_XmlNamespaceMap
+{
+public:
+ // destructor
+ ~NPT_XmlNamespaceMap();
+
+ // methods
+ NPT_Result SetNamespaceUri(const char* prefix, const char* uri);
+ const NPT_String* GetNamespaceUri(const char* prefix);
+ const NPT_String* GetNamespacePrefix(const char* uri);
+
+private:
+ // types
+ class Entry {
+ public:
+ // constructor
+ Entry(const char* prefix, const char* uri) :
+ m_Prefix(prefix), m_Uri(uri) {}
+
+ // members
+ NPT_String m_Prefix;
+ NPT_String m_Uri;
+ };
+
+ // members
+ NPT_List<Entry*> m_Entries;
+
+ // friends
+ friend class NPT_XmlWriter;
+ friend class NPT_XmlNodeWriter;
+ friend class NPT_XmlNodeCanonicalWriter;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlNode
++---------------------------------------------------------------------*/
+class NPT_XmlElementNode;
+class NPT_XmlTextNode;
+class NPT_XmlNode
+{
+ public:
+ // types
+ typedef enum {
+ DOCUMENT,
+ ELEMENT,
+ TEXT
+ } Type;
+
+ // methods
+ NPT_XmlNode(Type type) : m_Type(type), m_Parent(NULL) {}
+ virtual ~NPT_XmlNode() {}
+ Type GetType() const { return m_Type; }
+ NPT_XmlNode* GetParent() const { return m_Parent; }
+
+ // type casting
+ virtual NPT_XmlElementNode* AsElementNode() { return NULL; }
+ virtual const NPT_XmlElementNode* AsElementNode() const { return NULL; }
+ virtual NPT_XmlTextNode* AsTextNode() { return NULL; }
+ virtual const NPT_XmlTextNode* AsTextNode() const { return NULL; }
+
+ protected:
+ // methods
+ virtual void SetParent(NPT_XmlNode* parent) { m_Parent = parent; }
+
+ // members
+ Type m_Type;
+ NPT_XmlNode* m_Parent;
+
+ // friends
+ friend class NPT_XmlNodeFinder;
+ friend class NPT_XmlSerializer;
+ friend class NPT_XmlWriter;
+ friend class NPT_XmlElementNode; // to allow access to SetParent()
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlElementNode
++---------------------------------------------------------------------*/
+class NPT_XmlElementNode : public NPT_XmlNode
+{
+ public:
+ // methods
+ NPT_XmlElementNode(const char* tag);
+ NPT_XmlElementNode(const char* prefix, const char* tag);
+ ~NPT_XmlElementNode() override;
+ NPT_List<NPT_XmlNode*>& GetChildren() { return m_Children; }
+ const NPT_List<NPT_XmlNode*>&
+ GetChildren() const { return m_Children; }
+ NPT_XmlElementNode* GetChild(const char* tag,
+ const char* namespc = NPT_XML_NO_NAMESPACE,
+ NPT_Ordinal n=0) const;
+ NPT_Result AddChild(NPT_XmlNode* child);
+ NPT_Result SetAttribute(const char* prefix,
+ const char* name,
+ const char* value);
+ NPT_Result SetAttribute(const char* name,
+ const char* value);
+ NPT_Result AddText(const char* text);
+ NPT_List<NPT_XmlAttribute*>&
+ GetAttributes() { return m_Attributes; }
+ const NPT_List<NPT_XmlAttribute*>&
+ GetAttributes() const { return m_Attributes; }
+ const NPT_String* GetAttribute(const char* name,
+ const char* namespc = NPT_XML_NO_NAMESPACE) const;
+ const NPT_String& GetPrefix() const { return m_Prefix; }
+ const NPT_String& GetTag() const { return m_Tag; }
+ const NPT_String* GetText(NPT_Ordinal n=0) const;
+
+ // bring all the namespace definitions used in this element of one of its descendants
+ // into the namespace map of this element so that it may be serialized as a
+ // standalone element without any prefixes with undefined namespace uris
+ NPT_Result MakeStandalone();
+
+ // namespace methods
+ const NPT_String* GetNamespace() const;
+ NPT_Result SetNamespaceUri(const char* prefix, const char* uri);
+ const NPT_String* GetNamespaceUri(const char* prefix) const;
+ const NPT_String* GetNamespacePrefix(const char* uri) const;
+
+ // type casting
+ NPT_XmlElementNode* AsElementNode() override { return this; }
+ const NPT_XmlElementNode* AsElementNode() const override { return this; }
+
+protected:
+ // methods
+ void SetParent(NPT_XmlNode* parent) override;
+ void SetNamespaceParent(NPT_XmlElementNode* parent);
+ void RelinkNamespaceMaps();
+
+ NPT_Result AddAttribute(const char* name, const char* value);
+
+ // members
+ NPT_String m_Prefix;
+ NPT_String m_Tag;
+ NPT_List<NPT_XmlNode*> m_Children;
+ NPT_List<NPT_XmlAttribute*> m_Attributes;
+ NPT_XmlNamespaceMap* m_NamespaceMap;
+ NPT_XmlElementNode* m_NamespaceParent;
+
+ // friends
+ friend class NPT_XmlTagFinder;
+ friend class NPT_XmlSerializer;
+ friend class NPT_XmlWriter;
+ friend class NPT_XmlNodeWriter;
+ friend class NPT_XmlNodeCanonicalWriter;
+ friend class NPT_XmlParser;
+ friend class NPT_XmlProcessor;
+ friend class NPT_XmlNamespaceCollapser;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlTextNode
++---------------------------------------------------------------------*/
+class NPT_XmlTextNode : public NPT_XmlNode
+{
+ public:
+ // types
+ typedef enum {
+ CHARACTER_DATA,
+ IGNORABLE_WHITESPACE,
+ CDATA_SECTION,
+ ENTITY_REFERENCE,
+ COMMENT
+ } TokenType;
+
+ // constructor
+ NPT_XmlTextNode(TokenType token_type, const char* text);
+
+ // methods
+ const NPT_String& GetString() const { return m_Text; }
+ TokenType GetTokenType() const { return m_TokenType; }
+
+ // type casting
+ NPT_XmlTextNode* AsTextNode() override { return this; }
+ const NPT_XmlTextNode* AsTextNode() const override { return this; }
+
+ private:
+ // members
+ TokenType m_TokenType;
+ NPT_String m_Text;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlParser
++---------------------------------------------------------------------*/
+class NPT_XmlParser
+{
+ public:
+ // methods
+ NPT_XmlParser(bool keep_whitespace = true);
+ virtual ~NPT_XmlParser();
+ virtual NPT_Result Parse(const char* xml,
+ NPT_XmlNode*& tree,
+ bool incremental=false);
+ virtual NPT_Result Parse(const char* xml,
+ NPT_Size size,
+ NPT_XmlNode*& tree,
+ bool incremental=false);
+ virtual NPT_Result Parse(NPT_InputStream& stream,
+ NPT_XmlNode*& tree,
+ bool incremental=false);
+ virtual NPT_Result Parse(NPT_InputStream& stream,
+ NPT_Size& size,
+ NPT_XmlNode*& tree,
+ bool incremental=false);
+
+ protected:
+ // NPT_XmlHandler methods
+ NPT_Result OnStartElement(const char* name);
+ NPT_Result OnElementAttribute(const char* name, const char* value);
+ NPT_Result OnEndElement(const char* name);
+ NPT_Result OnCharacterData(const char* data, NPT_Size size);
+ void RemoveIgnorableWhitespace();
+
+ // members
+ NPT_XmlProcessor* m_Processor;
+ NPT_XmlElementNode* m_Root;
+ NPT_XmlElementNode* m_CurrentElement;
+ bool m_KeepWhitespace;
+
+private:
+ void Reset();
+
+ // friends
+ friend class NPT_XmlProcessor;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlSerializer
++---------------------------------------------------------------------*/
+class NPT_XmlSerializer
+{
+public:
+ // methods
+ NPT_XmlSerializer(NPT_OutputStream* output,
+ NPT_Cardinal indentation = 0,
+ bool shrink_empty_elements = true,
+ bool add_xml_decl = false);
+ virtual ~NPT_XmlSerializer();
+ virtual NPT_Result StartDocument();
+ virtual NPT_Result EndDocument();
+ virtual NPT_Result StartElement(const char* prefix, const char* name);
+ virtual NPT_Result EndElement(const char* prefix, const char* name);
+ virtual NPT_Result Attribute(const char* prefix, const char* name, const char* value);
+ virtual NPT_Result Text(const char* text);
+ virtual NPT_Result CdataSection(const char* data);
+ virtual NPT_Result Comment(const char* comment);
+
+protected:
+ // methods
+ void EscapeChar(unsigned char c, char* text);
+ NPT_Result ProcessPending();
+ NPT_Result OutputEscapedString(const char* text, bool attribute);
+ void OutputIndentation(bool start);
+
+ // members
+ NPT_OutputStream* m_Output;
+ bool m_ElementPending;
+ NPT_Cardinal m_Depth;
+ NPT_Cardinal m_Indentation;
+ NPT_String m_IndentationPrefix;
+ bool m_ElementHasText;
+ bool m_ShrinkEmptyElements;
+ bool m_AddXmlDecl;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlWriter
++---------------------------------------------------------------------*/
+class NPT_XmlWriter
+{
+public:
+ // constructor
+ explicit NPT_XmlWriter(NPT_Cardinal indentation = 0) : m_Indentation(indentation) {}
+
+ // methods
+ NPT_Result Serialize(NPT_XmlNode& node,
+ NPT_OutputStream& stream,
+ bool add_xml_decl = false);
+
+private:
+ // members
+ NPT_Cardinal m_Indentation;
+};
+
+/*----------------------------------------------------------------------
+| NPT_XmlCanonicalizer
++---------------------------------------------------------------------*/
+class NPT_XmlCanonicalizer
+{
+public:
+ // methods
+ NPT_Result Serialize(NPT_XmlNode& node,
+ NPT_OutputStream& stream,
+ bool add_xml_decl = false);
+};
+
+#endif // _NPT_XML_H_
diff --git a/lib/libUPnP/Neptune/Source/Core/NptZip.cpp b/lib/libUPnP/Neptune/Source/Core/NptZip.cpp
new file mode 100644
index 0000000..0ee50fd
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptZip.cpp
@@ -0,0 +1,886 @@
+/*****************************************************************
+|
+| Neptune - Zip Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptZip.h"
+#include "NptLogging.h"
+#include "NptUtils.h"
+
+#if defined(NPT_CONFIG_ENABLE_ZIP)
+#include "zlib.h"
+#endif
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.zip")
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+static const NPT_UInt32 NPT_ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50;
+static const NPT_UInt32 NPT_ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06064b50;
+static const NPT_UInt32 NPT_ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE = 0x07064b50;
+static const NPT_UInt32 NPT_ZIP_CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50;
+//static const NPT_UInt32 NPT_ZIP_LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
+static const NPT_UInt16 NPT_ZIP_EXT_DATA_TYPE_ZIP64 = 0x0001;
+
+static const NPT_UInt32 NPT_ZIP_MAX_DIRECTORY_SIZE = 0x1000000; // 16 MB
+static const NPT_UInt32 NPT_ZIP_MAX_ENTRY_COUNT = 0x100000; // 1M entries
+
+/*----------------------------------------------------------------------
+| NPT_ZipFile::NPT_ZipFile
++---------------------------------------------------------------------*/
+NPT_ZipFile::NPT_ZipFile()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipFile::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipFile::Parse(NPT_InputStream& stream, NPT_ZipFile*& file)
+{
+ // defautl return value
+ file = NULL;
+
+ // check that we know the size of the stream
+ NPT_LargeSize stream_size = 0;
+ NPT_Result result = stream.GetSize(stream_size);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("cannot get stream size (%d)", result);
+ return result;
+ }
+ if (stream_size < 22) {
+ NPT_LOG_WARNING("input stream too short");
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+
+ // seek to the most likely start of the end of central directory record
+ unsigned int max_eocdr_size = 22+65536;
+ if (max_eocdr_size > stream_size) {
+ max_eocdr_size = (unsigned int)stream_size;
+ }
+ unsigned char eocdr[22];
+ bool record_found = false;
+ NPT_Position position = 0;
+ for (unsigned int i=0; i<max_eocdr_size; i++) {
+ position = stream_size-22-i;
+ result = stream.Seek(position);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("seek failed (%d)", result);
+ return result;
+ }
+ result = stream.ReadFully(eocdr, 22);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("read failed (%d)", result);
+ return result;
+ }
+ NPT_UInt32 signature = NPT_BytesToInt32Le(eocdr);
+ if (signature == NPT_ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE) {
+ record_found = true;
+ break;
+ }
+ }
+ if (!record_found) {
+ NPT_LOG_WARNING("eocd record not found at end of stream");
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+
+ // parse the eocdr
+ NPT_UInt32 this_disk = NPT_BytesToInt16Le(&eocdr[ 4]);
+ NPT_UInt32 start_disk = NPT_BytesToInt16Le(&eocdr[ 6]);
+ NPT_UInt64 this_disk_entry_count = NPT_BytesToInt16Le(&eocdr[ 8]);
+ NPT_UInt64 total_entry_count = NPT_BytesToInt16Le(&eocdr[10]);
+ NPT_UInt64 central_directory_size = NPT_BytesToInt32Le(&eocdr[12]);
+ NPT_Position central_directory_offset = NPT_BytesToInt32Le(&eocdr[16]);
+
+ // format check
+ if (this_disk != 0 || start_disk != 0) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ if (this_disk_entry_count != total_entry_count) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+
+ // check if this is a zip64 file
+ if (central_directory_offset == 0xFFFFFFFF) {
+ unsigned char zip64_locator[20];
+ result = stream.Seek(position-20);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("seek failed (%d)", result);
+ return result;
+ }
+ result = stream.ReadFully(zip64_locator, 20);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("read failed (%d)", result);
+ return result;
+ }
+
+ NPT_UInt32 signature = NPT_BytesToInt32Le(&zip64_locator[0]);
+ if (signature != NPT_ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE) {
+ NPT_LOG_WARNING("zip64 directory locator signature not found");
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+ NPT_UInt32 zip64_disk_start = NPT_BytesToInt32Le(&zip64_locator[ 4]);
+ NPT_UInt64 zip64_directory_offset = NPT_BytesToInt64Le(&zip64_locator[ 8]);
+ NPT_UInt32 zip64_disk_count = NPT_BytesToInt32Le(&zip64_locator[16]);
+
+ // format check
+ if (zip64_disk_start != 0 || zip64_disk_count != 1) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+
+ // size check
+ if (zip64_directory_offset > stream_size) {
+ NPT_LOG_WARNING("zip64 directory offset too large");
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+
+ // load and parse the eocdr64
+ unsigned char eocdr64[56];
+ result = stream.Seek(zip64_directory_offset);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("seek failed (%d)", result);
+ return result;
+ }
+ result = stream.ReadFully(eocdr64, 56);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("read failed (%d)", result);
+ return result;
+ }
+
+ signature = NPT_BytesToInt32Le(&eocdr64[0]);
+ if (signature != NPT_ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE) {
+ NPT_LOG_WARNING("zip64 directory signature not found");
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+
+ this_disk = NPT_BytesToInt32Le(&eocdr64[16]);
+ start_disk = NPT_BytesToInt32Le(&eocdr64[20]);
+ this_disk_entry_count = NPT_BytesToInt64Le(&eocdr64[24]);
+ total_entry_count = NPT_BytesToInt64Le(&eocdr64[32]);
+ central_directory_size = NPT_BytesToInt64Le(&eocdr64[40]);
+ central_directory_offset = NPT_BytesToInt64Le(&eocdr64[48]);
+ }
+
+ // format check
+ if (this_disk != 0 || start_disk != 0) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ if (this_disk_entry_count != total_entry_count) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+
+ // check that the size looks reasonable
+ if (central_directory_size > NPT_ZIP_MAX_DIRECTORY_SIZE) {
+ NPT_LOG_WARNING("central directory larger than max supported");
+ return NPT_ERROR_OUT_OF_RANGE;
+ }
+ if (total_entry_count > NPT_ZIP_MAX_ENTRY_COUNT) {
+ NPT_LOG_WARNING("central directory larger than max supported");
+ return NPT_ERROR_OUT_OF_RANGE;
+ }
+
+ // read the central directory
+ NPT_DataBuffer central_directory_buffer;
+ result = central_directory_buffer.SetDataSize((NPT_Size)central_directory_size);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("central directory too large (%lld)", central_directory_size);
+ return result;
+ }
+ result = stream.Seek(central_directory_offset);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("seek failed (%d)", result);
+ return result;
+ }
+ result = stream.ReadFully(central_directory_buffer.UseData(), (NPT_Size)central_directory_size);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("failed to read central directory (%d)", result);
+ return result;
+ }
+
+ // create a new file object
+ file = new NPT_ZipFile();
+ file->m_Entries.Reserve((NPT_Cardinal)total_entry_count);
+
+ // parse all entries
+ const unsigned char* buffer = (const unsigned char*)central_directory_buffer.GetData();
+ NPT_Size buffer_size = central_directory_buffer.GetDataSize();
+ for (unsigned int i=0; i<total_entry_count; i++) {
+ if (buffer_size < 4) break;
+ NPT_UInt32 signature = NPT_BytesToInt32Le(buffer);
+ if (signature != NPT_ZIP_CENTRAL_FILE_HEADER_SIGNATURE) {
+ NPT_LOG_WARNING("unexpected signature in central directory");
+ break;
+ }
+
+ NPT_ZipFile::Entry entry(buffer, buffer_size);
+ if (entry.m_DirectoryEntrySize == 0) {
+ NPT_LOG_WARNING("invalid entry data");
+ break;
+ }
+ if (entry.m_DirectoryEntrySize > central_directory_size ||
+ entry.m_DirectoryEntrySize > buffer_size) {
+ NPT_LOG_WARNING_1("entry size too large (%d)", entry.m_DirectoryEntrySize);
+ break;
+ }
+
+ file->GetEntries().Add(entry);
+
+ central_directory_size -= entry.m_DirectoryEntrySize;
+ buffer += entry.m_DirectoryEntrySize;
+ buffer_size -= entry.m_DirectoryEntrySize;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipFile::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipFile::GetInputStream(Entry& entry, NPT_InputStreamReference& zip_stream, NPT_InputStream*& file_stream)
+{
+ // default return value
+ file_stream = NULL;
+
+ // we don't support encrypted files
+ if (entry.m_Flags & NPT_ZIP_FILE_FLAG_ENCRYPTED) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+
+ // check that we support the compression method
+#if NPT_CONFIG_ENABLE_ZIP
+ if (entry.m_CompressionMethod != NPT_ZIP_FILE_COMPRESSION_METHOD_NONE &&
+ entry.m_CompressionMethod != NPT_ZIP_FILE_COMPRESSION_METHOD_DEFLATE) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+#else
+ if (entry.m_CompressionMethod != NPT_ZIP_FILE_COMPRESSION_METHOD_NONE) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+#endif
+
+ // seek to the start of the file entry
+ NPT_Result result = zip_stream->Seek(entry.m_RelativeOffset);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("seek failed (%d)", result);
+ return result;
+ }
+
+ // read the fixed part of the header
+ unsigned char header[30];
+ result = zip_stream->ReadFully(header, 30);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_WARNING_1("read failed (%d)", result);
+ return result;
+ }
+
+ NPT_UInt16 file_name_length = NPT_BytesToInt16Le(&header[26]);
+ NPT_UInt16 extra_field_length = NPT_BytesToInt16Le(&header[28]);
+
+ unsigned int header_size = 30+file_name_length+extra_field_length;
+ NPT_LargeSize zip_stream_size = 0;
+ zip_stream->GetSize(zip_stream_size);
+ if (entry.m_RelativeOffset+header_size+entry.m_CompressedSize > zip_stream_size) {
+ // something's wrong here
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+
+ file_stream = new NPT_SubInputStream(zip_stream, entry.m_RelativeOffset+header_size, entry.m_CompressedSize);
+
+#if NPT_CONFIG_ENABLE_ZIP
+ if (entry.m_CompressionMethod == NPT_ZIP_FILE_COMPRESSION_METHOD_DEFLATE) {
+ NPT_InputStreamReference file_stream_ref(file_stream);
+ file_stream = new NPT_ZipInflatingInputStream(file_stream_ref, true);
+ }
+#endif
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipFile::Entry::Entry
++---------------------------------------------------------------------*/
+NPT_ZipFile::Entry::Entry(const unsigned char* data, NPT_Size data_available) :
+ m_Flags(0),
+ m_CompressionMethod(0),
+ m_Crc32(0),
+ m_CompressedSize(0),
+ m_UncompressedSize(0),
+ m_DiskNumber(0),
+ m_InternalFileAttributes(0),
+ m_ExternalFileAttributes(0),
+ m_RelativeOffset(0),
+ m_DirectoryEntrySize(0)
+{
+ if (data_available < 46) return;
+
+ m_Flags = NPT_BytesToInt16Le(data+ 8);
+ m_CompressionMethod = NPT_BytesToInt16Le(data+10);
+ m_Crc32 = NPT_BytesToInt32Le(data+16);
+ m_CompressedSize = NPT_BytesToInt32Le(data+20);
+ m_UncompressedSize = NPT_BytesToInt32Le(data+24);
+ m_DiskNumber = NPT_BytesToInt16Le(data+34);
+ m_InternalFileAttributes = NPT_BytesToInt32Le(data+36);
+ m_ExternalFileAttributes = NPT_BytesToInt32Le(data+38);
+ m_RelativeOffset = NPT_BytesToInt32Le(data+42);
+
+ NPT_UInt16 file_name_length = NPT_BytesToInt16Le(data+28);
+ NPT_UInt16 extra_field_length = NPT_BytesToInt16Le(data+30);
+ NPT_UInt16 file_comment_length = NPT_BytesToInt16Le(data+32);
+
+ m_DirectoryEntrySize = 46+file_name_length+extra_field_length+file_comment_length;
+ if (m_DirectoryEntrySize > data_available) {
+ m_DirectoryEntrySize = 0;
+ return;
+ }
+
+ // extract the file name
+ m_Name.Assign((const char*)data+46, file_name_length);
+
+ // check for a zip64 extension
+ const unsigned char* ext_data = data+46+file_name_length;
+ unsigned int ext_data_size = extra_field_length;
+ while (ext_data_size >= 4) {
+ unsigned int ext_id = NPT_BytesToInt16Le(ext_data);
+ unsigned int ext_size = NPT_BytesToInt16Le(ext_data+2);
+
+ if (ext_id == NPT_ZIP_EXT_DATA_TYPE_ZIP64) {
+ const unsigned char* local_data = ext_data+4;
+ if (m_UncompressedSize == 0xFFFFFFFF) {
+ m_UncompressedSize = NPT_BytesToInt64Le(local_data);
+ local_data += 8;
+ }
+ if (m_CompressedSize == 0xFFFFFFFF) {
+ m_CompressedSize = NPT_BytesToInt64Le(local_data);
+ local_data += 8;
+ }
+ if (m_RelativeOffset == 0xFFFFFFFF) {
+ m_RelativeOffset = NPT_BytesToInt64Le(local_data);
+ local_data += 8;
+ }
+ if (m_DiskNumber == 0xFFFF) {
+ m_DiskNumber = NPT_BytesToInt32Le(local_data);
+ local_data += 4;
+ }
+ }
+
+ ext_data += 4+ext_size;
+ if (ext_data_size >= 4+ext_size) {
+ ext_data_size -= 4+ext_size;
+ } else {
+ ext_data_size = 0;
+ }
+ }
+}
+
+#if defined(NPT_CONFIG_ENABLE_ZIP)
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const unsigned int NPT_ZIP_DEFAULT_BUFFER_SIZE = 4096;
+
+/*----------------------------------------------------------------------
+| NPT_Zip::MapError
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Zip::MapError(int err)
+{
+ switch (err) {
+ case Z_OK: return NPT_SUCCESS;
+ case Z_STREAM_END: return NPT_ERROR_EOS;
+ case Z_DATA_ERROR:
+ case Z_STREAM_ERROR: return NPT_ERROR_INVALID_FORMAT;
+ case Z_MEM_ERROR: return NPT_ERROR_OUT_OF_MEMORY;
+ case Z_VERSION_ERROR: return NPT_ERROR_INTERNAL;
+ case Z_NEED_DICT: return NPT_ERROR_NOT_SUPPORTED;
+ default: return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflateState
++---------------------------------------------------------------------*/
+class NPT_ZipInflateState {
+public:
+ NPT_ZipInflateState(bool raw = false);
+ ~NPT_ZipInflateState();
+ z_stream m_Stream;
+};
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflateState::NPT_ZipInflateState
++---------------------------------------------------------------------*/
+NPT_ZipInflateState::NPT_ZipInflateState(bool raw)
+{
+ // initialize the state
+ NPT_SetMemory(&m_Stream, 0, sizeof(m_Stream));
+
+ // initialize the decompressor
+ inflateInit2(&m_Stream, raw?-15:15+32); // 15 = default window bits, +32 = automatic header
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflateState::~NPT_ZipInflateState
++---------------------------------------------------------------------*/
+NPT_ZipInflateState::~NPT_ZipInflateState()
+{
+ inflateEnd(&m_Stream);
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflateState
++---------------------------------------------------------------------*/
+class NPT_ZipDeflateState {
+public:
+ NPT_ZipDeflateState(int compression_level,
+ NPT_Zip::Format format);
+ ~NPT_ZipDeflateState();
+ z_stream m_Stream;
+};
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflateState::NPT_ZipDeflateState
++---------------------------------------------------------------------*/
+NPT_ZipDeflateState::NPT_ZipDeflateState(int compression_level,
+ NPT_Zip::Format format)
+{
+ // check parameters
+ if (compression_level < NPT_ZIP_COMPRESSION_LEVEL_DEFAULT ||
+ compression_level > NPT_ZIP_COMPRESSION_LEVEL_MAX) {
+ compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT;
+ }
+
+ // initialize the state
+ NPT_SetMemory(&m_Stream, 0, sizeof(m_Stream));
+
+ // initialize the compressor
+ deflateInit2(&m_Stream,
+ compression_level,
+ Z_DEFLATED,
+ 15 + (format == NPT_Zip::GZIP ? 16 : 0),
+ 8,
+ Z_DEFAULT_STRATEGY);
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflateState::~NPT_ZipDeflateState
++---------------------------------------------------------------------*/
+NPT_ZipDeflateState::~NPT_ZipDeflateState()
+{
+ deflateEnd(&m_Stream);
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflatingInputStream::NPT_ZipInflatingInputStream
++---------------------------------------------------------------------*/
+NPT_ZipInflatingInputStream::NPT_ZipInflatingInputStream(NPT_InputStreamReference& source, bool raw) :
+ m_Source(source),
+ m_Position(0),
+ m_State(new NPT_ZipInflateState(raw)),
+ m_Buffer(NPT_ZIP_DEFAULT_BUFFER_SIZE)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflatingInputStream::~NPT_ZipInflatingInputStream
++---------------------------------------------------------------------*/
+NPT_ZipInflatingInputStream::~NPT_ZipInflatingInputStream()
+{
+ delete m_State;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflatingInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipInflatingInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ // check state and parameters
+ if (m_State == NULL) return NPT_ERROR_INVALID_STATE;
+ if (buffer == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+ if (bytes_to_read == 0) return NPT_SUCCESS;
+
+ // default values
+ if (bytes_read) *bytes_read = 0;
+
+ // setup the output buffer
+ m_State->m_Stream.next_out = (Bytef*)buffer;
+ m_State->m_Stream.avail_out = (uInt)bytes_to_read;
+
+ while (m_State->m_Stream.avail_out) {
+ // decompress what we can
+ int err = inflate(&m_State->m_Stream, Z_NO_FLUSH);
+
+ if (err == Z_STREAM_END) {
+ // we decompressed everything
+ break;
+ } else if (err == Z_OK) {
+ // we got something
+ continue;
+ } else if (err == Z_BUF_ERROR) {
+ // we need more input data
+ NPT_Size input_bytes_read = 0;
+ NPT_Result result = m_Source->Read(m_Buffer.UseData(), m_Buffer.GetBufferSize(), &input_bytes_read);
+ if (NPT_FAILED(result)) return result;
+
+ // setup the input buffer
+ m_Buffer.SetDataSize(input_bytes_read);
+ m_State->m_Stream.next_in = m_Buffer.UseData();
+ m_State->m_Stream.avail_in = m_Buffer.GetDataSize();
+
+ } else {
+ return NPT_Zip::MapError(err);
+ }
+ }
+
+ // report how much we could decompress
+ NPT_Size progress = bytes_to_read - m_State->m_Stream.avail_out;
+ if (bytes_read) {
+ *bytes_read = progress;
+ }
+ m_Position += progress;
+
+ return progress == 0 ? NPT_ERROR_EOS:NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflatingInputStream::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipInflatingInputStream::Seek(NPT_Position /* offset */)
+{
+ // we can't seek
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflatingInputStream::Tell
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipInflatingInputStream::Tell(NPT_Position& offset)
+{
+ offset = m_Position;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflatingInputStream::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipInflatingInputStream::GetSize(NPT_LargeSize& size)
+{
+ // the size is not predictable
+ size = 0;
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflatingInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipInflatingInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ // we don't know
+ available = 0;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflatingInputStream::NPT_ZipDeflatingInputStream
++---------------------------------------------------------------------*/
+NPT_ZipDeflatingInputStream::NPT_ZipDeflatingInputStream(
+ NPT_InputStreamReference& source,
+ int compression_level,
+ NPT_Zip::Format format) :
+ m_Source(source),
+ m_Position(0),
+ m_Eos(false),
+ m_State(new NPT_ZipDeflateState(compression_level, format)),
+ m_Buffer(NPT_ZIP_DEFAULT_BUFFER_SIZE)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflatingInputStream::~NPT_ZipDeflatingInputStream
++---------------------------------------------------------------------*/
+NPT_ZipDeflatingInputStream::~NPT_ZipDeflatingInputStream()
+{
+ delete m_State;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflatingInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipDeflatingInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ // check state and parameters
+ if (m_State == NULL) return NPT_ERROR_INVALID_STATE;
+ if (buffer == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+ if (bytes_to_read == 0) return NPT_SUCCESS;
+
+ // default values
+ if (bytes_read) *bytes_read = 0;
+
+ // setup the output buffer
+ m_State->m_Stream.next_out = (Bytef*)buffer;
+ m_State->m_Stream.avail_out = (uInt)bytes_to_read;
+
+ while (m_State->m_Stream.avail_out) {
+ // compress what we can
+ int err = deflate(&m_State->m_Stream, m_Eos?Z_FINISH:Z_NO_FLUSH);
+
+ if (err == Z_STREAM_END) {
+ // we compressed everything
+ break;
+ } else if (err == Z_OK) {
+ // we got something
+ continue;
+ } else if (err == Z_BUF_ERROR) {
+ // we need more input data
+ NPT_Size input_bytes_read = 0;
+ NPT_Result result = m_Source->Read(m_Buffer.UseData(), m_Buffer.GetBufferSize(), &input_bytes_read);
+ if (result == NPT_ERROR_EOS) {
+ m_Eos = true;
+ } else {
+ if (NPT_FAILED(result)) return result;
+ }
+
+ // setup the input buffer
+ m_Buffer.SetDataSize(input_bytes_read);
+ m_State->m_Stream.next_in = m_Buffer.UseData();
+ m_State->m_Stream.avail_in = m_Buffer.GetDataSize();
+
+ } else {
+ return NPT_Zip::MapError(err);
+ }
+ }
+
+ // report how much we could compress
+ NPT_Size progress = bytes_to_read - m_State->m_Stream.avail_out;
+ if (bytes_read) {
+ *bytes_read = progress;
+ }
+ m_Position += progress;
+
+ return progress == 0 ? NPT_ERROR_EOS:NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflatingInputStream::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipDeflatingInputStream::Seek(NPT_Position /* offset */)
+{
+ // we can't seek
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflatingInputStream::Tell
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipDeflatingInputStream::Tell(NPT_Position& offset)
+{
+ offset = m_Position;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflatingInputStream::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipDeflatingInputStream::GetSize(NPT_LargeSize& size)
+{
+ // the size is not predictable
+ size = 0;
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflatingInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_ZipDeflatingInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ // we don't know
+ available = 0;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Zip::Deflate
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Zip::Deflate(const NPT_DataBuffer& in,
+ NPT_DataBuffer& out,
+ int compression_level,
+ Format format /* = ZLIB */)
+{
+ // default return state
+ out.SetDataSize(0);
+
+ // check parameters
+ if (compression_level < NPT_ZIP_COMPRESSION_LEVEL_DEFAULT ||
+ compression_level > NPT_ZIP_COMPRESSION_LEVEL_MAX) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // setup the stream
+ z_stream stream;
+ NPT_SetMemory(&stream, 0, sizeof(stream));
+ stream.next_in = (Bytef*)in.GetData();
+ stream.avail_in = (uInt)in.GetDataSize();
+
+ // setup the memory functions
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+ stream.opaque = (voidpf)0;
+
+ // initialize the compressor
+ int err = deflateInit2(&stream,
+ compression_level,
+ Z_DEFLATED,
+ 15 + (format == GZIP ? 16 : 0),
+ 8,
+ Z_DEFAULT_STRATEGY);
+ if (err != Z_OK) return MapError(err);
+
+ // reserve an output buffer known to be large enough
+ out.Reserve((NPT_Size)deflateBound(&stream, stream.avail_in) + (format==GZIP?10:0));
+ stream.next_out = out.UseData();
+ stream.avail_out = out.GetBufferSize();
+
+ // decompress
+ err = deflate(&stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ deflateEnd(&stream);
+ return MapError(err);
+ }
+
+ // update the output size
+ out.SetDataSize((NPT_Size)stream.total_out);
+
+ // cleanup
+ err = deflateEnd(&stream);
+ return MapError(err);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Zip::Inflate
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Zip::Inflate(const NPT_DataBuffer& in,
+ NPT_DataBuffer& out,
+ bool raw)
+{
+ // assume an output buffer twice the size of the input plus a bit
+ NPT_CHECK_WARNING(out.Reserve(32+2*in.GetDataSize()));
+
+ // setup the stream
+ z_stream stream;
+ stream.next_in = (Bytef*)in.GetData();
+ stream.avail_in = (uInt)in.GetDataSize();
+ stream.next_out = out.UseData();
+ stream.avail_out = (uInt)out.GetBufferSize();
+
+ // setup the memory functions
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+ stream.opaque = (voidpf)0;
+
+ // initialize the decompressor
+ int err = inflateInit2(&stream, raw?-15:15+32); // 15 = default window bits, +32 = automatic header
+ if (err != Z_OK) return MapError(err);
+
+ // decompress until the end
+ do {
+ err = inflate(&stream, Z_SYNC_FLUSH);
+ if (err == Z_STREAM_END || err == Z_OK || err == Z_BUF_ERROR) {
+ out.SetDataSize((NPT_Size)stream.total_out);
+ if ((err == Z_OK && stream.avail_out == 0) || err == Z_BUF_ERROR) {
+ // grow the output buffer
+ out.Reserve(out.GetBufferSize()*2);
+ stream.next_out = out.UseData()+stream.total_out;
+ stream.avail_out = out.GetBufferSize()-(NPT_Size)stream.total_out;
+ }
+ }
+ } while (err == Z_OK);
+
+ // check for errors
+ if (err != Z_STREAM_END) {
+ inflateEnd(&stream);
+ return MapError(err);
+ }
+
+ // cleanup
+ err = inflateEnd(&stream);
+ return MapError(err);
+}
+
+
+/*----------------------------------------------------------------------
+| NPT_Zip::Deflate
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Zip::Deflate(NPT_File& in,
+ NPT_File& out,
+ int compression_level,
+ Format format /* = ZLIB */)
+{
+ // check parameters
+ if (compression_level < NPT_ZIP_COMPRESSION_LEVEL_DEFAULT ||
+ compression_level > NPT_ZIP_COMPRESSION_LEVEL_MAX) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ NPT_InputStreamReference input;
+ NPT_CHECK(in.GetInputStream(input));
+ NPT_OutputStreamReference output;
+ NPT_CHECK(out.GetOutputStream(output));
+
+ NPT_ZipDeflatingInputStream deflating_stream(input, compression_level, format);
+ return NPT_StreamToStreamCopy(deflating_stream, *output.AsPointer());
+}
+
+#endif // NPT_CONFIG_ENABLE_ZIP
diff --git a/lib/libUPnP/Neptune/Source/Core/NptZip.h b/lib/libUPnP/Neptune/Source/Core/NptZip.h
new file mode 100644
index 0000000..fbbebcb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Core/NptZip.h
@@ -0,0 +1,220 @@
+/*****************************************************************
+|
+| Neptune - Zip Support
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_ZIP_H_
+#define _NPT_ZIP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptStreams.h"
+#include "NptArray.h"
+#include "NptFile.h"
+
+/*----------------------------------------------------------------------
+| class references
++---------------------------------------------------------------------*/
+class NPT_ZipInflateState;
+class NPT_ZipDeflateState;
+
+/*----------------------------------------------------------------------
+| NPT_ZipFile
++---------------------------------------------------------------------*/
+const unsigned int NPT_ZIP_FILE_FLAG_ENCRYPTED = 0x01;
+const unsigned int NPT_ZIP_FILE_COMPRESSION_METHOD_NONE = 0x00;
+const unsigned int NPT_ZIP_FILE_COMPRESSION_METHOD_DEFLATE = 0x08;
+
+class NPT_ZipFile
+{
+public:
+ // types
+ class Entry {
+ public:
+ Entry(const unsigned char* data, NPT_Size data_available);
+ NPT_String m_Name;
+ NPT_UInt16 m_Flags;
+ NPT_UInt16 m_CompressionMethod;
+ NPT_UInt32 m_Crc32;
+ NPT_LargeSize m_CompressedSize;
+ NPT_LargeSize m_UncompressedSize;
+ NPT_UInt16 m_DiskNumber;
+ NPT_UInt16 m_InternalFileAttributes;
+ NPT_UInt32 m_ExternalFileAttributes;
+ NPT_Position m_RelativeOffset;
+ NPT_UInt32 m_DirectoryEntrySize;
+ };
+
+ // class methods
+ static NPT_Result Parse(NPT_InputStream& stream, NPT_ZipFile*& file);
+ static NPT_Result GetInputStream(Entry& entry, NPT_InputStreamReference& zip_stream, NPT_InputStream*& file_stream);
+
+ // accessors
+ NPT_Array<Entry>& GetEntries() { return m_Entries; }
+
+private:
+ // constructor
+ NPT_ZipFile();
+
+ // members
+ NPT_Array<Entry> m_Entries;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Zip
++---------------------------------------------------------------------*/
+const int NPT_ZIP_COMPRESSION_LEVEL_DEFAULT = -1;
+const int NPT_ZIP_COMPRESSION_LEVEL_MIN = 0;
+const int NPT_ZIP_COMPRESSION_LEVEL_MAX = 9;
+const int NPT_ZIP_COMPRESSION_LEVEL_NONE = 0;
+class NPT_Zip
+{
+public:
+ // class methods
+ static NPT_Result MapError(int err);
+
+ /**
+ * Compressed data format
+ */
+ typedef enum {
+ ZLIB,
+ GZIP
+ } Format;
+
+ /**
+ * Deflate (i.e compress) a buffer
+ */
+ static NPT_Result Deflate(const NPT_DataBuffer& in,
+ NPT_DataBuffer& out,
+ int compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT,
+ Format format = ZLIB);
+
+ /**
+ * Inflate (i.e decompress) a buffer
+ */
+ static NPT_Result Inflate(const NPT_DataBuffer& in,
+ NPT_DataBuffer& out,
+ bool raw = false);
+
+ /**
+ * Deflate (i.e compress) a file
+ */
+ static NPT_Result Deflate(NPT_File& in,
+ NPT_File& out,
+ int compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT,
+ Format format = GZIP);
+
+};
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflatingInputStream
++---------------------------------------------------------------------*/
+class NPT_ZipInflatingInputStream : public NPT_InputStream
+{
+public:
+ NPT_ZipInflatingInputStream(NPT_InputStreamReference& source, bool raw = false);
+ ~NPT_ZipInflatingInputStream() override;
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL) override;
+ NPT_Result Seek(NPT_Position offset) override;
+ NPT_Result Tell(NPT_Position& offset) override;
+ NPT_Result GetSize(NPT_LargeSize& size) override;
+ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+private:
+ NPT_InputStreamReference m_Source;
+ NPT_Position m_Position;
+ NPT_ZipInflateState* m_State;
+ NPT_DataBuffer m_Buffer;
+};
+
+/*----------------------------------------------------------------------
+| NPT_ZipInflatingOutputStream
++---------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflatingInputStream
++---------------------------------------------------------------------*/
+class NPT_ZipDeflatingInputStream : public NPT_InputStream
+{
+public:
+ NPT_ZipDeflatingInputStream(NPT_InputStreamReference& source,
+ int compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT,
+ NPT_Zip::Format format = NPT_Zip::ZLIB);
+ ~NPT_ZipDeflatingInputStream() override;
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL) override;
+ NPT_Result Seek(NPT_Position offset) override;
+ NPT_Result Tell(NPT_Position& offset) override;
+ NPT_Result GetSize(NPT_LargeSize& size) override;
+ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+private:
+ NPT_InputStreamReference m_Source;
+ NPT_Position m_Position;
+ bool m_Eos;
+ NPT_ZipDeflateState* m_State;
+ NPT_DataBuffer m_Buffer;
+};
+
+/*----------------------------------------------------------------------
+| NPT_ZipDeflatingOutputStream
++---------------------------------------------------------------------*/
+/*class NPT_ZipDeflatingOutputStream : public NPT_OutputStream
+{
+public:
+ NPT_ZipDeflatingOutputStream(NPT_OutputStreamReference& source,
+ int compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT,
+ NPT_Zip::Format format = NPT_Zip::ZLIB);
+ NPT_ZipDeflatingOutputStream();
+
+ // NPT_OutputStream methods
+ virtual NPT_Result Write(void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written = NULL);
+ virtual NPT_Result Seek(NPT_Position offset);
+ virtual NPT_Result Tell(NPT_Position& offset);
+
+private:
+ NPT_OutputStreamReference m_Output;
+ NPT_Position m_Position;
+ bool m_Eos;
+ NPT_ZipDeflateState* m_State;
+ NPT_DataBuffer m_Buffer;
+}; */
+
+#endif // _NPT_ZIP_H_
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0000.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0000.cpp
new file mode 100644
index 0000000..c7e4c6d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0000.cpp
@@ -0,0 +1,108 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign/RSA Secure Server CA */
+const unsigned char NptTlsTrustAnchor_Base_0000_Data[568] = {
+0x30,0x82,0x02,0x34,0x30,0x82,0x01,0xa1
+,0x02,0x10,0x02,0xad,0x66,0x7e,0x4e,0x45
+,0xfe,0x5e,0x57,0x6f,0x3c,0x98,0x19,0x5e
+,0xdd,0xc0,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x02,0x05
+,0x00,0x30,0x5f,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53
+,0x31,0x20,0x30,0x1e,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x17,0x52,0x53,0x41,0x20,0x44
+,0x61,0x74,0x61,0x20,0x53,0x65,0x63,0x75
+,0x72,0x69,0x74,0x79,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x2e,0x30,0x2c,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x25,0x53,0x65,0x63
+,0x75,0x72,0x65,0x20,0x53,0x65,0x72,0x76
+,0x65,0x72,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x30,0x1e,0x17,0x0d,0x39,0x34
+,0x31,0x31,0x30,0x39,0x30,0x30,0x30,0x30
+,0x30,0x30,0x5a,0x17,0x0d,0x31,0x30,0x30
+,0x31,0x30,0x37,0x32,0x33,0x35,0x39,0x35
+,0x39,0x5a,0x30,0x5f,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x20,0x30,0x1e,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x17,0x52,0x53,0x41,0x20
+,0x44,0x61,0x74,0x61,0x20,0x53,0x65,0x63
+,0x75,0x72,0x69,0x74,0x79,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x31,0x2e,0x30,0x2c,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x25,0x53,0x65
+,0x63,0x75,0x72,0x65,0x20,0x53,0x65,0x72
+,0x76,0x65,0x72,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x30,0x81,0x9b,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x89
+,0x00,0x30,0x81,0x85,0x02,0x7e,0x00,0x92
+,0xce,0x7a,0xc1,0xae,0x83,0x3e,0x5a,0xaa
+,0x89,0x83,0x57,0xac,0x25,0x01,0x76,0x0c
+,0xad,0xae,0x8e,0x2c,0x37,0xce,0xeb,0x35
+,0x78,0x64,0x54,0x03,0xe5,0x84,0x40,0x51
+,0xc9,0xbf,0x8f,0x08,0xe2,0x8a,0x82,0x08
+,0xd2,0x16,0x86,0x37,0x55,0xe9,0xb1,0x21
+,0x02,0xad,0x76,0x68,0x81,0x9a,0x05,0xa2
+,0x4b,0xc9,0x4b,0x25,0x66,0x22,0x56,0x6c
+,0x88,0x07,0x8f,0xf7,0x81,0x59,0x6d,0x84
+,0x07,0x65,0x70,0x13,0x71,0x76,0x3e,0x9b
+,0x77,0x4c,0xe3,0x50,0x89,0x56,0x98,0x48
+,0xb9,0x1d,0xa7,0x29,0x1a,0x13,0x2e,0x4a
+,0x11,0x59,0x9c,0x1e,0x15,0xd5,0x49,0x54
+,0x2c,0x73,0x3a,0x69,0x82,0xb1,0x97,0x39
+,0x9c,0x6d,0x70,0x67,0x48,0xe5,0xdd,0x2d
+,0xd6,0xc8,0x1e,0x7b,0x02,0x03,0x01,0x00
+,0x01,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x02,0x05,0x00
+,0x03,0x7e,0x00,0x65,0xdd,0x7e,0xe1,0xb2
+,0xec,0xb0,0xe2,0x3a,0xe0,0xec,0x71,0x46
+,0x9a,0x19,0x11,0xb8,0xd3,0xc7,0xa0,0xb4
+,0x03,0x40,0x26,0x02,0x3e,0x09,0x9c,0xe1
+,0x12,0xb3,0xd1,0x5a,0xf6,0x37,0xa5,0xb7
+,0x61,0x03,0xb6,0x5b,0x16,0x69,0x3b,0xc6
+,0x44,0x08,0x0c,0x88,0x53,0x0c,0x6b,0x97
+,0x49,0xc7,0x3e,0x35,0xdc,0x6c,0xb9,0xbb
+,0xaa,0xdf,0x5c,0xbb,0x3a,0x2f,0x93,0x60
+,0xb6,0xa9,0x4b,0x4d,0xf2,0x20,0xf7,0xcd
+,0x5f,0x7f,0x64,0x7b,0x8e,0xdc,0x00,0x5c
+,0xd7,0xfa,0x77,0xca,0x39,0x16,0x59,0x6f
+,0x0e,0xea,0xd3,0xb5,0x83,0x7f,0x4d,0x4d
+,0x42,0x56,0x76,0xb4,0xc9,0x5f,0x04,0xf8
+,0x38,0xf8,0xeb,0xd2,0x5f,0x75,0x5f,0xcd
+,0x7b,0xfc,0xe5,0x8e,0x80,0x7c,0xfc,0x50
+};
+const unsigned int NptTlsTrustAnchor_Base_0000_Size = 568;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0001.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0001.cpp
new file mode 100644
index 0000000..6d04b14
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0001.cpp
@@ -0,0 +1,100 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GTE CyberTrust Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0001_Data[510] = {
+0x30,0x82,0x01,0xfa,0x30,0x82,0x01,0x63
+,0x02,0x02,0x01,0xa3,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x04,0x05,0x00,0x30,0x45,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x18,0x30,0x16,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0f,0x47,0x54,0x45
+,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61
+,0x74,0x69,0x6f,0x6e,0x31,0x1c,0x30,0x1a
+,0x06,0x03,0x55,0x04,0x03,0x13,0x13,0x47
+,0x54,0x45,0x20,0x43,0x79,0x62,0x65,0x72
+,0x54,0x72,0x75,0x73,0x74,0x20,0x52,0x6f
+,0x6f,0x74,0x30,0x1e,0x17,0x0d,0x39,0x36
+,0x30,0x32,0x32,0x33,0x32,0x33,0x30,0x31
+,0x30,0x30,0x5a,0x17,0x0d,0x30,0x36,0x30
+,0x32,0x32,0x33,0x32,0x33,0x35,0x39,0x30
+,0x30,0x5a,0x30,0x45,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x18,0x30,0x16,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0f,0x47,0x54,0x45,0x20
+,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74
+,0x69,0x6f,0x6e,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x03,0x13,0x13,0x47,0x54
+,0x45,0x20,0x43,0x79,0x62,0x65,0x72,0x54
+,0x72,0x75,0x73,0x74,0x20,0x52,0x6f,0x6f
+,0x74,0x30,0x81,0x9f,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x81,0x8d,0x00,0x30
+,0x81,0x89,0x02,0x81,0x81,0x00,0xb8,0xe6
+,0x4f,0xba,0xdb,0x98,0x7c,0x71,0x7c,0xaf
+,0x44,0xb7,0xd3,0x0f,0x46,0xd9,0x64,0xe5
+,0x93,0xc1,0x42,0x8e,0xc7,0xba,0x49,0x8d
+,0x35,0x2d,0x7a,0xe7,0x8b,0xbd,0xe5,0x05
+,0x31,0x59,0xc6,0xb1,0x2f,0x0a,0x0c,0xfb
+,0x9f,0xa7,0x3f,0xa2,0x09,0x66,0x84,0x56
+,0x1e,0x37,0x29,0x1b,0x87,0xe9,0x7e,0x0c
+,0xca,0x9a,0x9f,0xa5,0x7f,0xf5,0x15,0x94
+,0xa3,0xd5,0xa2,0x46,0x82,0xd8,0x68,0x4c
+,0xd1,0x37,0x15,0x06,0x68,0xaf,0xbd,0xf8
+,0xb0,0xb3,0xf0,0x29,0xf5,0x95,0x5a,0x09
+,0x16,0x61,0x77,0x0a,0x22,0x25,0xd4,0x4f
+,0x45,0xaa,0xc7,0xbd,0xe5,0x96,0xdf,0xf9
+,0xd4,0xa8,0x8e,0x42,0xcc,0x24,0xc0,0x1e
+,0x91,0x27,0x4a,0xb5,0x6d,0x06,0x80,0x63
+,0x39,0xc4,0xa2,0x5e,0x38,0x03,0x02,0x03
+,0x01,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04
+,0x05,0x00,0x03,0x81,0x81,0x00,0x12,0xb3
+,0x75,0xc6,0x5f,0x1d,0xe1,0x61,0x55,0x80
+,0x00,0xd4,0x81,0x4b,0x7b,0x31,0x0f,0x23
+,0x63,0xe7,0x3d,0xf3,0x03,0xf9,0xf4,0x36
+,0xa8,0xbb,0xd9,0xe3,0xa5,0x97,0x4d,0xea
+,0x2b,0x29,0xe0,0xd6,0x6a,0x73,0x81,0xe6
+,0xc0,0x89,0xa3,0xd3,0xf1,0xe0,0xa5,0xa5
+,0x22,0x37,0x9a,0x63,0xc2,0x48,0x20,0xb4
+,0xdb,0x72,0xe3,0xc8,0xf6,0xd9,0x7c,0xbe
+,0xb1,0xaf,0x53,0xda,0x14,0xb4,0x21,0xb8
+,0xd6,0xd5,0x96,0xe3,0xfe,0x4e,0x0c,0x59
+,0x62,0xb6,0x9a,0x4a,0xf9,0x42,0xdd,0x8c
+,0x6f,0x81,0xa9,0x71,0xff,0xf4,0x0a,0x72
+,0x6d,0x6d,0x44,0x0e,0x9d,0xf3,0x74,0x74
+,0xa8,0xd5,0x34,0x49,0xe9,0x5e,0x9e,0xe9
+,0xb4,0x7a,0xe1,0xe5,0x5a,0x1f,0x84,0x30
+,0x9c,0xd3,0x9f,0xa5,0x25,0xd8};
+const unsigned int NptTlsTrustAnchor_Base_0001_Size = 510;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0002.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0002.cpp
new file mode 100644
index 0000000..6334be2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0002.cpp
@@ -0,0 +1,112 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GTE CyberTrust Global Root */
+const unsigned char NptTlsTrustAnchor_Base_0002_Data[606] = {
+0x30,0x82,0x02,0x5a,0x30,0x82,0x01,0xc3
+,0x02,0x02,0x01,0xa5,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x04,0x05,0x00,0x30,0x75,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x18,0x30,0x16,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0f,0x47,0x54,0x45
+,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61
+,0x74,0x69,0x6f,0x6e,0x31,0x27,0x30,0x25
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x1e,0x47
+,0x54,0x45,0x20,0x43,0x79,0x62,0x65,0x72
+,0x54,0x72,0x75,0x73,0x74,0x20,0x53,0x6f
+,0x6c,0x75,0x74,0x69,0x6f,0x6e,0x73,0x2c
+,0x20,0x49,0x6e,0x63,0x2e,0x31,0x23,0x30
+,0x21,0x06,0x03,0x55,0x04,0x03,0x13,0x1a
+,0x47,0x54,0x45,0x20,0x43,0x79,0x62,0x65
+,0x72,0x54,0x72,0x75,0x73,0x74,0x20,0x47
+,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x52,0x6f
+,0x6f,0x74,0x30,0x1e,0x17,0x0d,0x39,0x38
+,0x30,0x38,0x31,0x33,0x30,0x30,0x32,0x39
+,0x30,0x30,0x5a,0x17,0x0d,0x31,0x38,0x30
+,0x38,0x31,0x33,0x32,0x33,0x35,0x39,0x30
+,0x30,0x5a,0x30,0x75,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x18,0x30,0x16,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0f,0x47,0x54,0x45,0x20
+,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74
+,0x69,0x6f,0x6e,0x31,0x27,0x30,0x25,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x1e,0x47,0x54
+,0x45,0x20,0x43,0x79,0x62,0x65,0x72,0x54
+,0x72,0x75,0x73,0x74,0x20,0x53,0x6f,0x6c
+,0x75,0x74,0x69,0x6f,0x6e,0x73,0x2c,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x23,0x30,0x21
+,0x06,0x03,0x55,0x04,0x03,0x13,0x1a,0x47
+,0x54,0x45,0x20,0x43,0x79,0x62,0x65,0x72
+,0x54,0x72,0x75,0x73,0x74,0x20,0x47,0x6c
+,0x6f,0x62,0x61,0x6c,0x20,0x52,0x6f,0x6f
+,0x74,0x30,0x81,0x9f,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x81,0x8d,0x00,0x30
+,0x81,0x89,0x02,0x81,0x81,0x00,0x95,0x0f
+,0xa0,0xb6,0xf0,0x50,0x9c,0xe8,0x7a,0xc7
+,0x88,0xcd,0xdd,0x17,0x0e,0x2e,0xb0,0x94
+,0xd0,0x1b,0x3d,0x0e,0xf6,0x94,0xc0,0x8a
+,0x94,0xc7,0x06,0xc8,0x90,0x97,0xc8,0xb8
+,0x64,0x1a,0x7a,0x7e,0x6c,0x3c,0x53,0xe1
+,0x37,0x28,0x73,0x60,0x7f,0xb2,0x97,0x53
+,0x07,0x9f,0x53,0xf9,0x6d,0x58,0x94,0xd2
+,0xaf,0x8d,0x6d,0x88,0x67,0x80,0xe6,0xed
+,0xb2,0x95,0xcf,0x72,0x31,0xca,0xa5,0x1c
+,0x72,0xba,0x5c,0x02,0xe7,0x64,0x42,0xe7
+,0xf9,0xa9,0x2c,0xd6,0x3a,0x0d,0xac,0x8d
+,0x42,0xaa,0x24,0x01,0x39,0xe6,0x9c,0x3f
+,0x01,0x85,0x57,0x0d,0x58,0x87,0x45,0xf8
+,0xd3,0x85,0xaa,0x93,0x69,0x26,0x85,0x70
+,0x48,0x80,0x3f,0x12,0x15,0xc7,0x79,0xb4
+,0x1f,0x05,0x2f,0x3b,0x62,0x99,0x02,0x03
+,0x01,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04
+,0x05,0x00,0x03,0x81,0x81,0x00,0x6d,0xeb
+,0x1b,0x09,0xe9,0x5e,0xd9,0x51,0xdb,0x67
+,0x22,0x61,0xa4,0x2a,0x3c,0x48,0x77,0xe3
+,0xa0,0x7c,0xa6,0xde,0x73,0xa2,0x14,0x03
+,0x85,0x3d,0xfb,0xab,0x0e,0x30,0xc5,0x83
+,0x16,0x33,0x81,0x13,0x08,0x9e,0x7b,0x34
+,0x4e,0xdf,0x40,0xc8,0x74,0xd7,0xb9,0x7d
+,0xdc,0xf4,0x76,0x55,0x7d,0x9b,0x63,0x54
+,0x18,0xe9,0xf0,0xea,0xf3,0x5c,0xb1,0xd9
+,0x8b,0x42,0x1e,0xb9,0xc0,0x95,0x4e,0xba
+,0xfa,0xd5,0xe2,0x7c,0xf5,0x68,0x61,0xbf
+,0x8e,0xec,0x05,0x97,0x5f,0x5b,0xb0,0xd7
+,0xa3,0x85,0x34,0xc4,0x24,0xa7,0x0d,0x0f
+,0x95,0x93,0xef,0xcb,0x94,0xd8,0x9e,0x1f
+,0x9d,0x5c,0x85,0x6d,0xc7,0xaa,0xae,0x4f
+,0x1f,0x22,0xb5,0xcd,0x95,0xad,0xba,0xa7
+,0xcc,0xf9,0xab,0x0b,0x7a,0x7f};
+const unsigned int NptTlsTrustAnchor_Base_0002_Size = 606;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0003.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0003.cpp
new file mode 100644
index 0000000..26abdf6
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0003.cpp
@@ -0,0 +1,137 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Thawte Personal Basic CA */
+const unsigned char NptTlsTrustAnchor_Base_0003_Data[805] = {
+0x30,0x82,0x03,0x21,0x30,0x82,0x02,0x8a
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x81,0xcb,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x5a,0x41,0x31
+,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x08
+,0x13,0x0c,0x57,0x65,0x73,0x74,0x65,0x72
+,0x6e,0x20,0x43,0x61,0x70,0x65,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x07,0x13
+,0x09,0x43,0x61,0x70,0x65,0x20,0x54,0x6f
+,0x77,0x6e,0x31,0x1a,0x30,0x18,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x11,0x54,0x68,0x61
+,0x77,0x74,0x65,0x20,0x43,0x6f,0x6e,0x73
+,0x75,0x6c,0x74,0x69,0x6e,0x67,0x31,0x28
+,0x30,0x26,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x1f,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x20
+,0x44,0x69,0x76,0x69,0x73,0x69,0x6f,0x6e
+,0x31,0x21,0x30,0x1f,0x06,0x03,0x55,0x04
+,0x03,0x13,0x18,0x54,0x68,0x61,0x77,0x74
+,0x65,0x20,0x50,0x65,0x72,0x73,0x6f,0x6e
+,0x61,0x6c,0x20,0x42,0x61,0x73,0x69,0x63
+,0x20,0x43,0x41,0x31,0x28,0x30,0x26,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x09,0x01,0x16,0x19,0x70,0x65,0x72,0x73
+,0x6f,0x6e,0x61,0x6c,0x2d,0x62,0x61,0x73
+,0x69,0x63,0x40,0x74,0x68,0x61,0x77,0x74
+,0x65,0x2e,0x63,0x6f,0x6d,0x30,0x1e,0x17
+,0x0d,0x39,0x36,0x30,0x31,0x30,0x31,0x30
+,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x32,0x30,0x31,0x32,0x33,0x31,0x32,0x33
+,0x35,0x39,0x35,0x39,0x5a,0x30,0x81,0xcb
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x5a,0x41,0x31,0x15,0x30
+,0x13,0x06,0x03,0x55,0x04,0x08,0x13,0x0c
+,0x57,0x65,0x73,0x74,0x65,0x72,0x6e,0x20
+,0x43,0x61,0x70,0x65,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x43
+,0x61,0x70,0x65,0x20,0x54,0x6f,0x77,0x6e
+,0x31,0x1a,0x30,0x18,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x11,0x54,0x68,0x61,0x77,0x74
+,0x65,0x20,0x43,0x6f,0x6e,0x73,0x75,0x6c
+,0x74,0x69,0x6e,0x67,0x31,0x28,0x30,0x26
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x1f,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x53,0x65,0x72
+,0x76,0x69,0x63,0x65,0x73,0x20,0x44,0x69
+,0x76,0x69,0x73,0x69,0x6f,0x6e,0x31,0x21
+,0x30,0x1f,0x06,0x03,0x55,0x04,0x03,0x13
+,0x18,0x54,0x68,0x61,0x77,0x74,0x65,0x20
+,0x50,0x65,0x72,0x73,0x6f,0x6e,0x61,0x6c
+,0x20,0x42,0x61,0x73,0x69,0x63,0x20,0x43
+,0x41,0x31,0x28,0x30,0x26,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x01
+,0x16,0x19,0x70,0x65,0x72,0x73,0x6f,0x6e
+,0x61,0x6c,0x2d,0x62,0x61,0x73,0x69,0x63
+,0x40,0x74,0x68,0x61,0x77,0x74,0x65,0x2e
+,0x63,0x6f,0x6d,0x30,0x81,0x9f,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d
+,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00
+,0xbc,0xbc,0x93,0x53,0x6d,0xc0,0x50,0x4f
+,0x82,0x15,0xe6,0x48,0x94,0x35,0xa6,0x5a
+,0xbe,0x6f,0x42,0xfa,0x0f,0x47,0xee,0x77
+,0x75,0x72,0xdd,0x8d,0x49,0x9b,0x96,0x57
+,0xa0,0x78,0xd4,0xca,0x3f,0x51,0xb3,0x69
+,0x0b,0x91,0x76,0x17,0x22,0x07,0x97,0x6a
+,0xc4,0x51,0x93,0x4b,0xe0,0x8d,0xef,0x37
+,0x95,0xa1,0x0c,0x4d,0xda,0x34,0x90,0x1d
+,0x17,0x89,0x97,0xe0,0x35,0x38,0x57,0x4a
+,0xc0,0xf4,0x08,0x70,0xe9,0x3c,0x44,0x7b
+,0x50,0x7e,0x61,0x9a,0x90,0xe3,0x23,0xd3
+,0x88,0x11,0x46,0x27,0xf5,0x0b,0x07,0x0e
+,0xbb,0xdd,0xd1,0x7f,0x20,0x0a,0x88,0xb9
+,0x56,0x0b,0x2e,0x1c,0x80,0xda,0xf1,0xe3
+,0x9e,0x29,0xef,0x14,0xbd,0x0a,0x44,0xfb
+,0x1b,0x5b,0x18,0xd1,0xbf,0x23,0x93,0x21
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x13,0x30
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04,0x05
+,0x00,0x03,0x81,0x81,0x00,0x2d,0xe2,0x99
+,0x6b,0xb0,0x3d,0x7a,0x89,0xd7,0x59,0xa2
+,0x94,0x01,0x1f,0x2b,0xdd,0x12,0x4b,0x53
+,0xc2,0xad,0x7f,0xaa,0xa7,0x00,0x5c,0x91
+,0x40,0x57,0x25,0x4a,0x38,0xaa,0x84,0x70
+,0xb9,0xd9,0x80,0x0f,0xa5,0x7b,0x5c,0xfb
+,0x73,0xc6,0xbd,0xd7,0x8a,0x61,0x5c,0x03
+,0xe3,0x2d,0x27,0xa8,0x17,0xe0,0x84,0x85
+,0x42,0xdc,0x5e,0x9b,0xc6,0xb7,0xb2,0x6d
+,0xbb,0x74,0xaf,0xe4,0x3f,0xcb,0xa7,0xb7
+,0xb0,0xe0,0x5d,0xbe,0x78,0x83,0x25,0x94
+,0xd2,0xdb,0x81,0x0f,0x79,0x07,0x6d,0x4f
+,0xf4,0x39,0x15,0x5a,0x52,0x01,0x7b,0xde
+,0x32,0xd6,0x4d,0x38,0xf6,0x12,0x5c,0x06
+,0x50,0xdf,0x05,0x5b,0xbd,0x14,0x4b,0xa1
+,0xdf,0x29,0xba,0x3b,0x41,0x8d,0xf7,0x63
+,0x56,0xa1,0xdf,0x22,0xb1};
+const unsigned int NptTlsTrustAnchor_Base_0003_Size = 805;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0004.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0004.cpp
new file mode 100644
index 0000000..d09a200
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0004.cpp
@@ -0,0 +1,138 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Thawte Personal Premium CA */
+const unsigned char NptTlsTrustAnchor_Base_0004_Data[813] = {
+0x30,0x82,0x03,0x29,0x30,0x82,0x02,0x92
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x81,0xcf,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x5a,0x41,0x31
+,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x08
+,0x13,0x0c,0x57,0x65,0x73,0x74,0x65,0x72
+,0x6e,0x20,0x43,0x61,0x70,0x65,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x07,0x13
+,0x09,0x43,0x61,0x70,0x65,0x20,0x54,0x6f
+,0x77,0x6e,0x31,0x1a,0x30,0x18,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x11,0x54,0x68,0x61
+,0x77,0x74,0x65,0x20,0x43,0x6f,0x6e,0x73
+,0x75,0x6c,0x74,0x69,0x6e,0x67,0x31,0x28
+,0x30,0x26,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x1f,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x20
+,0x44,0x69,0x76,0x69,0x73,0x69,0x6f,0x6e
+,0x31,0x23,0x30,0x21,0x06,0x03,0x55,0x04
+,0x03,0x13,0x1a,0x54,0x68,0x61,0x77,0x74
+,0x65,0x20,0x50,0x65,0x72,0x73,0x6f,0x6e
+,0x61,0x6c,0x20,0x50,0x72,0x65,0x6d,0x69
+,0x75,0x6d,0x20,0x43,0x41,0x31,0x2a,0x30
+,0x28,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x09,0x01,0x16,0x1b,0x70,0x65
+,0x72,0x73,0x6f,0x6e,0x61,0x6c,0x2d,0x70
+,0x72,0x65,0x6d,0x69,0x75,0x6d,0x40,0x74
+,0x68,0x61,0x77,0x74,0x65,0x2e,0x63,0x6f
+,0x6d,0x30,0x1e,0x17,0x0d,0x39,0x36,0x30
+,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30
+,0x30,0x5a,0x17,0x0d,0x32,0x30,0x31,0x32
+,0x33,0x31,0x32,0x33,0x35,0x39,0x35,0x39
+,0x5a,0x30,0x81,0xcf,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x5a
+,0x41,0x31,0x15,0x30,0x13,0x06,0x03,0x55
+,0x04,0x08,0x13,0x0c,0x57,0x65,0x73,0x74
+,0x65,0x72,0x6e,0x20,0x43,0x61,0x70,0x65
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x07,0x13,0x09,0x43,0x61,0x70,0x65,0x20
+,0x54,0x6f,0x77,0x6e,0x31,0x1a,0x30,0x18
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x11,0x54
+,0x68,0x61,0x77,0x74,0x65,0x20,0x43,0x6f
+,0x6e,0x73,0x75,0x6c,0x74,0x69,0x6e,0x67
+,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x1f,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65
+,0x73,0x20,0x44,0x69,0x76,0x69,0x73,0x69
+,0x6f,0x6e,0x31,0x23,0x30,0x21,0x06,0x03
+,0x55,0x04,0x03,0x13,0x1a,0x54,0x68,0x61
+,0x77,0x74,0x65,0x20,0x50,0x65,0x72,0x73
+,0x6f,0x6e,0x61,0x6c,0x20,0x50,0x72,0x65
+,0x6d,0x69,0x75,0x6d,0x20,0x43,0x41,0x31
+,0x2a,0x30,0x28,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x1b
+,0x70,0x65,0x72,0x73,0x6f,0x6e,0x61,0x6c
+,0x2d,0x70,0x72,0x65,0x6d,0x69,0x75,0x6d
+,0x40,0x74,0x68,0x61,0x77,0x74,0x65,0x2e
+,0x63,0x6f,0x6d,0x30,0x81,0x9f,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d
+,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00
+,0xc9,0x66,0xd9,0xf8,0x07,0x44,0xcf,0xb9
+,0x8c,0x2e,0xf0,0xa1,0xef,0x13,0x45,0x6c
+,0x05,0xdf,0xde,0x27,0x16,0x51,0x36,0x41
+,0x11,0x6c,0x6c,0x3b,0xed,0xfe,0x10,0x7d
+,0x12,0x9e,0xe5,0x9b,0x42,0x9a,0xfe,0x60
+,0x31,0xc3,0x66,0xb7,0x73,0x3a,0x48,0xae
+,0x4e,0xd0,0x32,0x37,0x94,0x88,0xb5,0x0d
+,0xb6,0xd9,0xf3,0xf2,0x44,0xd9,0xd5,0x88
+,0x12,0xdd,0x76,0x4d,0xf2,0x1a,0xfc,0x6f
+,0x23,0x1e,0x7a,0xf1,0xd8,0x98,0x45,0x4e
+,0x07,0x10,0xef,0x16,0x42,0xd0,0x43,0x75
+,0x6d,0x4a,0xde,0xe2,0xaa,0xc9,0x31,0xff
+,0x1f,0x00,0x70,0x7c,0x66,0xcf,0x10,0x25
+,0x08,0xba,0xfa,0xee,0x00,0xe9,0x46,0x03
+,0x66,0x27,0x11,0x15,0x3b,0xaa,0x5b,0xf2
+,0x98,0xdd,0x36,0x42,0xb2,0xda,0x88,0x75
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x13,0x30
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04,0x05
+,0x00,0x03,0x81,0x81,0x00,0x69,0x36,0x89
+,0xf7,0x34,0x2a,0x33,0x72,0x2f,0x6d,0x3b
+,0xd4,0x22,0xb2,0xb8,0x6f,0x9a,0xc5,0x36
+,0x66,0x0e,0x1b,0x3c,0xa1,0xb1,0x75,0x5a
+,0xe6,0xfd,0x35,0xd3,0xf8,0xa8,0xf2,0x07
+,0x6f,0x85,0x67,0x8e,0xde,0x2b,0xb9,0xe2
+,0x17,0xb0,0x3a,0xa0,0xf0,0x0e,0xa2,0x00
+,0x9a,0xdf,0xf3,0x14,0x15,0x6e,0xbb,0xc8
+,0x85,0x5a,0x98,0x80,0xf9,0xff,0xbe,0x74
+,0x1d,0x3d,0xf3,0xfe,0x30,0x25,0xd1,0x37
+,0x34,0x67,0xfa,0xa5,0x71,0x79,0x30,0x61
+,0x29,0x72,0xc0,0xe0,0x2c,0x4c,0xfb,0x56
+,0xe4,0x3a,0xa8,0x6f,0xe5,0x32,0x59,0x52
+,0xdb,0x75,0x28,0x50,0x59,0x0c,0xf8,0x0b
+,0x19,0xe4,0xac,0xd9,0xaf,0x96,0x8d,0x2f
+,0x50,0xdb,0x07,0xc3,0xea,0x1f,0xab,0x33
+,0xe0,0xf5,0x2b,0x31,0x89};
+const unsigned int NptTlsTrustAnchor_Base_0004_Size = 813;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0005.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0005.cpp
new file mode 100644
index 0000000..71c5220
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0005.cpp
@@ -0,0 +1,139 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Thawte Personal Freemail CA */
+const unsigned char NptTlsTrustAnchor_Base_0005_Data[817] = {
+0x30,0x82,0x03,0x2d,0x30,0x82,0x02,0x96
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x81,0xd1,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x5a,0x41,0x31
+,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x08
+,0x13,0x0c,0x57,0x65,0x73,0x74,0x65,0x72
+,0x6e,0x20,0x43,0x61,0x70,0x65,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x07,0x13
+,0x09,0x43,0x61,0x70,0x65,0x20,0x54,0x6f
+,0x77,0x6e,0x31,0x1a,0x30,0x18,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x11,0x54,0x68,0x61
+,0x77,0x74,0x65,0x20,0x43,0x6f,0x6e,0x73
+,0x75,0x6c,0x74,0x69,0x6e,0x67,0x31,0x28
+,0x30,0x26,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x1f,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x20
+,0x44,0x69,0x76,0x69,0x73,0x69,0x6f,0x6e
+,0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04
+,0x03,0x13,0x1b,0x54,0x68,0x61,0x77,0x74
+,0x65,0x20,0x50,0x65,0x72,0x73,0x6f,0x6e
+,0x61,0x6c,0x20,0x46,0x72,0x65,0x65,0x6d
+,0x61,0x69,0x6c,0x20,0x43,0x41,0x31,0x2b
+,0x30,0x29,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x1c,0x70
+,0x65,0x72,0x73,0x6f,0x6e,0x61,0x6c,0x2d
+,0x66,0x72,0x65,0x65,0x6d,0x61,0x69,0x6c
+,0x40,0x74,0x68,0x61,0x77,0x74,0x65,0x2e
+,0x63,0x6f,0x6d,0x30,0x1e,0x17,0x0d,0x39
+,0x36,0x30,0x31,0x30,0x31,0x30,0x30,0x30
+,0x30,0x30,0x30,0x5a,0x17,0x0d,0x32,0x30
+,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39
+,0x35,0x39,0x5a,0x30,0x81,0xd1,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x5a,0x41,0x31,0x15,0x30,0x13,0x06
+,0x03,0x55,0x04,0x08,0x13,0x0c,0x57,0x65
+,0x73,0x74,0x65,0x72,0x6e,0x20,0x43,0x61
+,0x70,0x65,0x31,0x12,0x30,0x10,0x06,0x03
+,0x55,0x04,0x07,0x13,0x09,0x43,0x61,0x70
+,0x65,0x20,0x54,0x6f,0x77,0x6e,0x31,0x1a
+,0x30,0x18,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x11,0x54,0x68,0x61,0x77,0x74,0x65,0x20
+,0x43,0x6f,0x6e,0x73,0x75,0x6c,0x74,0x69
+,0x6e,0x67,0x31,0x28,0x30,0x26,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x1f,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x44,0x69,0x76,0x69
+,0x73,0x69,0x6f,0x6e,0x31,0x24,0x30,0x22
+,0x06,0x03,0x55,0x04,0x03,0x13,0x1b,0x54
+,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x65
+,0x72,0x73,0x6f,0x6e,0x61,0x6c,0x20,0x46
+,0x72,0x65,0x65,0x6d,0x61,0x69,0x6c,0x20
+,0x43,0x41,0x31,0x2b,0x30,0x29,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09
+,0x01,0x16,0x1c,0x70,0x65,0x72,0x73,0x6f
+,0x6e,0x61,0x6c,0x2d,0x66,0x72,0x65,0x65
+,0x6d,0x61,0x69,0x6c,0x40,0x74,0x68,0x61
+,0x77,0x74,0x65,0x2e,0x63,0x6f,0x6d,0x30
+,0x81,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x81,0x8d,0x00,0x30,0x81,0x89
+,0x02,0x81,0x81,0x00,0xd4,0x69,0xd7,0xd4
+,0xb0,0x94,0x64,0x5b,0x71,0xe9,0x47,0xd8
+,0x0c,0x51,0xb6,0xea,0x72,0x91,0xb0,0x84
+,0x5e,0x7d,0x2d,0x0d,0x8f,0x7b,0x12,0xdf
+,0x85,0x25,0x75,0x28,0x74,0x3a,0x42,0x2c
+,0x63,0x27,0x9f,0x95,0x7b,0x4b,0xef,0x7e
+,0x19,0x87,0x1d,0x86,0xea,0xa3,0xdd,0xb9
+,0xce,0x96,0x64,0x1a,0xc2,0x14,0x6e,0x44
+,0xac,0x7c,0xe6,0x8f,0xe8,0x4d,0x0f,0x71
+,0x1f,0x40,0x38,0xa6,0x00,0xa3,0x87,0x78
+,0xf6,0xf9,0x94,0x86,0x5e,0xad,0xea,0xc0
+,0x5e,0x76,0xeb,0xd9,0x14,0xa3,0x5d,0x6e
+,0x7a,0x7c,0x0c,0xa5,0x4b,0x55,0x7f,0x06
+,0x19,0x29,0x7f,0x9e,0x9a,0x26,0xd5,0x6a
+,0xbb,0x38,0x24,0x08,0x6a,0x98,0xc7,0xb1
+,0xda,0xa3,0x98,0x91,0xfd,0x79,0xdb,0xe5
+,0x5a,0xc4,0x1c,0xb9,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x13,0x30,0x11,0x30,0x0f,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x04,0x05,0x00,0x03,0x81,0x81
+,0x00,0xc7,0xec,0x92,0x7e,0x4e,0xf8,0xf5
+,0x96,0xa5,0x67,0x62,0x2a,0xa4,0xf0,0x4d
+,0x11,0x60,0xd0,0x6f,0x8d,0x60,0x58,0x61
+,0xac,0x26,0xbb,0x52,0x35,0x5c,0x08,0xcf
+,0x30,0xfb,0xa8,0x4a,0x96,0x8a,0x1f,0x62
+,0x42,0x23,0x8c,0x17,0x0f,0xf4,0xba,0x64
+,0x9c,0x17,0xac,0x47,0x29,0xdf,0x9d,0x98
+,0x5e,0xd2,0x6c,0x60,0x71,0x5c,0xa2,0xac
+,0xdc,0x79,0xe3,0xe7,0x6e,0x00,0x47,0x1f
+,0xb5,0x0d,0x28,0xe8,0x02,0x9d,0xe4,0x9a
+,0xfd,0x13,0xf4,0xa6,0xd9,0x7c,0xb1,0xf8
+,0xdc,0x5f,0x23,0x26,0x09,0x91,0x80,0x73
+,0xd0,0x14,0x1b,0xde,0x43,0xa9,0x83,0x25
+,0xf2,0xe6,0x9c,0x2f,0x15,0xca,0xfe,0xa6
+,0xab,0x8a,0x07,0x75,0x8b,0x0c,0xdd,0x51
+,0x84,0x6b,0xe4,0xf8,0xd1,0xce,0x77,0xa2
+,0x81};
+const unsigned int NptTlsTrustAnchor_Base_0005_Size = 817;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0006.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0006.cpp
new file mode 100644
index 0000000..b2dd336
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0006.cpp
@@ -0,0 +1,135 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Thawte Server CA */
+const unsigned char NptTlsTrustAnchor_Base_0006_Data[791] = {
+0x30,0x82,0x03,0x13,0x30,0x82,0x02,0x7c
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x81,0xc4,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x5a,0x41,0x31
+,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x08
+,0x13,0x0c,0x57,0x65,0x73,0x74,0x65,0x72
+,0x6e,0x20,0x43,0x61,0x70,0x65,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x07,0x13
+,0x09,0x43,0x61,0x70,0x65,0x20,0x54,0x6f
+,0x77,0x6e,0x31,0x1d,0x30,0x1b,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x14,0x54,0x68,0x61
+,0x77,0x74,0x65,0x20,0x43,0x6f,0x6e,0x73
+,0x75,0x6c,0x74,0x69,0x6e,0x67,0x20,0x63
+,0x63,0x31,0x28,0x30,0x26,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x1f,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x53,0x65,0x72,0x76,0x69,0x63
+,0x65,0x73,0x20,0x44,0x69,0x76,0x69,0x73
+,0x69,0x6f,0x6e,0x31,0x19,0x30,0x17,0x06
+,0x03,0x55,0x04,0x03,0x13,0x10,0x54,0x68
+,0x61,0x77,0x74,0x65,0x20,0x53,0x65,0x72
+,0x76,0x65,0x72,0x20,0x43,0x41,0x31,0x26
+,0x30,0x24,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x17,0x73
+,0x65,0x72,0x76,0x65,0x72,0x2d,0x63,0x65
+,0x72,0x74,0x73,0x40,0x74,0x68,0x61,0x77
+,0x74,0x65,0x2e,0x63,0x6f,0x6d,0x30,0x1e
+,0x17,0x0d,0x39,0x36,0x30,0x38,0x30,0x31
+,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x17
+,0x0d,0x32,0x30,0x31,0x32,0x33,0x31,0x32
+,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x81
+,0xc4,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x5a,0x41,0x31,0x15
+,0x30,0x13,0x06,0x03,0x55,0x04,0x08,0x13
+,0x0c,0x57,0x65,0x73,0x74,0x65,0x72,0x6e
+,0x20,0x43,0x61,0x70,0x65,0x31,0x12,0x30
+,0x10,0x06,0x03,0x55,0x04,0x07,0x13,0x09
+,0x43,0x61,0x70,0x65,0x20,0x54,0x6f,0x77
+,0x6e,0x31,0x1d,0x30,0x1b,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x14,0x54,0x68,0x61,0x77
+,0x74,0x65,0x20,0x43,0x6f,0x6e,0x73,0x75
+,0x6c,0x74,0x69,0x6e,0x67,0x20,0x63,0x63
+,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x1f,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65
+,0x73,0x20,0x44,0x69,0x76,0x69,0x73,0x69
+,0x6f,0x6e,0x31,0x19,0x30,0x17,0x06,0x03
+,0x55,0x04,0x03,0x13,0x10,0x54,0x68,0x61
+,0x77,0x74,0x65,0x20,0x53,0x65,0x72,0x76
+,0x65,0x72,0x20,0x43,0x41,0x31,0x26,0x30
+,0x24,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x09,0x01,0x16,0x17,0x73,0x65
+,0x72,0x76,0x65,0x72,0x2d,0x63,0x65,0x72
+,0x74,0x73,0x40,0x74,0x68,0x61,0x77,0x74
+,0x65,0x2e,0x63,0x6f,0x6d,0x30,0x81,0x9f
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x81,0x8d,0x00,0x30,0x81,0x89,0x02,0x81
+,0x81,0x00,0xd3,0xa4,0x50,0x6e,0xc8,0xff
+,0x56,0x6b,0xe6,0xcf,0x5d,0xb6,0xea,0x0c
+,0x68,0x75,0x47,0xa2,0xaa,0xc2,0xda,0x84
+,0x25,0xfc,0xa8,0xf4,0x47,0x51,0xda,0x85
+,0xb5,0x20,0x74,0x94,0x86,0x1e,0x0f,0x75
+,0xc9,0xe9,0x08,0x61,0xf5,0x06,0x6d,0x30
+,0x6e,0x15,0x19,0x02,0xe9,0x52,0xc0,0x62
+,0xdb,0x4d,0x99,0x9e,0xe2,0x6a,0x0c,0x44
+,0x38,0xcd,0xfe,0xbe,0xe3,0x64,0x09,0x70
+,0xc5,0xfe,0xb1,0x6b,0x29,0xb6,0x2f,0x49
+,0xc8,0x3b,0xd4,0x27,0x04,0x25,0x10,0x97
+,0x2f,0xe7,0x90,0x6d,0xc0,0x28,0x42,0x99
+,0xd7,0x4c,0x43,0xde,0xc3,0xf5,0x21,0x6d
+,0x54,0x9f,0x5d,0xc3,0x58,0xe1,0xc0,0xe4
+,0xd9,0x5b,0xb0,0xb8,0xdc,0xb4,0x7b,0xdf
+,0x36,0x3a,0xc2,0xb5,0x66,0x22,0x12,0xd6
+,0x87,0x0d,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x13,0x30,0x11,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x04,0x05,0x00,0x03,0x81,0x81,0x00,0x07
+,0xfa,0x4c,0x69,0x5c,0xfb,0x95,0xcc,0x46
+,0xee,0x85,0x83,0x4d,0x21,0x30,0x8e,0xca
+,0xd9,0xa8,0x6f,0x49,0x1a,0xe6,0xda,0x51
+,0xe3,0x60,0x70,0x6c,0x84,0x61,0x11,0xa1
+,0x1a,0xc8,0x48,0x3e,0x59,0x43,0x7d,0x4f
+,0x95,0x3d,0xa1,0x8b,0xb7,0x0b,0x62,0x98
+,0x7a,0x75,0x8a,0xdd,0x88,0x4e,0x4e,0x9e
+,0x40,0xdb,0xa8,0xcc,0x32,0x74,0xb9,0x6f
+,0x0d,0xc6,0xe3,0xb3,0x44,0x0b,0xd9,0x8a
+,0x6f,0x9a,0x29,0x9b,0x99,0x18,0x28,0x3b
+,0xd1,0xe3,0x40,0x28,0x9a,0x5a,0x3c,0xd5
+,0xb5,0xe7,0x20,0x1b,0x8b,0xca,0xa4,0xab
+,0x8d,0xe9,0x51,0xd9,0xe2,0x4c,0x2c,0x59
+,0xa9,0xda,0xb9,0xb2,0x75,0x1b,0xf6,0x42
+,0xf2,0xef,0xc7,0xf2,0x18,0xf9,0x89,0xbc
+,0xa3,0xff,0x8a,0x23,0x2e,0x70,0x47};
+const unsigned int NptTlsTrustAnchor_Base_0006_Size = 791;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0007.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0007.cpp
new file mode 100644
index 0000000..a02c7b7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0007.cpp
@@ -0,0 +1,138 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Thawte Premium Server CA */
+const unsigned char NptTlsTrustAnchor_Base_0007_Data[811] = {
+0x30,0x82,0x03,0x27,0x30,0x82,0x02,0x90
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x81,0xce,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x5a,0x41,0x31
+,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x08
+,0x13,0x0c,0x57,0x65,0x73,0x74,0x65,0x72
+,0x6e,0x20,0x43,0x61,0x70,0x65,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x07,0x13
+,0x09,0x43,0x61,0x70,0x65,0x20,0x54,0x6f
+,0x77,0x6e,0x31,0x1d,0x30,0x1b,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x14,0x54,0x68,0x61
+,0x77,0x74,0x65,0x20,0x43,0x6f,0x6e,0x73
+,0x75,0x6c,0x74,0x69,0x6e,0x67,0x20,0x63
+,0x63,0x31,0x28,0x30,0x26,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x1f,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x53,0x65,0x72,0x76,0x69,0x63
+,0x65,0x73,0x20,0x44,0x69,0x76,0x69,0x73
+,0x69,0x6f,0x6e,0x31,0x21,0x30,0x1f,0x06
+,0x03,0x55,0x04,0x03,0x13,0x18,0x54,0x68
+,0x61,0x77,0x74,0x65,0x20,0x50,0x72,0x65
+,0x6d,0x69,0x75,0x6d,0x20,0x53,0x65,0x72
+,0x76,0x65,0x72,0x20,0x43,0x41,0x31,0x28
+,0x30,0x26,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x19,0x70
+,0x72,0x65,0x6d,0x69,0x75,0x6d,0x2d,0x73
+,0x65,0x72,0x76,0x65,0x72,0x40,0x74,0x68
+,0x61,0x77,0x74,0x65,0x2e,0x63,0x6f,0x6d
+,0x30,0x1e,0x17,0x0d,0x39,0x36,0x30,0x38
+,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30
+,0x5a,0x17,0x0d,0x32,0x30,0x31,0x32,0x33
+,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5a
+,0x30,0x81,0xce,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x5a,0x41
+,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04
+,0x08,0x13,0x0c,0x57,0x65,0x73,0x74,0x65
+,0x72,0x6e,0x20,0x43,0x61,0x70,0x65,0x31
+,0x12,0x30,0x10,0x06,0x03,0x55,0x04,0x07
+,0x13,0x09,0x43,0x61,0x70,0x65,0x20,0x54
+,0x6f,0x77,0x6e,0x31,0x1d,0x30,0x1b,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x14,0x54,0x68
+,0x61,0x77,0x74,0x65,0x20,0x43,0x6f,0x6e
+,0x73,0x75,0x6c,0x74,0x69,0x6e,0x67,0x20
+,0x63,0x63,0x31,0x28,0x30,0x26,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x1f,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x44,0x69,0x76,0x69
+,0x73,0x69,0x6f,0x6e,0x31,0x21,0x30,0x1f
+,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x54
+,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x72
+,0x65,0x6d,0x69,0x75,0x6d,0x20,0x53,0x65
+,0x72,0x76,0x65,0x72,0x20,0x43,0x41,0x31
+,0x28,0x30,0x26,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x19
+,0x70,0x72,0x65,0x6d,0x69,0x75,0x6d,0x2d
+,0x73,0x65,0x72,0x76,0x65,0x72,0x40,0x74
+,0x68,0x61,0x77,0x74,0x65,0x2e,0x63,0x6f
+,0x6d,0x30,0x81,0x9f,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x81,0x8d,0x00,0x30
+,0x81,0x89,0x02,0x81,0x81,0x00,0xd2,0x36
+,0x36,0x6a,0x8b,0xd7,0xc2,0x5b,0x9e,0xda
+,0x81,0x41,0x62,0x8f,0x38,0xee,0x49,0x04
+,0x55,0xd6,0xd0,0xef,0x1c,0x1b,0x95,0x16
+,0x47,0xef,0x18,0x48,0x35,0x3a,0x52,0xf4
+,0x2b,0x6a,0x06,0x8f,0x3b,0x2f,0xea,0x56
+,0xe3,0xaf,0x86,0x8d,0x9e,0x17,0xf7,0x9e
+,0xb4,0x65,0x75,0x02,0x4d,0xef,0xcb,0x09
+,0xa2,0x21,0x51,0xd8,0x9b,0xd0,0x67,0xd0
+,0xba,0x0d,0x92,0x06,0x14,0x73,0xd4,0x93
+,0xcb,0x97,0x2a,0x00,0x9c,0x5c,0x4e,0x0c
+,0xbc,0xfa,0x15,0x52,0xfc,0xf2,0x44,0x6e
+,0xda,0x11,0x4a,0x6e,0x08,0x9f,0x2f,0x2d
+,0xe3,0xf9,0xaa,0x3a,0x86,0x73,0xb6,0x46
+,0x53,0x58,0xc8,0x89,0x05,0xbd,0x83,0x11
+,0xb8,0x73,0x3f,0xaa,0x07,0x8d,0xf4,0x42
+,0x4d,0xe7,0x40,0x9d,0x1c,0x37,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x13,0x30,0x11,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x03
+,0x81,0x81,0x00,0x26,0x48,0x2c,0x16,0xc2
+,0x58,0xfa,0xe8,0x16,0x74,0x0c,0xaa,0xaa
+,0x5f,0x54,0x3f,0xf2,0xd7,0xc9,0x78,0x60
+,0x5e,0x5e,0x6e,0x37,0x63,0x22,0x77,0x36
+,0x7e,0xb2,0x17,0xc4,0x34,0xb9,0xf5,0x08
+,0x85,0xfc,0xc9,0x01,0x38,0xff,0x4d,0xbe
+,0xf2,0x16,0x42,0x43,0xe7,0xbb,0x5a,0x46
+,0xfb,0xc1,0xc6,0x11,0x1f,0xf1,0x4a,0xb0
+,0x28,0x46,0xc9,0xc3,0xc4,0x42,0x7d,0xbc
+,0xfa,0xab,0x59,0x6e,0xd5,0xb7,0x51,0x88
+,0x11,0xe3,0xa4,0x85,0x19,0x6b,0x82,0x4c
+,0xa4,0x0c,0x12,0xad,0xe9,0xa4,0xae,0x3f
+,0xf1,0xc3,0x49,0x65,0x9a,0x8c,0xc5,0xc8
+,0x3e,0x25,0xb7,0x94,0x99,0xbb,0x92,0x32
+,0x71,0x07,0xf0,0x86,0x5e,0xed,0x50,0x27
+,0xa6,0x0d,0xa6,0x23,0xf9,0xbb,0xcb,0xa6
+,0x07,0x14,0x42};
+const unsigned int NptTlsTrustAnchor_Base_0007_Size = 811;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0008.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0008.cpp
new file mode 100644
index 0000000..29b4921
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0008.cpp
@@ -0,0 +1,137 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Equifax Secure CA */
+const unsigned char NptTlsTrustAnchor_Base_0008_Data[804] = {
+0x30,0x82,0x03,0x20,0x30,0x82,0x02,0x89
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x35
+,0xde,0xf4,0xcf,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x4e,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x10,0x30,0x0e,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x07,0x45,0x71,0x75,0x69
+,0x66,0x61,0x78,0x31,0x2d,0x30,0x2b,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x24,0x45,0x71
+,0x75,0x69,0x66,0x61,0x78,0x20,0x53,0x65
+,0x63,0x75,0x72,0x65,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x30,0x1e,0x17,0x0d,0x39,0x38
+,0x30,0x38,0x32,0x32,0x31,0x36,0x34,0x31
+,0x35,0x31,0x5a,0x17,0x0d,0x31,0x38,0x30
+,0x38,0x32,0x32,0x31,0x36,0x34,0x31,0x35
+,0x31,0x5a,0x30,0x4e,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x10,0x30,0x0e,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x07,0x45,0x71,0x75,0x69
+,0x66,0x61,0x78,0x31,0x2d,0x30,0x2b,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x24,0x45,0x71
+,0x75,0x69,0x66,0x61,0x78,0x20,0x53,0x65
+,0x63,0x75,0x72,0x65,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x30,0x81,0x9f,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x81,0x8d,0x00
+,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xc1
+,0x5d,0xb1,0x58,0x67,0x08,0x62,0xee,0xa0
+,0x9a,0x2d,0x1f,0x08,0x6d,0x91,0x14,0x68
+,0x98,0x0a,0x1e,0xfe,0xda,0x04,0x6f,0x13
+,0x84,0x62,0x21,0xc3,0xd1,0x7c,0xce,0x9f
+,0x05,0xe0,0xb8,0x01,0xf0,0x4e,0x34,0xec
+,0xe2,0x8a,0x95,0x04,0x64,0xac,0xf1,0x6b
+,0x53,0x5f,0x05,0xb3,0xcb,0x67,0x80,0xbf
+,0x42,0x02,0x8e,0xfe,0xdd,0x01,0x09,0xec
+,0xe1,0x00,0x14,0x4f,0xfc,0xfb,0xf0,0x0c
+,0xdd,0x43,0xba,0x5b,0x2b,0xe1,0x1f,0x80
+,0x70,0x99,0x15,0x57,0x93,0x16,0xf1,0x0f
+,0x97,0x6a,0xb7,0xc2,0x68,0x23,0x1c,0xcc
+,0x4d,0x59,0x30,0xac,0x51,0x1e,0x3b,0xaf
+,0x2b,0xd6,0xee,0x63,0x45,0x7b,0xc5,0xd9
+,0x5f,0x50,0xd2,0xe3,0x50,0x0f,0x3a,0x88
+,0xe7,0xbf,0x14,0xfd,0xe0,0xc7,0xb9,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x09
+,0x30,0x82,0x01,0x05,0x30,0x70,0x06,0x03
+,0x55,0x1d,0x1f,0x04,0x69,0x30,0x67,0x30
+,0x65,0xa0,0x63,0xa0,0x61,0xa4,0x5f,0x30
+,0x5d,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x10
+,0x30,0x0e,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x07,0x45,0x71,0x75,0x69,0x66,0x61,0x78
+,0x31,0x2d,0x30,0x2b,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x24,0x45,0x71,0x75,0x69,0x66
+,0x61,0x78,0x20,0x53,0x65,0x63,0x75,0x72
+,0x65,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x03
+,0x13,0x04,0x43,0x52,0x4c,0x31,0x30,0x1a
+,0x06,0x03,0x55,0x1d,0x10,0x04,0x13,0x30
+,0x11,0x81,0x0f,0x32,0x30,0x31,0x38,0x30
+,0x38,0x32,0x32,0x31,0x36,0x34,0x31,0x35
+,0x31,0x5a,0x30,0x0b,0x06,0x03,0x55,0x1d
+,0x0f,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18
+,0x30,0x16,0x80,0x14,0x48,0xe6,0x68,0xf9
+,0x2b,0xd2,0xb2,0x95,0xd7,0x47,0xd8,0x23
+,0x20,0x10,0x4f,0x33,0x98,0x90,0x9f,0xd4
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0x48,0xe6,0x68,0xf9,0x2b
+,0xd2,0xb2,0x95,0xd7,0x47,0xd8,0x23,0x20
+,0x10,0x4f,0x33,0x98,0x90,0x9f,0xd4,0x30
+,0x0c,0x06,0x03,0x55,0x1d,0x13,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x1a,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf6,0x7d,0x07
+,0x41,0x00,0x04,0x0d,0x30,0x0b,0x1b,0x05
+,0x56,0x33,0x2e,0x30,0x63,0x03,0x02,0x06
+,0xc0,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x81,0x81,0x00,0x58,0xce,0x29,0xea
+,0xfc,0xf7,0xde,0xb5,0xce,0x02,0xb9,0x17
+,0xb5,0x85,0xd1,0xb9,0xe3,0xe0,0x95,0xcc
+,0x25,0x31,0x0d,0x00,0xa6,0x92,0x6e,0x7f
+,0xb6,0x92,0x63,0x9e,0x50,0x95,0xd1,0x9a
+,0x6f,0xe4,0x11,0xde,0x63,0x85,0x6e,0x98
+,0xee,0xa8,0xff,0x5a,0xc8,0xd3,0x55,0xb2
+,0x66,0x71,0x57,0xde,0xc0,0x21,0xeb,0x3d
+,0x2a,0xa7,0x23,0x49,0x01,0x04,0x86,0x42
+,0x7b,0xfc,0xee,0x7f,0xa2,0x16,0x52,0xb5
+,0x67,0x67,0xd3,0x40,0xdb,0x3b,0x26,0x58
+,0xb2,0x28,0x77,0x3d,0xae,0x14,0x77,0x61
+,0xd6,0xfa,0x2a,0x66,0x27,0xa0,0x0d,0xfa
+,0xa7,0x73,0x5c,0xea,0x70,0xf1,0x94,0x21
+,0x65,0x44,0x5f,0xfa,0xfc,0xef,0x29,0x68
+,0xa9,0xa2,0x87,0x79,0xef,0x79,0xef,0x4f
+,0xac,0x07,0x77,0x38};
+const unsigned int NptTlsTrustAnchor_Base_0008_Size = 804;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0009.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0009.cpp
new file mode 100644
index 0000000..43679b8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0009.cpp
@@ -0,0 +1,138 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Digital Signature Trust Co. Global CA 1 */
+const unsigned char NptTlsTrustAnchor_Base_0009_Data[813] = {
+0x30,0x82,0x03,0x29,0x30,0x82,0x02,0x92
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x36
+,0x70,0x15,0x96,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x46,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x24,0x30,0x22,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x1b,0x44,0x69,0x67,0x69
+,0x74,0x61,0x6c,0x20,0x53,0x69,0x67,0x6e
+,0x61,0x74,0x75,0x72,0x65,0x20,0x54,0x72
+,0x75,0x73,0x74,0x20,0x43,0x6f,0x2e,0x31
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x08,0x44,0x53,0x54,0x43,0x41,0x20
+,0x45,0x31,0x30,0x1e,0x17,0x0d,0x39,0x38
+,0x31,0x32,0x31,0x30,0x31,0x38,0x31,0x30
+,0x32,0x33,0x5a,0x17,0x0d,0x31,0x38,0x31
+,0x32,0x31,0x30,0x31,0x38,0x34,0x30,0x32
+,0x33,0x5a,0x30,0x46,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x24,0x30,0x22,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x1b,0x44,0x69,0x67,0x69
+,0x74,0x61,0x6c,0x20,0x53,0x69,0x67,0x6e
+,0x61,0x74,0x75,0x72,0x65,0x20,0x54,0x72
+,0x75,0x73,0x74,0x20,0x43,0x6f,0x2e,0x31
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x08,0x44,0x53,0x54,0x43,0x41,0x20
+,0x45,0x31,0x30,0x81,0x9d,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x81,0x8b,0x00
+,0x30,0x81,0x87,0x02,0x81,0x81,0x00,0xa0
+,0x6c,0x81,0xa9,0xcf,0x34,0x1e,0x24,0xdd
+,0xfe,0x86,0x28,0xcc,0xde,0x83,0x2f,0xf9
+,0x5e,0xd4,0x42,0xd2,0xe8,0x74,0x60,0x66
+,0x13,0x98,0x06,0x1c,0xa9,0x51,0x12,0x69
+,0x6f,0x31,0x55,0xb9,0x49,0x72,0x00,0x08
+,0x7e,0xd3,0xa5,0x62,0x44,0x37,0x24,0x99
+,0x8f,0xd9,0x83,0x48,0x8f,0x99,0x6d,0x95
+,0x13,0xbb,0x43,0x3b,0x2e,0x49,0x4e,0x88
+,0x37,0xc1,0xbb,0x58,0x7f,0xfe,0xe1,0xbd
+,0xf8,0xbb,0x61,0xcd,0xf3,0x47,0xc0,0x99
+,0xa6,0xf1,0xf3,0x91,0xe8,0x78,0x7c,0x00
+,0xcb,0x61,0xc9,0x44,0x27,0x71,0x69,0x55
+,0x4a,0x7e,0x49,0x4d,0xed,0xa2,0xa3,0xbe
+,0x02,0x4c,0x00,0xca,0x02,0xa8,0xee,0x01
+,0x02,0x31,0x64,0x0f,0x52,0x2d,0x13,0x74
+,0x76,0x36,0xb5,0x7a,0xb4,0x2d,0x71,0x02
+,0x01,0x03,0xa3,0x82,0x01,0x24,0x30,0x82
+,0x01,0x20,0x30,0x11,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x01,0x04
+,0x04,0x03,0x02,0x00,0x07,0x30,0x68,0x06
+,0x03,0x55,0x1d,0x1f,0x04,0x61,0x30,0x5f
+,0x30,0x5d,0xa0,0x5b,0xa0,0x59,0xa4,0x57
+,0x30,0x55,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x1b,0x44,0x69,0x67,0x69,0x74,0x61
+,0x6c,0x20,0x53,0x69,0x67,0x6e,0x61,0x74
+,0x75,0x72,0x65,0x20,0x54,0x72,0x75,0x73
+,0x74,0x20,0x43,0x6f,0x2e,0x31,0x11,0x30
+,0x0f,0x06,0x03,0x55,0x04,0x0b,0x13,0x08
+,0x44,0x53,0x54,0x43,0x41,0x20,0x45,0x31
+,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04
+,0x03,0x13,0x04,0x43,0x52,0x4c,0x31,0x30
+,0x2b,0x06,0x03,0x55,0x1d,0x10,0x04,0x24
+,0x30,0x22,0x80,0x0f,0x31,0x39,0x39,0x38
+,0x31,0x32,0x31,0x30,0x31,0x38,0x31,0x30
+,0x32,0x33,0x5a,0x81,0x0f,0x32,0x30,0x31
+,0x38,0x31,0x32,0x31,0x30,0x31,0x38,0x31
+,0x30,0x32,0x33,0x5a,0x30,0x0b,0x06,0x03
+,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0x6a,0x79
+,0x7e,0x91,0x69,0x46,0x18,0x13,0x0a,0x02
+,0x77,0xa5,0x59,0x5b,0x60,0x98,0x25,0x0e
+,0xa2,0xf8,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x6a,0x79,0x7e
+,0x91,0x69,0x46,0x18,0x13,0x0a,0x02,0x77
+,0xa5,0x59,0x5b,0x60,0x98,0x25,0x0e,0xa2
+,0xf8,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x19,0x06,0x09,0x2a,0x86,0x48,0x86,0xf6
+,0x7d,0x07,0x41,0x00,0x04,0x0c,0x30,0x0a
+,0x1b,0x04,0x56,0x34,0x2e,0x30,0x03,0x02
+,0x04,0x90,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x81,0x81,0x00,0x22,0x12,0xd8
+,0x7a,0x1d,0xdc,0x81,0x06,0xb6,0x09,0x65
+,0xb2,0x87,0xc8,0x1f,0x5e,0xb4,0x2f,0xe9
+,0xc4,0x1e,0xf2,0x3c,0xc1,0xbb,0x04,0x90
+,0x11,0x4a,0x83,0x4e,0x7e,0x93,0xb9,0x4d
+,0x42,0xc7,0x92,0x26,0xa0,0x5c,0x34,0x9a
+,0x38,0x72,0xf8,0xfd,0x6b,0x16,0x3e,0x20
+,0xee,0x82,0x8b,0x31,0x2a,0x93,0x36,0x85
+,0x23,0x88,0x8a,0x3c,0x03,0x68,0xd3,0xc9
+,0x09,0x0f,0x4d,0xfc,0x6c,0xa4,0xda,0x28
+,0x72,0x93,0x0e,0x89,0x80,0xb0,0x7d,0xfe
+,0x80,0x6f,0x65,0x6d,0x18,0x33,0x97,0x8b
+,0xc2,0x6b,0x89,0xee,0x60,0x3d,0xc8,0x9b
+,0xef,0x7f,0x2b,0x32,0x62,0x73,0x93,0xcb
+,0x3c,0xe3,0x7b,0xe2,0x76,0x78,0x45,0xbc
+,0xa1,0x93,0x04,0xbb,0x86,0x9f,0x3a,0x5b
+,0x43,0x7a,0xc3,0x8a,0x65};
+const unsigned int NptTlsTrustAnchor_Base_0009_Size = 813;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0010.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0010.cpp
new file mode 100644
index 0000000..34ac132
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0010.cpp
@@ -0,0 +1,138 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Digital Signature Trust Co. Global CA 3 */
+const unsigned char NptTlsTrustAnchor_Base_0010_Data[813] = {
+0x30,0x82,0x03,0x29,0x30,0x82,0x02,0x92
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x36
+,0x6e,0xd3,0xce,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x46,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x24,0x30,0x22,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x1b,0x44,0x69,0x67,0x69
+,0x74,0x61,0x6c,0x20,0x53,0x69,0x67,0x6e
+,0x61,0x74,0x75,0x72,0x65,0x20,0x54,0x72
+,0x75,0x73,0x74,0x20,0x43,0x6f,0x2e,0x31
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x08,0x44,0x53,0x54,0x43,0x41,0x20
+,0x45,0x32,0x30,0x1e,0x17,0x0d,0x39,0x38
+,0x31,0x32,0x30,0x39,0x31,0x39,0x31,0x37
+,0x32,0x36,0x5a,0x17,0x0d,0x31,0x38,0x31
+,0x32,0x30,0x39,0x31,0x39,0x34,0x37,0x32
+,0x36,0x5a,0x30,0x46,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x24,0x30,0x22,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x1b,0x44,0x69,0x67,0x69
+,0x74,0x61,0x6c,0x20,0x53,0x69,0x67,0x6e
+,0x61,0x74,0x75,0x72,0x65,0x20,0x54,0x72
+,0x75,0x73,0x74,0x20,0x43,0x6f,0x2e,0x31
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x08,0x44,0x53,0x54,0x43,0x41,0x20
+,0x45,0x32,0x30,0x81,0x9d,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x81,0x8b,0x00
+,0x30,0x81,0x87,0x02,0x81,0x81,0x00,0xbf
+,0x93,0x8f,0x17,0x92,0xef,0x33,0x13,0x18
+,0xeb,0x10,0x7f,0x4e,0x16,0xbf,0xff,0x06
+,0x8f,0x2a,0x85,0xbc,0x5e,0xf9,0x24,0xa6
+,0x24,0x88,0xb6,0x03,0xb7,0xc1,0xc3,0x5f
+,0x03,0x5b,0xd1,0x6f,0xae,0x7e,0x42,0xea
+,0x66,0x23,0xb8,0x63,0x83,0x56,0xfb,0x28
+,0x2d,0xe1,0x38,0x8b,0xb4,0xee,0xa8,0x01
+,0xe1,0xce,0x1c,0xb6,0x88,0x2a,0x22,0x46
+,0x85,0xfb,0x9f,0xa7,0x70,0xa9,0x47,0x14
+,0x3f,0xce,0xde,0x65,0xf0,0xa8,0x71,0xf7
+,0x4f,0x26,0x6c,0x8c,0xbc,0xc6,0xb5,0xef
+,0xde,0x49,0x27,0xff,0x48,0x2a,0x7d,0xe8
+,0x4d,0x03,0xcc,0xc7,0xb2,0x52,0xc6,0x17
+,0x31,0x13,0x3b,0xb5,0x4d,0xdb,0xc8,0xc4
+,0xf6,0xc3,0x0f,0x24,0x2a,0xda,0x0c,0x9d
+,0xe7,0x91,0x5b,0x80,0xcd,0x94,0x9d,0x02
+,0x01,0x03,0xa3,0x82,0x01,0x24,0x30,0x82
+,0x01,0x20,0x30,0x11,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x01,0x04
+,0x04,0x03,0x02,0x00,0x07,0x30,0x68,0x06
+,0x03,0x55,0x1d,0x1f,0x04,0x61,0x30,0x5f
+,0x30,0x5d,0xa0,0x5b,0xa0,0x59,0xa4,0x57
+,0x30,0x55,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x1b,0x44,0x69,0x67,0x69,0x74,0x61
+,0x6c,0x20,0x53,0x69,0x67,0x6e,0x61,0x74
+,0x75,0x72,0x65,0x20,0x54,0x72,0x75,0x73
+,0x74,0x20,0x43,0x6f,0x2e,0x31,0x11,0x30
+,0x0f,0x06,0x03,0x55,0x04,0x0b,0x13,0x08
+,0x44,0x53,0x54,0x43,0x41,0x20,0x45,0x32
+,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04
+,0x03,0x13,0x04,0x43,0x52,0x4c,0x31,0x30
+,0x2b,0x06,0x03,0x55,0x1d,0x10,0x04,0x24
+,0x30,0x22,0x80,0x0f,0x31,0x39,0x39,0x38
+,0x31,0x32,0x30,0x39,0x31,0x39,0x31,0x37
+,0x32,0x36,0x5a,0x81,0x0f,0x32,0x30,0x31
+,0x38,0x31,0x32,0x30,0x39,0x31,0x39,0x31
+,0x37,0x32,0x36,0x5a,0x30,0x0b,0x06,0x03
+,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0x1e,0x82
+,0x4d,0x28,0x65,0x80,0x3c,0xc9,0x41,0x6e
+,0xac,0x35,0x2e,0x5a,0xcb,0xde,0xee,0xf8
+,0x39,0x5b,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x1e,0x82,0x4d
+,0x28,0x65,0x80,0x3c,0xc9,0x41,0x6e,0xac
+,0x35,0x2e,0x5a,0xcb,0xde,0xee,0xf8,0x39
+,0x5b,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x19,0x06,0x09,0x2a,0x86,0x48,0x86,0xf6
+,0x7d,0x07,0x41,0x00,0x04,0x0c,0x30,0x0a
+,0x1b,0x04,0x56,0x34,0x2e,0x30,0x03,0x02
+,0x04,0x90,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x81,0x81,0x00,0x47,0x8d,0x83
+,0xad,0x62,0xf2,0xdb,0xb0,0x9e,0x45,0x22
+,0x05,0xb9,0xa2,0xd6,0x03,0x0e,0x38,0x72
+,0xe7,0x9e,0xfc,0x7b,0xe6,0x93,0xb6,0x9a
+,0xa5,0xa2,0x94,0xc8,0x34,0x1d,0x91,0xd1
+,0xc5,0xd7,0xf4,0x0a,0x25,0x0f,0x3d,0x78
+,0x81,0x9e,0x0f,0xb1,0x67,0xc4,0x90,0x4c
+,0x63,0xdd,0x5e,0xa7,0xe2,0xba,0x9f,0xf5
+,0xf7,0x4d,0xa5,0x31,0x7b,0x9c,0x29,0x2d
+,0x4c,0xfe,0x64,0x3e,0xec,0xb6,0x53,0xfe
+,0xea,0x9b,0xed,0x82,0xdb,0x74,0x75,0x4b
+,0x07,0x79,0x6e,0x1e,0xd8,0x19,0x83,0x73
+,0xde,0xf5,0x3e,0xd0,0xb5,0xde,0xe7,0x4b
+,0x68,0x7d,0x43,0x2e,0x2a,0x20,0xe1,0x7e
+,0xa0,0x78,0x44,0x9e,0x08,0xf5,0x98,0xf9
+,0xc7,0x7f,0x1b,0x1b,0xd6,0x06,0x20,0x02
+,0x58,0xa1,0xc3,0xa2,0x03};
+const unsigned int NptTlsTrustAnchor_Base_0010_Size = 813;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0011.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0011.cpp
new file mode 100644
index 0000000..f7e9581
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0011.cpp
@@ -0,0 +1,160 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Digital Signature Trust Co. Global CA 2 */
+const unsigned char NptTlsTrustAnchor_Base_0011_Data[988] = {
+0x30,0x82,0x03,0xd8,0x30,0x82,0x02,0xc0
+,0x02,0x11,0x00,0xd0,0x1e,0x40,0x8b,0x00
+,0x00,0x02,0x7c,0x00,0x00,0x00,0x02,0x00
+,0x00,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xa9,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x75,0x73,0x31,0x0d,0x30,0x0b,0x06,0x03
+,0x55,0x04,0x08,0x13,0x04,0x55,0x74,0x61
+,0x68,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x07,0x13,0x0e,0x53,0x61,0x6c,0x74
+,0x20,0x4c,0x61,0x6b,0x65,0x20,0x43,0x69
+,0x74,0x79,0x31,0x24,0x30,0x22,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x1b,0x44,0x69,0x67
+,0x69,0x74,0x61,0x6c,0x20,0x53,0x69,0x67
+,0x6e,0x61,0x74,0x75,0x72,0x65,0x20,0x54
+,0x72,0x75,0x73,0x74,0x20,0x43,0x6f,0x2e
+,0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x08,0x44,0x53,0x54,0x43,0x41
+,0x20,0x58,0x31,0x31,0x16,0x30,0x14,0x06
+,0x03,0x55,0x04,0x03,0x13,0x0d,0x44,0x53
+,0x54,0x20,0x52,0x6f,0x6f,0x74,0x43,0x41
+,0x20,0x58,0x31,0x31,0x21,0x30,0x1f,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x09,0x01,0x16,0x12,0x63,0x61,0x40,0x64
+,0x69,0x67,0x73,0x69,0x67,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x30,0x1e
+,0x17,0x0d,0x39,0x38,0x31,0x32,0x30,0x31
+,0x31,0x38,0x31,0x38,0x35,0x35,0x5a,0x17
+,0x0d,0x30,0x38,0x31,0x31,0x32,0x38,0x31
+,0x38,0x31,0x38,0x35,0x35,0x5a,0x30,0x81
+,0xa9,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x75,0x73,0x31,0x0d
+,0x30,0x0b,0x06,0x03,0x55,0x04,0x08,0x13
+,0x04,0x55,0x74,0x61,0x68,0x31,0x17,0x30
+,0x15,0x06,0x03,0x55,0x04,0x07,0x13,0x0e
+,0x53,0x61,0x6c,0x74,0x20,0x4c,0x61,0x6b
+,0x65,0x20,0x43,0x69,0x74,0x79,0x31,0x24
+,0x30,0x22,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x1b,0x44,0x69,0x67,0x69,0x74,0x61,0x6c
+,0x20,0x53,0x69,0x67,0x6e,0x61,0x74,0x75
+,0x72,0x65,0x20,0x54,0x72,0x75,0x73,0x74
+,0x20,0x43,0x6f,0x2e,0x31,0x11,0x30,0x0f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x08,0x44
+,0x53,0x54,0x43,0x41,0x20,0x58,0x31,0x31
+,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x03
+,0x13,0x0d,0x44,0x53,0x54,0x20,0x52,0x6f
+,0x6f,0x74,0x43,0x41,0x20,0x58,0x31,0x31
+,0x21,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x12
+,0x63,0x61,0x40,0x64,0x69,0x67,0x73,0x69
+,0x67,0x74,0x72,0x75,0x73,0x74,0x2e,0x63
+,0x6f,0x6d,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xd2,0xc6,0x26,0xb6,0xe7
+,0xa5,0x3d,0xc1,0xc4,0x68,0xd5,0x50,0x6f
+,0x53,0xc5,0x6f,0x49,0x13,0x09,0xb8,0xaf
+,0x2c,0x48,0x8d,0x14,0x6a,0xa3,0x17,0x5f
+,0x5a,0xf9,0xd3,0x2e,0x75,0x2f,0xd8,0x28
+,0x62,0xd1,0x93,0x2f,0xfc,0x4d,0xd4,0xab
+,0x87,0xe5,0x08,0xc7,0x99,0xe7,0x92,0x3f
+,0x75,0xbd,0xeb,0x25,0xb4,0x15,0xc1,0x9b
+,0x19,0x3d,0xd2,0x44,0x8d,0xd7,0x74,0x20
+,0x6d,0x37,0x02,0x8f,0x69,0x93,0x5b,0x8a
+,0xc4,0x19,0x9d,0xf4,0xb2,0x0e,0xfc,0x16
+,0x6c,0xb9,0xb1,0x05,0x92,0x83,0xd1,0x85
+,0x2c,0x60,0x94,0x3e,0x45,0x55,0xa0,0xd9
+,0xab,0x08,0x21,0xe6,0x60,0xe8,0x3b,0x74
+,0xf2,0x99,0x50,0x51,0x68,0xd0,0x03,0x2d
+,0xb1,0x80,0xbe,0xa3,0xd8,0x52,0xb0,0x44
+,0xcd,0x43,0x4a,0x70,0x8e,0x58,0x85,0x95
+,0xe1,0x4e,0x2c,0xd6,0x2d,0x41,0x6f,0xd6
+,0x84,0xe7,0xc8,0x98,0x44,0xca,0x47,0xdb
+,0x2c,0x24,0xa5,0x69,0x26,0xcf,0x6b,0xb8
+,0x27,0x62,0xc3,0xf4,0xc9,0x7a,0x92,0x23
+,0xed,0x13,0x67,0x82,0xae,0x45,0x2e,0x45
+,0xe5,0x7e,0x72,0x3f,0x85,0x9d,0x94,0x62
+,0x10,0xe6,0x3c,0x91,0xa1,0xad,0x77,0x00
+,0xe0,0x15,0xec,0xf3,0x84,0x80,0x72,0x7a
+,0x8e,0x6e,0x60,0x97,0xc7,0x24,0x59,0x10
+,0x34,0x83,0x5b,0xe1,0xa5,0xa4,0x69,0xb6
+,0x57,0x35,0x1c,0x78,0x59,0xc6,0xd3,0x2f
+,0x3a,0x73,0x67,0xee,0x94,0xca,0x04,0x13
+,0x05,0x62,0x06,0x70,0x23,0xb3,0xf4,0x7c
+,0xee,0x45,0xd9,0x64,0x0b,0x5b,0x49,0xaa
+,0xa4,0x43,0xce,0x26,0xc4,0x44,0x12,0x6c
+,0xb8,0xdd,0x79,0x02,0x03,0x01,0x00,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0xa2,0x37,0xb2,0x3f
+,0x69,0xfb,0xd7,0x86,0x79,0x54,0x49,0x31
+,0x95,0x33,0x2b,0xf3,0xd1,0x09,0x14,0x49
+,0x62,0x60,0x86,0xa5,0xb0,0x11,0xe2,0x50
+,0xc2,0x1d,0x06,0x57,0x3e,0x2d,0xe8,0x33
+,0x64,0xbe,0x9b,0xaa,0xad,0x5f,0x1b,0x4d
+,0xd4,0x99,0x95,0xa2,0x8b,0x9a,0xc9,0x62
+,0x72,0xb5,0x69,0xea,0xd9,0x58,0xab,0x35
+,0xed,0x15,0xa2,0x43,0xd6,0xb6,0xbc,0x07
+,0x79,0x65,0x64,0x73,0x7d,0xd7,0x79,0xca
+,0x7b,0xd5,0x5a,0x51,0xc6,0xe1,0x53,0x04
+,0x96,0x8d,0x38,0xcf,0xa3,0x17,0xac,0x39
+,0x71,0x6b,0x01,0xc3,0x8b,0x53,0x3c,0x63
+,0xe9,0xee,0x79,0xc0,0xe4,0xbe,0x92,0x32
+,0x64,0x7a,0xb3,0x1f,0x97,0x94,0x62,0xbd
+,0xea,0xb2,0x20,0x15,0x95,0xfb,0x97,0xf2
+,0x78,0x2f,0x63,0x36,0x40,0x38,0xe3,0x46
+,0x0f,0x1d,0xdd,0xac,0x95,0xca,0xe7,0x4b
+,0x90,0x7b,0xb1,0x4b,0xa9,0xd4,0xc5,0xeb
+,0x9a,0xda,0xaa,0xd5,0xa3,0x94,0x14,0x46
+,0x8d,0x2d,0x1f,0xf3,0x3a,0xd6,0x93,0x3a
+,0xf6,0x3e,0x79,0xfc,0xe8,0xe6,0xb0,0x75
+,0xed,0xee,0x3d,0xc9,0x70,0xc7,0x5d,0xaa
+,0x81,0x4b,0x46,0x25,0x1c,0xc7,0x6c,0x15
+,0xe3,0x95,0x4e,0x0f,0xaa,0x32,0x37,0x94
+,0x0a,0x17,0x24,0x92,0x13,0x84,0x58,0xd2
+,0x63,0x6f,0x2b,0xf7,0xe6,0x5b,0x62,0x0b
+,0x13,0x17,0xb0,0x0d,0x52,0x4c,0xfe,0xfe
+,0x6f,0x5c,0xe2,0x91,0x6e,0x1d,0xfd,0xa4
+,0x62,0xd7,0x68,0xfa,0x8e,0x7a,0x4f,0xd2
+,0x08,0xda,0x93,0xdc,0xf0,0x92,0x11,0x7a
+,0xd0,0xdc,0x72,0x93,0x0c,0x73,0x93,0x62
+,0x85,0x68,0xd0,0xf4};
+const unsigned int NptTlsTrustAnchor_Base_0011_Size = 988;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0012.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0012.cpp
new file mode 100644
index 0000000..431b4d8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0012.cpp
@@ -0,0 +1,160 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Digital Signature Trust Co. Global CA 4 */
+const unsigned char NptTlsTrustAnchor_Base_0012_Data[988] = {
+0x30,0x82,0x03,0xd8,0x30,0x82,0x02,0xc0
+,0x02,0x11,0x00,0xd0,0x1e,0x40,0x8b,0x00
+,0x00,0x77,0x6d,0x00,0x00,0x00,0x01,0x00
+,0x00,0x00,0x04,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xa9,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x75,0x73,0x31,0x0d,0x30,0x0b,0x06,0x03
+,0x55,0x04,0x08,0x13,0x04,0x55,0x74,0x61
+,0x68,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x07,0x13,0x0e,0x53,0x61,0x6c,0x74
+,0x20,0x4c,0x61,0x6b,0x65,0x20,0x43,0x69
+,0x74,0x79,0x31,0x24,0x30,0x22,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x1b,0x44,0x69,0x67
+,0x69,0x74,0x61,0x6c,0x20,0x53,0x69,0x67
+,0x6e,0x61,0x74,0x75,0x72,0x65,0x20,0x54
+,0x72,0x75,0x73,0x74,0x20,0x43,0x6f,0x2e
+,0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x08,0x44,0x53,0x54,0x43,0x41
+,0x20,0x58,0x32,0x31,0x16,0x30,0x14,0x06
+,0x03,0x55,0x04,0x03,0x13,0x0d,0x44,0x53
+,0x54,0x20,0x52,0x6f,0x6f,0x74,0x43,0x41
+,0x20,0x58,0x32,0x31,0x21,0x30,0x1f,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x09,0x01,0x16,0x12,0x63,0x61,0x40,0x64
+,0x69,0x67,0x73,0x69,0x67,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x30,0x1e
+,0x17,0x0d,0x39,0x38,0x31,0x31,0x33,0x30
+,0x32,0x32,0x34,0x36,0x31,0x36,0x5a,0x17
+,0x0d,0x30,0x38,0x31,0x31,0x32,0x37,0x32
+,0x32,0x34,0x36,0x31,0x36,0x5a,0x30,0x81
+,0xa9,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x75,0x73,0x31,0x0d
+,0x30,0x0b,0x06,0x03,0x55,0x04,0x08,0x13
+,0x04,0x55,0x74,0x61,0x68,0x31,0x17,0x30
+,0x15,0x06,0x03,0x55,0x04,0x07,0x13,0x0e
+,0x53,0x61,0x6c,0x74,0x20,0x4c,0x61,0x6b
+,0x65,0x20,0x43,0x69,0x74,0x79,0x31,0x24
+,0x30,0x22,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x1b,0x44,0x69,0x67,0x69,0x74,0x61,0x6c
+,0x20,0x53,0x69,0x67,0x6e,0x61,0x74,0x75
+,0x72,0x65,0x20,0x54,0x72,0x75,0x73,0x74
+,0x20,0x43,0x6f,0x2e,0x31,0x11,0x30,0x0f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x08,0x44
+,0x53,0x54,0x43,0x41,0x20,0x58,0x32,0x31
+,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x03
+,0x13,0x0d,0x44,0x53,0x54,0x20,0x52,0x6f
+,0x6f,0x74,0x43,0x41,0x20,0x58,0x32,0x31
+,0x21,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x12
+,0x63,0x61,0x40,0x64,0x69,0x67,0x73,0x69
+,0x67,0x74,0x72,0x75,0x73,0x74,0x2e,0x63
+,0x6f,0x6d,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xdc,0x75,0xf0,0x8c,0xc0
+,0x75,0x96,0x9a,0xc0,0x62,0x1f,0x26,0xf7
+,0xc4,0xe1,0x9a,0xea,0xe0,0x56,0x73,0x5b
+,0x99,0xcd,0x01,0x44,0xa8,0x08,0xb6,0xd5
+,0xa7,0xda,0x1a,0x04,0x18,0x39,0x92,0x4a
+,0x78,0xa3,0x81,0xc2,0xf5,0x77,0x7a,0x50
+,0xb4,0x70,0xff,0x9a,0xab,0xc6,0xc7,0xca
+,0x6e,0x83,0x4f,0x42,0x98,0xfb,0x26,0x0b
+,0xda,0xdc,0x6d,0xd6,0xa9,0x99,0x55,0x52
+,0x67,0xe9,0x28,0x03,0x92,0xdc,0xe5,0xb0
+,0x05,0x9a,0x0f,0x15,0xf9,0x6b,0x59,0x72
+,0x56,0xf2,0xfa,0x39,0xfc,0xaa,0x68,0xee
+,0x0f,0x1f,0x10,0x83,0x2f,0xfc,0x9d,0xfa
+,0x17,0x96,0xdd,0x82,0xe3,0xe6,0x45,0x7d
+,0xc0,0x4b,0x80,0x44,0x1f,0xed,0x2c,0xe0
+,0x84,0xfd,0x91,0x5c,0x92,0x54,0x69,0x25
+,0xe5,0x62,0x69,0xdc,0xe5,0xee,0x00,0x52
+,0xbd,0x33,0x0b,0xad,0x75,0x02,0x85,0xa7
+,0x64,0x50,0x2d,0xc5,0x19,0x19,0x30,0xc0
+,0x26,0xdb,0xc9,0xd3,0xfd,0x2e,0x99,0xad
+,0x59,0xb5,0x0b,0x4d,0xd4,0x41,0xae,0x85
+,0x48,0x43,0x59,0xdc,0xb7,0xa8,0xe2,0xa2
+,0xde,0xc3,0x8f,0xd7,0xb8,0xa1,0x62,0xa6
+,0x68,0x50,0x52,0xe4,0xcf,0x31,0xa7,0x94
+,0x85,0xda,0x9f,0x46,0x32,0x17,0x56,0xe5
+,0xf2,0xeb,0x66,0x3d,0x12,0xff,0x43,0xdb
+,0x98,0xef,0x77,0xcf,0xcb,0x81,0x8d,0x34
+,0xb1,0xc6,0x50,0x4a,0x26,0xd1,0xe4,0x3e
+,0x41,0x50,0xaf,0x6c,0xae,0x22,0x34,0x2e
+,0xd5,0x6b,0x6e,0x83,0xba,0x79,0xb8,0x76
+,0x65,0x48,0xda,0x09,0x29,0x64,0x63,0x22
+,0xb9,0xfb,0x47,0x76,0x85,0x8c,0x86,0x44
+,0xcb,0x09,0xdb,0x02,0x03,0x01,0x00,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0xb5,0x36,0x0e,0x5d
+,0xe1,0x61,0x28,0x5a,0x11,0x65,0xc0,0x3f
+,0x83,0x03,0x79,0x4d,0xbe,0x28,0xa6,0x0b
+,0x07,0x02,0x52,0x85,0xcd,0xf8,0x91,0xd0
+,0x10,0x6c,0xb5,0x6a,0x20,0x5b,0x1c,0x90
+,0xd9,0x30,0x3c,0xc6,0x48,0x9e,0x8a,0x5e
+,0x64,0xf9,0xa1,0x71,0x77,0xef,0x04,0x27
+,0x1f,0x07,0xeb,0xe4,0x26,0xf7,0x73,0x74
+,0xc9,0x44,0x18,0x1a,0x66,0xd3,0xe0,0x43
+,0xaf,0x91,0x3b,0xd1,0xcb,0x2c,0xd8,0x74
+,0x54,0x3a,0x1c,0x4d,0xca,0xd4,0x68,0xcd
+,0x23,0x7c,0x1d,0x10,0x9e,0x45,0xe9,0xf6
+,0x00,0x6e,0xa6,0xcd,0x19,0xff,0x4f,0x2c
+,0x29,0x8f,0x57,0x4d,0xc4,0x77,0x92,0xbe
+,0xe0,0x4c,0x09,0xfb,0x5d,0x44,0x86,0x66
+,0x21,0xa8,0xb9,0x32,0xa2,0x56,0xd5,0xe9
+,0x8c,0x83,0x7c,0x59,0x3f,0xc4,0xf1,0x0b
+,0xe7,0x9d,0xec,0x9e,0xbd,0x9c,0x18,0x0e
+,0x3e,0xc2,0x39,0x79,0x28,0xb7,0x03,0x0d
+,0x08,0xcb,0xc6,0xe7,0xd9,0x01,0x37,0x50
+,0x10,0xec,0xcc,0x61,0x16,0x40,0xd4,0xaf
+,0x31,0x74,0x7b,0xfc,0x3f,0x31,0xa7,0xd0
+,0x47,0x73,0x33,0x39,0x1b,0xcc,0x4e,0x6a
+,0xd7,0x49,0x83,0x11,0x06,0xfe,0xeb,0x82
+,0x58,0x33,0x32,0x4c,0xf0,0x56,0xac,0x1e
+,0x9c,0x2f,0x56,0x9a,0x7b,0xc1,0x4a,0x1c
+,0xa5,0xfd,0x55,0x36,0xce,0xfc,0x96,0x4d
+,0xf4,0xb0,0xf0,0xec,0xb7,0x6c,0x82,0xed
+,0x2f,0x31,0x99,0x42,0x4c,0xa9,0xb2,0x0d
+,0xb8,0x15,0x5d,0xf1,0xdf,0xba,0xc9,0xb5
+,0x4a,0xd4,0x64,0x98,0xb3,0x26,0xa9,0x30
+,0xc8,0xfd,0xa6,0xec,0xab,0x96,0x21,0xad
+,0x7f,0xc2,0x78,0xb6};
+const unsigned int NptTlsTrustAnchor_Base_0012_Size = 988;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0013.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0013.cpp
new file mode 100644
index 0000000..e7b3db1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0013.cpp
@@ -0,0 +1,109 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 1 Public Primary Certification Authority */
+const unsigned char NptTlsTrustAnchor_Base_0013_Data[577] = {
+0x30,0x82,0x02,0x3d,0x30,0x82,0x01,0xa6
+,0x02,0x11,0x00,0xcd,0xba,0x7f,0x56,0xf0
+,0xdf,0xe4,0xbc,0x54,0xfe,0x22,0xac,0xb3
+,0x72,0xaa,0x55,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x02
+,0x05,0x00,0x30,0x5f,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x37,0x30,0x35,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x2e,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x31,0x20,0x50,0x75,0x62
+,0x6c,0x69,0x63,0x20,0x50,0x72,0x69,0x6d
+,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x30,0x1e,0x17,0x0d,0x39
+,0x36,0x30,0x31,0x32,0x39,0x30,0x30,0x30
+,0x30,0x30,0x30,0x5a,0x17,0x0d,0x32,0x38
+,0x30,0x38,0x30,0x31,0x32,0x33,0x35,0x39
+,0x35,0x39,0x5a,0x30,0x5f,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x31,0x37,0x30,0x35,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x2e,0x43,0x6c
+,0x61,0x73,0x73,0x20,0x31,0x20,0x50,0x75
+,0x62,0x6c,0x69,0x63,0x20,0x50,0x72,0x69
+,0x6d,0x61,0x72,0x79,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x30,0x81,0x9f,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x81
+,0x8d,0x00,0x30,0x81,0x89,0x02,0x81,0x81
+,0x00,0xe5,0x19,0xbf,0x6d,0xa3,0x56,0x61
+,0x2d,0x99,0x48,0x71,0xf6,0x67,0xde,0xb9
+,0x8d,0xeb,0xb7,0x9e,0x86,0x80,0x0a,0x91
+,0x0e,0xfa,0x38,0x25,0xaf,0x46,0x88,0x82
+,0xe5,0x73,0xa8,0xa0,0x9b,0x24,0x5d,0x0d
+,0x1f,0xcc,0x65,0x6e,0x0c,0xb0,0xd0,0x56
+,0x84,0x18,0x87,0x9a,0x06,0x9b,0x10,0xa1
+,0x73,0xdf,0xb4,0x58,0x39,0x6b,0x6e,0xc1
+,0xf6,0x15,0xd5,0xa8,0xa8,0x3f,0xaa,0x12
+,0x06,0x8d,0x31,0xac,0x7f,0xb0,0x34,0xd7
+,0x8f,0x34,0x67,0x88,0x09,0xcd,0x14,0x11
+,0xe2,0x4e,0x45,0x56,0x69,0x1f,0x78,0x02
+,0x80,0xda,0xdc,0x47,0x91,0x29,0xbb,0x36
+,0xc9,0x63,0x5c,0xc5,0xe0,0xd7,0x2d,0x87
+,0x7b,0xa1,0xb7,0x32,0xb0,0x7b,0x30,0xba
+,0x2a,0x2f,0x31,0xaa,0xee,0xa3,0x67,0xda
+,0xdb,0x02,0x03,0x01,0x00,0x01,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x02,0x05,0x00,0x03,0x81,0x81
+,0x00,0x4c,0x3f,0xb8,0x8b,0xc6,0x68,0xdf
+,0xee,0x43,0x33,0x0e,0x5d,0xe9,0xa6,0xcb
+,0x07,0x84,0x4d,0x7a,0x33,0xff,0x92,0x1b
+,0xf4,0x36,0xad,0xd8,0x95,0x22,0x36,0x68
+,0x11,0x6c,0x7c,0x42,0xcc,0xf3,0x9c,0x2e
+,0xc4,0x07,0x3f,0x14,0xb0,0x0f,0x4f,0xff
+,0x90,0x92,0x76,0xf9,0xe2,0xbc,0x4a,0xe9
+,0x8f,0xcd,0xa0,0x80,0x0a,0xf7,0xc5,0x29
+,0xf1,0x82,0x22,0x5d,0xb8,0xb1,0xdd,0x81
+,0x23,0xa3,0x7b,0x25,0x15,0x46,0x30,0x79
+,0x16,0xf8,0xea,0x05,0x4b,0x94,0x7f,0x1d
+,0xc2,0x1c,0xc8,0xe3,0xb7,0xf4,0x10,0x40
+,0x3c,0x13,0xc3,0x5f,0x1f,0x53,0xe8,0x48
+,0xe4,0x86,0xb4,0x7b,0xa1,0x35,0xb0,0x7b
+,0x25,0xba,0xb8,0xd3,0x8e,0xab,0x3f,0x38
+,0x9d,0x00,0x34,0x00,0x98,0xf3,0xd1,0x71
+,0x94};
+const unsigned int NptTlsTrustAnchor_Base_0013_Size = 577;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0014.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0014.cpp
new file mode 100644
index 0000000..dbc9125
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0014.cpp
@@ -0,0 +1,109 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 2 Public Primary Certification Authority */
+const unsigned char NptTlsTrustAnchor_Base_0014_Data[576] = {
+0x30,0x82,0x02,0x3c,0x30,0x82,0x01,0xa5
+,0x02,0x10,0x2d,0x1b,0xfc,0x4a,0x17,0x8d
+,0xa3,0x91,0xeb,0xe7,0xff,0xf5,0x8b,0x45
+,0xbe,0x0b,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x02,0x05
+,0x00,0x30,0x5f,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53
+,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63
+,0x2e,0x31,0x37,0x30,0x35,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x2e,0x43,0x6c,0x61,0x73
+,0x73,0x20,0x32,0x20,0x50,0x75,0x62,0x6c
+,0x69,0x63,0x20,0x50,0x72,0x69,0x6d,0x61
+,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x30,0x1e,0x17,0x0d,0x39,0x36
+,0x30,0x31,0x32,0x39,0x30,0x30,0x30,0x30
+,0x30,0x30,0x5a,0x17,0x0d,0x32,0x38,0x30
+,0x38,0x30,0x31,0x32,0x33,0x35,0x39,0x35
+,0x39,0x5a,0x30,0x5f,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x37,0x30,0x35,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x2e,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x32,0x20,0x50,0x75,0x62
+,0x6c,0x69,0x63,0x20,0x50,0x72,0x69,0x6d
+,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x30,0x81,0x9f,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d
+,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00
+,0xb6,0x5a,0x8b,0xa3,0x0d,0x6a,0x23,0x83
+,0x80,0x6b,0xcf,0x39,0x87,0xf4,0x21,0x13
+,0x33,0x06,0x4c,0x25,0xa2,0xed,0x55,0x12
+,0x97,0xc5,0xa7,0x80,0xb9,0xfa,0x83,0xc1
+,0x20,0xa0,0xfa,0x2f,0x15,0x0d,0x7c,0xa1
+,0x60,0x6b,0x7e,0x79,0x2c,0xfa,0x06,0x0f
+,0x3a,0xae,0xf6,0x1b,0x6f,0xb1,0xd2,0xff
+,0x2f,0x28,0x52,0x5f,0x83,0x7d,0x4b,0xc4
+,0x7a,0xb7,0xf8,0x66,0x1f,0x80,0x54,0xfc
+,0xb7,0xc2,0x8e,0x59,0x4a,0x14,0x57,0x46
+,0xd1,0x9a,0x93,0xbe,0x41,0x91,0x03,0xbb
+,0x15,0x80,0x93,0x5c,0xeb,0xe7,0xcc,0x08
+,0x6c,0x3f,0x3e,0xb3,0x4a,0xfc,0xff,0x4b
+,0x6c,0x23,0xd5,0x50,0x82,0x26,0x44,0x19
+,0x8e,0x23,0xc3,0x71,0xea,0x19,0x24,0x47
+,0x04,0x9e,0x75,0xbf,0xc8,0xa6,0x00,0x1f
+,0x02,0x03,0x01,0x00,0x01,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x02,0x05,0x00,0x03,0x81,0x81,0x00
+,0x8a,0x1b,0x2b,0xfa,0x39,0xc1,0x74,0xd7
+,0x5e,0xd8,0x19,0x64,0xa2,0x58,0x4a,0x2d
+,0x37,0xe0,0x33,0x47,0x0f,0xac,0xed,0xf7
+,0xaa,0xdb,0x1e,0xe4,0x8b,0x06,0x5c,0x60
+,0x27,0xca,0x45,0x52,0xce,0x16,0xef,0x3f
+,0x06,0x64,0xe7,0x94,0x68,0x7c,0x60,0x33
+,0x15,0x11,0x69,0xaf,0x9d,0x62,0x8d,0xa3
+,0x03,0x54,0x6b,0xa6,0xbe,0xe5,0xee,0x05
+,0x18,0x60,0x04,0xbf,0x42,0x80,0xfd,0xd0
+,0xa8,0xa8,0x1e,0x01,0x3b,0xf7,0xa3,0x5c
+,0xaf,0xa3,0xdc,0xe6,0x26,0x80,0x23,0x3c
+,0xb8,0x44,0x74,0xf7,0x0a,0xae,0x49,0x8b
+,0x61,0x78,0xcc,0x24,0xbf,0x88,0x8a,0xa7
+,0x0e,0xea,0x73,0x19,0x41,0xfd,0x4d,0x03
+,0xf0,0x88,0xd1,0xe5,0x78,0x8d,0xa5,0x2a
+,0x4f,0xf6,0x97,0x0d,0x17,0x77,0xca,0xd8
+};
+const unsigned int NptTlsTrustAnchor_Base_0014_Size = 576;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0015.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0015.cpp
new file mode 100644
index 0000000..8d37f40
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0015.cpp
@@ -0,0 +1,109 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 3 Public Primary Certification Authority */
+const unsigned char NptTlsTrustAnchor_Base_0015_Data[576] = {
+0x30,0x82,0x02,0x3c,0x30,0x82,0x01,0xa5
+,0x02,0x10,0x70,0xba,0xe4,0x1d,0x10,0xd9
+,0x29,0x34,0xb6,0x38,0xca,0x7b,0x03,0xcc
+,0xba,0xbf,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x02,0x05
+,0x00,0x30,0x5f,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53
+,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63
+,0x2e,0x31,0x37,0x30,0x35,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x2e,0x43,0x6c,0x61,0x73
+,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6c
+,0x69,0x63,0x20,0x50,0x72,0x69,0x6d,0x61
+,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x30,0x1e,0x17,0x0d,0x39,0x36
+,0x30,0x31,0x32,0x39,0x30,0x30,0x30,0x30
+,0x30,0x30,0x5a,0x17,0x0d,0x32,0x38,0x30
+,0x38,0x30,0x31,0x32,0x33,0x35,0x39,0x35
+,0x39,0x5a,0x30,0x5f,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x37,0x30,0x35,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x2e,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62
+,0x6c,0x69,0x63,0x20,0x50,0x72,0x69,0x6d
+,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x30,0x81,0x9f,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d
+,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00
+,0xc9,0x5c,0x59,0x9e,0xf2,0x1b,0x8a,0x01
+,0x14,0xb4,0x10,0xdf,0x04,0x40,0xdb,0xe3
+,0x57,0xaf,0x6a,0x45,0x40,0x8f,0x84,0x0c
+,0x0b,0xd1,0x33,0xd9,0xd9,0x11,0xcf,0xee
+,0x02,0x58,0x1f,0x25,0xf7,0x2a,0xa8,0x44
+,0x05,0xaa,0xec,0x03,0x1f,0x78,0x7f,0x9e
+,0x93,0xb9,0x9a,0x00,0xaa,0x23,0x7d,0xd6
+,0xac,0x85,0xa2,0x63,0x45,0xc7,0x72,0x27
+,0xcc,0xf4,0x4c,0xc6,0x75,0x71,0xd2,0x39
+,0xef,0x4f,0x42,0xf0,0x75,0xdf,0x0a,0x90
+,0xc6,0x8e,0x20,0x6f,0x98,0x0f,0xf8,0xac
+,0x23,0x5f,0x70,0x29,0x36,0xa4,0xc9,0x86
+,0xe7,0xb1,0x9a,0x20,0xcb,0x53,0xa5,0x85
+,0xe7,0x3d,0xbe,0x7d,0x9a,0xfe,0x24,0x45
+,0x33,0xdc,0x76,0x15,0xed,0x0f,0xa2,0x71
+,0x64,0x4c,0x65,0x2e,0x81,0x68,0x45,0xa7
+,0x02,0x03,0x01,0x00,0x01,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x02,0x05,0x00,0x03,0x81,0x81,0x00
+,0xbb,0x4c,0x12,0x2b,0xcf,0x2c,0x26,0x00
+,0x4f,0x14,0x13,0xdd,0xa6,0xfb,0xfc,0x0a
+,0x11,0x84,0x8c,0xf3,0x28,0x1c,0x67,0x92
+,0x2f,0x7c,0xb6,0xc5,0xfa,0xdf,0xf0,0xe8
+,0x95,0xbc,0x1d,0x8f,0x6c,0x2c,0xa8,0x51
+,0xcc,0x73,0xd8,0xa4,0xc0,0x53,0xf0,0x4e
+,0xd6,0x26,0xc0,0x76,0x01,0x57,0x81,0x92
+,0x5e,0x21,0xf1,0xd1,0xb1,0xff,0xe7,0xd0
+,0x21,0x58,0xcd,0x69,0x17,0xe3,0x44,0x1c
+,0x9c,0x19,0x44,0x39,0x89,0x5c,0xdc,0x9c
+,0x00,0x0f,0x56,0x8d,0x02,0x99,0xed,0xa2
+,0x90,0x45,0x4c,0xe4,0xbb,0x10,0xa4,0x3d
+,0xf0,0x32,0x03,0x0e,0xf1,0xce,0xf8,0xe8
+,0xc9,0x51,0x8c,0xe6,0x62,0x9f,0xe6,0x9f
+,0xc0,0x7d,0xb7,0x72,0x9c,0xc9,0x36,0x3a
+,0x6b,0x9f,0x4e,0xa8,0xff,0x64,0x0d,0x64
+};
+const unsigned int NptTlsTrustAnchor_Base_0015_Size = 576;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0016.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0016.cpp
new file mode 100644
index 0000000..f635023
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0016.cpp
@@ -0,0 +1,133 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 1 Public Primary Certification Authority - G2 */
+const unsigned char NptTlsTrustAnchor_Base_0016_Data[774] = {
+0x30,0x82,0x03,0x02,0x30,0x82,0x02,0x6b
+,0x02,0x10,0x4c,0xc7,0xea,0xaa,0x98,0x3e
+,0x71,0xd3,0x93,0x10,0xf8,0x3d,0x3a,0x89
+,0x91,0x92,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x30,0x81,0xc1,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x3c,0x30,0x3a,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x33,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x31,0x20,0x50,0x75,0x62
+,0x6c,0x69,0x63,0x20,0x50,0x72,0x69,0x6d
+,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x20,0x2d,0x20,0x47,0x32
+,0x31,0x3a,0x30,0x38,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x31,0x28,0x63,0x29,0x20,0x31
+,0x39,0x39,0x38,0x20,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f,0x72
+,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x7a,0x65,0x64,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x6e,0x6c,0x79,0x31,0x1f,0x30,0x1d
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x16,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20
+,0x54,0x72,0x75,0x73,0x74,0x20,0x4e,0x65
+,0x74,0x77,0x6f,0x72,0x6b,0x30,0x1e,0x17
+,0x0d,0x39,0x38,0x30,0x35,0x31,0x38,0x30
+,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x32,0x38,0x30,0x38,0x30,0x31,0x32,0x33
+,0x35,0x39,0x35,0x39,0x5a,0x30,0x81,0xc1
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30
+,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x3c
+,0x30,0x3a,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x33,0x43,0x6c,0x61,0x73,0x73,0x20,0x31
+,0x20,0x50,0x75,0x62,0x6c,0x69,0x63,0x20
+,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x2d,0x20,0x47,0x32,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x31,0x28
+,0x63,0x29,0x20,0x31,0x39,0x39,0x38,0x20
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20,0x2d
+,0x20,0x46,0x6f,0x72,0x20,0x61,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64,0x20
+,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c,0x79
+,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x16,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x20,0x54,0x72,0x75,0x73
+,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x30,0x81,0x9f,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x81,0x8d,0x00,0x30
+,0x81,0x89,0x02,0x81,0x81,0x00,0xaa,0xd0
+,0xba,0xbe,0x16,0x2d,0xb8,0x83,0xd4,0xca
+,0xd2,0x0f,0xbc,0x76,0x31,0xca,0x94,0xd8
+,0x1d,0x93,0x8c,0x56,0x02,0xbc,0xd9,0x6f
+,0x1a,0x6f,0x52,0x36,0x6e,0x75,0x56,0x0a
+,0x55,0xd3,0xdf,0x43,0x87,0x21,0x11,0x65
+,0x8a,0x7e,0x8f,0xbd,0x21,0xde,0x6b,0x32
+,0x3f,0x1b,0x84,0x34,0x95,0x05,0x9d,0x41
+,0x35,0xeb,0x92,0xeb,0x96,0xdd,0xaa,0x59
+,0x3f,0x01,0x53,0x6d,0x99,0x4f,0xed,0xe5
+,0xe2,0x2a,0x5a,0x90,0xc1,0xb9,0xc4,0xa6
+,0x15,0xcf,0xc8,0x45,0xeb,0xa6,0x5d,0x8e
+,0x9c,0x3e,0xf0,0x64,0x24,0x76,0xa5,0xcd
+,0xab,0x1a,0x6f,0xb6,0xd8,0x7b,0x51,0x61
+,0x6e,0xa6,0x7f,0x87,0xc8,0xe2,0xb7,0xe5
+,0x34,0xdc,0x41,0x88,0xea,0x09,0x40,0xbe
+,0x73,0x92,0x3d,0x6b,0xe7,0x75,0x02,0x03
+,0x01,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x81,0x81,0x00,0xa9,0x4f
+,0xc3,0x0d,0xc7,0x67,0xbe,0x2c,0xcb,0xd9
+,0xa8,0xcd,0x2d,0x75,0xe7,0x7e,0x15,0x9e
+,0x3b,0x72,0xeb,0x7e,0xeb,0x5c,0x2d,0x09
+,0x87,0xd6,0x6b,0x6d,0x60,0x7c,0xe5,0xae
+,0xc5,0x90,0x23,0x0c,0x5c,0x4a,0xd0,0xaf
+,0xb1,0x5d,0xf3,0xc7,0xb6,0x0a,0xdb,0xe0
+,0x15,0x93,0x0d,0xdd,0x03,0xbc,0xc7,0x76
+,0x8a,0xb5,0xdd,0x4f,0xc3,0x9b,0x13,0x75
+,0xb8,0x01,0xc0,0xe6,0xc9,0x5b,0x6b,0xa5
+,0xb8,0x89,0xdc,0xac,0xa4,0xdd,0x72,0xed
+,0x4e,0xa1,0xf7,0x4f,0xbc,0x06,0xd3,0xea
+,0xc8,0x64,0x74,0x7b,0xc2,0x95,0x41,0x9c
+,0x65,0x73,0x58,0xf1,0x90,0x9a,0x3c,0x6a
+,0xb1,0x98,0xc9,0xc4,0x87,0xbc,0xcf,0x45
+,0x6d,0x45,0xe2,0x6e,0x22,0x3f,0xfe,0xbc
+,0x0f,0x31,0x5c,0xe8,0xf2,0xd9};
+const unsigned int NptTlsTrustAnchor_Base_0016_Size = 774;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0017.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0017.cpp
new file mode 100644
index 0000000..47a1144
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0017.cpp
@@ -0,0 +1,133 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 2 Public Primary Certification Authority - G2 */
+const unsigned char NptTlsTrustAnchor_Base_0017_Data[775] = {
+0x30,0x82,0x03,0x03,0x30,0x82,0x02,0x6c
+,0x02,0x11,0x00,0xb9,0x2f,0x60,0xcc,0x88
+,0x9f,0xa1,0x7a,0x46,0x09,0xb8,0x5b,0x70
+,0x6c,0x8a,0xaf,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xc1,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x31,0x3c,0x30,0x3a,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x33,0x43,0x6c
+,0x61,0x73,0x73,0x20,0x32,0x20,0x50,0x75
+,0x62,0x6c,0x69,0x63,0x20,0x50,0x72,0x69
+,0x6d,0x61,0x72,0x79,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x20,0x2d,0x20,0x47
+,0x32,0x31,0x3a,0x30,0x38,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x31,0x28,0x63,0x29,0x20
+,0x31,0x39,0x39,0x38,0x20,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f
+,0x72,0x20,0x61,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x7a,0x65,0x64,0x20,0x75,0x73,0x65
+,0x20,0x6f,0x6e,0x6c,0x79,0x31,0x1f,0x30
+,0x1d,0x06,0x03,0x55,0x04,0x0b,0x13,0x16
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4e
+,0x65,0x74,0x77,0x6f,0x72,0x6b,0x30,0x1e
+,0x17,0x0d,0x39,0x38,0x30,0x35,0x31,0x38
+,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x17
+,0x0d,0x32,0x38,0x30,0x38,0x30,0x31,0x32
+,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x81
+,0xc1,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17
+,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31
+,0x3c,0x30,0x3a,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x33,0x43,0x6c,0x61,0x73,0x73,0x20
+,0x32,0x20,0x50,0x75,0x62,0x6c,0x69,0x63
+,0x20,0x50,0x72,0x69,0x6d,0x61,0x72,0x79
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79
+,0x20,0x2d,0x20,0x47,0x32,0x31,0x3a,0x30
+,0x38,0x06,0x03,0x55,0x04,0x0b,0x13,0x31
+,0x28,0x63,0x29,0x20,0x31,0x39,0x39,0x38
+,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20
+,0x2d,0x20,0x46,0x6f,0x72,0x20,0x61,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64
+,0x20,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c
+,0x79,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x16,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x20,0x54,0x72,0x75
+,0x73,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f
+,0x72,0x6b,0x30,0x81,0x9f,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x81,0x8d,0x00
+,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xa7
+,0x88,0x01,0x21,0x74,0x2c,0xe7,0x1a,0x03
+,0xf0,0x98,0xe1,0x97,0x3c,0x0f,0x21,0x08
+,0xf1,0x9c,0xdb,0x97,0xe9,0x9a,0xfc,0xc2
+,0x04,0x06,0x13,0xbe,0x5f,0x52,0xc8,0xcc
+,0x1e,0x2c,0x12,0x56,0x2c,0xb8,0x01,0x69
+,0x2c,0xcc,0x99,0x1f,0xad,0xb0,0x96,0xae
+,0x79,0x04,0xf2,0x13,0x39,0xc1,0x7b,0x98
+,0xba,0x08,0x2c,0xe8,0xc2,0x84,0x13,0x2c
+,0xaa,0x69,0xe9,0x09,0xf4,0xc7,0xa9,0x02
+,0xa4,0x42,0xc2,0x23,0x4f,0x4a,0xd8,0xf0
+,0x0e,0xa2,0xfb,0x31,0x6c,0xc9,0xe6,0x6f
+,0x99,0x27,0x07,0xf5,0xe6,0xf4,0x4c,0x78
+,0x9e,0x6d,0xeb,0x46,0x86,0xfa,0xb9,0x86
+,0xc9,0x54,0xf2,0xb2,0xc4,0xaf,0xd4,0x46
+,0x1c,0x5a,0xc9,0x15,0x30,0xff,0x0d,0x6c
+,0xf5,0x2d,0x0e,0x6d,0xce,0x7f,0x77,0x02
+,0x03,0x01,0x00,0x01,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x81,0x81,0x00,0x72
+,0x2e,0xf9,0x7f,0xd1,0xf1,0x71,0xfb,0xc4
+,0x9e,0xf6,0xc5,0x5e,0x51,0x8a,0x40,0x98
+,0xb8,0x68,0xf8,0x9b,0x1c,0x83,0xd8,0xe2
+,0x9d,0xbd,0xff,0xed,0xa1,0xe6,0x66,0xea
+,0x2f,0x09,0xf4,0xca,0xd7,0xea,0xa5,0x2b
+,0x95,0xf6,0x24,0x60,0x86,0x4d,0x44,0x2e
+,0x83,0xa5,0xc4,0x2d,0xa0,0xd3,0xae,0x78
+,0x69,0x6f,0x72,0xda,0x6c,0xae,0x08,0xf0
+,0x63,0x92,0x37,0xe6,0xbb,0xc4,0x30,0x17
+,0xad,0x77,0xcc,0x49,0x35,0xaa,0xcf,0xd8
+,0x8f,0xd1,0xbe,0xb7,0x18,0x96,0x47,0x73
+,0x6a,0x54,0x22,0x34,0x64,0x2d,0xb6,0x16
+,0x9b,0x59,0x5b,0xb4,0x51,0x59,0x3a,0xb3
+,0x0b,0x14,0xf4,0x12,0xdf,0x67,0xa0,0xf4
+,0xad,0x32,0x64,0x5e,0xb1,0x46,0x72,0x27
+,0x8c,0x12,0x7b,0xc5,0x44,0xb4,0xae};
+const unsigned int NptTlsTrustAnchor_Base_0017_Size = 775;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0018.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0018.cpp
new file mode 100644
index 0000000..04cf965
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0018.cpp
@@ -0,0 +1,133 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 3 Public Primary Certification Authority - G2 */
+const unsigned char NptTlsTrustAnchor_Base_0018_Data[774] = {
+0x30,0x82,0x03,0x02,0x30,0x82,0x02,0x6b
+,0x02,0x10,0x7d,0xd9,0xfe,0x07,0xcf,0xa8
+,0x1e,0xb7,0x10,0x79,0x67,0xfb,0xa7,0x89
+,0x34,0xc6,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x30,0x81,0xc1,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x3c,0x30,0x3a,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x33,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62
+,0x6c,0x69,0x63,0x20,0x50,0x72,0x69,0x6d
+,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x20,0x2d,0x20,0x47,0x32
+,0x31,0x3a,0x30,0x38,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x31,0x28,0x63,0x29,0x20,0x31
+,0x39,0x39,0x38,0x20,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f,0x72
+,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x7a,0x65,0x64,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x6e,0x6c,0x79,0x31,0x1f,0x30,0x1d
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x16,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20
+,0x54,0x72,0x75,0x73,0x74,0x20,0x4e,0x65
+,0x74,0x77,0x6f,0x72,0x6b,0x30,0x1e,0x17
+,0x0d,0x39,0x38,0x30,0x35,0x31,0x38,0x30
+,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x32,0x38,0x30,0x38,0x30,0x31,0x32,0x33
+,0x35,0x39,0x35,0x39,0x5a,0x30,0x81,0xc1
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30
+,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x3c
+,0x30,0x3a,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x33,0x43,0x6c,0x61,0x73,0x73,0x20,0x33
+,0x20,0x50,0x75,0x62,0x6c,0x69,0x63,0x20
+,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x2d,0x20,0x47,0x32,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x31,0x28
+,0x63,0x29,0x20,0x31,0x39,0x39,0x38,0x20
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20,0x2d
+,0x20,0x46,0x6f,0x72,0x20,0x61,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64,0x20
+,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c,0x79
+,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x16,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x20,0x54,0x72,0x75,0x73
+,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x30,0x81,0x9f,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x81,0x8d,0x00,0x30
+,0x81,0x89,0x02,0x81,0x81,0x00,0xcc,0x5e
+,0xd1,0x11,0x5d,0x5c,0x69,0xd0,0xab,0xd3
+,0xb9,0x6a,0x4c,0x99,0x1f,0x59,0x98,0x30
+,0x8e,0x16,0x85,0x20,0x46,0x6d,0x47,0x3f
+,0xd4,0x85,0x20,0x84,0xe1,0x6d,0xb3,0xf8
+,0xa4,0xed,0x0c,0xf1,0x17,0x0f,0x3b,0xf9
+,0xa7,0xf9,0x25,0xd7,0xc1,0xcf,0x84,0x63
+,0xf2,0x7c,0x63,0xcf,0xa2,0x47,0xf2,0xc6
+,0x5b,0x33,0x8e,0x64,0x40,0x04,0x68,0xc1
+,0x80,0xb9,0x64,0x1c,0x45,0x77,0xc7,0xd8
+,0x6e,0xf5,0x95,0x29,0x3c,0x50,0xe8,0x34
+,0xd7,0x78,0x1f,0xa8,0xba,0x6d,0x43,0x91
+,0x95,0x8f,0x45,0x57,0x5e,0x7e,0xc5,0xfb
+,0xca,0xa4,0x04,0xeb,0xea,0x97,0x37,0x54
+,0x30,0x6f,0xbb,0x01,0x47,0x32,0x33,0xcd
+,0xdc,0x57,0x9b,0x64,0x69,0x61,0xf8,0x9b
+,0x1d,0x1c,0x89,0x4f,0x5c,0x67,0x02,0x03
+,0x01,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x81,0x81,0x00,0x51,0x4d
+,0xcd,0xbe,0x5c,0xcb,0x98,0x19,0x9c,0x15
+,0xb2,0x01,0x39,0x78,0x2e,0x4d,0x0f,0x67
+,0x70,0x70,0x99,0xc6,0x10,0x5a,0x94,0xa4
+,0x53,0x4d,0x54,0x6d,0x2b,0xaf,0x0d,0x5d
+,0x40,0x8b,0x64,0xd3,0xd7,0xee,0xde,0x56
+,0x61,0x92,0x5f,0xa6,0xc4,0x1d,0x10,0x61
+,0x36,0xd3,0x2c,0x27,0x3c,0xe8,0x29,0x09
+,0xb9,0x11,0x64,0x74,0xcc,0xb5,0x73,0x9f
+,0x1c,0x48,0xa9,0xbc,0x61,0x01,0xee,0xe2
+,0x17,0xa6,0x0c,0xe3,0x40,0x08,0x3b,0x0e
+,0xe7,0xeb,0x44,0x73,0x2a,0x9a,0xf1,0x69
+,0x92,0xef,0x71,0x14,0xc3,0x39,0xac,0x71
+,0xa7,0x91,0x09,0x6f,0xe4,0x71,0x06,0xb3
+,0xba,0x59,0x57,0x26,0x79,0x00,0xf6,0xf8
+,0x0d,0xa2,0x33,0x30,0x28,0xd4,0xaa,0x58
+,0xa0,0x9d,0x9d,0x69,0x91,0xfd};
+const unsigned int NptTlsTrustAnchor_Base_0018_Size = 774;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0019.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0019.cpp
new file mode 100644
index 0000000..e47eae6
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0019.cpp
@@ -0,0 +1,133 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 4 Public Primary Certification Authority - G2 */
+const unsigned char NptTlsTrustAnchor_Base_0019_Data[774] = {
+0x30,0x82,0x03,0x02,0x30,0x82,0x02,0x6b
+,0x02,0x10,0x32,0x88,0x8e,0x9a,0xd2,0xf5
+,0xeb,0x13,0x47,0xf8,0x7f,0xc4,0x20,0x37
+,0x25,0xf8,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x30,0x81,0xc1,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x3c,0x30,0x3a,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x33,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x34,0x20,0x50,0x75,0x62
+,0x6c,0x69,0x63,0x20,0x50,0x72,0x69,0x6d
+,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x20,0x2d,0x20,0x47,0x32
+,0x31,0x3a,0x30,0x38,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x31,0x28,0x63,0x29,0x20,0x31
+,0x39,0x39,0x38,0x20,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f,0x72
+,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x7a,0x65,0x64,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x6e,0x6c,0x79,0x31,0x1f,0x30,0x1d
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x16,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20
+,0x54,0x72,0x75,0x73,0x74,0x20,0x4e,0x65
+,0x74,0x77,0x6f,0x72,0x6b,0x30,0x1e,0x17
+,0x0d,0x39,0x38,0x30,0x35,0x31,0x38,0x30
+,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x32,0x38,0x30,0x38,0x30,0x31,0x32,0x33
+,0x35,0x39,0x35,0x39,0x5a,0x30,0x81,0xc1
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30
+,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x3c
+,0x30,0x3a,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x33,0x43,0x6c,0x61,0x73,0x73,0x20,0x34
+,0x20,0x50,0x75,0x62,0x6c,0x69,0x63,0x20
+,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x2d,0x20,0x47,0x32,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x31,0x28
+,0x63,0x29,0x20,0x31,0x39,0x39,0x38,0x20
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20,0x2d
+,0x20,0x46,0x6f,0x72,0x20,0x61,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64,0x20
+,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c,0x79
+,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x16,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x20,0x54,0x72,0x75,0x73
+,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x30,0x81,0x9f,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x81,0x8d,0x00,0x30
+,0x81,0x89,0x02,0x81,0x81,0x00,0xba,0xf0
+,0xe4,0xcf,0xf9,0xc4,0xae,0x85,0x54,0xb9
+,0x07,0x57,0xf9,0x8f,0xc5,0x7f,0x68,0x11
+,0xf8,0xc4,0x17,0xb0,0x44,0xdc,0xe3,0x30
+,0x73,0xd5,0x2a,0x62,0x2a,0xb8,0xd0,0xcc
+,0x1c,0xed,0x28,0x5b,0x7e,0xbd,0x6a,0xdc
+,0xb3,0x91,0x24,0xca,0x41,0x62,0x3c,0xfc
+,0x02,0x01,0xbf,0x1c,0x16,0x31,0x94,0x05
+,0x97,0x76,0x6e,0xa2,0xad,0xbd,0x61,0x17
+,0x6c,0x4e,0x30,0x86,0xf0,0x51,0x37,0x2a
+,0x50,0xc7,0xa8,0x62,0x81,0xdc,0x5b,0x4a
+,0xaa,0xc1,0xa0,0xb4,0x6e,0xeb,0x2f,0xe5
+,0x57,0xc5,0xb1,0x2b,0x40,0x70,0xdb,0x5a
+,0x4d,0xa1,0x8e,0x1f,0xbd,0x03,0x1f,0xd8
+,0x03,0xd4,0x8f,0x4c,0x99,0x71,0xbc,0xe2
+,0x82,0xcc,0x58,0xe8,0x98,0x3a,0x86,0xd3
+,0x86,0x38,0xf3,0x00,0x29,0x1f,0x02,0x03
+,0x01,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x81,0x81,0x00,0x85,0x8c
+,0x12,0xc1,0xa7,0xb9,0x50,0x15,0x7a,0xcb
+,0x3e,0xac,0xb8,0x43,0x8a,0xdc,0xaa,0xdd
+,0x14,0xba,0x89,0x81,0x7e,0x01,0x3c,0x23
+,0x71,0x21,0x88,0x2f,0x82,0xdc,0x63,0xfa
+,0x02,0x45,0xac,0x45,0x59,0xd7,0x2a,0x58
+,0x44,0x5b,0xb7,0x9f,0x81,0x3b,0x92,0x68
+,0x3d,0xe2,0x37,0x24,0xf5,0x7b,0x6c,0x8f
+,0x76,0x35,0x96,0x09,0xa8,0x59,0x9d,0xb9
+,0xce,0x23,0xab,0x74,0xd6,0x83,0xfd,0x32
+,0x73,0x27,0xd8,0x69,0x3e,0x43,0x74,0xf6
+,0xae,0xc5,0x89,0x9a,0xe7,0x53,0x7c,0xe9
+,0x7b,0xf6,0x4b,0xf3,0xc1,0x65,0x83,0xde
+,0x8d,0x8a,0x9c,0x3c,0x88,0x8d,0x39,0x59
+,0xfc,0xaa,0x3f,0x22,0x8d,0xa1,0xc1,0x66
+,0x50,0x81,0x72,0x4c,0xed,0x22,0x64,0x4f
+,0x4f,0xca,0x80,0x91,0xb6,0x29};
+const unsigned int NptTlsTrustAnchor_Base_0019_Size = 774;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0020.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0020.cpp
new file mode 100644
index 0000000..0ea3ecb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0020.cpp
@@ -0,0 +1,148 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GlobalSign Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0020_Data[889] = {
+0x30,0x82,0x03,0x75,0x30,0x82,0x02,0x5d
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x0b,0x04
+,0x00,0x00,0x00,0x00,0x01,0x15,0x4b,0x5a
+,0xc3,0x94,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x30,0x57,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x42,0x45
+,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x10,0x47,0x6c,0x6f,0x62,0x61
+,0x6c,0x53,0x69,0x67,0x6e,0x20,0x6e,0x76
+,0x2d,0x73,0x61,0x31,0x10,0x30,0x0e,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x07,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x31,0x1b,0x30
+,0x19,0x06,0x03,0x55,0x04,0x03,0x13,0x12
+,0x47,0x6c,0x6f,0x62,0x61,0x6c,0x53,0x69
+,0x67,0x6e,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x41,0x30,0x1e,0x17,0x0d,0x39,0x38
+,0x30,0x39,0x30,0x31,0x31,0x32,0x30,0x30
+,0x30,0x30,0x5a,0x17,0x0d,0x32,0x38,0x30
+,0x31,0x32,0x38,0x31,0x32,0x30,0x30,0x30
+,0x30,0x5a,0x30,0x57,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x42
+,0x45,0x31,0x19,0x30,0x17,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x10,0x47,0x6c,0x6f,0x62
+,0x61,0x6c,0x53,0x69,0x67,0x6e,0x20,0x6e
+,0x76,0x2d,0x73,0x61,0x31,0x10,0x30,0x0e
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x07,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x41,0x31,0x1b
+,0x30,0x19,0x06,0x03,0x55,0x04,0x03,0x13
+,0x12,0x47,0x6c,0x6f,0x62,0x61,0x6c,0x53
+,0x69,0x67,0x6e,0x20,0x52,0x6f,0x6f,0x74
+,0x20,0x43,0x41,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xda,0x0e,0xe6,0x99
+,0x8d,0xce,0xa3,0xe3,0x4f,0x8a,0x7e,0xfb
+,0xf1,0x8b,0x83,0x25,0x6b,0xea,0x48,0x1f
+,0xf1,0x2a,0xb0,0xb9,0x95,0x11,0x04,0xbd
+,0xf0,0x63,0xd1,0xe2,0x67,0x66,0xcf,0x1c
+,0xdd,0xcf,0x1b,0x48,0x2b,0xee,0x8d,0x89
+,0x8e,0x9a,0xaf,0x29,0x80,0x65,0xab,0xe9
+,0xc7,0x2d,0x12,0xcb,0xab,0x1c,0x4c,0x70
+,0x07,0xa1,0x3d,0x0a,0x30,0xcd,0x15,0x8d
+,0x4f,0xf8,0xdd,0xd4,0x8c,0x50,0x15,0x1c
+,0xef,0x50,0xee,0xc4,0x2e,0xf7,0xfc,0xe9
+,0x52,0xf2,0x91,0x7d,0xe0,0x6d,0xd5,0x35
+,0x30,0x8e,0x5e,0x43,0x73,0xf2,0x41,0xe9
+,0xd5,0x6a,0xe3,0xb2,0x89,0x3a,0x56,0x39
+,0x38,0x6f,0x06,0x3c,0x88,0x69,0x5b,0x2a
+,0x4d,0xc5,0xa7,0x54,0xb8,0x6c,0x89,0xcc
+,0x9b,0xf9,0x3c,0xca,0xe5,0xfd,0x89,0xf5
+,0x12,0x3c,0x92,0x78,0x96,0xd6,0xdc,0x74
+,0x6e,0x93,0x44,0x61,0xd1,0x8d,0xc7,0x46
+,0xb2,0x75,0x0e,0x86,0xe8,0x19,0x8a,0xd5
+,0x6d,0x6c,0xd5,0x78,0x16,0x95,0xa2,0xe9
+,0xc8,0x0a,0x38,0xeb,0xf2,0x24,0x13,0x4f
+,0x73,0x54,0x93,0x13,0x85,0x3a,0x1b,0xbc
+,0x1e,0x34,0xb5,0x8b,0x05,0x8c,0xb9,0x77
+,0x8b,0xb1,0xdb,0x1f,0x20,0x91,0xab,0x09
+,0x53,0x6e,0x90,0xce,0x7b,0x37,0x74,0xb9
+,0x70,0x47,0x91,0x22,0x51,0x63,0x16,0x79
+,0xae,0xb1,0xae,0x41,0x26,0x08,0xc8,0x19
+,0x2b,0xd1,0x46,0xaa,0x48,0xd6,0x64,0x2a
+,0xd7,0x83,0x34,0xff,0x2c,0x2a,0xc1,0x6c
+,0x19,0x43,0x4a,0x07,0x85,0xe7,0xd3,0x7c
+,0xf6,0x21,0x68,0xef,0xea,0xf2,0x52,0x9f
+,0x7f,0x93,0x90,0xcf,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x42,0x30,0x40,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x01,0x06,0x30,0x0f,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0x60,0x7b,0x66,0x1a,0x45,0x0d,0x97
+,0xca,0x89,0x50,0x2f,0x7d,0x04,0xcd,0x34
+,0xa8,0xff,0xfc,0xfd,0x4b,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0xd6,0x73,0xe7,0x7c,0x4f,0x76,0xd0
+,0x8d,0xbf,0xec,0xba,0xa2,0xbe,0x34,0xc5
+,0x28,0x32,0xb5,0x7c,0xfc,0x6c,0x9c,0x2c
+,0x2b,0xbd,0x09,0x9e,0x53,0xbf,0x6b,0x5e
+,0xaa,0x11,0x48,0xb6,0xe5,0x08,0xa3,0xb3
+,0xca,0x3d,0x61,0x4d,0xd3,0x46,0x09,0xb3
+,0x3e,0xc3,0xa0,0xe3,0x63,0x55,0x1b,0xf2
+,0xba,0xef,0xad,0x39,0xe1,0x43,0xb9,0x38
+,0xa3,0xe6,0x2f,0x8a,0x26,0x3b,0xef,0xa0
+,0x50,0x56,0xf9,0xc6,0x0a,0xfd,0x38,0xcd
+,0xc4,0x0b,0x70,0x51,0x94,0x97,0x98,0x04
+,0xdf,0xc3,0x5f,0x94,0xd5,0x15,0xc9,0x14
+,0x41,0x9c,0xc4,0x5d,0x75,0x64,0x15,0x0d
+,0xff,0x55,0x30,0xec,0x86,0x8f,0xff,0x0d
+,0xef,0x2c,0xb9,0x63,0x46,0xf6,0xaa,0xfc
+,0xdf,0xbc,0x69,0xfd,0x2e,0x12,0x48,0x64
+,0x9a,0xe0,0x95,0xf0,0xa6,0xef,0x29,0x8f
+,0x01,0xb1,0x15,0xb5,0x0c,0x1d,0xa5,0xfe
+,0x69,0x2c,0x69,0x24,0x78,0x1e,0xb3,0xa7
+,0x1c,0x71,0x62,0xee,0xca,0xc8,0x97,0xac
+,0x17,0x5d,0x8a,0xc2,0xf8,0x47,0x86,0x6e
+,0x2a,0xc4,0x56,0x31,0x95,0xd0,0x67,0x89
+,0x85,0x2b,0xf9,0x6c,0xa6,0x5d,0x46,0x9d
+,0x0c,0xaa,0x82,0xe4,0x99,0x51,0xdd,0x70
+,0xb7,0xdb,0x56,0x3d,0x61,0xe4,0x6a,0xe1
+,0x5c,0xd6,0xf6,0xfe,0x3d,0xde,0x41,0xcc
+,0x07,0xae,0x63,0x52,0xbf,0x53,0x53,0xf4
+,0x2b,0xe9,0xc7,0xfd,0xb6,0xf7,0x82,0x5f
+,0x85,0xd2,0x41,0x18,0xdb,0x81,0xb3,0x04
+,0x1c,0xc5,0x1f,0xa4,0x80,0x6f,0x15,0x20
+,0xc9,0xde,0x0c,0x88,0x0a,0x1d,0xd6,0x66
+,0x55,0xe2,0xfc,0x48,0xc9,0x29,0x26,0x69
+,0xe0};
+const unsigned int NptTlsTrustAnchor_Base_0020_Size = 889;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0021.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0021.cpp
new file mode 100644
index 0000000..4026e2a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0021.cpp
@@ -0,0 +1,156 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GlobalSign Root CA - R2 */
+const unsigned char NptTlsTrustAnchor_Base_0021_Data[958] = {
+0x30,0x82,0x03,0xba,0x30,0x82,0x02,0xa2
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x0b,0x04
+,0x00,0x00,0x00,0x00,0x01,0x0f,0x86,0x26
+,0xe6,0x0d,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x30,0x4c,0x31,0x20,0x30,0x1e,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x17,0x47,0x6c
+,0x6f,0x62,0x61,0x6c,0x53,0x69,0x67,0x6e
+,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41
+,0x20,0x2d,0x20,0x52,0x32,0x31,0x13,0x30
+,0x11,0x06,0x03,0x55,0x04,0x0a,0x13,0x0a
+,0x47,0x6c,0x6f,0x62,0x61,0x6c,0x53,0x69
+,0x67,0x6e,0x31,0x13,0x30,0x11,0x06,0x03
+,0x55,0x04,0x03,0x13,0x0a,0x47,0x6c,0x6f
+,0x62,0x61,0x6c,0x53,0x69,0x67,0x6e,0x30
+,0x1e,0x17,0x0d,0x30,0x36,0x31,0x32,0x31
+,0x35,0x30,0x38,0x30,0x30,0x30,0x30,0x5a
+,0x17,0x0d,0x32,0x31,0x31,0x32,0x31,0x35
+,0x30,0x38,0x30,0x30,0x30,0x30,0x5a,0x30
+,0x4c,0x31,0x20,0x30,0x1e,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x17,0x47,0x6c,0x6f,0x62
+,0x61,0x6c,0x53,0x69,0x67,0x6e,0x20,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x41,0x20,0x2d
+,0x20,0x52,0x32,0x31,0x13,0x30,0x11,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x0a,0x47,0x6c
+,0x6f,0x62,0x61,0x6c,0x53,0x69,0x67,0x6e
+,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04
+,0x03,0x13,0x0a,0x47,0x6c,0x6f,0x62,0x61
+,0x6c,0x53,0x69,0x67,0x6e,0x30,0x82,0x01
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01
+,0x0a,0x02,0x82,0x01,0x01,0x00,0xa6,0xcf
+,0x24,0x0e,0xbe,0x2e,0x6f,0x28,0x99,0x45
+,0x42,0xc4,0xab,0x3e,0x21,0x54,0x9b,0x0b
+,0xd3,0x7f,0x84,0x70,0xfa,0x12,0xb3,0xcb
+,0xbf,0x87,0x5f,0xc6,0x7f,0x86,0xd3,0xb2
+,0x30,0x5c,0xd6,0xfd,0xad,0xf1,0x7b,0xdc
+,0xe5,0xf8,0x60,0x96,0x09,0x92,0x10,0xf5
+,0xd0,0x53,0xde,0xfb,0x7b,0x7e,0x73,0x88
+,0xac,0x52,0x88,0x7b,0x4a,0xa6,0xca,0x49
+,0xa6,0x5e,0xa8,0xa7,0x8c,0x5a,0x11,0xbc
+,0x7a,0x82,0xeb,0xbe,0x8c,0xe9,0xb3,0xac
+,0x96,0x25,0x07,0x97,0x4a,0x99,0x2a,0x07
+,0x2f,0xb4,0x1e,0x77,0xbf,0x8a,0x0f,0xb5
+,0x02,0x7c,0x1b,0x96,0xb8,0xc5,0xb9,0x3a
+,0x2c,0xbc,0xd6,0x12,0xb9,0xeb,0x59,0x7d
+,0xe2,0xd0,0x06,0x86,0x5f,0x5e,0x49,0x6a
+,0xb5,0x39,0x5e,0x88,0x34,0xec,0xbc,0x78
+,0x0c,0x08,0x98,0x84,0x6c,0xa8,0xcd,0x4b
+,0xb4,0xa0,0x7d,0x0c,0x79,0x4d,0xf0,0xb8
+,0x2d,0xcb,0x21,0xca,0xd5,0x6c,0x5b,0x7d
+,0xe1,0xa0,0x29,0x84,0xa1,0xf9,0xd3,0x94
+,0x49,0xcb,0x24,0x62,0x91,0x20,0xbc,0xdd
+,0x0b,0xd5,0xd9,0xcc,0xf9,0xea,0x27,0x0a
+,0x2b,0x73,0x91,0xc6,0x9d,0x1b,0xac,0xc8
+,0xcb,0xe8,0xe0,0xa0,0xf4,0x2f,0x90,0x8b
+,0x4d,0xfb,0xb0,0x36,0x1b,0xf6,0x19,0x7a
+,0x85,0xe0,0x6d,0xf2,0x61,0x13,0x88,0x5c
+,0x9f,0xe0,0x93,0x0a,0x51,0x97,0x8a,0x5a
+,0xce,0xaf,0xab,0xd5,0xf7,0xaa,0x09,0xaa
+,0x60,0xbd,0xdc,0xd9,0x5f,0xdf,0x72,0xa9
+,0x60,0x13,0x5e,0x00,0x01,0xc9,0x4a,0xfa
+,0x3f,0xa4,0xea,0x07,0x03,0x21,0x02,0x8e
+,0x82,0xca,0x03,0xc2,0x9b,0x8f,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x81,0x9c,0x30,0x81
+,0x99,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x9b,0xe2,0x07
+,0x57,0x67,0x1c,0x1e,0xc0,0x6a,0x06,0xde
+,0x59,0xb4,0x9a,0x2d,0xdf,0xdc,0x19,0x86
+,0x2e,0x30,0x36,0x06,0x03,0x55,0x1d,0x1f
+,0x04,0x2f,0x30,0x2d,0x30,0x2b,0xa0,0x29
+,0xa0,0x27,0x86,0x25,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x67
+,0x6c,0x6f,0x62,0x61,0x6c,0x73,0x69,0x67
+,0x6e,0x2e,0x6e,0x65,0x74,0x2f,0x72,0x6f
+,0x6f,0x74,0x2d,0x72,0x32,0x2e,0x63,0x72
+,0x6c,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0x9b,0xe2
+,0x07,0x57,0x67,0x1c,0x1e,0xc0,0x6a,0x06
+,0xde,0x59,0xb4,0x9a,0x2d,0xdf,0xdc,0x19
+,0x86,0x2e,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x99,0x81
+,0x53,0x87,0x1c,0x68,0x97,0x86,0x91,0xec
+,0xe0,0x4a,0xb8,0x44,0x0b,0xab,0x81,0xac
+,0x27,0x4f,0xd6,0xc1,0xb8,0x1c,0x43,0x78
+,0xb3,0x0c,0x9a,0xfc,0xea,0x2c,0x3c,0x6e
+,0x61,0x1b,0x4d,0x4b,0x29,0xf5,0x9f,0x05
+,0x1d,0x26,0xc1,0xb8,0xe9,0x83,0x00,0x62
+,0x45,0xb6,0xa9,0x08,0x93,0xb9,0xa9,0x33
+,0x4b,0x18,0x9a,0xc2,0xf8,0x87,0x88,0x4e
+,0xdb,0xdd,0x71,0x34,0x1a,0xc1,0x54,0xda
+,0x46,0x3f,0xe0,0xd3,0x2a,0xab,0x6d,0x54
+,0x22,0xf5,0x3a,0x62,0xcd,0x20,0x6f,0xba
+,0x29,0x89,0xd7,0xdd,0x91,0xee,0xd3,0x5c
+,0xa2,0x3e,0xa1,0x5b,0x41,0xf5,0xdf,0xe5
+,0x64,0x43,0x2d,0xe9,0xd5,0x39,0xab,0xd2
+,0xa2,0xdf,0xb7,0x8b,0xd0,0xc0,0x80,0x19
+,0x1c,0x45,0xc0,0x2d,0x8c,0xe8,0xf8,0x2d
+,0xa4,0x74,0x56,0x49,0xc5,0x05,0xb5,0x4f
+,0x15,0xde,0x6e,0x44,0x78,0x39,0x87,0xa8
+,0x7e,0xbb,0xf3,0x79,0x18,0x91,0xbb,0xf4
+,0x6f,0x9d,0xc1,0xf0,0x8c,0x35,0x8c,0x5d
+,0x01,0xfb,0xc3,0x6d,0xb9,0xef,0x44,0x6d
+,0x79,0x46,0x31,0x7e,0x0a,0xfe,0xa9,0x82
+,0xc1,0xff,0xef,0xab,0x6e,0x20,0xc4,0x50
+,0xc9,0x5f,0x9d,0x4d,0x9b,0x17,0x8c,0x0c
+,0xe5,0x01,0xc9,0xa0,0x41,0x6a,0x73,0x53
+,0xfa,0xa5,0x50,0xb4,0x6e,0x25,0x0f,0xfb
+,0x4c,0x18,0xf4,0xfd,0x52,0xd9,0x8e,0x69
+,0xb1,0xe8,0x11,0x0f,0xde,0x88,0xd8,0xfb
+,0x1d,0x49,0xf7,0xaa,0xde,0x95,0xcf,0x20
+,0x78,0xc2,0x60,0x12,0xdb,0x25,0x40,0x8c
+,0x6a,0xfc,0x7e,0x42,0x38,0x40,0x64,0x12
+,0xf7,0x9e,0x81,0xe1,0x93,0x2e};
+const unsigned int NptTlsTrustAnchor_Base_0021_Size = 958;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0022.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0022.cpp
new file mode 100644
index 0000000..d16e382
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0022.cpp
@@ -0,0 +1,130 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* ValiCert Class 1 VA */
+const unsigned char NptTlsTrustAnchor_Base_0022_Data[747] = {
+0x30,0x82,0x02,0xe7,0x30,0x82,0x02,0x50
+,0x02,0x01,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xbb,0x31,0x24,0x30
+,0x22,0x06,0x03,0x55,0x04,0x07,0x13,0x1b
+,0x56,0x61,0x6c,0x69,0x43,0x65,0x72,0x74
+,0x20,0x56,0x61,0x6c,0x69,0x64,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x4e,0x65,0x74,0x77
+,0x6f,0x72,0x6b,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x61
+,0x6c,0x69,0x43,0x65,0x72,0x74,0x2c,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x35,0x30,0x33
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x2c,0x56
+,0x61,0x6c,0x69,0x43,0x65,0x72,0x74,0x20
+,0x43,0x6c,0x61,0x73,0x73,0x20,0x31,0x20
+,0x50,0x6f,0x6c,0x69,0x63,0x79,0x20,0x56
+,0x61,0x6c,0x69,0x64,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x21,0x30,0x1f,0x06
+,0x03,0x55,0x04,0x03,0x13,0x18,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x76,0x61,0x6c,0x69,0x63,0x65,0x72
+,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x31,0x20
+,0x30,0x1e,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x11,0x69
+,0x6e,0x66,0x6f,0x40,0x76,0x61,0x6c,0x69
+,0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d
+,0x30,0x1e,0x17,0x0d,0x39,0x39,0x30,0x36
+,0x32,0x35,0x32,0x32,0x32,0x33,0x34,0x38
+,0x5a,0x17,0x0d,0x31,0x39,0x30,0x36,0x32
+,0x35,0x32,0x32,0x32,0x33,0x34,0x38,0x5a
+,0x30,0x81,0xbb,0x31,0x24,0x30,0x22,0x06
+,0x03,0x55,0x04,0x07,0x13,0x1b,0x56,0x61
+,0x6c,0x69,0x43,0x65,0x72,0x74,0x20,0x56
+,0x61,0x6c,0x69,0x64,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x61,0x6c,0x69
+,0x43,0x65,0x72,0x74,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x35,0x30,0x33,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x2c,0x56,0x61,0x6c
+,0x69,0x43,0x65,0x72,0x74,0x20,0x43,0x6c
+,0x61,0x73,0x73,0x20,0x31,0x20,0x50,0x6f
+,0x6c,0x69,0x63,0x79,0x20,0x56,0x61,0x6c
+,0x69,0x64,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x31,0x21,0x30,0x1f,0x06,0x03,0x55
+,0x04,0x03,0x13,0x18,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76
+,0x61,0x6c,0x69,0x63,0x65,0x72,0x74,0x2e
+,0x63,0x6f,0x6d,0x2f,0x31,0x20,0x30,0x1e
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x09,0x01,0x16,0x11,0x69,0x6e,0x66
+,0x6f,0x40,0x76,0x61,0x6c,0x69,0x63,0x65
+,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x30,0x81
+,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x81,0x8d,0x00,0x30,0x81,0x89,0x02
+,0x81,0x81,0x00,0xd8,0x59,0x82,0x7a,0x89
+,0xb8,0x96,0xba,0xa6,0x2f,0x68,0x6f,0x58
+,0x2e,0xa7,0x54,0x1c,0x06,0x6e,0xf4,0xea
+,0x8d,0x48,0xbc,0x31,0x94,0x17,0xf0,0xf3
+,0x4e,0xbc,0xb2,0xb8,0x35,0x92,0x76,0xb0
+,0xd0,0xa5,0xa5,0x01,0xd7,0x00,0x03,0x12
+,0x22,0x19,0x08,0xf8,0xff,0x11,0x23,0x9b
+,0xce,0x07,0xf5,0xbf,0x69,0x1a,0x26,0xfe
+,0x4e,0xe9,0xd1,0x7f,0x9d,0x2c,0x40,0x1d
+,0x59,0x68,0x6e,0xa6,0xf8,0x58,0xb0,0x9d
+,0x1a,0x8f,0xd3,0x3f,0xf1,0xdc,0x19,0x06
+,0x81,0xa8,0x0e,0xe0,0x3a,0xdd,0xc8,0x53
+,0x45,0x09,0x06,0xe6,0x0f,0x70,0xc3,0xfa
+,0x40,0xa6,0x0e,0xe2,0x56,0x05,0x0f,0x18
+,0x4d,0xfc,0x20,0x82,0xd1,0x73,0x55,0x74
+,0x8d,0x76,0x72,0xa0,0x1d,0x9d,0x1d,0xc0
+,0xdd,0x3f,0x71,0x02,0x03,0x01,0x00,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x81,0x81,0x00,0x50,0x68,0x3d,0x49,0xf4
+,0x2c,0x1c,0x06,0x94,0xdf,0x95,0x60,0x7f
+,0x96,0x7b,0x17,0xfe,0x4f,0x71,0xad,0x64
+,0xc8,0xdd,0x77,0xd2,0xef,0x59,0x55,0xe8
+,0x3f,0xe8,0x8e,0x05,0x2a,0x21,0xf2,0x07
+,0xd2,0xb5,0xa7,0x52,0xfe,0x9c,0xb1,0xb6
+,0xe2,0x5b,0x77,0x17,0x40,0xea,0x72,0xd6
+,0x23,0xcb,0x28,0x81,0x32,0xc3,0x00,0x79
+,0x18,0xec,0x59,0x17,0x89,0xc9,0xc6,0x6a
+,0x1e,0x71,0xc9,0xfd,0xb7,0x74,0xa5,0x25
+,0x45,0x69,0xc5,0x48,0xab,0x19,0xe1,0x45
+,0x8a,0x25,0x6b,0x19,0xee,0xe5,0xbb,0x12
+,0xf5,0x7f,0xf7,0xa6,0x8d,0x51,0xc3,0xf0
+,0x9d,0x74,0xb7,0xa9,0x3e,0xa0,0xa5,0xff
+,0xb6,0x49,0x03,0x13,0xda,0x22,0xcc,0xed
+,0x71,0x82,0x2b,0x99,0xcf,0x3a,0xb7,0xf5
+,0x2d,0x72,0xc8};
+const unsigned int NptTlsTrustAnchor_Base_0022_Size = 747;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0023.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0023.cpp
new file mode 100644
index 0000000..baa7fbd
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0023.cpp
@@ -0,0 +1,130 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* ValiCert Class 2 VA */
+const unsigned char NptTlsTrustAnchor_Base_0023_Data[747] = {
+0x30,0x82,0x02,0xe7,0x30,0x82,0x02,0x50
+,0x02,0x01,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xbb,0x31,0x24,0x30
+,0x22,0x06,0x03,0x55,0x04,0x07,0x13,0x1b
+,0x56,0x61,0x6c,0x69,0x43,0x65,0x72,0x74
+,0x20,0x56,0x61,0x6c,0x69,0x64,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x4e,0x65,0x74,0x77
+,0x6f,0x72,0x6b,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x61
+,0x6c,0x69,0x43,0x65,0x72,0x74,0x2c,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x35,0x30,0x33
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x2c,0x56
+,0x61,0x6c,0x69,0x43,0x65,0x72,0x74,0x20
+,0x43,0x6c,0x61,0x73,0x73,0x20,0x32,0x20
+,0x50,0x6f,0x6c,0x69,0x63,0x79,0x20,0x56
+,0x61,0x6c,0x69,0x64,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x21,0x30,0x1f,0x06
+,0x03,0x55,0x04,0x03,0x13,0x18,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x76,0x61,0x6c,0x69,0x63,0x65,0x72
+,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x31,0x20
+,0x30,0x1e,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x11,0x69
+,0x6e,0x66,0x6f,0x40,0x76,0x61,0x6c,0x69
+,0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d
+,0x30,0x1e,0x17,0x0d,0x39,0x39,0x30,0x36
+,0x32,0x36,0x30,0x30,0x31,0x39,0x35,0x34
+,0x5a,0x17,0x0d,0x31,0x39,0x30,0x36,0x32
+,0x36,0x30,0x30,0x31,0x39,0x35,0x34,0x5a
+,0x30,0x81,0xbb,0x31,0x24,0x30,0x22,0x06
+,0x03,0x55,0x04,0x07,0x13,0x1b,0x56,0x61
+,0x6c,0x69,0x43,0x65,0x72,0x74,0x20,0x56
+,0x61,0x6c,0x69,0x64,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x61,0x6c,0x69
+,0x43,0x65,0x72,0x74,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x35,0x30,0x33,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x2c,0x56,0x61,0x6c
+,0x69,0x43,0x65,0x72,0x74,0x20,0x43,0x6c
+,0x61,0x73,0x73,0x20,0x32,0x20,0x50,0x6f
+,0x6c,0x69,0x63,0x79,0x20,0x56,0x61,0x6c
+,0x69,0x64,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x31,0x21,0x30,0x1f,0x06,0x03,0x55
+,0x04,0x03,0x13,0x18,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76
+,0x61,0x6c,0x69,0x63,0x65,0x72,0x74,0x2e
+,0x63,0x6f,0x6d,0x2f,0x31,0x20,0x30,0x1e
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x09,0x01,0x16,0x11,0x69,0x6e,0x66
+,0x6f,0x40,0x76,0x61,0x6c,0x69,0x63,0x65
+,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x30,0x81
+,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x81,0x8d,0x00,0x30,0x81,0x89,0x02
+,0x81,0x81,0x00,0xce,0x3a,0x71,0xca,0xe5
+,0xab,0xc8,0x59,0x92,0x55,0xd7,0xab,0xd8
+,0x74,0x0e,0xf9,0xee,0xd9,0xf6,0x55,0x47
+,0x59,0x65,0x47,0x0e,0x05,0x55,0xdc,0xeb
+,0x98,0x36,0x3c,0x5c,0x53,0x5d,0xd3,0x30
+,0xcf,0x38,0xec,0xbd,0x41,0x89,0xed,0x25
+,0x42,0x09,0x24,0x6b,0x0a,0x5e,0xb3,0x7c
+,0xdd,0x52,0x2d,0x4c,0xe6,0xd4,0xd6,0x7d
+,0x5a,0x59,0xa9,0x65,0xd4,0x49,0x13,0x2d
+,0x24,0x4d,0x1c,0x50,0x6f,0xb5,0xc1,0x85
+,0x54,0x3b,0xfe,0x71,0xe4,0xd3,0x5c,0x42
+,0xf9,0x80,0xe0,0x91,0x1a,0x0a,0x5b,0x39
+,0x36,0x67,0xf3,0x3f,0x55,0x7c,0x1b,0x3f
+,0xb4,0x5f,0x64,0x73,0x34,0xe3,0xb4,0x12
+,0xbf,0x87,0x64,0xf8,0xda,0x12,0xff,0x37
+,0x27,0xc1,0xb3,0x43,0xbb,0xef,0x7b,0x6e
+,0x2e,0x69,0xf7,0x02,0x03,0x01,0x00,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x81,0x81,0x00,0x3b,0x7f,0x50,0x6f,0x6f
+,0x50,0x94,0x99,0x49,0x62,0x38,0x38,0x1f
+,0x4b,0xf8,0xa5,0xc8,0x3e,0xa7,0x82,0x81
+,0xf6,0x2b,0xc7,0xe8,0xc5,0xce,0xe8,0x3a
+,0x10,0x82,0xcb,0x18,0x00,0x8e,0x4d,0xbd
+,0xa8,0x58,0x7f,0xa1,0x79,0x00,0xb5,0xbb
+,0xe9,0x8d,0xaf,0x41,0xd9,0x0f,0x34,0xee
+,0x21,0x81,0x19,0xa0,0x32,0x49,0x28,0xf4
+,0xc4,0x8e,0x56,0xd5,0x52,0x33,0xfd,0x50
+,0xd5,0x7e,0x99,0x6c,0x03,0xe4,0xc9,0x4c
+,0xfc,0xcb,0x6c,0xab,0x66,0xb3,0x4a,0x21
+,0x8c,0xe5,0xb5,0x0c,0x32,0x3e,0x10,0xb2
+,0xcc,0x6c,0xa1,0xdc,0x9a,0x98,0x4c,0x02
+,0x5b,0xf3,0xce,0xb9,0x9e,0xa5,0x72,0x0e
+,0x4a,0xb7,0x3f,0x3c,0xe6,0x16,0x68,0xf8
+,0xbe,0xed,0x74,0x4c,0xbc,0x5b,0xd5,0x62
+,0x1f,0x43,0xdd};
+const unsigned int NptTlsTrustAnchor_Base_0023_Size = 747;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0024.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0024.cpp
new file mode 100644
index 0000000..270e0bb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0024.cpp
@@ -0,0 +1,130 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* RSA Root Certificate 1 */
+const unsigned char NptTlsTrustAnchor_Base_0024_Data[747] = {
+0x30,0x82,0x02,0xe7,0x30,0x82,0x02,0x50
+,0x02,0x01,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xbb,0x31,0x24,0x30
+,0x22,0x06,0x03,0x55,0x04,0x07,0x13,0x1b
+,0x56,0x61,0x6c,0x69,0x43,0x65,0x72,0x74
+,0x20,0x56,0x61,0x6c,0x69,0x64,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x4e,0x65,0x74,0x77
+,0x6f,0x72,0x6b,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x61
+,0x6c,0x69,0x43,0x65,0x72,0x74,0x2c,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x35,0x30,0x33
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x2c,0x56
+,0x61,0x6c,0x69,0x43,0x65,0x72,0x74,0x20
+,0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20
+,0x50,0x6f,0x6c,0x69,0x63,0x79,0x20,0x56
+,0x61,0x6c,0x69,0x64,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x21,0x30,0x1f,0x06
+,0x03,0x55,0x04,0x03,0x13,0x18,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x76,0x61,0x6c,0x69,0x63,0x65,0x72
+,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x31,0x20
+,0x30,0x1e,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x11,0x69
+,0x6e,0x66,0x6f,0x40,0x76,0x61,0x6c,0x69
+,0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d
+,0x30,0x1e,0x17,0x0d,0x39,0x39,0x30,0x36
+,0x32,0x36,0x30,0x30,0x32,0x32,0x33,0x33
+,0x5a,0x17,0x0d,0x31,0x39,0x30,0x36,0x32
+,0x36,0x30,0x30,0x32,0x32,0x33,0x33,0x5a
+,0x30,0x81,0xbb,0x31,0x24,0x30,0x22,0x06
+,0x03,0x55,0x04,0x07,0x13,0x1b,0x56,0x61
+,0x6c,0x69,0x43,0x65,0x72,0x74,0x20,0x56
+,0x61,0x6c,0x69,0x64,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x61,0x6c,0x69
+,0x43,0x65,0x72,0x74,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x35,0x30,0x33,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x2c,0x56,0x61,0x6c
+,0x69,0x43,0x65,0x72,0x74,0x20,0x43,0x6c
+,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x6f
+,0x6c,0x69,0x63,0x79,0x20,0x56,0x61,0x6c
+,0x69,0x64,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x31,0x21,0x30,0x1f,0x06,0x03,0x55
+,0x04,0x03,0x13,0x18,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76
+,0x61,0x6c,0x69,0x63,0x65,0x72,0x74,0x2e
+,0x63,0x6f,0x6d,0x2f,0x31,0x20,0x30,0x1e
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x09,0x01,0x16,0x11,0x69,0x6e,0x66
+,0x6f,0x40,0x76,0x61,0x6c,0x69,0x63,0x65
+,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x30,0x81
+,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x81,0x8d,0x00,0x30,0x81,0x89,0x02
+,0x81,0x81,0x00,0xe3,0x98,0x51,0x96,0x1c
+,0xe8,0xd5,0xb1,0x06,0x81,0x6a,0x57,0xc3
+,0x72,0x75,0x93,0xab,0xcf,0x9e,0xa6,0xfc
+,0xf3,0x16,0x52,0xd6,0x2d,0x4d,0x9f,0x35
+,0x44,0xa8,0x2e,0x04,0x4d,0x07,0x49,0x8a
+,0x38,0x29,0xf5,0x77,0x37,0xe7,0xb7,0xab
+,0x5d,0xdf,0x36,0x71,0x14,0x99,0x8f,0xdc
+,0xc2,0x92,0xf1,0xe7,0x60,0x92,0x97,0xec
+,0xd8,0x48,0xdc,0xbf,0xc1,0x02,0x20,0xc6
+,0x24,0xa4,0x28,0x4c,0x30,0x5a,0x76,0x6d
+,0xb1,0x5c,0xf3,0xdd,0xde,0x9e,0x10,0x71
+,0xa1,0x88,0xc7,0x5b,0x9b,0x41,0x6d,0xca
+,0xb0,0xb8,0x8e,0x15,0xee,0xad,0x33,0x2b
+,0xcf,0x47,0x04,0x5c,0x75,0x71,0x0a,0x98
+,0x24,0x98,0x29,0xa7,0x49,0x59,0xa5,0xdd
+,0xf8,0xb7,0x43,0x62,0x61,0xf3,0xd3,0xe2
+,0xd0,0x55,0x3f,0x02,0x03,0x01,0x00,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x81,0x81,0x00,0x56,0xbb,0x02,0x58,0x84
+,0x67,0x08,0x2c,0xdf,0x1f,0xdb,0x7b,0x49
+,0x33,0xf5,0xd3,0x67,0x9d,0xf4,0xb4,0x0a
+,0x10,0xb3,0xc9,0xc5,0x2c,0xe2,0x92,0x6a
+,0x71,0x78,0x27,0xf2,0x70,0x83,0x42,0xd3
+,0x3e,0xcf,0xa9,0x54,0xf4,0xf1,0xd8,0x92
+,0x16,0x8c,0xd1,0x04,0xcb,0x4b,0xab,0xc9
+,0x9f,0x45,0xae,0x3c,0x8a,0xa9,0xb0,0x71
+,0x33,0x5d,0xc8,0xc5,0x57,0xdf,0xaf,0xa8
+,0x35,0xb3,0x7f,0x89,0x87,0xe9,0xe8,0x25
+,0x92,0xb8,0x7f,0x85,0x7a,0xae,0xd6,0xbc
+,0x1e,0x37,0x58,0x2a,0x67,0xc9,0x91,0xcf
+,0x2a,0x81,0x3e,0xed,0xc6,0x39,0xdf,0xc0
+,0x3e,0x19,0x9c,0x19,0xcc,0x13,0x4d,0x82
+,0x41,0xb5,0x8c,0xde,0xe0,0x3d,0x60,0x08
+,0x20,0x0f,0x45,0x7e,0x6b,0xa2,0x7f,0xa3
+,0x8c,0x15,0xee};
+const unsigned int NptTlsTrustAnchor_Base_0024_Size = 747;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0025.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0025.cpp
new file mode 100644
index 0000000..c62489e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0025.cpp
@@ -0,0 +1,168 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 1 Public Primary Certification Authority - G3 */
+const unsigned char NptTlsTrustAnchor_Base_0025_Data[1054] = {
+0x30,0x82,0x04,0x1a,0x30,0x82,0x03,0x02
+,0x02,0x11,0x00,0x8b,0x5b,0x75,0x56,0x84
+,0x54,0x85,0x0b,0x00,0xcf,0xaf,0x38,0x48
+,0xce,0xb1,0xa4,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xca,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x31,0x1f,0x30,0x1d,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x16,0x56,0x65
+,0x72,0x69,0x53,0x69,0x67,0x6e,0x20,0x54
+,0x72,0x75,0x73,0x74,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x31,0x28
+,0x63,0x29,0x20,0x31,0x39,0x39,0x39,0x20
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20,0x2d
+,0x20,0x46,0x6f,0x72,0x20,0x61,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64,0x20
+,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c,0x79
+,0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04
+,0x03,0x13,0x3c,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x20,0x43,0x6c,0x61,0x73
+,0x73,0x20,0x31,0x20,0x50,0x75,0x62,0x6c
+,0x69,0x63,0x20,0x50,0x72,0x69,0x6d,0x61
+,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x20,0x2d,0x20,0x47,0x33,0x30
+,0x1e,0x17,0x0d,0x39,0x39,0x31,0x30,0x30
+,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a
+,0x17,0x0d,0x33,0x36,0x30,0x37,0x31,0x36
+,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30
+,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0e,0x56,0x65,0x72,0x69,0x53,0x69
+,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e
+,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x16,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x20,0x54,0x72,0x75,0x73
+,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x31,0x3a,0x30,0x38,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x31,0x28,0x63,0x29,0x20
+,0x31,0x39,0x39,0x39,0x20,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f
+,0x72,0x20,0x61,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x7a,0x65,0x64,0x20,0x75,0x73,0x65
+,0x20,0x6f,0x6e,0x6c,0x79,0x31,0x45,0x30
+,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3c
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x20,0x43,0x6c,0x61,0x73,0x73,0x20,0x31
+,0x20,0x50,0x75,0x62,0x6c,0x69,0x63,0x20
+,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x2d,0x20,0x47,0x33,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xdd,0x84,0xd4
+,0xb9,0xb4,0xf9,0xa7,0xd8,0xf3,0x04,0x78
+,0x9c,0xde,0x3d,0xdc,0x6c,0x13,0x16,0xd9
+,0x7a,0xdd,0x24,0x51,0x66,0xc0,0xc7,0x26
+,0x59,0x0d,0xac,0x06,0x08,0xc2,0x94,0xd1
+,0x33,0x1f,0xf0,0x83,0x35,0x1f,0x6e,0x1b
+,0xc8,0xde,0xaa,0x6e,0x15,0x4e,0x54,0x27
+,0xef,0xc4,0x6d,0x1a,0xec,0x0b,0xe3,0x0e
+,0xf0,0x44,0xa5,0x57,0xc7,0x40,0x58,0x1e
+,0xa3,0x47,0x1f,0x71,0xec,0x60,0xf6,0x6d
+,0x94,0xc8,0x18,0x39,0xed,0xfe,0x42,0x18
+,0x56,0xdf,0xe4,0x4c,0x49,0x10,0x78,0x4e
+,0x01,0x76,0x35,0x63,0x12,0x36,0xdd,0x66
+,0xbc,0x01,0x04,0x36,0xa3,0x55,0x68,0xd5
+,0xa2,0x36,0x09,0xac,0xab,0x21,0x26,0x54
+,0x06,0xad,0x3f,0xca,0x14,0xe0,0xac,0xca
+,0xad,0x06,0x1d,0x95,0xe2,0xf8,0x9d,0xf1
+,0xe0,0x60,0xff,0xc2,0x7f,0x75,0x2b,0x4c
+,0xcc,0xda,0xfe,0x87,0x99,0x21,0xea,0xba
+,0xfe,0x3e,0x54,0xd7,0xd2,0x59,0x78,0xdb
+,0x3c,0x6e,0xcf,0xa0,0x13,0x00,0x1a,0xb8
+,0x27,0xa1,0xe4,0xbe,0x67,0x96,0xca,0xa0
+,0xc5,0xb3,0x9c,0xdd,0xc9,0x75,0x9e,0xeb
+,0x30,0x9a,0x5f,0xa3,0xcd,0xd9,0xae,0x78
+,0x19,0x3f,0x23,0xe9,0x5c,0xdb,0x29,0xbd
+,0xad,0x55,0xc8,0x1b,0x54,0x8c,0x63,0xf6
+,0xe8,0xa6,0xea,0xc7,0x37,0x12,0x5c,0xa3
+,0x29,0x1e,0x02,0xd9,0xdb,0x1f,0x3b,0xb4
+,0xd7,0x0f,0x56,0x47,0x81,0x15,0x04,0x4a
+,0xaf,0x83,0x27,0xd1,0xc5,0x58,0x88,0xc1
+,0xdd,0xf6,0xaa,0xa7,0xa3,0x18,0xda,0x68
+,0xaa,0x6d,0x11,0x51,0xe1,0xbf,0x65,0x6b
+,0x9f,0x96,0x76,0xd1,0x3d,0x02,0x03,0x01
+,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0xab,0x66
+,0x8d,0xd7,0xb3,0xba,0xc7,0x9a,0xb6,0xe6
+,0x55,0xd0,0x05,0xf1,0x9f,0x31,0x8d,0x5a
+,0xaa,0xd9,0xaa,0x46,0x26,0x0f,0x71,0xed
+,0xa5,0xad,0x53,0x56,0x62,0x01,0x47,0x2a
+,0x44,0xe9,0xfe,0x3f,0x74,0x0b,0x13,0x9b
+,0xb9,0xf4,0x4d,0x1b,0xb2,0xd1,0x5f,0xb2
+,0xb6,0xd2,0x88,0x5c,0xb3,0x9f,0xcd,0xcb
+,0xd4,0xa7,0xd9,0x60,0x95,0x84,0x3a,0xf8
+,0xc1,0x37,0x1d,0x61,0xca,0xe7,0xb0,0xc5
+,0xe5,0x91,0xda,0x54,0xa6,0xac,0x31,0x81
+,0xae,0x97,0xde,0xcd,0x08,0xac,0xb8,0xc0
+,0x97,0x80,0x7f,0x6e,0x72,0xa4,0xe7,0x69
+,0x13,0x95,0x65,0x1f,0xc4,0x93,0x3c,0xfd
+,0x79,0x8f,0x04,0xd4,0x3e,0x4f,0xea,0xf7
+,0x9e,0xce,0xcd,0x67,0x7c,0x4f,0x65,0x02
+,0xff,0x91,0x85,0x54,0x73,0xc7,0xff,0x36
+,0xf7,0x86,0x2d,0xec,0xd0,0x5e,0x4f,0xff
+,0x11,0x9f,0x72,0x06,0xd6,0xb8,0x1a,0xf1
+,0x4c,0x0d,0x26,0x65,0xe2,0x44,0x80,0x1e
+,0xc7,0x9f,0xe3,0xdd,0xe8,0x0a,0xda,0xec
+,0xa5,0x20,0x80,0x69,0x68,0xa1,0x4f,0x7e
+,0xe1,0x6b,0xcf,0x07,0x41,0xfa,0x83,0x8e
+,0xbc,0x38,0xdd,0xb0,0x2e,0x11,0xb1,0x6b
+,0xb2,0x42,0xcc,0x9a,0xbc,0xf9,0x48,0x22
+,0x79,0x4a,0x19,0x0f,0xb2,0x1c,0x3e,0x20
+,0x74,0xd9,0x6a,0xc3,0xbe,0xf2,0x28,0x78
+,0x13,0x56,0x79,0x4f,0x6d,0x50,0xea,0x1b
+,0xb0,0xb5,0x57,0xb1,0x37,0x66,0x58,0x23
+,0xf3,0xdc,0x0f,0xdf,0x0a,0x87,0xc4,0xef
+,0x86,0x05,0xd5,0x38,0x14,0x60,0x99,0xa3
+,0x4b,0xde,0x06,0x96,0x71,0x2c,0xf2,0xdb
+,0xb6,0x1f,0xa4,0xef,0x3f,0xee};
+const unsigned int NptTlsTrustAnchor_Base_0025_Size = 1054;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0026.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0026.cpp
new file mode 100644
index 0000000..a979546
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0026.cpp
@@ -0,0 +1,168 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 2 Public Primary Certification Authority - G3 */
+const unsigned char NptTlsTrustAnchor_Base_0026_Data[1053] = {
+0x30,0x82,0x04,0x19,0x30,0x82,0x03,0x01
+,0x02,0x10,0x61,0x70,0xcb,0x49,0x8c,0x5f
+,0x98,0x45,0x29,0xe7,0xb0,0xa6,0xd9,0x50
+,0x5b,0x7a,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x30,0x81,0xca,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x1f,0x30,0x1d,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x16,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x20,0x54,0x72
+,0x75,0x73,0x74,0x20,0x4e,0x65,0x74,0x77
+,0x6f,0x72,0x6b,0x31,0x3a,0x30,0x38,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x31,0x28,0x63
+,0x29,0x20,0x31,0x39,0x39,0x39,0x20,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x2c
+,0x20,0x49,0x6e,0x63,0x2e,0x20,0x2d,0x20
+,0x46,0x6f,0x72,0x20,0x61,0x75,0x74,0x68
+,0x6f,0x72,0x69,0x7a,0x65,0x64,0x20,0x75
+,0x73,0x65,0x20,0x6f,0x6e,0x6c,0x79,0x31
+,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03
+,0x13,0x3c,0x56,0x65,0x72,0x69,0x53,0x69
+,0x67,0x6e,0x20,0x43,0x6c,0x61,0x73,0x73
+,0x20,0x32,0x20,0x50,0x75,0x62,0x6c,0x69
+,0x63,0x20,0x50,0x72,0x69,0x6d,0x61,0x72
+,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x20,0x2d,0x20,0x47,0x33,0x30,0x1e
+,0x17,0x0d,0x39,0x39,0x31,0x30,0x30,0x31
+,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x17
+,0x0d,0x33,0x36,0x30,0x37,0x31,0x36,0x32
+,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x81
+,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17
+,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31
+,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69
+,0x67,0x6e,0x20,0x54,0x72,0x75,0x73,0x74
+,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b
+,0x31,0x3a,0x30,0x38,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x31,0x28,0x63,0x29,0x20,0x31
+,0x39,0x39,0x39,0x20,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f,0x72
+,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x7a,0x65,0x64,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x6e,0x6c,0x79,0x31,0x45,0x30,0x43
+,0x06,0x03,0x55,0x04,0x03,0x13,0x3c,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20
+,0x43,0x6c,0x61,0x73,0x73,0x20,0x32,0x20
+,0x50,0x75,0x62,0x6c,0x69,0x63,0x20,0x50
+,0x72,0x69,0x6d,0x61,0x72,0x79,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x20,0x2d
+,0x20,0x47,0x33,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xaf,0x0a,0x0d,0xc2
+,0xd5,0x2c,0xdb,0x67,0xb9,0x2d,0xe5,0x94
+,0x27,0xdd,0xa5,0xbe,0xe0,0xb0,0x4d,0x8f
+,0xb3,0x61,0x56,0x3c,0xd6,0x7c,0xc3,0xf4
+,0xcd,0x3e,0x86,0xcb,0xa2,0x88,0xe2,0xe1
+,0xd8,0xa4,0x69,0xc5,0xb5,0xe2,0xbf,0xc1
+,0xa6,0x47,0x50,0x5e,0x46,0x39,0x8b,0xd5
+,0x96,0xba,0xb5,0x6f,0x14,0xbf,0x10,0xce
+,0x27,0x13,0x9e,0x05,0x47,0x9b,0x31,0x7a
+,0x13,0xd8,0x1f,0xd9,0xd3,0x02,0x37,0x8b
+,0xad,0x2c,0x47,0xf0,0x8e,0x81,0x06,0xa7
+,0x0d,0x30,0x0c,0xeb,0xf7,0x3c,0x0f,0x20
+,0x1d,0xdc,0x72,0x46,0xee,0xa5,0x02,0xc8
+,0x5b,0xc3,0xc9,0x56,0x69,0x4c,0xc5,0x18
+,0xc1,0x91,0x7b,0x0b,0xd5,0x13,0x00,0x9b
+,0xbc,0xef,0xc3,0x48,0x3e,0x46,0x60,0x20
+,0x85,0x2a,0xd5,0x90,0xb6,0xcd,0x8b,0xa0
+,0xcc,0x32,0xdd,0xb7,0xfd,0x40,0x55,0xb2
+,0x50,0x1c,0x56,0xae,0xcc,0x8d,0x77,0x4d
+,0xc7,0x20,0x4d,0xa7,0x31,0x76,0xef,0x68
+,0x92,0x8a,0x90,0x1e,0x08,0x81,0x56,0xb2
+,0xad,0x69,0xa3,0x52,0xd0,0xcb,0x1c,0xc4
+,0x23,0x3d,0x1f,0x99,0xfe,0x4c,0xe8,0x16
+,0x63,0x8e,0xc6,0x08,0x8e,0xf6,0x31,0xf6
+,0xd2,0xfa,0xe5,0x76,0xdd,0xb5,0x1c,0x92
+,0xa3,0x49,0xcd,0xcd,0x01,0xcd,0x68,0xcd
+,0xa9,0x69,0xba,0xa3,0xeb,0x1d,0x0d,0x9c
+,0xa4,0x20,0xa6,0xc1,0xa0,0xc5,0xd1,0x46
+,0x4c,0x17,0x6d,0xd2,0xac,0x66,0x3f,0x96
+,0x8c,0xe0,0x84,0xd4,0x36,0xff,0x22,0x59
+,0xc5,0xf9,0x11,0x60,0xa8,0x5f,0x04,0x7d
+,0xf2,0x1a,0xf6,0x25,0x42,0x61,0x0f,0xc4
+,0x4a,0xb8,0x3e,0x89,0x02,0x03,0x01,0x00
+,0x01,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0x34,0x26,0x15
+,0x3c,0xc0,0x8d,0x4d,0x43,0x49,0x1d,0xbd
+,0xe9,0x21,0x92,0xd7,0x66,0x9c,0xb7,0xde
+,0xc5,0xb8,0xd0,0xe4,0x5d,0x5f,0x76,0x22
+,0xc0,0x26,0xf9,0x84,0x3a,0x3a,0xf9,0x8c
+,0xb5,0xfb,0xec,0x60,0xf1,0xe8,0xce,0x04
+,0xb0,0xc8,0xdd,0xa7,0x03,0x8f,0x30,0xf3
+,0x98,0xdf,0xa4,0xe6,0xa4,0x31,0xdf,0xd3
+,0x1c,0x0b,0x46,0xdc,0x72,0x20,0x3f,0xae
+,0xee,0x05,0x3c,0xa4,0x33,0x3f,0x0b,0x39
+,0xac,0x70,0x78,0x73,0x4b,0x99,0x2b,0xdf
+,0x30,0xc2,0x54,0xb0,0xa8,0x3b,0x55,0xa1
+,0xfe,0x16,0x28,0xcd,0x42,0xbd,0x74,0x6e
+,0x80,0xdb,0x27,0x44,0xa7,0xce,0x44,0x5d
+,0xd4,0x1b,0x90,0x98,0x0d,0x1e,0x42,0x94
+,0xb1,0x00,0x2c,0x04,0xd0,0x74,0xa3,0x02
+,0x05,0x22,0x63,0x63,0xcd,0x83,0xb5,0xfb
+,0xc1,0x6d,0x62,0x6b,0x69,0x75,0xfd,0x5d
+,0x70,0x41,0xb9,0xf5,0xbf,0x7c,0xdf,0xbe
+,0xc1,0x32,0x73,0x22,0x21,0x8b,0x58,0x81
+,0x7b,0x15,0x91,0x7a,0xba,0xe3,0x64,0x48
+,0xb0,0x7f,0xfb,0x36,0x25,0xda,0x95,0xd0
+,0xf1,0x24,0x14,0x17,0xdd,0x18,0x80,0x6b
+,0x46,0x23,0x39,0x54,0xf5,0x8e,0x62,0x09
+,0x04,0x1d,0x94,0x90,0xa6,0x9b,0xe6,0x25
+,0xe2,0x42,0x45,0xaa,0xb8,0x90,0xad,0xbe
+,0x08,0x8f,0xa9,0x0b,0x42,0x18,0x94,0xcf
+,0x72,0x39,0xe1,0xb1,0x43,0xe0,0x28,0xcf
+,0xb7,0xe7,0x5a,0x6c,0x13,0x6b,0x49,0xb3
+,0xff,0xe3,0x18,0x7c,0x89,0x8b,0x33,0x5d
+,0xac,0x33,0xd7,0xa7,0xf9,0xda,0x3a,0x55
+,0xc9,0x58,0x10,0xf9,0xaa,0xef,0x5a,0xb6
+,0xcf,0x4b,0x4b,0xdf,0x2a};
+const unsigned int NptTlsTrustAnchor_Base_0026_Size = 1053;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0027.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0027.cpp
new file mode 100644
index 0000000..5f510fd
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0027.cpp
@@ -0,0 +1,168 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 3 Public Primary Certification Authority - G3 */
+const unsigned char NptTlsTrustAnchor_Base_0027_Data[1054] = {
+0x30,0x82,0x04,0x1a,0x30,0x82,0x03,0x02
+,0x02,0x11,0x00,0x9b,0x7e,0x06,0x49,0xa3
+,0x3e,0x62,0xb9,0xd5,0xee,0x90,0x48,0x71
+,0x29,0xef,0x57,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xca,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x31,0x1f,0x30,0x1d,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x16,0x56,0x65
+,0x72,0x69,0x53,0x69,0x67,0x6e,0x20,0x54
+,0x72,0x75,0x73,0x74,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x31,0x28
+,0x63,0x29,0x20,0x31,0x39,0x39,0x39,0x20
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20,0x2d
+,0x20,0x46,0x6f,0x72,0x20,0x61,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64,0x20
+,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c,0x79
+,0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04
+,0x03,0x13,0x3c,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x20,0x43,0x6c,0x61,0x73
+,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6c
+,0x69,0x63,0x20,0x50,0x72,0x69,0x6d,0x61
+,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x20,0x2d,0x20,0x47,0x33,0x30
+,0x1e,0x17,0x0d,0x39,0x39,0x31,0x30,0x30
+,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a
+,0x17,0x0d,0x33,0x36,0x30,0x37,0x31,0x36
+,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30
+,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0e,0x56,0x65,0x72,0x69,0x53,0x69
+,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e
+,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x16,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x20,0x54,0x72,0x75,0x73
+,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x31,0x3a,0x30,0x38,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x31,0x28,0x63,0x29,0x20
+,0x31,0x39,0x39,0x39,0x20,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f
+,0x72,0x20,0x61,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x7a,0x65,0x64,0x20,0x75,0x73,0x65
+,0x20,0x6f,0x6e,0x6c,0x79,0x31,0x45,0x30
+,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3c
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x20,0x43,0x6c,0x61,0x73,0x73,0x20,0x33
+,0x20,0x50,0x75,0x62,0x6c,0x69,0x63,0x20
+,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x2d,0x20,0x47,0x33,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xcb,0xba,0x9c
+,0x52,0xfc,0x78,0x1f,0x1a,0x1e,0x6f,0x1b
+,0x37,0x73,0xbd,0xf8,0xc9,0x6b,0x94,0x12
+,0x30,0x4f,0xf0,0x36,0x47,0xf5,0xd0,0x91
+,0x0a,0xf5,0x17,0xc8,0xa5,0x61,0xc1,0x16
+,0x40,0x4d,0xfb,0x8a,0x61,0x90,0xe5,0x76
+,0x20,0xc1,0x11,0x06,0x7d,0xab,0x2c,0x6e
+,0xa6,0xf5,0x11,0x41,0x8e,0xfa,0x2d,0xad
+,0x2a,0x61,0x59,0xa4,0x67,0x26,0x4c,0xd0
+,0xe8,0xbc,0x52,0x5b,0x70,0x20,0x04,0x58
+,0xd1,0x7a,0xc9,0xa4,0x69,0xbc,0x83,0x17
+,0x64,0xad,0x05,0x8b,0xbc,0xd0,0x58,0xce
+,0x8d,0x8c,0xf5,0xeb,0xf0,0x42,0x49,0x0b
+,0x9d,0x97,0x27,0x67,0x32,0x6e,0xe1,0xae
+,0x93,0x15,0x1c,0x70,0xbc,0x20,0x4d,0x2f
+,0x18,0xde,0x92,0x88,0xe8,0x6c,0x85,0x57
+,0x11,0x1a,0xe9,0x7e,0xe3,0x26,0x11,0x54
+,0xa2,0x45,0x96,0x55,0x83,0xca,0x30,0x89
+,0xe8,0xdc,0xd8,0xa3,0xed,0x2a,0x80,0x3f
+,0x7f,0x79,0x65,0x57,0x3e,0x15,0x20,0x66
+,0x08,0x2f,0x95,0x93,0xbf,0xaa,0x47,0x2f
+,0xa8,0x46,0x97,0xf0,0x12,0xe2,0xfe,0xc2
+,0x0a,0x2b,0x51,0xe6,0x76,0xe6,0xb7,0x46
+,0xb7,0xe2,0x0d,0xa6,0xcc,0xa8,0xc3,0x4c
+,0x59,0x55,0x89,0xe6,0xe8,0x53,0x5c,0x1c
+,0xea,0x9d,0xf0,0x62,0x16,0x0b,0xa7,0xc9
+,0x5f,0x0c,0xf0,0xde,0xc2,0x76,0xce,0xaf
+,0xf7,0x6a,0xf2,0xfa,0x41,0xa6,0xa2,0x33
+,0x14,0xc9,0xe5,0x7a,0x63,0xd3,0x9e,0x62
+,0x37,0xd5,0x85,0x65,0x9e,0x0e,0xe6,0x53
+,0x24,0x74,0x1b,0x5e,0x1d,0x12,0x53,0x5b
+,0xc7,0x2c,0xe7,0x83,0x49,0x3b,0x15,0xae
+,0x8a,0x68,0xb9,0x57,0x97,0x02,0x03,0x01
+,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x11,0x14
+,0x96,0xc1,0xab,0x92,0x08,0xf7,0x3f,0x2f
+,0xc9,0xb2,0xfe,0xe4,0x5a,0x9f,0x64,0xde
+,0xdb,0x21,0x4f,0x86,0x99,0x34,0x76,0x36
+,0x57,0xdd,0xd0,0x15,0x2f,0xc5,0xad,0x7f
+,0x15,0x1f,0x37,0x62,0x73,0x3e,0xd4,0xe7
+,0x5f,0xce,0x17,0x03,0xdb,0x35,0xfa,0x2b
+,0xdb,0xae,0x60,0x09,0x5f,0x1e,0x5f,0x8f
+,0x6e,0xbb,0x0b,0x3d,0xea,0x5a,0x13,0x1e
+,0x0c,0x60,0x6f,0xb5,0xc0,0xb5,0x23,0x22
+,0x2e,0x07,0x0b,0xcb,0xa9,0x74,0xcb,0x47
+,0xbb,0x1d,0xc1,0xd7,0xa5,0x6b,0xcc,0x2f
+,0xd2,0x42,0xfd,0x49,0xdd,0xa7,0x89,0xcf
+,0x53,0xba,0xda,0x00,0x5a,0x28,0xbf,0x82
+,0xdf,0xf8,0xba,0x13,0x1d,0x50,0x86,0x82
+,0xfd,0x8e,0x30,0x8f,0x29,0x46,0xb0,0x1e
+,0x3d,0x35,0xda,0x38,0x62,0x16,0x18,0x4a
+,0xad,0xe6,0xb6,0x51,0x6c,0xde,0xaf,0x62
+,0xeb,0x01,0xd0,0x1e,0x24,0xfe,0x7a,0x8f
+,0x12,0x1a,0x12,0x68,0xb8,0xfb,0x66,0x99
+,0x14,0x14,0x45,0x5c,0xae,0xe7,0xae,0x69
+,0x17,0x81,0x2b,0x5a,0x37,0xc9,0x5e,0x2a
+,0xf4,0xc6,0xe2,0xa1,0x5c,0x54,0x9b,0xa6
+,0x54,0x00,0xcf,0xf0,0xf1,0xc1,0xc7,0x98
+,0x30,0x1a,0x3b,0x36,0x16,0xdb,0xa3,0x6e
+,0xea,0xfd,0xad,0xb2,0xc2,0xda,0xef,0x02
+,0x47,0x13,0x8a,0xc0,0xf1,0xb3,0x31,0xad
+,0x4f,0x1c,0xe1,0x4f,0x9c,0xaf,0x0f,0x0c
+,0x9d,0xf7,0x78,0x0d,0xd8,0xf4,0x35,0x56
+,0x80,0xda,0xb7,0x6d,0x17,0x8f,0x9d,0x1e
+,0x81,0x64,0xe1,0xfe,0xc5,0x45,0xba,0xad
+,0x6b,0xb9,0x0a,0x7a,0x4e,0x4f,0x4b,0x84
+,0xee,0x4b,0xf1,0x7d,0xdd,0x11};
+const unsigned int NptTlsTrustAnchor_Base_0027_Size = 1054;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0028.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0028.cpp
new file mode 100644
index 0000000..57ab0bb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0028.cpp
@@ -0,0 +1,168 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Class 4 Public Primary Certification Authority - G3 */
+const unsigned char NptTlsTrustAnchor_Base_0028_Data[1054] = {
+0x30,0x82,0x04,0x1a,0x30,0x82,0x03,0x02
+,0x02,0x11,0x00,0xec,0xa0,0xa7,0x8b,0x6e
+,0x75,0x6a,0x01,0xcf,0xc4,0x7c,0xcc,0x2f
+,0x94,0x5e,0xd7,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xca,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x31,0x1f,0x30,0x1d,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x16,0x56,0x65
+,0x72,0x69,0x53,0x69,0x67,0x6e,0x20,0x54
+,0x72,0x75,0x73,0x74,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x31,0x28
+,0x63,0x29,0x20,0x31,0x39,0x39,0x39,0x20
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20,0x2d
+,0x20,0x46,0x6f,0x72,0x20,0x61,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64,0x20
+,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c,0x79
+,0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04
+,0x03,0x13,0x3c,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x20,0x43,0x6c,0x61,0x73
+,0x73,0x20,0x34,0x20,0x50,0x75,0x62,0x6c
+,0x69,0x63,0x20,0x50,0x72,0x69,0x6d,0x61
+,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x20,0x2d,0x20,0x47,0x33,0x30
+,0x1e,0x17,0x0d,0x39,0x39,0x31,0x30,0x30
+,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a
+,0x17,0x0d,0x33,0x36,0x30,0x37,0x31,0x36
+,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30
+,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0e,0x56,0x65,0x72,0x69,0x53,0x69
+,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e
+,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x16,0x56,0x65,0x72,0x69,0x53
+,0x69,0x67,0x6e,0x20,0x54,0x72,0x75,0x73
+,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x31,0x3a,0x30,0x38,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x31,0x28,0x63,0x29,0x20
+,0x31,0x39,0x39,0x39,0x20,0x56,0x65,0x72
+,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f
+,0x72,0x20,0x61,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x7a,0x65,0x64,0x20,0x75,0x73,0x65
+,0x20,0x6f,0x6e,0x6c,0x79,0x31,0x45,0x30
+,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3c
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x20,0x43,0x6c,0x61,0x73,0x73,0x20,0x34
+,0x20,0x50,0x75,0x62,0x6c,0x69,0x63,0x20
+,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x2d,0x20,0x47,0x33,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xad,0xcb,0xa5
+,0x11,0x69,0xc6,0x59,0xab,0xf1,0x8f,0xb5
+,0x19,0x0f,0x56,0xce,0xcc,0xb5,0x1f,0x20
+,0xe4,0x9e,0x26,0x25,0x4b,0xe0,0x73,0x65
+,0x89,0x59,0xde,0xd0,0x83,0xe4,0xf5,0x0f
+,0xb5,0xbb,0xad,0xf1,0x7c,0xe8,0x21,0xfc
+,0xe4,0xe8,0x0c,0xee,0x7c,0x45,0x22,0x19
+,0x76,0x92,0xb4,0x13,0xb7,0x20,0x5b,0x09
+,0xfa,0x61,0xae,0xa8,0xf2,0xa5,0x8d,0x85
+,0xc2,0x2a,0xd6,0xde,0x66,0x36,0xd2,0x9b
+,0x02,0xf4,0xa8,0x92,0x60,0x7c,0x9c,0x69
+,0xb4,0x8f,0x24,0x1e,0xd0,0x86,0x52,0xf6
+,0x32,0x9c,0x41,0x58,0x1e,0x22,0xbd,0xcd
+,0x45,0x62,0x95,0x08,0x6e,0xd0,0x66,0xdd
+,0x53,0xa2,0xcc,0xf0,0x10,0xdc,0x54,0x73
+,0x8b,0x04,0xa1,0x46,0x33,0x33,0x5c,0x17
+,0x40,0xb9,0x9e,0x4d,0xd3,0xf3,0xbe,0x55
+,0x83,0xe8,0xb1,0x89,0x8e,0x5a,0x7c,0x9a
+,0x96,0x22,0x90,0x3b,0x88,0x25,0xf2,0xd2
+,0x53,0x88,0x02,0x0c,0x0b,0x78,0xf2,0xe6
+,0x37,0x17,0x4b,0x30,0x46,0x07,0xe4,0x80
+,0x6d,0xa6,0xd8,0x96,0x2e,0xe8,0x2c,0xf8
+,0x11,0xb3,0x38,0x0d,0x66,0xa6,0x9b,0xea
+,0xc9,0x23,0x5b,0xdb,0x8e,0xe2,0xf3,0x13
+,0x8e,0x1a,0x59,0x2d,0xaa,0x02,0xf0,0xec
+,0xa4,0x87,0x66,0xdc,0xc1,0x3f,0xf5,0xd8
+,0xb9,0xf4,0xec,0x82,0xc6,0xd2,0x3d,0x95
+,0x1d,0xe5,0xc0,0x4f,0x84,0xc9,0xd9,0xa3
+,0x44,0x28,0x06,0x6a,0xd7,0x45,0xac,0xf0
+,0x6b,0x6a,0xef,0x4e,0x5f,0xf8,0x11,0x82
+,0x1e,0x38,0x63,0x34,0x66,0x50,0xd4,0x3e
+,0x93,0x73,0xfa,0x30,0xc3,0x66,0xad,0xff
+,0x93,0x2d,0x97,0xef,0x03,0x02,0x03,0x01
+,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x8f,0xfa
+,0x25,0x6b,0x4f,0x5b,0xe4,0xa4,0x4e,0x27
+,0x55,0xab,0x22,0x15,0x59,0x3c,0xca,0xb5
+,0x0a,0xd4,0x4a,0xdb,0xab,0xdd,0xa1,0x5f
+,0x53,0xc5,0xa0,0x57,0x39,0xc2,0xce,0x47
+,0x2b,0xbe,0x3a,0xc8,0x56,0xbf,0xc2,0xd9
+,0x27,0x10,0x3a,0xb1,0x05,0x3c,0xc0,0x77
+,0x31,0xbb,0x3a,0xd3,0x05,0x7b,0x6d,0x9a
+,0x1c,0x30,0x8c,0x80,0xcb,0x93,0x93,0x2a
+,0x83,0xab,0x05,0x51,0x82,0x02,0x00,0x11
+,0x67,0x6b,0xf3,0x88,0x61,0x47,0x5f,0x03
+,0x93,0xd5,0x5b,0x0d,0xe0,0xf1,0xd4,0xa1
+,0x32,0x35,0x85,0xb2,0x3a,0xdb,0xb0,0x82
+,0xab,0xd1,0xcb,0x0a,0xbc,0x4f,0x8c,0x5b
+,0xc5,0x4b,0x00,0x3b,0x1f,0x2a,0x82,0xa6
+,0x7e,0x36,0x85,0xdc,0x7e,0x3c,0x67,0x00
+,0xb5,0xe4,0x3b,0x52,0xe0,0xa8,0xeb,0x5d
+,0x15,0xf9,0xc6,0x6d,0xf0,0xad,0x1d,0x0e
+,0x85,0xb7,0xa9,0x9a,0x73,0x14,0x5a,0x5b
+,0x8f,0x41,0x28,0xc0,0xd5,0xe8,0x2d,0x4d
+,0xa4,0x5e,0xcd,0xaa,0xd9,0xed,0xce,0xdc
+,0xd8,0xd5,0x3c,0x42,0x1d,0x17,0xc1,0x12
+,0x5d,0x45,0x38,0xc3,0x38,0xf3,0xfc,0x85
+,0x2e,0x83,0x46,0x48,0xb2,0xd7,0x20,0x5f
+,0x92,0x36,0x8f,0xe7,0x79,0x0f,0x98,0x5e
+,0x99,0xe8,0xf0,0xd0,0xa4,0xbb,0xf5,0x53
+,0xbd,0x2a,0xce,0x59,0xb0,0xaf,0x6e,0x7f
+,0x6c,0xbb,0xd2,0x1e,0x00,0xb0,0x21,0xed
+,0xf8,0x41,0x62,0x82,0xb9,0xd8,0xb2,0xc4
+,0xbb,0x46,0x50,0xf3,0x31,0xc5,0x8f,0x01
+,0xa8,0x74,0xeb,0xf5,0x78,0x27,0xda,0xe7
+,0xf7,0x66,0x43,0xf3,0x9e,0x83,0x3e,0x20
+,0xaa,0xc3,0x35,0x60,0x91,0xce};
+const unsigned int NptTlsTrustAnchor_Base_0028_Size = 1054;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0029.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0029.cpp
new file mode 100644
index 0000000..7c74232
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0029.cpp
@@ -0,0 +1,192 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Entrust.net Secure Server CA */
+const unsigned char NptTlsTrustAnchor_Base_0029_Data[1244] = {
+0x30,0x82,0x04,0xd8,0x30,0x82,0x04,0x41
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x37
+,0x4a,0xd2,0x43,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xc3,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0b,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x31,0x3b,0x30,0x39,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x32,0x77,0x77,0x77,0x2e,0x65
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x2f,0x43,0x50,0x53,0x20,0x69
+,0x6e,0x63,0x6f,0x72,0x70,0x2e,0x20,0x62
+,0x79,0x20,0x72,0x65,0x66,0x2e,0x20,0x28
+,0x6c,0x69,0x6d,0x69,0x74,0x73,0x20,0x6c
+,0x69,0x61,0x62,0x2e,0x29,0x31,0x25,0x30
+,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c
+,0x28,0x63,0x29,0x20,0x31,0x39,0x39,0x39
+,0x20,0x45,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x20,0x4c,0x69,0x6d
+,0x69,0x74,0x65,0x64,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x03,0x13,0x31,0x45
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x20,0x53,0x65,0x63,0x75,0x72
+,0x65,0x20,0x53,0x65,0x72,0x76,0x65,0x72
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79
+,0x30,0x1e,0x17,0x0d,0x39,0x39,0x30,0x35
+,0x32,0x35,0x31,0x36,0x30,0x39,0x34,0x30
+,0x5a,0x17,0x0d,0x31,0x39,0x30,0x35,0x32
+,0x35,0x31,0x36,0x33,0x39,0x34,0x30,0x5a
+,0x30,0x81,0xc3,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53
+,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x0b,0x45,0x6e,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x6e,0x65,0x74,0x31,0x3b
+,0x30,0x39,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x32,0x77,0x77,0x77,0x2e,0x65,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x2f,0x43,0x50,0x53,0x20,0x69,0x6e,0x63
+,0x6f,0x72,0x70,0x2e,0x20,0x62,0x79,0x20
+,0x72,0x65,0x66,0x2e,0x20,0x28,0x6c,0x69
+,0x6d,0x69,0x74,0x73,0x20,0x6c,0x69,0x61
+,0x62,0x2e,0x29,0x31,0x25,0x30,0x23,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x1c,0x28,0x63
+,0x29,0x20,0x31,0x39,0x39,0x39,0x20,0x45
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x20,0x4c,0x69,0x6d,0x69,0x74
+,0x65,0x64,0x31,0x3a,0x30,0x38,0x06,0x03
+,0x55,0x04,0x03,0x13,0x31,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x20,0x53,0x65,0x63,0x75,0x72,0x65,0x20
+,0x53,0x65,0x72,0x76,0x65,0x72,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x81
+,0x9d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x81,0x8b,0x00,0x30,0x81,0x87,0x02
+,0x81,0x81,0x00,0xcd,0x28,0x83,0x34,0x54
+,0x1b,0x89,0xf3,0x0f,0xaf,0x37,0x91,0x31
+,0xff,0xaf,0x31,0x60,0xc9,0xa8,0xe8,0xb2
+,0x10,0x68,0xed,0x9f,0xe7,0x93,0x36,0xf1
+,0x0a,0x64,0xbb,0x47,0xf5,0x04,0x17,0x3f
+,0x23,0x47,0x4d,0xc5,0x27,0x19,0x81,0x26
+,0x0c,0x54,0x72,0x0d,0x88,0x2d,0xd9,0x1f
+,0x9a,0x12,0x9f,0xbc,0xb3,0x71,0xd3,0x80
+,0x19,0x3f,0x47,0x66,0x7b,0x8c,0x35,0x28
+,0xd2,0xb9,0x0a,0xdf,0x24,0xda,0x9c,0xd6
+,0x50,0x79,0x81,0x7a,0x5a,0xd3,0x37,0xf7
+,0xc2,0x4a,0xd8,0x29,0x92,0x26,0x64,0xd1
+,0xe4,0x98,0x6c,0x3a,0x00,0x8a,0xf5,0x34
+,0x9b,0x65,0xf8,0xed,0xe3,0x10,0xff,0xfd
+,0xb8,0x49,0x58,0xdc,0xa0,0xde,0x82,0x39
+,0x6b,0x81,0xb1,0x16,0x19,0x61,0xb9,0x54
+,0xb6,0xe6,0x43,0x02,0x01,0x03,0xa3,0x82
+,0x01,0xd7,0x30,0x82,0x01,0xd3,0x30,0x11
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x00
+,0x07,0x30,0x82,0x01,0x19,0x06,0x03,0x55
+,0x1d,0x1f,0x04,0x82,0x01,0x10,0x30,0x82
+,0x01,0x0c,0x30,0x81,0xde,0xa0,0x81,0xdb
+,0xa0,0x81,0xd8,0xa4,0x81,0xd5,0x30,0x81
+,0xd2,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x14
+,0x30,0x12,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0b,0x45,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x31,0x3b,0x30,0x39
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x32,0x77
+,0x77,0x77,0x2e,0x65,0x6e,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x6e,0x65,0x74,0x2f,0x43
+,0x50,0x53,0x20,0x69,0x6e,0x63,0x6f,0x72
+,0x70,0x2e,0x20,0x62,0x79,0x20,0x72,0x65
+,0x66,0x2e,0x20,0x28,0x6c,0x69,0x6d,0x69
+,0x74,0x73,0x20,0x6c,0x69,0x61,0x62,0x2e
+,0x29,0x31,0x25,0x30,0x23,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x1c,0x28,0x63,0x29,0x20
+,0x31,0x39,0x39,0x39,0x20,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65,0x64
+,0x31,0x3a,0x30,0x38,0x06,0x03,0x55,0x04
+,0x03,0x13,0x31,0x45,0x6e,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x6e,0x65,0x74,0x20,0x53
+,0x65,0x63,0x75,0x72,0x65,0x20,0x53,0x65
+,0x72,0x76,0x65,0x72,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x31,0x0d,0x30,0x0b
+,0x06,0x03,0x55,0x04,0x03,0x13,0x04,0x43
+,0x52,0x4c,0x31,0x30,0x29,0xa0,0x27,0xa0
+,0x25,0x86,0x23,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x65,0x6e
+,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65
+,0x74,0x2f,0x43,0x52,0x4c,0x2f,0x6e,0x65
+,0x74,0x31,0x2e,0x63,0x72,0x6c,0x30,0x2b
+,0x06,0x03,0x55,0x1d,0x10,0x04,0x24,0x30
+,0x22,0x80,0x0f,0x31,0x39,0x39,0x39,0x30
+,0x35,0x32,0x35,0x31,0x36,0x30,0x39,0x34
+,0x30,0x5a,0x81,0x0f,0x32,0x30,0x31,0x39
+,0x30,0x35,0x32,0x35,0x31,0x36,0x30,0x39
+,0x34,0x30,0x5a,0x30,0x0b,0x06,0x03,0x55
+,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04
+,0x18,0x30,0x16,0x80,0x14,0xf0,0x17,0x62
+,0x13,0x55,0x3d,0xb3,0xff,0x0a,0x00,0x6b
+,0xfb,0x50,0x84,0x97,0xf3,0xed,0x62,0xd0
+,0x1a,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0xf0,0x17,0x62,0x13
+,0x55,0x3d,0xb3,0xff,0x0a,0x00,0x6b,0xfb
+,0x50,0x84,0x97,0xf3,0xed,0x62,0xd0,0x1a
+,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x19
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf6,0x7d
+,0x07,0x41,0x00,0x04,0x0c,0x30,0x0a,0x1b
+,0x04,0x56,0x34,0x2e,0x30,0x03,0x02,0x04
+,0x90,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x81,0x81,0x00,0x90,0xdc,0x30,0x02
+,0xfa,0x64,0x74,0xc2,0xa7,0x0a,0xa5,0x7c
+,0x21,0x8d,0x34,0x17,0xa8,0xfb,0x47,0x0e
+,0xff,0x25,0x7c,0x8d,0x13,0x0a,0xfb,0xe4
+,0x98,0xb5,0xef,0x8c,0xf8,0xc5,0x10,0x0d
+,0xf7,0x92,0xbe,0xf1,0xc3,0xd5,0xd5,0x95
+,0x6a,0x04,0xbb,0x2c,0xce,0x26,0x36,0x65
+,0xc8,0x31,0xc6,0xe7,0xee,0x3f,0xe3,0x57
+,0x75,0x84,0x7a,0x11,0xef,0x46,0x4f,0x18
+,0xf4,0xd3,0x98,0xbb,0xa8,0x87,0x32,0xba
+,0x72,0xf6,0x3c,0xe2,0x3d,0x9f,0xd7,0x1d
+,0xd9,0xc3,0x60,0x43,0x8c,0x58,0x0e,0x22
+,0x96,0x2f,0x62,0xa3,0x2c,0x1f,0xba,0xad
+,0x05,0xef,0xab,0x32,0x78,0x87,0xa0,0x54
+,0x73,0x19,0xb5,0x5c,0x05,0xf9,0x52,0x3e
+,0x6d,0x2d,0x45,0x0b,0xf7,0x0a,0x93,0xea
+,0xed,0x06,0xf9,0xb2};
+const unsigned int NptTlsTrustAnchor_Base_0029_Size = 1244;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0030.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0030.cpp
new file mode 100644
index 0000000..739ea9a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0030.cpp
@@ -0,0 +1,195 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Entrust.net Secure Personal CA */
+const unsigned char NptTlsTrustAnchor_Base_0030_Data[1265] = {
+0x30,0x82,0x04,0xed,0x30,0x82,0x04,0x56
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x38
+,0x03,0x91,0xee,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04
+,0x05,0x00,0x30,0x81,0xc9,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0b,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x31,0x48,0x30,0x46,0x06,0x03,0x55,0x04
+,0x0b,0x14,0x3f,0x77,0x77,0x77,0x2e,0x65
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x2f,0x43,0x6c,0x69,0x65,0x6e
+,0x74,0x5f,0x43,0x41,0x5f,0x49,0x6e,0x66
+,0x6f,0x2f,0x43,0x50,0x53,0x20,0x69,0x6e
+,0x63,0x6f,0x72,0x70,0x2e,0x20,0x62,0x79
+,0x20,0x72,0x65,0x66,0x2e,0x20,0x6c,0x69
+,0x6d,0x69,0x74,0x73,0x20,0x6c,0x69,0x61
+,0x62,0x2e,0x31,0x25,0x30,0x23,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x1c,0x28,0x63,0x29
+,0x20,0x31,0x39,0x39,0x39,0x20,0x45,0x6e
+,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65
+,0x74,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x33,0x30,0x31,0x06,0x03,0x55
+,0x04,0x03,0x13,0x2a,0x45,0x6e,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74,0x20
+,0x43,0x6c,0x69,0x65,0x6e,0x74,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x1e
+,0x17,0x0d,0x39,0x39,0x31,0x30,0x31,0x32
+,0x31,0x39,0x32,0x34,0x33,0x30,0x5a,0x17
+,0x0d,0x31,0x39,0x31,0x30,0x31,0x32,0x31
+,0x39,0x35,0x34,0x33,0x30,0x5a,0x30,0x81
+,0xc9,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x14
+,0x30,0x12,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0b,0x45,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x31,0x48,0x30,0x46
+,0x06,0x03,0x55,0x04,0x0b,0x14,0x3f,0x77
+,0x77,0x77,0x2e,0x65,0x6e,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x6e,0x65,0x74,0x2f,0x43
+,0x6c,0x69,0x65,0x6e,0x74,0x5f,0x43,0x41
+,0x5f,0x49,0x6e,0x66,0x6f,0x2f,0x43,0x50
+,0x53,0x20,0x69,0x6e,0x63,0x6f,0x72,0x70
+,0x2e,0x20,0x62,0x79,0x20,0x72,0x65,0x66
+,0x2e,0x20,0x6c,0x69,0x6d,0x69,0x74,0x73
+,0x20,0x6c,0x69,0x61,0x62,0x2e,0x31,0x25
+,0x30,0x23,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x1c,0x28,0x63,0x29,0x20,0x31,0x39,0x39
+,0x39,0x20,0x45,0x6e,0x74,0x72,0x75,0x73
+,0x74,0x2e,0x6e,0x65,0x74,0x20,0x4c,0x69
+,0x6d,0x69,0x74,0x65,0x64,0x31,0x33,0x30
+,0x31,0x06,0x03,0x55,0x04,0x03,0x13,0x2a
+,0x45,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e
+,0x6e,0x65,0x74,0x20,0x43,0x6c,0x69,0x65
+,0x6e,0x74,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x30,0x81,0x9d,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x81,0x8b,0x00
+,0x30,0x81,0x87,0x02,0x81,0x81,0x00,0xc8
+,0x3a,0x99,0x5e,0x31,0x17,0xdf,0xac,0x27
+,0x6f,0x90,0x7b,0xe4,0x19,0xff,0x45,0xa3
+,0x34,0xc2,0xdb,0xc1,0xa8,0x4f,0xf0,0x68
+,0xea,0x84,0xfd,0x9f,0x75,0x79,0xcf,0xc1
+,0x8a,0x51,0x94,0xaf,0xc7,0x57,0x03,0x47
+,0x64,0x9e,0xad,0x82,0x1b,0x5a,0xda,0x7f
+,0x37,0x78,0x47,0xbb,0x37,0x98,0x12,0x96
+,0xce,0xc6,0x13,0x7d,0xef,0xd2,0x0c,0x30
+,0x51,0xa9,0x39,0x9e,0x55,0xf8,0xfb,0xb1
+,0xe7,0x30,0xde,0x83,0xb2,0xba,0x3e,0xf1
+,0xd5,0x89,0x3b,0x3b,0x85,0xba,0xaa,0x74
+,0x2c,0xfe,0x3f,0x31,0x6e,0xaf,0x91,0x95
+,0x6e,0x06,0xd4,0x07,0x4d,0x4b,0x2c,0x56
+,0x47,0x18,0x04,0x52,0xda,0x0e,0x10,0x93
+,0xbf,0x63,0x90,0x9b,0xe1,0xdf,0x8c,0xe6
+,0x02,0xa4,0xe6,0x4f,0x5e,0xf7,0x8b,0x02
+,0x01,0x03,0xa3,0x82,0x01,0xe0,0x30,0x82
+,0x01,0xdc,0x30,0x11,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x01,0x04
+,0x04,0x03,0x02,0x00,0x07,0x30,0x82,0x01
+,0x22,0x06,0x03,0x55,0x1d,0x1f,0x04,0x82
+,0x01,0x19,0x30,0x82,0x01,0x15,0x30,0x81
+,0xe4,0xa0,0x81,0xe1,0xa0,0x81,0xde,0xa4
+,0x81,0xdb,0x30,0x81,0xd8,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0b,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x31,0x48,0x30,0x46,0x06,0x03,0x55,0x04
+,0x0b,0x14,0x3f,0x77,0x77,0x77,0x2e,0x65
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x2f,0x43,0x6c,0x69,0x65,0x6e
+,0x74,0x5f,0x43,0x41,0x5f,0x49,0x6e,0x66
+,0x6f,0x2f,0x43,0x50,0x53,0x20,0x69,0x6e
+,0x63,0x6f,0x72,0x70,0x2e,0x20,0x62,0x79
+,0x20,0x72,0x65,0x66,0x2e,0x20,0x6c,0x69
+,0x6d,0x69,0x74,0x73,0x20,0x6c,0x69,0x61
+,0x62,0x2e,0x31,0x25,0x30,0x23,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x1c,0x28,0x63,0x29
+,0x20,0x31,0x39,0x39,0x39,0x20,0x45,0x6e
+,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65
+,0x74,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x33,0x30,0x31,0x06,0x03,0x55
+,0x04,0x03,0x13,0x2a,0x45,0x6e,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74,0x20
+,0x43,0x6c,0x69,0x65,0x6e,0x74,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x0d
+,0x30,0x0b,0x06,0x03,0x55,0x04,0x03,0x13
+,0x04,0x43,0x52,0x4c,0x31,0x30,0x2c,0xa0
+,0x2a,0xa0,0x28,0x86,0x26,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x65,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e
+,0x6e,0x65,0x74,0x2f,0x43,0x52,0x4c,0x2f
+,0x43,0x6c,0x69,0x65,0x6e,0x74,0x31,0x2e
+,0x63,0x72,0x6c,0x30,0x2b,0x06,0x03,0x55
+,0x1d,0x10,0x04,0x24,0x30,0x22,0x80,0x0f
+,0x31,0x39,0x39,0x39,0x31,0x30,0x31,0x32
+,0x31,0x39,0x32,0x34,0x33,0x30,0x5a,0x81
+,0x0f,0x32,0x30,0x31,0x39,0x31,0x30,0x31
+,0x32,0x31,0x39,0x32,0x34,0x33,0x30,0x5a
+,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04
+,0x04,0x03,0x02,0x01,0x06,0x30,0x1f,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16
+,0x80,0x14,0xc4,0xfb,0x9c,0x29,0x7b,0x97
+,0xcd,0x4c,0x96,0xfc,0xee,0x5b,0xb3,0xca
+,0x99,0x74,0x8b,0x95,0xea,0x4c,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0xc4,0xfb,0x9c,0x29,0x7b,0x97,0xcd
+,0x4c,0x96,0xfc,0xee,0x5b,0xb3,0xca,0x99
+,0x74,0x8b,0x95,0xea,0x4c,0x30,0x0c,0x06
+,0x03,0x55,0x1d,0x13,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x19,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf6,0x7d,0x07,0x41,0x00
+,0x04,0x0c,0x30,0x0a,0x1b,0x04,0x56,0x34
+,0x2e,0x30,0x03,0x02,0x04,0x90,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x04,0x05,0x00,0x03,0x81,0x81
+,0x00,0x3f,0xae,0x8a,0xf1,0xd7,0x66,0x03
+,0x05,0x9e,0x3e,0xfa,0xea,0x1c,0x46,0xbb
+,0xa4,0x5b,0x8f,0x78,0x9a,0x12,0x48,0x99
+,0xf9,0xf4,0x35,0xde,0x0c,0x36,0x07,0x02
+,0x6b,0x10,0x3a,0x89,0x14,0x81,0x9c,0x31
+,0xa6,0x7c,0xb2,0x41,0xb2,0x6a,0xe7,0x07
+,0x01,0xa1,0x4b,0xf9,0x9f,0x25,0x3b,0x96
+,0xca,0x99,0xc3,0x3e,0xa1,0x51,0x1c,0xf3
+,0xc3,0x2e,0x44,0xf7,0xb0,0x67,0x46,0xaa
+,0x92,0xe5,0x3b,0xda,0x1c,0x19,0x14,0x38
+,0x30,0xd5,0xe2,0xa2,0x31,0x25,0x2e,0xf1
+,0xec,0x45,0x38,0xed,0xf8,0x06,0x58,0x03
+,0x73,0x62,0xb0,0x10,0x31,0x8f,0x40,0xbf
+,0x64,0xe0,0x5c,0x3e,0xc5,0x4f,0x1f,0xda
+,0x12,0x43,0xff,0x4c,0xe6,0x06,0x26,0xa8
+,0x9b,0x19,0xaa,0x44,0x3c,0x76,0xb2,0x5c
+,0xec};
+const unsigned int NptTlsTrustAnchor_Base_0030_Size = 1265;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0031.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0031.cpp
new file mode 100644
index 0000000..a27917d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0031.cpp
@@ -0,0 +1,177 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Entrust.net Premium 2048 Secure Server CA */
+const unsigned char NptTlsTrustAnchor_Base_0031_Data[1120] = {
+0x30,0x82,0x04,0x5c,0x30,0x82,0x03,0x44
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x38
+,0x63,0xb9,0x66,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xb4,0x31,0x14,0x30
+,0x12,0x06,0x03,0x55,0x04,0x0a,0x13,0x0b
+,0x45,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e
+,0x6e,0x65,0x74,0x31,0x40,0x30,0x3e,0x06
+,0x03,0x55,0x04,0x0b,0x14,0x37,0x77,0x77
+,0x77,0x2e,0x65,0x6e,0x74,0x72,0x75,0x73
+,0x74,0x2e,0x6e,0x65,0x74,0x2f,0x43,0x50
+,0x53,0x5f,0x32,0x30,0x34,0x38,0x20,0x69
+,0x6e,0x63,0x6f,0x72,0x70,0x2e,0x20,0x62
+,0x79,0x20,0x72,0x65,0x66,0x2e,0x20,0x28
+,0x6c,0x69,0x6d,0x69,0x74,0x73,0x20,0x6c
+,0x69,0x61,0x62,0x2e,0x29,0x31,0x25,0x30
+,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c
+,0x28,0x63,0x29,0x20,0x31,0x39,0x39,0x39
+,0x20,0x45,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x20,0x4c,0x69,0x6d
+,0x69,0x74,0x65,0x64,0x31,0x33,0x30,0x31
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2a,0x45
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x20,0x28,0x32,0x30,0x34,0x38
+,0x29,0x30,0x1e,0x17,0x0d,0x39,0x39,0x31
+,0x32,0x32,0x34,0x31,0x37,0x35,0x30,0x35
+,0x31,0x5a,0x17,0x0d,0x31,0x39,0x31,0x32
+,0x32,0x34,0x31,0x38,0x32,0x30,0x35,0x31
+,0x5a,0x30,0x81,0xb4,0x31,0x14,0x30,0x12
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x0b,0x45
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x31,0x40,0x30,0x3e,0x06,0x03
+,0x55,0x04,0x0b,0x14,0x37,0x77,0x77,0x77
+,0x2e,0x65,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x2f,0x43,0x50,0x53
+,0x5f,0x32,0x30,0x34,0x38,0x20,0x69,0x6e
+,0x63,0x6f,0x72,0x70,0x2e,0x20,0x62,0x79
+,0x20,0x72,0x65,0x66,0x2e,0x20,0x28,0x6c
+,0x69,0x6d,0x69,0x74,0x73,0x20,0x6c,0x69
+,0x61,0x62,0x2e,0x29,0x31,0x25,0x30,0x23
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x28
+,0x63,0x29,0x20,0x31,0x39,0x39,0x39,0x20
+,0x45,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e
+,0x6e,0x65,0x74,0x20,0x4c,0x69,0x6d,0x69
+,0x74,0x65,0x64,0x31,0x33,0x30,0x31,0x06
+,0x03,0x55,0x04,0x03,0x13,0x2a,0x45,0x6e
+,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65
+,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x20,0x28,0x32,0x30,0x34,0x38,0x29
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xad,0x4d,0x4b,0xa9,0x12,0x86,0xb2
+,0xea,0xa3,0x20,0x07,0x15,0x16,0x64,0x2a
+,0x2b,0x4b,0xd1,0xbf,0x0b,0x4a,0x4d,0x8e
+,0xed,0x80,0x76,0xa5,0x67,0xb7,0x78,0x40
+,0xc0,0x73,0x42,0xc8,0x68,0xc0,0xdb,0x53
+,0x2b,0xdd,0x5e,0xb8,0x76,0x98,0x35,0x93
+,0x8b,0x1a,0x9d,0x7c,0x13,0x3a,0x0e,0x1f
+,0x5b,0xb7,0x1e,0xcf,0xe5,0x24,0x14,0x1e
+,0xb1,0x81,0xa9,0x8d,0x7d,0xb8,0xcc,0x6b
+,0x4b,0x03,0xf1,0x02,0x0c,0xdc,0xab,0xa5
+,0x40,0x24,0x00,0x7f,0x74,0x94,0xa1,0x9d
+,0x08,0x29,0xb3,0x88,0x0b,0xf5,0x87,0x77
+,0x9d,0x55,0xcd,0xe4,0xc3,0x7e,0xd7,0x6a
+,0x64,0xab,0x85,0x14,0x86,0x95,0x5b,0x97
+,0x32,0x50,0x6f,0x3d,0xc8,0xba,0x66,0x0c
+,0xe3,0xfc,0xbd,0xb8,0x49,0xc1,0x76,0x89
+,0x49,0x19,0xfd,0xc0,0xa8,0xbd,0x89,0xa3
+,0x67,0x2f,0xc6,0x9f,0xbc,0x71,0x19,0x60
+,0xb8,0x2d,0xe9,0x2c,0xc9,0x90,0x76,0x66
+,0x7b,0x94,0xe2,0xaf,0x78,0xd6,0x65,0x53
+,0x5d,0x3c,0xd6,0x9c,0xb2,0xcf,0x29,0x03
+,0xf9,0x2f,0xa4,0x50,0xb2,0xd4,0x48,0xce
+,0x05,0x32,0x55,0x8a,0xfd,0xb2,0x64,0x4c
+,0x0e,0xe4,0x98,0x07,0x75,0xdb,0x7f,0xdf
+,0xb9,0x08,0x55,0x60,0x85,0x30,0x29,0xf9
+,0x7b,0x48,0xa4,0x69,0x86,0xe3,0x35,0x3f
+,0x1e,0x86,0x5d,0x7a,0x7a,0x15,0xbd,0xef
+,0x00,0x8e,0x15,0x22,0x54,0x17,0x00,0x90
+,0x26,0x93,0xbc,0x0e,0x49,0x68,0x91,0xbf
+,0xf8,0x47,0xd3,0x9d,0x95,0x42,0xc1,0x0e
+,0x4d,0xdf,0x6f,0x26,0xcf,0xc3,0x18,0x21
+,0x62,0x66,0x43,0x70,0xd6,0xd5,0xc0,0x07
+,0xe1,0x02,0x03,0x01,0x00,0x01,0xa3,0x74
+,0x30,0x72,0x30,0x11,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x01,0x04
+,0x04,0x03,0x02,0x00,0x07,0x30,0x1f,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16
+,0x80,0x14,0x55,0xe4,0x81,0xd1,0x11,0x80
+,0xbe,0xd8,0x89,0xb9,0x08,0xa3,0x31,0xf9
+,0xa1,0x24,0x09,0x16,0xb9,0x70,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0x55,0xe4,0x81,0xd1,0x11,0x80,0xbe
+,0xd8,0x89,0xb9,0x08,0xa3,0x31,0xf9,0xa1
+,0x24,0x09,0x16,0xb9,0x70,0x30,0x1d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf6,0x7d,0x07
+,0x41,0x00,0x04,0x10,0x30,0x0e,0x1b,0x08
+,0x56,0x35,0x2e,0x30,0x3a,0x34,0x2e,0x30
+,0x03,0x02,0x04,0x90,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0x59,0x47,0xac,0x21,0x84,0x8a,0x17,0xc9
+,0x9c,0x89,0x53,0x1e,0xba,0x80,0x85,0x1a
+,0xc6,0x3c,0x4e,0x3e,0xb1,0x9c,0xb6,0x7c
+,0xc6,0x92,0x5d,0x18,0x64,0x02,0xe3,0xd3
+,0x06,0x08,0x11,0x61,0x7c,0x63,0xe3,0x2b
+,0x9d,0x31,0x03,0x70,0x76,0xd2,0xa3,0x28
+,0xa0,0xf4,0xbb,0x9a,0x63,0x73,0xed,0x6d
+,0xe5,0x2a,0xdb,0xed,0x14,0xa9,0x2b,0xc6
+,0x36,0x11,0xd0,0x2b,0xeb,0x07,0x8b,0xa5
+,0xda,0x9e,0x5c,0x19,0x9d,0x56,0x12,0xf5
+,0x54,0x29,0xc8,0x05,0xed,0xb2,0x12,0x2a
+,0x8d,0xf4,0x03,0x1b,0xff,0xe7,0x92,0x10
+,0x87,0xb0,0x3a,0xb5,0xc3,0x9d,0x05,0x37
+,0x12,0xa3,0xc7,0xf4,0x15,0xb9,0xd5,0xa4
+,0x39,0x16,0x9b,0x53,0x3a,0x23,0x91,0xf1
+,0xa8,0x82,0xa2,0x6a,0x88,0x68,0xc1,0x79
+,0x02,0x22,0xbc,0xaa,0xa6,0xd6,0xae,0xdf
+,0xb0,0x14,0x5f,0xb8,0x87,0xd0,0xdd,0x7c
+,0x7f,0x7b,0xff,0xaf,0x1c,0xcf,0xe6,0xdb
+,0x07,0xad,0x5e,0xdb,0x85,0x9d,0xd0,0x2b
+,0x0d,0x33,0xdb,0x04,0xd1,0xe6,0x49,0x40
+,0x13,0x2b,0x76,0xfb,0x3e,0xe9,0x9c,0x89
+,0x0f,0x15,0xce,0x18,0xb0,0x85,0x78,0x21
+,0x4f,0x6b,0x4f,0x0e,0xfa,0x36,0x67,0xcd
+,0x07,0xf2,0xff,0x08,0xd0,0xe2,0xde,0xd9
+,0xbf,0x2a,0xaf,0xb8,0x87,0x86,0x21,0x3c
+,0x04,0xca,0xb7,0x94,0x68,0x7f,0xcf,0x3c
+,0xe9,0x98,0xd7,0x38,0xff,0xec,0xc0,0xd9
+,0x50,0xf0,0x2e,0x4b,0x58,0xae,0x46,0x6f
+,0xd0,0x2e,0xc3,0x60,0xda,0x72,0x55,0x72
+,0xbd,0x4c,0x45,0x9e,0x61,0xba,0xbf,0x84
+,0x81,0x92,0x03,0xd1,0xd2,0x69,0x7c,0xc5
+};
+const unsigned int NptTlsTrustAnchor_Base_0031_Size = 1120;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0032.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0032.cpp
new file mode 100644
index 0000000..de47553
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0032.cpp
@@ -0,0 +1,148 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Baltimore CyberTrust Root */
+const unsigned char NptTlsTrustAnchor_Base_0032_Data[891] = {
+0x30,0x82,0x03,0x77,0x30,0x82,0x02,0x5f
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x02
+,0x00,0x00,0xb9,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x5a,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x49
+,0x45,0x31,0x12,0x30,0x10,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x09,0x42,0x61,0x6c,0x74
+,0x69,0x6d,0x6f,0x72,0x65,0x31,0x13,0x30
+,0x11,0x06,0x03,0x55,0x04,0x0b,0x13,0x0a
+,0x43,0x79,0x62,0x65,0x72,0x54,0x72,0x75
+,0x73,0x74,0x31,0x22,0x30,0x20,0x06,0x03
+,0x55,0x04,0x03,0x13,0x19,0x42,0x61,0x6c
+,0x74,0x69,0x6d,0x6f,0x72,0x65,0x20,0x43
+,0x79,0x62,0x65,0x72,0x54,0x72,0x75,0x73
+,0x74,0x20,0x52,0x6f,0x6f,0x74,0x30,0x1e
+,0x17,0x0d,0x30,0x30,0x30,0x35,0x31,0x32
+,0x31,0x38,0x34,0x36,0x30,0x30,0x5a,0x17
+,0x0d,0x32,0x35,0x30,0x35,0x31,0x32,0x32
+,0x33,0x35,0x39,0x30,0x30,0x5a,0x30,0x5a
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x49,0x45,0x31,0x12,0x30
+,0x10,0x06,0x03,0x55,0x04,0x0a,0x13,0x09
+,0x42,0x61,0x6c,0x74,0x69,0x6d,0x6f,0x72
+,0x65,0x31,0x13,0x30,0x11,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x0a,0x43,0x79,0x62,0x65
+,0x72,0x54,0x72,0x75,0x73,0x74,0x31,0x22
+,0x30,0x20,0x06,0x03,0x55,0x04,0x03,0x13
+,0x19,0x42,0x61,0x6c,0x74,0x69,0x6d,0x6f
+,0x72,0x65,0x20,0x43,0x79,0x62,0x65,0x72
+,0x54,0x72,0x75,0x73,0x74,0x20,0x52,0x6f
+,0x6f,0x74,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xa3,0x04,0xbb,0x22,0xab
+,0x98,0x3d,0x57,0xe8,0x26,0x72,0x9a,0xb5
+,0x79,0xd4,0x29,0xe2,0xe1,0xe8,0x95,0x80
+,0xb1,0xb0,0xe3,0x5b,0x8e,0x2b,0x29,0x9a
+,0x64,0xdf,0xa1,0x5d,0xed,0xb0,0x09,0x05
+,0x6d,0xdb,0x28,0x2e,0xce,0x62,0xa2,0x62
+,0xfe,0xb4,0x88,0xda,0x12,0xeb,0x38,0xeb
+,0x21,0x9d,0xc0,0x41,0x2b,0x01,0x52,0x7b
+,0x88,0x77,0xd3,0x1c,0x8f,0xc7,0xba,0xb9
+,0x88,0xb5,0x6a,0x09,0xe7,0x73,0xe8,0x11
+,0x40,0xa7,0xd1,0xcc,0xca,0x62,0x8d,0x2d
+,0xe5,0x8f,0x0b,0xa6,0x50,0xd2,0xa8,0x50
+,0xc3,0x28,0xea,0xf5,0xab,0x25,0x87,0x8a
+,0x9a,0x96,0x1c,0xa9,0x67,0xb8,0x3f,0x0c
+,0xd5,0xf7,0xf9,0x52,0x13,0x2f,0xc2,0x1b
+,0xd5,0x70,0x70,0xf0,0x8f,0xc0,0x12,0xca
+,0x06,0xcb,0x9a,0xe1,0xd9,0xca,0x33,0x7a
+,0x77,0xd6,0xf8,0xec,0xb9,0xf1,0x68,0x44
+,0x42,0x48,0x13,0xd2,0xc0,0xc2,0xa4,0xae
+,0x5e,0x60,0xfe,0xb6,0xa6,0x05,0xfc,0xb4
+,0xdd,0x07,0x59,0x02,0xd4,0x59,0x18,0x98
+,0x63,0xf5,0xa5,0x63,0xe0,0x90,0x0c,0x7d
+,0x5d,0xb2,0x06,0x7a,0xf3,0x85,0xea,0xeb
+,0xd4,0x03,0xae,0x5e,0x84,0x3e,0x5f,0xff
+,0x15,0xed,0x69,0xbc,0xf9,0x39,0x36,0x72
+,0x75,0xcf,0x77,0x52,0x4d,0xf3,0xc9,0x90
+,0x2c,0xb9,0x3d,0xe5,0xc9,0x23,0x53,0x3f
+,0x1f,0x24,0x98,0x21,0x5c,0x07,0x99,0x29
+,0xbd,0xc6,0x3a,0xec,0xe7,0x6e,0x86,0x3a
+,0x6b,0x97,0x74,0x63,0x33,0xbd,0x68,0x18
+,0x31,0xf0,0x78,0x8d,0x76,0xbf,0xfc,0x9e
+,0x8e,0x5d,0x2a,0x86,0xa7,0x4d,0x90,0xdc
+,0x27,0x1a,0x39,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x45,0x30,0x43,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0xe5
+,0x9d,0x59,0x30,0x82,0x47,0x58,0xcc,0xac
+,0xfa,0x08,0x54,0x36,0x86,0x7b,0x3a,0xb5
+,0x04,0x4d,0xf0,0x30,0x12,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x08,0x30
+,0x06,0x01,0x01,0xff,0x02,0x01,0x03,0x30
+,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01
+,0xff,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x01,0x01,0x00,0x85,0x0c,0x5d,0x8e,0xe4
+,0x6f,0x51,0x68,0x42,0x05,0xa0,0xdd,0xbb
+,0x4f,0x27,0x25,0x84,0x03,0xbd,0xf7,0x64
+,0xfd,0x2d,0xd7,0x30,0xe3,0xa4,0x10,0x17
+,0xeb,0xda,0x29,0x29,0xb6,0x79,0x3f,0x76
+,0xf6,0x19,0x13,0x23,0xb8,0x10,0x0a,0xf9
+,0x58,0xa4,0xd4,0x61,0x70,0xbd,0x04,0x61
+,0x6a,0x12,0x8a,0x17,0xd5,0x0a,0xbd,0xc5
+,0xbc,0x30,0x7c,0xd6,0xe9,0x0c,0x25,0x8d
+,0x86,0x40,0x4f,0xec,0xcc,0xa3,0x7e,0x38
+,0xc6,0x37,0x11,0x4f,0xed,0xdd,0x68,0x31
+,0x8e,0x4c,0xd2,0xb3,0x01,0x74,0xee,0xbe
+,0x75,0x5e,0x07,0x48,0x1a,0x7f,0x70,0xff
+,0x16,0x5c,0x84,0xc0,0x79,0x85,0xb8,0x05
+,0xfd,0x7f,0xbe,0x65,0x11,0xa3,0x0f,0xc0
+,0x02,0xb4,0xf8,0x52,0x37,0x39,0x04,0xd5
+,0xa9,0x31,0x7a,0x18,0xbf,0xa0,0x2a,0xf4
+,0x12,0x99,0xf7,0xa3,0x45,0x82,0xe3,0x3c
+,0x5e,0xf5,0x9d,0x9e,0xb5,0xc8,0x9e,0x7c
+,0x2e,0xc8,0xa4,0x9e,0x4e,0x08,0x14,0x4b
+,0x6d,0xfd,0x70,0x6d,0x6b,0x1a,0x63,0xbd
+,0x64,0xe6,0x1f,0xb7,0xce,0xf0,0xf2,0x9f
+,0x2e,0xbb,0x1b,0xb7,0xf2,0x50,0x88,0x73
+,0x92,0xc2,0xe2,0xe3,0x16,0x8d,0x9a,0x32
+,0x02,0xab,0x8e,0x18,0xdd,0xe9,0x10,0x11
+,0xee,0x7e,0x35,0xab,0x90,0xaf,0x3e,0x30
+,0x94,0x7a,0xd0,0x33,0x3d,0xa7,0x65,0x0f
+,0xf5,0xfc,0x8e,0x9e,0x62,0xcf,0x47,0x44
+,0x2c,0x01,0x5d,0xbb,0x1d,0xb5,0x32,0xd2
+,0x47,0xd2,0x38,0x2e,0xd0,0xfe,0x81,0xdc
+,0x32,0x6a,0x1e,0xb5,0xee,0x3c,0xd5,0xfc
+,0xe7,0x81,0x1d,0x19,0xc3,0x24,0x42,0xea
+,0x63,0x39,0xa9};
+const unsigned int NptTlsTrustAnchor_Base_0032_Size = 891;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0033.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0033.cpp
new file mode 100644
index 0000000..14860a9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0033.cpp
@@ -0,0 +1,119 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Equifax Secure Global eBusiness CA */
+const unsigned char NptTlsTrustAnchor_Base_0033_Data[660] = {
+0x30,0x82,0x02,0x90,0x30,0x82,0x01,0xf9
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x5a,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x1c
+,0x30,0x1a,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x13,0x45,0x71,0x75,0x69,0x66,0x61,0x78
+,0x20,0x53,0x65,0x63,0x75,0x72,0x65,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x2d,0x30,0x2b
+,0x06,0x03,0x55,0x04,0x03,0x13,0x24,0x45
+,0x71,0x75,0x69,0x66,0x61,0x78,0x20,0x53
+,0x65,0x63,0x75,0x72,0x65,0x20,0x47,0x6c
+,0x6f,0x62,0x61,0x6c,0x20,0x65,0x42,0x75
+,0x73,0x69,0x6e,0x65,0x73,0x73,0x20,0x43
+,0x41,0x2d,0x31,0x30,0x1e,0x17,0x0d,0x39
+,0x39,0x30,0x36,0x32,0x31,0x30,0x34,0x30
+,0x30,0x30,0x30,0x5a,0x17,0x0d,0x32,0x30
+,0x30,0x36,0x32,0x31,0x30,0x34,0x30,0x30
+,0x30,0x30,0x5a,0x30,0x5a,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x1c,0x30,0x1a,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x13,0x45,0x71,0x75
+,0x69,0x66,0x61,0x78,0x20,0x53,0x65,0x63
+,0x75,0x72,0x65,0x20,0x49,0x6e,0x63,0x2e
+,0x31,0x2d,0x30,0x2b,0x06,0x03,0x55,0x04
+,0x03,0x13,0x24,0x45,0x71,0x75,0x69,0x66
+,0x61,0x78,0x20,0x53,0x65,0x63,0x75,0x72
+,0x65,0x20,0x47,0x6c,0x6f,0x62,0x61,0x6c
+,0x20,0x65,0x42,0x75,0x73,0x69,0x6e,0x65
+,0x73,0x73,0x20,0x43,0x41,0x2d,0x31,0x30
+,0x81,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x81,0x8d,0x00,0x30,0x81,0x89
+,0x02,0x81,0x81,0x00,0xba,0xe7,0x17,0x90
+,0x02,0x65,0xb1,0x34,0x55,0x3c,0x49,0xc2
+,0x51,0xd5,0xdf,0xa7,0xd1,0x37,0x8f,0xd1
+,0xe7,0x81,0x73,0x41,0x52,0x60,0x9b,0x9d
+,0xa1,0x17,0x26,0x78,0xad,0xc7,0xb1,0xe8
+,0x26,0x94,0x32,0xb5,0xde,0x33,0x8d,0x3a
+,0x2f,0xdb,0xf2,0x9a,0x7a,0x5a,0x73,0x98
+,0xa3,0x5c,0xe9,0xfb,0x8a,0x73,0x1b,0x5c
+,0xe7,0xc3,0xbf,0x80,0x6c,0xcd,0xa9,0xf4
+,0xd6,0x2b,0xc0,0xf7,0xf9,0x99,0xaa,0x63
+,0xa2,0xb1,0x47,0x02,0x0f,0xd4,0xe4,0x51
+,0x3a,0x12,0x3c,0x6c,0x8a,0x5a,0x54,0x84
+,0x70,0xdb,0xc1,0xc5,0x90,0xcf,0x72,0x45
+,0xcb,0xa8,0x59,0xc0,0xcd,0x33,0x9d,0x3f
+,0xa3,0x96,0xeb,0x85,0x33,0x21,0x1c,0x3e
+,0x1e,0x3e,0x60,0x6e,0x76,0x9c,0x67,0x85
+,0xc5,0xc8,0xc3,0x61,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x66,0x30,0x64,0x30,0x11,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x01,0x04,0x04,0x03,0x02,0x00,0x07
+,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01
+,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0xbe,0xa8
+,0xa0,0x74,0x72,0x50,0x6b,0x44,0xb7,0xc9
+,0x23,0xd8,0xfb,0xa8,0xff,0xb3,0x57,0x6b
+,0x68,0x6c,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0xbe,0xa8,0xa0
+,0x74,0x72,0x50,0x6b,0x44,0xb7,0xc9,0x23
+,0xd8,0xfb,0xa8,0xff,0xb3,0x57,0x6b,0x68
+,0x6c,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00
+,0x03,0x81,0x81,0x00,0x30,0xe2,0x01,0x51
+,0xaa,0xc7,0xea,0x5f,0xda,0xb9,0xd0,0x65
+,0x0f,0x30,0xd6,0x3e,0xda,0x0d,0x14,0x49
+,0x6e,0x91,0x93,0x27,0x14,0x31,0xef,0xc4
+,0xf7,0x2d,0x45,0xf8,0xec,0xc7,0xbf,0xa2
+,0x41,0x0d,0x23,0xb4,0x92,0xf9,0x19,0x00
+,0x67,0xbd,0x01,0xaf,0xcd,0xe0,0x71,0xfc
+,0x5a,0xcf,0x64,0xc4,0xe0,0x96,0x98,0xd0
+,0xa3,0x40,0xe2,0x01,0x8a,0xef,0x27,0x07
+,0xf1,0x65,0x01,0x8a,0x44,0x2d,0x06,0x65
+,0x75,0x52,0xc0,0x86,0x10,0x20,0x21,0x5f
+,0x6c,0x6b,0x0f,0x6c,0xae,0x09,0x1c,0xaf
+,0xf2,0xa2,0x18,0x34,0xc4,0x75,0xa4,0x73
+,0x1c,0xf1,0x8d,0xdc,0xef,0xad,0xf9,0xb3
+,0x76,0xb4,0x92,0xbf,0xdc,0x95,0x10,0x1e
+,0xbe,0xcb,0xc8,0x3b,0x5a,0x84,0x60,0x19
+,0x56,0x94,0xa9,0x55};
+const unsigned int NptTlsTrustAnchor_Base_0033_Size = 660;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0034.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0034.cpp
new file mode 100644
index 0000000..46e8efc
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0034.cpp
@@ -0,0 +1,117 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Equifax Secure eBusiness CA 1 */
+const unsigned char NptTlsTrustAnchor_Base_0034_Data[646] = {
+0x30,0x82,0x02,0x82,0x30,0x82,0x01,0xeb
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x04
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x53,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x1c
+,0x30,0x1a,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x13,0x45,0x71,0x75,0x69,0x66,0x61,0x78
+,0x20,0x53,0x65,0x63,0x75,0x72,0x65,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x26,0x30,0x24
+,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x45
+,0x71,0x75,0x69,0x66,0x61,0x78,0x20,0x53
+,0x65,0x63,0x75,0x72,0x65,0x20,0x65,0x42
+,0x75,0x73,0x69,0x6e,0x65,0x73,0x73,0x20
+,0x43,0x41,0x2d,0x31,0x30,0x1e,0x17,0x0d
+,0x39,0x39,0x30,0x36,0x32,0x31,0x30,0x34
+,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x32
+,0x30,0x30,0x36,0x32,0x31,0x30,0x34,0x30
+,0x30,0x30,0x30,0x5a,0x30,0x53,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x55,0x53,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x13,0x45,0x71
+,0x75,0x69,0x66,0x61,0x78,0x20,0x53,0x65
+,0x63,0x75,0x72,0x65,0x20,0x49,0x6e,0x63
+,0x2e,0x31,0x26,0x30,0x24,0x06,0x03,0x55
+,0x04,0x03,0x13,0x1d,0x45,0x71,0x75,0x69
+,0x66,0x61,0x78,0x20,0x53,0x65,0x63,0x75
+,0x72,0x65,0x20,0x65,0x42,0x75,0x73,0x69
+,0x6e,0x65,0x73,0x73,0x20,0x43,0x41,0x2d
+,0x31,0x30,0x81,0x9f,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x81,0x8d,0x00,0x30
+,0x81,0x89,0x02,0x81,0x81,0x00,0xce,0x2f
+,0x19,0xbc,0x17,0xb7,0x77,0xde,0x93,0xa9
+,0x5f,0x5a,0x0d,0x17,0x4f,0x34,0x1a,0x0c
+,0x98,0xf4,0x22,0xd9,0x59,0xd4,0xc4,0x68
+,0x46,0xf0,0xb4,0x35,0xc5,0x85,0x03,0x20
+,0xc6,0xaf,0x45,0xa5,0x21,0x51,0x45,0x41
+,0xeb,0x16,0x58,0x36,0x32,0x6f,0xe2,0x50
+,0x62,0x64,0xf9,0xfd,0x51,0x9c,0xaa,0x24
+,0xd9,0xf4,0x9d,0x83,0x2a,0x87,0x0a,0x21
+,0xd3,0x12,0x38,0x34,0x6c,0x8d,0x00,0x6e
+,0x5a,0xa0,0xd9,0x42,0xee,0x1a,0x21,0x95
+,0xf9,0x52,0x4c,0x55,0x5a,0xc5,0x0f,0x38
+,0x4f,0x46,0xfa,0x6d,0xf8,0x2e,0x35,0xd6
+,0x1d,0x7c,0xeb,0xe2,0xf0,0xb0,0x75,0x80
+,0xc8,0xa9,0x13,0xac,0xbe,0x88,0xef,0x3a
+,0x6e,0xab,0x5f,0x2a,0x38,0x62,0x02,0xb0
+,0x12,0x7b,0xfe,0x8f,0xa6,0x03,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x66,0x30,0x64,0x30
+,0x11,0x06,0x09,0x60,0x86,0x48,0x01,0x86
+,0xf8,0x42,0x01,0x01,0x04,0x04,0x03,0x02
+,0x00,0x07,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x1f,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14
+,0x4a,0x78,0x32,0x52,0x11,0xdb,0x59,0x16
+,0x36,0x5e,0xdf,0xc1,0x14,0x36,0x40,0x6a
+,0x47,0x7c,0x4c,0xa1,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x4a
+,0x78,0x32,0x52,0x11,0xdb,0x59,0x16,0x36
+,0x5e,0xdf,0xc1,0x14,0x36,0x40,0x6a,0x47
+,0x7c,0x4c,0xa1,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04
+,0x05,0x00,0x03,0x81,0x81,0x00,0x75,0x5b
+,0xa8,0x9b,0x03,0x11,0xe6,0xe9,0x56,0x4c
+,0xcd,0xf9,0xa9,0x4c,0xc0,0x0d,0x9a,0xf3
+,0xcc,0x65,0x69,0xe6,0x25,0x76,0xcc,0x59
+,0xb7,0xd6,0x54,0xc3,0x1d,0xcd,0x99,0xac
+,0x19,0xdd,0xb4,0x85,0xd5,0xe0,0x3d,0xfc
+,0x62,0x20,0xa7,0x84,0x4b,0x58,0x65,0xf1
+,0xe2,0xf9,0x95,0x21,0x3f,0xf5,0xd4,0x7e
+,0x58,0x1e,0x47,0x87,0x54,0x3e,0x58,0xa1
+,0xb5,0xb5,0xf8,0x2a,0xef,0x71,0xe7,0xbc
+,0xc3,0xf6,0xb1,0x49,0x46,0xe2,0xd7,0xa0
+,0x6b,0xe5,0x56,0x7a,0x9a,0x27,0x98,0x7c
+,0x46,0x62,0x14,0xe7,0xc9,0xfc,0x6e,0x03
+,0x12,0x79,0x80,0x38,0x1d,0x48,0x82,0x8d
+,0xfc,0x17,0xfe,0x2a,0x96,0x2b,0xb5,0x62
+,0xa6,0xa6,0x3d,0xbd,0x7f,0x92,0x59,0xcd
+,0x5a,0x2a,0x82,0xb2,0x37,0x79};
+const unsigned int NptTlsTrustAnchor_Base_0034_Size = 646;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0035.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0035.cpp
new file mode 100644
index 0000000..ce5e831
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0035.cpp
@@ -0,0 +1,137 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Equifax Secure eBusiness CA 2 */
+const unsigned char NptTlsTrustAnchor_Base_0035_Data[804] = {
+0x30,0x82,0x03,0x20,0x30,0x82,0x02,0x89
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x37
+,0x70,0xcf,0xb5,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x4e,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x45,0x71,0x75,0x69
+,0x66,0x61,0x78,0x20,0x53,0x65,0x63,0x75
+,0x72,0x65,0x31,0x26,0x30,0x24,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x1d,0x45,0x71,0x75
+,0x69,0x66,0x61,0x78,0x20,0x53,0x65,0x63
+,0x75,0x72,0x65,0x20,0x65,0x42,0x75,0x73
+,0x69,0x6e,0x65,0x73,0x73,0x20,0x43,0x41
+,0x2d,0x32,0x30,0x1e,0x17,0x0d,0x39,0x39
+,0x30,0x36,0x32,0x33,0x31,0x32,0x31,0x34
+,0x34,0x35,0x5a,0x17,0x0d,0x31,0x39,0x30
+,0x36,0x32,0x33,0x31,0x32,0x31,0x34,0x34
+,0x35,0x5a,0x30,0x4e,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x45,0x71,0x75,0x69
+,0x66,0x61,0x78,0x20,0x53,0x65,0x63,0x75
+,0x72,0x65,0x31,0x26,0x30,0x24,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x1d,0x45,0x71,0x75
+,0x69,0x66,0x61,0x78,0x20,0x53,0x65,0x63
+,0x75,0x72,0x65,0x20,0x65,0x42,0x75,0x73
+,0x69,0x6e,0x65,0x73,0x73,0x20,0x43,0x41
+,0x2d,0x32,0x30,0x81,0x9f,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x81,0x8d,0x00
+,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xe4
+,0x39,0x39,0x93,0x1e,0x52,0x06,0x1b,0x28
+,0x36,0xf8,0xb2,0xa3,0x29,0xc5,0xed,0x8e
+,0xb2,0x11,0xbd,0xfe,0xeb,0xe7,0xb4,0x74
+,0xc2,0x8f,0xff,0x05,0xe7,0xd9,0x9d,0x06
+,0xbf,0x12,0xc8,0x3f,0x0e,0xf2,0xd6,0xd1
+,0x24,0xb2,0x11,0xde,0xd1,0x73,0x09,0x8a
+,0xd4,0xb1,0x2c,0x98,0x09,0x0d,0x1e,0x50
+,0x46,0xb2,0x83,0xa6,0x45,0x8d,0x62,0x68
+,0xbb,0x85,0x1b,0x20,0x70,0x32,0xaa,0x40
+,0xcd,0xa6,0x96,0x5f,0xc4,0x71,0x37,0x3f
+,0x04,0xf3,0xb7,0x41,0x24,0x39,0x07,0x1a
+,0x1e,0x2e,0x61,0x58,0xa0,0x12,0x0b,0xe5
+,0xa5,0xdf,0xc5,0xab,0xea,0x37,0x71,0xcc
+,0x1c,0xc8,0x37,0x3a,0xb9,0x97,0x52,0xa7
+,0xac,0xc5,0x6a,0x24,0x94,0x4e,0x9c,0x7b
+,0xcf,0xc0,0x6a,0xd6,0xdf,0x21,0xbd,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x09
+,0x30,0x82,0x01,0x05,0x30,0x70,0x06,0x03
+,0x55,0x1d,0x1f,0x04,0x69,0x30,0x67,0x30
+,0x65,0xa0,0x63,0xa0,0x61,0xa4,0x5f,0x30
+,0x5d,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17
+,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0e,0x45,0x71,0x75,0x69,0x66,0x61,0x78
+,0x20,0x53,0x65,0x63,0x75,0x72,0x65,0x31
+,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x1d,0x45,0x71,0x75,0x69,0x66,0x61
+,0x78,0x20,0x53,0x65,0x63,0x75,0x72,0x65
+,0x20,0x65,0x42,0x75,0x73,0x69,0x6e,0x65
+,0x73,0x73,0x20,0x43,0x41,0x2d,0x32,0x31
+,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x03
+,0x13,0x04,0x43,0x52,0x4c,0x31,0x30,0x1a
+,0x06,0x03,0x55,0x1d,0x10,0x04,0x13,0x30
+,0x11,0x81,0x0f,0x32,0x30,0x31,0x39,0x30
+,0x36,0x32,0x33,0x31,0x32,0x31,0x34,0x34
+,0x35,0x5a,0x30,0x0b,0x06,0x03,0x55,0x1d
+,0x0f,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18
+,0x30,0x16,0x80,0x14,0x50,0x9e,0x0b,0xea
+,0xaf,0x5e,0xb9,0x20,0x48,0xa6,0x50,0x6a
+,0xcb,0xfd,0xd8,0x20,0x7a,0xa7,0x82,0x76
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0x50,0x9e,0x0b,0xea,0xaf
+,0x5e,0xb9,0x20,0x48,0xa6,0x50,0x6a,0xcb
+,0xfd,0xd8,0x20,0x7a,0xa7,0x82,0x76,0x30
+,0x0c,0x06,0x03,0x55,0x1d,0x13,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x1a,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf6,0x7d,0x07
+,0x41,0x00,0x04,0x0d,0x30,0x0b,0x1b,0x05
+,0x56,0x33,0x2e,0x30,0x63,0x03,0x02,0x06
+,0xc0,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x81,0x81,0x00,0x0c,0x86,0x82,0xad
+,0xe8,0x4e,0x1a,0xf5,0x8e,0x89,0x27,0xe2
+,0x35,0x58,0x3d,0x29,0xb4,0x07,0x8f,0x36
+,0x50,0x95,0xbf,0x6e,0xc1,0x9e,0xeb,0xc4
+,0x90,0xb2,0x85,0xa8,0xbb,0xb7,0x42,0xe0
+,0x0f,0x07,0x39,0xdf,0xfb,0x9e,0x90,0xb2
+,0xd1,0xc1,0x3e,0x53,0x9f,0x03,0x44,0xb0
+,0x7e,0x4b,0xf4,0x6f,0xe4,0x7c,0x1f,0xe7
+,0xe2,0xb1,0xe4,0xb8,0x9a,0xef,0xc3,0xbd
+,0xce,0xde,0x0b,0x32,0x34,0xd9,0xde,0x28
+,0xed,0x33,0x6b,0xc4,0xd4,0xd7,0x3d,0x12
+,0x58,0xab,0x7d,0x09,0x2d,0xcb,0x70,0xf5
+,0x13,0x8a,0x94,0xa1,0x27,0xa4,0xd6,0x70
+,0xc5,0x6d,0x94,0xb5,0xc9,0x7d,0x9d,0xa0
+,0xd2,0xc6,0x08,0x49,0xd9,0x66,0x9b,0xa6
+,0xd3,0xf4,0x0b,0xdc,0xc5,0x26,0x57,0xe1
+,0x91,0x30,0xea,0xcd};
+const unsigned int NptTlsTrustAnchor_Base_0035_Size = 804;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0036.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0036.cpp
new file mode 100644
index 0000000..4940a75
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0036.cpp
@@ -0,0 +1,149 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Visa International Global Root 2 */
+const unsigned char NptTlsTrustAnchor_Base_0036_Data[900] = {
+0x30,0x82,0x03,0x80,0x30,0x82,0x02,0x68
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x02,0x03
+,0x1e,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x30,0x61,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x04,0x56,0x49,0x53,0x41,0x31,0x2f
+,0x30,0x2d,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x26,0x56,0x69,0x73,0x61,0x20,0x49,0x6e
+,0x74,0x65,0x72,0x6e,0x61,0x74,0x69,0x6f
+,0x6e,0x61,0x6c,0x20,0x53,0x65,0x72,0x76
+,0x69,0x63,0x65,0x20,0x41,0x73,0x73,0x6f
+,0x63,0x69,0x61,0x74,0x69,0x6f,0x6e,0x31
+,0x12,0x30,0x10,0x06,0x03,0x55,0x04,0x03
+,0x13,0x09,0x47,0x50,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x32,0x30,0x1e,0x17,0x0d,0x30
+,0x30,0x30,0x38,0x31,0x36,0x32,0x32,0x35
+,0x31,0x30,0x30,0x5a,0x17,0x0d,0x32,0x30
+,0x30,0x38,0x31,0x35,0x32,0x33,0x35,0x39
+,0x30,0x30,0x5a,0x30,0x61,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x0d,0x30,0x0b,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x04,0x56,0x49,0x53
+,0x41,0x31,0x2f,0x30,0x2d,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x26,0x56,0x69,0x73,0x61
+,0x20,0x49,0x6e,0x74,0x65,0x72,0x6e,0x61
+,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x20,0x41
+,0x73,0x73,0x6f,0x63,0x69,0x61,0x74,0x69
+,0x6f,0x6e,0x31,0x12,0x30,0x10,0x06,0x03
+,0x55,0x04,0x03,0x13,0x09,0x47,0x50,0x20
+,0x52,0x6f,0x6f,0x74,0x20,0x32,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xa9
+,0x01,0x70,0xb5,0xaa,0xc4,0x40,0xf0,0xab
+,0x6a,0x26,0x61,0x79,0x19,0x00,0xfc,0xbf
+,0x9b,0x37,0x59,0x0c,0xaf,0x6f,0x64,0x1b
+,0xf8,0xda,0x95,0x94,0x24,0x69,0x33,0x11
+,0x70,0xca,0xe3,0x56,0x74,0xa2,0x17,0x57
+,0x64,0x5c,0x20,0x06,0xe1,0xd6,0xef,0x71
+,0xb7,0x3b,0xf7,0xab,0xc1,0x69,0xd0,0x49
+,0xa4,0xb1,0x04,0xd7,0xf4,0x57,0x62,0x89
+,0x5c,0xb0,0x75,0x2d,0x17,0x24,0x69,0xe3
+,0x42,0x60,0xe4,0xee,0x74,0xd6,0xab,0x80
+,0x56,0xd8,0x88,0x28,0xe1,0xfb,0x6d,0x22
+,0xfd,0x23,0x7c,0x46,0x73,0x4f,0x7e,0x54
+,0x73,0x1e,0xa8,0x2c,0x55,0x58,0x75,0xb7
+,0x4c,0xf3,0x5a,0x45,0xa5,0x02,0x1a,0xfa
+,0xda,0x9d,0xc3,0x45,0xc3,0x22,0x5e,0xf3
+,0x8b,0xf1,0x60,0x29,0xd2,0xc7,0x5f,0xb4
+,0x0c,0x3a,0x51,0x83,0xef,0x30,0xf8,0xd4
+,0xe7,0xc7,0xf2,0xfa,0x99,0xa3,0x22,0x50
+,0xbe,0xf9,0x05,0x37,0xa3,0xad,0xed,0x9a
+,0xc3,0xe6,0xec,0x88,0x1b,0xb6,0x19,0x27
+,0x1b,0x38,0x8b,0x80,0x4d,0xec,0xb9,0xc7
+,0xc5,0x89,0xcb,0xfc,0x1a,0x32,0xed,0x23
+,0xf0,0xb5,0x01,0x58,0xf9,0xf6,0x8f,0xe0
+,0x85,0xa9,0x4c,0x09,0x72,0x39,0x12,0xdb
+,0xb3,0xf5,0xcf,0x4e,0x62,0x64,0xda,0xc6
+,0x19,0x15,0x3a,0x63,0x1d,0xe9,0x17,0x55
+,0xa1,0x4c,0x22,0x3c,0x34,0x32,0x46,0xf8
+,0x65,0x57,0xba,0x2b,0xef,0x36,0x8c,0x6a
+,0xfa,0xd9,0xd9,0x44,0xf4,0xaa,0xdd,0x84
+,0xd7,0x0d,0x1c,0xb2,0x54,0xac,0x32,0x85
+,0xb4,0x64,0x0d,0xde,0x41,0xbb,0xb1,0x34
+,0xc6,0x01,0x86,0x32,0x64,0xd5,0x9f,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x42,0x30,0x40
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0x9e,0x7d,0x4b,0x34,0xbf
+,0x71,0xad,0xc2,0x05,0xf6,0x03,0x75,0x80
+,0xce,0xa9,0x4f,0x1a,0xc4,0x24,0x4c,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01
+,0x01,0xff,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x21,0xa5,0x76,0x14
+,0x55,0xf9,0xad,0x27,0x70,0x8f,0x3c,0xf4
+,0xd5,0x6c,0xc8,0xcc,0x0a,0xab,0xa3,0x98
+,0x0b,0x8a,0x06,0x23,0xc5,0xc9,0x61,0xdb
+,0x99,0x07,0x69,0x35,0x26,0x31,0xfe,0xc7
+,0x2e,0x84,0xc2,0x99,0x61,0xd4,0x0d,0xe9
+,0x7d,0x2e,0x13,0x2b,0x7c,0x8e,0x85,0xb6
+,0x85,0xc7,0x4b,0xcf,0x35,0xb6,0x2c,0x47
+,0x3d,0xce,0x29,0x2f,0xd8,0x6f,0x9f,0x89
+,0x1c,0x64,0x93,0xbf,0x08,0xbd,0x76,0xd0
+,0x90,0x8a,0x94,0xb3,0x7f,0x28,0x5b,0x6e
+,0xac,0x4d,0x33,0x2c,0xed,0x65,0xdc,0x16
+,0xcc,0xe2,0xcd,0xae,0xa4,0x3d,0x62,0x92
+,0x06,0x95,0x26,0xbf,0xdf,0xb9,0xe4,0x20
+,0xa6,0x73,0x6a,0xc1,0xbe,0xf7,0x94,0x44
+,0xd6,0x4d,0x6f,0x2a,0x0b,0x6b,0x18,0x4d
+,0x74,0x10,0x36,0x68,0x6a,0x5a,0xc1,0x6a
+,0xa7,0xdd,0x36,0x29,0x8c,0xb8,0x30,0x8b
+,0x4f,0x21,0x3f,0x00,0x2e,0x54,0x30,0x07
+,0x3a,0xba,0x8a,0xe4,0xc3,0x9e,0xca,0xd8
+,0xb5,0xd8,0x7b,0xce,0x75,0x45,0x66,0x07
+,0xf4,0x6d,0x2d,0xd8,0x7a,0xca,0xe9,0x89
+,0x8a,0xf2,0x23,0xd8,0x2f,0xcb,0x6e,0x00
+,0x36,0x4f,0xfb,0xf0,0x2f,0x01,0xcc,0x0f
+,0xc0,0x22,0x65,0xf4,0xab,0xe2,0x4e,0x61
+,0x2d,0x03,0x82,0x7d,0x91,0x16,0xb5,0x30
+,0xd5,0x14,0xde,0x5e,0xc7,0x90,0xfc,0xa1
+,0xfc,0xab,0x10,0xaf,0x5c,0x6b,0x70,0xa7
+,0x07,0xef,0x29,0x86,0xe8,0xb2,0x25,0xc7
+,0x20,0xff,0x26,0xdd,0x77,0xef,0x79,0x44
+,0x14,0xc4,0xbd,0xdd,0x3b,0xc5,0x03,0x9b
+,0x77,0x23,0xec,0xa0,0xec,0xbb,0x5a,0x39
+,0xb5,0xcc,0xad,0x06};
+const unsigned int NptTlsTrustAnchor_Base_0036_Size = 900;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0037.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0037.cpp
new file mode 100644
index 0000000..4286e7b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0037.cpp
@@ -0,0 +1,168 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* AddTrust Low-Value Services Root */
+const unsigned char NptTlsTrustAnchor_Base_0037_Data[1052] = {
+0x30,0x82,0x04,0x18,0x30,0x82,0x03,0x00
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x65,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14
+,0x30,0x12,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0b,0x41,0x64,0x64,0x54,0x72,0x75,0x73
+,0x74,0x20,0x41,0x42,0x31,0x1d,0x30,0x1b
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x14,0x41
+,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20
+,0x54,0x54,0x50,0x20,0x4e,0x65,0x74,0x77
+,0x6f,0x72,0x6b,0x31,0x21,0x30,0x1f,0x06
+,0x03,0x55,0x04,0x03,0x13,0x18,0x41,0x64
+,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x43
+,0x6c,0x61,0x73,0x73,0x20,0x31,0x20,0x43
+,0x41,0x20,0x52,0x6f,0x6f,0x74,0x30,0x1e
+,0x17,0x0d,0x30,0x30,0x30,0x35,0x33,0x30
+,0x31,0x30,0x33,0x38,0x33,0x31,0x5a,0x17
+,0x0d,0x32,0x30,0x30,0x35,0x33,0x30,0x31
+,0x30,0x33,0x38,0x33,0x31,0x5a,0x30,0x65
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x53,0x45,0x31,0x14,0x30
+,0x12,0x06,0x03,0x55,0x04,0x0a,0x13,0x0b
+,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74
+,0x20,0x41,0x42,0x31,0x1d,0x30,0x1b,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x14,0x41,0x64
+,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x54
+,0x54,0x50,0x20,0x4e,0x65,0x74,0x77,0x6f
+,0x72,0x6b,0x31,0x21,0x30,0x1f,0x06,0x03
+,0x55,0x04,0x03,0x13,0x18,0x41,0x64,0x64
+,0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x6c
+,0x61,0x73,0x73,0x20,0x31,0x20,0x43,0x41
+,0x20,0x52,0x6f,0x6f,0x74,0x30,0x82,0x01
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01
+,0x0a,0x02,0x82,0x01,0x01,0x00,0x96,0x96
+,0xd4,0x21,0x49,0x60,0xe2,0x6b,0xe8,0x41
+,0x07,0x0c,0xde,0xc4,0xe0,0xdc,0x13,0x23
+,0xcd,0xc1,0x35,0xc7,0xfb,0xd6,0x4e,0x11
+,0x0a,0x67,0x5e,0xf5,0x06,0x5b,0x6b,0xa5
+,0x08,0x3b,0x5b,0x29,0x16,0x3a,0xe7,0x87
+,0xb2,0x34,0x06,0xc5,0xbc,0x05,0xa5,0x03
+,0x7c,0x82,0xcb,0x29,0x10,0xae,0xe1,0x88
+,0x81,0xbd,0xd6,0x9e,0xd3,0xfe,0x2d,0x56
+,0xc1,0x15,0xce,0xe3,0x26,0x9d,0x15,0x2e
+,0x10,0xfb,0x06,0x8f,0x30,0x04,0xde,0xa7
+,0xb4,0x63,0xb4,0xff,0xb1,0x9c,0xae,0x3c
+,0xaf,0x77,0xb6,0x56,0xc5,0xb5,0xab,0xa2
+,0xe9,0x69,0x3a,0x3d,0x0e,0x33,0x79,0x32
+,0x3f,0x70,0x82,0x92,0x99,0x61,0x6d,0x8d
+,0x30,0x08,0x8f,0x71,0x3f,0xa6,0x48,0x57
+,0x19,0xf8,0x25,0xdc,0x4b,0x66,0x5c,0xa5
+,0x74,0x8f,0x98,0xae,0xc8,0xf9,0xc0,0x06
+,0x22,0xe7,0xac,0x73,0xdf,0xa5,0x2e,0xfb
+,0x52,0xdc,0xb1,0x15,0x65,0x20,0xfa,0x35
+,0x66,0x69,0xde,0xdf,0x2c,0xf1,0x6e,0xbc
+,0x30,0xdb,0x2c,0x24,0x12,0xdb,0xeb,0x35
+,0x35,0x68,0x90,0xcb,0x00,0xb0,0x97,0x21
+,0x3d,0x74,0x21,0x23,0x65,0x34,0x2b,0xbb
+,0x78,0x59,0xa3,0xd6,0xe1,0x76,0x39,0x9a
+,0xa4,0x49,0x8e,0x8c,0x74,0xaf,0x6e,0xa4
+,0x9a,0xa3,0xd9,0x9b,0xd2,0x38,0x5c,0x9b
+,0xa2,0x18,0xcc,0x75,0x23,0x84,0xbe,0xeb
+,0xe2,0x4d,0x33,0x71,0x8e,0x1a,0xf0,0xc2
+,0xf8,0xc7,0x1d,0xa2,0xad,0x03,0x97,0x2c
+,0xf8,0xcf,0x25,0xc6,0xf6,0xb8,0x24,0x31
+,0xb1,0x63,0x5d,0x92,0x7f,0x63,0xf0,0x25
+,0xc9,0x53,0x2e,0x1f,0xbf,0x4d,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x81,0xd2,0x30,0x81
+,0xcf,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0x95,0xb1,0xb4,0xf0
+,0x94,0xb6,0xbd,0xc7,0xda,0xd1,0x11,0x09
+,0x21,0xbe,0xc1,0xaf,0x49,0xfd,0x10,0x7b
+,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04
+,0x04,0x03,0x02,0x01,0x06,0x30,0x0f,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x81
+,0x8f,0x06,0x03,0x55,0x1d,0x23,0x04,0x81
+,0x87,0x30,0x81,0x84,0x80,0x14,0x95,0xb1
+,0xb4,0xf0,0x94,0xb6,0xbd,0xc7,0xda,0xd1
+,0x11,0x09,0x21,0xbe,0xc1,0xaf,0x49,0xfd
+,0x10,0x7b,0xa1,0x69,0xa4,0x67,0x30,0x65
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x53,0x45,0x31,0x14,0x30
+,0x12,0x06,0x03,0x55,0x04,0x0a,0x13,0x0b
+,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74
+,0x20,0x41,0x42,0x31,0x1d,0x30,0x1b,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x14,0x41,0x64
+,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x54
+,0x54,0x50,0x20,0x4e,0x65,0x74,0x77,0x6f
+,0x72,0x6b,0x31,0x21,0x30,0x1f,0x06,0x03
+,0x55,0x04,0x03,0x13,0x18,0x41,0x64,0x64
+,0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x6c
+,0x61,0x73,0x73,0x20,0x31,0x20,0x43,0x41
+,0x20,0x52,0x6f,0x6f,0x74,0x82,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x2c,0x6d,0x64,0x1b
+,0x1f,0xcd,0x0d,0xdd,0xb9,0x01,0xfa,0x96
+,0x63,0x34,0x32,0x48,0x47,0x99,0xae,0x97
+,0xed,0xfd,0x72,0x16,0xa6,0x73,0x47,0x5a
+,0xf4,0xeb,0xdd,0xe9,0xf5,0xd6,0xfb,0x45
+,0xcc,0x29,0x89,0x44,0x5d,0xbf,0x46,0x39
+,0x3d,0xe8,0xee,0xbc,0x4d,0x54,0x86,0x1e
+,0x1d,0x6c,0xe3,0x17,0x27,0x43,0xe1,0x89
+,0x56,0x2b,0xa9,0x6f,0x72,0x4e,0x49,0x33
+,0xe3,0x72,0x7c,0x2a,0x23,0x9a,0xbc,0x3e
+,0xff,0x28,0x2a,0xed,0xa3,0xff,0x1c,0x23
+,0xba,0x43,0x57,0x09,0x67,0x4d,0x4b,0x62
+,0x06,0x2d,0xf8,0xff,0x6c,0x9d,0x60,0x1e
+,0xd8,0x1c,0x4b,0x7d,0xb5,0x31,0x2f,0xd9
+,0xd0,0x7c,0x5d,0xf8,0xde,0x6b,0x83,0x18
+,0x78,0x37,0x57,0x2f,0xe8,0x33,0x07,0x67
+,0xdf,0x1e,0xc7,0x6b,0x2a,0x95,0x76,0xae
+,0x8f,0x57,0xa3,0xf0,0xf4,0x52,0xb4,0xa9
+,0x53,0x08,0xcf,0xe0,0x4f,0xd3,0x7a,0x53
+,0x8b,0xfd,0xbb,0x1c,0x56,0x36,0xf2,0xfe
+,0xb2,0xb6,0xe5,0x76,0xbb,0xd5,0x22,0x65
+,0xa7,0x3f,0xfe,0xd1,0x66,0xad,0x0b,0xbc
+,0x6b,0x99,0x86,0xef,0x3f,0x7d,0xf3,0x18
+,0x32,0xca,0x7b,0xc6,0xe3,0xab,0x64,0x46
+,0x95,0xf8,0x26,0x69,0xd9,0x55,0x83,0x7b
+,0x2c,0x96,0x07,0xff,0x59,0x2c,0x44,0xa3
+,0xc6,0xe5,0xe9,0xa9,0xdc,0xa1,0x63,0x80
+,0x5a,0x21,0x5e,0x21,0xcf,0x53,0x54,0xf0
+,0xba,0x6f,0x89,0xdb,0xa8,0xaa,0x95,0xcf
+,0x8b,0xe3,0x71,0xcc,0x1e,0x1b,0x20,0x44
+,0x08,0xc0,0x7a,0xb6,0x40,0xfd,0xc4,0xe4
+,0x35,0xe1,0x1d,0x16,0x1c,0xd0,0xbc,0x2b
+,0x8e,0xd6,0x71,0xd9};
+const unsigned int NptTlsTrustAnchor_Base_0037_Size = 1052;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0038.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0038.cpp
new file mode 100644
index 0000000..0f65bc2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0038.cpp
@@ -0,0 +1,172 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* AddTrust External Root */
+const unsigned char NptTlsTrustAnchor_Base_0038_Data[1082] = {
+0x30,0x82,0x04,0x36,0x30,0x82,0x03,0x1e
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x6f,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14
+,0x30,0x12,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0b,0x41,0x64,0x64,0x54,0x72,0x75,0x73
+,0x74,0x20,0x41,0x42,0x31,0x26,0x30,0x24
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x41
+,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20
+,0x45,0x78,0x74,0x65,0x72,0x6e,0x61,0x6c
+,0x20,0x54,0x54,0x50,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x22,0x30,0x20
+,0x06,0x03,0x55,0x04,0x03,0x13,0x19,0x41
+,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20
+,0x45,0x78,0x74,0x65,0x72,0x6e,0x61,0x6c
+,0x20,0x43,0x41,0x20,0x52,0x6f,0x6f,0x74
+,0x30,0x1e,0x17,0x0d,0x30,0x30,0x30,0x35
+,0x33,0x30,0x31,0x30,0x34,0x38,0x33,0x38
+,0x5a,0x17,0x0d,0x32,0x30,0x30,0x35,0x33
+,0x30,0x31,0x30,0x34,0x38,0x33,0x38,0x5a
+,0x30,0x6f,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31
+,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0b,0x41,0x64,0x64,0x54,0x72,0x75
+,0x73,0x74,0x20,0x41,0x42,0x31,0x26,0x30
+,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d
+,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74
+,0x20,0x45,0x78,0x74,0x65,0x72,0x6e,0x61
+,0x6c,0x20,0x54,0x54,0x50,0x20,0x4e,0x65
+,0x74,0x77,0x6f,0x72,0x6b,0x31,0x22,0x30
+,0x20,0x06,0x03,0x55,0x04,0x03,0x13,0x19
+,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74
+,0x20,0x45,0x78,0x74,0x65,0x72,0x6e,0x61
+,0x6c,0x20,0x43,0x41,0x20,0x52,0x6f,0x6f
+,0x74,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xb7,0xf7,0x1a,0x33,0xe6,0xf2
+,0x00,0x04,0x2d,0x39,0xe0,0x4e,0x5b,0xed
+,0x1f,0xbc,0x6c,0x0f,0xcd,0xb5,0xfa,0x23
+,0xb6,0xce,0xde,0x9b,0x11,0x33,0x97,0xa4
+,0x29,0x4c,0x7d,0x93,0x9f,0xbd,0x4a,0xbc
+,0x93,0xed,0x03,0x1a,0xe3,0x8f,0xcf,0xe5
+,0x6d,0x50,0x5a,0xd6,0x97,0x29,0x94,0x5a
+,0x80,0xb0,0x49,0x7a,0xdb,0x2e,0x95,0xfd
+,0xb8,0xca,0xbf,0x37,0x38,0x2d,0x1e,0x3e
+,0x91,0x41,0xad,0x70,0x56,0xc7,0xf0,0x4f
+,0x3f,0xe8,0x32,0x9e,0x74,0xca,0xc8,0x90
+,0x54,0xe9,0xc6,0x5f,0x0f,0x78,0x9d,0x9a
+,0x40,0x3c,0x0e,0xac,0x61,0xaa,0x5e,0x14
+,0x8f,0x9e,0x87,0xa1,0x6a,0x50,0xdc,0xd7
+,0x9a,0x4e,0xaf,0x05,0xb3,0xa6,0x71,0x94
+,0x9c,0x71,0xb3,0x50,0x60,0x0a,0xc7,0x13
+,0x9d,0x38,0x07,0x86,0x02,0xa8,0xe9,0xa8
+,0x69,0x26,0x18,0x90,0xab,0x4c,0xb0,0x4f
+,0x23,0xab,0x3a,0x4f,0x84,0xd8,0xdf,0xce
+,0x9f,0xe1,0x69,0x6f,0xbb,0xd7,0x42,0xd7
+,0x6b,0x44,0xe4,0xc7,0xad,0xee,0x6d,0x41
+,0x5f,0x72,0x5a,0x71,0x08,0x37,0xb3,0x79
+,0x65,0xa4,0x59,0xa0,0x94,0x37,0xf7,0x00
+,0x2f,0x0d,0xc2,0x92,0x72,0xda,0xd0,0x38
+,0x72,0xdb,0x14,0xa8,0x45,0xc4,0x5d,0x2a
+,0x7d,0xb7,0xb4,0xd6,0xc4,0xee,0xac,0xcd
+,0x13,0x44,0xb7,0xc9,0x2b,0xdd,0x43,0x00
+,0x25,0xfa,0x61,0xb9,0x69,0x6a,0x58,0x23
+,0x11,0xb7,0xa7,0x33,0x8f,0x56,0x75,0x59
+,0xf5,0xcd,0x29,0xd7,0x46,0xb7,0x0a,0x2b
+,0x65,0xb6,0xd3,0x42,0x6f,0x15,0xb2,0xb8
+,0x7b,0xfb,0xef,0xe9,0x5d,0x53,0xd5,0x34
+,0x5a,0x27,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x81,0xdc,0x30,0x81,0xd9,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0xad,0xbd,0x98,0x7a,0x34,0xb4,0x26,0xf7
+,0xfa,0xc4,0x26,0x54,0xef,0x03,0xbd,0xe0
+,0x24,0xcb,0x54,0x1a,0x30,0x0b,0x06,0x03
+,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x81,0x99,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x81,0x91,0x30,0x81,0x8e
+,0x80,0x14,0xad,0xbd,0x98,0x7a,0x34,0xb4
+,0x26,0xf7,0xfa,0xc4,0x26,0x54,0xef,0x03
+,0xbd,0xe0,0x24,0xcb,0x54,0x1a,0xa1,0x73
+,0xa4,0x71,0x30,0x6f,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53
+,0x45,0x31,0x14,0x30,0x12,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0b,0x41,0x64,0x64,0x54
+,0x72,0x75,0x73,0x74,0x20,0x41,0x42,0x31
+,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x1d,0x41,0x64,0x64,0x54,0x72,0x75
+,0x73,0x74,0x20,0x45,0x78,0x74,0x65,0x72
+,0x6e,0x61,0x6c,0x20,0x54,0x54,0x50,0x20
+,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b,0x31
+,0x22,0x30,0x20,0x06,0x03,0x55,0x04,0x03
+,0x13,0x19,0x41,0x64,0x64,0x54,0x72,0x75
+,0x73,0x74,0x20,0x45,0x78,0x74,0x65,0x72
+,0x6e,0x61,0x6c,0x20,0x43,0x41,0x20,0x52
+,0x6f,0x6f,0x74,0x82,0x01,0x01,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01
+,0x01,0x00,0xb0,0x9b,0xe0,0x85,0x25,0xc2
+,0xd6,0x23,0xe2,0x0f,0x96,0x06,0x92,0x9d
+,0x41,0x98,0x9c,0xd9,0x84,0x79,0x81,0xd9
+,0x1e,0x5b,0x14,0x07,0x23,0x36,0x65,0x8f
+,0xb0,0xd8,0x77,0xbb,0xac,0x41,0x6c,0x47
+,0x60,0x83,0x51,0xb0,0xf9,0x32,0x3d,0xe7
+,0xfc,0xf6,0x26,0x13,0xc7,0x80,0x16,0xa5
+,0xbf,0x5a,0xfc,0x87,0xcf,0x78,0x79,0x89
+,0x21,0x9a,0xe2,0x4c,0x07,0x0a,0x86,0x35
+,0xbc,0xf2,0xde,0x51,0xc4,0xd2,0x96,0xb7
+,0xdc,0x7e,0x4e,0xee,0x70,0xfd,0x1c,0x39
+,0xeb,0x0c,0x02,0x51,0x14,0x2d,0x8e,0xbd
+,0x16,0xe0,0xc1,0xdf,0x46,0x75,0xe7,0x24
+,0xad,0xec,0xf4,0x42,0xb4,0x85,0x93,0x70
+,0x10,0x67,0xba,0x9d,0x06,0x35,0x4a,0x18
+,0xd3,0x2b,0x7a,0xcc,0x51,0x42,0xa1,0x7a
+,0x63,0xd1,0xe6,0xbb,0xa1,0xc5,0x2b,0xc2
+,0x36,0xbe,0x13,0x0d,0xe6,0xbd,0x63,0x7e
+,0x79,0x7b,0xa7,0x09,0x0d,0x40,0xab,0x6a
+,0xdd,0x8f,0x8a,0xc3,0xf6,0xf6,0x8c,0x1a
+,0x42,0x05,0x51,0xd4,0x45,0xf5,0x9f,0xa7
+,0x62,0x21,0x68,0x15,0x20,0x43,0x3c,0x99
+,0xe7,0x7c,0xbd,0x24,0xd8,0xa9,0x91,0x17
+,0x73,0x88,0x3f,0x56,0x1b,0x31,0x38,0x18
+,0xb4,0x71,0x0f,0x9a,0xcd,0xc8,0x0e,0x9e
+,0x8e,0x2e,0x1b,0xe1,0x8c,0x98,0x83,0xcb
+,0x1f,0x31,0xf1,0x44,0x4c,0xc6,0x04,0x73
+,0x49,0x76,0x60,0x0f,0xc7,0xf8,0xbd,0x17
+,0x80,0x6b,0x2e,0xe9,0xcc,0x4c,0x0e,0x5a
+,0x9a,0x79,0x0f,0x20,0x0a,0x2e,0xd5,0x9e
+,0x63,0x26,0x1e,0x55,0x92,0x94,0xd8,0x82
+,0x17,0x5a,0x7b,0xd0,0xbc,0xc7,0x8f,0x4e
+,0x86,0x04};
+const unsigned int NptTlsTrustAnchor_Base_0038_Size = 1082;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0039.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0039.cpp
new file mode 100644
index 0000000..299ad4f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0039.cpp
@@ -0,0 +1,168 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* AddTrust Public Services Root */
+const unsigned char NptTlsTrustAnchor_Base_0039_Data[1049] = {
+0x30,0x82,0x04,0x15,0x30,0x82,0x02,0xfd
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x64,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14
+,0x30,0x12,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0b,0x41,0x64,0x64,0x54,0x72,0x75,0x73
+,0x74,0x20,0x41,0x42,0x31,0x1d,0x30,0x1b
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x14,0x41
+,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20
+,0x54,0x54,0x50,0x20,0x4e,0x65,0x74,0x77
+,0x6f,0x72,0x6b,0x31,0x20,0x30,0x1e,0x06
+,0x03,0x55,0x04,0x03,0x13,0x17,0x41,0x64
+,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x50
+,0x75,0x62,0x6c,0x69,0x63,0x20,0x43,0x41
+,0x20,0x52,0x6f,0x6f,0x74,0x30,0x1e,0x17
+,0x0d,0x30,0x30,0x30,0x35,0x33,0x30,0x31
+,0x30,0x34,0x31,0x35,0x30,0x5a,0x17,0x0d
+,0x32,0x30,0x30,0x35,0x33,0x30,0x31,0x30
+,0x34,0x31,0x35,0x30,0x5a,0x30,0x64,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x53,0x45,0x31,0x14,0x30,0x12
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x0b,0x41
+,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20
+,0x41,0x42,0x31,0x1d,0x30,0x1b,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x14,0x41,0x64,0x64
+,0x54,0x72,0x75,0x73,0x74,0x20,0x54,0x54
+,0x50,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x31,0x20,0x30,0x1e,0x06,0x03,0x55
+,0x04,0x03,0x13,0x17,0x41,0x64,0x64,0x54
+,0x72,0x75,0x73,0x74,0x20,0x50,0x75,0x62
+,0x6c,0x69,0x63,0x20,0x43,0x41,0x20,0x52
+,0x6f,0x6f,0x74,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xe9,0x1a,0x30,0x8f
+,0x83,0x88,0x14,0xc1,0x20,0xd8,0x3c,0x9b
+,0x8f,0x1b,0x7e,0x03,0x74,0xbb,0xda,0x69
+,0xd3,0x46,0xa5,0xf8,0x8e,0xc2,0x0c,0x11
+,0x90,0x51,0xa5,0x2f,0x66,0x54,0x40,0x55
+,0xea,0xdb,0x1f,0x4a,0x56,0xee,0x9f,0x23
+,0x6e,0xf4,0x39,0xcb,0xa1,0xb9,0x6f,0xf2
+,0x7e,0xf9,0x5d,0x87,0x26,0x61,0x9e,0x1c
+,0xf8,0xe2,0xec,0xa6,0x81,0xf8,0x21,0xc5
+,0x24,0xcc,0x11,0x0c,0x3f,0xdb,0x26,0x72
+,0x7a,0xc7,0x01,0x97,0x07,0x17,0xf9,0xd7
+,0x18,0x2c,0x30,0x7d,0x0e,0x7a,0x1e,0x62
+,0x1e,0xc6,0x4b,0xc0,0xfd,0x7d,0x62,0x77
+,0xd3,0x44,0x1e,0x27,0xf6,0x3f,0x4b,0x44
+,0xb3,0xb7,0x38,0xd9,0x39,0x1f,0x60,0xd5
+,0x51,0x92,0x73,0x03,0xb4,0x00,0x69,0xe3
+,0xf3,0x14,0x4e,0xee,0xd1,0xdc,0x09,0xcf
+,0x77,0x34,0x46,0x50,0xb0,0xf8,0x11,0xf2
+,0xfe,0x38,0x79,0xf7,0x07,0x39,0xfe,0x51
+,0x92,0x97,0x0b,0x5b,0x08,0x5f,0x34,0x86
+,0x01,0xad,0x88,0x97,0xeb,0x66,0xcd,0x5e
+,0xd1,0xff,0xdc,0x7d,0xf2,0x84,0xda,0xba
+,0x77,0xad,0xdc,0x80,0x08,0xc7,0xa7,0x87
+,0xd6,0x55,0x9f,0x97,0x6a,0xe8,0xc8,0x11
+,0x64,0xba,0xe7,0x19,0x29,0x3f,0x11,0xb3
+,0x78,0x90,0x84,0x20,0x52,0x5b,0x11,0xef
+,0x78,0xd0,0x83,0xf6,0xd5,0x48,0x90,0xd0
+,0x30,0x1c,0xcf,0x80,0xf9,0x60,0xfe,0x79
+,0xe4,0x88,0xf2,0xdd,0x00,0xeb,0x94,0x45
+,0xeb,0x65,0x94,0x69,0x40,0xba,0xc0,0xd5
+,0xb4,0xb8,0xba,0x7d,0x04,0x11,0xa8,0xeb
+,0x31,0x05,0x96,0x94,0x4e,0x58,0x21,0x8e
+,0x9f,0xd0,0x60,0xfd,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x81,0xd1,0x30,0x81,0xce,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0x81,0x3e,0x37,0xd8,0x92,0xb0
+,0x1f,0x77,0x9f,0x5c,0xb4,0xab,0x73,0xaa
+,0xe7,0xf6,0x34,0x60,0x2f,0xfa,0x30,0x0b
+,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x81,0x8e,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x81,0x86,0x30
+,0x81,0x83,0x80,0x14,0x81,0x3e,0x37,0xd8
+,0x92,0xb0,0x1f,0x77,0x9f,0x5c,0xb4,0xab
+,0x73,0xaa,0xe7,0xf6,0x34,0x60,0x2f,0xfa
+,0xa1,0x68,0xa4,0x66,0x30,0x64,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x53,0x45,0x31,0x14,0x30,0x12,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x0b,0x41,0x64
+,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x41
+,0x42,0x31,0x1d,0x30,0x1b,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x14,0x41,0x64,0x64,0x54
+,0x72,0x75,0x73,0x74,0x20,0x54,0x54,0x50
+,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b
+,0x31,0x20,0x30,0x1e,0x06,0x03,0x55,0x04
+,0x03,0x13,0x17,0x41,0x64,0x64,0x54,0x72
+,0x75,0x73,0x74,0x20,0x50,0x75,0x62,0x6c
+,0x69,0x63,0x20,0x43,0x41,0x20,0x52,0x6f
+,0x6f,0x74,0x82,0x01,0x01,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0x03,0xf7,0x15,0x4a,0xf8,0x24,0xda
+,0x23,0x56,0x16,0x93,0x76,0xdd,0x36,0x28
+,0xb9,0xae,0x1b,0xb8,0xc3,0xf1,0x64,0xba
+,0x20,0x18,0x78,0x95,0x29,0x27,0x57,0x05
+,0xbc,0x7c,0x2a,0xf4,0xb9,0x51,0x55,0xda
+,0x87,0x02,0xde,0x0f,0x16,0x17,0x31,0xf8
+,0xaa,0x79,0x2e,0x09,0x13,0xbb,0xaf,0xb2
+,0x20,0x19,0x12,0xe5,0x93,0xf9,0x4b,0xf9
+,0x83,0xe8,0x44,0xd5,0xb2,0x41,0x25,0xbf
+,0x88,0x75,0x6f,0xff,0x10,0xfc,0x4a,0x54
+,0xd0,0x5f,0xf0,0xfa,0xef,0x36,0x73,0x7d
+,0x1b,0x36,0x45,0xc6,0x21,0x6d,0xb4,0x15
+,0xb8,0x4e,0xcf,0x9c,0x5c,0xa5,0x3d,0x5a
+,0x00,0x8e,0x06,0xe3,0x3c,0x6b,0x32,0x7b
+,0xf2,0x9f,0xf0,0xb6,0xfd,0xdf,0xf0,0x28
+,0x18,0x48,0xf0,0xc6,0xbc,0xd0,0xbf,0x34
+,0x80,0x96,0xc2,0x4a,0xb1,0x6d,0x8e,0xc7
+,0x90,0x45,0xde,0x2f,0x67,0xac,0x45,0x04
+,0xa3,0x7a,0xdc,0x55,0x92,0xc9,0x47,0x66
+,0xd8,0x1a,0x8c,0xc7,0xed,0x9c,0x4e,0x9a
+,0xe0,0x12,0xbb,0xb5,0x6a,0x4c,0x84,0xe1
+,0xe1,0x22,0x0d,0x87,0x00,0x64,0xfe,0x8c
+,0x7d,0x62,0x39,0x65,0xa6,0xef,0x42,0xb6
+,0x80,0x25,0x12,0x61,0x01,0xa8,0x24,0x13
+,0x70,0x00,0x11,0x26,0x5f,0xfa,0x35,0x50
+,0xc5,0x48,0xcc,0x06,0x47,0xe8,0x27,0xd8
+,0x70,0x8d,0x5f,0x64,0xe6,0xa1,0x44,0x26
+,0x5e,0x22,0xec,0x92,0xcd,0xff,0x42,0x9a
+,0x44,0x21,0x6d,0x5c,0xc5,0xe3,0x22,0x1d
+,0x5f,0x47,0x12,0xe7,0xce,0x5f,0x5d,0xfa
+,0xd8,0xaa,0xb1,0x33,0x2d,0xd9,0x76,0xf2
+,0x4e,0x3a,0x33,0x0c,0x2b,0xb3,0x2d,0x90
+,0x06};
+const unsigned int NptTlsTrustAnchor_Base_0039_Size = 1049;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0040.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0040.cpp
new file mode 100644
index 0000000..e722d1b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0040.cpp
@@ -0,0 +1,169 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* AddTrust Qualified Certificates Root */
+const unsigned char NptTlsTrustAnchor_Base_0040_Data[1058] = {
+0x30,0x82,0x04,0x1e,0x30,0x82,0x03,0x06
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x67,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14
+,0x30,0x12,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0b,0x41,0x64,0x64,0x54,0x72,0x75,0x73
+,0x74,0x20,0x41,0x42,0x31,0x1d,0x30,0x1b
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x14,0x41
+,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20
+,0x54,0x54,0x50,0x20,0x4e,0x65,0x74,0x77
+,0x6f,0x72,0x6b,0x31,0x23,0x30,0x21,0x06
+,0x03,0x55,0x04,0x03,0x13,0x1a,0x41,0x64
+,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x51
+,0x75,0x61,0x6c,0x69,0x66,0x69,0x65,0x64
+,0x20,0x43,0x41,0x20,0x52,0x6f,0x6f,0x74
+,0x30,0x1e,0x17,0x0d,0x30,0x30,0x30,0x35
+,0x33,0x30,0x31,0x30,0x34,0x34,0x35,0x30
+,0x5a,0x17,0x0d,0x32,0x30,0x30,0x35,0x33
+,0x30,0x31,0x30,0x34,0x34,0x35,0x30,0x5a
+,0x30,0x67,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31
+,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0b,0x41,0x64,0x64,0x54,0x72,0x75
+,0x73,0x74,0x20,0x41,0x42,0x31,0x1d,0x30
+,0x1b,0x06,0x03,0x55,0x04,0x0b,0x13,0x14
+,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74
+,0x20,0x54,0x54,0x50,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x23,0x30,0x21
+,0x06,0x03,0x55,0x04,0x03,0x13,0x1a,0x41
+,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20
+,0x51,0x75,0x61,0x6c,0x69,0x66,0x69,0x65
+,0x64,0x20,0x43,0x41,0x20,0x52,0x6f,0x6f
+,0x74,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xe4,0x1e,0x9a,0xfe,0xdc,0x09
+,0x5a,0x87,0xa4,0x9f,0x47,0xbe,0x11,0x5f
+,0xaf,0x84,0x34,0xdb,0x62,0x3c,0x79,0x78
+,0xb7,0xe9,0x30,0xb5,0xec,0x0c,0x1c,0x2a
+,0xc4,0x16,0xff,0xe0,0xec,0x71,0xeb,0x8a
+,0xf5,0x11,0x6e,0xed,0x4f,0x0d,0x91,0xd2
+,0x12,0x18,0x2d,0x49,0x15,0x01,0xc2,0xa4
+,0x22,0x13,0xc7,0x11,0x64,0xff,0x22,0x12
+,0x9a,0xb9,0x8e,0x5c,0x2f,0x08,0xcf,0x71
+,0x6a,0xb3,0x67,0x01,0x59,0xf1,0x5d,0x46
+,0xf3,0xb0,0x78,0xa5,0xf6,0x0e,0x42,0x7a
+,0xe3,0x7f,0x1b,0xcc,0xd0,0xf0,0xb7,0x28
+,0xfd,0x2a,0xea,0x9e,0xb3,0xb0,0xb9,0x04
+,0xaa,0xfd,0xf6,0xc7,0xb4,0xb1,0xb8,0x2a
+,0xa0,0xfb,0x58,0xf1,0x19,0xa0,0x6f,0x70
+,0x25,0x7e,0x3e,0x69,0x4a,0x7f,0x0f,0x22
+,0xd8,0xef,0xad,0x08,0x11,0x9a,0x29,0x99
+,0xe1,0xaa,0x44,0x45,0x9a,0x12,0x5e,0x3e
+,0x9d,0x6d,0x52,0xfc,0xe7,0xa0,0x3d,0x68
+,0x2f,0xf0,0x4b,0x70,0x7c,0x13,0x38,0xad
+,0xbc,0x15,0x25,0xf1,0xd6,0xce,0xab,0xa2
+,0xc0,0x31,0xd6,0x2f,0x9f,0xe0,0xff,0x14
+,0x59,0xfc,0x84,0x93,0xd9,0x87,0x7c,0x4c
+,0x54,0x13,0xeb,0x9f,0xd1,0x2d,0x11,0xf8
+,0x18,0x3a,0x3a,0xde,0x25,0xd9,0xf7,0xd3
+,0x40,0xed,0xa4,0x06,0x12,0xc4,0x3b,0xe1
+,0x91,0xc1,0x56,0x35,0xf0,0x14,0xdc,0x65
+,0x36,0x09,0x6e,0xab,0xa4,0x07,0xc7,0x35
+,0xd1,0xc2,0x03,0x33,0x36,0x5b,0x75,0x26
+,0x6d,0x42,0xf1,0x12,0x6b,0x43,0x6f,0x4b
+,0x71,0x94,0xfa,0x34,0x1d,0xed,0x13,0x6e
+,0xca,0x80,0x7f,0x98,0x2f,0x6c,0xb9,0x65
+,0xd8,0xe9,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x81,0xd4,0x30,0x81,0xd1,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0x39,0x95,0x8b,0x62,0x8b,0x5c,0xc9,0xd4
+,0x80,0xba,0x58,0x0f,0x97,0x3f,0x15,0x08
+,0x43,0xcc,0x98,0xa7,0x30,0x0b,0x06,0x03
+,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x81,0x91,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x81,0x89,0x30,0x81,0x86
+,0x80,0x14,0x39,0x95,0x8b,0x62,0x8b,0x5c
+,0xc9,0xd4,0x80,0xba,0x58,0x0f,0x97,0x3f
+,0x15,0x08,0x43,0xcc,0x98,0xa7,0xa1,0x6b
+,0xa4,0x69,0x30,0x67,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53
+,0x45,0x31,0x14,0x30,0x12,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0b,0x41,0x64,0x64,0x54
+,0x72,0x75,0x73,0x74,0x20,0x41,0x42,0x31
+,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x14,0x41,0x64,0x64,0x54,0x72,0x75
+,0x73,0x74,0x20,0x54,0x54,0x50,0x20,0x4e
+,0x65,0x74,0x77,0x6f,0x72,0x6b,0x31,0x23
+,0x30,0x21,0x06,0x03,0x55,0x04,0x03,0x13
+,0x1a,0x41,0x64,0x64,0x54,0x72,0x75,0x73
+,0x74,0x20,0x51,0x75,0x61,0x6c,0x69,0x66
+,0x69,0x65,0x64,0x20,0x43,0x41,0x20,0x52
+,0x6f,0x6f,0x74,0x82,0x01,0x01,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01
+,0x01,0x00,0x19,0xab,0x75,0xea,0xf8,0x8b
+,0x65,0x61,0x95,0x13,0xba,0x69,0x04,0xef
+,0x86,0xca,0x13,0xa0,0xc7,0xaa,0x4f,0x64
+,0x1b,0x3f,0x18,0xf6,0xa8,0x2d,0x2c,0x55
+,0x8f,0x05,0xb7,0x30,0xea,0x42,0x6a,0x1d
+,0xc0,0x25,0x51,0x2d,0xa7,0xbf,0x0c,0xb3
+,0xed,0xef,0x08,0x7f,0x6c,0x3c,0x46,0x1a
+,0xea,0x18,0x43,0xdf,0x76,0xcc,0xf9,0x66
+,0x86,0x9c,0x2c,0x68,0xf5,0xe9,0x17,0xf8
+,0x31,0xb3,0x18,0xc4,0xd6,0x48,0x7d,0x23
+,0x4c,0x68,0xc1,0x7e,0xbb,0x01,0x14,0x6f
+,0xc5,0xd9,0x6e,0xde,0xbb,0x04,0x42,0x6a
+,0xf8,0xf6,0x5c,0x7d,0xe5,0xda,0xfa,0x87
+,0xeb,0x0d,0x35,0x52,0x67,0xd0,0x9e,0x97
+,0x76,0x05,0x93,0x3f,0x95,0xc7,0x01,0xe6
+,0x69,0x55,0x38,0x7f,0x10,0x61,0x99,0xc9
+,0xe3,0x5f,0xa6,0xca,0x3e,0x82,0x63,0x48
+,0xaa,0xe2,0x08,0x48,0x3e,0xaa,0xf2,0xb2
+,0x85,0x62,0xa6,0xb4,0xa7,0xd9,0xbd,0x37
+,0x9c,0x68,0xb5,0x2d,0x56,0x7d,0xb0,0xb7
+,0x3f,0xa0,0xb1,0x07,0xd6,0xe9,0x4f,0xdc
+,0xde,0x45,0x71,0x30,0x32,0x7f,0x1b,0x2e
+,0x09,0xf9,0xbf,0x52,0xa1,0xee,0xc2,0x80
+,0x3e,0x06,0x5c,0x2e,0x55,0x40,0xc1,0x1b
+,0xf5,0x70,0x45,0xb0,0xdc,0x5d,0xfa,0xf6
+,0x72,0x5a,0x77,0xd2,0x63,0xcd,0xcf,0x58
+,0x89,0x00,0x42,0x63,0x3f,0x79,0x39,0xd0
+,0x44,0xb0,0x82,0x6e,0x41,0x19,0xe8,0xdd
+,0xe0,0xc1,0x88,0x5a,0xd1,0x1e,0x71,0x93
+,0x1f,0x24,0x30,0x74,0xe5,0x1e,0xa8,0xde
+,0x3c,0x27,0x37,0x7f,0x83,0xae,0x9e,0x77
+,0xcf,0xf0,0x30,0xb1,0xff,0x4b,0x99,0xe8
+,0xc6,0xa1};
+const unsigned int NptTlsTrustAnchor_Base_0040_Size = 1058;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0041.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0041.cpp
new file mode 100644
index 0000000..aa07118
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0041.cpp
@@ -0,0 +1,159 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Verisign Time Stamping Authority CA */
+const unsigned char NptTlsTrustAnchor_Base_0041_Data[977] = {
+0x30,0x82,0x03,0xcd,0x30,0x82,0x03,0x36
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x53
+,0x61,0xb2,0x60,0xae,0xdb,0x71,0x8e,0xa7
+,0x94,0xb3,0x13,0x33,0xf4,0x07,0x09,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0xc1,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17
+,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31
+,0x3c,0x30,0x3a,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x33,0x43,0x6c,0x61,0x73,0x73,0x20
+,0x33,0x20,0x50,0x75,0x62,0x6c,0x69,0x63
+,0x20,0x50,0x72,0x69,0x6d,0x61,0x72,0x79
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79
+,0x20,0x2d,0x20,0x47,0x32,0x31,0x3a,0x30
+,0x38,0x06,0x03,0x55,0x04,0x0b,0x13,0x31
+,0x28,0x63,0x29,0x20,0x31,0x39,0x39,0x38
+,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20
+,0x2d,0x20,0x46,0x6f,0x72,0x20,0x61,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64
+,0x20,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c
+,0x79,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x16,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x20,0x54,0x72,0x75
+,0x73,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f
+,0x72,0x6b,0x30,0x1e,0x17,0x0d,0x30,0x30
+,0x30,0x39,0x32,0x36,0x30,0x30,0x30,0x30
+,0x30,0x30,0x5a,0x17,0x0d,0x31,0x30,0x30
+,0x39,0x32,0x35,0x32,0x33,0x35,0x39,0x35
+,0x39,0x5a,0x30,0x81,0xa5,0x31,0x17,0x30
+,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e
+,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1f
+,0x30,0x1d,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x20,0x54,0x72,0x75,0x73,0x74,0x20
+,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b,0x31
+,0x3b,0x30,0x39,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x32,0x54,0x65,0x72,0x6d,0x73,0x20
+,0x6f,0x66,0x20,0x75,0x73,0x65,0x20,0x61
+,0x74,0x20,0x68,0x74,0x74,0x70,0x73,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76,0x65
+,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63
+,0x6f,0x6d,0x2f,0x72,0x70,0x61,0x20,0x28
+,0x63,0x29,0x30,0x30,0x31,0x2c,0x30,0x2a
+,0x06,0x03,0x55,0x04,0x03,0x13,0x23,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20
+,0x54,0x69,0x6d,0x65,0x20,0x53,0x74,0x61
+,0x6d,0x70,0x69,0x6e,0x67,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x43,0x41,0x30,0x81,0x9f,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x81,0x8d,0x00
+,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xd2
+,0x19,0x9d,0x67,0xc2,0x00,0x21,0x59,0x62
+,0xce,0xb4,0x09,0x22,0x44,0x69,0x8a,0xf8
+,0x25,0x5a,0xdb,0xed,0x0d,0xb7,0x36,0x7e
+,0x4e,0xe0,0xbb,0x94,0x3e,0x90,0x25,0x87
+,0xc2,0x61,0x47,0x29,0xd9,0xbd,0x54,0xb8
+,0x63,0xcc,0x2c,0x7d,0x69,0xb4,0x33,0x36
+,0xf4,0x37,0x07,0x9a,0xc1,0xdd,0x40,0x54
+,0xfc,0xe0,0x78,0x9d,0xa0,0x93,0xb9,0x09
+,0x3d,0x23,0x51,0x7f,0x44,0xc2,0x14,0x74
+,0xdb,0x0a,0xbe,0xcb,0xc9,0x30,0x34,0x40
+,0x98,0x3e,0xd0,0xd7,0x25,0x10,0x81,0x94
+,0xbd,0x07,0x4f,0x9c,0xd6,0x54,0x27,0xdf
+,0x2e,0xa8,0xbf,0xcb,0x90,0x8c,0x8d,0x75
+,0x4b,0xbc,0xe2,0xe8,0x44,0x87,0xcd,0xe6
+,0x41,0x0a,0x25,0x6e,0xe8,0xf4,0x24,0x02
+,0xc5,0x52,0x0f,0x6e,0xec,0x98,0x75,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x81,0xdf,0x30
+,0x81,0xdc,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x04,0x08,0x30,0x06,0x01,0x01,0xff
+,0x02,0x01,0x00,0x30,0x45,0x06,0x03,0x55
+,0x1d,0x20,0x04,0x3e,0x30,0x3c,0x30,0x3a
+,0x06,0x0c,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x45,0x01,0x07,0x17,0x01,0x03,0x30,0x2a
+,0x30,0x28,0x06,0x08,0x2b,0x06,0x01,0x05
+,0x05,0x07,0x02,0x01,0x16,0x1c,0x68,0x74
+,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x76,0x65,0x72,0x69,0x73,0x69
+,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f,0x72
+,0x70,0x61,0x30,0x31,0x06,0x03,0x55,0x1d
+,0x1f,0x04,0x2a,0x30,0x28,0x30,0x26,0xa0
+,0x24,0xa0,0x22,0x86,0x20,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e
+,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e
+,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x63,0x61
+,0x33,0x2e,0x63,0x72,0x6c,0x30,0x0b,0x06
+,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02
+,0x01,0x06,0x30,0x42,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x36
+,0x30,0x34,0x30,0x32,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x30,0x01,0xa6,0x26
+,0x16,0x24,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x6f,0x63,0x73,0x70,0x2e,0x76,0x65
+,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63
+,0x6f,0x6d,0x2f,0x6f,0x63,0x73,0x70,0x2f
+,0x73,0x74,0x61,0x74,0x75,0x73,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x81,0x81
+,0x00,0x82,0x70,0x68,0x95,0xdf,0xb6,0x0d
+,0xc2,0x01,0x70,0x19,0x4a,0xd2,0x54,0x56
+,0x1e,0xac,0xf2,0x45,0x4c,0x87,0xb8,0xf5
+,0x35,0xeb,0x78,0x4b,0x05,0xa9,0xc8,0x9d
+,0x3b,0x19,0x21,0x2e,0x70,0x34,0x4a,0xa2
+,0xf5,0x89,0xe0,0x15,0x75,0x45,0xe7,0x28
+,0x37,0x00,0x34,0x27,0x29,0xe8,0x37,0x4b
+,0xf2,0xef,0x44,0x97,0x6b,0x17,0x51,0x1a
+,0xc3,0x56,0x9d,0x3c,0x1a,0x8a,0xf6,0x4a
+,0x46,0x46,0x37,0x8c,0xfa,0xcb,0xf5,0x64
+,0x5a,0x38,0x68,0x2e,0x1c,0xc3,0xef,0x70
+,0xce,0xb8,0x46,0x06,0x16,0xbf,0xf7,0x7e
+,0xe7,0xb5,0xa8,0x3e,0x45,0xac,0xa9,0x25
+,0x75,0x22,0x7b,0x6f,0x3f,0xb0,0x9c,0x94
+,0xe7,0xc7,0x73,0xab,0xac,0x1f,0xee,0x25
+,0x9b,0xc0,0x16,0xed,0xb7,0xca,0x5b,0xf0
+,0x14};
+const unsigned int NptTlsTrustAnchor_Base_0041_Size = 977;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0042.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0042.cpp
new file mode 100644
index 0000000..94ac03a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0042.cpp
@@ -0,0 +1,121 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Thawte Time Stamping CA */
+const unsigned char NptTlsTrustAnchor_Base_0042_Data[677] = {
+0x30,0x82,0x02,0xa1,0x30,0x82,0x02,0x0a
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x81,0x8b,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x5a,0x41,0x31
+,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x08
+,0x13,0x0c,0x57,0x65,0x73,0x74,0x65,0x72
+,0x6e,0x20,0x43,0x61,0x70,0x65,0x31,0x14
+,0x30,0x12,0x06,0x03,0x55,0x04,0x07,0x13
+,0x0b,0x44,0x75,0x72,0x62,0x61,0x6e,0x76
+,0x69,0x6c,0x6c,0x65,0x31,0x0f,0x30,0x0d
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x06,0x54
+,0x68,0x61,0x77,0x74,0x65,0x31,0x1d,0x30
+,0x1b,0x06,0x03,0x55,0x04,0x0b,0x13,0x14
+,0x54,0x68,0x61,0x77,0x74,0x65,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x31,0x1f,0x30,0x1d
+,0x06,0x03,0x55,0x04,0x03,0x13,0x16,0x54
+,0x68,0x61,0x77,0x74,0x65,0x20,0x54,0x69
+,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x69
+,0x6e,0x67,0x20,0x43,0x41,0x30,0x1e,0x17
+,0x0d,0x39,0x37,0x30,0x31,0x30,0x31,0x30
+,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x32,0x30,0x31,0x32,0x33,0x31,0x32,0x33
+,0x35,0x39,0x35,0x39,0x5a,0x30,0x81,0x8b
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x5a,0x41,0x31,0x15,0x30
+,0x13,0x06,0x03,0x55,0x04,0x08,0x13,0x0c
+,0x57,0x65,0x73,0x74,0x65,0x72,0x6e,0x20
+,0x43,0x61,0x70,0x65,0x31,0x14,0x30,0x12
+,0x06,0x03,0x55,0x04,0x07,0x13,0x0b,0x44
+,0x75,0x72,0x62,0x61,0x6e,0x76,0x69,0x6c
+,0x6c,0x65,0x31,0x0f,0x30,0x0d,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x06,0x54,0x68,0x61
+,0x77,0x74,0x65,0x31,0x1d,0x30,0x1b,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x14,0x54,0x68
+,0x61,0x77,0x74,0x65,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x31,0x1f,0x30,0x1d,0x06,0x03
+,0x55,0x04,0x03,0x13,0x16,0x54,0x68,0x61
+,0x77,0x74,0x65,0x20,0x54,0x69,0x6d,0x65
+,0x73,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67
+,0x20,0x43,0x41,0x30,0x81,0x9f,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d
+,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00
+,0xd6,0x2b,0x58,0x78,0x61,0x45,0x86,0x53
+,0xea,0x34,0x7b,0x51,0x9c,0xed,0xb0,0xe6
+,0x2e,0x18,0x0e,0xfe,0xe0,0x5f,0xa8,0x27
+,0xd3,0xb4,0xc9,0xe0,0x7c,0x59,0x4e,0x16
+,0x0e,0x73,0x54,0x60,0xc1,0x7f,0xf6,0x9f
+,0x2e,0xe9,0x3a,0x85,0x24,0x15,0x3c,0xdb
+,0x47,0x04,0x63,0xc3,0x9e,0xc4,0x94,0x1a
+,0x5a,0xdf,0x4c,0x7a,0xf3,0xd9,0x43,0x1d
+,0x3c,0x10,0x7a,0x79,0x25,0xdb,0x90,0xfe
+,0xf0,0x51,0xe7,0x30,0xd6,0x41,0x00,0xfd
+,0x9f,0x28,0xdf,0x79,0xbe,0x94,0xbb,0x9d
+,0xb6,0x14,0xe3,0x23,0x85,0xd7,0xa9,0x41
+,0xe0,0x4c,0xa4,0x79,0xb0,0x2b,0x1a,0x8b
+,0xf2,0xf8,0x3b,0x8a,0x3e,0x45,0xac,0x71
+,0x92,0x00,0xb4,0x90,0x41,0x98,0xfb,0x5f
+,0xed,0xfa,0xb7,0x2e,0x8a,0xf8,0x88,0x37
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x13,0x30
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04,0x05
+,0x00,0x03,0x81,0x81,0x00,0x67,0xdb,0xe2
+,0xc2,0xe6,0x87,0x3d,0x40,0x83,0x86,0x37
+,0x35,0x7d,0x1f,0xce,0x9a,0xc3,0x0c,0x66
+,0x20,0xa8,0xba,0xaa,0x04,0x89,0x86,0xc2
+,0xf5,0x10,0x08,0x0d,0xbf,0xcb,0xa2,0x05
+,0x8a,0xd0,0x4d,0x36,0x3e,0xf4,0xd7,0xef
+,0x69,0xc6,0x5e,0xe4,0xb0,0x94,0x6f,0x4a
+,0xb9,0xe7,0xde,0x5b,0x88,0xb6,0x7b,0xdb
+,0xe3,0x27,0xe5,0x76,0xc3,0xf0,0x35,0xc1
+,0xcb,0xb5,0x27,0x9b,0x33,0x79,0xdc,0x90
+,0xa6,0x00,0x9e,0x77,0xfa,0xfc,0xcd,0x27
+,0x94,0x42,0x16,0x9c,0xd3,0x1c,0x68,0xec
+,0xbf,0x5c,0xdd,0xe5,0xa9,0x7b,0x10,0x0a
+,0x32,0x74,0x54,0x13,0x31,0x8b,0x85,0x03
+,0x84,0x91,0xb7,0x58,0x01,0x30,0x14,0x38
+,0xaf,0x28,0xca,0xfc,0xb1,0x50,0x19,0x19
+,0x09,0xac,0x89,0x49,0xd3};
+const unsigned int NptTlsTrustAnchor_Base_0042_Size = 677;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0043.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0043.cpp
new file mode 100644
index 0000000..6a39f1b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0043.cpp
@@ -0,0 +1,184 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Entrust.net Global Secure Server CA */
+const unsigned char NptTlsTrustAnchor_Base_0043_Data[1177] = {
+0x30,0x82,0x04,0x95,0x30,0x82,0x03,0xfe
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x38
+,0x9b,0x11,0x3c,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04
+,0x05,0x00,0x30,0x81,0xba,0x31,0x14,0x30
+,0x12,0x06,0x03,0x55,0x04,0x0a,0x13,0x0b
+,0x45,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e
+,0x6e,0x65,0x74,0x31,0x3f,0x30,0x3d,0x06
+,0x03,0x55,0x04,0x0b,0x14,0x36,0x77,0x77
+,0x77,0x2e,0x65,0x6e,0x74,0x72,0x75,0x73
+,0x74,0x2e,0x6e,0x65,0x74,0x2f,0x53,0x53
+,0x4c,0x5f,0x43,0x50,0x53,0x20,0x69,0x6e
+,0x63,0x6f,0x72,0x70,0x2e,0x20,0x62,0x79
+,0x20,0x72,0x65,0x66,0x2e,0x20,0x28,0x6c
+,0x69,0x6d,0x69,0x74,0x73,0x20,0x6c,0x69
+,0x61,0x62,0x2e,0x29,0x31,0x25,0x30,0x23
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x28
+,0x63,0x29,0x20,0x32,0x30,0x30,0x30,0x20
+,0x45,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e
+,0x6e,0x65,0x74,0x20,0x4c,0x69,0x6d,0x69
+,0x74,0x65,0x64,0x31,0x3a,0x30,0x38,0x06
+,0x03,0x55,0x04,0x03,0x13,0x31,0x45,0x6e
+,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65
+,0x74,0x20,0x53,0x65,0x63,0x75,0x72,0x65
+,0x20,0x53,0x65,0x72,0x76,0x65,0x72,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x30
+,0x1e,0x17,0x0d,0x30,0x30,0x30,0x32,0x30
+,0x34,0x31,0x37,0x32,0x30,0x30,0x30,0x5a
+,0x17,0x0d,0x32,0x30,0x30,0x32,0x30,0x34
+,0x31,0x37,0x35,0x30,0x30,0x30,0x5a,0x30
+,0x81,0xba,0x31,0x14,0x30,0x12,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0b,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x31,0x3f,0x30,0x3d,0x06,0x03,0x55,0x04
+,0x0b,0x14,0x36,0x77,0x77,0x77,0x2e,0x65
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x2f,0x53,0x53,0x4c,0x5f,0x43
+,0x50,0x53,0x20,0x69,0x6e,0x63,0x6f,0x72
+,0x70,0x2e,0x20,0x62,0x79,0x20,0x72,0x65
+,0x66,0x2e,0x20,0x28,0x6c,0x69,0x6d,0x69
+,0x74,0x73,0x20,0x6c,0x69,0x61,0x62,0x2e
+,0x29,0x31,0x25,0x30,0x23,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x1c,0x28,0x63,0x29,0x20
+,0x32,0x30,0x30,0x30,0x20,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65,0x64
+,0x31,0x3a,0x30,0x38,0x06,0x03,0x55,0x04
+,0x03,0x13,0x31,0x45,0x6e,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x6e,0x65,0x74,0x20,0x53
+,0x65,0x63,0x75,0x72,0x65,0x20,0x53,0x65
+,0x72,0x76,0x65,0x72,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x30,0x81,0x9f,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x81
+,0x8d,0x00,0x30,0x81,0x89,0x02,0x81,0x81
+,0x00,0xc7,0xc1,0x5f,0x4e,0x71,0xf1,0xce
+,0xf0,0x60,0x86,0x0f,0xd2,0x58,0x7f,0xd3
+,0x33,0x97,0x2d,0x17,0xa2,0x75,0x30,0xb5
+,0x96,0x64,0x26,0x2f,0x68,0xc3,0x44,0xab
+,0xa8,0x75,0xe6,0x00,0x67,0x34,0x57,0x9e
+,0x65,0xc7,0x22,0x9b,0x73,0xe6,0xd3,0xdd
+,0x08,0x0e,0x37,0x55,0xaa,0x25,0x46,0x81
+,0x6c,0xbd,0xfe,0xa8,0xf6,0x75,0x57,0x57
+,0x8c,0x90,0x6c,0x4a,0xc3,0x3e,0x8b,0x4b
+,0x43,0x0a,0xc9,0x11,0x56,0x9a,0x9a,0x27
+,0x22,0x99,0xcf,0x55,0x9e,0x61,0xd9,0x02
+,0xe2,0x7c,0xb6,0x7c,0x38,0x07,0xdc,0xe3
+,0x7f,0x4f,0x9a,0xb9,0x03,0x41,0x80,0xb6
+,0x75,0x67,0x13,0x0b,0x9f,0xe8,0x57,0x36
+,0xc8,0x5d,0x00,0x36,0xde,0x66,0x14,0xda
+,0x6e,0x76,0x1f,0x4f,0x37,0x8c,0x82,0x13
+,0x89,0x02,0x03,0x01,0x00,0x01,0xa3,0x82
+,0x01,0xa4,0x30,0x82,0x01,0xa0,0x30,0x11
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x00
+,0x07,0x30,0x81,0xe3,0x06,0x03,0x55,0x1d
+,0x1f,0x04,0x81,0xdb,0x30,0x81,0xd8,0x30
+,0x81,0xd5,0xa0,0x81,0xd2,0xa0,0x81,0xcf
+,0xa4,0x81,0xcc,0x30,0x81,0xc9,0x31,0x14
+,0x30,0x12,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0b,0x45,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x31,0x3f,0x30,0x3d
+,0x06,0x03,0x55,0x04,0x0b,0x14,0x36,0x77
+,0x77,0x77,0x2e,0x65,0x6e,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x6e,0x65,0x74,0x2f,0x53
+,0x53,0x4c,0x5f,0x43,0x50,0x53,0x20,0x69
+,0x6e,0x63,0x6f,0x72,0x70,0x2e,0x20,0x62
+,0x79,0x20,0x72,0x65,0x66,0x2e,0x20,0x28
+,0x6c,0x69,0x6d,0x69,0x74,0x73,0x20,0x6c
+,0x69,0x61,0x62,0x2e,0x29,0x31,0x25,0x30
+,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c
+,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x30
+,0x20,0x45,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x20,0x4c,0x69,0x6d
+,0x69,0x74,0x65,0x64,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x03,0x13,0x31,0x45
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x20,0x53,0x65,0x63,0x75,0x72
+,0x65,0x20,0x53,0x65,0x72,0x76,0x65,0x72
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79
+,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04
+,0x03,0x13,0x04,0x43,0x52,0x4c,0x31,0x30
+,0x2b,0x06,0x03,0x55,0x1d,0x10,0x04,0x24
+,0x30,0x22,0x80,0x0f,0x32,0x30,0x30,0x30
+,0x30,0x32,0x30,0x34,0x31,0x37,0x32,0x30
+,0x30,0x30,0x5a,0x81,0x0f,0x32,0x30,0x32
+,0x30,0x30,0x32,0x30,0x34,0x31,0x37,0x35
+,0x30,0x30,0x30,0x5a,0x30,0x0b,0x06,0x03
+,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0xcb,0x6c
+,0xc0,0x6b,0xe3,0xbb,0x3e,0xcb,0xfc,0x22
+,0x9c,0xfe,0xfb,0x8b,0x92,0x9c,0xb0,0xf2
+,0x6e,0x22,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0xcb,0x6c,0xc0
+,0x6b,0xe3,0xbb,0x3e,0xcb,0xfc,0x22,0x9c
+,0xfe,0xfb,0x8b,0x92,0x9c,0xb0,0xf2,0x6e
+,0x22,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x1d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf6
+,0x7d,0x07,0x41,0x00,0x04,0x10,0x30,0x0e
+,0x1b,0x08,0x56,0x35,0x2e,0x30,0x3a,0x34
+,0x2e,0x30,0x03,0x02,0x04,0x90,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x04,0x05,0x00,0x03,0x81,0x81
+,0x00,0x62,0xdb,0x81,0x91,0xce,0xc8,0x9a
+,0x77,0x42,0x2f,0xec,0xbd,0x27,0xa3,0x53
+,0x0f,0x50,0x1b,0xea,0x4e,0x92,0xf0,0xa9
+,0xaf,0xa9,0xa0,0xba,0x48,0x61,0xcb,0xef
+,0xc9,0x06,0xef,0x1f,0xd5,0xf4,0xee,0xdf
+,0x56,0x2d,0xe6,0xca,0x6a,0x19,0x73,0xaa
+,0x53,0xbe,0x92,0xb3,0x50,0x02,0xb6,0x85
+,0x26,0x72,0x63,0xd8,0x75,0x50,0x62,0x75
+,0x14,0xb7,0xb3,0x50,0x1a,0x3f,0xca,0x11
+,0x00,0x0b,0x85,0x45,0x69,0x6d,0xb6,0xa5
+,0xae,0x51,0xe1,0x4a,0xdc,0x82,0x3f,0x6c
+,0x8c,0x34,0xb2,0x77,0x6b,0xd9,0x02,0xf6
+,0x7f,0x0e,0xea,0x65,0x04,0xf1,0xcd,0x54
+,0xca,0xba,0xc9,0xcc,0xe0,0x84,0xf7,0xc8
+,0x3e,0x11,0x97,0xd3,0x60,0x09,0x18,0xbc
+,0x05,0xff,0x6c,0x89,0x33,0xf0,0xec,0x15
+,0x0f};
+const unsigned int NptTlsTrustAnchor_Base_0043_Size = 1177;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0044.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0044.cpp
new file mode 100644
index 0000000..c39c91d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0044.cpp
@@ -0,0 +1,181 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Entrust.net Global Secure Personal CA */
+const unsigned char NptTlsTrustAnchor_Base_0044_Data[1159] = {
+0x30,0x82,0x04,0x83,0x30,0x82,0x03,0xec
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x38
+,0x9e,0xf6,0xe4,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04
+,0x05,0x00,0x30,0x81,0xb4,0x31,0x14,0x30
+,0x12,0x06,0x03,0x55,0x04,0x0a,0x13,0x0b
+,0x45,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e
+,0x6e,0x65,0x74,0x31,0x40,0x30,0x3e,0x06
+,0x03,0x55,0x04,0x0b,0x14,0x37,0x77,0x77
+,0x77,0x2e,0x65,0x6e,0x74,0x72,0x75,0x73
+,0x74,0x2e,0x6e,0x65,0x74,0x2f,0x47,0x43
+,0x43,0x41,0x5f,0x43,0x50,0x53,0x20,0x69
+,0x6e,0x63,0x6f,0x72,0x70,0x2e,0x20,0x62
+,0x79,0x20,0x72,0x65,0x66,0x2e,0x20,0x28
+,0x6c,0x69,0x6d,0x69,0x74,0x73,0x20,0x6c
+,0x69,0x61,0x62,0x2e,0x29,0x31,0x25,0x30
+,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c
+,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x30
+,0x20,0x45,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x20,0x4c,0x69,0x6d
+,0x69,0x74,0x65,0x64,0x31,0x33,0x30,0x31
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2a,0x45
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x20,0x43,0x6c,0x69,0x65,0x6e
+,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x30,0x1e,0x17,0x0d,0x30,0x30,0x30
+,0x32,0x30,0x37,0x31,0x36,0x31,0x36,0x34
+,0x30,0x5a,0x17,0x0d,0x32,0x30,0x30,0x32
+,0x30,0x37,0x31,0x36,0x34,0x36,0x34,0x30
+,0x5a,0x30,0x81,0xb4,0x31,0x14,0x30,0x12
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x0b,0x45
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x31,0x40,0x30,0x3e,0x06,0x03
+,0x55,0x04,0x0b,0x14,0x37,0x77,0x77,0x77
+,0x2e,0x65,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x2f,0x47,0x43,0x43
+,0x41,0x5f,0x43,0x50,0x53,0x20,0x69,0x6e
+,0x63,0x6f,0x72,0x70,0x2e,0x20,0x62,0x79
+,0x20,0x72,0x65,0x66,0x2e,0x20,0x28,0x6c
+,0x69,0x6d,0x69,0x74,0x73,0x20,0x6c,0x69
+,0x61,0x62,0x2e,0x29,0x31,0x25,0x30,0x23
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x28
+,0x63,0x29,0x20,0x32,0x30,0x30,0x30,0x20
+,0x45,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e
+,0x6e,0x65,0x74,0x20,0x4c,0x69,0x6d,0x69
+,0x74,0x65,0x64,0x31,0x33,0x30,0x31,0x06
+,0x03,0x55,0x04,0x03,0x13,0x2a,0x45,0x6e
+,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65
+,0x74,0x20,0x43,0x6c,0x69,0x65,0x6e,0x74
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79
+,0x30,0x81,0x9f,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01
+,0x05,0x00,0x03,0x81,0x8d,0x00,0x30,0x81
+,0x89,0x02,0x81,0x81,0x00,0x93,0x74,0xb4
+,0xb6,0xe4,0xc5,0x4b,0xd6,0xa1,0x68,0x7f
+,0x62,0xd5,0xec,0xf7,0x51,0x57,0xb3,0x72
+,0x4a,0x98,0xf5,0xd0,0x89,0xc9,0xad,0x63
+,0xcd,0x4d,0x35,0x51,0x6a,0x84,0xd4,0xad
+,0xc9,0x68,0x79,0x6f,0xb8,0xeb,0x11,0xdb
+,0x87,0xae,0x5c,0x24,0x51,0x13,0xf1,0x54
+,0x25,0x84,0xaf,0x29,0x2b,0x9f,0xe3,0x80
+,0xe2,0xd9,0xcb,0xdd,0xc6,0x45,0x49,0x34
+,0x88,0x90,0x5e,0x01,0x97,0xef,0xea,0x53
+,0xa6,0xdd,0xfc,0xc1,0xde,0x4b,0x2a,0x25
+,0xe4,0xe9,0x35,0xfa,0x55,0x05,0x06,0xe5
+,0x89,0x7a,0xea,0xa4,0x11,0x57,0x3b,0xfc
+,0x7c,0x3d,0x36,0xcd,0x67,0x35,0x6d,0xa4
+,0xa9,0x25,0x59,0xbd,0x66,0xf5,0xf9,0x27
+,0xe4,0x95,0x67,0xd6,0x3f,0x92,0x80,0x5e
+,0xf2,0x34,0x7d,0x2b,0x85,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x82,0x01,0x9e,0x30,0x82
+,0x01,0x9a,0x30,0x11,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x01,0x04
+,0x04,0x03,0x02,0x00,0x07,0x30,0x81,0xdd
+,0x06,0x03,0x55,0x1d,0x1f,0x04,0x81,0xd5
+,0x30,0x81,0xd2,0x30,0x81,0xcf,0xa0,0x81
+,0xcc,0xa0,0x81,0xc9,0xa4,0x81,0xc6,0x30
+,0x81,0xc3,0x31,0x14,0x30,0x12,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0b,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x31,0x40,0x30,0x3e,0x06,0x03,0x55,0x04
+,0x0b,0x14,0x37,0x77,0x77,0x77,0x2e,0x65
+,0x6e,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x2f,0x47,0x43,0x43,0x41,0x5f
+,0x43,0x50,0x53,0x20,0x69,0x6e,0x63,0x6f
+,0x72,0x70,0x2e,0x20,0x62,0x79,0x20,0x72
+,0x65,0x66,0x2e,0x20,0x28,0x6c,0x69,0x6d
+,0x69,0x74,0x73,0x20,0x6c,0x69,0x61,0x62
+,0x2e,0x29,0x31,0x25,0x30,0x23,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x1c,0x28,0x63,0x29
+,0x20,0x32,0x30,0x30,0x30,0x20,0x45,0x6e
+,0x74,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65
+,0x74,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x33,0x30,0x31,0x06,0x03,0x55
+,0x04,0x03,0x13,0x2a,0x45,0x6e,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74,0x20
+,0x43,0x6c,0x69,0x65,0x6e,0x74,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x0d
+,0x30,0x0b,0x06,0x03,0x55,0x04,0x03,0x13
+,0x04,0x43,0x52,0x4c,0x31,0x30,0x2b,0x06
+,0x03,0x55,0x1d,0x10,0x04,0x24,0x30,0x22
+,0x80,0x0f,0x32,0x30,0x30,0x30,0x30,0x32
+,0x30,0x37,0x31,0x36,0x31,0x36,0x34,0x30
+,0x5a,0x81,0x0f,0x32,0x30,0x32,0x30,0x30
+,0x32,0x30,0x37,0x31,0x36,0x34,0x36,0x34
+,0x30,0x5a,0x30,0x0b,0x06,0x03,0x55,0x1d
+,0x0f,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18
+,0x30,0x16,0x80,0x14,0x84,0x8b,0x74,0xfd
+,0xc5,0x8d,0xc0,0xff,0x27,0x6d,0x20,0x37
+,0x45,0x7c,0xfe,0x2d,0xce,0xba,0xd3,0x7d
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0x84,0x8b,0x74,0xfd,0xc5
+,0x8d,0xc0,0xff,0x27,0x6d,0x20,0x37,0x45
+,0x7c,0xfe,0x2d,0xce,0xba,0xd3,0x7d,0x30
+,0x0c,0x06,0x03,0x55,0x1d,0x13,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x1d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf6,0x7d,0x07
+,0x41,0x00,0x04,0x10,0x30,0x0e,0x1b,0x08
+,0x56,0x35,0x2e,0x30,0x3a,0x34,0x2e,0x30
+,0x03,0x02,0x04,0x90,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x04,0x05,0x00,0x03,0x81,0x81,0x00,0x4e
+,0x6f,0x35,0x80,0x3b,0xd1,0x8a,0xf5,0x0e
+,0xa7,0x20,0xcb,0x2d,0x65,0x55,0xd0,0x92
+,0xf4,0xe7,0x84,0xb5,0x06,0x26,0x83,0x12
+,0x84,0x0b,0xac,0x3b,0xb2,0x44,0xee,0xbd
+,0xcf,0x40,0xdb,0x20,0x0e,0xba,0x6e,0x14
+,0xea,0x30,0xe0,0x3b,0x62,0x7c,0x7f,0x8b
+,0x6b,0x7c,0x4a,0xa7,0xd5,0x35,0x3c,0xbe
+,0xa8,0x5c,0xea,0x4b,0xbb,0x93,0x8e,0x80
+,0x66,0xab,0x0f,0x29,0xfd,0x4d,0x2d,0xbf
+,0x1a,0x9b,0x0a,0x90,0xc5,0xab,0xda,0xd1
+,0xb3,0x86,0xd4,0x2f,0x24,0x52,0x5c,0x7a
+,0x6d,0xc6,0xf2,0xfe,0xe5,0x4d,0x1a,0x30
+,0x8c,0x90,0xf2,0xba,0xd7,0x4a,0x3e,0x43
+,0x7e,0xd4,0xc8,0x50,0x1a,0x87,0xf8,0x4f
+,0x81,0xc7,0x76,0x0b,0x84,0x3a,0x72,0x9d
+,0xce,0x65,0x66,0x97,0xae,0x26,0x5e};
+const unsigned int NptTlsTrustAnchor_Base_0044_Size = 1159;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0045.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0045.cpp
new file mode 100644
index 0000000..06a2023
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0045.cpp
@@ -0,0 +1,183 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Entrust Root Certification Authority */
+const unsigned char NptTlsTrustAnchor_Base_0045_Data[1173] = {
+0x30,0x82,0x04,0x91,0x30,0x82,0x03,0x79
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x45
+,0x6b,0x50,0x54,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0xb0,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0d,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x39,0x30,0x37,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x30,0x77,0x77,0x77
+,0x2e,0x65,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x6e,0x65,0x74,0x2f,0x43,0x50,0x53
+,0x20,0x69,0x73,0x20,0x69,0x6e,0x63,0x6f
+,0x72,0x70,0x6f,0x72,0x61,0x74,0x65,0x64
+,0x20,0x62,0x79,0x20,0x72,0x65,0x66,0x65
+,0x72,0x65,0x6e,0x63,0x65,0x31,0x1f,0x30
+,0x1d,0x06,0x03,0x55,0x04,0x0b,0x13,0x16
+,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36
+,0x20,0x45,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x2d
+,0x30,0x2b,0x06,0x03,0x55,0x04,0x03,0x13
+,0x24,0x45,0x6e,0x74,0x72,0x75,0x73,0x74
+,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68
+,0x6f,0x72,0x69,0x74,0x79,0x30,0x1e,0x17
+,0x0d,0x30,0x36,0x31,0x31,0x32,0x37,0x32
+,0x30,0x32,0x33,0x34,0x32,0x5a,0x17,0x0d
+,0x32,0x36,0x31,0x31,0x32,0x37,0x32,0x30
+,0x35,0x33,0x34,0x32,0x5a,0x30,0x81,0xb0
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30
+,0x14,0x06,0x03,0x55,0x04,0x0a,0x13,0x0d
+,0x45,0x6e,0x74,0x72,0x75,0x73,0x74,0x2c
+,0x20,0x49,0x6e,0x63,0x2e,0x31,0x39,0x30
+,0x37,0x06,0x03,0x55,0x04,0x0b,0x13,0x30
+,0x77,0x77,0x77,0x2e,0x65,0x6e,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74,0x2f
+,0x43,0x50,0x53,0x20,0x69,0x73,0x20,0x69
+,0x6e,0x63,0x6f,0x72,0x70,0x6f,0x72,0x61
+,0x74,0x65,0x64,0x20,0x62,0x79,0x20,0x72
+,0x65,0x66,0x65,0x72,0x65,0x6e,0x63,0x65
+,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x16,0x28,0x63,0x29,0x20,0x32
+,0x30,0x30,0x36,0x20,0x45,0x6e,0x74,0x72
+,0x75,0x73,0x74,0x2c,0x20,0x49,0x6e,0x63
+,0x2e,0x31,0x2d,0x30,0x2b,0x06,0x03,0x55
+,0x04,0x03,0x13,0x24,0x45,0x6e,0x74,0x72
+,0x75,0x73,0x74,0x20,0x52,0x6f,0x6f,0x74
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xb6,0x95,0xb6,0x43,0x42,0xfa,0xc6
+,0x6d,0x2a,0x6f,0x48,0xdf,0x94,0x4c,0x39
+,0x57,0x05,0xee,0xc3,0x79,0x11,0x41,0x68
+,0x36,0xed,0xec,0xfe,0x9a,0x01,0x8f,0xa1
+,0x38,0x28,0xfc,0xf7,0x10,0x46,0x66,0x2e
+,0x4d,0x1e,0x1a,0xb1,0x1a,0x4e,0xc6,0xd1
+,0xc0,0x95,0x88,0xb0,0xc9,0xff,0x31,0x8b
+,0x33,0x03,0xdb,0xb7,0x83,0x7b,0x3e,0x20
+,0x84,0x5e,0xed,0xb2,0x56,0x28,0xa7,0xf8
+,0xe0,0xb9,0x40,0x71,0x37,0xc5,0xcb,0x47
+,0x0e,0x97,0x2a,0x68,0xc0,0x22,0x95,0x62
+,0x15,0xdb,0x47,0xd9,0xf5,0xd0,0x2b,0xff
+,0x82,0x4b,0xc9,0xad,0x3e,0xde,0x4c,0xdb
+,0x90,0x80,0x50,0x3f,0x09,0x8a,0x84,0x00
+,0xec,0x30,0x0a,0x3d,0x18,0xcd,0xfb,0xfd
+,0x2a,0x59,0x9a,0x23,0x95,0x17,0x2c,0x45
+,0x9e,0x1f,0x6e,0x43,0x79,0x6d,0x0c,0x5c
+,0x98,0xfe,0x48,0xa7,0xc5,0x23,0x47,0x5c
+,0x5e,0xfd,0x6e,0xe7,0x1e,0xb4,0xf6,0x68
+,0x45,0xd1,0x86,0x83,0x5b,0xa2,0x8a,0x8d
+,0xb1,0xe3,0x29,0x80,0xfe,0x25,0x71,0x88
+,0xad,0xbe,0xbc,0x8f,0xac,0x52,0x96,0x4b
+,0xaa,0x51,0x8d,0xe4,0x13,0x31,0x19,0xe8
+,0x4e,0x4d,0x9f,0xdb,0xac,0xb3,0x6a,0xd5
+,0xbc,0x39,0x54,0x71,0xca,0x7a,0x7a,0x7f
+,0x90,0xdd,0x7d,0x1d,0x80,0xd9,0x81,0xbb
+,0x59,0x26,0xc2,0x11,0xfe,0xe6,0x93,0xe2
+,0xf7,0x80,0xe4,0x65,0xfb,0x34,0x37,0x0e
+,0x29,0x80,0x70,0x4d,0xaf,0x38,0x86,0x2e
+,0x9e,0x7f,0x57,0xaf,0x9e,0x17,0xae,0xeb
+,0x1c,0xcb,0x28,0x21,0x5f,0xb6,0x1c,0xd8
+,0xe7,0xa2,0x04,0x22,0xf9,0xd3,0xda,0xd8
+,0xcb,0x02,0x03,0x01,0x00,0x01,0xa3,0x81
+,0xb0,0x30,0x81,0xad,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x06,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x2b,0x06
+,0x03,0x55,0x1d,0x10,0x04,0x24,0x30,0x22
+,0x80,0x0f,0x32,0x30,0x30,0x36,0x31,0x31
+,0x32,0x37,0x32,0x30,0x32,0x33,0x34,0x32
+,0x5a,0x81,0x0f,0x32,0x30,0x32,0x36,0x31
+,0x31,0x32,0x37,0x32,0x30,0x35,0x33,0x34
+,0x32,0x5a,0x30,0x1f,0x06,0x03,0x55,0x1d
+,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x68
+,0x90,0xe4,0x67,0xa4,0xa6,0x53,0x80,0xc7
+,0x86,0x66,0xa4,0xf1,0xf7,0x4b,0x43,0xfb
+,0x84,0xbd,0x6d,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0x68,0x90
+,0xe4,0x67,0xa4,0xa6,0x53,0x80,0xc7,0x86
+,0x66,0xa4,0xf1,0xf7,0x4b,0x43,0xfb,0x84
+,0xbd,0x6d,0x30,0x1d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf6,0x7d,0x07,0x41,0x00,0x04
+,0x10,0x30,0x0e,0x1b,0x08,0x56,0x37,0x2e
+,0x31,0x3a,0x34,0x2e,0x30,0x03,0x02,0x04
+,0x90,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0x93,0xd4,0x30
+,0xb0,0xd7,0x03,0x20,0x2a,0xd0,0xf9,0x63
+,0xe8,0x91,0x0c,0x05,0x20,0xa9,0x5f,0x19
+,0xca,0x7b,0x72,0x4e,0xd4,0xb1,0xdb,0xd0
+,0x96,0xfb,0x54,0x5a,0x19,0x2c,0x0c,0x08
+,0xf7,0xb2,0xbc,0x85,0xa8,0x9d,0x7f,0x6d
+,0x3b,0x52,0xb3,0x2a,0xdb,0xe7,0xd4,0x84
+,0x8c,0x63,0xf6,0x0f,0xcb,0x26,0x01,0x91
+,0x50,0x6c,0xf4,0x5f,0x14,0xe2,0x93,0x74
+,0xc0,0x13,0x9e,0x30,0x3a,0x50,0xe3,0xb4
+,0x60,0xc5,0x1c,0xf0,0x22,0x44,0x8d,0x71
+,0x47,0xac,0xc8,0x1a,0xc9,0xe9,0x9b,0x9a
+,0x00,0x60,0x13,0xff,0x70,0x7e,0x5f,0x11
+,0x4d,0x49,0x1b,0xb3,0x15,0x52,0x7b,0xc9
+,0x54,0xda,0xbf,0x9d,0x95,0xaf,0x6b,0x9a
+,0xd8,0x9e,0xe9,0xf1,0xe4,0x43,0x8d,0xe2
+,0x11,0x44,0x3a,0xbf,0xaf,0xbd,0x83,0x42
+,0x73,0x52,0x8b,0xaa,0xbb,0xa7,0x29,0xcf
+,0xf5,0x64,0x1c,0x0a,0x4d,0xd1,0xbc,0xaa
+,0xac,0x9f,0x2a,0xd0,0xff,0x7f,0x7f,0xda
+,0x7d,0xea,0xb1,0xed,0x30,0x25,0xc1,0x84
+,0xda,0x34,0xd2,0x5b,0x78,0x83,0x56,0xec
+,0x9c,0x36,0xc3,0x26,0xe2,0x11,0xf6,0x67
+,0x49,0x1d,0x92,0xab,0x8c,0xfb,0xeb,0xff
+,0x7a,0xee,0x85,0x4a,0xa7,0x50,0x80,0xf0
+,0xa7,0x5c,0x4a,0x94,0x2e,0x5f,0x05,0x99
+,0x3c,0x52,0x41,0xe0,0xcd,0xb4,0x63,0xcf
+,0x01,0x43,0xba,0x9c,0x83,0xdc,0x8f,0x60
+,0x3b,0xf3,0x5a,0xb4,0xb4,0x7b,0xae,0xda
+,0x0b,0x90,0x38,0x75,0xef,0x81,0x1d,0x66
+,0xd2,0xf7,0x57,0x70,0x36,0xb3,0xbf,0xfc
+,0x28,0xaf,0x71,0x25,0x85,0x5b,0x13,0xfe
+,0x1e,0x7f,0x5a,0xb4,0x3c};
+const unsigned int NptTlsTrustAnchor_Base_0045_Size = 1173;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0046.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0046.cpp
new file mode 100644
index 0000000..9501282
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0046.cpp
@@ -0,0 +1,162 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* AOL Time Warner Root Certification Authority 1 */
+const unsigned char NptTlsTrustAnchor_Base_0046_Data[1002] = {
+0x30,0x82,0x03,0xe6,0x30,0x82,0x02,0xce
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x81,0x83,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x14,0x41,0x4f,0x4c,0x20,0x54,0x69
+,0x6d,0x65,0x20,0x57,0x61,0x72,0x6e,0x65
+,0x72,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1c
+,0x30,0x1a,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x13,0x41,0x6d,0x65,0x72,0x69,0x63,0x61
+,0x20,0x4f,0x6e,0x6c,0x69,0x6e,0x65,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x37,0x30,0x35
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2e,0x41
+,0x4f,0x4c,0x20,0x54,0x69,0x6d,0x65,0x20
+,0x57,0x61,0x72,0x6e,0x65,0x72,0x20,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x20,0x31,0x30,0x1e,0x17
+,0x0d,0x30,0x32,0x30,0x35,0x32,0x39,0x30
+,0x36,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x33,0x37,0x31,0x31,0x32,0x30,0x31,0x35
+,0x30,0x33,0x30,0x30,0x5a,0x30,0x81,0x83
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x1d,0x30
+,0x1b,0x06,0x03,0x55,0x04,0x0a,0x13,0x14
+,0x41,0x4f,0x4c,0x20,0x54,0x69,0x6d,0x65
+,0x20,0x57,0x61,0x72,0x6e,0x65,0x72,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x1c,0x30,0x1a
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x13,0x41
+,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f
+,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x37,0x30,0x35,0x06,0x03
+,0x55,0x04,0x03,0x13,0x2e,0x41,0x4f,0x4c
+,0x20,0x54,0x69,0x6d,0x65,0x20,0x57,0x61
+,0x72,0x6e,0x65,0x72,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x20,0x31,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0x99,0xde,0x8f,0xc3
+,0x25,0xa3,0x69,0x34,0xe8,0x05,0xf7,0x74
+,0xb9,0xbf,0x5a,0x97,0x19,0xb9,0x2f,0x94
+,0xd2,0x93,0xe5,0x2d,0x89,0xca,0x84,0x7c
+,0x3f,0x10,0x43,0x1b,0x8c,0x8b,0x7c,0x84
+,0x58,0xf8,0x24,0x7c,0x48,0xcf,0x2a,0xfd
+,0xc0,0x15,0xd9,0x18,0x7e,0x84,0x1a,0x17
+,0xd3,0xdb,0x9e,0xd7,0xca,0xe4,0xd9,0xd7
+,0xaa,0x58,0x51,0x87,0xf0,0xf0,0x8b,0x48
+,0x4e,0xe2,0xc2,0xc4,0x59,0x69,0x30,0x62
+,0xb6,0x30,0xa2,0x8c,0x0b,0x11,0x99,0x61
+,0x35,0x6d,0x7e,0xef,0xc5,0xb1,0x19,0x06
+,0x20,0x12,0x8e,0x42,0xe1,0xdf,0x0f,0x96
+,0x10,0x52,0xa8,0xcf,0x9c,0x5f,0x95,0x14
+,0xd8,0xaf,0x3b,0x75,0x0b,0x31,0x20,0x1f
+,0x44,0x2f,0xa2,0x62,0x41,0xb3,0xbb,0x18
+,0x21,0xdb,0xca,0x71,0x3c,0x8c,0xec,0xb6
+,0xb9,0x0d,0x9f,0xef,0x51,0xef,0x4d,0x7b
+,0x12,0xf2,0x0b,0x0c,0xe1,0xac,0x40,0x8f
+,0x77,0x7f,0xb0,0xca,0x78,0x71,0x0c,0x5d
+,0x16,0x71,0x70,0xa2,0xd7,0xc2,0x3a,0x85
+,0xcd,0x0e,0x9a,0xc4,0xe0,0x00,0xb0,0xd5
+,0x25,0xea,0xdc,0x2b,0xe4,0x94,0x2d,0x38
+,0x9c,0x89,0x41,0x57,0x64,0x28,0x65,0x19
+,0x1c,0xb6,0x44,0xb4,0xc8,0x31,0x6b,0x8e
+,0x01,0x7b,0x76,0x59,0x25,0x7f,0x15,0x1c
+,0x84,0x08,0x7c,0x73,0x65,0x20,0x0a,0xa1
+,0x04,0x2e,0x1a,0x32,0xa8,0x9a,0x20,0xb1
+,0x9c,0x2c,0x21,0x59,0xe7,0xfb,0xcf,0xee
+,0x70,0x2d,0x08,0xca,0x63,0x3e,0x2c,0x9b
+,0x93,0x19,0x6a,0xa4,0xc2,0x97,0xff,0xb7
+,0x86,0x57,0x88,0x85,0x6c,0x9e,0x15,0x16
+,0x2b,0x4d,0x2c,0xb3,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x63,0x30,0x61,0x30,0x0f,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0xa1,0x36,0x30,0x16,0xcb,0x86,0x90
+,0x00,0x45,0x80,0x53,0xb1,0x8f,0xc8,0xd8
+,0x3d,0x7c,0xbe,0x5f,0x12,0x30,0x1f,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16
+,0x80,0x14,0xa1,0x36,0x30,0x16,0xcb,0x86
+,0x90,0x00,0x45,0x80,0x53,0xb1,0x8f,0xc8
+,0xd8,0x3d,0x7c,0xbe,0x5f,0x12,0x30,0x0e
+,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff
+,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01
+,0x01,0x00,0x8a,0x20,0x18,0xa5,0xbe,0xb3
+,0x2f,0xb4,0xa6,0x84,0x00,0x40,0x30,0x29
+,0xfa,0xb4,0x14,0x73,0x4c,0x79,0x45,0xa7
+,0xf6,0x70,0xe0,0xe8,0x7e,0x64,0x1e,0x0a
+,0x95,0x7c,0x6a,0x61,0xc2,0xef,0x4e,0x1f
+,0xbe,0xff,0xc9,0x99,0x1f,0x07,0x61,0x4a
+,0xe1,0x5d,0x4c,0xcd,0xad,0xee,0xd0,0x52
+,0x32,0xd9,0x59,0x32,0xbc,0xda,0x79,0x72
+,0xd6,0x7b,0x09,0xe8,0x02,0x81,0x35,0xd3
+,0x0a,0xdf,0x11,0x1d,0xc9,0x79,0xa0,0x80
+,0x4d,0xfe,0x5a,0xd7,0x56,0xd6,0xed,0x0f
+,0x2a,0xaf,0xa7,0x18,0x75,0x33,0x0c,0xea
+,0xc1,0x61,0x05,0x4f,0x6a,0x9a,0x89,0xf2
+,0x8d,0xb9,0x9f,0x2e,0xef,0xb0,0x5f,0x5a
+,0x00,0xeb,0xbe,0xad,0xa0,0xf8,0x44,0x05
+,0x67,0xbc,0xcb,0x04,0xef,0x9e,0x64,0xc5
+,0xe9,0xc8,0x3f,0x05,0xbf,0xc6,0x2f,0x07
+,0x1c,0xc3,0x36,0x71,0x86,0xca,0x38,0x66
+,0x4a,0xcd,0xd6,0xb8,0x4b,0xc6,0x6c,0xa7
+,0x97,0x3b,0xfa,0x13,0x2d,0x6e,0x23,0x61
+,0x87,0xa1,0x63,0x42,0xac,0xc2,0xcb,0x97
+,0x9f,0x61,0x68,0xcf,0x2d,0x4c,0x04,0x9d
+,0xd7,0x25,0x4f,0x0a,0x0e,0x4d,0x90,0x8b
+,0x18,0x56,0xa8,0x93,0x48,0x57,0xdc,0x6f
+,0xae,0xbd,0x9e,0x67,0x57,0x77,0x89,0x50
+,0xb3,0xbe,0x11,0x9b,0x45,0x67,0x83,0x86
+,0x19,0x87,0xd3,0x98,0xbd,0x08,0x1a,0x16
+,0x1f,0x58,0x82,0x0b,0xe1,0x96,0x69,0x05
+,0x4b,0x8e,0xec,0x83,0x51,0x31,0x07,0xd5
+,0xd4,0x9f,0xff,0x59,0x7b,0xa8,0x6e,0x85
+,0xcf,0xd3,0x4b,0xa9,0x49,0xb0,0x5f,0xb0
+,0x39,0x28,0x68,0x0e,0x73,0xdd,0x25,0x9a
+,0xde,0x12};
+const unsigned int NptTlsTrustAnchor_Base_0046_Size = 1002;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0047.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0047.cpp
new file mode 100644
index 0000000..f81338a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0047.cpp
@@ -0,0 +1,226 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* AOL Time Warner Root Certification Authority 2 */
+const unsigned char NptTlsTrustAnchor_Base_0047_Data[1514] = {
+0x30,0x82,0x05,0xe6,0x30,0x82,0x03,0xce
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x81,0x83,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x14,0x41,0x4f,0x4c,0x20,0x54,0x69
+,0x6d,0x65,0x20,0x57,0x61,0x72,0x6e,0x65
+,0x72,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1c
+,0x30,0x1a,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x13,0x41,0x6d,0x65,0x72,0x69,0x63,0x61
+,0x20,0x4f,0x6e,0x6c,0x69,0x6e,0x65,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x37,0x30,0x35
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2e,0x41
+,0x4f,0x4c,0x20,0x54,0x69,0x6d,0x65,0x20
+,0x57,0x61,0x72,0x6e,0x65,0x72,0x20,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x20,0x32,0x30,0x1e,0x17
+,0x0d,0x30,0x32,0x30,0x35,0x32,0x39,0x30
+,0x36,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x33,0x37,0x30,0x39,0x32,0x38,0x32,0x33
+,0x34,0x33,0x30,0x30,0x5a,0x30,0x81,0x83
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x1d,0x30
+,0x1b,0x06,0x03,0x55,0x04,0x0a,0x13,0x14
+,0x41,0x4f,0x4c,0x20,0x54,0x69,0x6d,0x65
+,0x20,0x57,0x61,0x72,0x6e,0x65,0x72,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x1c,0x30,0x1a
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x13,0x41
+,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f
+,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x37,0x30,0x35,0x06,0x03
+,0x55,0x04,0x03,0x13,0x2e,0x41,0x4f,0x4c
+,0x20,0x54,0x69,0x6d,0x65,0x20,0x57,0x61
+,0x72,0x6e,0x65,0x72,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x20,0x32,0x30,0x82,0x02,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x02,0x0f,0x00,0x30,0x82,0x02,0x0a,0x02
+,0x82,0x02,0x01,0x00,0xb4,0x37,0x5a,0x08
+,0x16,0x99,0x14,0xe8,0x55,0xb1,0x1b,0x24
+,0x6b,0xfc,0xc7,0x8b,0xe6,0x87,0xa9,0x89
+,0xee,0x8b,0x99,0xcd,0x4f,0x40,0x86,0xa4
+,0xb6,0x4d,0xc9,0xd9,0xb1,0xdc,0x3c,0x4d
+,0x0d,0x85,0x4c,0x15,0x6c,0x46,0x8b,0x52
+,0x78,0x9f,0xf8,0x23,0xfd,0x67,0xf5,0x24
+,0x3a,0x68,0x5d,0xd0,0xf7,0x64,0x61,0x41
+,0x54,0xa3,0x8b,0xa5,0x08,0xd2,0x29,0x5b
+,0x9b,0x60,0x4f,0x26,0x83,0xd1,0x63,0x12
+,0x56,0x49,0x76,0xa4,0x16,0xc2,0xa5,0x9d
+,0x45,0xac,0x8b,0x84,0x95,0xa8,0x16,0xb1
+,0xec,0x9f,0xea,0x24,0x1a,0xef,0xb9,0x57
+,0x5c,0x9a,0x24,0x21,0x2c,0x4d,0x0e,0x71
+,0x1f,0xa6,0xac,0x5d,0x45,0x74,0x03,0x98
+,0xc4,0x54,0x8c,0x16,0x4a,0x41,0x77,0x86
+,0x95,0x75,0x0c,0x47,0x01,0x66,0x60,0xfc
+,0x15,0xf1,0x0f,0xea,0xf5,0x14,0x78,0xc7
+,0x0e,0xd7,0x6e,0x81,0x1c,0x5e,0xbf,0x5e
+,0xe7,0x3a,0x2a,0xd8,0x97,0x17,0x30,0x7c
+,0x00,0xad,0x08,0x9d,0x33,0xaf,0xb8,0x99
+,0x61,0x80,0x8b,0xa8,0x95,0x7e,0x14,0xdc
+,0x12,0x6c,0xa4,0xd0,0xd8,0xef,0x40,0x49
+,0x02,0x36,0xf9,0x6e,0xa9,0xd6,0x1d,0x96
+,0x56,0x04,0xb2,0xb3,0x2d,0x16,0x56,0x86
+,0x8f,0xd9,0x20,0x57,0x80,0xcd,0x67,0x10
+,0x6d,0xb0,0x4c,0xf0,0xda,0x46,0xb6,0xea
+,0x25,0x2e,0x46,0xaf,0x8d,0xb0,0x85,0x38
+,0x34,0x8b,0x14,0x26,0x82,0x2b,0xac,0xae
+,0x99,0x0b,0x8e,0x14,0xd7,0x52,0xbd,0x9e
+,0x69,0xc3,0x86,0x02,0x0b,0xea,0x76,0x75
+,0x31,0x09,0xce,0x33,0x19,0x21,0x85,0x43
+,0xe6,0x89,0x2d,0x9f,0x25,0x37,0x67,0xf1
+,0x23,0x6a,0xd2,0x00,0x6d,0x97,0xf9,0x9f
+,0xe7,0x29,0xca,0xdd,0x1f,0xd7,0x06,0xea
+,0xb8,0xc9,0xb9,0x09,0x21,0x9f,0xc8,0x3f
+,0x06,0xc5,0xd2,0xe9,0x12,0x46,0x00,0x4e
+,0x7b,0x08,0xeb,0x42,0x3d,0x2b,0x48,0x6e
+,0x9d,0x67,0xdd,0x4b,0x02,0xe4,0x44,0xf3
+,0x93,0x19,0xa5,0x27,0xce,0x69,0x7a,0xbe
+,0x67,0xd3,0xfc,0x50,0xa4,0x2c,0xab,0xc3
+,0x6b,0xb9,0xe3,0x80,0x4c,0xcf,0x05,0x61
+,0x4b,0x2b,0xdc,0x1b,0xb9,0xa6,0xd2,0xd0
+,0xaa,0xf5,0x2b,0x73,0xfb,0xce,0x90,0x35
+,0x9f,0x0c,0x52,0x1c,0xbf,0x5c,0x21,0x61
+,0x11,0x5b,0x15,0x4b,0xa9,0x24,0x51,0xfc
+,0xa4,0x5c,0xf7,0x17,0x9d,0xb0,0xd2,0xfa
+,0x07,0xe9,0x8f,0x56,0xe4,0x1a,0x8c,0x68
+,0x8a,0x04,0xd3,0x7c,0x5a,0xe3,0x9e,0xa2
+,0xa1,0xca,0x71,0x5b,0xa2,0xd4,0xa0,0xe7
+,0x29,0x85,0x5d,0x03,0x68,0x2a,0x4f,0xd2
+,0x06,0xd7,0x3d,0xf9,0xc3,0x03,0x2f,0x3f
+,0x65,0xf9,0x67,0x1e,0x47,0x40,0xd3,0x63
+,0x0f,0xe3,0xd5,0x8e,0xf9,0x85,0xab,0x97
+,0x4c,0xb3,0xd7,0x26,0xeb,0x96,0x0a,0x94
+,0xde,0x85,0x36,0x9c,0xc8,0x7f,0x81,0x09
+,0x02,0x49,0x2a,0x0e,0xf5,0x64,0x32,0x0c
+,0x82,0xd1,0xba,0x6a,0x82,0x1b,0xb3,0x4b
+,0x74,0x11,0xf3,0x8c,0x77,0xd6,0x9f,0xbf
+,0xdc,0x37,0xa4,0xa7,0x55,0x04,0x2f,0xd4
+,0x31,0xe8,0xd3,0x46,0xb9,0x03,0x7c,0xda
+,0x12,0x4e,0x59,0x64,0xb7,0x51,0x31,0x31
+,0x50,0xa0,0xca,0x1c,0x27,0xd9,0x10,0x2e
+,0xad,0xd6,0xbd,0x10,0x66,0x2b,0xc3,0xb0
+,0x22,0x4a,0x12,0x5b,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x63,0x30,0x61,0x30,0x0f,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0x4f,0x69,0x6d,0x03,0x7e,0x9d,0x9f
+,0x07,0x18,0x43,0xbc,0xb7,0x10,0x4e,0xd5
+,0xbf,0xa9,0xc4,0x20,0x28,0x30,0x1f,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16
+,0x80,0x14,0x4f,0x69,0x6d,0x03,0x7e,0x9d
+,0x9f,0x07,0x18,0x43,0xbc,0xb7,0x10,0x4e
+,0xd5,0xbf,0xa9,0xc4,0x20,0x28,0x30,0x0e
+,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff
+,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x02
+,0x01,0x00,0x3b,0xf3,0xae,0xca,0xe8,0x2e
+,0x87,0x85,0xfb,0x65,0x59,0xe7,0xad,0x11
+,0x14,0xa5,0x57,0xbc,0x58,0x9f,0x24,0x12
+,0x57,0xbb,0xfb,0x3f,0x34,0xda,0xee,0xad
+,0x7a,0x2a,0x34,0x72,0x70,0x31,0x6b,0xc7
+,0x19,0x98,0x80,0xc9,0x82,0xde,0x37,0x77
+,0x5e,0x54,0x8b,0x8e,0xf2,0xea,0x67,0x4f
+,0xc9,0x74,0x84,0x91,0x56,0x09,0xd5,0xe5
+,0x7a,0x9a,0x81,0xb6,0x81,0xc2,0xad,0x36
+,0xe4,0xf1,0x54,0x11,0x53,0xf3,0x34,0x45
+,0x01,0x26,0xc8,0xe5,0x1a,0xbc,0x34,0x44
+,0x21,0xde,0xad,0x25,0xfc,0x76,0x16,0x77
+,0x21,0x90,0x80,0x98,0x57,0x9d,0x4e,0xea
+,0xec,0x2f,0xaa,0x3c,0x14,0x7b,0x57,0xc1
+,0x7e,0x18,0x14,0x67,0xee,0x24,0xc6,0xbd
+,0xba,0x15,0xb0,0xd2,0x18,0xbd,0xb7,0x55
+,0x81,0xac,0x53,0xc0,0xe8,0xdd,0x69,0x12
+,0x13,0x42,0xb7,0x02,0xb5,0x05,0x41,0xca
+,0x79,0x50,0x6e,0x82,0x0e,0x71,0x72,0x93
+,0x46,0xe8,0x9d,0x0d,0x5d,0xbd,0xae,0xce
+,0x29,0xad,0x63,0xd5,0x55,0x16,0x80,0x30
+,0x27,0xff,0x76,0xba,0xf7,0xb8,0xd6,0x4a
+,0xe3,0xd9,0xb5,0xf9,0x52,0xd0,0x4e,0x40
+,0xa9,0xc7,0xe5,0xc2,0x32,0xc7,0xaa,0x76
+,0x24,0xe1,0x6b,0x05,0x50,0xeb,0xc5,0xbf
+,0x0a,0x54,0xe5,0xb9,0x42,0x3c,0x24,0xfb
+,0xb7,0x07,0x9c,0x30,0x9f,0x79,0x5a,0xe6
+,0xe0,0x40,0x52,0x15,0xf4,0xfc,0xaa,0xf4
+,0x56,0xf9,0x44,0x97,0x87,0xed,0x0e,0x65
+,0x72,0x5e,0xbe,0x26,0xfb,0x4d,0xa4,0x2d
+,0x08,0x07,0xde,0xd8,0x5c,0xa0,0xdc,0x81
+,0x33,0x99,0x18,0x25,0x11,0x77,0xa7,0xeb
+,0xfd,0x58,0x09,0x2c,0x99,0x6b,0x1b,0x8a
+,0xf3,0x52,0x3f,0x1a,0x4d,0x48,0x60,0xf1
+,0xa0,0xf6,0x33,0x02,0x53,0x8b,0xed,0x25
+,0x09,0xb8,0x0d,0x2d,0xed,0x97,0x73,0xec
+,0xd7,0x96,0x1f,0x8e,0x60,0x0e,0xda,0x10
+,0x9b,0x2f,0x18,0x24,0xf6,0xa6,0x4d,0x0a
+,0xf9,0x3b,0xcb,0x75,0xc2,0xcc,0x2f,0xce
+,0x24,0x69,0xc9,0x0a,0x22,0x8e,0x59,0xa7
+,0xf7,0x82,0x0c,0xd7,0xd7,0x6b,0x35,0x9c
+,0x43,0x00,0x6a,0xc4,0x95,0x67,0xba,0x9c
+,0x45,0xcb,0xb8,0x0e,0x37,0xf7,0xdc,0x4e
+,0x01,0x4f,0xbe,0x0a,0xb6,0x03,0xd3,0xad
+,0x8a,0x45,0xf7,0xda,0x27,0x4d,0x29,0xb1
+,0x48,0xdf,0xe4,0x11,0xe4,0x96,0x46,0xbd
+,0x6c,0x02,0x3e,0xd6,0x51,0xc8,0x95,0x17
+,0x01,0x15,0xa9,0xf2,0xaa,0xaa,0xf2,0xbf
+,0x2f,0x65,0x1b,0x6f,0xd0,0xb9,0x1a,0x93
+,0xf5,0x8e,0x35,0xc4,0x80,0x87,0x3e,0x94
+,0x2f,0x66,0xe4,0xe9,0xa8,0xff,0x41,0x9c
+,0x70,0x2a,0x4f,0x2a,0x39,0x18,0x95,0x1e
+,0x7e,0xfb,0x61,0x01,0x3c,0x51,0x08,0x2e
+,0x28,0x18,0xa4,0x16,0x0f,0x31,0xfd,0x3a
+,0x6c,0x23,0x93,0x20,0x76,0xe1,0xfd,0x07
+,0x85,0xd1,0x5b,0x3f,0xd2,0x1c,0x73,0x32
+,0xdd,0xfa,0xb9,0xf8,0x8c,0xcf,0x02,0x87
+,0x7a,0x9a,0x96,0xe4,0xed,0x4f,0x89,0x8d
+,0x53,0x43,0xab,0x0e,0x13,0xc0,0x01,0x15
+,0xb4,0x79,0x38,0xdb,0xfc,0x6e,0x3d,0x9e
+,0x51,0xb6,0xb8,0x13,0x8b,0x67,0xcf,0xf9
+,0x7c,0xd9,0x22,0x1d,0xf6,0x5d,0xc5,0x1c
+,0x01,0x2f,0x98,0xe8,0x7a,0x24,0x18,0xbc
+,0x84,0xd7,0xfa,0xdc,0x72,0x5b,0xf7,0xc1
+,0x3a,0x68};
+const unsigned int NptTlsTrustAnchor_Base_0047_Size = 1514;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0048.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0048.cpp
new file mode 100644
index 0000000..d64c920
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0048.cpp
@@ -0,0 +1,203 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* beTRUSTed Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0048_Data[1328] = {
+0x30,0x82,0x05,0x2c,0x30,0x82,0x04,0x14
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x39
+,0x4f,0x7d,0x87,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x5a,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x57
+,0x57,0x31,0x12,0x30,0x10,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x09,0x62,0x65,0x54,0x52
+,0x55,0x53,0x54,0x65,0x64,0x31,0x1b,0x30
+,0x19,0x06,0x03,0x55,0x04,0x03,0x13,0x12
+,0x62,0x65,0x54,0x52,0x55,0x53,0x54,0x65
+,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x73,0x31,0x1a,0x30,0x18,0x06,0x03
+,0x55,0x04,0x03,0x13,0x11,0x62,0x65,0x54
+,0x52,0x55,0x53,0x54,0x65,0x64,0x20,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x41,0x30,0x1e
+,0x17,0x0d,0x30,0x30,0x30,0x36,0x32,0x30
+,0x31,0x34,0x32,0x31,0x30,0x34,0x5a,0x17
+,0x0d,0x31,0x30,0x30,0x36,0x32,0x30,0x31
+,0x33,0x32,0x31,0x30,0x34,0x5a,0x30,0x5a
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x57,0x57,0x31,0x12,0x30
+,0x10,0x06,0x03,0x55,0x04,0x0a,0x13,0x09
+,0x62,0x65,0x54,0x52,0x55,0x53,0x54,0x65
+,0x64,0x31,0x1b,0x30,0x19,0x06,0x03,0x55
+,0x04,0x03,0x13,0x12,0x62,0x65,0x54,0x52
+,0x55,0x53,0x54,0x65,0x64,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x73,0x31,0x1a
+,0x30,0x18,0x06,0x03,0x55,0x04,0x03,0x13
+,0x11,0x62,0x65,0x54,0x52,0x55,0x53,0x54
+,0x65,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xd4,0xb4,0x73,0x7a,0x13
+,0x0a,0x38,0x55,0x01,0xbe,0x89,0x56,0xe1
+,0x94,0x9e,0xd4,0xbe,0x5a,0xeb,0x4a,0x34
+,0x75,0x1b,0x61,0x29,0xc4,0xe1,0xad,0x08
+,0x60,0x21,0x78,0x48,0xff,0xb4,0xd0,0xfa
+,0x5e,0x41,0x8d,0x61,0x44,0x87,0xe8,0xed
+,0xc9,0x58,0xfa,0xfc,0x93,0x9a,0xdf,0x4f
+,0xea,0x3e,0x35,0x7d,0xf8,0x33,0x7a,0xe6
+,0xf1,0xd7,0xcd,0x6f,0x49,0x4b,0x3d,0x4f
+,0x2d,0x6e,0x0e,0x83,0x3a,0x18,0x78,0x77
+,0xa3,0xcf,0xe7,0xf4,0x4d,0x73,0xd8,0x9a
+,0x3b,0x1a,0x1d,0xbe,0x95,0x53,0xcf,0x20
+,0x97,0xc2,0xcf,0x3e,0x24,0x52,0x6c,0x0c
+,0x8e,0x65,0x59,0xc5,0x71,0xff,0x62,0x09
+,0x8f,0xaa,0xc5,0x8f,0xcc,0x60,0xa0,0x73
+,0x4a,0xd7,0x38,0x3f,0x15,0x72,0xbf,0xa2
+,0x97,0xb7,0x70,0xe8,0xaf,0xe2,0x7e,0x16
+,0x06,0x4c,0xf5,0xaa,0x64,0x26,0x72,0x07
+,0x25,0xad,0x35,0xfc,0x18,0xb1,0x26,0xd7
+,0xd8,0xff,0x19,0x0e,0x83,0x1b,0x8c,0xdc
+,0x78,0x45,0x67,0x34,0x3d,0xf4,0xaf,0x1c
+,0x8d,0xe4,0x6d,0x6b,0xed,0x20,0xb3,0x67
+,0x9a,0xb4,0x61,0xcb,0x17,0x6f,0x89,0x35
+,0xff,0xe7,0x4e,0xc0,0x32,0x12,0xe7,0xee
+,0xec,0xdf,0xff,0x97,0x30,0x74,0xed,0x8d
+,0x47,0x8e,0xeb,0xb4,0xc3,0x44,0xe6,0xa7
+,0x4c,0x7f,0x56,0x43,0xe8,0xb8,0xbc,0xb6
+,0xbe,0xfa,0x83,0x97,0xe6,0xbb,0xfb,0xc4
+,0xb6,0x93,0xbe,0x19,0x18,0x3e,0x8c,0x81
+,0xb9,0x73,0x88,0x16,0xf4,0x96,0x43,0x9c
+,0x67,0x73,0x17,0x90,0xd8,0x09,0x6e,0x63
+,0xac,0x4a,0xb6,0x23,0xc4,0x01,0xa1,0xad
+,0xa4,0xe4,0xc5,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x82,0x01,0xf8,0x30,0x82,0x01,0xf4
+,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01
+,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x82,0x01,0x59,0x06,0x03,0x55
+,0x1d,0x20,0x04,0x82,0x01,0x50,0x30,0x82
+,0x01,0x4c,0x30,0x82,0x01,0x48,0x06,0x0a
+,0x2b,0x06,0x01,0x04,0x01,0xb1,0x3e,0x01
+,0x00,0x00,0x30,0x82,0x01,0x38,0x30,0x82
+,0x01,0x01,0x06,0x08,0x2b,0x06,0x01,0x05
+,0x05,0x07,0x02,0x02,0x30,0x81,0xf4,0x1a
+,0x81,0xf1,0x52,0x65,0x6c,0x69,0x61,0x6e
+,0x63,0x65,0x20,0x6f,0x6e,0x20,0x74,0x68
+,0x69,0x73,0x20,0x63,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x62
+,0x79,0x20,0x61,0x6e,0x79,0x20,0x70,0x61
+,0x72,0x74,0x79,0x20,0x61,0x73,0x73,0x75
+,0x6d,0x65,0x73,0x20,0x61,0x63,0x63,0x65
+,0x70,0x74,0x61,0x6e,0x63,0x65,0x20,0x6f
+,0x66,0x20,0x74,0x68,0x65,0x20,0x74,0x68
+,0x65,0x6e,0x20,0x61,0x70,0x70,0x6c,0x69
+,0x63,0x61,0x62,0x6c,0x65,0x20,0x73,0x74
+,0x61,0x6e,0x64,0x61,0x72,0x64,0x20,0x74
+,0x65,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64
+,0x20,0x63,0x6f,0x6e,0x64,0x69,0x74,0x69
+,0x6f,0x6e,0x73,0x20,0x6f,0x66,0x20,0x75
+,0x73,0x65,0x2c,0x20,0x61,0x6e,0x64,0x20
+,0x63,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x70,0x72
+,0x61,0x63,0x74,0x69,0x63,0x65,0x20,0x73
+,0x74,0x61,0x74,0x65,0x6d,0x65,0x6e,0x74
+,0x2c,0x20,0x77,0x68,0x69,0x63,0x68,0x20
+,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x66
+,0x6f,0x75,0x6e,0x64,0x20,0x61,0x74,0x20
+,0x62,0x65,0x54,0x52,0x55,0x53,0x54,0x65
+,0x64,0x27,0x73,0x20,0x77,0x65,0x62,0x20
+,0x73,0x69,0x74,0x65,0x2c,0x20,0x68,0x74
+,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x62,0x65,0x54,0x52,0x55,0x53
+,0x54,0x65,0x64,0x2e,0x63,0x6f,0x6d,0x2f
+,0x76,0x61,0x75,0x6c,0x74,0x2f,0x74,0x65
+,0x72,0x6d,0x73,0x30,0x31,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16
+,0x25,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x62,0x65,0x54
+,0x52,0x55,0x53,0x54,0x65,0x64,0x2e,0x63
+,0x6f,0x6d,0x2f,0x76,0x61,0x75,0x6c,0x74
+,0x2f,0x74,0x65,0x72,0x6d,0x73,0x30,0x34
+,0x06,0x03,0x55,0x1d,0x1f,0x04,0x2d,0x30
+,0x2b,0x30,0x29,0xa0,0x27,0xa0,0x25,0xa4
+,0x23,0x30,0x21,0x31,0x12,0x30,0x10,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x09,0x62,0x65
+,0x54,0x52,0x55,0x53,0x54,0x65,0x64,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x57,0x57,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x2a
+,0xb9,0x9b,0x69,0x2e,0x3b,0x9b,0xd8,0xcd
+,0xde,0x2a,0x31,0x04,0x34,0x6b,0xca,0x07
+,0x18,0xab,0x67,0x30,0x1f,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14
+,0x2a,0xb9,0x9b,0x69,0x2e,0x3b,0x9b,0xd8
+,0xcd,0xde,0x2a,0x31,0x04,0x34,0x6b,0xca
+,0x07,0x18,0xab,0x67,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0xfe,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0x79,0x61,0xdb,0xa3,0x5e,0x6e,0x16,0xb1
+,0xea,0x76,0x51,0xf9,0xcb,0x15,0x9b,0xcb
+,0x69,0xbe,0xe6,0x81,0x6b,0x9f,0x28,0x1f
+,0x65,0x3e,0xdd,0x11,0x85,0x92,0xd4,0xe8
+,0x41,0xbf,0x7e,0x33,0xbd,0x23,0xe7,0xf1
+,0x20,0xbf,0xa4,0xb4,0xa6,0x19,0x01,0xc6
+,0x8c,0x8d,0x35,0x7c,0x65,0xa4,0x4f,0x09
+,0xa4,0xd6,0xd8,0x23,0x15,0x05,0x13,0xa7
+,0x43,0x79,0xaf,0xdb,0xa3,0x0e,0x9b,0x7b
+,0x78,0x1a,0xf3,0x04,0x86,0x5a,0xc6,0xf6
+,0x8c,0x20,0x47,0x38,0x49,0x50,0x06,0x9d
+,0x72,0x67,0x3a,0xf0,0x98,0x03,0xad,0x96
+,0x67,0x44,0xfc,0x3f,0x10,0x0d,0x86,0x4d
+,0xe4,0x00,0x3b,0x29,0x7b,0xce,0x3b,0x3b
+,0x99,0x86,0x61,0x25,0x40,0x84,0xdc,0x13
+,0x62,0xb7,0xfa,0xca,0x59,0xd6,0x03,0x1e
+,0xd6,0x53,0x01,0xcd,0x6d,0x4c,0x68,0x55
+,0x40,0xe1,0xee,0x6b,0xc7,0x2a,0x00,0x00
+,0x48,0x82,0xb3,0x0a,0x01,0xc3,0x60,0x2a
+,0x0c,0xf7,0x82,0x35,0xee,0x48,0x86,0x96
+,0xe4,0x74,0xd4,0x3d,0xea,0x01,0x71,0xba
+,0x04,0x75,0x40,0xa7,0xa9,0x7f,0x39,0x39
+,0x9a,0x55,0x97,0x29,0x65,0xae,0x19,0x55
+,0x25,0x05,0x72,0x47,0xd3,0xe8,0x18,0xdc
+,0xb8,0xe9,0xaf,0x43,0x73,0x01,0x12,0x74
+,0xa3,0xe1,0x5c,0x5f,0x15,0x5d,0x24,0xf3
+,0xf9,0xe4,0xf4,0xb6,0x67,0x67,0x12,0xe7
+,0x64,0x22,0x8a,0xf6,0xa5,0x41,0xa6,0x1c
+,0xb6,0x60,0x63,0x45,0x8a,0x10,0xb4,0xba
+,0x46,0x10,0xae,0x41,0x57,0x65,0x6c,0x3f
+,0x23,0x10,0x3f,0x21,0x10,0x59,0xb7,0xe4
+,0x40,0xdd,0x26,0x0c,0x23,0xf6,0xaa,0xae
+};
+const unsigned int NptTlsTrustAnchor_Base_0048_Size = 1328;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0049.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0049.cpp
new file mode 100644
index 0000000..7a17640
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0049.cpp
@@ -0,0 +1,210 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* beTRUSTed Root CA-Baltimore Implementation */
+const unsigned char NptTlsTrustAnchor_Base_0049_Data[1390] = {
+0x30,0x82,0x05,0x6a,0x30,0x82,0x04,0x52
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x3c
+,0xb5,0x3d,0x46,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x66,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x09,0x62
+,0x65,0x54,0x52,0x55,0x53,0x54,0x65,0x64
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x12,0x62,0x65,0x54,0x52,0x55
+,0x53,0x54,0x65,0x64,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x73,0x31,0x33,0x30
+,0x31,0x06,0x03,0x55,0x04,0x03,0x13,0x2a
+,0x62,0x65,0x54,0x52,0x55,0x53,0x54,0x65
+,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x2d,0x42,0x61,0x6c,0x74,0x69,0x6d
+,0x6f,0x72,0x65,0x20,0x49,0x6d,0x70,0x6c
+,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69
+,0x6f,0x6e,0x30,0x1e,0x17,0x0d,0x30,0x32
+,0x30,0x34,0x31,0x31,0x30,0x37,0x33,0x38
+,0x35,0x31,0x5a,0x17,0x0d,0x32,0x32,0x30
+,0x34,0x31,0x31,0x30,0x37,0x33,0x38,0x35
+,0x31,0x5a,0x30,0x66,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x09,0x62
+,0x65,0x54,0x52,0x55,0x53,0x54,0x65,0x64
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x12,0x62,0x65,0x54,0x52,0x55
+,0x53,0x54,0x65,0x64,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x73,0x31,0x33,0x30
+,0x31,0x06,0x03,0x55,0x04,0x03,0x13,0x2a
+,0x62,0x65,0x54,0x52,0x55,0x53,0x54,0x65
+,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x2d,0x42,0x61,0x6c,0x74,0x69,0x6d
+,0x6f,0x72,0x65,0x20,0x49,0x6d,0x70,0x6c
+,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69
+,0x6f,0x6e,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xbc,0x7e,0xc4,0x39,0x9c
+,0x8c,0xe3,0xd6,0x1c,0x86,0xff,0xca,0x62
+,0xad,0xe0,0x7f,0x30,0x45,0x7a,0x8e,0x1a
+,0xb3,0xb8,0xc7,0xf9,0xd1,0x36,0xff,0x22
+,0xf3,0x4e,0x6a,0x5f,0x84,0x10,0xfb,0x66
+,0x81,0xc3,0x94,0x79,0x31,0xd2,0x91,0xe1
+,0x77,0x8e,0x18,0x2a,0xc3,0x14,0xde,0x51
+,0xf5,0x4f,0xa3,0x2b,0xbc,0x18,0x16,0xe2
+,0xb5,0xdd,0x79,0xde,0x22,0xf8,0x82,0x7e
+,0xcb,0x81,0x1f,0xfd,0x27,0x2c,0x8f,0xfa
+,0x97,0x64,0x22,0x8e,0xf8,0xff,0x61,0xa3
+,0x9c,0x1b,0x1e,0x92,0x8f,0xc0,0xa8,0x09
+,0xdf,0x09,0x11,0xec,0xb7,0x7d,0x31,0x9a
+,0x1a,0xea,0x83,0x21,0x06,0x3c,0x9f,0xba
+,0x5c,0xff,0x94,0xea,0x6a,0xb8,0xc3,0x6b
+,0x55,0x34,0x4f,0x3d,0x32,0x1f,0xdd,0x81
+,0x14,0xe0,0xc4,0x3c,0xcd,0x9d,0x30,0xf8
+,0x30,0xa9,0x97,0xd3,0xee,0xcc,0xa3,0xd0
+,0x1f,0x5f,0x1c,0x13,0x81,0xd4,0x18,0xab
+,0x94,0xd1,0x63,0xc3,0x9e,0x7f,0x35,0x92
+,0x9e,0x5f,0x44,0xea,0xec,0xf4,0x22,0x5c
+,0xb7,0xe8,0x3d,0x7d,0xa4,0xf9,0x89,0xa9
+,0x91,0xb2,0x2a,0xd9,0xeb,0x33,0x87,0xee
+,0xa5,0xfd,0xe3,0xda,0xcc,0x88,0xe6,0x89
+,0x26,0x6e,0xc7,0x2b,0x82,0xd0,0x5e,0x9d
+,0x59,0xdb,0x14,0xec,0x91,0x83,0x05,0xc3
+,0x5e,0x0e,0xc6,0x2a,0xd0,0x04,0xdd,0x71
+,0x3d,0x20,0x4e,0x58,0x27,0xfc,0x53,0xfb
+,0x78,0x78,0x19,0x14,0xb2,0xfc,0x90,0x52
+,0x89,0x38,0x62,0x60,0x07,0xb4,0xa0,0xec
+,0xac,0x6b,0x50,0xd6,0xfd,0xb9,0x28,0x6b
+,0xef,0x52,0x2d,0x3a,0xb2,0xff,0xf1,0x01
+,0x40,0xac,0x37,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x82,0x02,0x1e,0x30,0x82,0x02,0x1a
+,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01
+,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x82,0x01,0xb5,0x06,0x03,0x55
+,0x1d,0x20,0x04,0x82,0x01,0xac,0x30,0x82
+,0x01,0xa8,0x30,0x82,0x01,0xa4,0x06,0x0f
+,0x2b,0x06,0x01,0x04,0x01,0xb1,0x3e,0x00
+,0x00,0x01,0x09,0x28,0x83,0x91,0x31,0x30
+,0x82,0x01,0x8f,0x30,0x82,0x01,0x48,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02
+,0x02,0x30,0x82,0x01,0x3a,0x1a,0x82,0x01
+,0x36,0x52,0x65,0x6c,0x69,0x61,0x6e,0x63
+,0x65,0x20,0x6f,0x6e,0x20,0x6f,0x72,0x20
+,0x75,0x73,0x65,0x20,0x6f,0x66,0x20,0x74
+,0x68,0x69,0x73,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20
+,0x63,0x72,0x65,0x61,0x74,0x65,0x73,0x20
+,0x61,0x6e,0x20,0x61,0x63,0x6b,0x6e,0x6f
+,0x77,0x6c,0x65,0x64,0x67,0x6d,0x65,0x6e
+,0x74,0x20,0x61,0x6e,0x64,0x20,0x61,0x63
+,0x63,0x65,0x70,0x74,0x61,0x6e,0x63,0x65
+,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20
+,0x74,0x68,0x65,0x6e,0x20,0x61,0x70,0x70
+,0x6c,0x69,0x63,0x61,0x62,0x6c,0x65,0x20
+,0x73,0x74,0x61,0x6e,0x64,0x61,0x72,0x64
+,0x20,0x74,0x65,0x72,0x6d,0x73,0x20,0x61
+,0x6e,0x64,0x20,0x63,0x6f,0x6e,0x64,0x69
+,0x74,0x69,0x6f,0x6e,0x73,0x20,0x6f,0x66
+,0x20,0x75,0x73,0x65,0x2c,0x20,0x74,0x68
+,0x65,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x50,0x72,0x61,0x63,0x74,0x69,0x63,0x65
+,0x20,0x53,0x74,0x61,0x74,0x65,0x6d,0x65
+,0x6e,0x74,0x20,0x61,0x6e,0x64,0x20,0x74
+,0x68,0x65,0x20,0x52,0x65,0x6c,0x79,0x69
+,0x6e,0x67,0x20,0x50,0x61,0x72,0x74,0x79
+,0x20,0x41,0x67,0x72,0x65,0x65,0x6d,0x65
+,0x6e,0x74,0x2c,0x20,0x77,0x68,0x69,0x63
+,0x68,0x20,0x63,0x61,0x6e,0x20,0x62,0x65
+,0x20,0x66,0x6f,0x75,0x6e,0x64,0x20,0x61
+,0x74,0x20,0x74,0x68,0x65,0x20,0x62,0x65
+,0x54,0x52,0x55,0x53,0x54,0x65,0x64,0x20
+,0x77,0x65,0x62,0x20,0x73,0x69,0x74,0x65
+,0x2c,0x20,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x62,0x65,0x74
+,0x72,0x75,0x73,0x74,0x65,0x64,0x2e,0x63
+,0x6f,0x6d,0x2f,0x70,0x72,0x6f,0x64,0x75
+,0x63,0x74,0x73,0x5f,0x73,0x65,0x72,0x76
+,0x69,0x63,0x65,0x73,0x2f,0x69,0x6e,0x64
+,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x30
+,0x41,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x02,0x01,0x16,0x35,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x62,0x65,0x74,0x72,0x75,0x73,0x74,0x65
+,0x64,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x72
+,0x6f,0x64,0x75,0x63,0x74,0x73,0x5f,0x73
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x2f
+,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74
+,0x6d,0x6c,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x45,0x3d,0xc3
+,0xa9,0xd1,0xdc,0x3f,0x24,0x56,0x98,0x1c
+,0x73,0x18,0x88,0x6a,0xff,0x83,0x47,0xed
+,0xb6,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0x45,0x3d
+,0xc3,0xa9,0xd1,0xdc,0x3f,0x24,0x56,0x98
+,0x1c,0x73,0x18,0x88,0x6a,0xff,0x83,0x47
+,0xed,0xb6,0x30,0x0e,0x06,0x03,0x55,0x1d
+,0x0f,0x01,0x01,0xff,0x04,0x04,0x03,0x02
+,0x01,0x06,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x49,0x92
+,0xbc,0xa3,0xee,0xac,0xbd,0xfa,0x0d,0xc9
+,0x8b,0x79,0x86,0x1c,0x23,0x76,0xb0,0x80
+,0x59,0x77,0xfc,0xda,0x7f,0xb4,0x4b,0xdf
+,0xc3,0x64,0x4b,0x6a,0x4e,0x0e,0xad,0xf2
+,0x7d,0x59,0x77,0x05,0xad,0x0a,0x89,0x73
+,0xb0,0xfa,0xbc,0xcb,0xdc,0x8d,0x00,0x88
+,0x8f,0xa6,0xa0,0xb2,0xea,0xac,0x52,0x27
+,0xbf,0xa1,0x48,0x7c,0x97,0x10,0x7b,0xba
+,0xed,0x13,0x1d,0x9a,0x07,0x6e,0xcb,0x31
+,0x62,0x12,0xe8,0x63,0x03,0xaa,0x7d,0x6d
+,0xe3,0xf8,0x1b,0x76,0x21,0x78,0x1b,0x9f
+,0x4b,0x43,0x8c,0xd3,0x49,0x86,0xf6,0x1b
+,0x5c,0xf6,0x2e,0x60,0x15,0xd3,0xe9,0xe3
+,0x7b,0x75,0x3f,0xd0,0x02,0x83,0xd0,0x18
+,0x82,0x41,0xcd,0x65,0x37,0xea,0x8e,0x32
+,0x7e,0xbd,0x6b,0x99,0x5d,0x30,0x11,0xc8
+,0xdb,0x48,0x54,0x1c,0x3b,0xe1,0xa7,0x13
+,0xd3,0x6a,0x48,0x93,0xf7,0x3d,0x8c,0x7f
+,0x05,0xe8,0xce,0xf3,0x88,0x2a,0x63,0x04
+,0xb8,0xea,0x7e,0x58,0x7c,0x01,0x7b,0x5b
+,0xe1,0xc5,0x7d,0xef,0x21,0xe0,0x8d,0x0e
+,0x5d,0x51,0x7d,0xb1,0x67,0xfd,0xa3,0xbd
+,0x38,0x36,0xc6,0xf2,0x38,0x86,0x87,0x1a
+,0x96,0x68,0x60,0x46,0xfb,0x28,0x14,0x47
+,0x55,0xe1,0xa7,0x80,0x0c,0x6b,0xe2,0xea
+,0xdf,0x4d,0x7c,0x90,0x48,0xa0,0x36,0xbd
+,0x09,0x17,0x89,0x7f,0xc3,0xf2,0xd3,0x9c
+,0x9c,0xe3,0xdd,0xc4,0x1b,0xdd,0xf5,0xb7
+,0x71,0xb3,0x53,0x05,0x89,0x06,0xd0,0xcb
+,0x4a,0x80,0xc1,0xc8,0x53,0x90,0xb5,0x3c
+,0x31,0x88,0x17,0x50,0x9f,0xc9,0xc4,0x0e
+,0x8b,0xd8,0xa8,0x02,0x63,0x0d};
+const unsigned int NptTlsTrustAnchor_Base_0049_Size = 1390;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0050.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0050.cpp
new file mode 100644
index 0000000..50bca25
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0050.cpp
@@ -0,0 +1,239 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* beTRUSTed Root CA - Entrust Implementation */
+const unsigned char NptTlsTrustAnchor_Base_0050_Data[1621] = {
+0x30,0x82,0x06,0x51,0x30,0x82,0x05,0x39
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x3c
+,0xb5,0x4f,0x40,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x66,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x09,0x62
+,0x65,0x54,0x52,0x55,0x53,0x54,0x65,0x64
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x12,0x62,0x65,0x54,0x52,0x55
+,0x53,0x54,0x65,0x64,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x73,0x31,0x33,0x30
+,0x31,0x06,0x03,0x55,0x04,0x03,0x13,0x2a
+,0x62,0x65,0x54,0x52,0x55,0x53,0x54,0x65
+,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x20,0x2d,0x20,0x45,0x6e,0x74,0x72
+,0x75,0x73,0x74,0x20,0x49,0x6d,0x70,0x6c
+,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69
+,0x6f,0x6e,0x30,0x1e,0x17,0x0d,0x30,0x32
+,0x30,0x34,0x31,0x31,0x30,0x38,0x32,0x34
+,0x32,0x37,0x5a,0x17,0x0d,0x32,0x32,0x30
+,0x34,0x31,0x31,0x30,0x38,0x35,0x34,0x32
+,0x37,0x5a,0x30,0x66,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x09,0x62
+,0x65,0x54,0x52,0x55,0x53,0x54,0x65,0x64
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x12,0x62,0x65,0x54,0x52,0x55
+,0x53,0x54,0x65,0x64,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x73,0x31,0x33,0x30
+,0x31,0x06,0x03,0x55,0x04,0x03,0x13,0x2a
+,0x62,0x65,0x54,0x52,0x55,0x53,0x54,0x65
+,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x20,0x2d,0x20,0x45,0x6e,0x74,0x72
+,0x75,0x73,0x74,0x20,0x49,0x6d,0x70,0x6c
+,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69
+,0x6f,0x6e,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xba,0xf4,0x44,0x03,0xaa
+,0x12,0x6a,0xb5,0x43,0xec,0x55,0x92,0xb6
+,0x30,0x7d,0x35,0x57,0x0c,0xdb,0xf3,0x0d
+,0x27,0x6e,0x4c,0xf7,0x50,0xa8,0x9b,0x4e
+,0x2b,0x6f,0xdb,0xf5,0xad,0x1c,0x4b,0x5d
+,0xb3,0xa9,0xc1,0xfe,0x7b,0x44,0xeb,0x5b
+,0xa3,0x05,0x0d,0x1f,0xc5,0x34,0x2b,0x30
+,0x00,0x29,0xf1,0x78,0x40,0xb2,0xa4,0xff
+,0x3a,0xf4,0x01,0x88,0x17,0x7e,0xe6,0xd4
+,0x26,0xd3,0xba,0x4c,0xea,0x32,0xfb,0x43
+,0x77,0x97,0x87,0x23,0xc5,0xdb,0x43,0xa3
+,0xf5,0x2a,0xa3,0x51,0x5e,0xe1,0x3b,0xd2
+,0x65,0x69,0x7e,0x55,0x15,0x9b,0x7a,0xe7
+,0x69,0xf7,0x44,0xe0,0x57,0xb5,0x15,0xe8
+,0x66,0x60,0x0f,0x0d,0x03,0xfb,0x82,0x8e
+,0xa3,0xe8,0x11,0x7b,0x6c,0xbe,0xc7,0x63
+,0x0e,0x17,0x93,0xdf,0xcf,0x4b,0xae,0x6e
+,0x73,0x75,0xe0,0xf3,0xaa,0xb9,0xa4,0xc0
+,0x09,0x1b,0x85,0xea,0x71,0x29,0x88,0x41
+,0x32,0xf9,0xf0,0x2a,0x0e,0x6c,0x09,0xf2
+,0x74,0x6b,0x66,0x6c,0x52,0x13,0x1f,0x18
+,0xbc,0xd4,0x3e,0xf7,0xd8,0x6e,0x20,0x9e
+,0xca,0xfe,0xfc,0x21,0x94,0xee,0x13,0x28
+,0x4b,0xd7,0x5c,0x5e,0x0c,0x66,0xee,0xe9
+,0xbb,0x0f,0xc1,0x34,0xb1,0x7f,0x08,0x76
+,0xf3,0x3d,0x26,0x70,0xc9,0x8b,0x25,0x1d
+,0x62,0x24,0x0c,0xea,0x1c,0x75,0x4e,0xc0
+,0x12,0xe4,0xba,0x13,0x1d,0x30,0x29,0x2d
+,0x56,0x33,0x05,0xbb,0x97,0x59,0x7e,0xc6
+,0x49,0x4f,0x89,0xd7,0x2f,0x24,0xa8,0xb6
+,0x88,0x40,0xb5,0x64,0x92,0x53,0x56,0x24
+,0xe4,0xa2,0xa0,0x85,0xb3,0x5e,0x90,0xb4
+,0x12,0x33,0xcd,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x82,0x03,0x05,0x30,0x82,0x03,0x01
+,0x30,0x82,0x01,0xb7,0x06,0x03,0x55,0x1d
+,0x20,0x04,0x82,0x01,0xae,0x30,0x82,0x01
+,0xaa,0x30,0x82,0x01,0xa6,0x06,0x0f,0x2b
+,0x06,0x01,0x04,0x01,0xb1,0x3e,0x00,0x00
+,0x02,0x09,0x28,0x83,0x91,0x31,0x30,0x82
+,0x01,0x91,0x30,0x82,0x01,0x49,0x06,0x08
+,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x02
+,0x30,0x82,0x01,0x3b,0x1a,0x82,0x01,0x37
+,0x52,0x65,0x6c,0x69,0x61,0x6e,0x63,0x65
+,0x20,0x6f,0x6e,0x20,0x6f,0x72,0x20,0x75
+,0x73,0x65,0x20,0x6f,0x66,0x20,0x74,0x68
+,0x69,0x73,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x63
+,0x72,0x65,0x61,0x74,0x65,0x73,0x20,0x61
+,0x6e,0x20,0x61,0x63,0x6b,0x6e,0x6f,0x77
+,0x6c,0x65,0x64,0x67,0x6d,0x65,0x6e,0x74
+,0x20,0x61,0x6e,0x64,0x20,0x61,0x63,0x63
+,0x65,0x70,0x74,0x61,0x6e,0x63,0x65,0x20
+,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x74
+,0x68,0x65,0x6e,0x20,0x61,0x70,0x70,0x6c
+,0x69,0x63,0x61,0x62,0x6c,0x65,0x20,0x73
+,0x74,0x61,0x6e,0x64,0x61,0x72,0x64,0x20
+,0x74,0x65,0x72,0x6d,0x73,0x20,0x61,0x6e
+,0x64,0x20,0x63,0x6f,0x6e,0x64,0x69,0x74
+,0x69,0x6f,0x6e,0x73,0x20,0x6f,0x66,0x20
+,0x75,0x73,0x65,0x2c,0x20,0x74,0x68,0x65
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x50
+,0x72,0x61,0x63,0x74,0x69,0x63,0x65,0x20
+,0x53,0x74,0x61,0x74,0x65,0x6d,0x65,0x6e
+,0x74,0x20,0x61,0x6e,0x64,0x20,0x74,0x68
+,0x65,0x20,0x52,0x65,0x6c,0x79,0x69,0x6e
+,0x67,0x20,0x50,0x61,0x72,0x74,0x79,0x20
+,0x41,0x67,0x72,0x65,0x65,0x6d,0x65,0x6e
+,0x74,0x2c,0x20,0x77,0x68,0x69,0x63,0x68
+,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20
+,0x66,0x6f,0x75,0x6e,0x64,0x20,0x61,0x74
+,0x20,0x74,0x68,0x65,0x20,0x62,0x65,0x54
+,0x52,0x55,0x53,0x54,0x65,0x64,0x20,0x77
+,0x65,0x62,0x20,0x73,0x69,0x74,0x65,0x2c
+,0x20,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x62,0x65,0x74
+,0x72,0x75,0x73,0x74,0x65,0x64,0x2e,0x63
+,0x6f,0x6d,0x2f,0x70,0x72,0x6f,0x64,0x75
+,0x63,0x74,0x73,0x5f,0x73,0x65,0x72,0x76
+,0x69,0x63,0x65,0x73,0x2f,0x69,0x6e,0x64
+,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x30
+,0x42,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x02,0x01,0x16,0x36,0x68,0x74,0x74
+,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x62,0x65,0x74,0x72,0x75,0x73,0x74
+,0x65,0x64,0x2e,0x63,0x6f,0x6d,0x2f,0x70
+,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x5f
+,0x73,0x65,0x72,0x76,0x69,0x63,0x65,0x73
+,0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68
+,0x74,0x6d,0x6c,0x30,0x11,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x01
+,0x04,0x04,0x03,0x02,0x00,0x07,0x30,0x81
+,0x89,0x06,0x03,0x55,0x1d,0x1f,0x04,0x81
+,0x81,0x30,0x7f,0x30,0x7d,0xa0,0x7b,0xa0
+,0x79,0xa4,0x77,0x30,0x75,0x31,0x12,0x30
+,0x10,0x06,0x03,0x55,0x04,0x0a,0x13,0x09
+,0x62,0x65,0x54,0x52,0x55,0x53,0x54,0x65
+,0x64,0x31,0x1b,0x30,0x19,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x12,0x62,0x65,0x54,0x52
+,0x55,0x53,0x54,0x65,0x64,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x73,0x31,0x33
+,0x30,0x31,0x06,0x03,0x55,0x04,0x03,0x13
+,0x2a,0x62,0x65,0x54,0x52,0x55,0x53,0x54
+,0x65,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x41,0x20,0x2d,0x20,0x45,0x6e,0x74
+,0x72,0x75,0x73,0x74,0x20,0x49,0x6d,0x70
+,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74
+,0x69,0x6f,0x6e,0x31,0x0d,0x30,0x0b,0x06
+,0x03,0x55,0x04,0x03,0x13,0x04,0x43,0x52
+,0x4c,0x31,0x30,0x2b,0x06,0x03,0x55,0x1d
+,0x10,0x04,0x24,0x30,0x22,0x80,0x0f,0x32
+,0x30,0x30,0x32,0x30,0x34,0x31,0x31,0x30
+,0x38,0x32,0x34,0x32,0x37,0x5a,0x81,0x0f
+,0x32,0x30,0x32,0x32,0x30,0x34,0x31,0x31
+,0x30,0x38,0x35,0x34,0x32,0x37,0x5a,0x30
+,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04
+,0x03,0x02,0x01,0x06,0x30,0x1f,0x06,0x03
+,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80
+,0x14,0x7d,0x70,0xe5,0xae,0x38,0x8b,0x06
+,0x3f,0xaa,0x1c,0x1a,0x8f,0xf9,0xcf,0x24
+,0x30,0xaa,0x84,0x84,0x16,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0x7d,0x70,0xe5,0xae,0x38,0x8b,0x06,0x3f
+,0xaa,0x1c,0x1a,0x8f,0xf9,0xcf,0x24,0x30
+,0xaa,0x84,0x84,0x16,0x30,0x0c,0x06,0x03
+,0x55,0x1d,0x13,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x1d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf6,0x7d,0x07,0x41,0x00,0x04
+,0x10,0x30,0x0e,0x1b,0x08,0x56,0x36,0x2e
+,0x30,0x3a,0x34,0x2e,0x30,0x03,0x02,0x04
+,0x90,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0x2a,0xb8,0x17
+,0xce,0x1f,0x10,0x94,0xeb,0xb8,0x9a,0xb7
+,0xb9,0x5f,0xec,0xda,0xf7,0x92,0x24,0xac
+,0xdc,0x92,0x3b,0xc7,0x20,0x8d,0xf2,0x99
+,0xe5,0x5d,0x38,0xa1,0xc2,0x34,0xed,0xc5
+,0x13,0x59,0x5c,0x05,0xb5,0x2b,0x4f,0x61
+,0x9b,0x91,0xfb,0x41,0xfc,0xfc,0xd5,0x3c
+,0x4d,0x98,0x76,0x06,0xf5,0x81,0x7d,0xeb
+,0xdd,0x90,0xe6,0xd1,0x56,0x54,0xda,0xe3
+,0x2d,0x0c,0x9f,0x11,0x32,0x94,0x22,0x01
+,0x7a,0xf6,0x6c,0x2c,0x74,0x67,0x04,0xcc
+,0xa5,0x8f,0x8e,0x2c,0xb3,0x43,0xb5,0x94
+,0xa2,0xd0,0x7d,0xe9,0x62,0x7f,0x06,0xbe
+,0x27,0x01,0x83,0x9e,0x3a,0xfd,0x8a,0xee
+,0x98,0x43,0x4a,0x6b,0xd7,0xb5,0x97,0x3b
+,0x3a,0xbf,0x4f,0x6d,0xb4,0x63,0xfa,0x33
+,0x00,0x34,0x2e,0x2d,0x6d,0x96,0xc9,0x7b
+,0xca,0x99,0x63,0xba,0xbe,0xf4,0xf6,0x30
+,0xa0,0x2d,0x98,0x96,0xe9,0x56,0x44,0x05
+,0xa9,0x44,0xa3,0x61,0x10,0xeb,0x82,0xa1
+,0x67,0x5d,0xbc,0x5d,0x27,0x75,0xaa,0x8a
+,0x28,0x36,0x2a,0x38,0x92,0xd9,0xdd,0xa4
+,0x5e,0x00,0xa5,0xcc,0xcc,0x7c,0x29,0x2a
+,0xde,0x28,0x90,0xab,0xb7,0xe1,0xb6,0xff
+,0x7d,0x25,0x0b,0x40,0xd8,0xaa,0x34,0xa3
+,0x2d,0xde,0x07,0xeb,0x5f,0xce,0x0a,0xdd
+,0xca,0x7e,0x3a,0x7d,0x26,0xc1,0x62,0x68
+,0x3a,0xe6,0x2f,0x37,0xf3,0x81,0x86,0x21
+,0xc4,0xa9,0x64,0xaa,0xef,0x45,0x36,0xd1
+,0x1a,0x66,0x7c,0xf8,0xe9,0x37,0xd6,0xd6
+,0x61,0xbe,0xa2,0xad,0x48,0xe7,0xdf,0xe6
+,0x74,0xfe,0xd3,0x6d,0x7d,0xd2,0x25,0xdc
+,0xac,0x62,0x57,0xa9,0xf7};
+const unsigned int NptTlsTrustAnchor_Base_0050_Size = 1621;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0051.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0051.cpp
new file mode 100644
index 0000000..be6f125
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0051.cpp
@@ -0,0 +1,210 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* beTRUSTed Root CA - RSA Implementation */
+const unsigned char NptTlsTrustAnchor_Base_0051_Data[1388] = {
+0x30,0x82,0x05,0x68,0x30,0x82,0x04,0x50
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x3b
+,0x59,0xc7,0x7b,0xcd,0x5b,0x57,0x9e,0xbd
+,0x37,0x52,0xac,0x76,0xb4,0xaa,0x1a,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x62
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x09,0x62,0x65,0x54,0x52,0x55
+,0x53,0x54,0x65,0x64,0x31,0x1b,0x30,0x19
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x12,0x62
+,0x65,0x54,0x52,0x55,0x53,0x54,0x65,0x64
+,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41
+,0x73,0x31,0x2f,0x30,0x2d,0x06,0x03,0x55
+,0x04,0x03,0x13,0x26,0x62,0x65,0x54,0x52
+,0x55,0x53,0x54,0x65,0x64,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x20,0x2d,0x20
+,0x52,0x53,0x41,0x20,0x49,0x6d,0x70,0x6c
+,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69
+,0x6f,0x6e,0x30,0x1e,0x17,0x0d,0x30,0x32
+,0x30,0x34,0x31,0x31,0x31,0x31,0x31,0x38
+,0x31,0x33,0x5a,0x17,0x0d,0x32,0x32,0x30
+,0x34,0x31,0x32,0x31,0x31,0x30,0x37,0x32
+,0x35,0x5a,0x30,0x62,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x09,0x62
+,0x65,0x54,0x52,0x55,0x53,0x54,0x65,0x64
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x12,0x62,0x65,0x54,0x52,0x55
+,0x53,0x54,0x65,0x64,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x73,0x31,0x2f,0x30
+,0x2d,0x06,0x03,0x55,0x04,0x03,0x13,0x26
+,0x62,0x65,0x54,0x52,0x55,0x53,0x54,0x65
+,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x20,0x2d,0x20,0x52,0x53,0x41,0x20
+,0x49,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e
+,0x74,0x61,0x74,0x69,0x6f,0x6e,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xe4
+,0xba,0x34,0x30,0x09,0x8e,0x57,0xd0,0xb9
+,0x06,0x2c,0x6f,0x6e,0x24,0x80,0x22,0xbf
+,0x5d,0x43,0xa6,0xfa,0x4f,0xac,0x82,0xe7
+,0x1c,0x68,0x70,0x85,0x1b,0xa3,0x6e,0xb5
+,0xaa,0x78,0xd9,0x6e,0x07,0x4b,0x3f,0xe9
+,0xdf,0xf5,0xea,0xe8,0x54,0xa1,0x61,0x8a
+,0x0e,0x2f,0x69,0x75,0x18,0xb7,0x0c,0xe5
+,0x14,0x8d,0x71,0x6e,0x98,0xb8,0x55,0xfc
+,0x0c,0x95,0xd0,0x9b,0x6e,0xe1,0x2d,0x88
+,0xd4,0x3a,0x40,0x6b,0x92,0xf1,0x99,0x96
+,0x64,0xde,0xdb,0xff,0x78,0xf4,0xee,0x96
+,0x1d,0x47,0x89,0x7c,0xd4,0xbe,0xb9,0x88
+,0x77,0x23,0x3a,0x09,0xe6,0x04,0x9e,0x6d
+,0xaa,0x5e,0xd2,0xc8,0xbd,0x9a,0x4e,0x19
+,0xdf,0x89,0xea,0x5b,0x0e,0x7e,0xc3,0xe4
+,0xb4,0xf0,0xe0,0x69,0x3b,0x88,0x0f,0x41
+,0x90,0xf8,0xd4,0x71,0x43,0x24,0xc1,0x8f
+,0x26,0x4b,0x3b,0x56,0xe9,0xff,0x8c,0x6c
+,0x37,0xe9,0x45,0xad,0x85,0x8c,0x53,0xc3
+,0x60,0x86,0x90,0x4a,0x96,0xc9,0xb3,0x54
+,0xb0,0xbb,0x17,0xf0,0x1c,0x45,0xd9,0xd4
+,0x1b,0x19,0x64,0x56,0x0a,0x19,0xf7,0xcc
+,0xe1,0xff,0x86,0xaf,0x7e,0x58,0x5e,0xac
+,0x7a,0x90,0x1f,0xc9,0x28,0x39,0x45,0x7b
+,0xa2,0xb6,0xc7,0x9c,0x1f,0xda,0x85,0xd4
+,0x21,0x86,0x59,0x30,0x93,0xbe,0x53,0x33
+,0x37,0xf6,0xef,0x41,0xcf,0x33,0xc7,0xab
+,0x72,0x6b,0x25,0xf5,0xf3,0x53,0x1b,0x0c
+,0x4c,0x2e,0xf1,0x75,0x4b,0xef,0xa0,0x87
+,0xf7,0xfe,0x8a,0x15,0xd0,0x6c,0xd5,0xcb
+,0xf9,0x68,0x53,0xb9,0x70,0x15,0x13,0xc2
+,0xf5,0x2e,0xfb,0x43,0x35,0x75,0x2d,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x82,0x02,0x18
+,0x30,0x82,0x02,0x14,0x30,0x0c,0x06,0x03
+,0x55,0x1d,0x13,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x82,0x01,0xb5,0x06,0x03
+,0x55,0x1d,0x20,0x04,0x82,0x01,0xac,0x30
+,0x82,0x01,0xa8,0x30,0x82,0x01,0xa4,0x06
+,0x0f,0x2b,0x06,0x01,0x04,0x01,0xb1,0x3e
+,0x00,0x00,0x03,0x09,0x28,0x83,0x91,0x31
+,0x30,0x82,0x01,0x8f,0x30,0x41,0x06,0x08
+,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01
+,0x16,0x35,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x62,0x65,0x74
+,0x72,0x75,0x73,0x74,0x65,0x64,0x2e,0x63
+,0x6f,0x6d,0x2f,0x70,0x72,0x6f,0x64,0x75
+,0x63,0x74,0x73,0x5f,0x73,0x65,0x72,0x76
+,0x69,0x63,0x65,0x73,0x2f,0x69,0x6e,0x64
+,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x30
+,0x82,0x01,0x48,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x02,0x02,0x30,0x82,0x01
+,0x3a,0x1a,0x82,0x01,0x36,0x52,0x65,0x6c
+,0x69,0x61,0x6e,0x63,0x65,0x20,0x6f,0x6e
+,0x20,0x6f,0x72,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x66,0x20,0x74,0x68,0x69,0x73,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x65,0x20,0x63,0x72,0x65,0x61
+,0x74,0x65,0x73,0x20,0x61,0x6e,0x20,0x61
+,0x63,0x6b,0x6e,0x6f,0x77,0x6c,0x65,0x64
+,0x67,0x6d,0x65,0x6e,0x74,0x20,0x61,0x6e
+,0x64,0x20,0x61,0x63,0x63,0x65,0x70,0x74
+,0x61,0x6e,0x63,0x65,0x20,0x6f,0x66,0x20
+,0x74,0x68,0x65,0x20,0x74,0x68,0x65,0x6e
+,0x20,0x61,0x70,0x70,0x6c,0x69,0x63,0x61
+,0x62,0x6c,0x65,0x20,0x73,0x74,0x61,0x6e
+,0x64,0x61,0x72,0x64,0x20,0x74,0x65,0x72
+,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x63
+,0x6f,0x6e,0x64,0x69,0x74,0x69,0x6f,0x6e
+,0x73,0x20,0x6f,0x66,0x20,0x75,0x73,0x65
+,0x2c,0x20,0x74,0x68,0x65,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x50,0x72,0x61,0x63
+,0x74,0x69,0x63,0x65,0x20,0x53,0x74,0x61
+,0x74,0x65,0x6d,0x65,0x6e,0x74,0x20,0x61
+,0x6e,0x64,0x20,0x74,0x68,0x65,0x20,0x52
+,0x65,0x6c,0x79,0x69,0x6e,0x67,0x20,0x50
+,0x61,0x72,0x74,0x79,0x20,0x41,0x67,0x72
+,0x65,0x65,0x6d,0x65,0x6e,0x74,0x2c,0x20
+,0x77,0x68,0x69,0x63,0x68,0x20,0x63,0x61
+,0x6e,0x20,0x62,0x65,0x20,0x66,0x6f,0x75
+,0x6e,0x64,0x20,0x61,0x74,0x20,0x74,0x68
+,0x65,0x20,0x62,0x65,0x54,0x52,0x55,0x53
+,0x54,0x65,0x64,0x20,0x77,0x65,0x62,0x20
+,0x73,0x69,0x74,0x65,0x2c,0x20,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x62,0x65,0x74,0x72,0x75,0x73,0x74
+,0x65,0x64,0x2e,0x63,0x6f,0x6d,0x2f,0x70
+,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x5f
+,0x73,0x65,0x72,0x76,0x69,0x63,0x65,0x73
+,0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68
+,0x74,0x6d,0x6c,0x30,0x0b,0x06,0x03,0x55
+,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04
+,0x18,0x30,0x16,0x80,0x14,0xa9,0xec,0x14
+,0x7e,0xf9,0xd9,0x43,0xcc,0x53,0x2b,0x14
+,0xad,0xcf,0xf7,0xf0,0x59,0x89,0x41,0xcd
+,0x19,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0xa9,0xec,0x14,0x7e
+,0xf9,0xd9,0x43,0xcc,0x53,0x2b,0x14,0xad
+,0xcf,0xf7,0xf0,0x59,0x89,0x41,0xcd,0x19
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0xdb,0x97,0xb0,0x75
+,0xea,0x0c,0xc4,0xc1,0x98,0xca,0x56,0x05
+,0xc0,0xa8,0xad,0x26,0x48,0xaf,0x2d,0x20
+,0xe8,0x81,0xc7,0xb6,0xdf,0x43,0xc1,0x2c
+,0x1d,0x75,0x4b,0xd4,0x42,0x8d,0xe7,0x7a
+,0xa8,0x74,0xdc,0x66,0x42,0x59,0x87,0xb3
+,0xf5,0x69,0x6d,0xd9,0xa9,0x9e,0xb3,0x7d
+,0x1c,0x31,0xc1,0xf5,0x54,0xe2,0x59,0x24
+,0x49,0xe5,0xee,0xbd,0x39,0xa6,0x6b,0x8a
+,0x98,0x44,0xfb,0x9b,0xd7,0x2a,0x83,0x97
+,0x34,0x2d,0xc7,0x7d,0x35,0x4c,0x2d,0x34
+,0xb8,0x3e,0x0d,0xc4,0xec,0x88,0x27,0xaf
+,0x9e,0x92,0xfd,0x50,0x61,0x82,0xa8,0x60
+,0x07,0x14,0x53,0xcc,0x65,0x13,0xc1,0xf6
+,0x47,0x44,0x69,0xd2,0x31,0xc8,0xa6,0xdd
+,0x2e,0xb3,0x0b,0xde,0x4a,0x8d,0x5b,0x3d
+,0xab,0x0d,0xc2,0x35,0x52,0xa2,0x56,0x37
+,0xcc,0x32,0x8b,0x28,0x85,0x42,0x9c,0x91
+,0x40,0x7a,0x70,0x2b,0x38,0x36,0xd5,0xe1
+,0x73,0x1a,0x1f,0xe5,0xfa,0x7e,0x5f,0xdc
+,0xd6,0x9c,0x3b,0x30,0xea,0xdb,0xc0,0x5b
+,0x27,0x5c,0xd3,0x73,0x07,0xc1,0xc2,0xf3
+,0x4c,0x9b,0x6f,0x9f,0x1b,0xca,0x1e,0xaa
+,0xa8,0x38,0x33,0x09,0x58,0xb2,0xae,0xfc
+,0x07,0xe8,0x36,0xdc,0x55,0xba,0x2f,0x4f
+,0x40,0xfe,0x7a,0xbd,0x06,0xa6,0x81,0xc1
+,0x93,0x22,0x7c,0x86,0x11,0x0a,0x06,0x77
+,0x48,0xae,0x35,0xb7,0x2f,0x32,0x9a,0x61
+,0x5e,0x8b,0xbe,0x29,0x9f,0x29,0x24,0x88
+,0x56,0x39,0x2c,0xa8,0xd2,0xab,0x96,0x03
+,0x5a,0xd4,0x48,0x9f,0xb9,0x40,0x84,0x0b
+,0x98,0x68,0xfb,0x01,0x43,0xd6,0x1b,0xe2
+,0x09,0xb1,0x97,0x1c};
+const unsigned int NptTlsTrustAnchor_Base_0051_Size = 1388;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0052.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0052.cpp
new file mode 100644
index 0000000..7f6db15
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0052.cpp
@@ -0,0 +1,145 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* RSA Security 2048 v3 */
+const unsigned char NptTlsTrustAnchor_Base_0052_Data[869] = {
+0x30,0x82,0x03,0x61,0x30,0x82,0x02,0x49
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x0a
+,0x01,0x01,0x01,0x00,0x00,0x02,0x7c,0x00
+,0x00,0x00,0x0a,0x00,0x00,0x00,0x02,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x3a
+,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x10,0x52,0x53,0x41,0x20,0x53
+,0x65,0x63,0x75,0x72,0x69,0x74,0x79,0x20
+,0x49,0x6e,0x63,0x31,0x1d,0x30,0x1b,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x14,0x52,0x53
+,0x41,0x20,0x53,0x65,0x63,0x75,0x72,0x69
+,0x74,0x79,0x20,0x32,0x30,0x34,0x38,0x20
+,0x56,0x33,0x30,0x1e,0x17,0x0d,0x30,0x31
+,0x30,0x32,0x32,0x32,0x32,0x30,0x33,0x39
+,0x32,0x33,0x5a,0x17,0x0d,0x32,0x36,0x30
+,0x32,0x32,0x32,0x32,0x30,0x33,0x39,0x32
+,0x33,0x5a,0x30,0x3a,0x31,0x19,0x30,0x17
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x10,0x52
+,0x53,0x41,0x20,0x53,0x65,0x63,0x75,0x72
+,0x69,0x74,0x79,0x20,0x49,0x6e,0x63,0x31
+,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x14,0x52,0x53,0x41,0x20,0x53,0x65
+,0x63,0x75,0x72,0x69,0x74,0x79,0x20,0x32
+,0x30,0x34,0x38,0x20,0x56,0x33,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xb7
+,0x8f,0x55,0x71,0xd2,0x80,0xdd,0x7b,0x69
+,0x79,0xa7,0xf0,0x18,0x50,0x32,0x3c,0x62
+,0x67,0xf6,0x0a,0x95,0x07,0xdd,0xe6,0x1b
+,0xf3,0x9e,0xd9,0xd2,0x41,0x54,0x6b,0xad
+,0x9f,0x7c,0xbe,0x19,0xcd,0xfb,0x46,0xab
+,0x41,0x68,0x1e,0x18,0xea,0x55,0xc8,0x2f
+,0x91,0x78,0x89,0x28,0xfb,0x27,0x29,0x60
+,0xff,0xdf,0x8f,0x8c,0x3b,0xc9,0x49,0x9b
+,0xb5,0xa4,0x94,0xce,0x01,0xea,0x3e,0xb5
+,0x63,0x7b,0x7f,0x26,0xfd,0x19,0xdd,0xc0
+,0x21,0xbd,0x84,0xd1,0x2d,0x4f,0x46,0xc3
+,0x4e,0xdc,0xd8,0x37,0x39,0x3b,0x28,0xaf
+,0xcb,0x9d,0x1a,0xea,0x2b,0xaf,0x21,0xa5
+,0xc1,0x23,0x22,0xb8,0xb8,0x1b,0x5a,0x13
+,0x87,0x57,0x83,0xd1,0xf0,0x20,0xe7,0xe8
+,0x4f,0x23,0x42,0xb0,0x00,0xa5,0x7d,0x89
+,0xe9,0xe9,0x61,0x73,0x94,0x98,0x71,0x26
+,0xbc,0x2d,0x6a,0xe0,0xf7,0x4d,0xf0,0xf1
+,0xb6,0x2a,0x38,0x31,0x81,0x0d,0x29,0xe1
+,0x00,0xc1,0x51,0x0f,0x4c,0x52,0xf8,0x04
+,0x5a,0xaa,0x7d,0x72,0xd3,0xb8,0x87,0x2a
+,0xbb,0x63,0x10,0x03,0x2a,0xb3,0xa1,0x4f
+,0x0d,0x5a,0x5e,0x46,0xb7,0x3d,0x0e,0xf5
+,0x74,0xec,0x99,0x9f,0xf9,0x3d,0x24,0x81
+,0x88,0xa6,0xdd,0x60,0x54,0xe8,0x95,0x36
+,0x3d,0xc6,0x09,0x93,0x9a,0xa3,0x12,0x80
+,0x00,0x55,0x99,0x19,0x47,0xbd,0xd0,0xa5
+,0x7c,0xc3,0xba,0xfb,0x1f,0xf7,0xf5,0x0f
+,0xf8,0xac,0xb9,0xb5,0xf4,0x37,0x98,0x13
+,0x18,0xde,0x85,0x5b,0xb7,0x0c,0x82,0x3b
+,0x87,0x6f,0x95,0x39,0x58,0x30,0xda,0x6e
+,0x01,0x68,0x17,0x22,0xcc,0xc0,0x0b,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x63,0x30,0x61
+,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01
+,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0x07,0xc3
+,0x51,0x30,0xa4,0xaa,0xe9,0x45,0xae,0x35
+,0x24,0xfa,0xff,0x24,0x2c,0x33,0xd0,0xb1
+,0x9d,0x8c,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x07,0xc3,0x51
+,0x30,0xa4,0xaa,0xe9,0x45,0xae,0x35,0x24
+,0xfa,0xff,0x24,0x2c,0x33,0xd0,0xb1,0x9d
+,0x8c,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0x5f,0x3e,0x86
+,0x76,0x6e,0xb8,0x35,0x3c,0x4e,0x36,0x1c
+,0x1e,0x79,0x98,0xbf,0xfd,0xd5,0x12,0x11
+,0x79,0x52,0x0e,0xee,0x31,0x89,0xbc,0xdd
+,0x7f,0xf9,0xd1,0xc6,0x15,0x21,0xe8,0x8a
+,0x01,0x54,0x0d,0x3a,0xfb,0x54,0xb9,0xd6
+,0x63,0xd4,0xb1,0xaa,0x96,0x4d,0xa2,0x42
+,0x4d,0xd4,0x53,0x1f,0x8b,0x10,0xde,0x7f
+,0x65,0xbe,0x60,0x13,0x27,0x71,0x88,0xa4
+,0x73,0xe3,0x84,0x63,0xd1,0xa4,0x55,0xe1
+,0x50,0x93,0xe6,0x1b,0x0e,0x79,0xd0,0x67
+,0xbc,0x46,0xc8,0xbf,0x3f,0x17,0x0d,0x95
+,0xe6,0xc6,0x90,0x69,0xde,0xe7,0xb4,0x2f
+,0xde,0x95,0x7d,0xd0,0x12,0x3f,0x3d,0x3e
+,0x7f,0x4d,0x3f,0x14,0x68,0xf5,0x11,0x50
+,0xd5,0xc1,0xf4,0x90,0xa5,0x08,0x1d,0x31
+,0x60,0xff,0x60,0x8c,0x23,0x54,0x0a,0xaf
+,0xfe,0xa1,0x6e,0xc5,0xd1,0x7a,0x2a,0x68
+,0x78,0xcf,0x1e,0x82,0x0a,0x20,0xb4,0x1f
+,0xad,0xe5,0x85,0xb2,0x6a,0x68,0x75,0x4e
+,0xad,0x25,0x37,0x94,0x85,0xbe,0xbd,0xa1
+,0xd4,0xea,0xb7,0x0c,0x4b,0x3c,0x9d,0xe8
+,0x12,0x00,0xf0,0x5f,0xac,0x0d,0xe1,0xac
+,0x70,0x63,0x73,0xf7,0x7f,0x79,0x9f,0x32
+,0x25,0x42,0x74,0x05,0x80,0x28,0xbf,0xbd
+,0xc1,0x24,0x96,0x58,0x15,0xb1,0x17,0x21
+,0xe9,0x89,0x4b,0xdb,0x07,0x88,0x67,0xf4
+,0x15,0xad,0x70,0x3e,0x2f,0x4d,0x85,0x3b
+,0xc2,0xb7,0xdb,0xfe,0x98,0x68,0x23,0x89
+,0xe1,0x74,0x0f,0xde,0xf4,0xc5,0x84,0x63
+,0x29,0x1b,0xcc,0xcb,0x07,0xc9,0x00,0xa4
+,0xa9,0xd7,0xc2,0x22,0x4f,0x67,0xd7,0x77
+,0xec,0x20,0x05,0x61,0xde};
+const unsigned int NptTlsTrustAnchor_Base_0052_Size = 869;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0053.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0053.cpp
new file mode 100644
index 0000000..cecb5c3
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0053.cpp
@@ -0,0 +1,113 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* RSA Security 1024 v3 */
+const unsigned char NptTlsTrustAnchor_Base_0053_Data[608] = {
+0x30,0x82,0x02,0x5c,0x30,0x82,0x01,0xc5
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x0a
+,0x01,0x01,0x01,0x00,0x00,0x02,0x7c,0x00
+,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x3a
+,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x10,0x52,0x53,0x41,0x20,0x53
+,0x65,0x63,0x75,0x72,0x69,0x74,0x79,0x20
+,0x49,0x6e,0x63,0x31,0x1d,0x30,0x1b,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x14,0x52,0x53
+,0x41,0x20,0x53,0x65,0x63,0x75,0x72,0x69
+,0x74,0x79,0x20,0x31,0x30,0x32,0x34,0x20
+,0x56,0x33,0x30,0x1e,0x17,0x0d,0x30,0x31
+,0x30,0x32,0x32,0x32,0x32,0x31,0x30,0x31
+,0x34,0x39,0x5a,0x17,0x0d,0x32,0x36,0x30
+,0x32,0x32,0x32,0x32,0x30,0x30,0x31,0x34
+,0x39,0x5a,0x30,0x3a,0x31,0x19,0x30,0x17
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x10,0x52
+,0x53,0x41,0x20,0x53,0x65,0x63,0x75,0x72
+,0x69,0x74,0x79,0x20,0x49,0x6e,0x63,0x31
+,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x14,0x52,0x53,0x41,0x20,0x53,0x65
+,0x63,0x75,0x72,0x69,0x74,0x79,0x20,0x31
+,0x30,0x32,0x34,0x20,0x56,0x33,0x30,0x81
+,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x81,0x8d,0x00,0x30,0x81,0x89,0x02
+,0x81,0x81,0x00,0xd5,0xdd,0xfe,0x66,0x09
+,0xcf,0x24,0x3c,0x3e,0xae,0x81,0x4e,0x4e
+,0x8a,0xc4,0x69,0x80,0x5b,0x59,0x3b,0xdf
+,0xb9,0x4d,0x4c,0xca,0xb5,0x2d,0xc3,0x27
+,0x2d,0x3c,0xaf,0x00,0x42,0x6d,0xbc,0x28
+,0xa6,0x96,0xcf,0x7f,0xd7,0x58,0xac,0x83
+,0x0a,0xa3,0x55,0xb5,0x7b,0x17,0x90,0x15
+,0x84,0x4c,0x8a,0xee,0x26,0x99,0xdc,0x58
+,0xef,0xc7,0x38,0xa6,0xaa,0xaf,0xd0,0x8e
+,0x42,0xc8,0x62,0xd7,0xab,0xac,0xa9,0xfb
+,0x4a,0x7d,0xbf,0xea,0xfe,0x12,0x4d,0xdd
+,0xff,0x26,0x2d,0x6f,0x36,0x54,0x68,0xc8
+,0xd2,0x84,0x56,0xee,0x92,0x53,0x61,0x09
+,0xb3,0x3f,0x39,0x9b,0xa8,0xc9,0x9b,0xbd
+,0xce,0x9f,0x7e,0xd4,0x19,0x6a,0x16,0x29
+,0x18,0xbe,0xd7,0x3a,0x69,0xdc,0x25,0x5b
+,0x33,0x1a,0x51,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x63,0x30,0x61,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x01,0x06,0x30,0x1f,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16
+,0x80,0x14,0xc4,0xc0,0x1c,0xa4,0x07,0x94
+,0xfd,0xcd,0x4d,0x01,0xd4,0x54,0xda,0xa5
+,0x0c,0x5f,0xde,0xae,0x05,0x5a,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0xc4,0xc0,0x1c,0xa4,0x07,0x94,0xfd
+,0xcd,0x4d,0x01,0xd4,0x54,0xda,0xa5,0x0c
+,0x5f,0xde,0xae,0x05,0x5a,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x81,0x81,0x00
+,0x3f,0x2d,0x6a,0xe3,0x26,0x43,0x95,0x7d
+,0x89,0x97,0x65,0xfb,0x75,0xe4,0x72,0x1d
+,0x46,0x57,0xc4,0x61,0x6b,0x69,0x9f,0x12
+,0x9b,0x2c,0xd5,0x5a,0xe8,0xc0,0xa2,0xf0
+,0x43,0x95,0xe3,0x1f,0xe9,0x76,0xcd,0xdc
+,0xeb,0xbc,0x93,0xa0,0x65,0x0a,0xc7,0x4d
+,0x4f,0x5f,0xa7,0xaf,0xa2,0x46,0x14,0xb9
+,0x0c,0xf3,0xcc,0xbd,0x6a,0x6e,0xb7,0x9d
+,0xde,0x25,0x42,0xd0,0x54,0xff,0x9e,0x68
+,0x73,0x63,0xdc,0x24,0xeb,0x22,0xbf,0xa8
+,0x72,0xf2,0x5e,0x00,0xe1,0x0d,0x4e,0x3a
+,0x43,0x6e,0x99,0x4e,0x3f,0x89,0x78,0x03
+,0x98,0xca,0xf3,0x55,0xcc,0x9d,0xae,0x8e
+,0xc1,0xaa,0x45,0x98,0xfa,0x8f,0x1a,0xa0
+,0x8d,0x88,0x23,0xf1,0x15,0x41,0x0d,0xa5
+,0x46,0x3e,0x91,0x3f,0x8b,0xeb,0xf7,0x71
+};
+const unsigned int NptTlsTrustAnchor_Base_0053_Size = 608;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0054.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0054.cpp
new file mode 100644
index 0000000..4810eb7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0054.cpp
@@ -0,0 +1,144 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GeoTrust Global CA */
+const unsigned char NptTlsTrustAnchor_Base_0054_Data[856] = {
+0x30,0x82,0x03,0x54,0x30,0x82,0x02,0x3c
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x03,0x02
+,0x34,0x56,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x30,0x42,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53
+,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x0d,0x47,0x65,0x6f,0x54,0x72
+,0x75,0x73,0x74,0x20,0x49,0x6e,0x63,0x2e
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x03,0x13,0x12,0x47,0x65,0x6f,0x54,0x72
+,0x75,0x73,0x74,0x20,0x47,0x6c,0x6f,0x62
+,0x61,0x6c,0x20,0x43,0x41,0x30,0x1e,0x17
+,0x0d,0x30,0x32,0x30,0x35,0x32,0x31,0x30
+,0x34,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x32,0x32,0x30,0x35,0x32,0x31,0x30,0x34
+,0x30,0x30,0x30,0x30,0x5a,0x30,0x42,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x0d,0x47
+,0x65,0x6f,0x54,0x72,0x75,0x73,0x74,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x1b,0x30,0x19
+,0x06,0x03,0x55,0x04,0x03,0x13,0x12,0x47
+,0x65,0x6f,0x54,0x72,0x75,0x73,0x74,0x20
+,0x47,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x43
+,0x41,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xda,0xcc,0x18,0x63,0x30,0xfd
+,0xf4,0x17,0x23,0x1a,0x56,0x7e,0x5b,0xdf
+,0x3c,0x6c,0x38,0xe4,0x71,0xb7,0x78,0x91
+,0xd4,0xbc,0xa1,0xd8,0x4c,0xf8,0xa8,0x43
+,0xb6,0x03,0xe9,0x4d,0x21,0x07,0x08,0x88
+,0xda,0x58,0x2f,0x66,0x39,0x29,0xbd,0x05
+,0x78,0x8b,0x9d,0x38,0xe8,0x05,0xb7,0x6a
+,0x7e,0x71,0xa4,0xe6,0xc4,0x60,0xa6,0xb0
+,0xef,0x80,0xe4,0x89,0x28,0x0f,0x9e,0x25
+,0xd6,0xed,0x83,0xf3,0xad,0xa6,0x91,0xc7
+,0x98,0xc9,0x42,0x18,0x35,0x14,0x9d,0xad
+,0x98,0x46,0x92,0x2e,0x4f,0xca,0xf1,0x87
+,0x43,0xc1,0x16,0x95,0x57,0x2d,0x50,0xef
+,0x89,0x2d,0x80,0x7a,0x57,0xad,0xf2,0xee
+,0x5f,0x6b,0xd2,0x00,0x8d,0xb9,0x14,0xf8
+,0x14,0x15,0x35,0xd9,0xc0,0x46,0xa3,0x7b
+,0x72,0xc8,0x91,0xbf,0xc9,0x55,0x2b,0xcd
+,0xd0,0x97,0x3e,0x9c,0x26,0x64,0xcc,0xdf
+,0xce,0x83,0x19,0x71,0xca,0x4e,0xe6,0xd4
+,0xd5,0x7b,0xa9,0x19,0xcd,0x55,0xde,0xc8
+,0xec,0xd2,0x5e,0x38,0x53,0xe5,0x5c,0x4f
+,0x8c,0x2d,0xfe,0x50,0x23,0x36,0xfc,0x66
+,0xe6,0xcb,0x8e,0xa4,0x39,0x19,0x00,0xb7
+,0x95,0x02,0x39,0x91,0x0b,0x0e,0xfe,0x38
+,0x2e,0xd1,0x1d,0x05,0x9a,0xf6,0x4d,0x3e
+,0x6f,0x0f,0x07,0x1d,0xaf,0x2c,0x1e,0x8f
+,0x60,0x39,0xe2,0xfa,0x36,0x53,0x13,0x39
+,0xd4,0x5e,0x26,0x2b,0xdb,0x3d,0xa8,0x14
+,0xbd,0x32,0xeb,0x18,0x03,0x28,0x52,0x04
+,0x71,0xe5,0xab,0x33,0x3d,0xe1,0x38,0xbb
+,0x07,0x36,0x84,0x62,0x9c,0x79,0xea,0x16
+,0x30,0xf4,0x5f,0xc0,0x2b,0xe8,0x71,0x6b
+,0xe4,0xf9,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x53,0x30,0x51,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0xc0
+,0x7a,0x98,0x68,0x8d,0x89,0xfb,0xab,0x05
+,0x64,0x0c,0x11,0x7d,0xaa,0x7d,0x65,0xb8
+,0xca,0xcc,0x4e,0x30,0x1f,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14
+,0xc0,0x7a,0x98,0x68,0x8d,0x89,0xfb,0xab
+,0x05,0x64,0x0c,0x11,0x7d,0xaa,0x7d,0x65
+,0xb8,0xca,0xcc,0x4e,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0x35,0xe3,0x29,0x6a,0xe5,0x2f,0x5d,0x54
+,0x8e,0x29,0x50,0x94,0x9f,0x99,0x1a,0x14
+,0xe4,0x8f,0x78,0x2a,0x62,0x94,0xa2,0x27
+,0x67,0x9e,0xd0,0xcf,0x1a,0x5e,0x47,0xe9
+,0xc1,0xb2,0xa4,0xcf,0xdd,0x41,0x1a,0x05
+,0x4e,0x9b,0x4b,0xee,0x4a,0x6f,0x55,0x52
+,0xb3,0x24,0xa1,0x37,0x0a,0xeb,0x64,0x76
+,0x2a,0x2e,0x2c,0xf3,0xfd,0x3b,0x75,0x90
+,0xbf,0xfa,0x71,0xd8,0xc7,0x3d,0x37,0xd2
+,0xb5,0x05,0x95,0x62,0xb9,0xa6,0xde,0x89
+,0x3d,0x36,0x7b,0x38,0x77,0x48,0x97,0xac
+,0xa6,0x20,0x8f,0x2e,0xa6,0xc9,0x0c,0xc2
+,0xb2,0x99,0x45,0x00,0xc7,0xce,0x11,0x51
+,0x22,0x22,0xe0,0xa5,0xea,0xb6,0x15,0x48
+,0x09,0x64,0xea,0x5e,0x4f,0x74,0xf7,0x05
+,0x3e,0xc7,0x8a,0x52,0x0c,0xdb,0x15,0xb4
+,0xbd,0x6d,0x9b,0xe5,0xc6,0xb1,0x54,0x68
+,0xa9,0xe3,0x69,0x90,0xb6,0x9a,0xa5,0x0f
+,0xb8,0xb9,0x3f,0x20,0x7d,0xae,0x4a,0xb5
+,0xb8,0x9c,0xe4,0x1d,0xb6,0xab,0xe6,0x94
+,0xa5,0xc1,0xc7,0x83,0xad,0xdb,0xf5,0x27
+,0x87,0x0e,0x04,0x6c,0xd5,0xff,0xdd,0xa0
+,0x5d,0xed,0x87,0x52,0xb7,0x2b,0x15,0x02
+,0xae,0x39,0xa6,0x6a,0x74,0xe9,0xda,0xc4
+,0xe7,0xbc,0x4d,0x34,0x1e,0xa9,0x5c,0x4d
+,0x33,0x5f,0x92,0x09,0x2f,0x88,0x66,0x5d
+,0x77,0x97,0xc7,0x1d,0x76,0x13,0xa9,0xd5
+,0xe5,0xf1,0x16,0x09,0x11,0x35,0xd5,0xac
+,0xdb,0x24,0x71,0x70,0x2c,0x98,0x56,0x0b
+,0xd9,0x17,0xb4,0xd1,0xe3,0x51,0x2b,0x5e
+,0x75,0xe8,0xd5,0xd0,0xdc,0x4f,0x34,0xed
+,0xc2,0x05,0x66,0x80,0xa1,0xcb,0xe6,0x33
+};
+const unsigned int NptTlsTrustAnchor_Base_0054_Size = 856;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0055.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0055.cpp
new file mode 100644
index 0000000..6d282a6
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0055.cpp
@@ -0,0 +1,146 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GeoTrust Global CA 2 */
+const unsigned char NptTlsTrustAnchor_Base_0055_Data[874] = {
+0x30,0x82,0x03,0x66,0x30,0x82,0x02,0x4e
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x44,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16
+,0x30,0x14,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0d,0x47,0x65,0x6f,0x54,0x72,0x75,0x73
+,0x74,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1d
+,0x30,0x1b,0x06,0x03,0x55,0x04,0x03,0x13
+,0x14,0x47,0x65,0x6f,0x54,0x72,0x75,0x73
+,0x74,0x20,0x47,0x6c,0x6f,0x62,0x61,0x6c
+,0x20,0x43,0x41,0x20,0x32,0x30,0x1e,0x17
+,0x0d,0x30,0x34,0x30,0x33,0x30,0x34,0x30
+,0x35,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x31,0x39,0x30,0x33,0x30,0x34,0x30,0x35
+,0x30,0x30,0x30,0x30,0x5a,0x30,0x44,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x0d,0x47
+,0x65,0x6f,0x54,0x72,0x75,0x73,0x74,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x1d,0x30,0x1b
+,0x06,0x03,0x55,0x04,0x03,0x13,0x14,0x47
+,0x65,0x6f,0x54,0x72,0x75,0x73,0x74,0x20
+,0x47,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x43
+,0x41,0x20,0x32,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xef,0x3c,0x4d,0x40
+,0x3d,0x10,0xdf,0x3b,0x53,0x00,0xe1,0x67
+,0xfe,0x94,0x60,0x15,0x3e,0x85,0x88,0xf1
+,0x89,0x0d,0x90,0xc8,0x28,0x23,0x99,0x05
+,0xe8,0x2b,0x20,0x9d,0xc6,0xf3,0x60,0x46
+,0xd8,0xc1,0xb2,0xd5,0x8c,0x31,0xd9,0xdc
+,0x20,0x79,0x24,0x81,0xbf,0x35,0x32,0xfc
+,0x63,0x69,0xdb,0xb1,0x2a,0x6b,0xee,0x21
+,0x58,0xf2,0x08,0xe9,0x78,0xcb,0x6f,0xcb
+,0xfc,0x16,0x52,0xc8,0x91,0xc4,0xff,0x3d
+,0x73,0xde,0xb1,0x3e,0xa7,0xc2,0x7d,0x66
+,0xc1,0xf5,0x7e,0x52,0x24,0x1a,0xe2,0xd5
+,0x67,0x91,0xd0,0x82,0x10,0xd7,0x78,0x4b
+,0x4f,0x2b,0x42,0x39,0xbd,0x64,0x2d,0x40
+,0xa0,0xb0,0x10,0xd3,0x38,0x48,0x46,0x88
+,0xa1,0x0c,0xbb,0x3a,0x33,0x2a,0x62,0x98
+,0xfb,0x00,0x9d,0x13,0x59,0x7f,0x6f,0x3b
+,0x72,0xaa,0xee,0xa6,0x0f,0x86,0xf9,0x05
+,0x61,0xea,0x67,0x7f,0x0c,0x37,0x96,0x8b
+,0xe6,0x69,0x16,0x47,0x11,0xc2,0x27,0x59
+,0x03,0xb3,0xa6,0x60,0xc2,0x21,0x40,0x56
+,0xfa,0xa0,0xc7,0x7d,0x3a,0x13,0xe3,0xec
+,0x57,0xc7,0xb3,0xd6,0xae,0x9d,0x89,0x80
+,0xf7,0x01,0xe7,0x2c,0xf6,0x96,0x2b,0x13
+,0x0d,0x79,0x2c,0xd9,0xc0,0xe4,0x86,0x7b
+,0x4b,0x8c,0x0c,0x72,0x82,0x8a,0xfb,0x17
+,0xcd,0x00,0x6c,0x3a,0x13,0x3c,0xb0,0x84
+,0x87,0x4b,0x16,0x7a,0x29,0xb2,0x4f,0xdb
+,0x1d,0xd4,0x0b,0xf3,0x66,0x37,0xbd,0xd8
+,0xf6,0x57,0xbb,0x5e,0x24,0x7a,0xb8,0x3c
+,0x8b,0xb9,0xfa,0x92,0x1a,0x1a,0x84,0x9e
+,0xd8,0x74,0x8f,0xaa,0x1b,0x7f,0x5e,0xf4
+,0xfe,0x45,0x22,0x21,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x63,0x30,0x61,0x30,0x0f,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0x71,0x38,0x36,0xf2,0x02,0x31,0x53
+,0x47,0x2b,0x6e,0xba,0x65,0x46,0xa9,0x10
+,0x15,0x58,0x20,0x05,0x09,0x30,0x1f,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16
+,0x80,0x14,0x71,0x38,0x36,0xf2,0x02,0x31
+,0x53,0x47,0x2b,0x6e,0xba,0x65,0x46,0xa9
+,0x10,0x15,0x58,0x20,0x05,0x09,0x30,0x0e
+,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff
+,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01
+,0x01,0x00,0x03,0xf7,0xb5,0x2b,0xab,0x5d
+,0x10,0xfc,0x7b,0xb2,0xb2,0x5e,0xac,0x9b
+,0x0e,0x7e,0x53,0x78,0x59,0x3e,0x42,0x04
+,0xfe,0x75,0xa3,0xad,0xac,0x81,0x4e,0xd7
+,0x02,0x8b,0x5e,0xc4,0x2d,0xc8,0x52,0x76
+,0xc7,0x2c,0x1f,0xfc,0x81,0x32,0x98,0xd1
+,0x4b,0xc6,0x92,0x93,0x33,0x35,0x31,0x2f
+,0xfc,0xd8,0x1d,0x44,0xdd,0xe0,0x81,0x7f
+,0x9d,0xe9,0x8b,0xe1,0x64,0x91,0x62,0x0b
+,0x39,0x08,0x8c,0xac,0x74,0x9d,0x59,0xd9
+,0x7a,0x59,0x52,0x97,0x11,0xb9,0x16,0x7b
+,0x6f,0x45,0xd3,0x96,0xd9,0x31,0x7d,0x02
+,0x36,0x0f,0x9c,0x3b,0x6e,0xcf,0x2c,0x0d
+,0x03,0x46,0x45,0xeb,0xa0,0xf4,0x7f,0x48
+,0x44,0xc6,0x08,0x40,0xcc,0xde,0x1b,0x70
+,0xb5,0x29,0xad,0xba,0x8b,0x3b,0x34,0x65
+,0x75,0x1b,0x71,0x21,0x1d,0x2c,0x14,0x0a
+,0xb0,0x96,0x95,0xb8,0xd6,0xea,0xf2,0x65
+,0xfb,0x29,0xba,0x4f,0xea,0x91,0x93,0x74
+,0x69,0xb6,0xf2,0xff,0xe1,0x1a,0xd0,0x0c
+,0xd1,0x76,0x85,0xcb,0x8a,0x25,0xbd,0x97
+,0x5e,0x2c,0x6f,0x15,0x99,0x26,0xe7,0xb6
+,0x29,0xff,0x22,0xec,0xc9,0x02,0xc7,0x56
+,0x00,0xcd,0x49,0xb9,0xb3,0x6c,0x7b,0x53
+,0x04,0x1a,0xe2,0xa8,0xc9,0xaa,0x12,0x05
+,0x23,0xc2,0xce,0xe7,0xbb,0x04,0x02,0xcc
+,0xc0,0x47,0xa2,0xe4,0xc4,0x29,0x2f,0x5b
+,0x45,0x57,0x89,0x51,0xee,0x3c,0xeb,0x52
+,0x08,0xff,0x07,0x35,0x1e,0x9f,0x35,0x6a
+,0x47,0x4a,0x56,0x98,0xd1,0x5a,0x85,0x1f
+,0x8c,0xf5,0x22,0xbf,0xab,0xce,0x83,0xf3
+,0xe2,0x22,0x29,0xae,0x7d,0x83,0x40,0xa8
+,0xba,0x6c};
+const unsigned int NptTlsTrustAnchor_Base_0055_Size = 874;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0056.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0056.cpp
new file mode 100644
index 0000000..cabde5d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0056.cpp
@@ -0,0 +1,210 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GeoTrust Universal CA */
+const unsigned char NptTlsTrustAnchor_Base_0056_Data[1388] = {
+0x30,0x82,0x05,0x68,0x30,0x82,0x03,0x50
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x45,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16
+,0x30,0x14,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0d,0x47,0x65,0x6f,0x54,0x72,0x75,0x73
+,0x74,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1e
+,0x30,0x1c,0x06,0x03,0x55,0x04,0x03,0x13
+,0x15,0x47,0x65,0x6f,0x54,0x72,0x75,0x73
+,0x74,0x20,0x55,0x6e,0x69,0x76,0x65,0x72
+,0x73,0x61,0x6c,0x20,0x43,0x41,0x30,0x1e
+,0x17,0x0d,0x30,0x34,0x30,0x33,0x30,0x34
+,0x30,0x35,0x30,0x30,0x30,0x30,0x5a,0x17
+,0x0d,0x32,0x39,0x30,0x33,0x30,0x34,0x30
+,0x35,0x30,0x30,0x30,0x30,0x5a,0x30,0x45
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30
+,0x14,0x06,0x03,0x55,0x04,0x0a,0x13,0x0d
+,0x47,0x65,0x6f,0x54,0x72,0x75,0x73,0x74
+,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1e,0x30
+,0x1c,0x06,0x03,0x55,0x04,0x03,0x13,0x15
+,0x47,0x65,0x6f,0x54,0x72,0x75,0x73,0x74
+,0x20,0x55,0x6e,0x69,0x76,0x65,0x72,0x73
+,0x61,0x6c,0x20,0x43,0x41,0x30,0x82,0x02
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x02,0x0f,0x00,0x30,0x82,0x02
+,0x0a,0x02,0x82,0x02,0x01,0x00,0xa6,0x15
+,0x55,0xa0,0xa3,0xc6,0xe0,0x1f,0x8c,0x9d
+,0x21,0x50,0xd7,0xc1,0xbe,0x2b,0x5b,0xb5
+,0xa4,0x9e,0xa1,0xd9,0x72,0x58,0xbd,0x00
+,0x1b,0x4c,0xbf,0x61,0xc9,0x14,0x1d,0x45
+,0x82,0xab,0xc6,0x1d,0x80,0xd6,0x3d,0xeb
+,0x10,0x9c,0x3a,0xaf,0x6d,0x24,0xf8,0xbc
+,0x71,0x01,0x9e,0x06,0xf5,0x7c,0x5f,0x1e
+,0xc1,0x0e,0x55,0xca,0x83,0x9a,0x59,0x30
+,0xae,0x19,0xcb,0x30,0x48,0x95,0xed,0x22
+,0x37,0x8d,0xf4,0x4a,0x9a,0x72,0x66,0x3e
+,0xad,0x95,0xc0,0xe0,0x16,0x00,0xe0,0x10
+,0x1f,0x2b,0x31,0x0e,0xd7,0x94,0x54,0xd3
+,0x42,0x33,0xa0,0x34,0x1d,0x1e,0x45,0x76
+,0xdd,0x4f,0xca,0x18,0x37,0xec,0x85,0x15
+,0x7a,0x19,0x08,0xfc,0xd5,0xc7,0x9c,0xf0
+,0xf2,0xa9,0x2e,0x10,0xa9,0x92,0xe6,0x3d
+,0x58,0x3d,0xa9,0x16,0x68,0x3c,0x2f,0x75
+,0x21,0x18,0x7f,0x28,0x77,0xa5,0xe1,0x61
+,0x17,0xb7,0xa6,0xe9,0xf8,0x1e,0x99,0xdb
+,0x73,0x6e,0xf4,0x0a,0xa2,0x21,0x6c,0xee
+,0xda,0xaa,0x85,0x92,0x66,0xaf,0xf6,0x7a
+,0x6b,0x82,0xda,0xba,0x22,0x08,0x35,0x0f
+,0xcf,0x42,0xf1,0x35,0xfa,0x6a,0xee,0x7e
+,0x2b,0x25,0xcc,0x3a,0x11,0xe4,0x6d,0xaf
+,0x73,0xb2,0x76,0x1d,0xad,0xd0,0xb2,0x78
+,0x67,0x1a,0xa4,0x39,0x1c,0x51,0x0b,0x67
+,0x56,0x83,0xfd,0x38,0x5d,0x0d,0xce,0xdd
+,0xf0,0xbb,0x2b,0x96,0x1f,0xde,0x7b,0x32
+,0x52,0xfd,0x1d,0xbb,0xb5,0x06,0xa1,0xb2
+,0x21,0x5e,0xa5,0xd6,0x95,0x68,0x7f,0xf0
+,0x99,0x9e,0xdc,0x45,0x08,0x3e,0xe7,0xd2
+,0x09,0x0d,0x35,0x94,0xdd,0x80,0x4e,0x53
+,0x97,0xd7,0xb5,0x09,0x44,0x20,0x64,0x16
+,0x17,0x03,0x02,0x4c,0x53,0x0d,0x68,0xde
+,0xd5,0xaa,0x72,0x4d,0x93,0x6d,0x82,0x0e
+,0xdb,0x9c,0xbd,0xcf,0xb4,0xf3,0x5c,0x5d
+,0x54,0x7a,0x69,0x09,0x96,0xd6,0xdb,0x11
+,0xc1,0x8d,0x75,0xa8,0xb4,0xcf,0x39,0xc8
+,0xce,0x3c,0xbc,0x24,0x7c,0xe6,0x62,0xca
+,0xe1,0xbd,0x7d,0xa7,0xbd,0x57,0x65,0x0b
+,0xe4,0xfe,0x25,0xed,0xb6,0x69,0x10,0xdc
+,0x28,0x1a,0x46,0xbd,0x01,0x1d,0xd0,0x97
+,0xb5,0xe1,0x98,0x3b,0xc0,0x37,0x64,0xd6
+,0x3d,0x94,0xee,0x0b,0xe1,0xf5,0x28,0xae
+,0x0b,0x56,0xbf,0x71,0x8b,0x23,0x29,0x41
+,0x8e,0x86,0xc5,0x4b,0x52,0x7b,0xd8,0x71
+,0xab,0x1f,0x8a,0x15,0xa6,0x3b,0x83,0x5a
+,0xd7,0x58,0x01,0x51,0xc6,0x4c,0x41,0xd9
+,0x7f,0xd8,0x41,0x67,0x72,0xa2,0x28,0xdf
+,0x60,0x83,0xa9,0x9e,0xc8,0x7b,0xfc,0x53
+,0x73,0x72,0x59,0xf5,0x93,0x7a,0x17,0x76
+,0x0e,0xce,0xf7,0xe5,0x5c,0xd9,0x0b,0x55
+,0x34,0xa2,0xaa,0x5b,0xb5,0x6a,0x54,0xe7
+,0x13,0xca,0x57,0xec,0x97,0x6d,0xf4,0x5e
+,0x06,0x2f,0x45,0x8b,0x58,0xd4,0x23,0x16
+,0x92,0xe4,0x16,0x6e,0x28,0x63,0x59,0x30
+,0xdf,0x50,0x01,0x9c,0x63,0x89,0x1a,0x9f
+,0xdb,0x17,0x94,0x82,0x70,0x37,0xc3,0x24
+,0x9e,0x9a,0x47,0xd6,0x5a,0xca,0x4e,0xa8
+,0x69,0x89,0x72,0x1f,0x91,0x6c,0xdb,0x7e
+,0x9e,0x1b,0xad,0xc7,0x1f,0x73,0xdd,0x2c
+,0x4f,0x19,0x65,0xfd,0x7f,0x93,0x40,0x10
+,0x2e,0xd2,0xf0,0xed,0x3c,0x9e,0x2e,0x28
+,0x3e,0x69,0x26,0x33,0xc5,0x7b,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x63,0x30,0x61,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0xda,0xbb,0x2e,0xaa,0xb0
+,0x0c,0xb8,0x88,0x26,0x51,0x74,0x5c,0x6d
+,0x03,0xd3,0xc0,0xd8,0x8f,0x7a,0xd6,0x30
+,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18
+,0x30,0x16,0x80,0x14,0xda,0xbb,0x2e,0xaa
+,0xb0,0x0c,0xb8,0x88,0x26,0x51,0x74,0x5c
+,0x6d,0x03,0xd3,0xc0,0xd8,0x8f,0x7a,0xd6
+,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01
+,0x01,0xff,0x04,0x04,0x03,0x02,0x01,0x86
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x02,0x01,0x00,0x31,0x78,0xe6,0xc7
+,0xb5,0xdf,0xb8,0x94,0x40,0xc9,0x71,0xc4
+,0xa8,0x35,0xec,0x46,0x1d,0xc2,0x85,0xf3
+,0x28,0x58,0x86,0xb0,0x0b,0xfc,0x8e,0xb2
+,0x39,0x8f,0x44,0x55,0xab,0x64,0x84,0x5c
+,0x69,0xa9,0xd0,0x9a,0x38,0x3c,0xfa,0xe5
+,0x1f,0x35,0xe5,0x44,0xe3,0x80,0x79,0x94
+,0x68,0xa4,0xbb,0xc4,0x9f,0x3d,0xe1,0x34
+,0xcd,0x30,0x46,0x8b,0x54,0x2b,0x95,0xa5
+,0xef,0xf7,0x3f,0x99,0x84,0xfd,0x35,0xe6
+,0xcf,0x31,0xc6,0xdc,0x6a,0xbf,0xa7,0xd7
+,0x23,0x08,0xe1,0x98,0x5e,0xc3,0x5a,0x08
+,0x76,0xa9,0xa6,0xaf,0x77,0x2f,0xb7,0x60
+,0xbd,0x44,0x46,0x6a,0xef,0x97,0xff,0x73
+,0x95,0xc1,0x8e,0xe8,0x93,0xfb,0xfd,0x31
+,0xb7,0xec,0x57,0x11,0x11,0x45,0x9b,0x30
+,0xf1,0x1a,0x88,0x39,0xc1,0x4f,0x3c,0xa7
+,0x00,0xd5,0xc7,0xfc,0xab,0x6d,0x80,0x22
+,0x70,0xa5,0x0c,0xe0,0x5d,0x04,0x29,0x02
+,0xfb,0xcb,0xa0,0x91,0xd1,0x7c,0xd6,0xc3
+,0x7e,0x50,0xd5,0x9d,0x58,0xbe,0x41,0x38
+,0xeb,0xb9,0x75,0x3c,0x15,0xd9,0x9b,0xc9
+,0x4a,0x83,0x59,0xc0,0xda,0x53,0xfd,0x33
+,0xbb,0x36,0x18,0x9b,0x85,0x0f,0x15,0xdd
+,0xee,0x2d,0xac,0x76,0x93,0xb9,0xd9,0x01
+,0x8d,0x48,0x10,0xa8,0xfb,0xf5,0x38,0x86
+,0xf1,0xdb,0x0a,0xc6,0xbd,0x84,0xa3,0x23
+,0x41,0xde,0xd6,0x77,0x6f,0x85,0xd4,0x85
+,0x1c,0x50,0xe0,0xae,0x51,0x8a,0xba,0x8d
+,0x3e,0x76,0xe2,0xb9,0xca,0x27,0xf2,0x5f
+,0x9f,0xef,0x6e,0x59,0x0d,0x06,0xd8,0x2b
+,0x17,0xa4,0xd2,0x7c,0x6b,0xbb,0x5f,0x14
+,0x1a,0x48,0x8f,0x1a,0x4c,0xe7,0xb3,0x47
+,0x1c,0x8e,0x4c,0x45,0x2b,0x20,0xee,0x48
+,0xdf,0xe7,0xdd,0x09,0x8e,0x18,0xa8,0xda
+,0x40,0x8d,0x92,0x26,0x11,0x53,0x61,0x73
+,0x5d,0xeb,0xbd,0xe7,0xc4,0x4d,0x29,0x37
+,0x61,0xeb,0xac,0x39,0x2d,0x67,0x2e,0x16
+,0xd6,0xf5,0x00,0x83,0x85,0xa1,0xcc,0x7f
+,0x76,0xc4,0x7d,0xe4,0xb7,0x4b,0x66,0xef
+,0x03,0x45,0x60,0x69,0xb6,0x0c,0x52,0x96
+,0x92,0x84,0x5e,0xa6,0xa3,0xb5,0xa4,0x3e
+,0x2b,0xd9,0xcc,0xd8,0x1b,0x47,0xaa,0xf2
+,0x44,0xda,0x4f,0xf9,0x03,0xe8,0xf0,0x14
+,0xcb,0x3f,0xf3,0x83,0xde,0xd0,0xc1,0x54
+,0xe3,0xb7,0xe8,0x0a,0x37,0x4d,0x8b,0x20
+,0x59,0x03,0x30,0x19,0xa1,0x2c,0xc8,0xbd
+,0x11,0x1f,0xdf,0xae,0xc9,0x4a,0xc5,0xf3
+,0x27,0x66,0x66,0x86,0xac,0x68,0x91,0xff
+,0xd9,0xe6,0x53,0x1c,0x0f,0x8b,0x5c,0x69
+,0x65,0x0a,0x26,0xc8,0x1e,0x34,0xc3,0x5d
+,0x51,0x7b,0xd7,0xa9,0x9c,0x06,0xa1,0x36
+,0xdd,0xd5,0x89,0x94,0xbc,0xd9,0xe4,0x2d
+,0x0c,0x5e,0x09,0x6c,0x08,0x97,0x7c,0xa3
+,0x3d,0x7c,0x93,0xff,0x3f,0xa1,0x14,0xa7
+,0xcf,0xb5,0x5d,0xeb,0xdb,0xdb,0x1c,0xc4
+,0x76,0xdf,0x88,0xb9,0xbd,0x45,0x05,0x95
+,0x1b,0xae,0xfc,0x46,0x6a,0x4c,0xaf,0x48
+,0xe3,0xce,0xae,0x0f,0xd2,0x7e,0xeb,0xe6
+,0x6c,0x9c,0x4f,0x81,0x6a,0x7a,0x64,0xac
+,0xbb,0x3e,0xd5,0xe7,0xcb,0x76,0x2e,0xc5
+,0xa7,0x48,0xc1,0x5c,0x90,0x0f,0xcb,0xc8
+,0x3f,0xfa,0xe6,0x32,0xe1,0x8d,0x1b,0x6f
+,0xa4,0xe6,0x8e,0xd8,0xf9,0x29,0x48,0x8a
+,0xce,0x73,0xfe,0x2c};
+const unsigned int NptTlsTrustAnchor_Base_0056_Size = 1388;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0057.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0057.cpp
new file mode 100644
index 0000000..63f736d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0057.cpp
@@ -0,0 +1,211 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GeoTrust Universal CA 2 */
+const unsigned char NptTlsTrustAnchor_Base_0057_Data[1392] = {
+0x30,0x82,0x05,0x6c,0x30,0x82,0x03,0x54
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x47,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16
+,0x30,0x14,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0d,0x47,0x65,0x6f,0x54,0x72,0x75,0x73
+,0x74,0x20,0x49,0x6e,0x63,0x2e,0x31,0x20
+,0x30,0x1e,0x06,0x03,0x55,0x04,0x03,0x13
+,0x17,0x47,0x65,0x6f,0x54,0x72,0x75,0x73
+,0x74,0x20,0x55,0x6e,0x69,0x76,0x65,0x72
+,0x73,0x61,0x6c,0x20,0x43,0x41,0x20,0x32
+,0x30,0x1e,0x17,0x0d,0x30,0x34,0x30,0x33
+,0x30,0x34,0x30,0x35,0x30,0x30,0x30,0x30
+,0x5a,0x17,0x0d,0x32,0x39,0x30,0x33,0x30
+,0x34,0x30,0x35,0x30,0x30,0x30,0x30,0x5a
+,0x30,0x47,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0d,0x47,0x65,0x6f,0x54,0x72,0x75
+,0x73,0x74,0x20,0x49,0x6e,0x63,0x2e,0x31
+,0x20,0x30,0x1e,0x06,0x03,0x55,0x04,0x03
+,0x13,0x17,0x47,0x65,0x6f,0x54,0x72,0x75
+,0x73,0x74,0x20,0x55,0x6e,0x69,0x76,0x65
+,0x72,0x73,0x61,0x6c,0x20,0x43,0x41,0x20
+,0x32,0x30,0x82,0x02,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0f
+,0x00,0x30,0x82,0x02,0x0a,0x02,0x82,0x02
+,0x01,0x00,0xb3,0x54,0x52,0xc1,0xc9,0x3e
+,0xf2,0xd9,0xdc,0xb1,0x53,0x1a,0x59,0x29
+,0xe7,0xb1,0xc3,0x45,0x28,0xe5,0xd7,0xd1
+,0xed,0xc5,0xc5,0x4b,0xa1,0xaa,0x74,0x7b
+,0x57,0xaf,0x4a,0x26,0xfc,0xd8,0xf5,0x5e
+,0xa7,0x6e,0x19,0xdb,0x74,0x0c,0x4f,0x35
+,0x5b,0x32,0x0b,0x01,0xe3,0xdb,0xeb,0x7a
+,0x77,0x35,0xea,0xaa,0x5a,0xe0,0xd6,0xe8
+,0xa1,0x57,0x94,0xf0,0x90,0xa3,0x74,0x56
+,0x94,0x44,0x30,0x03,0x1e,0x5c,0x4e,0x2b
+,0x85,0x26,0x74,0x82,0x7a,0x0c,0x76,0xa0
+,0x6f,0x4d,0xce,0x41,0x2d,0xa0,0x15,0x06
+,0x14,0x5f,0xb7,0x42,0xcd,0x7b,0x8f,0x58
+,0x61,0x34,0xdc,0x2a,0x08,0xf9,0x2e,0xc3
+,0x01,0xa6,0x22,0x44,0x1c,0x4c,0x07,0x82
+,0xe6,0x5b,0xce,0xd0,0x4a,0x7c,0x04,0xd3
+,0x19,0x73,0x27,0xf0,0xaa,0x98,0x7f,0x2e
+,0xaf,0x4e,0xeb,0x87,0x1e,0x24,0x77,0x6a
+,0x5d,0xb6,0xe8,0x5b,0x45,0xba,0xdc,0xc3
+,0xa1,0x05,0x6f,0x56,0x8e,0x8f,0x10,0x26
+,0xa5,0x49,0xc3,0x2e,0xd7,0x41,0x87,0x22
+,0xe0,0x4f,0x86,0xca,0x60,0xb5,0xea,0xa1
+,0x63,0xc0,0x01,0x97,0x10,0x79,0xbd,0x00
+,0x3c,0x12,0x6d,0x2b,0x15,0xb1,0xac,0x4b
+,0xb1,0xee,0x18,0xb9,0x4e,0x96,0xdc,0xdc
+,0x76,0xff,0x3b,0xbe,0xcf,0x5f,0x03,0xc0
+,0xfc,0x3b,0xe8,0xbe,0x46,0x1b,0xff,0xda
+,0x40,0xc2,0x52,0xf7,0xfe,0xe3,0x3a,0xf7
+,0x6a,0x77,0x35,0xd0,0xda,0x8d,0xeb,0x5e
+,0x18,0x6a,0x31,0xc7,0x1e,0xba,0x3c,0x1b
+,0x28,0xd6,0x6b,0x54,0xc6,0xaa,0x5b,0xd7
+,0xa2,0x2c,0x1b,0x19,0xcc,0xa2,0x02,0xf6
+,0x9b,0x59,0xbd,0x37,0x6b,0x86,0xb5,0x6d
+,0x82,0xba,0xd8,0xea,0xc9,0x56,0xbc,0xa9
+,0x36,0x58,0xfd,0x3e,0x19,0xf3,0xed,0x0c
+,0x26,0xa9,0x93,0x38,0xf8,0x4f,0xc1,0x5d
+,0x22,0x06,0xd0,0x97,0xea,0xe1,0xad,0xc6
+,0x55,0xe0,0x81,0x2b,0x28,0x83,0x3a,0xfa
+,0xf4,0x7b,0x21,0x51,0x00,0xbe,0x52,0x38
+,0xce,0xcd,0x66,0x79,0xa8,0xf4,0x81,0x56
+,0xe2,0xd0,0x83,0x09,0x47,0x51,0x5b,0x50
+,0x6a,0xcf,0xdb,0x48,0x1a,0x5d,0x3e,0xf7
+,0xcb,0xf6,0x65,0xf7,0x6c,0xf1,0x95,0xf8
+,0x02,0x3b,0x32,0x56,0x82,0x39,0x7a,0x5b
+,0xbd,0x2f,0x89,0x1b,0xbf,0xa1,0xb4,0xe8
+,0xff,0x7f,0x8d,0x8c,0xdf,0x03,0xf1,0x60
+,0x4e,0x58,0x11,0x4c,0xeb,0xa3,0x3f,0x10
+,0x2b,0x83,0x9a,0x01,0x73,0xd9,0x94,0x6d
+,0x84,0x00,0x27,0x66,0xac,0xf0,0x70,0x40
+,0x09,0x42,0x92,0xad,0x4f,0x93,0x0d,0x61
+,0x09,0x51,0x24,0xd8,0x92,0xd5,0x0b,0x94
+,0x61,0xb2,0x87,0xb2,0xed,0xff,0x9a,0x35
+,0xff,0x85,0x54,0xca,0xed,0x44,0x43,0xac
+,0x1b,0x3c,0x16,0x6b,0x48,0x4a,0x0a,0x1c
+,0x40,0x88,0x1f,0x92,0xc2,0x0b,0x00,0x05
+,0xff,0xf2,0xc8,0x02,0x4a,0xa4,0xaa,0xa9
+,0xcc,0x99,0x96,0x9c,0x2f,0x58,0xe0,0x7d
+,0xe1,0xbe,0xbb,0x07,0xdc,0x5f,0x04,0x72
+,0x5c,0x31,0x34,0xc3,0xec,0x5f,0x2d,0xe0
+,0x3d,0x64,0x90,0x22,0xe6,0xd1,0xec,0xb8
+,0x2e,0xdd,0x59,0xae,0xd9,0xa1,0x37,0xbf
+,0x54,0x35,0xdc,0x73,0x32,0x4f,0x8c,0x04
+,0x1e,0x33,0xb2,0xc9,0x46,0xf1,0xd8,0x5c
+,0xc8,0x55,0x50,0xc9,0x68,0xbd,0xa8,0xba
+,0x36,0x09,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x63,0x30,0x61,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x76
+,0xf3,0x55,0xe1,0xfa,0xa4,0x36,0xfb,0xf0
+,0x9f,0x5c,0x62,0x71,0xed,0x3c,0xf4,0x47
+,0x38,0x10,0x2b,0x30,0x1f,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14
+,0x76,0xf3,0x55,0xe1,0xfa,0xa4,0x36,0xfb
+,0xf0,0x9f,0x5c,0x62,0x71,0xed,0x3c,0xf4
+,0x47,0x38,0x10,0x2b,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x86,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x02,0x01,0x00
+,0x66,0xc1,0xc6,0x23,0xf3,0xd9,0xe0,0x2e
+,0x6e,0x5f,0xe8,0xcf,0xae,0xb0,0xb0,0x25
+,0x4d,0x2b,0xf8,0x3b,0x58,0x9b,0x40,0x24
+,0x37,0x5a,0xcb,0xab,0x16,0x49,0xff,0xb3
+,0x75,0x79,0x33,0xa1,0x2f,0x6d,0x70,0x17
+,0x34,0x91,0xfe,0x67,0x7e,0x8f,0xec,0x9b
+,0xe5,0x5e,0x82,0xa9,0x55,0x1f,0x2f,0xdc
+,0xd4,0x51,0x07,0x12,0xfe,0xac,0x16,0x3e
+,0x2c,0x35,0xc6,0x63,0xfc,0xdc,0x10,0xeb
+,0x0d,0xa3,0xaa,0xd0,0x7c,0xcc,0xd1,0xd0
+,0x2f,0x51,0x2e,0xc4,0x14,0x5a,0xde,0xe8
+,0x19,0xe1,0x3e,0xc6,0xcc,0xa4,0x29,0xe7
+,0x2e,0x84,0xaa,0x06,0x30,0x78,0x76,0x54
+,0x73,0x28,0x98,0x59,0x38,0xe0,0x00,0x0d
+,0x62,0xd3,0x42,0x7d,0x21,0x9f,0xae,0x3d
+,0x3a,0x8c,0xd5,0xfa,0x77,0x0d,0x18,0x2b
+,0x16,0x0e,0x5f,0x36,0xe1,0xfc,0x2a,0xb5
+,0x30,0x24,0xcf,0xe0,0x63,0x0c,0x7b,0x58
+,0x1a,0xfe,0x99,0xba,0x42,0x12,0xb1,0x91
+,0xf4,0x7c,0x68,0xe2,0xc8,0xe8,0xaf,0x2c
+,0xea,0xc9,0x7e,0xae,0xbb,0x2a,0x3d,0x0d
+,0x15,0xdc,0x34,0x95,0xb6,0x18,0x74,0xa8
+,0x6a,0x0f,0xc7,0xb4,0xf4,0x13,0xc4,0xe4
+,0x5b,0xed,0x0a,0xd2,0xa4,0x97,0x4c,0x2a
+,0xed,0x2f,0x6c,0x12,0x89,0x3d,0xf1,0x27
+,0x70,0xaa,0x6a,0x03,0x52,0x21,0x9f,0x40
+,0xa8,0x67,0x50,0xf2,0xf3,0x5a,0x1f,0xdf
+,0xdf,0x23,0xf6,0xdc,0x78,0x4e,0xe6,0x98
+,0x4f,0x55,0x3a,0x53,0xe3,0xef,0xf2,0xf4
+,0x9f,0xc7,0x7c,0xd8,0x58,0xaf,0x29,0x22
+,0x97,0xb8,0xe0,0xbd,0x91,0x2e,0xb0,0x76
+,0xec,0x57,0x11,0xcf,0xef,0x29,0x44,0xf3
+,0xe9,0x85,0x7a,0x60,0x63,0xe4,0x5d,0x33
+,0x89,0x17,0xd9,0x31,0xaa,0xda,0xd6,0xf3
+,0x18,0x35,0x72,0xcf,0x87,0x2b,0x2f,0x63
+,0x23,0x84,0x5d,0x84,0x8c,0x3f,0x57,0xa0
+,0x88,0xfc,0x99,0x91,0x28,0x26,0x69,0x99
+,0xd4,0x8f,0x97,0x44,0xbe,0x8e,0xd5,0x48
+,0xb1,0xa4,0x28,0x29,0xf1,0x15,0xb4,0xe1
+,0xe5,0x9e,0xdd,0xf8,0x8f,0xa6,0x6f,0x26
+,0xd7,0x09,0x3c,0x3a,0x1c,0x11,0x0e,0xa6
+,0x6c,0x37,0xf7,0xad,0x44,0x87,0x2c,0x28
+,0xc7,0xd8,0x74,0x82,0xb3,0xd0,0x6f,0x4a
+,0x57,0xbb,0x35,0x29,0x27,0xa0,0x8b,0xe8
+,0x21,0xa7,0x87,0x64,0x36,0x5d,0xcc,0xd8
+,0x16,0xac,0xc7,0xb2,0x27,0x40,0x92,0x55
+,0x38,0x28,0x8d,0x51,0x6e,0xdd,0x14,0x67
+,0x53,0x6c,0x71,0x5c,0x26,0x84,0x4d,0x75
+,0x5a,0xb6,0x7e,0x60,0x56,0xa9,0x4d,0xad
+,0xfb,0x9b,0x1e,0x97,0xf3,0x0d,0xd9,0xd2
+,0x97,0x54,0x77,0xda,0x3d,0x12,0xb7,0xe0
+,0x1e,0xef,0x08,0x06,0xac,0xf9,0x85,0x87
+,0xe9,0xa2,0xdc,0xaf,0x7e,0x18,0x12,0x83
+,0xfd,0x56,0x17,0x41,0x2e,0xd5,0x29,0x82
+,0x7d,0x99,0xf4,0x31,0xf6,0x71,0xa9,0xcf
+,0x2c,0x01,0x27,0xa5,0x05,0xb9,0xaa,0xb2
+,0x48,0x4e,0x2a,0xef,0x9f,0x93,0x52,0x51
+,0x95,0x3c,0x52,0x73,0x8e,0x56,0x4c,0x17
+,0x40,0xc0,0x09,0x28,0xe4,0x8b,0x6a,0x48
+,0x53,0xdb,0xec,0xcd,0x55,0x55,0xf1,0xc6
+,0xf8,0xe9,0xa2,0x2c,0x4c,0xa6,0xd1,0x26
+,0x5f,0x7e,0xaf,0x5a,0x4c,0xda,0x1f,0xa6
+,0xf2,0x1c,0x2c,0x7e,0xae,0x02,0x16,0xd2
+,0x56,0xd0,0x2f,0x57,0x53,0x47,0xe8,0x92
+};
+const unsigned int NptTlsTrustAnchor_Base_0057_Size = 1392;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0058.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0058.cpp
new file mode 100644
index 0000000..71df981
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0058.cpp
@@ -0,0 +1,178 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* UTN-USER First-Network Applications */
+const unsigned char NptTlsTrustAnchor_Base_0058_Data[1128] = {
+0x30,0x82,0x04,0x64,0x30,0x82,0x03,0x4c
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x44
+,0xbe,0x0c,0x8b,0x50,0x00,0x24,0xb4,0x11
+,0xd3,0x36,0x30,0x4b,0xc0,0x33,0x77,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0xa3,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x08,0x13
+,0x02,0x55,0x54,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x07,0x13,0x0e,0x53,0x61
+,0x6c,0x74,0x20,0x4c,0x61,0x6b,0x65,0x20
+,0x43,0x69,0x74,0x79,0x31,0x1e,0x30,0x1c
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x54
+,0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54
+,0x52,0x55,0x53,0x54,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x21,0x30,0x1f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x18,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x75,0x73,0x65,0x72,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x31
+,0x2b,0x30,0x29,0x06,0x03,0x55,0x04,0x03
+,0x13,0x22,0x55,0x54,0x4e,0x2d,0x55,0x53
+,0x45,0x52,0x46,0x69,0x72,0x73,0x74,0x2d
+,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b,0x20
+,0x41,0x70,0x70,0x6c,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x73,0x30,0x1e,0x17,0x0d
+,0x39,0x39,0x30,0x37,0x30,0x39,0x31,0x38
+,0x34,0x38,0x33,0x39,0x5a,0x17,0x0d,0x31
+,0x39,0x30,0x37,0x30,0x39,0x31,0x38,0x35
+,0x37,0x34,0x39,0x5a,0x30,0x81,0xa3,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x55,0x53,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x08,0x13,0x02,0x55
+,0x54,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x07,0x13,0x0e,0x53,0x61,0x6c,0x74
+,0x20,0x4c,0x61,0x6b,0x65,0x20,0x43,0x69
+,0x74,0x79,0x31,0x1e,0x30,0x1c,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x15,0x54,0x68,0x65
+,0x20,0x55,0x53,0x45,0x52,0x54,0x52,0x55
+,0x53,0x54,0x20,0x4e,0x65,0x74,0x77,0x6f
+,0x72,0x6b,0x31,0x21,0x30,0x1f,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x18,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x75,0x73,0x65,0x72,0x74,0x72,0x75,0x73
+,0x74,0x2e,0x63,0x6f,0x6d,0x31,0x2b,0x30
+,0x29,0x06,0x03,0x55,0x04,0x03,0x13,0x22
+,0x55,0x54,0x4e,0x2d,0x55,0x53,0x45,0x52
+,0x46,0x69,0x72,0x73,0x74,0x2d,0x4e,0x65
+,0x74,0x77,0x6f,0x72,0x6b,0x20,0x41,0x70
+,0x70,0x6c,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x73,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xb3,0xfb,0x91,0xa1,0xe4
+,0x36,0x55,0x85,0xac,0x06,0x34,0x5b,0xa0
+,0x9a,0x58,0xb2,0xf8,0xb5,0x0f,0x05,0x77
+,0x83,0xae,0x32,0xb1,0x76,0x92,0x68,0xec
+,0x23,0x4a,0xc9,0x76,0x3f,0xe3,0x9c,0xb6
+,0x37,0x79,0x03,0xb9,0xab,0x69,0x8d,0x07
+,0x25,0xb6,0x19,0x67,0xe4,0xb0,0x1b,0x18
+,0x73,0x61,0x4a,0xe8,0x7e,0xcd,0xd3,0x2f
+,0x64,0xe3,0xa6,0x7c,0x0c,0xfa,0x17,0x80
+,0xa3,0x0d,0x47,0x89,0x4f,0x51,0x71,0x2f
+,0xee,0xfc,0x3f,0xf9,0xb8,0x16,0x80,0x87
+,0x89,0x93,0x25,0x20,0x9a,0x43,0x82,0x69
+,0x24,0x76,0x28,0x59,0x35,0xa1,0x1d,0xc0
+,0x7f,0x83,0x06,0x64,0x16,0x20,0x2c,0xd3
+,0x49,0xa4,0x85,0xb4,0xc0,0x61,0x7f,0x51
+,0x08,0xf8,0x68,0x15,0x91,0x80,0xcb,0xa5
+,0xd5,0xee,0x3b,0x3a,0xf4,0x84,0x04,0x5e
+,0x60,0x59,0xa7,0x8c,0x34,0x72,0xee,0xb8
+,0x78,0xc5,0xd1,0x3b,0x12,0x4a,0x6f,0x7e
+,0x65,0x27,0xb9,0xa4,0x55,0xc5,0xb9,0x6f
+,0x43,0xa4,0xc5,0x1d,0x2c,0x99,0xc0,0x52
+,0xa4,0x78,0x4c,0x15,0xb3,0x40,0x98,0x08
+,0x6b,0x43,0xc6,0x01,0xb0,0x7a,0x7b,0xf5
+,0x6b,0x1c,0x22,0x3f,0xcb,0xef,0xff,0xa8
+,0xd0,0x3a,0x4b,0x76,0x15,0x9e,0xd2,0xd1
+,0xc6,0x2e,0xe3,0xdb,0x57,0x1b,0x32,0xa2
+,0xb8,0x6f,0xe8,0x86,0xa6,0x3f,0x70,0xab
+,0xe5,0x70,0x92,0xab,0x44,0x1e,0x40,0x50
+,0xfb,0x9c,0xa3,0x62,0xe4,0x6c,0x6e,0xa0
+,0xc8,0xde,0xe2,0x80,0x42,0xfa,0xe9,0x2f
+,0xe8,0xce,0x32,0x04,0x8f,0x7c,0x8d,0xb7
+,0x1c,0xa3,0x35,0x3c,0x15,0xdd,0x9e,0xc3
+,0xae,0x97,0xa5,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x81,0x91,0x30,0x81,0x8e,0x30,0x0b
+,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03
+,0x02,0x01,0xc6,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0xfa
+,0x86,0xc9,0xdb,0xe0,0xba,0xe9,0x78,0xf5
+,0x4b,0xa8,0xd6,0x15,0xdf,0xf0,0xd3,0xe1
+,0x6a,0x14,0x3c,0x30,0x4f,0x06,0x03,0x55
+,0x1d,0x1f,0x04,0x48,0x30,0x46,0x30,0x44
+,0xa0,0x42,0xa0,0x40,0x86,0x3e,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c
+,0x2e,0x75,0x73,0x65,0x72,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x55
+,0x54,0x4e,0x2d,0x55,0x53,0x45,0x52,0x46
+,0x69,0x72,0x73,0x74,0x2d,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x41,0x70,0x70,0x6c
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x73
+,0x2e,0x63,0x72,0x6c,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0xa4,0xf3,0x25,0xcc,0xd1,0xd4,0x91,0x83
+,0x22,0xd0,0xcc,0x32,0xab,0x9b,0x96,0x4e
+,0x34,0x91,0x54,0x20,0x25,0x34,0x61,0x5f
+,0x2a,0x02,0x15,0xe1,0x8b,0xaa,0xff,0x7d
+,0x64,0x51,0xcf,0x0a,0xff,0xbc,0x7d,0xd8
+,0x21,0x6a,0x78,0xcb,0x2f,0x51,0x6f,0xf8
+,0x42,0x1d,0x33,0xbd,0xeb,0xb5,0x7b,0x94
+,0xc3,0xc3,0xa9,0xa0,0x2d,0xdf,0xd1,0x29
+,0x1f,0x1d,0xfe,0x8f,0x3f,0xbb,0xa8,0x45
+,0x2a,0x7f,0xd1,0x6e,0x55,0x24,0xe2,0xbb
+,0x02,0xfb,0x31,0x3f,0xbe,0xe8,0xbc,0xec
+,0x40,0x2b,0xf8,0x01,0xd4,0x56,0x38,0xe4
+,0xca,0x44,0x82,0xb5,0x61,0x20,0x21,0x67
+,0x65,0xf6,0xf0,0x0b,0xe7,0x34,0xf8,0xa5
+,0xc2,0x9c,0xa3,0x5c,0x40,0x1f,0x85,0x93
+,0x95,0x06,0xde,0x4f,0xd4,0x27,0xa9,0xb6
+,0xa5,0xfc,0x16,0xcd,0x73,0x31,0x3f,0xb8
+,0x65,0x27,0xcf,0xd4,0x53,0x1a,0xf0,0xac
+,0x6e,0x9f,0x4f,0x05,0x0c,0x03,0x81,0xa7
+,0x84,0x29,0xc4,0x5a,0xbd,0x64,0x57,0x72
+,0xad,0x3b,0xcf,0x37,0x18,0xa6,0x98,0xc6
+,0xad,0x06,0xb4,0xdc,0x08,0xa3,0x04,0xd5
+,0x29,0xa4,0x96,0x9a,0x12,0x67,0x4a,0x8c
+,0x60,0x45,0x9d,0xf1,0x23,0x9a,0xb0,0x00
+,0x9c,0x68,0xb5,0x98,0x50,0xd3,0xef,0x8e
+,0x2e,0x92,0x65,0xb1,0x48,0x3e,0x21,0xbe
+,0x15,0x30,0x2a,0x0d,0xb5,0x0c,0xa3,0x6b
+,0x3f,0xae,0x7f,0x57,0xf5,0x1f,0x96,0x7c
+,0xdf,0x6f,0xdd,0x82,0x30,0x2c,0x65,0x1b
+,0x40,0x4a,0xcd,0x68,0xb9,0x72,0xec,0x71
+,0x76,0xec,0x54,0x8e,0x1f,0x85,0x0c,0x01
+,0x6a,0xfa,0xa6,0x38,0xac,0x1f,0xc4,0x84
+};
+const unsigned int NptTlsTrustAnchor_Base_0058_Size = 1128;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0059.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0059.cpp
new file mode 100644
index 0000000..af231e7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0059.cpp
@@ -0,0 +1,154 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* America Online Root Certification Authority 1 */
+const unsigned char NptTlsTrustAnchor_Base_0059_Data[936] = {
+0x30,0x82,0x03,0xa4,0x30,0x82,0x02,0x8c
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x63,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x1c
+,0x30,0x1a,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x13,0x41,0x6d,0x65,0x72,0x69,0x63,0x61
+,0x20,0x4f,0x6e,0x6c,0x69,0x6e,0x65,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x36,0x30,0x34
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2d,0x41
+,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f
+,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x20,0x31,0x30,0x1e,0x17,0x0d
+,0x30,0x32,0x30,0x35,0x32,0x38,0x30,0x36
+,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x33
+,0x37,0x31,0x31,0x31,0x39,0x32,0x30,0x34
+,0x33,0x30,0x30,0x5a,0x30,0x63,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x55,0x53,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x13,0x41,0x6d
+,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x6e
+,0x6c,0x69,0x6e,0x65,0x20,0x49,0x6e,0x63
+,0x2e,0x31,0x36,0x30,0x34,0x06,0x03,0x55
+,0x04,0x03,0x13,0x2d,0x41,0x6d,0x65,0x72
+,0x69,0x63,0x61,0x20,0x4f,0x6e,0x6c,0x69
+,0x6e,0x65,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x31,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xa8,0x2f,0xe8,0xa4,0x69,0x06
+,0x03,0x47,0xc3,0xe9,0x2a,0x98,0xff,0x19
+,0xa2,0x70,0x9a,0xc6,0x50,0xb2,0x7e,0xa5
+,0xdf,0x68,0x4d,0x1b,0x7c,0x0f,0xb6,0x97
+,0x68,0x7d,0x2d,0xa6,0x8b,0x97,0xe9,0x64
+,0x86,0xc9,0xa3,0xef,0xa0,0x86,0xbf,0x60
+,0x65,0x9c,0x4b,0x54,0x88,0xc2,0x48,0xc5
+,0x4a,0x39,0xbf,0x14,0xe3,0x59,0x55,0xe5
+,0x19,0xb4,0x74,0xc8,0xb4,0x05,0x39,0x5c
+,0x16,0xa5,0xe2,0x95,0x05,0xe0,0x12,0xae
+,0x59,0x8b,0xa2,0x33,0x68,0x58,0x1c,0xa6
+,0xd4,0x15,0xb7,0xd8,0x9f,0xd7,0xdc,0x71
+,0xab,0x7e,0x9a,0xbf,0x9b,0x8e,0x33,0x0f
+,0x22,0xfd,0x1f,0x2e,0xe7,0x07,0x36,0xef
+,0x62,0x39,0xc5,0xdd,0xcb,0xba,0x25,0x14
+,0x23,0xde,0x0c,0xc6,0x3d,0x3c,0xce,0x82
+,0x08,0xe6,0x66,0x3e,0xda,0x51,0x3b,0x16
+,0x3a,0xa3,0x05,0x7f,0xa0,0xdc,0x87,0xd5
+,0x9c,0xfc,0x72,0xa9,0xa0,0x7d,0x78,0xe4
+,0xb7,0x31,0x55,0x1e,0x65,0xbb,0xd4,0x61
+,0xb0,0x21,0x60,0xed,0x10,0x32,0x72,0xc5
+,0x92,0x25,0x1e,0xf8,0x90,0x4a,0x18,0x78
+,0x47,0xdf,0x7e,0x30,0x37,0x3e,0x50,0x1b
+,0xdb,0x1c,0xd3,0x6b,0x9a,0x86,0x53,0x07
+,0xb0,0xef,0xac,0x06,0x78,0xf8,0x84,0x99
+,0xfe,0x21,0x8d,0x4c,0x80,0xb6,0x0c,0x82
+,0xf6,0x66,0x70,0x79,0x1a,0xd3,0x4f,0xa3
+,0xcf,0xf1,0xcf,0x46,0xb0,0x4b,0x0f,0x3e
+,0xdd,0x88,0x62,0xb8,0x8c,0xa9,0x09,0x28
+,0x3b,0x7a,0xc7,0x97,0xe1,0x1e,0xe5,0xf4
+,0x9f,0xc0,0xc0,0xae,0x24,0xa0,0xc8,0xa1
+,0xd9,0x0f,0xd6,0x7b,0x26,0x82,0x69,0x32
+,0x3d,0xa7,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x63,0x30,0x61,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x00
+,0xad,0xd9,0xa3,0xf6,0x79,0xf6,0x6e,0x74
+,0xa9,0x7f,0x33,0x3d,0x81,0x17,0xd7,0x4c
+,0xcf,0x33,0xde,0x30,0x1f,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14
+,0x00,0xad,0xd9,0xa3,0xf6,0x79,0xf6,0x6e
+,0x74,0xa9,0x7f,0x33,0x3d,0x81,0x17,0xd7
+,0x4c,0xcf,0x33,0xde,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x86,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0x7c,0x8a,0xd1,0x1f,0x18,0x37,0x82,0xe0
+,0xb8,0xb0,0xa3,0xed,0x56,0x95,0xc8,0x62
+,0x61,0x9c,0x05,0xa2,0xcd,0xc2,0x62,0x26
+,0x61,0xcd,0x10,0x16,0xd7,0xcc,0xb4,0x65
+,0x34,0xd0,0x11,0x8a,0xad,0xa8,0xa9,0x05
+,0x66,0xef,0x74,0xf3,0x6d,0x5f,0x9d,0x99
+,0xaf,0xf6,0x8b,0xfb,0xeb,0x52,0xb2,0x05
+,0x98,0xa2,0x6f,0x2a,0xc5,0x54,0xbd,0x25
+,0xbd,0x5f,0xae,0xc8,0x86,0xea,0x46,0x2c
+,0xc1,0xb3,0xbd,0xc1,0xe9,0x49,0x70,0x18
+,0x16,0x97,0x08,0x13,0x8c,0x20,0xe0,0x1b
+,0x2e,0x3a,0x47,0xcb,0x1e,0xe4,0x00,0x30
+,0x95,0x5b,0xf4,0x45,0xa3,0xc0,0x1a,0xb0
+,0x01,0x4e,0xab,0xbd,0xc0,0x23,0x6e,0x63
+,0x3f,0x80,0x4a,0xc5,0x07,0xed,0xdc,0xe2
+,0x6f,0xc7,0xc1,0x62,0xf1,0xe3,0x72,0xd6
+,0x04,0xc8,0x74,0x67,0x0b,0xfa,0x88,0xab
+,0xa1,0x01,0xc8,0x6f,0xf0,0x14,0xaf,0xd2
+,0x99,0xcd,0x51,0x93,0x7e,0xed,0x2e,0x38
+,0xc7,0xbd,0xce,0x46,0x50,0x3d,0x72,0xe3
+,0x79,0x25,0x9d,0x9b,0x88,0x2b,0x10,0x20
+,0xdd,0xa5,0xb8,0x32,0x9f,0x8d,0xe0,0x29
+,0xdf,0x21,0x74,0x86,0x82,0xdb,0x2f,0x82
+,0x30,0xc6,0xc7,0x35,0x86,0xb3,0xf9,0x96
+,0x5f,0x46,0xdb,0x0c,0x45,0xfd,0xf3,0x50
+,0xc3,0x6f,0xc6,0xc3,0x48,0xad,0x46,0xa6
+,0xe1,0x27,0x47,0x0a,0x1d,0x0e,0x9b,0xb6
+,0xc2,0x77,0x7f,0x63,0xf2,0xe0,0x7d,0x1a
+,0xbe,0xfc,0xe0,0xdf,0xd7,0xc7,0xa7,0x6c
+,0xb0,0xf9,0xae,0xba,0x3c,0xfd,0x74,0xb4
+,0x11,0xe8,0x58,0x0d,0x80,0xbc,0xd3,0xa8
+,0x80,0x3a,0x99,0xed,0x75,0xcc,0x46,0x7b
+};
+const unsigned int NptTlsTrustAnchor_Base_0059_Size = 936;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0060.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0060.cpp
new file mode 100644
index 0000000..12326c6
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0060.cpp
@@ -0,0 +1,218 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* America Online Root Certification Authority 2 */
+const unsigned char NptTlsTrustAnchor_Base_0060_Data[1448] = {
+0x30,0x82,0x05,0xa4,0x30,0x82,0x03,0x8c
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x63,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x1c
+,0x30,0x1a,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x13,0x41,0x6d,0x65,0x72,0x69,0x63,0x61
+,0x20,0x4f,0x6e,0x6c,0x69,0x6e,0x65,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x36,0x30,0x34
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2d,0x41
+,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f
+,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x20,0x32,0x30,0x1e,0x17,0x0d
+,0x30,0x32,0x30,0x35,0x32,0x38,0x30,0x36
+,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x33
+,0x37,0x30,0x39,0x32,0x39,0x31,0x34,0x30
+,0x38,0x30,0x30,0x5a,0x30,0x63,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x55,0x53,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x13,0x41,0x6d
+,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x6e
+,0x6c,0x69,0x6e,0x65,0x20,0x49,0x6e,0x63
+,0x2e,0x31,0x36,0x30,0x34,0x06,0x03,0x55
+,0x04,0x03,0x13,0x2d,0x41,0x6d,0x65,0x72
+,0x69,0x63,0x61,0x20,0x4f,0x6e,0x6c,0x69
+,0x6e,0x65,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x32,0x30,0x82,0x02,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0f
+,0x00,0x30,0x82,0x02,0x0a,0x02,0x82,0x02
+,0x01,0x00,0xcc,0x41,0x45,0x1d,0xe9,0x3d
+,0x4d,0x10,0xf6,0x8c,0xb1,0x41,0xc9,0xe0
+,0x5e,0xcb,0x0d,0xb7,0xbf,0x47,0x73,0xd3
+,0xf0,0x55,0x4d,0xdd,0xc6,0x0c,0xfa,0xb1
+,0x66,0x05,0x6a,0xcd,0x78,0xb4,0xdc,0x02
+,0xdb,0x4e,0x81,0xf3,0xd7,0xa7,0x7c,0x71
+,0xbc,0x75,0x63,0xa0,0x5d,0xe3,0x07,0x0c
+,0x48,0xec,0x25,0xc4,0x03,0x20,0xf4,0xff
+,0x0e,0x3b,0x12,0xff,0x9b,0x8d,0xe1,0xc6
+,0xd5,0x1b,0xb4,0x6d,0x22,0xe3,0xb1,0xdb
+,0x7f,0x21,0x64,0xaf,0x86,0xbc,0x57,0x22
+,0x2a,0xd6,0x47,0x81,0x57,0x44,0x82,0x56
+,0x53,0xbd,0x86,0x14,0x01,0x0b,0xfc,0x7f
+,0x74,0xa4,0x5a,0xae,0xf1,0xba,0x11,0xb5
+,0x9b,0x58,0x5a,0x80,0xb4,0x37,0x78,0x09
+,0x33,0x7c,0x32,0x47,0x03,0x5c,0xc4,0xa5
+,0x83,0x48,0xf4,0x57,0x56,0x6e,0x81,0x36
+,0x27,0x18,0x4f,0xec,0x9b,0x28,0xc2,0xd4
+,0xb4,0xd7,0x7c,0x0c,0x3e,0x0c,0x2b,0xdf
+,0xca,0x04,0xd7,0xc6,0x8e,0xea,0x58,0x4e
+,0xa8,0xa4,0xa5,0x18,0x1c,0x6c,0x45,0x98
+,0xa3,0x41,0xd1,0x2d,0xd2,0xc7,0x6d,0x8d
+,0x19,0xf1,0xad,0x79,0xb7,0x81,0x3f,0xbd
+,0x06,0x82,0x27,0x2d,0x10,0x58,0x05,0xb5
+,0x78,0x05,0xb9,0x2f,0xdb,0x0c,0x6b,0x90
+,0x90,0x7e,0x14,0x59,0x38,0xbb,0x94,0x24
+,0x13,0xe5,0xd1,0x9d,0x14,0xdf,0xd3,0x82
+,0x4d,0x46,0xf0,0x80,0x39,0x52,0x32,0x0f
+,0xe3,0x84,0xb2,0x7a,0x43,0xf2,0x5e,0xde
+,0x5f,0x3f,0x1d,0xdd,0xe3,0xb2,0x1b,0xa0
+,0xa1,0x2a,0x23,0x03,0x6e,0x2e,0x01,0x15
+,0x87,0x5c,0xa6,0x75,0x75,0xc7,0x97,0x61
+,0xbe,0xde,0x86,0xdc,0xd4,0x48,0xdb,0xbd
+,0x2a,0xbf,0x4a,0x55,0xda,0xe8,0x7d,0x50
+,0xfb,0xb4,0x80,0x17,0xb8,0x94,0xbf,0x01
+,0x3d,0xea,0xda,0xba,0x7c,0xe0,0x58,0x67
+,0x17,0xb9,0x58,0xe0,0x88,0x86,0x46,0x67
+,0x6c,0x9d,0x10,0x47,0x58,0x32,0xd0,0x35
+,0x7c,0x79,0x2a,0x90,0xa2,0x5a,0x10,0x11
+,0x23,0x35,0xad,0x2f,0xcc,0xe4,0x4a,0x5b
+,0xa7,0xc8,0x27,0xf2,0x83,0xde,0x5e,0xbb
+,0x5e,0x77,0xe7,0xe8,0xa5,0x6e,0x63,0xc2
+,0x0d,0x5d,0x61,0xd0,0x8c,0xd2,0x6c,0x5a
+,0x21,0x0e,0xca,0x28,0xa3,0xce,0x2a,0xe9
+,0x95,0xc7,0x48,0xcf,0x96,0x6f,0x1d,0x92
+,0x25,0xc8,0xc6,0xc6,0xc1,0xc1,0x0c,0x05
+,0xac,0x26,0xc4,0xd2,0x75,0xd2,0xe1,0x2a
+,0x67,0xc0,0x3d,0x5b,0xa5,0x9a,0xeb,0xcf
+,0x7b,0x1a,0xa8,0x9d,0x14,0x45,0xe5,0x0f
+,0xa0,0x9a,0x65,0xde,0x2f,0x28,0xbd,0xce
+,0x6f,0x94,0x66,0x83,0x48,0x29,0xd8,0xea
+,0x65,0x8c,0xaf,0x93,0xd9,0x64,0x9f,0x55
+,0x57,0x26,0xbf,0x6f,0xcb,0x37,0x31,0x99
+,0xa3,0x60,0xbb,0x1c,0xad,0x89,0x34,0x32
+,0x62,0xb8,0x43,0x21,0x06,0x72,0x0c,0xa1
+,0x5c,0x6d,0x46,0xc5,0xfa,0x29,0xcf,0x30
+,0xde,0x89,0xdc,0x71,0x5b,0xdd,0xb6,0x37
+,0x3e,0xdf,0x50,0xf5,0xb8,0x07,0x25,0x26
+,0xe5,0xbc,0xb5,0xfe,0x3c,0x02,0xb3,0xb7
+,0xf8,0xbe,0x43,0xc1,0x87,0x11,0x94,0x9e
+,0x23,0x6c,0x17,0x8a,0xb8,0x8a,0x27,0x0c
+,0x54,0x47,0xf0,0xa9,0xb3,0xc0,0x80,0x8c
+,0xa0,0x27,0xeb,0x1d,0x19,0xe3,0x07,0x8e
+,0x77,0x70,0xca,0x2b,0xf4,0x7d,0x76,0xe0
+,0x78,0x67,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x63,0x30,0x61,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x4d
+,0x45,0xc1,0x68,0x38,0xbb,0x73,0xa9,0x69
+,0xa1,0x20,0xe7,0xed,0xf5,0x22,0xa1,0x23
+,0x14,0xd7,0x9e,0x30,0x1f,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14
+,0x4d,0x45,0xc1,0x68,0x38,0xbb,0x73,0xa9
+,0x69,0xa1,0x20,0xe7,0xed,0xf5,0x22,0xa1
+,0x23,0x14,0xd7,0x9e,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x86,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x02,0x01,0x00
+,0x67,0x6b,0x06,0xb9,0x5f,0x45,0x3b,0x2a
+,0x4b,0x33,0xb3,0xe6,0x1b,0x6b,0x59,0x4e
+,0x22,0xcc,0xb9,0xb7,0xa4,0x25,0xc9,0xa7
+,0xc4,0xf0,0x54,0x96,0x0b,0x64,0xf3,0xb1
+,0x58,0x4f,0x5e,0x51,0xfc,0xb2,0x97,0x7b
+,0x27,0x65,0xc2,0xe5,0xca,0xe7,0x0d,0x0c
+,0x25,0x7b,0x62,0xe3,0xfa,0x9f,0xb4,0x87
+,0xb7,0x45,0x46,0xaf,0x83,0xa5,0x97,0x48
+,0x8c,0xa5,0xbd,0xf1,0x16,0x2b,0x9b,0x76
+,0x2c,0x7a,0x35,0x60,0x6c,0x11,0x80,0x97
+,0xcc,0xa9,0x92,0x52,0xe6,0x2b,0xe6,0x69
+,0xed,0xa9,0xf8,0x36,0x2d,0x2c,0x77,0xbf
+,0x61,0x48,0xd1,0x63,0x0b,0xb9,0x5b,0x52
+,0xed,0x18,0xb0,0x43,0x42,0x22,0xa6,0xb1
+,0x77,0xae,0xde,0x69,0xc5,0xcd,0xc7,0x1c
+,0xa1,0xb1,0xa5,0x1c,0x10,0xfb,0x18,0xbe
+,0x1a,0x70,0xdd,0xc1,0x92,0x4b,0xbe,0x29
+,0x5a,0x9d,0x3f,0x35,0xbe,0xe5,0x7d,0x51
+,0xf8,0x55,0xe0,0x25,0x75,0x23,0x87,0x1e
+,0x5c,0xdc,0xba,0x9d,0xb0,0xac,0xb3,0x69
+,0xdb,0x17,0x83,0xc9,0xf7,0xde,0x0c,0xbc
+,0x08,0xdc,0x91,0x9e,0xa8,0xd0,0xd7,0x15
+,0x37,0x73,0xa5,0x35,0xb8,0xfc,0x7e,0xc5
+,0x44,0x40,0x06,0xc3,0xeb,0xf8,0x22,0x80
+,0x5c,0x47,0xce,0x02,0xe3,0x11,0x9f,0x44
+,0xff,0xfd,0x9a,0x32,0xcc,0x7d,0x64,0x51
+,0x0e,0xeb,0x57,0x26,0x76,0x3a,0xe3,0x1e
+,0x22,0x3c,0xc2,0xa6,0x36,0xdd,0x19,0xef
+,0xa7,0xfc,0x12,0xf3,0x26,0xc0,0x59,0x31
+,0x85,0x4c,0x9c,0xd8,0xcf,0xdf,0xa4,0xcc
+,0xcc,0x29,0x93,0xff,0x94,0x6d,0x76,0x5c
+,0x13,0x08,0x97,0xf2,0xed,0xa5,0x0b,0x4d
+,0xdd,0xe8,0xc9,0x68,0x0e,0x66,0xd3,0x00
+,0x0e,0x33,0x12,0x5b,0xbc,0x95,0xe5,0x32
+,0x90,0xa8,0xb3,0xc6,0x6c,0x83,0xad,0x77
+,0xee,0x8b,0x7e,0x7e,0xb1,0xa9,0xab,0xd3
+,0xe1,0xf1,0xb6,0xc0,0xb1,0xea,0x88,0xc0
+,0xe7,0xd3,0x90,0xe9,0x28,0x92,0x94,0x7b
+,0x68,0x7b,0x97,0x2a,0x0a,0x67,0x2d,0x85
+,0x02,0x38,0x10,0xe4,0x03,0x61,0xd4,0xda
+,0x25,0x36,0xc7,0x08,0x58,0x2d,0xa1,0xa7
+,0x51,0xaf,0x30,0x0a,0x49,0xf5,0xa6,0x69
+,0x87,0x07,0x2d,0x44,0x46,0x76,0x8e,0x2a
+,0xe5,0x9a,0x3b,0xd7,0x18,0xa2,0xfc,0x9c
+,0x38,0x10,0xcc,0xc6,0x3b,0xd2,0xb5,0x17
+,0x3a,0x6f,0xfd,0xae,0x25,0xbd,0xf5,0x72
+,0x59,0x64,0xb1,0x74,0x2a,0x38,0x5f,0x18
+,0x4c,0xdf,0xcf,0x71,0x04,0x5a,0x36,0xd4
+,0xbf,0x2f,0x99,0x9c,0xe8,0xd9,0xba,0xb1
+,0x95,0xe6,0x02,0x4b,0x21,0xa1,0x5b,0xd5
+,0xc1,0x4f,0x8f,0xae,0x69,0x6d,0x53,0xdb
+,0x01,0x93,0xb5,0x5c,0x1e,0x18,0xdd,0x64
+,0x5a,0xca,0x18,0x28,0x3e,0x63,0x04,0x11
+,0xfd,0x1c,0x8d,0x00,0x0f,0xb8,0x37,0xdf
+,0x67,0x8a,0x9d,0x66,0xa9,0x02,0x6a,0x91
+,0xff,0x13,0xca,0x2f,0x5d,0x83,0xbc,0x87
+,0x93,0x6c,0xdc,0x24,0x51,0x16,0x04,0x25
+,0x66,0xfa,0xb3,0xd9,0xc2,0xba,0x29,0xbe
+,0x9a,0x48,0x38,0x82,0x99,0xf4,0xbf,0x3b
+,0x4a,0x31,0x19,0xf9,0xbf,0x8e,0x21,0x33
+,0x14,0xca,0x4f,0x54,0x5f,0xfb,0xce,0xfb
+,0x8f,0x71,0x7f,0xfd,0x5e,0x19,0xa0,0x0f
+,0x4b,0x91,0xb8,0xc4,0x54,0xbc,0x06,0xb0
+,0x45,0x8f,0x26,0x91,0xa2,0x8e,0xfe,0xa9
+};
+const unsigned int NptTlsTrustAnchor_Base_0060_Size = 1448;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0061.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0061.cpp
new file mode 100644
index 0000000..7d523fb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0061.cpp
@@ -0,0 +1,153 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Visa eCommerce Root */
+const unsigned char NptTlsTrustAnchor_Base_0061_Data[934] = {
+0x30,0x82,0x03,0xa2,0x30,0x82,0x02,0x8a
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x13
+,0x86,0x35,0x4d,0x1d,0x3f,0x06,0xf2,0xc1
+,0xf9,0x65,0x05,0xd5,0x90,0x1c,0x62,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x6b
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x0d,0x30
+,0x0b,0x06,0x03,0x55,0x04,0x0a,0x13,0x04
+,0x56,0x49,0x53,0x41,0x31,0x2f,0x30,0x2d
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x26,0x56
+,0x69,0x73,0x61,0x20,0x49,0x6e,0x74,0x65
+,0x72,0x6e,0x61,0x74,0x69,0x6f,0x6e,0x61
+,0x6c,0x20,0x53,0x65,0x72,0x76,0x69,0x63
+,0x65,0x20,0x41,0x73,0x73,0x6f,0x63,0x69
+,0x61,0x74,0x69,0x6f,0x6e,0x31,0x1c,0x30
+,0x1a,0x06,0x03,0x55,0x04,0x03,0x13,0x13
+,0x56,0x69,0x73,0x61,0x20,0x65,0x43,0x6f
+,0x6d,0x6d,0x65,0x72,0x63,0x65,0x20,0x52
+,0x6f,0x6f,0x74,0x30,0x1e,0x17,0x0d,0x30
+,0x32,0x30,0x36,0x32,0x36,0x30,0x32,0x31
+,0x38,0x33,0x36,0x5a,0x17,0x0d,0x32,0x32
+,0x30,0x36,0x32,0x34,0x30,0x30,0x31,0x36
+,0x31,0x32,0x5a,0x30,0x6b,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x0d,0x30,0x0b,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x04,0x56,0x49,0x53
+,0x41,0x31,0x2f,0x30,0x2d,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x26,0x56,0x69,0x73,0x61
+,0x20,0x49,0x6e,0x74,0x65,0x72,0x6e,0x61
+,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x20,0x41
+,0x73,0x73,0x6f,0x63,0x69,0x61,0x74,0x69
+,0x6f,0x6e,0x31,0x1c,0x30,0x1a,0x06,0x03
+,0x55,0x04,0x03,0x13,0x13,0x56,0x69,0x73
+,0x61,0x20,0x65,0x43,0x6f,0x6d,0x6d,0x65
+,0x72,0x63,0x65,0x20,0x52,0x6f,0x6f,0x74
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xaf,0x57,0xde,0x56,0x1e,0x6e,0xa1
+,0xda,0x60,0xb1,0x94,0x27,0xcb,0x17,0xdb
+,0x07,0x3f,0x80,0x85,0x4f,0xc8,0x9c,0xb6
+,0xd0,0xf4,0x6f,0x4f,0xcf,0x99,0xd8,0xe1
+,0xdb,0xc2,0x48,0x5c,0x3a,0xac,0x39,0x33
+,0xc7,0x1f,0x6a,0x8b,0x26,0x3d,0x2b,0x35
+,0xf5,0x48,0xb1,0x91,0xc1,0x02,0x4e,0x04
+,0x96,0x91,0x7b,0xb0,0x33,0xf0,0xb1,0x14
+,0x4e,0x11,0x6f,0xb5,0x40,0xaf,0x1b,0x45
+,0xa5,0x4a,0xef,0x7e,0xb6,0xac,0xf2,0xa0
+,0x1f,0x58,0x3f,0x12,0x46,0x60,0x3c,0x8d
+,0xa1,0xe0,0x7d,0xcf,0x57,0x3e,0x33,0x1e
+,0xfb,0x47,0xf1,0xaa,0x15,0x97,0x07,0x55
+,0x66,0xa5,0xb5,0x2d,0x2e,0xd8,0x80,0x59
+,0xb2,0xa7,0x0d,0xb7,0x46,0xec,0x21,0x63
+,0xff,0x35,0xab,0xa5,0x02,0xcf,0x2a,0xf4
+,0x4c,0xfe,0x7b,0xf5,0x94,0x5d,0x84,0x4d
+,0xa8,0xf2,0x60,0x8f,0xdb,0x0e,0x25,0x3c
+,0x9f,0x73,0x71,0xcf,0x94,0xdf,0x4a,0xea
+,0xdb,0xdf,0x72,0x38,0x8c,0xf3,0x96,0xbd
+,0xf1,0x17,0xbc,0xd2,0xba,0x3b,0x45,0x5a
+,0xc6,0xa7,0xf6,0xc6,0x17,0x8b,0x01,0x9d
+,0xfc,0x19,0xa8,0x2a,0x83,0x16,0xb8,0x3a
+,0x48,0xfe,0x4e,0x3e,0xa0,0xab,0x06,0x19
+,0xe9,0x53,0xf3,0x80,0x13,0x07,0xed,0x2d
+,0xbf,0x3f,0x0a,0x3c,0x55,0x20,0x39,0x2c
+,0x2c,0x00,0x69,0x74,0x95,0x4a,0xbc,0x20
+,0xb2,0xa9,0x79,0xe5,0x18,0x89,0x91,0xa8
+,0xdc,0x1c,0x4d,0xef,0xbb,0x7e,0x37,0x0b
+,0x5d,0xfe,0x39,0xa5,0x88,0x52,0x8c,0x00
+,0x6c,0xec,0x18,0x7c,0x41,0xbd,0xf6,0x8b
+,0x75,0x77,0xba,0x60,0x9d,0x84,0xe7,0xfe
+,0x2d,0x02,0x03,0x01,0x00,0x01,0xa3,0x42
+,0x30,0x40,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0x15,0x38
+,0x83,0x0f,0x3f,0x2c,0x3f,0x70,0x33,0x1e
+,0xcd,0x46,0xfe,0x07,0x8c,0x20,0xe0,0xd7
+,0xc3,0xb7,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x5f,0xf1
+,0x41,0x7d,0x7c,0x5c,0x08,0xb9,0x2b,0xe0
+,0xd5,0x92,0x47,0xfa,0x67,0x5c,0xa5,0x13
+,0xc3,0x03,0x21,0x9b,0x2b,0x4c,0x89,0x46
+,0xcf,0x59,0x4d,0xc9,0xfe,0xa5,0x40,0xb6
+,0x63,0xcd,0xdd,0x71,0x28,0x95,0x67,0x11
+,0xcc,0x24,0xac,0xd3,0x44,0x6c,0x71,0xae
+,0x01,0x20,0x6b,0x03,0xa2,0x8f,0x18,0xb7
+,0x29,0x3a,0x7d,0xe5,0x16,0x60,0x53,0x78
+,0x3c,0xc0,0xaf,0x15,0x83,0xf7,0x8f,0x52
+,0x33,0x24,0xbd,0x64,0x93,0x97,0xee,0x8b
+,0xf7,0xdb,0x18,0xa8,0x6d,0x71,0xb3,0xf7
+,0x2c,0x17,0xd0,0x74,0x25,0x69,0xf7,0xfe
+,0x6b,0x3c,0x94,0xbe,0x4d,0x4b,0x41,0x8c
+,0x4e,0xe2,0x73,0xd0,0xe3,0x90,0x22,0x73
+,0x43,0xcd,0xf3,0xef,0xea,0x73,0xce,0x45
+,0x8a,0xb0,0xa6,0x49,0xff,0x4c,0x7d,0x9d
+,0x71,0x88,0xc4,0x76,0x1d,0x90,0x5b,0x1d
+,0xee,0xfd,0xcc,0xf7,0xee,0xfd,0x60,0xa5
+,0xb1,0x7a,0x16,0x71,0xd1,0x16,0xd0,0x7c
+,0x12,0x3c,0x6c,0x69,0x97,0xdb,0xae,0x5f
+,0x39,0x9a,0x70,0x2f,0x05,0x3c,0x19,0x46
+,0x04,0x99,0x20,0x36,0xd0,0x60,0x6e,0x61
+,0x06,0xbb,0x16,0x42,0x8c,0x70,0xf7,0x30
+,0xfb,0xe0,0xdb,0x66,0xa3,0x00,0x01,0xbd
+,0xe6,0x2c,0xda,0x91,0x5f,0xa0,0x46,0x8b
+,0x4d,0x6a,0x9c,0x3d,0x3d,0xdd,0x05,0x46
+,0xfe,0x76,0xbf,0xa0,0x0a,0x3c,0xe4,0x00
+,0xe6,0x27,0xb7,0xff,0x84,0x2d,0xde,0xba
+,0x22,0x27,0x96,0x10,0x71,0xeb,0x22,0xed
+,0xdf,0xdf,0x33,0x9c,0xcf,0xe3,0xad,0xae
+,0x8e,0xd4,0x8e,0xe6,0x4f,0x51,0xaf,0x16
+,0x92,0xe0,0x5c,0xf6,0x07,0x0f};
+const unsigned int NptTlsTrustAnchor_Base_0061_Size = 934;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0062.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0062.cpp
new file mode 100644
index 0000000..0eee9bd
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0062.cpp
@@ -0,0 +1,145 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TC TrustCenter, Germany, Class 2 CA */
+const unsigned char NptTlsTrustAnchor_Base_0062_Data[864] = {
+0x30,0x82,0x03,0x5c,0x30,0x82,0x02,0xc5
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x02,0x03
+,0xea,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00
+,0x30,0x81,0xbc,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x44,0x45
+,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04
+,0x08,0x13,0x07,0x48,0x61,0x6d,0x62,0x75
+,0x72,0x67,0x31,0x10,0x30,0x0e,0x06,0x03
+,0x55,0x04,0x07,0x13,0x07,0x48,0x61,0x6d
+,0x62,0x75,0x72,0x67,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x31,0x54
+,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43
+,0x65,0x6e,0x74,0x65,0x72,0x20,0x66,0x6f
+,0x72,0x20,0x53,0x65,0x63,0x75,0x72,0x69
+,0x74,0x79,0x20,0x69,0x6e,0x20,0x44,0x61
+,0x74,0x61,0x20,0x4e,0x65,0x74,0x77,0x6f
+,0x72,0x6b,0x73,0x20,0x47,0x6d,0x62,0x48
+,0x31,0x22,0x30,0x20,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x19,0x54,0x43,0x20,0x54,0x72
+,0x75,0x73,0x74,0x43,0x65,0x6e,0x74,0x65
+,0x72,0x20,0x43,0x6c,0x61,0x73,0x73,0x20
+,0x32,0x20,0x43,0x41,0x31,0x29,0x30,0x27
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x09,0x01,0x16,0x1a,0x63,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x40,0x74,0x72,0x75,0x73,0x74,0x63,0x65
+,0x6e,0x74,0x65,0x72,0x2e,0x64,0x65,0x30
+,0x1e,0x17,0x0d,0x39,0x38,0x30,0x33,0x30
+,0x39,0x31,0x31,0x35,0x39,0x35,0x39,0x5a
+,0x17,0x0d,0x31,0x31,0x30,0x31,0x30,0x31
+,0x31,0x31,0x35,0x39,0x35,0x39,0x5a,0x30
+,0x81,0xbc,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x44,0x45,0x31
+,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x08
+,0x13,0x07,0x48,0x61,0x6d,0x62,0x75,0x72
+,0x67,0x31,0x10,0x30,0x0e,0x06,0x03,0x55
+,0x04,0x07,0x13,0x07,0x48,0x61,0x6d,0x62
+,0x75,0x72,0x67,0x31,0x3a,0x30,0x38,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x31,0x54,0x43
+,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65
+,0x6e,0x74,0x65,0x72,0x20,0x66,0x6f,0x72
+,0x20,0x53,0x65,0x63,0x75,0x72,0x69,0x74
+,0x79,0x20,0x69,0x6e,0x20,0x44,0x61,0x74
+,0x61,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x73,0x20,0x47,0x6d,0x62,0x48,0x31
+,0x22,0x30,0x20,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x19,0x54,0x43,0x20,0x54,0x72,0x75
+,0x73,0x74,0x43,0x65,0x6e,0x74,0x65,0x72
+,0x20,0x43,0x6c,0x61,0x73,0x73,0x20,0x32
+,0x20,0x43,0x41,0x31,0x29,0x30,0x27,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x09,0x01,0x16,0x1a,0x63,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x40
+,0x74,0x72,0x75,0x73,0x74,0x63,0x65,0x6e
+,0x74,0x65,0x72,0x2e,0x64,0x65,0x30,0x81
+,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x81,0x8d,0x00,0x30,0x81,0x89,0x02
+,0x81,0x81,0x00,0xda,0x38,0xe8,0xed,0x32
+,0x00,0x29,0x71,0x83,0x01,0x0d,0xbf,0x8c
+,0x01,0xdc,0xda,0xc6,0xad,0x39,0xa4,0xa9
+,0x8a,0x2f,0xd5,0x8b,0x5c,0x68,0x5f,0x50
+,0xc6,0x62,0xf5,0x66,0xbd,0xca,0x91,0x22
+,0xec,0xaa,0x1d,0x51,0xd7,0x3d,0xb3,0x51
+,0xb2,0x83,0x4e,0x5d,0xcb,0x49,0xb0,0xf0
+,0x4c,0x55,0xe5,0x6b,0x2d,0xc7,0x85,0x0b
+,0x30,0x1c,0x92,0x4e,0x82,0xd4,0xca,0x02
+,0xed,0xf7,0x6f,0xbe,0xdc,0xe0,0xe3,0x14
+,0xb8,0x05,0x53,0xf2,0x9a,0xf4,0x56,0x8b
+,0x5a,0x9e,0x85,0x93,0xd1,0xb4,0x82,0x56
+,0xae,0x4d,0xbb,0xa8,0x4b,0x57,0x16,0xbc
+,0xfe,0xf8,0x58,0x9e,0xf8,0x29,0x8d,0xb0
+,0x7b,0xcd,0x78,0xc9,0x4f,0xac,0x8b,0x67
+,0x0c,0xf1,0x9c,0xfb,0xfc,0x57,0x9b,0x57
+,0x5c,0x4f,0x0d,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x6b,0x30,0x69,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x01,0x86,0x30,0x33,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x08,0x04,0x26,0x16,0x24,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x74,0x72,0x75,0x73,0x74,0x63,0x65
+,0x6e,0x74,0x65,0x72,0x2e,0x64,0x65,0x2f
+,0x67,0x75,0x69,0x64,0x65,0x6c,0x69,0x6e
+,0x65,0x73,0x30,0x11,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x01,0x04
+,0x04,0x03,0x02,0x00,0x07,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x04,0x05,0x00,0x03,0x81,0x81,0x00
+,0x84,0x52,0xfb,0x28,0xdf,0xff,0x1f,0x75
+,0x01,0xbc,0x01,0xbe,0x04,0x56,0x97,0x6a
+,0x74,0x42,0x24,0x31,0x83,0xf9,0x46,0xb1
+,0x06,0x8a,0x89,0xcf,0x96,0x2c,0x33,0xbf
+,0x8c,0xb5,0x5f,0x7a,0x72,0xa1,0x85,0x06
+,0xce,0x86,0xf8,0x05,0x8e,0xe8,0xf9,0x25
+,0xca,0xda,0x83,0x8c,0x06,0xac,0xeb,0x36
+,0x6d,0x85,0x91,0x34,0x04,0x36,0xf4,0x42
+,0xf0,0xf8,0x79,0x2e,0x0a,0x48,0x5c,0xab
+,0xcc,0x51,0x4f,0x78,0x76,0xa0,0xd9,0xac
+,0x19,0xbd,0x2a,0xd1,0x69,0x04,0x28,0x91
+,0xca,0x36,0x10,0x27,0x80,0x57,0x5b,0xd2
+,0x5c,0xf5,0xc2,0x5b,0xab,0x64,0x81,0x63
+,0x74,0x51,0xf4,0x97,0xbf,0xcd,0x12,0x28
+,0xf7,0x4d,0x66,0x7f,0xa7,0xf0,0x1c,0x01
+,0x26,0x78,0xb2,0x66,0x47,0x70,0x51,0x64
+};
+const unsigned int NptTlsTrustAnchor_Base_0062_Size = 864;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0063.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0063.cpp
new file mode 100644
index 0000000..cf8d8aa
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0063.cpp
@@ -0,0 +1,145 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TC TrustCenter, Germany, Class 3 CA */
+const unsigned char NptTlsTrustAnchor_Base_0063_Data[864] = {
+0x30,0x82,0x03,0x5c,0x30,0x82,0x02,0xc5
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x02,0x03
+,0xeb,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00
+,0x30,0x81,0xbc,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x44,0x45
+,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04
+,0x08,0x13,0x07,0x48,0x61,0x6d,0x62,0x75
+,0x72,0x67,0x31,0x10,0x30,0x0e,0x06,0x03
+,0x55,0x04,0x07,0x13,0x07,0x48,0x61,0x6d
+,0x62,0x75,0x72,0x67,0x31,0x3a,0x30,0x38
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x31,0x54
+,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43
+,0x65,0x6e,0x74,0x65,0x72,0x20,0x66,0x6f
+,0x72,0x20,0x53,0x65,0x63,0x75,0x72,0x69
+,0x74,0x79,0x20,0x69,0x6e,0x20,0x44,0x61
+,0x74,0x61,0x20,0x4e,0x65,0x74,0x77,0x6f
+,0x72,0x6b,0x73,0x20,0x47,0x6d,0x62,0x48
+,0x31,0x22,0x30,0x20,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x19,0x54,0x43,0x20,0x54,0x72
+,0x75,0x73,0x74,0x43,0x65,0x6e,0x74,0x65
+,0x72,0x20,0x43,0x6c,0x61,0x73,0x73,0x20
+,0x33,0x20,0x43,0x41,0x31,0x29,0x30,0x27
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x09,0x01,0x16,0x1a,0x63,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x40,0x74,0x72,0x75,0x73,0x74,0x63,0x65
+,0x6e,0x74,0x65,0x72,0x2e,0x64,0x65,0x30
+,0x1e,0x17,0x0d,0x39,0x38,0x30,0x33,0x30
+,0x39,0x31,0x31,0x35,0x39,0x35,0x39,0x5a
+,0x17,0x0d,0x31,0x31,0x30,0x31,0x30,0x31
+,0x31,0x31,0x35,0x39,0x35,0x39,0x5a,0x30
+,0x81,0xbc,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x44,0x45,0x31
+,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x08
+,0x13,0x07,0x48,0x61,0x6d,0x62,0x75,0x72
+,0x67,0x31,0x10,0x30,0x0e,0x06,0x03,0x55
+,0x04,0x07,0x13,0x07,0x48,0x61,0x6d,0x62
+,0x75,0x72,0x67,0x31,0x3a,0x30,0x38,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x31,0x54,0x43
+,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65
+,0x6e,0x74,0x65,0x72,0x20,0x66,0x6f,0x72
+,0x20,0x53,0x65,0x63,0x75,0x72,0x69,0x74
+,0x79,0x20,0x69,0x6e,0x20,0x44,0x61,0x74
+,0x61,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72
+,0x6b,0x73,0x20,0x47,0x6d,0x62,0x48,0x31
+,0x22,0x30,0x20,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x19,0x54,0x43,0x20,0x54,0x72,0x75
+,0x73,0x74,0x43,0x65,0x6e,0x74,0x65,0x72
+,0x20,0x43,0x6c,0x61,0x73,0x73,0x20,0x33
+,0x20,0x43,0x41,0x31,0x29,0x30,0x27,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x09,0x01,0x16,0x1a,0x63,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x40
+,0x74,0x72,0x75,0x73,0x74,0x63,0x65,0x6e
+,0x74,0x65,0x72,0x2e,0x64,0x65,0x30,0x81
+,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x81,0x8d,0x00,0x30,0x81,0x89,0x02
+,0x81,0x81,0x00,0xb6,0xb4,0xc1,0x35,0x05
+,0x2e,0x0d,0x8d,0xec,0xa0,0x40,0x6a,0x1c
+,0x0e,0x27,0xa6,0x50,0x92,0x6b,0x50,0x1b
+,0x07,0xde,0x2e,0xe7,0x76,0xcc,0xe0,0xda
+,0xfc,0x84,0xa8,0x5e,0x8c,0x63,0x6a,0x2b
+,0x4d,0xd9,0x4e,0x02,0x76,0x11,0xc1,0x0b
+,0xf2,0x8d,0x79,0xca,0x00,0xb6,0xf1,0xb0
+,0x0e,0xd7,0xfb,0xa4,0x17,0x3d,0xaf,0xab
+,0x69,0x7a,0x96,0x27,0xbf,0xaf,0x33,0xa1
+,0x9a,0x2a,0x59,0xaa,0xc4,0xb5,0x37,0x08
+,0xf2,0x12,0xa5,0x31,0xb6,0x43,0xf5,0x32
+,0x96,0x71,0x28,0x28,0xab,0x8d,0x28,0x86
+,0xdf,0xbb,0xee,0xe3,0x0c,0x7d,0x30,0xd6
+,0xc3,0x52,0xab,0x8f,0x5d,0x27,0x9c,0x6b
+,0xc0,0xa3,0xe7,0x05,0x6b,0x57,0x49,0x44
+,0xb3,0x6e,0xea,0x64,0xcf,0xd2,0x8e,0x7a
+,0x50,0x77,0x77,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x6b,0x30,0x69,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x01,0x86,0x30,0x33,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x08,0x04,0x26,0x16,0x24,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x74,0x72,0x75,0x73,0x74,0x63,0x65
+,0x6e,0x74,0x65,0x72,0x2e,0x64,0x65,0x2f
+,0x67,0x75,0x69,0x64,0x65,0x6c,0x69,0x6e
+,0x65,0x73,0x30,0x11,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x01,0x04
+,0x04,0x03,0x02,0x00,0x07,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x04,0x05,0x00,0x03,0x81,0x81,0x00
+,0x16,0x3d,0xc6,0xcd,0xc1,0xbb,0x85,0x71
+,0x85,0x46,0x9f,0x3e,0x20,0x8f,0x51,0x28
+,0x99,0xec,0x2d,0x45,0x21,0x63,0x23,0x5b
+,0x04,0xbb,0x4c,0x90,0xb8,0x88,0x92,0x04
+,0x4d,0xbd,0x7d,0x01,0xa3,0x3f,0xf6,0xec
+,0xce,0xf1,0xde,0xfe,0x7d,0xe5,0xe1,0x3e
+,0xbb,0xc6,0xab,0x5e,0x0b,0xdd,0x3d,0x96
+,0xc4,0xcb,0xa9,0xd4,0xf9,0x26,0xe6,0x06
+,0x4e,0x9e,0x0c,0xa5,0x7a,0xba,0x6e,0xc3
+,0x7c,0x82,0x19,0xd1,0xc7,0xb1,0xb1,0xc3
+,0xdb,0x0d,0x8e,0x9b,0x40,0x7c,0x37,0x0b
+,0xf1,0x5d,0xe8,0xfd,0x1f,0x90,0x88,0xa5
+,0x0e,0x4e,0x37,0x64,0x21,0xa8,0x4e,0x8d
+,0xb4,0x9f,0xf1,0xde,0x48,0xad,0xd5,0x56
+,0x18,0x52,0x29,0x8b,0x47,0x34,0x12,0x09
+,0xd4,0xbb,0x92,0x35,0xef,0x0f,0xdb,0x34
+};
+const unsigned int NptTlsTrustAnchor_Base_0063_Size = 864;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0064.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0064.cpp
new file mode 100644
index 0000000..77cb20c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0064.cpp
@@ -0,0 +1,135 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Certum Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0064_Data[784] = {
+0x30,0x82,0x03,0x0c,0x30,0x82,0x01,0xf4
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x03,0x01
+,0x00,0x20,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x30,0x3e,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x50,0x4c
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x12,0x55,0x6e,0x69,0x7a,0x65
+,0x74,0x6f,0x20,0x53,0x70,0x2e,0x20,0x7a
+,0x20,0x6f,0x2e,0x6f,0x2e,0x31,0x12,0x30
+,0x10,0x06,0x03,0x55,0x04,0x03,0x13,0x09
+,0x43,0x65,0x72,0x74,0x75,0x6d,0x20,0x43
+,0x41,0x30,0x1e,0x17,0x0d,0x30,0x32,0x30
+,0x36,0x31,0x31,0x31,0x30,0x34,0x36,0x33
+,0x39,0x5a,0x17,0x0d,0x32,0x37,0x30,0x36
+,0x31,0x31,0x31,0x30,0x34,0x36,0x33,0x39
+,0x5a,0x30,0x3e,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x50,0x4c
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x12,0x55,0x6e,0x69,0x7a,0x65
+,0x74,0x6f,0x20,0x53,0x70,0x2e,0x20,0x7a
+,0x20,0x6f,0x2e,0x6f,0x2e,0x31,0x12,0x30
+,0x10,0x06,0x03,0x55,0x04,0x03,0x13,0x09
+,0x43,0x65,0x72,0x74,0x75,0x6d,0x20,0x43
+,0x41,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xce,0xb1,0xc1,0x2e,0xd3,0x4f
+,0x7c,0xcd,0x25,0xce,0x18,0x3e,0x4f,0xc4
+,0x8c,0x6f,0x80,0x6a,0x73,0xc8,0x5b,0x51
+,0xf8,0x9b,0xd2,0xdc,0xbb,0x00,0x5c,0xb1
+,0xa0,0xfc,0x75,0x03,0xee,0x81,0xf0,0x88
+,0xee,0x23,0x52,0xe9,0xe6,0x15,0x33,0x8d
+,0xac,0x2d,0x09,0xc5,0x76,0xf9,0x2b,0x39
+,0x80,0x89,0xe4,0x97,0x4b,0x90,0xa5,0xa8
+,0x78,0xf8,0x73,0x43,0x7b,0xa4,0x61,0xb0
+,0xd8,0x58,0xcc,0xe1,0x6c,0x66,0x7e,0x9c
+,0xf3,0x09,0x5e,0x55,0x63,0x84,0xd5,0xa8
+,0xef,0xf3,0xb1,0x2e,0x30,0x68,0xb3,0xc4
+,0x3c,0xd8,0xac,0x6e,0x8d,0x99,0x5a,0x90
+,0x4e,0x34,0xdc,0x36,0x9a,0x8f,0x81,0x88
+,0x50,0xb7,0x6d,0x96,0x42,0x09,0xf3,0xd7
+,0x95,0x83,0x0d,0x41,0x4b,0xb0,0x6a,0x6b
+,0xf8,0xfc,0x0f,0x7e,0x62,0x9f,0x67,0xc4
+,0xed,0x26,0x5f,0x10,0x26,0x0f,0x08,0x4f
+,0xf0,0xa4,0x57,0x28,0xce,0x8f,0xb8,0xed
+,0x45,0xf6,0x6e,0xee,0x25,0x5d,0xaa,0x6e
+,0x39,0xbe,0xe4,0x93,0x2f,0xd9,0x47,0xa0
+,0x72,0xeb,0xfa,0xa6,0x5b,0xaf,0xca,0x53
+,0x3f,0xe2,0x0e,0xc6,0x96,0x56,0x11,0x6e
+,0xf7,0xe9,0x66,0xa9,0x26,0xd8,0x7f,0x95
+,0x53,0xed,0x0a,0x85,0x88,0xba,0x4f,0x29
+,0xa5,0x42,0x8c,0x5e,0xb6,0xfc,0x85,0x20
+,0x00,0xaa,0x68,0x0b,0xa1,0x1a,0x85,0x01
+,0x9c,0xc4,0x46,0x63,0x82,0x88,0xb6,0x22
+,0xb1,0xee,0xfe,0xaa,0x46,0x59,0x7e,0xcf
+,0x35,0x2c,0xd5,0xb6,0xda,0x5d,0xf7,0x48
+,0x33,0x14,0x54,0xb6,0xeb,0xd9,0x6f,0xce
+,0xcd,0x88,0xd6,0xab,0x1b,0xda,0x96,0x3b
+,0x1d,0x59,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x13,0x30,0x11,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0xb8,0x8d,0xce,0xef,0xe7,0x14,0xba,0xcf
+,0xee,0xb0,0x44,0x92,0x6c,0xb4,0x39,0x3e
+,0xa2,0x84,0x6e,0xad,0xb8,0x21,0x77,0xd2
+,0xd4,0x77,0x82,0x87,0xe6,0x20,0x41,0x81
+,0xee,0xe2,0xf8,0x11,0xb7,0x63,0xd1,0x17
+,0x37,0xbe,0x19,0x76,0x24,0x1c,0x04,0x1a
+,0x4c,0xeb,0x3d,0xaa,0x67,0x6f,0x2d,0xd4
+,0xcd,0xfe,0x65,0x31,0x70,0xc5,0x1b,0xa6
+,0x02,0x0a,0xba,0x60,0x7b,0x6d,0x58,0xc2
+,0x9a,0x49,0xfe,0x63,0x32,0x0b,0x6b,0xe3
+,0x3a,0xc0,0xac,0xab,0x3b,0xb0,0xe8,0xd3
+,0x09,0x51,0x8c,0x10,0x83,0xc6,0x34,0xe0
+,0xc5,0x2b,0xe0,0x1a,0xb6,0x60,0x14,0x27
+,0x6c,0x32,0x77,0x8c,0xbc,0xb2,0x72,0x98
+,0xcf,0xcd,0xcc,0x3f,0xb9,0xc8,0x24,0x42
+,0x14,0xd6,0x57,0xfc,0xe6,0x26,0x43,0xa9
+,0x1d,0xe5,0x80,0x90,0xce,0x03,0x54,0x28
+,0x3e,0xf7,0x3f,0xd3,0xf8,0x4d,0xed,0x6a
+,0x0a,0x3a,0x93,0x13,0x9b,0x3b,0x14,0x23
+,0x13,0x63,0x9c,0x3f,0xd1,0x87,0x27,0x79
+,0xe5,0x4c,0x51,0xe3,0x01,0xad,0x85,0x5d
+,0x1a,0x3b,0xb1,0xd5,0x73,0x10,0xa4,0xd3
+,0xf2,0xbc,0x6e,0x64,0xf5,0x5a,0x56,0x90
+,0xa8,0xc7,0x0e,0x4c,0x74,0x0f,0x2e,0x71
+,0x3b,0xf7,0xc8,0x47,0xf4,0x69,0x6f,0x15
+,0xf2,0x11,0x5e,0x83,0x1e,0x9c,0x7c,0x52
+,0xae,0xfd,0x02,0xda,0x12,0xa8,0x59,0x67
+,0x18,0xdb,0xbc,0x70,0xdd,0x9b,0xb1,0x69
+,0xed,0x80,0xce,0x89,0x40,0x48,0x6a,0x0e
+,0x35,0xca,0x29,0x66,0x15,0x21,0x94,0x2c
+,0xe8,0x60,0x2a,0x9b,0x85,0x4a,0x40,0xf3
+,0x6b,0x8a,0x24,0xec,0x06,0x16,0x2c,0x73
+};
+const unsigned int NptTlsTrustAnchor_Base_0064_Size = 784;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0065.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0065.cpp
new file mode 100644
index 0000000..a7914b7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0065.cpp
@@ -0,0 +1,171 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Comodo AAA Services root */
+const unsigned char NptTlsTrustAnchor_Base_0065_Data[1078] = {
+0x30,0x82,0x04,0x32,0x30,0x82,0x03,0x1a
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x7b,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1b
+,0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x0c
+,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72
+,0x20,0x4d,0x61,0x6e,0x63,0x68,0x65,0x73
+,0x74,0x65,0x72,0x31,0x10,0x30,0x0e,0x06
+,0x03,0x55,0x04,0x07,0x0c,0x07,0x53,0x61
+,0x6c,0x66,0x6f,0x72,0x64,0x31,0x1a,0x30
+,0x18,0x06,0x03,0x55,0x04,0x0a,0x0c,0x11
+,0x43,0x6f,0x6d,0x6f,0x64,0x6f,0x20,0x43
+,0x41,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x21,0x30,0x1f,0x06,0x03,0x55
+,0x04,0x03,0x0c,0x18,0x41,0x41,0x41,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x65,0x20,0x53,0x65,0x72,0x76
+,0x69,0x63,0x65,0x73,0x30,0x1e,0x17,0x0d
+,0x30,0x34,0x30,0x31,0x30,0x31,0x30,0x30
+,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x32
+,0x38,0x31,0x32,0x33,0x31,0x32,0x33,0x35
+,0x39,0x35,0x39,0x5a,0x30,0x7b,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x47,0x42,0x31,0x1b,0x30,0x19,0x06
+,0x03,0x55,0x04,0x08,0x0c,0x12,0x47,0x72
+,0x65,0x61,0x74,0x65,0x72,0x20,0x4d,0x61
+,0x6e,0x63,0x68,0x65,0x73,0x74,0x65,0x72
+,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04
+,0x07,0x0c,0x07,0x53,0x61,0x6c,0x66,0x6f
+,0x72,0x64,0x31,0x1a,0x30,0x18,0x06,0x03
+,0x55,0x04,0x0a,0x0c,0x11,0x43,0x6f,0x6d
+,0x6f,0x64,0x6f,0x20,0x43,0x41,0x20,0x4c
+,0x69,0x6d,0x69,0x74,0x65,0x64,0x31,0x21
+,0x30,0x1f,0x06,0x03,0x55,0x04,0x03,0x0c
+,0x18,0x41,0x41,0x41,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65
+,0x73,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xbe,0x40,0x9d,0xf4,0x6e,0xe1
+,0xea,0x76,0x87,0x1c,0x4d,0x45,0x44,0x8e
+,0xbe,0x46,0xc8,0x83,0x06,0x9d,0xc1,0x2a
+,0xfe,0x18,0x1f,0x8e,0xe4,0x02,0xfa,0xf3
+,0xab,0x5d,0x50,0x8a,0x16,0x31,0x0b,0x9a
+,0x06,0xd0,0xc5,0x70,0x22,0xcd,0x49,0x2d
+,0x54,0x63,0xcc,0xb6,0x6e,0x68,0x46,0x0b
+,0x53,0xea,0xcb,0x4c,0x24,0xc0,0xbc,0x72
+,0x4e,0xea,0xf1,0x15,0xae,0xf4,0x54,0x9a
+,0x12,0x0a,0xc3,0x7a,0xb2,0x33,0x60,0xe2
+,0xda,0x89,0x55,0xf3,0x22,0x58,0xf3,0xde
+,0xdc,0xcf,0xef,0x83,0x86,0xa2,0x8c,0x94
+,0x4f,0x9f,0x68,0xf2,0x98,0x90,0x46,0x84
+,0x27,0xc7,0x76,0xbf,0xe3,0xcc,0x35,0x2c
+,0x8b,0x5e,0x07,0x64,0x65,0x82,0xc0,0x48
+,0xb0,0xa8,0x91,0xf9,0x61,0x9f,0x76,0x20
+,0x50,0xa8,0x91,0xc7,0x66,0xb5,0xeb,0x78
+,0x62,0x03,0x56,0xf0,0x8a,0x1a,0x13,0xea
+,0x31,0xa3,0x1e,0xa0,0x99,0xfd,0x38,0xf6
+,0xf6,0x27,0x32,0x58,0x6f,0x07,0xf5,0x6b
+,0xb8,0xfb,0x14,0x2b,0xaf,0xb7,0xaa,0xcc
+,0xd6,0x63,0x5f,0x73,0x8c,0xda,0x05,0x99
+,0xa8,0x38,0xa8,0xcb,0x17,0x78,0x36,0x51
+,0xac,0xe9,0x9e,0xf4,0x78,0x3a,0x8d,0xcf
+,0x0f,0xd9,0x42,0xe2,0x98,0x0c,0xab,0x2f
+,0x9f,0x0e,0x01,0xde,0xef,0x9f,0x99,0x49
+,0xf1,0x2d,0xdf,0xac,0x74,0x4d,0x1b,0x98
+,0xb5,0x47,0xc5,0xe5,0x29,0xd1,0xf9,0x90
+,0x18,0xc7,0x62,0x9c,0xbe,0x83,0xc7,0x26
+,0x7b,0x3e,0x8a,0x25,0xc7,0xc0,0xdd,0x9d
+,0xe6,0x35,0x68,0x10,0x20,0x9d,0x8f,0xd8
+,0xde,0xd2,0xc3,0x84,0x9c,0x0d,0x5e,0xe8
+,0x2f,0xc9,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x81,0xc0,0x30,0x81,0xbd,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0xa0,0x11,0x0a,0x23,0x3e,0x96,0xf1,0x07
+,0xec,0xe2,0xaf,0x29,0xef,0x82,0xa5,0x7f
+,0xd0,0x30,0xa4,0xb4,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x06,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x7b,0x06
+,0x03,0x55,0x1d,0x1f,0x04,0x74,0x30,0x72
+,0x30,0x38,0xa0,0x36,0xa0,0x34,0x86,0x32
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63
+,0x72,0x6c,0x2e,0x63,0x6f,0x6d,0x6f,0x64
+,0x6f,0x63,0x61,0x2e,0x63,0x6f,0x6d,0x2f
+,0x41,0x41,0x41,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x53,0x65
+,0x72,0x76,0x69,0x63,0x65,0x73,0x2e,0x63
+,0x72,0x6c,0x30,0x36,0xa0,0x34,0xa0,0x32
+,0x86,0x30,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x63,0x72,0x6c,0x2e,0x63,0x6f,0x6d
+,0x6f,0x64,0x6f,0x2e,0x6e,0x65,0x74,0x2f
+,0x41,0x41,0x41,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x53,0x65
+,0x72,0x76,0x69,0x63,0x65,0x73,0x2e,0x63
+,0x72,0x6c,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x08,0x56
+,0xfc,0x02,0xf0,0x9b,0xe8,0xff,0xa4,0xfa
+,0xd6,0x7b,0xc6,0x44,0x80,0xce,0x4f,0xc4
+,0xc5,0xf6,0x00,0x58,0xcc,0xa6,0xb6,0xbc
+,0x14,0x49,0x68,0x04,0x76,0xe8,0xe6,0xee
+,0x5d,0xec,0x02,0x0f,0x60,0xd6,0x8d,0x50
+,0x18,0x4f,0x26,0x4e,0x01,0xe3,0xe6,0xb0
+,0xa5,0xee,0xbf,0xbc,0x74,0x54,0x41,0xbf
+,0xfd,0xfc,0x12,0xb8,0xc7,0x4f,0x5a,0xf4
+,0x89,0x60,0x05,0x7f,0x60,0xb7,0x05,0x4a
+,0xf3,0xf6,0xf1,0xc2,0xbf,0xc4,0xb9,0x74
+,0x86,0xb6,0x2d,0x7d,0x6b,0xcc,0xd2,0xf3
+,0x46,0xdd,0x2f,0xc6,0xe0,0x6a,0xc3,0xc3
+,0x34,0x03,0x2c,0x7d,0x96,0xdd,0x5a,0xc2
+,0x0e,0xa7,0x0a,0x99,0xc1,0x05,0x8b,0xab
+,0x0c,0x2f,0xf3,0x5c,0x3a,0xcf,0x6c,0x37
+,0x55,0x09,0x87,0xde,0x53,0x40,0x6c,0x58
+,0xef,0xfc,0xb6,0xab,0x65,0x6e,0x04,0xf6
+,0x1b,0xdc,0x3c,0xe0,0x5a,0x15,0xc6,0x9e
+,0xd9,0xf1,0x59,0x48,0x30,0x21,0x65,0x03
+,0x6c,0xec,0xe9,0x21,0x73,0xec,0x9b,0x03
+,0xa1,0xe0,0x37,0xad,0xa0,0x15,0x18,0x8f
+,0xfa,0xba,0x02,0xce,0xa7,0x2c,0xa9,0x10
+,0x13,0x2c,0xd4,0xe5,0x08,0x26,0xab,0x22
+,0x97,0x60,0xf8,0x90,0x5e,0x74,0xd4,0xa2
+,0x9a,0x53,0xbd,0xf2,0xa9,0x68,0xe0,0xa2
+,0x6e,0xc2,0xd7,0x6c,0xb1,0xa3,0x0f,0x9e
+,0xbf,0xeb,0x68,0xe7,0x56,0xf2,0xae,0xf2
+,0xe3,0x2b,0x38,0x3a,0x09,0x81,0xb5,0x6b
+,0x85,0xd7,0xbe,0x2d,0xed,0x3f,0x1a,0xb7
+,0xb2,0x63,0xe2,0xf5,0x62,0x2c,0x82,0xd4
+,0x6a,0x00,0x41,0x50,0xf1,0x39,0x83,0x9f
+,0x95,0xe9,0x36,0x96,0x98,0x6e};
+const unsigned int NptTlsTrustAnchor_Base_0065_Size = 1078;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0066.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0066.cpp
new file mode 100644
index 0000000..b977953
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0066.cpp
@@ -0,0 +1,173 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Comodo Secure Services root */
+const unsigned char NptTlsTrustAnchor_Base_0066_Data[1091] = {
+0x30,0x82,0x04,0x3f,0x30,0x82,0x03,0x27
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1b
+,0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x0c
+,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72
+,0x20,0x4d,0x61,0x6e,0x63,0x68,0x65,0x73
+,0x74,0x65,0x72,0x31,0x10,0x30,0x0e,0x06
+,0x03,0x55,0x04,0x07,0x0c,0x07,0x53,0x61
+,0x6c,0x66,0x6f,0x72,0x64,0x31,0x1a,0x30
+,0x18,0x06,0x03,0x55,0x04,0x0a,0x0c,0x11
+,0x43,0x6f,0x6d,0x6f,0x64,0x6f,0x20,0x43
+,0x41,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x24,0x30,0x22,0x06,0x03,0x55
+,0x04,0x03,0x0c,0x1b,0x53,0x65,0x63,0x75
+,0x72,0x65,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x30
+,0x1e,0x17,0x0d,0x30,0x34,0x30,0x31,0x30
+,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a
+,0x17,0x0d,0x32,0x38,0x31,0x32,0x33,0x31
+,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30
+,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1b
+,0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x0c
+,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72
+,0x20,0x4d,0x61,0x6e,0x63,0x68,0x65,0x73
+,0x74,0x65,0x72,0x31,0x10,0x30,0x0e,0x06
+,0x03,0x55,0x04,0x07,0x0c,0x07,0x53,0x61
+,0x6c,0x66,0x6f,0x72,0x64,0x31,0x1a,0x30
+,0x18,0x06,0x03,0x55,0x04,0x0a,0x0c,0x11
+,0x43,0x6f,0x6d,0x6f,0x64,0x6f,0x20,0x43
+,0x41,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x24,0x30,0x22,0x06,0x03,0x55
+,0x04,0x03,0x0c,0x1b,0x53,0x65,0x63,0x75
+,0x72,0x65,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x30
+,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01
+,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30
+,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00
+,0xc0,0x71,0x33,0x82,0x8a,0xd0,0x70,0xeb
+,0x73,0x87,0x82,0x40,0xd5,0x1d,0xe4,0xcb
+,0xc9,0x0e,0x42,0x90,0xf9,0xde,0x34,0xb9
+,0xa1,0xba,0x11,0xf4,0x25,0x85,0xf3,0xcc
+,0x72,0x6d,0xf2,0x7b,0x97,0x6b,0xb3,0x07
+,0xf1,0x77,0x24,0x91,0x5f,0x25,0x8f,0xf6
+,0x74,0x3d,0xe4,0x80,0xc2,0xf8,0x3c,0x0d
+,0xf3,0xbf,0x40,0xea,0xf7,0xc8,0x52,0xd1
+,0x72,0x6f,0xef,0xc8,0xab,0x41,0xb8,0x6e
+,0x2e,0x17,0x2a,0x95,0x69,0x0c,0xcd,0xd2
+,0x1e,0x94,0x7b,0x2d,0x94,0x1d,0xaa,0x75
+,0xd7,0xb3,0x98,0xcb,0xac,0xbc,0x64,0x53
+,0x40,0xbc,0x8f,0xac,0xac,0x36,0xcb,0x5c
+,0xad,0xbb,0xdd,0xe0,0x94,0x17,0xec,0xd1
+,0x5c,0xd0,0xbf,0xef,0xa5,0x95,0xc9,0x90
+,0xc5,0xb0,0xac,0xfb,0x1b,0x43,0xdf,0x7a
+,0x08,0x5d,0xb7,0xb8,0xf2,0x40,0x1b,0x2b
+,0x27,0x9e,0x50,0xce,0x5e,0x65,0x82,0x88
+,0x8c,0x5e,0xd3,0x4e,0x0c,0x7a,0xea,0x08
+,0x91,0xb6,0x36,0xaa,0x2b,0x42,0xfb,0xea
+,0xc2,0xa3,0x39,0xe5,0xdb,0x26,0x38,0xad
+,0x8b,0x0a,0xee,0x19,0x63,0xc7,0x1c,0x24
+,0xdf,0x03,0x78,0xda,0xe6,0xea,0xc1,0x47
+,0x1a,0x0b,0x0b,0x46,0x09,0xdd,0x02,0xfc
+,0xde,0xcb,0x87,0x5f,0xd7,0x30,0x63,0x68
+,0xa1,0xae,0xdc,0x32,0xa1,0xba,0xbe,0xfe
+,0x44,0xab,0x68,0xb6,0xa5,0x17,0x15,0xfd
+,0xbd,0xd5,0xa7,0xa7,0x9a,0xe4,0x44,0x33
+,0xe9,0x88,0x8e,0xfc,0xed,0x51,0xeb,0x93
+,0x71,0x4e,0xad,0x01,0xe7,0x44,0x8e,0xab
+,0x2d,0xcb,0xa8,0xfe,0x01,0x49,0x48,0xf0
+,0xc0,0xdd,0xc7,0x68,0xd8,0x92,0xfe,0x3d
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x81,0xc7
+,0x30,0x81,0xc4,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0x3c,0xd8
+,0x93,0x88,0xc2,0xc0,0x82,0x09,0xcc,0x01
+,0x99,0x06,0x93,0x20,0xe9,0x9e,0x70,0x09
+,0x63,0x4f,0x30,0x0e,0x06,0x03,0x55,0x1d
+,0x0f,0x01,0x01,0xff,0x04,0x04,0x03,0x02
+,0x01,0x06,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x81,0x81,0x06,0x03
+,0x55,0x1d,0x1f,0x04,0x7a,0x30,0x78,0x30
+,0x3b,0xa0,0x39,0xa0,0x37,0x86,0x35,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72
+,0x6c,0x2e,0x63,0x6f,0x6d,0x6f,0x64,0x6f
+,0x63,0x61,0x2e,0x63,0x6f,0x6d,0x2f,0x53
+,0x65,0x63,0x75,0x72,0x65,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73
+,0x2e,0x63,0x72,0x6c,0x30,0x39,0xa0,0x37
+,0xa0,0x35,0x86,0x33,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x63
+,0x6f,0x6d,0x6f,0x64,0x6f,0x2e,0x6e,0x65
+,0x74,0x2f,0x53,0x65,0x63,0x75,0x72,0x65
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x65,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x2e,0x63,0x72,0x6c,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x01,0x01,0x00,0x87,0x01,0x6d,0x23,0x1d
+,0x7e,0x5b,0x17,0x7d,0xc1,0x61,0x32,0xcf
+,0x8f,0xe7,0xf3,0x8a,0x94,0x59,0x66,0xe0
+,0x9e,0x28,0xa8,0x5e,0xd3,0xb7,0xf4,0x34
+,0xe6,0xaa,0x39,0xb2,0x97,0x16,0xc5,0x82
+,0x6f,0x32,0xa4,0xe9,0x8c,0xe7,0xaf,0xfd
+,0xef,0xc2,0xe8,0xb9,0x4b,0xaa,0xa3,0xf4
+,0xe6,0xda,0x8d,0x65,0x21,0xfb,0xba,0x80
+,0xeb,0x26,0x28,0x85,0x1a,0xfe,0x39,0x8c
+,0xde,0x5b,0x04,0x04,0xb4,0x54,0xf9,0xa3
+,0x67,0x9e,0x41,0xfa,0x09,0x52,0xcc,0x05
+,0x48,0xa8,0xc9,0x3f,0x21,0x04,0x1e,0xce
+,0x48,0x6b,0xfc,0x85,0xe8,0xc2,0x7b,0xaf
+,0x7f,0xb7,0xcc,0xf8,0x5f,0x3a,0xfd,0x35
+,0xc6,0x0d,0xef,0x97,0xdc,0x4c,0xab,0x11
+,0xe1,0x6b,0xcb,0x31,0xd1,0x6c,0xfb,0x48
+,0x80,0xab,0xdc,0x9c,0x37,0xb8,0x21,0x14
+,0x4b,0x0d,0x71,0x3d,0xec,0x83,0x33,0x6e
+,0xd1,0x6e,0x32,0x16,0xec,0x98,0xc7,0x16
+,0x8b,0x59,0xa6,0x34,0xab,0x05,0x57,0x2d
+,0x93,0xf7,0xaa,0x13,0xcb,0xd2,0x13,0xe2
+,0xb7,0x2e,0x3b,0xcd,0x6b,0x50,0x17,0x09
+,0x68,0x3e,0xb5,0x26,0x57,0xee,0xb6,0xe0
+,0xb6,0xdd,0xb9,0x29,0x80,0x79,0x7d,0x8f
+,0xa3,0xf0,0xa4,0x28,0xa4,0x15,0xc4,0x85
+,0xf4,0x27,0xd4,0x6b,0xbf,0xe5,0x5c,0xe4
+,0x65,0x02,0x76,0x54,0xb4,0xe3,0x37,0x66
+,0x24,0xd3,0x19,0x61,0xc8,0x52,0x10,0xe5
+,0x8b,0x37,0x9a,0xb9,0xa9,0xf9,0x1d,0xbf
+,0xea,0x99,0x92,0x61,0x96,0xff,0x01,0xcd
+,0xa1,0x5f,0x0d,0xbc,0x71,0xbc,0x0e,0xac
+,0x0b,0x1d,0x47,0x45,0x1d,0xc1,0xec,0x7c
+,0xec,0xfd,0x29};
+const unsigned int NptTlsTrustAnchor_Base_0066_Size = 1091;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0067.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0067.cpp
new file mode 100644
index 0000000..ba70c58
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0067.cpp
@@ -0,0 +1,173 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Comodo Trusted Services root */
+const unsigned char NptTlsTrustAnchor_Base_0067_Data[1095] = {
+0x30,0x82,0x04,0x43,0x30,0x82,0x03,0x2b
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x7f,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1b
+,0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x0c
+,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72
+,0x20,0x4d,0x61,0x6e,0x63,0x68,0x65,0x73
+,0x74,0x65,0x72,0x31,0x10,0x30,0x0e,0x06
+,0x03,0x55,0x04,0x07,0x0c,0x07,0x53,0x61
+,0x6c,0x66,0x6f,0x72,0x64,0x31,0x1a,0x30
+,0x18,0x06,0x03,0x55,0x04,0x0a,0x0c,0x11
+,0x43,0x6f,0x6d,0x6f,0x64,0x6f,0x20,0x43
+,0x41,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x25,0x30,0x23,0x06,0x03,0x55
+,0x04,0x03,0x0c,0x1c,0x54,0x72,0x75,0x73
+,0x74,0x65,0x64,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20
+,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73
+,0x30,0x1e,0x17,0x0d,0x30,0x34,0x30,0x31
+,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30
+,0x5a,0x17,0x0d,0x32,0x38,0x31,0x32,0x33
+,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5a
+,0x30,0x7f,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31
+,0x1b,0x30,0x19,0x06,0x03,0x55,0x04,0x08
+,0x0c,0x12,0x47,0x72,0x65,0x61,0x74,0x65
+,0x72,0x20,0x4d,0x61,0x6e,0x63,0x68,0x65
+,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0e
+,0x06,0x03,0x55,0x04,0x07,0x0c,0x07,0x53
+,0x61,0x6c,0x66,0x6f,0x72,0x64,0x31,0x1a
+,0x30,0x18,0x06,0x03,0x55,0x04,0x0a,0x0c
+,0x11,0x43,0x6f,0x6d,0x6f,0x64,0x6f,0x20
+,0x43,0x41,0x20,0x4c,0x69,0x6d,0x69,0x74
+,0x65,0x64,0x31,0x25,0x30,0x23,0x06,0x03
+,0x55,0x04,0x03,0x0c,0x1c,0x54,0x72,0x75
+,0x73,0x74,0x65,0x64,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65
+,0x73,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xdf,0x71,0x6f,0x36,0x58,0x53
+,0x5a,0xf2,0x36,0x54,0x57,0x80,0xc4,0x74
+,0x08,0x20,0xed,0x18,0x7f,0x2a,0x1d,0xe6
+,0x35,0x9a,0x1e,0x25,0xac,0x9c,0xe5,0x96
+,0x7e,0x72,0x52,0xa0,0x15,0x42,0xdb,0x59
+,0xdd,0x64,0x7a,0x1a,0xd0,0xb8,0x7b,0xdd
+,0x39,0x15,0xbc,0x55,0x48,0xc4,0xed,0x3a
+,0x00,0xea,0x31,0x11,0xba,0xf2,0x71,0x74
+,0x1a,0x67,0xb8,0xcf,0x33,0xcc,0xa8,0x31
+,0xaf,0xa3,0xe3,0xd7,0x7f,0xbf,0x33,0x2d
+,0x4c,0x6a,0x3c,0xec,0x8b,0xc3,0x92,0xd2
+,0x53,0x77,0x24,0x74,0x9c,0x07,0x6e,0x70
+,0xfc,0xbd,0x0b,0x5b,0x76,0xba,0x5f,0xf2
+,0xff,0xd7,0x37,0x4b,0x4a,0x60,0x78,0xf7
+,0xf0,0xfa,0xca,0x70,0xb4,0xea,0x59,0xaa
+,0xa3,0xce,0x48,0x2f,0xa9,0xc3,0xb2,0x0b
+,0x7e,0x17,0x72,0x16,0x0c,0xa6,0x07,0x0c
+,0x1b,0x38,0xcf,0xc9,0x62,0xb7,0x3f,0xa0
+,0x93,0xa5,0x87,0x41,0xf2,0xb7,0x70,0x40
+,0x77,0xd8,0xbe,0x14,0x7c,0xe3,0xa8,0xc0
+,0x7a,0x8e,0xe9,0x63,0x6a,0xd1,0x0f,0x9a
+,0xc6,0xd2,0xf4,0x8b,0x3a,0x14,0x04,0x56
+,0xd4,0xed,0xb8,0xcc,0x6e,0xf5,0xfb,0xe2
+,0x2c,0x58,0xbd,0x7f,0x4f,0x6b,0x2b,0xf7
+,0x60,0x24,0x58,0x24,0xce,0x26,0xef,0x34
+,0x91,0x3a,0xd5,0xe3,0x81,0xd0,0xb2,0xf0
+,0x04,0x02,0xd7,0x5b,0xb7,0x3e,0x92,0xac
+,0x6b,0x12,0x8a,0xf9,0xe4,0x05,0xb0,0x3b
+,0x91,0x49,0x5c,0xb2,0xeb,0x53,0xea,0xf8
+,0x9f,0x47,0x86,0xee,0xbf,0x95,0xc0,0xc0
+,0x06,0x9f,0xd2,0x5b,0x5e,0x11,0x1b,0xf4
+,0xc7,0x04,0x35,0x29,0xd2,0x55,0x5c,0xe4
+,0xed,0xeb,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x81,0xc9,0x30,0x81,0xc6,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0xc5,0x7b,0x58,0xbd,0xed,0xda,0x25,0x69
+,0xd2,0xf7,0x59,0x16,0xa8,0xb3,0x32,0xc0
+,0x7b,0x27,0x5b,0xf4,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x06,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x81,0x83
+,0x06,0x03,0x55,0x1d,0x1f,0x04,0x7c,0x30
+,0x7a,0x30,0x3c,0xa0,0x3a,0xa0,0x38,0x86
+,0x36,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x63,0x72,0x6c,0x2e,0x63,0x6f,0x6d,0x6f
+,0x64,0x6f,0x63,0x61,0x2e,0x63,0x6f,0x6d
+,0x2f,0x54,0x72,0x75,0x73,0x74,0x65,0x64
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x65,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x2e,0x63,0x72,0x6c,0x30
+,0x3a,0xa0,0x38,0xa0,0x36,0x86,0x34,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72
+,0x6c,0x2e,0x63,0x6f,0x6d,0x6f,0x64,0x6f
+,0x2e,0x6e,0x65,0x74,0x2f,0x54,0x72,0x75
+,0x73,0x74,0x65,0x64,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x2e
+,0x63,0x72,0x6c,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0xc8
+,0x93,0x81,0x3b,0x89,0xb4,0xaf,0xb8,0x84
+,0x12,0x4c,0x8d,0xd2,0xf0,0xdb,0x70,0xba
+,0x57,0x86,0x15,0x34,0x10,0xb9,0x2f,0x7f
+,0x1e,0xb0,0xa8,0x89,0x60,0xa1,0x8a,0xc2
+,0x77,0x0c,0x50,0x4a,0x9b,0x00,0x8b,0xd8
+,0x8b,0xf4,0x41,0xe2,0xd0,0x83,0x8a,0x4a
+,0x1c,0x14,0x06,0xb0,0xa3,0x68,0x05,0x70
+,0x31,0x30,0xa7,0x53,0x9b,0x0e,0xe9,0x4a
+,0xa0,0x58,0x69,0x67,0x0e,0xae,0x9d,0xf6
+,0xa5,0x2c,0x41,0xbf,0x3c,0x06,0x6b,0xe4
+,0x59,0xcc,0x6d,0x10,0xf1,0x96,0x6f,0x1f
+,0xdf,0xf4,0x04,0x02,0xa4,0x9f,0x45,0x3e
+,0xc8,0xd8,0xfa,0x36,0x46,0x44,0x50,0x3f
+,0x82,0x97,0x91,0x1f,0x28,0xdb,0x18,0x11
+,0x8c,0x2a,0xe4,0x65,0x83,0x57,0x12,0x12
+,0x8c,0x17,0x3f,0x94,0x36,0xfe,0x5d,0xb0
+,0xc0,0x04,0x77,0x13,0xb8,0xf4,0x15,0xd5
+,0x3f,0x38,0xcc,0x94,0x3a,0x55,0xd0,0xac
+,0x98,0xf5,0xba,0x00,0x5f,0xe0,0x86,0x19
+,0x81,0x78,0x2f,0x28,0xc0,0x7e,0xd3,0xcc
+,0x42,0x0a,0xf5,0xae,0x50,0xa0,0xd1,0x3e
+,0xc6,0xa1,0x71,0xec,0x3f,0xa0,0x20,0x8c
+,0x66,0x3a,0x89,0xb4,0x8e,0xd4,0xd8,0xb1
+,0x4d,0x25,0x47,0xee,0x2f,0x88,0xc8,0xb5
+,0xe1,0x05,0x45,0xc0,0xbe,0x14,0x71,0xde
+,0x7a,0xfd,0x8e,0x7b,0x7d,0x4d,0x08,0x96
+,0xa5,0x12,0x73,0xf0,0x2d,0xca,0x37,0x27
+,0x74,0x12,0x27,0x4c,0xcb,0xb6,0x97,0xe9
+,0xd9,0xae,0x08,0x6d,0x5a,0x39,0x40,0xdd
+,0x05,0x47,0x75,0x6a,0x5a,0x21,0xb3,0xa3
+,0x18,0xcf,0x4e,0xf7,0x2e,0x57,0xb7,0x98
+,0x70,0x5e,0xc8,0xc4,0x78,0xb0,0x62};
+const unsigned int NptTlsTrustAnchor_Base_0067_Size = 1095;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0068.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0068.cpp
new file mode 100644
index 0000000..f0f643a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0068.cpp
@@ -0,0 +1,292 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* IPS Chained CAs root */
+const unsigned char NptTlsTrustAnchor_Base_0068_Data[2043] = {
+0x30,0x82,0x07,0xf7,0x30,0x82,0x07,0x60
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x82,0x01,0x1c,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x33,0x30
+,0x31,0x06,0x03,0x55,0x04,0x0b,0x13,0x2a
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x68,0x61,0x69,0x6e,0x65,0x64,0x20,0x43
+,0x41,0x73,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x31,0x33,0x30,0x31,0x06,0x03
+,0x55,0x04,0x03,0x13,0x2a,0x49,0x50,0x53
+,0x20,0x43,0x41,0x20,0x43,0x68,0x61,0x69
+,0x6e,0x65,0x64,0x20,0x43,0x41,0x73,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x30
+,0x1e,0x17,0x0d,0x30,0x31,0x31,0x32,0x32
+,0x39,0x30,0x30,0x35,0x33,0x35,0x38,0x5a
+,0x17,0x0d,0x32,0x35,0x31,0x32,0x32,0x37
+,0x30,0x30,0x35,0x33,0x35,0x38,0x5a,0x30
+,0x82,0x01,0x1c,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x33,0x30
+,0x31,0x06,0x03,0x55,0x04,0x0b,0x13,0x2a
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x68,0x61,0x69,0x6e,0x65,0x64,0x20,0x43
+,0x41,0x73,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x31,0x33,0x30,0x31,0x06,0x03
+,0x55,0x04,0x03,0x13,0x2a,0x49,0x50,0x53
+,0x20,0x43,0x41,0x20,0x43,0x68,0x61,0x69
+,0x6e,0x65,0x64,0x20,0x43,0x41,0x73,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x30
+,0x81,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x81,0x8d,0x00,0x30,0x81,0x89
+,0x02,0x81,0x81,0x00,0xdc,0x56,0x92,0x49
+,0xb2,0x94,0x20,0xbc,0x98,0x4f,0x50,0xeb
+,0x68,0xa4,0xa7,0x49,0x0b,0xbf,0xd2,0x31
+,0xe8,0xc7,0x4f,0xc2,0x86,0x0b,0xfa,0x68
+,0xfd,0x43,0x5a,0x8a,0xf3,0x60,0x92,0x35
+,0x99,0x38,0xbb,0x4d,0x03,0x52,0x21,0x5b
+,0xf0,0x37,0x99,0x35,0xe1,0x41,0x20,0x81
+,0x85,0x81,0x05,0x71,0x81,0x9d,0xb4,0x95
+,0x19,0xa9,0x5f,0x76,0x34,0x2e,0x63,0x37
+,0x35,0x57,0x8e,0xb4,0x1f,0x42,0x3f,0x15
+,0x5c,0xe1,0x7a,0xc1,0x5f,0x13,0x18,0x32
+,0x31,0xc9,0xad,0xbe,0xa3,0xc7,0x83,0x66
+,0x1e,0xb9,0x9c,0x04,0x13,0xcb,0x69,0xc1
+,0x06,0xde,0x30,0x06,0xbb,0x33,0xa3,0xb5
+,0x1f,0xf0,0x8f,0x6f,0xce,0xff,0x96,0xe8
+,0x54,0xbe,0x66,0x80,0xae,0x6b,0xdb,0x41
+,0x84,0x36,0xa2,0x3d,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x82,0x04,0x43,0x30,0x82,0x04
+,0x3f,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0xa1,0xad,0x31,0xb1
+,0xf9,0x3e,0xe1,0x17,0xa6,0xc8,0xab,0x34
+,0xfc,0x52,0x87,0x09,0x1e,0x62,0x52,0x41
+,0x30,0x82,0x01,0x4e,0x06,0x03,0x55,0x1d
+,0x23,0x04,0x82,0x01,0x45,0x30,0x82,0x01
+,0x41,0x80,0x14,0xa1,0xad,0x31,0xb1,0xf9
+,0x3e,0xe1,0x17,0xa6,0xc8,0xab,0x34,0xfc
+,0x52,0x87,0x09,0x1e,0x62,0x52,0x41,0xa1
+,0x82,0x01,0x24,0xa4,0x82,0x01,0x20,0x30
+,0x82,0x01,0x1c,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x33,0x30
+,0x31,0x06,0x03,0x55,0x04,0x0b,0x13,0x2a
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x68,0x61,0x69,0x6e,0x65,0x64,0x20,0x43
+,0x41,0x73,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x31,0x33,0x30,0x31,0x06,0x03
+,0x55,0x04,0x03,0x13,0x2a,0x49,0x50,0x53
+,0x20,0x43,0x41,0x20,0x43,0x68,0x61,0x69
+,0x6e,0x65,0x64,0x20,0x43,0x41,0x73,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x82
+,0x01,0x00,0x30,0x0c,0x06,0x03,0x55,0x1d
+,0x13,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x0c,0x06,0x03,0x55,0x1d,0x0f,0x04
+,0x05,0x03,0x03,0x07,0xff,0x80,0x30,0x6b
+,0x06,0x03,0x55,0x1d,0x25,0x04,0x64,0x30
+,0x62,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x03,0x01,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x03,0x02,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03
+,0x04,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x03,0x08,0x06,0x0a,0x2b,0x06,0x01
+,0x04,0x01,0x82,0x37,0x02,0x01,0x15,0x06
+,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37
+,0x02,0x01,0x16,0x06,0x0a,0x2b,0x06,0x01
+,0x04,0x01,0x82,0x37,0x0a,0x03,0x01,0x06
+,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37
+,0x0a,0x03,0x04,0x30,0x11,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x01
+,0x04,0x04,0x03,0x02,0x00,0x07,0x30,0x1a
+,0x06,0x03,0x55,0x1d,0x11,0x04,0x13,0x30
+,0x11,0x81,0x0f,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x30,0x1a,0x06,0x03,0x55,0x1d
+,0x12,0x04,0x13,0x30,0x11,0x81,0x0f,0x69
+,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x30,0x42
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x0d,0x04,0x35,0x16,0x33,0x43
+,0x68,0x61,0x69,0x6e,0x65,0x64,0x20,0x43
+,0x41,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x65,0x20,0x69,0x73
+,0x73,0x75,0x65,0x64,0x20,0x62,0x79,0x20
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x69,0x70,0x73,0x2e,0x65
+,0x73,0x2f,0x30,0x29,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x02,0x04
+,0x1c,0x16,0x1a,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x30,0x37,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x04,0x04,0x2a,0x16,0x28,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f
+,0x69,0x70,0x73,0x32,0x30,0x30,0x32,0x2f
+,0x69,0x70,0x73,0x32,0x30,0x30,0x32,0x43
+,0x41,0x43,0x2e,0x63,0x72,0x6c,0x30,0x3c
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x03,0x04,0x2f,0x16,0x2d,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x2f,0x72,0x65,0x76,0x6f,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x43,0x41,0x43,0x2e,0x68
+,0x74,0x6d,0x6c,0x3f,0x30,0x39,0x06,0x09
+,0x60,0x86,0x48,0x01,0x86,0xf8,0x42,0x01
+,0x07,0x04,0x2c,0x16,0x2a,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f,0x69
+,0x70,0x73,0x32,0x30,0x30,0x32,0x2f,0x72
+,0x65,0x6e,0x65,0x77,0x61,0x6c,0x43,0x41
+,0x43,0x2e,0x68,0x74,0x6d,0x6c,0x3f,0x30
+,0x37,0x06,0x09,0x60,0x86,0x48,0x01,0x86
+,0xf8,0x42,0x01,0x08,0x04,0x2a,0x16,0x28
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x69,0x70,0x73,0x2e,0x65
+,0x73,0x2f,0x69,0x70,0x73,0x32,0x30,0x30
+,0x32,0x2f,0x70,0x6f,0x6c,0x69,0x63,0x79
+,0x43,0x41,0x43,0x2e,0x68,0x74,0x6d,0x6c
+,0x30,0x6d,0x06,0x03,0x55,0x1d,0x1f,0x04
+,0x66,0x30,0x64,0x30,0x2e,0xa0,0x2c,0xa0
+,0x2a,0x86,0x28,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x43,0x41,0x43,0x2e
+,0x63,0x72,0x6c,0x30,0x32,0xa0,0x30,0xa0
+,0x2e,0x86,0x2c,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x62,0x61,0x63
+,0x6b,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x43,0x41,0x43,0x2e,0x63,0x72,0x6c,0x30
+,0x2f,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x01,0x01,0x04,0x23,0x30,0x21,0x30
+,0x1f,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x30,0x01,0x86,0x13,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x6f,0x63,0x73,0x70
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x81,0x81,0x00,0x44,0x72,0x30,0x9d,0x56
+,0x58,0xa2,0x41,0x1b,0x28,0xb7,0x95,0xe1
+,0xa6,0x1a,0x95,0x5f,0xa7,0x78,0x40,0x2b
+,0xef,0xdb,0x96,0x4a,0xfc,0x4c,0x71,0x63
+,0xd9,0x73,0x95,0xbd,0x02,0xe2,0xa2,0x06
+,0xc7,0xbe,0x97,0x2a,0x93,0x80,0x34,0x86
+,0x03,0xfa,0xdc,0xd8,0x3d,0x1e,0x07,0xcd
+,0x1e,0x73,0x43,0x24,0x60,0xf5,0x1d,0x61
+,0xdc,0xdc,0x96,0xa0,0xbc,0xfb,0x1d,0xe3
+,0xe7,0x12,0x00,0x27,0x33,0x02,0xc0,0xc0
+,0x2b,0x53,0x3d,0xd8,0x6b,0x03,0x81,0xa3
+,0xdb,0xd6,0x93,0x95,0x20,0xef,0xd3,0x96
+,0x7e,0x26,0x90,0x89,0x9c,0x26,0x9b,0xcd
+,0x6f,0x66,0xab,0xed,0x03,0x22,0x44,0x38
+,0xcc,0x59,0xbd,0x9f,0xdb,0xf6,0x07,0xa2
+,0x01,0x7f,0x26,0xc4,0x63,0xf5,0x25,0x42
+,0x5e,0x62,0xbd};
+const unsigned int NptTlsTrustAnchor_Base_0068_Size = 2043;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0069.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0069.cpp
new file mode 100644
index 0000000..fd231c9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0069.cpp
@@ -0,0 +1,290 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* IPS CLASE1 root */
+const unsigned char NptTlsTrustAnchor_Base_0069_Data[2030] = {
+0x30,0x82,0x07,0xea,0x30,0x82,0x07,0x53
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x82,0x01,0x12,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x2e,0x30
+,0x2c,0x06,0x03,0x55,0x04,0x0b,0x13,0x25
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x31,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68
+,0x6f,0x72,0x69,0x74,0x79,0x31,0x2e,0x30
+,0x2c,0x06,0x03,0x55,0x04,0x03,0x13,0x25
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x31,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68
+,0x6f,0x72,0x69,0x74,0x79,0x31,0x1e,0x30
+,0x1c,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x09,0x01,0x16,0x0f,0x69,0x70
+,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e,0x69
+,0x70,0x73,0x2e,0x65,0x73,0x30,0x1e,0x17
+,0x0d,0x30,0x31,0x31,0x32,0x32,0x39,0x30
+,0x30,0x35,0x39,0x33,0x38,0x5a,0x17,0x0d
+,0x32,0x35,0x31,0x32,0x32,0x37,0x30,0x30
+,0x35,0x39,0x33,0x38,0x5a,0x30,0x82,0x01
+,0x12,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x45,0x53,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x08,0x13
+,0x09,0x42,0x61,0x72,0x63,0x65,0x6c,0x6f
+,0x6e,0x61,0x31,0x12,0x30,0x10,0x06,0x03
+,0x55,0x04,0x07,0x13,0x09,0x42,0x61,0x72
+,0x63,0x65,0x6c,0x6f,0x6e,0x61,0x31,0x2e
+,0x30,0x2c,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x25,0x49,0x50,0x53,0x20,0x49,0x6e,0x74
+,0x65,0x72,0x6e,0x65,0x74,0x20,0x70,0x75
+,0x62,0x6c,0x69,0x73,0x68,0x69,0x6e,0x67
+,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65
+,0x73,0x20,0x73,0x2e,0x6c,0x2e,0x31,0x2b
+,0x30,0x29,0x06,0x03,0x55,0x04,0x0a,0x14
+,0x22,0x69,0x70,0x73,0x40,0x6d,0x61,0x69
+,0x6c,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x20,0x43,0x2e,0x49,0x2e,0x46,0x2e,0x20
+,0x20,0x42,0x2d,0x36,0x30,0x39,0x32,0x39
+,0x34,0x35,0x32,0x31,0x2e,0x30,0x2c,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x25,0x49,0x50
+,0x53,0x20,0x43,0x41,0x20,0x43,0x4c,0x41
+,0x53,0x45,0x31,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x2e,0x30,0x2c,0x06
+,0x03,0x55,0x04,0x03,0x13,0x25,0x49,0x50
+,0x53,0x20,0x43,0x41,0x20,0x43,0x4c,0x41
+,0x53,0x45,0x31,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x1e,0x30,0x1c,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x09,0x01,0x16,0x0f,0x69,0x70,0x73,0x40
+,0x6d,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73
+,0x2e,0x65,0x73,0x30,0x81,0x9f,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d
+,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00
+,0xe0,0x51,0x27,0xa7,0x0b,0xdd,0xaf,0xd1
+,0xb9,0x43,0x5b,0x82,0x37,0x45,0x56,0x72
+,0xef,0x9a,0xb6,0xc2,0x12,0xef,0x2c,0x12
+,0xcc,0x76,0xf9,0x06,0x59,0xaf,0x5d,0x21
+,0xd4,0xd2,0x5a,0xb8,0xa0,0xd4,0xf3,0x6a
+,0xfd,0xca,0x69,0x8d,0x66,0x48,0xf7,0x74
+,0xe6,0xee,0x36,0xbd,0xe8,0x96,0x91,0x75
+,0xa6,0x71,0x28,0xca,0xe7,0x22,0x12,0x32
+,0x69,0xb0,0x3e,0x1e,0x6b,0xf4,0x50,0x52
+,0x62,0x62,0xfd,0x63,0x3b,0x7d,0x7e,0xec
+,0xee,0x38,0xea,0x62,0xf4,0x6c,0xa8,0x71
+,0x8d,0xe1,0xe9,0x8b,0xc9,0x3f,0xc6,0xb5
+,0xcd,0x94,0x42,0x6f,0xdd,0x82,0x45,0x3c
+,0xe8,0xdf,0x09,0xe8,0xef,0x0a,0x55,0xa9
+,0x56,0x47,0x61,0x4c,0x49,0x64,0x73,0x10
+,0x28,0x3f,0xca,0xbf,0x09,0xff,0xc6,0x2f
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x04
+,0x4a,0x30,0x82,0x04,0x46,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0xeb,0xb3,0x19,0x79,0xf3,0xc1,0xa5,0x1c
+,0xac,0xdc,0xba,0x1f,0x66,0xa2,0xb2,0x9b
+,0x69,0xd0,0x78,0x08,0x30,0x82,0x01,0x44
+,0x06,0x03,0x55,0x1d,0x23,0x04,0x82,0x01
+,0x3b,0x30,0x82,0x01,0x37,0x80,0x14,0xeb
+,0xb3,0x19,0x79,0xf3,0xc1,0xa5,0x1c,0xac
+,0xdc,0xba,0x1f,0x66,0xa2,0xb2,0x9b,0x69
+,0xd0,0x78,0x08,0xa1,0x82,0x01,0x1a,0xa4
+,0x82,0x01,0x16,0x30,0x82,0x01,0x12,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x45,0x53,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x08,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x07,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x2e,0x30,0x2c
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x25,0x49
+,0x50,0x53,0x20,0x49,0x6e,0x74,0x65,0x72
+,0x6e,0x65,0x74,0x20,0x70,0x75,0x62,0x6c
+,0x69,0x73,0x68,0x69,0x6e,0x67,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x20
+,0x73,0x2e,0x6c,0x2e,0x31,0x2b,0x30,0x29
+,0x06,0x03,0x55,0x04,0x0a,0x14,0x22,0x69
+,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x20,0x43
+,0x2e,0x49,0x2e,0x46,0x2e,0x20,0x20,0x42
+,0x2d,0x36,0x30,0x39,0x32,0x39,0x34,0x35
+,0x32,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x25,0x49,0x50,0x53,0x20
+,0x43,0x41,0x20,0x43,0x4c,0x41,0x53,0x45
+,0x31,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55
+,0x04,0x03,0x13,0x25,0x49,0x50,0x53,0x20
+,0x43,0x41,0x20,0x43,0x4c,0x41,0x53,0x45
+,0x31,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x31,0x1e,0x30,0x1c,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x01
+,0x16,0x0f,0x69,0x70,0x73,0x40,0x6d,0x61
+,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e,0x65
+,0x73,0x82,0x01,0x00,0x30,0x0c,0x06,0x03
+,0x55,0x1d,0x13,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x0c,0x06,0x03,0x55,0x1d
+,0x0f,0x04,0x05,0x03,0x03,0x07,0xff,0x80
+,0x30,0x6b,0x06,0x03,0x55,0x1d,0x25,0x04
+,0x64,0x30,0x62,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x03,0x01,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x03,0x02,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03
+,0x03,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x03,0x04,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x03,0x08,0x06,0x0a,0x2b
+,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01
+,0x15,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01
+,0x82,0x37,0x02,0x01,0x16,0x06,0x0a,0x2b
+,0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x03
+,0x01,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01
+,0x82,0x37,0x0a,0x03,0x04,0x30,0x11,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x01,0x04,0x04,0x03,0x02,0x00,0x07
+,0x30,0x1a,0x06,0x03,0x55,0x1d,0x11,0x04
+,0x13,0x30,0x11,0x81,0x0f,0x69,0x70,0x73
+,0x40,0x6d,0x61,0x69,0x6c,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x30,0x1a,0x06,0x03
+,0x55,0x1d,0x12,0x04,0x13,0x30,0x11,0x81
+,0x0f,0x69,0x70,0x73,0x40,0x6d,0x61,0x69
+,0x6c,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x30,0x41,0x06,0x09,0x60,0x86,0x48,0x01
+,0x86,0xf8,0x42,0x01,0x0d,0x04,0x34,0x16
+,0x32,0x43,0x4c,0x41,0x53,0x45,0x31,0x20
+,0x43,0x41,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x69
+,0x73,0x73,0x75,0x65,0x64,0x20,0x62,0x79
+,0x20,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x77,0x77,0x77,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x2f,0x30,0x29,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x02
+,0x04,0x1c,0x16,0x1a,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69
+,0x70,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70
+,0x73,0x32,0x30,0x30,0x32,0x2f,0x30,0x3a
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x04,0x04,0x2d,0x16,0x2b,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x43,0x4c,0x41,0x53,0x45,0x31,0x2e,0x63
+,0x72,0x6c,0x30,0x3f,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x03,0x04
+,0x32,0x16,0x30,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x72,0x65,0x76
+,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x43
+,0x4c,0x41,0x53,0x45,0x31,0x2e,0x68,0x74
+,0x6d,0x6c,0x3f,0x30,0x3c,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x07
+,0x04,0x2f,0x16,0x2d,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69
+,0x70,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70
+,0x73,0x32,0x30,0x30,0x32,0x2f,0x72,0x65
+,0x6e,0x65,0x77,0x61,0x6c,0x43,0x4c,0x41
+,0x53,0x45,0x31,0x2e,0x68,0x74,0x6d,0x6c
+,0x3f,0x30,0x3a,0x06,0x09,0x60,0x86,0x48
+,0x01,0x86,0xf8,0x42,0x01,0x08,0x04,0x2d
+,0x16,0x2b,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70,0x73
+,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73,0x32
+,0x30,0x30,0x32,0x2f,0x70,0x6f,0x6c,0x69
+,0x63,0x79,0x43,0x4c,0x41,0x53,0x45,0x31
+,0x2e,0x68,0x74,0x6d,0x6c,0x30,0x73,0x06
+,0x03,0x55,0x1d,0x1f,0x04,0x6c,0x30,0x6a
+,0x30,0x31,0xa0,0x2f,0xa0,0x2d,0x86,0x2b
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x69,0x70,0x73,0x2e,0x65
+,0x73,0x2f,0x69,0x70,0x73,0x32,0x30,0x30
+,0x32,0x2f,0x69,0x70,0x73,0x32,0x30,0x30
+,0x32,0x43,0x4c,0x41,0x53,0x45,0x31,0x2e
+,0x63,0x72,0x6c,0x30,0x35,0xa0,0x33,0xa0
+,0x31,0x86,0x2f,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x62,0x61,0x63
+,0x6b,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x43,0x4c,0x41,0x53,0x45,0x31,0x2e,0x63
+,0x72,0x6c,0x30,0x2f,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x23
+,0x30,0x21,0x30,0x1f,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x30,0x01,0x86,0x13
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6f
+,0x63,0x73,0x70,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x2f,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x81,0x81,0x00,0x2b,0xd0
+,0xeb,0xfd,0xda,0xc8,0xca,0x59,0x6a,0xda
+,0xd3,0xcc,0x32,0x2e,0xc9,0x54,0x1b,0x8a
+,0x62,0x7e,0x15,0x2d,0xe9,0xd9,0x31,0xd3
+,0x2e,0xf4,0x27,0x23,0xff,0x5b,0xab,0xc5
+,0x4a,0xb6,0x72,0x40,0xae,0x53,0x74,0xf4
+,0xbc,0x05,0xb4,0xc6,0xd9,0xc8,0xc9,0x77
+,0xfb,0xb7,0xf9,0x34,0x7f,0x78,0x00,0xf8
+,0xd6,0xa4,0xe4,0x52,0x3f,0x2c,0x4a,0x63
+,0x57,0x81,0x75,0x5a,0x8e,0xe8,0x8c,0xfb
+,0x02,0xc0,0x94,0xc6,0x29,0xba,0xb3,0xdc
+,0x1c,0xe8,0xb2,0xaf,0xd2,0x2e,0x62,0x5b
+,0x1a,0xa9,0x8e,0x0e,0xcc,0xc5,0x57,0x45
+,0x51,0x14,0xe9,0x4e,0x1c,0x88,0xa5,0x91
+,0xf4,0xa3,0xf7,0x8e,0x51,0xc8,0xa9,0xbe
+,0x86,0x33,0x3e,0xe6,0x2f,0x48,0x6e,0xaf
+,0x54,0x90,0x4e,0xad,0xb1,0x25};
+const unsigned int NptTlsTrustAnchor_Base_0069_Size = 2030;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0070.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0070.cpp
new file mode 100644
index 0000000..e18b9b1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0070.cpp
@@ -0,0 +1,290 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* IPS CLASE3 root */
+const unsigned char NptTlsTrustAnchor_Base_0070_Data[2030] = {
+0x30,0x82,0x07,0xea,0x30,0x82,0x07,0x53
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x82,0x01,0x12,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x2e,0x30
+,0x2c,0x06,0x03,0x55,0x04,0x0b,0x13,0x25
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x33,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68
+,0x6f,0x72,0x69,0x74,0x79,0x31,0x2e,0x30
+,0x2c,0x06,0x03,0x55,0x04,0x03,0x13,0x25
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x33,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68
+,0x6f,0x72,0x69,0x74,0x79,0x31,0x1e,0x30
+,0x1c,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x09,0x01,0x16,0x0f,0x69,0x70
+,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e,0x69
+,0x70,0x73,0x2e,0x65,0x73,0x30,0x1e,0x17
+,0x0d,0x30,0x31,0x31,0x32,0x32,0x39,0x30
+,0x31,0x30,0x31,0x34,0x34,0x5a,0x17,0x0d
+,0x32,0x35,0x31,0x32,0x32,0x37,0x30,0x31
+,0x30,0x31,0x34,0x34,0x5a,0x30,0x82,0x01
+,0x12,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x45,0x53,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x08,0x13
+,0x09,0x42,0x61,0x72,0x63,0x65,0x6c,0x6f
+,0x6e,0x61,0x31,0x12,0x30,0x10,0x06,0x03
+,0x55,0x04,0x07,0x13,0x09,0x42,0x61,0x72
+,0x63,0x65,0x6c,0x6f,0x6e,0x61,0x31,0x2e
+,0x30,0x2c,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x25,0x49,0x50,0x53,0x20,0x49,0x6e,0x74
+,0x65,0x72,0x6e,0x65,0x74,0x20,0x70,0x75
+,0x62,0x6c,0x69,0x73,0x68,0x69,0x6e,0x67
+,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65
+,0x73,0x20,0x73,0x2e,0x6c,0x2e,0x31,0x2b
+,0x30,0x29,0x06,0x03,0x55,0x04,0x0a,0x14
+,0x22,0x69,0x70,0x73,0x40,0x6d,0x61,0x69
+,0x6c,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x20,0x43,0x2e,0x49,0x2e,0x46,0x2e,0x20
+,0x20,0x42,0x2d,0x36,0x30,0x39,0x32,0x39
+,0x34,0x35,0x32,0x31,0x2e,0x30,0x2c,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x25,0x49,0x50
+,0x53,0x20,0x43,0x41,0x20,0x43,0x4c,0x41
+,0x53,0x45,0x33,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x2e,0x30,0x2c,0x06
+,0x03,0x55,0x04,0x03,0x13,0x25,0x49,0x50
+,0x53,0x20,0x43,0x41,0x20,0x43,0x4c,0x41
+,0x53,0x45,0x33,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x1e,0x30,0x1c,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x09,0x01,0x16,0x0f,0x69,0x70,0x73,0x40
+,0x6d,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73
+,0x2e,0x65,0x73,0x30,0x81,0x9f,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d
+,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00
+,0xab,0x17,0xfe,0x0e,0xb0,0xc6,0x68,0x1b
+,0x53,0xf0,0x52,0xbe,0x9f,0xfa,0xda,0xfa
+,0x8b,0x13,0x04,0xbb,0x01,0x8f,0x32,0xd9
+,0x1f,0x8f,0x4d,0xce,0x36,0x98,0xda,0xe4
+,0x00,0x44,0x8c,0x28,0xd8,0x13,0x44,0x2a
+,0xa4,0x6b,0x4e,0x17,0x24,0x42,0x9c,0xd3
+,0x88,0xa4,0x41,0x82,0xd6,0x23,0xfb,0x8b
+,0xc9,0x86,0xe5,0xb9,0xa9,0x82,0x05,0xdc
+,0xf1,0xde,0x1f,0xe0,0x0c,0x99,0x55,0x98
+,0xf2,0x38,0xec,0x6c,0x9d,0x20,0x03,0xc0
+,0xef,0xaa,0xa3,0xc6,0x64,0x04,0x51,0x2d
+,0x78,0x0d,0xa3,0xd2,0xa8,0x3a,0xd6,0x24
+,0x4c,0xe9,0x96,0x7a,0x18,0xac,0x13,0x23
+,0x22,0x1b,0x7c,0xe8,0x31,0x11,0xb3,0x5f
+,0x09,0xaa,0x30,0x70,0x71,0x46,0x25,0x6b
+,0x49,0x71,0x80,0x2b,0x95,0x01,0xb2,0x1f
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x04
+,0x4a,0x30,0x82,0x04,0x46,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0xb8,0x93,0xff,0x2e,0xcb,0xdc,0x2c,0x8e
+,0xa2,0xe7,0x7a,0xfe,0x36,0x51,0x21,0xa3
+,0x98,0x5b,0x0c,0x34,0x30,0x82,0x01,0x44
+,0x06,0x03,0x55,0x1d,0x23,0x04,0x82,0x01
+,0x3b,0x30,0x82,0x01,0x37,0x80,0x14,0xb8
+,0x93,0xff,0x2e,0xcb,0xdc,0x2c,0x8e,0xa2
+,0xe7,0x7a,0xfe,0x36,0x51,0x21,0xa3,0x98
+,0x5b,0x0c,0x34,0xa1,0x82,0x01,0x1a,0xa4
+,0x82,0x01,0x16,0x30,0x82,0x01,0x12,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x45,0x53,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x08,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x07,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x2e,0x30,0x2c
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x25,0x49
+,0x50,0x53,0x20,0x49,0x6e,0x74,0x65,0x72
+,0x6e,0x65,0x74,0x20,0x70,0x75,0x62,0x6c
+,0x69,0x73,0x68,0x69,0x6e,0x67,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x20
+,0x73,0x2e,0x6c,0x2e,0x31,0x2b,0x30,0x29
+,0x06,0x03,0x55,0x04,0x0a,0x14,0x22,0x69
+,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x20,0x43
+,0x2e,0x49,0x2e,0x46,0x2e,0x20,0x20,0x42
+,0x2d,0x36,0x30,0x39,0x32,0x39,0x34,0x35
+,0x32,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x25,0x49,0x50,0x53,0x20
+,0x43,0x41,0x20,0x43,0x4c,0x41,0x53,0x45
+,0x33,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55
+,0x04,0x03,0x13,0x25,0x49,0x50,0x53,0x20
+,0x43,0x41,0x20,0x43,0x4c,0x41,0x53,0x45
+,0x33,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x31,0x1e,0x30,0x1c,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x01
+,0x16,0x0f,0x69,0x70,0x73,0x40,0x6d,0x61
+,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e,0x65
+,0x73,0x82,0x01,0x00,0x30,0x0c,0x06,0x03
+,0x55,0x1d,0x13,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x0c,0x06,0x03,0x55,0x1d
+,0x0f,0x04,0x05,0x03,0x03,0x07,0xff,0x80
+,0x30,0x6b,0x06,0x03,0x55,0x1d,0x25,0x04
+,0x64,0x30,0x62,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x03,0x01,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x03,0x02,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03
+,0x03,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x03,0x04,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x03,0x08,0x06,0x0a,0x2b
+,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01
+,0x15,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01
+,0x82,0x37,0x02,0x01,0x16,0x06,0x0a,0x2b
+,0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x03
+,0x01,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01
+,0x82,0x37,0x0a,0x03,0x04,0x30,0x11,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x01,0x04,0x04,0x03,0x02,0x00,0x07
+,0x30,0x1a,0x06,0x03,0x55,0x1d,0x11,0x04
+,0x13,0x30,0x11,0x81,0x0f,0x69,0x70,0x73
+,0x40,0x6d,0x61,0x69,0x6c,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x30,0x1a,0x06,0x03
+,0x55,0x1d,0x12,0x04,0x13,0x30,0x11,0x81
+,0x0f,0x69,0x70,0x73,0x40,0x6d,0x61,0x69
+,0x6c,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x30,0x41,0x06,0x09,0x60,0x86,0x48,0x01
+,0x86,0xf8,0x42,0x01,0x0d,0x04,0x34,0x16
+,0x32,0x43,0x4c,0x41,0x53,0x45,0x33,0x20
+,0x43,0x41,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x69
+,0x73,0x73,0x75,0x65,0x64,0x20,0x62,0x79
+,0x20,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x77,0x77,0x77,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x2f,0x30,0x29,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x02
+,0x04,0x1c,0x16,0x1a,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69
+,0x70,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70
+,0x73,0x32,0x30,0x30,0x32,0x2f,0x30,0x3a
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x04,0x04,0x2d,0x16,0x2b,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x43,0x4c,0x41,0x53,0x45,0x33,0x2e,0x63
+,0x72,0x6c,0x30,0x3f,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x03,0x04
+,0x32,0x16,0x30,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x72,0x65,0x76
+,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x43
+,0x4c,0x41,0x53,0x45,0x33,0x2e,0x68,0x74
+,0x6d,0x6c,0x3f,0x30,0x3c,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x07
+,0x04,0x2f,0x16,0x2d,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69
+,0x70,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70
+,0x73,0x32,0x30,0x30,0x32,0x2f,0x72,0x65
+,0x6e,0x65,0x77,0x61,0x6c,0x43,0x4c,0x41
+,0x53,0x45,0x33,0x2e,0x68,0x74,0x6d,0x6c
+,0x3f,0x30,0x3a,0x06,0x09,0x60,0x86,0x48
+,0x01,0x86,0xf8,0x42,0x01,0x08,0x04,0x2d
+,0x16,0x2b,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70,0x73
+,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73,0x32
+,0x30,0x30,0x32,0x2f,0x70,0x6f,0x6c,0x69
+,0x63,0x79,0x43,0x4c,0x41,0x53,0x45,0x33
+,0x2e,0x68,0x74,0x6d,0x6c,0x30,0x73,0x06
+,0x03,0x55,0x1d,0x1f,0x04,0x6c,0x30,0x6a
+,0x30,0x31,0xa0,0x2f,0xa0,0x2d,0x86,0x2b
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x69,0x70,0x73,0x2e,0x65
+,0x73,0x2f,0x69,0x70,0x73,0x32,0x30,0x30
+,0x32,0x2f,0x69,0x70,0x73,0x32,0x30,0x30
+,0x32,0x43,0x4c,0x41,0x53,0x45,0x33,0x2e
+,0x63,0x72,0x6c,0x30,0x35,0xa0,0x33,0xa0
+,0x31,0x86,0x2f,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x62,0x61,0x63
+,0x6b,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x43,0x4c,0x41,0x53,0x45,0x33,0x2e,0x63
+,0x72,0x6c,0x30,0x2f,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x23
+,0x30,0x21,0x30,0x1f,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x30,0x01,0x86,0x13
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6f
+,0x63,0x73,0x70,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x2f,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x81,0x81,0x00,0x17,0x65
+,0x5c,0x99,0x95,0x43,0x03,0x27,0xaf,0x26
+,0xe5,0xeb,0xd0,0xb3,0x17,0x23,0xf7,0x43
+,0xaa,0xc7,0xf0,0x7d,0xec,0x0f,0xc6,0xa9
+,0xae,0xae,0x96,0x0f,0x76,0x29,0x1c,0xe2
+,0x06,0x2d,0x7e,0x26,0xc5,0x3c,0xfa,0xa1
+,0xc1,0x81,0xce,0x53,0xb0,0x42,0xd1,0x97
+,0x57,0x1a,0x17,0x7e,0xa4,0x51,0x61,0xc6
+,0xee,0xe9,0x5e,0xef,0x05,0xba,0xeb,0xbd
+,0x0f,0xa7,0x92,0x6f,0xd8,0xa3,0x06,0x68
+,0x29,0x8e,0x79,0xf5,0xff,0xbf,0xf9,0xa7
+,0xaf,0xe4,0xb1,0xce,0xc2,0xd1,0x80,0x42
+,0x27,0x05,0x04,0x34,0xf8,0xc3,0x7f,0x16
+,0x78,0x23,0x0c,0x07,0x24,0xf2,0x46,0x47
+,0xad,0x3b,0x54,0xd0,0xaf,0xd5,0x31,0xb2
+,0xaf,0x7d,0xc8,0xea,0xe9,0xd4,0x56,0xd9
+,0x0e,0x13,0xb2,0xc5,0x45,0x50};
+const unsigned int NptTlsTrustAnchor_Base_0070_Size = 2030;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0071.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0071.cpp
new file mode 100644
index 0000000..a690b73
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0071.cpp
@@ -0,0 +1,292 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* IPS CLASEA1 root */
+const unsigned char NptTlsTrustAnchor_Base_0071_Data[2043] = {
+0x30,0x82,0x07,0xf7,0x30,0x82,0x07,0x60
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x82,0x01,0x14,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x2f,0x30
+,0x2d,0x06,0x03,0x55,0x04,0x0b,0x13,0x26
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x31,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x2f
+,0x30,0x2d,0x06,0x03,0x55,0x04,0x03,0x13
+,0x26,0x49,0x50,0x53,0x20,0x43,0x41,0x20
+,0x43,0x4c,0x41,0x53,0x45,0x41,0x31,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x30
+,0x1e,0x17,0x0d,0x30,0x31,0x31,0x32,0x32
+,0x39,0x30,0x31,0x30,0x35,0x33,0x32,0x5a
+,0x17,0x0d,0x32,0x35,0x31,0x32,0x32,0x37
+,0x30,0x31,0x30,0x35,0x33,0x32,0x5a,0x30
+,0x82,0x01,0x14,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x2f,0x30
+,0x2d,0x06,0x03,0x55,0x04,0x0b,0x13,0x26
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x31,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x2f
+,0x30,0x2d,0x06,0x03,0x55,0x04,0x03,0x13
+,0x26,0x49,0x50,0x53,0x20,0x43,0x41,0x20
+,0x43,0x4c,0x41,0x53,0x45,0x41,0x31,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x30
+,0x81,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x81,0x8d,0x00,0x30,0x81,0x89
+,0x02,0x81,0x81,0x00,0xbb,0x30,0xd7,0xdc
+,0xd0,0x54,0xbd,0x35,0x4e,0x9f,0xc5,0x4c
+,0x82,0xea,0xd1,0x50,0x3c,0x47,0x98,0xfc
+,0x9b,0x69,0x9d,0x77,0xcd,0x6e,0xe0,0x3f
+,0xee,0xeb,0x32,0x5f,0x5f,0x9f,0xd2,0xd0
+,0x79,0xe5,0x95,0x73,0x44,0x21,0x32,0xe0
+,0x0a,0xdb,0x9d,0xd7,0xce,0x8d,0xab,0x52
+,0x8b,0x2b,0x78,0xe0,0x9b,0x5b,0x7d,0xf4
+,0xfd,0x6d,0x09,0xe5,0xae,0xe1,0x6c,0x1d
+,0x07,0x23,0xa0,0x17,0xd1,0xf9,0x7d,0xa8
+,0x46,0x46,0x91,0x22,0xa8,0xb2,0x69,0xc6
+,0xad,0xf7,0xf5,0xf5,0x94,0xa1,0x30,0x94
+,0xbd,0x00,0xcc,0x44,0x7f,0xee,0xc4,0x9e
+,0xc9,0xc1,0xe6,0x8f,0x0a,0x36,0xc1,0xfd
+,0x24,0x3d,0x01,0xa0,0xf5,0x7b,0xe2,0x7c
+,0x78,0x66,0x43,0x8b,0x4f,0x59,0xf2,0x9b
+,0xd9,0xfa,0x49,0xb3,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x82,0x04,0x53,0x30,0x82,0x04
+,0x4f,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0x67,0x26,0x96,0xe7
+,0xa1,0xbf,0xd8,0xb5,0x03,0x9d,0xfe,0x3b
+,0xdc,0xfe,0xf2,0x8a,0xe6,0x15,0xdd,0x30
+,0x30,0x82,0x01,0x46,0x06,0x03,0x55,0x1d
+,0x23,0x04,0x82,0x01,0x3d,0x30,0x82,0x01
+,0x39,0x80,0x14,0x67,0x26,0x96,0xe7,0xa1
+,0xbf,0xd8,0xb5,0x03,0x9d,0xfe,0x3b,0xdc
+,0xfe,0xf2,0x8a,0xe6,0x15,0xdd,0x30,0xa1
+,0x82,0x01,0x1c,0xa4,0x82,0x01,0x18,0x30
+,0x82,0x01,0x14,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x2f,0x30
+,0x2d,0x06,0x03,0x55,0x04,0x0b,0x13,0x26
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x31,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x2f
+,0x30,0x2d,0x06,0x03,0x55,0x04,0x03,0x13
+,0x26,0x49,0x50,0x53,0x20,0x43,0x41,0x20
+,0x43,0x4c,0x41,0x53,0x45,0x41,0x31,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x82
+,0x01,0x00,0x30,0x0c,0x06,0x03,0x55,0x1d
+,0x13,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x0c,0x06,0x03,0x55,0x1d,0x0f,0x04
+,0x05,0x03,0x03,0x07,0xff,0x80,0x30,0x6b
+,0x06,0x03,0x55,0x1d,0x25,0x04,0x64,0x30
+,0x62,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x03,0x01,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x03,0x02,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03
+,0x04,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x03,0x08,0x06,0x0a,0x2b,0x06,0x01
+,0x04,0x01,0x82,0x37,0x02,0x01,0x15,0x06
+,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37
+,0x02,0x01,0x16,0x06,0x0a,0x2b,0x06,0x01
+,0x04,0x01,0x82,0x37,0x0a,0x03,0x01,0x06
+,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37
+,0x0a,0x03,0x04,0x30,0x11,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x01
+,0x04,0x04,0x03,0x02,0x00,0x07,0x30,0x1a
+,0x06,0x03,0x55,0x1d,0x11,0x04,0x13,0x30
+,0x11,0x81,0x0f,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x30,0x1a,0x06,0x03,0x55,0x1d
+,0x12,0x04,0x13,0x30,0x11,0x81,0x0f,0x69
+,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x30,0x42
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x0d,0x04,0x35,0x16,0x33,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x31,0x20,0x43
+,0x41,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x65,0x20,0x69,0x73
+,0x73,0x75,0x65,0x64,0x20,0x62,0x79,0x20
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x69,0x70,0x73,0x2e,0x65
+,0x73,0x2f,0x30,0x29,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x02,0x04
+,0x1c,0x16,0x1a,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x30,0x3b,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x04,0x04,0x2e,0x16,0x2c,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f
+,0x69,0x70,0x73,0x32,0x30,0x30,0x32,0x2f
+,0x69,0x70,0x73,0x32,0x30,0x30,0x32,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x31,0x2e,0x63
+,0x72,0x6c,0x30,0x40,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x03,0x04
+,0x33,0x16,0x31,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x72,0x65,0x76
+,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x31,0x2e,0x68
+,0x74,0x6d,0x6c,0x3f,0x30,0x3d,0x06,0x09
+,0x60,0x86,0x48,0x01,0x86,0xf8,0x42,0x01
+,0x07,0x04,0x30,0x16,0x2e,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f,0x69
+,0x70,0x73,0x32,0x30,0x30,0x32,0x2f,0x72
+,0x65,0x6e,0x65,0x77,0x61,0x6c,0x43,0x4c
+,0x41,0x53,0x45,0x41,0x31,0x2e,0x68,0x74
+,0x6d,0x6c,0x3f,0x30,0x3b,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x08
+,0x04,0x2e,0x16,0x2c,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69
+,0x70,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70
+,0x73,0x32,0x30,0x30,0x32,0x2f,0x70,0x6f
+,0x6c,0x69,0x63,0x79,0x43,0x4c,0x41,0x53
+,0x45,0x41,0x31,0x2e,0x68,0x74,0x6d,0x6c
+,0x30,0x75,0x06,0x03,0x55,0x1d,0x1f,0x04
+,0x6e,0x30,0x6c,0x30,0x32,0xa0,0x30,0xa0
+,0x2e,0x86,0x2c,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x43,0x4c,0x41,0x53
+,0x45,0x41,0x31,0x2e,0x63,0x72,0x6c,0x30
+,0x36,0xa0,0x34,0xa0,0x32,0x86,0x30,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x62,0x61,0x63,0x6b,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x43,0x4c,0x41,0x53
+,0x45,0x41,0x31,0x2e,0x63,0x72,0x6c,0x30
+,0x2f,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x01,0x01,0x04,0x23,0x30,0x21,0x30
+,0x1f,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x30,0x01,0x86,0x13,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x6f,0x63,0x73,0x70
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x81,0x81,0x00,0x7e,0xba,0x8a,0xac,0x80
+,0x00,0x84,0x15,0x0a,0xd5,0x98,0x51,0x0c
+,0x64,0xc5,0x9c,0x02,0x58,0x83,0x66,0xca
+,0xad,0x1e,0x07,0xcd,0x7e,0x6a,0xda,0x80
+,0x07,0xdf,0x03,0x34,0x4a,0x1c,0x93,0xc4
+,0x4b,0x58,0x20,0x35,0x36,0x71,0xed,0xa2
+,0x0a,0x35,0x12,0xa5,0xa6,0x65,0xa7,0x85
+,0x69,0x0a,0x0e,0xe3,0x61,0xee,0xea,0xbe
+,0x28,0x93,0x33,0xd5,0xec,0xe8,0xbe,0xc4
+,0xdb,0x5f,0x7f,0xa8,0xf9,0x63,0x31,0xc8
+,0x6b,0x96,0xe2,0x29,0xc2,0x5b,0xa0,0xe7
+,0x97,0x36,0x9d,0x77,0x5e,0x31,0x6b,0xfe
+,0xd3,0xa7,0xdb,0x2a,0xdb,0xdb,0x96,0x8b
+,0x1f,0x66,0xde,0xb6,0x03,0xc0,0x2b,0xb3
+,0x78,0xd6,0x55,0x07,0xe5,0x8f,0x39,0x50
+,0xde,0x07,0x23,0x72,0xe6,0xbd,0x20,0x14
+,0x4b,0xb4,0x86};
+const unsigned int NptTlsTrustAnchor_Base_0071_Size = 2043;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0072.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0072.cpp
new file mode 100644
index 0000000..2ce3271
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0072.cpp
@@ -0,0 +1,292 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* IPS CLASEA3 root */
+const unsigned char NptTlsTrustAnchor_Base_0072_Data[2043] = {
+0x30,0x82,0x07,0xf7,0x30,0x82,0x07,0x60
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x82,0x01,0x14,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x2f,0x30
+,0x2d,0x06,0x03,0x55,0x04,0x0b,0x13,0x26
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x33,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x2f
+,0x30,0x2d,0x06,0x03,0x55,0x04,0x03,0x13
+,0x26,0x49,0x50,0x53,0x20,0x43,0x41,0x20
+,0x43,0x4c,0x41,0x53,0x45,0x41,0x33,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x30
+,0x1e,0x17,0x0d,0x30,0x31,0x31,0x32,0x32
+,0x39,0x30,0x31,0x30,0x37,0x35,0x30,0x5a
+,0x17,0x0d,0x32,0x35,0x31,0x32,0x32,0x37
+,0x30,0x31,0x30,0x37,0x35,0x30,0x5a,0x30
+,0x82,0x01,0x14,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x2f,0x30
+,0x2d,0x06,0x03,0x55,0x04,0x0b,0x13,0x26
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x33,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x2f
+,0x30,0x2d,0x06,0x03,0x55,0x04,0x03,0x13
+,0x26,0x49,0x50,0x53,0x20,0x43,0x41,0x20
+,0x43,0x4c,0x41,0x53,0x45,0x41,0x33,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x30
+,0x81,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x81,0x8d,0x00,0x30,0x81,0x89
+,0x02,0x81,0x81,0x00,0xee,0x80,0x00,0xf6
+,0x1a,0x64,0x2e,0xad,0x6a,0xc8,0x83,0xb1
+,0x8b,0xa7,0xee,0x8f,0xd9,0xb6,0xdb,0xcd
+,0x1b,0xbb,0x86,0x06,0x22,0x76,0x33,0x0c
+,0x12,0x6d,0x48,0x56,0x61,0xd2,0xdc,0x82
+,0x25,0x62,0x2f,0x9f,0xd2,0x69,0x30,0x65
+,0x03,0x42,0x23,0x58,0xbc,0x47,0xdc,0x6b
+,0xd6,0x75,0x5d,0x17,0x3c,0xe1,0xff,0xf2
+,0x58,0x67,0x79,0xa0,0xc1,0x81,0xb1,0xd4
+,0x56,0xa2,0xf2,0x8d,0x11,0x99,0xfd,0xf6
+,0x7d,0xf1,0xc7,0xc4,0x5e,0x02,0x2a,0x9a
+,0xe2,0x4a,0xb5,0x13,0x8a,0x00,0xfd,0x8c
+,0x77,0x86,0xe6,0xd7,0x94,0xf5,0x20,0x75
+,0x2e,0x0e,0x4c,0xbf,0x74,0xc4,0x3f,0x81
+,0x3e,0x83,0xb4,0xa3,0x38,0x36,0x29,0xe7
+,0xe8,0x2a,0xf5,0x8c,0x88,0x41,0xaa,0x80
+,0xa6,0xe3,0x6c,0xef,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x82,0x04,0x53,0x30,0x82,0x04
+,0x4f,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0x1e,0x9f,0x57,0x50
+,0x47,0xb6,0x61,0x93,0x39,0xd3,0x2c,0xfc
+,0xda,0x5d,0x3d,0x05,0x75,0xb7,0x99,0x02
+,0x30,0x82,0x01,0x46,0x06,0x03,0x55,0x1d
+,0x23,0x04,0x82,0x01,0x3d,0x30,0x82,0x01
+,0x39,0x80,0x14,0x1e,0x9f,0x57,0x50,0x47
+,0xb6,0x61,0x93,0x39,0xd3,0x2c,0xfc,0xda
+,0x5d,0x3d,0x05,0x75,0xb7,0x99,0x02,0xa1
+,0x82,0x01,0x1c,0xa4,0x82,0x01,0x18,0x30
+,0x82,0x01,0x14,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x2f,0x30
+,0x2d,0x06,0x03,0x55,0x04,0x0b,0x13,0x26
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x33,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x2f
+,0x30,0x2d,0x06,0x03,0x55,0x04,0x03,0x13
+,0x26,0x49,0x50,0x53,0x20,0x43,0x41,0x20
+,0x43,0x4c,0x41,0x53,0x45,0x41,0x33,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x82
+,0x01,0x00,0x30,0x0c,0x06,0x03,0x55,0x1d
+,0x13,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x0c,0x06,0x03,0x55,0x1d,0x0f,0x04
+,0x05,0x03,0x03,0x07,0xff,0x80,0x30,0x6b
+,0x06,0x03,0x55,0x1d,0x25,0x04,0x64,0x30
+,0x62,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x03,0x01,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x03,0x02,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03
+,0x04,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x03,0x08,0x06,0x0a,0x2b,0x06,0x01
+,0x04,0x01,0x82,0x37,0x02,0x01,0x15,0x06
+,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37
+,0x02,0x01,0x16,0x06,0x0a,0x2b,0x06,0x01
+,0x04,0x01,0x82,0x37,0x0a,0x03,0x01,0x06
+,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37
+,0x0a,0x03,0x04,0x30,0x11,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x01
+,0x04,0x04,0x03,0x02,0x00,0x07,0x30,0x1a
+,0x06,0x03,0x55,0x1d,0x11,0x04,0x13,0x30
+,0x11,0x81,0x0f,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x30,0x1a,0x06,0x03,0x55,0x1d
+,0x12,0x04,0x13,0x30,0x11,0x81,0x0f,0x69
+,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x30,0x42
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x0d,0x04,0x35,0x16,0x33,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x33,0x20,0x43
+,0x41,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x65,0x20,0x69,0x73
+,0x73,0x75,0x65,0x64,0x20,0x62,0x79,0x20
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x69,0x70,0x73,0x2e,0x65
+,0x73,0x2f,0x30,0x29,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x02,0x04
+,0x1c,0x16,0x1a,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x30,0x3b,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x04,0x04,0x2e,0x16,0x2c,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f
+,0x69,0x70,0x73,0x32,0x30,0x30,0x32,0x2f
+,0x69,0x70,0x73,0x32,0x30,0x30,0x32,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x33,0x2e,0x63
+,0x72,0x6c,0x30,0x40,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x03,0x04
+,0x33,0x16,0x31,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x72,0x65,0x76
+,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x43
+,0x4c,0x41,0x53,0x45,0x41,0x33,0x2e,0x68
+,0x74,0x6d,0x6c,0x3f,0x30,0x3d,0x06,0x09
+,0x60,0x86,0x48,0x01,0x86,0xf8,0x42,0x01
+,0x07,0x04,0x30,0x16,0x2e,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f,0x69
+,0x70,0x73,0x32,0x30,0x30,0x32,0x2f,0x72
+,0x65,0x6e,0x65,0x77,0x61,0x6c,0x43,0x4c
+,0x41,0x53,0x45,0x41,0x33,0x2e,0x68,0x74
+,0x6d,0x6c,0x3f,0x30,0x3b,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x08
+,0x04,0x2e,0x16,0x2c,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69
+,0x70,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70
+,0x73,0x32,0x30,0x30,0x32,0x2f,0x70,0x6f
+,0x6c,0x69,0x63,0x79,0x43,0x4c,0x41,0x53
+,0x45,0x41,0x33,0x2e,0x68,0x74,0x6d,0x6c
+,0x30,0x75,0x06,0x03,0x55,0x1d,0x1f,0x04
+,0x6e,0x30,0x6c,0x30,0x32,0xa0,0x30,0xa0
+,0x2e,0x86,0x2c,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x43,0x4c,0x41,0x53
+,0x45,0x41,0x33,0x2e,0x63,0x72,0x6c,0x30
+,0x36,0xa0,0x34,0xa0,0x32,0x86,0x30,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x62,0x61,0x63,0x6b,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x43,0x4c,0x41,0x53
+,0x45,0x41,0x33,0x2e,0x63,0x72,0x6c,0x30
+,0x2f,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x01,0x01,0x04,0x23,0x30,0x21,0x30
+,0x1f,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x30,0x01,0x86,0x13,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x6f,0x63,0x73,0x70
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x81,0x81,0x00,0x4a,0x3d,0x20,0x47,0x1a
+,0xda,0x89,0xf4,0x7a,0x2b,0x31,0x79,0xec
+,0x01,0xc0,0xcc,0x01,0xf5,0xd6,0xc1,0xfc
+,0xc8,0xc3,0xf3,0x50,0x02,0x51,0x90,0x58
+,0x2a,0x9f,0xe7,0x35,0x09,0x5b,0x30,0x0a
+,0x81,0x00,0x25,0x47,0xaf,0xd4,0x0f,0x0e
+,0x9e,0x60,0x26,0xa8,0x95,0xa7,0x83,0x08
+,0xdf,0x2d,0xac,0xe9,0x0e,0xf7,0x9c,0xc8
+,0x9f,0xcb,0x93,0x45,0xf1,0xba,0x6a,0xc6
+,0x67,0x51,0x4a,0x69,0x4f,0x6b,0xfe,0x7d
+,0x0b,0x2f,0x52,0x29,0xc2,0x50,0xad,0x24
+,0x44,0xed,0x23,0xb3,0x48,0xcb,0x44,0x40
+,0xc1,0x03,0x95,0x0c,0x0a,0x78,0x06,0x12
+,0x01,0xf5,0x91,0x31,0x2d,0x49,0x8d,0xbb
+,0x3f,0x45,0x4e,0x2c,0xe0,0xe8,0xcd,0xb5
+,0xc9,0x14,0x15,0x0c,0xe3,0x07,0x83,0x9b
+,0x26,0x75,0xef};
+const unsigned int NptTlsTrustAnchor_Base_0072_Size = 2043;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0073.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0073.cpp
new file mode 100644
index 0000000..810a6dd
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0073.cpp
@@ -0,0 +1,124 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* IPS Servidores root */
+const unsigned char NptTlsTrustAnchor_Base_0073_Data[699] = {
+0x30,0x82,0x02,0xb7,0x30,0x82,0x02,0x20
+,0x02,0x01,0x00,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x04
+,0x05,0x00,0x30,0x81,0xa3,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x45,0x53,0x31,0x12,0x30,0x10,0x06,0x03
+,0x55,0x04,0x08,0x13,0x09,0x42,0x41,0x52
+,0x43,0x45,0x4c,0x4f,0x4e,0x41,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x07,0x13
+,0x09,0x42,0x41,0x52,0x43,0x45,0x4c,0x4f
+,0x4e,0x41,0x31,0x19,0x30,0x17,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x10,0x49,0x50,0x53
+,0x20,0x53,0x65,0x67,0x75,0x72,0x69,0x64
+,0x61,0x64,0x20,0x43,0x41,0x31,0x18,0x30
+,0x16,0x06,0x03,0x55,0x04,0x0b,0x13,0x0f
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x63,0x69,0x6f,0x6e,0x65,0x73,0x31
+,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x03
+,0x13,0x0e,0x49,0x50,0x53,0x20,0x53,0x45
+,0x52,0x56,0x49,0x44,0x4f,0x52,0x45,0x53
+,0x31,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16
+,0x0f,0x69,0x70,0x73,0x40,0x6d,0x61,0x69
+,0x6c,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x30,0x1e,0x17,0x0d,0x39,0x38,0x30,0x31
+,0x30,0x31,0x32,0x33,0x32,0x31,0x30,0x37
+,0x5a,0x17,0x0d,0x30,0x39,0x31,0x32,0x32
+,0x39,0x32,0x33,0x32,0x31,0x30,0x37,0x5a
+,0x30,0x81,0xa3,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x41,0x52,0x43,0x45
+,0x4c,0x4f,0x4e,0x41,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x41,0x52,0x43,0x45,0x4c,0x4f,0x4e,0x41
+,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x10,0x49,0x50,0x53,0x20,0x53
+,0x65,0x67,0x75,0x72,0x69,0x64,0x61,0x64
+,0x20,0x43,0x41,0x31,0x18,0x30,0x16,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x0f,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x63
+,0x69,0x6f,0x6e,0x65,0x73,0x31,0x17,0x30
+,0x15,0x06,0x03,0x55,0x04,0x03,0x13,0x0e
+,0x49,0x50,0x53,0x20,0x53,0x45,0x52,0x56
+,0x49,0x44,0x4f,0x52,0x45,0x53,0x31,0x1e
+,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f,0x69
+,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x30,0x81
+,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x81,0x8d,0x00,0x30,0x81,0x89,0x02
+,0x81,0x81,0x00,0xac,0x4f,0x52,0x74,0x9f
+,0x39,0xea,0x8e,0xdc,0x25,0xc4,0xbc,0x98
+,0x5d,0x98,0x64,0x24,0x09,0x3c,0x21,0xb3
+,0xcc,0x19,0xb5,0x8e,0x94,0x8e,0x87,0xd1
+,0xf8,0x37,0x3e,0xa1,0xc8,0x2d,0x58,0xa4
+,0x80,0x35,0x5b,0xa1,0x75,0x6c,0x1d,0x45
+,0x0c,0x1f,0x61,0x63,0x6a,0x5e,0x6f,0x9b
+,0x0a,0x4c,0xc1,0xc8,0xb8,0x61,0x23,0x35
+,0x81,0xff,0xfe,0xac,0x78,0x70,0x2d,0x68
+,0xe1,0x3a,0x07,0x98,0x95,0x02,0x54,0xdd
+,0xcd,0x23,0xb7,0x80,0x53,0xd7,0xc8,0x37
+,0x45,0x72,0x06,0x24,0x12,0xba,0x13,0x61
+,0x21,0x8a,0x6e,0x75,0x28,0xe0,0xc5,0x0f
+,0x34,0xfd,0x36,0xd8,0x45,0x7f,0xe1,0xb8
+,0x36,0xef,0xb3,0xe1,0xc6,0x20,0x8e,0xe8
+,0xb4,0x38,0xbc,0xe1,0x3e,0xf6,0x11,0xde
+,0x8c,0x9d,0x01,0x02,0x03,0x01,0x00,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x03
+,0x81,0x81,0x00,0x2c,0xf3,0xc3,0x79,0x58
+,0x24,0xde,0xc6,0x3b,0xd1,0xe0,0x42,0x69
+,0xb8,0xee,0x64,0xb3,0x3d,0x62,0x01,0xb9
+,0xb3,0x84,0xdf,0x23,0x7d,0xdd,0x98,0xcf
+,0x10,0xa9,0xfe,0x00,0xd8,0x22,0x96,0x05
+,0x13,0x07,0x54,0x57,0xc5,0xa7,0xde,0xcb
+,0xd9,0xb8,0x88,0x42,0xf6,0x99,0xdb,0x14
+,0x77,0x1f,0xb6,0xfe,0x25,0x3d,0xe1,0xa2
+,0x3e,0x03,0xa9,0x81,0xd2,0x2d,0x6c,0x47
+,0xf5,0x96,0x46,0x8c,0x22,0xab,0xc8,0xcc
+,0x0d,0x0e,0x97,0x5e,0x8b,0x41,0xb4,0x3b
+,0xc4,0x0a,0x06,0x40,0x1d,0xdd,0x46,0xf4
+,0x01,0xdd,0xba,0x82,0x2e,0x3c,0x3d,0x78
+,0x70,0x9e,0x7c,0x18,0xd0,0xab,0xf8,0xb8
+,0x77,0x07,0x46,0x71,0xf1,0xca,0x0b,0x63
+,0x5c,0x6a,0xf9,0x72,0x94,0xd5,0x01,0x4f
+,0xa0,0xdb,0x42};
+const unsigned int NptTlsTrustAnchor_Base_0073_Size = 699;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0074.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0074.cpp
new file mode 100644
index 0000000..34590fa
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0074.cpp
@@ -0,0 +1,300 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* IPS Timestamping root */
+const unsigned char NptTlsTrustAnchor_Base_0074_Data[2108] = {
+0x30,0x82,0x08,0x38,0x30,0x82,0x07,0xa1
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x82,0x01,0x1e,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x45,0x53
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x08,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x25,0x49,0x50,0x53,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x69
+,0x6e,0x67,0x20,0x53,0x65,0x72,0x76,0x69
+,0x63,0x65,0x73,0x20,0x73,0x2e,0x6c,0x2e
+,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04
+,0x0a,0x14,0x22,0x69,0x70,0x73,0x40,0x6d
+,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x20,0x43,0x2e,0x49,0x2e,0x46
+,0x2e,0x20,0x20,0x42,0x2d,0x36,0x30,0x39
+,0x32,0x39,0x34,0x35,0x32,0x31,0x34,0x30
+,0x32,0x06,0x03,0x55,0x04,0x0b,0x13,0x2b
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x54
+,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70
+,0x69,0x6e,0x67,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x34,0x30,0x32,0x06
+,0x03,0x55,0x04,0x03,0x13,0x2b,0x49,0x50
+,0x53,0x20,0x43,0x41,0x20,0x54,0x69,0x6d
+,0x65,0x73,0x74,0x61,0x6d,0x70,0x69,0x6e
+,0x67,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x31,0x1e,0x30,0x1c,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x01
+,0x16,0x0f,0x69,0x70,0x73,0x40,0x6d,0x61
+,0x69,0x6c,0x2e,0x69,0x70,0x73,0x2e,0x65
+,0x73,0x30,0x1e,0x17,0x0d,0x30,0x31,0x31
+,0x32,0x32,0x39,0x30,0x31,0x31,0x30,0x31
+,0x38,0x5a,0x17,0x0d,0x32,0x35,0x31,0x32
+,0x32,0x37,0x30,0x31,0x31,0x30,0x31,0x38
+,0x5a,0x30,0x82,0x01,0x1e,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x45,0x53,0x31,0x12,0x30,0x10,0x06,0x03
+,0x55,0x04,0x08,0x13,0x09,0x42,0x61,0x72
+,0x63,0x65,0x6c,0x6f,0x6e,0x61,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x07,0x13
+,0x09,0x42,0x61,0x72,0x63,0x65,0x6c,0x6f
+,0x6e,0x61,0x31,0x2e,0x30,0x2c,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x25,0x49,0x50,0x53
+,0x20,0x49,0x6e,0x74,0x65,0x72,0x6e,0x65
+,0x74,0x20,0x70,0x75,0x62,0x6c,0x69,0x73
+,0x68,0x69,0x6e,0x67,0x20,0x53,0x65,0x72
+,0x76,0x69,0x63,0x65,0x73,0x20,0x73,0x2e
+,0x6c,0x2e,0x31,0x2b,0x30,0x29,0x06,0x03
+,0x55,0x04,0x0a,0x14,0x22,0x69,0x70,0x73
+,0x40,0x6d,0x61,0x69,0x6c,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x20,0x43,0x2e,0x49
+,0x2e,0x46,0x2e,0x20,0x20,0x42,0x2d,0x36
+,0x30,0x39,0x32,0x39,0x34,0x35,0x32,0x31
+,0x34,0x30,0x32,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x2b,0x49,0x50,0x53,0x20,0x43,0x41
+,0x20,0x54,0x69,0x6d,0x65,0x73,0x74,0x61
+,0x6d,0x70,0x69,0x6e,0x67,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68
+,0x6f,0x72,0x69,0x74,0x79,0x31,0x34,0x30
+,0x32,0x06,0x03,0x55,0x04,0x03,0x13,0x2b
+,0x49,0x50,0x53,0x20,0x43,0x41,0x20,0x54
+,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70
+,0x69,0x6e,0x67,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x1e,0x30,0x1c,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x09,0x01,0x16,0x0f,0x69,0x70,0x73,0x40
+,0x6d,0x61,0x69,0x6c,0x2e,0x69,0x70,0x73
+,0x2e,0x65,0x73,0x30,0x81,0x9f,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d
+,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00
+,0xbc,0xb8,0xee,0x56,0xa5,0x9a,0x8c,0xe6
+,0x36,0xc9,0xc2,0x62,0xa0,0x66,0x81,0x8d
+,0x1a,0xd5,0x7a,0xd2,0x73,0x9f,0x0e,0x84
+,0x64,0xba,0x95,0xb4,0x90,0xa7,0x78,0xaf
+,0xca,0xfe,0x54,0x61,0x5b,0xce,0xb2,0x20
+,0x57,0x01,0xae,0x44,0x92,0x43,0x10,0x38
+,0x11,0xf7,0x68,0xfc,0x17,0x40,0xa5,0x68
+,0x27,0x32,0x3b,0xc4,0xa7,0xe6,0x42,0x71
+,0xc5,0x99,0xef,0x76,0xff,0x2b,0x95,0x24
+,0xf5,0x49,0x92,0x18,0x68,0xca,0x00,0xb5
+,0xa4,0x5a,0x2f,0x6e,0xcb,0xd6,0x1b,0x2c
+,0x0d,0x54,0x67,0x6b,0x7a,0x29,0xa1,0x58
+,0xab,0xa2,0x5a,0x00,0xd6,0x5b,0xbb,0x18
+,0xc2,0xdf,0xf6,0x1e,0x13,0x56,0x76,0x9b
+,0xa5,0x68,0xe2,0x98,0xce,0xc6,0x03,0x8a
+,0x34,0xdb,0x4c,0x83,0x41,0xa6,0xa9,0xa3
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x04
+,0x80,0x30,0x82,0x04,0x7c,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0x8b,0xd0,0x10,0x50,0x09,0x81,0xf2,0x9d
+,0x09,0xd5,0x0e,0x60,0x78,0x03,0x22,0xa2
+,0x3f,0xc8,0xca,0x66,0x30,0x82,0x01,0x50
+,0x06,0x03,0x55,0x1d,0x23,0x04,0x82,0x01
+,0x47,0x30,0x82,0x01,0x43,0x80,0x14,0x8b
+,0xd0,0x10,0x50,0x09,0x81,0xf2,0x9d,0x09
+,0xd5,0x0e,0x60,0x78,0x03,0x22,0xa2,0x3f
+,0xc8,0xca,0x66,0xa1,0x82,0x01,0x26,0xa4
+,0x82,0x01,0x22,0x30,0x82,0x01,0x1e,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x45,0x53,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x08,0x13,0x09,0x42
+,0x61,0x72,0x63,0x65,0x6c,0x6f,0x6e,0x61
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x07,0x13,0x09,0x42,0x61,0x72,0x63,0x65
+,0x6c,0x6f,0x6e,0x61,0x31,0x2e,0x30,0x2c
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x25,0x49
+,0x50,0x53,0x20,0x49,0x6e,0x74,0x65,0x72
+,0x6e,0x65,0x74,0x20,0x70,0x75,0x62,0x6c
+,0x69,0x73,0x68,0x69,0x6e,0x67,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x20
+,0x73,0x2e,0x6c,0x2e,0x31,0x2b,0x30,0x29
+,0x06,0x03,0x55,0x04,0x0a,0x14,0x22,0x69
+,0x70,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e
+,0x69,0x70,0x73,0x2e,0x65,0x73,0x20,0x43
+,0x2e,0x49,0x2e,0x46,0x2e,0x20,0x20,0x42
+,0x2d,0x36,0x30,0x39,0x32,0x39,0x34,0x35
+,0x32,0x31,0x34,0x30,0x32,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x2b,0x49,0x50,0x53,0x20
+,0x43,0x41,0x20,0x54,0x69,0x6d,0x65,0x73
+,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x34,0x30,0x32,0x06,0x03,0x55,0x04,0x03
+,0x13,0x2b,0x49,0x50,0x53,0x20,0x43,0x41
+,0x20,0x54,0x69,0x6d,0x65,0x73,0x74,0x61
+,0x6d,0x70,0x69,0x6e,0x67,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68
+,0x6f,0x72,0x69,0x74,0x79,0x31,0x1e,0x30
+,0x1c,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x09,0x01,0x16,0x0f,0x69,0x70
+,0x73,0x40,0x6d,0x61,0x69,0x6c,0x2e,0x69
+,0x70,0x73,0x2e,0x65,0x73,0x82,0x01,0x00
+,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x0c
+,0x06,0x03,0x55,0x1d,0x0f,0x04,0x05,0x03
+,0x03,0x07,0xff,0x80,0x30,0x6b,0x06,0x03
+,0x55,0x1d,0x25,0x04,0x64,0x30,0x62,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03
+,0x01,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x03,0x02,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x03,0x03,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x03,0x04,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03
+,0x08,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01
+,0x82,0x37,0x02,0x01,0x15,0x06,0x0a,0x2b
+,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01
+,0x16,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01
+,0x82,0x37,0x0a,0x03,0x01,0x06,0x0a,0x2b
+,0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x03
+,0x04,0x30,0x11,0x06,0x09,0x60,0x86,0x48
+,0x01,0x86,0xf8,0x42,0x01,0x01,0x04,0x04
+,0x03,0x02,0x00,0x07,0x30,0x1a,0x06,0x03
+,0x55,0x1d,0x11,0x04,0x13,0x30,0x11,0x81
+,0x0f,0x69,0x70,0x73,0x40,0x6d,0x61,0x69
+,0x6c,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x30,0x1a,0x06,0x03,0x55,0x1d,0x12,0x04
+,0x13,0x30,0x11,0x81,0x0f,0x69,0x70,0x73
+,0x40,0x6d,0x61,0x69,0x6c,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x30,0x47,0x06,0x09
+,0x60,0x86,0x48,0x01,0x86,0xf8,0x42,0x01
+,0x0d,0x04,0x3a,0x16,0x38,0x54,0x69,0x6d
+,0x65,0x73,0x74,0x61,0x6d,0x70,0x69,0x6e
+,0x67,0x20,0x43,0x41,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x20,0x69,0x73,0x73,0x75,0x65,0x64,0x20
+,0x62,0x79,0x20,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x30,0x29,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x02,0x04,0x1c,0x16,0x1a,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f
+,0x69,0x70,0x73,0x32,0x30,0x30,0x32,0x2f
+,0x30,0x40,0x06,0x09,0x60,0x86,0x48,0x01
+,0x86,0xf8,0x42,0x01,0x04,0x04,0x33,0x16
+,0x31,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x77,0x77,0x77,0x2e,0x69,0x70,0x73,0x2e
+,0x65,0x73,0x2f,0x69,0x70,0x73,0x32,0x30
+,0x30,0x32,0x2f,0x69,0x70,0x73,0x32,0x30
+,0x30,0x32,0x54,0x69,0x6d,0x65,0x73,0x74
+,0x61,0x6d,0x70,0x69,0x6e,0x67,0x2e,0x63
+,0x72,0x6c,0x30,0x45,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x03,0x04
+,0x38,0x16,0x36,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70
+,0x73,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73
+,0x32,0x30,0x30,0x32,0x2f,0x72,0x65,0x76
+,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x54
+,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70
+,0x69,0x6e,0x67,0x2e,0x68,0x74,0x6d,0x6c
+,0x3f,0x30,0x42,0x06,0x09,0x60,0x86,0x48
+,0x01,0x86,0xf8,0x42,0x01,0x07,0x04,0x35
+,0x16,0x33,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70,0x73
+,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73,0x32
+,0x30,0x30,0x32,0x2f,0x72,0x65,0x6e,0x65
+,0x77,0x61,0x6c,0x54,0x69,0x6d,0x65,0x73
+,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x2e
+,0x68,0x74,0x6d,0x6c,0x3f,0x30,0x40,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x08,0x04,0x33,0x16,0x31,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73,0x2f
+,0x69,0x70,0x73,0x32,0x30,0x30,0x32,0x2f
+,0x70,0x6f,0x6c,0x69,0x63,0x79,0x54,0x69
+,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x69
+,0x6e,0x67,0x2e,0x68,0x74,0x6d,0x6c,0x30
+,0x7f,0x06,0x03,0x55,0x1d,0x1f,0x04,0x78
+,0x30,0x76,0x30,0x37,0xa0,0x35,0xa0,0x33
+,0x86,0x31,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x69,0x70,0x73
+,0x2e,0x65,0x73,0x2f,0x69,0x70,0x73,0x32
+,0x30,0x30,0x32,0x2f,0x69,0x70,0x73,0x32
+,0x30,0x30,0x32,0x54,0x69,0x6d,0x65,0x73
+,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x2e
+,0x63,0x72,0x6c,0x30,0x3b,0xa0,0x39,0xa0
+,0x37,0x86,0x35,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x62,0x61,0x63
+,0x6b,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x2f,0x69,0x70,0x73,0x32,0x30,0x30,0x32
+,0x54,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d
+,0x70,0x69,0x6e,0x67,0x2e,0x63,0x72,0x6c
+,0x30,0x2f,0x06,0x08,0x2b,0x06,0x01,0x05
+,0x05,0x07,0x01,0x01,0x04,0x23,0x30,0x21
+,0x30,0x1f,0x06,0x08,0x2b,0x06,0x01,0x05
+,0x05,0x07,0x30,0x01,0x86,0x13,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x6f,0x63,0x73
+,0x70,0x2e,0x69,0x70,0x73,0x2e,0x65,0x73
+,0x2f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x81,0x81,0x00,0x65,0xba,0xc1,0xcc
+,0x00,0x1a,0x95,0x91,0xca,0xe9,0x6c,0x3a
+,0xbf,0x3a,0x1e,0x14,0x08,0x7c,0xfb,0x83
+,0xee,0x6b,0x62,0x51,0xd3,0x33,0x91,0xb5
+,0x60,0x79,0x7e,0x04,0xd8,0x5d,0x79,0x37
+,0xe8,0xc3,0x5b,0xb0,0xc4,0x67,0x2d,0x68
+,0x5a,0xb2,0x5f,0x0e,0x0a,0xfa,0xcd,0x3f
+,0x3a,0x45,0xa1,0xea,0x36,0xcf,0x26,0x1e
+,0xa7,0x11,0x28,0xc5,0x94,0x8f,0x84,0x4c
+,0x53,0x08,0xc5,0x93,0xb3,0xfc,0xe2,0x7f
+,0xf5,0x8d,0xf3,0xb1,0xa9,0x85,0x5f,0x88
+,0xde,0x91,0x96,0xee,0x17,0x5b,0xae,0xa5
+,0xea,0x70,0x65,0x78,0x2c,0x21,0x64,0x01
+,0x95,0xce,0xce,0x4c,0x3e,0x50,0xf4,0xb6
+,0x59,0xcb,0x63,0x8d,0xb6,0xbd,0x18,0xd4
+,0x87,0x4a,0x5f,0xdc,0xef,0xe9,0x56,0xf0
+,0x0a,0x0c,0xe8,0x75};
+const unsigned int NptTlsTrustAnchor_Base_0074_Size = 2108;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0075.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0075.cpp
new file mode 100644
index 0000000..47c95f1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0075.cpp
@@ -0,0 +1,223 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* QuoVadis Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0075_Data[1492] = {
+0x30,0x82,0x05,0xd0,0x30,0x82,0x04,0xb8
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x3a
+,0xb6,0x50,0x8b,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x7f,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x42
+,0x4d,0x31,0x19,0x30,0x17,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x10,0x51,0x75,0x6f,0x56
+,0x61,0x64,0x69,0x73,0x20,0x4c,0x69,0x6d
+,0x69,0x74,0x65,0x64,0x31,0x25,0x30,0x23
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x2e,0x30,0x2c,0x06
+,0x03,0x55,0x04,0x03,0x13,0x25,0x51,0x75
+,0x6f,0x56,0x61,0x64,0x69,0x73,0x20,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x30,0x1e,0x17,0x0d,0x30
+,0x31,0x30,0x33,0x31,0x39,0x31,0x38,0x33
+,0x33,0x33,0x33,0x5a,0x17,0x0d,0x32,0x31
+,0x30,0x33,0x31,0x37,0x31,0x38,0x33,0x33
+,0x33,0x33,0x5a,0x30,0x7f,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x42,0x4d,0x31,0x19,0x30,0x17,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x10,0x51,0x75,0x6f
+,0x56,0x61,0x64,0x69,0x73,0x20,0x4c,0x69
+,0x6d,0x69,0x74,0x65,0x64,0x31,0x25,0x30
+,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c
+,0x52,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x31,0x2e,0x30,0x2c
+,0x06,0x03,0x55,0x04,0x03,0x13,0x25,0x51
+,0x75,0x6f,0x56,0x61,0x64,0x69,0x73,0x20
+,0x52,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xbf,0x61,0xb5
+,0x95,0x53,0xba,0x57,0xfc,0xfa,0xf2,0x67
+,0x0b,0x3a,0x1a,0xdf,0x11,0x80,0x64,0x95
+,0xb4,0xd1,0xbc,0xcd,0x7a,0xcf,0xf6,0x29
+,0x96,0x2e,0x24,0x54,0x40,0x24,0x38,0xf7
+,0x1a,0x85,0xdc,0x58,0x4c,0xcb,0xa4,0x27
+,0x42,0x97,0xd0,0x9f,0x83,0x8a,0xc3,0xe4
+,0x06,0x03,0x5b,0x00,0xa5,0x51,0x1e,0x70
+,0x04,0x74,0xe2,0xc1,0xd4,0x3a,0xab,0xd7
+,0xad,0x3b,0x07,0x18,0x05,0x8e,0xfd,0x83
+,0xac,0xea,0x66,0xd9,0x18,0x1b,0x68,0x8a
+,0xf5,0x57,0x1a,0x98,0xba,0xf5,0xed,0x76
+,0x3d,0x7c,0xd9,0xde,0x94,0x6a,0x3b,0x4b
+,0x17,0xc1,0xd5,0x8f,0xbd,0x65,0x38,0x3a
+,0x95,0xd0,0x3d,0x55,0x36,0x4e,0xdf,0x79
+,0x57,0x31,0x2a,0x1e,0xd8,0x59,0x65,0x49
+,0x58,0x20,0x98,0x7e,0xab,0x5f,0x7e,0x9f
+,0xe9,0xd6,0x4d,0xec,0x83,0x74,0xa9,0xc7
+,0x6c,0xd8,0xee,0x29,0x4a,0x85,0x2a,0x06
+,0x14,0xf9,0x54,0xe6,0xd3,0xda,0x65,0x07
+,0x8b,0x63,0x37,0x12,0xd7,0xd0,0xec,0xc3
+,0x7b,0x20,0x41,0x44,0xa3,0xed,0xcb,0xa0
+,0x17,0xe1,0x71,0x65,0xce,0x1d,0x66,0x31
+,0xf7,0x76,0x01,0x19,0xc8,0x7d,0x03,0x58
+,0xb6,0x95,0x49,0x1d,0xa6,0x12,0x26,0xe8
+,0xc6,0x0c,0x76,0xe0,0xe3,0x66,0xcb,0xea
+,0x5d,0xa6,0x26,0xee,0xe5,0xcc,0x5f,0xbd
+,0x67,0xa7,0x01,0x27,0x0e,0xa2,0xca,0x54
+,0xc5,0xb1,0x7a,0x95,0x1d,0x71,0x1e,0x4a
+,0x29,0x8a,0x03,0xdc,0x6a,0x45,0xc1,0xa4
+,0x19,0x5e,0x6f,0x36,0xcd,0xc3,0xa2,0xb0
+,0xb7,0xfe,0x5c,0x38,0xe2,0x52,0xbc,0xf8
+,0x44,0x43,0xe6,0x90,0xbb,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x82,0x02,0x52,0x30,0x82
+,0x02,0x4e,0x30,0x3d,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x31
+,0x30,0x2f,0x30,0x2d,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x30,0x01,0x86,0x21
+,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f
+,0x6f,0x63,0x73,0x70,0x2e,0x71,0x75,0x6f
+,0x76,0x61,0x64,0x69,0x73,0x6f,0x66,0x66
+,0x73,0x68,0x6f,0x72,0x65,0x2e,0x63,0x6f
+,0x6d,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x82,0x01,0x1a,0x06,0x03
+,0x55,0x1d,0x20,0x04,0x82,0x01,0x11,0x30
+,0x82,0x01,0x0d,0x30,0x82,0x01,0x09,0x06
+,0x09,0x2b,0x06,0x01,0x04,0x01,0xbe,0x58
+,0x00,0x01,0x30,0x81,0xfb,0x30,0x81,0xd4
+,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07
+,0x02,0x02,0x30,0x81,0xc7,0x1a,0x81,0xc4
+,0x52,0x65,0x6c,0x69,0x61,0x6e,0x63,0x65
+,0x20,0x6f,0x6e,0x20,0x74,0x68,0x65,0x20
+,0x51,0x75,0x6f,0x56,0x61,0x64,0x69,0x73
+,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x65,0x20,0x62,0x79,0x20,0x61,0x6e,0x79
+,0x20,0x70,0x61,0x72,0x74,0x79,0x20,0x61
+,0x73,0x73,0x75,0x6d,0x65,0x73,0x20,0x61
+,0x63,0x63,0x65,0x70,0x74,0x61,0x6e,0x63
+,0x65,0x20,0x6f,0x66,0x20,0x74,0x68,0x65
+,0x20,0x74,0x68,0x65,0x6e,0x20,0x61,0x70
+,0x70,0x6c,0x69,0x63,0x61,0x62,0x6c,0x65
+,0x20,0x73,0x74,0x61,0x6e,0x64,0x61,0x72
+,0x64,0x20,0x74,0x65,0x72,0x6d,0x73,0x20
+,0x61,0x6e,0x64,0x20,0x63,0x6f,0x6e,0x64
+,0x69,0x74,0x69,0x6f,0x6e,0x73,0x20,0x6f
+,0x66,0x20,0x75,0x73,0x65,0x2c,0x20,0x63
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x70,0x72,0x61
+,0x63,0x74,0x69,0x63,0x65,0x73,0x2c,0x20
+,0x61,0x6e,0x64,0x20,0x74,0x68,0x65,0x20
+,0x51,0x75,0x6f,0x56,0x61,0x64,0x69,0x73
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x65,0x20,0x50,0x6f,0x6c
+,0x69,0x63,0x79,0x2e,0x30,0x22,0x06,0x08
+,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01
+,0x16,0x16,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x71,0x75,0x6f
+,0x76,0x61,0x64,0x69,0x73,0x2e,0x62,0x6d
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0x8b,0x4b,0x6d,0xed,0xd3
+,0x29,0xb9,0x06,0x19,0xec,0x39,0x39,0xa9
+,0xf0,0x97,0x84,0x6a,0xcb,0xef,0xdf,0x30
+,0x81,0xae,0x06,0x03,0x55,0x1d,0x23,0x04
+,0x81,0xa6,0x30,0x81,0xa3,0x80,0x14,0x8b
+,0x4b,0x6d,0xed,0xd3,0x29,0xb9,0x06,0x19
+,0xec,0x39,0x39,0xa9,0xf0,0x97,0x84,0x6a
+,0xcb,0xef,0xdf,0xa1,0x81,0x84,0xa4,0x81
+,0x81,0x30,0x7f,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x42,0x4d
+,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x10,0x51,0x75,0x6f,0x56,0x61
+,0x64,0x69,0x73,0x20,0x4c,0x69,0x6d,0x69
+,0x74,0x65,0x64,0x31,0x25,0x30,0x23,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x1c,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x31,0x2e,0x30,0x2c,0x06,0x03
+,0x55,0x04,0x03,0x13,0x25,0x51,0x75,0x6f
+,0x56,0x61,0x64,0x69,0x73,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x82,0x04,0x3a,0xb6,0x50,0x8b
+,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01
+,0x01,0xff,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x8a,0xd4,0x14,0xb5
+,0xfe,0xf4,0x9a,0x92,0xa7,0x19,0xd4,0xa4
+,0x7e,0x72,0x18,0x8f,0xd9,0x68,0x7c,0x52
+,0x24,0xdd,0x67,0x6f,0x39,0x7a,0xc4,0xaa
+,0x5e,0x3d,0xe2,0x58,0xb0,0x4d,0x70,0x98
+,0x84,0x61,0xe8,0x1b,0xe3,0x69,0x18,0x0e
+,0xce,0xfb,0x47,0x50,0xa0,0x4e,0xff,0xf0
+,0x24,0x1f,0xbd,0xb2,0xce,0xf5,0x27,0xfc
+,0xec,0x2f,0x53,0xaa,0x73,0x7b,0x03,0x3d
+,0x74,0x6e,0xe6,0x16,0x9e,0xeb,0xa5,0x2e
+,0xc4,0xbf,0x56,0x27,0x50,0x2b,0x62,0xba
+,0xbe,0x4b,0x1c,0x3c,0x55,0x5c,0x41,0x1d
+,0x24,0xbe,0x82,0x20,0x47,0x5d,0xd5,0x44
+,0x7e,0x7a,0x16,0x68,0xdf,0x7d,0x4d,0x51
+,0x70,0x78,0x57,0x1d,0x33,0x1e,0xfd,0x02
+,0x99,0x9c,0x0c,0xcd,0x0a,0x05,0x4f,0xc7
+,0xbb,0x8e,0xa4,0x75,0xfa,0x4a,0x6d,0xb1
+,0x80,0x8e,0x09,0x56,0xb9,0x9c,0x1a,0x60
+,0xfe,0x5d,0xc1,0xd7,0x7a,0xdc,0x11,0x78
+,0xd0,0xd6,0x5d,0xc1,0xb7,0xd5,0xad,0x32
+,0x99,0x03,0x3a,0x8a,0xcc,0x54,0x25,0x39
+,0x31,0x81,0x7b,0x13,0x22,0x51,0xba,0x46
+,0x6c,0xa1,0xbb,0x9e,0xfa,0x04,0x6c,0x49
+,0x26,0x74,0x8f,0xd2,0x73,0xeb,0xcc,0x30
+,0xa2,0xe6,0xea,0x59,0x22,0x87,0xf8,0x97
+,0xf5,0x0e,0xfd,0xea,0xcc,0x92,0xa4,0x16
+,0xc4,0x52,0x18,0xea,0x21,0xce,0xb1,0xf1
+,0xe6,0x84,0x81,0xe5,0xba,0xa9,0x86,0x28
+,0xf2,0x43,0x5a,0x5d,0x12,0x9d,0xac,0x1e
+,0xd9,0xa8,0xe5,0x0a,0x6a,0xa7,0x7f,0xa0
+,0x87,0x29,0xcf,0xf2,0x89,0x4d,0xd4,0xec
+,0xc5,0xe2,0xe6,0x7a,0xd0,0x36,0x23,0x8a
+,0x4a,0x74,0x36,0xf9};
+const unsigned int NptTlsTrustAnchor_Base_0075_Size = 1492;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0076.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0076.cpp
new file mode 100644
index 0000000..df07cf6
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0076.cpp
@@ -0,0 +1,220 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* QuoVadis Root CA 2 */
+const unsigned char NptTlsTrustAnchor_Base_0076_Data[1467] = {
+0x30,0x82,0x05,0xb7,0x30,0x82,0x03,0x9f
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x02,0x05
+,0x09,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x30,0x45,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x42,0x4d,0x31
+,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x10,0x51,0x75,0x6f,0x56,0x61,0x64
+,0x69,0x73,0x20,0x4c,0x69,0x6d,0x69,0x74
+,0x65,0x64,0x31,0x1b,0x30,0x19,0x06,0x03
+,0x55,0x04,0x03,0x13,0x12,0x51,0x75,0x6f
+,0x56,0x61,0x64,0x69,0x73,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x20,0x32,0x30
+,0x1e,0x17,0x0d,0x30,0x36,0x31,0x31,0x32
+,0x34,0x31,0x38,0x32,0x37,0x30,0x30,0x5a
+,0x17,0x0d,0x33,0x31,0x31,0x31,0x32,0x34
+,0x31,0x38,0x32,0x33,0x33,0x33,0x5a,0x30
+,0x45,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x42,0x4d,0x31,0x19
+,0x30,0x17,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x10,0x51,0x75,0x6f,0x56,0x61,0x64,0x69
+,0x73,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x1b,0x30,0x19,0x06,0x03,0x55
+,0x04,0x03,0x13,0x12,0x51,0x75,0x6f,0x56
+,0x61,0x64,0x69,0x73,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x20,0x32,0x30,0x82
+,0x02,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x02,0x0f,0x00,0x30,0x82
+,0x02,0x0a,0x02,0x82,0x02,0x01,0x00,0x9a
+,0x18,0xca,0x4b,0x94,0x0d,0x00,0x2d,0xaf
+,0x03,0x29,0x8a,0xf0,0x0f,0x81,0xc8,0xae
+,0x4c,0x19,0x85,0x1d,0x08,0x9f,0xab,0x29
+,0x44,0x85,0xf3,0x2f,0x81,0xad,0x32,0x1e
+,0x90,0x46,0xbf,0xa3,0x86,0x26,0x1a,0x1e
+,0xfe,0x7e,0x1c,0x18,0x3a,0x5c,0x9c,0x60
+,0x17,0x2a,0x3a,0x74,0x83,0x33,0x30,0x7d
+,0x61,0x54,0x11,0xcb,0xed,0xab,0xe0,0xe6
+,0xd2,0xa2,0x7e,0xf5,0x6b,0x6f,0x18,0xb7
+,0x0a,0x0b,0x2d,0xfd,0xe9,0x3e,0xef,0x0a
+,0xc6,0xb3,0x10,0xe9,0xdc,0xc2,0x46,0x17
+,0xf8,0x5d,0xfd,0xa4,0xda,0xff,0x9e,0x49
+,0x5a,0x9c,0xe6,0x33,0xe6,0x24,0x96,0xf7
+,0x3f,0xba,0x5b,0x2b,0x1c,0x7a,0x35,0xc2
+,0xd6,0x67,0xfe,0xab,0x66,0x50,0x8b,0x6d
+,0x28,0x60,0x2b,0xef,0xd7,0x60,0xc3,0xc7
+,0x93,0xbc,0x8d,0x36,0x91,0xf3,0x7f,0xf8
+,0xdb,0x11,0x13,0xc4,0x9c,0x77,0x76,0xc1
+,0xae,0xb7,0x02,0x6a,0x81,0x7a,0xa9,0x45
+,0x83,0xe2,0x05,0xe6,0xb9,0x56,0xc1,0x94
+,0x37,0x8f,0x48,0x71,0x63,0x22,0xec,0x17
+,0x65,0x07,0x95,0x8a,0x4b,0xdf,0x8f,0xc6
+,0x5a,0x0a,0xe5,0xb0,0xe3,0x5f,0x5e,0x6b
+,0x11,0xab,0x0c,0xf9,0x85,0xeb,0x44,0xe9
+,0xf8,0x04,0x73,0xf2,0xe9,0xfe,0x5c,0x98
+,0x8c,0xf5,0x73,0xaf,0x6b,0xb4,0x7e,0xcd
+,0xd4,0x5c,0x02,0x2b,0x4c,0x39,0xe1,0xb2
+,0x95,0x95,0x2d,0x42,0x87,0xd7,0xd5,0xb3
+,0x90,0x43,0xb7,0x6c,0x13,0xf1,0xde,0xdd
+,0xf6,0xc4,0xf8,0x89,0x3f,0xd1,0x75,0xf5
+,0x92,0xc3,0x91,0xd5,0x8a,0x88,0xd0,0x90
+,0xec,0xdc,0x6d,0xde,0x89,0xc2,0x65,0x71
+,0x96,0x8b,0x0d,0x03,0xfd,0x9c,0xbf,0x5b
+,0x16,0xac,0x92,0xdb,0xea,0xfe,0x79,0x7c
+,0xad,0xeb,0xaf,0xf7,0x16,0xcb,0xdb,0xcd
+,0x25,0x2b,0xe5,0x1f,0xfb,0x9a,0x9f,0xe2
+,0x51,0xcc,0x3a,0x53,0x0c,0x48,0xe6,0x0e
+,0xbd,0xc9,0xb4,0x76,0x06,0x52,0xe6,0x11
+,0x13,0x85,0x72,0x63,0x03,0x04,0xe0,0x04
+,0x36,0x2b,0x20,0x19,0x02,0xe8,0x74,0xa7
+,0x1f,0xb6,0xc9,0x56,0x66,0xf0,0x75,0x25
+,0xdc,0x67,0xc1,0x0e,0x61,0x60,0x88,0xb3
+,0x3e,0xd1,0xa8,0xfc,0xa3,0xda,0x1d,0xb0
+,0xd1,0xb1,0x23,0x54,0xdf,0x44,0x76,0x6d
+,0xed,0x41,0xd8,0xc1,0xb2,0x22,0xb6,0x53
+,0x1c,0xdf,0x35,0x1d,0xdc,0xa1,0x77,0x2a
+,0x31,0xe4,0x2d,0xf5,0xe5,0xe5,0xdb,0xc8
+,0xe0,0xff,0xe5,0x80,0xd7,0x0b,0x63,0xa0
+,0xff,0x33,0xa1,0x0f,0xba,0x2c,0x15,0x15
+,0xea,0x97,0xb3,0xd2,0xa2,0xb5,0xbe,0xf2
+,0x8c,0x96,0x1e,0x1a,0x8f,0x1d,0x6c,0xa4
+,0x61,0x37,0xb9,0x86,0x73,0x33,0xd7,0x97
+,0x96,0x9e,0x23,0x7d,0x82,0xa4,0x4c,0x81
+,0xe2,0xa1,0xd1,0xba,0x67,0x5f,0x95,0x07
+,0xa3,0x27,0x11,0xee,0x16,0x10,0x7b,0xbc
+,0x45,0x4a,0x4c,0xb2,0x04,0xd2,0xab,0xef
+,0xd5,0xfd,0x0c,0x51,0xce,0x50,0x6a,0x08
+,0x31,0xf9,0x91,0xda,0x0c,0x8f,0x64,0x5c
+,0x03,0xc3,0x3a,0x8b,0x20,0x3f,0x6e,0x8d
+,0x67,0x3d,0x3a,0xd6,0xfe,0x7d,0x5b,0x88
+,0xc9,0x5e,0xfb,0xcc,0x61,0xdc,0x8b,0x33
+,0x77,0xd3,0x44,0x32,0x35,0x09,0x62,0x04
+,0x92,0x16,0x10,0xd8,0x9e,0x27,0x47,0xfb
+,0x3b,0x21,0xe3,0xf8,0xeb,0x1d,0x5b,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x81,0xb0,0x30
+,0x81,0xad,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x0b,0x06,0x03,0x55
+,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0x1a,0x84,0x62,0xbc,0x48
+,0x4c,0x33,0x25,0x04,0xd4,0xee,0xd0,0xf6
+,0x03,0xc4,0x19,0x46,0xd1,0x94,0x6b,0x30
+,0x6e,0x06,0x03,0x55,0x1d,0x23,0x04,0x67
+,0x30,0x65,0x80,0x14,0x1a,0x84,0x62,0xbc
+,0x48,0x4c,0x33,0x25,0x04,0xd4,0xee,0xd0
+,0xf6,0x03,0xc4,0x19,0x46,0xd1,0x94,0x6b
+,0xa1,0x49,0xa4,0x47,0x30,0x45,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x42,0x4d,0x31,0x19,0x30,0x17,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x10,0x51,0x75
+,0x6f,0x56,0x61,0x64,0x69,0x73,0x20,0x4c
+,0x69,0x6d,0x69,0x74,0x65,0x64,0x31,0x1b
+,0x30,0x19,0x06,0x03,0x55,0x04,0x03,0x13
+,0x12,0x51,0x75,0x6f,0x56,0x61,0x64,0x69
+,0x73,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x20,0x32,0x82,0x02,0x05,0x09,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x02,0x01,0x00,0x3e,0x0a,0x16,0x4d,0x9f
+,0x06,0x5b,0xa8,0xae,0x71,0x5d,0x2f,0x05
+,0x2f,0x67,0xe6,0x13,0x45,0x83,0xc4,0x36
+,0xf6,0xf3,0xc0,0x26,0x0c,0x0d,0xb5,0x47
+,0x64,0x5d,0xf8,0xb4,0x72,0xc9,0x46,0xa5
+,0x03,0x18,0x27,0x55,0x89,0x78,0x7d,0x76
+,0xea,0x96,0x34,0x80,0x17,0x20,0xdc,0xe7
+,0x83,0xf8,0x8d,0xfc,0x07,0xb8,0xda,0x5f
+,0x4d,0x2e,0x67,0xb2,0x84,0xfd,0xd9,0x44
+,0xfc,0x77,0x50,0x81,0xe6,0x7c,0xb4,0xc9
+,0x0d,0x0b,0x72,0x53,0xf8,0x76,0x07,0x07
+,0x41,0x47,0x96,0x0c,0xfb,0xe0,0x82,0x26
+,0x93,0x55,0x8c,0xfe,0x22,0x1f,0x60,0x65
+,0x7c,0x5f,0xe7,0x26,0xb3,0xf7,0x32,0x90
+,0x98,0x50,0xd4,0x37,0x71,0x55,0xf6,0x92
+,0x21,0x78,0xf7,0x95,0x79,0xfa,0xf8,0x2d
+,0x26,0x87,0x66,0x56,0x30,0x77,0xa6,0x37
+,0x78,0x33,0x52,0x10,0x58,0xae,0x3f,0x61
+,0x8e,0xf2,0x6a,0xb1,0xef,0x18,0x7e,0x4a
+,0x59,0x63,0xca,0x8d,0xa2,0x56,0xd5,0xa7
+,0x2f,0xbc,0x56,0x1f,0xcf,0x39,0xc1,0xe2
+,0xfb,0x0a,0xa8,0x15,0x2c,0x7d,0x4d,0x7a
+,0x63,0xc6,0x6c,0x97,0x44,0x3c,0xd2,0x6f
+,0xc3,0x4a,0x17,0x0a,0xf8,0x90,0xd2,0x57
+,0xa2,0x19,0x51,0xa5,0x2d,0x97,0x41,0xda
+,0x07,0x4f,0xa9,0x50,0xda,0x90,0x8d,0x94
+,0x46,0xe1,0x3e,0xf0,0x94,0xfd,0x10,0x00
+,0x38,0xf5,0x3b,0xe8,0x40,0xe1,0xb4,0x6e
+,0x56,0x1a,0x20,0xcc,0x6f,0x58,0x8d,0xed
+,0x2e,0x45,0x8f,0xd6,0xe9,0x93,0x3f,0xe7
+,0xb1,0x2c,0xdf,0x3a,0xd6,0x22,0x8c,0xdc
+,0x84,0xbb,0x22,0x6f,0xd0,0xf8,0xe4,0xc6
+,0x39,0xe9,0x04,0x88,0x3c,0xc3,0xba,0xeb
+,0x55,0x7a,0x6d,0x80,0x99,0x24,0xf5,0x6c
+,0x01,0xfb,0xf8,0x97,0xb0,0x94,0x5b,0xeb
+,0xfd,0xd2,0x6f,0xf1,0x77,0x68,0x0d,0x35
+,0x64,0x23,0xac,0xb8,0x55,0xa1,0x03,0xd1
+,0x4d,0x42,0x19,0xdc,0xf8,0x75,0x59,0x56
+,0xa3,0xf9,0xa8,0x49,0x79,0xf8,0xaf,0x0e
+,0xb9,0x11,0xa0,0x7c,0xb7,0x6a,0xed,0x34
+,0xd0,0xb6,0x26,0x62,0x38,0x1a,0x87,0x0c
+,0xf8,0xe8,0xfd,0x2e,0xd3,0x90,0x7f,0x07
+,0x91,0x2a,0x1d,0xd6,0x7e,0x5c,0x85,0x83
+,0x99,0xb0,0x38,0x08,0x3f,0xe9,0x5e,0xf9
+,0x35,0x07,0xe4,0xc9,0x62,0x6e,0x57,0x7f
+,0xa7,0x50,0x95,0xf7,0xba,0xc8,0x9b,0xe6
+,0x8e,0xa2,0x01,0xc5,0xd6,0x66,0xbf,0x79
+,0x61,0xf3,0x3c,0x1c,0xe1,0xb9,0x82,0x5c
+,0x5d,0xa0,0xc3,0xe9,0xd8,0x48,0xbd,0x19
+,0xa2,0x11,0x14,0x19,0x6e,0xb2,0x86,0x1b
+,0x68,0x3e,0x48,0x37,0x1a,0x88,0xb7,0x5d
+,0x96,0x5e,0x9c,0xc7,0xef,0x27,0x62,0x08
+,0xe2,0x91,0x19,0x5c,0xd2,0xf1,0x21,0xdd
+,0xba,0x17,0x42,0x82,0x97,0x71,0x81,0x53
+,0x31,0xa9,0x9f,0xf6,0x7d,0x62,0xbf,0x72
+,0xe1,0xa3,0x93,0x1d,0xcc,0x8a,0x26,0x5a
+,0x09,0x38,0xd0,0xce,0xd7,0x0d,0x80,0x16
+,0xb4,0x78,0xa5,0x3a,0x87,0x4c,0x8d,0x8a
+,0xa5,0xd5,0x46,0x97,0xf2,0x2c,0x10,0xb9
+,0xbc,0x54,0x22,0xc0,0x01,0x50,0x69,0x43
+,0x9e,0xf4,0xb2,0xef,0x6d,0xf8,0xec,0xda
+,0xf1,0xe3,0xb1,0xef,0xdf,0x91,0x8f,0x54
+,0x2a,0x0b,0x25,0xc1,0x26,0x19,0xc4,0x52
+,0x10,0x05,0x65,0xd5,0x82,0x10,0xea,0xc2
+,0x31,0xcd,0x2e};
+const unsigned int NptTlsTrustAnchor_Base_0076_Size = 1467;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0077.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0077.cpp
new file mode 100644
index 0000000..94d96e4
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0077.cpp
@@ -0,0 +1,249 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* QuoVadis Root CA 3 */
+const unsigned char NptTlsTrustAnchor_Base_0077_Data[1697] = {
+0x30,0x82,0x06,0x9d,0x30,0x82,0x04,0x85
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x02,0x05
+,0xc6,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x30,0x45,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x42,0x4d,0x31
+,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x10,0x51,0x75,0x6f,0x56,0x61,0x64
+,0x69,0x73,0x20,0x4c,0x69,0x6d,0x69,0x74
+,0x65,0x64,0x31,0x1b,0x30,0x19,0x06,0x03
+,0x55,0x04,0x03,0x13,0x12,0x51,0x75,0x6f
+,0x56,0x61,0x64,0x69,0x73,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x20,0x33,0x30
+,0x1e,0x17,0x0d,0x30,0x36,0x31,0x31,0x32
+,0x34,0x31,0x39,0x31,0x31,0x32,0x33,0x5a
+,0x17,0x0d,0x33,0x31,0x31,0x31,0x32,0x34
+,0x31,0x39,0x30,0x36,0x34,0x34,0x5a,0x30
+,0x45,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x42,0x4d,0x31,0x19
+,0x30,0x17,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x10,0x51,0x75,0x6f,0x56,0x61,0x64,0x69
+,0x73,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x1b,0x30,0x19,0x06,0x03,0x55
+,0x04,0x03,0x13,0x12,0x51,0x75,0x6f,0x56
+,0x61,0x64,0x69,0x73,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x20,0x33,0x30,0x82
+,0x02,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x02,0x0f,0x00,0x30,0x82
+,0x02,0x0a,0x02,0x82,0x02,0x01,0x00,0xcc
+,0x57,0x42,0x16,0x54,0x9c,0xe6,0x98,0xd3
+,0xd3,0x4d,0xee,0xfe,0xed,0xc7,0x9f,0x43
+,0x39,0x4a,0x65,0xb3,0xe8,0x16,0x88,0x34
+,0xdb,0x0d,0x59,0x91,0x74,0xcf,0x92,0xb8
+,0x04,0x40,0xad,0x02,0x4b,0x31,0xab,0xbc
+,0x8d,0x91,0x68,0xd8,0x20,0x0e,0x1a,0x01
+,0xe2,0x1a,0x7b,0x4e,0x17,0x5d,0xe2,0x8a
+,0xb7,0x3f,0x99,0x1a,0xcd,0xeb,0x61,0xab
+,0xc2,0x65,0xa6,0x1f,0xb7,0xb7,0xbd,0xb7
+,0x8f,0xfc,0xfd,0x70,0x8f,0x0b,0xa0,0x67
+,0xbe,0x01,0xa2,0x59,0xcf,0x71,0xe6,0x0f
+,0x29,0x76,0xff,0xb1,0x56,0x79,0x45,0x2b
+,0x1f,0x9e,0x7a,0x54,0xe8,0xa3,0x29,0x35
+,0x68,0xa4,0x01,0x4f,0x0f,0xa4,0x2e,0x37
+,0xef,0x1b,0xbf,0xe3,0x8f,0x10,0xa8,0x72
+,0xab,0x58,0x57,0xe7,0x54,0x86,0xc8,0xc9
+,0xf3,0x5b,0xda,0x2c,0xda,0x5d,0x8e,0x6e
+,0x3c,0xa3,0x3e,0xda,0xfb,0x82,0xe5,0xdd
+,0xf2,0x5c,0xb2,0x05,0x33,0x6f,0x8a,0x36
+,0xce,0xd0,0x13,0x4e,0xff,0xbf,0x4a,0x0c
+,0x34,0x4c,0xa6,0xc3,0x21,0xbd,0x50,0x04
+,0x55,0xeb,0xb1,0xbb,0x9d,0xfb,0x45,0x1e
+,0x64,0x15,0xde,0x55,0x01,0x8c,0x02,0x76
+,0xb5,0xcb,0xa1,0x3f,0x42,0x69,0xbc,0x2f
+,0xbd,0x68,0x43,0x16,0x56,0x89,0x2a,0x37
+,0x61,0x91,0xfd,0xa6,0xae,0x4e,0xc0,0xcb
+,0x14,0x65,0x94,0x37,0x4b,0x92,0x06,0xef
+,0x04,0xd0,0xc8,0x9c,0x88,0xdb,0x0b,0x7b
+,0x81,0xaf,0xb1,0x3d,0x2a,0xc4,0x65,0x3a
+,0x78,0xb6,0xee,0xdc,0x80,0xb1,0xd2,0xd3
+,0x99,0x9c,0x3a,0xee,0x6b,0x5a,0x6b,0xb3
+,0x8d,0xb7,0xd5,0xce,0x9c,0xc2,0xbe,0xa5
+,0x4b,0x2f,0x16,0xb1,0x9e,0x68,0x3b,0x06
+,0x6f,0xae,0x7d,0x9f,0xf8,0xde,0xec,0xcc
+,0x29,0xa7,0x98,0xa3,0x25,0x43,0x2f,0xef
+,0xf1,0x5f,0x26,0xe1,0x88,0x4d,0xf8,0x5e
+,0x6e,0xd7,0xd9,0x14,0x6e,0x19,0x33,0x69
+,0xa7,0x3b,0x84,0x89,0x93,0xc4,0x53,0x55
+,0x13,0xa1,0x51,0x78,0x40,0xf8,0xb8,0xc9
+,0xa2,0xee,0x7b,0xba,0x52,0x42,0x83,0x9e
+,0x14,0xed,0x05,0x52,0x5a,0x59,0x56,0xa7
+,0x97,0xfc,0x9d,0x3f,0x0a,0x29,0xd8,0xdc
+,0x4f,0x91,0x0e,0x13,0xbc,0xde,0x95,0xa4
+,0xdf,0x8b,0x99,0xbe,0xac,0x9b,0x33,0x88
+,0xef,0xb5,0x81,0xaf,0x1b,0xc6,0x22,0x53
+,0xc8,0xf6,0xc7,0xee,0x97,0x14,0xb0,0xc5
+,0x7c,0x78,0x52,0xc8,0xf0,0xce,0x6e,0x77
+,0x60,0x84,0xa6,0xe9,0x2a,0x76,0x20,0xed
+,0x58,0x01,0x17,0x30,0x93,0xe9,0x1a,0x8b
+,0xe0,0x73,0x63,0xd9,0x6a,0x92,0x94,0x49
+,0x4e,0xb4,0xad,0x4a,0x85,0xc4,0xa3,0x22
+,0x30,0xfc,0x09,0xed,0x68,0x22,0x73,0xa6
+,0x88,0x0c,0x55,0x21,0x58,0xc5,0xe1,0x3a
+,0x9f,0x2a,0xdd,0xca,0xe1,0x90,0xe0,0xd9
+,0x73,0xab,0x6c,0x80,0xb8,0xe8,0x0b,0x64
+,0x93,0xa0,0x9c,0x8c,0x19,0xff,0xb3,0xd2
+,0x0c,0xec,0x91,0x26,0x87,0x8a,0xb3,0xa2
+,0xe1,0x70,0x8f,0x2c,0x0a,0xe5,0xcd,0x6d
+,0x68,0x51,0xeb,0xda,0x3f,0x05,0x7f,0x8b
+,0x32,0xe6,0x13,0x5c,0x6b,0xfe,0x5f,0x40
+,0xe2,0x22,0xc8,0xb4,0xb4,0x64,0x4f,0xd6
+,0xba,0x7d,0x48,0x3e,0xa8,0x69,0x0c,0xd7
+,0xbb,0x86,0x71,0xc9,0x73,0xb8,0x3f,0x3b
+,0x9d,0x25,0x4b,0xda,0xff,0x40,0xeb,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x95
+,0x30,0x82,0x01,0x91,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x81,0xe1
+,0x06,0x03,0x55,0x1d,0x20,0x04,0x81,0xd9
+,0x30,0x81,0xd6,0x30,0x81,0xd3,0x06,0x09
+,0x2b,0x06,0x01,0x04,0x01,0xbe,0x58,0x00
+,0x03,0x30,0x81,0xc5,0x30,0x81,0x93,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02
+,0x02,0x30,0x81,0x86,0x1a,0x81,0x83,0x41
+,0x6e,0x79,0x20,0x75,0x73,0x65,0x20,0x6f
+,0x66,0x20,0x74,0x68,0x69,0x73,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74
+,0x69,0x74,0x75,0x74,0x65,0x73,0x20,0x61
+,0x63,0x63,0x65,0x70,0x74,0x61,0x6e,0x63
+,0x65,0x20,0x6f,0x66,0x20,0x74,0x68,0x65
+,0x20,0x51,0x75,0x6f,0x56,0x61,0x64,0x69
+,0x73,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x20,0x33,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20
+,0x50,0x6f,0x6c,0x69,0x63,0x79,0x20,0x2f
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x50
+,0x72,0x61,0x63,0x74,0x69,0x63,0x65,0x20
+,0x53,0x74,0x61,0x74,0x65,0x6d,0x65,0x6e
+,0x74,0x2e,0x30,0x2d,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x21
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x71,0x75,0x6f,0x76,0x61
+,0x64,0x69,0x73,0x67,0x6c,0x6f,0x62,0x61
+,0x6c,0x2e,0x63,0x6f,0x6d,0x2f,0x63,0x70
+,0x73,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f
+,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0xf2,0xc0,0x13,0xe0,0x82,0x43,0x3e
+,0xfb,0xee,0x2f,0x67,0x32,0x96,0x35,0x5c
+,0xdb,0xb8,0xcb,0x02,0xd0,0x30,0x6e,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x67,0x30,0x65
+,0x80,0x14,0xf2,0xc0,0x13,0xe0,0x82,0x43
+,0x3e,0xfb,0xee,0x2f,0x67,0x32,0x96,0x35
+,0x5c,0xdb,0xb8,0xcb,0x02,0xd0,0xa1,0x49
+,0xa4,0x47,0x30,0x45,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x42
+,0x4d,0x31,0x19,0x30,0x17,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x10,0x51,0x75,0x6f,0x56
+,0x61,0x64,0x69,0x73,0x20,0x4c,0x69,0x6d
+,0x69,0x74,0x65,0x64,0x31,0x1b,0x30,0x19
+,0x06,0x03,0x55,0x04,0x03,0x13,0x12,0x51
+,0x75,0x6f,0x56,0x61,0x64,0x69,0x73,0x20
+,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41,0x20
+,0x33,0x82,0x02,0x05,0xc6,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x02,0x01
+,0x00,0x4f,0xad,0xa0,0x2c,0x4c,0xfa,0xc0
+,0xf2,0x6f,0xf7,0x66,0x55,0xab,0x23,0x34
+,0xee,0xe7,0x29,0xda,0xc3,0x5b,0xb6,0xb0
+,0x83,0xd9,0xd0,0xd0,0xe2,0x21,0xfb,0xf3
+,0x60,0xa7,0x3b,0x5d,0x60,0x53,0x27,0xa2
+,0x9b,0xf6,0x08,0x22,0x2a,0xe7,0xbf,0xa0
+,0x72,0xe5,0x9c,0x24,0x6a,0x31,0xb1,0x90
+,0x7a,0x27,0xdb,0x84,0x11,0x89,0x27,0xa6
+,0x77,0x5a,0x38,0xd7,0xbf,0xac,0x86,0xfc
+,0xee,0x5d,0x83,0xbc,0x06,0xc6,0xd1,0x77
+,0x6b,0x0f,0x6d,0x24,0x2f,0x4b,0x7a,0x6c
+,0xa7,0x07,0x96,0xca,0xe3,0x84,0x9f,0xad
+,0x88,0x8b,0x1d,0xab,0x16,0x8d,0x5b,0x66
+,0x17,0xd9,0x16,0xf4,0x8b,0x80,0xd2,0xdd
+,0xf8,0xb2,0x76,0xc3,0xfc,0x38,0x13,0xaa
+,0x0c,0xde,0x42,0x69,0x2b,0x6e,0xf3,0x3c
+,0xeb,0x80,0x27,0xdb,0xf5,0xa6,0x44,0x0d
+,0x9f,0x5a,0x55,0x59,0x0b,0xd5,0x0d,0x52
+,0x48,0xc5,0xae,0x9f,0xf2,0x2f,0x80,0xc5
+,0xea,0x32,0x50,0x35,0x12,0x97,0x2e,0xc1
+,0xe1,0xff,0xf1,0x23,0x88,0x51,0x38,0x9f
+,0xf2,0x66,0x56,0x76,0xe7,0x0f,0x51,0x97
+,0xa5,0x52,0x0c,0x4d,0x49,0x51,0x95,0x36
+,0x3d,0xbf,0xa2,0x4b,0x0c,0x10,0x1d,0x86
+,0x99,0x4c,0xaa,0xf3,0x72,0x11,0x93,0xe4
+,0xea,0xf6,0x9b,0xda,0xa8,0x5d,0xa7,0x4d
+,0xb7,0x9e,0x02,0xae,0x73,0x00,0xc8,0xda
+,0x23,0x03,0xe8,0xf9,0xea,0x19,0x74,0x62
+,0x00,0x94,0xcb,0x22,0x20,0xbe,0x94,0xa7
+,0x59,0xb5,0x82,0x6a,0xbe,0x99,0x79,0x7a
+,0xa9,0xf2,0x4a,0x24,0x52,0xf7,0x74,0xfd
+,0xba,0x4e,0xe6,0xa8,0x1d,0x02,0x6e,0xb1
+,0x0d,0x80,0x44,0xc1,0xae,0xd3,0x23,0x37
+,0x5f,0xbb,0x85,0x7c,0x2b,0x92,0x2e,0xe8
+,0x7e,0xa5,0x8b,0xdd,0x99,0xe1,0xbf,0x27
+,0x6f,0x2d,0x5d,0xaa,0x7b,0x87,0xfe,0x0a
+,0xdd,0x4b,0xfc,0x8e,0xf5,0x26,0xe4,0x6e
+,0x70,0x42,0x6e,0x33,0xec,0x31,0x9e,0x7b
+,0x93,0xc1,0xe4,0xc9,0x69,0x1a,0x3d,0xc0
+,0x6b,0x4e,0x22,0x6d,0xee,0xab,0x58,0x4d
+,0xc6,0xd0,0x41,0xc1,0x2b,0xea,0x4f,0x12
+,0x87,0x5e,0xeb,0x45,0xd8,0x6c,0xf5,0x98
+,0x02,0xd3,0xa0,0xd8,0x55,0x8a,0x06,0x99
+,0x19,0xa2,0xa0,0x77,0xd1,0x30,0x9e,0xac
+,0xcc,0x75,0xee,0x83,0xf5,0xb0,0x62,0x39
+,0xcf,0x6c,0x57,0xe2,0x4c,0xd2,0x91,0x0b
+,0x0e,0x75,0x28,0x1b,0x9a,0xbf,0xfd,0x1a
+,0x43,0xf1,0xca,0x77,0xfb,0x3b,0x8f,0x61
+,0xb8,0x69,0x28,0x16,0x42,0x04,0x5e,0x70
+,0x2a,0x1c,0x21,0xd8,0x8f,0xe1,0xbd,0x23
+,0x5b,0x2d,0x74,0x40,0x92,0xd9,0x63,0x19
+,0x0d,0x73,0xdd,0x69,0xbc,0x62,0x47,0xbc
+,0xe0,0x74,0x2b,0xb2,0xeb,0x7d,0xbe,0x41
+,0x1b,0xb5,0xc0,0x46,0xc5,0xa1,0x22,0xcb
+,0x5f,0x4e,0xc1,0x28,0x92,0xde,0x18,0xba
+,0xd5,0x2a,0x28,0xbb,0x11,0x8b,0x17,0x93
+,0x98,0x99,0x60,0x94,0x5c,0x23,0xcf,0x5a
+,0x27,0x97,0x5e,0x0b,0x05,0x06,0x93,0x37
+,0x1e,0x3b,0x69,0x36,0xeb,0xa9,0x9e,0x61
+,0x1d,0x8f,0x32,0xda,0x8e,0x0c,0xd6,0x74
+,0x3e,0x7b,0x09,0x24,0xda,0x01,0x77,0x47
+,0xc4,0x3b,0xcd,0x34,0x8c,0x99,0xf5,0xca
+,0xe1,0x25,0x61,0x33,0xb2,0x59,0x1b,0xe2
+,0x6e,0xd7,0x37,0x57,0xb6,0x0d,0xa9,0x12
+,0xda};
+const unsigned int NptTlsTrustAnchor_Base_0077_Size = 1697;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0078.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0078.cpp
new file mode 100644
index 0000000..74dc6c2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0078.cpp
@@ -0,0 +1,144 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Security Communication Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0078_Data[862] = {
+0x30,0x82,0x03,0x5a,0x30,0x82,0x02,0x42
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x50,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x4a,0x50,0x31,0x18
+,0x30,0x16,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0f,0x53,0x45,0x43,0x4f,0x4d,0x20,0x54
+,0x72,0x75,0x73,0x74,0x2e,0x6e,0x65,0x74
+,0x31,0x27,0x30,0x25,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x1e,0x53,0x65,0x63,0x75,0x72
+,0x69,0x74,0x79,0x20,0x43,0x6f,0x6d,0x6d
+,0x75,0x6e,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x52,0x6f,0x6f,0x74,0x43,0x41
+,0x31,0x30,0x1e,0x17,0x0d,0x30,0x33,0x30
+,0x39,0x33,0x30,0x30,0x34,0x32,0x30,0x34
+,0x39,0x5a,0x17,0x0d,0x32,0x33,0x30,0x39
+,0x33,0x30,0x30,0x34,0x32,0x30,0x34,0x39
+,0x5a,0x30,0x50,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x4a,0x50
+,0x31,0x18,0x30,0x16,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x0f,0x53,0x45,0x43,0x4f,0x4d
+,0x20,0x54,0x72,0x75,0x73,0x74,0x2e,0x6e
+,0x65,0x74,0x31,0x27,0x30,0x25,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x1e,0x53,0x65,0x63
+,0x75,0x72,0x69,0x74,0x79,0x20,0x43,0x6f
+,0x6d,0x6d,0x75,0x6e,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x52,0x6f,0x6f,0x74
+,0x43,0x41,0x31,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xb3,0xb3,0xfe,0x7f
+,0xd3,0x6d,0xb1,0xef,0x16,0x7c,0x57,0xa5
+,0x0c,0x6d,0x76,0x8a,0x2f,0x4b,0xbf,0x64
+,0xfb,0x4c,0xee,0x8a,0xf0,0xf3,0x29,0x7c
+,0xf5,0xff,0xee,0x2a,0xe0,0xe9,0xe9,0xba
+,0x5b,0x64,0x22,0x9a,0x9a,0x6f,0x2c,0x3a
+,0x26,0x69,0x51,0x05,0x99,0x26,0xdc,0xd5
+,0x1c,0x6a,0x71,0xc6,0x9a,0x7d,0x1e,0x9d
+,0xdd,0x7c,0x6c,0xc6,0x8c,0x67,0x67,0x4a
+,0x3e,0xf8,0x71,0xb0,0x19,0x27,0xa9,0x09
+,0x0c,0xa6,0x95,0xbf,0x4b,0x8c,0x0c,0xfa
+,0x55,0x98,0x3b,0xd8,0xe8,0x22,0xa1,0x4b
+,0x71,0x38,0x79,0xac,0x97,0x92,0x69,0xb3
+,0x89,0x7e,0xea,0x21,0x68,0x06,0x98,0x14
+,0x96,0x87,0xd2,0x61,0x36,0xbc,0x6d,0x27
+,0x56,0x9e,0x57,0xee,0xc0,0xc0,0x56,0xfd
+,0x32,0xcf,0xa4,0xd9,0x8e,0xc2,0x23,0xd7
+,0x8d,0xa8,0xf3,0xd8,0x25,0xac,0x97,0xe4
+,0x70,0x38,0xf4,0xb6,0x3a,0xb4,0x9d,0x3b
+,0x97,0x26,0x43,0xa3,0xa1,0xbc,0x49,0x59
+,0x72,0x4c,0x23,0x30,0x87,0x01,0x58,0xf6
+,0x4e,0xbe,0x1c,0x68,0x56,0x66,0xaf,0xcd
+,0x41,0x5d,0xc8,0xb3,0x4d,0x2a,0x55,0x46
+,0xab,0x1f,0xda,0x1e,0xe2,0x40,0x3d,0xdb
+,0xcd,0x7d,0xb9,0x92,0x80,0x9c,0x37,0xdd
+,0x0c,0x96,0x64,0x9d,0xdc,0x22,0xf7,0x64
+,0x8b,0xdf,0x61,0xde,0x15,0x94,0x52,0x15
+,0xa0,0x7d,0x52,0xc9,0x4b,0xa8,0x21,0xc9
+,0xc6,0xb1,0xed,0xcb,0xc3,0x95,0x60,0xd1
+,0x0f,0xf0,0xab,0x70,0xf8,0xdf,0xcb,0x4d
+,0x7e,0xec,0xd6,0xfa,0xab,0xd9,0xbd,0x7f
+,0x54,0xf2,0xa5,0xe9,0x79,0xfa,0xd9,0xd6
+,0x76,0x24,0x28,0x73,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x3f,0x30,0x3d,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0xa0,0x73,0x49,0x99,0x68,0xdc,0x85,0x5b
+,0x65,0xe3,0x9b,0x28,0x2f,0x57,0x9f,0xbd
+,0x33,0xbc,0x07,0x48,0x30,0x0b,0x06,0x03
+,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x68,0x40
+,0xa9,0xa8,0xbb,0xe4,0x4f,0x5d,0x79,0xb3
+,0x05,0xb5,0x17,0xb3,0x60,0x13,0xeb,0xc6
+,0x92,0x5d,0xe0,0xd1,0xd3,0x6a,0xfe,0xfb
+,0xbe,0x9b,0x6d,0xbf,0xc7,0x05,0x6d,0x59
+,0x20,0xc4,0x1c,0xf0,0xb7,0xda,0x84,0x58
+,0x02,0x63,0xfa,0x48,0x16,0xef,0x4f,0xa5
+,0x0b,0xf7,0x4a,0x98,0xf2,0x3f,0x9e,0x1b
+,0xad,0x47,0x6b,0x63,0xce,0x08,0x47,0xeb
+,0x52,0x3f,0x78,0x9c,0xaf,0x4d,0xae,0xf8
+,0xd5,0x4f,0xcf,0x9a,0x98,0x2a,0x10,0x41
+,0x39,0x52,0xc4,0xdd,0xd9,0x9b,0x0e,0xef
+,0x93,0x01,0xae,0xb2,0x2e,0xca,0x68,0x42
+,0x24,0x42,0x6c,0xb0,0xb3,0x3a,0x3e,0xcd
+,0xe9,0xda,0x48,0xc4,0x15,0xcb,0xe9,0xf9
+,0x07,0x0f,0x92,0x50,0x49,0x8a,0xdd,0x31
+,0x97,0x5f,0xc9,0xe9,0x37,0xaa,0x3b,0x59
+,0x65,0x97,0x94,0x32,0xc9,0xb3,0x9f,0x3e
+,0x3a,0x62,0x58,0xc5,0x49,0xad,0x62,0x0e
+,0x71,0xa5,0x32,0xaa,0x2f,0xc6,0x89,0x76
+,0x43,0x40,0x13,0x13,0x67,0x3d,0xa2,0x54
+,0x25,0x10,0xcb,0xf1,0x3a,0xf2,0xd9,0xfa
+,0xdb,0x49,0x56,0xbb,0xa6,0xfe,0xa7,0x41
+,0x35,0xc3,0xe0,0x88,0x61,0xc9,0x88,0xc7
+,0xdf,0x36,0x10,0x22,0x98,0x59,0xea,0xb0
+,0x4a,0xfb,0x56,0x16,0x73,0x6e,0xac,0x4d
+,0xf7,0x22,0xa1,0x4f,0xad,0x1d,0x7a,0x2d
+,0x45,0x27,0xe5,0x30,0xc1,0x5e,0xf2,0xda
+,0x13,0xcb,0x25,0x42,0x51,0x95,0x47,0x03
+,0x8c,0x6c,0x21,0xcc,0x74,0x42,0xed,0x53
+,0xff,0x33,0x8b,0x8f,0x0f,0x57,0x01,0x16
+,0x2f,0xcf,0xa6,0xee,0xc9,0x70,0x22,0x14
+,0xbd,0xfd,0xbe,0x6c,0x0b,0x03};
+const unsigned int NptTlsTrustAnchor_Base_0078_Size = 862;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0079.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0079.cpp
new file mode 100644
index 0000000..ad97c14
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0079.cpp
@@ -0,0 +1,137 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Sonera Class 1 Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0079_Data[804] = {
+0x30,0x82,0x03,0x20,0x30,0x82,0x02,0x08
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x24
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x39,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x46,0x49,0x31,0x0f
+,0x30,0x0d,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x06,0x53,0x6f,0x6e,0x65,0x72,0x61,0x31
+,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x03
+,0x13,0x10,0x53,0x6f,0x6e,0x65,0x72,0x61
+,0x20,0x43,0x6c,0x61,0x73,0x73,0x31,0x20
+,0x43,0x41,0x30,0x1e,0x17,0x0d,0x30,0x31
+,0x30,0x34,0x30,0x36,0x31,0x30,0x34,0x39
+,0x31,0x33,0x5a,0x17,0x0d,0x32,0x31,0x30
+,0x34,0x30,0x36,0x31,0x30,0x34,0x39,0x31
+,0x33,0x5a,0x30,0x39,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x46
+,0x49,0x31,0x0f,0x30,0x0d,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x06,0x53,0x6f,0x6e,0x65
+,0x72,0x61,0x31,0x19,0x30,0x17,0x06,0x03
+,0x55,0x04,0x03,0x13,0x10,0x53,0x6f,0x6e
+,0x65,0x72,0x61,0x20,0x43,0x6c,0x61,0x73
+,0x73,0x31,0x20,0x43,0x41,0x30,0x82,0x01
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01
+,0x0a,0x02,0x82,0x01,0x01,0x00,0xb5,0x89
+,0x1f,0x2b,0x4f,0x67,0x0a,0x79,0xff,0xc5
+,0x1e,0xf8,0x7f,0x3c,0xed,0xd1,0x7e,0xda
+,0xb0,0xcd,0x6d,0x2f,0x36,0xac,0x34,0xc6
+,0xdb,0xd9,0x64,0x17,0x08,0x63,0x30,0x33
+,0x22,0x8a,0x4c,0xee,0x8e,0xbb,0x0f,0x0d
+,0x42,0x55,0xc9,0x9d,0x2e,0xa5,0xef,0xf7
+,0xa7,0x8c,0xc3,0xab,0xb9,0x97,0xcb,0x8e
+,0xef,0x3f,0x15,0x67,0xa8,0x82,0x72,0x63
+,0x53,0x0f,0x41,0x8c,0x7d,0x10,0x95,0x24
+,0xa1,0x5a,0xa5,0x06,0xfa,0x92,0x57,0x9d
+,0xfa,0xa5,0x01,0xf2,0x75,0xe9,0x1f,0xbc
+,0x56,0x26,0x52,0x4e,0x78,0x19,0x65,0x58
+,0x55,0x03,0x58,0xc0,0x14,0xae,0x8c,0x7c
+,0x55,0x5f,0x70,0x5b,0x77,0x23,0x06,0x36
+,0x97,0xf3,0x24,0xb5,0x9a,0x46,0x95,0xe4
+,0xdf,0x0d,0x0b,0x05,0x45,0xe5,0xd1,0xf2
+,0x1d,0x82,0xbb,0xc6,0x13,0xe0,0xfe,0xaa
+,0x7a,0xfd,0x69,0x30,0x94,0xf3,0xd2,0x45
+,0x85,0xfc,0xf2,0x32,0x5b,0x32,0xde,0xe8
+,0x6c,0x5d,0x1f,0xcb,0xa4,0x22,0x74,0xb0
+,0x80,0x8e,0x5d,0x94,0xf7,0x06,0x00,0x4b
+,0xa9,0xd4,0x5e,0x2e,0x35,0x50,0x09,0xf3
+,0x80,0x97,0xf4,0x0c,0x17,0xae,0x39,0xd8
+,0x5f,0xcd,0x33,0xc1,0x1c,0xca,0x89,0xc2
+,0x22,0xf7,0x45,0x12,0xed,0x5e,0x12,0x93
+,0x9d,0x63,0xab,0x82,0x2e,0xb9,0xeb,0x42
+,0x41,0x44,0xcb,0x4a,0x1a,0x00,0x82,0x0d
+,0x9e,0xf9,0x8b,0x57,0x3e,0x4c,0xc7,0x17
+,0xed,0x2c,0x8b,0x72,0x33,0x5f,0x72,0x7a
+,0x38,0x56,0xd5,0xe6,0xd9,0xae,0x05,0x1a
+,0x1d,0x75,0x45,0xb1,0xcb,0xa5,0x25,0x1c
+,0x12,0x57,0x36,0xfd,0x22,0x37,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x33,0x30,0x31,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x11,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x0a,0x04,0x08,0x47,0xe2,0x0c,0x8b,0xf6
+,0x53,0x88,0x52,0x30,0x0b,0x06,0x03,0x55
+,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x8b,0x1a,0xb2,0xc9
+,0x5d,0x61,0xb4,0xe1,0xb9,0x2b,0xb9,0x53
+,0xd1,0xb2,0x85,0x9d,0x77,0x8e,0x16,0xee
+,0x11,0x3d,0xdb,0xc2,0x63,0xd9,0x5b,0x97
+,0x65,0xfb,0x12,0x67,0xd8,0x2a,0x5c,0xb6
+,0xab,0xe5,0x5e,0xc3,0xb7,0x16,0x2f,0xc8
+,0xe8,0xab,0x1d,0x8a,0xfd,0xab,0x1a,0x7c
+,0xd5,0x5f,0x63,0xcf,0xdc,0xb0,0xdd,0x77
+,0xb9,0xa8,0xe6,0xd2,0x22,0x38,0x87,0x07
+,0x14,0xd9,0xff,0xbe,0x56,0xb5,0xfd,0x07
+,0x0e,0x3c,0x55,0xca,0x16,0xcc,0xa7,0xa6
+,0x77,0x37,0xfb,0xdb,0x5c,0x1f,0x4e,0x59
+,0x06,0x87,0xa3,0x03,0x43,0xf5,0x16,0xab
+,0xb7,0x84,0xbd,0x4e,0xef,0x9f,0x31,0x37
+,0xf0,0x46,0xf1,0x40,0xb6,0xd1,0x0c,0xa5
+,0x64,0xf8,0x63,0x5e,0x21,0xdb,0x55,0x4e
+,0x4f,0x31,0x76,0x9c,0x10,0x61,0x8e,0xb6
+,0x53,0x3a,0xa3,0x11,0xbe,0xaf,0x6d,0x7c
+,0x1e,0xbd,0xae,0x2d,0xe2,0x0c,0x69,0xc7
+,0x85,0x53,0x68,0xa2,0x61,0xba,0xc5,0x3e
+,0xb4,0x79,0x54,0x78,0x9e,0x0a,0xc7,0x02
+,0xbe,0x62,0xd1,0x11,0x82,0x4b,0x65,0x2f
+,0x91,0x5a,0xc2,0xa8,0x87,0xb1,0x56,0x68
+,0x94,0x79,0xf9,0x25,0xf7,0xc1,0xd5,0xae
+,0x1a,0xb8,0xbb,0x3d,0x8f,0xa9,0x8a,0x38
+,0x15,0xf7,0x73,0xd0,0x5a,0x60,0xd1,0x80
+,0xb0,0xf0,0xdc,0xd5,0x50,0xcd,0x4e,0xee
+,0x92,0x48,0x69,0xed,0xb2,0x23,0x1e,0x30
+,0xcc,0xc8,0x94,0xc8,0xb6,0xf5,0x3b,0x86
+,0x7f,0x3f,0xa6,0x2e,0x9f,0xf6,0x3e,0x2c
+,0xb5,0x92,0x96,0x3e,0xdf,0x2c,0x93,0x8a
+,0xff,0x81,0x8c,0x0f,0x0f,0x59,0x21,0x19
+,0x57,0xbd,0x55,0x9a};
+const unsigned int NptTlsTrustAnchor_Base_0079_Size = 804;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0080.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0080.cpp
new file mode 100644
index 0000000..2840428
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0080.cpp
@@ -0,0 +1,137 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Sonera Class 2 Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0080_Data[804] = {
+0x30,0x82,0x03,0x20,0x30,0x82,0x02,0x08
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x1d
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x39,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x46,0x49,0x31,0x0f
+,0x30,0x0d,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x06,0x53,0x6f,0x6e,0x65,0x72,0x61,0x31
+,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x03
+,0x13,0x10,0x53,0x6f,0x6e,0x65,0x72,0x61
+,0x20,0x43,0x6c,0x61,0x73,0x73,0x32,0x20
+,0x43,0x41,0x30,0x1e,0x17,0x0d,0x30,0x31
+,0x30,0x34,0x30,0x36,0x30,0x37,0x32,0x39
+,0x34,0x30,0x5a,0x17,0x0d,0x32,0x31,0x30
+,0x34,0x30,0x36,0x30,0x37,0x32,0x39,0x34
+,0x30,0x5a,0x30,0x39,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x46
+,0x49,0x31,0x0f,0x30,0x0d,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x06,0x53,0x6f,0x6e,0x65
+,0x72,0x61,0x31,0x19,0x30,0x17,0x06,0x03
+,0x55,0x04,0x03,0x13,0x10,0x53,0x6f,0x6e
+,0x65,0x72,0x61,0x20,0x43,0x6c,0x61,0x73
+,0x73,0x32,0x20,0x43,0x41,0x30,0x82,0x01
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01
+,0x0a,0x02,0x82,0x01,0x01,0x00,0x90,0x17
+,0x4a,0x35,0x9d,0xca,0xf0,0x0d,0x96,0xc7
+,0x44,0xfa,0x16,0x37,0xfc,0x48,0xbd,0xbd
+,0x7f,0x80,0x2d,0x35,0x3b,0xe1,0x6f,0xa8
+,0x67,0xa9,0xbf,0x03,0x1c,0x4d,0x8c,0x6f
+,0x32,0x47,0xd5,0x41,0x68,0xa4,0x13,0x04
+,0xc1,0x35,0x0c,0x9a,0x84,0x43,0xfc,0x5c
+,0x1d,0xff,0x89,0xb3,0xe8,0x17,0x18,0xcd
+,0x91,0x5f,0xfb,0x89,0xe3,0xea,0xbf,0x4e
+,0x5d,0x7c,0x1b,0x26,0xd3,0x75,0x79,0xed
+,0xe6,0x84,0xe3,0x57,0xe5,0xad,0x29,0xc4
+,0xf4,0x3a,0x28,0xe7,0xa5,0x7b,0x84,0x36
+,0x69,0xb3,0xfd,0x5e,0x76,0xbd,0xa3,0x2d
+,0x99,0xd3,0x90,0x4e,0x23,0x28,0x7d,0x18
+,0x63,0xf1,0x54,0x3b,0x26,0x9d,0x76,0x5b
+,0x97,0x42,0xb2,0xff,0xae,0xf0,0x4e,0xec
+,0xdd,0x39,0x95,0x4e,0x83,0x06,0x7f,0xe7
+,0x49,0x40,0xc8,0xc5,0x01,0xb2,0x54,0x5a
+,0x66,0x1d,0x3d,0xfc,0xf9,0xe9,0x3c,0x0a
+,0x9e,0x81,0xb8,0x70,0xf0,0x01,0x8b,0xe4
+,0x23,0x54,0x7c,0xc8,0xae,0xf8,0x90,0x1e
+,0x00,0x96,0x72,0xd4,0x54,0xcf,0x61,0x23
+,0xbc,0xea,0xfb,0x9d,0x02,0x95,0xd1,0xb6
+,0xb9,0x71,0x3a,0x69,0x08,0x3f,0x0f,0xb4
+,0xe1,0x42,0xc7,0x88,0xf5,0x3f,0x98,0xa8
+,0xa7,0xba,0x1c,0xe0,0x71,0x71,0xef,0x58
+,0x57,0x81,0x50,0x7a,0x5c,0x6b,0x74,0x46
+,0x0e,0x83,0x03,0x98,0xc3,0x8e,0xa8,0x6e
+,0xf2,0x76,0x32,0x6e,0x27,0x83,0xc2,0x73
+,0xf3,0xdc,0x18,0xe8,0xb4,0x93,0xea,0x75
+,0x44,0x6b,0x04,0x60,0x20,0x71,0x57,0x87
+,0x9d,0xf3,0xbe,0xa0,0x90,0x23,0x3d,0x8a
+,0x24,0xe1,0xda,0x21,0xdb,0xc3,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x33,0x30,0x31,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x11,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x0a,0x04,0x08,0x4a,0xa0,0xaa,0x58,0x84
+,0xd3,0x5e,0x3c,0x30,0x0b,0x06,0x03,0x55
+,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x5a,0xce,0x87,0xf9
+,0x16,0x72,0x15,0x57,0x4b,0x1d,0xd9,0x9b
+,0xe7,0xa2,0x26,0x30,0xec,0x93,0x67,0xdf
+,0xd6,0x2d,0xd2,0x34,0xaf,0xf7,0x38,0xa5
+,0xce,0xab,0x16,0xb9,0xab,0x2f,0x7c,0x35
+,0xcb,0xac,0xd0,0x0f,0xb4,0x4c,0x2b,0xfc
+,0x80,0xef,0x6b,0x8c,0x91,0x5f,0x36,0x76
+,0xf7,0xdb,0xb3,0x1b,0x19,0xea,0xf4,0xb2
+,0x11,0xfd,0x61,0x71,0x44,0xbf,0x28,0xb3
+,0x3a,0x1d,0xbf,0xb3,0x43,0xe8,0x9f,0xbf
+,0xdc,0x31,0x08,0x71,0xb0,0x9d,0x8d,0xd6
+,0x34,0x47,0x32,0x90,0xc6,0x65,0x24,0xf7
+,0xa0,0x4a,0x7c,0x04,0x73,0x8f,0x39,0x6f
+,0x17,0x8c,0x72,0xb5,0xbd,0x4b,0xc8,0x7a
+,0xf8,0x7b,0x83,0xc3,0x28,0x4e,0x9c,0x09
+,0xea,0x67,0x3f,0xb2,0x67,0x04,0x1b,0xc3
+,0x14,0xda,0xf8,0xe7,0x49,0x24,0x91,0xd0
+,0x1d,0x6a,0xfa,0x61,0x39,0xef,0x6b,0xe7
+,0x21,0x75,0x06,0x07,0xd8,0x12,0xb4,0x21
+,0x20,0x70,0x42,0x71,0x81,0xda,0x3c,0x9a
+,0x36,0xbe,0xa6,0x5b,0x0d,0x6a,0x6c,0x9a
+,0x1f,0x91,0x7b,0xf9,0xf9,0xef,0x42,0xba
+,0x4e,0x4e,0x9e,0xcc,0x0c,0x8d,0x94,0xdc
+,0xd9,0x45,0x9c,0x5e,0xec,0x42,0x50,0x63
+,0xae,0xf4,0x5d,0xc4,0xb1,0x12,0xdc,0xca
+,0x3b,0xa8,0x2e,0x9d,0x14,0x5a,0x05,0x75
+,0xb7,0xec,0xd7,0x63,0xe2,0xba,0x35,0xb6
+,0x04,0x08,0x91,0xe8,0xda,0x9d,0x9c,0xf6
+,0x66,0xb5,0x18,0xac,0x0a,0xa6,0x54,0x26
+,0x34,0x33,0xd2,0x1b,0xc1,0xd4,0x7f,0x1a
+,0x3a,0x8e,0x0b,0xaa,0x32,0x6e,0xdb,0xfc
+,0x4f,0x25,0x9f,0xd9,0x32,0xc7,0x96,0x5a
+,0x70,0xac,0xdf,0x4c};
+const unsigned int NptTlsTrustAnchor_Base_0080_Size = 804;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0081.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0081.cpp
new file mode 100644
index 0000000..7c92c9d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0081.cpp
@@ -0,0 +1,156 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Staat der Nederlanden Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0081_Data[958] = {
+0x30,0x82,0x03,0xba,0x30,0x82,0x02,0xa2
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x00
+,0x98,0x96,0x8a,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x55,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x4e
+,0x4c,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x15,0x53,0x74,0x61,0x61
+,0x74,0x20,0x64,0x65,0x72,0x20,0x4e,0x65
+,0x64,0x65,0x72,0x6c,0x61,0x6e,0x64,0x65
+,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55
+,0x04,0x03,0x13,0x1d,0x53,0x74,0x61,0x61
+,0x74,0x20,0x64,0x65,0x72,0x20,0x4e,0x65
+,0x64,0x65,0x72,0x6c,0x61,0x6e,0x64,0x65
+,0x6e,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x30,0x1e,0x17,0x0d,0x30,0x32,0x31
+,0x32,0x31,0x37,0x30,0x39,0x32,0x33,0x34
+,0x39,0x5a,0x17,0x0d,0x31,0x35,0x31,0x32
+,0x31,0x36,0x30,0x39,0x31,0x35,0x33,0x38
+,0x5a,0x30,0x55,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x4e,0x4c
+,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x15,0x53,0x74,0x61,0x61,0x74
+,0x20,0x64,0x65,0x72,0x20,0x4e,0x65,0x64
+,0x65,0x72,0x6c,0x61,0x6e,0x64,0x65,0x6e
+,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04
+,0x03,0x13,0x1d,0x53,0x74,0x61,0x61,0x74
+,0x20,0x64,0x65,0x72,0x20,0x4e,0x65,0x64
+,0x65,0x72,0x6c,0x61,0x6e,0x64,0x65,0x6e
+,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0x98,0xd2,0xb5,0x51,0x11,0x7a,0x81
+,0xa6,0x14,0x98,0x71,0x6d,0xbe,0xcc,0xe7
+,0x13,0x1b,0xd6,0x27,0x0e,0x7a,0xb3,0x6a
+,0x18,0x1c,0xb6,0x61,0x5a,0xd5,0x61,0x09
+,0xbf,0xde,0x90,0x13,0xc7,0x67,0xee,0xdd
+,0xf3,0xda,0xc5,0x0c,0x12,0x9e,0x35,0x55
+,0x3e,0x2c,0x27,0x88,0x40,0x6b,0xf7,0xdc
+,0xdd,0x22,0x61,0xf5,0xc2,0xc7,0x0e,0xf5
+,0xf6,0xd5,0x76,0x53,0x4d,0x8f,0x8c,0xbc
+,0x18,0x76,0x37,0x85,0x9d,0xe8,0xca,0x49
+,0xc7,0xd2,0x4f,0x98,0x13,0x09,0xa2,0x3e
+,0x22,0x88,0x9c,0x7f,0xd6,0xf2,0x10,0x65
+,0xb4,0xee,0x5f,0x18,0xd5,0x17,0xe3,0xf8
+,0xc5,0xfd,0xe2,0x9d,0xa2,0xef,0x53,0x0e
+,0x85,0x77,0xa2,0x0f,0xe1,0x30,0x47,0xee
+,0x00,0xe7,0x33,0x7d,0x44,0x67,0x1a,0x0b
+,0x51,0xe8,0x8b,0xa0,0x9e,0x50,0x98,0x68
+,0x34,0x52,0x1f,0x2e,0x6d,0x01,0xf2,0x60
+,0x45,0xf2,0x31,0xeb,0xa9,0x31,0x68,0x29
+,0xbb,0x7a,0x41,0x9e,0xc6,0x19,0x7f,0x94
+,0xb4,0x51,0x39,0x03,0x7f,0xb2,0xde,0xa7
+,0x32,0x9b,0xb4,0x47,0x8e,0x6f,0xb4,0x4a
+,0xae,0xe5,0xaf,0xb1,0xdc,0xb0,0x1b,0x61
+,0xbc,0x99,0x72,0xde,0xe4,0x89,0xb7,0x7a
+,0x26,0x5d,0xda,0x33,0x49,0x5b,0x52,0x9c
+,0x0e,0xf5,0x8a,0xad,0xc3,0xb8,0x3d,0xe8
+,0x06,0x6a,0xc2,0xd5,0x2a,0x0b,0x6c,0x7b
+,0x84,0xbd,0x56,0x05,0xcb,0x86,0x65,0x92
+,0xec,0x44,0x2b,0xb0,0x8e,0xb9,0xdc,0x70
+,0x0b,0x46,0xda,0xad,0xbc,0x63,0x88,0x39
+,0xfa,0xdb,0x6a,0xfe,0x23,0xfa,0xbc,0xe4
+,0x48,0xf4,0x67,0x2b,0x6a,0x11,0x10,0x21
+,0x49,0x02,0x03,0x01,0x00,0x01,0xa3,0x81
+,0x91,0x30,0x81,0x8e,0x30,0x0c,0x06,0x03
+,0x55,0x1d,0x13,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x4f,0x06,0x03,0x55,0x1d
+,0x20,0x04,0x48,0x30,0x46,0x30,0x44,0x06
+,0x04,0x55,0x1d,0x20,0x00,0x30,0x3c,0x30
+,0x3a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x02,0x01,0x16,0x2e,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x70,0x6b,0x69,0x6f,0x76,0x65,0x72,0x68
+,0x65,0x69,0x64,0x2e,0x6e,0x6c,0x2f,0x70
+,0x6f,0x6c,0x69,0x63,0x69,0x65,0x73,0x2f
+,0x72,0x6f,0x6f,0x74,0x2d,0x70,0x6f,0x6c
+,0x69,0x63,0x79,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0xa8,0x7d
+,0xeb,0xbc,0x63,0xa4,0x74,0x13,0x74,0x00
+,0xec,0x96,0xe0,0xd3,0x34,0xc1,0x2c,0xbf
+,0x6c,0xf8,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x05,0x84
+,0x87,0x55,0x74,0x36,0x61,0xc1,0xbb,0xd1
+,0xd4,0xc6,0x15,0xa8,0x13,0xb4,0x9f,0xa4
+,0xfe,0xbb,0xee,0x15,0xb4,0x2f,0x06,0x0c
+,0x29,0xf2,0xa8,0x92,0xa4,0x61,0x0d,0xfc
+,0xab,0x5c,0x08,0x5b,0x51,0x13,0x2b,0x4d
+,0xc2,0x2a,0x61,0xc8,0xf8,0x09,0x58,0xfc
+,0x2d,0x02,0xb2,0x39,0x7d,0x99,0x66,0x81
+,0xbf,0x6e,0x5c,0x95,0x45,0x20,0x6c,0xe6
+,0x79,0xa7,0xd1,0xd8,0x1c,0x29,0xfc,0xc2
+,0x20,0x27,0x51,0xc8,0xf1,0x7c,0x5d,0x34
+,0x67,0x69,0x85,0x11,0x30,0xc6,0x00,0xd2
+,0xd7,0xf3,0xd3,0x7c,0xb6,0xf0,0x31,0x57
+,0x28,0x12,0x82,0x73,0xe9,0x33,0x2f,0xa6
+,0x55,0xb4,0x0b,0x91,0x94,0x47,0x9c,0xfa
+,0xbb,0x7a,0x42,0x32,0xe8,0xae,0x7e,0x2d
+,0xc8,0xbc,0xac,0x14,0xbf,0xd9,0x0f,0xd9
+,0x5b,0xfc,0xc1,0xf9,0x7a,0x95,0xe1,0x7d
+,0x7e,0x96,0xfc,0x71,0xb0,0xc2,0x4c,0xc8
+,0xdf,0x45,0x34,0xc9,0xce,0x0d,0xf2,0x9c
+,0x64,0x08,0xd0,0x3b,0xc3,0x29,0xc5,0xb2
+,0xed,0x90,0x04,0xc1,0xb1,0x29,0x91,0xc5
+,0x30,0x6f,0xc1,0xa9,0x72,0x33,0xcc,0xfe
+,0x5d,0x16,0x17,0x2c,0x11,0x69,0xe7,0x7e
+,0xfe,0xc5,0x83,0x08,0xdf,0xbc,0xdc,0x22
+,0x3a,0x2e,0x20,0x69,0x23,0x39,0x56,0x60
+,0x67,0x90,0x8b,0x2e,0x76,0x39,0xfb,0x11
+,0x88,0x97,0xf6,0x7c,0xbd,0x4b,0xb8,0x20
+,0x16,0x67,0x05,0x8d,0xe2,0x3b,0xc1,0x72
+,0x3f,0x94,0x95,0x37,0xc7,0x5d,0xb9,0x9e
+,0xd8,0x93,0xa1,0x17,0x8f,0xff,0x0c,0x66
+,0x15,0xc1,0x24,0x7c,0x32,0x7c,0x03,0x1d
+,0x3b,0xa1,0x58,0x45,0x32,0x93};
+const unsigned int NptTlsTrustAnchor_Base_0081_Size = 958;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0082.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0082.cpp
new file mode 100644
index 0000000..d2aea59
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0082.cpp
@@ -0,0 +1,170 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TDC Internet Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0082_Data[1071] = {
+0x30,0x82,0x04,0x2b,0x30,0x82,0x03,0x13
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x3a
+,0xcc,0xa5,0x4c,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x43,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x44
+,0x4b,0x31,0x15,0x30,0x13,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0c,0x54,0x44,0x43,0x20
+,0x49,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74
+,0x31,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x14,0x54,0x44,0x43,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41,0x30
+,0x1e,0x17,0x0d,0x30,0x31,0x30,0x34,0x30
+,0x35,0x31,0x36,0x33,0x33,0x31,0x37,0x5a
+,0x17,0x0d,0x32,0x31,0x30,0x34,0x30,0x35
+,0x31,0x37,0x30,0x33,0x31,0x37,0x5a,0x30
+,0x43,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x44,0x4b,0x31,0x15
+,0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0c,0x54,0x44,0x43,0x20,0x49,0x6e,0x74
+,0x65,0x72,0x6e,0x65,0x74,0x31,0x1d,0x30
+,0x1b,0x06,0x03,0x55,0x04,0x0b,0x13,0x14
+,0x54,0x44,0x43,0x20,0x49,0x6e,0x74,0x65
+,0x72,0x6e,0x65,0x74,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xc4,0xb8,0x40
+,0xbc,0x91,0xd5,0x63,0x1f,0xd7,0x99,0xa0
+,0x8b,0x0c,0x40,0x1e,0x74,0xb7,0x48,0x9d
+,0x46,0x8c,0x02,0xb2,0xe0,0x24,0x5f,0xf0
+,0x19,0x13,0xa7,0x37,0x83,0x6b,0x5d,0xc7
+,0x8e,0xf9,0x84,0x30,0xce,0x1a,0x3b,0xfa
+,0xfb,0xce,0x8b,0x6d,0x23,0xc6,0xc3,0x6e
+,0x66,0x9f,0x89,0xa5,0xdf,0xe0,0x42,0x50
+,0x67,0xfa,0x1f,0x6c,0x1e,0xf4,0xd0,0x05
+,0xd6,0xbf,0xca,0xd6,0x4e,0xe4,0x68,0x60
+,0x6c,0x46,0xaa,0x1c,0x5d,0x63,0xe1,0x07
+,0x86,0x0e,0x65,0x00,0xa7,0x2e,0xa6,0x71
+,0xc6,0xbc,0xb9,0x81,0xa8,0x3a,0x7d,0x1a
+,0xd2,0xf9,0xd1,0xac,0x4b,0xcb,0xce,0x75
+,0xaf,0xdc,0x7b,0xfa,0x81,0x73,0xd4,0xfc
+,0xba,0xbd,0x41,0x88,0xd4,0x74,0xb3,0xf9
+,0x5e,0x38,0x3a,0x3c,0x43,0xa8,0xd2,0x95
+,0x4e,0x77,0x6d,0x13,0x0c,0x9d,0x8f,0x78
+,0x01,0xb7,0x5a,0x20,0x1f,0x03,0x37,0x35
+,0xe2,0x2c,0xdb,0x4b,0x2b,0x2c,0x78,0xb9
+,0x49,0xdb,0xc4,0xd0,0xc7,0x9c,0x9c,0xe4
+,0x8a,0x20,0x09,0x21,0x16,0x56,0x66,0xff
+,0x05,0xec,0x5b,0xe3,0xf0,0xcf,0xab,0x24
+,0x24,0x5e,0xc3,0x7f,0x70,0x7a,0x12,0xc4
+,0xd2,0xb5,0x10,0xa0,0xb6,0x21,0xe1,0x8d
+,0x78,0x69,0x55,0x44,0x69,0xf5,0xca,0x96
+,0x1c,0x34,0x85,0x17,0x25,0x77,0xe2,0xf6
+,0x2f,0x27,0x98,0x78,0xfd,0x79,0x06,0x3a
+,0xa2,0xd6,0x5a,0x43,0xc1,0xff,0xec,0x04
+,0x3b,0xee,0x13,0xef,0xd3,0x58,0x5a,0xff
+,0x92,0xeb,0xec,0xae,0xda,0xf2,0x37,0x03
+,0x47,0x41,0xb6,0x97,0xc9,0x2d,0x0a,0x41
+,0x22,0xbb,0xbb,0xe6,0xa7,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x82,0x01,0x25,0x30,0x82
+,0x01,0x21,0x30,0x11,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x01,0x04
+,0x04,0x03,0x02,0x00,0x07,0x30,0x65,0x06
+,0x03,0x55,0x1d,0x1f,0x04,0x5e,0x30,0x5c
+,0x30,0x5a,0xa0,0x58,0xa0,0x56,0xa4,0x54
+,0x30,0x52,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x44,0x4b,0x31
+,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0c,0x54,0x44,0x43,0x20,0x49,0x6e
+,0x74,0x65,0x72,0x6e,0x65,0x74,0x31,0x1d
+,0x30,0x1b,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x14,0x54,0x44,0x43,0x20,0x49,0x6e,0x74
+,0x65,0x72,0x6e,0x65,0x74,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x31,0x0d,0x30
+,0x0b,0x06,0x03,0x55,0x04,0x03,0x13,0x04
+,0x43,0x52,0x4c,0x31,0x30,0x2b,0x06,0x03
+,0x55,0x1d,0x10,0x04,0x24,0x30,0x22,0x80
+,0x0f,0x32,0x30,0x30,0x31,0x30,0x34,0x30
+,0x35,0x31,0x36,0x33,0x33,0x31,0x37,0x5a
+,0x81,0x0f,0x32,0x30,0x32,0x31,0x30,0x34
+,0x30,0x35,0x31,0x37,0x30,0x33,0x31,0x37
+,0x5a,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f
+,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1f
+,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30
+,0x16,0x80,0x14,0x6c,0x64,0x01,0xc7,0xfd
+,0x85,0x6d,0xac,0xc8,0xda,0x9e,0x50,0x08
+,0x85,0x08,0xb5,0x3c,0x56,0xa8,0x50,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0x6c,0x64,0x01,0xc7,0xfd,0x85
+,0x6d,0xac,0xc8,0xda,0x9e,0x50,0x08,0x85
+,0x08,0xb5,0x3c,0x56,0xa8,0x50,0x30,0x0c
+,0x06,0x03,0x55,0x1d,0x13,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf6,0x7d,0x07,0x41
+,0x00,0x04,0x10,0x30,0x0e,0x1b,0x08,0x56
+,0x35,0x2e,0x30,0x3a,0x34,0x2e,0x30,0x03
+,0x02,0x04,0x90,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x4e
+,0x43,0xcc,0xd1,0xdd,0x1d,0x10,0x1b,0x06
+,0x7f,0xb7,0xa4,0xfa,0xd3,0xd9,0x4d,0xfb
+,0x23,0x9f,0x23,0x54,0x5b,0xe6,0x8b,0x2f
+,0x04,0x28,0x8b,0xb5,0x27,0x6d,0x89,0xa1
+,0xec,0x98,0x69,0xdc,0xe7,0x8d,0x26,0x83
+,0x05,0x79,0x74,0xec,0xb4,0xb9,0xa3,0x97
+,0xc1,0x35,0x00,0xfd,0x15,0xda,0x39,0x81
+,0x3a,0x95,0x31,0x90,0xde,0x97,0xe9,0x86
+,0xa8,0x99,0x77,0x0c,0xe5,0x5a,0xa0,0x84
+,0xff,0x12,0x16,0xac,0x6e,0xb8,0x8d,0xc3
+,0x7b,0x92,0xc2,0xac,0x2e,0xd0,0x7d,0x28
+,0xec,0xb6,0xf3,0x60,0x38,0x69,0x6f,0x3e
+,0xd8,0x04,0x55,0x3e,0x9e,0xcc,0x55,0xd2
+,0xba,0xfe,0xbb,0x47,0x04,0xd7,0x0a,0xd9
+,0x16,0x0a,0x34,0x29,0xf5,0x58,0x13,0xd5
+,0x4f,0xcf,0x8f,0x56,0x4b,0xb3,0x1e,0xee
+,0xd3,0x98,0x79,0xda,0x08,0x1e,0x0c,0x6f
+,0xb8,0xf8,0x16,0x27,0xef,0xc2,0x6f,0x3d
+,0xf6,0xa3,0x4b,0x3e,0x0e,0xe4,0x6d,0x6c
+,0xdb,0x3b,0x41,0x12,0x9b,0xbd,0x0d,0x47
+,0x23,0x7f,0x3c,0x4a,0xd0,0xaf,0xc0,0xaf
+,0xf6,0xef,0x1b,0xb5,0x15,0xc4,0xeb,0x83
+,0xc4,0x09,0x5f,0x74,0x8b,0xd9,0x11,0xfb
+,0xc2,0x56,0xb1,0x3c,0xf8,0x70,0xca,0x34
+,0x8d,0x43,0x40,0x13,0x8c,0xfd,0x99,0x03
+,0x54,0x79,0xc6,0x2e,0xea,0x86,0xa1,0xf6
+,0x3a,0xd4,0x09,0xbc,0xf4,0xbc,0x66,0xcc
+,0x3d,0x58,0xd0,0x57,0x49,0x0a,0xee,0x25
+,0xe2,0x41,0xee,0x13,0xf9,0x9b,0x38,0x34
+,0xd1,0x00,0xf5,0x7e,0xe7,0x94,0x1d,0xfc
+,0x69,0x03,0x62,0xb8,0x99,0x05,0x05,0x3d
+,0x6b,0x78,0x12,0xbd,0xb0,0x6f,0x65};
+const unsigned int NptTlsTrustAnchor_Base_0082_Size = 1071;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0083.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0083.cpp
new file mode 100644
index 0000000..53208d5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0083.cpp
@@ -0,0 +1,200 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TDC OCES Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0083_Data[1309] = {
+0x30,0x82,0x05,0x19,0x30,0x82,0x04,0x01
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x3e
+,0x48,0xbd,0xc4,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x31,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x44
+,0x4b,0x31,0x0c,0x30,0x0a,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x03,0x54,0x44,0x43,0x31
+,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x03
+,0x13,0x0b,0x54,0x44,0x43,0x20,0x4f,0x43
+,0x45,0x53,0x20,0x43,0x41,0x30,0x1e,0x17
+,0x0d,0x30,0x33,0x30,0x32,0x31,0x31,0x30
+,0x38,0x33,0x39,0x33,0x30,0x5a,0x17,0x0d
+,0x33,0x37,0x30,0x32,0x31,0x31,0x30,0x39
+,0x30,0x39,0x33,0x30,0x5a,0x30,0x31,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x44,0x4b,0x31,0x0c,0x30,0x0a
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x03,0x54
+,0x44,0x43,0x31,0x14,0x30,0x12,0x06,0x03
+,0x55,0x04,0x03,0x13,0x0b,0x54,0x44,0x43
+,0x20,0x4f,0x43,0x45,0x53,0x20,0x43,0x41
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xac,0x62,0xf6,0x61,0x20,0xb2,0xcf
+,0xc0,0xc6,0x85,0xd7,0xe3,0x79,0xe6,0xcc
+,0xed,0xf2,0x39,0x92,0xa4,0x97,0x2e,0x64
+,0xa3,0x84,0x5b,0x87,0x9c,0x4c,0xfd,0xa4
+,0xf3,0xc4,0x5f,0x21,0xbd,0x56,0x10,0xeb
+,0xdb,0x2e,0x61,0xec,0x93,0x69,0xe3,0xa3
+,0xcc,0xbd,0x99,0xc3,0x05,0xfc,0x06,0xb8
+,0xca,0x36,0x1c,0xfe,0x90,0x8e,0x49,0x4c
+,0xc4,0x56,0x9a,0x2f,0x56,0xbc,0xcf,0x7b
+,0x0c,0xf1,0x6f,0x47,0xa6,0x0d,0x43,0x4d
+,0xe2,0xe9,0x1d,0x39,0x34,0xcd,0x8d,0x2c
+,0xd9,0x12,0x98,0xf9,0xe3,0xe1,0xc1,0x4a
+,0x7c,0x86,0x38,0xc4,0xa9,0xc4,0x61,0x88
+,0xd2,0x5e,0xaf,0x1a,0x26,0x4d,0xd5,0xe4
+,0xa0,0x22,0x47,0x84,0xd9,0x64,0xb7,0x19
+,0x96,0xfc,0xec,0x19,0xe4,0xb2,0x97,0x26
+,0x4e,0x4a,0x4c,0xcb,0x8f,0x24,0x8b,0x54
+,0x18,0x1c,0x48,0x61,0x7b,0xd5,0x88,0x68
+,0xda,0x5d,0xb5,0xea,0xcd,0x1a,0x30,0xc1
+,0x80,0x83,0x76,0x50,0xaa,0x4f,0xd1,0xd4
+,0xdd,0x38,0xf0,0xef,0x16,0xf4,0xe1,0x0c
+,0x50,0x06,0xbf,0xea,0xfb,0x7a,0x49,0xa1
+,0x28,0x2b,0x1c,0xf6,0xfc,0x15,0x32,0xa3
+,0x74,0x6a,0x8f,0xa9,0xc3,0x62,0x29,0x71
+,0x31,0xe5,0x3b,0xa4,0x60,0x17,0x5e,0x74
+,0xe6,0xda,0x13,0xed,0xe9,0x1f,0x1f,0x1b
+,0xd1,0xb2,0x68,0x73,0xc6,0x10,0x34,0x75
+,0x46,0x10,0x10,0xe3,0x90,0x00,0x76,0x40
+,0xcb,0x8b,0xb7,0x43,0x09,0x21,0xff,0xab
+,0x4e,0x93,0xc6,0x58,0xe9,0xa5,0x82,0xdb
+,0x77,0xc4,0x3a,0x99,0xb1,0x72,0x95,0x49
+,0x04,0xf0,0xb7,0x2b,0xfa,0x7b,0x59,0x8e
+,0xdd,0x02,0x03,0x01,0x00,0x01,0xa3,0x82
+,0x02,0x37,0x30,0x82,0x02,0x33,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01
+,0xff,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x81,0xec,0x06,0x03,0x55,0x1d,0x20,0x04
+,0x81,0xe4,0x30,0x81,0xe1,0x30,0x81,0xde
+,0x06,0x08,0x2a,0x81,0x50,0x81,0x29,0x01
+,0x01,0x01,0x30,0x81,0xd1,0x30,0x2f,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02
+,0x01,0x16,0x23,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x63,0x65
+,0x72,0x74,0x69,0x66,0x69,0x6b,0x61,0x74
+,0x2e,0x64,0x6b,0x2f,0x72,0x65,0x70,0x6f
+,0x73,0x69,0x74,0x6f,0x72,0x79,0x30,0x81
+,0x9d,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x02,0x02,0x30,0x81,0x90,0x30,0x0a
+,0x16,0x03,0x54,0x44,0x43,0x30,0x03,0x02
+,0x01,0x01,0x1a,0x81,0x81,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x6b,0x61,0x74,0x65
+,0x72,0x20,0x66,0x72,0x61,0x20,0x64,0x65
+,0x6e,0x6e,0x65,0x20,0x43,0x41,0x20,0x75
+,0x64,0x73,0x74,0x65,0x64,0x65,0x73,0x20
+,0x75,0x6e,0x64,0x65,0x72,0x20,0x4f,0x49
+,0x44,0x20,0x31,0x2e,0x32,0x2e,0x32,0x30
+,0x38,0x2e,0x31,0x36,0x39,0x2e,0x31,0x2e
+,0x31,0x2e,0x31,0x2e,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x73,0x20,0x66,0x72,0x6f,0x6d,0x20,0x74
+,0x68,0x69,0x73,0x20,0x43,0x41,0x20,0x61
+,0x72,0x65,0x20,0x69,0x73,0x73,0x75,0x65
+,0x64,0x20,0x75,0x6e,0x64,0x65,0x72,0x20
+,0x4f,0x49,0x44,0x20,0x31,0x2e,0x32,0x2e
+,0x32,0x30,0x38,0x2e,0x31,0x36,0x39,0x2e
+,0x31,0x2e,0x31,0x2e,0x31,0x2e,0x30,0x11
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x00
+,0x07,0x30,0x81,0x81,0x06,0x03,0x55,0x1d
+,0x1f,0x04,0x7a,0x30,0x78,0x30,0x48,0xa0
+,0x46,0xa0,0x44,0xa4,0x42,0x30,0x40,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x44,0x4b,0x31,0x0c,0x30,0x0a
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x03,0x54
+,0x44,0x43,0x31,0x14,0x30,0x12,0x06,0x03
+,0x55,0x04,0x03,0x13,0x0b,0x54,0x44,0x43
+,0x20,0x4f,0x43,0x45,0x53,0x20,0x43,0x41
+,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04
+,0x03,0x13,0x04,0x43,0x52,0x4c,0x31,0x30
+,0x2c,0xa0,0x2a,0xa0,0x28,0x86,0x26,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72
+,0x6c,0x2e,0x6f,0x63,0x65,0x73,0x2e,0x63
+,0x65,0x72,0x74,0x69,0x66,0x69,0x6b,0x61
+,0x74,0x2e,0x64,0x6b,0x2f,0x6f,0x63,0x65
+,0x73,0x2e,0x63,0x72,0x6c,0x30,0x2b,0x06
+,0x03,0x55,0x1d,0x10,0x04,0x24,0x30,0x22
+,0x80,0x0f,0x32,0x30,0x30,0x33,0x30,0x32
+,0x31,0x31,0x30,0x38,0x33,0x39,0x33,0x30
+,0x5a,0x81,0x0f,0x32,0x30,0x33,0x37,0x30
+,0x32,0x31,0x31,0x30,0x39,0x30,0x39,0x33
+,0x30,0x5a,0x30,0x1f,0x06,0x03,0x55,0x1d
+,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x60
+,0xb5,0x85,0xec,0x56,0x64,0x7e,0x12,0x19
+,0x27,0x67,0x1d,0x50,0x15,0x4b,0x73,0xae
+,0x3b,0xf9,0x12,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0x60,0xb5
+,0x85,0xec,0x56,0x64,0x7e,0x12,0x19,0x27
+,0x67,0x1d,0x50,0x15,0x4b,0x73,0xae,0x3b
+,0xf9,0x12,0x30,0x1d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf6,0x7d,0x07,0x41,0x00,0x04
+,0x10,0x30,0x0e,0x1b,0x08,0x56,0x36,0x2e
+,0x30,0x3a,0x34,0x2e,0x30,0x03,0x02,0x04
+,0x90,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0x0a,0xba,0x26
+,0x26,0x46,0xd3,0x73,0xa8,0x09,0xf3,0x6b
+,0x0b,0x30,0x99,0xfd,0x8a,0xe1,0x57,0x7a
+,0x11,0xd3,0xb8,0x94,0xd7,0x09,0x10,0x6e
+,0xa3,0xb1,0x38,0x03,0xd1,0xb6,0xf2,0x43
+,0x41,0x29,0x62,0xa7,0x72,0xd8,0xfb,0x7c
+,0x05,0xe6,0x31,0x70,0x27,0x54,0x18,0x4e
+,0x8a,0x7c,0x4e,0xe5,0xd1,0xca,0x8c,0x78
+,0x88,0xcf,0x1b,0xd3,0x90,0x8b,0xe6,0x23
+,0xf8,0x0b,0x0e,0x33,0x43,0x7d,0x9c,0xe2
+,0x0a,0x19,0x8f,0xc9,0x01,0x3e,0x74,0x5d
+,0x74,0xc9,0x8b,0x1c,0x03,0xe5,0x18,0xc8
+,0x01,0x4c,0x3f,0xcb,0x97,0x05,0x5d,0x98
+,0x71,0xa6,0x98,0x6f,0xb6,0x7c,0xbd,0x37
+,0x7f,0xbe,0xe1,0x93,0x25,0x6d,0x6f,0xf0
+,0x0a,0xad,0x17,0x18,0xe1,0x03,0xbc,0x07
+,0x29,0xc8,0xad,0x26,0xe8,0xf8,0x61,0xf0
+,0xfd,0x21,0x09,0x7e,0x9a,0x8e,0xa9,0x68
+,0x7d,0x48,0x62,0x72,0xbd,0x00,0xea,0x01
+,0x99,0xb8,0x06,0x82,0x51,0x81,0x4e,0xf1
+,0xf5,0xb4,0x91,0x54,0xb9,0x23,0x7a,0x00
+,0x9a,0x9f,0x5d,0x8d,0xe0,0x3c,0x64,0xb9
+,0x1a,0x12,0x92,0x2a,0xc7,0x82,0x44,0x72
+,0x39,0xdc,0xe2,0x3c,0xc6,0xd8,0x55,0xf5
+,0x15,0x4e,0xc8,0x05,0x0e,0xdb,0xc6,0xd0
+,0x62,0xa6,0xec,0x15,0xb4,0xb5,0x02,0x82
+,0xdb,0xac,0x8c,0xa2,0x81,0xf0,0x9b,0x99
+,0x31,0xf5,0x20,0x20,0xa8,0x88,0x61,0x0a
+,0x07,0x9f,0x94,0xfc,0xd0,0xd7,0x1b,0xcc
+,0x2e,0x17,0xf3,0x04,0x27,0x76,0x67,0xeb
+,0x54,0x83,0xfd,0xa4,0x90,0x7e,0x06,0x3d
+,0x04,0xa3,0x43,0x2d,0xda,0xfc,0x0b,0x62
+,0xea,0x2f,0x5f,0x62,0x53};
+const unsigned int NptTlsTrustAnchor_Base_0083_Size = 1309;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0084.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0084.cpp
new file mode 100644
index 0000000..09e2687
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0084.cpp
@@ -0,0 +1,177 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* UTN DATACorp SGC Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0084_Data[1122] = {
+0x30,0x82,0x04,0x5e,0x30,0x82,0x03,0x46
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x44
+,0xbe,0x0c,0x8b,0x50,0x00,0x21,0xb4,0x11
+,0xd3,0x2a,0x68,0x06,0xa9,0xad,0x69,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0x93,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x08,0x13
+,0x02,0x55,0x54,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x07,0x13,0x0e,0x53,0x61
+,0x6c,0x74,0x20,0x4c,0x61,0x6b,0x65,0x20
+,0x43,0x69,0x74,0x79,0x31,0x1e,0x30,0x1c
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x54
+,0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54
+,0x52,0x55,0x53,0x54,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x21,0x30,0x1f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x18,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x75,0x73,0x65,0x72,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x31
+,0x1b,0x30,0x19,0x06,0x03,0x55,0x04,0x03
+,0x13,0x12,0x55,0x54,0x4e,0x20,0x2d,0x20
+,0x44,0x41,0x54,0x41,0x43,0x6f,0x72,0x70
+,0x20,0x53,0x47,0x43,0x30,0x1e,0x17,0x0d
+,0x39,0x39,0x30,0x36,0x32,0x34,0x31,0x38
+,0x35,0x37,0x32,0x31,0x5a,0x17,0x0d,0x31
+,0x39,0x30,0x36,0x32,0x34,0x31,0x39,0x30
+,0x36,0x33,0x30,0x5a,0x30,0x81,0x93,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x55,0x53,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x08,0x13,0x02,0x55
+,0x54,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x07,0x13,0x0e,0x53,0x61,0x6c,0x74
+,0x20,0x4c,0x61,0x6b,0x65,0x20,0x43,0x69
+,0x74,0x79,0x31,0x1e,0x30,0x1c,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x15,0x54,0x68,0x65
+,0x20,0x55,0x53,0x45,0x52,0x54,0x52,0x55
+,0x53,0x54,0x20,0x4e,0x65,0x74,0x77,0x6f
+,0x72,0x6b,0x31,0x21,0x30,0x1f,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x18,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x75,0x73,0x65,0x72,0x74,0x72,0x75,0x73
+,0x74,0x2e,0x63,0x6f,0x6d,0x31,0x1b,0x30
+,0x19,0x06,0x03,0x55,0x04,0x03,0x13,0x12
+,0x55,0x54,0x4e,0x20,0x2d,0x20,0x44,0x41
+,0x54,0x41,0x43,0x6f,0x72,0x70,0x20,0x53
+,0x47,0x43,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xdf,0xee,0x58,0x10,0xa2
+,0x2b,0x6e,0x55,0xc4,0x8e,0xbf,0x2e,0x46
+,0x09,0xe7,0xe0,0x08,0x0f,0x2e,0x2b,0x7a
+,0x13,0x94,0x1b,0xbd,0xf6,0xb6,0x80,0x8e
+,0x65,0x05,0x93,0x00,0x1e,0xbc,0xaf,0xe2
+,0x0f,0x8e,0x19,0x0d,0x12,0x47,0xec,0xac
+,0xad,0xa3,0xfa,0x2e,0x70,0xf8,0xde,0x6e
+,0xfb,0x56,0x42,0x15,0x9e,0x2e,0x5c,0xef
+,0x23,0xde,0x21,0xb9,0x05,0x76,0x27,0x19
+,0x0f,0x4f,0xd6,0xc3,0x9c,0xb4,0xbe,0x94
+,0x19,0x63,0xf2,0xa6,0x11,0x0a,0xeb,0x53
+,0x48,0x9c,0xbe,0xf2,0x29,0x3b,0x16,0xe8
+,0x1a,0xa0,0x4c,0xa6,0xc9,0xf4,0x18,0x59
+,0x68,0xc0,0x70,0xf2,0x53,0x00,0xc0,0x5e
+,0x50,0x82,0xa5,0x56,0x6f,0x36,0xf9,0x4a
+,0xe0,0x44,0x86,0xa0,0x4d,0x4e,0xd6,0x47
+,0x6e,0x49,0x4a,0xcb,0x67,0xd7,0xa6,0xc4
+,0x05,0xb9,0x8e,0x1e,0xf4,0xfc,0xff,0xcd
+,0xe7,0x36,0xe0,0x9c,0x05,0x6c,0xb2,0x33
+,0x22,0x15,0xd0,0xb4,0xe0,0xcc,0x17,0xc0
+,0xb2,0xc0,0xf4,0xfe,0x32,0x3f,0x29,0x2a
+,0x95,0x7b,0xd8,0xf2,0xa7,0x4e,0x0f,0x54
+,0x7c,0xa1,0x0d,0x80,0xb3,0x09,0x03,0xc1
+,0xff,0x5c,0xdd,0x5e,0x9a,0x3e,0xbc,0xae
+,0xbc,0x47,0x8a,0x6a,0xae,0x71,0xca,0x1f
+,0xb1,0x2a,0xb8,0x5f,0x42,0x05,0x0b,0xec
+,0x46,0x30,0xd1,0x72,0x0b,0xca,0xe9,0x56
+,0x6d,0xf5,0xef,0xdf,0x78,0xbe,0x61,0xba
+,0xb2,0xa5,0xae,0x04,0x4c,0xbc,0xa8,0xac
+,0x69,0x15,0x97,0xbd,0xef,0xeb,0xb4,0x8c
+,0xbf,0x35,0xf8,0xd4,0xc3,0xd1,0x28,0x0e
+,0x5c,0x3a,0x9f,0x70,0x18,0x33,0x20,0x77
+,0xc4,0xa2,0xaf,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x81,0xab,0x30,0x81,0xa8,0x30,0x0b
+,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03
+,0x02,0x01,0xc6,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x53
+,0x32,0xd1,0xb3,0xcf,0x7f,0xfa,0xe0,0xf1
+,0xa0,0x5d,0x85,0x4e,0x92,0xd2,0x9e,0x45
+,0x1d,0xb4,0x4f,0x30,0x3d,0x06,0x03,0x55
+,0x1d,0x1f,0x04,0x36,0x30,0x34,0x30,0x32
+,0xa0,0x30,0xa0,0x2e,0x86,0x2c,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c
+,0x2e,0x75,0x73,0x65,0x72,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x55
+,0x54,0x4e,0x2d,0x44,0x41,0x54,0x41,0x43
+,0x6f,0x72,0x70,0x53,0x47,0x43,0x2e,0x63
+,0x72,0x6c,0x30,0x2a,0x06,0x03,0x55,0x1d
+,0x25,0x04,0x23,0x30,0x21,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x03,0x01,0x06
+,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37
+,0x0a,0x03,0x03,0x06,0x09,0x60,0x86,0x48
+,0x01,0x86,0xf8,0x42,0x04,0x01,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01
+,0x01,0x00,0x27,0x35,0x97,0x00,0x8a,0x8b
+,0x28,0xbd,0xc6,0x33,0x30,0x1e,0x29,0xfc
+,0xe2,0xf7,0xd5,0x98,0xd4,0x40,0xbb,0x60
+,0xca,0xbf,0xab,0x17,0x2c,0x09,0x36,0x7f
+,0x50,0xfa,0x41,0xdc,0xae,0x96,0x3a,0x0a
+,0x23,0x3e,0x89,0x59,0xc9,0xa3,0x07,0xed
+,0x1b,0x37,0xad,0xfc,0x7c,0xbe,0x51,0x49
+,0x5a,0xde,0x3a,0x0a,0x54,0x08,0x16,0x45
+,0xc2,0x99,0xb1,0x87,0xcd,0x8c,0x68,0xe0
+,0x69,0x03,0xe9,0xc4,0x4e,0x98,0xb2,0x3b
+,0x8c,0x16,0xb3,0x0e,0xa0,0x0c,0x98,0x50
+,0x9b,0x93,0xa9,0x70,0x09,0xc8,0x2c,0xa3
+,0x8f,0xdf,0x02,0xe4,0xe0,0x71,0x3a,0xf1
+,0xb4,0x23,0x72,0xa0,0xaa,0x01,0xdf,0xdf
+,0x98,0x3e,0x14,0x50,0xa0,0x31,0x26,0xbd
+,0x28,0xe9,0x5a,0x30,0x26,0x75,0xf9,0x7b
+,0x60,0x1c,0x8d,0xf3,0xcd,0x50,0x26,0x6d
+,0x04,0x27,0x9a,0xdf,0xd5,0x0d,0x45,0x47
+,0x29,0x6b,0x2c,0xe6,0x76,0xd9,0xa9,0x29
+,0x7d,0x32,0xdd,0xc9,0x36,0x3c,0xbd,0xae
+,0x35,0xf1,0x11,0x9e,0x1d,0xbb,0x90,0x3f
+,0x12,0x47,0x4e,0x8e,0xd7,0x7e,0x0f,0x62
+,0x73,0x1d,0x52,0x26,0x38,0x1c,0x18,0x49
+,0xfd,0x30,0x74,0x9a,0xc4,0xe5,0x22,0x2f
+,0xd8,0xc0,0x8d,0xed,0x91,0x7a,0x4c,0x00
+,0x8f,0x72,0x7f,0x5d,0xda,0xdd,0x1b,0x8b
+,0x45,0x6b,0xe7,0xdd,0x69,0x97,0xa8,0xc5
+,0x56,0x4c,0x0f,0x0c,0xf6,0x9f,0x7a,0x91
+,0x37,0xf6,0x97,0x82,0xe0,0xdd,0x71,0x69
+,0xff,0x76,0x3f,0x60,0x4d,0x3c,0xcf,0xf7
+,0x99,0xf9,0xc6,0x57,0xf4,0xc9,0x55,0x39
+,0x78,0xba,0x2c,0x79,0xc9,0xa6,0x88,0x2b
+,0xf4,0x08};
+const unsigned int NptTlsTrustAnchor_Base_0084_Size = 1122;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0085.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0085.cpp
new file mode 100644
index 0000000..2959534
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0085.cpp
@@ -0,0 +1,185 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* UTN USERFirst Email Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0085_Data[1190] = {
+0x30,0x82,0x04,0xa2,0x30,0x82,0x03,0x8a
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x44
+,0xbe,0x0c,0x8b,0x50,0x00,0x24,0xb4,0x11
+,0xd3,0x36,0x25,0x25,0x67,0xc9,0x89,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0xae,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x08,0x13
+,0x02,0x55,0x54,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x07,0x13,0x0e,0x53,0x61
+,0x6c,0x74,0x20,0x4c,0x61,0x6b,0x65,0x20
+,0x43,0x69,0x74,0x79,0x31,0x1e,0x30,0x1c
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x54
+,0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54
+,0x52,0x55,0x53,0x54,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x21,0x30,0x1f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x18,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x75,0x73,0x65,0x72,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x31
+,0x36,0x30,0x34,0x06,0x03,0x55,0x04,0x03
+,0x13,0x2d,0x55,0x54,0x4e,0x2d,0x55,0x53
+,0x45,0x52,0x46,0x69,0x72,0x73,0x74,0x2d
+,0x43,0x6c,0x69,0x65,0x6e,0x74,0x20,0x41
+,0x75,0x74,0x68,0x65,0x6e,0x74,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x61,0x6e
+,0x64,0x20,0x45,0x6d,0x61,0x69,0x6c,0x30
+,0x1e,0x17,0x0d,0x39,0x39,0x30,0x37,0x30
+,0x39,0x31,0x37,0x32,0x38,0x35,0x30,0x5a
+,0x17,0x0d,0x31,0x39,0x30,0x37,0x30,0x39
+,0x31,0x37,0x33,0x36,0x35,0x38,0x5a,0x30
+,0x81,0xae,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x08
+,0x13,0x02,0x55,0x54,0x31,0x17,0x30,0x15
+,0x06,0x03,0x55,0x04,0x07,0x13,0x0e,0x53
+,0x61,0x6c,0x74,0x20,0x4c,0x61,0x6b,0x65
+,0x20,0x43,0x69,0x74,0x79,0x31,0x1e,0x30
+,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15
+,0x54,0x68,0x65,0x20,0x55,0x53,0x45,0x52
+,0x54,0x52,0x55,0x53,0x54,0x20,0x4e,0x65
+,0x74,0x77,0x6f,0x72,0x6b,0x31,0x21,0x30
+,0x1f,0x06,0x03,0x55,0x04,0x0b,0x13,0x18
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x75,0x73,0x65,0x72,0x74
+,0x72,0x75,0x73,0x74,0x2e,0x63,0x6f,0x6d
+,0x31,0x36,0x30,0x34,0x06,0x03,0x55,0x04
+,0x03,0x13,0x2d,0x55,0x54,0x4e,0x2d,0x55
+,0x53,0x45,0x52,0x46,0x69,0x72,0x73,0x74
+,0x2d,0x43,0x6c,0x69,0x65,0x6e,0x74,0x20
+,0x41,0x75,0x74,0x68,0x65,0x6e,0x74,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x61
+,0x6e,0x64,0x20,0x45,0x6d,0x61,0x69,0x6c
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xb2,0x39,0x85,0xa4,0xf2,0x7d,0xab
+,0x41,0x3b,0x62,0x46,0x37,0xae,0xcd,0xc1
+,0x60,0x75,0xbc,0x39,0x65,0xf9,0x4a,0x1a
+,0x47,0xa2,0xb9,0xcc,0x48,0xcc,0x6a,0x98
+,0xd5,0x4d,0x35,0x19,0xb9,0xa4,0x42,0xe5
+,0xce,0x49,0xe2,0x8a,0x2f,0x1e,0x7c,0xd2
+,0x31,0x07,0xc7,0x4e,0xb4,0x83,0x64,0x9d
+,0x2e,0x29,0xd5,0xa2,0x64,0xc4,0x85,0xbd
+,0x85,0x51,0x35,0x79,0xa4,0x4e,0x68,0x90
+,0x7b,0x1c,0x7a,0xa4,0x92,0xa8,0x17,0xf2
+,0x98,0x15,0xf2,0x93,0xcc,0xc9,0xa4,0x32
+,0x95,0xbb,0x0c,0x4f,0x30,0xbd,0x98,0xa0
+,0x0b,0x8b,0xe5,0x6e,0x1b,0xa2,0x46,0xfa
+,0x78,0xbc,0xa2,0x6f,0xab,0x59,0x5e,0xa5
+,0x2f,0xcf,0xca,0xda,0x6d,0xaa,0x2f,0xeb
+,0xac,0xa1,0xb3,0x6a,0xaa,0xb7,0x2e,0x67
+,0x35,0x8b,0x79,0xe1,0x1e,0x69,0x88,0xe2
+,0xe6,0x46,0xcd,0xa0,0xa5,0xea,0xbe,0x0b
+,0xce,0x76,0x3a,0x7a,0x0e,0x9b,0xea,0xfc
+,0xda,0x27,0x5b,0x3d,0x73,0x1f,0x22,0xe6
+,0x48,0x61,0xc6,0x4c,0xf3,0x69,0xb1,0xa8
+,0x2e,0x1b,0xb6,0xd4,0x31,0x20,0x2c,0xbc
+,0x82,0x8a,0x8e,0xa4,0x0e,0xa5,0xd7,0x89
+,0x43,0xfc,0x16,0x5a,0xaf,0x1d,0x71,0xd7
+,0x11,0x59,0xda,0xba,0x87,0x0d,0xaf,0xfa
+,0xf3,0xe1,0xc2,0xf0,0xa4,0xc5,0x67,0x8c
+,0xd6,0xd6,0x54,0x3a,0xde,0x0a,0xa4,0xba
+,0x03,0x77,0xb3,0x65,0xc8,0xfd,0x1e,0xd3
+,0x74,0x62,0xaa,0x18,0xca,0x68,0x93,0x1e
+,0xa1,0x85,0x7e,0xf5,0x47,0x65,0xcb,0xf8
+,0x4d,0x57,0x28,0x74,0xd2,0x34,0xff,0x30
+,0xb6,0xee,0xf6,0x62,0x30,0x14,0x8c,0x2c
+,0xeb,0x02,0x03,0x01,0x00,0x01,0xa3,0x81
+,0xb9,0x30,0x81,0xb6,0x30,0x0b,0x06,0x03
+,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01
+,0xc6,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x89,0x82,0x67
+,0x7d,0xc4,0x9d,0x26,0x70,0x00,0x4b,0xb4
+,0x50,0x48,0x7c,0xde,0x3d,0xae,0x04,0x6e
+,0x7d,0x30,0x58,0x06,0x03,0x55,0x1d,0x1f
+,0x04,0x51,0x30,0x4f,0x30,0x4d,0xa0,0x4b
+,0xa0,0x49,0x86,0x47,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x75
+,0x73,0x65,0x72,0x74,0x72,0x75,0x73,0x74
+,0x2e,0x63,0x6f,0x6d,0x2f,0x55,0x54,0x4e
+,0x2d,0x55,0x53,0x45,0x52,0x46,0x69,0x72
+,0x73,0x74,0x2d,0x43,0x6c,0x69,0x65,0x6e
+,0x74,0x41,0x75,0x74,0x68,0x65,0x6e,0x74
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x61
+,0x6e,0x64,0x45,0x6d,0x61,0x69,0x6c,0x2e
+,0x63,0x72,0x6c,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x25,0x04,0x16,0x30,0x14,0x06,0x08
+,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x02
+,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07
+,0x03,0x04,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0xb1,0x6d
+,0x61,0x5d,0xa6,0x1a,0x7f,0x7c,0xab,0x4a
+,0xe4,0x30,0xfc,0x53,0x6f,0x25,0x24,0xc6
+,0xca,0xed,0xe2,0x31,0x5c,0x2b,0x0e,0xee
+,0xee,0x61,0x55,0x6f,0x04,0x3e,0xcf,0x39
+,0xde,0xc5,0x1b,0x49,0x94,0xe4,0xeb,0x20
+,0x4c,0xb4,0xe6,0x9e,0x50,0x2e,0x72,0xd9
+,0x8d,0xf5,0xaa,0xa3,0xb3,0x4a,0xda,0x56
+,0x1c,0x60,0x97,0x80,0xdc,0x82,0xa2,0xad
+,0x4a,0xbd,0x8a,0x2b,0xff,0x0b,0x09,0xb4
+,0xc6,0xd7,0x20,0x04,0x45,0xe4,0xcd,0x80
+,0x01,0xba,0xba,0x2b,0x6e,0xce,0xaa,0xd7
+,0x92,0xfe,0xe4,0xaf,0xeb,0xf4,0x26,0x1d
+,0x16,0x2a,0x7f,0x6c,0x30,0x95,0x37,0x2f
+,0x33,0x12,0xac,0x7f,0xdd,0xc7,0xd1,0x11
+,0x8c,0x51,0x98,0xb2,0xd0,0xa3,0x91,0xd0
+,0xad,0xf6,0x9f,0x9e,0x83,0x93,0x1e,0x1d
+,0x42,0xb8,0x46,0xaf,0x6b,0x66,0xf0,0x9b
+,0x7f,0xea,0xe3,0x03,0x02,0xe5,0x02,0x51
+,0xc1,0xaa,0xd5,0x35,0x9d,0x72,0x40,0x03
+,0x89,0xba,0x31,0x1d,0xc5,0x10,0x68,0x52
+,0x9e,0xdf,0xa2,0x85,0xc5,0x5c,0x08,0xa6
+,0x78,0xe6,0x53,0x4f,0xb1,0xe8,0xb7,0xd3
+,0x14,0x9e,0x93,0xa6,0xc3,0x64,0xe3,0xac
+,0x7e,0x71,0xcd,0xbc,0x9f,0xe9,0x03,0x1b
+,0xcc,0xfb,0xe9,0xac,0x31,0xc1,0xaf,0x7c
+,0x15,0x74,0x02,0x99,0xc3,0xb2,0x47,0xa6
+,0xc2,0x32,0x61,0xd7,0xc7,0x6f,0x48,0x24
+,0x51,0x27,0xa1,0xd5,0x87,0x55,0xf2,0x7b
+,0x8f,0x98,0x3d,0x16,0x9e,0xee,0x75,0xb6
+,0xf8,0xd0,0x8e,0xf2,0xf3,0xc6,0xae,0x28
+,0x5b,0xa7,0xf0,0xf3,0x36,0x17,0xfc,0xc3
+,0x05,0xd3,0xca,0x03,0x4a,0x54};
+const unsigned int NptTlsTrustAnchor_Base_0085_Size = 1190;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0086.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0086.cpp
new file mode 100644
index 0000000..72141b7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0086.cpp
@@ -0,0 +1,180 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* UTN USERFirst Hardware Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0086_Data[1144] = {
+0x30,0x82,0x04,0x74,0x30,0x82,0x03,0x5c
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x44
+,0xbe,0x0c,0x8b,0x50,0x00,0x24,0xb4,0x11
+,0xd3,0x36,0x2a,0xfe,0x65,0x0a,0xfd,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0x97,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x08,0x13
+,0x02,0x55,0x54,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x07,0x13,0x0e,0x53,0x61
+,0x6c,0x74,0x20,0x4c,0x61,0x6b,0x65,0x20
+,0x43,0x69,0x74,0x79,0x31,0x1e,0x30,0x1c
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x54
+,0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54
+,0x52,0x55,0x53,0x54,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x21,0x30,0x1f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x18,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x75,0x73,0x65,0x72,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x31
+,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04,0x03
+,0x13,0x16,0x55,0x54,0x4e,0x2d,0x55,0x53
+,0x45,0x52,0x46,0x69,0x72,0x73,0x74,0x2d
+,0x48,0x61,0x72,0x64,0x77,0x61,0x72,0x65
+,0x30,0x1e,0x17,0x0d,0x39,0x39,0x30,0x37
+,0x30,0x39,0x31,0x38,0x31,0x30,0x34,0x32
+,0x5a,0x17,0x0d,0x31,0x39,0x30,0x37,0x30
+,0x39,0x31,0x38,0x31,0x39,0x32,0x32,0x5a
+,0x30,0x81,0x97,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x08,0x13,0x02,0x55,0x54,0x31,0x17,0x30
+,0x15,0x06,0x03,0x55,0x04,0x07,0x13,0x0e
+,0x53,0x61,0x6c,0x74,0x20,0x4c,0x61,0x6b
+,0x65,0x20,0x43,0x69,0x74,0x79,0x31,0x1e
+,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x15,0x54,0x68,0x65,0x20,0x55,0x53,0x45
+,0x52,0x54,0x52,0x55,0x53,0x54,0x20,0x4e
+,0x65,0x74,0x77,0x6f,0x72,0x6b,0x31,0x21
+,0x30,0x1f,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x18,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x77,0x77,0x77,0x2e,0x75,0x73,0x65,0x72
+,0x74,0x72,0x75,0x73,0x74,0x2e,0x63,0x6f
+,0x6d,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55
+,0x04,0x03,0x13,0x16,0x55,0x54,0x4e,0x2d
+,0x55,0x53,0x45,0x52,0x46,0x69,0x72,0x73
+,0x74,0x2d,0x48,0x61,0x72,0x64,0x77,0x61
+,0x72,0x65,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xb1,0xf7,0xc3,0x38,0x3f
+,0xb4,0xa8,0x7f,0xcf,0x39,0x82,0x51,0x67
+,0xd0,0x6d,0x9f,0xd2,0xff,0x58,0xf3,0xe7
+,0x9f,0x2b,0xec,0x0d,0x89,0x54,0x99,0xb9
+,0x38,0x99,0x16,0xf7,0xe0,0x21,0x79,0x48
+,0xc2,0xbb,0x61,0x74,0x12,0x96,0x1d,0x3c
+,0x6a,0x72,0xd5,0x3c,0x10,0x67,0x3a,0x39
+,0xed,0x2b,0x13,0xcd,0x66,0xeb,0x95,0x09
+,0x33,0xa4,0x6c,0x97,0xb1,0xe8,0xc6,0xec
+,0xc1,0x75,0x79,0x9c,0x46,0x5e,0x8d,0xab
+,0xd0,0x6a,0xfd,0xb9,0x2a,0x55,0x17,0x10
+,0x54,0xb3,0x19,0xf0,0x9a,0xf6,0xf1,0xb1
+,0x5d,0xb6,0xa7,0x6d,0xfb,0xe0,0x71,0x17
+,0x6b,0xa2,0x88,0xfb,0x00,0xdf,0xfe,0x1a
+,0x31,0x77,0x0c,0x9a,0x01,0x7a,0xb1,0x32
+,0xe3,0x2b,0x01,0x07,0x38,0x6e,0xc3,0xa5
+,0x5e,0x23,0xbc,0x45,0x9b,0x7b,0x50,0xc1
+,0xc9,0x30,0x8f,0xdb,0xe5,0x2b,0x7a,0xd3
+,0x5b,0xfb,0x33,0x40,0x1e,0xa0,0xd5,0x98
+,0x17,0xbc,0x8b,0x87,0xc3,0x89,0xd3,0x5d
+,0xa0,0x8e,0xb2,0xaa,0xaa,0xf6,0x8e,0x69
+,0x88,0x06,0xc5,0xfa,0x89,0x21,0xf3,0x08
+,0x9d,0x69,0x2e,0x09,0x33,0x9b,0x29,0x0d
+,0x46,0x0f,0x8c,0xcc,0x49,0x34,0xb0,0x69
+,0x51,0xbd,0xf9,0x06,0xcd,0x68,0xad,0x66
+,0x4c,0xbc,0x3e,0xac,0x61,0xbd,0x0a,0x88
+,0x0e,0xc8,0xdf,0x3d,0xee,0x7c,0x04,0x4c
+,0x9d,0x0a,0x5e,0x6b,0x91,0xd6,0xee,0xc7
+,0xed,0x28,0x8d,0xab,0x4d,0x87,0x89,0x73
+,0xd0,0x6e,0xa4,0xd0,0x1e,0x16,0x8b,0x14
+,0xe1,0x76,0x44,0x03,0x7f,0x63,0xac,0xe4
+,0xcd,0x49,0x9c,0xc5,0x92,0xf4,0xab,0x32
+,0xa1,0x48,0x5b,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x81,0xb9,0x30,0x81,0xb6,0x30,0x0b
+,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03
+,0x02,0x01,0xc6,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0xa1
+,0x72,0x5f,0x26,0x1b,0x28,0x98,0x43,0x95
+,0x5d,0x07,0x37,0xd5,0x85,0x96,0x9d,0x4b
+,0xd2,0xc3,0x45,0x30,0x44,0x06,0x03,0x55
+,0x1d,0x1f,0x04,0x3d,0x30,0x3b,0x30,0x39
+,0xa0,0x37,0xa0,0x35,0x86,0x33,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c
+,0x2e,0x75,0x73,0x65,0x72,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x55
+,0x54,0x4e,0x2d,0x55,0x53,0x45,0x52,0x46
+,0x69,0x72,0x73,0x74,0x2d,0x48,0x61,0x72
+,0x64,0x77,0x61,0x72,0x65,0x2e,0x63,0x72
+,0x6c,0x30,0x31,0x06,0x03,0x55,0x1d,0x25
+,0x04,0x2a,0x30,0x28,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x03,0x01,0x06,0x08
+,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x05
+,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07
+,0x03,0x06,0x06,0x08,0x2b,0x06,0x01,0x05
+,0x05,0x07,0x03,0x07,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0x47,0x19,0x0f,0xde,0x74,0xc6,0x99,0x97
+,0xaf,0xfc,0xad,0x28,0x5e,0x75,0x8e,0xeb
+,0x2d,0x67,0xee,0x4e,0x7b,0x2b,0xd7,0x0c
+,0xff,0xf6,0xde,0xcb,0x55,0xa2,0x0a,0xe1
+,0x4c,0x54,0x65,0x93,0x60,0x6b,0x9f,0x12
+,0x9c,0xad,0x5e,0x83,0x2c,0xeb,0x5a,0xae
+,0xc0,0xe4,0x2d,0xf4,0x00,0x63,0x1d,0xb8
+,0xc0,0x6c,0xf2,0xcf,0x49,0xbb,0x4d,0x93
+,0x6f,0x06,0xa6,0x0a,0x22,0xb2,0x49,0x62
+,0x08,0x4e,0xff,0xc8,0xc8,0x14,0xb2,0x88
+,0x16,0x5d,0xe7,0x01,0xe4,0x12,0x95,0xe5
+,0x45,0x34,0xb3,0x8b,0x69,0xbd,0xcf,0xb4
+,0x85,0x8f,0x75,0x51,0x9e,0x7d,0x3a,0x38
+,0x3a,0x14,0x48,0x12,0xc6,0xfb,0xa7,0x3b
+,0x1a,0x8d,0x0d,0x82,0x40,0x07,0xe8,0x04
+,0x08,0x90,0xa1,0x89,0xcb,0x19,0x50,0xdf
+,0xca,0x1c,0x01,0xbc,0x1d,0x04,0x19,0x7b
+,0x10,0x76,0x97,0x3b,0xee,0x90,0x90,0xca
+,0xc4,0x0e,0x1f,0x16,0x6e,0x75,0xef,0x33
+,0xf8,0xd3,0x6f,0x5b,0x1e,0x96,0xe3,0xe0
+,0x74,0x77,0x74,0x7b,0x8a,0xa2,0x6e,0x2d
+,0xdd,0x76,0xd6,0x39,0x30,0x82,0xf0,0xab
+,0x9c,0x52,0xf2,0x2a,0xc7,0xaf,0x49,0x5e
+,0x7e,0xc7,0x68,0xe5,0x82,0x81,0xc8,0x6a
+,0x27,0xf9,0x27,0x88,0x2a,0xd5,0x58,0x50
+,0x95,0x1f,0xf0,0x3b,0x1c,0x57,0xbb,0x7d
+,0x14,0x39,0x62,0x2b,0x9a,0xc9,0x94,0x92
+,0x2a,0xa3,0x22,0x0c,0xff,0x89,0x26,0x7d
+,0x5f,0x23,0x2b,0x47,0xd7,0x15,0x1d,0xa9
+,0x6a,0x9e,0x51,0x0d,0x2a,0x51,0x9e,0x81
+,0xf9,0xd4,0x3b,0x5e,0x70,0x12,0x7f,0x10
+,0x32,0x9c,0x1e,0xbb,0x9d,0xf8,0x66,0xa8
+};
+const unsigned int NptTlsTrustAnchor_Base_0086_Size = 1144;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0087.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0087.cpp
new file mode 100644
index 0000000..96d5743
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0087.cpp
@@ -0,0 +1,178 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* UTN USERFirst Object Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0087_Data[1130] = {
+0x30,0x82,0x04,0x66,0x30,0x82,0x03,0x4e
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x44
+,0xbe,0x0c,0x8b,0x50,0x00,0x24,0xb4,0x11
+,0xd3,0x36,0x2d,0xe0,0xb3,0x5f,0x1b,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0x95,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x08,0x13
+,0x02,0x55,0x54,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x07,0x13,0x0e,0x53,0x61
+,0x6c,0x74,0x20,0x4c,0x61,0x6b,0x65,0x20
+,0x43,0x69,0x74,0x79,0x31,0x1e,0x30,0x1c
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x54
+,0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54
+,0x52,0x55,0x53,0x54,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x21,0x30,0x1f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x18,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x75,0x73,0x65,0x72,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x31
+,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x03
+,0x13,0x14,0x55,0x54,0x4e,0x2d,0x55,0x53
+,0x45,0x52,0x46,0x69,0x72,0x73,0x74,0x2d
+,0x4f,0x62,0x6a,0x65,0x63,0x74,0x30,0x1e
+,0x17,0x0d,0x39,0x39,0x30,0x37,0x30,0x39
+,0x31,0x38,0x33,0x31,0x32,0x30,0x5a,0x17
+,0x0d,0x31,0x39,0x30,0x37,0x30,0x39,0x31
+,0x38,0x34,0x30,0x33,0x36,0x5a,0x30,0x81
+,0x95,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x08,0x13
+,0x02,0x55,0x54,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x07,0x13,0x0e,0x53,0x61
+,0x6c,0x74,0x20,0x4c,0x61,0x6b,0x65,0x20
+,0x43,0x69,0x74,0x79,0x31,0x1e,0x30,0x1c
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x54
+,0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54
+,0x52,0x55,0x53,0x54,0x20,0x4e,0x65,0x74
+,0x77,0x6f,0x72,0x6b,0x31,0x21,0x30,0x1f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x18,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x75,0x73,0x65,0x72,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x31
+,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x03
+,0x13,0x14,0x55,0x54,0x4e,0x2d,0x55,0x53
+,0x45,0x52,0x46,0x69,0x72,0x73,0x74,0x2d
+,0x4f,0x62,0x6a,0x65,0x63,0x74,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xce
+,0xaa,0x81,0x3f,0xa3,0xa3,0x61,0x78,0xaa
+,0x31,0x00,0x55,0x95,0x11,0x9e,0x27,0x0f
+,0x1f,0x1c,0xdf,0x3a,0x9b,0x82,0x68,0x30
+,0xc0,0x4a,0x61,0x1d,0xf1,0x2f,0x0e,0xfa
+,0xbe,0x79,0xf7,0xa5,0x23,0xef,0x55,0x51
+,0x96,0x84,0xcd,0xdb,0xe3,0xb9,0x6e,0x3e
+,0x31,0xd8,0x0a,0x20,0x67,0xc7,0xf4,0xd9
+,0xbf,0x94,0xeb,0x47,0x04,0x3e,0x02,0xce
+,0x2a,0xa2,0x5d,0x87,0x04,0x09,0xf6,0x30
+,0x9d,0x18,0x8a,0x97,0xb2,0xaa,0x1c,0xfc
+,0x41,0xd2,0xa1,0x36,0xcb,0xfb,0x3d,0x91
+,0xba,0xe7,0xd9,0x70,0x35,0xfa,0xe4,0xe7
+,0x90,0xc3,0x9b,0xa3,0x9b,0xd3,0x3c,0xf5
+,0x12,0x99,0x77,0xb1,0xb7,0x09,0xe0,0x68
+,0xe6,0x1c,0xb8,0xf3,0x94,0x63,0x88,0x6a
+,0x6a,0xfe,0x0b,0x76,0xc9,0xbe,0xf4,0x22
+,0xe4,0x67,0xb9,0xab,0x1a,0x5e,0x77,0xc1
+,0x85,0x07,0xdd,0x0d,0x6c,0xbf,0xee,0x06
+,0xc7,0x77,0x6a,0x41,0x9e,0xa7,0x0f,0xd7
+,0xfb,0xee,0x94,0x17,0xb7,0xfc,0x85,0xbe
+,0xa4,0xab,0xc4,0x1c,0x31,0xdd,0xd7,0xb6
+,0xd1,0xe4,0xf0,0xef,0xdf,0x16,0x8f,0xb2
+,0x52,0x93,0xd7,0xa1,0xd4,0x89,0xa1,0x07
+,0x2e,0xbf,0xe1,0x01,0x12,0x42,0x1e,0x1a
+,0xe1,0xd8,0x95,0x34,0xdb,0x64,0x79,0x28
+,0xff,0xba,0x2e,0x11,0xc2,0xe5,0xe8,0x5b
+,0x92,0x48,0xfb,0x47,0x0b,0xc2,0x6c,0xda
+,0xad,0x32,0x83,0x41,0xf3,0xa5,0xe5,0x41
+,0x70,0xfd,0x65,0x90,0x6d,0xfa,0xfa,0x51
+,0xc4,0xf9,0xbd,0x96,0x2b,0x19,0x04,0x2c
+,0xd3,0x6d,0xa7,0xdc,0xf0,0x7f,0x6f,0x83
+,0x65,0xe2,0x6a,0xab,0x87,0x86,0x75,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x81,0xaf,0x30
+,0x81,0xac,0x30,0x0b,0x06,0x03,0x55,0x1d
+,0x0f,0x04,0x04,0x03,0x02,0x01,0xc6,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0xda,0xed,0x64,0x74,0x14
+,0x9c,0x14,0x3c,0xab,0xdd,0x99,0xa9,0xbd
+,0x5b,0x28,0x4d,0x8b,0x3c,0xc9,0xd8,0x30
+,0x42,0x06,0x03,0x55,0x1d,0x1f,0x04,0x3b
+,0x30,0x39,0x30,0x37,0xa0,0x35,0xa0,0x33
+,0x86,0x31,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x63,0x72,0x6c,0x2e,0x75,0x73,0x65
+,0x72,0x74,0x72,0x75,0x73,0x74,0x2e,0x63
+,0x6f,0x6d,0x2f,0x55,0x54,0x4e,0x2d,0x55
+,0x53,0x45,0x52,0x46,0x69,0x72,0x73,0x74
+,0x2d,0x4f,0x62,0x6a,0x65,0x63,0x74,0x2e
+,0x63,0x72,0x6c,0x30,0x29,0x06,0x03,0x55
+,0x1d,0x25,0x04,0x22,0x30,0x20,0x06,0x08
+,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x03
+,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07
+,0x03,0x08,0x06,0x0a,0x2b,0x06,0x01,0x04
+,0x01,0x82,0x37,0x0a,0x03,0x04,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01
+,0x01,0x00,0x08,0x1f,0x52,0xb1,0x37,0x44
+,0x78,0xdb,0xfd,0xce,0xb9,0xda,0x95,0x96
+,0x98,0xaa,0x55,0x64,0x80,0xb5,0x5a,0x40
+,0xdd,0x21,0xa5,0xc5,0xc1,0xf3,0x5f,0x2c
+,0x4c,0xc8,0x47,0x5a,0x69,0xea,0xe8,0xf0
+,0x35,0x35,0xf4,0xd0,0x25,0xf3,0xc8,0xa6
+,0xa4,0x87,0x4a,0xbd,0x1b,0xb1,0x73,0x08
+,0xbd,0xd4,0xc3,0xca,0xb6,0x35,0xbb,0x59
+,0x86,0x77,0x31,0xcd,0xa7,0x80,0x14,0xae
+,0x13,0xef,0xfc,0xb1,0x48,0xf9,0x6b,0x25
+,0x25,0x2d,0x51,0xb6,0x2c,0x6d,0x45,0xc1
+,0x98,0xc8,0x8a,0x56,0x5d,0x3e,0xee,0x43
+,0x4e,0x3e,0x6b,0x27,0x8e,0xd0,0x3a,0x4b
+,0x85,0x0b,0x5f,0xd3,0xed,0x6a,0xa7,0x75
+,0xcb,0xd1,0x5a,0x87,0x2f,0x39,0x75,0x13
+,0x5a,0x72,0xb0,0x02,0x81,0x9f,0xbe,0xf0
+,0x0f,0x84,0x54,0x20,0x62,0x6c,0x69,0xd4
+,0xe1,0x4d,0xc6,0x0d,0x99,0x43,0x01,0x0d
+,0x12,0x96,0x8c,0x78,0x9d,0xbf,0x50,0xa2
+,0xb1,0x44,0xaa,0x6a,0xcf,0x17,0x7a,0xcf
+,0x6f,0x0f,0xd4,0xf8,0x24,0x55,0x5f,0xf0
+,0x34,0x16,0x49,0x66,0x3e,0x50,0x46,0xc9
+,0x63,0x71,0x38,0x31,0x62,0xb8,0x62,0xb9
+,0xf3,0x53,0xad,0x6c,0xb5,0x2b,0xa2,0x12
+,0xaa,0x19,0x4f,0x09,0xda,0x5e,0xe7,0x93
+,0xc6,0x8e,0x14,0x08,0xfe,0xf0,0x30,0x80
+,0x18,0xa0,0x86,0x85,0x4d,0xc8,0x7d,0xd7
+,0x8b,0x03,0xfe,0x6e,0xd5,0xf7,0x9d,0x16
+,0xac,0x92,0x2c,0xa0,0x23,0xe5,0x9c,0x91
+,0x52,0x1f,0x94,0xdf,0x17,0x94,0x73,0xc3
+,0xb3,0xc1,0xc1,0x71,0x05,0x20,0x00,0x78
+,0xbd,0x13,0x52,0x1d,0xa8,0x3e,0xcd,0x00
+,0x1f,0xc8};
+const unsigned int NptTlsTrustAnchor_Base_0087_Size = 1130;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0088.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0088.cpp
new file mode 100644
index 0000000..d0aacd8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0088.cpp
@@ -0,0 +1,189 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Camerfirma Chambers of Commerce Root */
+const unsigned char NptTlsTrustAnchor_Base_0088_Data[1217] = {
+0x30,0x82,0x04,0xbd,0x30,0x82,0x03,0xa5
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x7f,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x45,0x55,0x31,0x27
+,0x30,0x25,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x1e,0x41,0x43,0x20,0x43,0x61,0x6d,0x65
+,0x72,0x66,0x69,0x72,0x6d,0x61,0x20,0x53
+,0x41,0x20,0x43,0x49,0x46,0x20,0x41,0x38
+,0x32,0x37,0x34,0x33,0x32,0x38,0x37,0x31
+,0x23,0x30,0x21,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x1a,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x63,0x68,0x61
+,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e
+,0x2e,0x6f,0x72,0x67,0x31,0x22,0x30,0x20
+,0x06,0x03,0x55,0x04,0x03,0x13,0x19,0x43
+,0x68,0x61,0x6d,0x62,0x65,0x72,0x73,0x20
+,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x6d,0x65
+,0x72,0x63,0x65,0x20,0x52,0x6f,0x6f,0x74
+,0x30,0x1e,0x17,0x0d,0x30,0x33,0x30,0x39
+,0x33,0x30,0x31,0x36,0x31,0x33,0x34,0x33
+,0x5a,0x17,0x0d,0x33,0x37,0x30,0x39,0x33
+,0x30,0x31,0x36,0x31,0x33,0x34,0x34,0x5a
+,0x30,0x7f,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x45,0x55,0x31
+,0x27,0x30,0x25,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x1e,0x41,0x43,0x20,0x43,0x61,0x6d
+,0x65,0x72,0x66,0x69,0x72,0x6d,0x61,0x20
+,0x53,0x41,0x20,0x43,0x49,0x46,0x20,0x41
+,0x38,0x32,0x37,0x34,0x33,0x32,0x38,0x37
+,0x31,0x23,0x30,0x21,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x1a,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x63,0x68
+,0x61,0x6d,0x62,0x65,0x72,0x73,0x69,0x67
+,0x6e,0x2e,0x6f,0x72,0x67,0x31,0x22,0x30
+,0x20,0x06,0x03,0x55,0x04,0x03,0x13,0x19
+,0x43,0x68,0x61,0x6d,0x62,0x65,0x72,0x73
+,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x6d
+,0x65,0x72,0x63,0x65,0x20,0x52,0x6f,0x6f
+,0x74,0x30,0x82,0x01,0x20,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0d
+,0x00,0x30,0x82,0x01,0x08,0x02,0x82,0x01
+,0x01,0x00,0xb7,0x36,0x55,0xe5,0xa5,0x5d
+,0x18,0x30,0xe0,0xda,0x89,0x54,0x91,0xfc
+,0xc8,0xc7,0x52,0xf8,0x2f,0x50,0xd9,0xef
+,0xb1,0x75,0x73,0x65,0x47,0x7d,0x1b,0x5b
+,0xba,0x75,0xc5,0xfc,0xa1,0x88,0x24,0xfa
+,0x2f,0xed,0xca,0x08,0x4a,0x39,0x54,0xc4
+,0x51,0x7a,0xb5,0xda,0x60,0xea,0x38,0x3c
+,0x81,0xb2,0xcb,0xf1,0xbb,0xd9,0x91,0x23
+,0x3f,0x48,0x01,0x70,0x75,0xa9,0x05,0x2a
+,0xad,0x1f,0x71,0xf3,0xc9,0x54,0x3d,0x1d
+,0x06,0x6a,0x40,0x3e,0xb3,0x0c,0x85,0xee
+,0x5c,0x1b,0x79,0xc2,0x62,0xc4,0xb8,0x36
+,0x8e,0x35,0x5d,0x01,0x0c,0x23,0x04,0x47
+,0x35,0xaa,0x9b,0x60,0x4e,0xa0,0x66,0x3d
+,0xcb,0x26,0x0a,0x9c,0x40,0xa1,0xf4,0x5d
+,0x98,0xbf,0x71,0xab,0xa5,0x00,0x68,0x2a
+,0xed,0x83,0x7a,0x0f,0xa2,0x14,0xb5,0xd4
+,0x22,0xb3,0x80,0xb0,0x3c,0x0c,0x5a,0x51
+,0x69,0x2d,0x58,0x18,0x8f,0xed,0x99,0x9e
+,0xf1,0xae,0xe2,0x95,0xe6,0xf6,0x47,0xa8
+,0xd6,0x0c,0x0f,0xb0,0x58,0x58,0xdb,0xc3
+,0x66,0x37,0x9e,0x9b,0x91,0x54,0x33,0x37
+,0xd2,0x94,0x1c,0x6a,0x48,0xc9,0xc9,0xf2
+,0xa5,0xda,0xa5,0x0c,0x23,0xf7,0x23,0x0e
+,0x9c,0x32,0x55,0x5e,0x71,0x9c,0x84,0x05
+,0x51,0x9a,0x2d,0xfd,0xe6,0x4e,0x2a,0x34
+,0x5a,0xde,0xca,0x40,0x37,0x67,0x0c,0x54
+,0x21,0x55,0x77,0xda,0x0a,0x0c,0xcc,0x97
+,0xae,0x80,0xdc,0x94,0x36,0x4a,0xf4,0x3e
+,0xce,0x36,0x13,0x1e,0x53,0xe4,0xac,0x4e
+,0x3a,0x05,0xec,0xdb,0xae,0x72,0x9c,0x38
+,0x8b,0xd0,0x39,0x3b,0x89,0x0a,0x3e,0x77
+,0xfe,0x75,0x02,0x01,0x03,0xa3,0x82,0x01
+,0x44,0x30,0x82,0x01,0x40,0x30,0x12,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x08,0x30,0x06,0x01,0x01,0xff,0x02,0x01
+,0x0c,0x30,0x3c,0x06,0x03,0x55,0x1d,0x1f
+,0x04,0x35,0x30,0x33,0x30,0x31,0xa0,0x2f
+,0xa0,0x2d,0x86,0x2b,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x63
+,0x68,0x61,0x6d,0x62,0x65,0x72,0x73,0x69
+,0x67,0x6e,0x2e,0x6f,0x72,0x67,0x2f,0x63
+,0x68,0x61,0x6d,0x62,0x65,0x72,0x73,0x72
+,0x6f,0x6f,0x74,0x2e,0x63,0x72,0x6c,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0xe3,0x94,0xf5,0xb1,0x4d,0xe9
+,0xdb,0xa1,0x29,0x5b,0x57,0x8b,0x4d,0x76
+,0x06,0x76,0xe1,0xd1,0xa2,0x8a,0x30,0x0e
+,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff
+,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x11
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x00
+,0x07,0x30,0x27,0x06,0x03,0x55,0x1d,0x11
+,0x04,0x20,0x30,0x1e,0x81,0x1c,0x63,0x68
+,0x61,0x6d,0x62,0x65,0x72,0x73,0x72,0x6f
+,0x6f,0x74,0x40,0x63,0x68,0x61,0x6d,0x62
+,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6f
+,0x72,0x67,0x30,0x27,0x06,0x03,0x55,0x1d
+,0x12,0x04,0x20,0x30,0x1e,0x81,0x1c,0x63
+,0x68,0x61,0x6d,0x62,0x65,0x72,0x73,0x72
+,0x6f,0x6f,0x74,0x40,0x63,0x68,0x61,0x6d
+,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e
+,0x6f,0x72,0x67,0x30,0x58,0x06,0x03,0x55
+,0x1d,0x20,0x04,0x51,0x30,0x4f,0x30,0x4d
+,0x06,0x0b,0x2b,0x06,0x01,0x04,0x01,0x81
+,0x87,0x2e,0x0a,0x03,0x01,0x30,0x3e,0x30
+,0x3c,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x02,0x01,0x16,0x30,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x63,0x70,0x73,0x2e
+,0x63,0x68,0x61,0x6d,0x62,0x65,0x72,0x73
+,0x69,0x67,0x6e,0x2e,0x6f,0x72,0x67,0x2f
+,0x63,0x70,0x73,0x2f,0x63,0x68,0x61,0x6d
+,0x62,0x65,0x72,0x73,0x72,0x6f,0x6f,0x74
+,0x2e,0x68,0x74,0x6d,0x6c,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0x0c,0x41,0x97,0xc2,0x1a,0x86,0xc0
+,0x22,0x7c,0x9f,0xfb,0x90,0xf3,0x1a,0xd1
+,0x03,0xb1,0xef,0x13,0xf9,0x21,0x5f,0x04
+,0x9c,0xda,0xc9,0xa5,0x8d,0x27,0x6c,0x96
+,0x87,0x91,0xbe,0x41,0x90,0x01,0x72,0x93
+,0xe7,0x1e,0x7d,0x5f,0xf6,0x89,0xc6,0x5d
+,0xa7,0x40,0x09,0x3d,0xac,0x49,0x45,0x45
+,0xdc,0x2e,0x8d,0x30,0x68,0xb2,0x09,0xba
+,0xfb,0xc3,0x2f,0xcc,0xba,0x0b,0xdf,0x3f
+,0x77,0x7b,0x46,0x7d,0x3a,0x12,0x24,0x8e
+,0x96,0x8f,0x3c,0x05,0x0a,0x6f,0xd2,0x94
+,0x28,0x1d,0x6d,0x0c,0xc0,0x2e,0x88,0x22
+,0xd5,0xd8,0xcf,0x1d,0x13,0xc7,0xf0,0x48
+,0xd7,0xd7,0x05,0xa7,0xcf,0xc7,0x47,0x9e
+,0x3b,0x3c,0x34,0xc8,0x80,0x4f,0xd4,0x14
+,0xbb,0xfc,0x0d,0x50,0xf7,0xfa,0xb3,0xec
+,0x42,0x5f,0xa9,0xdd,0x6d,0xc8,0xf4,0x75
+,0xcf,0x7b,0xc1,0x72,0x26,0xb1,0x01,0x1c
+,0x5c,0x2c,0xfd,0x7a,0x4e,0xb4,0x01,0xc5
+,0x05,0x57,0xb9,0xe7,0x3c,0xaa,0x05,0xd9
+,0x88,0xe9,0x07,0x46,0x41,0xce,0xef,0x41
+,0x81,0xae,0x58,0xdf,0x83,0xa2,0xae,0xca
+,0xd7,0x77,0x1f,0xe7,0x00,0x3c,0x9d,0x6f
+,0x8e,0xe4,0x32,0x09,0x1d,0x4d,0x78,0x34
+,0x78,0x34,0x3c,0x94,0x9b,0x26,0xed,0x4f
+,0x71,0xc6,0x19,0x7a,0xbd,0x20,0x22,0x48
+,0x5a,0xfe,0x4b,0x7d,0x03,0xb7,0xe7,0x58
+,0xbe,0xc6,0x32,0x4e,0x74,0x1e,0x68,0xdd
+,0xa8,0x68,0x5b,0xb3,0x3e,0xee,0x62,0x7d
+,0xd9,0x80,0xe8,0x0a,0x75,0x7a,0xb7,0xee
+,0xb4,0x65,0x9a,0x21,0x90,0xe0,0xaa,0xd0
+,0x98,0xbc,0x38,0xb5,0x73,0x3c,0x8b,0xf8
+,0xdc};
+const unsigned int NptTlsTrustAnchor_Base_0088_Size = 1217;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0089.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0089.cpp
new file mode 100644
index 0000000..989b3a9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0089.cpp
@@ -0,0 +1,190 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Camerfirma Global Chambersign Root */
+const unsigned char NptTlsTrustAnchor_Base_0089_Data[1225] = {
+0x30,0x82,0x04,0xc5,0x30,0x82,0x03,0xad
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x7d,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x45,0x55,0x31,0x27
+,0x30,0x25,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x1e,0x41,0x43,0x20,0x43,0x61,0x6d,0x65
+,0x72,0x66,0x69,0x72,0x6d,0x61,0x20,0x53
+,0x41,0x20,0x43,0x49,0x46,0x20,0x41,0x38
+,0x32,0x37,0x34,0x33,0x32,0x38,0x37,0x31
+,0x23,0x30,0x21,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x1a,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x2e,0x63,0x68,0x61
+,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e
+,0x2e,0x6f,0x72,0x67,0x31,0x20,0x30,0x1e
+,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x47
+,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x43,0x68
+,0x61,0x6d,0x62,0x65,0x72,0x73,0x69,0x67
+,0x6e,0x20,0x52,0x6f,0x6f,0x74,0x30,0x1e
+,0x17,0x0d,0x30,0x33,0x30,0x39,0x33,0x30
+,0x31,0x36,0x31,0x34,0x31,0x38,0x5a,0x17
+,0x0d,0x33,0x37,0x30,0x39,0x33,0x30,0x31
+,0x36,0x31,0x34,0x31,0x38,0x5a,0x30,0x7d
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x45,0x55,0x31,0x27,0x30
+,0x25,0x06,0x03,0x55,0x04,0x0a,0x13,0x1e
+,0x41,0x43,0x20,0x43,0x61,0x6d,0x65,0x72
+,0x66,0x69,0x72,0x6d,0x61,0x20,0x53,0x41
+,0x20,0x43,0x49,0x46,0x20,0x41,0x38,0x32
+,0x37,0x34,0x33,0x32,0x38,0x37,0x31,0x23
+,0x30,0x21,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x1a,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x77,0x77,0x77,0x2e,0x63,0x68,0x61,0x6d
+,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e
+,0x6f,0x72,0x67,0x31,0x20,0x30,0x1e,0x06
+,0x03,0x55,0x04,0x03,0x13,0x17,0x47,0x6c
+,0x6f,0x62,0x61,0x6c,0x20,0x43,0x68,0x61
+,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e
+,0x20,0x52,0x6f,0x6f,0x74,0x30,0x82,0x01
+,0x20,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x01,0x0d,0x00,0x30,0x82,0x01
+,0x08,0x02,0x82,0x01,0x01,0x00,0xa2,0x70
+,0xa2,0xd0,0x9f,0x42,0xae,0x5b,0x17,0xc7
+,0xd8,0x7d,0xcf,0x14,0x83,0xfc,0x4f,0xc9
+,0xa1,0xb7,0x13,0xaf,0x8a,0xd7,0x9e,0x3e
+,0x04,0x0a,0x92,0x8b,0x60,0x56,0xfa,0xb4
+,0x32,0x2f,0x88,0x4d,0xa1,0x60,0x08,0xf4
+,0xb7,0x09,0x4e,0xa0,0x49,0x2f,0x49,0xd6
+,0xd3,0xdf,0x9d,0x97,0x5a,0x9f,0x94,0x04
+,0x70,0xec,0x3f,0x59,0xd9,0xb7,0xcc,0x66
+,0x8b,0x98,0x52,0x28,0x09,0x02,0xdf,0xc5
+,0x2f,0x84,0x8d,0x7a,0x97,0x77,0xbf,0xec
+,0x40,0x9d,0x25,0x72,0xab,0xb5,0x3f,0x32
+,0x98,0xfb,0xb7,0xb7,0xfc,0x72,0x84,0xe5
+,0x35,0x87,0xf9,0x55,0xfa,0xa3,0x1f,0x0e
+,0x6f,0x2e,0x28,0xdd,0x69,0xa0,0xd9,0x42
+,0x10,0xc6,0xf8,0xb5,0x44,0xc2,0xd0,0x43
+,0x7f,0xdb,0xbc,0xe4,0xa2,0x3c,0x6a,0x55
+,0x78,0x0a,0x77,0xa9,0xd8,0xea,0x19,0x32
+,0xb7,0x2f,0xfe,0x5c,0x3f,0x1b,0xee,0xb1
+,0x98,0xec,0xca,0xad,0x7a,0x69,0x45,0xe3
+,0x96,0x0f,0x55,0xf6,0xe6,0xed,0x75,0xea
+,0x65,0xe8,0x32,0x56,0x93,0x46,0x89,0xa8
+,0x25,0x8a,0x65,0x06,0xee,0x6b,0xbf,0x79
+,0x07,0xd0,0xf1,0xb7,0xaf,0xed,0x2c,0x4d
+,0x92,0xbb,0xc0,0xa8,0x5f,0xa7,0x67,0x7d
+,0x04,0xf2,0x15,0x08,0x70,0xac,0x92,0xd6
+,0x7d,0x04,0xd2,0x33,0xfb,0x4c,0xb6,0x0b
+,0x0b,0xfb,0x1a,0xc9,0xc4,0x8d,0x03,0xa9
+,0x7e,0x5c,0xf2,0x50,0xab,0x12,0xa5,0xa1
+,0xcf,0x48,0x50,0xa5,0xef,0xd2,0xc8,0x1a
+,0x13,0xfa,0xb0,0x7f,0xb1,0x82,0x1c,0x77
+,0x6a,0x0f,0x5f,0xdc,0x0b,0x95,0x8f,0xef
+,0x43,0x7e,0xe6,0x45,0x09,0x25,0x02,0x01
+,0x03,0xa3,0x82,0x01,0x50,0x30,0x82,0x01
+,0x4c,0x30,0x12,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x08,0x30,0x06,0x01
+,0x01,0xff,0x02,0x01,0x0c,0x30,0x3f,0x06
+,0x03,0x55,0x1d,0x1f,0x04,0x38,0x30,0x36
+,0x30,0x34,0xa0,0x32,0xa0,0x30,0x86,0x2e
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63
+,0x72,0x6c,0x2e,0x63,0x68,0x61,0x6d,0x62
+,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6f
+,0x72,0x67,0x2f,0x63,0x68,0x61,0x6d,0x62
+,0x65,0x72,0x73,0x69,0x67,0x6e,0x72,0x6f
+,0x6f,0x74,0x2e,0x63,0x72,0x6c,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0x43,0x9c,0x36,0x9f,0xb0,0x9e,0x30
+,0x4d,0xc6,0xce,0x5f,0xad,0x10,0xab,0xe5
+,0x03,0xa5,0xfa,0xa9,0x14,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x01,0x06,0x30,0x11,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x01,0x04,0x04,0x03,0x02,0x00,0x07
+,0x30,0x2a,0x06,0x03,0x55,0x1d,0x11,0x04
+,0x23,0x30,0x21,0x81,0x1f,0x63,0x68,0x61
+,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e
+,0x72,0x6f,0x6f,0x74,0x40,0x63,0x68,0x61
+,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e
+,0x2e,0x6f,0x72,0x67,0x30,0x2a,0x06,0x03
+,0x55,0x1d,0x12,0x04,0x23,0x30,0x21,0x81
+,0x1f,0x63,0x68,0x61,0x6d,0x62,0x65,0x72
+,0x73,0x69,0x67,0x6e,0x72,0x6f,0x6f,0x74
+,0x40,0x63,0x68,0x61,0x6d,0x62,0x65,0x72
+,0x73,0x69,0x67,0x6e,0x2e,0x6f,0x72,0x67
+,0x30,0x5b,0x06,0x03,0x55,0x1d,0x20,0x04
+,0x54,0x30,0x52,0x30,0x50,0x06,0x0b,0x2b
+,0x06,0x01,0x04,0x01,0x81,0x87,0x2e,0x0a
+,0x01,0x01,0x30,0x41,0x30,0x3f,0x06,0x08
+,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01
+,0x16,0x33,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x63,0x70,0x73,0x2e,0x63,0x68,0x61
+,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e
+,0x2e,0x6f,0x72,0x67,0x2f,0x63,0x70,0x73
+,0x2f,0x63,0x68,0x61,0x6d,0x62,0x65,0x72
+,0x73,0x69,0x67,0x6e,0x72,0x6f,0x6f,0x74
+,0x2e,0x68,0x74,0x6d,0x6c,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0x3c,0x3b,0x70,0x91,0xf9,0x04,0x54
+,0x27,0x91,0xe1,0xed,0xed,0xfe,0x68,0x7f
+,0x61,0x5d,0xe5,0x41,0x65,0x4f,0x32,0xf1
+,0x18,0x05,0x94,0x6a,0x1c,0xde,0x1f,0x70
+,0xdb,0x3e,0x7b,0x32,0x02,0x34,0xb5,0x0c
+,0x6c,0xa1,0x8a,0x7c,0xa5,0xf4,0x8f,0xff
+,0xd4,0xd8,0xad,0x17,0xd5,0x2d,0x04,0xd1
+,0x3f,0x58,0x80,0xe2,0x81,0x59,0x88,0xbe
+,0xc0,0xe3,0x46,0x93,0x24,0xfe,0x90,0xbd
+,0x26,0xa2,0x30,0x2d,0xe8,0x97,0x26,0x57
+,0x35,0x89,0x74,0x96,0x18,0xf6,0x15,0xe2
+,0xaf,0x24,0x19,0x56,0x02,0x02,0xb2,0xba
+,0x0f,0x14,0xea,0xc6,0x8a,0x66,0xc1,0x86
+,0x45,0x55,0x8b,0xbe,0x92,0xbe,0x9c,0xa4
+,0x04,0xc7,0x49,0x3c,0x9e,0xe8,0x29,0x7a
+,0x89,0xd7,0xfe,0xaf,0xff,0x68,0xf5,0xa5
+,0x17,0x90,0xbd,0xac,0x99,0xcc,0xa5,0x86
+,0x57,0x09,0x67,0x46,0xdb,0xd6,0x16,0xc2
+,0x46,0xf1,0xe4,0xa9,0x50,0xf5,0x8f,0xd1
+,0x92,0x15,0xd3,0x5f,0x3e,0xc6,0x00,0x49
+,0x3a,0x6e,0x58,0xb2,0xd1,0xd1,0x27,0x0d
+,0x25,0xc8,0x32,0xf8,0x20,0x11,0xcd,0x7d
+,0x32,0x33,0x48,0x94,0x54,0x4c,0xdd,0xdc
+,0x79,0xc4,0x30,0x9f,0xeb,0x8e,0xb8,0x55
+,0xb5,0xd7,0x88,0x5c,0xc5,0x6a,0x24,0x3d
+,0xb2,0xd3,0x05,0x03,0x51,0xc6,0x07,0xef
+,0xcc,0x14,0x72,0x74,0x3d,0x6e,0x72,0xce
+,0x18,0x28,0x8c,0x4a,0xa0,0x77,0xe5,0x09
+,0x2b,0x45,0x44,0x47,0xac,0xb7,0x67,0x7f
+,0x01,0x8a,0x05,0x5a,0x93,0xbe,0xa1,0xc1
+,0xff,0xf8,0xe7,0x0e,0x67,0xa4,0x47,0x49
+,0x76,0x5d,0x75,0x90,0x1a,0xf5,0x26,0x8f
+,0xf0};
+const unsigned int NptTlsTrustAnchor_Base_0089_Size = 1225;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0090.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0090.cpp
new file mode 100644
index 0000000..9755631
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0090.cpp
@@ -0,0 +1,255 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* NetLock Qualified (Class QA) Root */
+const unsigned char NptTlsTrustAnchor_Base_0090_Data[1749] = {
+0x30,0x82,0x06,0xd1,0x30,0x82,0x05,0xb9
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x7b
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x81,0xc9,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x48,0x55,0x31
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x07
+,0x13,0x08,0x42,0x75,0x64,0x61,0x70,0x65
+,0x73,0x74,0x31,0x27,0x30,0x25,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x1e,0x4e,0x65,0x74
+,0x4c,0x6f,0x63,0x6b,0x20,0x48,0x61,0x6c
+,0x6f,0x7a,0x61,0x74,0x62,0x69,0x7a,0x74
+,0x6f,0x6e,0x73,0x61,0x67,0x69,0x20,0x4b
+,0x66,0x74,0x2e,0x31,0x1a,0x30,0x18,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x11,0x54,0x61
+,0x6e,0x75,0x73,0x69,0x74,0x76,0x61,0x6e
+,0x79,0x6b,0x69,0x61,0x64,0x6f,0x6b,0x31
+,0x42,0x30,0x40,0x06,0x03,0x55,0x04,0x03
+,0x13,0x39,0x4e,0x65,0x74,0x4c,0x6f,0x63
+,0x6b,0x20,0x4d,0x69,0x6e,0x6f,0x73,0x69
+,0x74,0x65,0x74,0x74,0x20,0x4b,0x6f,0x7a
+,0x6a,0x65,0x67,0x79,0x7a,0x6f,0x69,0x20
+,0x28,0x43,0x6c,0x61,0x73,0x73,0x20,0x51
+,0x41,0x29,0x20,0x54,0x61,0x6e,0x75,0x73
+,0x69,0x74,0x76,0x61,0x6e,0x79,0x6b,0x69
+,0x61,0x64,0x6f,0x31,0x1e,0x30,0x1c,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x09,0x01,0x16,0x0f,0x69,0x6e,0x66,0x6f
+,0x40,0x6e,0x65,0x74,0x6c,0x6f,0x63,0x6b
+,0x2e,0x68,0x75,0x30,0x1e,0x17,0x0d,0x30
+,0x33,0x30,0x33,0x33,0x30,0x30,0x31,0x34
+,0x37,0x31,0x31,0x5a,0x17,0x0d,0x32,0x32
+,0x31,0x32,0x31,0x35,0x30,0x31,0x34,0x37
+,0x31,0x31,0x5a,0x30,0x81,0xc9,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x48,0x55,0x31,0x11,0x30,0x0f,0x06
+,0x03,0x55,0x04,0x07,0x13,0x08,0x42,0x75
+,0x64,0x61,0x70,0x65,0x73,0x74,0x31,0x27
+,0x30,0x25,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x1e,0x4e,0x65,0x74,0x4c,0x6f,0x63,0x6b
+,0x20,0x48,0x61,0x6c,0x6f,0x7a,0x61,0x74
+,0x62,0x69,0x7a,0x74,0x6f,0x6e,0x73,0x61
+,0x67,0x69,0x20,0x4b,0x66,0x74,0x2e,0x31
+,0x1a,0x30,0x18,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x11,0x54,0x61,0x6e,0x75,0x73,0x69
+,0x74,0x76,0x61,0x6e,0x79,0x6b,0x69,0x61
+,0x64,0x6f,0x6b,0x31,0x42,0x30,0x40,0x06
+,0x03,0x55,0x04,0x03,0x13,0x39,0x4e,0x65
+,0x74,0x4c,0x6f,0x63,0x6b,0x20,0x4d,0x69
+,0x6e,0x6f,0x73,0x69,0x74,0x65,0x74,0x74
+,0x20,0x4b,0x6f,0x7a,0x6a,0x65,0x67,0x79
+,0x7a,0x6f,0x69,0x20,0x28,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x51,0x41,0x29,0x20,0x54
+,0x61,0x6e,0x75,0x73,0x69,0x74,0x76,0x61
+,0x6e,0x79,0x6b,0x69,0x61,0x64,0x6f,0x31
+,0x1e,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x0f
+,0x69,0x6e,0x66,0x6f,0x40,0x6e,0x65,0x74
+,0x6c,0x6f,0x63,0x6b,0x2e,0x68,0x75,0x30
+,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01
+,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30
+,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00
+,0xc7,0x52,0x25,0xb2,0xd8,0x3d,0xd4,0x84
+,0x55,0x09,0xa7,0x1b,0xbd,0x6c,0xb9,0x14
+,0xf4,0x8a,0x02,0xdb,0x76,0xfc,0x6a,0x2a
+,0x78,0xab,0xe5,0x77,0xf0,0x6e,0xe0,0x8c
+,0x23,0x67,0xdb,0xa5,0x64,0x99,0xb9,0xdd
+,0x01,0x3e,0x6f,0xef,0x2d,0x9a,0x3c,0x22
+,0xf0,0x5d,0xc9,0x57,0xa0,0x55,0x41,0x7f
+,0xf2,0x43,0x5e,0x58,0x82,0x53,0x31,0x65
+,0xce,0x1e,0xf2,0x26,0xba,0x00,0x54,0x1e
+,0xaf,0xb0,0xbc,0x1c,0xe4,0x52,0x8c,0xa0
+,0x32,0xaf,0xb7,0x37,0xb1,0x53,0x67,0x68
+,0x74,0x67,0x50,0xf6,0x2d,0x2e,0x64,0xde
+,0xae,0x26,0x79,0xdf,0xdf,0x99,0x86,0xab
+,0xab,0x7f,0x85,0xec,0xa0,0xfb,0x80,0xcc
+,0xf4,0xb8,0x0c,0x1e,0x93,0x45,0x63,0xb9
+,0xdc,0xb8,0x5b,0x9b,0xed,0x5b,0x39,0xd4
+,0x5f,0x62,0xb0,0xa7,0x8e,0x7c,0x66,0x38
+,0x2c,0xaa,0xb1,0x08,0x63,0x17,0x67,0x7d
+,0xcc,0xbd,0xb3,0xf1,0xc3,0x3f,0xcf,0x50
+,0x39,0xed,0xd1,0x19,0x83,0x15,0xdb,0x87
+,0x12,0x27,0x96,0xb7,0xda,0xea,0xe5,0x9d
+,0xbc,0xba,0xea,0x39,0x4f,0x8b,0xef,0x74
+,0x9a,0xe7,0xc5,0xd0,0xd2,0xea,0x86,0x51
+,0x1c,0xe4,0xfe,0x64,0x08,0x28,0x04,0x79
+,0x05,0xeb,0xca,0xc5,0x71,0x0e,0x0b,0xef
+,0xab,0xea,0xec,0x12,0x11,0xa1,0x18,0x05
+,0x32,0x69,0xd1,0x0c,0x2c,0x1a,0x3d,0x25
+,0x99,0x3f,0xb5,0x7c,0xca,0x6d,0xb0,0xae
+,0x99,0x99,0xfa,0x08,0x60,0xe7,0x19,0xc2
+,0xf2,0xbd,0x51,0xd3,0xcc,0xd3,0x02,0xac
+,0xc1,0x11,0x0c,0x80,0xce,0xab,0xdc,0x94
+,0x9d,0x6b,0xa3,0x39,0x53,0x3a,0xd6,0x85
+,0x02,0x03,0x00,0xc5,0x7d,0xa3,0x82,0x02
+,0xc0,0x30,0x82,0x02,0xbc,0x30,0x12,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x08,0x30,0x06,0x01,0x01,0xff,0x02,0x01
+,0x04,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x82,0x02,0x75,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x0d
+,0x04,0x82,0x02,0x66,0x16,0x82,0x02,0x62
+,0x46,0x49,0x47,0x59,0x45,0x4c,0x45,0x4d
+,0x21,0x20,0x45,0x7a,0x65,0x6e,0x20,0x74
+,0x61,0x6e,0x75,0x73,0x69,0x74,0x76,0x61
+,0x6e,0x79,0x20,0x61,0x20,0x4e,0x65,0x74
+,0x4c,0x6f,0x63,0x6b,0x20,0x4b,0x66,0x74
+,0x2e,0x20,0x4d,0x69,0x6e,0x6f,0x73,0x69
+,0x74,0x65,0x74,0x74,0x20,0x53,0x7a,0x6f
+,0x6c,0x67,0x61,0x6c,0x74,0x61,0x74,0x61
+,0x73,0x69,0x20,0x53,0x7a,0x61,0x62,0x61
+,0x6c,0x79,0x7a,0x61,0x74,0x61,0x62,0x61
+,0x6e,0x20,0x6c,0x65,0x69,0x72,0x74,0x20
+,0x65,0x6c,0x6a,0x61,0x72,0x61,0x73,0x6f
+,0x6b,0x20,0x61,0x6c,0x61,0x70,0x6a,0x61
+,0x6e,0x20,0x6b,0x65,0x73,0x7a,0x75,0x6c
+,0x74,0x2e,0x20,0x41,0x20,0x6d,0x69,0x6e
+,0x6f,0x73,0x69,0x74,0x65,0x74,0x74,0x20
+,0x65,0x6c,0x65,0x6b,0x74,0x72,0x6f,0x6e
+,0x69,0x6b,0x75,0x73,0x20,0x61,0x6c,0x61
+,0x69,0x72,0x61,0x73,0x20,0x6a,0x6f,0x67
+,0x68,0x61,0x74,0x61,0x73,0x20,0x65,0x72
+,0x76,0x65,0x6e,0x79,0x65,0x73,0x75,0x6c
+,0x65,0x73,0x65,0x6e,0x65,0x6b,0x2c,0x20
+,0x76,0x61,0x6c,0x61,0x6d,0x69,0x6e,0x74
+,0x20,0x65,0x6c,0x66,0x6f,0x67,0x61,0x64
+,0x61,0x73,0x61,0x6e,0x61,0x6b,0x20,0x66
+,0x65,0x6c,0x74,0x65,0x74,0x65,0x6c,0x65
+,0x20,0x61,0x20,0x4d,0x69,0x6e,0x6f,0x73
+,0x69,0x74,0x65,0x74,0x74,0x20,0x53,0x7a
+,0x6f,0x6c,0x67,0x61,0x6c,0x74,0x61,0x74
+,0x61,0x73,0x69,0x20,0x53,0x7a,0x61,0x62
+,0x61,0x6c,0x79,0x7a,0x61,0x74,0x62,0x61
+,0x6e,0x2c,0x20,0x61,0x7a,0x20,0x41,0x6c
+,0x74,0x61,0x6c,0x61,0x6e,0x6f,0x73,0x20
+,0x53,0x7a,0x65,0x72,0x7a,0x6f,0x64,0x65
+,0x73,0x69,0x20,0x46,0x65,0x6c,0x74,0x65
+,0x74,0x65,0x6c,0x65,0x6b,0x62,0x65,0x6e
+,0x20,0x65,0x6c,0x6f,0x69,0x72,0x74,0x20
+,0x65,0x6c,0x6c,0x65,0x6e,0x6f,0x72,0x7a
+,0x65,0x73,0x69,0x20,0x65,0x6c,0x6a,0x61
+,0x72,0x61,0x73,0x20,0x6d,0x65,0x67,0x74
+,0x65,0x74,0x65,0x6c,0x65,0x2e,0x20,0x41
+,0x20,0x64,0x6f,0x6b,0x75,0x6d,0x65,0x6e
+,0x74,0x75,0x6d,0x6f,0x6b,0x20,0x6d,0x65
+,0x67,0x74,0x61,0x6c,0x61,0x6c,0x68,0x61
+,0x74,0x6f,0x6b,0x20,0x61,0x20,0x68,0x74
+,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x6e,0x65,0x74,0x6c,0x6f,0x63
+,0x6b,0x2e,0x68,0x75,0x2f,0x64,0x6f,0x63
+,0x73,0x2f,0x20,0x63,0x69,0x6d,0x65,0x6e
+,0x20,0x76,0x61,0x67,0x79,0x20,0x6b,0x65
+,0x72,0x68,0x65,0x74,0x6f,0x6b,0x20,0x61
+,0x7a,0x20,0x69,0x6e,0x66,0x6f,0x40,0x6e
+,0x65,0x74,0x6c,0x6f,0x63,0x6b,0x2e,0x6e
+,0x65,0x74,0x20,0x65,0x2d,0x6d,0x61,0x69
+,0x6c,0x20,0x63,0x69,0x6d,0x65,0x6e,0x2e
+,0x20,0x57,0x41,0x52,0x4e,0x49,0x4e,0x47
+,0x21,0x20,0x54,0x68,0x65,0x20,0x69,0x73
+,0x73,0x75,0x61,0x6e,0x63,0x65,0x20,0x61
+,0x6e,0x64,0x20,0x74,0x68,0x65,0x20,0x75
+,0x73,0x65,0x20,0x6f,0x66,0x20,0x74,0x68
+,0x69,0x73,0x20,0x63,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x61
+,0x72,0x65,0x20,0x73,0x75,0x62,0x6a,0x65
+,0x63,0x74,0x20,0x74,0x6f,0x20,0x74,0x68
+,0x65,0x20,0x4e,0x65,0x74,0x4c,0x6f,0x63
+,0x6b,0x20,0x51,0x75,0x61,0x6c,0x69,0x66
+,0x69,0x65,0x64,0x20,0x43,0x50,0x53,0x20
+,0x61,0x76,0x61,0x69,0x6c,0x61,0x62,0x6c
+,0x65,0x20,0x61,0x74,0x20,0x68,0x74,0x74
+,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x6e,0x65,0x74,0x6c,0x6f,0x63,0x6b
+,0x2e,0x68,0x75,0x2f,0x64,0x6f,0x63,0x73
+,0x2f,0x20,0x6f,0x72,0x20,0x62,0x79,0x20
+,0x65,0x2d,0x6d,0x61,0x69,0x6c,0x20,0x61
+,0x74,0x20,0x69,0x6e,0x66,0x6f,0x40,0x6e
+,0x65,0x74,0x6c,0x6f,0x63,0x6b,0x2e,0x6e
+,0x65,0x74,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x09,0x6a,0x62
+,0x16,0x92,0xb0,0x5a,0xbb,0x55,0x0e,0xcb
+,0x75,0x32,0x3a,0x32,0xe5,0xb2,0x21,0xc9
+,0x28,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0x91,0x6a,0x50
+,0x9c,0xdb,0x78,0x81,0x9b,0x3f,0x8b,0x42
+,0xe3,0x3b,0xfc,0xa6,0xc3,0xee,0x43,0xe0
+,0xcf,0xf3,0xe2,0x80,0x35,0x49,0x45,0x76
+,0x02,0xe2,0xe3,0x2f,0x05,0xc5,0xf1,0x2a
+,0xe7,0xc0,0x41,0x33,0xc6,0xb6,0x9b,0xd0
+,0x33,0x39,0xcd,0xc0,0xdb,0xa1,0xad,0x6c
+,0x37,0x02,0x4c,0x58,0x41,0x3b,0xf2,0x97
+,0x92,0xc6,0x48,0xa8,0xcd,0xe5,0x8a,0x39
+,0x89,0x61,0xf9,0x52,0x97,0xe9,0xbd,0xf6
+,0xf9,0x94,0x74,0xe8,0x71,0x0e,0xbc,0x77
+,0x86,0xc3,0x06,0xcc,0x5a,0x7c,0x4a,0x7e
+,0x34,0x50,0x30,0x2e,0xfb,0x7f,0x32,0x9a
+,0x8d,0x3d,0xf3,0x20,0x5b,0xf8,0x6a,0xca
+,0x86,0xf3,0x31,0x4c,0x2c,0x59,0x80,0x02
+,0x7d,0xfe,0x38,0xc9,0x30,0x75,0x1c,0xb7
+,0x55,0xe3,0xbc,0x9f,0xba,0xa8,0x6d,0x84
+,0x28,0x05,0x75,0xb3,0x8b,0x0d,0xc0,0x91
+,0x54,0x21,0xe7,0xa6,0x0b,0xb4,0x99,0xf5
+,0x51,0x41,0xdc,0xcd,0xa3,0x47,0x22,0xd9
+,0xc7,0x01,0x81,0xc4,0xdc,0x47,0x4f,0x26
+,0xea,0x1f,0xed,0xdb,0xcd,0x0d,0x98,0xf4
+,0xa3,0x9c,0xb4,0x73,0x32,0x4a,0x96,0x99
+,0xfe,0xbc,0x7f,0xc8,0x25,0x58,0xf8,0x58
+,0xf3,0x76,0x66,0x89,0x54,0xa4,0xa6,0x3e
+,0xc4,0x50,0x5c,0xba,0x89,0x18,0x82,0x75
+,0x48,0x21,0xd2,0x4f,0x13,0xe8,0x60,0x7e
+,0x07,0x76,0xdb,0x10,0xb5,0x51,0xe6,0xaa
+,0xb9,0x68,0xaa,0xcd,0xf6,0x9d,0x90,0x75
+,0x12,0xea,0x38,0x1a,0xca,0x44,0xe8,0xb7
+,0x99,0xa7,0x2a,0x68,0x95,0x66,0x95,0xab
+,0xad,0xef,0x89,0xcb,0x60,0xa9,0x06,0x12
+,0xc6,0x94,0x47,0xe9,0x28};
+const unsigned int NptTlsTrustAnchor_Base_0090_Size = 1749;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0091.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0091.cpp
new file mode 100644
index 0000000..fa055e4
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0091.cpp
@@ -0,0 +1,245 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* NetLock Notary (Class A) Root */
+const unsigned char NptTlsTrustAnchor_Base_0091_Data[1665] = {
+0x30,0x82,0x06,0x7d,0x30,0x82,0x05,0x65
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x02,0x01
+,0x03,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00
+,0x30,0x81,0xaf,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x48,0x55
+,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04
+,0x08,0x13,0x07,0x48,0x75,0x6e,0x67,0x61
+,0x72,0x79,0x31,0x11,0x30,0x0f,0x06,0x03
+,0x55,0x04,0x07,0x13,0x08,0x42,0x75,0x64
+,0x61,0x70,0x65,0x73,0x74,0x31,0x27,0x30
+,0x25,0x06,0x03,0x55,0x04,0x0a,0x13,0x1e
+,0x4e,0x65,0x74,0x4c,0x6f,0x63,0x6b,0x20
+,0x48,0x61,0x6c,0x6f,0x7a,0x61,0x74,0x62
+,0x69,0x7a,0x74,0x6f,0x6e,0x73,0x61,0x67
+,0x69,0x20,0x4b,0x66,0x74,0x2e,0x31,0x1a
+,0x30,0x18,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x11,0x54,0x61,0x6e,0x75,0x73,0x69,0x74
+,0x76,0x61,0x6e,0x79,0x6b,0x69,0x61,0x64
+,0x6f,0x6b,0x31,0x36,0x30,0x34,0x06,0x03
+,0x55,0x04,0x03,0x13,0x2d,0x4e,0x65,0x74
+,0x4c,0x6f,0x63,0x6b,0x20,0x4b,0x6f,0x7a
+,0x6a,0x65,0x67,0x79,0x7a,0x6f,0x69,0x20
+,0x28,0x43,0x6c,0x61,0x73,0x73,0x20,0x41
+,0x29,0x20,0x54,0x61,0x6e,0x75,0x73,0x69
+,0x74,0x76,0x61,0x6e,0x79,0x6b,0x69,0x61
+,0x64,0x6f,0x30,0x1e,0x17,0x0d,0x39,0x39
+,0x30,0x32,0x32,0x34,0x32,0x33,0x31,0x34
+,0x34,0x37,0x5a,0x17,0x0d,0x31,0x39,0x30
+,0x32,0x31,0x39,0x32,0x33,0x31,0x34,0x34
+,0x37,0x5a,0x30,0x81,0xaf,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x48,0x55,0x31,0x10,0x30,0x0e,0x06,0x03
+,0x55,0x04,0x08,0x13,0x07,0x48,0x75,0x6e
+,0x67,0x61,0x72,0x79,0x31,0x11,0x30,0x0f
+,0x06,0x03,0x55,0x04,0x07,0x13,0x08,0x42
+,0x75,0x64,0x61,0x70,0x65,0x73,0x74,0x31
+,0x27,0x30,0x25,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x1e,0x4e,0x65,0x74,0x4c,0x6f,0x63
+,0x6b,0x20,0x48,0x61,0x6c,0x6f,0x7a,0x61
+,0x74,0x62,0x69,0x7a,0x74,0x6f,0x6e,0x73
+,0x61,0x67,0x69,0x20,0x4b,0x66,0x74,0x2e
+,0x31,0x1a,0x30,0x18,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x11,0x54,0x61,0x6e,0x75,0x73
+,0x69,0x74,0x76,0x61,0x6e,0x79,0x6b,0x69
+,0x61,0x64,0x6f,0x6b,0x31,0x36,0x30,0x34
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2d,0x4e
+,0x65,0x74,0x4c,0x6f,0x63,0x6b,0x20,0x4b
+,0x6f,0x7a,0x6a,0x65,0x67,0x79,0x7a,0x6f
+,0x69,0x20,0x28,0x43,0x6c,0x61,0x73,0x73
+,0x20,0x41,0x29,0x20,0x54,0x61,0x6e,0x75
+,0x73,0x69,0x74,0x76,0x61,0x6e,0x79,0x6b
+,0x69,0x61,0x64,0x6f,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xbc,0x74,0x8c
+,0x0f,0xbb,0x4c,0xf4,0x37,0x1e,0xa9,0x05
+,0x82,0xd8,0xe6,0xe1,0x6c,0x70,0xea,0x78
+,0xb5,0x6e,0xd1,0x38,0x44,0x0d,0xa8,0x83
+,0xce,0x5d,0xd2,0xd6,0xd5,0x81,0xc5,0xd4
+,0x4b,0xe7,0x5b,0x94,0x70,0x26,0xdb,0x3b
+,0x9d,0x6a,0x4c,0x62,0xf7,0x71,0xf3,0x64
+,0xd6,0x61,0x3b,0x3d,0xeb,0x73,0xa3,0x37
+,0xd9,0xcf,0xea,0x8c,0x92,0x3b,0xcd,0xf7
+,0x07,0xdc,0x66,0x74,0x97,0xf4,0x45,0x22
+,0xdd,0xf4,0x5c,0xe0,0xbf,0x6d,0xf3,0xbe
+,0x65,0x33,0xe4,0x15,0x3a,0xbf,0xdb,0x98
+,0x90,0x55,0x38,0xc4,0xed,0xa6,0x55,0x63
+,0x0b,0xb0,0x78,0x04,0xf4,0xe3,0x6e,0xc1
+,0x3f,0x8e,0xfc,0x51,0x78,0x1f,0x92,0x9e
+,0x83,0xc2,0xfe,0xd9,0xb0,0xa9,0xc9,0xbc
+,0x5a,0x00,0xff,0xa9,0xa8,0x98,0x74,0xfb
+,0xf6,0x2c,0x3e,0x15,0x39,0x0d,0xb6,0x04
+,0x55,0xa8,0x0e,0x98,0x20,0x42,0xb3,0xb1
+,0x25,0xad,0x7e,0x9a,0x6f,0x5d,0x53,0xb1
+,0xab,0x0c,0xfc,0xeb,0xe0,0xf3,0x7a,0xb3
+,0xa8,0xb3,0xff,0x46,0xf6,0x63,0xa2,0xd8
+,0x3a,0x98,0x7b,0xb6,0xac,0x85,0xff,0xb0
+,0x25,0x4f,0x74,0x63,0xe7,0x13,0x07,0xa5
+,0x0a,0x8f,0x05,0xf7,0xc0,0x64,0x6f,0x7e
+,0xa7,0x27,0x80,0x96,0xde,0xd4,0x2e,0x86
+,0x60,0xc7,0x6b,0x2b,0x5e,0x73,0x7b,0x17
+,0xe7,0x91,0x3f,0x64,0x0c,0xd8,0x4b,0x22
+,0x34,0x2b,0x9b,0x32,0xf2,0x48,0x1f,0x9f
+,0xa1,0x0a,0x84,0x7a,0xe2,0xc2,0xad,0x97
+,0x3d,0x8e,0xd5,0xc1,0xf9,0x56,0xa3,0x50
+,0xe9,0xc6,0xb4,0xfa,0x98,0xa2,0xee,0x95
+,0xe6,0x2a,0x03,0x8c,0xdf,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x82,0x02,0x9f,0x30,0x82
+,0x02,0x9b,0x30,0x0e,0x06,0x03,0x55,0x1d
+,0x0f,0x01,0x01,0xff,0x04,0x04,0x03,0x02
+,0x00,0x06,0x30,0x12,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x08,0x30,0x06
+,0x01,0x01,0xff,0x02,0x01,0x04,0x30,0x11
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x00
+,0x07,0x30,0x82,0x02,0x60,0x06,0x09,0x60
+,0x86,0x48,0x01,0x86,0xf8,0x42,0x01,0x0d
+,0x04,0x82,0x02,0x51,0x16,0x82,0x02,0x4d
+,0x46,0x49,0x47,0x59,0x45,0x4c,0x45,0x4d
+,0x21,0x20,0x45,0x7a,0x65,0x6e,0x20,0x74
+,0x61,0x6e,0x75,0x73,0x69,0x74,0x76,0x61
+,0x6e,0x79,0x20,0x61,0x20,0x4e,0x65,0x74
+,0x4c,0x6f,0x63,0x6b,0x20,0x4b,0x66,0x74
+,0x2e,0x20,0x41,0x6c,0x74,0x61,0x6c,0x61
+,0x6e,0x6f,0x73,0x20,0x53,0x7a,0x6f,0x6c
+,0x67,0x61,0x6c,0x74,0x61,0x74,0x61,0x73
+,0x69,0x20,0x46,0x65,0x6c,0x74,0x65,0x74
+,0x65,0x6c,0x65,0x69,0x62,0x65,0x6e,0x20
+,0x6c,0x65,0x69,0x72,0x74,0x20,0x65,0x6c
+,0x6a,0x61,0x72,0x61,0x73,0x6f,0x6b,0x20
+,0x61,0x6c,0x61,0x70,0x6a,0x61,0x6e,0x20
+,0x6b,0x65,0x73,0x7a,0x75,0x6c,0x74,0x2e
+,0x20,0x41,0x20,0x68,0x69,0x74,0x65,0x6c
+,0x65,0x73,0x69,0x74,0x65,0x73,0x20,0x66
+,0x6f,0x6c,0x79,0x61,0x6d,0x61,0x74,0x61
+,0x74,0x20,0x61,0x20,0x4e,0x65,0x74,0x4c
+,0x6f,0x63,0x6b,0x20,0x4b,0x66,0x74,0x2e
+,0x20,0x74,0x65,0x72,0x6d,0x65,0x6b,0x66
+,0x65,0x6c,0x65,0x6c,0x6f,0x73,0x73,0x65
+,0x67,0x2d,0x62,0x69,0x7a,0x74,0x6f,0x73
+,0x69,0x74,0x61,0x73,0x61,0x20,0x76,0x65
+,0x64,0x69,0x2e,0x20,0x41,0x20,0x64,0x69
+,0x67,0x69,0x74,0x61,0x6c,0x69,0x73,0x20
+,0x61,0x6c,0x61,0x69,0x72,0x61,0x73,0x20
+,0x65,0x6c,0x66,0x6f,0x67,0x61,0x64,0x61
+,0x73,0x61,0x6e,0x61,0x6b,0x20,0x66,0x65
+,0x6c,0x74,0x65,0x74,0x65,0x6c,0x65,0x20
+,0x61,0x7a,0x20,0x65,0x6c,0x6f,0x69,0x72
+,0x74,0x20,0x65,0x6c,0x6c,0x65,0x6e,0x6f
+,0x72,0x7a,0x65,0x73,0x69,0x20,0x65,0x6c
+,0x6a,0x61,0x72,0x61,0x73,0x20,0x6d,0x65
+,0x67,0x74,0x65,0x74,0x65,0x6c,0x65,0x2e
+,0x20,0x41,0x7a,0x20,0x65,0x6c,0x6a,0x61
+,0x72,0x61,0x73,0x20,0x6c,0x65,0x69,0x72
+,0x61,0x73,0x61,0x20,0x6d,0x65,0x67,0x74
+,0x61,0x6c,0x61,0x6c,0x68,0x61,0x74,0x6f
+,0x20,0x61,0x20,0x4e,0x65,0x74,0x4c,0x6f
+,0x63,0x6b,0x20,0x4b,0x66,0x74,0x2e,0x20
+,0x49,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74
+,0x20,0x68,0x6f,0x6e,0x6c,0x61,0x70,0x6a
+,0x61,0x6e,0x20,0x61,0x20,0x68,0x74,0x74
+,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77
+,0x2e,0x6e,0x65,0x74,0x6c,0x6f,0x63,0x6b
+,0x2e,0x6e,0x65,0x74,0x2f,0x64,0x6f,0x63
+,0x73,0x20,0x63,0x69,0x6d,0x65,0x6e,0x20
+,0x76,0x61,0x67,0x79,0x20,0x6b,0x65,0x72
+,0x68,0x65,0x74,0x6f,0x20,0x61,0x7a,0x20
+,0x65,0x6c,0x6c,0x65,0x6e,0x6f,0x72,0x7a
+,0x65,0x73,0x40,0x6e,0x65,0x74,0x6c,0x6f
+,0x63,0x6b,0x2e,0x6e,0x65,0x74,0x20,0x65
+,0x2d,0x6d,0x61,0x69,0x6c,0x20,0x63,0x69
+,0x6d,0x65,0x6e,0x2e,0x20,0x49,0x4d,0x50
+,0x4f,0x52,0x54,0x41,0x4e,0x54,0x21,0x20
+,0x54,0x68,0x65,0x20,0x69,0x73,0x73,0x75
+,0x61,0x6e,0x63,0x65,0x20,0x61,0x6e,0x64
+,0x20,0x74,0x68,0x65,0x20,0x75,0x73,0x65
+,0x20,0x6f,0x66,0x20,0x74,0x68,0x69,0x73
+,0x20,0x63,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x65,0x20,0x69,0x73,0x20
+,0x73,0x75,0x62,0x6a,0x65,0x63,0x74,0x20
+,0x74,0x6f,0x20,0x74,0x68,0x65,0x20,0x4e
+,0x65,0x74,0x4c,0x6f,0x63,0x6b,0x20,0x43
+,0x50,0x53,0x20,0x61,0x76,0x61,0x69,0x6c
+,0x61,0x62,0x6c,0x65,0x20,0x61,0x74,0x20
+,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f
+,0x77,0x77,0x77,0x2e,0x6e,0x65,0x74,0x6c
+,0x6f,0x63,0x6b,0x2e,0x6e,0x65,0x74,0x2f
+,0x64,0x6f,0x63,0x73,0x20,0x6f,0x72,0x20
+,0x62,0x79,0x20,0x65,0x2d,0x6d,0x61,0x69
+,0x6c,0x20,0x61,0x74,0x20,0x63,0x70,0x73
+,0x40,0x6e,0x65,0x74,0x6c,0x6f,0x63,0x6b
+,0x2e,0x6e,0x65,0x74,0x2e,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x04,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0x48,0x24,0x46,0xf7,0xba,0x56,0x6f
+,0xfa,0xc8,0x28,0x03,0x40,0x4e,0xe5,0x31
+,0x39,0x6b,0x26,0x6b,0x53,0x7f,0xdb,0xdf
+,0xdf,0xf3,0x71,0x3d,0x26,0xc0,0x14,0x0e
+,0xc6,0x67,0x7b,0x23,0xa8,0x0c,0x73,0xdd
+,0x01,0xbb,0xc6,0xca,0x6e,0x37,0x39,0x55
+,0xd5,0xc7,0x8c,0x56,0x20,0x0e,0x28,0x0a
+,0x0e,0xd2,0x2a,0xa4,0xb0,0x49,0x52,0xc6
+,0x38,0x07,0xfe,0xbe,0x0a,0x09,0x8c,0xd1
+,0x98,0xcf,0xca,0xda,0x14,0x31,0xa1,0x4f
+,0xd2,0x39,0xfc,0x0f,0x11,0x2c,0x43,0xc3
+,0xdd,0xab,0x93,0xc7,0x55,0x3e,0x47,0x7c
+,0x18,0x1a,0x00,0xdc,0xf3,0x7b,0xd8,0xf2
+,0x7f,0x52,0x6c,0x20,0xf4,0x0b,0x5f,0x69
+,0x52,0xf4,0xee,0xf8,0xb2,0x29,0x60,0xeb
+,0xe3,0x49,0x31,0x21,0x0d,0xd6,0xb5,0x10
+,0x41,0xe2,0x41,0x09,0x6c,0xe2,0x1a,0x9a
+,0x56,0x4b,0x77,0x02,0xf6,0xa0,0x9b,0x9a
+,0x27,0x87,0xe8,0x55,0x29,0x71,0xc2,0x90
+,0x9f,0x45,0x78,0x1a,0xe1,0x15,0x64,0x3d
+,0xd0,0x0e,0xd8,0xa0,0x76,0x9f,0xae,0xc5
+,0xd0,0x2e,0xea,0xd6,0x0f,0x56,0xec,0x64
+,0x7f,0x5a,0x9b,0x14,0x58,0x01,0x27,0x7e
+,0x13,0x50,0xc7,0x6b,0x2a,0xe6,0x68,0x3c
+,0xbf,0x5c,0xa0,0x0a,0x1b,0xe1,0x0e,0x7a
+,0xe9,0xe2,0x80,0xc3,0xe9,0xe9,0xf6,0xfd
+,0x6c,0x11,0x9e,0xd0,0xe5,0x28,0x27,0x2b
+,0x54,0x32,0x42,0x14,0x82,0x75,0xe6,0x4a
+,0xf0,0x2b,0x66,0x75,0x63,0x8c,0xa2,0xfb
+,0x04,0x3e,0x83,0x0e,0x9b,0x36,0xf0,0x18
+,0xe4,0x26,0x20,0xc3,0x8c,0xf0,0x28,0x07
+,0xad,0x3c,0x17,0x66,0x88,0xb5,0xfd,0xb6
+,0x88};
+const unsigned int NptTlsTrustAnchor_Base_0091_Size = 1665;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0092.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0092.cpp
new file mode 100644
index 0000000..50894c9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0092.cpp
@@ -0,0 +1,206 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* NetLock Business (Class B) Root */
+const unsigned char NptTlsTrustAnchor_Base_0092_Data[1359] = {
+0x30,0x82,0x05,0x4b,0x30,0x82,0x04,0xb4
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x69
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x81,0x99,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x48,0x55,0x31
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x07
+,0x13,0x08,0x42,0x75,0x64,0x61,0x70,0x65
+,0x73,0x74,0x31,0x27,0x30,0x25,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x1e,0x4e,0x65,0x74
+,0x4c,0x6f,0x63,0x6b,0x20,0x48,0x61,0x6c
+,0x6f,0x7a,0x61,0x74,0x62,0x69,0x7a,0x74
+,0x6f,0x6e,0x73,0x61,0x67,0x69,0x20,0x4b
+,0x66,0x74,0x2e,0x31,0x1a,0x30,0x18,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x11,0x54,0x61
+,0x6e,0x75,0x73,0x69,0x74,0x76,0x61,0x6e
+,0x79,0x6b,0x69,0x61,0x64,0x6f,0x6b,0x31
+,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03
+,0x13,0x29,0x4e,0x65,0x74,0x4c,0x6f,0x63
+,0x6b,0x20,0x55,0x7a,0x6c,0x65,0x74,0x69
+,0x20,0x28,0x43,0x6c,0x61,0x73,0x73,0x20
+,0x42,0x29,0x20,0x54,0x61,0x6e,0x75,0x73
+,0x69,0x74,0x76,0x61,0x6e,0x79,0x6b,0x69
+,0x61,0x64,0x6f,0x30,0x1e,0x17,0x0d,0x39
+,0x39,0x30,0x32,0x32,0x35,0x31,0x34,0x31
+,0x30,0x32,0x32,0x5a,0x17,0x0d,0x31,0x39
+,0x30,0x32,0x32,0x30,0x31,0x34,0x31,0x30
+,0x32,0x32,0x5a,0x30,0x81,0x99,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x48,0x55,0x31,0x11,0x30,0x0f,0x06
+,0x03,0x55,0x04,0x07,0x13,0x08,0x42,0x75
+,0x64,0x61,0x70,0x65,0x73,0x74,0x31,0x27
+,0x30,0x25,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x1e,0x4e,0x65,0x74,0x4c,0x6f,0x63,0x6b
+,0x20,0x48,0x61,0x6c,0x6f,0x7a,0x61,0x74
+,0x62,0x69,0x7a,0x74,0x6f,0x6e,0x73,0x61
+,0x67,0x69,0x20,0x4b,0x66,0x74,0x2e,0x31
+,0x1a,0x30,0x18,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x11,0x54,0x61,0x6e,0x75,0x73,0x69
+,0x74,0x76,0x61,0x6e,0x79,0x6b,0x69,0x61
+,0x64,0x6f,0x6b,0x31,0x32,0x30,0x30,0x06
+,0x03,0x55,0x04,0x03,0x13,0x29,0x4e,0x65
+,0x74,0x4c,0x6f,0x63,0x6b,0x20,0x55,0x7a
+,0x6c,0x65,0x74,0x69,0x20,0x28,0x43,0x6c
+,0x61,0x73,0x73,0x20,0x42,0x29,0x20,0x54
+,0x61,0x6e,0x75,0x73,0x69,0x74,0x76,0x61
+,0x6e,0x79,0x6b,0x69,0x61,0x64,0x6f,0x30
+,0x81,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x81,0x8d,0x00,0x30,0x81,0x89
+,0x02,0x81,0x81,0x00,0xb1,0xea,0x04,0xec
+,0x20,0xa0,0x23,0xc2,0x8f,0x38,0x60,0xcf
+,0xc7,0x46,0xb3,0xd5,0x1b,0xfe,0xfb,0xb9
+,0x99,0x9e,0x04,0xdc,0x1c,0x7f,0x8c,0x4a
+,0x81,0x98,0xee,0xa4,0xd4,0xca,0x8a,0x17
+,0xb9,0x22,0x7f,0x83,0x0a,0x75,0x4c,0x9b
+,0xc0,0x69,0xd8,0x64,0x39,0xa3,0xed,0x92
+,0xa3,0xfd,0x5b,0x5c,0x74,0x1a,0xc0,0x47
+,0xca,0x3a,0x69,0x76,0x9a,0xba,0xe2,0x44
+,0x17,0xfc,0x4c,0xa3,0xd5,0xfe,0xb8,0x97
+,0x88,0xaf,0x88,0x03,0x89,0x1f,0xa4,0xf2
+,0x04,0x3e,0xc8,0x07,0x0b,0xe6,0xf9,0xb3
+,0x2f,0x7a,0x62,0x14,0x09,0x46,0x14,0xca
+,0x64,0xf5,0x8b,0x80,0xb5,0x62,0xa8,0xd8
+,0x6b,0xd6,0x71,0x93,0x2d,0xb3,0xbf,0x09
+,0x54,0x58,0xed,0x06,0xeb,0xa8,0x7b,0xdc
+,0x43,0xb1,0xa1,0x69,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x82,0x02,0x9f,0x30,0x82,0x02
+,0x9b,0x30,0x12,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x08,0x30,0x06,0x01
+,0x01,0xff,0x02,0x01,0x04,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x00,0x06,0x30,0x11,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x01,0x04,0x04,0x03,0x02,0x00,0x07
+,0x30,0x82,0x02,0x60,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x0d,0x04
+,0x82,0x02,0x51,0x16,0x82,0x02,0x4d,0x46
+,0x49,0x47,0x59,0x45,0x4c,0x45,0x4d,0x21
+,0x20,0x45,0x7a,0x65,0x6e,0x20,0x74,0x61
+,0x6e,0x75,0x73,0x69,0x74,0x76,0x61,0x6e
+,0x79,0x20,0x61,0x20,0x4e,0x65,0x74,0x4c
+,0x6f,0x63,0x6b,0x20,0x4b,0x66,0x74,0x2e
+,0x20,0x41,0x6c,0x74,0x61,0x6c,0x61,0x6e
+,0x6f,0x73,0x20,0x53,0x7a,0x6f,0x6c,0x67
+,0x61,0x6c,0x74,0x61,0x74,0x61,0x73,0x69
+,0x20,0x46,0x65,0x6c,0x74,0x65,0x74,0x65
+,0x6c,0x65,0x69,0x62,0x65,0x6e,0x20,0x6c
+,0x65,0x69,0x72,0x74,0x20,0x65,0x6c,0x6a
+,0x61,0x72,0x61,0x73,0x6f,0x6b,0x20,0x61
+,0x6c,0x61,0x70,0x6a,0x61,0x6e,0x20,0x6b
+,0x65,0x73,0x7a,0x75,0x6c,0x74,0x2e,0x20
+,0x41,0x20,0x68,0x69,0x74,0x65,0x6c,0x65
+,0x73,0x69,0x74,0x65,0x73,0x20,0x66,0x6f
+,0x6c,0x79,0x61,0x6d,0x61,0x74,0x61,0x74
+,0x20,0x61,0x20,0x4e,0x65,0x74,0x4c,0x6f
+,0x63,0x6b,0x20,0x4b,0x66,0x74,0x2e,0x20
+,0x74,0x65,0x72,0x6d,0x65,0x6b,0x66,0x65
+,0x6c,0x65,0x6c,0x6f,0x73,0x73,0x65,0x67
+,0x2d,0x62,0x69,0x7a,0x74,0x6f,0x73,0x69
+,0x74,0x61,0x73,0x61,0x20,0x76,0x65,0x64
+,0x69,0x2e,0x20,0x41,0x20,0x64,0x69,0x67
+,0x69,0x74,0x61,0x6c,0x69,0x73,0x20,0x61
+,0x6c,0x61,0x69,0x72,0x61,0x73,0x20,0x65
+,0x6c,0x66,0x6f,0x67,0x61,0x64,0x61,0x73
+,0x61,0x6e,0x61,0x6b,0x20,0x66,0x65,0x6c
+,0x74,0x65,0x74,0x65,0x6c,0x65,0x20,0x61
+,0x7a,0x20,0x65,0x6c,0x6f,0x69,0x72,0x74
+,0x20,0x65,0x6c,0x6c,0x65,0x6e,0x6f,0x72
+,0x7a,0x65,0x73,0x69,0x20,0x65,0x6c,0x6a
+,0x61,0x72,0x61,0x73,0x20,0x6d,0x65,0x67
+,0x74,0x65,0x74,0x65,0x6c,0x65,0x2e,0x20
+,0x41,0x7a,0x20,0x65,0x6c,0x6a,0x61,0x72
+,0x61,0x73,0x20,0x6c,0x65,0x69,0x72,0x61
+,0x73,0x61,0x20,0x6d,0x65,0x67,0x74,0x61
+,0x6c,0x61,0x6c,0x68,0x61,0x74,0x6f,0x20
+,0x61,0x20,0x4e,0x65,0x74,0x4c,0x6f,0x63
+,0x6b,0x20,0x4b,0x66,0x74,0x2e,0x20,0x49
+,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x20
+,0x68,0x6f,0x6e,0x6c,0x61,0x70,0x6a,0x61
+,0x6e,0x20,0x61,0x20,0x68,0x74,0x74,0x70
+,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x6e,0x65,0x74,0x6c,0x6f,0x63,0x6b,0x2e
+,0x6e,0x65,0x74,0x2f,0x64,0x6f,0x63,0x73
+,0x20,0x63,0x69,0x6d,0x65,0x6e,0x20,0x76
+,0x61,0x67,0x79,0x20,0x6b,0x65,0x72,0x68
+,0x65,0x74,0x6f,0x20,0x61,0x7a,0x20,0x65
+,0x6c,0x6c,0x65,0x6e,0x6f,0x72,0x7a,0x65
+,0x73,0x40,0x6e,0x65,0x74,0x6c,0x6f,0x63
+,0x6b,0x2e,0x6e,0x65,0x74,0x20,0x65,0x2d
+,0x6d,0x61,0x69,0x6c,0x20,0x63,0x69,0x6d
+,0x65,0x6e,0x2e,0x20,0x49,0x4d,0x50,0x4f
+,0x52,0x54,0x41,0x4e,0x54,0x21,0x20,0x54
+,0x68,0x65,0x20,0x69,0x73,0x73,0x75,0x61
+,0x6e,0x63,0x65,0x20,0x61,0x6e,0x64,0x20
+,0x74,0x68,0x65,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x66,0x20,0x74,0x68,0x69,0x73,0x20
+,0x63,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x73
+,0x75,0x62,0x6a,0x65,0x63,0x74,0x20,0x74
+,0x6f,0x20,0x74,0x68,0x65,0x20,0x4e,0x65
+,0x74,0x4c,0x6f,0x63,0x6b,0x20,0x43,0x50
+,0x53,0x20,0x61,0x76,0x61,0x69,0x6c,0x61
+,0x62,0x6c,0x65,0x20,0x61,0x74,0x20,0x68
+,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x6e,0x65,0x74,0x6c,0x6f
+,0x63,0x6b,0x2e,0x6e,0x65,0x74,0x2f,0x64
+,0x6f,0x63,0x73,0x20,0x6f,0x72,0x20,0x62
+,0x79,0x20,0x65,0x2d,0x6d,0x61,0x69,0x6c
+,0x20,0x61,0x74,0x20,0x63,0x70,0x73,0x40
+,0x6e,0x65,0x74,0x6c,0x6f,0x63,0x6b,0x2e
+,0x6e,0x65,0x74,0x2e,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x04,0x05,0x00,0x03,0x81,0x81,0x00,0x04
+,0xdb,0xae,0x8c,0x17,0xaf,0xf8,0x0e,0x90
+,0x31,0x4e,0xcd,0x3e,0x09,0xc0,0x6d,0x3a
+,0xb0,0xf8,0x33,0x4c,0x47,0x4c,0xe3,0x75
+,0x88,0x10,0x97,0xac,0xb0,0x38,0x15,0x91
+,0xc6,0x29,0x96,0xcc,0x21,0xc0,0x6d,0x3c
+,0xa5,0x74,0xcf,0xd8,0x82,0xa5,0x39,0xc3
+,0x65,0xe3,0x42,0x70,0xbb,0x22,0x90,0xe3
+,0x7d,0xdb,0x35,0x76,0xe1,0xa0,0xb5,0xda
+,0x9f,0x70,0x6e,0x93,0x1a,0x30,0x39,0x1d
+,0x30,0xdb,0x2e,0xe3,0x7c,0xb2,0x91,0xb2
+,0xd1,0x37,0x29,0xfa,0xb9,0xd6,0x17,0x5c
+,0x47,0x4f,0xe3,0x1d,0x38,0xeb,0x9f,0xd5
+,0x7b,0x95,0xa8,0x28,0x9e,0x15,0x4a,0xd1
+,0xd1,0xd0,0x2b,0x00,0x97,0xa0,0xe2,0x92
+,0x36,0x2b,0x63,0xac,0x58,0x01,0x6b,0x33
+,0x29,0x50,0x86,0x83,0xf1,0x01,0x48};
+const unsigned int NptTlsTrustAnchor_Base_0092_Size = 1359;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0093.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0093.cpp
new file mode 100644
index 0000000..f9b5305
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0093.cpp
@@ -0,0 +1,207 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* NetLock Express (Class C) Root */
+const unsigned char NptTlsTrustAnchor_Base_0093_Data[1363] = {
+0x30,0x82,0x05,0x4f,0x30,0x82,0x04,0xb8
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x68
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x81,0x9b,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x48,0x55,0x31
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x07
+,0x13,0x08,0x42,0x75,0x64,0x61,0x70,0x65
+,0x73,0x74,0x31,0x27,0x30,0x25,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x1e,0x4e,0x65,0x74
+,0x4c,0x6f,0x63,0x6b,0x20,0x48,0x61,0x6c
+,0x6f,0x7a,0x61,0x74,0x62,0x69,0x7a,0x74
+,0x6f,0x6e,0x73,0x61,0x67,0x69,0x20,0x4b
+,0x66,0x74,0x2e,0x31,0x1a,0x30,0x18,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x11,0x54,0x61
+,0x6e,0x75,0x73,0x69,0x74,0x76,0x61,0x6e
+,0x79,0x6b,0x69,0x61,0x64,0x6f,0x6b,0x31
+,0x34,0x30,0x32,0x06,0x03,0x55,0x04,0x03
+,0x13,0x2b,0x4e,0x65,0x74,0x4c,0x6f,0x63
+,0x6b,0x20,0x45,0x78,0x70,0x72,0x65,0x73
+,0x73,0x7a,0x20,0x28,0x43,0x6c,0x61,0x73
+,0x73,0x20,0x43,0x29,0x20,0x54,0x61,0x6e
+,0x75,0x73,0x69,0x74,0x76,0x61,0x6e,0x79
+,0x6b,0x69,0x61,0x64,0x6f,0x30,0x1e,0x17
+,0x0d,0x39,0x39,0x30,0x32,0x32,0x35,0x31
+,0x34,0x30,0x38,0x31,0x31,0x5a,0x17,0x0d
+,0x31,0x39,0x30,0x32,0x32,0x30,0x31,0x34
+,0x30,0x38,0x31,0x31,0x5a,0x30,0x81,0x9b
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x48,0x55,0x31,0x11,0x30
+,0x0f,0x06,0x03,0x55,0x04,0x07,0x13,0x08
+,0x42,0x75,0x64,0x61,0x70,0x65,0x73,0x74
+,0x31,0x27,0x30,0x25,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x1e,0x4e,0x65,0x74,0x4c,0x6f
+,0x63,0x6b,0x20,0x48,0x61,0x6c,0x6f,0x7a
+,0x61,0x74,0x62,0x69,0x7a,0x74,0x6f,0x6e
+,0x73,0x61,0x67,0x69,0x20,0x4b,0x66,0x74
+,0x2e,0x31,0x1a,0x30,0x18,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x11,0x54,0x61,0x6e,0x75
+,0x73,0x69,0x74,0x76,0x61,0x6e,0x79,0x6b
+,0x69,0x61,0x64,0x6f,0x6b,0x31,0x34,0x30
+,0x32,0x06,0x03,0x55,0x04,0x03,0x13,0x2b
+,0x4e,0x65,0x74,0x4c,0x6f,0x63,0x6b,0x20
+,0x45,0x78,0x70,0x72,0x65,0x73,0x73,0x7a
+,0x20,0x28,0x43,0x6c,0x61,0x73,0x73,0x20
+,0x43,0x29,0x20,0x54,0x61,0x6e,0x75,0x73
+,0x69,0x74,0x76,0x61,0x6e,0x79,0x6b,0x69
+,0x61,0x64,0x6f,0x30,0x81,0x9f,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d
+,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00
+,0xeb,0xec,0xb0,0x6c,0x61,0x8a,0x23,0x25
+,0xaf,0x60,0x20,0xe3,0xd9,0x9f,0xfc,0x93
+,0x0b,0xdb,0x5d,0x8d,0xb0,0xa1,0xb3,0x40
+,0x3a,0x82,0xce,0xfd,0x75,0xe0,0x78,0x32
+,0x03,0x86,0x5a,0x86,0x95,0x91,0xed,0x53
+,0xfa,0x9d,0x40,0xfc,0xe6,0xe8,0xdd,0xd9
+,0x5b,0x7a,0x03,0xbd,0x5d,0xf3,0x3b,0x0c
+,0xc3,0x51,0x79,0x9b,0xad,0x55,0xa0,0xe9
+,0xd0,0x03,0x10,0xaf,0x0a,0xba,0x14,0x42
+,0xd9,0x52,0x26,0x11,0x22,0xc7,0xd2,0x20
+,0xcc,0x82,0xa4,0x9a,0xa9,0xfe,0xb8,0x81
+,0x76,0x9d,0x6a,0xb7,0xd2,0x36,0x75,0x3e
+,0xb1,0x86,0x09,0xf6,0x6e,0x6d,0x7e,0x4e
+,0xb7,0x7a,0xec,0xae,0x71,0x84,0xf6,0x04
+,0x33,0x08,0x25,0x32,0xeb,0x74,0xac,0x16
+,0x44,0xc6,0xe4,0x40,0x93,0x1d,0x7f,0xad
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x02
+,0x9f,0x30,0x82,0x02,0x9b,0x30,0x12,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x08,0x30,0x06,0x01,0x01,0xff,0x02,0x01
+,0x04,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x00
+,0x06,0x30,0x11,0x06,0x09,0x60,0x86,0x48
+,0x01,0x86,0xf8,0x42,0x01,0x01,0x04,0x04
+,0x03,0x02,0x00,0x07,0x30,0x82,0x02,0x60
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x0d,0x04,0x82,0x02,0x51,0x16
+,0x82,0x02,0x4d,0x46,0x49,0x47,0x59,0x45
+,0x4c,0x45,0x4d,0x21,0x20,0x45,0x7a,0x65
+,0x6e,0x20,0x74,0x61,0x6e,0x75,0x73,0x69
+,0x74,0x76,0x61,0x6e,0x79,0x20,0x61,0x20
+,0x4e,0x65,0x74,0x4c,0x6f,0x63,0x6b,0x20
+,0x4b,0x66,0x74,0x2e,0x20,0x41,0x6c,0x74
+,0x61,0x6c,0x61,0x6e,0x6f,0x73,0x20,0x53
+,0x7a,0x6f,0x6c,0x67,0x61,0x6c,0x74,0x61
+,0x74,0x61,0x73,0x69,0x20,0x46,0x65,0x6c
+,0x74,0x65,0x74,0x65,0x6c,0x65,0x69,0x62
+,0x65,0x6e,0x20,0x6c,0x65,0x69,0x72,0x74
+,0x20,0x65,0x6c,0x6a,0x61,0x72,0x61,0x73
+,0x6f,0x6b,0x20,0x61,0x6c,0x61,0x70,0x6a
+,0x61,0x6e,0x20,0x6b,0x65,0x73,0x7a,0x75
+,0x6c,0x74,0x2e,0x20,0x41,0x20,0x68,0x69
+,0x74,0x65,0x6c,0x65,0x73,0x69,0x74,0x65
+,0x73,0x20,0x66,0x6f,0x6c,0x79,0x61,0x6d
+,0x61,0x74,0x61,0x74,0x20,0x61,0x20,0x4e
+,0x65,0x74,0x4c,0x6f,0x63,0x6b,0x20,0x4b
+,0x66,0x74,0x2e,0x20,0x74,0x65,0x72,0x6d
+,0x65,0x6b,0x66,0x65,0x6c,0x65,0x6c,0x6f
+,0x73,0x73,0x65,0x67,0x2d,0x62,0x69,0x7a
+,0x74,0x6f,0x73,0x69,0x74,0x61,0x73,0x61
+,0x20,0x76,0x65,0x64,0x69,0x2e,0x20,0x41
+,0x20,0x64,0x69,0x67,0x69,0x74,0x61,0x6c
+,0x69,0x73,0x20,0x61,0x6c,0x61,0x69,0x72
+,0x61,0x73,0x20,0x65,0x6c,0x66,0x6f,0x67
+,0x61,0x64,0x61,0x73,0x61,0x6e,0x61,0x6b
+,0x20,0x66,0x65,0x6c,0x74,0x65,0x74,0x65
+,0x6c,0x65,0x20,0x61,0x7a,0x20,0x65,0x6c
+,0x6f,0x69,0x72,0x74,0x20,0x65,0x6c,0x6c
+,0x65,0x6e,0x6f,0x72,0x7a,0x65,0x73,0x69
+,0x20,0x65,0x6c,0x6a,0x61,0x72,0x61,0x73
+,0x20,0x6d,0x65,0x67,0x74,0x65,0x74,0x65
+,0x6c,0x65,0x2e,0x20,0x41,0x7a,0x20,0x65
+,0x6c,0x6a,0x61,0x72,0x61,0x73,0x20,0x6c
+,0x65,0x69,0x72,0x61,0x73,0x61,0x20,0x6d
+,0x65,0x67,0x74,0x61,0x6c,0x61,0x6c,0x68
+,0x61,0x74,0x6f,0x20,0x61,0x20,0x4e,0x65
+,0x74,0x4c,0x6f,0x63,0x6b,0x20,0x4b,0x66
+,0x74,0x2e,0x20,0x49,0x6e,0x74,0x65,0x72
+,0x6e,0x65,0x74,0x20,0x68,0x6f,0x6e,0x6c
+,0x61,0x70,0x6a,0x61,0x6e,0x20,0x61,0x20
+,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f
+,0x77,0x77,0x77,0x2e,0x6e,0x65,0x74,0x6c
+,0x6f,0x63,0x6b,0x2e,0x6e,0x65,0x74,0x2f
+,0x64,0x6f,0x63,0x73,0x20,0x63,0x69,0x6d
+,0x65,0x6e,0x20,0x76,0x61,0x67,0x79,0x20
+,0x6b,0x65,0x72,0x68,0x65,0x74,0x6f,0x20
+,0x61,0x7a,0x20,0x65,0x6c,0x6c,0x65,0x6e
+,0x6f,0x72,0x7a,0x65,0x73,0x40,0x6e,0x65
+,0x74,0x6c,0x6f,0x63,0x6b,0x2e,0x6e,0x65
+,0x74,0x20,0x65,0x2d,0x6d,0x61,0x69,0x6c
+,0x20,0x63,0x69,0x6d,0x65,0x6e,0x2e,0x20
+,0x49,0x4d,0x50,0x4f,0x52,0x54,0x41,0x4e
+,0x54,0x21,0x20,0x54,0x68,0x65,0x20,0x69
+,0x73,0x73,0x75,0x61,0x6e,0x63,0x65,0x20
+,0x61,0x6e,0x64,0x20,0x74,0x68,0x65,0x20
+,0x75,0x73,0x65,0x20,0x6f,0x66,0x20,0x74
+,0x68,0x69,0x73,0x20,0x63,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20
+,0x69,0x73,0x20,0x73,0x75,0x62,0x6a,0x65
+,0x63,0x74,0x20,0x74,0x6f,0x20,0x74,0x68
+,0x65,0x20,0x4e,0x65,0x74,0x4c,0x6f,0x63
+,0x6b,0x20,0x43,0x50,0x53,0x20,0x61,0x76
+,0x61,0x69,0x6c,0x61,0x62,0x6c,0x65,0x20
+,0x61,0x74,0x20,0x68,0x74,0x74,0x70,0x73
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6e
+,0x65,0x74,0x6c,0x6f,0x63,0x6b,0x2e,0x6e
+,0x65,0x74,0x2f,0x64,0x6f,0x63,0x73,0x20
+,0x6f,0x72,0x20,0x62,0x79,0x20,0x65,0x2d
+,0x6d,0x61,0x69,0x6c,0x20,0x61,0x74,0x20
+,0x63,0x70,0x73,0x40,0x6e,0x65,0x74,0x6c
+,0x6f,0x63,0x6b,0x2e,0x6e,0x65,0x74,0x2e
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x03
+,0x81,0x81,0x00,0x10,0xad,0x7f,0xd7,0x0c
+,0x32,0x80,0x0a,0xd8,0x86,0xf1,0x79,0x98
+,0xb5,0xad,0xd4,0xcd,0xb3,0x36,0xc4,0x96
+,0x48,0xc1,0x5c,0xcd,0x9a,0xd9,0x05,0x2e
+,0x9f,0xbe,0x50,0xeb,0xf4,0x26,0x14,0x10
+,0x2d,0xd4,0x66,0x17,0xf8,0x9e,0xc1,0x27
+,0xfd,0xf1,0xed,0xe4,0x7b,0x4b,0xa0,0x6c
+,0xb5,0xab,0x9a,0x57,0x70,0xa6,0xed,0xa0
+,0xa4,0xed,0x2e,0xf5,0xfd,0xfc,0xbd,0xfe
+,0x4d,0x37,0x08,0x0c,0xbc,0xe3,0x96,0x83
+,0x22,0xf5,0x49,0x1b,0x7f,0x4b,0x2b,0xb4
+,0x54,0xc1,0x80,0x7c,0x99,0x4e,0x1d,0xd0
+,0x8c,0xee,0xd0,0xac,0xe5,0x92,0xfa,0x75
+,0x56,0xfe,0x64,0xa0,0x13,0x8f,0xb8,0xb8
+,0x16,0x9d,0x61,0x05,0x67,0x80,0xc8,0xd0
+,0xd8,0xa5,0x07,0x02,0x34,0x98,0x04,0x8d
+,0x33,0x04,0xd4};
+const unsigned int NptTlsTrustAnchor_Base_0093_Size = 1363;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0094.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0094.cpp
new file mode 100644
index 0000000..4e9ef2e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0094.cpp
@@ -0,0 +1,171 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* XRamp Global CA Root */
+const unsigned char NptTlsTrustAnchor_Base_0094_Data[1076] = {
+0x30,0x82,0x04,0x30,0x30,0x82,0x03,0x18
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x50
+,0x94,0x6c,0xec,0x18,0xea,0xd5,0x9c,0x4d
+,0xd5,0x97,0xef,0x75,0x8f,0xa0,0xad,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0x82,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x1e
+,0x30,0x1c,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x15,0x77,0x77,0x77,0x2e,0x78,0x72,0x61
+,0x6d,0x70,0x73,0x65,0x63,0x75,0x72,0x69
+,0x74,0x79,0x2e,0x63,0x6f,0x6d,0x31,0x24
+,0x30,0x22,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x1b,0x58,0x52,0x61,0x6d,0x70,0x20,0x53
+,0x65,0x63,0x75,0x72,0x69,0x74,0x79,0x20
+,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73
+,0x20,0x49,0x6e,0x63,0x31,0x2d,0x30,0x2b
+,0x06,0x03,0x55,0x04,0x03,0x13,0x24,0x58
+,0x52,0x61,0x6d,0x70,0x20,0x47,0x6c,0x6f
+,0x62,0x61,0x6c,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x30,0x1e,0x17,0x0d,0x30
+,0x34,0x31,0x31,0x30,0x31,0x31,0x37,0x31
+,0x34,0x30,0x34,0x5a,0x17,0x0d,0x33,0x35
+,0x30,0x31,0x30,0x31,0x30,0x35,0x33,0x37
+,0x31,0x39,0x5a,0x30,0x81,0x82,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x55,0x53,0x31,0x1e,0x30,0x1c,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x15,0x77,0x77
+,0x77,0x2e,0x78,0x72,0x61,0x6d,0x70,0x73
+,0x65,0x63,0x75,0x72,0x69,0x74,0x79,0x2e
+,0x63,0x6f,0x6d,0x31,0x24,0x30,0x22,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x1b,0x58,0x52
+,0x61,0x6d,0x70,0x20,0x53,0x65,0x63,0x75
+,0x72,0x69,0x74,0x79,0x20,0x53,0x65,0x72
+,0x76,0x69,0x63,0x65,0x73,0x20,0x49,0x6e
+,0x63,0x31,0x2d,0x30,0x2b,0x06,0x03,0x55
+,0x04,0x03,0x13,0x24,0x58,0x52,0x61,0x6d
+,0x70,0x20,0x47,0x6c,0x6f,0x62,0x61,0x6c
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0x98,0x24,0x1e,0xbd,0x15,0xb4,0xba
+,0xdf,0xc7,0x8c,0xa5,0x27,0xb6,0x38,0x0b
+,0x69,0xf3,0xb6,0x4e,0xa8,0x2c,0x2e,0x21
+,0x1d,0x5c,0x44,0xdf,0x21,0x5d,0x7e,0x23
+,0x74,0xfe,0x5e,0x7e,0xb4,0x4a,0xb7,0xa6
+,0xad,0x1f,0xae,0xe0,0x06,0x16,0xe2,0x9b
+,0x5b,0xd9,0x67,0x74,0x6b,0x5d,0x80,0x8f
+,0x29,0x9d,0x86,0x1b,0xd9,0x9c,0x0d,0x98
+,0x6d,0x76,0x10,0x28,0x58,0xe4,0x65,0xb0
+,0x7f,0x4a,0x98,0x79,0x9f,0xe0,0xc3,0x31
+,0x7e,0x80,0x2b,0xb5,0x8c,0xc0,0x40,0x3b
+,0x11,0x86,0xd0,0xcb,0xa2,0x86,0x36,0x60
+,0xa4,0xd5,0x30,0x82,0x6d,0xd9,0x6e,0xd0
+,0x0f,0x12,0x04,0x33,0x97,0x5f,0x4f,0x61
+,0x5a,0xf0,0xe4,0xf9,0x91,0xab,0xe7,0x1d
+,0x3b,0xbc,0xe8,0xcf,0xf4,0x6b,0x2d,0x34
+,0x7c,0xe2,0x48,0x61,0x1c,0x8e,0xf3,0x61
+,0x44,0xcc,0x6f,0xa0,0x4a,0xa9,0x94,0xb0
+,0x4d,0xda,0xe7,0xa9,0x34,0x7a,0x72,0x38
+,0xa8,0x41,0xcc,0x3c,0x94,0x11,0x7d,0xeb
+,0xc8,0xa6,0x8c,0xb7,0x86,0xcb,0xca,0x33
+,0x3b,0xd9,0x3d,0x37,0x8b,0xfb,0x7a,0x3e
+,0x86,0x2c,0xe7,0x73,0xd7,0x0a,0x57,0xac
+,0x64,0x9b,0x19,0xeb,0xf4,0x0f,0x04,0x08
+,0x8a,0xac,0x03,0x17,0x19,0x64,0xf4,0x5a
+,0x25,0x22,0x8d,0x34,0x2c,0xb2,0xf6,0x68
+,0x1d,0x12,0x6d,0xd3,0x8a,0x1e,0x14,0xda
+,0xc4,0x8f,0xa6,0xe2,0x23,0x85,0xd5,0x7a
+,0x0d,0xbd,0x6a,0xe0,0xe9,0xec,0xec,0x17
+,0xbb,0x42,0x1b,0x67,0xaa,0x25,0xed,0x45
+,0x83,0x21,0xfc,0xc1,0xc9,0x7c,0xd5,0x62
+,0x3e,0xfa,0xf2,0xc5,0x2d,0xd3,0xfd,0xd4
+,0x65,0x02,0x03,0x01,0x00,0x01,0xa3,0x81
+,0x9f,0x30,0x81,0x9c,0x30,0x13,0x06,0x09
+,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x14
+,0x02,0x04,0x06,0x1e,0x04,0x00,0x43,0x00
+,0x41,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f
+,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0xc6,0x4f,0xa2,0x3d,0x06,0x63
+,0x84,0x09,0x9c,0xce,0x62,0xe4,0x04,0xac
+,0x8d,0x5c,0xb5,0xe9,0xb6,0x1b,0x30,0x36
+,0x06,0x03,0x55,0x1d,0x1f,0x04,0x2f,0x30
+,0x2d,0x30,0x2b,0xa0,0x29,0xa0,0x27,0x86
+,0x25,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x63,0x72,0x6c,0x2e,0x78,0x72,0x61,0x6d
+,0x70,0x73,0x65,0x63,0x75,0x72,0x69,0x74
+,0x79,0x2e,0x63,0x6f,0x6d,0x2f,0x58,0x47
+,0x43,0x41,0x2e,0x63,0x72,0x6c,0x30,0x10
+,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82
+,0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x91,0x15,0x39,0x03
+,0x01,0x1b,0x67,0xfb,0x4a,0x1c,0xf9,0x0a
+,0x60,0x5b,0xa1,0xda,0x4d,0x97,0x62,0xf9
+,0x24,0x53,0x27,0xd7,0x82,0x64,0x4e,0x90
+,0x2e,0xc3,0x49,0x1b,0x2b,0x9a,0xdc,0xfc
+,0xa8,0x78,0x67,0x35,0xf1,0x1d,0xf0,0x11
+,0xbd,0xb7,0x48,0xe3,0x10,0xf6,0x0d,0xdf
+,0x3f,0xd2,0xc9,0xb6,0xaa,0x55,0xa4,0x48
+,0xba,0x02,0xdb,0xde,0x59,0x2e,0x15,0x5b
+,0x3b,0x9d,0x16,0x7d,0x47,0xd7,0x37,0xea
+,0x5f,0x4d,0x76,0x12,0x36,0xbb,0x1f,0xd7
+,0xa1,0x81,0x04,0x46,0x20,0xa3,0x2c,0x6d
+,0xa9,0x9e,0x01,0x7e,0x3f,0x29,0xce,0x00
+,0x93,0xdf,0xfd,0xc9,0x92,0x73,0x89,0x89
+,0x64,0x9e,0xe7,0x2b,0xe4,0x1c,0x91,0x2c
+,0xd2,0xb9,0xce,0x7d,0xce,0x6f,0x31,0x99
+,0xd3,0xe6,0xbe,0xd2,0x1e,0x90,0xf0,0x09
+,0x14,0x79,0x5c,0x23,0xab,0x4d,0xd2,0xda
+,0x21,0x1f,0x4d,0x99,0x79,0x9d,0xe1,0xcf
+,0x27,0x9f,0x10,0x9b,0x1c,0x88,0x0d,0xb0
+,0x8a,0x64,0x41,0x31,0xb8,0x0e,0x6c,0x90
+,0x24,0xa4,0x9b,0x5c,0x71,0x8f,0xba,0xbb
+,0x7e,0x1c,0x1b,0xdb,0x6a,0x80,0x0f,0x21
+,0xbc,0xe9,0xdb,0xa6,0xb7,0x40,0xf4,0xb2
+,0x8b,0xa9,0xb1,0xe4,0xef,0x9a,0x1a,0xd0
+,0x3d,0x69,0x99,0xee,0xa8,0x28,0xa3,0xe1
+,0x3c,0xb3,0xf0,0xb2,0x11,0x9c,0xcf,0x7c
+,0x40,0xe6,0xdd,0xe7,0x43,0x7d,0xa2,0xd8
+,0x3a,0xb5,0xa9,0x8d,0xf2,0x34,0x99,0xc4
+,0xd4,0x10,0xe1,0x06,0xfd,0x09,0x84,0x10
+,0x3b,0xee,0xc4,0x4c,0xf4,0xec,0x27,0x7c
+,0x42,0xc2,0x74,0x7c,0x82,0x8a,0x09,0xc9
+,0xb4,0x03,0x25,0xbc};
+const unsigned int NptTlsTrustAnchor_Base_0094_Size = 1076;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0095.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0095.cpp
new file mode 100644
index 0000000..160631b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0095.cpp
@@ -0,0 +1,165 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Go Daddy Class 2 CA */
+const unsigned char NptTlsTrustAnchor_Base_0095_Data[1028] = {
+0x30,0x82,0x04,0x00,0x30,0x82,0x02,0xe8
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x63,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x21
+,0x30,0x1f,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x18,0x54,0x68,0x65,0x20,0x47,0x6f,0x20
+,0x44,0x61,0x64,0x64,0x79,0x20,0x47,0x72
+,0x6f,0x75,0x70,0x2c,0x20,0x49,0x6e,0x63
+,0x2e,0x31,0x31,0x30,0x2f,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x28,0x47,0x6f,0x20,0x44
+,0x61,0x64,0x64,0x79,0x20,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x32,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x30,0x1e,0x17,0x0d
+,0x30,0x34,0x30,0x36,0x32,0x39,0x31,0x37
+,0x30,0x36,0x32,0x30,0x5a,0x17,0x0d,0x33
+,0x34,0x30,0x36,0x32,0x39,0x31,0x37,0x30
+,0x36,0x32,0x30,0x5a,0x30,0x63,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x55,0x53,0x31,0x21,0x30,0x1f,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x18,0x54,0x68
+,0x65,0x20,0x47,0x6f,0x20,0x44,0x61,0x64
+,0x64,0x79,0x20,0x47,0x72,0x6f,0x75,0x70
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x31
+,0x30,0x2f,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x28,0x47,0x6f,0x20,0x44,0x61,0x64,0x64
+,0x79,0x20,0x43,0x6c,0x61,0x73,0x73,0x20
+,0x32,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x30,0x82,0x01,0x20,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0d
+,0x00,0x30,0x82,0x01,0x08,0x02,0x82,0x01
+,0x01,0x00,0xde,0x9d,0xd7,0xea,0x57,0x18
+,0x49,0xa1,0x5b,0xeb,0xd7,0x5f,0x48,0x86
+,0xea,0xbe,0xdd,0xff,0xe4,0xef,0x67,0x1c
+,0xf4,0x65,0x68,0xb3,0x57,0x71,0xa0,0x5e
+,0x77,0xbb,0xed,0x9b,0x49,0xe9,0x70,0x80
+,0x3d,0x56,0x18,0x63,0x08,0x6f,0xda,0xf2
+,0xcc,0xd0,0x3f,0x7f,0x02,0x54,0x22,0x54
+,0x10,0xd8,0xb2,0x81,0xd4,0xc0,0x75,0x3d
+,0x4b,0x7f,0xc7,0x77,0xc3,0x3e,0x78,0xab
+,0x1a,0x03,0xb5,0x20,0x6b,0x2f,0x6a,0x2b
+,0xb1,0xc5,0x88,0x7e,0xc4,0xbb,0x1e,0xb0
+,0xc1,0xd8,0x45,0x27,0x6f,0xaa,0x37,0x58
+,0xf7,0x87,0x26,0xd7,0xd8,0x2d,0xf6,0xa9
+,0x17,0xb7,0x1f,0x72,0x36,0x4e,0xa6,0x17
+,0x3f,0x65,0x98,0x92,0xdb,0x2a,0x6e,0x5d
+,0xa2,0xfe,0x88,0xe0,0x0b,0xde,0x7f,0xe5
+,0x8d,0x15,0xe1,0xeb,0xcb,0x3a,0xd5,0xe2
+,0x12,0xa2,0x13,0x2d,0xd8,0x8e,0xaf,0x5f
+,0x12,0x3d,0xa0,0x08,0x05,0x08,0xb6,0x5c
+,0xa5,0x65,0x38,0x04,0x45,0x99,0x1e,0xa3
+,0x60,0x60,0x74,0xc5,0x41,0xa5,0x72,0x62
+,0x1b,0x62,0xc5,0x1f,0x6f,0x5f,0x1a,0x42
+,0xbe,0x02,0x51,0x65,0xa8,0xae,0x23,0x18
+,0x6a,0xfc,0x78,0x03,0xa9,0x4d,0x7f,0x80
+,0xc3,0xfa,0xab,0x5a,0xfc,0xa1,0x40,0xa4
+,0xca,0x19,0x16,0xfe,0xb2,0xc8,0xef,0x5e
+,0x73,0x0d,0xee,0x77,0xbd,0x9a,0xf6,0x79
+,0x98,0xbc,0xb1,0x07,0x67,0xa2,0x15,0x0d
+,0xdd,0xa0,0x58,0xc6,0x44,0x7b,0x0a,0x3e
+,0x62,0x28,0x5f,0xba,0x41,0x07,0x53,0x58
+,0xcf,0x11,0x7e,0x38,0x74,0xc5,0xf8,0xff
+,0xb5,0x69,0x90,0x8f,0x84,0x74,0xea,0x97
+,0x1b,0xaf,0x02,0x01,0x03,0xa3,0x81,0xc0
+,0x30,0x81,0xbd,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0xd2,0xc4
+,0xb0,0xd2,0x91,0xd4,0x4c,0x11,0x71,0xb3
+,0x61,0xcb,0x3d,0xa1,0xfe,0xdd,0xa8,0x6a
+,0xd4,0xe3,0x30,0x81,0x8d,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x81,0x85,0x30,0x81,0x82
+,0x80,0x14,0xd2,0xc4,0xb0,0xd2,0x91,0xd4
+,0x4c,0x11,0x71,0xb3,0x61,0xcb,0x3d,0xa1
+,0xfe,0xdd,0xa8,0x6a,0xd4,0xe3,0xa1,0x67
+,0xa4,0x65,0x30,0x63,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x21,0x30,0x1f,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x18,0x54,0x68,0x65,0x20
+,0x47,0x6f,0x20,0x44,0x61,0x64,0x64,0x79
+,0x20,0x47,0x72,0x6f,0x75,0x70,0x2c,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x31,0x30,0x2f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x28,0x47
+,0x6f,0x20,0x44,0x61,0x64,0x64,0x79,0x20
+,0x43,0x6c,0x61,0x73,0x73,0x20,0x32,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x82
+,0x01,0x00,0x30,0x0c,0x06,0x03,0x55,0x1d
+,0x13,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x32,0x4b,0xf3,0xb2
+,0xca,0x3e,0x91,0xfc,0x12,0xc6,0xa1,0x07
+,0x8c,0x8e,0x77,0xa0,0x33,0x06,0x14,0x5c
+,0x90,0x1e,0x18,0xf7,0x08,0xa6,0x3d,0x0a
+,0x19,0xf9,0x87,0x80,0x11,0x6e,0x69,0xe4
+,0x96,0x17,0x30,0xff,0x34,0x91,0x63,0x72
+,0x38,0xee,0xcc,0x1c,0x01,0xa3,0x1d,0x94
+,0x28,0xa4,0x31,0xf6,0x7a,0xc4,0x54,0xd7
+,0xf6,0xe5,0x31,0x58,0x03,0xa2,0xcc,0xce
+,0x62,0xdb,0x94,0x45,0x73,0xb5,0xbf,0x45
+,0xc9,0x24,0xb5,0xd5,0x82,0x02,0xad,0x23
+,0x79,0x69,0x8d,0xb8,0xb6,0x4d,0xce,0xcf
+,0x4c,0xca,0x33,0x23,0xe8,0x1c,0x88,0xaa
+,0x9d,0x8b,0x41,0x6e,0x16,0xc9,0x20,0xe5
+,0x89,0x9e,0xcd,0x3b,0xda,0x70,0xf7,0x7e
+,0x99,0x26,0x20,0x14,0x54,0x25,0xab,0x6e
+,0x73,0x85,0xe6,0x9b,0x21,0x9d,0x0a,0x6c
+,0x82,0x0e,0xa8,0xf8,0xc2,0x0c,0xfa,0x10
+,0x1e,0x6c,0x96,0xef,0x87,0x0d,0xc4,0x0f
+,0x61,0x8b,0xad,0xee,0x83,0x2b,0x95,0xf8
+,0x8e,0x92,0x84,0x72,0x39,0xeb,0x20,0xea
+,0x83,0xed,0x83,0xcd,0x97,0x6e,0x08,0xbc
+,0xeb,0x4e,0x26,0xb6,0x73,0x2b,0xe4,0xd3
+,0xf6,0x4c,0xfe,0x26,0x71,0xe2,0x61,0x11
+,0x74,0x4a,0xff,0x57,0x1a,0x87,0x0f,0x75
+,0x48,0x2e,0xcf,0x51,0x69,0x17,0xa0,0x02
+,0x12,0x61,0x95,0xd5,0xd1,0x40,0xb2,0x10
+,0x4c,0xee,0xc4,0xac,0x10,0x43,0xa6,0xa5
+,0x9e,0x0a,0xd5,0x95,0x62,0x9a,0x0d,0xcf
+,0x88,0x82,0xc5,0x32,0x0c,0xe4,0x2b,0x9f
+,0x45,0xe6,0x0d,0x9f,0x28,0x9c,0xb1,0xb9
+,0x2a,0x5a,0x57,0xad,0x37,0x0f,0xaf,0x1d
+,0x7f,0xdb,0xbd,0x9f};
+const unsigned int NptTlsTrustAnchor_Base_0095_Size = 1028;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0096.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0096.cpp
new file mode 100644
index 0000000..de0ba65
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0096.cpp
@@ -0,0 +1,167 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Starfield Class 2 CA */
+const unsigned char NptTlsTrustAnchor_Base_0096_Data[1043] = {
+0x30,0x82,0x04,0x0f,0x30,0x82,0x02,0xf7
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x68,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x25
+,0x30,0x23,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x1c,0x53,0x74,0x61,0x72,0x66,0x69,0x65
+,0x6c,0x64,0x20,0x54,0x65,0x63,0x68,0x6e
+,0x6f,0x6c,0x6f,0x67,0x69,0x65,0x73,0x2c
+,0x20,0x49,0x6e,0x63,0x2e,0x31,0x32,0x30
+,0x30,0x06,0x03,0x55,0x04,0x0b,0x13,0x29
+,0x53,0x74,0x61,0x72,0x66,0x69,0x65,0x6c
+,0x64,0x20,0x43,0x6c,0x61,0x73,0x73,0x20
+,0x32,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x30,0x1e,0x17,0x0d,0x30,0x34,0x30
+,0x36,0x32,0x39,0x31,0x37,0x33,0x39,0x31
+,0x36,0x5a,0x17,0x0d,0x33,0x34,0x30,0x36
+,0x32,0x39,0x31,0x37,0x33,0x39,0x31,0x36
+,0x5a,0x30,0x68,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53
+,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x1c,0x53,0x74,0x61,0x72,0x66
+,0x69,0x65,0x6c,0x64,0x20,0x54,0x65,0x63
+,0x68,0x6e,0x6f,0x6c,0x6f,0x67,0x69,0x65
+,0x73,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31
+,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x29,0x53,0x74,0x61,0x72,0x66,0x69
+,0x65,0x6c,0x64,0x20,0x43,0x6c,0x61,0x73
+,0x73,0x20,0x32,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x30,0x82,0x01,0x20,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0d,0x00,0x30,0x82,0x01,0x08,0x02
+,0x82,0x01,0x01,0x00,0xb7,0x32,0xc8,0xfe
+,0xe9,0x71,0xa6,0x04,0x85,0xad,0x0c,0x11
+,0x64,0xdf,0xce,0x4d,0xef,0xc8,0x03,0x18
+,0x87,0x3f,0xa1,0xab,0xfb,0x3c,0xa6,0x9f
+,0xf0,0xc3,0xa1,0xda,0xd4,0xd8,0x6e,0x2b
+,0x53,0x90,0xfb,0x24,0xa4,0x3e,0x84,0xf0
+,0x9e,0xe8,0x5f,0xec,0xe5,0x27,0x44,0xf5
+,0x28,0xa6,0x3f,0x7b,0xde,0xe0,0x2a,0xf0
+,0xc8,0xaf,0x53,0x2f,0x9e,0xca,0x05,0x01
+,0x93,0x1e,0x8f,0x66,0x1c,0x39,0xa7,0x4d
+,0xfa,0x5a,0xb6,0x73,0x04,0x25,0x66,0xeb
+,0x77,0x7f,0xe7,0x59,0xc6,0x4a,0x99,0x25
+,0x14,0x54,0xeb,0x26,0xc7,0xf3,0x7f,0x19
+,0xd5,0x30,0x70,0x8f,0xaf,0xb0,0x46,0x2a
+,0xff,0xad,0xeb,0x29,0xed,0xd7,0x9f,0xaa
+,0x04,0x87,0xa3,0xd4,0xf9,0x89,0xa5,0x34
+,0x5f,0xdb,0x43,0x91,0x82,0x36,0xd9,0x66
+,0x3c,0xb1,0xb8,0xb9,0x82,0xfd,0x9c,0x3a
+,0x3e,0x10,0xc8,0x3b,0xef,0x06,0x65,0x66
+,0x7a,0x9b,0x19,0x18,0x3d,0xff,0x71,0x51
+,0x3c,0x30,0x2e,0x5f,0xbe,0x3d,0x77,0x73
+,0xb2,0x5d,0x06,0x6c,0xc3,0x23,0x56,0x9a
+,0x2b,0x85,0x26,0x92,0x1c,0xa7,0x02,0xb3
+,0xe4,0x3f,0x0d,0xaf,0x08,0x79,0x82,0xb8
+,0x36,0x3d,0xea,0x9c,0xd3,0x35,0xb3,0xbc
+,0x69,0xca,0xf5,0xcc,0x9d,0xe8,0xfd,0x64
+,0x8d,0x17,0x80,0x33,0x6e,0x5e,0x4a,0x5d
+,0x99,0xc9,0x1e,0x87,0xb4,0x9d,0x1a,0xc0
+,0xd5,0x6e,0x13,0x35,0x23,0x5e,0xdf,0x9b
+,0x5f,0x3d,0xef,0xd6,0xf7,0x76,0xc2,0xea
+,0x3e,0xbb,0x78,0x0d,0x1c,0x42,0x67,0x6b
+,0x04,0xd8,0xf8,0xd6,0xda,0x6f,0x8b,0xf2
+,0x44,0xa0,0x01,0xab,0x02,0x01,0x03,0xa3
+,0x81,0xc5,0x30,0x81,0xc2,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0xbf,0x5f,0xb7,0xd1,0xce,0xdd,0x1f,0x86
+,0xf4,0x5b,0x55,0xac,0xdc,0xd7,0x10,0xc2
+,0x0e,0xa9,0x88,0xe7,0x30,0x81,0x92,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x81,0x8a,0x30
+,0x81,0x87,0x80,0x14,0xbf,0x5f,0xb7,0xd1
+,0xce,0xdd,0x1f,0x86,0xf4,0x5b,0x55,0xac
+,0xdc,0xd7,0x10,0xc2,0x0e,0xa9,0x88,0xe7
+,0xa1,0x6c,0xa4,0x6a,0x30,0x68,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x55,0x53,0x31,0x25,0x30,0x23,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x1c,0x53,0x74
+,0x61,0x72,0x66,0x69,0x65,0x6c,0x64,0x20
+,0x54,0x65,0x63,0x68,0x6e,0x6f,0x6c,0x6f
+,0x67,0x69,0x65,0x73,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x31,0x32,0x30,0x30,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x29,0x53,0x74,0x61
+,0x72,0x66,0x69,0x65,0x6c,0x64,0x20,0x43
+,0x6c,0x61,0x73,0x73,0x20,0x32,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x82,0x01
+,0x00,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x01,0x01,0x00,0x05,0x9d,0x3f,0x88,0x9d
+,0xd1,0xc9,0x1a,0x55,0xa1,0xac,0x69,0xf3
+,0xf3,0x59,0xda,0x9b,0x01,0x87,0x1a,0x4f
+,0x57,0xa9,0xa1,0x79,0x09,0x2a,0xdb,0xf7
+,0x2f,0xb2,0x1e,0xcc,0xc7,0x5e,0x6a,0xd8
+,0x83,0x87,0xa1,0x97,0xef,0x49,0x35,0x3e
+,0x77,0x06,0x41,0x58,0x62,0xbf,0x8e,0x58
+,0xb8,0x0a,0x67,0x3f,0xec,0xb3,0xdd,0x21
+,0x66,0x1f,0xc9,0x54,0xfa,0x72,0xcc,0x3d
+,0x4c,0x40,0xd8,0x81,0xaf,0x77,0x9e,0x83
+,0x7a,0xbb,0xa2,0xc7,0xf5,0x34,0x17,0x8e
+,0xd9,0x11,0x40,0xf4,0xfc,0x2c,0x2a,0x4d
+,0x15,0x7f,0xa7,0x62,0x5d,0x2e,0x25,0xd3
+,0x00,0x0b,0x20,0x1a,0x1d,0x68,0xf9,0x17
+,0xb8,0xf4,0xbd,0x8b,0xed,0x28,0x59,0xdd
+,0x4d,0x16,0x8b,0x17,0x83,0xc8,0xb2,0x65
+,0xc7,0x2d,0x7a,0xa5,0xaa,0xbc,0x53,0x86
+,0x6d,0xdd,0x57,0xa4,0xca,0xf8,0x20,0x41
+,0x0b,0x68,0xf0,0xf4,0xfb,0x74,0xbe,0x56
+,0x5d,0x7a,0x79,0xf5,0xf9,0x1d,0x85,0xe3
+,0x2d,0x95,0xbe,0xf5,0x71,0x90,0x43,0xcc
+,0x8d,0x1f,0x9a,0x00,0x0a,0x87,0x29,0xe9
+,0x55,0x22,0x58,0x00,0x23,0xea,0xe3,0x12
+,0x43,0x29,0x5b,0x47,0x08,0xdd,0x8c,0x41
+,0x6a,0x65,0x06,0xa8,0xe5,0x21,0xaa,0x41
+,0xb4,0x95,0x21,0x95,0xb9,0x7d,0xd1,0x34
+,0xab,0x13,0xd6,0xad,0xbc,0xdc,0xe2,0x3d
+,0x39,0xcd,0xbd,0x3e,0x75,0x70,0xa1,0x18
+,0x59,0x03,0xc9,0x22,0xb4,0x8f,0x9c,0xd5
+,0x5e,0x2a,0xd7,0xa5,0xb6,0xd4,0x0a,0x6d
+,0xf8,0xb7,0x40,0x11,0x46,0x9a,0x1f,0x79
+,0x0e,0x62,0xbf,0x0f,0x97,0xec,0xe0,0x2f
+,0x1f,0x17,0x94};
+const unsigned int NptTlsTrustAnchor_Base_0096_Size = 1043;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0097.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0097.cpp
new file mode 100644
index 0000000..b8cc293
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0097.cpp
@@ -0,0 +1,200 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* StartCom Ltd. */
+const unsigned char NptTlsTrustAnchor_Base_0097_Data[1306] = {
+0x30,0x82,0x05,0x16,0x30,0x82,0x04,0x7f
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x04,0x05,0x00,0x30
+,0x81,0xb0,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x49,0x4c,0x31
+,0x0f,0x30,0x0d,0x06,0x03,0x55,0x04,0x08
+,0x13,0x06,0x49,0x73,0x72,0x61,0x65,0x6c
+,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04
+,0x07,0x13,0x05,0x45,0x69,0x6c,0x61,0x74
+,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x0d,0x53,0x74,0x61,0x72,0x74
+,0x43,0x6f,0x6d,0x20,0x4c,0x74,0x64,0x2e
+,0x31,0x1a,0x30,0x18,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x11,0x43,0x41,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x44,0x65,0x70,0x2e,0x31,0x29,0x30,0x27
+,0x06,0x03,0x55,0x04,0x03,0x13,0x20,0x46
+,0x72,0x65,0x65,0x20,0x53,0x53,0x4c,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x31
+,0x21,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x12
+,0x61,0x64,0x6d,0x69,0x6e,0x40,0x73,0x74
+,0x61,0x72,0x74,0x63,0x6f,0x6d,0x2e,0x6f
+,0x72,0x67,0x30,0x1e,0x17,0x0d,0x30,0x35
+,0x30,0x33,0x31,0x37,0x31,0x37,0x33,0x37
+,0x34,0x38,0x5a,0x17,0x0d,0x33,0x35,0x30
+,0x33,0x31,0x30,0x31,0x37,0x33,0x37,0x34
+,0x38,0x5a,0x30,0x81,0xb0,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x49,0x4c,0x31,0x0f,0x30,0x0d,0x06,0x03
+,0x55,0x04,0x08,0x13,0x06,0x49,0x73,0x72
+,0x61,0x65,0x6c,0x31,0x0e,0x30,0x0c,0x06
+,0x03,0x55,0x04,0x07,0x13,0x05,0x45,0x69
+,0x6c,0x61,0x74,0x31,0x16,0x30,0x14,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x0d,0x53,0x74
+,0x61,0x72,0x74,0x43,0x6f,0x6d,0x20,0x4c
+,0x74,0x64,0x2e,0x31,0x1a,0x30,0x18,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x11,0x43,0x41
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x20,0x44,0x65,0x70,0x2e,0x31
+,0x29,0x30,0x27,0x06,0x03,0x55,0x04,0x03
+,0x13,0x20,0x46,0x72,0x65,0x65,0x20,0x53
+,0x53,0x4c,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x31,0x21,0x30,0x1f,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09
+,0x01,0x16,0x12,0x61,0x64,0x6d,0x69,0x6e
+,0x40,0x73,0x74,0x61,0x72,0x74,0x63,0x6f
+,0x6d,0x2e,0x6f,0x72,0x67,0x30,0x81,0x9f
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x81,0x8d,0x00,0x30,0x81,0x89,0x02,0x81
+,0x81,0x00,0xed,0x84,0x60,0x00,0x23,0x9e
+,0xc8,0x4a,0x51,0x29,0x27,0xde,0x3a,0xa1
+,0x39,0xb5,0x69,0xab,0x09,0xb2,0x2f,0x34
+,0xfd,0x61,0xdc,0x3d,0xd3,0xb0,0xcf,0xb1
+,0xd7,0xc2,0xc4,0xc2,0xb1,0xe4,0x96,0x56
+,0xc4,0xbe,0xaa,0x14,0x0e,0xe7,0xcc,0x3a
+,0x50,0xc8,0x3a,0x62,0x9d,0xc3,0xa3,0xac
+,0x59,0x7b,0x8e,0xee,0x55,0x1a,0x1c,0x47
+,0xbe,0xa3,0x97,0x39,0xb3,0xb5,0xef,0x23
+,0x2c,0x08,0xe8,0xd8,0xaf,0x73,0x2f,0xb9
+,0xc9,0x83,0xe8,0xed,0x00,0x0f,0xc8,0x75
+,0xa5,0x2f,0x34,0x4c,0x18,0xe8,0x76,0x88
+,0x23,0x49,0x8a,0xdb,0xb6,0xed,0x68,0xda
+,0xc3,0xb5,0x62,0x29,0x4c,0xa5,0x4b,0xb7
+,0x98,0xb4,0x09,0x14,0x10,0xa0,0xf8,0xfe
+,0x62,0x76,0x22,0x15,0x0b,0xa4,0xd6,0x08
+,0x2f,0x35,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x82,0x02,0x3c,0x30,0x82,0x02,0x38,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04
+,0x04,0x03,0x02,0x01,0xe6,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0x1c,0x89,0xc3,0x96,0xcc,0xbd,0xfe,0x32
+,0xd5,0x0d,0x8c,0x81,0x31,0xb6,0x98,0x9d
+,0x8d,0x28,0x64,0x8d,0x30,0x81,0xdd,0x06
+,0x03,0x55,0x1d,0x23,0x04,0x81,0xd5,0x30
+,0x81,0xd2,0x80,0x14,0x1c,0x89,0xc3,0x96
+,0xcc,0xbd,0xfe,0x32,0xd5,0x0d,0x8c,0x81
+,0x31,0xb6,0x98,0x9d,0x8d,0x28,0x64,0x8d
+,0xa1,0x81,0xb6,0xa4,0x81,0xb3,0x30,0x81
+,0xb0,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x49,0x4c,0x31,0x0f
+,0x30,0x0d,0x06,0x03,0x55,0x04,0x08,0x13
+,0x06,0x49,0x73,0x72,0x61,0x65,0x6c,0x31
+,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x07
+,0x13,0x05,0x45,0x69,0x6c,0x61,0x74,0x31
+,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0d,0x53,0x74,0x61,0x72,0x74,0x43
+,0x6f,0x6d,0x20,0x4c,0x74,0x64,0x2e,0x31
+,0x1a,0x30,0x18,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x11,0x43,0x41,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x20,0x44
+,0x65,0x70,0x2e,0x31,0x29,0x30,0x27,0x06
+,0x03,0x55,0x04,0x03,0x13,0x20,0x46,0x72
+,0x65,0x65,0x20,0x53,0x53,0x4c,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x21
+,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x12,0x61
+,0x64,0x6d,0x69,0x6e,0x40,0x73,0x74,0x61
+,0x72,0x74,0x63,0x6f,0x6d,0x2e,0x6f,0x72
+,0x67,0x82,0x01,0x00,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x11,0x04,0x16,0x30,0x14,0x81
+,0x12,0x61,0x64,0x6d,0x69,0x6e,0x40,0x73
+,0x74,0x61,0x72,0x74,0x63,0x6f,0x6d,0x2e
+,0x6f,0x72,0x67,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x12,0x04,0x16,0x30,0x14,0x81,0x12
+,0x61,0x64,0x6d,0x69,0x6e,0x40,0x73,0x74
+,0x61,0x72,0x74,0x63,0x6f,0x6d,0x2e,0x6f
+,0x72,0x67,0x30,0x11,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x01,0x04
+,0x04,0x03,0x02,0x00,0x07,0x30,0x2f,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x0d,0x04,0x22,0x16,0x20,0x46,0x72
+,0x65,0x65,0x20,0x53,0x53,0x4c,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x32
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x04,0x04,0x25,0x16,0x23,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x65
+,0x72,0x74,0x2e,0x73,0x74,0x61,0x72,0x74
+,0x63,0x6f,0x6d,0x2e,0x6f,0x72,0x67,0x2f
+,0x63,0x61,0x2d,0x63,0x72,0x6c,0x2e,0x63
+,0x72,0x6c,0x30,0x28,0x06,0x09,0x60,0x86
+,0x48,0x01,0x86,0xf8,0x42,0x01,0x02,0x04
+,0x1b,0x16,0x19,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x63,0x65,0x72,0x74,0x2e,0x73
+,0x74,0x61,0x72,0x74,0x63,0x6f,0x6d,0x2e
+,0x6f,0x72,0x67,0x2f,0x30,0x39,0x06,0x09
+,0x60,0x86,0x48,0x01,0x86,0xf8,0x42,0x01
+,0x08,0x04,0x2c,0x16,0x2a,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x63,0x65,0x72,0x74
+,0x2e,0x73,0x74,0x61,0x72,0x74,0x63,0x6f
+,0x6d,0x2e,0x6f,0x72,0x67,0x2f,0x69,0x6e
+,0x64,0x65,0x78,0x2e,0x70,0x68,0x70,0x3f
+,0x61,0x70,0x70,0x3d,0x31,0x31,0x31,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x04,0x05,0x00,0x03,0x81
+,0x81,0x00,0x6c,0x71,0x25,0xe1,0x9e,0x34
+,0x91,0x21,0xef,0xdb,0x6c,0xbd,0x01,0x08
+,0x56,0x8f,0x88,0xd8,0x41,0x3a,0x53,0xf5
+,0x72,0xdf,0x27,0x57,0x4b,0x76,0x84,0xf7
+,0x68,0xa4,0xfe,0xeb,0x3f,0x09,0x7e,0x28
+,0xb8,0x57,0xea,0x1f,0xc1,0xaa,0xe2,0xff
+,0x96,0x9f,0x49,0x99,0xe6,0xb2,0x95,0x73
+,0x96,0xc6,0x48,0xc7,0x5e,0x8d,0x07,0x72
+,0x56,0xf8,0x83,0x8f,0x9f,0x77,0xaf,0x29
+,0xd3,0x45,0x0e,0xa4,0xee,0xb0,0x36,0x74
+,0x2d,0xf0,0xcd,0x98,0x23,0x7b,0x37,0x4b
+,0xda,0xfe,0x51,0x98,0xc4,0x1e,0x34,0x3c
+,0x88,0xfd,0x99,0x3b,0x50,0xa7,0xc1,0x8b
+,0x33,0xc7,0xc2,0x52,0x16,0x12,0x95,0x53
+,0x65,0x22,0xef,0xba,0x8b,0xce,0x62,0xdb
+,0x70,0x23,0xb1,0x80,0xdf,0x1a,0x20,0x38
+,0xe7,0x7e};
+const unsigned int NptTlsTrustAnchor_Base_0097_Size = 1306;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0098.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0098.cpp
new file mode 100644
index 0000000..909a44f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0098.cpp
@@ -0,0 +1,286 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* StartCom Certification Authority */
+const unsigned char NptTlsTrustAnchor_Base_0098_Data[1997] = {
+0x30,0x82,0x07,0xc9,0x30,0x82,0x05,0xb1
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x7d,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x49,0x4c,0x31,0x16
+,0x30,0x14,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0d,0x53,0x74,0x61,0x72,0x74,0x43,0x6f
+,0x6d,0x20,0x4c,0x74,0x64,0x2e,0x31,0x2b
+,0x30,0x29,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x22,0x53,0x65,0x63,0x75,0x72,0x65,0x20
+,0x44,0x69,0x67,0x69,0x74,0x61,0x6c,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x65,0x20,0x53,0x69,0x67,0x6e
+,0x69,0x6e,0x67,0x31,0x29,0x30,0x27,0x06
+,0x03,0x55,0x04,0x03,0x13,0x20,0x53,0x74
+,0x61,0x72,0x74,0x43,0x6f,0x6d,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x1e
+,0x17,0x0d,0x30,0x36,0x30,0x39,0x31,0x37
+,0x31,0x39,0x34,0x36,0x33,0x36,0x5a,0x17
+,0x0d,0x33,0x36,0x30,0x39,0x31,0x37,0x31
+,0x39,0x34,0x36,0x33,0x36,0x5a,0x30,0x7d
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x49,0x4c,0x31,0x16,0x30
+,0x14,0x06,0x03,0x55,0x04,0x0a,0x13,0x0d
+,0x53,0x74,0x61,0x72,0x74,0x43,0x6f,0x6d
+,0x20,0x4c,0x74,0x64,0x2e,0x31,0x2b,0x30
+,0x29,0x06,0x03,0x55,0x04,0x0b,0x13,0x22
+,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x44
+,0x69,0x67,0x69,0x74,0x61,0x6c,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x65,0x20,0x53,0x69,0x67,0x6e,0x69
+,0x6e,0x67,0x31,0x29,0x30,0x27,0x06,0x03
+,0x55,0x04,0x03,0x13,0x20,0x53,0x74,0x61
+,0x72,0x74,0x43,0x6f,0x6d,0x20,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68
+,0x6f,0x72,0x69,0x74,0x79,0x30,0x82,0x02
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x02,0x0f,0x00,0x30,0x82,0x02
+,0x0a,0x02,0x82,0x02,0x01,0x00,0xc1,0x88
+,0xdb,0x09,0xbc,0x6c,0x46,0x7c,0x78,0x9f
+,0x95,0x7b,0xb5,0x33,0x90,0xf2,0x72,0x62
+,0xd6,0xc1,0x36,0x20,0x22,0x24,0x5e,0xce
+,0xe9,0x77,0xf2,0x43,0x0a,0xa2,0x06,0x64
+,0xa4,0xcc,0x8e,0x36,0xf8,0x38,0xe6,0x23
+,0xf0,0x6e,0x6d,0xb1,0x3c,0xdd,0x72,0xa3
+,0x85,0x1c,0xa1,0xd3,0x3d,0xb4,0x33,0x2b
+,0xd3,0x2f,0xaf,0xfe,0xea,0xb0,0x41,0x59
+,0x67,0xb6,0xc4,0x06,0x7d,0x0a,0x9e,0x74
+,0x85,0xd6,0x79,0x4c,0x80,0x37,0x7a,0xdf
+,0x39,0x05,0x52,0x59,0xf7,0xf4,0x1b,0x46
+,0x43,0xa4,0xd2,0x85,0x85,0xd2,0xc3,0x71
+,0xf3,0x75,0x62,0x34,0xba,0x2c,0x8a,0x7f
+,0x1e,0x8f,0xee,0xed,0x34,0xd0,0x11,0xc7
+,0x96,0xcd,0x52,0x3d,0xba,0x33,0xd6,0xdd
+,0x4d,0xde,0x0b,0x3b,0x4a,0x4b,0x9f,0xc2
+,0x26,0x2f,0xfa,0xb5,0x16,0x1c,0x72,0x35
+,0x77,0xca,0x3c,0x5d,0xe6,0xca,0xe1,0x26
+,0x8b,0x1a,0x36,0x76,0x5c,0x01,0xdb,0x74
+,0x14,0x25,0xfe,0xed,0xb5,0xa0,0x88,0x0f
+,0xdd,0x78,0xca,0x2d,0x1f,0x07,0x97,0x30
+,0x01,0x2d,0x72,0x79,0xfa,0x46,0xd6,0x13
+,0x2a,0xa8,0xb9,0xa6,0xab,0x83,0x49,0x1d
+,0xe5,0xf2,0xef,0xdd,0xe4,0x01,0x8e,0x18
+,0x0a,0x8f,0x63,0x53,0x16,0x85,0x62,0xa9
+,0x0e,0x19,0x3a,0xcc,0xb5,0x66,0xa6,0xc2
+,0x6b,0x74,0x07,0xe4,0x2b,0xe1,0x76,0x3e
+,0xb4,0x6d,0xd8,0xf6,0x44,0xe1,0x73,0x62
+,0x1f,0x3b,0xc4,0xbe,0xa0,0x53,0x56,0x25
+,0x6c,0x51,0x09,0xf7,0xaa,0xab,0xca,0xbf
+,0x76,0xfd,0x6d,0x9b,0xf3,0x9d,0xdb,0xbf
+,0x3d,0x66,0xbc,0x0c,0x56,0xaa,0xaf,0x98
+,0x48,0x95,0x3a,0x4b,0xdf,0xa7,0x58,0x50
+,0xd9,0x38,0x75,0xa9,0x5b,0xea,0x43,0x0c
+,0x02,0xff,0x99,0xeb,0xe8,0x6c,0x4d,0x70
+,0x5b,0x29,0x65,0x9c,0xdd,0xaa,0x5d,0xcc
+,0xaf,0x01,0x31,0xec,0x0c,0xeb,0xd2,0x8d
+,0xe8,0xea,0x9c,0x7b,0xe6,0x6e,0xf7,0x27
+,0x66,0x0c,0x1a,0x48,0xd7,0x6e,0x42,0xe3
+,0x3f,0xde,0x21,0x3e,0x7b,0xe1,0x0d,0x70
+,0xfb,0x63,0xaa,0xa8,0x6c,0x1a,0x54,0xb4
+,0x5c,0x25,0x7a,0xc9,0xa2,0xc9,0x8b,0x16
+,0xa6,0xbb,0x2c,0x7e,0x17,0x5e,0x05,0x4d
+,0x58,0x6e,0x12,0x1d,0x01,0xee,0x12,0x10
+,0x0d,0xc6,0x32,0x7f,0x18,0xff,0xfc,0xf4
+,0xfa,0xcd,0x6e,0x91,0xe8,0x36,0x49,0xbe
+,0x1a,0x48,0x69,0x8b,0xc2,0x96,0x4d,0x1a
+,0x12,0xb2,0x69,0x17,0xc1,0x0a,0x90,0xd6
+,0xfa,0x79,0x22,0x48,0xbf,0xba,0x7b,0x69
+,0xf8,0x70,0xc7,0xfa,0x7a,0x37,0xd8,0xd8
+,0x0d,0xd2,0x76,0x4f,0x57,0xff,0x90,0xb7
+,0xe3,0x91,0xd2,0xdd,0xef,0xc2,0x60,0xb7
+,0x67,0x3a,0xdd,0xfe,0xaa,0x9c,0xf0,0xd4
+,0x8b,0x7f,0x72,0x22,0xce,0xc6,0x9f,0x97
+,0xb6,0xf8,0xaf,0x8a,0xa0,0x10,0xa8,0xd9
+,0xfb,0x18,0xc6,0xb6,0xb5,0x5c,0x52,0x3c
+,0x89,0xb6,0x19,0x2a,0x73,0x01,0x0a,0x0f
+,0x03,0xb3,0x12,0x60,0xf2,0x7a,0x2f,0x81
+,0xdb,0xa3,0x6e,0xff,0x26,0x30,0x97,0xf5
+,0x8b,0xdd,0x89,0x57,0xb6,0xad,0x3d,0xb3
+,0xaf,0x2b,0xc5,0xb7,0x76,0x02,0xf0,0xa5
+,0xd6,0x2b,0x9a,0x86,0x14,0x2a,0x72,0xf6
+,0xe3,0x33,0x8c,0x5d,0x09,0x4b,0x13,0xdf
+,0xbb,0x8c,0x74,0x13,0x52,0x4b,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x82,0x02,0x52,0x30
+,0x82,0x02,0x4e,0x30,0x0c,0x06,0x03,0x55
+,0x1d,0x13,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f
+,0x04,0x04,0x03,0x02,0x01,0xae,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0x4e,0x0b,0xef,0x1a,0xa4,0x40,0x5b
+,0xa5,0x17,0x69,0x87,0x30,0xca,0x34,0x68
+,0x43,0xd0,0x41,0xae,0xf2,0x30,0x64,0x06
+,0x03,0x55,0x1d,0x1f,0x04,0x5d,0x30,0x5b
+,0x30,0x2c,0xa0,0x2a,0xa0,0x28,0x86,0x26
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63
+,0x65,0x72,0x74,0x2e,0x73,0x74,0x61,0x72
+,0x74,0x63,0x6f,0x6d,0x2e,0x6f,0x72,0x67
+,0x2f,0x73,0x66,0x73,0x63,0x61,0x2d,0x63
+,0x72,0x6c,0x2e,0x63,0x72,0x6c,0x30,0x2b
+,0xa0,0x29,0xa0,0x27,0x86,0x25,0x68,0x74
+,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c
+,0x2e,0x73,0x74,0x61,0x72,0x74,0x63,0x6f
+,0x6d,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x66
+,0x73,0x63,0x61,0x2d,0x63,0x72,0x6c,0x2e
+,0x63,0x72,0x6c,0x30,0x82,0x01,0x5d,0x06
+,0x03,0x55,0x1d,0x20,0x04,0x82,0x01,0x54
+,0x30,0x82,0x01,0x50,0x30,0x82,0x01,0x4c
+,0x06,0x0b,0x2b,0x06,0x01,0x04,0x01,0x81
+,0xb5,0x37,0x01,0x01,0x01,0x30,0x82,0x01
+,0x3b,0x30,0x2f,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x02,0x01,0x16,0x23,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x65
+,0x72,0x74,0x2e,0x73,0x74,0x61,0x72,0x74
+,0x63,0x6f,0x6d,0x2e,0x6f,0x72,0x67,0x2f
+,0x70,0x6f,0x6c,0x69,0x63,0x79,0x2e,0x70
+,0x64,0x66,0x30,0x35,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x29
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63
+,0x65,0x72,0x74,0x2e,0x73,0x74,0x61,0x72
+,0x74,0x63,0x6f,0x6d,0x2e,0x6f,0x72,0x67
+,0x2f,0x69,0x6e,0x74,0x65,0x72,0x6d,0x65
+,0x64,0x69,0x61,0x74,0x65,0x2e,0x70,0x64
+,0x66,0x30,0x81,0xd0,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x02,0x02,0x30,0x81
+,0xc3,0x30,0x27,0x16,0x20,0x53,0x74,0x61
+,0x72,0x74,0x20,0x43,0x6f,0x6d,0x6d,0x65
+,0x72,0x63,0x69,0x61,0x6c,0x20,0x28,0x53
+,0x74,0x61,0x72,0x74,0x43,0x6f,0x6d,0x29
+,0x20,0x4c,0x74,0x64,0x2e,0x30,0x03,0x02
+,0x01,0x01,0x1a,0x81,0x97,0x4c,0x69,0x6d
+,0x69,0x74,0x65,0x64,0x20,0x4c,0x69,0x61
+,0x62,0x69,0x6c,0x69,0x74,0x79,0x2c,0x20
+,0x72,0x65,0x61,0x64,0x20,0x74,0x68,0x65
+,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e
+,0x20,0x2a,0x4c,0x65,0x67,0x61,0x6c,0x20
+,0x4c,0x69,0x6d,0x69,0x74,0x61,0x74,0x69
+,0x6f,0x6e,0x73,0x2a,0x20,0x6f,0x66,0x20
+,0x74,0x68,0x65,0x20,0x53,0x74,0x61,0x72
+,0x74,0x43,0x6f,0x6d,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x20,0x50,0x6f,0x6c
+,0x69,0x63,0x79,0x20,0x61,0x76,0x61,0x69
+,0x6c,0x61,0x62,0x6c,0x65,0x20,0x61,0x74
+,0x20,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x63,0x65,0x72,0x74,0x2e,0x73,0x74,0x61
+,0x72,0x74,0x63,0x6f,0x6d,0x2e,0x6f,0x72
+,0x67,0x2f,0x70,0x6f,0x6c,0x69,0x63,0x79
+,0x2e,0x70,0x64,0x66,0x30,0x11,0x06,0x09
+,0x60,0x86,0x48,0x01,0x86,0xf8,0x42,0x01
+,0x01,0x04,0x04,0x03,0x02,0x00,0x07,0x30
+,0x38,0x06,0x09,0x60,0x86,0x48,0x01,0x86
+,0xf8,0x42,0x01,0x0d,0x04,0x2b,0x16,0x29
+,0x53,0x74,0x61,0x72,0x74,0x43,0x6f,0x6d
+,0x20,0x46,0x72,0x65,0x65,0x20,0x53,0x53
+,0x4c,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x02,0x01,0x00,0x16,0x6c,0x99
+,0xf4,0x66,0x0c,0x34,0xf5,0xd0,0x85,0x5e
+,0x7d,0x0a,0xec,0xda,0x10,0x4e,0x38,0x1c
+,0x5e,0xdf,0xa6,0x25,0x05,0x4b,0x91,0x32
+,0xc1,0xe8,0x3b,0xf1,0x3d,0xdd,0x44,0x09
+,0x5b,0x07,0x49,0x8a,0x29,0xcb,0x66,0x02
+,0xb7,0xb1,0x9a,0xf7,0x25,0x98,0x09,0x3c
+,0x8e,0x1b,0xe1,0xdd,0x36,0x87,0x2b,0x4b
+,0xbb,0x68,0xd3,0x39,0x66,0x3d,0xa0,0x26
+,0xc7,0xf2,0x39,0x91,0x1d,0x51,0xab,0x82
+,0x7b,0x7e,0xd5,0xce,0x5a,0xe4,0xe2,0x03
+,0x57,0x70,0x69,0x97,0x08,0xf9,0x5e,0x58
+,0xa6,0x0a,0xdf,0x8c,0x06,0x9a,0x45,0x16
+,0x16,0x38,0x0a,0x5e,0x57,0xf6,0x62,0xc7
+,0x7a,0x02,0x05,0xe6,0xbc,0x1e,0xb5,0xf2
+,0x9e,0xf4,0xa9,0x29,0x83,0xf8,0xb2,0x14
+,0xe3,0x6e,0x28,0x87,0x44,0xc3,0x90,0x1a
+,0xde,0x38,0xa9,0x3c,0xac,0x43,0x4d,0x64
+,0x45,0xce,0xdd,0x28,0xa9,0x5c,0xf2,0x73
+,0x7b,0x04,0xf8,0x17,0xe8,0xab,0xb1,0xf3
+,0x2e,0x5c,0x64,0x6e,0x73,0x31,0x3a,0x12
+,0xb8,0xbc,0xb3,0x11,0xe4,0x7d,0x8f,0x81
+,0x51,0x9a,0x3b,0x8d,0x89,0xf4,0x4d,0x93
+,0x66,0x7b,0x3c,0x03,0xed,0xd3,0x9a,0x1d
+,0x9a,0xf3,0x65,0x50,0xf5,0xa0,0xd0,0x75
+,0x9f,0x2f,0xaf,0xf0,0xea,0x82,0x43,0x98
+,0xf8,0x69,0x9c,0x89,0x79,0xc4,0x43,0x8e
+,0x46,0x72,0xe3,0x64,0x36,0x12,0xaf,0xf7
+,0x25,0x1e,0x38,0x89,0x90,0x77,0x7e,0xc3
+,0x6b,0x6a,0xb9,0xc3,0xcb,0x44,0x4b,0xac
+,0x78,0x90,0x8b,0xe7,0xc7,0x2c,0x1e,0x4b
+,0x11,0x44,0xc8,0x34,0x52,0x27,0xcd,0x0a
+,0x5d,0x9f,0x85,0xc1,0x89,0xd5,0x1a,0x78
+,0xf2,0x95,0x10,0x53,0x32,0xdd,0x80,0x84
+,0x66,0x75,0xd9,0xb5,0x68,0x28,0xfb,0x61
+,0x2e,0xbe,0x84,0xa8,0x38,0xc0,0x99,0x12
+,0x86,0xa5,0x1e,0x67,0x64,0xad,0x06,0x2e
+,0x2f,0xa9,0x70,0x85,0xc7,0x96,0x0f,0x7c
+,0x89,0x65,0xf5,0x8e,0x43,0x54,0x0e,0xab
+,0xdd,0xa5,0x80,0x39,0x94,0x60,0xc0,0x34
+,0xc9,0x96,0x70,0x2c,0xa3,0x12,0xf5,0x1f
+,0x48,0x7b,0xbd,0x1c,0x7e,0x6b,0xb7,0x9d
+,0x90,0xf4,0x22,0x3b,0xae,0xf8,0xfc,0x2a
+,0xca,0xfa,0x82,0x52,0xa0,0xef,0xaf,0x4b
+,0x55,0x93,0xeb,0xc1,0xb5,0xf0,0x22,0x8b
+,0xac,0x34,0x4e,0x26,0x22,0x04,0xa1,0x87
+,0x2c,0x75,0x4a,0xb7,0xe5,0x7d,0x13,0xd7
+,0xb8,0x0c,0x64,0xc0,0x36,0xd2,0xc9,0x2f
+,0x86,0x12,0x8c,0x23,0x09,0xc1,0x1b,0x82
+,0x3b,0x73,0x49,0xa3,0x6a,0x57,0x87,0x94
+,0xe5,0xd6,0x78,0xc5,0x99,0x43,0x63,0xe3
+,0x4d,0xe0,0x77,0x2d,0xe1,0x65,0x99,0x72
+,0x69,0x04,0x1a,0x47,0x09,0xe6,0x0f,0x01
+,0x56,0x24,0xfb,0x1f,0xbf,0x0e,0x79,0xa9
+,0x58,0x2e,0xb9,0xc4,0x09,0x01,0x7e,0x95
+,0xba,0x6d,0x00,0x06,0x3e,0xb2,0xea,0x4a
+,0x10,0x39,0xd8,0xd0,0x2b,0xf5,0xbf,0xec
+,0x75,0xbf,0x97,0x02,0xc5,0x09,0x1b,0x08
+,0xdc,0x55,0x37,0xe2,0x81,0xfb,0x37,0x84
+,0x43,0x62,0x20,0xca,0xe7,0x56,0x4b,0x65
+,0xea,0xfe,0x6c,0xc1,0x24,0x93,0x24,0xa1
+,0x34,0xeb,0x05,0xff,0x9a,0x22,0xae,0x9b
+,0x7d,0x3f,0xf1,0x65,0x51,0x0a,0xa6,0x30
+,0x6a,0xb3,0xf4,0x88,0x1c,0x80,0x0d,0xfc
+,0x72,0x8a,0xe8,0x83,0x5e};
+const unsigned int NptTlsTrustAnchor_Base_0098_Size = 1997;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0099.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0099.cpp
new file mode 100644
index 0000000..bfe2b8c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0099.cpp
@@ -0,0 +1,176 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Firmaprofesional Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0099_Data[1115] = {
+0x30,0x82,0x04,0x57,0x30,0x82,0x03,0x3f
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x81,0x9d,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x45,0x53,0x31
+,0x22,0x30,0x20,0x06,0x03,0x55,0x04,0x07
+,0x13,0x19,0x43,0x2f,0x20,0x4d,0x75,0x6e
+,0x74,0x61,0x6e,0x65,0x72,0x20,0x32,0x34
+,0x34,0x20,0x42,0x61,0x72,0x63,0x65,0x6c
+,0x6f,0x6e,0x61,0x31,0x42,0x30,0x40,0x06
+,0x03,0x55,0x04,0x03,0x13,0x39,0x41,0x75
+,0x74,0x6f,0x72,0x69,0x64,0x61,0x64,0x20
+,0x64,0x65,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x63,0x69,0x6f,0x6e
+,0x20,0x46,0x69,0x72,0x6d,0x61,0x70,0x72
+,0x6f,0x66,0x65,0x73,0x69,0x6f,0x6e,0x61
+,0x6c,0x20,0x43,0x49,0x46,0x20,0x41,0x36
+,0x32,0x36,0x33,0x34,0x30,0x36,0x38,0x31
+,0x26,0x30,0x24,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x17
+,0x63,0x61,0x40,0x66,0x69,0x72,0x6d,0x61
+,0x70,0x72,0x6f,0x66,0x65,0x73,0x69,0x6f
+,0x6e,0x61,0x6c,0x2e,0x63,0x6f,0x6d,0x30
+,0x1e,0x17,0x0d,0x30,0x31,0x31,0x30,0x32
+,0x34,0x32,0x32,0x30,0x30,0x30,0x30,0x5a
+,0x17,0x0d,0x31,0x33,0x31,0x30,0x32,0x34
+,0x32,0x32,0x30,0x30,0x30,0x30,0x5a,0x30
+,0x81,0x9d,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x45,0x53,0x31
+,0x22,0x30,0x20,0x06,0x03,0x55,0x04,0x07
+,0x13,0x19,0x43,0x2f,0x20,0x4d,0x75,0x6e
+,0x74,0x61,0x6e,0x65,0x72,0x20,0x32,0x34
+,0x34,0x20,0x42,0x61,0x72,0x63,0x65,0x6c
+,0x6f,0x6e,0x61,0x31,0x42,0x30,0x40,0x06
+,0x03,0x55,0x04,0x03,0x13,0x39,0x41,0x75
+,0x74,0x6f,0x72,0x69,0x64,0x61,0x64,0x20
+,0x64,0x65,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x63,0x69,0x6f,0x6e
+,0x20,0x46,0x69,0x72,0x6d,0x61,0x70,0x72
+,0x6f,0x66,0x65,0x73,0x69,0x6f,0x6e,0x61
+,0x6c,0x20,0x43,0x49,0x46,0x20,0x41,0x36
+,0x32,0x36,0x33,0x34,0x30,0x36,0x38,0x31
+,0x26,0x30,0x24,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x09,0x01,0x16,0x17
+,0x63,0x61,0x40,0x66,0x69,0x72,0x6d,0x61
+,0x70,0x72,0x6f,0x66,0x65,0x73,0x69,0x6f
+,0x6e,0x61,0x6c,0x2e,0x63,0x6f,0x6d,0x30
+,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01
+,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30
+,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00
+,0xe7,0x23,0x03,0x6f,0x6f,0x23,0xa5,0x5e
+,0x78,0xce,0x95,0x2c,0xed,0x94,0x1e,0x6e
+,0x0a,0x9e,0x01,0xc7,0xea,0x30,0xd1,0x2c
+,0x9d,0xdd,0x37,0xe8,0x9b,0x98,0x79,0x56
+,0xd3,0xfc,0x73,0xdf,0xd0,0x8a,0xde,0x55
+,0x8f,0x51,0xf9,0x5a,0xea,0xde,0xb5,0x70
+,0xc4,0xed,0xa4,0xed,0xff,0xa3,0x0d,0x6e
+,0x0f,0x64,0x50,0x31,0xaf,0x01,0x27,0x58
+,0xae,0xfe,0x6c,0xa7,0x4a,0x2f,0x17,0x2d
+,0xd3,0x73,0xd5,0x13,0x1c,0x8f,0x59,0xa5
+,0x34,0x2c,0x1d,0x54,0x04,0x45,0xcd,0x68
+,0xb8,0xa0,0xc0,0x03,0xa5,0xcf,0x85,0x42
+,0x47,0x95,0x28,0x5b,0xcf,0xef,0x80,0x6c
+,0xe0,0x90,0x97,0x8a,0x01,0x3c,0x1d,0xf3
+,0x87,0x10,0x30,0x26,0x48,0x7d,0xd7,0xfc
+,0xe9,0x9d,0x91,0x71,0xff,0x41,0x9a,0xa9
+,0x40,0xb5,0x37,0x9c,0x29,0x20,0x4f,0x1f
+,0x52,0xe3,0xa0,0x7d,0x13,0x6d,0x54,0xb7
+,0x0a,0xde,0xe9,0x6a,0x4e,0x07,0xac,0xac
+,0x19,0x5f,0xdc,0x7e,0x62,0x74,0xf6,0xb2
+,0x05,0x00,0xba,0x85,0xa0,0xfd,0x1d,0x38
+,0x6e,0xcb,0x5a,0xbb,0x86,0xbc,0x94,0x67
+,0x33,0x35,0x83,0x2c,0x1f,0x23,0xcd,0xf8
+,0xc8,0x91,0x71,0xcc,0x97,0x8b,0xef,0xae
+,0x0f,0xdc,0x29,0x03,0x1b,0xc0,0x39,0xeb
+,0x70,0xed,0xc1,0x6e,0x0e,0xd8,0x67,0x0b
+,0x89,0xa9,0xbc,0x35,0xe4,0xef,0xb6,0x34
+,0xb4,0xa5,0xb6,0xc4,0x2d,0xa5,0xbe,0xd0
+,0xc3,0x94,0x24,0x48,0xdb,0xdf,0x96,0xd3
+,0x00,0xb5,0x66,0x1a,0x8b,0x66,0x05,0x0f
+,0xdd,0x3f,0x3f,0xcb,0x3f,0xaa,0x5e,0x9a
+,0x4a,0xf8,0xb4,0x4a,0xef,0x95,0x37,0x1b
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x81,0x9f
+,0x30,0x81,0x9c,0x30,0x2a,0x06,0x03,0x55
+,0x1d,0x11,0x04,0x23,0x30,0x21,0x86,0x1f
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77
+,0x77,0x77,0x2e,0x66,0x69,0x72,0x6d,0x61
+,0x70,0x72,0x6f,0x66,0x65,0x73,0x69,0x6f
+,0x6e,0x61,0x6c,0x2e,0x63,0x6f,0x6d,0x30
+,0x12,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x08,0x30,0x06,0x01,0x01,0xff
+,0x02,0x01,0x01,0x30,0x2b,0x06,0x03,0x55
+,0x1d,0x10,0x04,0x24,0x30,0x22,0x80,0x0f
+,0x32,0x30,0x30,0x31,0x31,0x30,0x32,0x34
+,0x32,0x32,0x30,0x30,0x30,0x30,0x5a,0x81
+,0x0f,0x32,0x30,0x31,0x33,0x31,0x30,0x32
+,0x34,0x32,0x32,0x30,0x30,0x30,0x30,0x5a
+,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01
+,0x01,0xff,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0x33,0x0b,0xa0,0x66,0xd1
+,0xea,0xda,0xce,0xde,0x62,0x93,0x04,0x28
+,0x52,0xb5,0x14,0x7f,0x38,0x68,0xb7,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x01,0x01,0x00,0x47,0x73,0xfe,0x8d,0x27
+,0x54,0xf0,0xf5,0xd4,0x77,0x9c,0x27,0x79
+,0x57,0x57,0xb7,0x15,0x56,0xec,0xc7,0xd8
+,0x58,0xb7,0x01,0x02,0xf4,0x33,0xed,0x93
+,0x50,0x88,0x9e,0x7c,0x46,0xb1,0xbd,0x3f
+,0x14,0x6f,0xf1,0xb3,0x47,0x48,0x8b,0x8c
+,0x97,0x06,0xd7,0xea,0x7e,0xa3,0x5c,0x2a
+,0xbb,0x4d,0x2f,0x47,0xe2,0xf8,0x39,0x06
+,0xc9,0x9c,0x2e,0x31,0x1a,0x03,0x78,0xf4
+,0xbc,0x38,0xc6,0x22,0x8b,0x33,0x31,0xf0
+,0x16,0x04,0x04,0x7d,0xf9,0x76,0xe4,0x4b
+,0xd7,0xc0,0xe6,0x83,0xec,0x59,0xcc,0x3f
+,0xde,0xff,0x4f,0x6b,0xb7,0x67,0x7e,0xa6
+,0x86,0x81,0x32,0x23,0x03,0x9d,0xc8,0xf7
+,0x5f,0xc1,0x4a,0x60,0xa5,0x92,0xa9,0xb1
+,0xa4,0xa0,0x60,0xc3,0x78,0x87,0xb3,0x22
+,0xf3,0x2a,0xeb,0x5b,0xa9,0xed,0x05,0xab
+,0x37,0x0f,0xb1,0xe2,0xd3,0x95,0x76,0x63
+,0x56,0x74,0x8c,0x58,0x72,0x1b,0x37,0xe5
+,0x64,0xa1,0xbe,0x4d,0x0c,0x93,0x98,0x0c
+,0x97,0xf6,0x87,0x6d,0xb3,0x3f,0xe7,0xcb
+,0x80,0xa6,0xed,0x88,0xc7,0x5f,0x50,0x62
+,0x02,0xe8,0x99,0x74,0x16,0xd0,0xe6,0xb4
+,0x39,0xf1,0x27,0xcb,0xc8,0x40,0xd6,0xe3
+,0x86,0x10,0xa9,0x23,0x12,0x92,0xe0,0x69
+,0x41,0x63,0xa7,0xaf,0x25,0x0b,0xc0,0xc5
+,0x92,0xcb,0x1e,0x98,0xa3,0x5a,0xba,0xc5
+,0x33,0x0f,0xa0,0x97,0x01,0xdd,0x7f,0xe0
+,0x7b,0xd6,0x06,0x54,0xcf,0xa1,0xe2,0x4d
+,0x38,0xeb,0x4b,0x50,0xb5,0xcb,0x26,0xf4
+,0xca,0xda,0x70,0x4a,0x6a,0xa1,0xe2,0x79
+,0xaa,0xe1,0xa7,0x33,0xf6,0xfd,0x4a,0x1f
+,0xf6,0xd9,0x60};
+const unsigned int NptTlsTrustAnchor_Base_0099_Size = 1115;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0100.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0100.cpp
new file mode 100644
index 0000000..57d7d4f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0100.cpp
@@ -0,0 +1,162 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Wells Fargo Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0100_Data[1001] = {
+0x30,0x82,0x03,0xe5,0x30,0x82,0x02,0xcd
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x39
+,0xe4,0x97,0x9e,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x81,0x82,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0b,0x57,0x65,0x6c
+,0x6c,0x73,0x20,0x46,0x61,0x72,0x67,0x6f
+,0x31,0x2c,0x30,0x2a,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x23,0x57,0x65,0x6c,0x6c,0x73
+,0x20,0x46,0x61,0x72,0x67,0x6f,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x31,0x2f
+,0x30,0x2d,0x06,0x03,0x55,0x04,0x03,0x13
+,0x26,0x57,0x65,0x6c,0x6c,0x73,0x20,0x46
+,0x61,0x72,0x67,0x6f,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x30
+,0x1e,0x17,0x0d,0x30,0x30,0x31,0x30,0x31
+,0x31,0x31,0x36,0x34,0x31,0x32,0x38,0x5a
+,0x17,0x0d,0x32,0x31,0x30,0x31,0x31,0x34
+,0x31,0x36,0x34,0x31,0x32,0x38,0x5a,0x30
+,0x81,0x82,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0b,0x57,0x65,0x6c,0x6c,0x73,0x20
+,0x46,0x61,0x72,0x67,0x6f,0x31,0x2c,0x30
+,0x2a,0x06,0x03,0x55,0x04,0x0b,0x13,0x23
+,0x57,0x65,0x6c,0x6c,0x73,0x20,0x46,0x61
+,0x72,0x67,0x6f,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x31,0x2f,0x30,0x2d,0x06
+,0x03,0x55,0x04,0x03,0x13,0x26,0x57,0x65
+,0x6c,0x6c,0x73,0x20,0x46,0x61,0x72,0x67
+,0x6f,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xd5,0xa8,0x33
+,0x3b,0x26,0xf9,0x34,0xff,0xcd,0x9b,0x7e
+,0xe5,0x04,0x47,0xce,0x00,0xe2,0x7d,0x77
+,0xe7,0x31,0xc2,0x2e,0x27,0xa5,0x4d,0x68
+,0xb9,0x31,0xba,0x8d,0x43,0x59,0x97,0xc7
+,0x73,0xaa,0x7f,0x3d,0x5c,0x40,0x9e,0x05
+,0xe5,0xa1,0xe2,0x89,0xd9,0x4c,0xb8,0x3f
+,0x9b,0xf9,0x0c,0xb4,0xc8,0x62,0x19,0x2c
+,0x45,0xae,0x91,0x1e,0x73,0x71,0x41,0xc4
+,0x4b,0x13,0xfd,0x70,0xc2,0x25,0xac,0x22
+,0xf5,0x75,0x0b,0xb7,0x53,0xe4,0xa5,0x2b
+,0xdd,0xce,0xbd,0x1c,0x3a,0x7a,0xc3,0xf7
+,0x13,0x8f,0x26,0x54,0x9c,0x16,0x6b,0x6b
+,0xaf,0xfb,0xd8,0x96,0xb1,0x60,0x9a,0x48
+,0xe0,0x25,0x22,0x24,0x79,0x34,0xce,0x0e
+,0x26,0x00,0x0b,0x4e,0xab,0xfd,0x8b,0xce
+,0x82,0xd7,0x2f,0x08,0x70,0x68,0xc1,0xa8
+,0x0a,0xf9,0x74,0x4f,0x07,0xab,0xa4,0xf9
+,0xe2,0x83,0x7e,0x27,0x73,0x74,0x3e,0xb8
+,0xf9,0x38,0x42,0xfc,0xa5,0xa8,0x5b,0x48
+,0x23,0xb3,0xeb,0xe3,0x25,0xb2,0x80,0xae
+,0x96,0xd4,0x0a,0x9c,0xc2,0x78,0x9a,0xc6
+,0x68,0x18,0xae,0x37,0x62,0x37,0x5e,0x51
+,0x75,0xa8,0x58,0x63,0xc0,0x51,0xee,0x40
+,0x78,0x7e,0xa8,0xaf,0x1a,0xa0,0xe1,0xb0
+,0x78,0x9d,0x50,0x8c,0x7b,0xe7,0xb3,0xfc
+,0x8e,0x23,0xb0,0xdb,0x65,0x00,0x70,0x84
+,0x01,0x08,0x00,0x14,0x6e,0x54,0x86,0x9a
+,0xba,0xcc,0xf9,0x37,0x10,0xf6,0xe0,0xde
+,0x84,0x2d,0x9d,0xa4,0x85,0x37,0xd3,0x87
+,0xe3,0x15,0xd0,0xc1,0x17,0x90,0x7e,0x19
+,0x21,0x6a,0x12,0xa9,0x76,0xfd,0x12,0x02
+,0xe9,0x4f,0x21,0x5e,0x17,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x61,0x30,0x5f,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x4c,0x06,0x03,0x55,0x1d,0x20,0x04,0x45
+,0x30,0x43,0x30,0x41,0x06,0x0b,0x60,0x86
+,0x48,0x01,0x86,0xfb,0x7b,0x87,0x07,0x01
+,0x0b,0x30,0x32,0x30,0x30,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16
+,0x24,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x77,0x77,0x77,0x2e,0x77,0x65,0x6c,0x6c
+,0x73,0x66,0x61,0x72,0x67,0x6f,0x2e,0x63
+,0x6f,0x6d,0x2f,0x63,0x65,0x72,0x74,0x70
+,0x6f,0x6c,0x69,0x63,0x79,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0xd2,0x27,0xdd,0x9c,0x0a,0x77,0x2b
+,0xbb,0x22,0xf2,0x02,0xb5,0x4a,0x4a,0x91
+,0xf9,0xd1,0x2d,0xbe,0xe4,0xbb,0x1a,0x68
+,0xef,0x0e,0xa4,0x00,0xe9,0xee,0xe7,0xef
+,0xee,0xf6,0xf9,0xe5,0x74,0xa4,0xc2,0xd8
+,0x52,0x58,0xc4,0x74,0xfb,0xce,0x6b,0xb5
+,0x3b,0x29,0x79,0x18,0x5a,0xef,0x9b,0xed
+,0x1f,0x6b,0x36,0xee,0x48,0x25,0x25,0x14
+,0xb6,0x56,0xa2,0x10,0xe8,0xee,0xa7,0x7f
+,0xd0,0x3f,0xa3,0xd0,0xc3,0x5d,0x26,0xee
+,0x07,0xcc,0xc3,0xc1,0x24,0x21,0x87,0x1e
+,0xdf,0x2a,0x12,0x53,0x6f,0x41,0x16,0xe7
+,0xed,0xae,0x94,0xfa,0x8c,0x72,0xfa,0x13
+,0x47,0xf0,0x3c,0x7e,0xae,0x7d,0x11,0x3a
+,0x13,0xec,0xed,0xfa,0x6f,0x72,0x64,0x7b
+,0x9d,0x7d,0x7f,0x26,0xfd,0x7a,0xfb,0x25
+,0xad,0xea,0x3e,0x29,0x7f,0x4c,0xe3,0x00
+,0x57,0x32,0xb0,0xb3,0xe9,0xed,0x53,0x17
+,0xd9,0x8b,0xb2,0x14,0x0e,0x30,0xe8,0xe5
+,0xd5,0x13,0xc6,0x64,0xaf,0xc4,0x00,0xd5
+,0xd8,0x58,0x24,0xfc,0xf5,0x8f,0xec,0xf1
+,0xc7,0x7d,0xa5,0xdb,0x0f,0x27,0xd1,0xc6
+,0xf2,0x40,0x88,0xe6,0x1f,0xf6,0x61,0xa8
+,0xf4,0x42,0xc8,0xb9,0x37,0xd3,0xa9,0xbe
+,0x2c,0x56,0x78,0xc2,0x72,0x9b,0x59,0x5d
+,0x35,0x40,0x8a,0xe8,0x4e,0x63,0x1a,0xb6
+,0xe9,0x20,0x6a,0x51,0xe2,0xce,0xa4,0x90
+,0xdf,0x76,0x70,0x99,0x5c,0x70,0x43,0x4d
+,0xb7,0xb6,0xa7,0x19,0x64,0x4e,0x92,0xb7
+,0xc5,0x91,0x3c,0x7f,0x48,0x16,0x65,0x7b
+,0x16,0xfd,0xcb,0xfc,0xfb,0xd9,0xd5,0xd6
+,0x4f,0x21,0x65,0x3b,0x4a,0x7f,0x47,0xa3
+,0xfb};
+const unsigned int NptTlsTrustAnchor_Base_0100_Size = 1001;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0101.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0101.cpp
new file mode 100644
index 0000000..58b56a7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0101.cpp
@@ -0,0 +1,224 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Swisscom Root CA 1 */
+const unsigned char NptTlsTrustAnchor_Base_0101_Data[1501] = {
+0x30,0x82,0x05,0xd9,0x30,0x82,0x03,0xc1
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x5c
+,0x0b,0x85,0x5c,0x0b,0xe7,0x59,0x41,0xdf
+,0x57,0xcc,0x3f,0x7f,0x9d,0xa8,0x36,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x64
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x63,0x68,0x31,0x11,0x30
+,0x0f,0x06,0x03,0x55,0x04,0x0a,0x13,0x08
+,0x53,0x77,0x69,0x73,0x73,0x63,0x6f,0x6d
+,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x1c,0x44,0x69,0x67,0x69,0x74
+,0x61,0x6c,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x31
+,0x1b,0x30,0x19,0x06,0x03,0x55,0x04,0x03
+,0x13,0x12,0x53,0x77,0x69,0x73,0x73,0x63
+,0x6f,0x6d,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x41,0x20,0x31,0x30,0x1e,0x17,0x0d
+,0x30,0x35,0x30,0x38,0x31,0x38,0x31,0x32
+,0x30,0x36,0x32,0x30,0x5a,0x17,0x0d,0x32
+,0x35,0x30,0x38,0x31,0x38,0x32,0x32,0x30
+,0x36,0x32,0x30,0x5a,0x30,0x64,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x63,0x68,0x31,0x11,0x30,0x0f,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x08,0x53,0x77
+,0x69,0x73,0x73,0x63,0x6f,0x6d,0x31,0x25
+,0x30,0x23,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x1c,0x44,0x69,0x67,0x69,0x74,0x61,0x6c
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x65,0x20,0x53,0x65,0x72
+,0x76,0x69,0x63,0x65,0x73,0x31,0x1b,0x30
+,0x19,0x06,0x03,0x55,0x04,0x03,0x13,0x12
+,0x53,0x77,0x69,0x73,0x73,0x63,0x6f,0x6d
+,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41
+,0x20,0x31,0x30,0x82,0x02,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x02
+,0x0f,0x00,0x30,0x82,0x02,0x0a,0x02,0x82
+,0x02,0x01,0x00,0xd0,0xb9,0xb0,0xa8,0x0c
+,0xd9,0xbb,0x3f,0x21,0xf8,0x1b,0xd5,0x33
+,0x93,0x80,0x16,0x65,0x20,0x75,0xb2,0x3d
+,0x9b,0x60,0x6d,0x46,0xc8,0x8c,0x31,0x6f
+,0x17,0xc3,0xfa,0x9a,0x6c,0x56,0xed,0x3c
+,0xc5,0x91,0x57,0xc3,0xcd,0xab,0x96,0x49
+,0x90,0x2a,0x19,0x4b,0x1e,0xa3,0x6d,0x57
+,0xdd,0xf1,0x2b,0x62,0x28,0x75,0x45,0x5e
+,0xaa,0xd6,0x5b,0xfa,0x0b,0x25,0xd8,0xa1
+,0x16,0xf9,0x1c,0xc4,0x2e,0xe6,0x95,0x2a
+,0x67,0xcc,0xd0,0x29,0x6e,0x3c,0x85,0x34
+,0x38,0x61,0x49,0xb1,0x00,0x9f,0xd6,0x3a
+,0x71,0x5f,0x4d,0x6d,0xce,0x5f,0xb9,0xa9
+,0xe4,0x89,0x7f,0x6a,0x52,0xfa,0xca,0x9b
+,0xf2,0xdc,0xa9,0xf9,0x9d,0x99,0x47,0x3f
+,0x4e,0x29,0x5f,0xb4,0xa6,0x8d,0x5d,0x7b
+,0x0b,0x99,0x11,0x03,0x03,0xfe,0xe7,0xdb
+,0xdb,0xa3,0xff,0x1d,0xa5,0xcd,0x90,0x1e
+,0x01,0x1f,0x35,0xb0,0x7f,0x00,0xdb,0x90
+,0x6f,0xc6,0x7e,0x7b,0xd1,0xee,0x7a,0x7a
+,0xa7,0xaa,0x0c,0x57,0x6f,0xa4,0x6d,0xc5
+,0x13,0x3b,0xb0,0xa5,0xd9,0xed,0x32,0x1c
+,0xb4,0x5e,0x67,0x8b,0x54,0xdc,0x73,0x87
+,0xe5,0xd3,0x17,0x7c,0x66,0x50,0x72,0x5d
+,0xd4,0x1a,0x58,0xc1,0xd9,0xcf,0xd8,0x89
+,0x02,0x6f,0xa7,0x49,0xb4,0x36,0x5d,0xd0
+,0xa4,0xde,0x07,0x2c,0xb6,0x75,0xb7,0x28
+,0x91,0xd6,0x97,0xbe,0x28,0xf5,0x98,0x1e
+,0xea,0x5b,0x26,0xc9,0xbd,0xb0,0x97,0x73
+,0xda,0xae,0x91,0x26,0xeb,0x68,0xc1,0xf9
+,0x39,0x15,0xd6,0x67,0x4b,0x0a,0x6d,0x4f
+,0xcb,0xcf,0xb0,0xe4,0x42,0x71,0x8c,0x53
+,0x79,0xe7,0xee,0xe1,0xdb,0x1d,0xa0,0x6e
+,0x1d,0x8c,0x1a,0x77,0x35,0x5c,0x16,0x1e
+,0x2b,0x53,0x1f,0x34,0x8b,0xd1,0x6c,0xfc
+,0xf2,0x67,0x07,0x7a,0xf5,0xad,0xed,0xd6
+,0x9a,0xab,0xa1,0xb1,0x4b,0xe1,0xcc,0x37
+,0x5f,0xfd,0x7f,0xcd,0x4d,0xae,0xb8,0x1f
+,0x9c,0x43,0xf9,0x2a,0x58,0x55,0x43,0x45
+,0xbc,0x96,0xcd,0x70,0x0e,0xfc,0xc9,0xe3
+,0x66,0xba,0x4e,0x8d,0x3b,0x81,0xcb,0x15
+,0x64,0x7b,0xb9,0x94,0xe8,0x5d,0x33,0x52
+,0x85,0x71,0x2e,0x4f,0x8e,0xa2,0x06,0x11
+,0x51,0xc9,0xe3,0xcb,0xa1,0x6e,0x31,0x08
+,0x64,0x0c,0xc2,0xd2,0x3c,0xf5,0x36,0xe8
+,0xd7,0xd0,0x0e,0x78,0x23,0x20,0x91,0xc9
+,0x24,0x2a,0x65,0x29,0x5b,0x22,0xf7,0x21
+,0xce,0x83,0x5e,0xa4,0xf3,0xde,0x4b,0xd3
+,0x68,0x8f,0x46,0x75,0x5c,0x83,0x09,0x6e
+,0x29,0x6b,0xc4,0x70,0x8c,0xf5,0x9d,0xd7
+,0x20,0x2f,0xff,0x46,0xd2,0x2b,0x38,0xc2
+,0x2f,0x75,0x1c,0x3d,0x7e,0xda,0xa5,0xef
+,0x1e,0x60,0x85,0x69,0x42,0xd3,0xcc,0xf8
+,0x63,0xfe,0x1e,0x43,0x39,0x85,0xa6,0xb6
+,0x63,0x41,0x10,0xb3,0x73,0x1e,0xbc,0xd3
+,0xfa,0xca,0x7d,0x16,0x47,0xe2,0xa7,0xd5
+,0xd0,0xa3,0x8a,0x0a,0x08,0x96,0x62,0x56
+,0x6e,0x34,0xdb,0xd9,0x02,0xb9,0x30,0x75
+,0xe3,0x04,0xd2,0xe7,0x8f,0xc2,0xb0,0x11
+,0x40,0x0a,0xac,0xd5,0x71,0x02,0x62,0x8b
+,0x31,0xbe,0xdd,0xc6,0x23,0x58,0x31,0x42
+,0x43,0x2d,0x74,0xf9,0xc6,0x9e,0xa6,0x8a
+,0x0f,0xe9,0xfe,0xbf,0x83,0xe6,0x43,0x57
+,0x24,0xba,0xef,0x46,0x34,0xaa,0xd7,0x12
+,0x01,0x38,0xed,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x81,0x86,0x30,0x81,0x83,0x30,0x0e
+,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff
+,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x21,0x04,0x16,0x30
+,0x14,0x30,0x12,0x06,0x07,0x60,0x85,0x74
+,0x01,0x53,0x00,0x01,0x06,0x07,0x60,0x85
+,0x74,0x01,0x53,0x00,0x01,0x30,0x12,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x08,0x30,0x06,0x01,0x01,0xff,0x02,0x01
+,0x07,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0x03,0x25
+,0x2f,0xde,0x6f,0x82,0x01,0x3a,0x5c,0x2c
+,0xdc,0x2b,0xa1,0x69,0xb5,0x67,0xd4,0x8c
+,0xd3,0xfd,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x03,0x25,0x2f
+,0xde,0x6f,0x82,0x01,0x3a,0x5c,0x2c,0xdc
+,0x2b,0xa1,0x69,0xb5,0x67,0xd4,0x8c,0xd3
+,0xfd,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x02,0x01,0x00,0x35,0x10,0xcb
+,0xec,0xa6,0x04,0x0d,0x0d,0x0f,0xcd,0xc0
+,0xdb,0xab,0xa8,0xf2,0x88,0x97,0x0c,0xdf
+,0x93,0x2f,0x4d,0x7c,0x40,0x56,0x31,0x7a
+,0xeb,0xa4,0x0f,0x60,0xcd,0x7a,0xf3,0xbe
+,0xc3,0x27,0x8e,0x03,0x3e,0xa4,0xdd,0x12
+,0xef,0x7e,0x1e,0x74,0x06,0x3c,0x3f,0x31
+,0xf2,0x1c,0x7b,0x91,0x31,0x21,0xb4,0xf0
+,0xd0,0x6c,0x97,0xd4,0xe9,0x97,0xb2,0x24
+,0x56,0x1e,0x56,0xc3,0x35,0xbd,0x88,0x05
+,0x0f,0x5b,0x10,0x1a,0x64,0xe1,0xc7,0x82
+,0x30,0xf9,0x32,0xad,0x9e,0x50,0x2c,0xe7
+,0x78,0x05,0xd0,0x31,0xb1,0x5a,0x98,0x8a
+,0x75,0x4e,0x90,0x5c,0x6a,0x14,0x2a,0xe0
+,0x52,0x47,0x82,0x60,0xe6,0x1e,0xda,0x81
+,0xb1,0xfb,0x14,0x0b,0x5a,0xf1,0x9f,0xd2
+,0x95,0xba,0x3e,0xd0,0x1b,0xd6,0x15,0x1d
+,0xa3,0xbe,0x86,0xd5,0xdb,0x0f,0xc0,0x49
+,0x64,0xbb,0x2e,0x50,0x19,0x4b,0xd2,0x24
+,0xf8,0xdd,0x1e,0x07,0x56,0xd0,0x38,0xa0
+,0x95,0x70,0x20,0x76,0x8c,0xd7,0xdd,0x1e
+,0xde,0x9f,0x71,0xc4,0x23,0xef,0x83,0x13
+,0x5c,0xa3,0x24,0x15,0x4d,0x29,0x40,0x3c
+,0x6a,0xc4,0xa9,0xd8,0xb7,0xa6,0x44,0xa5
+,0x0d,0xf4,0xe0,0x9d,0x77,0x1e,0x40,0x70
+,0x26,0xfc,0xda,0xd9,0x36,0xe4,0x79,0xe4
+,0xb5,0x3f,0xbc,0x9b,0x65,0xbe,0xbb,0x11
+,0x96,0xcf,0xdb,0xc6,0x28,0x39,0x3a,0x08
+,0xce,0x47,0x5b,0x53,0x5a,0xc5,0x99,0xfe
+,0x5d,0xa9,0xdd,0xef,0x4c,0xd4,0xc6,0xa5
+,0xad,0x02,0xe6,0x8c,0x07,0x12,0x1e,0x6f
+,0x03,0xd1,0x6f,0xa0,0xa3,0xf3,0x29,0xbd
+,0x12,0xc7,0x50,0xa2,0xb0,0x7f,0x88,0xa9
+,0x99,0x77,0x9a,0xb1,0xc0,0xa5,0x39,0x2e
+,0x5c,0x7c,0x69,0xe2,0x2c,0xb0,0xea,0x37
+,0x6a,0xa4,0xe1,0x5a,0xe1,0xf5,0x50,0xe5
+,0x83,0xef,0xa5,0xbb,0x2a,0x88,0xe7,0x8c
+,0xdb,0xfd,0x6d,0x5e,0x97,0x19,0xa8,0x7e
+,0x66,0x75,0x6b,0x71,0xea,0xbf,0xb1,0xc7
+,0x6f,0xa0,0xf4,0x8e,0xa4,0xec,0x34,0x51
+,0x5b,0x8c,0x26,0x03,0x70,0xa1,0x77,0xd5
+,0x01,0x12,0x57,0x00,0x35,0xdb,0x23,0xde
+,0x0e,0x8a,0x28,0x99,0xfd,0xb1,0x10,0x6f
+,0x4b,0xff,0x38,0x2d,0x60,0x4e,0x2c,0x9c
+,0xeb,0x67,0xb5,0xad,0x49,0xee,0x4b,0x1f
+,0xac,0xaf,0xfb,0x0d,0x90,0x5a,0x66,0x60
+,0x70,0x5d,0xaa,0xcd,0x78,0xd4,0x24,0xee
+,0xc8,0x41,0xa0,0x93,0x01,0x92,0x9c,0x6a
+,0x9e,0xfc,0xb9,0x24,0xc5,0xb3,0x15,0x82
+,0x7e,0xbe,0xae,0x95,0x2b,0xeb,0xb1,0xc0
+,0xda,0xe3,0x01,0x60,0x0b,0x5e,0x69,0xac
+,0x84,0x56,0x61,0xbe,0x71,0x17,0xfe,0x1d
+,0x13,0x0f,0xfe,0xc6,0x87,0x45,0xe9,0xfe
+,0x32,0xa0,0x1a,0x0d,0x13,0xa4,0x94,0x55
+,0x71,0xa5,0x16,0x8b,0xba,0xca,0x89,0xb0
+,0xb2,0xc7,0xfc,0x8f,0xd8,0x54,0xb5,0x93
+,0x62,0x9d,0xce,0xcf,0x59,0xfb,0x3d,0x18
+,0xce,0x2a,0xcb,0x35,0x15,0x82,0x5d,0xff
+,0x54,0x22,0x5b,0x71,0x52,0xfb,0xb7,0xc9
+,0xfe,0x60,0x9b,0x00,0x41,0x64,0xf0,0xaa
+,0x2a,0xec,0xb6,0x42,0x43,0xce,0x89,0x66
+,0x81,0xc8,0x8b,0x9f,0x39,0x54,0x03,0x25
+,0xd3,0x16,0x35,0x8e,0x84,0xd0,0x5f,0xfa
+,0x30,0x1a,0xf5,0x9a,0x6c,0xf4,0x0e,0x53
+,0xf9,0x3a,0x5b,0xd1,0x1c};
+const unsigned int NptTlsTrustAnchor_Base_0101_Size = 1501;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0102.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0102.cpp
new file mode 100644
index 0000000..884fc39
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0102.cpp
@@ -0,0 +1,156 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* DigiCert Assured ID Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0102_Data[955] = {
+0x30,0x82,0x03,0xb7,0x30,0x82,0x02,0x9f
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x0c
+,0xe7,0xe0,0xe5,0x17,0xd8,0x46,0xfe,0x8f
+,0xe5,0x60,0xfc,0x1b,0xf0,0x30,0x39,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x65
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30
+,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c
+,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74
+,0x20,0x49,0x6e,0x63,0x31,0x19,0x30,0x17
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x10,0x77
+,0x77,0x77,0x2e,0x64,0x69,0x67,0x69,0x63
+,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x31
+,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x03
+,0x13,0x1b,0x44,0x69,0x67,0x69,0x43,0x65
+,0x72,0x74,0x20,0x41,0x73,0x73,0x75,0x72
+,0x65,0x64,0x20,0x49,0x44,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x30,0x1e,0x17
+,0x0d,0x30,0x36,0x31,0x31,0x31,0x30,0x30
+,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d
+,0x33,0x31,0x31,0x31,0x31,0x30,0x30,0x30
+,0x30,0x30,0x30,0x30,0x5a,0x30,0x65,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c,0x44
+,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20
+,0x49,0x6e,0x63,0x31,0x19,0x30,0x17,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x10,0x77,0x77
+,0x77,0x2e,0x64,0x69,0x67,0x69,0x63,0x65
+,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x31,0x24
+,0x30,0x22,0x06,0x03,0x55,0x04,0x03,0x13
+,0x1b,0x44,0x69,0x67,0x69,0x43,0x65,0x72
+,0x74,0x20,0x41,0x73,0x73,0x75,0x72,0x65
+,0x64,0x20,0x49,0x44,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xad,0x0e,0x15
+,0xce,0xe4,0x43,0x80,0x5c,0xb1,0x87,0xf3
+,0xb7,0x60,0xf9,0x71,0x12,0xa5,0xae,0xdc
+,0x26,0x94,0x88,0xaa,0xf4,0xce,0xf5,0x20
+,0x39,0x28,0x58,0x60,0x0c,0xf8,0x80,0xda
+,0xa9,0x15,0x95,0x32,0x61,0x3c,0xb5,0xb1
+,0x28,0x84,0x8a,0x8a,0xdc,0x9f,0x0a,0x0c
+,0x83,0x17,0x7a,0x8f,0x90,0xac,0x8a,0xe7
+,0x79,0x53,0x5c,0x31,0x84,0x2a,0xf6,0x0f
+,0x98,0x32,0x36,0x76,0xcc,0xde,0xdd,0x3c
+,0xa8,0xa2,0xef,0x6a,0xfb,0x21,0xf2,0x52
+,0x61,0xdf,0x9f,0x20,0xd7,0x1f,0xe2,0xb1
+,0xd9,0xfe,0x18,0x64,0xd2,0x12,0x5b,0x5f
+,0xf9,0x58,0x18,0x35,0xbc,0x47,0xcd,0xa1
+,0x36,0xf9,0x6b,0x7f,0xd4,0xb0,0x38,0x3e
+,0xc1,0x1b,0xc3,0x8c,0x33,0xd9,0xd8,0x2f
+,0x18,0xfe,0x28,0x0f,0xb3,0xa7,0x83,0xd6
+,0xc3,0x6e,0x44,0xc0,0x61,0x35,0x96,0x16
+,0xfe,0x59,0x9c,0x8b,0x76,0x6d,0xd7,0xf1
+,0xa2,0x4b,0x0d,0x2b,0xff,0x0b,0x72,0xda
+,0x9e,0x60,0xd0,0x8e,0x90,0x35,0xc6,0x78
+,0x55,0x87,0x20,0xa1,0xcf,0xe5,0x6d,0x0a
+,0xc8,0x49,0x7c,0x31,0x98,0x33,0x6c,0x22
+,0xe9,0x87,0xd0,0x32,0x5a,0xa2,0xba,0x13
+,0x82,0x11,0xed,0x39,0x17,0x9d,0x99,0x3a
+,0x72,0xa1,0xe6,0xfa,0xa4,0xd9,0xd5,0x17
+,0x31,0x75,0xae,0x85,0x7d,0x22,0xae,0x3f
+,0x01,0x46,0x86,0xf6,0x28,0x79,0xc8,0xb1
+,0xda,0xe4,0x57,0x17,0xc4,0x7e,0x1c,0x0e
+,0xb0,0xb4,0x92,0xa6,0x56,0xb3,0xbd,0xb2
+,0x97,0xed,0xaa,0xa7,0xf0,0xb7,0xc5,0xa8
+,0x3f,0x95,0x16,0xd0,0xff,0xa1,0x96,0xeb
+,0x08,0x5f,0x18,0x77,0x4f,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x63,0x30,0x61,0x30,0x0e
+,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff
+,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0x45,0xeb,0xa2,0xaf,0xf4,0x92
+,0xcb,0x82,0x31,0x2d,0x51,0x8b,0xa7,0xa7
+,0x21,0x9d,0xf3,0x6d,0xc8,0x0f,0x30,0x1f
+,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30
+,0x16,0x80,0x14,0x45,0xeb,0xa2,0xaf,0xf4
+,0x92,0xcb,0x82,0x31,0x2d,0x51,0x8b,0xa7
+,0xa7,0x21,0x9d,0xf3,0x6d,0xc8,0x0f,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x01,0x01,0x00,0xa2,0x0e,0xbc,0xdf,0xe2
+,0xed,0xf0,0xe3,0x72,0x73,0x7a,0x64,0x94
+,0xbf,0xf7,0x72,0x66,0xd8,0x32,0xe4,0x42
+,0x75,0x62,0xae,0x87,0xeb,0xf2,0xd5,0xd9
+,0xde,0x56,0xb3,0x9f,0xcc,0xce,0x14,0x28
+,0xb9,0x0d,0x97,0x60,0x5c,0x12,0x4c,0x58
+,0xe4,0xd3,0x3d,0x83,0x49,0x45,0x58,0x97
+,0x35,0x69,0x1a,0xa8,0x47,0xea,0x56,0xc6
+,0x79,0xab,0x12,0xd8,0x67,0x81,0x84,0xdf
+,0x7f,0x09,0x3c,0x94,0xe6,0xb8,0x26,0x2c
+,0x20,0xbd,0x3d,0xb3,0x28,0x89,0xf7,0x5f
+,0xff,0x22,0xe2,0x97,0x84,0x1f,0xe9,0x65
+,0xef,0x87,0xe0,0xdf,0xc1,0x67,0x49,0xb3
+,0x5d,0xeb,0xb2,0x09,0x2a,0xeb,0x26,0xed
+,0x78,0xbe,0x7d,0x3f,0x2b,0xf3,0xb7,0x26
+,0x35,0x6d,0x5f,0x89,0x01,0xb6,0x49,0x5b
+,0x9f,0x01,0x05,0x9b,0xab,0x3d,0x25,0xc1
+,0xcc,0xb6,0x7f,0xc2,0xf1,0x6f,0x86,0xc6
+,0xfa,0x64,0x68,0xeb,0x81,0x2d,0x94,0xeb
+,0x42,0xb7,0xfa,0x8c,0x1e,0xdd,0x62,0xf1
+,0xbe,0x50,0x67,0xb7,0x6c,0xbd,0xf3,0xf1
+,0x1f,0x6b,0x0c,0x36,0x07,0x16,0x7f,0x37
+,0x7c,0xa9,0x5b,0x6d,0x7a,0xf1,0x12,0x46
+,0x60,0x83,0xd7,0x27,0x04,0xbe,0x4b,0xce
+,0x97,0xbe,0xc3,0x67,0x2a,0x68,0x11,0xdf
+,0x80,0xe7,0x0c,0x33,0x66,0xbf,0x13,0x0d
+,0x14,0x6e,0xf3,0x7f,0x1f,0x63,0x10,0x1e
+,0xfa,0x8d,0x1b,0x25,0x6d,0x6c,0x8f,0xa5
+,0xb7,0x61,0x01,0xb1,0xd2,0xa3,0x26,0xa1
+,0x10,0x71,0x9d,0xad,0xe2,0xc3,0xf9,0xc3
+,0x99,0x51,0xb7,0x2b,0x07,0x08,0xce,0x2e
+,0xe6,0x50,0xb2,0xa7,0xfa,0x0a,0x45,0x2f
+,0xa2,0xf0,0xf2};
+const unsigned int NptTlsTrustAnchor_Base_0102_Size = 955;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0103.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0103.cpp
new file mode 100644
index 0000000..d752946
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0103.cpp
@@ -0,0 +1,155 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* DigiCert Global Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0103_Data[947] = {
+0x30,0x82,0x03,0xaf,0x30,0x82,0x02,0x97
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x08
+,0x3b,0xe0,0x56,0x90,0x42,0x46,0xb1,0xa1
+,0x75,0x6a,0xc9,0x59,0x91,0xc7,0x4a,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x61
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30
+,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c
+,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74
+,0x20,0x49,0x6e,0x63,0x31,0x19,0x30,0x17
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x10,0x77
+,0x77,0x77,0x2e,0x64,0x69,0x67,0x69,0x63
+,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x31
+,0x20,0x30,0x1e,0x06,0x03,0x55,0x04,0x03
+,0x13,0x17,0x44,0x69,0x67,0x69,0x43,0x65
+,0x72,0x74,0x20,0x47,0x6c,0x6f,0x62,0x61
+,0x6c,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x30,0x1e,0x17,0x0d,0x30,0x36,0x31
+,0x31,0x31,0x30,0x30,0x30,0x30,0x30,0x30
+,0x30,0x5a,0x17,0x0d,0x33,0x31,0x31,0x31
+,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30
+,0x5a,0x30,0x61,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53
+,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x0c,0x44,0x69,0x67,0x69,0x43
+,0x65,0x72,0x74,0x20,0x49,0x6e,0x63,0x31
+,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x10,0x77,0x77,0x77,0x2e,0x64,0x69
+,0x67,0x69,0x63,0x65,0x72,0x74,0x2e,0x63
+,0x6f,0x6d,0x31,0x20,0x30,0x1e,0x06,0x03
+,0x55,0x04,0x03,0x13,0x17,0x44,0x69,0x67
+,0x69,0x43,0x65,0x72,0x74,0x20,0x47,0x6c
+,0x6f,0x62,0x61,0x6c,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xe2,0x3b,0xe1
+,0x11,0x72,0xde,0xa8,0xa4,0xd3,0xa3,0x57
+,0xaa,0x50,0xa2,0x8f,0x0b,0x77,0x90,0xc9
+,0xa2,0xa5,0xee,0x12,0xce,0x96,0x5b,0x01
+,0x09,0x20,0xcc,0x01,0x93,0xa7,0x4e,0x30
+,0xb7,0x53,0xf7,0x43,0xc4,0x69,0x00,0x57
+,0x9d,0xe2,0x8d,0x22,0xdd,0x87,0x06,0x40
+,0x00,0x81,0x09,0xce,0xce,0x1b,0x83,0xbf
+,0xdf,0xcd,0x3b,0x71,0x46,0xe2,0xd6,0x66
+,0xc7,0x05,0xb3,0x76,0x27,0x16,0x8f,0x7b
+,0x9e,0x1e,0x95,0x7d,0xee,0xb7,0x48,0xa3
+,0x08,0xda,0xd6,0xaf,0x7a,0x0c,0x39,0x06
+,0x65,0x7f,0x4a,0x5d,0x1f,0xbc,0x17,0xf8
+,0xab,0xbe,0xee,0x28,0xd7,0x74,0x7f,0x7a
+,0x78,0x99,0x59,0x85,0x68,0x6e,0x5c,0x23
+,0x32,0x4b,0xbf,0x4e,0xc0,0xe8,0x5a,0x6d
+,0xe3,0x70,0xbf,0x77,0x10,0xbf,0xfc,0x01
+,0xf6,0x85,0xd9,0xa8,0x44,0x10,0x58,0x32
+,0xa9,0x75,0x18,0xd5,0xd1,0xa2,0xbe,0x47
+,0xe2,0x27,0x6a,0xf4,0x9a,0x33,0xf8,0x49
+,0x08,0x60,0x8b,0xd4,0x5f,0xb4,0x3a,0x84
+,0xbf,0xa1,0xaa,0x4a,0x4c,0x7d,0x3e,0xcf
+,0x4f,0x5f,0x6c,0x76,0x5e,0xa0,0x4b,0x37
+,0x91,0x9e,0xdc,0x22,0xe6,0x6d,0xce,0x14
+,0x1a,0x8e,0x6a,0xcb,0xfe,0xcd,0xb3,0x14
+,0x64,0x17,0xc7,0x5b,0x29,0x9e,0x32,0xbf
+,0xf2,0xee,0xfa,0xd3,0x0b,0x42,0xd4,0xab
+,0xb7,0x41,0x32,0xda,0x0c,0xd4,0xef,0xf8
+,0x81,0xd5,0xbb,0x8d,0x58,0x3f,0xb5,0x1b
+,0xe8,0x49,0x28,0xa2,0x70,0xda,0x31,0x04
+,0xdd,0xf7,0xb2,0x16,0xf2,0x4c,0x0a,0x4e
+,0x07,0xa8,0xed,0x4a,0x3d,0x5e,0xb5,0x7f
+,0xa3,0x90,0xc3,0xaf,0x27,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x63,0x30,0x61,0x30,0x0e
+,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff
+,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0x03,0xde,0x50,0x35,0x56,0xd1
+,0x4c,0xbb,0x66,0xf0,0xa3,0xe2,0x1b,0x1b
+,0xc3,0x97,0xb2,0x3d,0xd1,0x55,0x30,0x1f
+,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30
+,0x16,0x80,0x14,0x03,0xde,0x50,0x35,0x56
+,0xd1,0x4c,0xbb,0x66,0xf0,0xa3,0xe2,0x1b
+,0x1b,0xc3,0x97,0xb2,0x3d,0xd1,0x55,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x01,0x01,0x00,0xcb,0x9c,0x37,0xaa,0x48
+,0x13,0x12,0x0a,0xfa,0xdd,0x44,0x9c,0x4f
+,0x52,0xb0,0xf4,0xdf,0xae,0x04,0xf5,0x79
+,0x79,0x08,0xa3,0x24,0x18,0xfc,0x4b,0x2b
+,0x84,0xc0,0x2d,0xb9,0xd5,0xc7,0xfe,0xf4
+,0xc1,0x1f,0x58,0xcb,0xb8,0x6d,0x9c,0x7a
+,0x74,0xe7,0x98,0x29,0xab,0x11,0xb5,0xe3
+,0x70,0xa0,0xa1,0xcd,0x4c,0x88,0x99,0x93
+,0x8c,0x91,0x70,0xe2,0xab,0x0f,0x1c,0xbe
+,0x93,0xa9,0xff,0x63,0xd5,0xe4,0x07,0x60
+,0xd3,0xa3,0xbf,0x9d,0x5b,0x09,0xf1,0xd5
+,0x8e,0xe3,0x53,0xf4,0x8e,0x63,0xfa,0x3f
+,0xa7,0xdb,0xb4,0x66,0xdf,0x62,0x66,0xd6
+,0xd1,0x6e,0x41,0x8d,0xf2,0x2d,0xb5,0xea
+,0x77,0x4a,0x9f,0x9d,0x58,0xe2,0x2b,0x59
+,0xc0,0x40,0x23,0xed,0x2d,0x28,0x82,0x45
+,0x3e,0x79,0x54,0x92,0x26,0x98,0xe0,0x80
+,0x48,0xa8,0x37,0xef,0xf0,0xd6,0x79,0x60
+,0x16,0xde,0xac,0xe8,0x0e,0xcd,0x6e,0xac
+,0x44,0x17,0x38,0x2f,0x49,0xda,0xe1,0x45
+,0x3e,0x2a,0xb9,0x36,0x53,0xcf,0x3a,0x50
+,0x06,0xf7,0x2e,0xe8,0xc4,0x57,0x49,0x6c
+,0x61,0x21,0x18,0xd5,0x04,0xad,0x78,0x3c
+,0x2c,0x3a,0x80,0x6b,0xa7,0xeb,0xaf,0x15
+,0x14,0xe9,0xd8,0x89,0xc1,0xb9,0x38,0x6c
+,0xe2,0x91,0x6c,0x8a,0xff,0x64,0xb9,0x77
+,0x25,0x57,0x30,0xc0,0x1b,0x24,0xa3,0xe1
+,0xdc,0xe9,0xdf,0x47,0x7c,0xb5,0xb4,0x24
+,0x08,0x05,0x30,0xec,0x2d,0xbd,0x0b,0xbf
+,0x45,0xbf,0x50,0xb9,0xa9,0xf3,0xeb,0x98
+,0x01,0x12,0xad,0xc8,0x88,0xc6,0x98,0x34
+,0x5f,0x8d,0x0a,0x3c,0xc6,0xe9,0xd5,0x95
+,0x95,0x6d,0xde};
+const unsigned int NptTlsTrustAnchor_Base_0103_Size = 947;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0104.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0104.cpp
new file mode 100644
index 0000000..500befe
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0104.cpp
@@ -0,0 +1,158 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* DigiCert High Assurance EV Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0104_Data[969] = {
+0x30,0x82,0x03,0xc5,0x30,0x82,0x02,0xad
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x02
+,0xac,0x5c,0x26,0x6a,0x0b,0x40,0x9b,0x8f
+,0x0b,0x79,0xf2,0xae,0x46,0x25,0x77,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x6c
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30
+,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c
+,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74
+,0x20,0x49,0x6e,0x63,0x31,0x19,0x30,0x17
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x10,0x77
+,0x77,0x77,0x2e,0x64,0x69,0x67,0x69,0x63
+,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x31
+,0x2b,0x30,0x29,0x06,0x03,0x55,0x04,0x03
+,0x13,0x22,0x44,0x69,0x67,0x69,0x43,0x65
+,0x72,0x74,0x20,0x48,0x69,0x67,0x68,0x20
+,0x41,0x73,0x73,0x75,0x72,0x61,0x6e,0x63
+,0x65,0x20,0x45,0x56,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d
+,0x30,0x36,0x31,0x31,0x31,0x30,0x30,0x30
+,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x33
+,0x31,0x31,0x31,0x31,0x30,0x30,0x30,0x30
+,0x30,0x30,0x30,0x5a,0x30,0x6c,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x0c,0x44,0x69
+,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x49
+,0x6e,0x63,0x31,0x19,0x30,0x17,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x10,0x77,0x77,0x77
+,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72
+,0x74,0x2e,0x63,0x6f,0x6d,0x31,0x2b,0x30
+,0x29,0x06,0x03,0x55,0x04,0x03,0x13,0x22
+,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74
+,0x20,0x48,0x69,0x67,0x68,0x20,0x41,0x73
+,0x73,0x75,0x72,0x61,0x6e,0x63,0x65,0x20
+,0x45,0x56,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xc6,0xcc,0xe5,0x73,0xe6
+,0xfb,0xd4,0xbb,0xe5,0x2d,0x2d,0x32,0xa6
+,0xdf,0xe5,0x81,0x3f,0xc9,0xcd,0x25,0x49
+,0xb6,0x71,0x2a,0xc3,0xd5,0x94,0x34,0x67
+,0xa2,0x0a,0x1c,0xb0,0x5f,0x69,0xa6,0x40
+,0xb1,0xc4,0xb7,0xb2,0x8f,0xd0,0x98,0xa4
+,0xa9,0x41,0x59,0x3a,0xd3,0xdc,0x94,0xd6
+,0x3c,0xdb,0x74,0x38,0xa4,0x4a,0xcc,0x4d
+,0x25,0x82,0xf7,0x4a,0xa5,0x53,0x12,0x38
+,0xee,0xf3,0x49,0x6d,0x71,0x91,0x7e,0x63
+,0xb6,0xab,0xa6,0x5f,0xc3,0xa4,0x84,0xf8
+,0x4f,0x62,0x51,0xbe,0xf8,0xc5,0xec,0xdb
+,0x38,0x92,0xe3,0x06,0xe5,0x08,0x91,0x0c
+,0xc4,0x28,0x41,0x55,0xfb,0xcb,0x5a,0x89
+,0x15,0x7e,0x71,0xe8,0x35,0xbf,0x4d,0x72
+,0x09,0x3d,0xbe,0x3a,0x38,0x50,0x5b,0x77
+,0x31,0x1b,0x8d,0xb3,0xc7,0x24,0x45,0x9a
+,0xa7,0xac,0x6d,0x00,0x14,0x5a,0x04,0xb7
+,0xba,0x13,0xeb,0x51,0x0a,0x98,0x41,0x41
+,0x22,0x4e,0x65,0x61,0x87,0x81,0x41,0x50
+,0xa6,0x79,0x5c,0x89,0xde,0x19,0x4a,0x57
+,0xd5,0x2e,0xe6,0x5d,0x1c,0x53,0x2c,0x7e
+,0x98,0xcd,0x1a,0x06,0x16,0xa4,0x68,0x73
+,0xd0,0x34,0x04,0x13,0x5c,0xa1,0x71,0xd3
+,0x5a,0x7c,0x55,0xdb,0x5e,0x64,0xe1,0x37
+,0x87,0x30,0x56,0x04,0xe5,0x11,0xb4,0x29
+,0x80,0x12,0xf1,0x79,0x39,0x88,0xa2,0x02
+,0x11,0x7c,0x27,0x66,0xb7,0x88,0xb7,0x78
+,0xf2,0xca,0x0a,0xa8,0x38,0xab,0x0a,0x64
+,0xc2,0xbf,0x66,0x5d,0x95,0x84,0xc1,0xa1
+,0x25,0x1e,0x87,0x5d,0x1a,0x50,0x0b,0x20
+,0x12,0xcc,0x41,0xbb,0x6e,0x0b,0x51,0x38
+,0xb8,0x4b,0xcb,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x63,0x30,0x61,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x86,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0xb1,0x3e,0xc3,0x69,0x03,0xf8,0xbf,0x47
+,0x01,0xd4,0x98,0x26,0x1a,0x08,0x02,0xef
+,0x63,0x64,0x2b,0xc3,0x30,0x1f,0x06,0x03
+,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80
+,0x14,0xb1,0x3e,0xc3,0x69,0x03,0xf8,0xbf
+,0x47,0x01,0xd4,0x98,0x26,0x1a,0x08,0x02
+,0xef,0x63,0x64,0x2b,0xc3,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0x1c,0x1a,0x06,0x97,0xdc,0xd7,0x9c
+,0x9f,0x3c,0x88,0x66,0x06,0x08,0x57,0x21
+,0xdb,0x21,0x47,0xf8,0x2a,0x67,0xaa,0xbf
+,0x18,0x32,0x76,0x40,0x10,0x57,0xc1,0x8a
+,0xf3,0x7a,0xd9,0x11,0x65,0x8e,0x35,0xfa
+,0x9e,0xfc,0x45,0xb5,0x9e,0xd9,0x4c,0x31
+,0x4b,0xb8,0x91,0xe8,0x43,0x2c,0x8e,0xb3
+,0x78,0xce,0xdb,0xe3,0x53,0x79,0x71,0xd6
+,0xe5,0x21,0x94,0x01,0xda,0x55,0x87,0x9a
+,0x24,0x64,0xf6,0x8a,0x66,0xcc,0xde,0x9c
+,0x37,0xcd,0xa8,0x34,0xb1,0x69,0x9b,0x23
+,0xc8,0x9e,0x78,0x22,0x2b,0x70,0x43,0xe3
+,0x55,0x47,0x31,0x61,0x19,0xef,0x58,0xc5
+,0x85,0x2f,0x4e,0x30,0xf6,0xa0,0x31,0x16
+,0x23,0xc8,0xe7,0xe2,0x65,0x16,0x33,0xcb
+,0xbf,0x1a,0x1b,0xa0,0x3d,0xf8,0xca,0x5e
+,0x8b,0x31,0x8b,0x60,0x08,0x89,0x2d,0x0c
+,0x06,0x5c,0x52,0xb7,0xc4,0xf9,0x0a,0x98
+,0xd1,0x15,0x5f,0x9f,0x12,0xbe,0x7c,0x36
+,0x63,0x38,0xbd,0x44,0xa4,0x7f,0xe4,0x26
+,0x2b,0x0a,0xc4,0x97,0x69,0x0d,0xe9,0x8c
+,0xe2,0xc0,0x10,0x57,0xb8,0xc8,0x76,0x12
+,0x91,0x55,0xf2,0x48,0x69,0xd8,0xbc,0x2a
+,0x02,0x5b,0x0f,0x44,0xd4,0x20,0x31,0xdb
+,0xf4,0xba,0x70,0x26,0x5d,0x90,0x60,0x9e
+,0xbc,0x4b,0x17,0x09,0x2f,0xb4,0xcb,0x1e
+,0x43,0x68,0xc9,0x07,0x27,0xc1,0xd2,0x5c
+,0xf7,0xea,0x21,0xb9,0x68,0x12,0x9c,0x3c
+,0x9c,0xbf,0x9e,0xfc,0x80,0x5c,0x9b,0x63
+,0xcd,0xec,0x47,0xaa,0x25,0x27,0x67,0xa0
+,0x37,0xf3,0x00,0x82,0x7d,0x54,0xd7,0xa9
+,0xf8,0xe9,0x2e,0x13,0xa3,0x77,0xe8,0x1f
+,0x4a};
+const unsigned int NptTlsTrustAnchor_Base_0104_Size = 969;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0105.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0105.cpp
new file mode 100644
index 0000000..2dee577
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0105.cpp
@@ -0,0 +1,151 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Certplus Class 2 Primary CA */
+const unsigned char NptTlsTrustAnchor_Base_0105_Data[918] = {
+0x30,0x82,0x03,0x92,0x30,0x82,0x02,0x7a
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x11,0x00
+,0x85,0xbd,0x4b,0xf3,0xd8,0xda,0xe3,0x69
+,0xf6,0x94,0xd7,0x5f,0xc3,0xa5,0x44,0x23
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x3d,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x46,0x52,0x31,0x11
+,0x30,0x0f,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x08,0x43,0x65,0x72,0x74,0x70,0x6c,0x75
+,0x73,0x31,0x1b,0x30,0x19,0x06,0x03,0x55
+,0x04,0x03,0x13,0x12,0x43,0x6c,0x61,0x73
+,0x73,0x20,0x32,0x20,0x50,0x72,0x69,0x6d
+,0x61,0x72,0x79,0x20,0x43,0x41,0x30,0x1e
+,0x17,0x0d,0x39,0x39,0x30,0x37,0x30,0x37
+,0x31,0x37,0x30,0x35,0x30,0x30,0x5a,0x17
+,0x0d,0x31,0x39,0x30,0x37,0x30,0x36,0x32
+,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x3d
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x46,0x52,0x31,0x11,0x30
+,0x0f,0x06,0x03,0x55,0x04,0x0a,0x13,0x08
+,0x43,0x65,0x72,0x74,0x70,0x6c,0x75,0x73
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x03,0x13,0x12,0x43,0x6c,0x61,0x73,0x73
+,0x20,0x32,0x20,0x50,0x72,0x69,0x6d,0x61
+,0x72,0x79,0x20,0x43,0x41,0x30,0x82,0x01
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01
+,0x0a,0x02,0x82,0x01,0x01,0x00,0xdc,0x50
+,0x96,0xd0,0x12,0xf8,0x35,0xd2,0x08,0x78
+,0x7a,0xb6,0x52,0x70,0xfd,0x6f,0xee,0xcf
+,0xb9,0x11,0xcb,0x5d,0x77,0xe1,0xec,0xe9
+,0x7e,0x04,0x8d,0xd6,0xcc,0x6f,0x73,0x43
+,0x57,0x60,0xac,0x33,0x0a,0x44,0xec,0x03
+,0x5f,0x1c,0x80,0x24,0x91,0xe5,0xa8,0x91
+,0x56,0x12,0x82,0xf7,0xe0,0x2b,0xf4,0xdb
+,0xae,0x61,0x2e,0x89,0x10,0x8d,0x6b,0x6c
+,0xba,0xb3,0x02,0xbd,0xd5,0x36,0xc5,0x48
+,0x37,0x23,0xe2,0xf0,0x5a,0x37,0x52,0x33
+,0x17,0x12,0xe2,0xd1,0x60,0x4d,0xbe,0x2f
+,0x41,0x11,0xe3,0xf6,0x17,0x25,0x0c,0x8b
+,0x91,0xc0,0x1b,0x99,0x7b,0x99,0x56,0x0d
+,0xaf,0xee,0xd2,0xbc,0x47,0x57,0xe3,0x79
+,0x49,0x7b,0x34,0x89,0x27,0x24,0x84,0xde
+,0xb1,0xec,0xe9,0x58,0x4e,0xfe,0x4e,0xdf
+,0x5a,0xbe,0x41,0xad,0xac,0x08,0xc5,0x18
+,0x0e,0xef,0xd2,0x53,0xee,0x6c,0xd0,0x9d
+,0x12,0x01,0x13,0x8d,0xdc,0x80,0x62,0xf7
+,0x95,0xa9,0x44,0x88,0x4a,0x71,0x4e,0x60
+,0x55,0x9e,0xdb,0x23,0x19,0x79,0x56,0x07
+,0x0c,0x3f,0x63,0x0b,0x5c,0xb0,0xe2,0xbe
+,0x7e,0x15,0xfc,0x94,0x33,0x58,0x41,0x38
+,0x74,0xc4,0xe1,0x8f,0x8b,0xdf,0x26,0xac
+,0x1f,0xb5,0x8b,0x3b,0xb7,0x43,0x59,0x6b
+,0xb0,0x24,0xa6,0x6d,0x90,0x8b,0xc4,0x72
+,0xea,0x5d,0x33,0x98,0xb7,0xcb,0xde,0x5e
+,0x7b,0xef,0x94,0xf1,0x1b,0x3e,0xca,0xc9
+,0x21,0xc1,0xc5,0x98,0x02,0xaa,0xa2,0xf6
+,0x5b,0x77,0x9b,0xf5,0x7e,0x96,0x55,0x34
+,0x1c,0x67,0x69,0xc0,0xf1,0x42,0xe3,0x47
+,0xac,0xfc,0x28,0x1c,0x66,0x55,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x81,0x8c,0x30,0x81
+,0x89,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x04,0x08,0x30,0x06,0x01,0x01,0xff,0x02
+,0x01,0x0a,0x30,0x0b,0x06,0x03,0x55,0x1d
+,0x0f,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0xe3,0x73,0x2d,0xdf,0xcb,0x0e
+,0x28,0x0c,0xde,0xdd,0xb3,0xa4,0xca,0x79
+,0xb8,0x8e,0xbb,0xe8,0x30,0x89,0x30,0x11
+,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8
+,0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x37,0x06,0x03,0x55,0x1d,0x1f
+,0x04,0x30,0x30,0x2e,0x30,0x2c,0xa0,0x2a
+,0xa0,0x28,0x86,0x26,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x63
+,0x65,0x72,0x74,0x70,0x6c,0x75,0x73,0x2e
+,0x63,0x6f,0x6d,0x2f,0x43,0x52,0x4c,0x2f
+,0x63,0x6c,0x61,0x73,0x73,0x32,0x2e,0x63
+,0x72,0x6c,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0xa7,0x54
+,0xcf,0x88,0x44,0x19,0xcb,0xdf,0xd4,0x7f
+,0x00,0xdf,0x56,0x33,0x62,0xb5,0xf7,0x51
+,0x01,0x90,0xeb,0xc3,0x3f,0xd1,0x88,0x44
+,0xe9,0x24,0x5d,0xef,0xe7,0x14,0xbd,0x20
+,0xb7,0x9a,0x3c,0x00,0xfe,0x6d,0x9f,0xdb
+,0x90,0xdc,0xd7,0xf4,0x62,0xd6,0x8b,0x70
+,0x5d,0xe7,0xe5,0x04,0x48,0xa9,0x68,0x7c
+,0xc9,0xf1,0x42,0xf3,0x6c,0x7f,0xc5,0x7a
+,0x7c,0x1d,0x51,0x88,0xba,0xd2,0x0a,0x3e
+,0x27,0x5d,0xde,0x2d,0x51,0x4e,0xd3,0x13
+,0x64,0x69,0xe4,0x2e,0xe3,0xd3,0xe7,0x9b
+,0x09,0x99,0xa6,0xe0,0x95,0x9b,0xce,0x1a
+,0xd7,0x7f,0xbe,0x3c,0xce,0x52,0xb3,0x11
+,0x15,0xc1,0x0f,0x17,0xcd,0x03,0xbb,0x9c
+,0x25,0x15,0xba,0xa2,0x76,0x89,0xfc,0x06
+,0xf1,0x18,0xd0,0x93,0x4b,0x0e,0x7c,0x82
+,0xb7,0xa5,0xf4,0xf6,0x5f,0xfe,0xed,0x40
+,0xa6,0x9d,0x84,0x74,0x39,0xb9,0xdc,0x1e
+,0x85,0x16,0xda,0x29,0x1b,0x86,0x23,0x00
+,0xc9,0xbb,0x89,0x7e,0x6e,0x80,0x88,0x1e
+,0x2f,0x14,0xb4,0x03,0x24,0xa8,0x32,0x6f
+,0x03,0x9a,0x47,0x2c,0x30,0xbe,0x56,0xc6
+,0xa7,0x42,0x02,0x70,0x1b,0xea,0x40,0xd8
+,0xba,0x05,0x03,0x70,0x07,0xa4,0x96,0xff
+,0xfd,0x48,0x33,0x0a,0xe1,0xdc,0xa5,0x81
+,0x90,0x9b,0x4d,0xdd,0x7d,0xe7,0xe7,0xb2
+,0xcd,0x5c,0xc8,0x6a,0x95,0xf8,0xa5,0xf6
+,0x8d,0xc4,0x5d,0x78,0x08,0xbe,0x7b,0x06
+,0xd6,0x49,0xcf,0x19,0x36,0x50,0x23,0x2e
+,0x08,0xe6,0x9e,0x05,0x4d,0x47,0x18,0xd5
+,0x16,0xe9,0xb1,0xd6,0xb6,0x10,0xd5,0xbb
+,0x97,0xbf,0xa2,0x8e,0xb4,0x54};
+const unsigned int NptTlsTrustAnchor_Base_0105_Size = 918;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0106.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0106.cpp
new file mode 100644
index 0000000..7655be0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0106.cpp
@@ -0,0 +1,142 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* DST Root CA X3 */
+const unsigned char NptTlsTrustAnchor_Base_0106_Data[846] = {
+0x30,0x82,0x03,0x4a,0x30,0x82,0x02,0x32
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x44
+,0xaf,0xb0,0x80,0xd6,0xa3,0x27,0xba,0x89
+,0x30,0x39,0x86,0x2e,0xf8,0x40,0x6b,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x3f
+,0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x1b,0x44,0x69,0x67,0x69,0x74
+,0x61,0x6c,0x20,0x53,0x69,0x67,0x6e,0x61
+,0x74,0x75,0x72,0x65,0x20,0x54,0x72,0x75
+,0x73,0x74,0x20,0x43,0x6f,0x2e,0x31,0x17
+,0x30,0x15,0x06,0x03,0x55,0x04,0x03,0x13
+,0x0e,0x44,0x53,0x54,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x41,0x20,0x58,0x33,0x30
+,0x1e,0x17,0x0d,0x30,0x30,0x30,0x39,0x33
+,0x30,0x32,0x31,0x31,0x32,0x31,0x39,0x5a
+,0x17,0x0d,0x32,0x31,0x30,0x39,0x33,0x30
+,0x31,0x34,0x30,0x31,0x31,0x35,0x5a,0x30
+,0x3f,0x31,0x24,0x30,0x22,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x1b,0x44,0x69,0x67,0x69
+,0x74,0x61,0x6c,0x20,0x53,0x69,0x67,0x6e
+,0x61,0x74,0x75,0x72,0x65,0x20,0x54,0x72
+,0x75,0x73,0x74,0x20,0x43,0x6f,0x2e,0x31
+,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x03
+,0x13,0x0e,0x44,0x53,0x54,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x20,0x58,0x33
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xdf,0xaf,0xe9,0x97,0x50,0x08,0x83
+,0x57,0xb4,0xcc,0x62,0x65,0xf6,0x90,0x82
+,0xec,0xc7,0xd3,0x2c,0x6b,0x30,0xca,0x5b
+,0xec,0xd9,0xc3,0x7d,0xc7,0x40,0xc1,0x18
+,0x14,0x8b,0xe0,0xe8,0x33,0x76,0x49,0x2a
+,0xe3,0x3f,0x21,0x49,0x93,0xac,0x4e,0x0e
+,0xaf,0x3e,0x48,0xcb,0x65,0xee,0xfc,0xd3
+,0x21,0x0f,0x65,0xd2,0x2a,0xd9,0x32,0x8f
+,0x8c,0xe5,0xf7,0x77,0xb0,0x12,0x7b,0xb5
+,0x95,0xc0,0x89,0xa3,0xa9,0xba,0xed,0x73
+,0x2e,0x7a,0x0c,0x06,0x32,0x83,0xa2,0x7e
+,0x8a,0x14,0x30,0xcd,0x11,0xa0,0xe1,0x2a
+,0x38,0xb9,0x79,0x0a,0x31,0xfd,0x50,0xbd
+,0x80,0x65,0xdf,0xb7,0x51,0x63,0x83,0xc8
+,0xe2,0x88,0x61,0xea,0x4b,0x61,0x81,0xec
+,0x52,0x6b,0xb9,0xa2,0xe2,0x4b,0x1a,0x28
+,0x9f,0x48,0xa3,0x9e,0x0c,0xda,0x09,0x8e
+,0x3e,0x17,0x2e,0x1e,0xdd,0x20,0xdf,0x5b
+,0xc6,0x2a,0x8a,0xab,0x2e,0xbd,0x70,0xad
+,0xc5,0x0b,0x1a,0x25,0x90,0x74,0x72,0xc5
+,0x7b,0x6a,0xab,0x34,0xd6,0x30,0x89,0xff
+,0xe5,0x68,0x13,0x7b,0x54,0x0b,0xc8,0xd6
+,0xae,0xec,0x5a,0x9c,0x92,0x1e,0x3d,0x64
+,0xb3,0x8c,0xc6,0xdf,0xbf,0xc9,0x41,0x70
+,0xec,0x16,0x72,0xd5,0x26,0xec,0x38,0x55
+,0x39,0x43,0xd0,0xfc,0xfd,0x18,0x5c,0x40
+,0xf1,0x97,0xeb,0xd5,0x9a,0x9b,0x8d,0x1d
+,0xba,0xda,0x25,0xb9,0xc6,0xd8,0xdf,0xc1
+,0x15,0x02,0x3a,0xab,0xda,0x6e,0xf1,0x3e
+,0x2e,0xf5,0x5c,0x08,0x9c,0x3c,0xd6,0x83
+,0x69,0xe4,0x10,0x9b,0x19,0x2a,0xb6,0x29
+,0x57,0xe3,0xe5,0x3d,0x9b,0x9f,0xf0,0x02
+,0x5d,0x02,0x03,0x01,0x00,0x01,0xa3,0x42
+,0x30,0x40,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0xc4,0xa7
+,0xb1,0xa4,0x7b,0x2c,0x71,0xfa,0xdb,0xe1
+,0x4b,0x90,0x75,0xff,0xc4,0x15,0x60,0x85
+,0x89,0x10,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0xa3,0x1a
+,0x2c,0x9b,0x17,0x00,0x5c,0xa9,0x1e,0xee
+,0x28,0x66,0x37,0x3a,0xbf,0x83,0xc7,0x3f
+,0x4b,0xc3,0x09,0xa0,0x95,0x20,0x5d,0xe3
+,0xd9,0x59,0x44,0xd2,0x3e,0x0d,0x3e,0xbd
+,0x8a,0x4b,0xa0,0x74,0x1f,0xce,0x10,0x82
+,0x9c,0x74,0x1a,0x1d,0x7e,0x98,0x1a,0xdd
+,0xcb,0x13,0x4b,0xb3,0x20,0x44,0xe4,0x91
+,0xe9,0xcc,0xfc,0x7d,0xa5,0xdb,0x6a,0xe5
+,0xfe,0xe6,0xfd,0xe0,0x4e,0xdd,0xb7,0x00
+,0x3a,0xb5,0x70,0x49,0xaf,0xf2,0xe5,0xeb
+,0x02,0xf1,0xd1,0x02,0x8b,0x19,0xcb,0x94
+,0x3a,0x5e,0x48,0xc4,0x18,0x1e,0x58,0x19
+,0x5f,0x1e,0x02,0x5a,0xf0,0x0c,0xf1,0xb1
+,0xad,0xa9,0xdc,0x59,0x86,0x8b,0x6e,0xe9
+,0x91,0xf5,0x86,0xca,0xfa,0xb9,0x66,0x33
+,0xaa,0x59,0x5b,0xce,0xe2,0xa7,0x16,0x73
+,0x47,0xcb,0x2b,0xcc,0x99,0xb0,0x37,0x48
+,0xcf,0xe3,0x56,0x4b,0xf5,0xcf,0x0f,0x0c
+,0x72,0x32,0x87,0xc6,0xf0,0x44,0xbb,0x53
+,0x72,0x6d,0x43,0xf5,0x26,0x48,0x9a,0x52
+,0x67,0xb7,0x58,0xab,0xfe,0x67,0x76,0x71
+,0x78,0xdb,0x0d,0xa2,0x56,0x14,0x13,0x39
+,0x24,0x31,0x85,0xa2,0xa8,0x02,0x5a,0x30
+,0x47,0xe1,0xdd,0x50,0x07,0xbc,0x02,0x09
+,0x90,0x00,0xeb,0x64,0x63,0x60,0x9b,0x16
+,0xbc,0x88,0xc9,0x12,0xe6,0xd2,0x7d,0x91
+,0x8b,0xf9,0x3d,0x32,0x8d,0x65,0xb4,0xe9
+,0x7c,0xb1,0x57,0x76,0xea,0xc5,0xb6,0x28
+,0x39,0xbf,0x15,0x65,0x1c,0xc8,0xf6,0x77
+,0x96,0x6a,0x0a,0x8d,0x77,0x0b,0xd8,0x91
+,0x0b,0x04,0x8e,0x07,0xdb,0x29,0xb6,0x0a
+,0xee,0x9d,0x82,0x35,0x35,0x10};
+const unsigned int NptTlsTrustAnchor_Base_0106_Size = 846;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0107.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0107.cpp
new file mode 100644
index 0000000..c3c0a85
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0107.cpp
@@ -0,0 +1,166 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* DST ACES CA X6 */
+const unsigned char NptTlsTrustAnchor_Base_0107_Data[1037] = {
+0x30,0x82,0x04,0x09,0x30,0x82,0x02,0xf1
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x0d
+,0x5e,0x99,0x0a,0xd6,0x9d,0xb7,0x78,0xec
+,0xd8,0x07,0x56,0x3b,0x86,0x15,0xd9,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x5b
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x20,0x30
+,0x1e,0x06,0x03,0x55,0x04,0x0a,0x13,0x17
+,0x44,0x69,0x67,0x69,0x74,0x61,0x6c,0x20
+,0x53,0x69,0x67,0x6e,0x61,0x74,0x75,0x72
+,0x65,0x20,0x54,0x72,0x75,0x73,0x74,0x31
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x08,0x44,0x53,0x54,0x20,0x41,0x43
+,0x45,0x53,0x31,0x17,0x30,0x15,0x06,0x03
+,0x55,0x04,0x03,0x13,0x0e,0x44,0x53,0x54
+,0x20,0x41,0x43,0x45,0x53,0x20,0x43,0x41
+,0x20,0x58,0x36,0x30,0x1e,0x17,0x0d,0x30
+,0x33,0x31,0x31,0x32,0x30,0x32,0x31,0x31
+,0x39,0x35,0x38,0x5a,0x17,0x0d,0x31,0x37
+,0x31,0x31,0x32,0x30,0x32,0x31,0x31,0x39
+,0x35,0x38,0x5a,0x30,0x5b,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x20,0x30,0x1e,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x17,0x44,0x69,0x67
+,0x69,0x74,0x61,0x6c,0x20,0x53,0x69,0x67
+,0x6e,0x61,0x74,0x75,0x72,0x65,0x20,0x54
+,0x72,0x75,0x73,0x74,0x31,0x11,0x30,0x0f
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x08,0x44
+,0x53,0x54,0x20,0x41,0x43,0x45,0x53,0x31
+,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x03
+,0x13,0x0e,0x44,0x53,0x54,0x20,0x41,0x43
+,0x45,0x53,0x20,0x43,0x41,0x20,0x58,0x36
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xb9,0x3d,0xf5,0x2c,0xc9,0x94,0xdc
+,0x75,0x8a,0x95,0x5d,0x63,0xe8,0x84,0x77
+,0x76,0x66,0xb9,0x59,0x91,0x5c,0x46,0xdd
+,0x92,0x3e,0x9f,0xf9,0x0e,0x03,0xb4,0x3d
+,0x61,0x92,0xbd,0x23,0x26,0xb5,0x63,0xee
+,0x92,0xd2,0x9e,0xd6,0x3c,0xc8,0x0d,0x90
+,0x5f,0x64,0x81,0xb1,0xa8,0x08,0x0d,0x4c
+,0xd8,0xf9,0xd3,0x05,0x28,0x52,0xb4,0x01
+,0x25,0xc5,0x95,0x1c,0x0c,0x7e,0x3e,0x10
+,0x84,0x75,0xcf,0xc1,0x19,0x91,0x63,0xcf
+,0xe8,0xa8,0x91,0x88,0xb9,0x43,0x52,0xbb
+,0x80,0xb1,0x55,0x89,0x8b,0x31,0xfa,0xd0
+,0xb7,0x76,0xbe,0x41,0x3d,0x30,0x9a,0xa4
+,0x22,0x25,0x17,0x73,0xe8,0x1e,0xe2,0xd3
+,0xac,0x2a,0xbd,0x5b,0x38,0x21,0xd5,0x2a
+,0x4b,0xd7,0x55,0x7d,0xe3,0x3a,0x55,0xbd
+,0xd7,0x6d,0x6b,0x02,0x57,0x6b,0xe6,0x47
+,0x7c,0x08,0xc8,0x82,0xba,0xde,0xa7,0x87
+,0x3d,0xa1,0x6d,0xb8,0x30,0x56,0xc2,0xb3
+,0x02,0x81,0x5f,0x2d,0xf5,0xe2,0x9a,0x30
+,0x18,0x28,0xb8,0x66,0xd3,0xcb,0x01,0x96
+,0x6f,0xea,0x8a,0x45,0x55,0xd6,0xe0,0x9d
+,0xff,0x67,0x2b,0x17,0x02,0xa6,0x4e,0x1a
+,0x6a,0x11,0x0b,0x7e,0xb7,0x7b,0xe7,0x98
+,0xd6,0x8c,0x76,0x6f,0xc1,0x3b,0xdb,0x50
+,0x93,0x7e,0xe5,0xd0,0x8e,0x1f,0x37,0xb8
+,0xbd,0xba,0xc6,0x9f,0x6c,0xe9,0x7c,0x33
+,0xf2,0x32,0x3c,0x26,0x47,0xfa,0x27,0x24
+,0x02,0xc9,0x7e,0x1d,0x5b,0x88,0x42,0x13
+,0x6a,0x35,0x7c,0x7d,0x35,0xe9,0x2e,0x66
+,0x91,0x72,0x93,0xd5,0x32,0x26,0xc4,0x74
+,0xf5,0x53,0xa3,0xb3,0x5d,0x9a,0xf6,0x09
+,0xcb,0x02,0x03,0x01,0x00,0x01,0xa3,0x81
+,0xc8,0x30,0x81,0xc5,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x01,0xc6,0x30,0x1f,0x06
+,0x03,0x55,0x1d,0x11,0x04,0x18,0x30,0x16
+,0x81,0x14,0x70,0x6b,0x69,0x2d,0x6f,0x70
+,0x73,0x40,0x74,0x72,0x75,0x73,0x74,0x64
+,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x30,0x62
+,0x06,0x03,0x55,0x1d,0x20,0x04,0x5b,0x30
+,0x59,0x30,0x57,0x06,0x0a,0x60,0x86,0x48
+,0x01,0x65,0x03,0x02,0x01,0x01,0x01,0x30
+,0x49,0x30,0x47,0x06,0x08,0x2b,0x06,0x01
+,0x05,0x05,0x07,0x02,0x01,0x16,0x3b,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x74,0x72,0x75,0x73,0x74,0x64
+,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x63
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x65,0x73,0x2f,0x70,0x6f,0x6c,0x69
+,0x63,0x79,0x2f,0x41,0x43,0x45,0x53,0x2d
+,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74
+,0x6d,0x6c,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x09,0x72,0x06
+,0x4e,0x18,0x43,0x0f,0xe5,0xd6,0xcc,0xc3
+,0x6a,0x8b,0x31,0x7b,0x78,0x8f,0xa8,0x83
+,0xb8,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0xa3,0xd8,0x8e
+,0xd6,0xb2,0xdb,0xce,0x05,0xe7,0x32,0xcd
+,0x01,0xd3,0x04,0x03,0xe5,0x76,0xe4,0x56
+,0x2b,0x9c,0x99,0x90,0xe8,0x08,0x30,0x6c
+,0xdf,0x7d,0x3d,0xee,0xe5,0xbf,0xb5,0x24
+,0x40,0x84,0x49,0xe1,0xd1,0x28,0xae,0xc4
+,0xc2,0x3a,0x53,0x30,0x88,0xf1,0xf5,0x77
+,0x6e,0x51,0xca,0xfa,0xff,0x99,0xaf,0x24
+,0x5f,0x1b,0xa0,0xfd,0xf2,0xac,0x84,0xca
+,0xdf,0xa9,0xf0,0x5f,0x04,0x2e,0xad,0x16
+,0xbf,0x21,0x97,0x10,0x81,0x3d,0xe3,0xff
+,0x87,0x8d,0x32,0xdc,0x94,0xe5,0x47,0x8a
+,0x5e,0x6a,0x13,0xc9,0x94,0x95,0x3d,0xd2
+,0xee,0xc8,0x34,0x95,0xd0,0x80,0xd4,0xad
+,0x32,0x08,0x80,0x54,0x3c,0xe0,0xbd,0x52
+,0x53,0xd7,0x52,0x7c,0xb2,0x69,0x3f,0x7f
+,0x7a,0xcf,0x6a,0x74,0xca,0xfa,0x04,0x2a
+,0x9c,0x4c,0x5a,0x06,0xa5,0xe9,0x20,0xad
+,0x45,0x66,0x0f,0x69,0xf1,0xdd,0xbf,0xe9
+,0xe3,0x32,0x8b,0xfa,0xe0,0xc1,0x86,0x4d
+,0x72,0x3c,0x2e,0xd8,0x93,0x78,0x0a,0x2a
+,0xf8,0xd8,0xd2,0x27,0x3d,0x19,0x89,0x5f
+,0x5a,0x7b,0x8a,0x3b,0xcc,0x0c,0xda,0x51
+,0xae,0xc7,0x0b,0xf7,0x2b,0xb0,0x37,0x05
+,0xec,0xbc,0x57,0x23,0xe2,0x38,0xd2,0x9b
+,0x68,0xf3,0x56,0x12,0x88,0x4f,0x42,0x7c
+,0xb8,0x31,0xc4,0xb5,0xdb,0xe4,0xc8,0x21
+,0x34,0xe9,0x48,0x11,0x35,0xee,0xfa,0xc7
+,0x92,0x57,0xc5,0x9f,0x34,0xe4,0xc7,0xf6
+,0xf7,0x0e,0x0b,0x4c,0x9c,0x68,0x78,0x7b
+,0x71,0x31,0xc7,0xeb,0x1e,0xe0,0x67,0x41
+,0xf3,0xb7,0xa0,0xa7,0xcd,0xe5,0x7a,0x33
+,0x36,0x6a,0xfa,0x9a,0x2b};
+const unsigned int NptTlsTrustAnchor_Base_0107_Size = 1037;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0108.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0108.cpp
new file mode 100644
index 0000000..ab71257
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0108.cpp
@@ -0,0 +1,221 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* SwissSign Platinum CA - G2 */
+const unsigned char NptTlsTrustAnchor_Base_0108_Data[1477] = {
+0x30,0x82,0x05,0xc1,0x30,0x82,0x03,0xa9
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x08,0x4e
+,0xb2,0x00,0x67,0x0c,0x03,0x5d,0x4f,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x49
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x43,0x48,0x31,0x15,0x30
+,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c
+,0x53,0x77,0x69,0x73,0x73,0x53,0x69,0x67
+,0x6e,0x20,0x41,0x47,0x31,0x23,0x30,0x21
+,0x06,0x03,0x55,0x04,0x03,0x13,0x1a,0x53
+,0x77,0x69,0x73,0x73,0x53,0x69,0x67,0x6e
+,0x20,0x50,0x6c,0x61,0x74,0x69,0x6e,0x75
+,0x6d,0x20,0x43,0x41,0x20,0x2d,0x20,0x47
+,0x32,0x30,0x1e,0x17,0x0d,0x30,0x36,0x31
+,0x30,0x32,0x35,0x30,0x38,0x33,0x36,0x30
+,0x30,0x5a,0x17,0x0d,0x33,0x36,0x31,0x30
+,0x32,0x35,0x30,0x38,0x33,0x36,0x30,0x30
+,0x5a,0x30,0x49,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x48
+,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x0c,0x53,0x77,0x69,0x73,0x73
+,0x53,0x69,0x67,0x6e,0x20,0x41,0x47,0x31
+,0x23,0x30,0x21,0x06,0x03,0x55,0x04,0x03
+,0x13,0x1a,0x53,0x77,0x69,0x73,0x73,0x53
+,0x69,0x67,0x6e,0x20,0x50,0x6c,0x61,0x74
+,0x69,0x6e,0x75,0x6d,0x20,0x43,0x41,0x20
+,0x2d,0x20,0x47,0x32,0x30,0x82,0x02,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x02,0x0f,0x00,0x30,0x82,0x02,0x0a
+,0x02,0x82,0x02,0x01,0x00,0xca,0xdf,0xa2
+,0x02,0xe2,0xda,0xf8,0xfc,0x07,0x16,0xb1
+,0xde,0x60,0xaa,0xde,0x96,0x5c,0x64,0x1f
+,0xc7,0x2f,0x7e,0xcf,0x67,0xfa,0x44,0x42
+,0xd6,0x76,0x63,0x95,0xae,0xeb,0xaf,0x72
+,0x20,0x8a,0x45,0x47,0x86,0x62,0x78,0x86
+,0xd6,0x20,0x39,0x26,0xf4,0xae,0xa3,0xfd
+,0x23,0xe7,0xa5,0x9c,0xb5,0x22,0x21,0x19
+,0xb7,0x37,0x93,0x22,0xc0,0x50,0x9c,0x82
+,0x7b,0xd4,0xd5,0x04,0x44,0x5c,0xcb,0xb4
+,0xc2,0x9f,0x92,0xbe,0x24,0xd8,0x7b,0x67
+,0x22,0xe2,0x69,0x5f,0xe5,0x05,0x78,0xd4
+,0x87,0xd9,0x71,0x70,0x33,0x25,0x53,0xb4
+,0x87,0x3b,0x29,0x90,0x28,0x36,0x9a,0x55
+,0x44,0x30,0x68,0xa4,0x83,0x97,0x7f,0x0d
+,0x1e,0x9c,0x76,0xff,0x15,0x9d,0x60,0x97
+,0x00,0x8d,0x8a,0x85,0x03,0xec,0x80,0xbe
+,0xea,0x2c,0x6e,0x10,0x51,0x92,0xcc,0x7e
+,0xd5,0xa3,0x33,0xd8,0xd6,0x49,0xde,0x58
+,0x2a,0xaf,0xf6,0x16,0xeb,0x4b,0x7b,0x90
+,0x32,0x97,0xb9,0xba,0x9d,0x58,0xf1,0xf8
+,0x57,0x49,0x04,0x1e,0xa2,0x5d,0x06,0x70
+,0xdd,0x71,0xdb,0xf9,0xdd,0x8b,0x9a,0x1b
+,0x8c,0xcf,0x3d,0xa3,0x4d,0xce,0xcb,0x7c
+,0xf6,0xbb,0x9c,0xa0,0xfa,0x09,0xce,0x23
+,0x62,0xb2,0xe9,0x0d,0x1f,0xe2,0x72,0x28
+,0x8f,0x9f,0xac,0x68,0x20,0x7d,0x6f,0x3b
+,0xa8,0x85,0x31,0x09,0x7f,0x0b,0xc7,0xe8
+,0x65,0xe9,0xe3,0x78,0x0e,0x09,0x67,0x30
+,0x8b,0x34,0x82,0xfb,0x5d,0xe0,0xcc,0x9d
+,0x81,0x6d,0x62,0xee,0x08,0x1e,0x04,0x2c
+,0x4e,0x9b,0xec,0xfe,0xa9,0x4f,0x5f,0xfd
+,0x69,0x78,0xef,0x09,0x1f,0xa1,0xb4,0xbf
+,0xfa,0xf3,0xef,0x90,0x1e,0x4c,0x05,0x8b
+,0x1e,0xea,0x7a,0x91,0x7a,0xc3,0xd7,0xe5
+,0xfb,0x30,0xbc,0x6c,0x1b,0x10,0x58,0x98
+,0xf7,0x1a,0x5f,0xd0,0x29,0x32,0x03,0x13
+,0x46,0x4d,0x61,0x6a,0x85,0x4c,0x52,0x74
+,0x2f,0x06,0x1f,0x7b,0x11,0xe2,0x84,0x97
+,0xc6,0x99,0xf3,0x6d,0x7f,0xd7,0x67,0x83
+,0x7e,0x13,0x68,0xd8,0x71,0x28,0x5a,0xd8
+,0xce,0xdd,0xe8,0x10,0x14,0x9a,0xfe,0x6d
+,0x23,0x87,0x6e,0x8e,0x5a,0x70,0x3c,0xd5
+,0x8d,0x09,0x00,0xa7,0xaa,0xbc,0xb0,0x31
+,0x37,0x6d,0xc8,0x84,0x14,0x1e,0x5b,0xbd
+,0x45,0x63,0x20,0x6b,0x4b,0x74,0x8c,0xbd
+,0xdb,0x3a,0x0e,0xc1,0xcf,0x5a,0x16,0x8f
+,0xa5,0x98,0xf2,0x76,0x89,0xb2,0x13,0x12
+,0x3b,0x0b,0x77,0x77,0xac,0xbb,0xe5,0x3c
+,0x29,0x4a,0x92,0x72,0xca,0x61,0x1a,0x2b
+,0x5e,0x4c,0xe2,0x83,0x74,0x77,0xfa,0x35
+,0x48,0x7a,0x85,0x4d,0x8d,0x9a,0x53,0xc4
+,0xdf,0x78,0xca,0x97,0x91,0x48,0x2b,0x45
+,0x2b,0x01,0xf7,0x1c,0x1a,0xa2,0xed,0x18
+,0xba,0x0a,0xbd,0x83,0xfa,0x6f,0xbc,0x8d
+,0x57,0x93,0x3b,0xd4,0xd4,0xa6,0xce,0x1e
+,0xf1,0xa0,0xb1,0xce,0xab,0xfd,0x2b,0x28
+,0x9a,0x4f,0x1b,0xd7,0xc3,0x72,0xdb,0xa4
+,0xc4,0xbf,0x5d,0x4c,0xf5,0xdd,0x7b,0x96
+,0x69,0xee,0x68,0x80,0xe6,0xe7,0x98,0xba
+,0x36,0xb7,0xfe,0x6e,0xed,0x2b,0xbd,0x20
+,0xf8,0x65,0x19,0xda,0x55,0x09,0x7e,0x25
+,0xdc,0xfe,0x61,0x62,0x72,0xf9,0x7e,0x18
+,0x02,0xef,0x63,0xb4,0xd0,0xfb,0xaf,0xe5
+,0x3b,0x63,0x8c,0x67,0x8f,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x81,0xac,0x30,0x81,0xa9
+,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01
+,0x01,0xff,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01
+,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0x50,0xaf,0xcc,0x07
+,0x87,0x15,0x47,0x6f,0x38,0xc5,0xb4,0x65
+,0xd1,0xde,0x95,0xaa,0xe9,0xdf,0x9c,0xcc
+,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04
+,0x18,0x30,0x16,0x80,0x14,0x50,0xaf,0xcc
+,0x07,0x87,0x15,0x47,0x6f,0x38,0xc5,0xb4
+,0x65,0xd1,0xde,0x95,0xaa,0xe9,0xdf,0x9c
+,0xcc,0x30,0x46,0x06,0x03,0x55,0x1d,0x20
+,0x04,0x3f,0x30,0x3d,0x30,0x3b,0x06,0x09
+,0x60,0x85,0x74,0x01,0x59,0x01,0x01,0x01
+,0x01,0x30,0x2e,0x30,0x2c,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16
+,0x20,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x72,0x65,0x70,0x6f,0x73,0x69,0x74,0x6f
+,0x72,0x79,0x2e,0x73,0x77,0x69,0x73,0x73
+,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d
+,0x2f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x02,0x01,0x00,0x08,0x85,0xa6
+,0xf5,0x16,0x0c,0xfc,0x44,0x1a,0xc1,0x63
+,0xe0,0xf9,0x55,0x46,0x08,0xfc,0x70,0x1c
+,0x42,0x28,0x96,0x8e,0xb7,0xc5,0xc1,0x41
+,0x75,0x4e,0x09,0x71,0x79,0xe5,0x6d,0x96
+,0xca,0x4b,0xa5,0x88,0x60,0xd0,0x30,0x74
+,0xb8,0xca,0x08,0xdc,0xb4,0x30,0x9e,0x40
+,0x07,0x16,0x6b,0x65,0x95,0x77,0x01,0xae
+,0xa4,0xb7,0x35,0x0b,0x81,0xda,0x71,0x15
+,0xa9,0x74,0x17,0x38,0x7b,0x58,0xca,0xf9
+,0x2f,0xfb,0xc0,0x65,0x76,0x8d,0x5b,0x01
+,0xb9,0x7d,0xde,0x82,0x3d,0x64,0xb8,0xbe
+,0x14,0x74,0xa3,0x0a,0x54,0xd3,0x2c,0x95
+,0x18,0x17,0x35,0xf5,0x51,0x6b,0x3f,0x8f
+,0xa2,0x96,0x61,0x39,0x78,0x6b,0x4b,0xe5
+,0xa6,0xa0,0xf8,0x53,0xdf,0x51,0x10,0x93
+,0x62,0xe7,0x80,0x2f,0xe2,0xd1,0xe0,0xbc
+,0x8e,0x36,0x46,0x77,0x33,0xec,0xb8,0xfb
+,0x8e,0x9a,0x2c,0x89,0x4d,0x31,0x11,0x0f
+,0x26,0x9e,0x04,0xbb,0xb7,0x04,0x8d,0x0b
+,0xf2,0xb9,0xfc,0x5a,0x9d,0x3b,0x16,0xb7
+,0x2f,0xc8,0x98,0xab,0xfe,0x8a,0x50,0x59
+,0x2e,0xa3,0x3b,0xfc,0x29,0x5d,0x8b,0xc1
+,0x4b,0xc9,0xe2,0x8a,0x13,0x1d,0xb1,0xbf
+,0xbb,0x42,0x1d,0x52,0xdd,0x4e,0xd8,0x14
+,0x5e,0x10,0xc6,0x31,0x07,0xef,0x71,0x27
+,0xf7,0x1b,0x39,0x09,0xdc,0x82,0xea,0x8b
+,0xb3,0x95,0x86,0x5e,0xfd,0xf5,0xda,0x5d
+,0x31,0xa6,0xe0,0x31,0xb6,0x94,0xe6,0x44
+,0x49,0x74,0xc5,0x16,0xe5,0xf7,0x1f,0x03
+,0x61,0x28,0xc5,0xc8,0xcb,0x12,0xa0,0x42
+,0x4b,0xf9,0x6b,0x88,0x08,0x8d,0xb4,0x32
+,0x18,0xf3,0x75,0x9f,0xc4,0x7f,0x00,0x4f
+,0x05,0x95,0x9c,0xa3,0x17,0x02,0xc3,0xb3
+,0x53,0x9b,0xaa,0x20,0x39,0x29,0x2b,0x66
+,0xfa,0x9d,0xaf,0x5e,0xb3,0x92,0xd2,0xb5
+,0xa6,0xe1,0x1a,0xf9,0x2d,0x41,0x69,0x81
+,0x14,0xb4,0xb4,0xb5,0xed,0x89,0x3d,0xce
+,0xfb,0xa9,0x9d,0x35,0x42,0x44,0xb1,0x1c
+,0x14,0x73,0x81,0xcf,0x2a,0x01,0x35,0x9a
+,0x31,0xd5,0x2d,0x8f,0x6d,0x84,0xdf,0x80
+,0x4d,0x57,0xe3,0x3f,0xc5,0x84,0x75,0xda
+,0x89,0xc6,0x30,0xbb,0xeb,0x8f,0xcb,0x22
+,0x08,0xa0,0xae,0xaa,0xf1,0x03,0x6c,0x3a
+,0x4b,0x4d,0x09,0xa5,0x0e,0x72,0xc6,0x56
+,0x6b,0x21,0x42,0x4e,0x23,0x25,0x14,0x68
+,0xae,0x76,0x0a,0x7c,0x0c,0x07,0x70,0x64
+,0xf9,0x9a,0x2f,0xf6,0x05,0x39,0x26,0xc6
+,0x0c,0x8f,0x19,0x7f,0x43,0x5e,0x6e,0xf4
+,0x5b,0x15,0x2f,0xdb,0x61,0x5d,0xe6,0x67
+,0x2f,0x3f,0x08,0x94,0xf9,0x60,0xb4,0x98
+,0x31,0xda,0x74,0xf1,0x84,0x93,0x71,0x4d
+,0x5f,0xfb,0x60,0x58,0xd1,0xfb,0xc4,0xc1
+,0x6d,0x89,0xa2,0xbb,0x20,0x1f,0x9d,0x71
+,0x91,0xcb,0x32,0x9b,0x13,0x3d,0x3e,0x7d
+,0x92,0x52,0x35,0xac,0x92,0x94,0xa2,0xd3
+,0x18,0xc2,0x7c,0xc7,0xea,0xaf,0x76,0x05
+,0x16,0xdd,0x67,0x27,0xc2,0x7e,0x1c,0x07
+,0x22,0x21,0xf3,0x40,0x0a,0x1b,0x34,0x07
+,0x44,0x13,0xc2,0x84,0x6a,0x8e,0xdf,0x19
+,0x5a,0xbf,0x7f,0xeb,0x1d,0xe2,0x1a,0x38
+,0xd1,0x5c,0xaf,0x47,0x92,0x6b,0x80,0xb5
+,0x30,0xa5,0xc9,0x8d,0xd8,0xab,0x31,0x81
+,0x1f,0xdf,0xc2,0x66,0x37,0xd3,0x93,0xa9
+,0x85,0x86,0x79,0x65,0xd2};
+const unsigned int NptTlsTrustAnchor_Base_0108_Size = 1477;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0109.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0109.cpp
new file mode 100644
index 0000000..3dcde02
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0109.cpp
@@ -0,0 +1,220 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* SwissSign Gold CA - G2 */
+const unsigned char NptTlsTrustAnchor_Base_0109_Data[1470] = {
+0x30,0x82,0x05,0xba,0x30,0x82,0x03,0xa2
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x09,0x00
+,0xbb,0x40,0x1c,0x43,0xf5,0x5e,0x4f,0xb0
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x45,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x15
+,0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0c,0x53,0x77,0x69,0x73,0x73,0x53,0x69
+,0x67,0x6e,0x20,0x41,0x47,0x31,0x1f,0x30
+,0x1d,0x06,0x03,0x55,0x04,0x03,0x13,0x16
+,0x53,0x77,0x69,0x73,0x73,0x53,0x69,0x67
+,0x6e,0x20,0x47,0x6f,0x6c,0x64,0x20,0x43
+,0x41,0x20,0x2d,0x20,0x47,0x32,0x30,0x1e
+,0x17,0x0d,0x30,0x36,0x31,0x30,0x32,0x35
+,0x30,0x38,0x33,0x30,0x33,0x35,0x5a,0x17
+,0x0d,0x33,0x36,0x31,0x30,0x32,0x35,0x30
+,0x38,0x33,0x30,0x33,0x35,0x5a,0x30,0x45
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x43,0x48,0x31,0x15,0x30
+,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c
+,0x53,0x77,0x69,0x73,0x73,0x53,0x69,0x67
+,0x6e,0x20,0x41,0x47,0x31,0x1f,0x30,0x1d
+,0x06,0x03,0x55,0x04,0x03,0x13,0x16,0x53
+,0x77,0x69,0x73,0x73,0x53,0x69,0x67,0x6e
+,0x20,0x47,0x6f,0x6c,0x64,0x20,0x43,0x41
+,0x20,0x2d,0x20,0x47,0x32,0x30,0x82,0x02
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x02,0x0f,0x00,0x30,0x82,0x02
+,0x0a,0x02,0x82,0x02,0x01,0x00,0xaf,0xe4
+,0xee,0x7e,0x8b,0x24,0x0e,0x12,0x6e,0xa9
+,0x50,0x2d,0x16,0x44,0x3b,0x92,0x92,0x5c
+,0xca,0xb8,0x5d,0x84,0x92,0x42,0x13,0x2a
+,0xbc,0x65,0x57,0x82,0x40,0x3e,0x57,0x24
+,0xcd,0x50,0x8b,0x25,0x2a,0xb7,0x6f,0xfc
+,0xef,0xa2,0xd0,0xc0,0x1f,0x02,0x24,0x4a
+,0x13,0x96,0x8f,0x23,0x13,0xe6,0x28,0x58
+,0x00,0xa3,0x47,0xc7,0x06,0xa7,0x84,0x23
+,0x2b,0xbb,0xbd,0x96,0x2b,0x7f,0x55,0xcc
+,0x8b,0xc1,0x57,0x1f,0x0e,0x62,0x65,0x0f
+,0xdd,0x3d,0x56,0x8a,0x73,0xda,0xae,0x7e
+,0x6d,0xba,0x81,0x1c,0x7e,0x42,0x8c,0x20
+,0x35,0xd9,0x43,0x4d,0x84,0xfa,0x84,0xdb
+,0x52,0x2c,0xf3,0x0e,0x27,0x77,0x0b,0x6b
+,0xbf,0x11,0x2f,0x72,0x78,0x9f,0x2e,0xd8
+,0x3e,0xe6,0x18,0x37,0x5a,0x2a,0x72,0xf9
+,0xda,0x62,0x90,0x92,0x95,0xca,0x1f,0x9c
+,0xe9,0xb3,0x3c,0x2b,0xcb,0xf3,0x01,0x13
+,0xbf,0x5a,0xcf,0xc1,0xb5,0x0a,0x60,0xbd
+,0xdd,0xb5,0x99,0x64,0x53,0xb8,0xa0,0x96
+,0xb3,0x6f,0xe2,0x26,0x77,0x91,0x8c,0xe0
+,0x62,0x10,0x02,0x9f,0x34,0x0f,0xa4,0xd5
+,0x92,0x33,0x51,0xde,0xbe,0x8d,0xba,0x84
+,0x7a,0x60,0x3c,0x6a,0xdb,0x9f,0x2b,0xec
+,0xde,0xde,0x01,0x3f,0x6e,0x4d,0xe5,0x50
+,0x86,0xcb,0xb4,0xaf,0xed,0x44,0x40,0xc5
+,0xca,0x5a,0x8c,0xda,0xd2,0x2b,0x7c,0xa8
+,0xee,0xbe,0xa6,0xe5,0x0a,0xaa,0x0e,0xa5
+,0xdf,0x05,0x52,0xb7,0x55,0xc7,0x22,0x5d
+,0x32,0x6a,0x97,0x97,0x63,0x13,0xdb,0xc9
+,0xdb,0x79,0x36,0x7b,0x85,0x3a,0x4a,0xc5
+,0x52,0x89,0xf9,0x24,0xe7,0x9d,0x77,0xa9
+,0x82,0xff,0x55,0x1c,0xa5,0x71,0x69,0x2b
+,0xd1,0x02,0x24,0xf2,0xb3,0x26,0xd4,0x6b
+,0xda,0x04,0x55,0xe5,0xc1,0x0a,0xc7,0x6d
+,0x30,0x37,0x90,0x2a,0xe4,0x9e,0x14,0x33
+,0x5e,0x16,0x17,0x55,0xc5,0x5b,0xb5,0xcb
+,0x34,0x89,0x92,0xf1,0x9d,0x26,0x8f,0xa1
+,0x07,0xd4,0xc6,0xb2,0x78,0x50,0xdb,0x0c
+,0x0c,0x0b,0x7c,0x0b,0x8c,0x41,0xd7,0xb9
+,0xe9,0xdd,0x8c,0x88,0xf7,0xa3,0x4d,0xb2
+,0x32,0xcc,0xd8,0x17,0xda,0xcd,0xb7,0xce
+,0x66,0x9d,0xd4,0xfd,0x5e,0xff,0xbd,0x97
+,0x3e,0x29,0x75,0xe7,0x7e,0xa7,0x62,0x58
+,0xaf,0x25,0x34,0xa5,0x41,0xc7,0x3d,0xbc
+,0x0d,0x50,0xca,0x03,0x03,0x0f,0x08,0x5a
+,0x1f,0x95,0x73,0x78,0x62,0xbf,0xaf,0x72
+,0x14,0x69,0x0e,0xa5,0xe5,0x03,0x0e,0x78
+,0x8e,0x26,0x28,0x42,0xf0,0x07,0x0b,0x62
+,0x20,0x10,0x67,0x39,0x46,0xfa,0xa9,0x03
+,0xcc,0x04,0x38,0x7a,0x66,0xef,0x20,0x83
+,0xb5,0x8c,0x4a,0x56,0x8e,0x91,0x00,0xfc
+,0x8e,0x5c,0x82,0xde,0x88,0xa0,0xc3,0xe2
+,0x68,0x6e,0x7d,0x8d,0xef,0x3c,0xdd,0x65
+,0xf4,0x5d,0xac,0x51,0xef,0x24,0x80,0xae
+,0xaa,0x56,0x97,0x6f,0xf9,0xad,0x7d,0xda
+,0x61,0x3f,0x98,0x77,0x3c,0xa5,0x91,0xb6
+,0x1c,0x8c,0x26,0xda,0x65,0xa2,0x09,0x6d
+,0xc1,0xe2,0x54,0xe3,0xb9,0xca,0x4c,0x4c
+,0x80,0x8f,0x77,0x7b,0x60,0x9a,0x1e,0xdf
+,0xb6,0xf2,0x48,0x1e,0x0e,0xba,0x4e,0x54
+,0x6d,0x98,0xe0,0xe1,0xa2,0x1a,0xa2,0x77
+,0x50,0xcf,0xc4,0x63,0x92,0xec,0x47,0x19
+,0x9d,0xeb,0xe6,0x6b,0xce,0xc1,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x81,0xac,0x30,0x81
+,0xa9,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x5b,0x25,0x7b
+,0x96,0xa4,0x65,0x51,0x7e,0xb8,0x39,0xf3
+,0xc0,0x78,0x66,0x5e,0xe8,0x3a,0xe7,0xf0
+,0xee,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0x5b,0x25
+,0x7b,0x96,0xa4,0x65,0x51,0x7e,0xb8,0x39
+,0xf3,0xc0,0x78,0x66,0x5e,0xe8,0x3a,0xe7
+,0xf0,0xee,0x30,0x46,0x06,0x03,0x55,0x1d
+,0x20,0x04,0x3f,0x30,0x3d,0x30,0x3b,0x06
+,0x09,0x60,0x85,0x74,0x01,0x59,0x01,0x02
+,0x01,0x01,0x30,0x2e,0x30,0x2c,0x06,0x08
+,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01
+,0x16,0x20,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x72,0x65,0x70,0x6f,0x73,0x69,0x74
+,0x6f,0x72,0x79,0x2e,0x73,0x77,0x69,0x73
+,0x73,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f
+,0x6d,0x2f,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x02,0x01,0x00,0x27,0xba
+,0xe3,0x94,0x7c,0xf1,0xae,0xc0,0xde,0x17
+,0xe6,0xe5,0xd8,0xd5,0xf5,0x54,0xb0,0x83
+,0xf4,0xbb,0xcd,0x5e,0x05,0x7b,0x4f,0x9f
+,0x75,0x66,0xaf,0x3c,0xe8,0x56,0x7e,0xfc
+,0x72,0x78,0x38,0x03,0xd9,0x2b,0x62,0x1b
+,0x00,0xb9,0xf8,0xe9,0x60,0xcd,0xcc,0xce
+,0x51,0x8a,0xc7,0x50,0x31,0x6e,0xe1,0x4a
+,0x7e,0x18,0x2f,0x69,0x59,0xb6,0x3d,0x64
+,0x81,0x2b,0xe3,0x83,0x84,0xe6,0x22,0x87
+,0x8e,0x7d,0xe0,0xee,0x02,0x99,0x61,0xb8
+,0x1e,0xf4,0xb8,0x2b,0x88,0x12,0x16,0x84
+,0xc2,0x31,0x93,0x38,0x96,0x31,0xa6,0xb9
+,0x3b,0x53,0x3f,0xc3,0x24,0x93,0x56,0x5b
+,0x69,0x92,0xec,0xc5,0xc1,0xbb,0x38,0x00
+,0xe3,0xec,0x17,0xa9,0xb8,0xdc,0xc7,0x7c
+,0x01,0x83,0x9f,0x32,0x47,0xba,0x52,0x22
+,0x34,0x1d,0x32,0x7a,0x09,0x56,0xa7,0x7c
+,0x25,0x36,0xa9,0x3d,0x4b,0xda,0xc0,0x82
+,0x6f,0x0a,0xbb,0x12,0xc8,0x87,0x4b,0x27
+,0x11,0xf9,0x1e,0x2d,0xc7,0x93,0x3f,0x9e
+,0xdb,0x5f,0x26,0x6b,0x52,0xd9,0x2e,0x8a
+,0xf1,0x14,0xc6,0x44,0x8d,0x15,0xa9,0xb7
+,0xbf,0xbd,0xde,0xa6,0x1a,0xee,0xae,0x2d
+,0xfb,0x48,0x77,0x17,0xfe,0xbb,0xec,0xaf
+,0x18,0xf5,0x2a,0x51,0xf0,0x39,0x84,0x97
+,0x95,0x6c,0x6e,0x1b,0xc3,0x2b,0xc4,0x74
+,0x60,0x79,0x25,0xb0,0x0a,0x27,0xdf,0xdf
+,0x5e,0xd2,0x39,0xcf,0x45,0x7d,0x42,0x4b
+,0xdf,0xb3,0x2c,0x1e,0xc5,0xc6,0x5d,0xca
+,0x55,0x3a,0xa0,0x9c,0x69,0x9a,0x8f,0xda
+,0xef,0xb2,0xb0,0x3c,0x9f,0x87,0x6c,0x12
+,0x2b,0x65,0x70,0x15,0x52,0x31,0x1a,0x24
+,0xcf,0x6f,0x31,0x23,0x50,0x1f,0x8c,0x4f
+,0x8f,0x23,0xc3,0x74,0x41,0x63,0x1c,0x55
+,0xa8,0x14,0xdd,0x3e,0xe0,0x51,0x50,0xcf
+,0xf1,0x1b,0x30,0x56,0x0e,0x92,0xb0,0x82
+,0x85,0xd8,0x83,0xcb,0x22,0x64,0xbc,0x2d
+,0xb8,0x25,0xd5,0x54,0xa2,0xb8,0x06,0xea
+,0xad,0x92,0xa4,0x24,0xa0,0xc1,0x86,0xb5
+,0x4a,0x13,0x6a,0x47,0xcf,0x2e,0x0b,0x56
+,0x95,0x54,0xcb,0xce,0x9a,0xdb,0x6a,0xb4
+,0xa6,0xb2,0xdb,0x41,0x08,0x86,0x27,0x77
+,0xf7,0x6a,0xa0,0x42,0x6c,0x0b,0x38,0xce
+,0xd7,0x75,0x50,0x32,0x92,0xc2,0xdf,0x2b
+,0x30,0x22,0x48,0xd0,0xd5,0x41,0x38,0x25
+,0x5d,0xa4,0xe9,0x5d,0x9f,0xc6,0x94,0x75
+,0xd0,0x45,0xfd,0x30,0x97,0x43,0x8f,0x90
+,0xab,0x0a,0xc7,0x86,0x73,0x60,0x4a,0x69
+,0x2d,0xde,0xa5,0x78,0xd7,0x06,0xda,0x6a
+,0x9e,0x4b,0x3e,0x77,0x3a,0x20,0x13,0x22
+,0x01,0xd0,0xbf,0x68,0x9e,0x63,0x60,0x6b
+,0x35,0x4d,0x0b,0x6d,0xba,0xa1,0x3d,0xc0
+,0x93,0xe0,0x7f,0x23,0xb3,0x55,0xad,0x72
+,0x25,0x4e,0x46,0xf9,0xd2,0x16,0xef,0xb0
+,0x64,0xc1,0x01,0x9e,0xe9,0xca,0xa0,0x6a
+,0x98,0x0e,0xcf,0xd8,0x60,0xf2,0x2f,0x49
+,0xb8,0xe4,0x42,0xe1,0x38,0x35,0x16,0xf4
+,0xc8,0x6e,0x4f,0xf7,0x81,0x56,0xe8,0xba
+,0xa3,0xbe,0x23,0xaf,0xae,0xfd,0x6f,0x03
+,0xe0,0x02,0x3b,0x30,0x76,0xfa,0x1b,0x6d
+,0x41,0xcf,0x01,0xb1,0xe9,0xb8,0xc9,0x66
+,0xf4,0xdb,0x26,0xf3,0x3a,0xa4,0x74,0xf2
+,0x49,0x24,0x5b,0xc9,0xb0,0xd0,0x57,0xc1
+,0xfa,0x3e,0x7a,0xe1,0x97,0xc9};
+const unsigned int NptTlsTrustAnchor_Base_0109_Size = 1470;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0110.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0110.cpp
new file mode 100644
index 0000000..4a3cc12
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0110.cpp
@@ -0,0 +1,221 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* SwissSign Silver CA - G2 */
+const unsigned char NptTlsTrustAnchor_Base_0110_Data[1473] = {
+0x30,0x82,0x05,0xbd,0x30,0x82,0x03,0xa5
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x08,0x4f
+,0x1b,0xd4,0x2f,0x54,0xbb,0x2f,0x4b,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x47
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x43,0x48,0x31,0x15,0x30
+,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c
+,0x53,0x77,0x69,0x73,0x73,0x53,0x69,0x67
+,0x6e,0x20,0x41,0x47,0x31,0x21,0x30,0x1f
+,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x53
+,0x77,0x69,0x73,0x73,0x53,0x69,0x67,0x6e
+,0x20,0x53,0x69,0x6c,0x76,0x65,0x72,0x20
+,0x43,0x41,0x20,0x2d,0x20,0x47,0x32,0x30
+,0x1e,0x17,0x0d,0x30,0x36,0x31,0x30,0x32
+,0x35,0x30,0x38,0x33,0x32,0x34,0x36,0x5a
+,0x17,0x0d,0x33,0x36,0x31,0x30,0x32,0x35
+,0x30,0x38,0x33,0x32,0x34,0x36,0x5a,0x30
+,0x47,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x15
+,0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0c,0x53,0x77,0x69,0x73,0x73,0x53,0x69
+,0x67,0x6e,0x20,0x41,0x47,0x31,0x21,0x30
+,0x1f,0x06,0x03,0x55,0x04,0x03,0x13,0x18
+,0x53,0x77,0x69,0x73,0x73,0x53,0x69,0x67
+,0x6e,0x20,0x53,0x69,0x6c,0x76,0x65,0x72
+,0x20,0x43,0x41,0x20,0x2d,0x20,0x47,0x32
+,0x30,0x82,0x02,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x02,0x0f,0x00
+,0x30,0x82,0x02,0x0a,0x02,0x82,0x02,0x01
+,0x00,0xc4,0xf1,0x87,0x7f,0xd3,0x78,0x31
+,0xf7,0x38,0xc9,0xf8,0xc3,0x99,0x43,0xbc
+,0xc7,0xf7,0xbc,0x37,0xe7,0x4e,0x71,0xba
+,0x4b,0x8f,0xa5,0x73,0x1d,0x5c,0x6e,0x98
+,0xae,0x03,0x57,0xae,0x38,0x37,0x43,0x2f
+,0x17,0x3d,0x1f,0xc8,0xce,0x68,0x10,0xc1
+,0x78,0xae,0x19,0x03,0x2b,0x10,0xfa,0x2c
+,0x79,0x83,0xf6,0xe8,0xb9,0x68,0xb9,0x55
+,0xf2,0x04,0x44,0xa7,0x39,0xf9,0xfc,0x04
+,0x8b,0x1e,0xf1,0xa2,0x4d,0x27,0xf9,0x61
+,0x7b,0xba,0xb7,0xe5,0xa2,0x13,0xb6,0xeb
+,0x61,0x3e,0xd0,0x6c,0xd1,0xe6,0xfb,0xfa
+,0x5e,0xed,0x1d,0xb4,0x9e,0xa0,0x35,0x5b
+,0xa1,0x92,0xcb,0xf0,0x49,0x92,0xfe,0x85
+,0x0a,0x05,0x3e,0xe6,0xd9,0x0b,0xe2,0x4f
+,0xbb,0xdc,0x95,0x37,0xfc,0x91,0xe9,0x32
+,0x35,0x22,0xd1,0x1f,0x3a,0x4e,0x27,0x85
+,0x9d,0xb0,0x15,0x94,0x32,0xda,0x61,0x0d
+,0x47,0x4d,0x60,0x42,0xae,0x92,0x47,0xe8
+,0x83,0x5a,0x50,0x58,0xe9,0x8a,0x8b,0xb9
+,0x5d,0xa1,0xdc,0xdd,0x99,0x4a,0x1f,0x36
+,0x67,0xbb,0x48,0xe4,0x83,0xb6,0x37,0xeb
+,0x48,0x3a,0xaf,0x0f,0x67,0x8f,0x17,0x07
+,0xe8,0x04,0xca,0xef,0x6a,0x31,0x87,0xd4
+,0xc0,0xb6,0xf9,0x94,0x71,0x7b,0x67,0x64
+,0xb8,0xb6,0x91,0x4a,0x42,0x7b,0x65,0x2e
+,0x30,0x6a,0x0c,0xf5,0x90,0xee,0x95,0xe6
+,0xf2,0xcd,0x82,0xec,0xd9,0xa1,0x4a,0xec
+,0xf6,0xb2,0x4b,0xe5,0x45,0x85,0xe6,0x6d
+,0x78,0x93,0x04,0x2e,0x9c,0x82,0x6d,0x36
+,0xa9,0xc4,0x31,0x64,0x1f,0x86,0x83,0x0b
+,0x2a,0xf4,0x35,0x0a,0x78,0xc9,0x55,0xcf
+,0x41,0xb0,0x47,0xe9,0x30,0x9f,0x99,0xbe
+,0x61,0xa8,0x06,0x84,0xb9,0x28,0x7a,0x5f
+,0x38,0xd9,0x1b,0xa9,0x38,0xb0,0x83,0x7f
+,0x73,0xc1,0xc3,0x3b,0x48,0x2a,0x82,0x0f
+,0x21,0x9b,0xb8,0xcc,0xa8,0x35,0xc3,0x84
+,0x1b,0x83,0xb3,0x3e,0xbe,0xa4,0x95,0x69
+,0x01,0x3a,0x89,0x00,0x78,0x04,0xd9,0xc9
+,0xf4,0x99,0x19,0xab,0x56,0x7e,0x5b,0x8b
+,0x86,0x39,0x15,0x91,0xa4,0x10,0x2c,0x09
+,0x32,0x80,0x60,0xb3,0x93,0xc0,0x2a,0xb6
+,0x18,0x0b,0x9d,0x7e,0x8d,0x49,0xf2,0x10
+,0x4a,0x7f,0xf9,0xd5,0x46,0x2f,0x19,0x92
+,0xa3,0x99,0xa7,0x26,0xac,0xbb,0x8c,0x3c
+,0xe6,0x0e,0xbc,0x47,0x07,0xdc,0x73,0x51
+,0xf1,0x70,0x64,0x2f,0x08,0xf9,0xb4,0x47
+,0x1d,0x30,0x6c,0x44,0xea,0x29,0x37,0x85
+,0x92,0x68,0x66,0xbc,0x83,0x38,0xfe,0x7b
+,0x39,0x2e,0xd3,0x50,0xf0,0x1f,0xfb,0x5e
+,0x60,0xb6,0xa9,0xa6,0xfa,0x27,0x41,0xf1
+,0x9b,0x18,0x72,0xf2,0xf5,0x84,0x74,0x4a
+,0xc9,0x67,0xc4,0x54,0xae,0x48,0x64,0xdf
+,0x8c,0xd1,0x6e,0xb0,0x1d,0xe1,0x07,0x8f
+,0x08,0x1e,0x99,0x9c,0x71,0xe9,0x4c,0xd8
+,0xa5,0xf7,0x47,0x12,0x1f,0x74,0xd1,0x51
+,0x9e,0x86,0xf3,0xc2,0xa2,0x23,0x40,0x0b
+,0x73,0xdb,0x4b,0xa6,0xe7,0x73,0x06,0x8c
+,0xc1,0xa0,0xe9,0xc1,0x59,0xac,0x46,0xfa
+,0xe6,0x2f,0xf8,0xcf,0x71,0x9c,0x46,0x6d
+,0xb9,0xc4,0x15,0x8d,0x38,0x79,0x03,0x45
+,0x48,0xef,0xc4,0x5d,0xd7,0x08,0xee,0x87
+,0x39,0x22,0x86,0xb2,0x0d,0x0f,0x58,0x43
+,0xf7,0x71,0xa9,0x48,0x2e,0xfd,0xea,0xd6
+,0x1f,0x02,0x03,0x01,0x00,0x01,0xa3,0x81
+,0xac,0x30,0x81,0xa9,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x06,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0x17,0xa0,0xcd,0xc1,0xe4,0x41,0xb6,0x3a
+,0x5b,0x3b,0xcb,0x45,0x9d,0xbd,0x1c,0xc2
+,0x98,0xfa,0x86,0x58,0x30,0x1f,0x06,0x03
+,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80
+,0x14,0x17,0xa0,0xcd,0xc1,0xe4,0x41,0xb6
+,0x3a,0x5b,0x3b,0xcb,0x45,0x9d,0xbd,0x1c
+,0xc2,0x98,0xfa,0x86,0x58,0x30,0x46,0x06
+,0x03,0x55,0x1d,0x20,0x04,0x3f,0x30,0x3d
+,0x30,0x3b,0x06,0x09,0x60,0x85,0x74,0x01
+,0x59,0x01,0x03,0x01,0x01,0x30,0x2e,0x30
+,0x2c,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x02,0x01,0x16,0x20,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x72,0x65,0x70,0x6f
+,0x73,0x69,0x74,0x6f,0x72,0x79,0x2e,0x73
+,0x77,0x69,0x73,0x73,0x73,0x69,0x67,0x6e
+,0x2e,0x63,0x6f,0x6d,0x2f,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x02,0x01
+,0x00,0x73,0xc6,0x81,0xe0,0x27,0xd2,0x2d
+,0x0f,0xe0,0x95,0x30,0xe2,0x9a,0x41,0x7f
+,0x50,0x2c,0x5f,0x5f,0x62,0x61,0xa9,0x86
+,0x6a,0x69,0x18,0x0c,0x74,0x49,0xd6,0x5d
+,0x84,0xea,0x41,0x52,0x18,0x6f,0x58,0xad
+,0x50,0x56,0x20,0x6a,0xc6,0xbd,0x28,0x69
+,0x58,0x91,0xdc,0x91,0x11,0x35,0xa9,0x3a
+,0x1d,0xbc,0x1a,0xa5,0x60,0x9e,0xd8,0x1f
+,0x7f,0x45,0x91,0x69,0xd9,0x7e,0xbb,0x78
+,0x72,0xc1,0x06,0x0f,0x2a,0xce,0x8f,0x85
+,0x70,0x61,0xac,0xa0,0xcd,0x0b,0xb8,0x39
+,0x29,0x56,0x84,0x32,0x4e,0x86,0xbb,0x3d
+,0xc4,0x2a,0xd9,0xd7,0x1f,0x72,0xee,0xfe
+,0x51,0xa1,0x22,0x41,0xb1,0x71,0x02,0x63
+,0x1a,0x82,0xb0,0x62,0xab,0x5e,0x57,0x12
+,0x1f,0xdf,0xcb,0xdd,0x75,0xa0,0xc0,0x5d
+,0x79,0x90,0x8c,0x1b,0xe0,0x50,0xe6,0xde
+,0x31,0xfe,0x98,0x7b,0x70,0x5f,0xa5,0x90
+,0xd8,0xad,0xf8,0x02,0xb6,0x6f,0xd3,0x60
+,0xdd,0x40,0x4b,0x22,0xc5,0x3d,0xad,0x3a
+,0x7a,0x9f,0x1a,0x1a,0x47,0x91,0x79,0x33
+,0xba,0x82,0xdc,0x32,0x69,0x03,0x96,0x6e
+,0x1f,0x4b,0xf0,0x71,0xfe,0xe3,0x67,0x72
+,0xa0,0xb1,0xbf,0x5c,0x8b,0xe4,0xfa,0x99
+,0x22,0xc7,0x84,0xb9,0x1b,0x8d,0x23,0x97
+,0x3f,0xed,0x25,0xe0,0xcf,0x65,0xbb,0xf5
+,0x61,0x04,0xef,0xdd,0x1e,0xb2,0x5a,0x41
+,0x22,0x5a,0xa1,0x9f,0x5d,0x2c,0xe8,0x5b
+,0xc9,0x6d,0xa9,0x0c,0x0c,0x78,0xaa,0x60
+,0xc6,0x56,0x8f,0x01,0x5a,0x0c,0x68,0xbc
+,0x69,0x19,0x79,0xc4,0x1f,0x7e,0x97,0x05
+,0xbf,0xc5,0xe9,0x24,0x51,0x5e,0xd4,0xd5
+,0x4b,0x53,0xed,0xd9,0x23,0x5a,0x36,0x03
+,0x65,0xa3,0xc1,0x03,0xad,0x41,0x30,0xf3
+,0x46,0x1b,0x85,0x90,0xaf,0x65,0xb5,0xd5
+,0xb1,0xe4,0x16,0x5b,0x78,0x75,0x1d,0x97
+,0x7a,0x6d,0x59,0xa9,0x2a,0x8f,0x7b,0xde
+,0xc3,0x87,0x89,0x10,0x99,0x49,0x73,0x78
+,0xc8,0x3d,0xbd,0x51,0x35,0x74,0x2a,0xd5
+,0xf1,0x7e,0x69,0x1b,0x2a,0xbb,0x3b,0xbd
+,0x25,0xb8,0x9a,0x5a,0x3d,0x72,0x61,0x90
+,0x66,0x87,0xee,0x0c,0xd6,0x4d,0xd4,0x11
+,0x74,0x0b,0x6a,0xfe,0x0b,0x03,0xfc,0xa3
+,0x55,0x57,0x89,0xfe,0x4a,0xcb,0xae,0x5b
+,0x17,0x05,0xc8,0xf2,0x8d,0x23,0x31,0x53
+,0x38,0xd2,0x2d,0x6a,0x3f,0x82,0xb9,0x8d
+,0x08,0x6a,0xf7,0x5e,0x41,0x74,0x6e,0xc3
+,0x11,0x7e,0x07,0xac,0x29,0x60,0x91,0x3f
+,0x38,0xca,0x57,0x10,0x0d,0xbd,0x30,0x2f
+,0xc7,0xa5,0xe6,0x41,0xa0,0xda,0xae,0x05
+,0x87,0x9a,0xa0,0xa4,0x65,0x6c,0x4c,0x09
+,0x0c,0x89,0xba,0xb8,0xd3,0xb9,0xc0,0x93
+,0x8a,0x30,0xfa,0x8d,0xe5,0x9a,0x6b,0x15
+,0x01,0x4e,0x67,0xaa,0xda,0x62,0x56,0x3e
+,0x84,0x08,0x66,0xd2,0xc4,0x36,0x7d,0xa7
+,0x3e,0x10,0xfc,0x88,0xe0,0xd4,0x80,0xe5
+,0x00,0xbd,0xaa,0xf3,0x4e,0x06,0xa3,0x7a
+,0x6a,0xf9,0x62,0x72,0xe3,0x09,0x4f,0xeb
+,0x9b,0x0e,0x01,0x23,0xf1,0x9f,0xbb,0x7c
+,0xdc,0xdc,0x6c,0x11,0x97,0x25,0xb2,0xf2
+,0xb4,0x63,0x14,0xd2,0x06,0x2a,0x67,0x8c
+,0x83,0xf5,0xce,0xea,0x07,0xd8,0x9a,0x6a
+,0x1e,0xec,0xe4,0x0a,0xbb,0x2a,0x4c,0xeb
+,0x09,0x60,0x39,0xce,0xca,0x62,0xd8,0x2e
+,0x6e};
+const unsigned int NptTlsTrustAnchor_Base_0110_Size = 1473;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0111.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0111.cpp
new file mode 100644
index 0000000..652c7a3
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0111.cpp
@@ -0,0 +1,149 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GeoTrust Primary Certification Authority */
+const unsigned char NptTlsTrustAnchor_Base_0111_Data[896] = {
+0x30,0x82,0x03,0x7c,0x30,0x82,0x02,0x64
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x18
+,0xac,0xb5,0x6a,0xfd,0x69,0xb6,0x15,0x3a
+,0x63,0x6c,0xaf,0xda,0xfa,0xc4,0xa1,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x58
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30
+,0x14,0x06,0x03,0x55,0x04,0x0a,0x13,0x0d
+,0x47,0x65,0x6f,0x54,0x72,0x75,0x73,0x74
+,0x20,0x49,0x6e,0x63,0x2e,0x31,0x31,0x30
+,0x2f,0x06,0x03,0x55,0x04,0x03,0x13,0x28
+,0x47,0x65,0x6f,0x54,0x72,0x75,0x73,0x74
+,0x20,0x50,0x72,0x69,0x6d,0x61,0x72,0x79
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79
+,0x30,0x1e,0x17,0x0d,0x30,0x36,0x31,0x31
+,0x32,0x37,0x30,0x30,0x30,0x30,0x30,0x30
+,0x5a,0x17,0x0d,0x33,0x36,0x30,0x37,0x31
+,0x36,0x32,0x33,0x35,0x39,0x35,0x39,0x5a
+,0x30,0x58,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0d,0x47,0x65,0x6f,0x54,0x72,0x75
+,0x73,0x74,0x20,0x49,0x6e,0x63,0x2e,0x31
+,0x31,0x30,0x2f,0x06,0x03,0x55,0x04,0x03
+,0x13,0x28,0x47,0x65,0x6f,0x54,0x72,0x75
+,0x73,0x74,0x20,0x50,0x72,0x69,0x6d,0x61
+,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xbe,0xb8,0x15,0x7b,0xff
+,0xd4,0x7c,0x7d,0x67,0xad,0x83,0x64,0x7b
+,0xc8,0x42,0x53,0x2d,0xdf,0xf6,0x84,0x08
+,0x20,0x61,0xd6,0x01,0x59,0x6a,0x9c,0x44
+,0x11,0xaf,0xef,0x76,0xfd,0x95,0x7e,0xce
+,0x61,0x30,0xbb,0x7a,0x83,0x5f,0x02,0xbd
+,0x01,0x66,0xca,0xee,0x15,0x8d,0x6f,0xa1
+,0x30,0x9c,0xbd,0xa1,0x85,0x9e,0x94,0x3a
+,0xf3,0x56,0x88,0x00,0x31,0xcf,0xd8,0xee
+,0x6a,0x96,0x02,0xd9,0xed,0x03,0x8c,0xfb
+,0x75,0x6d,0xe7,0xea,0xb8,0x55,0x16,0x05
+,0x16,0x9a,0xf4,0xe0,0x5e,0xb1,0x88,0xc0
+,0x64,0x85,0x5c,0x15,0x4d,0x88,0xc7,0xb7
+,0xba,0xe0,0x75,0xe9,0xad,0x05,0x3d,0x9d
+,0xc7,0x89,0x48,0xe0,0xbb,0x28,0xc8,0x03
+,0xe1,0x30,0x93,0x64,0x5e,0x52,0xc0,0x59
+,0x70,0x22,0x35,0x57,0x88,0x8a,0xf1,0x95
+,0x0a,0x83,0xd7,0xbc,0x31,0x73,0x01,0x34
+,0xed,0xef,0x46,0x71,0xe0,0x6b,0x02,0xa8
+,0x35,0x72,0x6b,0x97,0x9b,0x66,0xe0,0xcb
+,0x1c,0x79,0x5f,0xd8,0x1a,0x04,0x68,0x1e
+,0x47,0x02,0xe6,0x9d,0x60,0xe2,0x36,0x97
+,0x01,0xdf,0xce,0x35,0x92,0xdf,0xbe,0x67
+,0xc7,0x6d,0x77,0x59,0x3b,0x8f,0x9d,0xd6
+,0x90,0x15,0x94,0xbc,0x42,0x34,0x10,0xc1
+,0x39,0xf9,0xb1,0x27,0x3e,0x7e,0xd6,0x8a
+,0x75,0xc5,0xb2,0xaf,0x96,0xd3,0xa2,0xde
+,0x9b,0xe4,0x98,0xbe,0x7d,0xe1,0xe9,0x81
+,0xad,0xb6,0x6f,0xfc,0xd7,0x0e,0xda,0xe0
+,0x34,0xb0,0x0d,0x1a,0x77,0xe7,0xe3,0x08
+,0x98,0xef,0x58,0xfa,0x9c,0x84,0xb7,0x36
+,0xaf,0xc2,0xdf,0xac,0xd2,0xf4,0x10,0x06
+,0x70,0x71,0x35,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x42,0x30,0x40,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x01,0x06,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0x2c,0xd5,0x50,0x41,0x97,0x15,0x8b,0xf0
+,0x8f,0x36,0x61,0x5b,0x4a,0xfb,0x6b,0xd9
+,0x99,0xc9,0x33,0x92,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0x5a,0x70,0x7f,0x2c,0xdd,0xb7,0x34,0x4f
+,0xf5,0x86,0x51,0xa9,0x26,0xbe,0x4b,0xb8
+,0xaa,0xf1,0x71,0x0d,0xdc,0x61,0xc7,0xa0
+,0xea,0x34,0x1e,0x7a,0x77,0x0f,0x04,0x35
+,0xe8,0x27,0x8f,0x6c,0x90,0xbf,0x91,0x16
+,0x24,0x46,0x3e,0x4a,0x4e,0xce,0x2b,0x16
+,0xd5,0x0b,0x52,0x1d,0xfc,0x1f,0x67,0xa2
+,0x02,0x45,0x31,0x4f,0xce,0xf3,0xfa,0x03
+,0xa7,0x79,0x9d,0x53,0x6a,0xd9,0xda,0x63
+,0x3a,0xf8,0x80,0xd7,0xd3,0x99,0xe1,0xa5
+,0xe1,0xbe,0xd4,0x55,0x71,0x98,0x35,0x3a
+,0xbe,0x93,0xea,0xae,0xad,0x42,0xb2,0x90
+,0x6f,0xe0,0xfc,0x21,0x4d,0x35,0x63,0x33
+,0x89,0x49,0xd6,0x9b,0x4e,0xca,0xc7,0xe7
+,0x4e,0x09,0x00,0xf7,0xda,0xc7,0xef,0x99
+,0x62,0x99,0x77,0xb6,0x95,0x22,0x5e,0x8a
+,0xa0,0xab,0xf4,0xb8,0x78,0x98,0xca,0x38
+,0x19,0x99,0xc9,0x72,0x9e,0x78,0xcd,0x4b
+,0xac,0xaf,0x19,0xa0,0x73,0x12,0x2d,0xfc
+,0xc2,0x41,0xba,0x81,0x91,0xda,0x16,0x5a
+,0x31,0xb7,0xf9,0xb4,0x71,0x80,0x12,0x48
+,0x99,0x72,0x73,0x5a,0x59,0x53,0xc1,0x63
+,0x52,0x33,0xed,0xa7,0xc9,0xd2,0x39,0x02
+,0x70,0xfa,0xe0,0xb1,0x42,0x66,0x29,0xaa
+,0x9b,0x51,0xed,0x30,0x54,0x22,0x14,0x5f
+,0xd9,0xab,0x1d,0xc1,0xe4,0x94,0xf0,0xf8
+,0xf5,0x2b,0xf7,0xea,0xca,0x78,0x46,0xd6
+,0xb8,0x91,0xfd,0xa6,0x0d,0x2b,0x1a,0x14
+,0x01,0x3e,0x80,0xf0,0x42,0xa0,0x95,0x07
+,0x5e,0x6d,0xcd,0xcc,0x4b,0xa4,0x45,0x8d
+,0xab,0x12,0xe8,0xb3,0xde,0x5a,0xe5,0xa0
+,0x7c,0xe8,0x0f,0x22,0x1d,0x5a,0xe9,0x59
+};
+const unsigned int NptTlsTrustAnchor_Base_0111_Size = 896;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0112.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0112.cpp
new file mode 100644
index 0000000..575a2b7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0112.cpp
@@ -0,0 +1,169 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* thawte Primary Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0112_Data[1060] = {
+0x30,0x82,0x04,0x20,0x30,0x82,0x03,0x08
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x34
+,0x4e,0xd5,0x57,0x20,0xd5,0xed,0xec,0x49
+,0xf4,0x2f,0xce,0x37,0xdb,0x2b,0x6d,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0xa9,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15
+,0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0c,0x74,0x68,0x61,0x77,0x74,0x65,0x2c
+,0x20,0x49,0x6e,0x63,0x2e,0x31,0x28,0x30
+,0x26,0x06,0x03,0x55,0x04,0x0b,0x13,0x1f
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x53,0x65
+,0x72,0x76,0x69,0x63,0x65,0x73,0x20,0x44
+,0x69,0x76,0x69,0x73,0x69,0x6f,0x6e,0x31
+,0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x2f,0x28,0x63,0x29,0x20,0x32,0x30
+,0x30,0x36,0x20,0x74,0x68,0x61,0x77,0x74
+,0x65,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20
+,0x2d,0x20,0x46,0x6f,0x72,0x20,0x61,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64
+,0x20,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c
+,0x79,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55
+,0x04,0x03,0x13,0x16,0x74,0x68,0x61,0x77
+,0x74,0x65,0x20,0x50,0x72,0x69,0x6d,0x61
+,0x72,0x79,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x41,0x30,0x1e,0x17,0x0d,0x30,0x36
+,0x31,0x31,0x31,0x37,0x30,0x30,0x30,0x30
+,0x30,0x30,0x5a,0x17,0x0d,0x33,0x36,0x30
+,0x37,0x31,0x36,0x32,0x33,0x35,0x39,0x35
+,0x39,0x5a,0x30,0x81,0xa9,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0c,0x74,0x68,0x61
+,0x77,0x74,0x65,0x2c,0x20,0x49,0x6e,0x63
+,0x2e,0x31,0x28,0x30,0x26,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x1f,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x53,0x65,0x72,0x76,0x69,0x63
+,0x65,0x73,0x20,0x44,0x69,0x76,0x69,0x73
+,0x69,0x6f,0x6e,0x31,0x38,0x30,0x36,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x2f,0x28,0x63
+,0x29,0x20,0x32,0x30,0x30,0x36,0x20,0x74
+,0x68,0x61,0x77,0x74,0x65,0x2c,0x20,0x49
+,0x6e,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f
+,0x72,0x20,0x61,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x7a,0x65,0x64,0x20,0x75,0x73,0x65
+,0x20,0x6f,0x6e,0x6c,0x79,0x31,0x1f,0x30
+,0x1d,0x06,0x03,0x55,0x04,0x03,0x13,0x16
+,0x74,0x68,0x61,0x77,0x74,0x65,0x20,0x50
+,0x72,0x69,0x6d,0x61,0x72,0x79,0x20,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x41,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xac
+,0xa0,0xf0,0xfb,0x80,0x59,0xd4,0x9c,0xc7
+,0xa4,0xcf,0x9d,0xa1,0x59,0x73,0x09,0x10
+,0x45,0x0c,0x0d,0x2c,0x6e,0x68,0xf1,0x6c
+,0x5b,0x48,0x68,0x49,0x59,0x37,0xfc,0x0b
+,0x33,0x19,0xc2,0x77,0x7f,0xcc,0x10,0x2d
+,0x95,0x34,0x1c,0xe6,0xeb,0x4d,0x09,0xa7
+,0x1c,0xd2,0xb8,0xc9,0x97,0x36,0x02,0xb7
+,0x89,0xd4,0x24,0x5f,0x06,0xc0,0xcc,0x44
+,0x94,0x94,0x8d,0x02,0x62,0x6f,0xeb,0x5a
+,0xdd,0x11,0x8d,0x28,0x9a,0x5c,0x84,0x90
+,0x10,0x7a,0x0d,0xbd,0x74,0x66,0x2f,0x6a
+,0x38,0xa0,0xe2,0xd5,0x54,0x44,0xeb,0x1d
+,0x07,0x9f,0x07,0xba,0x6f,0xee,0xe9,0xfd
+,0x4e,0x0b,0x29,0xf5,0x3e,0x84,0xa0,0x01
+,0xf1,0x9c,0xab,0xf8,0x1c,0x7e,0x89,0xa4
+,0xe8,0xa1,0xd8,0x71,0x65,0x0d,0xa3,0x51
+,0x7b,0xee,0xbc,0xd2,0x22,0x60,0x0d,0xb9
+,0x5b,0x9d,0xdf,0xba,0xfc,0x51,0x5b,0x0b
+,0xaf,0x98,0xb2,0xe9,0x2e,0xe9,0x04,0xe8
+,0x62,0x87,0xde,0x2b,0xc8,0xd7,0x4e,0xc1
+,0x4c,0x64,0x1e,0xdd,0xcf,0x87,0x58,0xba
+,0x4a,0x4f,0xca,0x68,0x07,0x1d,0x1c,0x9d
+,0x4a,0xc6,0xd5,0x2f,0x91,0xcc,0x7c,0x71
+,0x72,0x1c,0xc5,0xc0,0x67,0xeb,0x32,0xfd
+,0xc9,0x92,0x5c,0x94,0xda,0x85,0xc0,0x9b
+,0xbf,0x53,0x7d,0x2b,0x09,0xf4,0x8c,0x9d
+,0x91,0x1f,0x97,0x6a,0x52,0xcb,0xde,0x09
+,0x36,0xa4,0x77,0xd8,0x7b,0x87,0x50,0x44
+,0xd5,0x3e,0x6e,0x29,0x69,0xfb,0x39,0x49
+,0x26,0x1e,0x09,0xa5,0x80,0x7b,0x40,0x2d
+,0xeb,0xe8,0x27,0x85,0xc9,0xfe,0x61,0xfd
+,0x7e,0xe6,0x7c,0x97,0x1d,0xd5,0x9d,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x42,0x30,0x40
+,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01
+,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0x7b,0x5b,0x45,0xcf
+,0xaf,0xce,0xcb,0x7a,0xfd,0x31,0x92,0x1a
+,0x6a,0xb6,0xf3,0x46,0xeb,0x57,0x48,0x50
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x79,0x11,0xc0,0x4b
+,0xb3,0x91,0xb6,0xfc,0xf0,0xe9,0x67,0xd4
+,0x0d,0x6e,0x45,0xbe,0x55,0xe8,0x93,0xd2
+,0xce,0x03,0x3f,0xed,0xda,0x25,0xb0,0x1d
+,0x57,0xcb,0x1e,0x3a,0x76,0xa0,0x4c,0xec
+,0x50,0x76,0xe8,0x64,0x72,0x0c,0xa4,0xa9
+,0xf1,0xb8,0x8b,0xd6,0xd6,0x87,0x84,0xbb
+,0x32,0xe5,0x41,0x11,0xc0,0x77,0xd9,0xb3
+,0x60,0x9d,0xeb,0x1b,0xd5,0xd1,0x6e,0x44
+,0x44,0xa9,0xa6,0x01,0xec,0x55,0x62,0x1d
+,0x77,0xb8,0x5c,0x8e,0x48,0x49,0x7c,0x9c
+,0x3b,0x57,0x11,0xac,0xad,0x73,0x37,0x8e
+,0x2f,0x78,0x5c,0x90,0x68,0x47,0xd9,0x60
+,0x60,0xe6,0xfc,0x07,0x3d,0x22,0x20,0x17
+,0xc4,0xf7,0x16,0xe9,0xc4,0xd8,0x72,0xf9
+,0xc8,0x73,0x7c,0xdf,0x16,0x2f,0x15,0xa9
+,0x3e,0xfd,0x6a,0x27,0xb6,0xa1,0xeb,0x5a
+,0xba,0x98,0x1f,0xd5,0xe3,0x4d,0x64,0x0a
+,0x9d,0x13,0xc8,0x61,0xba,0xf5,0x39,0x1c
+,0x87,0xba,0xb8,0xbd,0x7b,0x22,0x7f,0xf6
+,0xfe,0xac,0x40,0x79,0xe5,0xac,0x10,0x6f
+,0x3d,0x8f,0x1b,0x79,0x76,0x8b,0xc4,0x37
+,0xb3,0x21,0x18,0x84,0xe5,0x36,0x00,0xeb
+,0x63,0x20,0x99,0xb9,0xe9,0xfe,0x33,0x04
+,0xbb,0x41,0xc8,0xc1,0x02,0xf9,0x44,0x63
+,0x20,0x9e,0x81,0xce,0x42,0xd3,0xd6,0x3f
+,0x2c,0x76,0xd3,0x63,0x9c,0x59,0xdd,0x8f
+,0xa6,0xe1,0x0e,0xa0,0x2e,0x41,0xf7,0x2e
+,0x95,0x47,0xcf,0xbc,0xfd,0x33,0xf3,0xf6
+,0x0b,0x61,0x7e,0x7e,0x91,0x2b,0x81,0x47
+,0xc2,0x27,0x30,0xee,0xa7,0x10,0x5d,0x37
+,0x8f,0x5c,0x39,0x2b,0xe4,0x04,0xf0,0x7b
+,0x8d,0x56,0x8c,0x68};
+const unsigned int NptTlsTrustAnchor_Base_0112_Size = 1060;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0113.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0113.cpp
new file mode 100644
index 0000000..d47d999
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0113.cpp
@@ -0,0 +1,191 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* VeriSign Class 3 Public Primary Certification Authority - G5 */
+const unsigned char NptTlsTrustAnchor_Base_0113_Data[1239] = {
+0x30,0x82,0x04,0xd3,0x30,0x82,0x03,0xbb
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x18
+,0xda,0xd1,0x9e,0x26,0x7d,0xe8,0xbb,0x4a
+,0x21,0x58,0xcd,0xcc,0x6b,0x3b,0x4a,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17
+,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31
+,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69
+,0x67,0x6e,0x20,0x54,0x72,0x75,0x73,0x74
+,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b
+,0x31,0x3a,0x30,0x38,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x31,0x28,0x63,0x29,0x20,0x32
+,0x30,0x30,0x36,0x20,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f,0x72
+,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x7a,0x65,0x64,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x6e,0x6c,0x79,0x31,0x45,0x30,0x43
+,0x06,0x03,0x55,0x04,0x03,0x13,0x3c,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20
+,0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20
+,0x50,0x75,0x62,0x6c,0x69,0x63,0x20,0x50
+,0x72,0x69,0x6d,0x61,0x72,0x79,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x20,0x2d
+,0x20,0x47,0x35,0x30,0x1e,0x17,0x0d,0x30
+,0x36,0x31,0x31,0x30,0x38,0x30,0x30,0x30
+,0x30,0x30,0x30,0x5a,0x17,0x0d,0x33,0x36
+,0x30,0x37,0x31,0x36,0x32,0x33,0x35,0x39
+,0x35,0x39,0x5a,0x30,0x81,0xca,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65
+,0x72,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20
+,0x49,0x6e,0x63,0x2e,0x31,0x1f,0x30,0x1d
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x16,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20
+,0x54,0x72,0x75,0x73,0x74,0x20,0x4e,0x65
+,0x74,0x77,0x6f,0x72,0x6b,0x31,0x3a,0x30
+,0x38,0x06,0x03,0x55,0x04,0x0b,0x13,0x31
+,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36
+,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20
+,0x2d,0x20,0x46,0x6f,0x72,0x20,0x61,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64
+,0x20,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c
+,0x79,0x31,0x45,0x30,0x43,0x06,0x03,0x55
+,0x04,0x03,0x13,0x3c,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x20,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62
+,0x6c,0x69,0x63,0x20,0x50,0x72,0x69,0x6d
+,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f,0x72
+,0x69,0x74,0x79,0x20,0x2d,0x20,0x47,0x35
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xaf,0x24,0x08,0x08,0x29,0x7a,0x35
+,0x9e,0x60,0x0c,0xaa,0xe7,0x4b,0x3b,0x4e
+,0xdc,0x7c,0xbc,0x3c,0x45,0x1c,0xbb,0x2b
+,0xe0,0xfe,0x29,0x02,0xf9,0x57,0x08,0xa3
+,0x64,0x85,0x15,0x27,0xf5,0xf1,0xad,0xc8
+,0x31,0x89,0x5d,0x22,0xe8,0x2a,0xaa,0xa6
+,0x42,0xb3,0x8f,0xf8,0xb9,0x55,0xb7,0xb1
+,0xb7,0x4b,0xb3,0xfe,0x8f,0x7e,0x07,0x57
+,0xec,0xef,0x43,0xdb,0x66,0x62,0x15,0x61
+,0xcf,0x60,0x0d,0xa4,0xd8,0xde,0xf8,0xe0
+,0xc3,0x62,0x08,0x3d,0x54,0x13,0xeb,0x49
+,0xca,0x59,0x54,0x85,0x26,0xe5,0x2b,0x8f
+,0x1b,0x9f,0xeb,0xf5,0xa1,0x91,0xc2,0x33
+,0x49,0xd8,0x43,0x63,0x6a,0x52,0x4b,0xd2
+,0x8f,0xe8,0x70,0x51,0x4d,0xd1,0x89,0x69
+,0x7b,0xc7,0x70,0xf6,0xb3,0xdc,0x12,0x74
+,0xdb,0x7b,0x5d,0x4b,0x56,0xd3,0x96,0xbf
+,0x15,0x77,0xa1,0xb0,0xf4,0xa2,0x25,0xf2
+,0xaf,0x1c,0x92,0x67,0x18,0xe5,0xf4,0x06
+,0x04,0xef,0x90,0xb9,0xe4,0x00,0xe4,0xdd
+,0x3a,0xb5,0x19,0xff,0x02,0xba,0xf4,0x3c
+,0xee,0xe0,0x8b,0xeb,0x37,0x8b,0xec,0xf4
+,0xd7,0xac,0xf2,0xf6,0xf0,0x3d,0xaf,0xdd
+,0x75,0x91,0x33,0x19,0x1d,0x1c,0x40,0xcb
+,0x74,0x24,0x19,0x21,0x93,0xd9,0x14,0xfe
+,0xac,0x2a,0x52,0xc7,0x8f,0xd5,0x04,0x49
+,0xe4,0x8d,0x63,0x47,0x88,0x3c,0x69,0x83
+,0xcb,0xfe,0x47,0xbd,0x2b,0x7e,0x4f,0xc5
+,0x95,0xae,0x0e,0x9d,0xd4,0xd1,0x43,0xc0
+,0x67,0x73,0xe3,0x14,0x08,0x7e,0xe5,0x3f
+,0x9f,0x73,0xb8,0x33,0x0a,0xcf,0x5d,0x3f
+,0x34,0x87,0x96,0x8a,0xee,0x53,0xe8,0x25
+,0x15,0x02,0x03,0x01,0x00,0x01,0xa3,0x81
+,0xb2,0x30,0x81,0xaf,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x01,0x06,0x30,0x6d,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01
+,0x0c,0x04,0x61,0x30,0x5f,0xa1,0x5d,0xa0
+,0x5b,0x30,0x59,0x30,0x57,0x30,0x55,0x16
+,0x09,0x69,0x6d,0x61,0x67,0x65,0x2f,0x67
+,0x69,0x66,0x30,0x21,0x30,0x1f,0x30,0x07
+,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x04
+,0x14,0x8f,0xe5,0xd3,0x1a,0x86,0xac,0x8d
+,0x8e,0x6b,0xc3,0xcf,0x80,0x6a,0xd4,0x48
+,0x18,0x2c,0x7b,0x19,0x2e,0x30,0x25,0x16
+,0x23,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x6c,0x6f,0x67,0x6f,0x2e,0x76,0x65,0x72
+,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f
+,0x6d,0x2f,0x76,0x73,0x6c,0x6f,0x67,0x6f
+,0x2e,0x67,0x69,0x66,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x7f
+,0xd3,0x65,0xa7,0xc2,0xdd,0xec,0xbb,0xf0
+,0x30,0x09,0xf3,0x43,0x39,0xfa,0x02,0xaf
+,0x33,0x31,0x33,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x93
+,0x24,0x4a,0x30,0x5f,0x62,0xcf,0xd8,0x1a
+,0x98,0x2f,0x3d,0xea,0xdc,0x99,0x2d,0xbd
+,0x77,0xf6,0xa5,0x79,0x22,0x38,0xec,0xc4
+,0xa7,0xa0,0x78,0x12,0xad,0x62,0x0e,0x45
+,0x70,0x64,0xc5,0xe7,0x97,0x66,0x2d,0x98
+,0x09,0x7e,0x5f,0xaf,0xd6,0xcc,0x28,0x65
+,0xf2,0x01,0xaa,0x08,0x1a,0x47,0xde,0xf9
+,0xf9,0x7c,0x92,0x5a,0x08,0x69,0x20,0x0d
+,0xd9,0x3e,0x6d,0x6e,0x3c,0x0d,0x6e,0xd8
+,0xe6,0x06,0x91,0x40,0x18,0xb9,0xf8,0xc1
+,0xed,0xdf,0xdb,0x41,0xaa,0xe0,0x96,0x20
+,0xc9,0xcd,0x64,0x15,0x38,0x81,0xc9,0x94
+,0xee,0xa2,0x84,0x29,0x0b,0x13,0x6f,0x8e
+,0xdb,0x0c,0xdd,0x25,0x02,0xdb,0xa4,0x8b
+,0x19,0x44,0xd2,0x41,0x7a,0x05,0x69,0x4a
+,0x58,0x4f,0x60,0xca,0x7e,0x82,0x6a,0x0b
+,0x02,0xaa,0x25,0x17,0x39,0xb5,0xdb,0x7f
+,0xe7,0x84,0x65,0x2a,0x95,0x8a,0xbd,0x86
+,0xde,0x5e,0x81,0x16,0x83,0x2d,0x10,0xcc
+,0xde,0xfd,0xa8,0x82,0x2a,0x6d,0x28,0x1f
+,0x0d,0x0b,0xc4,0xe5,0xe7,0x1a,0x26,0x19
+,0xe1,0xf4,0x11,0x6f,0x10,0xb5,0x95,0xfc
+,0xe7,0x42,0x05,0x32,0xdb,0xce,0x9d,0x51
+,0x5e,0x28,0xb6,0x9e,0x85,0xd3,0x5b,0xef
+,0xa5,0x7d,0x45,0x40,0x72,0x8e,0xb7,0x0e
+,0x6b,0x0e,0x06,0xfb,0x33,0x35,0x48,0x71
+,0xb8,0x9d,0x27,0x8b,0xc4,0x65,0x5f,0x0d
+,0x86,0x76,0x9c,0x44,0x7a,0xf6,0x95,0x5c
+,0xf6,0x5d,0x32,0x08,0x33,0xa4,0x54,0xb6
+,0x18,0x3f,0x68,0x5c,0xf2,0x42,0x4a,0x85
+,0x38,0x54,0x83,0x5f,0xd1,0xe8,0x2c,0xf2
+,0xac,0x11,0xd6,0xa8,0xed,0x63,0x6a};
+const unsigned int NptTlsTrustAnchor_Base_0113_Size = 1239;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0114.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0114.cpp
new file mode 100644
index 0000000..afa2013
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0114.cpp
@@ -0,0 +1,156 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* SecureTrust CA */
+const unsigned char NptTlsTrustAnchor_Base_0114_Data[956] = {
+0x30,0x82,0x03,0xb8,0x30,0x82,0x02,0xa0
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x0c
+,0xf0,0x8e,0x5c,0x08,0x16,0xa5,0xad,0x42
+,0x7f,0xf0,0xeb,0x27,0x18,0x59,0xd0,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x48
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x20,0x30
+,0x1e,0x06,0x03,0x55,0x04,0x0a,0x13,0x17
+,0x53,0x65,0x63,0x75,0x72,0x65,0x54,0x72
+,0x75,0x73,0x74,0x20,0x43,0x6f,0x72,0x70
+,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31
+,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x03
+,0x13,0x0e,0x53,0x65,0x63,0x75,0x72,0x65
+,0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x41
+,0x30,0x1e,0x17,0x0d,0x30,0x36,0x31,0x31
+,0x30,0x37,0x31,0x39,0x33,0x31,0x31,0x38
+,0x5a,0x17,0x0d,0x32,0x39,0x31,0x32,0x33
+,0x31,0x31,0x39,0x34,0x30,0x35,0x35,0x5a
+,0x30,0x48,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x20,0x30,0x1e,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x17,0x53,0x65,0x63,0x75,0x72,0x65
+,0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x6f
+,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f
+,0x6e,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x03,0x13,0x0e,0x53,0x65,0x63,0x75
+,0x72,0x65,0x54,0x72,0x75,0x73,0x74,0x20
+,0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xab,0xa4,0x81,0xe5,0x95
+,0xcd,0xf5,0xf6,0x14,0x8e,0xc2,0x4f,0xca
+,0xd4,0xe2,0x78,0x95,0x58,0x9c,0x41,0xe1
+,0x0d,0x99,0x40,0x24,0x17,0x39,0x91,0x33
+,0x66,0xe9,0xbe,0xe1,0x83,0xaf,0x62,0x5c
+,0x89,0xd1,0xfc,0x24,0x5b,0x61,0xb3,0xe0
+,0x11,0x11,0x41,0x1c,0x1d,0x6e,0xf0,0xb8
+,0xbb,0xf8,0xde,0xa7,0x81,0xba,0xa6,0x48
+,0xc6,0x9f,0x1d,0xbd,0xbe,0x8e,0xa9,0x41
+,0x3e,0xb8,0x94,0xed,0x29,0x1a,0xd4,0x8e
+,0xd2,0x03,0x1d,0x03,0xef,0x6d,0x0d,0x67
+,0x1c,0x57,0xd7,0x06,0xad,0xca,0xc8,0xf5
+,0xfe,0x0e,0xaf,0x66,0x25,0x48,0x04,0x96
+,0x0b,0x5d,0xa3,0xba,0x16,0xc3,0x08,0x4f
+,0xd1,0x46,0xf8,0x14,0x5c,0xf2,0xc8,0x5e
+,0x01,0x99,0x6d,0xfd,0x88,0xcc,0x86,0xa8
+,0xc1,0x6f,0x31,0x42,0x6c,0x52,0x3e,0x68
+,0xcb,0xf3,0x19,0x34,0xdf,0xbb,0x87,0x18
+,0x56,0x80,0x26,0xc4,0xd0,0xdc,0xc0,0x6f
+,0xdf,0xde,0xa0,0xc2,0x91,0x16,0xa0,0x64
+,0x11,0x4b,0x44,0xbc,0x1e,0xf6,0xe7,0xfa
+,0x63,0xde,0x66,0xac,0x76,0xa4,0x71,0xa3
+,0xec,0x36,0x94,0x68,0x7a,0x77,0xa4,0xb1
+,0xe7,0x0e,0x2f,0x81,0x7a,0xe2,0xb5,0x72
+,0x86,0xef,0xa2,0x6b,0x8b,0xf0,0x0f,0xdb
+,0xd3,0x59,0x3f,0xba,0x72,0xbc,0x44,0x24
+,0x9c,0xe3,0x73,0xb3,0xf7,0xaf,0x57,0x2f
+,0x42,0x26,0x9d,0xa9,0x74,0xba,0x00,0x52
+,0xf2,0x4b,0xcd,0x53,0x7c,0x47,0x0b,0x36
+,0x85,0x0e,0x66,0xa9,0x08,0x97,0x16,0x34
+,0x57,0xc1,0x66,0xf7,0x80,0xe3,0xed,0x70
+,0x54,0xc7,0x93,0xe0,0x2e,0x28,0x15,0x59
+,0x87,0xba,0xbb,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x81,0x9d,0x30,0x81,0x9a,0x30,0x13
+,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82
+,0x37,0x14,0x02,0x04,0x06,0x1e,0x04,0x00
+,0x43,0x00,0x41,0x30,0x0b,0x06,0x03,0x55
+,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x86
+,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01
+,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0x42,0x32,0xb6,0x16
+,0xfa,0x04,0xfd,0xfe,0x5d,0x4b,0x7a,0xc3
+,0xfd,0xf7,0x4c,0x40,0x1d,0x5a,0x43,0xaf
+,0x30,0x34,0x06,0x03,0x55,0x1d,0x1f,0x04
+,0x2d,0x30,0x2b,0x30,0x29,0xa0,0x27,0xa0
+,0x25,0x86,0x23,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x73,0x65
+,0x63,0x75,0x72,0x65,0x74,0x72,0x75,0x73
+,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x53,0x54
+,0x43,0x41,0x2e,0x63,0x72,0x6c,0x30,0x10
+,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82
+,0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x30,0xed,0x4f,0x4a
+,0xe1,0x58,0x3a,0x52,0x72,0x5b,0xb5,0xa6
+,0xa3,0x65,0x18,0xa6,0xbb,0x51,0x3b,0x77
+,0xe9,0x9d,0xea,0xd3,0x9f,0x5c,0xe0,0x45
+,0x65,0x7b,0x0d,0xca,0x5b,0xe2,0x70,0x50
+,0xb2,0x94,0x05,0x14,0xae,0x49,0xc7,0x8d
+,0x41,0x07,0x12,0x73,0x94,0x7e,0x0c,0x23
+,0x21,0xfd,0xbc,0x10,0x7f,0x60,0x10,0x5a
+,0x72,0xf5,0x98,0x0e,0xac,0xec,0xb9,0x7f
+,0xdd,0x7a,0x6f,0x5d,0xd3,0x1c,0xf4,0xff
+,0x88,0x05,0x69,0x42,0xa9,0x05,0x71,0xc8
+,0xb7,0xac,0x26,0xe8,0x2e,0xb4,0x8c,0x6a
+,0xff,0x71,0xdc,0xb8,0xb1,0xdf,0x99,0xbc
+,0x7c,0x21,0x54,0x2b,0xe4,0x58,0xa2,0xbb
+,0x57,0x29,0xae,0x9e,0xa9,0xa3,0x19,0x26
+,0x0f,0x99,0x2e,0x08,0xb0,0xef,0xfd,0x69
+,0xcf,0x99,0x1a,0x09,0x8d,0xe3,0xa7,0x9f
+,0x2b,0xc9,0x36,0x34,0x7b,0x24,0xb3,0x78
+,0x4c,0x95,0x17,0xa4,0x06,0x26,0x1e,0xb6
+,0x64,0x52,0x36,0x5f,0x60,0x67,0xd9,0x9c
+,0xc5,0x05,0x74,0x0b,0xe7,0x67,0x23,0xd2
+,0x08,0xfc,0x88,0xe9,0xae,0x8b,0x7f,0xe1
+,0x30,0xf4,0x37,0x7e,0xfd,0xc6,0x32,0xda
+,0x2d,0x9e,0x44,0x30,0x30,0x6c,0xee,0x07
+,0xde,0xd2,0x34,0xfc,0xd2,0xff,0x40,0xf6
+,0x4b,0xf4,0x66,0x46,0x06,0x54,0xa6,0xf2
+,0x32,0x0a,0x63,0x26,0x30,0x6b,0x9b,0xd1
+,0xdc,0x8b,0x47,0xba,0xe1,0xb9,0xd5,0x62
+,0xd0,0xa2,0xa0,0xf4,0x67,0x05,0x78,0x29
+,0x63,0x1a,0x6f,0x04,0xd6,0xf8,0xc6,0x4c
+,0xa3,0x9a,0xb1,0x37,0xb4,0x8d,0xe5,0x28
+,0x4b,0x1d,0x9e,0x2c,0xc2,0xb8,0x68,0xbc
+,0xed,0x02,0xee,0x31};
+const unsigned int NptTlsTrustAnchor_Base_0114_Size = 956;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0115.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0115.cpp
new file mode 100644
index 0000000..11a80bf
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0115.cpp
@@ -0,0 +1,157 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Secure Global CA */
+const unsigned char NptTlsTrustAnchor_Base_0115_Data[960] = {
+0x30,0x82,0x03,0xbc,0x30,0x82,0x02,0xa4
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x07
+,0x56,0x22,0xa4,0xe8,0xd4,0x8a,0x89,0x4d
+,0xf4,0x13,0xc8,0xf0,0xf8,0xea,0xa5,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x4a
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x20,0x30
+,0x1e,0x06,0x03,0x55,0x04,0x0a,0x13,0x17
+,0x53,0x65,0x63,0x75,0x72,0x65,0x54,0x72
+,0x75,0x73,0x74,0x20,0x43,0x6f,0x72,0x70
+,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31
+,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x03
+,0x13,0x10,0x53,0x65,0x63,0x75,0x72,0x65
+,0x20,0x47,0x6c,0x6f,0x62,0x61,0x6c,0x20
+,0x43,0x41,0x30,0x1e,0x17,0x0d,0x30,0x36
+,0x31,0x31,0x30,0x37,0x31,0x39,0x34,0x32
+,0x32,0x38,0x5a,0x17,0x0d,0x32,0x39,0x31
+,0x32,0x33,0x31,0x31,0x39,0x35,0x32,0x30
+,0x36,0x5a,0x30,0x4a,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x20,0x30,0x1e,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x17,0x53,0x65,0x63,0x75
+,0x72,0x65,0x54,0x72,0x75,0x73,0x74,0x20
+,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74
+,0x69,0x6f,0x6e,0x31,0x19,0x30,0x17,0x06
+,0x03,0x55,0x04,0x03,0x13,0x10,0x53,0x65
+,0x63,0x75,0x72,0x65,0x20,0x47,0x6c,0x6f
+,0x62,0x61,0x6c,0x20,0x43,0x41,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xaf
+,0x35,0x2e,0xd8,0xac,0x6c,0x55,0x69,0x06
+,0x71,0xe5,0x13,0x68,0x24,0xb3,0x4f,0xd8
+,0xcc,0x21,0x47,0xf8,0xf1,0x60,0x38,0x89
+,0x89,0x03,0xe9,0xbd,0xea,0x5e,0x46,0x53
+,0x09,0xdc,0x5c,0xf5,0x5a,0xe8,0xf7,0x45
+,0x2a,0x02,0xeb,0x31,0x61,0xd7,0x29,0x33
+,0x4c,0xce,0xc7,0x7c,0x0a,0x37,0x7e,0x0f
+,0xba,0x32,0x98,0xe1,0x1d,0x97,0xaf,0x8f
+,0xc7,0xdc,0xc9,0x38,0x96,0xf3,0xdb,0x1a
+,0xfc,0x51,0xed,0x68,0xc6,0xd0,0x6e,0xa4
+,0x7c,0x24,0xd1,0xae,0x42,0xc8,0x96,0x50
+,0x63,0x2e,0xe0,0xfe,0x75,0xfe,0x98,0xa7
+,0x5f,0x49,0x2e,0x95,0xe3,0x39,0x33,0x64
+,0x8e,0x1e,0xa4,0x5f,0x90,0xd2,0x67,0x3c
+,0xb2,0xd9,0xfe,0x41,0xb9,0x55,0xa7,0x09
+,0x8e,0x72,0x05,0x1e,0x8b,0xdd,0x44,0x85
+,0x82,0x42,0xd0,0x49,0xc0,0x1d,0x60,0xf0
+,0xd1,0x17,0x2c,0x95,0xeb,0xf6,0xa5,0xc1
+,0x92,0xa3,0xc5,0xc2,0xa7,0x08,0x60,0x0d
+,0x60,0x04,0x10,0x96,0x79,0x9e,0x16,0x34
+,0xe6,0xa9,0xb6,0xfa,0x25,0x45,0x39,0xc8
+,0x1e,0x65,0xf9,0x93,0xf5,0xaa,0xf1,0x52
+,0xdc,0x99,0x98,0x3d,0xa5,0x86,0x1a,0x0c
+,0x35,0x33,0xfa,0x4b,0xa5,0x04,0x06,0x15
+,0x1c,0x31,0x80,0xef,0xaa,0x18,0x6b,0xc2
+,0x7b,0xd7,0xda,0xce,0xf9,0x33,0x20,0xd5
+,0xf5,0xbd,0x6a,0x33,0x2d,0x81,0x04,0xfb
+,0xb0,0x5c,0xd4,0x9c,0xa3,0xe2,0x5c,0x1d
+,0xe3,0xa9,0x42,0x75,0x5e,0x7b,0xd4,0x77
+,0xef,0x39,0x54,0xba,0xc9,0x0a,0x18,0x1b
+,0x12,0x99,0x49,0x2f,0x88,0x4b,0xfd,0x50
+,0x62,0xd1,0x73,0xe7,0x8f,0x7a,0x43,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x81,0x9d,0x30
+,0x81,0x9a,0x30,0x13,0x06,0x09,0x2b,0x06
+,0x01,0x04,0x01,0x82,0x37,0x14,0x02,0x04
+,0x06,0x1e,0x04,0x00,0x43,0x00,0x41,0x30
+,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04
+,0x03,0x02,0x01,0x86,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0xaf,0x44,0x04,0xc2,0x41,0x7e,0x48,0x83
+,0xdb,0x4e,0x39,0x02,0xec,0xec,0x84,0x7a
+,0xe6,0xce,0xc9,0xa4,0x30,0x34,0x06,0x03
+,0x55,0x1d,0x1f,0x04,0x2d,0x30,0x2b,0x30
+,0x29,0xa0,0x27,0xa0,0x25,0x86,0x23,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72
+,0x6c,0x2e,0x73,0x65,0x63,0x75,0x72,0x65
+,0x74,0x72,0x75,0x73,0x74,0x2e,0x63,0x6f
+,0x6d,0x2f,0x53,0x47,0x43,0x41,0x2e,0x63
+,0x72,0x6c,0x30,0x10,0x06,0x09,0x2b,0x06
+,0x01,0x04,0x01,0x82,0x37,0x15,0x01,0x04
+,0x03,0x02,0x01,0x00,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0x63,0x1a,0x08,0x40,0x7d,0xa4,0x5e,0x53
+,0x0d,0x77,0xd8,0x7a,0xae,0x1f,0x0d,0x0b
+,0x51,0x16,0x03,0xef,0x18,0x7c,0xc8,0xe3
+,0xaf,0x6a,0x58,0x93,0x14,0x60,0x91,0xb2
+,0x84,0xdc,0x88,0x4e,0xbe,0x39,0x8a,0x3a
+,0xf3,0xe6,0x82,0x89,0x5d,0x01,0x37,0xb3
+,0xab,0x24,0xa4,0x15,0x0e,0x92,0x35,0x5a
+,0x4a,0x44,0x5e,0x4e,0x57,0xfa,0x75,0xce
+,0x1f,0x48,0xce,0x66,0xf4,0x3c,0x40,0x26
+,0x92,0x98,0x6c,0x1b,0xee,0x24,0x46,0x0c
+,0x17,0xb3,0x52,0xa5,0xdb,0xa5,0x91,0x91
+,0xcf,0x37,0xd3,0x6f,0xe7,0x27,0x08,0x3a
+,0x4e,0x19,0x1f,0x3a,0xa7,0x58,0x5c,0x17
+,0xcf,0x79,0x3f,0x8b,0xe4,0xa7,0xd3,0x26
+,0x23,0x9d,0x26,0x0f,0x58,0x69,0xfc,0x47
+,0x7e,0xb2,0xd0,0x8d,0x8b,0x93,0xbf,0x29
+,0x4f,0x43,0x69,0x74,0x76,0x67,0x4b,0xcf
+,0x07,0x8c,0xe6,0x02,0xf7,0xb5,0xe1,0xb4
+,0x43,0xb5,0x4b,0x2d,0x14,0x9f,0xf9,0xdc
+,0x26,0x0d,0xbf,0xa6,0x47,0x74,0x06,0xd8
+,0x88,0xd1,0x3a,0x29,0x30,0x84,0xce,0xd2
+,0x39,0x80,0x62,0x1b,0xa8,0xc7,0x57,0x49
+,0xbc,0x6a,0x55,0x51,0x67,0x15,0x4a,0xbe
+,0x35,0x07,0xe4,0xd5,0x75,0x98,0x37,0x79
+,0x30,0x14,0xdb,0x29,0x9d,0x6c,0xc5,0x69
+,0xcc,0x47,0x55,0xa2,0x30,0xf7,0xcc,0x5c
+,0x7f,0xc2,0xc3,0x98,0x1c,0x6b,0x4e,0x16
+,0x80,0xeb,0x7a,0x78,0x65,0x45,0xa2,0x00
+,0x1a,0xaf,0x0c,0x0d,0x55,0x64,0x34,0x48
+,0xb8,0x92,0xb9,0xf1,0xb4,0x50,0x29,0xf2
+,0x4f,0x23,0x1f,0xda,0x6c,0xac,0x1f,0x44
+,0xe1,0xdd,0x23,0x78,0x51,0x5b,0xc7,0x16
+};
+const unsigned int NptTlsTrustAnchor_Base_0115_Size = 960;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0116.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0116.cpp
new file mode 100644
index 0000000..b6aa87a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0116.cpp
@@ -0,0 +1,169 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* COMODO Certification Authority */
+const unsigned char NptTlsTrustAnchor_Base_0116_Data[1057] = {
+0x30,0x82,0x04,0x1d,0x30,0x82,0x03,0x05
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x4e
+,0x81,0x2d,0x8a,0x82,0x65,0xe0,0x0b,0x02
+,0xee,0x3e,0x35,0x02,0x46,0xe5,0x3d,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0x81,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1b
+,0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x13
+,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72
+,0x20,0x4d,0x61,0x6e,0x63,0x68,0x65,0x73
+,0x74,0x65,0x72,0x31,0x10,0x30,0x0e,0x06
+,0x03,0x55,0x04,0x07,0x13,0x07,0x53,0x61
+,0x6c,0x66,0x6f,0x72,0x64,0x31,0x1a,0x30
+,0x18,0x06,0x03,0x55,0x04,0x0a,0x13,0x11
+,0x43,0x4f,0x4d,0x4f,0x44,0x4f,0x20,0x43
+,0x41,0x20,0x4c,0x69,0x6d,0x69,0x74,0x65
+,0x64,0x31,0x27,0x30,0x25,0x06,0x03,0x55
+,0x04,0x03,0x13,0x1e,0x43,0x4f,0x4d,0x4f
+,0x44,0x4f,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x30,0x1e,0x17,0x0d,0x30,0x36
+,0x31,0x32,0x30,0x31,0x30,0x30,0x30,0x30
+,0x30,0x30,0x5a,0x17,0x0d,0x32,0x39,0x31
+,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35
+,0x39,0x5a,0x30,0x81,0x81,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x47,0x42,0x31,0x1b,0x30,0x19,0x06,0x03
+,0x55,0x04,0x08,0x13,0x12,0x47,0x72,0x65
+,0x61,0x74,0x65,0x72,0x20,0x4d,0x61,0x6e
+,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31
+,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07
+,0x13,0x07,0x53,0x61,0x6c,0x66,0x6f,0x72
+,0x64,0x31,0x1a,0x30,0x18,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x11,0x43,0x4f,0x4d,0x4f
+,0x44,0x4f,0x20,0x43,0x41,0x20,0x4c,0x69
+,0x6d,0x69,0x74,0x65,0x64,0x31,0x27,0x30
+,0x25,0x06,0x03,0x55,0x04,0x03,0x13,0x1e
+,0x43,0x4f,0x4d,0x4f,0x44,0x4f,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xd0
+,0x40,0x8b,0x8b,0x72,0xe3,0x91,0x1b,0xf7
+,0x51,0xc1,0x1b,0x54,0x04,0x98,0xd3,0xa9
+,0xbf,0xc1,0xe6,0x8a,0x5d,0x3b,0x87,0xfb
+,0xbb,0x88,0xce,0x0d,0xe3,0x2f,0x3f,0x06
+,0x96,0xf0,0xa2,0x29,0x50,0x99,0xae,0xdb
+,0x3b,0xa1,0x57,0xb0,0x74,0x51,0x71,0xcd
+,0xed,0x42,0x91,0x4d,0x41,0xfe,0xa9,0xc8
+,0xd8,0x6a,0x86,0x77,0x44,0xbb,0x59,0x66
+,0x97,0x50,0x5e,0xb4,0xd4,0x2c,0x70,0x44
+,0xcf,0xda,0x37,0x95,0x42,0x69,0x3c,0x30
+,0xc4,0x71,0xb3,0x52,0xf0,0x21,0x4d,0xa1
+,0xd8,0xba,0x39,0x7c,0x1c,0x9e,0xa3,0x24
+,0x9d,0xf2,0x83,0x16,0x98,0xaa,0x16,0x7c
+,0x43,0x9b,0x15,0x5b,0xb7,0xae,0x34,0x91
+,0xfe,0xd4,0x62,0x26,0x18,0x46,0x9a,0x3f
+,0xeb,0xc1,0xf9,0xf1,0x90,0x57,0xeb,0xac
+,0x7a,0x0d,0x8b,0xdb,0x72,0x30,0x6a,0x66
+,0xd5,0xe0,0x46,0xa3,0x70,0xdc,0x68,0xd9
+,0xff,0x04,0x48,0x89,0x77,0xde,0xb5,0xe9
+,0xfb,0x67,0x6d,0x41,0xe9,0xbc,0x39,0xbd
+,0x32,0xd9,0x62,0x02,0xf1,0xb1,0xa8,0x3d
+,0x6e,0x37,0x9c,0xe2,0x2f,0xe2,0xd3,0xa2
+,0x26,0x8b,0xc6,0xb8,0x55,0x43,0x88,0xe1
+,0x23,0x3e,0xa5,0xd2,0x24,0x39,0x6a,0x47
+,0xab,0x00,0xd4,0xa1,0xb3,0xa9,0x25,0xfe
+,0x0d,0x3f,0xa7,0x1d,0xba,0xd3,0x51,0xc1
+,0x0b,0xa4,0xda,0xac,0x38,0xef,0x55,0x50
+,0x24,0x05,0x65,0x46,0x93,0x34,0x4f,0x2d
+,0x8d,0xad,0xc6,0xd4,0x21,0x19,0xd2,0x8e
+,0xca,0x05,0x61,0x71,0x07,0x73,0x47,0xe5
+,0x8a,0x19,0x12,0xbd,0x04,0x4d,0xce,0x4e
+,0x9c,0xa5,0x48,0xac,0xbb,0x26,0xf7,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x81,0x8e,0x30
+,0x81,0x8b,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x0b,0x58,0xe5
+,0x8b,0xc6,0x4c,0x15,0x37,0xa4,0x40,0xa9
+,0x30,0xa9,0x21,0xbe,0x47,0x36,0x5a,0x56
+,0xff,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x49,0x06,0x03,0x55,0x1d
+,0x1f,0x04,0x42,0x30,0x40,0x30,0x3e,0xa0
+,0x3c,0xa0,0x3a,0x86,0x38,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e
+,0x63,0x6f,0x6d,0x6f,0x64,0x6f,0x63,0x61
+,0x2e,0x63,0x6f,0x6d,0x2f,0x43,0x4f,0x4d
+,0x4f,0x44,0x4f,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74
+,0x79,0x2e,0x63,0x72,0x6c,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0x3e,0x98,0x9e,0x9b,0xf6,0x1b,0xe9
+,0xd7,0x39,0xb7,0x78,0xae,0x1d,0x72,0x18
+,0x49,0xd3,0x87,0xe4,0x43,0x82,0xeb,0x3f
+,0xc9,0xaa,0xf5,0xa8,0xb5,0xef,0x55,0x7c
+,0x21,0x52,0x65,0xf9,0xd5,0x0d,0xe1,0x6c
+,0xf4,0x3e,0x8c,0x93,0x73,0x91,0x2e,0x02
+,0xc4,0x4e,0x07,0x71,0x6f,0xc0,0x8f,0x38
+,0x61,0x08,0xa8,0x1e,0x81,0x0a,0xc0,0x2f
+,0x20,0x2f,0x41,0x8b,0x91,0xdc,0x48,0x45
+,0xbc,0xf1,0xc6,0xde,0xba,0x76,0x6b,0x33
+,0xc8,0x00,0x2d,0x31,0x46,0x4c,0xed,0xe7
+,0x9d,0xcf,0x88,0x94,0xff,0x33,0xc0,0x56
+,0xe8,0x24,0x86,0x26,0xb8,0xd8,0x38,0x38
+,0xdf,0x2a,0x6b,0xdd,0x12,0xcc,0xc7,0x3f
+,0x47,0x17,0x4c,0xa2,0xc2,0x06,0x96,0x09
+,0xd6,0xdb,0xfe,0x3f,0x3c,0x46,0x41,0xdf
+,0x58,0xe2,0x56,0x0f,0x3c,0x3b,0xc1,0x1c
+,0x93,0x35,0xd9,0x38,0x52,0xac,0xee,0xc8
+,0xec,0x2e,0x30,0x4e,0x94,0x35,0xb4,0x24
+,0x1f,0x4b,0x78,0x69,0xda,0xf2,0x02,0x38
+,0xcc,0x95,0x52,0x93,0xf0,0x70,0x25,0x59
+,0x9c,0x20,0x67,0xc4,0xee,0xf9,0x8b,0x57
+,0x61,0xf4,0x92,0x76,0x7d,0x3f,0x84,0x8d
+,0x55,0xb7,0xe8,0xe5,0xac,0xd5,0xf1,0xf5
+,0x19,0x56,0xa6,0x5a,0xfb,0x90,0x1c,0xaf
+,0x93,0xeb,0xe5,0x1c,0xd4,0x67,0x97,0x5d
+,0x04,0x0e,0xbe,0x0b,0x83,0xa6,0x17,0x83
+,0xb9,0x30,0x12,0xa0,0xc5,0x33,0x15,0x05
+,0xb9,0x0d,0xfb,0xc7,0x05,0x76,0xe3,0xd8
+,0x4a,0x8d,0xfc,0x34,0x17,0xa3,0xc6,0x21
+,0x28,0xbe,0x30,0x45,0x31,0x1e,0xc7,0x78
+,0xbe,0x58,0x61,0x38,0xac,0x3b,0xe2,0x01
+,0x65};
+const unsigned int NptTlsTrustAnchor_Base_0116_Size = 1057;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0117.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0117.cpp
new file mode 100644
index 0000000..e714256
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0117.cpp
@@ -0,0 +1,214 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* DigiNotar Root CA */
+const unsigned char NptTlsTrustAnchor_Base_0117_Data[1422] = {
+0x30,0x82,0x05,0x8a,0x30,0x82,0x03,0x72
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x0c
+,0x76,0xda,0x9c,0x91,0x0c,0x4e,0x2c,0x9e
+,0xfe,0x15,0xd0,0x58,0x93,0x3c,0x4c,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x5f
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x4e,0x4c,0x31,0x12,0x30
+,0x10,0x06,0x03,0x55,0x04,0x0a,0x13,0x09
+,0x44,0x69,0x67,0x69,0x4e,0x6f,0x74,0x61
+,0x72,0x31,0x1a,0x30,0x18,0x06,0x03,0x55
+,0x04,0x03,0x13,0x11,0x44,0x69,0x67,0x69
+,0x4e,0x6f,0x74,0x61,0x72,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x31,0x20,0x30
+,0x1e,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x09,0x01,0x16,0x11,0x69,0x6e
+,0x66,0x6f,0x40,0x64,0x69,0x67,0x69,0x6e
+,0x6f,0x74,0x61,0x72,0x2e,0x6e,0x6c,0x30
+,0x1e,0x17,0x0d,0x30,0x37,0x30,0x35,0x31
+,0x36,0x31,0x37,0x31,0x39,0x33,0x36,0x5a
+,0x17,0x0d,0x32,0x35,0x30,0x33,0x33,0x31
+,0x31,0x38,0x31,0x39,0x32,0x31,0x5a,0x30
+,0x5f,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x4e,0x4c,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x09,0x44,0x69,0x67,0x69,0x4e,0x6f,0x74
+,0x61,0x72,0x31,0x1a,0x30,0x18,0x06,0x03
+,0x55,0x04,0x03,0x13,0x11,0x44,0x69,0x67
+,0x69,0x4e,0x6f,0x74,0x61,0x72,0x20,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x41,0x31,0x20
+,0x30,0x1e,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x11,0x69
+,0x6e,0x66,0x6f,0x40,0x64,0x69,0x67,0x69
+,0x6e,0x6f,0x74,0x61,0x72,0x2e,0x6e,0x6c
+,0x30,0x82,0x02,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x02,0x0f,0x00
+,0x30,0x82,0x02,0x0a,0x02,0x82,0x02,0x01
+,0x00,0xac,0xb0,0x58,0xc1,0x00,0xbd,0xd8
+,0x21,0x08,0x0b,0x2b,0x9a,0xfe,0x6e,0x56
+,0x30,0x05,0x9f,0x1b,0x77,0x90,0x10,0x41
+,0x5c,0xc3,0x0d,0x87,0x11,0x77,0x8e,0x81
+,0xf1,0xca,0x7c,0xe9,0x8c,0x6a,0xed,0x38
+,0x74,0x35,0xbb,0xda,0xdf,0xf9,0xbb,0xc0
+,0x09,0x37,0xb4,0x96,0x73,0x81,0x7d,0x33
+,0x1a,0x98,0x39,0xf7,0x93,0x6f,0x95,0x7f
+,0x3d,0xb9,0xb1,0x75,0x87,0xba,0x51,0x48
+,0xe8,0x8b,0x70,0x3e,0x95,0x04,0xc5,0xd8
+,0xb6,0xc3,0x16,0xd9,0x88,0xb0,0xb1,0x87
+,0x1d,0x70,0xda,0x86,0xb4,0x0f,0x14,0x8b
+,0x7a,0xcf,0x10,0xd1,0x74,0x36,0xa2,0x12
+,0x7b,0x77,0x86,0x4a,0x79,0xe6,0x7b,0xdf
+,0x02,0x11,0x68,0xa5,0x4e,0x86,0xae,0x34
+,0x58,0x9b,0x24,0x13,0x78,0x56,0x22,0x25
+,0x1e,0x01,0x8b,0x4b,0x51,0x71,0xfb,0x82
+,0xcc,0x59,0x96,0x69,0x88,0x5a,0x68,0x53
+,0xc5,0xb9,0x0d,0x02,0x37,0xcb,0x4b,0xbc
+,0x66,0x4a,0x90,0x7e,0x2a,0x0b,0x05,0x07
+,0xed,0x16,0x5f,0x55,0x90,0x75,0xd8,0x46
+,0xc9,0x1b,0x83,0xe2,0x08,0xbe,0xf1,0x23
+,0xcc,0x99,0x1d,0xd6,0x2a,0x0f,0x83,0x20
+,0x15,0x58,0x27,0x82,0x2e,0xfa,0xe2,0x22
+,0xc2,0x49,0xb1,0xb9,0x01,0x81,0x6a,0x9d
+,0x6d,0x9d,0x40,0x77,0x68,0x76,0x4e,0x21
+,0x2a,0x6d,0x84,0x40,0x85,0x4e,0x76,0x99
+,0x7c,0x82,0xf3,0xf3,0xb7,0x02,0x59,0xd4
+,0x26,0x01,0x1b,0x8e,0xdf,0xad,0x53,0x06
+,0xd1,0xae,0x18,0xdd,0xe2,0xb2,0x3a,0xcb
+,0xd7,0x88,0x38,0x8e,0xac,0x5b,0x29,0xb9
+,0x19,0xd3,0x98,0xf9,0x18,0x03,0xcf,0x48
+,0x82,0x86,0x66,0x0b,0x1b,0x69,0x0f,0xc9
+,0xeb,0x38,0x88,0x7a,0x26,0x1a,0x05,0x4c
+,0x92,0xd7,0x24,0xd4,0x96,0xf2,0xac,0x52
+,0x2d,0xa3,0x47,0xd5,0x52,0xf6,0x3f,0xfe
+,0xce,0x84,0x06,0x70,0xa6,0xaa,0x3e,0xa2
+,0xf2,0xb6,0x56,0x34,0x18,0x57,0xa2,0xe4
+,0x81,0x6d,0xe7,0xca,0xf0,0x6a,0xd3,0xc7
+,0x91,0x6b,0x02,0x83,0x41,0x7c,0x15,0xef
+,0x6b,0x9a,0x64,0x5e,0xe3,0xd0,0x3c,0xe5
+,0xb1,0xeb,0x7b,0x5d,0x86,0xfb,0xcb,0xe6
+,0x77,0x49,0xcd,0xa3,0x65,0xdc,0xf7,0xb9
+,0x9c,0xb8,0xe4,0x0b,0x5f,0x93,0xcf,0xcc
+,0x30,0x1a,0x32,0x1c,0xce,0x1c,0x63,0x95
+,0xa5,0xf9,0xea,0xe1,0x74,0x8b,0x9e,0xe9
+,0x2b,0xa9,0x30,0x7b,0xa0,0x18,0x1f,0x0e
+,0x18,0x0b,0xe5,0x5b,0xa9,0xd3,0xd1,0x6c
+,0x1e,0x07,0x67,0x8f,0x91,0x4b,0xa9,0x8a
+,0xbc,0xd2,0x66,0xaa,0x93,0x01,0x88,0xb2
+,0x91,0xfa,0x31,0x5c,0xd5,0xa6,0xc1,0x52
+,0x08,0x09,0xcd,0x0a,0x63,0xa2,0xd3,0x22
+,0xa6,0xe8,0xa1,0xd9,0x39,0x06,0x97,0xf5
+,0x6e,0x8d,0x02,0x90,0x8c,0x14,0x7b,0x3f
+,0x80,0xcd,0x1b,0x9c,0xba,0xc4,0x58,0x72
+,0x23,0xaf,0xb6,0x56,0x9f,0xc6,0x7a,0x42
+,0x33,0x29,0x07,0x3f,0x82,0xc9,0xe6,0x1f
+,0x05,0x0d,0xcd,0x4c,0x28,0x36,0x8b,0xd3
+,0xc8,0x3e,0x1c,0xc6,0x88,0xef,0x5e,0xee
+,0x89,0x64,0xe9,0x1d,0xeb,0xda,0x89,0x7e
+,0x32,0xa6,0x69,0xd1,0xdd,0xcc,0x88,0x9f
+,0xd1,0xd0,0xc9,0x66,0x21,0xdc,0x06,0x67
+,0xc5,0x94,0x7a,0x9a,0x6d,0x62,0x4c,0x7d
+,0xcc,0xe0,0x64,0x80,0xb2,0x9e,0x47,0x8e
+,0xa3,0x02,0x03,0x01,0x00,0x01,0xa3,0x42
+,0x30,0x40,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0x88,0x68
+,0xbf,0xe0,0x8e,0x35,0xc4,0x3b,0x38,0x6b
+,0x62,0xf7,0x28,0x3b,0x84,0x81,0xc8,0x0c
+,0xd7,0x4d,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x02,0x01,0x00,0x3b,0x02
+,0x8d,0xcb,0x3c,0x30,0xe8,0x6e,0xa0,0xad
+,0xf2,0x73,0xb3,0x5f,0x9e,0x25,0x13,0x04
+,0x05,0xd3,0xf6,0xe3,0x8b,0xbb,0x0b,0x79
+,0xce,0x53,0xde,0xe4,0x96,0xc5,0xd1,0xaf
+,0x73,0xbc,0xd5,0xc3,0xd0,0x40,0x55,0x7c
+,0x40,0x7f,0xcd,0x1b,0x5f,0x09,0xd5,0xf2
+,0x7c,0x9f,0x68,0x1d,0xbb,0x5d,0xce,0x7a
+,0x39,0xc2,0x8c,0xd6,0x98,0x7b,0xc5,0x83
+,0x55,0xa8,0xd5,0x7d,0x40,0xca,0xe0,0x1e
+,0xf7,0x89,0x5e,0x63,0x5d,0xa1,0x13,0xc2
+,0x5d,0x8a,0xb6,0x8a,0x7c,0x00,0xf3,0x23
+,0xc3,0xed,0x85,0x5f,0x71,0x76,0xf0,0x68
+,0x63,0xaa,0x45,0x21,0x39,0x48,0x61,0x78
+,0x36,0xdc,0xf1,0x43,0x93,0xd4,0x25,0xc7
+,0xf2,0x80,0x65,0xe1,0x53,0x02,0x75,0x51
+,0xfc,0x7a,0x3a,0xef,0x37,0xab,0x84,0x28
+,0x57,0x0c,0xd8,0xd4,0xd4,0x99,0x56,0x6c
+,0xe3,0xa2,0xfe,0x59,0x84,0xb4,0x31,0xe8
+,0x33,0xf8,0x64,0x94,0x94,0x51,0x97,0xab
+,0x39,0xc5,0x4b,0xed,0xda,0xdd,0x80,0x0b
+,0x6f,0x7c,0x29,0x0d,0xc4,0x8e,0x8a,0x72
+,0x0d,0xe7,0x53,0x14,0xb2,0x60,0x41,0x3d
+,0x84,0x91,0x31,0x68,0x3d,0x27,0x44,0xdb
+,0xe5,0xde,0xf4,0xfa,0x63,0x45,0xc8,0x4c
+,0x3e,0x98,0xf5,0x3f,0x41,0xba,0x4e,0xcb
+,0x37,0x0d,0xba,0x66,0x98,0xf1,0xdd,0xcb
+,0x9f,0x5c,0xf7,0x54,0x36,0x82,0x6b,0x2c
+,0xbc,0x13,0x61,0x97,0x42,0xf8,0x78,0xbb
+,0xcc,0xc8,0xa2,0x9f,0xca,0xf0,0x68,0xbd
+,0x6b,0x1d,0xb2,0xdf,0x8d,0x6f,0x07,0x9d
+,0xda,0x8e,0x67,0xc7,0x47,0x1e,0xca,0xb9
+,0xbf,0x2a,0x42,0x91,0xb7,0x63,0x53,0x66
+,0xf1,0x42,0xa3,0xe1,0xf4,0x5a,0x4d,0x58
+,0x6b,0xb5,0xe4,0xa4,0x33,0xad,0x5c,0x70
+,0x1d,0xdc,0xe0,0xf2,0xeb,0x73,0x14,0x91
+,0x9a,0x03,0xc1,0xea,0x00,0x65,0xbc,0x07
+,0xfc,0xcf,0x12,0x11,0x22,0x2c,0xae,0xa0
+,0xbd,0x3a,0xe0,0xa2,0x2a,0xd8,0x59,0xe9
+,0x29,0xd3,0x18,0x35,0xa4,0xac,0x11,0x5f
+,0x19,0xb5,0xb5,0x1b,0xff,0x22,0x4a,0x5c
+,0xc6,0x7a,0xe4,0x17,0xef,0x20,0xa9,0xa7
+,0xf4,0x3f,0xad,0x8a,0xa7,0x9a,0x04,0x25
+,0x9d,0x0e,0xca,0x37,0xe6,0x50,0xfd,0x8c
+,0x42,0x29,0x04,0x9a,0xec,0xb9,0xcf,0x4b
+,0x72,0xbd,0xe2,0x08,0x36,0xaf,0x23,0x2f
+,0x62,0xe5,0xca,0x01,0xd3,0x70,0xdb,0x7c
+,0x82,0x23,0x2c,0x16,0x31,0x0c,0xc6,0x36
+,0x07,0x90,0x7a,0xb1,0x1f,0x67,0x58,0xc4
+,0x3b,0x58,0x59,0x89,0xb0,0x8c,0x8c,0x50
+,0xb3,0xd8,0x86,0xcb,0x68,0xa3,0xc4,0x0a
+,0xe7,0x69,0x4b,0x20,0xce,0xc1,0x1e,0x56
+,0x4b,0x95,0xa9,0x23,0x68,0xd8,0x30,0xd8
+,0xc3,0xeb,0xb0,0x55,0x51,0xcd,0xe5,0xfd
+,0x2b,0xb8,0xf5,0xbb,0x11,0x9f,0x53,0x54
+,0xf6,0x34,0x19,0x8c,0x79,0x09,0x36,0xca
+,0x61,0x17,0x25,0x17,0x0b,0x82,0x98,0x73
+,0x0c,0x77,0x74,0xc3,0xd5,0x0d,0xc7,0xa8
+,0x12,0x4c,0xc7,0xa7,0x54,0x71,0x47,0x2e
+,0x2c,0x1a,0x7d,0xc9,0xe3,0x2b,0x3b,0x48
+,0xde,0x27,0x84,0xa7,0x63,0x36,0xb3,0x7d
+,0x8f,0xa0,0x64,0x39,0x24,0x0d,0x3d,0x7b
+,0x87,0xaf,0x66,0x5c,0x74,0x1b,0x4b,0x73
+,0xb2,0xe5,0x8c,0xf0,0x86,0x99,0xb8,0xe5
+,0xc5,0xdf,0x84,0xc1,0xb7,0xeb};
+const unsigned int NptTlsTrustAnchor_Base_0117_Size = 1422;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0118.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0118.cpp
new file mode 100644
index 0000000..bc7aab1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0118.cpp
@@ -0,0 +1,162 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Network Solutions Certificate Authority */
+const unsigned char NptTlsTrustAnchor_Base_0118_Data[1002] = {
+0x30,0x82,0x03,0xe6,0x30,0x82,0x02,0xce
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x57
+,0xcb,0x33,0x6f,0xc2,0x5c,0x16,0xe6,0x47
+,0x16,0x17,0xe3,0x90,0x31,0x68,0xe0,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x62
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x55,0x53,0x31,0x21,0x30
+,0x1f,0x06,0x03,0x55,0x04,0x0a,0x13,0x18
+,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b,0x20
+,0x53,0x6f,0x6c,0x75,0x74,0x69,0x6f,0x6e
+,0x73,0x20,0x4c,0x2e,0x4c,0x2e,0x43,0x2e
+,0x31,0x30,0x30,0x2e,0x06,0x03,0x55,0x04
+,0x03,0x13,0x27,0x4e,0x65,0x74,0x77,0x6f
+,0x72,0x6b,0x20,0x53,0x6f,0x6c,0x75,0x74
+,0x69,0x6f,0x6e,0x73,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x30,0x1e,0x17,0x0d,0x30,0x36
+,0x31,0x32,0x30,0x31,0x30,0x30,0x30,0x30
+,0x30,0x30,0x5a,0x17,0x0d,0x32,0x39,0x31
+,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35
+,0x39,0x5a,0x30,0x62,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x21,0x30,0x1f,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x18,0x4e,0x65,0x74,0x77
+,0x6f,0x72,0x6b,0x20,0x53,0x6f,0x6c,0x75
+,0x74,0x69,0x6f,0x6e,0x73,0x20,0x4c,0x2e
+,0x4c,0x2e,0x43,0x2e,0x31,0x30,0x30,0x2e
+,0x06,0x03,0x55,0x04,0x03,0x13,0x27,0x4e
+,0x65,0x74,0x77,0x6f,0x72,0x6b,0x20,0x53
+,0x6f,0x6c,0x75,0x74,0x69,0x6f,0x6e,0x73
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xe4
+,0xbc,0x7e,0x92,0x30,0x6d,0xc6,0xd8,0x8e
+,0x2b,0x0b,0xbc,0x46,0xce,0xe0,0x27,0x96
+,0xde,0xde,0xf9,0xfa,0x12,0xd3,0x3c,0x33
+,0x73,0xb3,0x04,0x2f,0xbc,0x71,0x8c,0xe5
+,0x9f,0xb6,0x22,0x60,0x3e,0x5f,0x5d,0xce
+,0x09,0xff,0x82,0x0c,0x1b,0x9a,0x51,0x50
+,0x1a,0x26,0x89,0xdd,0xd5,0x61,0x5d,0x19
+,0xdc,0x12,0x0f,0x2d,0x0a,0xa2,0x43,0x5d
+,0x17,0xd0,0x34,0x92,0x20,0xea,0x73,0xcf
+,0x38,0x2c,0x06,0x26,0x09,0x7a,0x72,0xf7
+,0xfa,0x50,0x32,0xf8,0xc2,0x93,0xd3,0x69
+,0xa2,0x23,0xce,0x41,0xb1,0xcc,0xe4,0xd5
+,0x1f,0x36,0xd1,0x8a,0x3a,0xf8,0x8c,0x63
+,0xe2,0x14,0x59,0x69,0xed,0x0d,0xd3,0x7f
+,0x6b,0xe8,0xb8,0x03,0xe5,0x4f,0x6a,0xe5
+,0x98,0x63,0x69,0x48,0x05,0xbe,0x2e,0xff
+,0x33,0xb6,0xe9,0x97,0x59,0x69,0xf8,0x67
+,0x19,0xae,0x93,0x61,0x96,0x44,0x15,0xd3
+,0x72,0xb0,0x3f,0xbc,0x6a,0x7d,0xec,0x48
+,0x7f,0x8d,0xc3,0xab,0xaa,0x71,0x2b,0x53
+,0x69,0x41,0x53,0x34,0xb5,0xb0,0xb9,0xc5
+,0x06,0x0a,0xc4,0xb0,0x45,0xf5,0x41,0x5d
+,0x6e,0x89,0x45,0x7b,0x3d,0x3b,0x26,0x8c
+,0x74,0xc2,0xe5,0xd2,0xd1,0x7d,0xb2,0x11
+,0xd4,0xfb,0x58,0x32,0x22,0x9a,0x80,0xc9
+,0xdc,0xfd,0x0c,0xe9,0x7f,0x5e,0x03,0x97
+,0xce,0x3b,0x00,0x14,0x87,0x27,0x70,0x38
+,0xa9,0x8e,0x6e,0xb3,0x27,0x76,0x98,0x51
+,0xe0,0x05,0xe3,0x21,0xab,0x1a,0xd5,0x85
+,0x22,0x3c,0x29,0xb5,0x9a,0x16,0xc5,0x80
+,0xa8,0xf4,0xbb,0x6b,0x30,0x8f,0x2f,0x46
+,0x02,0xa2,0xb1,0x0c,0x22,0xe0,0xd3,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x81,0x97,0x30
+,0x81,0x94,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0x21,0x30,0xc9
+,0xfb,0x00,0xd7,0x4e,0x98,0xda,0x87,0xaa
+,0x2a,0xd0,0xa7,0x2e,0xb1,0x40,0x31,0xa7
+,0x4c,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01
+,0x01,0xff,0x30,0x52,0x06,0x03,0x55,0x1d
+,0x1f,0x04,0x4b,0x30,0x49,0x30,0x47,0xa0
+,0x45,0xa0,0x43,0x86,0x41,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e
+,0x6e,0x65,0x74,0x73,0x6f,0x6c,0x73,0x73
+,0x6c,0x2e,0x63,0x6f,0x6d,0x2f,0x4e,0x65
+,0x74,0x77,0x6f,0x72,0x6b,0x53,0x6f,0x6c
+,0x75,0x74,0x69,0x6f,0x6e,0x73,0x43,0x65
+,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74
+,0x65,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x2e,0x63,0x72,0x6c,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01
+,0x01,0x00,0xbb,0xae,0x4b,0xe7,0xb7,0x57
+,0xeb,0x7f,0xaa,0x2d,0xb7,0x73,0x47,0x85
+,0x6a,0xc1,0xe4,0xa5,0x1d,0xe4,0xe7,0x3c
+,0xe9,0xf4,0x59,0x65,0x77,0xb5,0x7a,0x5b
+,0x5a,0x8d,0x25,0x36,0xe0,0x7a,0x97,0x2e
+,0x38,0xc0,0x57,0x60,0x83,0x98,0x06,0x83
+,0x9f,0xb9,0x76,0x7a,0x6e,0x50,0xe0,0xba
+,0x88,0x2c,0xfc,0x45,0xcc,0x18,0xb0,0x99
+,0x95,0x51,0x0e,0xec,0x1d,0xb8,0x88,0xff
+,0x87,0x50,0x1c,0x82,0xc2,0xe3,0xe0,0x32
+,0x80,0xbf,0xa0,0x0b,0x47,0xc8,0xc3,0x31
+,0xef,0x99,0x67,0x32,0x80,0x4f,0x17,0x21
+,0x79,0x0c,0x69,0x5c,0xde,0x5e,0x34,0xae
+,0x02,0xb5,0x26,0xea,0x50,0xdf,0x7f,0x18
+,0x65,0x2c,0xc9,0xf2,0x63,0xe1,0xa9,0x07
+,0xfe,0x7c,0x71,0x1f,0x6b,0x33,0x24,0x6a
+,0x1e,0x05,0xf7,0x05,0x68,0xc0,0x6a,0x12
+,0xcb,0x2e,0x5e,0x61,0xcb,0xae,0x28,0xd3
+,0x7e,0xc2,0xb4,0x66,0x91,0x26,0x5f,0x3c
+,0x2e,0x24,0x5f,0xcb,0x58,0x0f,0xeb,0x28
+,0xec,0xaf,0x11,0x96,0xf3,0xdc,0x7b,0x6f
+,0xc0,0xa7,0x88,0xf2,0x53,0x77,0xb3,0x60
+,0x5e,0xae,0xae,0x28,0xda,0x35,0x2c,0x6f
+,0x34,0x45,0xd3,0x26,0xe1,0xde,0xec,0x5b
+,0x4f,0x27,0x6b,0x16,0x7c,0xbd,0x44,0x04
+,0x18,0x82,0xb3,0x89,0x79,0x17,0x10,0x71
+,0x3d,0x7a,0xa2,0x16,0x4e,0xf5,0x01,0xcd
+,0xa4,0x6c,0x65,0x68,0xa1,0x49,0x76,0x5c
+,0x43,0xc9,0xd8,0xbc,0x36,0x67,0x6c,0xa5
+,0x94,0xb5,0xd4,0xcc,0xb9,0xbd,0x6a,0x35
+,0x56,0x21,0xde,0xd8,0xc3,0xeb,0xfb,0xcb
+,0xa4,0x60,0x4c,0xb0,0x55,0xa0,0xa0,0x7b
+,0x57,0xb2};
+const unsigned int NptTlsTrustAnchor_Base_0118_Size = 1002;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0119.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0119.cpp
new file mode 100644
index 0000000..7bd433f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0119.cpp
@@ -0,0 +1,189 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* WellsSecure Public Root Certificate Authority */
+const unsigned char NptTlsTrustAnchor_Base_0119_Data[1217] = {
+0x30,0x82,0x04,0xbd,0x30,0x82,0x03,0xa5
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x81,0x85,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x20,0x30,0x1e,0x06,0x03,0x55,0x04,0x0a
+,0x0c,0x17,0x57,0x65,0x6c,0x6c,0x73,0x20
+,0x46,0x61,0x72,0x67,0x6f,0x20,0x57,0x65
+,0x6c,0x6c,0x73,0x53,0x65,0x63,0x75,0x72
+,0x65,0x31,0x1c,0x30,0x1a,0x06,0x03,0x55
+,0x04,0x0b,0x0c,0x13,0x57,0x65,0x6c,0x6c
+,0x73,0x20,0x46,0x61,0x72,0x67,0x6f,0x20
+,0x42,0x61,0x6e,0x6b,0x20,0x4e,0x41,0x31
+,0x36,0x30,0x34,0x06,0x03,0x55,0x04,0x03
+,0x0c,0x2d,0x57,0x65,0x6c,0x6c,0x73,0x53
+,0x65,0x63,0x75,0x72,0x65,0x20,0x50,0x75
+,0x62,0x6c,0x69,0x63,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x30
+,0x1e,0x17,0x0d,0x30,0x37,0x31,0x32,0x31
+,0x33,0x31,0x37,0x30,0x37,0x35,0x34,0x5a
+,0x17,0x0d,0x32,0x32,0x31,0x32,0x31,0x34
+,0x30,0x30,0x30,0x37,0x35,0x34,0x5a,0x30
+,0x81,0x85,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x20,0x30,0x1e,0x06,0x03,0x55,0x04,0x0a
+,0x0c,0x17,0x57,0x65,0x6c,0x6c,0x73,0x20
+,0x46,0x61,0x72,0x67,0x6f,0x20,0x57,0x65
+,0x6c,0x6c,0x73,0x53,0x65,0x63,0x75,0x72
+,0x65,0x31,0x1c,0x30,0x1a,0x06,0x03,0x55
+,0x04,0x0b,0x0c,0x13,0x57,0x65,0x6c,0x6c
+,0x73,0x20,0x46,0x61,0x72,0x67,0x6f,0x20
+,0x42,0x61,0x6e,0x6b,0x20,0x4e,0x41,0x31
+,0x36,0x30,0x34,0x06,0x03,0x55,0x04,0x03
+,0x0c,0x2d,0x57,0x65,0x6c,0x6c,0x73,0x53
+,0x65,0x63,0x75,0x72,0x65,0x20,0x50,0x75
+,0x62,0x6c,0x69,0x63,0x20,0x52,0x6f,0x6f
+,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66
+,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x30
+,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01
+,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30
+,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00
+,0xee,0x6f,0xb4,0xbd,0x79,0xe2,0x8f,0x08
+,0x21,0x9e,0x38,0x04,0x41,0x25,0xef,0xab
+,0x5b,0x1c,0x53,0x92,0xac,0x6d,0x9e,0xdd
+,0xc2,0xc4,0x2e,0x45,0x94,0x03,0x35,0x88
+,0x67,0x74,0x57,0xe3,0xdf,0x8c,0xb8,0xa7
+,0x76,0x8f,0x3b,0xf7,0xa8,0xc4,0xdb,0x29
+,0x63,0x0e,0x91,0x68,0x36,0x8a,0x97,0x8e
+,0x8a,0x71,0x68,0x09,0x07,0xe4,0xe8,0xd4
+,0x0e,0x4f,0xf8,0xd6,0x2b,0x4c,0xa4,0x16
+,0xf9,0xef,0x43,0x98,0x8f,0xb3,0x9e,0x52
+,0xdf,0x6d,0x91,0x39,0x8f,0x38,0xbd,0x77
+,0x8b,0x43,0x63,0xeb,0xb7,0x93,0xfc,0x30
+,0x4c,0x1c,0x01,0x93,0xb6,0x13,0xfb,0xf7
+,0xa1,0x1f,0xbf,0x25,0xe1,0x74,0x37,0x2c
+,0x1e,0xa4,0x5e,0x3c,0x68,0xf8,0x4b,0xbf
+,0x0d,0xb9,0x1e,0x2e,0x36,0xe8,0xa9,0xe4
+,0xa7,0xf8,0x0f,0xcb,0x82,0x75,0x7c,0x35
+,0x2d,0x22,0xd6,0xc2,0xbf,0x0b,0xf3,0xb4
+,0xfc,0x6c,0x95,0x61,0x1e,0x57,0xd7,0x04
+,0x81,0x32,0x83,0x52,0x79,0xe6,0x83,0x63
+,0xcf,0xb7,0xcb,0x63,0x8b,0x11,0xe2,0xbd
+,0x5e,0xeb,0xf6,0x8d,0xed,0x95,0x72,0x28
+,0xb4,0xac,0x12,0x62,0xe9,0x4a,0x33,0xe6
+,0x83,0x32,0xae,0x05,0x75,0x95,0xbd,0x84
+,0x95,0xdb,0x2a,0x5c,0x9b,0x8e,0x2e,0x0c
+,0xb8,0x81,0x2b,0x41,0xe6,0x38,0x56,0x9f
+,0x49,0x9b,0x6c,0x76,0xfa,0x8a,0x5d,0xf7
+,0x01,0x79,0x81,0x7c,0xc1,0x83,0x40,0x05
+,0xfe,0x71,0xfd,0x0c,0x3f,0xcc,0x4e,0x60
+,0x09,0x0e,0x65,0x47,0x10,0x2f,0x01,0xc0
+,0x05,0x3f,0x8f,0xf8,0xb3,0x41,0xef,0x5a
+,0x42,0x7e,0x59,0xef,0xd2,0x97,0x0c,0x65
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01
+,0x34,0x30,0x82,0x01,0x30,0x30,0x0f,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x39
+,0x06,0x03,0x55,0x1d,0x1f,0x04,0x32,0x30
+,0x30,0x30,0x2e,0xa0,0x2c,0xa0,0x2a,0x86
+,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f
+,0x63,0x72,0x6c,0x2e,0x70,0x6b,0x69,0x2e
+,0x77,0x65,0x6c,0x6c,0x73,0x66,0x61,0x72
+,0x67,0x6f,0x2e,0x63,0x6f,0x6d,0x2f,0x77
+,0x73,0x70,0x72,0x63,0x61,0x2e,0x63,0x72
+,0x6c,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0xc6,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0x26,0x95,0x19,0x10
+,0xd9,0xe8,0xa1,0x97,0x91,0xff,0xdc,0x19
+,0xd9,0xb5,0x04,0x3e,0xd2,0x73,0x0a,0x6a
+,0x30,0x81,0xb2,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x81,0xaa,0x30,0x81,0xa7,0x80,0x14
+,0x26,0x95,0x19,0x10,0xd9,0xe8,0xa1,0x97
+,0x91,0xff,0xdc,0x19,0xd9,0xb5,0x04,0x3e
+,0xd2,0x73,0x0a,0x6a,0xa1,0x81,0x8b,0xa4
+,0x81,0x88,0x30,0x81,0x85,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x55,0x53,0x31,0x20,0x30,0x1e,0x06,0x03
+,0x55,0x04,0x0a,0x0c,0x17,0x57,0x65,0x6c
+,0x6c,0x73,0x20,0x46,0x61,0x72,0x67,0x6f
+,0x20,0x57,0x65,0x6c,0x6c,0x73,0x53,0x65
+,0x63,0x75,0x72,0x65,0x31,0x1c,0x30,0x1a
+,0x06,0x03,0x55,0x04,0x0b,0x0c,0x13,0x57
+,0x65,0x6c,0x6c,0x73,0x20,0x46,0x61,0x72
+,0x67,0x6f,0x20,0x42,0x61,0x6e,0x6b,0x20
+,0x4e,0x41,0x31,0x36,0x30,0x34,0x06,0x03
+,0x55,0x04,0x03,0x0c,0x2d,0x57,0x65,0x6c
+,0x6c,0x73,0x53,0x65,0x63,0x75,0x72,0x65
+,0x20,0x50,0x75,0x62,0x6c,0x69,0x63,0x20
+,0x52,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65
+,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x74,0x79,0x82,0x01,0x01,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0xb9,0x15,0xb1,0x44,0x91,0xcc,0x23
+,0xc8,0x2b,0x4d,0x77,0xe3,0xf8,0x9a,0x7b
+,0x27,0x0d,0xcd,0x72,0xbb,0x99,0x00,0xca
+,0x7c,0x66,0x19,0x50,0xc6,0xd5,0x98,0xed
+,0xab,0xbf,0x03,0x5a,0xe5,0x4d,0xe5,0x1e
+,0xc8,0x4f,0x71,0x97,0x86,0xd5,0xe3,0x1d
+,0xfd,0x90,0xc9,0x3c,0x75,0x77,0x57,0x7a
+,0x7d,0xf8,0xde,0xf4,0xd4,0xd5,0xf7,0x95
+,0xe6,0x74,0x6e,0x1d,0x3c,0xae,0x7c,0x9d
+,0xdb,0x02,0x03,0x05,0x2c,0x71,0x4b,0x25
+,0x3e,0x07,0xe3,0x5e,0x9a,0xf5,0x66,0x17
+,0x29,0x88,0x1a,0x38,0x9f,0xcf,0xaa,0x41
+,0x03,0x84,0x97,0x6b,0x93,0x38,0x7a,0xca
+,0x30,0x44,0x1b,0x24,0x44,0x33,0xd0,0xe4
+,0xd1,0xdc,0x28,0x38,0xf4,0x13,0x43,0x35
+,0x35,0x29,0x63,0xa8,0x7c,0xa2,0xb5,0xad
+,0x38,0xa4,0xed,0xad,0xfd,0xc6,0x9a,0x1f
+,0xff,0x97,0x73,0xfe,0xfb,0xb3,0x35,0xa7
+,0x93,0x86,0xc6,0x76,0x91,0x00,0xe6,0xac
+,0x51,0x16,0xc4,0x27,0x32,0x5c,0xdb,0x73
+,0xda,0xa5,0x93,0x57,0x8e,0x3e,0x6d,0x35
+,0x26,0x08,0x59,0xd5,0xe7,0x44,0xd7,0x76
+,0x20,0x63,0xe7,0xac,0x13,0x67,0xc3,0x6d
+,0xb1,0x70,0x46,0x7c,0xd5,0x96,0x11,0x3d
+,0x89,0x6f,0x5d,0xa8,0xa1,0xeb,0x8d,0x0a
+,0xda,0xc3,0x1d,0x33,0x6c,0xa3,0xea,0x67
+,0x19,0x9a,0x99,0x7f,0x4b,0x3d,0x83,0x51
+,0x2a,0x1d,0xca,0x2f,0x86,0x0c,0xa2,0x7e
+,0x10,0x2d,0x2b,0xd4,0x16,0x95,0x0b,0x07
+,0xaa,0x2e,0x14,0x92,0x49,0xb7,0x29,0x6f
+,0xd8,0x6d,0x31,0x7d,0xf5,0xfc,0xa1,0x10
+,0x07,0x87,0xce,0x2f,0x59,0xdc,0x3e,0x58
+,0xdb};
+const unsigned int NptTlsTrustAnchor_Base_0119_Size = 1217;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0120.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0120.cpp
new file mode 100644
index 0000000..cd01b4b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0120.cpp
@@ -0,0 +1,165 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* IGC/A */
+const unsigned char NptTlsTrustAnchor_Base_0120_Data[1030] = {
+0x30,0x82,0x04,0x02,0x30,0x82,0x02,0xea
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x05,0x39
+,0x11,0x45,0x10,0x94,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x30,0x81,0x85,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x46,0x52,0x31,0x0f,0x30,0x0d,0x06
+,0x03,0x55,0x04,0x08,0x13,0x06,0x46,0x72
+,0x61,0x6e,0x63,0x65,0x31,0x0e,0x30,0x0c
+,0x06,0x03,0x55,0x04,0x07,0x13,0x05,0x50
+,0x61,0x72,0x69,0x73,0x31,0x10,0x30,0x0e
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x07,0x50
+,0x4d,0x2f,0x53,0x47,0x44,0x4e,0x31,0x0e
+,0x30,0x0c,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x05,0x44,0x43,0x53,0x53,0x49,0x31,0x0e
+,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13
+,0x05,0x49,0x47,0x43,0x2f,0x41,0x31,0x23
+,0x30,0x21,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x14,0x69
+,0x67,0x63,0x61,0x40,0x73,0x67,0x64,0x6e
+,0x2e,0x70,0x6d,0x2e,0x67,0x6f,0x75,0x76
+,0x2e,0x66,0x72,0x30,0x1e,0x17,0x0d,0x30
+,0x32,0x31,0x32,0x31,0x33,0x31,0x34,0x32
+,0x39,0x32,0x33,0x5a,0x17,0x0d,0x32,0x30
+,0x31,0x30,0x31,0x37,0x31,0x34,0x32,0x39
+,0x32,0x32,0x5a,0x30,0x81,0x85,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x46,0x52,0x31,0x0f,0x30,0x0d,0x06
+,0x03,0x55,0x04,0x08,0x13,0x06,0x46,0x72
+,0x61,0x6e,0x63,0x65,0x31,0x0e,0x30,0x0c
+,0x06,0x03,0x55,0x04,0x07,0x13,0x05,0x50
+,0x61,0x72,0x69,0x73,0x31,0x10,0x30,0x0e
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x07,0x50
+,0x4d,0x2f,0x53,0x47,0x44,0x4e,0x31,0x0e
+,0x30,0x0c,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x05,0x44,0x43,0x53,0x53,0x49,0x31,0x0e
+,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13
+,0x05,0x49,0x47,0x43,0x2f,0x41,0x31,0x23
+,0x30,0x21,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x09,0x01,0x16,0x14,0x69
+,0x67,0x63,0x61,0x40,0x73,0x67,0x64,0x6e
+,0x2e,0x70,0x6d,0x2e,0x67,0x6f,0x75,0x76
+,0x2e,0x66,0x72,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xb2,0x1f,0xd1,0xd0
+,0x62,0xc5,0x33,0x3b,0xc0,0x04,0x86,0x88
+,0xb3,0xdc,0xf8,0x88,0xf7,0xfd,0xdf,0x43
+,0xdf,0x7a,0x8d,0x9a,0x49,0x5c,0xf6,0x4e
+,0xaa,0xcc,0x1c,0xb9,0xa1,0xeb,0x27,0x89
+,0xf2,0x46,0xe9,0x3b,0x4a,0x71,0xd5,0x1d
+,0x8e,0x2d,0xcf,0xe6,0xad,0xab,0x63,0x50
+,0xc7,0x54,0x0b,0x6e,0x12,0xc9,0x90,0x36
+,0xc6,0xd8,0x2f,0xda,0x91,0xaa,0x68,0xc5
+,0x72,0xfe,0x17,0x0a,0xb2,0x17,0x7e,0x79
+,0xb5,0x32,0x88,0x70,0xca,0x70,0xc0,0x96
+,0x4a,0x8e,0xe4,0x55,0xcd,0x1d,0x27,0x94
+,0xbf,0xce,0x72,0x2a,0xec,0x5c,0xf9,0x73
+,0x20,0xfe,0xbd,0xf7,0x2e,0x89,0x67,0xb8
+,0xbb,0x47,0x73,0x12,0xf7,0xd1,0x35,0x69
+,0x3a,0xf2,0x0a,0xb9,0xae,0xff,0x46,0x42
+,0x46,0xa2,0xbf,0xa1,0x85,0x1a,0xf9,0xbf
+,0xe4,0xff,0x49,0x85,0xf7,0xa3,0x70,0x86
+,0x32,0x1c,0x5d,0x9f,0x60,0xf7,0xa9,0xad
+,0xa5,0xff,0xcf,0xd1,0x34,0xf9,0x7d,0x5b
+,0x17,0xc6,0xdc,0xd6,0x0e,0x28,0x6b,0xc2
+,0xdd,0xf1,0xf5,0x33,0x68,0x9d,0x4e,0xfc
+,0x87,0x7c,0x36,0x12,0xd6,0xa3,0x80,0xe8
+,0x43,0x0d,0x55,0x61,0x94,0xea,0x64,0x37
+,0x47,0xea,0x77,0xca,0xd0,0xb2,0x58,0x05
+,0xc3,0x5d,0x7e,0xb1,0xa8,0x46,0x90,0x31
+,0x56,0xce,0x70,0x2a,0x96,0xb2,0x30,0xb8
+,0x77,0xe6,0x79,0xc0,0xbd,0x29,0x3b,0xfd
+,0x94,0x77,0x4c,0xbd,0x20,0xcd,0x41,0x25
+,0xe0,0x2e,0xc7,0x1b,0xbb,0xee,0xa4,0x04
+,0x41,0xd2,0x5d,0xad,0x12,0x6a,0x8a,0x9b
+,0x47,0xfb,0xc9,0xdd,0x46,0x40,0xe1,0x9d
+,0x3c,0x33,0xd0,0xb5,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x77,0x30,0x75,0x30,0x0f,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x0b
+,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03
+,0x02,0x01,0x46,0x30,0x15,0x06,0x03,0x55
+,0x1d,0x20,0x04,0x0e,0x30,0x0c,0x30,0x0a
+,0x06,0x08,0x2a,0x81,0x7a,0x01,0x79,0x01
+,0x01,0x01,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0xa3,0x05,0x2f
+,0x18,0x60,0x50,0xc2,0x89,0x0a,0xdd,0x2b
+,0x21,0x4f,0xff,0x8e,0x4e,0xa8,0x30,0x31
+,0x36,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23
+,0x04,0x18,0x30,0x16,0x80,0x14,0xa3,0x05
+,0x2f,0x18,0x60,0x50,0xc2,0x89,0x0a,0xdd
+,0x2b,0x21,0x4f,0xff,0x8e,0x4e,0xa8,0x30
+,0x31,0x36,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x05,0xdc
+,0x26,0xd8,0xfa,0x77,0x15,0x44,0x68,0xfc
+,0x2f,0x66,0x3a,0x74,0xe0,0x5d,0xe4,0x29
+,0xff,0x06,0x07,0x13,0x84,0x4a,0xab,0xcf
+,0x6d,0xa0,0x1f,0x51,0x94,0xf8,0x49,0xcb
+,0x74,0x36,0x14,0xbc,0x15,0xdd,0xdb,0x89
+,0x2f,0xdd,0x8f,0xa0,0x5d,0x7c,0xf5,0x12
+,0xeb,0x9f,0x9e,0x38,0xa4,0x47,0xcc,0xb3
+,0x96,0xd9,0xbe,0x9c,0x25,0xab,0x03,0x7e
+,0x33,0x0f,0x95,0x81,0x0d,0xfd,0x16,0xe0
+,0x88,0xbe,0x37,0xf0,0x6c,0x5d,0xd0,0x31
+,0x9b,0x32,0x2b,0x5d,0x17,0x65,0x93,0x98
+,0x60,0xbc,0x6e,0x8f,0xb1,0xa8,0x3c,0x1e
+,0xd9,0x1c,0xf3,0xa9,0x26,0x42,0xf9,0x64
+,0x1d,0xc2,0xe7,0x92,0xf6,0xf4,0x1e,0x5a
+,0xaa,0x19,0x52,0x5d,0xaf,0xe8,0xa2,0xf7
+,0x60,0xa0,0xf6,0x8d,0xf0,0x89,0xf5,0x6e
+,0xe0,0x0a,0x05,0x01,0x95,0xc9,0x8b,0x20
+,0x0a,0xba,0x5a,0xfc,0x9a,0x2c,0x3c,0xbd
+,0xc3,0xb7,0xc9,0x5d,0x78,0x25,0x05,0x3f
+,0x56,0x14,0x9b,0x0c,0xda,0xfb,0x3a,0x48
+,0xfe,0x97,0x69,0x5e,0xca,0x10,0x86,0xf7
+,0x4e,0x96,0x04,0x08,0x4d,0xec,0xb0,0xbe
+,0x5d,0xdc,0x3b,0x8e,0x4f,0xc1,0xfd,0x9a
+,0x36,0x34,0x9a,0x4c,0x54,0x7e,0x17,0x03
+,0x48,0x95,0x08,0x11,0x1c,0x07,0x6f,0x85
+,0x08,0x7e,0x5d,0x4d,0xc4,0x9d,0xdb,0xfb
+,0xae,0xce,0xb2,0xd1,0xb3,0xb8,0x83,0x6c
+,0x1d,0xb2,0xb3,0x79,0xf1,0xd8,0x70,0x99
+,0x7e,0xf0,0x13,0x02,0xce,0x5e,0xdd,0x51
+,0xd3,0xdf,0x36,0x81,0xa1,0x1b,0x78,0x2f
+,0x71,0xb3,0xf1,0x59,0x4c,0x46,0x18,0x28
+,0xab,0x85,0xd2,0x60,0x56,0x5a};
+const unsigned int NptTlsTrustAnchor_Base_0120_Size = 1030;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0121.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0121.cpp
new file mode 100644
index 0000000..5d3fa4c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0121.cpp
@@ -0,0 +1,149 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Security Communication EV RootCA1 */
+const unsigned char NptTlsTrustAnchor_Base_0121_Data[897] = {
+0x30,0x82,0x03,0x7d,0x30,0x82,0x02,0x65
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x00
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x60,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x4a,0x50,0x31,0x25
+,0x30,0x23,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x1c,0x53,0x45,0x43,0x4f,0x4d,0x20,0x54
+,0x72,0x75,0x73,0x74,0x20,0x53,0x79,0x73
+,0x74,0x65,0x6d,0x73,0x20,0x43,0x4f,0x2e
+,0x2c,0x4c,0x54,0x44,0x2e,0x31,0x2a,0x30
+,0x28,0x06,0x03,0x55,0x04,0x0b,0x13,0x21
+,0x53,0x65,0x63,0x75,0x72,0x69,0x74,0x79
+,0x20,0x43,0x6f,0x6d,0x6d,0x75,0x6e,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x45
+,0x56,0x20,0x52,0x6f,0x6f,0x74,0x43,0x41
+,0x31,0x30,0x1e,0x17,0x0d,0x30,0x37,0x30
+,0x36,0x30,0x36,0x30,0x32,0x31,0x32,0x33
+,0x32,0x5a,0x17,0x0d,0x33,0x37,0x30,0x36
+,0x30,0x36,0x30,0x32,0x31,0x32,0x33,0x32
+,0x5a,0x30,0x60,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x4a,0x50
+,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x1c,0x53,0x45,0x43,0x4f,0x4d
+,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x53
+,0x79,0x73,0x74,0x65,0x6d,0x73,0x20,0x43
+,0x4f,0x2e,0x2c,0x4c,0x54,0x44,0x2e,0x31
+,0x2a,0x30,0x28,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x21,0x53,0x65,0x63,0x75,0x72,0x69
+,0x74,0x79,0x20,0x43,0x6f,0x6d,0x6d,0x75
+,0x6e,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x45,0x56,0x20,0x52,0x6f,0x6f,0x74
+,0x43,0x41,0x31,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xbc,0x7f,0xec,0x57
+,0x9b,0x24,0xe0,0xfe,0x9c,0xba,0x42,0x79
+,0xa9,0x88,0x8a,0xfa,0x80,0xe0,0xf5,0x07
+,0x29,0x43,0xea,0x8e,0x0a,0x34,0x36,0x8d
+,0x1c,0xfa,0xa7,0xb5,0x39,0x78,0xff,0x97
+,0x75,0xf7,0x2f,0xe4,0xaa,0x6b,0x04,0x84
+,0x44,0xca,0xa6,0xe2,0x68,0x8e,0xfd,0x55
+,0x50,0x62,0x0f,0xa4,0x71,0x0e,0xce,0x07
+,0x38,0x2d,0x42,0x85,0x50,0xad,0x3c,0x96
+,0x6f,0x8b,0xd5,0xa2,0x0e,0xcf,0xde,0x49
+,0x89,0x3d,0xd6,0x64,0x2e,0x38,0xe5,0x1e
+,0x6c,0xb5,0x57,0x8a,0x9e,0xef,0x48,0x0e
+,0xcd,0x7a,0x69,0x16,0x87,0x44,0xb5,0x90
+,0xe4,0x06,0x9d,0xae,0xa1,0x04,0x97,0x58
+,0x79,0xef,0x20,0x4a,0x82,0x6b,0x8c,0x22
+,0xbf,0xec,0x1f,0x0f,0xe9,0x84,0x71,0xed
+,0xf1,0x0e,0xe4,0xb8,0x18,0x13,0xcc,0x56
+,0x36,0x5d,0xd1,0x9a,0x1e,0x51,0x6b,0x39
+,0x6e,0x60,0x76,0x88,0x34,0x0b,0xf3,0xb3
+,0xd1,0xb0,0x9d,0xca,0x61,0xe2,0x64,0x1d
+,0xc1,0x46,0x07,0xb8,0x63,0xdd,0x1e,0x33
+,0x65,0xb3,0x8e,0x09,0x55,0x52,0x3d,0xb5
+,0xbd,0xff,0x07,0xeb,0xad,0x61,0x55,0x18
+,0x2c,0xa9,0x69,0x98,0x4a,0xaa,0x40,0xc5
+,0x33,0x14,0x65,0x74,0x00,0xf9,0x91,0xde
+,0xaf,0x03,0x48,0xc5,0x40,0x54,0xdc,0x0f
+,0x84,0x90,0x68,0x20,0xc5,0x92,0x96,0xdc
+,0x2e,0xe5,0x02,0x45,0xaa,0xc0,0x5f,0x54
+,0xf8,0x6d,0xea,0x49,0xcf,0x5d,0x6c,0x4b
+,0xaf,0xef,0x9a,0xc2,0x56,0x5c,0xc6,0x35
+,0x56,0x42,0x6a,0x30,0x5f,0xc2,0xab,0xf6
+,0xe2,0x3d,0x3f,0xb3,0xc9,0x11,0x8f,0x31
+,0x4c,0xd7,0x9f,0x49,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x42,0x30,0x40,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0x35,0x4a,0xf5,0x4d,0xaf,0x3f,0xd7,0x82
+,0x38,0xac,0xab,0x71,0x65,0x17,0x75,0x8c
+,0x9d,0x55,0x93,0xe6,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x06,0x30,0x0f,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0xa8,0x87,0xe9,0xec,0xf8,0x40,0x67
+,0x5d,0xc3,0xc1,0x66,0xc7,0x40,0x4b,0x97
+,0xfc,0x87,0x13,0x90,0x5a,0xc4,0xef,0xa0
+,0xca,0x5f,0x8b,0xb7,0xa7,0xb7,0xf1,0xd6
+,0xb5,0x64,0xb7,0x8a,0xb3,0xb8,0x1b,0xcc
+,0xda,0xfb,0xac,0x66,0x88,0x41,0xce,0xe8
+,0xfc,0xe4,0xdb,0x1e,0x88,0xa6,0xed,0x27
+,0x50,0x1b,0x02,0x30,0x24,0x46,0x79,0xfe
+,0x04,0x87,0x70,0x97,0x40,0x73,0xd1,0xc0
+,0xc1,0x57,0x19,0x9a,0x69,0xa5,0x27,0x99
+,0xab,0x9d,0x62,0x84,0xf6,0x51,0xc1,0x2c
+,0xc9,0x23,0x15,0xd8,0x28,0xb7,0xab,0x25
+,0x13,0xb5,0x46,0xe1,0x86,0x02,0xff,0x26
+,0x8c,0xc4,0x88,0x92,0x1d,0x56,0xfe,0x19
+,0x67,0xf2,0x55,0xe4,0x80,0xa3,0x6b,0x9c
+,0xab,0x77,0xe1,0x51,0x71,0x0d,0x20,0xdb
+,0x10,0x9a,0xdb,0xbd,0x76,0x79,0x07,0x77
+,0x99,0x28,0xad,0x9a,0x5e,0xda,0xb1,0x4f
+,0x44,0x2c,0x35,0x8e,0xa5,0x96,0xc7,0xfd
+,0x83,0xf0,0x58,0xc6,0x79,0xd6,0x98,0x7c
+,0xa8,0x8d,0xfe,0x86,0x3e,0x07,0x16,0x92
+,0xe1,0x7b,0xe7,0x1d,0xec,0x33,0x76,0x7e
+,0x42,0x2e,0x4a,0x85,0xf9,0x91,0x89,0x68
+,0x84,0x03,0x81,0xa5,0x9b,0x9a,0xbe,0xe3
+,0x37,0xc5,0x54,0xab,0x56,0x3b,0x18,0x2d
+,0x41,0xa4,0x0c,0xf8,0x42,0xdb,0x99,0xa0
+,0xe0,0x72,0x6f,0xbb,0x5d,0xe1,0x16,0x4f
+,0x53,0x0a,0x64,0xf9,0x4e,0xf4,0xbf,0x4e
+,0x54,0xbd,0x78,0x6c,0x88,0xea,0xbf,0x9c
+,0x13,0x24,0xc2,0x70,0x69,0xa2,0x7f,0x0f
+,0xc8,0x3c,0xad,0x08,0xc9,0xb0,0x98,0x40
+,0xa3,0x2a,0xe7,0x88,0x83,0xed,0x77,0x8f
+,0x74};
+const unsigned int NptTlsTrustAnchor_Base_0121_Size = 897;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0122.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0122.cpp
new file mode 100644
index 0000000..67ea5c5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0122.cpp
@@ -0,0 +1,186 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TC TrustCenter Class 2 CA II */
+const unsigned char NptTlsTrustAnchor_Base_0122_Data[1198] = {
+0x30,0x82,0x04,0xaa,0x30,0x82,0x03,0x92
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x0e,0x2e
+,0x6a,0x00,0x01,0x00,0x02,0x1f,0xd7,0x52
+,0x21,0x2c,0x11,0x5c,0x3b,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x30,0x76,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x44,0x45,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x13,0x54,0x43
+,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65
+,0x6e,0x74,0x65,0x72,0x20,0x47,0x6d,0x62
+,0x48,0x31,0x22,0x30,0x20,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x19,0x54,0x43,0x20,0x54
+,0x72,0x75,0x73,0x74,0x43,0x65,0x6e,0x74
+,0x65,0x72,0x20,0x43,0x6c,0x61,0x73,0x73
+,0x20,0x32,0x20,0x43,0x41,0x31,0x25,0x30
+,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c
+,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74
+,0x43,0x65,0x6e,0x74,0x65,0x72,0x20,0x43
+,0x6c,0x61,0x73,0x73,0x20,0x32,0x20,0x43
+,0x41,0x20,0x49,0x49,0x30,0x1e,0x17,0x0d
+,0x30,0x36,0x30,0x31,0x31,0x32,0x31,0x34
+,0x33,0x38,0x34,0x33,0x5a,0x17,0x0d,0x32
+,0x35,0x31,0x32,0x33,0x31,0x32,0x32,0x35
+,0x39,0x35,0x39,0x5a,0x30,0x76,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x44,0x45,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x13,0x54,0x43
+,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65
+,0x6e,0x74,0x65,0x72,0x20,0x47,0x6d,0x62
+,0x48,0x31,0x22,0x30,0x20,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x19,0x54,0x43,0x20,0x54
+,0x72,0x75,0x73,0x74,0x43,0x65,0x6e,0x74
+,0x65,0x72,0x20,0x43,0x6c,0x61,0x73,0x73
+,0x20,0x32,0x20,0x43,0x41,0x31,0x25,0x30
+,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c
+,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74
+,0x43,0x65,0x6e,0x74,0x65,0x72,0x20,0x43
+,0x6c,0x61,0x73,0x73,0x20,0x32,0x20,0x43
+,0x41,0x20,0x49,0x49,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xab,0x80,0x87
+,0x9b,0x8e,0xf0,0xc3,0x7c,0x87,0xd7,0xe8
+,0x24,0x82,0x11,0xb3,0x3c,0xdd,0x43,0x62
+,0xee,0xf8,0xc3,0x45,0xda,0xe8,0xe1,0xa0
+,0x5f,0xd1,0x2a,0xb2,0xea,0x93,0x68,0xdf
+,0xb4,0xc8,0xd6,0x43,0xe9,0xc4,0x75,0x59
+,0x7f,0xfc,0xe1,0x1d,0xf8,0x31,0x70,0x23
+,0x1b,0x88,0x9e,0x27,0xb9,0x7b,0xfd,0x3a
+,0xd2,0xc9,0xa9,0xe9,0x14,0x2f,0x90,0xbe
+,0x03,0x52,0xc1,0x49,0xcd,0xf6,0xfd,0xe4
+,0x08,0x66,0x0b,0x57,0x8a,0xa2,0x42,0xa0
+,0xb8,0xd5,0x7f,0x69,0x5c,0x90,0x32,0xb2
+,0x97,0x0d,0xca,0x4a,0xdc,0x46,0x3e,0x02
+,0x55,0x89,0x53,0xe3,0x1a,0x5a,0xcb,0x36
+,0xc6,0x07,0x56,0xf7,0x8c,0xcf,0x11,0xf4
+,0x4c,0xbb,0x30,0x70,0x04,0x95,0xa5,0xf6
+,0x39,0x8c,0xfd,0x73,0x81,0x08,0x7d,0x89
+,0x5e,0x32,0x1e,0x22,0xa9,0x22,0x45,0x4b
+,0xb0,0x66,0x2e,0x30,0xcc,0x9f,0x65,0xfd
+,0xfc,0xcb,0x81,0xa9,0xf1,0xe0,0x3b,0xaf
+,0xa3,0x86,0xd1,0x89,0xea,0xc4,0x45,0x79
+,0x50,0x5d,0xae,0xe9,0x21,0x74,0x92,0x4d
+,0x8b,0x59,0x82,0x8f,0x94,0xe3,0xe9,0x4a
+,0xf1,0xe7,0x49,0xb0,0x14,0xe3,0xf5,0x62
+,0xcb,0xd5,0x72,0xbd,0x1f,0xb9,0xd2,0x9f
+,0xa0,0xcd,0xa8,0xfa,0x01,0xc8,0xd9,0x0d
+,0xdf,0xda,0xfc,0x47,0x9d,0xb3,0xc8,0x54
+,0xdf,0x49,0x4a,0xf1,0x21,0xa9,0xfe,0x18
+,0x4e,0xee,0x48,0xd4,0x19,0xbb,0xef,0x7d
+,0xe4,0xe2,0x9d,0xcb,0x5b,0xb6,0x6e,0xff
+,0xe3,0xcd,0x5a,0xe7,0x74,0x82,0x05,0xba
+,0x80,0x25,0x38,0xcb,0xe4,0x69,0x9e,0xaf
+,0x41,0xaa,0x1a,0x84,0xf5,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x82,0x01,0x34,0x30,0x82
+,0x01,0x30,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0xe3,0xab
+,0x54,0x4c,0x80,0xa1,0xdb,0x56,0x43,0xb7
+,0x91,0x4a,0xcb,0xf3,0x82,0x7a,0x13,0x5c
+,0x08,0xab,0x30,0x81,0xed,0x06,0x03,0x55
+,0x1d,0x1f,0x04,0x81,0xe5,0x30,0x81,0xe2
+,0x30,0x81,0xdf,0xa0,0x81,0xdc,0xa0,0x81
+,0xd9,0x86,0x35,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x74,0x72
+,0x75,0x73,0x74,0x63,0x65,0x6e,0x74,0x65
+,0x72,0x2e,0x64,0x65,0x2f,0x63,0x72,0x6c
+,0x2f,0x76,0x32,0x2f,0x74,0x63,0x5f,0x63
+,0x6c,0x61,0x73,0x73,0x5f,0x32,0x5f,0x63
+,0x61,0x5f,0x49,0x49,0x2e,0x63,0x72,0x6c
+,0x86,0x81,0x9f,0x6c,0x64,0x61,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x74,0x72
+,0x75,0x73,0x74,0x63,0x65,0x6e,0x74,0x65
+,0x72,0x2e,0x64,0x65,0x2f,0x43,0x4e,0x3d
+,0x54,0x43,0x25,0x32,0x30,0x54,0x72,0x75
+,0x73,0x74,0x43,0x65,0x6e,0x74,0x65,0x72
+,0x25,0x32,0x30,0x43,0x6c,0x61,0x73,0x73
+,0x25,0x32,0x30,0x32,0x25,0x32,0x30,0x43
+,0x41,0x25,0x32,0x30,0x49,0x49,0x2c,0x4f
+,0x3d,0x54,0x43,0x25,0x32,0x30,0x54,0x72
+,0x75,0x73,0x74,0x43,0x65,0x6e,0x74,0x65
+,0x72,0x25,0x32,0x30,0x47,0x6d,0x62,0x48
+,0x2c,0x4f,0x55,0x3d,0x72,0x6f,0x6f,0x74
+,0x63,0x65,0x72,0x74,0x73,0x2c,0x44,0x43
+,0x3d,0x74,0x72,0x75,0x73,0x74,0x63,0x65
+,0x6e,0x74,0x65,0x72,0x2c,0x44,0x43,0x3d
+,0x64,0x65,0x3f,0x63,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x52,0x65
+,0x76,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x4c,0x69,0x73,0x74,0x3f,0x62,0x61,0x73
+,0x65,0x3f,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x8c,0xd7
+,0xdf,0x7e,0xee,0x1b,0x80,0x10,0xb3,0x83
+,0xf5,0xdb,0x11,0xea,0x6b,0x4b,0xa8,0x92
+,0x18,0xd9,0xf7,0x07,0x39,0xf5,0x2c,0xbe
+,0x06,0x75,0x7a,0x68,0x53,0x15,0x1c,0xea
+,0x4a,0xed,0x5e,0xfc,0x23,0xb2,0x13,0xa0
+,0xd3,0x09,0xff,0xf6,0xf6,0x2e,0x6b,0x41
+,0x71,0x79,0xcd,0xe2,0x6d,0xfd,0xae,0x59
+,0x6b,0x85,0x1d,0xb8,0x4e,0x22,0x9a,0xed
+,0x66,0x39,0x6e,0x4b,0x94,0xe6,0x55,0xfc
+,0x0b,0x1b,0x8b,0x77,0xc1,0x53,0x13,0x66
+,0x89,0xd9,0x28,0xd6,0x8b,0xf3,0x45,0x4a
+,0x63,0xb7,0xfd,0x7b,0x0b,0x61,0x5d,0xb8
+,0x6d,0xbe,0xc3,0xdc,0x5b,0x79,0xd2,0xed
+,0x86,0xe5,0xa2,0x4d,0xbe,0x5e,0x74,0x7c
+,0x6a,0xed,0x16,0x38,0x1f,0x7f,0x58,0x81
+,0x5a,0x1a,0xeb,0x32,0x88,0x2d,0xb2,0xf3
+,0x39,0x77,0x80,0xaf,0x5e,0xb6,0x61,0x75
+,0x29,0xdb,0x23,0x4d,0x88,0xca,0x50,0x28
+,0xcb,0x85,0xd2,0xd3,0x10,0xa2,0x59,0x6e
+,0xd3,0x93,0x54,0x00,0x7a,0xa2,0x46,0x95
+,0x86,0x05,0x9c,0xa9,0x19,0x98,0xe5,0x31
+,0x72,0x0c,0x00,0xe2,0x67,0xd9,0x40,0xe0
+,0x24,0x33,0x7b,0x6f,0x2c,0xb9,0x5c,0xab
+,0x65,0x9d,0x2c,0xac,0x76,0xea,0x35,0x99
+,0xf5,0x97,0xb9,0x0f,0x24,0xec,0xc7,0x76
+,0x21,0x28,0x65,0xae,0x57,0xe8,0x07,0x88
+,0x75,0x4a,0x56,0xa0,0xd2,0x05,0x3a,0xa4
+,0xe6,0x8d,0x92,0x88,0x2c,0xf3,0xf2,0xe1
+,0xc1,0xc6,0x61,0xdb,0x41,0xc5,0xc7,0x9b
+,0xf7,0x0e,0x1a,0x51,0x45,0xc2,0x61,0x6b
+,0xdc,0x64,0x27,0x17,0x8c,0x5a,0xb7,0xda
+,0x74,0x28,0xcd,0x97,0xe4,0xbd};
+const unsigned int NptTlsTrustAnchor_Base_0122_Size = 1198;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0123.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0123.cpp
new file mode 100644
index 0000000..5dfcfc5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0123.cpp
@@ -0,0 +1,186 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TC TrustCenter Class 3 CA II */
+const unsigned char NptTlsTrustAnchor_Base_0123_Data[1198] = {
+0x30,0x82,0x04,0xaa,0x30,0x82,0x03,0x92
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x0e,0x4a
+,0x47,0x00,0x01,0x00,0x02,0xe5,0xa0,0x5d
+,0xd6,0x3f,0x00,0x51,0xbf,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x30,0x76,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x44,0x45,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x13,0x54,0x43
+,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65
+,0x6e,0x74,0x65,0x72,0x20,0x47,0x6d,0x62
+,0x48,0x31,0x22,0x30,0x20,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x19,0x54,0x43,0x20,0x54
+,0x72,0x75,0x73,0x74,0x43,0x65,0x6e,0x74
+,0x65,0x72,0x20,0x43,0x6c,0x61,0x73,0x73
+,0x20,0x33,0x20,0x43,0x41,0x31,0x25,0x30
+,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c
+,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74
+,0x43,0x65,0x6e,0x74,0x65,0x72,0x20,0x43
+,0x6c,0x61,0x73,0x73,0x20,0x33,0x20,0x43
+,0x41,0x20,0x49,0x49,0x30,0x1e,0x17,0x0d
+,0x30,0x36,0x30,0x31,0x31,0x32,0x31,0x34
+,0x34,0x31,0x35,0x37,0x5a,0x17,0x0d,0x32
+,0x35,0x31,0x32,0x33,0x31,0x32,0x32,0x35
+,0x39,0x35,0x39,0x5a,0x30,0x76,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x44,0x45,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x13,0x54,0x43
+,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65
+,0x6e,0x74,0x65,0x72,0x20,0x47,0x6d,0x62
+,0x48,0x31,0x22,0x30,0x20,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x19,0x54,0x43,0x20,0x54
+,0x72,0x75,0x73,0x74,0x43,0x65,0x6e,0x74
+,0x65,0x72,0x20,0x43,0x6c,0x61,0x73,0x73
+,0x20,0x33,0x20,0x43,0x41,0x31,0x25,0x30
+,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c
+,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74
+,0x43,0x65,0x6e,0x74,0x65,0x72,0x20,0x43
+,0x6c,0x61,0x73,0x73,0x20,0x33,0x20,0x43
+,0x41,0x20,0x49,0x49,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xb4,0xe0,0xbb
+,0x51,0xbb,0x39,0x5c,0x8b,0x04,0xc5,0x4c
+,0x79,0x1c,0x23,0x86,0x31,0x10,0x63,0x43
+,0x55,0x27,0x3f,0xc6,0x45,0xc7,0xa4,0x3d
+,0xec,0x09,0x0d,0x1a,0x1e,0x20,0xc2,0x56
+,0x1e,0xde,0x1b,0x37,0x07,0x30,0x22,0x2f
+,0x6f,0xf1,0x06,0xf1,0xab,0xad,0xd6,0xc8
+,0xab,0x61,0xa3,0x2f,0x43,0xc4,0xb0,0xb2
+,0x2d,0xfc,0xc3,0x96,0x69,0x7b,0x7e,0x8a
+,0xe4,0xcc,0xc0,0x39,0x12,0x90,0x42,0x60
+,0xc9,0xcc,0x35,0x68,0xee,0xda,0x5f,0x90
+,0x56,0x5f,0xcd,0x1c,0x4d,0x5b,0x58,0x49
+,0xeb,0x0e,0x01,0x4f,0x64,0xfa,0x2c,0x3c
+,0x89,0x58,0xd8,0x2f,0x2e,0xe2,0xb0,0x68
+,0xe9,0x22,0x3b,0x75,0x89,0xd6,0x44,0x1a
+,0x65,0xf2,0x1b,0x97,0x26,0x1d,0x28,0x6d
+,0xac,0xe8,0xbd,0x59,0x1d,0x2b,0x24,0xf6
+,0xd6,0x84,0x03,0x66,0x88,0x24,0x00,0x78
+,0x60,0xf1,0xf8,0xab,0xfe,0x02,0xb2,0x6b
+,0xfb,0x22,0xfb,0x35,0xe6,0x16,0xd1,0xad
+,0xf6,0x2e,0x12,0xe4,0xfa,0x35,0x6a,0xe5
+,0x19,0xb9,0x5d,0xdb,0x3b,0x1e,0x1a,0xfb
+,0xd3,0xff,0x15,0x14,0x08,0xd8,0x09,0x6a
+,0xba,0x45,0x9d,0x14,0x79,0x60,0x7d,0xaf
+,0x40,0x8a,0x07,0x73,0xb3,0x93,0x96,0xd3
+,0x74,0x34,0x8d,0x3a,0x37,0x29,0xde,0x5c
+,0xec,0xf5,0xee,0x2e,0x31,0xc2,0x20,0xdc
+,0xbe,0xf1,0x4f,0x7f,0x23,0x52,0xd9,0x5b
+,0xe2,0x64,0xd9,0x9c,0xaa,0x07,0x08,0xb5
+,0x45,0xbd,0xd1,0xd0,0x31,0xc1,0xab,0x54
+,0x9f,0xa9,0xd2,0xc3,0x62,0x60,0x03,0xf1
+,0xbb,0x39,0x4a,0x92,0x4a,0x3d,0x0a,0xb9
+,0x9d,0xc5,0xa0,0xfe,0x37,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x82,0x01,0x34,0x30,0x82
+,0x01,0x30,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0xd4,0xa2
+,0xfc,0x9f,0xb3,0xc3,0xd8,0x03,0xd3,0x57
+,0x5c,0x07,0xa4,0xd0,0x24,0xa7,0xc0,0xf2
+,0x00,0xd4,0x30,0x81,0xed,0x06,0x03,0x55
+,0x1d,0x1f,0x04,0x81,0xe5,0x30,0x81,0xe2
+,0x30,0x81,0xdf,0xa0,0x81,0xdc,0xa0,0x81
+,0xd9,0x86,0x35,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x74,0x72
+,0x75,0x73,0x74,0x63,0x65,0x6e,0x74,0x65
+,0x72,0x2e,0x64,0x65,0x2f,0x63,0x72,0x6c
+,0x2f,0x76,0x32,0x2f,0x74,0x63,0x5f,0x63
+,0x6c,0x61,0x73,0x73,0x5f,0x33,0x5f,0x63
+,0x61,0x5f,0x49,0x49,0x2e,0x63,0x72,0x6c
+,0x86,0x81,0x9f,0x6c,0x64,0x61,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x74,0x72
+,0x75,0x73,0x74,0x63,0x65,0x6e,0x74,0x65
+,0x72,0x2e,0x64,0x65,0x2f,0x43,0x4e,0x3d
+,0x54,0x43,0x25,0x32,0x30,0x54,0x72,0x75
+,0x73,0x74,0x43,0x65,0x6e,0x74,0x65,0x72
+,0x25,0x32,0x30,0x43,0x6c,0x61,0x73,0x73
+,0x25,0x32,0x30,0x33,0x25,0x32,0x30,0x43
+,0x41,0x25,0x32,0x30,0x49,0x49,0x2c,0x4f
+,0x3d,0x54,0x43,0x25,0x32,0x30,0x54,0x72
+,0x75,0x73,0x74,0x43,0x65,0x6e,0x74,0x65
+,0x72,0x25,0x32,0x30,0x47,0x6d,0x62,0x48
+,0x2c,0x4f,0x55,0x3d,0x72,0x6f,0x6f,0x74
+,0x63,0x65,0x72,0x74,0x73,0x2c,0x44,0x43
+,0x3d,0x74,0x72,0x75,0x73,0x74,0x63,0x65
+,0x6e,0x74,0x65,0x72,0x2c,0x44,0x43,0x3d
+,0x64,0x65,0x3f,0x63,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x74,0x65,0x52,0x65
+,0x76,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x4c,0x69,0x73,0x74,0x3f,0x62,0x61,0x73
+,0x65,0x3f,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x36,0x60
+,0xe4,0x70,0xf7,0x06,0x20,0x43,0xd9,0x23
+,0x1a,0x42,0xf2,0xf8,0xa3,0xb2,0xb9,0x4d
+,0x8a,0xb4,0xf3,0xc2,0x9a,0x55,0x31,0x7c
+,0xc4,0x3b,0x67,0x9a,0xb4,0xdf,0x4d,0x0e
+,0x8a,0x93,0x4a,0x17,0x8b,0x1b,0x8d,0xca
+,0x89,0xe1,0xcf,0x3a,0x1e,0xac,0x1d,0xf1
+,0x9c,0x32,0xb4,0x8e,0x59,0x76,0xa2,0x41
+,0x85,0x25,0x37,0xa0,0x13,0xd0,0xf5,0x7c
+,0x4e,0xd5,0xea,0x96,0xe2,0x6e,0x72,0xc1
+,0xbb,0x2a,0xfe,0x6c,0x6e,0xf8,0x91,0x98
+,0x46,0xfc,0xc9,0x1b,0x57,0x5b,0xea,0xc8
+,0x1a,0x3b,0x3f,0xb0,0x51,0x98,0x3c,0x07
+,0xda,0x2c,0x59,0x01,0xda,0x8b,0x44,0xe8
+,0xe1,0x74,0xfd,0xa7,0x68,0xdd,0x54,0xba
+,0x83,0x46,0xec,0xc8,0x46,0xb5,0xf8,0xaf
+,0x97,0xc0,0x3b,0x09,0x1c,0x8f,0xce,0x72
+,0x96,0x3d,0x33,0x56,0x70,0xbc,0x96,0xcb
+,0xd8,0xd5,0x7d,0x20,0x9a,0x83,0x9f,0x1a
+,0xdc,0x39,0xf1,0xc5,0x72,0xa3,0x11,0x03
+,0xfd,0x3b,0x42,0x52,0x29,0xdb,0xe8,0x01
+,0xf7,0x9b,0x5e,0x8c,0xd6,0x8d,0x86,0x4e
+,0x19,0xfa,0xbc,0x1c,0xbe,0xc5,0x21,0xa5
+,0x87,0x9e,0x78,0x2e,0x36,0xdb,0x09,0x71
+,0xa3,0x72,0x34,0xf8,0x6c,0xe3,0x06,0x09
+,0xf2,0x5e,0x56,0xa5,0xd3,0xdd,0x98,0xfa
+,0xd4,0xe6,0x06,0xf4,0xf0,0xb6,0x20,0x63
+,0x4b,0xea,0x29,0xbd,0xaa,0x82,0x66,0x1e
+,0xfb,0x81,0xaa,0xa7,0x37,0xad,0x13,0x18
+,0xe6,0x92,0xc3,0x81,0xc1,0x33,0xbb,0x88
+,0x1e,0xa1,0xe7,0xe2,0xb4,0xbd,0x31,0x6c
+,0x0e,0x51,0x3d,0x6f,0xfb,0x96,0x56,0x80
+,0xe2,0x36,0x17,0xd1,0xdc,0xe4};
+const unsigned int NptTlsTrustAnchor_Base_0123_Size = 1198;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0124.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0124.cpp
new file mode 100644
index 0000000..2117f98
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0124.cpp
@@ -0,0 +1,161 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TC TrustCenter Universal CA I */
+const unsigned char NptTlsTrustAnchor_Base_0124_Data[993] = {
+0x30,0x82,0x03,0xdd,0x30,0x82,0x02,0xc5
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x0e,0x1d
+,0xa2,0x00,0x01,0x00,0x02,0xec,0xb7,0x60
+,0x80,0x78,0x8d,0xb6,0x06,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x30,0x79,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x44,0x45,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x13,0x54,0x43
+,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65
+,0x6e,0x74,0x65,0x72,0x20,0x47,0x6d,0x62
+,0x48,0x31,0x24,0x30,0x22,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x1b,0x54,0x43,0x20,0x54
+,0x72,0x75,0x73,0x74,0x43,0x65,0x6e,0x74
+,0x65,0x72,0x20,0x55,0x6e,0x69,0x76,0x65
+,0x72,0x73,0x61,0x6c,0x20,0x43,0x41,0x31
+,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03
+,0x13,0x1d,0x54,0x43,0x20,0x54,0x72,0x75
+,0x73,0x74,0x43,0x65,0x6e,0x74,0x65,0x72
+,0x20,0x55,0x6e,0x69,0x76,0x65,0x72,0x73
+,0x61,0x6c,0x20,0x43,0x41,0x20,0x49,0x30
+,0x1e,0x17,0x0d,0x30,0x36,0x30,0x33,0x32
+,0x32,0x31,0x35,0x35,0x34,0x32,0x38,0x5a
+,0x17,0x0d,0x32,0x35,0x31,0x32,0x33,0x31
+,0x32,0x32,0x35,0x39,0x35,0x39,0x5a,0x30
+,0x79,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x1c
+,0x30,0x1a,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x13,0x54,0x43,0x20,0x54,0x72,0x75,0x73
+,0x74,0x43,0x65,0x6e,0x74,0x65,0x72,0x20
+,0x47,0x6d,0x62,0x48,0x31,0x24,0x30,0x22
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x1b,0x54
+,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43
+,0x65,0x6e,0x74,0x65,0x72,0x20,0x55,0x6e
+,0x69,0x76,0x65,0x72,0x73,0x61,0x6c,0x20
+,0x43,0x41,0x31,0x26,0x30,0x24,0x06,0x03
+,0x55,0x04,0x03,0x13,0x1d,0x54,0x43,0x20
+,0x54,0x72,0x75,0x73,0x74,0x43,0x65,0x6e
+,0x74,0x65,0x72,0x20,0x55,0x6e,0x69,0x76
+,0x65,0x72,0x73,0x61,0x6c,0x20,0x43,0x41
+,0x20,0x49,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xa4,0x77,0x23,0x96,0x44
+,0xaf,0x90,0xf4,0x31,0xa7,0x10,0xf4,0x26
+,0x87,0x9c,0xf3,0x38,0xd9,0x0f,0x5e,0xde
+,0xcf,0x41,0xe8,0x31,0xad,0xc6,0x74,0x91
+,0x24,0x96,0x78,0x1e,0x09,0xa0,0x9b,0x9a
+,0x95,0x4a,0x4a,0xf5,0x62,0x7c,0x02,0xa8
+,0xca,0xac,0xfb,0x5a,0x04,0x76,0x39,0xde
+,0x5f,0xf1,0xf9,0xb3,0xbf,0xf3,0x03,0x58
+,0x55,0xd2,0xaa,0xb7,0xe3,0x04,0x22,0xd1
+,0xf8,0x94,0xda,0x22,0x08,0x00,0x8d,0xd3
+,0x7c,0x26,0x5d,0xcc,0x77,0x79,0xe7,0x2c
+,0x78,0x39,0xa8,0x26,0x73,0x0e,0xa2,0x5d
+,0x25,0x69,0x85,0x4f,0x55,0x0e,0x9a,0xef
+,0xc6,0xb9,0x44,0xe1,0x57,0x3d,0xdf,0x1f
+,0x54,0x22,0xe5,0x6f,0x65,0xaa,0x33,0x84
+,0x3a,0xf3,0xce,0x7a,0xbe,0x55,0x97,0xae
+,0x8d,0x12,0x0f,0x14,0x33,0xe2,0x50,0x70
+,0xc3,0x49,0x87,0x13,0xbc,0x51,0xde,0xd7
+,0x98,0x12,0x5a,0xef,0x3a,0x83,0x33,0x92
+,0x06,0x75,0x8b,0x92,0x7c,0x12,0x68,0x7b
+,0x70,0x6a,0x0f,0xb5,0x9b,0xb6,0x77,0x5b
+,0x48,0x59,0x9d,0xe4,0xef,0x5a,0xad,0xf3
+,0xc1,0x9e,0xd4,0xd7,0x45,0x4e,0xca,0x56
+,0x34,0x21,0xbc,0x3e,0x17,0x5b,0x6f,0x77
+,0x0c,0x48,0x01,0x43,0x29,0xb0,0xdd,0x3f
+,0x96,0x6e,0xe6,0x95,0xaa,0x0c,0xc0,0x20
+,0xb6,0xfd,0x3e,0x36,0x27,0x9c,0xe3,0x5c
+,0xcf,0x4e,0x81,0xdc,0x19,0xbb,0x91,0x90
+,0x7d,0xec,0xe6,0x97,0x04,0x1e,0x93,0xcc
+,0x22,0x49,0xd7,0x97,0x86,0xb6,0x13,0x0a
+,0x3c,0x43,0x23,0x77,0x7e,0xf0,0xdc,0xe6
+,0xcd,0x24,0x1f,0x3b,0x83,0x9b,0x34,0x3a
+,0x83,0x34,0xe3,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x63,0x30,0x61,0x30,0x1f,0x06,0x03
+,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80
+,0x14,0x92,0xa4,0x75,0x2c,0xa4,0x9e,0xbe
+,0x81,0x44,0xeb,0x79,0xfc,0x8a,0xc5,0x95
+,0xa5,0xeb,0x10,0x75,0x73,0x30,0x0f,0x06
+,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04
+,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x0e
+,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff
+,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0x92,0xa4,0x75,0x2c,0xa4,0x9e,0xbe
+,0x81,0x44,0xeb,0x79,0xfc,0x8a,0xc5,0x95
+,0xa5,0xeb,0x10,0x75,0x73,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0x28,0xd2,0xe0,0x86,0xd5,0xe6,0xf8
+,0x7b,0xf0,0x97,0xdc,0x22,0x6b,0x3b,0x95
+,0x14,0x56,0x0f,0x11,0x30,0xa5,0x9a,0x4f
+,0x3a,0xb0,0x3a,0xe0,0x06,0xcb,0x65,0xf5
+,0xed,0xc6,0x97,0x27,0xfe,0x25,0xf2,0x57
+,0xe6,0x5e,0x95,0x8c,0x3e,0x64,0x60,0x15
+,0x5a,0x7f,0x2f,0x0d,0x01,0xc5,0xb1,0x60
+,0xfd,0x45,0x35,0xcf,0xf0,0xb2,0xbf,0x06
+,0xd9,0xef,0x5a,0xbe,0xb3,0x62,0x21,0xb4
+,0xd7,0xab,0x35,0x7c,0x53,0x3e,0xa6,0x27
+,0xf1,0xa1,0x2d,0xda,0x1a,0x23,0x9d,0xcc
+,0xdd,0xec,0x3c,0x2d,0x9e,0x27,0x34,0x5d
+,0x0f,0xc2,0x36,0x79,0xbc,0xc9,0x4a,0x62
+,0x2d,0xed,0x6b,0xd9,0x7d,0x41,0x43,0x7c
+,0xb6,0xaa,0xca,0xed,0x61,0xb1,0x37,0x82
+,0x15,0x09,0x1a,0x8a,0x16,0x30,0xd8,0xec
+,0xc9,0xd6,0x47,0x72,0x78,0x4b,0x10,0x46
+,0x14,0x8e,0x5f,0x0e,0xaf,0xec,0xc7,0x2f
+,0xab,0x10,0xd7,0xb6,0xf1,0x6e,0xec,0x86
+,0xb2,0xc2,0xe8,0x0d,0x92,0x73,0xdc,0xa2
+,0xf4,0x0f,0x3a,0xbf,0x61,0x23,0x10,0x89
+,0x9c,0x48,0x40,0x6e,0x70,0x00,0xb3,0xd3
+,0xba,0x37,0x44,0x58,0x11,0x7a,0x02,0x6a
+,0x88,0xf0,0x37,0x34,0xf0,0x19,0xe9,0xac
+,0xd4,0x65,0x73,0xf6,0x69,0x8c,0x64,0x94
+,0x3a,0x79,0x85,0x29,0xb0,0x16,0x2b,0x0c
+,0x82,0x3f,0x06,0x9c,0xc7,0xfd,0x10,0x2b
+,0x9e,0x0f,0x2c,0xb6,0x9e,0xe3,0x15,0xbf
+,0xd9,0x36,0x1c,0xba,0x25,0x1a,0x52,0x3d
+,0x1a,0xec,0x22,0x0c,0x1c,0xe0,0xa4,0xa2
+,0x3d,0xf0,0xe8,0x39,0xcf,0x81,0xc0,0x7b
+,0xed,0x5d,0x1f,0x6f,0xc5,0xd0,0x0b,0xd7
+,0x98};
+const unsigned int NptTlsTrustAnchor_Base_0124_Size = 993;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0125.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0125.cpp
new file mode 100644
index 0000000..0c8d53e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0125.cpp
@@ -0,0 +1,153 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Deutsche Telekom Root CA 2 */
+const unsigned char NptTlsTrustAnchor_Base_0125_Data[931] = {
+0x30,0x82,0x03,0x9f,0x30,0x82,0x02,0x87
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x26
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x71,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x1c
+,0x30,0x1a,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x13,0x44,0x65,0x75,0x74,0x73,0x63,0x68
+,0x65,0x20,0x54,0x65,0x6c,0x65,0x6b,0x6f
+,0x6d,0x20,0x41,0x47,0x31,0x1f,0x30,0x1d
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x16,0x54
+,0x2d,0x54,0x65,0x6c,0x65,0x53,0x65,0x63
+,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x43
+,0x65,0x6e,0x74,0x65,0x72,0x31,0x23,0x30
+,0x21,0x06,0x03,0x55,0x04,0x03,0x13,0x1a
+,0x44,0x65,0x75,0x74,0x73,0x63,0x68,0x65
+,0x20,0x54,0x65,0x6c,0x65,0x6b,0x6f,0x6d
+,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41
+,0x20,0x32,0x30,0x1e,0x17,0x0d,0x39,0x39
+,0x30,0x37,0x30,0x39,0x31,0x32,0x31,0x31
+,0x30,0x30,0x5a,0x17,0x0d,0x31,0x39,0x30
+,0x37,0x30,0x39,0x32,0x33,0x35,0x39,0x30
+,0x30,0x5a,0x30,0x71,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x44
+,0x45,0x31,0x1c,0x30,0x1a,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x13,0x44,0x65,0x75,0x74
+,0x73,0x63,0x68,0x65,0x20,0x54,0x65,0x6c
+,0x65,0x6b,0x6f,0x6d,0x20,0x41,0x47,0x31
+,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x16,0x54,0x2d,0x54,0x65,0x6c,0x65
+,0x53,0x65,0x63,0x20,0x54,0x72,0x75,0x73
+,0x74,0x20,0x43,0x65,0x6e,0x74,0x65,0x72
+,0x31,0x23,0x30,0x21,0x06,0x03,0x55,0x04
+,0x03,0x13,0x1a,0x44,0x65,0x75,0x74,0x73
+,0x63,0x68,0x65,0x20,0x54,0x65,0x6c,0x65
+,0x6b,0x6f,0x6d,0x20,0x52,0x6f,0x6f,0x74
+,0x20,0x43,0x41,0x20,0x32,0x30,0x82,0x01
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01
+,0x0a,0x02,0x82,0x01,0x01,0x00,0xab,0x0b
+,0xa3,0x35,0xe0,0x8b,0x29,0x14,0xb1,0x14
+,0x85,0xaf,0x3c,0x10,0xe4,0x39,0x6f,0x35
+,0x5d,0x4a,0xae,0xdd,0xea,0x61,0x8d,0x95
+,0x49,0xf4,0x6f,0x64,0xa3,0x1a,0x60,0x66
+,0xa4,0xa9,0x40,0x22,0x84,0xd9,0xd4,0xa5
+,0xe5,0x78,0x93,0x0e,0x68,0x01,0xad,0xb9
+,0x4d,0x5c,0x3a,0xce,0xd3,0xb8,0xa8,0x42
+,0x40,0xdf,0xcf,0xa3,0xba,0x82,0x59,0x6a
+,0x92,0x1b,0xac,0x1c,0x9a,0xda,0x08,0x2b
+,0x25,0x27,0xf9,0x69,0x23,0x47,0xf1,0xe0
+,0xeb,0x2c,0x7a,0x9b,0xf5,0x13,0x02,0xd0
+,0x7e,0x34,0x7c,0xc2,0x9e,0x3c,0x00,0x59
+,0xab,0xf5,0xda,0x0c,0xf5,0x32,0x3c,0x2b
+,0xac,0x50,0xda,0xd6,0xc3,0xde,0x83,0x94
+,0xca,0xa8,0x0c,0x99,0x32,0x0e,0x08,0x48
+,0x56,0x5b,0x6a,0xfb,0xda,0xe1,0x58,0x58
+,0x01,0x49,0x5f,0x72,0x41,0x3c,0x15,0x06
+,0x01,0x8e,0x5d,0xad,0xaa,0xb8,0x93,0xb4
+,0xcd,0x9e,0xeb,0xa7,0xe8,0x6a,0x2d,0x52
+,0x34,0xdb,0x3a,0xef,0x5c,0x75,0x51,0xda
+,0xdb,0xf3,0x31,0xf9,0xee,0x71,0x98,0x32
+,0xc4,0x54,0x15,0x44,0x0c,0xf9,0x9b,0x55
+,0xed,0xad,0xdf,0x18,0x08,0xa0,0xa3,0x86
+,0x8a,0x49,0xee,0x53,0x05,0x8f,0x19,0x4c
+,0xd5,0xde,0x58,0x79,0x9b,0xd2,0x6a,0x1c
+,0x42,0xab,0xc5,0xd5,0xa7,0xcf,0x68,0x0f
+,0x96,0xe4,0xe1,0x61,0x98,0x76,0x61,0xc8
+,0x91,0x7c,0xd6,0x3e,0x00,0xe2,0x91,0x50
+,0x87,0xe1,0x9d,0x0a,0xe6,0xad,0x97,0xd2
+,0x1d,0xc6,0x3a,0x7d,0xcb,0xbc,0xda,0x03
+,0x34,0xd5,0x8e,0x5b,0x01,0xf5,0x6a,0x07
+,0xb7,0x16,0xb6,0x6e,0x4a,0x7f,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x42,0x30,0x40,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0x31,0xc3,0x79,0x1b,0xba,0xf5
+,0x53,0xd7,0x17,0xe0,0x89,0x7a,0x2d,0x17
+,0x6c,0x0a,0xb3,0x2b,0x9d,0x33,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x04,0x08,0x30
+,0x06,0x01,0x01,0xff,0x02,0x01,0x05,0x30
+,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01
+,0xff,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x01,0x01,0x00,0x94,0x64,0x59,0xad,0x39
+,0x64,0xe7,0x29,0xeb,0x13,0xfe,0x5a,0xc3
+,0x8b,0x13,0x57,0xc8,0x04,0x24,0xf0,0x74
+,0x77,0xc0,0x60,0xe3,0x67,0xfb,0xe9,0x89
+,0xa6,0x83,0xbf,0x96,0x82,0x7c,0x6e,0xd4
+,0xc3,0x3d,0xef,0x9e,0x80,0x6e,0xbb,0x29
+,0xb4,0x98,0x7a,0xb1,0x3b,0x54,0xeb,0x39
+,0x17,0x47,0x7e,0x1a,0x8e,0x0b,0xfc,0x1f
+,0x31,0x59,0x31,0x04,0xb2,0xce,0x17,0xf3
+,0x2c,0xc7,0x62,0x36,0x55,0xe2,0x22,0xd8
+,0x89,0x55,0xb4,0x98,0x48,0xaa,0x64,0xfa
+,0xd6,0x1c,0x36,0xd8,0x44,0x78,0x5a,0x5a
+,0x23,0x3a,0x57,0x97,0xf5,0x7a,0x30,0x4f
+,0xae,0x9f,0x6a,0x4c,0x4b,0x2b,0x8e,0xa0
+,0x03,0xe3,0x3e,0xe0,0xa9,0xd4,0xd2,0x7b
+,0xd2,0xb3,0xa8,0xe2,0x72,0x3c,0xad,0x9e
+,0xff,0x80,0x59,0xe4,0x9b,0x45,0xb4,0xf6
+,0x3b,0xb0,0xcd,0x39,0x19,0x98,0x32,0xe5
+,0xea,0x21,0x61,0x90,0xe4,0x31,0x21,0x8e
+,0x34,0xb1,0xf7,0x2f,0x35,0x4a,0x85,0x10
+,0xda,0xe7,0x8a,0x37,0x21,0xbe,0x59,0x63
+,0xe0,0xf2,0x85,0x88,0x31,0x53,0xd4,0x54
+,0x14,0x85,0x70,0x79,0xf4,0x2e,0x06,0x77
+,0x27,0x75,0x2f,0x1f,0xb8,0x8a,0xf9,0xfe
+,0xc5,0xba,0xd8,0x36,0xe4,0x83,0xec,0xe7
+,0x65,0xb7,0xbf,0x63,0x5a,0xf3,0x46,0xaf
+,0x81,0x94,0x37,0xd4,0x41,0x8c,0xd6,0x23
+,0xd6,0x1e,0xcf,0xf5,0x68,0x1b,0x44,0x63
+,0xa2,0x5a,0xba,0xa7,0x35,0x59,0xa1,0xe5
+,0x70,0x05,0x9b,0x0e,0x23,0x57,0x99,0x94
+,0x0a,0x6d,0xba,0x39,0x63,0x28,0x86,0x92
+,0xf3,0x18,0x84,0xd8,0xfb,0xd1,0xcf,0x05
+,0x56,0x64,0x57};
+const unsigned int NptTlsTrustAnchor_Base_0125_Size = 931;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0126.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0126.cpp
new file mode 100644
index 0000000..bd4811e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0126.cpp
@@ -0,0 +1,151 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* ComSign CA */
+const unsigned char NptTlsTrustAnchor_Base_0126_Data[919] = {
+0x30,0x82,0x03,0x93,0x30,0x82,0x02,0x7b
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x14
+,0x13,0x96,0x83,0x14,0x55,0x8c,0xea,0x7b
+,0x63,0xe5,0xfc,0x34,0x87,0x77,0x44,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x34
+,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04
+,0x03,0x13,0x0a,0x43,0x6f,0x6d,0x53,0x69
+,0x67,0x6e,0x20,0x43,0x41,0x31,0x10,0x30
+,0x0e,0x06,0x03,0x55,0x04,0x0a,0x13,0x07
+,0x43,0x6f,0x6d,0x53,0x69,0x67,0x6e,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x49,0x4c,0x30,0x1e,0x17,0x0d
+,0x30,0x34,0x30,0x33,0x32,0x34,0x31,0x31
+,0x33,0x32,0x31,0x38,0x5a,0x17,0x0d,0x32
+,0x39,0x30,0x33,0x31,0x39,0x31,0x35,0x30
+,0x32,0x31,0x38,0x5a,0x30,0x34,0x31,0x13
+,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13
+,0x0a,0x43,0x6f,0x6d,0x53,0x69,0x67,0x6e
+,0x20,0x43,0x41,0x31,0x10,0x30,0x0e,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x07,0x43,0x6f
+,0x6d,0x53,0x69,0x67,0x6e,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x49,0x4c,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xf0,0xe4,0x54,0x69,0x2b
+,0xd3,0xc7,0x8f,0x6a,0x44,0xe4,0x7e,0x58
+,0x27,0xf8,0x0b,0xd0,0xe4,0x94,0x12,0x8a
+,0xf1,0x1b,0x38,0x38,0x2f,0x1f,0x31,0x9c
+,0x06,0xd4,0x2c,0xa7,0xde,0x0b,0x2a,0xae
+,0x1a,0xa0,0xe3,0x9e,0x6a,0xbf,0x9f,0x3c
+,0xc7,0x6e,0xa2,0xf9,0x8b,0x64,0x6c,0x3a
+,0xad,0x85,0x55,0x51,0x54,0xa5,0x38,0x55
+,0xb8,0xab,0x83,0x04,0xf2,0x3f,0x64,0x36
+,0xf7,0xc0,0x8d,0x43,0x43,0x6a,0x66,0xd1
+,0xf7,0x17,0x2a,0xd5,0xef,0x36,0xfa,0x30
+,0x10,0x42,0xd7,0x53,0xcd,0xf9,0xfa,0x33
+,0x73,0x4c,0xb3,0xe9,0x84,0x20,0x8a,0xd6
+,0x41,0x27,0x35,0xe4,0x38,0xfa,0x94,0x9b
+,0xb8,0x7a,0xe4,0x79,0x1f,0x33,0xfb,0x1b
+,0xd8,0x21,0x09,0x28,0x7c,0x4d,0x18,0x69
+,0x5e,0x64,0x8a,0x7a,0x19,0x93,0xca,0x7e
+,0xec,0xf3,0x72,0xe7,0x37,0x07,0x58,0x59
+,0x28,0xac,0x42,0xf9,0xc5,0xff,0xcd,0x3f
+,0xe7,0xa5,0xfa,0x38,0xb1,0xd0,0x0c,0xc7
+,0xd9,0x52,0x1a,0x53,0xd6,0x81,0xcc,0x42
+,0x7a,0x35,0x5b,0xed,0x4b,0x3a,0x7a,0xf6
+,0xb5,0x8e,0xcc,0xff,0x0f,0x7c,0xe4,0x60
+,0x36,0x87,0x2f,0xad,0xf0,0xa1,0x25,0x7d
+,0xff,0xd2,0x4b,0x11,0x88,0x70,0x54,0xa6
+,0x41,0xa8,0x67,0x53,0x52,0x42,0x5e,0xe4
+,0x34,0x9e,0xe4,0xbe,0xa3,0xec,0xaa,0x62
+,0x5d,0xdd,0xc3,0x4c,0xa6,0x82,0x41,0xe4
+,0x33,0x0b,0xac,0xc9,0x33,0x0f,0x64,0x82
+,0x57,0x2a,0xfd,0x0c,0xad,0x36,0xe1,0x0c
+,0xae,0x4b,0xc5,0xef,0x3b,0x99,0xd9,0x23
+,0xb3,0x5b,0x5d,0xb4,0x57,0xec,0x74,0x70
+,0x0c,0x2a,0x4f,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x81,0xa0,0x30,0x81,0x9d,0x30,0x0c
+,0x06,0x03,0x55,0x1d,0x13,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x3d,0x06,0x03
+,0x55,0x1d,0x1f,0x04,0x36,0x30,0x34,0x30
+,0x32,0xa0,0x30,0xa0,0x2e,0x86,0x2c,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x66,0x65
+,0x64,0x69,0x72,0x2e,0x63,0x6f,0x6d,0x73
+,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x2e,0x69
+,0x6c,0x2f,0x63,0x72,0x6c,0x2f,0x43,0x6f
+,0x6d,0x53,0x69,0x67,0x6e,0x43,0x41,0x2e
+,0x63,0x72,0x6c,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x86,0x30,0x1f,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14
+,0x4b,0x01,0x9b,0x3e,0x56,0x1a,0x65,0x36
+,0x76,0xcb,0x7b,0x97,0xaa,0x92,0x05,0xee
+,0x32,0xe7,0x28,0x31,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x4b
+,0x01,0x9b,0x3e,0x56,0x1a,0x65,0x36,0x76
+,0xcb,0x7b,0x97,0xaa,0x92,0x05,0xee,0x32
+,0xe7,0x28,0x31,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0xd0
+,0xd9,0xa5,0x7e,0xfe,0x29,0x60,0x45,0x9d
+,0x7e,0x83,0xcf,0x6e,0xbc,0x47,0x6e,0xf5
+,0x1a,0x9e,0x54,0x76,0x42,0x71,0xb4,0x3c
+,0x58,0x3f,0x2d,0x40,0x25,0x42,0xf6,0x81
+,0x9c,0xf1,0x89,0x10,0xc8,0x0e,0xaa,0x78
+,0x4f,0x38,0x09,0x57,0xb0,0x3c,0xc0,0x08
+,0xfc,0x35,0x8e,0xf1,0x48,0x51,0x8d,0x0c
+,0x71,0x74,0xba,0x84,0xc4,0xd7,0x72,0x9b
+,0x84,0x7c,0x38,0x4e,0x64,0x06,0x27,0x2a
+,0xe1,0xa7,0xb5,0xec,0x08,0x99,0xb4,0x0a
+,0x0d,0xd4,0x85,0x73,0xc8,0x12,0xe1,0x35
+,0xed,0xf1,0x05,0x31,0x1d,0x73,0x99,0x0c
+,0xeb,0x96,0xca,0xdd,0xd3,0xe6,0x85,0xaa
+,0xf0,0x8a,0xfb,0x75,0xc1,0xf2,0x09,0x3c
+,0x65,0x65,0x64,0xf3,0x4c,0xd8,0xad,0xcb
+,0x88,0x69,0xf3,0xe4,0x83,0xb7,0x0c,0xbd
+,0x17,0x5a,0x96,0x17,0xca,0x5b,0xff,0xad
+,0xbb,0x1c,0xe9,0x2d,0x84,0x80,0xd8,0x21
+,0xbe,0x85,0x52,0xd9,0xd4,0x74,0xb9,0x69
+,0x85,0xba,0x4d,0xed,0x28,0x32,0xeb,0xf9
+,0x61,0x4a,0xe4,0xc4,0x36,0x1e,0x19,0xdc
+,0x6f,0x84,0x11,0x1f,0x95,0xf5,0x83,0x28
+,0x18,0xa8,0x33,0x92,0x43,0x27,0xdd,0x5d
+,0x13,0x04,0x45,0x4f,0x87,0xd5,0x46,0xcd
+,0x3d,0xa8,0xba,0xf0,0xf3,0xb8,0x56,0x24
+,0x45,0xeb,0x37,0xc7,0xe1,0x76,0x4f,0x72
+,0x39,0x18,0xdf,0x7e,0x74,0x72,0xc7,0x73
+,0x2d,0x39,0xea,0x60,0xe6,0xad,0x11,0xa2
+,0x56,0x87,0x7b,0xc3,0x68,0x9a,0xfe,0xf8
+,0x8c,0x70,0xa8,0xdf,0x65,0x32,0xf4,0xa4
+,0x40,0x8c,0xa1,0xc2,0x44,0x03,0x0e,0x94
+,0x00,0x67,0xa0,0x71,0x00,0x82,0x48};
+const unsigned int NptTlsTrustAnchor_Base_0126_Size = 919;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0127.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0127.cpp
new file mode 100644
index 0000000..824f788
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0127.cpp
@@ -0,0 +1,154 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* ComSign Secured CA */
+const unsigned char NptTlsTrustAnchor_Base_0127_Data[943] = {
+0x30,0x82,0x03,0xab,0x30,0x82,0x02,0x93
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x11,0x00
+,0xc7,0x28,0x47,0x09,0xb3,0xb8,0x6c,0x45
+,0x8c,0x1d,0xfa,0x24,0xf5,0x36,0x4e,0xe9
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x3c,0x31,0x1b,0x30,0x19,0x06,0x03,0x55
+,0x04,0x03,0x13,0x12,0x43,0x6f,0x6d,0x53
+,0x69,0x67,0x6e,0x20,0x53,0x65,0x63,0x75
+,0x72,0x65,0x64,0x20,0x43,0x41,0x31,0x10
+,0x30,0x0e,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x07,0x43,0x6f,0x6d,0x53,0x69,0x67,0x6e
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x49,0x4c,0x30,0x1e,0x17
+,0x0d,0x30,0x34,0x30,0x33,0x32,0x34,0x31
+,0x31,0x33,0x37,0x32,0x30,0x5a,0x17,0x0d
+,0x32,0x39,0x30,0x33,0x31,0x36,0x31,0x35
+,0x30,0x34,0x35,0x36,0x5a,0x30,0x3c,0x31
+,0x1b,0x30,0x19,0x06,0x03,0x55,0x04,0x03
+,0x13,0x12,0x43,0x6f,0x6d,0x53,0x69,0x67
+,0x6e,0x20,0x53,0x65,0x63,0x75,0x72,0x65
+,0x64,0x20,0x43,0x41,0x31,0x10,0x30,0x0e
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x07,0x43
+,0x6f,0x6d,0x53,0x69,0x67,0x6e,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x49,0x4c,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xc6,0xb5,0x68,0x5f
+,0x1d,0x94,0x15,0xc3,0xa4,0x08,0x55,0x2d
+,0xe3,0xa0,0x57,0x7a,0xef,0xe9,0x74,0x2a
+,0xbb,0xb9,0x7c,0x57,0x49,0x1a,0x11,0x5e
+,0x4f,0x29,0x87,0x0c,0x48,0xd6,0x6a,0xe7
+,0x8f,0xd4,0x7e,0x57,0x24,0xb9,0x06,0x89
+,0xe4,0x1c,0x3c,0xea,0xac,0xe3,0xda,0x21
+,0x80,0x73,0x21,0x0a,0xef,0x79,0x98,0x6c
+,0x1f,0x08,0xff,0xa1,0x50,0x7d,0xf2,0x98
+,0x1b,0xc9,0x54,0x6f,0x3e,0xa5,0x28,0xec
+,0x21,0x04,0x0f,0x45,0xbb,0x07,0x3d,0xa1
+,0xc0,0xfa,0x2a,0x98,0x1d,0x4e,0x06,0x93
+,0xfb,0xf5,0x88,0x3b,0xab,0x5f,0xcb,0x16
+,0xbf,0xe6,0xf3,0x9e,0x4a,0x87,0xed,0x19
+,0xea,0xc2,0x9f,0x43,0xe4,0xf1,0x81,0xa5
+,0x7f,0x10,0x4f,0x3e,0xd1,0x4a,0x62,0xad
+,0x53,0x1b,0xcb,0x83,0xff,0x07,0x65,0xa5
+,0x92,0x2d,0x66,0xa9,0x5b,0xb8,0x5a,0xf4
+,0x1d,0xb4,0x21,0x91,0x4a,0x17,0x7b,0x9e
+,0x32,0xfe,0x56,0x24,0x39,0xb2,0x54,0x84
+,0x43,0xf5,0x84,0xc2,0xd8,0xbc,0x41,0x90
+,0xcc,0x9d,0xd6,0x68,0xda,0xe9,0x82,0x50
+,0xa9,0x3b,0x68,0xcf,0xb5,0x5d,0x02,0x94
+,0x60,0x16,0xb1,0x43,0xd9,0x43,0x5d,0xdd
+,0x5d,0x87,0x6e,0xea,0xbb,0xb3,0xc9,0x6b
+,0xf6,0x03,0x94,0x09,0x70,0xde,0x16,0x11
+,0x7a,0x2b,0xe8,0x76,0x8f,0x49,0x10,0x98
+,0x77,0xb9,0x63,0x5c,0x8b,0x33,0x97,0x75
+,0xf6,0x0b,0x8c,0xb2,0xab,0x5b,0xde,0x74
+,0x20,0x25,0x3f,0xe3,0xf3,0x11,0xf9,0x87
+,0x68,0x86,0x35,0x71,0xc3,0x1d,0x8c,0x2d
+,0xeb,0xe5,0x1a,0xac,0x0f,0x73,0xd5,0x82
+,0x59,0x40,0x80,0xd3,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x81,0xa7,0x30,0x81,0xa4,0x30
+,0x0c,0x06,0x03,0x55,0x1d,0x13,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x44,0x06
+,0x03,0x55,0x1d,0x1f,0x04,0x3d,0x30,0x3b
+,0x30,0x39,0xa0,0x37,0xa0,0x35,0x86,0x33
+,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x66
+,0x65,0x64,0x69,0x72,0x2e,0x63,0x6f,0x6d
+,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x2e
+,0x69,0x6c,0x2f,0x63,0x72,0x6c,0x2f,0x43
+,0x6f,0x6d,0x53,0x69,0x67,0x6e,0x53,0x65
+,0x63,0x75,0x72,0x65,0x64,0x43,0x41,0x2e
+,0x63,0x72,0x6c,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x86,0x30,0x1f,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14
+,0xc1,0x4b,0xed,0x70,0xb6,0xf7,0x3e,0x7c
+,0x00,0x3b,0x00,0x8f,0xc7,0x3e,0x0e,0x45
+,0x9f,0x1e,0x5d,0xec,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0xc1
+,0x4b,0xed,0x70,0xb6,0xf7,0x3e,0x7c,0x00
+,0x3b,0x00,0x8f,0xc7,0x3e,0x0e,0x45,0x9f
+,0x1e,0x5d,0xec,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x16
+,0xcf,0xee,0x92,0x13,0x50,0xab,0x7b,0x14
+,0x9e,0x33,0xb6,0x42,0x20,0x6a,0xd4,0x15
+,0xbd,0x09,0xab,0xfc,0x72,0xe8,0xef,0x47
+,0x7a,0x90,0xac,0x51,0xc1,0x64,0x4e,0xe9
+,0x88,0xbd,0x43,0x45,0x81,0xe3,0x66,0x23
+,0x3f,0x12,0x86,0x4d,0x19,0xe4,0x05,0xb0
+,0xe6,0x37,0xc2,0x8d,0xda,0x06,0x28,0xc9
+,0x0f,0x89,0xa4,0x53,0xa9,0x75,0x3f,0xb0
+,0x96,0xfb,0xab,0x4c,0x33,0x55,0xf9,0x78
+,0x26,0x46,0x6f,0x1b,0x36,0x98,0xfb,0x42
+,0x76,0xc1,0x82,0xb9,0x8e,0xde,0xfb,0x45
+,0xf9,0x63,0x1b,0x62,0x3b,0x39,0x06,0xca
+,0x77,0x7a,0xa8,0x3c,0x09,0xcf,0x6c,0x36
+,0x3d,0x0f,0x0a,0x45,0x4b,0x69,0x16,0x1a
+,0x45,0x7d,0x33,0x03,0x65,0xf9,0x52,0x71
+,0x90,0x26,0x95,0xac,0x4c,0x0c,0xf5,0x8b
+,0x93,0x3f,0xcc,0x75,0x74,0x85,0x98,0xba
+,0xff,0x62,0x7a,0x4d,0x1f,0x89,0xfe,0xae
+,0xbd,0x94,0x00,0x99,0xbf,0x11,0xa5,0xdc
+,0xe0,0x79,0xc5,0x16,0x0b,0x7d,0x02,0x61
+,0x1d,0xea,0x85,0xf9,0x02,0x15,0x4f,0xe7
+,0x5a,0x89,0x4e,0x14,0x6f,0xe3,0x37,0x4b
+,0x85,0xf5,0xc1,0x3c,0x61,0xe0,0xfd,0x05
+,0x41,0xb2,0x92,0x7f,0xc3,0x1d,0xa0,0xd0
+,0xae,0x52,0x64,0x60,0x6b,0x18,0xc6,0x26
+,0x9c,0xd8,0xf5,0x64,0xe4,0x36,0x1a,0x62
+,0x9f,0x8a,0x0f,0x3e,0xff,0x6d,0x4e,0x19
+,0x56,0x4e,0x20,0x91,0x6c,0x9f,0x34,0x33
+,0x3a,0x34,0x57,0x50,0x3a,0x6f,0x81,0x5e
+,0x06,0xc6,0xf5,0x3e,0x7c,0x4e,0x8e,0x2b
+,0xce,0x65,0x06,0x2e,0x5d,0xd2,0x2a,0x53
+,0x74,0x5e,0xd3,0x6e,0x27,0x9e,0x8f};
+const unsigned int NptTlsTrustAnchor_Base_0127_Size = 943;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0128.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0128.cpp
new file mode 100644
index 0000000..cd84db5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0128.cpp
@@ -0,0 +1,153 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Cybertrust Global Root */
+const unsigned char NptTlsTrustAnchor_Base_0128_Data[933] = {
+0x30,0x82,0x03,0xa1,0x30,0x82,0x02,0x89
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x0b,0x04
+,0x00,0x00,0x00,0x00,0x01,0x0f,0x85,0xaa
+,0x2d,0x48,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x30,0x3b,0x31,0x18,0x30,0x16,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x0f,0x43,0x79
+,0x62,0x65,0x72,0x74,0x72,0x75,0x73,0x74
+,0x2c,0x20,0x49,0x6e,0x63,0x31,0x1f,0x30
+,0x1d,0x06,0x03,0x55,0x04,0x03,0x13,0x16
+,0x43,0x79,0x62,0x65,0x72,0x74,0x72,0x75
+,0x73,0x74,0x20,0x47,0x6c,0x6f,0x62,0x61
+,0x6c,0x20,0x52,0x6f,0x6f,0x74,0x30,0x1e
+,0x17,0x0d,0x30,0x36,0x31,0x32,0x31,0x35
+,0x30,0x38,0x30,0x30,0x30,0x30,0x5a,0x17
+,0x0d,0x32,0x31,0x31,0x32,0x31,0x35,0x30
+,0x38,0x30,0x30,0x30,0x30,0x5a,0x30,0x3b
+,0x31,0x18,0x30,0x16,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x0f,0x43,0x79,0x62,0x65,0x72
+,0x74,0x72,0x75,0x73,0x74,0x2c,0x20,0x49
+,0x6e,0x63,0x31,0x1f,0x30,0x1d,0x06,0x03
+,0x55,0x04,0x03,0x13,0x16,0x43,0x79,0x62
+,0x65,0x72,0x74,0x72,0x75,0x73,0x74,0x20
+,0x47,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x52
+,0x6f,0x6f,0x74,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xf8,0xc8,0xbc,0xbd
+,0x14,0x50,0x66,0x13,0xff,0xf0,0xd3,0x79
+,0xec,0x23,0xf2,0xb7,0x1a,0xc7,0x8e,0x85
+,0xf1,0x12,0x73,0xa6,0x19,0xaa,0x10,0xdb
+,0x9c,0xa2,0x65,0x74,0x5a,0x77,0x3e,0x51
+,0x7d,0x56,0xf6,0xdc,0x23,0xb6,0xd4,0xed
+,0x5f,0x58,0xb1,0x37,0x4d,0xd5,0x49,0x0e
+,0x6e,0xf5,0x6a,0x87,0xd6,0xd2,0x8c,0xd2
+,0x27,0xc6,0xe2,0xff,0x36,0x9f,0x98,0x65
+,0xa0,0x13,0x4e,0xc6,0x2a,0x64,0x9b,0xd5
+,0x90,0x12,0xcf,0x14,0x06,0xf4,0x3b,0xe3
+,0xd4,0x28,0xbe,0xe8,0x0e,0xf8,0xab,0x4e
+,0x48,0x94,0x6d,0x8e,0x95,0x31,0x10,0x5c
+,0xed,0xa2,0x2d,0xbd,0xd5,0x3a,0x6d,0xb2
+,0x1c,0xbb,0x60,0xc0,0x46,0x4b,0x01,0xf5
+,0x49,0xae,0x7e,0x46,0x8a,0xd0,0x74,0x8d
+,0xa1,0x0c,0x02,0xce,0xee,0xfc,0xe7,0x8f
+,0xb8,0x6b,0x66,0xf3,0x7f,0x44,0x00,0xbf
+,0x66,0x25,0x14,0x2b,0xdd,0x10,0x30,0x1d
+,0x07,0x96,0x3f,0x4d,0xf6,0x6b,0xb8,0x8f
+,0xb7,0x7b,0x0c,0xa5,0x38,0xeb,0xde,0x47
+,0xdb,0xd5,0x5d,0x39,0xfc,0x88,0xa7,0xf3
+,0xd7,0x2a,0x74,0xf1,0xe8,0x5a,0xa2,0x3b
+,0x9f,0x50,0xba,0xa6,0x8c,0x45,0x35,0xc2
+,0x50,0x65,0x95,0xdc,0x63,0x82,0xef,0xdd
+,0xbf,0x77,0x4d,0x9c,0x62,0xc9,0x63,0x73
+,0x16,0xd0,0x29,0x0f,0x49,0xa9,0x48,0xf0
+,0xb3,0xaa,0xb7,0x6c,0xc5,0xa7,0x30,0x39
+,0x40,0x5d,0xae,0xc4,0xe2,0x5d,0x26,0x53
+,0xf0,0xce,0x1c,0x23,0x08,0x61,0xa8,0x94
+,0x19,0xba,0x04,0x62,0x40,0xec,0x1f,0x38
+,0x70,0x77,0x12,0x06,0x71,0xa7,0x30,0x18
+,0x5d,0x25,0x27,0xa5,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x81,0xa5,0x30,0x81,0xa2,0x30
+,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01
+,0xff,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0xb6,0x08,0x7b,0x0d,0x7a
+,0xcc,0xac,0x20,0x4c,0x86,0x56,0x32,0x5e
+,0xcf,0xab,0x6e,0x85,0x2d,0x70,0x57,0x30
+,0x3f,0x06,0x03,0x55,0x1d,0x1f,0x04,0x38
+,0x30,0x36,0x30,0x34,0xa0,0x32,0xa0,0x30
+,0x86,0x2e,0x68,0x74,0x74,0x70,0x3a,0x2f
+,0x2f,0x77,0x77,0x77,0x32,0x2e,0x70,0x75
+,0x62,0x6c,0x69,0x63,0x2d,0x74,0x72,0x75
+,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x63
+,0x72,0x6c,0x2f,0x63,0x74,0x2f,0x63,0x74
+,0x72,0x6f,0x6f,0x74,0x2e,0x63,0x72,0x6c
+,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04
+,0x18,0x30,0x16,0x80,0x14,0xb6,0x08,0x7b
+,0x0d,0x7a,0xcc,0xac,0x20,0x4c,0x86,0x56
+,0x32,0x5e,0xcf,0xab,0x6e,0x85,0x2d,0x70
+,0x57,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0x56,0xef,0x0a
+,0x23,0xa0,0x54,0x4e,0x95,0x97,0xc9,0xf8
+,0x89,0xda,0x45,0xc1,0xd4,0xa3,0x00,0x25
+,0xf4,0x1f,0x13,0xab,0xb7,0xa3,0x85,0x58
+,0x69,0xc2,0x30,0xad,0xd8,0x15,0x8a,0x2d
+,0xe3,0xc9,0xcd,0x81,0x5a,0xf8,0x73,0x23
+,0x5a,0xa7,0x7c,0x05,0xf3,0xfd,0x22,0x3b
+,0x0e,0xd1,0x06,0xc4,0xdb,0x36,0x4c,0x73
+,0x04,0x8e,0xe5,0xb0,0x22,0xe4,0xc5,0xf3
+,0x2e,0xa5,0xd9,0x23,0xe3,0xb8,0x4e,0x4a
+,0x20,0xa7,0x6e,0x02,0x24,0x9f,0x22,0x60
+,0x67,0x7b,0x8b,0x1d,0x72,0x09,0xc5,0x31
+,0x5c,0xe9,0x79,0x9f,0x80,0x47,0x3d,0xad
+,0xa1,0x0b,0x07,0x14,0x3d,0x47,0xff,0x03
+,0x69,0x1a,0x0c,0x0b,0x44,0xe7,0x63,0x25
+,0xa7,0x7f,0xb2,0xc9,0xb8,0x76,0x84,0xed
+,0x23,0xf6,0x7d,0x07,0xab,0x45,0x7e,0xd3
+,0xdf,0xb3,0xbf,0xe9,0x8a,0xb6,0xcd,0xa8
+,0xa2,0x67,0x2b,0x52,0xd5,0xb7,0x65,0xf0
+,0x39,0x4c,0x63,0xa0,0x91,0x79,0x93,0x52
+,0x0f,0x54,0xdd,0x83,0xbb,0x9f,0xd1,0x8f
+,0xa7,0x53,0x73,0xc3,0xcb,0xff,0x30,0xec
+,0x7c,0x04,0xb8,0xd8,0x44,0x1f,0x93,0x5f
+,0x71,0x09,0x22,0xb7,0x6e,0x3e,0xea,0x1c
+,0x03,0x4e,0x9d,0x1a,0x20,0x61,0xfb,0x81
+,0x37,0xec,0x5e,0xfc,0x0a,0x45,0xab,0xd7
+,0xe7,0x17,0x55,0xd0,0xa0,0xea,0x60,0x9b
+,0xa6,0xf6,0xe3,0x8c,0x5b,0x29,0xc2,0x06
+,0x60,0x14,0x9d,0x2d,0x97,0x4c,0xa9,0x93
+,0x15,0x9d,0x61,0xc4,0x01,0x5f,0x48,0xd6
+,0x58,0xbd,0x56,0x31,0x12,0x4e,0x11,0xc8
+,0x21,0xe0,0xb3,0x11,0x91,0x65,0xdb,0xb4
+,0xa6,0x88,0x38,0xce,0x55};
+const unsigned int NptTlsTrustAnchor_Base_0128_Size = 933;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0129.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0129.cpp
new file mode 100644
index 0000000..dffc35e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0129.cpp
@@ -0,0 +1,143 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Buypass Class 2 CA 1 */
+const unsigned char NptTlsTrustAnchor_Base_0129_Data[855] = {
+0x30,0x82,0x03,0x53,0x30,0x82,0x02,0x3b
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x4b,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x4e,0x4f,0x31,0x1d
+,0x30,0x1b,0x06,0x03,0x55,0x04,0x0a,0x0c
+,0x14,0x42,0x75,0x79,0x70,0x61,0x73,0x73
+,0x20,0x41,0x53,0x2d,0x39,0x38,0x33,0x31
+,0x36,0x33,0x33,0x32,0x37,0x31,0x1d,0x30
+,0x1b,0x06,0x03,0x55,0x04,0x03,0x0c,0x14
+,0x42,0x75,0x79,0x70,0x61,0x73,0x73,0x20
+,0x43,0x6c,0x61,0x73,0x73,0x20,0x32,0x20
+,0x43,0x41,0x20,0x31,0x30,0x1e,0x17,0x0d
+,0x30,0x36,0x31,0x30,0x31,0x33,0x31,0x30
+,0x32,0x35,0x30,0x39,0x5a,0x17,0x0d,0x31
+,0x36,0x31,0x30,0x31,0x33,0x31,0x30,0x32
+,0x35,0x30,0x39,0x5a,0x30,0x4b,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x4e,0x4f,0x31,0x1d,0x30,0x1b,0x06
+,0x03,0x55,0x04,0x0a,0x0c,0x14,0x42,0x75
+,0x79,0x70,0x61,0x73,0x73,0x20,0x41,0x53
+,0x2d,0x39,0x38,0x33,0x31,0x36,0x33,0x33
+,0x32,0x37,0x31,0x1d,0x30,0x1b,0x06,0x03
+,0x55,0x04,0x03,0x0c,0x14,0x42,0x75,0x79
+,0x70,0x61,0x73,0x73,0x20,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x32,0x20,0x43,0x41,0x20
+,0x31,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0x8b,0x3c,0x07,0x45,0xd8,0xf6
+,0xdf,0xe6,0xc7,0xca,0xba,0x8d,0x43,0xc5
+,0x47,0x8d,0xb0,0x5a,0xc1,0x38,0xdb,0x92
+,0x84,0x1c,0xaf,0x13,0xd4,0x0f,0x6f,0x36
+,0x46,0x20,0xc4,0x2e,0xcc,0x71,0x70,0x34
+,0xa2,0x34,0xd3,0x37,0x2e,0xd8,0xdd,0x3a
+,0x77,0x2f,0xc0,0xeb,0x29,0xe8,0x5c,0xd2
+,0xb5,0xa9,0x91,0x34,0x87,0x22,0x59,0xfe
+,0xcc,0xdb,0xe7,0x99,0xaf,0x96,0xc1,0xa8
+,0xc7,0x40,0xdd,0xa5,0x15,0x8c,0x6e,0xc8
+,0x7c,0x97,0x03,0xcb,0xe6,0x20,0xf2,0xd7
+,0x97,0x5f,0x31,0xa1,0x2f,0x37,0xd2,0xbe
+,0xee,0xbe,0xa9,0xad,0xa8,0x4c,0x9e,0x21
+,0x66,0x43,0x3b,0xa8,0xbc,0xf3,0x09,0xa3
+,0x38,0xd5,0x59,0x24,0xc1,0xc2,0x47,0x76
+,0xb1,0x88,0x5c,0x82,0x3b,0xbb,0x2b,0xa6
+,0x04,0xd7,0x8c,0x07,0x8f,0xcd,0xd5,0x41
+,0x1d,0xf0,0xae,0xb8,0x29,0x2c,0x94,0x52
+,0x60,0x34,0x94,0x3b,0xda,0xe0,0x38,0xd1
+,0x9d,0x33,0x3e,0x15,0xf4,0x93,0x32,0xc5
+,0x00,0xda,0xb5,0x29,0x66,0x0e,0x3a,0x78
+,0x0f,0x21,0x52,0x5f,0x02,0xe5,0x92,0x7b
+,0x25,0xd3,0x92,0x1e,0x2f,0x15,0x9d,0x81
+,0xe4,0x9d,0x8e,0xe8,0xef,0x89,0xce,0x14
+,0x4c,0x54,0x1d,0x1c,0x81,0x12,0x4d,0x70
+,0xa8,0xbe,0x10,0x05,0x17,0x7e,0x1f,0xd1
+,0xb8,0x57,0x55,0xed,0xcd,0xbb,0x52,0xc2
+,0xb0,0x1e,0x78,0xc2,0x4d,0x36,0x68,0xcb
+,0x56,0x26,0xc1,0x52,0xc1,0xbd,0x76,0xf7
+,0x58,0xd5,0x72,0x7e,0x1f,0x44,0x76,0xbb
+,0x00,0x89,0x1d,0x16,0x9d,0x51,0x35,0xef
+,0x4d,0xc2,0x56,0xef,0x6b,0xe0,0x8c,0x3b
+,0x0d,0xe9,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x42,0x30,0x40,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x3f
+,0x8d,0x9a,0x59,0x8b,0xfc,0x7b,0x7b,0x9c
+,0xa3,0xaf,0x38,0xb0,0x39,0xed,0x90,0x71
+,0x80,0xd6,0xc8,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x15
+,0x1a,0x7e,0x13,0x8a,0xb9,0xe8,0x07,0xa3
+,0x4b,0x27,0x32,0xb2,0x40,0x91,0xf2,0x21
+,0xd1,0x64,0x85,0xbe,0x63,0x6a,0xd2,0xcf
+,0x81,0xc2,0x15,0xd5,0x7a,0x7e,0x0c,0x29
+,0xac,0x37,0x1e,0x1c,0x7c,0x76,0x52,0x95
+,0xda,0xb5,0x7f,0x23,0xa1,0x29,0x77,0x65
+,0xc9,0x32,0x9d,0xa8,0x2e,0x56,0xab,0x60
+,0x76,0xce,0x16,0xb4,0x8d,0x7f,0x78,0xc0
+,0xd5,0x99,0x51,0x83,0x7f,0x5e,0xd9,0xbe
+,0x0c,0xa8,0x50,0xed,0x22,0xc7,0xad,0x05
+,0x4c,0x76,0xfb,0xed,0xee,0x1e,0x47,0x64
+,0xf6,0xf7,0x27,0x7d,0x5c,0x28,0x0f,0x45
+,0xc5,0x5c,0x62,0x5e,0xa6,0x9a,0x91,0x91
+,0xb7,0x53,0x17,0x2e,0xdc,0xad,0x60,0x9d
+,0x96,0x64,0x39,0xbd,0x67,0x68,0xb2,0xae
+,0x05,0xcb,0x4d,0xe7,0x5f,0x1f,0x57,0x86
+,0xd5,0x20,0x9c,0x28,0xfb,0x6f,0x13,0x38
+,0xf5,0xf6,0x11,0x92,0xf6,0x7d,0x99,0x5e
+,0x1f,0x0c,0xe8,0xab,0x44,0x24,0x29,0x72
+,0x40,0x3d,0x36,0x52,0xaf,0x8c,0x58,0x90
+,0x73,0xc1,0xec,0x61,0x2c,0x79,0xa1,0xec
+,0x87,0xb5,0x3f,0xda,0x4d,0xd9,0x21,0x00
+,0x30,0xde,0x90,0xda,0x0e,0xd3,0x1a,0x48
+,0xa9,0x3e,0x85,0x0b,0x14,0x8b,0x8c,0xbc
+,0x41,0x9e,0x6a,0xf7,0x0e,0x70,0xc0,0x35
+,0xf7,0x39,0xa2,0x5d,0x66,0xd0,0x7b,0x59
+,0x9f,0xa8,0x47,0x12,0x9a,0x27,0x23,0xa4
+,0x2d,0x8e,0x27,0x83,0x92,0x20,0xa1,0xd7
+,0x15,0x7f,0xf1,0x2e,0x18,0xee,0xf4,0x48
+,0x7f,0x2f,0x7f,0xf1,0xa1,0x18,0xb5,0xa1
+,0x0b,0x94,0xa0,0x62,0x20,0x32,0x9c,0x1d
+,0xf6,0xd4,0xef,0xbf,0x4c,0x88,0x68};
+const unsigned int NptTlsTrustAnchor_Base_0129_Size = 855;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0130.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0130.cpp
new file mode 100644
index 0000000..de0d6a8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0130.cpp
@@ -0,0 +1,143 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Buypass Class 3 CA 1 */
+const unsigned char NptTlsTrustAnchor_Base_0130_Data[855] = {
+0x30,0x82,0x03,0x53,0x30,0x82,0x02,0x3b
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x02
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x4b,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x4e,0x4f,0x31,0x1d
+,0x30,0x1b,0x06,0x03,0x55,0x04,0x0a,0x0c
+,0x14,0x42,0x75,0x79,0x70,0x61,0x73,0x73
+,0x20,0x41,0x53,0x2d,0x39,0x38,0x33,0x31
+,0x36,0x33,0x33,0x32,0x37,0x31,0x1d,0x30
+,0x1b,0x06,0x03,0x55,0x04,0x03,0x0c,0x14
+,0x42,0x75,0x79,0x70,0x61,0x73,0x73,0x20
+,0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20
+,0x43,0x41,0x20,0x31,0x30,0x1e,0x17,0x0d
+,0x30,0x35,0x30,0x35,0x30,0x39,0x31,0x34
+,0x31,0x33,0x30,0x33,0x5a,0x17,0x0d,0x31
+,0x35,0x30,0x35,0x30,0x39,0x31,0x34,0x31
+,0x33,0x30,0x33,0x5a,0x30,0x4b,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x4e,0x4f,0x31,0x1d,0x30,0x1b,0x06
+,0x03,0x55,0x04,0x0a,0x0c,0x14,0x42,0x75
+,0x79,0x70,0x61,0x73,0x73,0x20,0x41,0x53
+,0x2d,0x39,0x38,0x33,0x31,0x36,0x33,0x33
+,0x32,0x37,0x31,0x1d,0x30,0x1b,0x06,0x03
+,0x55,0x04,0x03,0x0c,0x14,0x42,0x75,0x79
+,0x70,0x61,0x73,0x73,0x20,0x43,0x6c,0x61
+,0x73,0x73,0x20,0x33,0x20,0x43,0x41,0x20
+,0x31,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xa4,0x8e,0xd7,0x74,0xd9,0x29
+,0x64,0xde,0x5f,0x1f,0x87,0x80,0x91,0xea
+,0x4e,0x39,0xe6,0x19,0xc6,0x44,0x0b,0x80
+,0xd5,0x0b,0xaf,0x53,0x07,0x8b,0x12,0xbd
+,0xe6,0x67,0xf0,0x02,0xb1,0x89,0xf6,0x60
+,0x8a,0xc4,0x5b,0xb0,0x42,0xd1,0xc0,0x21
+,0xa8,0xcb,0xe1,0x9b,0xef,0x64,0x51,0xb6
+,0xa7,0xcf,0x15,0xf5,0x74,0x80,0x68,0x04
+,0x90,0xa0,0x58,0xa2,0xe6,0x74,0xa6,0x53
+,0x53,0x55,0x48,0x63,0x3f,0x92,0x56,0xdd
+,0x24,0x4e,0x8e,0xf8,0xba,0x2b,0xff,0xf3
+,0x34,0x8a,0x9e,0x28,0xd7,0x34,0x9f,0xac
+,0x2f,0xd6,0x0f,0xf1,0xa4,0x2f,0xbd,0x52
+,0xb2,0x49,0x85,0x6d,0x39,0x35,0xf0,0x44
+,0x30,0x93,0x46,0x24,0xf3,0xb6,0xe7,0x53
+,0xfb,0xbc,0x61,0xaf,0xa9,0xa3,0x14,0xfb
+,0xc2,0x17,0x17,0x84,0x6c,0xe0,0x7c,0x88
+,0xf8,0xc9,0x1c,0x57,0x2c,0xf0,0x3d,0x7e
+,0x94,0xbc,0x25,0x93,0x84,0xe8,0x9a,0x00
+,0x9a,0x45,0x05,0x42,0x57,0x80,0xf4,0x4e
+,0xce,0xd9,0xae,0x39,0xf6,0xc8,0x53,0x10
+,0x0c,0x65,0x3a,0x47,0x7b,0x60,0xc2,0xd6
+,0xfa,0x91,0xc9,0xc6,0x71,0x6c,0xbd,0x91
+,0x87,0x3c,0x91,0x86,0x49,0xab,0xf3,0x0f
+,0xa0,0x6c,0x26,0x76,0x5e,0x1c,0xac,0x9b
+,0x71,0xe5,0x8d,0xbc,0x9b,0x21,0x1e,0x9c
+,0xd6,0x38,0x7e,0x24,0x80,0x15,0x31,0x82
+,0x96,0xb1,0x49,0xd3,0x62,0x37,0x5b,0x88
+,0x0c,0x0a,0x62,0x34,0xfe,0xa7,0x48,0x7e
+,0x99,0xb1,0x30,0x8b,0x90,0x37,0x95,0x1c
+,0xa8,0x1f,0xa5,0x2c,0x8d,0xf4,0x55,0xc8
+,0xdb,0xdd,0x59,0x0a,0xc2,0xad,0x78,0xa0
+,0xf4,0x8b,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x42,0x30,0x40,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x38
+,0x14,0xe6,0xc8,0xf0,0xa9,0xa4,0x03,0xf4
+,0x4e,0x3e,0x22,0xa3,0x5b,0xf2,0xd6,0xe0
+,0xad,0x40,0x74,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x01
+,0x67,0xa3,0x8c,0xc9,0x25,0x3d,0x13,0x63
+,0x5d,0x16,0x6f,0xec,0xa1,0x3e,0x09,0x5c
+,0x91,0x15,0x2a,0x2a,0xd9,0x80,0x21,0x4f
+,0x05,0xdc,0xbb,0xa5,0x89,0xab,0x13,0x33
+,0x2a,0x9e,0x38,0xb7,0x8c,0x6f,0x02,0x72
+,0x63,0xc7,0x73,0x77,0x1e,0x09,0x06,0xba
+,0x3b,0x28,0x7b,0xa4,0x47,0xc9,0x61,0x6b
+,0x08,0x08,0x20,0xfc,0x8a,0x05,0x8a,0x1f
+,0xbc,0xba,0xc6,0xc2,0xfe,0xcf,0x6e,0xec
+,0x13,0x33,0x71,0x67,0x2e,0x69,0xfa,0xa9
+,0x2c,0x3f,0x66,0xc0,0x12,0x59,0x4d,0x0b
+,0x54,0x02,0x92,0x84,0xbb,0xdb,0x12,0xef
+,0x83,0x70,0x70,0x78,0xc8,0x53,0xfa,0xdf
+,0xc6,0xc6,0xff,0xdc,0x88,0x2f,0x07,0xc0
+,0x49,0x9d,0x32,0x57,0x60,0xd3,0xf2,0xf6
+,0x99,0x29,0x5f,0xe7,0xaa,0x01,0xcc,0xac
+,0x33,0xa8,0x1c,0x0a,0xbb,0x91,0xc4,0x03
+,0xa0,0x6f,0xb6,0x34,0xf9,0x86,0xd3,0xb3
+,0x76,0x54,0x98,0xf4,0x4a,0x81,0xb3,0x53
+,0x9d,0x4d,0x40,0xec,0xe5,0x77,0x13,0x45
+,0xaf,0x5b,0xaa,0x1f,0xd8,0x2f,0x4c,0x82
+,0x7b,0xfe,0x2a,0xc4,0x58,0xbb,0x4f,0xfc
+,0x9e,0xfd,0x03,0x65,0x1a,0x2a,0x0e,0xc3
+,0xa5,0x20,0x16,0x94,0x6b,0x79,0xa6,0xa2
+,0x12,0xb4,0xbb,0x1a,0xa4,0x23,0x7a,0x5f
+,0xf0,0xae,0x84,0x24,0xe4,0xf3,0x2b,0xfb
+,0x8a,0x24,0xa3,0x27,0x98,0x65,0xda,0x30
+,0x75,0x76,0xfc,0x19,0x91,0xe8,0xdb,0xeb
+,0x9b,0x3f,0x32,0xbf,0x40,0x97,0x07,0x26
+,0xba,0xcc,0xf3,0x94,0x85,0x4a,0x7a,0x27
+,0x93,0xcf,0x90,0x42,0xd4,0xb8,0x5b,0x16
+,0xa6,0xe7,0xcb,0x40,0x03,0xdd,0x79};
+const unsigned int NptTlsTrustAnchor_Base_0130_Size = 855;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0131.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0131.cpp
new file mode 100644
index 0000000..463e925
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0131.cpp
@@ -0,0 +1,140 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* certSIGN ROOT CA */
+const unsigned char NptTlsTrustAnchor_Base_0131_Data[828] = {
+0x30,0x82,0x03,0x38,0x30,0x82,0x02,0x20
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x06,0x20
+,0x06,0x05,0x16,0x70,0x02,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x30,0x3b,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x52,0x4f,0x31,0x11,0x30,0x0f,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x08,0x63,0x65
+,0x72,0x74,0x53,0x49,0x47,0x4e,0x31,0x19
+,0x30,0x17,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x10,0x63,0x65,0x72,0x74,0x53,0x49,0x47
+,0x4e,0x20,0x52,0x4f,0x4f,0x54,0x20,0x43
+,0x41,0x30,0x1e,0x17,0x0d,0x30,0x36,0x30
+,0x37,0x30,0x34,0x31,0x37,0x32,0x30,0x30
+,0x34,0x5a,0x17,0x0d,0x33,0x31,0x30,0x37
+,0x30,0x34,0x31,0x37,0x32,0x30,0x30,0x34
+,0x5a,0x30,0x3b,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x52,0x4f
+,0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04
+,0x0a,0x13,0x08,0x63,0x65,0x72,0x74,0x53
+,0x49,0x47,0x4e,0x31,0x19,0x30,0x17,0x06
+,0x03,0x55,0x04,0x0b,0x13,0x10,0x63,0x65
+,0x72,0x74,0x53,0x49,0x47,0x4e,0x20,0x52
+,0x4f,0x4f,0x54,0x20,0x43,0x41,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xb7
+,0x33,0xb9,0x7e,0xc8,0x25,0x4a,0x8e,0xb5
+,0xdb,0xb4,0x28,0x1b,0xaa,0x57,0x90,0xe8
+,0xd1,0x22,0xd3,0x64,0xba,0xd3,0x93,0xe8
+,0xd4,0xac,0x86,0x61,0x40,0x6a,0x60,0x57
+,0x68,0x54,0x84,0x4d,0xbc,0x6a,0x54,0x02
+,0x05,0xff,0xdf,0x9b,0x9a,0x2a,0xae,0x5d
+,0x07,0x8f,0x4a,0xc3,0x28,0x7f,0xef,0xfb
+,0x2b,0xfa,0x79,0xf1,0xc7,0xad,0xf0,0x10
+,0x53,0x24,0x90,0x8b,0x66,0xc9,0xa8,0x88
+,0xab,0xaf,0x5a,0xa3,0x00,0xe9,0xbe,0xba
+,0x46,0xee,0x5b,0x73,0x7b,0x2c,0x17,0x82
+,0x81,0x5e,0x62,0x2c,0xa1,0x02,0x65,0xb3
+,0xbd,0xc5,0x2b,0x00,0x7e,0xc4,0xfc,0x03
+,0x33,0x57,0x0d,0xed,0xe2,0xfa,0xce,0x5d
+,0x45,0xd6,0x38,0xcd,0x35,0xb6,0xb2,0xc1
+,0xd0,0x9c,0x81,0x4a,0xaa,0xe4,0xb2,0x01
+,0x5c,0x1d,0x8f,0x5f,0x99,0xc4,0xb1,0xad
+,0xdb,0x88,0x21,0xeb,0x90,0x08,0x82,0x80
+,0xf3,0x30,0xa3,0x43,0xe6,0x90,0x82,0xae
+,0x55,0x28,0x49,0xed,0x5b,0xd7,0xa9,0x10
+,0x38,0x0e,0xfe,0x8f,0x4c,0x5b,0x9b,0x46
+,0xea,0x41,0xf5,0xb0,0x08,0x74,0xc3,0xd0
+,0x88,0x33,0xb6,0x7c,0xd7,0x74,0xdf,0xdc
+,0x84,0xd1,0x43,0x0e,0x75,0x39,0xa1,0x25
+,0x40,0x28,0xea,0x78,0xcb,0x0e,0x2c,0x2e
+,0x39,0x9d,0x8c,0x8b,0x6e,0x16,0x1c,0x2f
+,0x26,0x82,0x10,0xe2,0xe3,0x65,0x94,0x0a
+,0x04,0xc0,0x5e,0xf7,0x5d,0x5b,0xf8,0x10
+,0xe2,0xd0,0xba,0x7a,0x4b,0xfb,0xde,0x37
+,0x00,0x00,0x1a,0x5b,0x28,0xe3,0xd2,0x9c
+,0x73,0x3e,0x32,0x87,0x98,0xa1,0xc9,0x51
+,0x2f,0xd7,0xde,0xac,0x33,0xb3,0x4f,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x42,0x30,0x40
+,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01
+,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0xc6,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0xe0,0x8c,0x9b,0xdb
+,0x25,0x49,0xb3,0xf1,0x7c,0x86,0xd6,0xb2
+,0x42,0x87,0x0b,0xd0,0x6b,0xa0,0xd9,0xe4
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x3e,0xd2,0x1c,0x89
+,0x2e,0x35,0xfc,0xf8,0x75,0xdd,0xe6,0x7f
+,0x65,0x88,0xf4,0x72,0x4c,0xc9,0x2c,0xd7
+,0x32,0x4e,0xf3,0xdd,0x19,0x79,0x47,0xbd
+,0x8e,0x3b,0x5b,0x93,0x0f,0x50,0x49,0x24
+,0x13,0x6b,0x14,0x06,0x72,0xef,0x09,0xd3
+,0xa1,0xa1,0xe3,0x40,0x84,0xc9,0xe7,0x18
+,0x32,0x74,0x3c,0x48,0x6e,0x0f,0x9f,0x4b
+,0xd4,0xf7,0x1e,0xd3,0x93,0x86,0x64,0x54
+,0x97,0x63,0x72,0x50,0xd5,0x55,0xcf,0xfa
+,0x20,0x93,0x02,0xa2,0x9b,0xc3,0x23,0x93
+,0x4e,0x16,0x55,0x76,0xa0,0x70,0x79,0x6d
+,0xcd,0x21,0x1f,0xcf,0x2f,0x2d,0xbc,0x19
+,0xe3,0x88,0x31,0xf8,0x59,0x1a,0x81,0x09
+,0xc8,0x97,0xa6,0x74,0xc7,0x60,0xc4,0x5b
+,0xcc,0x57,0x8e,0xb2,0x75,0xfd,0x1b,0x02
+,0x09,0xdb,0x59,0x6f,0x72,0x93,0x69,0xf7
+,0x31,0x41,0xd6,0x88,0x38,0xbf,0x87,0xb2
+,0xbd,0x16,0x79,0xf9,0xaa,0xe4,0xbe,0x88
+,0x25,0xdd,0x61,0x27,0x23,0x1c,0xb5,0x31
+,0x07,0x04,0x36,0xb4,0x1a,0x90,0xbd,0xa0
+,0x74,0x71,0x50,0x89,0x6d,0xbc,0x14,0xe3
+,0x0f,0x86,0xae,0xf1,0xab,0x3e,0xc7,0xa0
+,0x09,0xcc,0xa3,0x48,0xd1,0xe0,0xdb,0x64
+,0xe7,0x92,0xb5,0xcf,0xaf,0x72,0x43,0x70
+,0x8b,0xf9,0xc3,0x84,0x3c,0x13,0xaa,0x7e
+,0x92,0x9b,0x57,0x53,0x93,0xfa,0x70,0xc2
+,0x91,0x0e,0x31,0xf9,0x9b,0x67,0x5d,0xe9
+,0x96,0x38,0x5e,0x5f,0xb3,0x73,0x4e,0x88
+,0x15,0x67,0xde,0x9e,0x76,0x10,0x62,0x20
+,0xbe,0x55,0x69,0x95,0x43,0x00,0x39,0x4d
+,0xf6,0xee,0xb0,0x5a,0x4e,0x49,0x44,0x54
+,0x58,0x5f,0x42,0x83};
+const unsigned int NptTlsTrustAnchor_Base_0131_Size = 828;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0132.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0132.cpp
new file mode 100644
index 0000000..519a971
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0132.cpp
@@ -0,0 +1,153 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* ApplicationCA - Japanese Government */
+const unsigned char NptTlsTrustAnchor_Base_0132_Data[932] = {
+0x30,0x82,0x03,0xa0,0x30,0x82,0x02,0x88
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x31
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x43,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x4a,0x50,0x31,0x1c
+,0x30,0x1a,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x13,0x4a,0x61,0x70,0x61,0x6e,0x65,0x73
+,0x65,0x20,0x47,0x6f,0x76,0x65,0x72,0x6e
+,0x6d,0x65,0x6e,0x74,0x31,0x16,0x30,0x14
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x0d,0x41
+,0x70,0x70,0x6c,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x43,0x41,0x30,0x1e,0x17,0x0d
+,0x30,0x37,0x31,0x32,0x31,0x32,0x31,0x35
+,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x31
+,0x37,0x31,0x32,0x31,0x32,0x31,0x35,0x30
+,0x30,0x30,0x30,0x5a,0x30,0x43,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x4a,0x50,0x31,0x1c,0x30,0x1a,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x13,0x4a,0x61
+,0x70,0x61,0x6e,0x65,0x73,0x65,0x20,0x47
+,0x6f,0x76,0x65,0x72,0x6e,0x6d,0x65,0x6e
+,0x74,0x31,0x16,0x30,0x14,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x0d,0x41,0x70,0x70,0x6c
+,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x43
+,0x41,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xa7,0x6d,0xe0,0x74,0x4e,0x87
+,0x8f,0xa5,0x06,0xde,0x68,0xa2,0xdb,0x86
+,0x99,0x4b,0x64,0x0d,0x71,0xf0,0x0a,0x05
+,0x9b,0x8e,0xaa,0xe1,0xcc,0x2e,0xd2,0x6a
+,0x3b,0xc1,0x7a,0xb4,0x97,0x61,0x8d,0x8a
+,0xbe,0xc6,0x9a,0x9c,0x06,0xb4,0x86,0x51
+,0xe4,0x37,0x0e,0x74,0x78,0x7e,0x5f,0x8a
+,0x7f,0x94,0xa4,0xd7,0x47,0x08,0xfd,0x50
+,0x5a,0x56,0xe4,0x68,0xac,0x28,0x73,0xa0
+,0x7b,0xe9,0x7f,0x18,0x92,0x40,0x4f,0x2d
+,0x9d,0xf5,0xae,0x44,0x48,0x73,0x36,0x06
+,0x9e,0x64,0x2c,0x3b,0x34,0x23,0xdb,0x5c
+,0x26,0xe4,0x71,0x79,0x8f,0xd4,0x6e,0x79
+,0x22,0xb9,0x93,0xc1,0xca,0xcd,0xc1,0x56
+,0xed,0x88,0x6a,0xd7,0xa0,0x39,0x21,0x04
+,0x57,0x2c,0xa2,0xf5,0xbc,0x47,0x41,0x4f
+,0x5e,0x34,0x22,0x95,0xb5,0x1f,0x29,0x6d
+,0x5e,0x4a,0xf3,0x4d,0x72,0xbe,0x41,0x56
+,0x20,0x87,0xfc,0xe9,0x50,0x47,0xd7,0x30
+,0x14,0xee,0x5c,0x8c,0x55,0xba,0x59,0x8d
+,0x87,0xfc,0x23,0xde,0x93,0xd0,0x04,0x8c
+,0xfd,0xef,0x6d,0xbd,0xd0,0x7a,0xc9,0xa5
+,0x3a,0x6a,0x72,0x33,0xc6,0x4a,0x0d,0x05
+,0x17,0x2a,0x2d,0x7b,0xb1,0xa7,0xd8,0xd6
+,0xf0,0xbe,0xf4,0x3f,0xea,0x0e,0x28,0x6d
+,0x41,0x61,0x23,0x76,0x78,0xc3,0xb8,0x65
+,0xa4,0xf3,0x5a,0xae,0xcc,0xc2,0xaa,0xd9
+,0xe7,0x58,0xde,0xb6,0x7e,0x9d,0x85,0x6e
+,0x9f,0x2a,0x0a,0x6f,0x9f,0x03,0x29,0x30
+,0x97,0x28,0x1d,0xbc,0xb7,0xcf,0x54,0x29
+,0x4e,0x51,0x31,0xf9,0x27,0xb6,0x28,0x26
+,0xfe,0xa2,0x63,0xe6,0x41,0x16,0xf0,0x33
+,0x98,0x47,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x81,0x9e,0x30,0x81,0x9b,0x30,0x1d,0x06
+,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14
+,0x54,0x5a,0xcb,0x26,0x3f,0x71,0xcc,0x94
+,0x46,0x0d,0x96,0x53,0xea,0x6b,0x48,0xd0
+,0x93,0xfe,0x42,0x75,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x06,0x30,0x59,0x06,0x03
+,0x55,0x1d,0x11,0x04,0x52,0x30,0x50,0xa4
+,0x4e,0x30,0x4c,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x4a,0x50
+,0x31,0x18,0x30,0x16,0x06,0x03,0x55,0x04
+,0x0a,0x0c,0x0f,0xe6,0x97,0xa5,0xe6,0x9c
+,0xac,0xe5,0x9b,0xbd,0xe6,0x94,0xbf,0xe5
+,0xba,0x9c,0x31,0x23,0x30,0x21,0x06,0x03
+,0x55,0x04,0x0b,0x0c,0x1a,0xe3,0x82,0xa2
+,0xe3,0x83,0x97,0xe3,0x83,0xaa,0xe3,0x82
+,0xb1,0xe3,0x83,0xbc,0xe3,0x82,0xb7,0xe3
+,0x83,0xa7,0xe3,0x83,0xb3,0x43,0x41,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x39,0x6a,0x44,0x76
+,0x77,0x38,0x3a,0xec,0xa3,0x67,0x46,0x0f
+,0xf9,0x8b,0x06,0xa8,0xfb,0x6a,0x90,0x31
+,0xce,0x7e,0xec,0xda,0xd1,0x89,0x7c,0x7a
+,0xeb,0x2e,0x0c,0xbd,0x99,0x32,0xe7,0xb0
+,0x24,0xd6,0xc3,0xff,0xf5,0xb2,0x88,0x09
+,0x87,0x2c,0xe3,0x54,0xe1,0xa3,0xa6,0xb2
+,0x08,0x0b,0xc0,0x85,0xa8,0xc8,0xd2,0x9c
+,0x71,0xf6,0x1d,0x9f,0x60,0xfc,0x38,0x33
+,0x13,0xe1,0x9e,0xdc,0x0b,0x5f,0xda,0x16
+,0x50,0x29,0x7b,0x2f,0x70,0x91,0x0f,0x99
+,0xba,0x34,0x34,0x8d,0x95,0x74,0xc5,0x7e
+,0x78,0xa9,0x66,0x5d,0xbd,0xca,0x21,0x77
+,0x42,0x10,0xac,0x66,0x26,0x3d,0xde,0x91
+,0xab,0xfd,0x15,0xf0,0x6f,0xed,0x6c,0x5f
+,0x10,0xf8,0xf3,0x16,0xf6,0x03,0x8a,0x8f
+,0xa7,0x12,0x11,0x0c,0xcb,0xfd,0x3f,0x79
+,0xc1,0x9c,0xfd,0x62,0xee,0xa3,0xcf,0x54
+,0x0c,0xd1,0x2b,0x5f,0x17,0x3e,0xe3,0x3e
+,0xbf,0xc0,0x2b,0x3e,0x09,0x9b,0xfe,0x88
+,0xa6,0x7e,0xb4,0x92,0x17,0xfc,0x23,0x94
+,0x81,0xbd,0x6e,0xa7,0xc5,0x8c,0xc2,0xeb
+,0x11,0x45,0xdb,0xf8,0x41,0xc9,0x96,0x76
+,0xea,0x70,0x5f,0x79,0x12,0x6b,0xe4,0xa3
+,0x07,0x5a,0x05,0xef,0x27,0x49,0xcf,0x21
+,0x9f,0x8a,0x4c,0x09,0x70,0x66,0xa9,0x26
+,0xc1,0x2b,0x11,0x4e,0x33,0xd2,0x0e,0xfc
+,0xd6,0x6c,0xd2,0x0e,0x32,0x64,0x68,0xff
+,0xad,0x05,0x78,0x5f,0x03,0x1d,0xa8,0xe3
+,0x90,0xac,0x24,0xe0,0x0f,0x40,0xa7,0x4b
+,0xae,0x8b,0x28,0xb7,0x82,0xca,0x18,0x07
+,0xe6,0xb7,0x5b,0x74,0xe9,0x20,0x19,0x7f
+,0xb2,0x1b,0x89,0x54};
+const unsigned int NptTlsTrustAnchor_Base_0132_Size = 932;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0133.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0133.cpp
new file mode 100644
index 0000000..e4dbbf9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0133.cpp
@@ -0,0 +1,165 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GeoTrust Primary Certification Authority - G3 */
+const unsigned char NptTlsTrustAnchor_Base_0133_Data[1026] = {
+0x30,0x82,0x03,0xfe,0x30,0x82,0x02,0xe6
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x15
+,0xac,0x6e,0x94,0x19,0xb2,0x79,0x4b,0x41
+,0xf6,0x27,0xa9,0xc3,0x18,0x0f,0x1f,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x81
+,0x98,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16
+,0x30,0x14,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0d,0x47,0x65,0x6f,0x54,0x72,0x75,0x73
+,0x74,0x20,0x49,0x6e,0x63,0x2e,0x31,0x39
+,0x30,0x37,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x30,0x28,0x63,0x29,0x20,0x32,0x30,0x30
+,0x38,0x20,0x47,0x65,0x6f,0x54,0x72,0x75
+,0x73,0x74,0x20,0x49,0x6e,0x63,0x2e,0x20
+,0x2d,0x20,0x46,0x6f,0x72,0x20,0x61,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64
+,0x20,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c
+,0x79,0x31,0x36,0x30,0x34,0x06,0x03,0x55
+,0x04,0x03,0x13,0x2d,0x47,0x65,0x6f,0x54
+,0x72,0x75,0x73,0x74,0x20,0x50,0x72,0x69
+,0x6d,0x61,0x72,0x79,0x20,0x43,0x65,0x72
+,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69
+,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f
+,0x72,0x69,0x74,0x79,0x20,0x2d,0x20,0x47
+,0x33,0x30,0x1e,0x17,0x0d,0x30,0x38,0x30
+,0x34,0x30,0x32,0x30,0x30,0x30,0x30,0x30
+,0x30,0x5a,0x17,0x0d,0x33,0x37,0x31,0x32
+,0x30,0x31,0x32,0x33,0x35,0x39,0x35,0x39
+,0x5a,0x30,0x81,0x98,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55
+,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0d,0x47,0x65,0x6f,0x54
+,0x72,0x75,0x73,0x74,0x20,0x49,0x6e,0x63
+,0x2e,0x31,0x39,0x30,0x37,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x30,0x28,0x63,0x29,0x20
+,0x32,0x30,0x30,0x38,0x20,0x47,0x65,0x6f
+,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6e
+,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f,0x72
+,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x7a,0x65,0x64,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x6e,0x6c,0x79,0x31,0x36,0x30,0x34
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2d,0x47
+,0x65,0x6f,0x54,0x72,0x75,0x73,0x74,0x20
+,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20
+,0x2d,0x20,0x47,0x33,0x30,0x82,0x01,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a
+,0x02,0x82,0x01,0x01,0x00,0xdc,0xe2,0x5e
+,0x62,0x58,0x1d,0x33,0x57,0x39,0x32,0x33
+,0xfa,0xeb,0xcb,0x87,0x8c,0xa7,0xd4,0x4a
+,0xdd,0x06,0x88,0xea,0x64,0x8e,0x31,0x98
+,0xa5,0x38,0x90,0x1e,0x98,0xcf,0x2e,0x63
+,0x2b,0xf0,0x46,0xbc,0x44,0xb2,0x89,0xa1
+,0xc0,0x28,0x0c,0x49,0x70,0x21,0x95,0x9f
+,0x64,0xc0,0xa6,0x93,0x12,0x02,0x65,0x26
+,0x86,0xc6,0xa5,0x89,0xf0,0xfa,0xd7,0x84
+,0xa0,0x70,0xaf,0x4f,0x1a,0x97,0x3f,0x06
+,0x44,0xd5,0xc9,0xeb,0x72,0x10,0x7d,0xe4
+,0x31,0x28,0xfb,0x1c,0x61,0xe6,0x28,0x07
+,0x44,0x73,0x92,0x22,0x69,0xa7,0x03,0x88
+,0x6c,0x9d,0x63,0xc8,0x52,0xda,0x98,0x27
+,0xe7,0x08,0x4c,0x70,0x3e,0xb4,0xc9,0x12
+,0xc1,0xc5,0x67,0x83,0x5d,0x33,0xf3,0x03
+,0x11,0xec,0x6a,0xd0,0x53,0xe2,0xd1,0xba
+,0x36,0x60,0x94,0x80,0xbb,0x61,0x63,0x6c
+,0x5b,0x17,0x7e,0xdf,0x40,0x94,0x1e,0xab
+,0x0d,0xc2,0x21,0x28,0x70,0x88,0xff,0xd6
+,0x26,0x6c,0x6c,0x60,0x04,0x25,0x4e,0x55
+,0x7e,0x7d,0xef,0xbf,0x94,0x48,0xde,0xb7
+,0x1d,0xdd,0x70,0x8d,0x05,0x5f,0x88,0xa5
+,0x9b,0xf2,0xc2,0xee,0xea,0xd1,0x40,0x41
+,0x6d,0x62,0x38,0x1d,0x56,0x06,0xc5,0x03
+,0x47,0x51,0x20,0x19,0xfc,0x7b,0x10,0x0b
+,0x0e,0x62,0xae,0x76,0x55,0xbf,0x5f,0x77
+,0xbe,0x3e,0x49,0x01,0x53,0x3d,0x98,0x25
+,0x03,0x76,0x24,0x5a,0x1d,0xb4,0xdb,0x89
+,0xea,0x79,0xe5,0xb6,0xb3,0x3b,0x3f,0xba
+,0x4c,0x28,0x41,0x7f,0x06,0xac,0x6a,0x8e
+,0xc1,0xd0,0xf6,0x05,0x1d,0x7d,0xe6,0x42
+,0x86,0xe3,0xa5,0xd5,0x47,0x02,0x03,0x01
+,0x00,0x01,0xa3,0x42,0x30,0x40,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01
+,0xff,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0xc4,0x79,0xca,0x8e,0xa1,0x4e
+,0x03,0x1d,0x1c,0xdc,0x6b,0xdb,0x31,0x5b
+,0x94,0x3e,0x3f,0x30,0x7f,0x2d,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x01
+,0x01,0x00,0x2d,0xc5,0x13,0xcf,0x56,0x80
+,0x7b,0x7a,0x78,0xbd,0x9f,0xae,0x2c,0x99
+,0xe7,0xef,0xda,0xdf,0x94,0x5e,0x09,0x69
+,0xa7,0xe7,0x6e,0x68,0x8c,0xbd,0x72,0xbe
+,0x47,0xa9,0x0e,0x97,0x12,0xb8,0x4a,0xf1
+,0x64,0xd3,0x39,0xdf,0x25,0x34,0xd4,0xc1
+,0xcd,0x4e,0x81,0xf0,0x0f,0x04,0xc4,0x24
+,0xb3,0x34,0x96,0xc6,0xa6,0xaa,0x30,0xdf
+,0x68,0x61,0x73,0xd7,0xf9,0x8e,0x85,0x89
+,0xef,0x0e,0x5e,0x95,0x28,0x4a,0x2a,0x27
+,0x8f,0x10,0x8e,0x2e,0x7c,0x86,0xc4,0x02
+,0x9e,0xda,0x0c,0x77,0x65,0x0e,0x44,0x0d
+,0x92,0xfd,0xfd,0xb3,0x16,0x36,0xfa,0x11
+,0x0d,0x1d,0x8c,0x0e,0x07,0x89,0x6a,0x29
+,0x56,0xf7,0x72,0xf4,0xdd,0x15,0x9c,0x77
+,0x35,0x66,0x57,0xab,0x13,0x53,0xd8,0x8e
+,0xc1,0x40,0xc5,0xd7,0x13,0x16,0x5a,0x72
+,0xc7,0xb7,0x69,0x01,0xc4,0x7a,0xb1,0x83
+,0x01,0x68,0x7d,0x8d,0x41,0xa1,0x94,0x18
+,0xc1,0x25,0x5c,0xfc,0xf0,0xfe,0x83,0x02
+,0x87,0x7c,0x0d,0x0d,0xcf,0x2e,0x08,0x5c
+,0x4a,0x40,0x0d,0x3e,0xec,0x81,0x61,0xe6
+,0x24,0xdb,0xca,0xe0,0x0e,0x2d,0x07,0xb2
+,0x3e,0x56,0xdc,0x8d,0xf5,0x41,0x85,0x07
+,0x48,0x9b,0x0c,0x0b,0xcb,0x49,0x3f,0x7d
+,0xec,0xb7,0xfd,0xcb,0x8d,0x67,0x89,0x1a
+,0xab,0xed,0xbb,0x1e,0xa3,0x00,0x08,0x08
+,0x17,0x2a,0x82,0x5c,0x31,0x5d,0x46,0x8a
+,0x2d,0x0f,0x86,0x9b,0x74,0xd9,0x45,0xfb
+,0xd4,0x40,0xb1,0x7a,0xaa,0x68,0x2d,0x86
+,0xb2,0x99,0x22,0xe1,0xc1,0x2b,0xc7,0x9c
+,0xf8,0xf3,0x5f,0xa8,0x82,0x12,0xeb,0x19
+,0x11,0x2d};
+const unsigned int NptTlsTrustAnchor_Base_0133_Size = 1026;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0134.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0134.cpp
new file mode 100644
index 0000000..7740ab8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0134.cpp
@@ -0,0 +1,170 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* thawte Primary Root CA - G2 */
+const unsigned char NptTlsTrustAnchor_Base_0134_Data[1070] = {
+0x30,0x82,0x04,0x2a,0x30,0x82,0x03,0x12
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x60
+,0x01,0x97,0xb7,0x46,0xa7,0xea,0xb4,0xb4
+,0x9a,0xd6,0x4b,0x2f,0xf7,0x90,0xfb,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x81
+,0xae,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15
+,0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0c,0x74,0x68,0x61,0x77,0x74,0x65,0x2c
+,0x20,0x49,0x6e,0x63,0x2e,0x31,0x28,0x30
+,0x26,0x06,0x03,0x55,0x04,0x0b,0x13,0x1f
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x53,0x65
+,0x72,0x76,0x69,0x63,0x65,0x73,0x20,0x44
+,0x69,0x76,0x69,0x73,0x69,0x6f,0x6e,0x31
+,0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x2f,0x28,0x63,0x29,0x20,0x32,0x30
+,0x30,0x38,0x20,0x74,0x68,0x61,0x77,0x74
+,0x65,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x20
+,0x2d,0x20,0x46,0x6f,0x72,0x20,0x61,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x7a,0x65,0x64
+,0x20,0x75,0x73,0x65,0x20,0x6f,0x6e,0x6c
+,0x79,0x31,0x24,0x30,0x22,0x06,0x03,0x55
+,0x04,0x03,0x13,0x1b,0x74,0x68,0x61,0x77
+,0x74,0x65,0x20,0x50,0x72,0x69,0x6d,0x61
+,0x72,0x79,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x41,0x20,0x2d,0x20,0x47,0x33,0x30
+,0x1e,0x17,0x0d,0x30,0x38,0x30,0x34,0x30
+,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x5a
+,0x17,0x0d,0x33,0x37,0x31,0x32,0x30,0x31
+,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30
+,0x81,0xae,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0a
+,0x13,0x0c,0x74,0x68,0x61,0x77,0x74,0x65
+,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x28
+,0x30,0x26,0x06,0x03,0x55,0x04,0x0b,0x13
+,0x1f,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x53
+,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x20
+,0x44,0x69,0x76,0x69,0x73,0x69,0x6f,0x6e
+,0x31,0x38,0x30,0x36,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x2f,0x28,0x63,0x29,0x20,0x32
+,0x30,0x30,0x38,0x20,0x74,0x68,0x61,0x77
+,0x74,0x65,0x2c,0x20,0x49,0x6e,0x63,0x2e
+,0x20,0x2d,0x20,0x46,0x6f,0x72,0x20,0x61
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x7a,0x65
+,0x64,0x20,0x75,0x73,0x65,0x20,0x6f,0x6e
+,0x6c,0x79,0x31,0x24,0x30,0x22,0x06,0x03
+,0x55,0x04,0x03,0x13,0x1b,0x74,0x68,0x61
+,0x77,0x74,0x65,0x20,0x50,0x72,0x69,0x6d
+,0x61,0x72,0x79,0x20,0x52,0x6f,0x6f,0x74
+,0x20,0x43,0x41,0x20,0x2d,0x20,0x47,0x33
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xb2,0xbf,0x27,0x2c,0xfb,0xdb,0xd8
+,0x5b,0xdd,0x78,0x7b,0x1b,0x9e,0x77,0x66
+,0x81,0xcb,0x3e,0xbc,0x7c,0xae,0xf3,0xa6
+,0x27,0x9a,0x34,0xa3,0x68,0x31,0x71,0x38
+,0x33,0x62,0xe4,0xf3,0x71,0x66,0x79,0xb1
+,0xa9,0x65,0xa3,0xa5,0x8b,0xd5,0x8f,0x60
+,0x2d,0x3f,0x42,0xcc,0xaa,0x6b,0x32,0xc0
+,0x23,0xcb,0x2c,0x41,0xdd,0xe4,0xdf,0xfc
+,0x61,0x9c,0xe2,0x73,0xb2,0x22,0x95,0x11
+,0x43,0x18,0x5f,0xc4,0xb6,0x1f,0x57,0x6c
+,0x0a,0x05,0x58,0x22,0xc8,0x36,0x4c,0x3a
+,0x7c,0xa5,0xd1,0xcf,0x86,0xaf,0x88,0xa7
+,0x44,0x02,0x13,0x74,0x71,0x73,0x0a,0x42
+,0x59,0x02,0xf8,0x1b,0x14,0x6b,0x42,0xdf
+,0x6f,0x5f,0xba,0x6b,0x82,0xa2,0x9d,0x5b
+,0xe7,0x4a,0xbd,0x1e,0x01,0x72,0xdb,0x4b
+,0x74,0xe8,0x3b,0x7f,0x7f,0x7d,0x1f,0x04
+,0xb4,0x26,0x9b,0xe0,0xb4,0x5a,0xac,0x47
+,0x3d,0x55,0xb8,0xd7,0xb0,0x26,0x52,0x28
+,0x01,0x31,0x40,0x66,0xd8,0xd9,0x24,0xbd
+,0xf6,0x2a,0xd8,0xec,0x21,0x49,0x5c,0x9b
+,0xf6,0x7a,0xe9,0x7f,0x55,0x35,0x7e,0x96
+,0x6b,0x8d,0x93,0x93,0x27,0xcb,0x92,0xbb
+,0xea,0xac,0x40,0xc0,0x9f,0xc2,0xf8,0x80
+,0xcf,0x5d,0xf4,0x5a,0xdc,0xce,0x74,0x86
+,0xa6,0x3e,0x6c,0x0b,0x53,0xca,0xbd,0x92
+,0xce,0x19,0x06,0x72,0xe6,0x0c,0x5c,0x38
+,0x69,0xc7,0x04,0xd6,0xbc,0x6c,0xce,0x5b
+,0xf6,0xf7,0x68,0x9c,0xdc,0x25,0x15,0x48
+,0x88,0xa1,0xe9,0xa9,0xf8,0x98,0x9c,0xe0
+,0xf3,0xd5,0x31,0x28,0x61,0x11,0x6c,0x67
+,0x96,0x8d,0x39,0x99,0xcb,0xc2,0x45,0x24
+,0x39,0x02,0x03,0x01,0x00,0x01,0xa3,0x42
+,0x30,0x40,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0xad,0x6c
+,0xaa,0x94,0x60,0x9c,0xed,0xe4,0xff,0xfa
+,0x3e,0x0a,0x74,0x2b,0x63,0x03,0xf7,0xb6
+,0x59,0xbf,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05
+,0x00,0x03,0x82,0x01,0x01,0x00,0x1a,0x40
+,0xd8,0x95,0x65,0xac,0x09,0x92,0x89,0xc6
+,0x39,0xf4,0x10,0xe5,0xa9,0x0e,0x66,0x53
+,0x5d,0x78,0xde,0xfa,0x24,0x91,0xbb,0xe7
+,0x44,0x51,0xdf,0xc6,0x16,0x34,0x0a,0xef
+,0x6a,0x44,0x51,0xea,0x2b,0x07,0x8a,0x03
+,0x7a,0xc3,0xeb,0x3f,0x0a,0x2c,0x52,0x16
+,0xa0,0x2b,0x43,0xb9,0x25,0x90,0x3f,0x70
+,0xa9,0x33,0x25,0x6d,0x45,0x1a,0x28,0x3b
+,0x27,0xcf,0xaa,0xc3,0x29,0x42,0x1b,0xdf
+,0x3b,0x4c,0xc0,0x33,0x34,0x5b,0x41,0x88
+,0xbf,0x6b,0x2b,0x65,0xaf,0x28,0xef,0xb2
+,0xf5,0xc3,0xaa,0x66,0xce,0x7b,0x56,0xee
+,0xb7,0xc8,0xcb,0x67,0xc1,0xc9,0x9c,0x1a
+,0x18,0xb8,0xc4,0xc3,0x49,0x03,0xf1,0x60
+,0x0e,0x50,0xcd,0x46,0xc5,0xf3,0x77,0x79
+,0xf7,0xb6,0x15,0xe0,0x38,0xdb,0xc7,0x2f
+,0x28,0xa0,0x0c,0x3f,0x77,0x26,0x74,0xd9
+,0x25,0x12,0xda,0x31,0xda,0x1a,0x1e,0xdc
+,0x29,0x41,0x91,0x22,0x3c,0x69,0xa7,0xbb
+,0x02,0xf2,0xb6,0x5c,0x27,0x03,0x89,0xf4
+,0x06,0xea,0x9b,0xe4,0x72,0x82,0xe3,0xa1
+,0x09,0xc1,0xe9,0x00,0x19,0xd3,0x3e,0xd4
+,0x70,0x6b,0xba,0x71,0xa6,0xaa,0x58,0xae
+,0xf4,0xbb,0xe9,0x6c,0xb6,0xef,0x87,0xcc
+,0x9b,0xbb,0xff,0x39,0xe6,0x56,0x61,0xd3
+,0x0a,0xa7,0xc4,0x5c,0x4c,0x60,0x7b,0x05
+,0x77,0x26,0x7a,0xbf,0xd8,0x07,0x52,0x2c
+,0x62,0xf7,0x70,0x63,0xd9,0x39,0xbc,0x6f
+,0x1c,0xc2,0x79,0xdc,0x76,0x29,0xaf,0xce
+,0xc5,0x2c,0x64,0x04,0x5e,0x88,0x36,0x6e
+,0x31,0xd4,0x40,0x1a,0x62,0x34,0x36,0x3f
+,0x35,0x01,0xae,0xac,0x63,0xa0};
+const unsigned int NptTlsTrustAnchor_Base_0134_Size = 1070;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0135.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0135.cpp
new file mode 100644
index 0000000..fa91abb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Base/NptTlsTrustAnchor_Base_0135.cpp
@@ -0,0 +1,188 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* GeoTrust Primary Certification Authority - G2 */
+const unsigned char NptTlsTrustAnchor_Base_0135_Data[1213] = {
+0x30,0x82,0x04,0xb9,0x30,0x82,0x03,0xa1
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x40
+,0x1a,0xc4,0x64,0x21,0xb3,0x13,0x21,0x03
+,0x0e,0xbb,0xe4,0x12,0x1a,0xc5,0x1d,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x81
+,0xbd,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17
+,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31
+,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69
+,0x67,0x6e,0x20,0x54,0x72,0x75,0x73,0x74
+,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b
+,0x31,0x3a,0x30,0x38,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x31,0x28,0x63,0x29,0x20,0x32
+,0x30,0x30,0x38,0x20,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f,0x72
+,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x7a,0x65,0x64,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x6e,0x6c,0x79,0x31,0x38,0x30,0x36
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2f,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20
+,0x55,0x6e,0x69,0x76,0x65,0x72,0x73,0x61
+,0x6c,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x1e
+,0x17,0x0d,0x30,0x38,0x30,0x34,0x30,0x32
+,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x17
+,0x0d,0x33,0x37,0x31,0x32,0x30,0x31,0x32
+,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x81
+,0xbd,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17
+,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67
+,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31
+,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04,0x0b
+,0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69
+,0x67,0x6e,0x20,0x54,0x72,0x75,0x73,0x74
+,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b
+,0x31,0x3a,0x30,0x38,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x31,0x28,0x63,0x29,0x20,0x32
+,0x30,0x30,0x38,0x20,0x56,0x65,0x72,0x69
+,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e
+,0x63,0x2e,0x20,0x2d,0x20,0x46,0x6f,0x72
+,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x69
+,0x7a,0x65,0x64,0x20,0x75,0x73,0x65,0x20
+,0x6f,0x6e,0x6c,0x79,0x31,0x38,0x30,0x36
+,0x06,0x03,0x55,0x04,0x03,0x13,0x2f,0x56
+,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20
+,0x55,0x6e,0x69,0x76,0x65,0x72,0x73,0x61
+,0x6c,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x82
+,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82
+,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xc7
+,0x61,0x37,0x5e,0xb1,0x01,0x34,0xdb,0x62
+,0xd7,0x15,0x9b,0xff,0x58,0x5a,0x8c,0x23
+,0x23,0xd6,0x60,0x8e,0x91,0xd7,0x90,0x98
+,0x83,0x7a,0xe6,0x58,0x19,0x38,0x8c,0xc5
+,0xf6,0xe5,0x64,0x85,0xb4,0xa2,0x71,0xfb
+,0xed,0xbd,0xb9,0xda,0xcd,0x4d,0x00,0xb4
+,0xc8,0x2d,0x73,0xa5,0xc7,0x69,0x71,0x95
+,0x1f,0x39,0x3c,0xb2,0x44,0x07,0x9c,0xe8
+,0x0e,0xfa,0x4d,0x4a,0xc4,0x21,0xdf,0x29
+,0x61,0x8f,0x32,0x22,0x61,0x82,0xc5,0x87
+,0x1f,0x6e,0x8c,0x7c,0x5f,0x16,0x20,0x51
+,0x44,0xd1,0x70,0x4f,0x57,0xea,0xe3,0x1c
+,0xe3,0xcc,0x79,0xee,0x58,0xd8,0x0e,0xc2
+,0xb3,0x45,0x93,0xc0,0x2c,0xe7,0x9a,0x17
+,0x2b,0x7b,0x00,0x37,0x7a,0x41,0x33,0x78
+,0xe1,0x33,0xe2,0xf3,0x10,0x1a,0x7f,0x87
+,0x2c,0xbe,0xf6,0xf5,0xf7,0x42,0xe2,0xe5
+,0xbf,0x87,0x62,0x89,0x5f,0x00,0x4b,0xdf
+,0xc5,0xdd,0xe4,0x75,0x44,0x32,0x41,0x3a
+,0x1e,0x71,0x6e,0x69,0xcb,0x0b,0x75,0x46
+,0x08,0xd1,0xca,0xd2,0x2b,0x95,0xd0,0xcf
+,0xfb,0xb9,0x40,0x6b,0x64,0x8c,0x57,0x4d
+,0xfc,0x13,0x11,0x79,0x84,0xed,0x5e,0x54
+,0xf6,0x34,0x9f,0x08,0x01,0xf3,0x10,0x25
+,0x06,0x17,0x4a,0xda,0xf1,0x1d,0x7a,0x66
+,0x6b,0x98,0x60,0x66,0xa4,0xd9,0xef,0xd2
+,0x2e,0x82,0xf1,0xf0,0xef,0x09,0xea,0x44
+,0xc9,0x15,0x6a,0xe2,0x03,0x6e,0x33,0xd3
+,0xac,0x9f,0x55,0x00,0xc7,0xf6,0x08,0x6a
+,0x94,0xb9,0x5f,0xdc,0xe0,0x33,0xf1,0x84
+,0x60,0xf9,0x5b,0x27,0x11,0xb4,0xfc,0x16
+,0xf2,0xbb,0x56,0x6a,0x80,0x25,0x8d,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x81,0xb2,0x30
+,0x81,0xaf,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x0e,0x06,0x03,0x55
+,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03
+,0x02,0x01,0x06,0x30,0x6d,0x06,0x08,0x2b
+,0x06,0x01,0x05,0x05,0x07,0x01,0x0c,0x04
+,0x61,0x30,0x5f,0xa1,0x5d,0xa0,0x5b,0x30
+,0x59,0x30,0x57,0x30,0x55,0x16,0x09,0x69
+,0x6d,0x61,0x67,0x65,0x2f,0x67,0x69,0x66
+,0x30,0x21,0x30,0x1f,0x30,0x07,0x06,0x05
+,0x2b,0x0e,0x03,0x02,0x1a,0x04,0x14,0x8f
+,0xe5,0xd3,0x1a,0x86,0xac,0x8d,0x8e,0x6b
+,0xc3,0xcf,0x80,0x6a,0xd4,0x48,0x18,0x2c
+,0x7b,0x19,0x2e,0x30,0x25,0x16,0x23,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6c,0x6f
+,0x67,0x6f,0x2e,0x76,0x65,0x72,0x69,0x73
+,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f
+,0x76,0x73,0x6c,0x6f,0x67,0x6f,0x2e,0x67
+,0x69,0x66,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0xb6,0x77,0xfa
+,0x69,0x48,0x47,0x9f,0x53,0x12,0xd5,0xc2
+,0xea,0x07,0x32,0x76,0x07,0xd1,0x97,0x07
+,0x19,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0x4a,0xf8,0xf8
+,0xb0,0x03,0xe6,0x2c,0x67,0x7b,0xe4,0x94
+,0x77,0x63,0xcc,0x6e,0x4c,0xf9,0x7d,0x0e
+,0x0d,0xdc,0xc8,0xb9,0x35,0xb9,0x70,0x4f
+,0x63,0xfa,0x24,0xfa,0x6c,0x83,0x8c,0x47
+,0x9d,0x3b,0x63,0xf3,0x9a,0xf9,0x76,0x32
+,0x95,0x91,0xb1,0x77,0xbc,0xac,0x9a,0xbe
+,0xb1,0xe4,0x31,0x21,0xc6,0x81,0x95,0x56
+,0x5a,0x0e,0xb1,0xc2,0xd4,0xb1,0xa6,0x59
+,0xac,0xf1,0x63,0xcb,0xb8,0x4c,0x1d,0x59
+,0x90,0x4a,0xef,0x90,0x16,0x28,0x1f,0x5a
+,0xae,0x10,0xfb,0x81,0x50,0x38,0x0c,0x6c
+,0xcc,0xf1,0x3d,0xc3,0xf5,0x63,0xe3,0xb3
+,0xe3,0x21,0xc9,0x24,0x39,0xe9,0xfd,0x15
+,0x66,0x46,0xf4,0x1b,0x11,0xd0,0x4d,0x73
+,0xa3,0x7d,0x46,0xf9,0x3d,0xed,0xa8,0x5f
+,0x62,0xd4,0xf1,0x3f,0xf8,0xe0,0x74,0x57
+,0x2b,0x18,0x9d,0x81,0xb4,0xc4,0x28,0xda
+,0x94,0x97,0xa5,0x70,0xeb,0xac,0x1d,0xbe
+,0x07,0x11,0xf0,0xd5,0xdb,0xdd,0xe5,0x8c
+,0xf0,0xd5,0x32,0xb0,0x83,0xe6,0x57,0xe2
+,0x8f,0xbf,0xbe,0xa1,0xaa,0xbf,0x3d,0x1d
+,0xb5,0xd4,0x38,0xea,0xd7,0xb0,0x5c,0x3a
+,0x4f,0x6a,0x3f,0x8f,0xc0,0x66,0x6c,0x63
+,0xaa,0xe9,0xd9,0xa4,0x16,0xf4,0x81,0xd1
+,0x95,0x14,0x0e,0x7d,0xcd,0x95,0x34,0xd9
+,0xd2,0x8f,0x70,0x73,0x81,0x7b,0x9c,0x7e
+,0xbd,0x98,0x61,0xd8,0x45,0x87,0x98,0x90
+,0xc5,0xeb,0x86,0x30,0xc6,0x35,0xbf,0xf0
+,0xff,0xc3,0x55,0x88,0x83,0x4b,0xef,0x05
+,0x92,0x06,0x71,0xf2,0xb8,0x98,0x93,0xb7
+,0xec,0xcd,0x82,0x61,0xf1,0x38,0xe6,0x4f
+,0x97,0x98,0x2a,0x5a,0x8d};
+const unsigned int NptTlsTrustAnchor_Base_0135_Size = 1213;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0000.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0000.cpp
new file mode 100644
index 0000000..b995ca8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0000.cpp
@@ -0,0 +1,156 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* ABAecom (sub., Am. Bankers Assn.) Root CA */
+const unsigned char NptTlsTrustAnchor_Extended_0000_Data[953] = {
+0x30,0x82,0x03,0xb5,0x30,0x82,0x02,0x9d
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x11,0x00
+,0xd0,0x1e,0x40,0x90,0x00,0x00,0x46,0x52
+,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x81,0x89,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x08
+,0x13,0x02,0x44,0x43,0x31,0x13,0x30,0x11
+,0x06,0x03,0x55,0x04,0x07,0x13,0x0a,0x57
+,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f
+,0x6e,0x31,0x17,0x30,0x15,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0e,0x41,0x42,0x41,0x2e
+,0x45,0x43,0x4f,0x4d,0x2c,0x20,0x49,0x4e
+,0x43,0x2e,0x31,0x19,0x30,0x17,0x06,0x03
+,0x55,0x04,0x03,0x13,0x10,0x41,0x42,0x41
+,0x2e,0x45,0x43,0x4f,0x4d,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x43,0x41,0x31,0x24,0x30
+,0x22,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x09,0x01,0x16,0x15,0x61,0x64
+,0x6d,0x69,0x6e,0x40,0x64,0x69,0x67,0x73
+,0x69,0x67,0x74,0x72,0x75,0x73,0x74,0x2e
+,0x63,0x6f,0x6d,0x30,0x1e,0x17,0x0d,0x39
+,0x39,0x30,0x37,0x31,0x32,0x31,0x37,0x33
+,0x33,0x35,0x33,0x5a,0x17,0x0d,0x30,0x39
+,0x30,0x37,0x30,0x39,0x31,0x37,0x33,0x33
+,0x35,0x33,0x5a,0x30,0x81,0x89,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x55,0x53,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x08,0x13,0x02,0x44,0x43
+,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04
+,0x07,0x13,0x0a,0x57,0x61,0x73,0x68,0x69
+,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x17,0x30
+,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e
+,0x41,0x42,0x41,0x2e,0x45,0x43,0x4f,0x4d
+,0x2c,0x20,0x49,0x4e,0x43,0x2e,0x31,0x19
+,0x30,0x17,0x06,0x03,0x55,0x04,0x03,0x13
+,0x10,0x41,0x42,0x41,0x2e,0x45,0x43,0x4f
+,0x4d,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x41,0x31,0x24,0x30,0x22,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x01
+,0x16,0x15,0x61,0x64,0x6d,0x69,0x6e,0x40
+,0x64,0x69,0x67,0x73,0x69,0x67,0x74,0x72
+,0x75,0x73,0x74,0x2e,0x63,0x6f,0x6d,0x30
+,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01
+,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30
+,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00
+,0xb1,0xd3,0x11,0xe0,0x79,0x55,0x43,0x07
+,0x08,0x4c,0xcb,0x05,0x42,0x00,0xe2,0x0d
+,0x83,0x46,0x3d,0xe4,0x93,0xba,0xb6,0x06
+,0xd3,0x0d,0x59,0xbd,0x3e,0xc1,0xce,0x43
+,0x67,0x01,0x8a,0x21,0xa8,0xef,0xbc,0xcc
+,0xd0,0xa2,0xcc,0xb0,0x55,0x96,0x53,0x84
+,0x66,0x05,0x00,0xda,0x44,0x49,0x80,0xd8
+,0x54,0x0a,0xa5,0x25,0x86,0x94,0xed,0x63
+,0x56,0xff,0x70,0x6c,0xa3,0xa1,0x19,0xd2
+,0x78,0xbe,0x68,0x2a,0x44,0x5e,0x2f,0xcf
+,0xcc,0x18,0x5e,0x47,0xbc,0x3a,0xb1,0x46
+,0x3d,0x1e,0xf0,0xb9,0x2c,0x34,0x5f,0x8c
+,0x7c,0x4c,0x08,0x29,0x9d,0x40,0x55,0xeb
+,0x3c,0x7d,0x83,0xde,0xb5,0xf0,0xf7,0x8a
+,0x83,0x0e,0xa1,0x4c,0xb4,0x3a,0xa5,0xb3
+,0x5f,0x5a,0x22,0x97,0xec,0x19,0x9b,0xc1
+,0x05,0x68,0xfd,0xe6,0xb7,0xa9,0x91,0x94
+,0x2c,0xe4,0x78,0x48,0x24,0x1a,0x25,0x19
+,0x3a,0xeb,0x95,0x9c,0x39,0x0a,0x8a,0xcf
+,0x42,0xb2,0xf0,0x1c,0xd5,0x5f,0xfb,0x6b
+,0xed,0x68,0x56,0x7b,0x39,0x2c,0x72,0x38
+,0xb0,0xee,0x93,0xa9,0xd3,0x7b,0x77,0x3c
+,0xeb,0x71,0x03,0xa9,0x38,0x4a,0x16,0x6c
+,0x89,0x2a,0xca,0xda,0x33,0x13,0x79,0xc2
+,0x55,0x8c,0xed,0x9c,0xbb,0xf2,0xcb,0x5b
+,0x10,0xf8,0x2e,0x61,0x35,0xc6,0x29,0x4c
+,0x2a,0xd0,0x2a,0x63,0xd1,0x65,0x59,0xb4
+,0xf8,0xcd,0xf9,0xf4,0x00,0x84,0xb6,0x57
+,0x42,0x85,0x9d,0x32,0xa8,0xf9,0x2a,0x54
+,0xfb,0xff,0x78,0x41,0xbc,0xbd,0x71,0x28
+,0xf4,0xbb,0x90,0xbc,0xff,0x96,0x34,0x04
+,0xe3,0x45,0x9e,0xa1,0x46,0x28,0x40,0x81
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x16,0x30
+,0x14,0x30,0x12,0x06,0x03,0x55,0x1d,0x13
+,0x01,0x01,0xff,0x04,0x08,0x30,0x06,0x01
+,0x01,0xff,0x02,0x01,0x08,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0x04,0x6f,0x25,0x86,0xe4,0xe6,0x96
+,0x27,0xb4,0xd9,0x42,0xc0,0xd0,0xc9,0x00
+,0xb1,0x7f,0x54,0x3e,0x87,0xb2,0x6d,0x24
+,0xa9,0x2f,0x0a,0x7e,0xfd,0xa4,0x44,0xb0
+,0xf8,0x54,0x07,0xbd,0x1b,0x9d,0x9d,0xca
+,0x7b,0x50,0x24,0x7b,0x11,0x5b,0x49,0xa3
+,0xa6,0xbf,0x12,0x74,0xd5,0x89,0xb7,0xb7
+,0x2f,0x98,0x64,0x25,0x14,0xb7,0x61,0xe9
+,0x7f,0x60,0x80,0x6b,0xd3,0x64,0xe8,0xab
+,0xbd,0x1a,0xd6,0x51,0xfa,0xc0,0xb4,0x5d
+,0x77,0x1a,0x7f,0x64,0x08,0x5e,0x79,0xc6
+,0x05,0x4c,0xf1,0x7a,0xdd,0x4d,0x7d,0xce
+,0xe6,0x48,0x7b,0x54,0xd2,0x61,0x92,0x81
+,0xd6,0x1b,0xd6,0x00,0xf0,0x0e,0x9e,0x28
+,0x77,0xa0,0x4d,0x88,0xc7,0x22,0x76,0x19
+,0xc3,0xc7,0x9e,0x1b,0xa6,0x77,0x78,0xf8
+,0x5f,0x9b,0x56,0xd1,0xf0,0xf2,0x17,0xac
+,0x8e,0x9d,0x59,0xe6,0x1f,0xfe,0x57,0xb6
+,0xd9,0x5e,0xe1,0x5d,0x9f,0x45,0xec,0x61
+,0x68,0x19,0x41,0xe1,0xb2,0x20,0x26,0xfe
+,0x5a,0x30,0x76,0x24,0xff,0x40,0x72,0x3c
+,0x79,0x9f,0x7c,0x22,0x48,0xab,0x46,0xcd
+,0xdb,0xb3,0x86,0x2c,0x8f,0xbf,0x05,0x41
+,0xd3,0xc1,0xe3,0x14,0xe3,0x41,0x17,0x26
+,0xd0,0x7c,0xa7,0x71,0x4c,0x19,0xe8,0x4a
+,0x0f,0x72,0x58,0x31,0x7d,0xec,0x60,0x7a
+,0xa3,0x22,0x28,0xbd,0x19,0x24,0x60,0x3f
+,0x3b,0x87,0x73,0xc0,0x6b,0xe4,0xcb,0xae
+,0xb7,0xab,0x25,0x43,0xb2,0x55,0x2d,0x7b
+,0xab,0x06,0x0e,0x75,0x5d,0x34,0xe5,0x5d
+,0x73,0x6d,0x9e,0xb2,0x75,0x40,0xa5,0x59
+,0xc9,0x4f,0x31,0x71,0x88,0xd9,0x88,0x7f
+,0x54};
+const unsigned int NptTlsTrustAnchor_Extended_0000_Size = 953;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0001.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0001.cpp
new file mode 100644
index 0000000..96dc55d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0001.cpp
@@ -0,0 +1,211 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Taiwan GRCA */
+const unsigned char NptTlsTrustAnchor_Extended_0001_Data[1398] = {
+0x30,0x82,0x05,0x72,0x30,0x82,0x03,0x5a
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x1f
+,0x9d,0x59,0x5a,0xd7,0x2f,0xc2,0x06,0x44
+,0xa5,0x80,0x08,0x69,0xe3,0x5e,0xf6,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x3f
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x54,0x57,0x31,0x30,0x30
+,0x2e,0x06,0x03,0x55,0x04,0x0a,0x0c,0x27
+,0x47,0x6f,0x76,0x65,0x72,0x6e,0x6d,0x65
+,0x6e,0x74,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75
+,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x30
+,0x1e,0x17,0x0d,0x30,0x32,0x31,0x32,0x30
+,0x35,0x31,0x33,0x32,0x33,0x33,0x33,0x5a
+,0x17,0x0d,0x33,0x32,0x31,0x32,0x30,0x35
+,0x31,0x33,0x32,0x33,0x33,0x33,0x5a,0x30
+,0x3f,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x54,0x57,0x31,0x30
+,0x30,0x2e,0x06,0x03,0x55,0x04,0x0a,0x0c
+,0x27,0x47,0x6f,0x76,0x65,0x72,0x6e,0x6d
+,0x65,0x6e,0x74,0x20,0x52,0x6f,0x6f,0x74
+,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41
+,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79
+,0x30,0x82,0x02,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x02,0x0f,0x00
+,0x30,0x82,0x02,0x0a,0x02,0x82,0x02,0x01
+,0x00,0x9a,0x25,0xb8,0xec,0xcc,0xa2,0x75
+,0xa8,0x7b,0xf7,0xce,0x5b,0x59,0x8a,0xc9
+,0xd1,0x86,0x12,0x08,0x54,0xec,0x9c,0xf2
+,0xe7,0x46,0xf6,0x88,0xf3,0x7c,0xe9,0xa5
+,0xdf,0x4c,0x47,0x36,0xa4,0x1b,0x01,0x1c
+,0x7f,0x1e,0x57,0x8a,0x8d,0xc3,0xc5,0xd1
+,0x21,0xe3,0xda,0x24,0x3f,0x48,0x2b,0xfb
+,0x9f,0x2e,0xa1,0x94,0xe7,0x2c,0x1c,0x93
+,0xd1,0xbf,0x1b,0x01,0x87,0x53,0x99,0xce
+,0xa7,0xf5,0x0a,0x21,0x76,0x77,0xff,0xa9
+,0xb7,0xc6,0x73,0x94,0x4f,0x46,0xf7,0x10
+,0x49,0x37,0xfa,0xa8,0x59,0x49,0x5d,0x6a
+,0x81,0x07,0x56,0xf2,0x8a,0xf9,0x06,0xd0
+,0xf7,0x70,0x22,0x4d,0xb4,0xb7,0x41,0xb9
+,0x32,0xb8,0xb1,0xf0,0xb1,0xc3,0x9c,0x3f
+,0x70,0xfd,0x53,0xdd,0x81,0xaa,0xd8,0x63
+,0x78,0xf6,0xd8,0x53,0x6e,0xa1,0xac,0x6a
+,0x84,0x24,0x72,0x54,0x86,0xc6,0xd2,0xb2
+,0xca,0x1c,0x0e,0x79,0x81,0xd6,0xb5,0x70
+,0x62,0x08,0x01,0x2e,0x4e,0x4f,0x0e,0xd5
+,0x11,0xaf,0xa9,0xaf,0xe5,0x9a,0xbf,0xdc
+,0xcc,0x87,0x6d,0x26,0xe4,0xc9,0x57,0xa2
+,0xfb,0x96,0xf9,0xcc,0xe1,0x3f,0x53,0x8c
+,0x6c,0x4c,0x7e,0x9b,0x53,0x08,0x0b,0x6c
+,0x17,0xfb,0x67,0xc8,0xc2,0xad,0xb1,0xcd
+,0x80,0xb4,0x97,0xdc,0x76,0x01,0x16,0x15
+,0xe9,0x6a,0xd7,0xa4,0xe1,0x78,0x47,0xce
+,0x86,0xd5,0xfb,0x31,0xf3,0xfa,0x31,0xbe
+,0x34,0xaa,0x28,0xfb,0x70,0x4c,0x1d,0x49
+,0xc7,0xaf,0x2c,0x9d,0x6d,0x66,0xa6,0xb6
+,0x8d,0x64,0x7e,0xb5,0x20,0x6a,0x9d,0x3b
+,0x81,0xb6,0x8f,0x40,0x00,0x67,0x4b,0x89
+,0x86,0xb8,0xcc,0x65,0xfe,0x15,0x53,0xe9
+,0x04,0xc1,0xd6,0x5f,0x1d,0x44,0xd7,0x0a
+,0x2f,0x27,0x9a,0x46,0x7d,0xa1,0x0d,0x75
+,0xad,0x54,0x86,0x15,0xdc,0x49,0x3b,0xf1
+,0x96,0xce,0x0f,0x9b,0xa0,0xec,0xa3,0x7a
+,0x5d,0xbe,0xd5,0x2a,0x75,0x42,0xe5,0x7b
+,0xde,0xa5,0xb6,0xaa,0xaf,0x28,0xac,0xac
+,0x90,0xac,0x38,0xb7,0xd5,0x68,0x35,0x26
+,0x7a,0xdc,0xf7,0x3b,0xf3,0xfd,0x45,0x9b
+,0xd1,0xbb,0x43,0x78,0x6e,0x6f,0xf1,0x42
+,0x54,0x6a,0x98,0xf0,0x0d,0xad,0x97,0xe9
+,0x52,0x5e,0xe9,0xd5,0x6a,0x72,0xde,0x6a
+,0xf7,0x1b,0x60,0x14,0xf4,0xa5,0xe4,0xb6
+,0x71,0x67,0xaa,0x1f,0xea,0xe2,0x4d,0xc1
+,0x42,0x40,0xfe,0x67,0x46,0x17,0x38,0x2f
+,0x47,0x3f,0x71,0x9c,0xae,0xe5,0x21,0xca
+,0x61,0x2d,0x6d,0x07,0xa8,0x84,0x7c,0x2d
+,0xee,0x51,0x25,0xf1,0x63,0x90,0x9e,0xfd
+,0xe1,0x57,0x88,0x6b,0xef,0x8a,0x23,0x6d
+,0xb1,0xe6,0xbd,0x3f,0xad,0xd1,0x3d,0x96
+,0x0b,0x85,0x8d,0xcd,0x6b,0x27,0xbb,0xb7
+,0x05,0x9b,0xec,0xbb,0x91,0xa9,0x0a,0x07
+,0x12,0x02,0x97,0x4e,0x20,0x90,0xf0,0xff
+,0x0d,0x1e,0xe2,0x41,0x3b,0xd3,0x40,0x3a
+,0xe7,0x8d,0x5d,0xda,0x66,0xe4,0x02,0xb0
+,0x07,0x52,0x98,0x5c,0x0e,0x8e,0x33,0x9c
+,0xc2,0xa6,0x95,0xfb,0x55,0x19,0x6e,0x4c
+,0x8e,0xae,0x4b,0x0f,0xbd,0xc1,0x38,0x4d
+,0x5e,0x8f,0x84,0x1d,0x66,0xcd,0xc5,0x60
+,0x96,0xb4,0x52,0x5a,0x05,0x89,0x8e,0x95
+,0x7a,0x98,0xc1,0x91,0x3c,0x95,0x23,0xb2
+,0x0e,0xf4,0x79,0xb4,0xc9,0x7c,0xc1,0x4a
+,0x21,0x02,0x03,0x01,0x00,0x01,0xa3,0x6a
+,0x30,0x68,0x30,0x1d,0x06,0x03,0x55,0x1d
+,0x0e,0x04,0x16,0x04,0x14,0xcc,0xcc,0xef
+,0xcc,0x29,0x60,0xa4,0x3b,0xb1,0x92,0xb6
+,0x3c,0xfa,0x32,0x62,0x8f,0xac,0x25,0x15
+,0x3b,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x39,0x06,0x04,0x67,0x2a,0x07,0x00,0x04
+,0x31,0x30,0x2f,0x30,0x2d,0x02,0x01,0x00
+,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02
+,0x1a,0x05,0x00,0x30,0x07,0x06,0x05,0x67
+,0x2a,0x03,0x00,0x00,0x04,0x14,0x03,0x9b
+,0xf0,0x22,0x13,0xff,0x95,0x28,0x36,0xd3
+,0xdc,0x9e,0xc0,0x32,0xfb,0x31,0x3a,0x8a
+,0x51,0x65,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05
+,0x00,0x03,0x82,0x02,0x01,0x00,0x40,0x80
+,0x4a,0xfa,0x26,0xc9,0xce,0x5e,0x30,0xdd
+,0x4f,0x86,0x74,0x76,0x58,0xf5,0xae,0xb3
+,0x83,0x33,0x78,0xa4,0x7a,0x74,0x17,0x19
+,0x4e,0xe9,0x52,0xb5,0xb9,0xe0,0x0a,0x74
+,0x62,0xaa,0x68,0xca,0x78,0xa0,0x4c,0x9a
+,0x8e,0x2c,0x23,0x2e,0xd5,0x6a,0x12,0x24
+,0xbf,0xd4,0x68,0xd3,0x8a,0xd0,0xd8,0x9c
+,0x9f,0xb4,0x1f,0x0c,0xde,0x38,0x7e,0x57
+,0x38,0xfc,0x8d,0xe2,0x4f,0x5e,0x0c,0x9f
+,0xab,0x3b,0xd2,0xff,0x75,0x97,0xcb,0xa4
+,0xe3,0x67,0x08,0xff,0xe5,0xc0,0x16,0xb5
+,0x48,0x01,0x7d,0xe9,0xf9,0x0a,0xff,0x1b
+,0xe5,0x6a,0x69,0xbf,0x78,0x21,0xa8,0xc2
+,0xa7,0x23,0xa9,0x86,0xab,0x76,0x56,0xe8
+,0x0e,0x0c,0xf6,0x13,0xdd,0x2a,0x66,0x8a
+,0x64,0x49,0x3d,0x1a,0x18,0x87,0x90,0x04
+,0x9f,0x42,0x52,0xb7,0x4f,0xcb,0xfe,0x47
+,0x41,0x76,0x35,0xef,0xff,0x00,0x76,0x36
+,0x45,0x32,0x9b,0xc6,0x46,0x85,0x5d,0xe2
+,0x24,0xb0,0x1e,0xe3,0x48,0x96,0x98,0x57
+,0x47,0x94,0x55,0x7a,0x0f,0x41,0xb1,0x44
+,0x24,0xf3,0xc1,0xfe,0x1a,0x6b,0xbf,0x88
+,0xfd,0xc1,0xa6,0xda,0x93,0x60,0x5e,0x81
+,0x4a,0x99,0x20,0x9c,0x48,0x66,0x19,0xb5
+,0x00,0x79,0x54,0x0f,0xb8,0x2c,0x2f,0x4b
+,0xbc,0xa9,0x5d,0x5b,0x60,0x7f,0x8c,0x87
+,0xa5,0xe0,0x52,0x63,0x2a,0xbe,0xd8,0x3b
+,0x85,0x40,0x15,0xfe,0x1e,0xb6,0x65,0x3f
+,0xc5,0x4b,0xda,0x7e,0xb5,0x7a,0x35,0x29
+,0xa3,0x2e,0x7a,0x98,0x60,0x22,0xa3,0xf4
+,0x7d,0x27,0x4e,0x2d,0xea,0xb4,0x74,0x3c
+,0xe9,0x0f,0xa4,0x33,0x0f,0x10,0x11,0xbc
+,0x13,0x01,0xd6,0xe5,0x0e,0xd3,0xbf,0xb5
+,0x12,0xa2,0xe1,0x45,0x23,0xc0,0xcc,0x08
+,0x6e,0x61,0xb7,0x89,0xab,0x83,0xe3,0x24
+,0x1e,0xe6,0x5d,0x07,0xe7,0x1f,0x20,0x3e
+,0xcf,0x67,0xc8,0xe7,0xac,0x30,0x6d,0x27
+,0x4b,0x68,0x6e,0x4b,0x2a,0x5c,0x02,0x08
+,0x34,0xdb,0xf8,0x76,0xe4,0x67,0xa3,0x26
+,0x9c,0x3f,0xa2,0x32,0xc2,0x4a,0xc5,0x81
+,0x18,0x31,0x10,0x56,0xaa,0x84,0xef,0x2d
+,0x0a,0xff,0xb8,0x1f,0x77,0xd2,0xbf,0xa5
+,0x58,0xa0,0x62,0xe4,0xd7,0x4b,0x91,0x75
+,0x8d,0x89,0x80,0x98,0x7e,0x6d,0xcb,0x53
+,0x4e,0x5e,0xaf,0xf6,0xb2,0x97,0x85,0x97
+,0xb9,0xda,0x55,0x06,0xb9,0x24,0xee,0xd7
+,0xc6,0x38,0x1e,0x63,0x1b,0x12,0x3b,0x95
+,0xe1,0x58,0xac,0xf2,0xdf,0x84,0xd5,0x5f
+,0x99,0x2f,0x0d,0x55,0x5b,0xe6,0x38,0xdb
+,0x2e,0x3f,0x72,0xe9,0x48,0x85,0xcb,0xbb
+,0x29,0x13,0x8f,0x1e,0x38,0x55,0xb9,0xf3
+,0xb2,0xc4,0x30,0x99,0x23,0x4e,0x5d,0xf2
+,0x48,0xa1,0x12,0x0c,0xdc,0x12,0x90,0x09
+,0x90,0x54,0x91,0x03,0x3c,0x47,0xe5,0xd5
+,0xc9,0x65,0xe0,0xb7,0x4b,0x7d,0xec,0x47
+,0xd3,0xb3,0x0b,0x3e,0xad,0x9e,0xd0,0x74
+,0x00,0x0e,0xeb,0xbd,0x51,0xad,0xc0,0xde
+,0x2c,0xc0,0xc3,0x6a,0xfe,0xef,0xdc,0x0b
+,0xa7,0xfa,0x46,0xdf,0x60,0xdb,0x9c,0xa6
+,0x59,0x50,0x75,0x23,0x69,0x73,0x93,0xb2
+,0xf9,0xfc,0x02,0xd3,0x47,0xe6,0x71,0xce
+,0x10,0x02,0xee,0x27,0x8c,0x84,0xff,0xac
+,0x45,0x0d,0x13,0x5c,0x83,0x32,0xe0,0x25
+,0xa5,0x86,0x2c,0x7c,0xf4,0x12};
+const unsigned int NptTlsTrustAnchor_Extended_0001_Size = 1398;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0002.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0002.cpp
new file mode 100644
index 0000000..93a0278
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0002.cpp
@@ -0,0 +1,164 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TURKTRUST Certificate Services Provider Root 1 */
+const unsigned char NptTlsTrustAnchor_Extended_0002_Data[1023] = {
+0x30,0x82,0x03,0xfb,0x30,0x82,0x02,0xe3
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x81,0xb7,0x31,0x3f,0x30,0x3d,0x06,0x03
+,0x55,0x04,0x03,0x0c,0x36,0x54,0xc3,0x9c
+,0x52,0x4b,0x54,0x52,0x55,0x53,0x54,0x20
+,0x45,0x6c,0x65,0x6b,0x74,0x72,0x6f,0x6e
+,0x69,0x6b,0x20,0x53,0x65,0x72,0x74,0x69
+,0x66,0x69,0x6b,0x61,0x20,0x48,0x69,0x7a
+,0x6d,0x65,0x74,0x20,0x53,0x61,0xc4,0x9f
+,0x6c,0x61,0x79,0xc4,0xb1,0x63,0xc4,0xb1
+,0x73,0xc4,0xb1,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x0c,0x02,0x54,0x52
+,0x31,0x0f,0x30,0x0d,0x06,0x03,0x55,0x04
+,0x07,0x0c,0x06,0x41,0x4e,0x4b,0x41,0x52
+,0x41,0x31,0x56,0x30,0x54,0x06,0x03,0x55
+,0x04,0x0a,0x0c,0x4d,0x28,0x63,0x29,0x20
+,0x32,0x30,0x30,0x35,0x20,0x54,0xc3,0x9c
+,0x52,0x4b,0x54,0x52,0x55,0x53,0x54,0x20
+,0x42,0x69,0x6c,0x67,0x69,0x20,0xc4,0xb0
+,0x6c,0x65,0x74,0x69,0xc5,0x9f,0x69,0x6d
+,0x20,0x76,0x65,0x20,0x42,0x69,0x6c,0x69
+,0xc5,0x9f,0x69,0x6d,0x20,0x47,0xc3,0xbc
+,0x76,0x65,0x6e,0x6c,0x69,0xc4,0x9f,0x69
+,0x20,0x48,0x69,0x7a,0x6d,0x65,0x74,0x6c
+,0x65,0x72,0x69,0x20,0x41,0x2e,0xc5,0x9e
+,0x2e,0x30,0x1e,0x17,0x0d,0x30,0x35,0x30
+,0x35,0x31,0x33,0x31,0x30,0x32,0x37,0x31
+,0x37,0x5a,0x17,0x0d,0x31,0x35,0x30,0x33
+,0x32,0x32,0x31,0x30,0x32,0x37,0x31,0x37
+,0x5a,0x30,0x81,0xb7,0x31,0x3f,0x30,0x3d
+,0x06,0x03,0x55,0x04,0x03,0x0c,0x36,0x54
+,0xc3,0x9c,0x52,0x4b,0x54,0x52,0x55,0x53
+,0x54,0x20,0x45,0x6c,0x65,0x6b,0x74,0x72
+,0x6f,0x6e,0x69,0x6b,0x20,0x53,0x65,0x72
+,0x74,0x69,0x66,0x69,0x6b,0x61,0x20,0x48
+,0x69,0x7a,0x6d,0x65,0x74,0x20,0x53,0x61
+,0xc4,0x9f,0x6c,0x61,0x79,0xc4,0xb1,0x63
+,0xc4,0xb1,0x73,0xc4,0xb1,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x0c,0x02
+,0x54,0x52,0x31,0x0f,0x30,0x0d,0x06,0x03
+,0x55,0x04,0x07,0x0c,0x06,0x41,0x4e,0x4b
+,0x41,0x52,0x41,0x31,0x56,0x30,0x54,0x06
+,0x03,0x55,0x04,0x0a,0x0c,0x4d,0x28,0x63
+,0x29,0x20,0x32,0x30,0x30,0x35,0x20,0x54
+,0xc3,0x9c,0x52,0x4b,0x54,0x52,0x55,0x53
+,0x54,0x20,0x42,0x69,0x6c,0x67,0x69,0x20
+,0xc4,0xb0,0x6c,0x65,0x74,0x69,0xc5,0x9f
+,0x69,0x6d,0x20,0x76,0x65,0x20,0x42,0x69
+,0x6c,0x69,0xc5,0x9f,0x69,0x6d,0x20,0x47
+,0xc3,0xbc,0x76,0x65,0x6e,0x6c,0x69,0xc4
+,0x9f,0x69,0x20,0x48,0x69,0x7a,0x6d,0x65
+,0x74,0x6c,0x65,0x72,0x69,0x20,0x41,0x2e
+,0xc5,0x9e,0x2e,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xca,0x52,0x05,0xd6
+,0x63,0x03,0xd8,0x1c,0x5f,0xdd,0xd2,0x7b
+,0x5d,0xf2,0x0c,0x60,0x61,0x5b,0x6b,0x3b
+,0x74,0x2b,0x78,0x0d,0x7d,0x45,0xbd,0x22
+,0x74,0xe8,0x8c,0x03,0xc1,0xc6,0x11,0x2a
+,0x3d,0x95,0xbc,0xa9,0x94,0xb0,0xbb,0x91
+,0x97,0xc8,0x69,0x7c,0x84,0xc5,0xb4,0x91
+,0x6c,0x6c,0x13,0x6a,0xa4,0x55,0xad,0xa4
+,0x85,0xe8,0x95,0x7e,0xb3,0x00,0xaf,0x00
+,0xc2,0x05,0x18,0xf5,0x70,0x9d,0x36,0x8b
+,0xae,0xcb,0xe4,0x1b,0x81,0x7f,0x93,0x88
+,0xfb,0x6a,0x55,0xbb,0x7d,0x85,0x92,0xce
+,0xba,0x58,0x9f,0xdb,0x32,0xc5,0xbd,0x5d
+,0xef,0x22,0x4a,0x2f,0x41,0x07,0x7e,0x49
+,0x61,0xb3,0x86,0xec,0x4e,0xa6,0x41,0x6e
+,0x84,0xbc,0x03,0xec,0xf5,0x3b,0x1c,0xc8
+,0x1f,0xc2,0xee,0xa8,0xee,0xea,0x12,0x4a
+,0x8d,0x14,0xcf,0xf3,0x0a,0xe0,0x50,0x39
+,0xf9,0x08,0x35,0xf8,0x11,0x59,0xad,0xe7
+,0x22,0xea,0x4b,0xca,0x14,0x06,0xde,0x42
+,0xba,0xb2,0x99,0xf3,0x2d,0x54,0x88,0x10
+,0x06,0xea,0xe1,0x1a,0x3e,0x3d,0x67,0x1f
+,0xfb,0xce,0xfb,0x7c,0x82,0xe8,0x11,0x5d
+,0x4a,0xc1,0xb9,0x14,0xea,0x54,0xd9,0x66
+,0x9b,0x7c,0x89,0x7d,0x04,0x9a,0x62,0xc9
+,0xe9,0x52,0x3c,0x9e,0x9c,0xef,0xd2,0xf5
+,0x26,0xe4,0xe6,0xe5,0x18,0x7c,0x8b,0x6e
+,0xdf,0x6c,0xcc,0x78,0x5b,0x4f,0x72,0xb2
+,0xcb,0x5c,0x3f,0x8c,0x05,0x8d,0xd1,0x4c
+,0x8c,0xad,0x92,0xc7,0xe1,0x78,0x7f,0x65
+,0x6c,0x49,0x06,0x50,0x2c,0x9e,0x32,0xc2
+,0xd7,0x4a,0xc6,0x75,0x8a,0x59,0x4e,0x75
+,0x6f,0x47,0x5e,0xc1,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x10,0x30,0x0e,0x30,0x0c,0x06
+,0x03,0x55,0x1d,0x13,0x04,0x05,0x30,0x03
+,0x01,0x01,0xff,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x15
+,0xf5,0x55,0xff,0x37,0x96,0x80,0x59,0x21
+,0xa4,0xfc,0xa1,0x15,0x4c,0x20,0xf6,0xd4
+,0x5f,0xda,0x03,0x24,0xfc,0xcf,0x90,0x1a
+,0xf4,0x21,0x0a,0x9a,0xee,0x3a,0xb1,0x6a
+,0xef,0xef,0xf8,0x60,0xd1,0x4c,0x36,0x66
+,0x45,0x1d,0xf3,0x66,0x02,0x74,0x04,0x7b
+,0x92,0x30,0xa8,0xde,0x0a,0x76,0x0f,0xef
+,0x95,0x6e,0xbd,0xc9,0x37,0xe6,0x1a,0x0d
+,0xac,0x89,0x48,0x5b,0xcc,0x83,0x36,0xc2
+,0xf5,0x46,0x5c,0x59,0x82,0x56,0xb4,0xd5
+,0xfe,0x23,0xb4,0xd8,0x54,0x1c,0x44,0xab
+,0xc4,0xa7,0xe5,0x14,0xce,0x3c,0x41,0x61
+,0x7c,0x43,0xe6,0xcd,0xc4,0x81,0x09,0x8b
+,0x24,0xfb,0x54,0x25,0xd6,0x16,0xa8,0x96
+,0x0c,0x67,0x07,0x6f,0xb3,0x50,0x47,0xe3
+,0x1c,0x24,0x28,0xdd,0x2a,0x98,0xa4,0x61
+,0xfe,0xdb,0xea,0x12,0x37,0xbc,0x01,0x1a
+,0x34,0x85,0xbd,0x6e,0x4f,0xe7,0x91,0x72
+,0x07,0x44,0x85,0x1e,0x58,0xca,0x54,0x44
+,0xdd,0xf7,0xac,0xb9,0xcb,0x89,0x21,0x72
+,0xdb,0x8f,0xc0,0x69,0x29,0x97,0x2a,0xa3
+,0xae,0x18,0x23,0x97,0x1c,0x41,0x2a,0x8b
+,0x7c,0x2a,0xc1,0x7c,0x90,0xe8,0xa9,0x28
+,0xc0,0xd3,0x91,0xc6,0xad,0x28,0x87,0x40
+,0x68,0xb5,0xff,0xec,0xa7,0xd2,0xd3,0x38
+,0x18,0x9c,0xd3,0x7d,0x69,0x5d,0xf0,0xc6
+,0xa5,0x1e,0x24,0x1b,0xa3,0x47,0xfc,0x69
+,0x07,0x68,0xe7,0xe4,0x9a,0xb4,0xed,0x0f
+,0xa1,0x87,0x87,0x02,0xce,0x87,0xd2,0x48
+,0x4e,0xe1,0xbc,0xff,0xcb,0xf1,0x72,0x92
+,0x44,0x64,0x03,0x25,0xea,0xde,0x5b,0x6e
+,0x9f,0xc9,0xf2,0x4e,0xac,0xdd,0xc7};
+const unsigned int NptTlsTrustAnchor_Extended_0002_Size = 1023;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0003.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0003.cpp
new file mode 100644
index 0000000..04bf4b8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0003.cpp
@@ -0,0 +1,173 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TURKTRUST Certificate Services Provider Root 2 */
+const unsigned char NptTlsTrustAnchor_Extended_0003_Data[1088] = {
+0x30,0x82,0x04,0x3c,0x30,0x82,0x03,0x24
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x81,0xbe,0x31,0x3f,0x30,0x3d,0x06,0x03
+,0x55,0x04,0x03,0x0c,0x36,0x54,0xc3,0x9c
+,0x52,0x4b,0x54,0x52,0x55,0x53,0x54,0x20
+,0x45,0x6c,0x65,0x6b,0x74,0x72,0x6f,0x6e
+,0x69,0x6b,0x20,0x53,0x65,0x72,0x74,0x69
+,0x66,0x69,0x6b,0x61,0x20,0x48,0x69,0x7a
+,0x6d,0x65,0x74,0x20,0x53,0x61,0xc4,0x9f
+,0x6c,0x61,0x79,0xc4,0xb1,0x63,0xc4,0xb1
+,0x73,0xc4,0xb1,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x54,0x52
+,0x31,0x0f,0x30,0x0d,0x06,0x03,0x55,0x04
+,0x07,0x0c,0x06,0x41,0x6e,0x6b,0x61,0x72
+,0x61,0x31,0x5d,0x30,0x5b,0x06,0x03,0x55
+,0x04,0x0a,0x0c,0x54,0x54,0xc3,0x9c,0x52
+,0x4b,0x54,0x52,0x55,0x53,0x54,0x20,0x42
+,0x69,0x6c,0x67,0x69,0x20,0xc4,0xb0,0x6c
+,0x65,0x74,0x69,0xc5,0x9f,0x69,0x6d,0x20
+,0x76,0x65,0x20,0x42,0x69,0x6c,0x69,0xc5
+,0x9f,0x69,0x6d,0x20,0x47,0xc3,0xbc,0x76
+,0x65,0x6e,0x6c,0x69,0xc4,0x9f,0x69,0x20
+,0x48,0x69,0x7a,0x6d,0x65,0x74,0x6c,0x65
+,0x72,0x69,0x20,0x41,0x2e,0xc5,0x9e,0x2e
+,0x20,0x28,0x63,0x29,0x20,0x4b,0x61,0x73
+,0xc4,0xb1,0x6d,0x20,0x32,0x30,0x30,0x35
+,0x30,0x1e,0x17,0x0d,0x30,0x35,0x31,0x31
+,0x30,0x37,0x31,0x30,0x30,0x37,0x35,0x37
+,0x5a,0x17,0x0d,0x31,0x35,0x30,0x39,0x31
+,0x36,0x31,0x30,0x30,0x37,0x35,0x37,0x5a
+,0x30,0x81,0xbe,0x31,0x3f,0x30,0x3d,0x06
+,0x03,0x55,0x04,0x03,0x0c,0x36,0x54,0xc3
+,0x9c,0x52,0x4b,0x54,0x52,0x55,0x53,0x54
+,0x20,0x45,0x6c,0x65,0x6b,0x74,0x72,0x6f
+,0x6e,0x69,0x6b,0x20,0x53,0x65,0x72,0x74
+,0x69,0x66,0x69,0x6b,0x61,0x20,0x48,0x69
+,0x7a,0x6d,0x65,0x74,0x20,0x53,0x61,0xc4
+,0x9f,0x6c,0x61,0x79,0xc4,0xb1,0x63,0xc4
+,0xb1,0x73,0xc4,0xb1,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x54
+,0x52,0x31,0x0f,0x30,0x0d,0x06,0x03,0x55
+,0x04,0x07,0x0c,0x06,0x41,0x6e,0x6b,0x61
+,0x72,0x61,0x31,0x5d,0x30,0x5b,0x06,0x03
+,0x55,0x04,0x0a,0x0c,0x54,0x54,0xc3,0x9c
+,0x52,0x4b,0x54,0x52,0x55,0x53,0x54,0x20
+,0x42,0x69,0x6c,0x67,0x69,0x20,0xc4,0xb0
+,0x6c,0x65,0x74,0x69,0xc5,0x9f,0x69,0x6d
+,0x20,0x76,0x65,0x20,0x42,0x69,0x6c,0x69
+,0xc5,0x9f,0x69,0x6d,0x20,0x47,0xc3,0xbc
+,0x76,0x65,0x6e,0x6c,0x69,0xc4,0x9f,0x69
+,0x20,0x48,0x69,0x7a,0x6d,0x65,0x74,0x6c
+,0x65,0x72,0x69,0x20,0x41,0x2e,0xc5,0x9e
+,0x2e,0x20,0x28,0x63,0x29,0x20,0x4b,0x61
+,0x73,0xc4,0xb1,0x6d,0x20,0x32,0x30,0x30
+,0x35,0x30,0x82,0x01,0x22,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f
+,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01
+,0x01,0x00,0xa9,0x36,0x7e,0xc3,0x91,0x43
+,0x4c,0xc3,0x19,0x98,0x08,0xc8,0xc7,0x58
+,0x7b,0x4f,0x16,0x8c,0xa5,0xce,0x49,0x01
+,0x1f,0x73,0x0e,0xac,0x75,0x13,0xa6,0xfa
+,0x9e,0x2c,0x20,0xde,0xd8,0x90,0x0e,0x0a
+,0xd1,0x69,0xd2,0x27,0xfb,0xaa,0x77,0x9f
+,0x27,0x52,0x25,0xe2,0xcb,0x5d,0xd8,0xd8
+,0x83,0x50,0x17,0x7d,0x8a,0xb5,0x82,0x3f
+,0x04,0x8e,0xb4,0xd5,0xf0,0x49,0xa7,0x64
+,0xb7,0x1e,0x2e,0x5f,0x20,0x9c,0x50,0x75
+,0x4f,0xaf,0xe1,0xb5,0x41,0x14,0xf4,0x98
+,0x92,0x88,0xc7,0xe5,0xe5,0x64,0x47,0x61
+,0x47,0x79,0xfd,0xc0,0x51,0xf1,0xc1,0x99
+,0xe7,0xdc,0xce,0x6a,0xfb,0xaf,0xb5,0x01
+,0x30,0xdc,0x46,0x1c,0xef,0x8a,0xec,0x95
+,0xef,0xdc,0xff,0xaf,0x10,0x1c,0xeb,0x9d
+,0xd8,0xb0,0xaa,0x6a,0x85,0x18,0x0d,0x17
+,0xc9,0x3e,0xbf,0xf1,0x9b,0xd0,0x09,0x89
+,0x42,0xfd,0xa0,0x42,0xb4,0x9d,0x89,0x51
+,0x55,0x29,0xcf,0x1b,0x70,0xbc,0x84,0x54
+,0xad,0xc1,0x13,0x1f,0x98,0xf4,0x2e,0x76
+,0x60,0x8b,0x5d,0x3f,0x9a,0xad,0xca,0x0c
+,0xbf,0xa7,0x56,0x5b,0x8f,0x77,0xb8,0xd5
+,0x9e,0x79,0x49,0x92,0x3f,0xe0,0xf1,0x97
+,0x24,0x7a,0x6c,0x9b,0x17,0x0f,0x6d,0xef
+,0x53,0x98,0x91,0x2b,0xe4,0x0f,0xbe,0x59
+,0x79,0x07,0x78,0xbb,0x97,0x95,0xf4,0x9f
+,0x69,0xd4,0x58,0x87,0x0a,0xa9,0xe3,0xcc
+,0xb6,0x58,0x19,0x9f,0x26,0x21,0xb1,0xc4
+,0x59,0x8d,0xb2,0x41,0x75,0xc0,0xad,0x69
+,0xce,0x9c,0x00,0x08,0xf2,0x36,0xff,0x3e
+,0xf0,0xa1,0x0f,0x1a,0xac,0x14,0xfd,0xa6
+,0x60,0x0f,0x02,0x03,0x01,0x00,0x01,0xa3
+,0x43,0x30,0x41,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0xd9,0x37
+,0xb3,0x4e,0x05,0xfd,0xd9,0xcf,0x9f,0x12
+,0x16,0xae,0xb6,0x89,0x2f,0xeb,0x25,0x3a
+,0x88,0x1c,0x30,0x0f,0x06,0x03,0x55,0x1d
+,0x0f,0x01,0x01,0xff,0x04,0x05,0x03,0x03
+,0x07,0x06,0x00,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00
+,0x72,0x60,0x96,0xb7,0xc9,0xdc,0xd8,0x29
+,0x5e,0x23,0x85,0x5f,0xb2,0xb3,0x2d,0x76
+,0xfb,0x88,0xd7,0x17,0xfe,0x7b,0x6d,0x45
+,0xb8,0xf6,0x85,0x6c,0x9f,0x22,0xfc,0x2a
+,0x10,0x22,0xec,0xaa,0xb9,0x30,0xf6,0xab
+,0x58,0xd6,0x39,0x10,0x31,0x99,0x29,0x00
+,0xbd,0x89,0x66,0x41,0xfb,0x74,0xde,0x91
+,0xc1,0x18,0x0b,0x9f,0xb5,0x61,0xcb,0x9d
+,0x3a,0xbe,0xf5,0xa8,0x94,0xa3,0x22,0x55
+,0x6e,0x17,0x49,0xff,0xd2,0x29,0xf1,0x38
+,0x26,0x5d,0xef,0xa5,0xaa,0x3a,0xf9,0x71
+,0x7b,0xe6,0xda,0x58,0x1d,0xd3,0x74,0xc2
+,0x01,0xfa,0x3e,0x69,0x58,0x5f,0xad,0xcb
+,0x68,0xbe,0x14,0x2e,0x9b,0x6c,0xc0,0xb6
+,0xdc,0xa0,0x26,0xfa,0x77,0x1a,0xe2,0x24
+,0xda,0x1a,0x37,0xe0,0x67,0xad,0xd1,0x73
+,0x83,0x0d,0xa5,0x1a,0x1d,0x6e,0x12,0x92
+,0x7e,0x84,0x62,0x00,0x17,0xbd,0xbc,0x25
+,0x18,0x57,0xf2,0xd7,0xa9,0x6f,0x59,0x88
+,0xbc,0x34,0xb7,0x2e,0x85,0x78,0x9d,0x96
+,0xdc,0x14,0xc3,0x2c,0x8a,0x52,0x9b,0x96
+,0x8c,0x52,0x66,0x3d,0x86,0x16,0x8b,0x47
+,0xb8,0x51,0x09,0x8c,0xea,0x7d,0xcd,0x88
+,0x72,0xb3,0x60,0x33,0xb1,0xf0,0x0a,0x44
+,0xef,0x0f,0xf5,0x09,0x37,0x88,0x24,0x0e
+,0x2c,0x6b,0x20,0x3a,0xa2,0xfa,0x11,0xf2
+,0x40,0x35,0x9c,0x44,0x68,0x63,0x3b,0xac
+,0x33,0x6f,0x63,0xbc,0x2c,0xbb,0xf2,0xd2
+,0xcb,0x76,0x7d,0x7d,0x88,0xd8,0x1d,0xc8
+,0x05,0x1d,0x6e,0xbc,0x94,0xa9,0x66,0x8c
+,0x77,0x71,0xc7,0xfa,0x91,0xfa,0x2f,0x51
+,0x9e,0xe9,0x39,0x52,0xb6,0xe7,0x04,0x42
+};
+const unsigned int NptTlsTrustAnchor_Extended_0003_Size = 1088;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0004.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0004.cpp
new file mode 100644
index 0000000..f77fb4f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0004.cpp
@@ -0,0 +1,163 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* OISTE WISeKey Global Root GA CA */
+const unsigned char NptTlsTrustAnchor_Extended_0004_Data[1013] = {
+0x30,0x82,0x03,0xf1,0x30,0x82,0x02,0xd9
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x41
+,0x3d,0x72,0xc7,0xf4,0x6b,0x1f,0x81,0x43
+,0x7d,0xf1,0xd2,0x28,0x54,0xdf,0x9a,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0x8a,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x10
+,0x30,0x0e,0x06,0x03,0x55,0x04,0x0a,0x13
+,0x07,0x57,0x49,0x53,0x65,0x4b,0x65,0x79
+,0x31,0x1b,0x30,0x19,0x06,0x03,0x55,0x04
+,0x0b,0x13,0x12,0x43,0x6f,0x70,0x79,0x72
+,0x69,0x67,0x68,0x74,0x20,0x28,0x63,0x29
+,0x20,0x32,0x30,0x30,0x35,0x31,0x22,0x30
+,0x20,0x06,0x03,0x55,0x04,0x0b,0x13,0x19
+,0x4f,0x49,0x53,0x54,0x45,0x20,0x46,0x6f
+,0x75,0x6e,0x64,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x45,0x6e,0x64,0x6f,0x72,0x73,0x65
+,0x64,0x31,0x28,0x30,0x26,0x06,0x03,0x55
+,0x04,0x03,0x13,0x1f,0x4f,0x49,0x53,0x54
+,0x45,0x20,0x57,0x49,0x53,0x65,0x4b,0x65
+,0x79,0x20,0x47,0x6c,0x6f,0x62,0x61,0x6c
+,0x20,0x52,0x6f,0x6f,0x74,0x20,0x47,0x41
+,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d,0x30
+,0x35,0x31,0x32,0x31,0x31,0x31,0x36,0x30
+,0x33,0x34,0x34,0x5a,0x17,0x0d,0x33,0x37
+,0x31,0x32,0x31,0x31,0x31,0x36,0x30,0x39
+,0x35,0x31,0x5a,0x30,0x81,0x8a,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x43,0x48,0x31,0x10,0x30,0x0e,0x06
+,0x03,0x55,0x04,0x0a,0x13,0x07,0x57,0x49
+,0x53,0x65,0x4b,0x65,0x79,0x31,0x1b,0x30
+,0x19,0x06,0x03,0x55,0x04,0x0b,0x13,0x12
+,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68
+,0x74,0x20,0x28,0x63,0x29,0x20,0x32,0x30
+,0x30,0x35,0x31,0x22,0x30,0x20,0x06,0x03
+,0x55,0x04,0x0b,0x13,0x19,0x4f,0x49,0x53
+,0x54,0x45,0x20,0x46,0x6f,0x75,0x6e,0x64
+,0x61,0x74,0x69,0x6f,0x6e,0x20,0x45,0x6e
+,0x64,0x6f,0x72,0x73,0x65,0x64,0x31,0x28
+,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13
+,0x1f,0x4f,0x49,0x53,0x54,0x45,0x20,0x57
+,0x49,0x53,0x65,0x4b,0x65,0x79,0x20,0x47
+,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x52,0x6f
+,0x6f,0x74,0x20,0x47,0x41,0x20,0x43,0x41
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xcb,0x4f,0xb3,0x00,0x9b,0x3d,0x36
+,0xdd,0xf9,0xd1,0x49,0x6a,0x6b,0x10,0x49
+,0x1f,0xec,0xd8,0x2b,0xb2,0xc6,0xf8,0x32
+,0x81,0x29,0x43,0x95,0x4c,0x9a,0x19,0x23
+,0x21,0x15,0x45,0xde,0xe3,0xc8,0x1c,0x51
+,0x55,0x5b,0xae,0x93,0xe8,0x37,0xff,0x2b
+,0x6b,0xe9,0xd4,0xea,0xbe,0x2a,0xdd,0xa8
+,0x51,0x2b,0xd7,0x66,0xc3,0x61,0x5c,0x60
+,0x02,0xc8,0xf5,0xce,0x72,0x7b,0x3b,0xb8
+,0xf2,0x4e,0x65,0x08,0x9a,0xcd,0xa4,0x6a
+,0x19,0xc1,0x01,0xbb,0x73,0xa6,0xd7,0xf6
+,0xc3,0xdd,0xcd,0xbc,0xa4,0x8b,0xb5,0x99
+,0x61,0xb8,0x01,0xa2,0xa3,0xd4,0x4d,0xd4
+,0x05,0x3d,0x91,0xad,0xf8,0xb4,0x08,0x71
+,0x64,0xaf,0x70,0xf1,0x1c,0x6b,0x7e,0xf6
+,0xc3,0x77,0x9d,0x24,0x73,0x7b,0xe4,0x0c
+,0x8c,0xe1,0xd9,0x36,0xe1,0x99,0x8b,0x05
+,0x99,0x0b,0xed,0x45,0x31,0x09,0xca,0xc2
+,0x00,0xdb,0xf7,0x72,0xa0,0x96,0xaa,0x95
+,0x87,0xd0,0x8e,0xc7,0xb6,0x61,0x73,0x0d
+,0x76,0x66,0x8c,0xdc,0x1b,0xb4,0x63,0xa2
+,0x9f,0x7f,0x93,0x13,0x30,0xf1,0xa1,0x27
+,0xdb,0xd9,0xff,0x2c,0x55,0x88,0x91,0xa0
+,0xe0,0x4f,0x07,0xb0,0x28,0x56,0x8c,0x18
+,0x1b,0x97,0x44,0x8e,0x89,0xdd,0xe0,0x17
+,0x6e,0xe7,0x2a,0xef,0x8f,0x39,0x0a,0x31
+,0x84,0x82,0xd8,0x40,0x14,0x49,0x2e,0x7a
+,0x41,0xe4,0xa7,0xfe,0xe3,0x64,0xcc,0xc1
+,0x59,0x71,0x4b,0x2c,0x21,0xa7,0x5b,0x7d
+,0xe0,0x1d,0xd1,0x2e,0x81,0x9b,0xc3,0xd8
+,0x68,0xf7,0xbd,0x96,0x1b,0xac,0x70,0xb1
+,0x16,0x14,0x0b,0xdb,0x60,0xb9,0x26,0x01
+,0x05,0x02,0x03,0x01,0x00,0x01,0xa3,0x51
+,0x30,0x4f,0x30,0x0b,0x06,0x03,0x55,0x1d
+,0x0f,0x04,0x04,0x03,0x02,0x01,0x86,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0xb3,0x03,0x7e,0xae,0x36
+,0xbc,0xb0,0x79,0xd1,0xdc,0x94,0x26,0xb6
+,0x11,0xbe,0x21,0xb2,0x69,0x86,0x94,0x30
+,0x10,0x06,0x09,0x2b,0x06,0x01,0x04,0x01
+,0x82,0x37,0x15,0x01,0x04,0x03,0x02,0x01
+,0x00,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00
+,0x03,0x82,0x01,0x01,0x00,0x4b,0xa1,0xff
+,0x0b,0x87,0x6e,0xb3,0xf9,0xc1,0x43,0xb1
+,0x48,0xf3,0x28,0xc0,0x1d,0x2e,0xc9,0x09
+,0x41,0xfa,0x94,0x00,0x1c,0xa4,0xa4,0xab
+,0x49,0x4f,0x8f,0x3d,0x1e,0xef,0x4d,0x6f
+,0xbd,0xbc,0xa4,0xf6,0xf2,0x26,0x30,0xc9
+,0x10,0xca,0x1d,0x88,0xfb,0x74,0x19,0x1f
+,0x85,0x45,0xbd,0xb0,0x6c,0x51,0xf9,0x36
+,0x7e,0xdb,0xf5,0x4c,0x32,0x3a,0x41,0x4f
+,0x5b,0x47,0xcf,0xe8,0x0b,0x2d,0xb6,0xc4
+,0x19,0x9d,0x74,0xc5,0x47,0xc6,0x3b,0x6a
+,0x0f,0xac,0x14,0xdb,0x3c,0xf4,0x73,0x9c
+,0xa9,0x05,0xdf,0x00,0xdc,0x74,0x78,0xfa
+,0xf8,0x35,0x60,0x59,0x02,0x13,0x18,0x7c
+,0xbc,0xfb,0x4d,0xb0,0x20,0x6d,0x43,0xbb
+,0x60,0x30,0x7a,0x67,0x33,0x5c,0xc5,0x99
+,0xd1,0xf8,0x2d,0x39,0x52,0x73,0xfb,0x8c
+,0xaa,0x97,0x25,0x5c,0x72,0xd9,0x08,0x1e
+,0xab,0x4e,0x3c,0xe3,0x81,0x31,0x9f,0x03
+,0xa6,0xfb,0xc0,0xfe,0x29,0x88,0x55,0xda
+,0x84,0xd5,0x50,0x03,0xb6,0xe2,0x84,0xa3
+,0xa6,0x36,0xaa,0x11,0x3a,0x01,0xe1,0x18
+,0x4b,0xd6,0x44,0x68,0xb3,0x3d,0xf9,0x53
+,0x74,0x84,0xb3,0x46,0x91,0x46,0x96,0x00
+,0xb7,0x80,0x2c,0xb6,0xe1,0xe3,0x10,0xe2
+,0xdb,0xa2,0xe7,0x28,0x8f,0x01,0x96,0x62
+,0x16,0x3e,0x00,0xe3,0x1c,0xa5,0x36,0x81
+,0x18,0xa2,0x4c,0x52,0x76,0xc0,0x11,0xa3
+,0x6e,0xe6,0x1d,0xba,0xe3,0x5a,0xbe,0x36
+,0x53,0xc5,0x3e,0x75,0x8f,0x86,0x69,0x29
+,0x58,0x53,0xb5,0x9c,0xbb,0x6f,0x9f,0x5c
+,0xc5,0x18,0xec,0xdd,0x2f,0xe1,0x98,0xc9
+,0xfc,0xbe,0xdf,0x0a,0x0d};
+const unsigned int NptTlsTrustAnchor_Extended_0004_Size = 1013;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0005.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0005.cpp
new file mode 100644
index 0000000..77416f7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0005.cpp
@@ -0,0 +1,180 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* S-TRUST Authentication and Encryption Root CA 2005 PN */
+const unsigned char NptTlsTrustAnchor_Extended_0005_Data[1151] = {
+0x30,0x82,0x04,0x7b,0x30,0x82,0x03,0x63
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x37
+,0x19,0x18,0xe6,0x53,0x54,0x7c,0x1a,0xb5
+,0xb8,0xcb,0x59,0x5a,0xdb,0x35,0xb7,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0xae,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x20
+,0x30,0x1e,0x06,0x03,0x55,0x04,0x08,0x13
+,0x17,0x42,0x61,0x64,0x65,0x6e,0x2d,0x57
+,0x75,0x65,0x72,0x74,0x74,0x65,0x6d,0x62
+,0x65,0x72,0x67,0x20,0x28,0x42,0x57,0x29
+,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04
+,0x07,0x13,0x09,0x53,0x74,0x75,0x74,0x74
+,0x67,0x61,0x72,0x74,0x31,0x29,0x30,0x27
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x20,0x44
+,0x65,0x75,0x74,0x73,0x63,0x68,0x65,0x72
+,0x20,0x53,0x70,0x61,0x72,0x6b,0x61,0x73
+,0x73,0x65,0x6e,0x20,0x56,0x65,0x72,0x6c
+,0x61,0x67,0x20,0x47,0x6d,0x62,0x48,0x31
+,0x3e,0x30,0x3c,0x06,0x03,0x55,0x04,0x03
+,0x13,0x35,0x53,0x2d,0x54,0x52,0x55,0x53
+,0x54,0x20,0x41,0x75,0x74,0x68,0x65,0x6e
+,0x74,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e
+,0x20,0x61,0x6e,0x64,0x20,0x45,0x6e,0x63
+,0x72,0x79,0x70,0x74,0x69,0x6f,0x6e,0x20
+,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41,0x20
+,0x32,0x30,0x30,0x35,0x3a,0x50,0x4e,0x30
+,0x1e,0x17,0x0d,0x30,0x35,0x30,0x36,0x32
+,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x5a
+,0x17,0x0d,0x33,0x30,0x30,0x36,0x32,0x31
+,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30
+,0x81,0xae,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x44,0x45,0x31
+,0x20,0x30,0x1e,0x06,0x03,0x55,0x04,0x08
+,0x13,0x17,0x42,0x61,0x64,0x65,0x6e,0x2d
+,0x57,0x75,0x65,0x72,0x74,0x74,0x65,0x6d
+,0x62,0x65,0x72,0x67,0x20,0x28,0x42,0x57
+,0x29,0x31,0x12,0x30,0x10,0x06,0x03,0x55
+,0x04,0x07,0x13,0x09,0x53,0x74,0x75,0x74
+,0x74,0x67,0x61,0x72,0x74,0x31,0x29,0x30
+,0x27,0x06,0x03,0x55,0x04,0x0a,0x13,0x20
+,0x44,0x65,0x75,0x74,0x73,0x63,0x68,0x65
+,0x72,0x20,0x53,0x70,0x61,0x72,0x6b,0x61
+,0x73,0x73,0x65,0x6e,0x20,0x56,0x65,0x72
+,0x6c,0x61,0x67,0x20,0x47,0x6d,0x62,0x48
+,0x31,0x3e,0x30,0x3c,0x06,0x03,0x55,0x04
+,0x03,0x13,0x35,0x53,0x2d,0x54,0x52,0x55
+,0x53,0x54,0x20,0x41,0x75,0x74,0x68,0x65
+,0x6e,0x74,0x69,0x63,0x61,0x74,0x69,0x6f
+,0x6e,0x20,0x61,0x6e,0x64,0x20,0x45,0x6e
+,0x63,0x72,0x79,0x70,0x74,0x69,0x6f,0x6e
+,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41
+,0x20,0x32,0x30,0x30,0x35,0x3a,0x50,0x4e
+,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09
+,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01
+,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00
+,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01
+,0x00,0xd9,0xb5,0x4a,0xc1,0xd3,0x33,0xea
+,0xd3,0x46,0xb3,0xd1,0xe2,0x4c,0xd2,0xf5
+,0xb6,0x83,0xd0,0x6f,0xd5,0x18,0xe9,0x93
+,0xaf,0x27,0x8e,0x13,0xcd,0xb5,0x25,0x36
+,0x50,0x34,0x12,0x64,0x29,0xa1,0x55,0xe1
+,0x3a,0x60,0x93,0x9e,0x28,0xc9,0xe3,0xf3
+,0x9b,0xe1,0x04,0xb0,0x23,0xbf,0x95,0x8a
+,0x8e,0x5b,0x1b,0x41,0x7f,0x5a,0xc3,0xe8
+,0x4d,0x4c,0xd5,0x24,0x16,0x3e,0x87,0x48
+,0xd4,0x27,0xae,0xe6,0xf7,0x53,0x1d,0xbb
+,0x0c,0x00,0xef,0x3e,0x61,0x71,0xad,0xbf
+,0x3a,0x7a,0x58,0x1f,0x94,0x3d,0x5c,0x81
+,0xd5,0xd5,0x6f,0xdf,0xb8,0x9b,0xd2,0xf5
+,0xe5,0xcb,0x83,0x72,0x92,0xc2,0x53,0xb2
+,0x82,0x02,0xeb,0xad,0xad,0x5f,0x16,0x2d
+,0x92,0x53,0x76,0xf1,0x89,0xb6,0x2c,0xf5
+,0xc1,0x2f,0xe0,0xa7,0x4a,0x6f,0xa0,0x30
+,0x6a,0x32,0xeb,0x9a,0x74,0x03,0x68,0x78
+,0x13,0x9d,0xca,0x2f,0x9b,0x0b,0x1d,0xbe
+,0xcf,0x75,0x0d,0x26,0x97,0x9b,0xc7,0xf5
+,0x5e,0x0a,0x9f,0x78,0xdf,0xb3,0xbc,0xec
+,0x9a,0xba,0xef,0x55,0x8f,0x1b,0x9a,0xa6
+,0x07,0x63,0x29,0x17,0x59,0x62,0x09,0x2a
+,0x79,0x07,0x77,0xa5,0xe0,0xd1,0x17,0x69
+,0xe9,0x5b,0xdd,0xf6,0x90,0xab,0xe2,0x98
+,0x0a,0x00,0xd1,0x25,0x6d,0x9e,0xd7,0x85
+,0x87,0x2f,0x92,0xf1,0xd1,0x76,0x83,0x4f
+,0x0b,0x3a,0x59,0x37,0x28,0x2f,0x33,0xa7
+,0x17,0x50,0xd6,0x20,0x0b,0x0a,0xf4,0x26
+,0xf9,0x9f,0x38,0xe7,0x2d,0xa4,0xb8,0x9b
+,0x89,0x8d,0xad,0xad,0xc9,0x6a,0x7d,0x89
+,0x17,0xbb,0xf6,0x7f,0x80,0x83,0x7a,0xe6
+,0xed,0x02,0x03,0x01,0x00,0x01,0xa3,0x81
+,0x92,0x30,0x81,0x8f,0x30,0x12,0x06,0x03
+,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x08
+,0x30,0x06,0x01,0x01,0xff,0x02,0x01,0x00
+,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01
+,0x01,0xff,0x04,0x04,0x03,0x02,0x01,0x06
+,0x30,0x29,0x06,0x03,0x55,0x1d,0x11,0x04
+,0x22,0x30,0x20,0xa4,0x1e,0x30,0x1c,0x31
+,0x1a,0x30,0x18,0x06,0x03,0x55,0x04,0x03
+,0x13,0x11,0x53,0x54,0x52,0x6f,0x6e,0x6c
+,0x69,0x6e,0x65,0x31,0x2d,0x32,0x30,0x34
+,0x38,0x2d,0x35,0x30,0x1d,0x06,0x03,0x55
+,0x1d,0x0e,0x04,0x16,0x04,0x14,0x0f,0xca
+,0x1e,0x5c,0x79,0xe0,0xa2,0xf3,0x29,0xb6
+,0xd2,0x85,0xb3,0x0b,0x4a,0xb5,0x65,0xec
+,0x6b,0x52,0x30,0x1f,0x06,0x03,0x55,0x1d
+,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x0f
+,0xca,0x1e,0x5c,0x79,0xe0,0xa2,0xf3,0x29
+,0xb6,0xd2,0x85,0xb3,0x0b,0x4a,0xb5,0x65
+,0xec,0x6b,0x52,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0xaf
+,0x01,0xf0,0xed,0x19,0x3c,0x28,0xe8,0x4d
+,0x5c,0xbb,0xa5,0x63,0x1c,0x88,0x33,0x03
+,0xa7,0x00,0x87,0xa4,0x1f,0x20,0xab,0xd6
+,0x1c,0xe3,0x06,0x1f,0x97,0x7e,0x54,0xbd
+,0xb7,0xd1,0xb2,0xc9,0xd5,0xda,0x80,0xec
+,0x17,0xd7,0x8a,0xf5,0x7b,0xc2,0x00,0xf6
+,0xe9,0x11,0x6f,0x84,0xa0,0x5a,0x25,0x31
+,0xe2,0x89,0xf9,0xa4,0x00,0x3f,0x31,0x68
+,0x2e,0xd5,0x3d,0xe8,0x6e,0xe6,0xd5,0x1d
+,0x3c,0x3f,0xb2,0xbd,0x9f,0x77,0xeb,0x9d
+,0xd3,0x8c,0xba,0xc0,0xd7,0xb6,0x4d,0xec
+,0x53,0x9c,0x0f,0x04,0x6e,0xea,0x35,0x67
+,0x57,0xe3,0x0a,0x65,0x7b,0x90,0x3a,0xe1
+,0x4f,0x3e,0xc3,0x00,0x92,0x7a,0xbb,0x05
+,0x89,0x73,0x8c,0xcb,0xa6,0x4d,0xc0,0xfb
+,0xf6,0x02,0xd6,0xb0,0x07,0xa3,0x03,0xc2
+,0x27,0x40,0x9f,0x0c,0xe4,0x85,0x82,0x2d
+,0xaf,0x9a,0x42,0x1d,0xd0,0xc7,0x8d,0xf8
+,0x40,0xee,0x9d,0x06,0x57,0x1c,0xd9,0xa2
+,0xd8,0x80,0x14,0xfe,0xe1,0x63,0x2d,0x32
+,0x87,0xd5,0x94,0x52,0x96,0x3a,0x46,0xc6
+,0x71,0x96,0x3d,0xf7,0x98,0x0e,0xb2,0x91
+,0xaa,0x8f,0xda,0xf4,0x4e,0x24,0x00,0x39
+,0x55,0xe8,0xad,0x17,0xb9,0xd3,0x34,0x2b
+,0x4a,0xa9,0x40,0xcc,0x17,0x2a,0x55,0x65
+,0x41,0x74,0x42,0x7e,0xf5,0xc0,0xaf,0xc8
+,0x93,0xad,0xf2,0x18,0x5b,0x3d,0x89,0x0c
+,0xdb,0x47,0x39,0x24,0xf8,0xe0,0x4c,0xf2
+,0x1f,0xb0,0x3d,0x0a,0xca,0x05,0x4e,0x89
+,0x21,0x1a,0xe3,0x2a,0x99,0xac,0xfc,0x7f
+,0xa1,0xf1,0x0f,0x1b,0x1f,0x3d,0x9e,0x04
+,0x83,0xdd,0x96,0xd9,0x1d,0x3a,0x94};
+const unsigned int NptTlsTrustAnchor_Extended_0005_Size = 1151;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0006.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0006.cpp
new file mode 100644
index 0000000..3649080
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0006.cpp
@@ -0,0 +1,282 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Microsec e-Szigno Root CA */
+const unsigned char NptTlsTrustAnchor_Extended_0006_Data[1964] = {
+0x30,0x82,0x07,0xa8,0x30,0x82,0x06,0x90
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x11,0x00
+,0xcc,0xb8,0xe7,0xbf,0x4e,0x29,0x1a,0xfd
+,0xa2,0xdc,0x66,0xa5,0x1c,0x2c,0x0f,0x11
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x72,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x48,0x55,0x31,0x11
+,0x30,0x0f,0x06,0x03,0x55,0x04,0x07,0x13
+,0x08,0x42,0x75,0x64,0x61,0x70,0x65,0x73
+,0x74,0x31,0x16,0x30,0x14,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x0d,0x4d,0x69,0x63,0x72
+,0x6f,0x73,0x65,0x63,0x20,0x4c,0x74,0x64
+,0x2e,0x31,0x14,0x30,0x12,0x06,0x03,0x55
+,0x04,0x0b,0x13,0x0b,0x65,0x2d,0x53,0x7a
+,0x69,0x67,0x6e,0x6f,0x20,0x43,0x41,0x31
+,0x22,0x30,0x20,0x06,0x03,0x55,0x04,0x03
+,0x13,0x19,0x4d,0x69,0x63,0x72,0x6f,0x73
+,0x65,0x63,0x20,0x65,0x2d,0x53,0x7a,0x69
+,0x67,0x6e,0x6f,0x20,0x52,0x6f,0x6f,0x74
+,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d,0x30
+,0x35,0x30,0x34,0x30,0x36,0x31,0x32,0x32
+,0x38,0x34,0x34,0x5a,0x17,0x0d,0x31,0x37
+,0x30,0x34,0x30,0x36,0x31,0x32,0x32,0x38
+,0x34,0x34,0x5a,0x30,0x72,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x48,0x55,0x31,0x11,0x30,0x0f,0x06,0x03
+,0x55,0x04,0x07,0x13,0x08,0x42,0x75,0x64
+,0x61,0x70,0x65,0x73,0x74,0x31,0x16,0x30
+,0x14,0x06,0x03,0x55,0x04,0x0a,0x13,0x0d
+,0x4d,0x69,0x63,0x72,0x6f,0x73,0x65,0x63
+,0x20,0x4c,0x74,0x64,0x2e,0x31,0x14,0x30
+,0x12,0x06,0x03,0x55,0x04,0x0b,0x13,0x0b
+,0x65,0x2d,0x53,0x7a,0x69,0x67,0x6e,0x6f
+,0x20,0x43,0x41,0x31,0x22,0x30,0x20,0x06
+,0x03,0x55,0x04,0x03,0x13,0x19,0x4d,0x69
+,0x63,0x72,0x6f,0x73,0x65,0x63,0x20,0x65
+,0x2d,0x53,0x7a,0x69,0x67,0x6e,0x6f,0x20
+,0x52,0x6f,0x6f,0x74,0x20,0x43,0x41,0x30
+,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01
+,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30
+,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00
+,0xed,0xc8,0x00,0xd5,0x81,0x7b,0xcd,0x38
+,0x00,0x47,0xcc,0xdb,0x84,0xc1,0x21,0x69
+,0x2c,0x74,0x90,0x0c,0x21,0xd9,0x53,0x87
+,0xed,0x3e,0x43,0x44,0x53,0xaf,0xab,0xf8
+,0x80,0x9b,0x3c,0x78,0x8d,0xd4,0x8d,0xae
+,0xb8,0xef,0xd3,0x11,0xdc,0x81,0xe6,0xcf
+,0x3b,0x96,0x8c,0xd6,0x6f,0x15,0xc6,0x77
+,0x7e,0xa1,0x2f,0xe0,0x5f,0x92,0xb6,0x27
+,0xd7,0x76,0x9a,0x1d,0x43,0x3c,0xea,0xd9
+,0xec,0x2f,0xee,0x39,0xf3,0x6a,0x67,0x4b
+,0x8b,0x82,0xcf,0x22,0xf8,0x65,0x55,0xfe
+,0x2c,0xcb,0x2f,0x7d,0x48,0x7a,0x3d,0x75
+,0xf9,0xaa,0xa0,0x27,0xbb,0x78,0xc2,0x06
+,0xca,0x51,0xc2,0x7e,0x66,0x4b,0xaf,0xcd
+,0xa2,0xa7,0x4d,0x02,0x82,0x3f,0x82,0xac
+,0x85,0xc6,0xe1,0x0f,0x90,0x47,0x99,0x94
+,0x0a,0x71,0x72,0x93,0x2a,0xc9,0xa6,0xc0
+,0xbe,0x3c,0x56,0x4c,0x73,0x92,0x27,0xf1
+,0x6b,0xb5,0xf5,0xfd,0xfc,0x30,0x05,0x60
+,0x92,0xc6,0xeb,0x96,0x7e,0x01,0x91,0xc2
+,0x69,0xb1,0x1e,0x1d,0x7b,0x53,0x45,0xb8
+,0xdc,0x41,0x1f,0xc9,0x8b,0x71,0xd6,0x54
+,0x14,0xe3,0x8b,0x54,0x78,0x3f,0xbe,0xf4
+,0x62,0x3b,0x5b,0xf5,0xa3,0xec,0xd5,0x92
+,0x74,0xe2,0x74,0x30,0xef,0x01,0xdb,0xe1
+,0xd4,0xab,0x99,0x9b,0x2a,0x6b,0xf8,0xbd
+,0xa6,0x1c,0x86,0x23,0x42,0x5f,0xec,0x49
+,0xde,0x9a,0x8b,0x5b,0xf4,0x72,0x3a,0x40
+,0xc5,0x49,0x3e,0xa5,0xbe,0x8e,0xaa,0x71
+,0xeb,0x6c,0xfa,0xf5,0x1a,0xe4,0x6a,0xfd
+,0x7b,0x7d,0x55,0x40,0xef,0x58,0x6e,0xe6
+,0xd9,0xd5,0xbc,0x24,0xab,0xc1,0xef,0xb7
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x04
+,0x37,0x30,0x82,0x04,0x33,0x30,0x67,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01
+,0x01,0x04,0x5b,0x30,0x59,0x30,0x28,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30
+,0x01,0x86,0x1c,0x68,0x74,0x74,0x70,0x73
+,0x3a,0x2f,0x2f,0x72,0x63,0x61,0x2e,0x65
+,0x2d,0x73,0x7a,0x69,0x67,0x6e,0x6f,0x2e
+,0x68,0x75,0x2f,0x6f,0x63,0x73,0x70,0x30
+,0x2d,0x06,0x08,0x2b,0x06,0x01,0x05,0x05
+,0x07,0x30,0x02,0x86,0x21,0x68,0x74,0x74
+,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e
+,0x65,0x2d,0x73,0x7a,0x69,0x67,0x6e,0x6f
+,0x2e,0x68,0x75,0x2f,0x52,0x6f,0x6f,0x74
+,0x43,0x41,0x2e,0x63,0x72,0x74,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x82,0x01,0x73,0x06,0x03,0x55,0x1d,0x20
+,0x04,0x82,0x01,0x6a,0x30,0x82,0x01,0x66
+,0x30,0x82,0x01,0x62,0x06,0x0c,0x2b,0x06
+,0x01,0x04,0x01,0x81,0xa8,0x18,0x02,0x01
+,0x01,0x01,0x30,0x82,0x01,0x50,0x30,0x28
+,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07
+,0x02,0x01,0x16,0x1c,0x68,0x74,0x74,0x70
+,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x65
+,0x2d,0x73,0x7a,0x69,0x67,0x6e,0x6f,0x2e
+,0x68,0x75,0x2f,0x53,0x5a,0x53,0x5a,0x2f
+,0x30,0x82,0x01,0x22,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x02,0x02,0x30,0x82
+,0x01,0x14,0x1e,0x82,0x01,0x10,0x00,0x41
+,0x00,0x20,0x00,0x74,0x00,0x61,0x00,0x6e
+,0x00,0xfa,0x00,0x73,0x00,0xed,0x00,0x74
+,0x00,0x76,0x00,0xe1,0x00,0x6e,0x00,0x79
+,0x00,0x20,0x00,0xe9,0x00,0x72,0x00,0x74
+,0x00,0x65,0x00,0x6c,0x00,0x6d,0x00,0x65
+,0x00,0x7a,0x00,0xe9,0x00,0x73,0x00,0xe9
+,0x00,0x68,0x00,0x65,0x00,0x7a,0x00,0x20
+,0x00,0xe9,0x00,0x73,0x00,0x20,0x00,0x65
+,0x00,0x6c,0x00,0x66,0x00,0x6f,0x00,0x67
+,0x00,0x61,0x00,0x64,0x00,0xe1,0x00,0x73
+,0x00,0xe1,0x00,0x68,0x00,0x6f,0x00,0x7a
+,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x53
+,0x00,0x7a,0x00,0x6f,0x00,0x6c,0x00,0x67
+,0x00,0xe1,0x00,0x6c,0x00,0x74,0x00,0x61
+,0x00,0x74,0x00,0xf3,0x00,0x20,0x00,0x53
+,0x00,0x7a,0x00,0x6f,0x00,0x6c,0x00,0x67
+,0x00,0xe1,0x00,0x6c,0x00,0x74,0x00,0x61
+,0x00,0x74,0x00,0xe1,0x00,0x73,0x00,0x69
+,0x00,0x20,0x00,0x53,0x00,0x7a,0x00,0x61
+,0x00,0x62,0x00,0xe1,0x00,0x6c,0x00,0x79
+,0x00,0x7a,0x00,0x61,0x00,0x74,0x00,0x61
+,0x00,0x20,0x00,0x73,0x00,0x7a,0x00,0x65
+,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74
+,0x00,0x20,0x00,0x6b,0x00,0x65,0x00,0x6c
+,0x00,0x6c,0x00,0x20,0x00,0x65,0x00,0x6c
+,0x00,0x6a,0x00,0xe1,0x00,0x72,0x00,0x6e
+,0x00,0x69,0x00,0x3a,0x00,0x20,0x00,0x68
+,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a
+,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,0x77
+,0x00,0x77,0x00,0x2e,0x00,0x65,0x00,0x2d
+,0x00,0x73,0x00,0x7a,0x00,0x69,0x00,0x67
+,0x00,0x6e,0x00,0x6f,0x00,0x2e,0x00,0x68
+,0x00,0x75,0x00,0x2f,0x00,0x53,0x00,0x5a
+,0x00,0x53,0x00,0x5a,0x00,0x2f,0x30,0x81
+,0xc8,0x06,0x03,0x55,0x1d,0x1f,0x04,0x81
+,0xc0,0x30,0x81,0xbd,0x30,0x81,0xba,0xa0
+,0x81,0xb7,0xa0,0x81,0xb4,0x86,0x21,0x68
+,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77
+,0x77,0x2e,0x65,0x2d,0x73,0x7a,0x69,0x67
+,0x6e,0x6f,0x2e,0x68,0x75,0x2f,0x52,0x6f
+,0x6f,0x74,0x43,0x41,0x2e,0x63,0x72,0x6c
+,0x86,0x81,0x8e,0x6c,0x64,0x61,0x70,0x3a
+,0x2f,0x2f,0x6c,0x64,0x61,0x70,0x2e,0x65
+,0x2d,0x73,0x7a,0x69,0x67,0x6e,0x6f,0x2e
+,0x68,0x75,0x2f,0x43,0x4e,0x3d,0x4d,0x69
+,0x63,0x72,0x6f,0x73,0x65,0x63,0x25,0x32
+,0x30,0x65,0x2d,0x53,0x7a,0x69,0x67,0x6e
+,0x6f,0x25,0x32,0x30,0x52,0x6f,0x6f,0x74
+,0x25,0x32,0x30,0x43,0x41,0x2c,0x4f,0x55
+,0x3d,0x65,0x2d,0x53,0x7a,0x69,0x67,0x6e
+,0x6f,0x25,0x32,0x30,0x43,0x41,0x2c,0x4f
+,0x3d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x65
+,0x63,0x25,0x32,0x30,0x4c,0x74,0x64,0x2e
+,0x2c,0x4c,0x3d,0x42,0x75,0x64,0x61,0x70
+,0x65,0x73,0x74,0x2c,0x43,0x3d,0x48,0x55
+,0x3f,0x63,0x65,0x72,0x74,0x69,0x66,0x69
+,0x63,0x61,0x74,0x65,0x52,0x65,0x76,0x6f
+,0x63,0x61,0x74,0x69,0x6f,0x6e,0x4c,0x69
+,0x73,0x74,0x3b,0x62,0x69,0x6e,0x61,0x72
+,0x79,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f
+,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01
+,0x06,0x30,0x81,0x96,0x06,0x03,0x55,0x1d
+,0x11,0x04,0x81,0x8e,0x30,0x81,0x8b,0x81
+,0x10,0x69,0x6e,0x66,0x6f,0x40,0x65,0x2d
+,0x73,0x7a,0x69,0x67,0x6e,0x6f,0x2e,0x68
+,0x75,0xa4,0x77,0x30,0x75,0x31,0x23,0x30
+,0x21,0x06,0x03,0x55,0x04,0x03,0x0c,0x1a
+,0x4d,0x69,0x63,0x72,0x6f,0x73,0x65,0x63
+,0x20,0x65,0x2d,0x53,0x7a,0x69,0x67,0x6e
+,0xc3,0xb3,0x20,0x52,0x6f,0x6f,0x74,0x20
+,0x43,0x41,0x31,0x16,0x30,0x14,0x06,0x03
+,0x55,0x04,0x0b,0x0c,0x0d,0x65,0x2d,0x53
+,0x7a,0x69,0x67,0x6e,0xc3,0xb3,0x20,0x48
+,0x53,0x5a,0x31,0x16,0x30,0x14,0x06,0x03
+,0x55,0x04,0x0a,0x13,0x0d,0x4d,0x69,0x63
+,0x72,0x6f,0x73,0x65,0x63,0x20,0x4b,0x66
+,0x74,0x2e,0x31,0x11,0x30,0x0f,0x06,0x03
+,0x55,0x04,0x07,0x13,0x08,0x42,0x75,0x64
+,0x61,0x70,0x65,0x73,0x74,0x31,0x0b,0x30
+,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02
+,0x48,0x55,0x30,0x81,0xac,0x06,0x03,0x55
+,0x1d,0x23,0x04,0x81,0xa4,0x30,0x81,0xa1
+,0x80,0x14,0xc7,0xa0,0x49,0x75,0x16,0x61
+,0x84,0xdb,0x31,0x4b,0x84,0xd2,0xf1,0x37
+,0x40,0x90,0xef,0x4e,0xdc,0xf7,0xa1,0x76
+,0xa4,0x74,0x30,0x72,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x48
+,0x55,0x31,0x11,0x30,0x0f,0x06,0x03,0x55
+,0x04,0x07,0x13,0x08,0x42,0x75,0x64,0x61
+,0x70,0x65,0x73,0x74,0x31,0x16,0x30,0x14
+,0x06,0x03,0x55,0x04,0x0a,0x13,0x0d,0x4d
+,0x69,0x63,0x72,0x6f,0x73,0x65,0x63,0x20
+,0x4c,0x74,0x64,0x2e,0x31,0x14,0x30,0x12
+,0x06,0x03,0x55,0x04,0x0b,0x13,0x0b,0x65
+,0x2d,0x53,0x7a,0x69,0x67,0x6e,0x6f,0x20
+,0x43,0x41,0x31,0x22,0x30,0x20,0x06,0x03
+,0x55,0x04,0x03,0x13,0x19,0x4d,0x69,0x63
+,0x72,0x6f,0x73,0x65,0x63,0x20,0x65,0x2d
+,0x53,0x7a,0x69,0x67,0x6e,0x6f,0x20,0x52
+,0x6f,0x6f,0x74,0x20,0x43,0x41,0x82,0x11
+,0x00,0xcc,0xb8,0xe7,0xbf,0x4e,0x29,0x1a
+,0xfd,0xa2,0xdc,0x66,0xa5,0x1c,0x2c,0x0f
+,0x11,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e
+,0x04,0x16,0x04,0x14,0xc7,0xa0,0x49,0x75
+,0x16,0x61,0x84,0xdb,0x31,0x4b,0x84,0xd2
+,0xf1,0x37,0x40,0x90,0xef,0x4e,0xdc,0xf7
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0xd3,0x13,0x9c,0x66
+,0x63,0x59,0x2e,0xca,0x5c,0x70,0x0c,0xfc
+,0x83,0xbc,0x55,0xb1,0xf4,0x8e,0x07,0x6c
+,0x66,0x27,0xce,0xc1,0x3b,0x20,0xa9,0x1c
+,0xbb,0x46,0x54,0x70,0xee,0x5a,0xcc,0xa0
+,0x77,0xea,0x68,0x44,0x27,0xeb,0xf2,0x29
+,0xdd,0x77,0xa9,0xd5,0xfb,0xe3,0xd4,0xa7
+,0x04,0xc4,0x95,0xb8,0x0b,0xe1,0x44,0x68
+,0x60,0x07,0x43,0x30,0x31,0x42,0x61,0xe5
+,0xee,0xd9,0xe5,0x24,0xd5,0x1b,0xdf,0xe1
+,0x4a,0x1b,0xaa,0x9f,0xc7,0x5f,0xf8,0x7a
+,0x11,0xea,0x13,0x93,0x00,0xca,0x8a,0x58
+,0xb1,0xee,0xed,0x0e,0x4d,0xb4,0xd7,0xa8
+,0x36,0x26,0x7c,0xe0,0x3a,0xc1,0xd5,0x57
+,0x82,0xf1,0x75,0xb6,0xfd,0x89,0x5f,0xda
+,0xf3,0xa8,0x38,0x9f,0x35,0x06,0x08,0xce
+,0x22,0x95,0xbe,0xcd,0xd5,0xfc,0xbe,0x5b
+,0xde,0x79,0x6b,0xdc,0x7a,0xa9,0x65,0x66
+,0xbe,0xb1,0x25,0x5a,0x5f,0xed,0x7e,0xd3
+,0xac,0x46,0x6d,0x4c,0xf4,0x32,0x87,0xb4
+,0x20,0x04,0xe0,0x6c,0x78,0xb0,0x77,0xd1
+,0x85,0x46,0x4b,0xa6,0x12,0xb7,0x75,0xe8
+,0x4a,0xc9,0x56,0x6c,0xd7,0x92,0xab,0x9d
+,0xf5,0x49,0x38,0xd2,0x4f,0x53,0xe3,0x55
+,0x90,0x11,0xdb,0x98,0x96,0xc6,0x49,0xf2
+,0x3e,0xf4,0x9f,0x1b,0xe0,0xf7,0x88,0xdc
+,0x25,0x62,0x99,0x44,0xd8,0x73,0xbf,0x3f
+,0x30,0xf3,0x0c,0x37,0x3e,0xd4,0xc2,0x28
+,0x80,0x73,0xb1,0x01,0xb7,0x9d,0x5a,0x96
+,0x14,0x01,0x4b,0xa9,0x11,0x9d,0x29,0x6a
+,0x2e,0xd0,0x5d,0x81,0xc0,0xcf,0xb2,0x20
+,0x43,0xc7,0x03,0xe0,0x37,0x4e,0x5d,0x0a
+,0xdc,0x59,0x20,0x25};
+const unsigned int NptTlsTrustAnchor_Extended_0006_Size = 1964;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0007.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0007.cpp
new file mode 100644
index 0000000..d61c5a0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0007.cpp
@@ -0,0 +1,154 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* Certigna */
+const unsigned char NptTlsTrustAnchor_Extended_0007_Data[940] = {
+0x30,0x82,0x03,0xa8,0x30,0x82,0x02,0x90
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x09,0x00
+,0xfe,0xdc,0xe3,0x01,0x0f,0xc9,0x48,0xff
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x34,0x31,0x0b,0x30,0x09,0x06,0x03,0x55
+,0x04,0x06,0x13,0x02,0x46,0x52,0x31,0x12
+,0x30,0x10,0x06,0x03,0x55,0x04,0x0a,0x0c
+,0x09,0x44,0x68,0x69,0x6d,0x79,0x6f,0x74
+,0x69,0x73,0x31,0x11,0x30,0x0f,0x06,0x03
+,0x55,0x04,0x03,0x0c,0x08,0x43,0x65,0x72
+,0x74,0x69,0x67,0x6e,0x61,0x30,0x1e,0x17
+,0x0d,0x30,0x37,0x30,0x36,0x32,0x39,0x31
+,0x35,0x31,0x33,0x30,0x35,0x5a,0x17,0x0d
+,0x32,0x37,0x30,0x36,0x32,0x39,0x31,0x35
+,0x31,0x33,0x30,0x35,0x5a,0x30,0x34,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x46,0x52,0x31,0x12,0x30,0x10
+,0x06,0x03,0x55,0x04,0x0a,0x0c,0x09,0x44
+,0x68,0x69,0x6d,0x79,0x6f,0x74,0x69,0x73
+,0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04
+,0x03,0x0c,0x08,0x43,0x65,0x72,0x74,0x69
+,0x67,0x6e,0x61,0x30,0x82,0x01,0x22,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82
+,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02
+,0x82,0x01,0x01,0x00,0xc8,0x68,0xf1,0xc9
+,0xd6,0xd6,0xb3,0x34,0x75,0x26,0x82,0x1e
+,0xec,0xb4,0xbe,0xea,0x5c,0xe1,0x26,0xed
+,0x11,0x47,0x61,0xe1,0xa2,0x7c,0x16,0x78
+,0x40,0x21,0xe4,0x60,0x9e,0x5a,0xc8,0x63
+,0xe1,0xc4,0xb1,0x96,0x92,0xff,0x18,0x6d
+,0x69,0x23,0xe1,0x2b,0x62,0xf7,0xdd,0xe2
+,0x36,0x2f,0x91,0x07,0xb9,0x48,0xcf,0x0e
+,0xec,0x79,0xb6,0x2c,0xe7,0x34,0x4b,0x70
+,0x08,0x25,0xa3,0x3c,0x87,0x1b,0x19,0xf2
+,0x81,0x07,0x0f,0x38,0x90,0x19,0xd3,0x11
+,0xfe,0x86,0xb4,0xf2,0xd1,0x5e,0x1e,0x1e
+,0x96,0xcd,0x80,0x6c,0xce,0x3b,0x31,0x93
+,0xb6,0xf2,0xa0,0xd0,0xa9,0x95,0x12,0x7d
+,0xa5,0x9a,0xcc,0x6b,0xc8,0x84,0x56,0x8a
+,0x33,0xa9,0xe7,0x22,0x15,0x53,0x16,0xf0
+,0xcc,0x17,0xec,0x57,0x5f,0xe9,0xa2,0x0a
+,0x98,0x09,0xde,0xe3,0x5f,0x9c,0x6f,0xdc
+,0x48,0xe3,0x85,0x0b,0x15,0x5a,0xa6,0xba
+,0x9f,0xac,0x48,0xe3,0x09,0xb2,0xf7,0xf4
+,0x32,0xde,0x5e,0x34,0xbe,0x1c,0x78,0x5d
+,0x42,0x5b,0xce,0x0e,0x22,0x8f,0x4d,0x90
+,0xd7,0x7d,0x32,0x18,0xb3,0x0b,0x2c,0x6a
+,0xbf,0x8e,0x3f,0x14,0x11,0x89,0x20,0x0e
+,0x77,0x14,0xb5,0x3d,0x94,0x08,0x87,0xf7
+,0x25,0x1e,0xd5,0xb2,0x60,0x00,0xec,0x6f
+,0x2a,0x28,0x25,0x6e,0x2a,0x3e,0x18,0x63
+,0x17,0x25,0x3f,0x3e,0x44,0x20,0x16,0xf6
+,0x26,0xc8,0x25,0xae,0x05,0x4a,0xb4,0xe7
+,0x63,0x2c,0xf3,0x8c,0x16,0x53,0x7e,0x5c
+,0xfb,0x11,0x1a,0x08,0xc1,0x46,0x62,0x9f
+,0x22,0xb8,0xf1,0xc2,0x8d,0x69,0xdc,0xfa
+,0x3a,0x58,0x06,0xdf,0x02,0x03,0x01,0x00
+,0x01,0xa3,0x81,0xbc,0x30,0x81,0xb9,0x30
+,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01
+,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0x1a,0xed,0xfe,0x41,0x39
+,0x90,0xb4,0x24,0x59,0xbe,0x01,0xf2,0x52
+,0xd5,0x45,0xf6,0x5a,0x39,0xdc,0x11,0x30
+,0x64,0x06,0x03,0x55,0x1d,0x23,0x04,0x5d
+,0x30,0x5b,0x80,0x14,0x1a,0xed,0xfe,0x41
+,0x39,0x90,0xb4,0x24,0x59,0xbe,0x01,0xf2
+,0x52,0xd5,0x45,0xf6,0x5a,0x39,0xdc,0x11
+,0xa1,0x38,0xa4,0x36,0x30,0x34,0x31,0x0b
+,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13
+,0x02,0x46,0x52,0x31,0x12,0x30,0x10,0x06
+,0x03,0x55,0x04,0x0a,0x0c,0x09,0x44,0x68
+,0x69,0x6d,0x79,0x6f,0x74,0x69,0x73,0x31
+,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x03
+,0x0c,0x08,0x43,0x65,0x72,0x74,0x69,0x67
+,0x6e,0x61,0x82,0x09,0x00,0xfe,0xdc,0xe3
+,0x01,0x0f,0xc9,0x48,0xff,0x30,0x0e,0x06
+,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04
+,0x04,0x03,0x02,0x01,0x06,0x30,0x11,0x06
+,0x09,0x60,0x86,0x48,0x01,0x86,0xf8,0x42
+,0x01,0x01,0x04,0x04,0x03,0x02,0x00,0x07
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x01,0x01,0x00,0x85,0x03,0x1e,0x92
+,0x71,0xf6,0x42,0xaf,0xe1,0xa3,0x61,0x9e
+,0xeb,0xf3,0xc0,0x0f,0xf2,0xa5,0xd4,0xda
+,0x95,0xe6,0xd6,0xbe,0x68,0x36,0x3d,0x7e
+,0x6e,0x1f,0x4c,0x8a,0xef,0xd1,0x0f,0x21
+,0x6d,0x5e,0xa5,0x52,0x63,0xce,0x12,0xf8
+,0xef,0x2a,0xda,0x6f,0xeb,0x37,0xfe,0x13
+,0x02,0xc7,0xcb,0x3b,0x3e,0x22,0x6b,0xda
+,0x61,0x2e,0x7f,0xd4,0x72,0x3d,0xdd,0x30
+,0xe1,0x1e,0x4c,0x40,0x19,0x8c,0x0f,0xd7
+,0x9c,0xd1,0x83,0x30,0x7b,0x98,0x59,0xdc
+,0x7d,0xc6,0xb9,0x0c,0x29,0x4c,0xa1,0x33
+,0xa2,0xeb,0x67,0x3a,0x65,0x84,0xd3,0x96
+,0xe2,0xed,0x76,0x45,0x70,0x8f,0xb5,0x2b
+,0xde,0xf9,0x23,0xd6,0x49,0x6e,0x3c,0x14
+,0xb5,0xc6,0x9f,0x35,0x1e,0x50,0xd0,0xc1
+,0x8f,0x6a,0x70,0x44,0x02,0x62,0xcb,0xae
+,0x1d,0x68,0x41,0xa7,0xaa,0x57,0xe8,0x53
+,0xaa,0x07,0xd2,0x06,0xf6,0xd5,0x14,0x06
+,0x0b,0x91,0x03,0x75,0x2c,0x6c,0x72,0xb5
+,0x61,0x95,0x9a,0x0d,0x8b,0xb9,0x0d,0xe7
+,0xf5,0xdf,0x54,0xcd,0xde,0xe6,0xd8,0xd6
+,0x09,0x08,0x97,0x63,0xe5,0xc1,0x2e,0xb0
+,0xb7,0x44,0x26,0xc0,0x26,0xc0,0xaf,0x55
+,0x30,0x9e,0x3b,0xd5,0x36,0x2a,0x19,0x04
+,0xf4,0x5c,0x1e,0xff,0xcf,0x2c,0xb7,0xff
+,0xd0,0xfd,0x87,0x40,0x11,0xd5,0x11,0x23
+,0xbb,0x48,0xc0,0x21,0xa9,0xa4,0x28,0x2d
+,0xfd,0x15,0xf8,0xb0,0x4e,0x2b,0xf4,0x30
+,0x5b,0x21,0xfc,0x11,0x91,0x34,0xbe,0x41
+,0xef,0x7b,0x9d,0x97,0x75,0xff,0x97,0x95
+,0xc0,0x96,0x58,0x2f,0xea,0xbb,0x46,0xd7
+,0xbb,0xe4,0xd9,0x2e};
+const unsigned int NptTlsTrustAnchor_Extended_0007_Size = 940;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0008.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0008.cpp
new file mode 100644
index 0000000..f73860d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0008.cpp
@@ -0,0 +1,242 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. */
+const unsigned char NptTlsTrustAnchor_Extended_0008_Data[1642] = {
+0x30,0x82,0x06,0x66,0x30,0x82,0x04,0x4e
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x0f,0x07
+,0x7e,0x52,0x93,0x7b,0xe0,0x15,0xe3,0x57
+,0xf0,0x69,0x8c,0xcb,0xec,0x0c,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x30,0x7b,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x43,0x4f,0x31,0x47,0x30,0x45
+,0x06,0x03,0x55,0x04,0x0a,0x0c,0x3e,0x53
+,0x6f,0x63,0x69,0x65,0x64,0x61,0x64,0x20
+,0x43,0x61,0x6d,0x65,0x72,0x61,0x6c,0x20
+,0x64,0x65,0x20,0x43,0x65,0x72,0x74,0x69
+,0x66,0x69,0x63,0x61,0x63,0x69,0xc3,0xb3
+,0x6e,0x20,0x44,0x69,0x67,0x69,0x74,0x61
+,0x6c,0x20,0x2d,0x20,0x43,0x65,0x72,0x74
+,0x69,0x63,0xc3,0xa1,0x6d,0x61,0x72,0x61
+,0x20,0x53,0x2e,0x41,0x2e,0x31,0x23,0x30
+,0x21,0x06,0x03,0x55,0x04,0x03,0x0c,0x1a
+,0x41,0x43,0x20,0x52,0x61,0xc3,0xad,0x7a
+,0x20,0x43,0x65,0x72,0x74,0x69,0x63,0xc3
+,0xa1,0x6d,0x61,0x72,0x61,0x20,0x53,0x2e
+,0x41,0x2e,0x30,0x1e,0x17,0x0d,0x30,0x36
+,0x31,0x31,0x32,0x37,0x32,0x30,0x34,0x36
+,0x32,0x39,0x5a,0x17,0x0d,0x33,0x30,0x30
+,0x34,0x30,0x32,0x32,0x31,0x34,0x32,0x30
+,0x32,0x5a,0x30,0x7b,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43
+,0x4f,0x31,0x47,0x30,0x45,0x06,0x03,0x55
+,0x04,0x0a,0x0c,0x3e,0x53,0x6f,0x63,0x69
+,0x65,0x64,0x61,0x64,0x20,0x43,0x61,0x6d
+,0x65,0x72,0x61,0x6c,0x20,0x64,0x65,0x20
+,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63
+,0x61,0x63,0x69,0xc3,0xb3,0x6e,0x20,0x44
+,0x69,0x67,0x69,0x74,0x61,0x6c,0x20,0x2d
+,0x20,0x43,0x65,0x72,0x74,0x69,0x63,0xc3
+,0xa1,0x6d,0x61,0x72,0x61,0x20,0x53,0x2e
+,0x41,0x2e,0x31,0x23,0x30,0x21,0x06,0x03
+,0x55,0x04,0x03,0x0c,0x1a,0x41,0x43,0x20
+,0x52,0x61,0xc3,0xad,0x7a,0x20,0x43,0x65
+,0x72,0x74,0x69,0x63,0xc3,0xa1,0x6d,0x61
+,0x72,0x61,0x20,0x53,0x2e,0x41,0x2e,0x30
+,0x82,0x02,0x22,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01
+,0x05,0x00,0x03,0x82,0x02,0x0f,0x00,0x30
+,0x82,0x02,0x0a,0x02,0x82,0x02,0x01,0x00
+,0xab,0x6b,0x89,0xa3,0x53,0xcc,0x48,0x23
+,0x08,0xfb,0xc3,0xcf,0x51,0x96,0x08,0x2e
+,0xb8,0x08,0x7a,0x6d,0x3c,0x90,0x17,0x86
+,0xa9,0xe9,0xed,0x2e,0x13,0x34,0x47,0xb2
+,0xd0,0x70,0xdc,0xc9,0x3c,0xd0,0x8d,0xca
+,0xee,0x4b,0x17,0xab,0xd0,0x85,0xb0,0xa7
+,0x23,0x04,0xcb,0xa8,0xa2,0xfc,0xe5,0x75
+,0xdb,0x40,0xca,0x62,0x89,0x8f,0x50,0x9e
+,0x01,0x3d,0x26,0x5b,0x18,0x84,0x1c,0xcb
+,0x7c,0x37,0xb7,0x7d,0xec,0xd3,0x7f,0x73
+,0x19,0xb0,0x6a,0xb2,0xd8,0x88,0x8a,0x2d
+,0x45,0x74,0xa8,0xf7,0xb3,0xb8,0xc0,0xd4
+,0xda,0xcd,0x22,0x89,0x74,0x4d,0x5a,0x15
+,0x39,0x73,0x18,0x74,0x4f,0xb5,0xeb,0x99
+,0xa7,0xc1,0x1e,0x88,0xb4,0xc2,0x93,0x90
+,0x63,0x97,0xf3,0xa7,0xa7,0x12,0xb2,0x09
+,0x22,0x07,0x33,0xd9,0x91,0xcd,0x0e,0x9c
+,0x1f,0x0e,0x20,0xc7,0xee,0xbb,0x33,0x8d
+,0x8f,0xc2,0xd2,0x58,0xa7,0x5f,0xfd,0x65
+,0x37,0xe2,0x88,0xc2,0xd8,0x8f,0x86,0x75
+,0x5e,0xf9,0x2d,0xa7,0x87,0x33,0xf2,0x78
+,0x37,0x2f,0x8b,0xbc,0x1d,0x86,0x37,0x39
+,0xb1,0x94,0xf2,0xd8,0xbc,0x4a,0x9c,0x83
+,0x18,0x5a,0x06,0xfc,0xf3,0xd4,0xd4,0xba
+,0x8c,0x15,0x09,0x25,0xf0,0xf9,0xb6,0x8d
+,0x04,0x7e,0x17,0x12,0x33,0x6b,0x57,0x48
+,0x4c,0x4f,0xdb,0x26,0x1e,0xeb,0xcc,0x90
+,0xe7,0x8b,0xf9,0x68,0x7c,0x70,0x0f,0xa3
+,0x2a,0xd0,0x3a,0x38,0xdf,0x37,0x97,0xe2
+,0x5b,0xde,0x80,0x61,0xd3,0x80,0xd8,0x91
+,0x83,0x42,0x5a,0x4c,0x04,0x89,0x68,0x11
+,0x3c,0xac,0x5f,0x68,0x80,0x41,0xcc,0x60
+,0x42,0xce,0x0d,0x5a,0x2a,0x0c,0x0f,0x9b
+,0x30,0xc0,0xa6,0xf0,0x86,0xdb,0xab,0x49
+,0xd7,0x97,0x6d,0x48,0x8b,0xf9,0x03,0xc0
+,0x52,0x67,0x9b,0x12,0xf7,0xc2,0xf2,0x2e
+,0x98,0x65,0x42,0xd9,0xd6,0x9a,0xe3,0xd0
+,0x19,0x31,0x0c,0xad,0x87,0xd5,0x57,0x02
+,0x7a,0x30,0xe8,0x86,0x26,0xfb,0x8f,0x23
+,0x8a,0x54,0x87,0xe4,0xbf,0x3c,0xee,0xeb
+,0xc3,0x75,0x48,0x5f,0x1e,0x39,0x6f,0x81
+,0x62,0x6c,0xc5,0x2d,0xc4,0x17,0x54,0x19
+,0xb7,0x37,0x8d,0x9c,0x37,0x91,0xc8,0xf6
+,0x0b,0xd5,0xea,0x63,0x6f,0x83,0xac,0x38
+,0xc2,0xf3,0x3f,0xde,0x9a,0xfb,0xe1,0x23
+,0x61,0xf0,0xc8,0x26,0xcb,0x36,0xc8,0xa1
+,0xf3,0x30,0x8f,0xa4,0xa3,0xa2,0xa1,0xdd
+,0x53,0xb3,0xde,0xf0,0x9a,0x32,0x1f,0x83
+,0x91,0x79,0x30,0xc1,0xa9,0x1f,0x53,0x9b
+,0x53,0xa2,0x15,0x53,0x3f,0xdd,0x9d,0xb3
+,0x10,0x3b,0x48,0x7d,0x89,0x0f,0xfc,0xed
+,0x03,0xf5,0xfb,0x25,0x64,0x75,0x0e,0x17
+,0x19,0x0d,0x8f,0x00,0x16,0x67,0x79,0x7a
+,0x40,0xfc,0x2d,0x59,0x07,0xd9,0x90,0xfa
+,0x9a,0xad,0x3d,0xdc,0x80,0x8a,0xe6,0x5c
+,0x35,0xa2,0x67,0x4c,0x11,0x6b,0xb1,0xf8
+,0x80,0x64,0x00,0x2d,0x6f,0x22,0x61,0xc5
+,0xac,0x4b,0x26,0xe5,0x5a,0x10,0x82,0x9b
+,0xa4,0x83,0x7b,0x34,0xf7,0x9e,0x89,0x91
+,0x20,0x97,0x8e,0xb7,0x42,0xc7,0x66,0xc3
+,0xd0,0xe9,0xa4,0xd6,0xf5,0x20,0x8d,0xc4
+,0xc3,0x95,0xac,0x44,0x0a,0x9d,0x5b,0x73
+,0x3c,0x26,0x3d,0x2f,0x4a,0xbe,0xa7,0xc9
+,0xa7,0x10,0x1e,0xfb,0x9f,0x50,0x69,0xf3
+,0x02,0x03,0x01,0x00,0x01,0xa3,0x81,0xe6
+,0x30,0x81,0xe3,0x30,0x0f,0x06,0x03,0x55
+,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30
+,0x03,0x01,0x01,0xff,0x30,0x0e,0x06,0x03
+,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04
+,0x03,0x02,0x01,0x06,0x30,0x1d,0x06,0x03
+,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0xd1
+,0x09,0xd0,0xe9,0xd7,0xce,0x79,0x74,0x54
+,0xf9,0x3a,0x30,0xb3,0xf4,0x6d,0x2c,0x03
+,0x03,0x1b,0x68,0x30,0x81,0xa0,0x06,0x03
+,0x55,0x1d,0x20,0x04,0x81,0x98,0x30,0x81
+,0x95,0x30,0x81,0x92,0x06,0x04,0x55,0x1d
+,0x20,0x00,0x30,0x81,0x89,0x30,0x2b,0x06
+,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02
+,0x01,0x16,0x1f,0x68,0x74,0x74,0x70,0x3a
+,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x63,0x65
+,0x72,0x74,0x69,0x63,0x61,0x6d,0x61,0x72
+,0x61,0x2e,0x63,0x6f,0x6d,0x2f,0x64,0x70
+,0x63,0x2f,0x30,0x5a,0x06,0x08,0x2b,0x06
+,0x01,0x05,0x05,0x07,0x02,0x02,0x30,0x4e
+,0x1a,0x4c,0x4c,0x69,0x6d,0x69,0x74,0x61
+,0x63,0x69,0x6f,0x6e,0x65,0x73,0x20,0x64
+,0x65,0x20,0x67,0x61,0x72,0x61,0x6e,0x74
+,0xed,0x61,0x73,0x20,0x64,0x65,0x20,0x65
+,0x73,0x74,0x65,0x20,0x63,0x65,0x72,0x74
+,0x69,0x66,0x69,0x63,0x61,0x64,0x6f,0x20
+,0x73,0x65,0x20,0x70,0x75,0x65,0x64,0x65
+,0x6e,0x20,0x65,0x6e,0x63,0x6f,0x6e,0x74
+,0x72,0x61,0x72,0x20,0x65,0x6e,0x20,0x6c
+,0x61,0x20,0x44,0x50,0x43,0x2e,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x02
+,0x01,0x00,0x5c,0x94,0xb5,0xb8,0x45,0x91
+,0x4d,0x8e,0x61,0x1f,0x03,0x28,0x0f,0x53
+,0x7c,0xe6,0xa4,0x59,0xa9,0xb3,0x8a,0x7a
+,0xc5,0xb0,0xff,0x08,0x7c,0x2c,0xa3,0x71
+,0x1c,0x21,0x13,0x67,0xa1,0x95,0x12,0x40
+,0x35,0x83,0x83,0x8f,0x74,0xdb,0x33,0x5c
+,0xf0,0x49,0x76,0x0a,0x81,0x52,0xdd,0x49
+,0xd4,0x9a,0x32,0x33,0xef,0x9b,0xa7,0xcb
+,0x75,0xe5,0x7a,0xcb,0x97,0x12,0x90,0x5c
+,0xba,0x7b,0xc5,0x9b,0xdf,0xbb,0x39,0x23
+,0xc8,0xff,0x98,0xce,0x0a,0x4d,0x22,0x01
+,0x48,0x07,0x7e,0x8a,0xc0,0xd5,0x20,0x42
+,0x94,0x44,0xef,0xbf,0x77,0xa2,0x89,0x67
+,0x48,0x1b,0x40,0x03,0x05,0xa1,0x89,0xec
+,0xcf,0x62,0xe3,0x3d,0x25,0x76,0x66,0xbf
+,0x26,0xb7,0xbb,0x22,0xbe,0x6f,0xff,0x39
+,0x57,0x74,0xba,0x7a,0xc9,0x01,0x95,0xc1
+,0x95,0x51,0xe8,0xab,0x2c,0xf8,0xb1,0x86
+,0x20,0xe9,0x3f,0xcb,0x35,0x5b,0xd2,0x17
+,0xe9,0x2a,0xfe,0x83,0x13,0x17,0x40,0xee
+,0x88,0x62,0x65,0x5b,0xd5,0x3b,0x60,0xe9
+,0x7b,0x3c,0xb8,0xc9,0xd5,0x7f,0x36,0x02
+,0x25,0xaa,0x68,0xc2,0x31,0x15,0xb7,0x30
+,0x65,0xeb,0x7f,0x1d,0x48,0x79,0xb1,0xcf
+,0x39,0xe2,0x42,0x80,0x16,0xd3,0xf5,0x93
+,0x23,0xfc,0x4c,0x97,0xc9,0x5a,0x37,0x6c
+,0x7c,0x22,0xd8,0x4a,0xcd,0xd2,0x8e,0x36
+,0x83,0x39,0x91,0x90,0x10,0xc8,0xf1,0xc9
+,0x35,0x7e,0x3f,0xb8,0xd3,0x81,0xc6,0x20
+,0x64,0x1a,0xb6,0x50,0xc2,0x21,0xa4,0x78
+,0xdc,0xd0,0x2f,0x3b,0x64,0x93,0x74,0xf0
+,0x96,0x90,0xf1,0xef,0xfb,0x09,0x5a,0x34
+,0x40,0x96,0xf0,0x36,0x12,0xc1,0xa3,0x74
+,0x8c,0x93,0x7e,0x41,0xde,0x77,0x8b,0xec
+,0x86,0xd9,0xd2,0x0f,0x3f,0x2d,0xd1,0xcc
+,0x40,0xa2,0x89,0x66,0x48,0x1e,0x20,0xb3
+,0x9c,0x23,0x59,0x73,0xa9,0x44,0x73,0xbc
+,0x24,0x79,0x90,0x56,0x37,0xb3,0xc6,0x29
+,0x7e,0xa3,0x0f,0xf1,0x29,0x39,0xef,0x7e
+,0x5c,0x28,0x32,0x70,0x35,0xac,0xda,0xb8
+,0xc8,0x75,0x66,0xfc,0x9b,0x4c,0x39,0x47
+,0x8e,0x1b,0x6f,0x9b,0x4d,0x02,0x54,0x22
+,0x33,0xef,0x61,0xba,0x9e,0x29,0x84,0xef
+,0x4e,0x4b,0x33,0x47,0x76,0x97,0x6a,0xcb
+,0x7e,0x5f,0xfd,0x15,0xa6,0x9e,0x42,0x43
+,0x5b,0x66,0x5a,0x8a,0x88,0x0d,0xf7,0x16
+,0xb9,0x3f,0x51,0x65,0x2b,0x66,0x6a,0x8b
+,0xd1,0x38,0x52,0xa2,0xd6,0x46,0x11,0xfa
+,0xfc,0x9a,0x1c,0x74,0x9e,0x8f,0x97,0x0b
+,0x02,0x4f,0x64,0xc6,0xf5,0x68,0xd3,0x4b
+,0x2d,0xff,0xa4,0x37,0x1e,0x8b,0x3f,0xbf
+,0x44,0xbe,0x61,0x46,0xa1,0x84,0x3d,0x08
+,0x27,0x4c,0x81,0x20,0x77,0x89,0x08,0xea
+,0x67,0x40,0x5e,0x6c,0x08,0x51,0x5f,0x34
+,0x5a,0x8c,0x96,0x68,0xcd,0xd7,0xf7,0x89
+,0xc2,0x1c,0xd3,0x32,0x00,0xaf,0x52,0xcb
+,0xd3,0x60,0x5b,0x2a,0x3a,0x47,0x7e,0x6b
+,0x30,0x33,0xa1,0x62,0x29,0x7f,0x4a,0xb9
+,0xe1,0x2d,0xe7,0x14,0x23,0x0e,0x0e,0x18
+,0x47,0xe1,0x79,0xfc,0x15,0x55,0xd0,0xb1
+,0xfc,0x25,0x71,0x63,0x75,0x33,0x1c,0x23
+,0x2b,0xaf,0x5c,0xd9,0xed,0x47,0x77,0x60
+,0x0e,0x3b,0x0f,0x1e,0xd2,0xc0,0xdc,0x64
+,0x05,0x89,0xfc,0x78,0xd6,0x5c,0x2c,0x26
+,0x43,0xa9};
+const unsigned int NptTlsTrustAnchor_Extended_0008_Size = 1642;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0009.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0009.cpp
new file mode 100644
index 0000000..2b41e0c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0009.cpp
@@ -0,0 +1,219 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* ePKI Root Certification Authority */
+const unsigned char NptTlsTrustAnchor_Extended_0009_Data[1460] = {
+0x30,0x82,0x05,0xb0,0x30,0x82,0x03,0x98
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x15
+,0xc8,0xbd,0x65,0x47,0x5c,0xaf,0xb8,0x97
+,0x00,0x5e,0xe4,0x06,0xd2,0xbc,0x9d,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x5e
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x54,0x57,0x31,0x23,0x30
+,0x21,0x06,0x03,0x55,0x04,0x0a,0x0c,0x1a
+,0x43,0x68,0x75,0x6e,0x67,0x68,0x77,0x61
+,0x20,0x54,0x65,0x6c,0x65,0x63,0x6f,0x6d
+,0x20,0x43,0x6f,0x2e,0x2c,0x20,0x4c,0x74
+,0x64,0x2e,0x31,0x2a,0x30,0x28,0x06,0x03
+,0x55,0x04,0x0b,0x0c,0x21,0x65,0x50,0x4b
+,0x49,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x1e
+,0x17,0x0d,0x30,0x34,0x31,0x32,0x32,0x30
+,0x30,0x32,0x33,0x31,0x32,0x37,0x5a,0x17
+,0x0d,0x33,0x34,0x31,0x32,0x32,0x30,0x30
+,0x32,0x33,0x31,0x32,0x37,0x5a,0x30,0x5e
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x54,0x57,0x31,0x23,0x30
+,0x21,0x06,0x03,0x55,0x04,0x0a,0x0c,0x1a
+,0x43,0x68,0x75,0x6e,0x67,0x68,0x77,0x61
+,0x20,0x54,0x65,0x6c,0x65,0x63,0x6f,0x6d
+,0x20,0x43,0x6f,0x2e,0x2c,0x20,0x4c,0x74
+,0x64,0x2e,0x31,0x2a,0x30,0x28,0x06,0x03
+,0x55,0x04,0x0b,0x0c,0x21,0x65,0x50,0x4b
+,0x49,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43
+,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61
+,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74
+,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x82
+,0x02,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86
+,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05
+,0x00,0x03,0x82,0x02,0x0f,0x00,0x30,0x82
+,0x02,0x0a,0x02,0x82,0x02,0x01,0x00,0xe1
+,0x25,0x0f,0xee,0x8d,0xdb,0x88,0x33,0x75
+,0x67,0xcd,0xad,0x1f,0x7d,0x3a,0x4e,0x6d
+,0x9d,0xd3,0x2f,0x14,0xf3,0x63,0x74,0xcb
+,0x01,0x21,0x6a,0x37,0xea,0x84,0x50,0x07
+,0x4b,0x26,0x5b,0x09,0x43,0x6c,0x21,0x9e
+,0x6a,0xc8,0xd5,0x03,0xf5,0x60,0x69,0x8f
+,0xcc,0xf0,0x22,0xe4,0x1f,0xe7,0xf7,0x6a
+,0x22,0x31,0xb7,0x2c,0x15,0xf2,0xe0,0xfe
+,0x00,0x6a,0x43,0xff,0x87,0x65,0xc6,0xb5
+,0x1a,0xc1,0xa7,0x4c,0x6d,0x22,0x70,0x21
+,0x8a,0x31,0xf2,0x97,0x74,0x89,0x09,0x12
+,0x26,0x1c,0x9e,0xca,0xd9,0x12,0xa2,0x95
+,0x3c,0xda,0xe9,0x67,0xbf,0x08,0xa0,0x64
+,0xe3,0xd6,0x42,0xb7,0x45,0xef,0x97,0xf4
+,0xf6,0xf5,0xd7,0xb5,0x4a,0x15,0x02,0x58
+,0x7d,0x98,0x58,0x4b,0x60,0xbc,0xcd,0xd7
+,0x0d,0x9a,0x13,0x33,0x53,0xd1,0x61,0xf9
+,0x7a,0xd5,0xd7,0x78,0xb3,0x9a,0x33,0xf7
+,0x00,0x86,0xce,0x1d,0x4d,0x94,0x38,0xaf
+,0xa8,0xec,0x78,0x51,0x70,0x8a,0x5c,0x10
+,0x83,0x51,0x21,0xf7,0x11,0x3d,0x34,0x86
+,0x5e,0xe5,0x48,0xcd,0x97,0x81,0x82,0x35
+,0x4c,0x19,0xec,0x65,0xf6,0x6b,0xc5,0x05
+,0xa1,0xee,0x47,0x13,0xd6,0xb3,0x21,0x27
+,0x94,0x10,0x0a,0xd9,0x24,0x3b,0xba,0xbe
+,0x44,0x13,0x46,0x30,0x3f,0x97,0x3c,0xd8
+,0xd7,0xd7,0x6a,0xee,0x3b,0x38,0xe3,0x2b
+,0xd4,0x97,0x0e,0xb9,0x1b,0xe7,0x07,0x49
+,0x7f,0x37,0x2a,0xf9,0x77,0x78,0xcf,0x54
+,0xed,0x5b,0x46,0x9d,0xa3,0x80,0x0e,0x91
+,0x43,0xc1,0xd6,0x5b,0x5f,0x14,0xba,0x9f
+,0xa6,0x8d,0x24,0x47,0x40,0x59,0xbf,0x72
+,0x38,0xb2,0x36,0x6c,0x37,0xff,0x99,0xd1
+,0x5d,0x0e,0x59,0x0a,0xab,0x69,0xf7,0xc0
+,0xb2,0x04,0x45,0x7a,0x54,0x00,0xae,0xbe
+,0x53,0xf6,0xb5,0xe7,0xe1,0xf8,0x3c,0xa3
+,0x31,0xd2,0xa9,0xfe,0x21,0x52,0x64,0xc5
+,0xa6,0x67,0xf0,0x75,0x07,0x06,0x94,0x14
+,0x81,0x55,0xc6,0x27,0xe4,0x01,0x8f,0x17
+,0xc1,0x6a,0x71,0xd7,0xbe,0x4b,0xfb,0x94
+,0x58,0x7d,0x7e,0x11,0x33,0xb1,0x42,0xf7
+,0x62,0x6c,0x18,0xd6,0xcf,0x09,0x68,0x3e
+,0x7f,0x6c,0xf6,0x1e,0x8f,0x62,0xad,0xa5
+,0x63,0xdb,0x09,0xa7,0x1f,0x22,0x42,0x41
+,0x1e,0x6f,0x99,0x8a,0x3e,0xd7,0xf9,0x3f
+,0x40,0x7a,0x79,0xb0,0xa5,0x01,0x92,0xd2
+,0x9d,0x3d,0x08,0x15,0xa5,0x10,0x01,0x2d
+,0xb3,0x32,0x76,0xa8,0x95,0x0d,0xb3,0x7a
+,0x9a,0xfb,0x07,0x10,0x78,0x11,0x6f,0xe1
+,0x8f,0xc7,0xba,0x0f,0x25,0x1a,0x74,0x2a
+,0xe5,0x1c,0x98,0x41,0x99,0xdf,0x21,0x87
+,0xe8,0x95,0x06,0x6a,0x0a,0xb3,0x6a,0x47
+,0x76,0x65,0xf6,0x3a,0xcf,0x8f,0x62,0x17
+,0x19,0x7b,0x0a,0x28,0xcd,0x1a,0xd2,0x83
+,0x1e,0x21,0xc7,0x2c,0xbf,0xbe,0xff,0x61
+,0x68,0xb7,0x67,0x1b,0xbb,0x78,0x4d,0x8d
+,0xce,0x67,0xe5,0xe4,0xc1,0x8e,0xb7,0x23
+,0x66,0xe2,0x9d,0x90,0x75,0x34,0x98,0xa9
+,0x36,0x2b,0x8a,0x9a,0x94,0xb9,0x9d,0xec
+,0xcc,0x8a,0xb1,0xf8,0x25,0x89,0x5c,0x5a
+,0xb6,0x2f,0x8c,0x1f,0x6d,0x79,0x24,0xa7
+,0x52,0x68,0xc3,0x84,0x35,0xe2,0x66,0x8d
+,0x63,0x0e,0x25,0x4d,0xd5,0x19,0xb2,0xe6
+,0x79,0x37,0xa7,0x22,0x9d,0x54,0x31,0x02
+,0x03,0x01,0x00,0x01,0xa3,0x6a,0x30,0x68
+,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04
+,0x16,0x04,0x14,0x1e,0x0c,0xf7,0xb6,0x67
+,0xf2,0xe1,0x92,0x26,0x09,0x45,0xc0,0x55
+,0x39,0x2e,0x77,0x3f,0x42,0x4a,0xa2,0x30
+,0x0c,0x06,0x03,0x55,0x1d,0x13,0x04,0x05
+,0x30,0x03,0x01,0x01,0xff,0x30,0x39,0x06
+,0x04,0x67,0x2a,0x07,0x00,0x04,0x31,0x30
+,0x2f,0x30,0x2d,0x02,0x01,0x00,0x30,0x09
+,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x05
+,0x00,0x30,0x07,0x06,0x05,0x67,0x2a,0x03
+,0x00,0x00,0x04,0x14,0x45,0xb0,0xc2,0xc7
+,0x0a,0x56,0x7c,0xee,0x5b,0x78,0x0c,0x95
+,0xf9,0x18,0x53,0xc1,0xa6,0x1c,0xd8,0x10
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03
+,0x82,0x02,0x01,0x00,0x09,0xb3,0x83,0x53
+,0x59,0x01,0x3e,0x95,0x49,0xb9,0xf1,0x81
+,0xba,0xf9,0x76,0x20,0x23,0xb5,0x27,0x60
+,0x74,0xd4,0x6a,0x99,0x34,0x5e,0x6c,0x00
+,0x53,0xd9,0x9f,0xf2,0xa6,0xb1,0x24,0x07
+,0x44,0x6a,0x2a,0xc6,0xa5,0x8e,0x78,0x12
+,0xe8,0x47,0xd9,0x58,0x1b,0x13,0x2a,0x5e
+,0x79,0x9b,0x9f,0x0a,0x2a,0x67,0xa6,0x25
+,0x3f,0x06,0x69,0x56,0x73,0xc3,0x8a,0x66
+,0x48,0xfb,0x29,0x81,0x57,0x74,0x06,0xca
+,0x9c,0xea,0x28,0xe8,0x38,0x67,0x26,0x2b
+,0xf1,0xd5,0xb5,0x3f,0x65,0x93,0xf8,0x36
+,0x5d,0x8e,0x8d,0x8d,0x40,0x20,0x87,0x19
+,0xea,0xef,0x27,0xc0,0x3d,0xb4,0x39,0x0f
+,0x25,0x7b,0x68,0x50,0x74,0x55,0x9c,0x0c
+,0x59,0x7d,0x5a,0x3d,0x41,0x94,0x25,0x52
+,0x08,0xe0,0x47,0x2c,0x15,0x31,0x19,0xd5
+,0xbf,0x07,0x55,0xc6,0xbb,0x12,0xb5,0x97
+,0xf4,0x5f,0x83,0x85,0xba,0x71,0xc1,0xd9
+,0x6c,0x81,0x11,0x76,0x0a,0x0a,0xb0,0xbf
+,0x82,0x97,0xf7,0xea,0x3d,0xfa,0xfa,0xec
+,0x2d,0xa9,0x28,0x94,0x3b,0x56,0xdd,0xd2
+,0x51,0x2e,0xae,0xc0,0xbd,0x08,0x15,0x8c
+,0x77,0x52,0x34,0x96,0xd6,0x9b,0xac,0xd3
+,0x1d,0x8e,0x61,0x0f,0x35,0x7b,0x9b,0xae
+,0x39,0x69,0x0b,0x62,0x60,0x40,0x20,0x36
+,0x8f,0xaf,0xfb,0x36,0xee,0x2d,0x08,0x4a
+,0x1d,0xb8,0xbf,0x9b,0x5c,0xf8,0xea,0xa5
+,0x1b,0xa0,0x73,0xa6,0xd8,0xf8,0x6e,0xe0
+,0x33,0x04,0x5f,0x68,0xaa,0x27,0x87,0xed
+,0xd9,0xc1,0x90,0x9c,0xed,0xbd,0xe3,0x6a
+,0x35,0xaf,0x63,0xdf,0xab,0x18,0xd9,0xba
+,0xe6,0xe9,0x4a,0xea,0x50,0x8a,0x0f,0x61
+,0x93,0x1e,0xe2,0x2d,0x19,0xe2,0x30,0x94
+,0x35,0x92,0x5d,0x0e,0xb6,0x07,0xaf,0x19
+,0x80,0x8f,0x47,0x90,0x51,0x4b,0x2e,0x4d
+,0xdd,0x85,0xe2,0xd2,0x0a,0x52,0x0a,0x17
+,0x9a,0xfc,0x1a,0xb0,0x50,0x02,0xe5,0x01
+,0xa3,0x63,0x37,0x21,0x4c,0x44,0xc4,0x9b
+,0x51,0x99,0x11,0x0e,0x73,0x9c,0x06,0x8f
+,0x54,0x2e,0xa7,0x28,0x5e,0x44,0x39,0x87
+,0x56,0x2d,0x37,0xbd,0x85,0x44,0x94,0xe1
+,0x0c,0x4b,0x2c,0x9c,0xc3,0x92,0x85,0x34
+,0x61,0xcb,0x0f,0xb8,0x9b,0x4a,0x43,0x52
+,0xfe,0x34,0x3a,0x7d,0xb8,0xe9,0x29,0xdc
+,0x76,0xa9,0xc8,0x30,0xf8,0x14,0x71,0x80
+,0xc6,0x1e,0x36,0x48,0x74,0x22,0x41,0x5c
+,0x87,0x82,0xe8,0x18,0x71,0x8b,0x41,0x89
+,0x44,0xe7,0x7e,0x58,0x5b,0xa8,0xb8,0x8d
+,0x13,0xe9,0xa7,0x6c,0xc3,0x47,0xed,0xb3
+,0x1a,0x9d,0x62,0xae,0x8d,0x82,0xea,0x94
+,0x9e,0xdd,0x59,0x10,0xc3,0xad,0xdd,0xe2
+,0x4d,0xe3,0x31,0xd5,0xc7,0xec,0xe8,0xf2
+,0xb0,0xfe,0x92,0x1e,0x16,0x0a,0x1a,0xfc
+,0xd9,0xf3,0xf8,0x27,0xb6,0xc9,0xbe,0x1d
+,0xb4,0x6c,0x64,0x90,0x7f,0xf4,0xe4,0xc4
+,0x5b,0xd7,0x37,0xae,0x42,0x0e,0xdd,0xa4
+,0x1a,0x6f,0x7c,0x88,0x54,0xc5,0x16,0x6e
+,0xe1,0x7a,0x68,0x2e,0xf8,0x3a,0xbf,0x0d
+,0xa4,0x3c,0x89,0x3b,0x78,0xa7,0x4e,0x63
+,0x83,0x04,0x21,0x08,0x67,0x8d,0xf2,0x82
+,0x49,0xd0,0x5b,0xfd,0xb1,0xcd,0x0f,0x83
+,0x84,0xd4,0x3e,0x20,0x85,0xf7,0x4a,0x3d
+,0x2b,0x9c,0xfd,0x2a,0x0a,0x09,0x4d,0xea
+,0x81,0xf8,0x11,0x9c};
+const unsigned int NptTlsTrustAnchor_Extended_0009_Size = 1460;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0010.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0010.cpp
new file mode 100644
index 0000000..c622d38
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0010.cpp
@@ -0,0 +1,200 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* TUBITAK UEKAE Kok Sertifika Hizmet Saglayicisi - Surum 3 */
+const unsigned char NptTlsTrustAnchor_Extended_0010_Data[1307] = {
+0x30,0x82,0x05,0x17,0x30,0x82,0x03,0xff
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x11
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30
+,0x82,0x01,0x2b,0x31,0x0b,0x30,0x09,0x06
+,0x03,0x55,0x04,0x06,0x13,0x02,0x54,0x52
+,0x31,0x18,0x30,0x16,0x06,0x03,0x55,0x04
+,0x07,0x0c,0x0f,0x47,0x65,0x62,0x7a,0x65
+,0x20,0x2d,0x20,0x4b,0x6f,0x63,0x61,0x65
+,0x6c,0x69,0x31,0x47,0x30,0x45,0x06,0x03
+,0x55,0x04,0x0a,0x0c,0x3e,0x54,0xc3,0xbc
+,0x72,0x6b,0x69,0x79,0x65,0x20,0x42,0x69
+,0x6c,0x69,0x6d,0x73,0x65,0x6c,0x20,0x76
+,0x65,0x20,0x54,0x65,0x6b,0x6e,0x6f,0x6c
+,0x6f,0x6a,0x69,0x6b,0x20,0x41,0x72,0x61
+,0xc5,0x9f,0x74,0xc4,0xb1,0x72,0x6d,0x61
+,0x20,0x4b,0x75,0x72,0x75,0x6d,0x75,0x20
+,0x2d,0x20,0x54,0xc3,0x9c,0x42,0xc4,0xb0
+,0x54,0x41,0x4b,0x31,0x48,0x30,0x46,0x06
+,0x03,0x55,0x04,0x0b,0x0c,0x3f,0x55,0x6c
+,0x75,0x73,0x61,0x6c,0x20,0x45,0x6c,0x65
+,0x6b,0x74,0x72,0x6f,0x6e,0x69,0x6b,0x20
+,0x76,0x65,0x20,0x4b,0x72,0x69,0x70,0x74
+,0x6f,0x6c,0x6f,0x6a,0x69,0x20,0x41,0x72
+,0x61,0xc5,0x9f,0x74,0xc4,0xb1,0x72,0x6d
+,0x61,0x20,0x45,0x6e,0x73,0x74,0x69,0x74
+,0xc3,0xbc,0x73,0xc3,0xbc,0x20,0x2d,0x20
+,0x55,0x45,0x4b,0x41,0x45,0x31,0x23,0x30
+,0x21,0x06,0x03,0x55,0x04,0x0b,0x0c,0x1a
+,0x4b,0x61,0x6d,0x75,0x20,0x53,0x65,0x72
+,0x74,0x69,0x66,0x69,0x6b,0x61,0x73,0x79
+,0x6f,0x6e,0x20,0x4d,0x65,0x72,0x6b,0x65
+,0x7a,0x69,0x31,0x4a,0x30,0x48,0x06,0x03
+,0x55,0x04,0x03,0x0c,0x41,0x54,0xc3,0x9c
+,0x42,0xc4,0xb0,0x54,0x41,0x4b,0x20,0x55
+,0x45,0x4b,0x41,0x45,0x20,0x4b,0xc3,0xb6
+,0x6b,0x20,0x53,0x65,0x72,0x74,0x69,0x66
+,0x69,0x6b,0x61,0x20,0x48,0x69,0x7a,0x6d
+,0x65,0x74,0x20,0x53,0x61,0xc4,0x9f,0x6c
+,0x61,0x79,0xc4,0xb1,0x63,0xc4,0xb1,0x73
+,0xc4,0xb1,0x20,0x2d,0x20,0x53,0xc3,0xbc
+,0x72,0xc3,0xbc,0x6d,0x20,0x33,0x30,0x1e
+,0x17,0x0d,0x30,0x37,0x30,0x38,0x32,0x34
+,0x31,0x31,0x33,0x37,0x30,0x37,0x5a,0x17
+,0x0d,0x31,0x37,0x30,0x38,0x32,0x31,0x31
+,0x31,0x33,0x37,0x30,0x37,0x5a,0x30,0x82
+,0x01,0x2b,0x31,0x0b,0x30,0x09,0x06,0x03
+,0x55,0x04,0x06,0x13,0x02,0x54,0x52,0x31
+,0x18,0x30,0x16,0x06,0x03,0x55,0x04,0x07
+,0x0c,0x0f,0x47,0x65,0x62,0x7a,0x65,0x20
+,0x2d,0x20,0x4b,0x6f,0x63,0x61,0x65,0x6c
+,0x69,0x31,0x47,0x30,0x45,0x06,0x03,0x55
+,0x04,0x0a,0x0c,0x3e,0x54,0xc3,0xbc,0x72
+,0x6b,0x69,0x79,0x65,0x20,0x42,0x69,0x6c
+,0x69,0x6d,0x73,0x65,0x6c,0x20,0x76,0x65
+,0x20,0x54,0x65,0x6b,0x6e,0x6f,0x6c,0x6f
+,0x6a,0x69,0x6b,0x20,0x41,0x72,0x61,0xc5
+,0x9f,0x74,0xc4,0xb1,0x72,0x6d,0x61,0x20
+,0x4b,0x75,0x72,0x75,0x6d,0x75,0x20,0x2d
+,0x20,0x54,0xc3,0x9c,0x42,0xc4,0xb0,0x54
+,0x41,0x4b,0x31,0x48,0x30,0x46,0x06,0x03
+,0x55,0x04,0x0b,0x0c,0x3f,0x55,0x6c,0x75
+,0x73,0x61,0x6c,0x20,0x45,0x6c,0x65,0x6b
+,0x74,0x72,0x6f,0x6e,0x69,0x6b,0x20,0x76
+,0x65,0x20,0x4b,0x72,0x69,0x70,0x74,0x6f
+,0x6c,0x6f,0x6a,0x69,0x20,0x41,0x72,0x61
+,0xc5,0x9f,0x74,0xc4,0xb1,0x72,0x6d,0x61
+,0x20,0x45,0x6e,0x73,0x74,0x69,0x74,0xc3
+,0xbc,0x73,0xc3,0xbc,0x20,0x2d,0x20,0x55
+,0x45,0x4b,0x41,0x45,0x31,0x23,0x30,0x21
+,0x06,0x03,0x55,0x04,0x0b,0x0c,0x1a,0x4b
+,0x61,0x6d,0x75,0x20,0x53,0x65,0x72,0x74
+,0x69,0x66,0x69,0x6b,0x61,0x73,0x79,0x6f
+,0x6e,0x20,0x4d,0x65,0x72,0x6b,0x65,0x7a
+,0x69,0x31,0x4a,0x30,0x48,0x06,0x03,0x55
+,0x04,0x03,0x0c,0x41,0x54,0xc3,0x9c,0x42
+,0xc4,0xb0,0x54,0x41,0x4b,0x20,0x55,0x45
+,0x4b,0x41,0x45,0x20,0x4b,0xc3,0xb6,0x6b
+,0x20,0x53,0x65,0x72,0x74,0x69,0x66,0x69
+,0x6b,0x61,0x20,0x48,0x69,0x7a,0x6d,0x65
+,0x74,0x20,0x53,0x61,0xc4,0x9f,0x6c,0x61
+,0x79,0xc4,0xb1,0x63,0xc4,0xb1,0x73,0xc4
+,0xb1,0x20,0x2d,0x20,0x53,0xc3,0xbc,0x72
+,0xc3,0xbc,0x6d,0x20,0x33,0x30,0x82,0x01
+,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48
+,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00
+,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01
+,0x0a,0x02,0x82,0x01,0x01,0x00,0x8a,0x6d
+,0x4b,0xff,0x10,0x88,0x3a,0xc3,0xf6,0x7e
+,0x94,0xe8,0xea,0x20,0x64,0x70,0xae,0x21
+,0x81,0xbe,0x3a,0x7b,0x3c,0xdb,0xf1,0x1d
+,0x52,0x7f,0x59,0xfa,0xf3,0x22,0x4c,0x95
+,0xa0,0x90,0xbc,0x48,0x4e,0x11,0xab,0xfb
+,0xb7,0xb5,0x8d,0x7a,0x83,0x28,0x8c,0x26
+,0x46,0xd8,0x4e,0x95,0x40,0x87,0x61,0x9f
+,0xc5,0x9e,0x6d,0x81,0x87,0x57,0x6c,0x8a
+,0x3b,0xb4,0x66,0xea,0xcc,0x40,0xfc,0xe3
+,0xaa,0x6c,0xb2,0xcb,0x01,0xdb,0x32,0xbf
+,0xd2,0xeb,0x85,0xcf,0xa1,0x0d,0x55,0xc3
+,0x5b,0x38,0x57,0x70,0xb8,0x75,0xc6,0x79
+,0xd1,0x14,0x30,0xed,0x1b,0x58,0x5b,0x6b
+,0xef,0x35,0xf2,0xa1,0x21,0x4e,0xc5,0xce
+,0x7c,0x99,0x5f,0x6c,0xb9,0xb8,0x22,0x93
+,0x50,0xa7,0xcd,0x4c,0x70,0x6a,0xbe,0x6a
+,0x05,0x7f,0x13,0x9c,0x2b,0x1e,0xea,0xfe
+,0x47,0xce,0x04,0xa5,0x6f,0xac,0x93,0x2e
+,0x7c,0x2b,0x9f,0x9e,0x79,0x13,0x91,0xe8
+,0xea,0x9e,0xca,0x38,0x75,0x8e,0x62,0xb0
+,0x95,0x93,0x2a,0xe5,0xdf,0xe9,0x5e,0x97
+,0x6e,0x20,0x5f,0x5f,0x84,0x7a,0x44,0x39
+,0x19,0x40,0x1c,0xba,0x55,0x2b,0xfb,0x30
+,0xb2,0x81,0xef,0x84,0xe3,0xdc,0xec,0x98
+,0x38,0x39,0x03,0x85,0x08,0xa9,0x54,0x03
+,0x05,0x29,0xf0,0xc9,0x8f,0x8b,0xea,0x0b
+,0x86,0x65,0x19,0x11,0xd3,0xe9,0x09,0x23
+,0xde,0x68,0x93,0x03,0xc9,0x36,0x1c,0x21
+,0x6e,0xce,0x8c,0x66,0xf1,0x99,0x30,0xd8
+,0xd7,0xb3,0xc3,0x1d,0xf8,0x81,0x2e,0xa8
+,0xbd,0x82,0x0b,0x66,0xfe,0x82,0xcb,0xe1
+,0xe0,0x1a,0x82,0xc3,0x40,0x81,0x02,0x03
+,0x01,0x00,0x01,0xa3,0x42,0x30,0x40,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0xbd,0x88,0x87,0xc9,0x8f,0xf6
+,0xa4,0x0a,0x0b,0xaa,0xeb,0xc5,0xfe,0x91
+,0x23,0x9d,0xab,0x4a,0x8a,0x32,0x30,0x0e
+,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff
+,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x01,0x01,0x00,0x1d,0x7c,0xfa,0x49,0x8f
+,0x34,0xe9,0xb7,0x26,0x92,0x16,0x9a,0x05
+,0x74,0xe7,0x4b,0xd0,0x6d,0x39,0x6c,0xc3
+,0x26,0xf6,0xce,0xb8,0x31,0xbc,0xc4,0xdf
+,0xbc,0x2a,0xf8,0x37,0x91,0x18,0xdc,0x04
+,0xc8,0x64,0x99,0x2b,0x18,0x6d,0x80,0x03
+,0x59,0xc9,0xae,0xf8,0x58,0xd0,0x3e,0xed
+,0xc3,0x23,0x9f,0x69,0x3c,0x86,0x38,0x1c
+,0x9e,0xef,0xda,0x27,0x78,0xd1,0x84,0x37
+,0x71,0x8a,0x3c,0x4b,0x39,0xcf,0x7e,0x45
+,0x06,0xd6,0x2d,0xd8,0x8a,0x4d,0x78,0x12
+,0xd6,0xad,0xc2,0xd3,0xcb,0xd2,0xd0,0x41
+,0xf3,0x26,0x36,0x4a,0x9b,0x95,0x6c,0x0c
+,0xee,0xe5,0xd1,0x43,0x27,0x66,0xc1,0x88
+,0xf7,0x7a,0xb3,0x20,0x6c,0xea,0xb0,0x69
+,0x2b,0xc7,0x20,0xe8,0x0c,0x03,0xc4,0x41
+,0x05,0x99,0xe2,0x3f,0xe4,0x6b,0xf8,0xa0
+,0x86,0x81,0xc7,0x84,0xc6,0x1f,0xd5,0x4b
+,0x81,0x12,0xb2,0x16,0x21,0x2c,0x13,0xa1
+,0x80,0xb2,0x5e,0x0c,0x4a,0x13,0x9e,0x20
+,0xd8,0x62,0x40,0xab,0x90,0xea,0x64,0x4a
+,0x2f,0xac,0x0d,0x01,0x12,0x79,0x45,0xa8
+,0x2f,0x87,0x19,0x68,0xc8,0xe2,0x85,0xc7
+,0x30,0xb2,0x75,0xf9,0x38,0x3f,0xb2,0xc0
+,0x93,0xb4,0x6b,0xe2,0x03,0x44,0xce,0x67
+,0xa0,0xdf,0x89,0xd6,0xad,0x8c,0x76,0xa3
+,0x13,0xc3,0x94,0x61,0x2b,0x6b,0xd9,0x6c
+,0xc1,0x07,0x0a,0x22,0x07,0x85,0x6c,0x85
+,0x24,0x46,0xa9,0xbe,0x3f,0x8b,0x78,0x84
+,0x82,0x7e,0x24,0x0c,0x9d,0xfd,0x81,0x37
+,0xe3,0x25,0xa8,0xed,0x36,0x4e,0x95,0x2c
+,0xc9,0x9c,0x90,0xda,0xec,0xa9,0x42,0x3c
+,0xad,0xb6,0x02};
+const unsigned int NptTlsTrustAnchor_Extended_0010_Size = 1307;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0011.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0011.cpp
new file mode 100644
index 0000000..a811ab5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0011.cpp
@@ -0,0 +1,144 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* CNNIC ROOT */
+const unsigned char NptTlsTrustAnchor_Extended_0011_Data[857] = {
+0x30,0x82,0x03,0x55,0x30,0x82,0x02,0x3d
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x49
+,0x33,0x00,0x01,0x30,0x0d,0x06,0x09,0x2a
+,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05
+,0x05,0x00,0x30,0x32,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43
+,0x4e,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55
+,0x04,0x0a,0x13,0x05,0x43,0x4e,0x4e,0x49
+,0x43,0x31,0x13,0x30,0x11,0x06,0x03,0x55
+,0x04,0x03,0x13,0x0a,0x43,0x4e,0x4e,0x49
+,0x43,0x20,0x52,0x4f,0x4f,0x54,0x30,0x1e
+,0x17,0x0d,0x30,0x37,0x30,0x34,0x31,0x36
+,0x30,0x37,0x30,0x39,0x31,0x34,0x5a,0x17
+,0x0d,0x32,0x37,0x30,0x34,0x31,0x36,0x30
+,0x37,0x30,0x39,0x31,0x34,0x5a,0x30,0x32
+,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04
+,0x06,0x13,0x02,0x43,0x4e,0x31,0x0e,0x30
+,0x0c,0x06,0x03,0x55,0x04,0x0a,0x13,0x05
+,0x43,0x4e,0x4e,0x49,0x43,0x31,0x13,0x30
+,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a
+,0x43,0x4e,0x4e,0x49,0x43,0x20,0x52,0x4f
+,0x4f,0x54,0x30,0x82,0x01,0x22,0x30,0x0d
+,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d
+,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01
+,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82
+,0x01,0x01,0x00,0xd3,0x35,0xf7,0x3f,0x73
+,0x77,0xad,0xe8,0x5b,0x73,0x17,0xc2,0xd1
+,0x6f,0xed,0x55,0xbc,0x6e,0xea,0xe8,0xa4
+,0x79,0xb2,0x6c,0xc3,0xa3,0xef,0xe1,0x9f
+,0xb1,0x3b,0x48,0x85,0xf5,0x9a,0x5c,0x21
+,0x22,0x10,0x2c,0xc5,0x82,0xce,0xda,0xe3
+,0x9a,0x6e,0x37,0xe1,0x87,0x2c,0xdc,0xb9
+,0x0c,0x5a,0xba,0x88,0x55,0xdf,0xfd,0xaa
+,0xdb,0x1f,0x31,0xea,0x01,0xf1,0xdf,0x39
+,0x01,0xc1,0x13,0xfd,0x48,0x52,0x21,0xc4
+,0x55,0xdf,0xda,0xd8,0xb3,0x54,0x76,0xba
+,0x74,0xb1,0xb7,0x7d,0xd7,0xc0,0xe8,0xf6
+,0x59,0xc5,0x4d,0xc8,0xbd,0xad,0x1f,0x14
+,0xda,0xdf,0x58,0x44,0x25,0x32,0x19,0x2a
+,0xc7,0x7e,0x7e,0x8e,0xae,0x38,0xb0,0x30
+,0x7b,0x47,0x72,0x09,0x31,0xf0,0x30,0xdb
+,0xc3,0x1b,0x76,0x29,0xbb,0x69,0x76,0x4e
+,0x57,0xf9,0x1b,0x64,0xa2,0x93,0x56,0xb7
+,0x6f,0x99,0x6e,0xdb,0x0a,0x04,0x9c,0x11
+,0xe3,0x80,0x1f,0xcb,0x63,0x94,0x10,0x0a
+,0xa9,0xe1,0x64,0x82,0x31,0xf9,0x8c,0x27
+,0xed,0xa6,0x99,0x00,0xf6,0x70,0x93,0x18
+,0xf8,0xa1,0x34,0x86,0xa3,0xdd,0x7a,0xc2
+,0x18,0x79,0xf6,0x7a,0x65,0x35,0xcf,0x90
+,0xeb,0xbd,0x33,0x93,0x9f,0x53,0xab,0x73
+,0x3b,0xe6,0x9b,0x34,0x20,0x2f,0x1d,0xef
+,0xa9,0x1d,0x63,0x1a,0xa0,0x80,0xdb,0x03
+,0x2f,0xf9,0x26,0x1a,0x86,0xd2,0x8d,0xbb
+,0xa9,0xbe,0x52,0x3a,0x87,0x67,0x48,0x0d
+,0xbf,0xb4,0xa0,0xd8,0x26,0xbe,0x23,0x5f
+,0x73,0x37,0x7f,0x26,0xe6,0x92,0x04,0xa3
+,0x7f,0xcf,0x20,0xa7,0xb7,0xf3,0x3a,0xca
+,0xcb,0x99,0xcb,0x02,0x03,0x01,0x00,0x01
+,0xa3,0x73,0x30,0x71,0x30,0x11,0x06,0x09
+,0x60,0x86,0x48,0x01,0x86,0xf8,0x42,0x01
+,0x01,0x04,0x04,0x03,0x02,0x00,0x07,0x30
+,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18
+,0x30,0x16,0x80,0x14,0x65,0xf2,0x31,0xad
+,0x2a,0xf7,0xf7,0xdd,0x52,0x96,0x0a,0xc7
+,0x02,0xc1,0x0e,0xef,0xa6,0xd5,0x3b,0x11
+,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01
+,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01
+,0xff,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f
+,0x04,0x04,0x03,0x02,0x01,0xfe,0x30,0x1d
+,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04
+,0x14,0x65,0xf2,0x31,0xad,0x2a,0xf7,0xf7
+,0xdd,0x52,0x96,0x0a,0xc7,0x02,0xc1,0x0e
+,0xef,0xa6,0xd5,0x3b,0x11,0x30,0x0d,0x06
+,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01
+,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01
+,0x00,0x4b,0x35,0xee,0xcc,0xe4,0xae,0xbf
+,0xc3,0x6e,0xad,0x9f,0x95,0x3b,0x4b,0x3f
+,0x5b,0x1e,0xdf,0x57,0x29,0xa2,0x59,0xca
+,0x38,0xe2,0xb9,0x1a,0xff,0x9e,0xe6,0x6e
+,0x32,0xdd,0x1e,0xae,0xea,0x35,0xb7,0xf5
+,0x93,0x91,0x4e,0xda,0x42,0xe1,0xc3,0x17
+,0x60,0x50,0xf2,0xd1,0x5c,0x26,0xb9,0x82
+,0xb7,0xea,0x6d,0xe4,0x9c,0x84,0xe7,0x03
+,0x79,0x17,0xaf,0x98,0x3d,0x94,0xdb,0xc7
+,0xba,0x00,0xe7,0xb8,0xbf,0x01,0x57,0xc1
+,0x77,0x45,0x32,0x0c,0x3b,0xf1,0xb4,0x1c
+,0x08,0xb0,0xfd,0x51,0xa0,0xa1,0xdd,0x9a
+,0x1d,0x13,0x36,0x9a,0x6d,0xb7,0xc7,0x3c
+,0xb9,0xe1,0xc5,0xd9,0x17,0xfa,0x83,0xd5
+,0x3d,0x15,0xa0,0x3c,0xbb,0x1e,0x0b,0xe2
+,0xc8,0x90,0x3f,0xa8,0x86,0x0c,0xfc,0xf9
+,0x8b,0x5e,0x85,0xcb,0x4f,0x5b,0x4b,0x62
+,0x11,0x47,0xc5,0x45,0x7c,0x05,0x2f,0x41
+,0xb1,0x9e,0x10,0x69,0x1b,0x99,0x96,0xe0
+,0x55,0x79,0xfb,0x4e,0x86,0x99,0xb8,0x94
+,0xda,0x86,0x38,0x6a,0x93,0xa3,0xe7,0xcb
+,0x6e,0xe5,0xdf,0xea,0x21,0x55,0x89,0x9c
+,0x7d,0x7d,0x7f,0x98,0xf5,0x00,0x89,0xee
+,0xe3,0x84,0xc0,0x5c,0x96,0xb5,0xc5,0x46
+,0xea,0x46,0xe0,0x85,0x55,0xb6,0x1b,0xc9
+,0x12,0xd6,0xc1,0xcd,0xcd,0x80,0xf3,0x02
+,0x01,0x3c,0xc8,0x69,0xcb,0x45,0x48,0x63
+,0xd8,0x94,0xd0,0xec,0x85,0x0e,0x3b,0x4e
+,0x11,0x65,0xf4,0x82,0x8c,0xa6,0x3d,0xae
+,0x2e,0x22,0x94,0x09,0xc8,0x5c,0xea,0x3c
+,0x81,0x5d,0x16,0x2a,0x03,0x97,0x16,0x55
+,0x09,0xdb,0x8a,0x41,0x82,0x9e,0x66,0x9b
+,0x11};
+const unsigned int NptTlsTrustAnchor_Extended_0011_Size = 857;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0012.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0012.cpp
new file mode 100644
index 0000000..2a12206
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/Extended/NptTlsTrustAnchor_Extended_0012.cpp
@@ -0,0 +1,226 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* EBG Elektronik Sertifika Hizmet Saglayicisi */
+const unsigned char NptTlsTrustAnchor_Extended_0012_Data[1515] = {
+0x30,0x82,0x05,0xe7,0x30,0x82,0x03,0xcf
+,0xa0,0x03,0x02,0x01,0x02,0x02,0x08,0x4c
+,0xaf,0x73,0x42,0x1c,0x8e,0x74,0x02,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x81
+,0x80,0x31,0x38,0x30,0x36,0x06,0x03,0x55
+,0x04,0x03,0x0c,0x2f,0x45,0x42,0x47,0x20
+,0x45,0x6c,0x65,0x6b,0x74,0x72,0x6f,0x6e
+,0x69,0x6b,0x20,0x53,0x65,0x72,0x74,0x69
+,0x66,0x69,0x6b,0x61,0x20,0x48,0x69,0x7a
+,0x6d,0x65,0x74,0x20,0x53,0x61,0xc4,0x9f
+,0x6c,0x61,0x79,0xc4,0xb1,0x63,0xc4,0xb1
+,0x73,0xc4,0xb1,0x31,0x37,0x30,0x35,0x06
+,0x03,0x55,0x04,0x0a,0x0c,0x2e,0x45,0x42
+,0x47,0x20,0x42,0x69,0x6c,0x69,0xc5,0x9f
+,0x69,0x6d,0x20,0x54,0x65,0x6b,0x6e,0x6f
+,0x6c,0x6f,0x6a,0x69,0x6c,0x65,0x72,0x69
+,0x20,0x76,0x65,0x20,0x48,0x69,0x7a,0x6d
+,0x65,0x74,0x6c,0x65,0x72,0x69,0x20,0x41
+,0x2e,0xc5,0x9e,0x2e,0x31,0x0b,0x30,0x09
+,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x54
+,0x52,0x30,0x1e,0x17,0x0d,0x30,0x36,0x30
+,0x38,0x31,0x37,0x30,0x30,0x32,0x31,0x30
+,0x39,0x5a,0x17,0x0d,0x31,0x36,0x30,0x38
+,0x31,0x34,0x30,0x30,0x33,0x31,0x30,0x39
+,0x5a,0x30,0x81,0x80,0x31,0x38,0x30,0x36
+,0x06,0x03,0x55,0x04,0x03,0x0c,0x2f,0x45
+,0x42,0x47,0x20,0x45,0x6c,0x65,0x6b,0x74
+,0x72,0x6f,0x6e,0x69,0x6b,0x20,0x53,0x65
+,0x72,0x74,0x69,0x66,0x69,0x6b,0x61,0x20
+,0x48,0x69,0x7a,0x6d,0x65,0x74,0x20,0x53
+,0x61,0xc4,0x9f,0x6c,0x61,0x79,0xc4,0xb1
+,0x63,0xc4,0xb1,0x73,0xc4,0xb1,0x31,0x37
+,0x30,0x35,0x06,0x03,0x55,0x04,0x0a,0x0c
+,0x2e,0x45,0x42,0x47,0x20,0x42,0x69,0x6c
+,0x69,0xc5,0x9f,0x69,0x6d,0x20,0x54,0x65
+,0x6b,0x6e,0x6f,0x6c,0x6f,0x6a,0x69,0x6c
+,0x65,0x72,0x69,0x20,0x76,0x65,0x20,0x48
+,0x69,0x7a,0x6d,0x65,0x74,0x6c,0x65,0x72
+,0x69,0x20,0x41,0x2e,0xc5,0x9e,0x2e,0x31
+,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06
+,0x13,0x02,0x54,0x52,0x30,0x82,0x02,0x22
+,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86
+,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03
+,0x82,0x02,0x0f,0x00,0x30,0x82,0x02,0x0a
+,0x02,0x82,0x02,0x01,0x00,0xee,0xa0,0x84
+,0x61,0xd0,0x3a,0x6a,0x66,0x10,0x32,0xd8
+,0x31,0x38,0x7f,0xa7,0xa7,0xe5,0xfd,0xa1
+,0xe1,0xfb,0x97,0x77,0xb8,0x71,0x96,0xe8
+,0x13,0x96,0x46,0x83,0x4f,0xb6,0xf2,0x5f
+,0x72,0x56,0x6e,0x13,0x60,0xa5,0x01,0x91
+,0xe2,0x5b,0xc5,0xcd,0x57,0x1f,0x77,0x63
+,0x51,0xff,0x2f,0x3d,0xdb,0xb9,0x3f,0xaa
+,0xa9,0x35,0xe7,0x79,0xd0,0xf5,0xd0,0x24
+,0xb6,0x21,0xea,0xeb,0x23,0x94,0xfe,0x29
+,0xbf,0xfb,0x89,0x91,0x0c,0x64,0x9a,0x05
+,0x4a,0x2b,0xcc,0x0c,0xee,0xf1,0x3d,0x9b
+,0x82,0x69,0xa4,0x4c,0xf8,0x9a,0x6f,0xe7
+,0x22,0xda,0x10,0xba,0x5f,0x92,0xfc,0x18
+,0x27,0x0a,0xa8,0xaa,0x44,0xfa,0x2e,0x2c
+,0xb4,0xfb,0x46,0x9a,0x08,0x03,0x83,0x72
+,0xab,0x88,0xe4,0x6a,0x72,0xc9,0xe5,0x65
+,0x1f,0x6e,0x2a,0x0f,0x9d,0xb3,0xe8,0x3b
+,0xe4,0x0c,0x6e,0x7a,0xda,0x57,0xfd,0xd7
+,0xeb,0x79,0x8b,0x5e,0x20,0x06,0xd3,0x76
+,0x0b,0x6c,0x02,0x95,0xa3,0x96,0xe4,0xcb
+,0x76,0x51,0xd1,0x28,0x9d,0xa1,0x1a,0xfc
+,0x44,0xa2,0x4d,0xcc,0x7a,0x76,0xa8,0x0d
+,0x3d,0xbf,0x17,0x4f,0x22,0x88,0x50,0xfd
+,0xae,0xb6,0xec,0x90,0x50,0x4a,0x5b,0x9f
+,0x95,0x41,0xaa,0xca,0x0f,0xb2,0x4a,0xfe
+,0x80,0x99,0x4e,0xa3,0x46,0x15,0xab,0xf8
+,0x73,0x42,0x6a,0xc2,0x66,0x76,0xb1,0x0a
+,0x26,0x15,0xdd,0x93,0x92,0xec,0xdb,0xa9
+,0x5f,0x54,0x22,0x52,0x91,0x70,0x5d,0x13
+,0xea,0x48,0xec,0x6e,0x03,0x6c,0xd9,0xdd
+,0x6c,0xfc,0xeb,0x0d,0x03,0xff,0xa6,0x83
+,0x12,0x9b,0xf1,0xa9,0x93,0x0f,0xc5,0x26
+,0x4c,0x31,0xb2,0x63,0x99,0x61,0x72,0xe7
+,0x2a,0x64,0x99,0xd2,0xb8,0xe9,0x75,0xe2
+,0x7c,0xa9,0xa9,0x9a,0x1a,0xaa,0xc3,0x56
+,0xdb,0x10,0x9a,0x3c,0x83,0x52,0xb6,0x7b
+,0x96,0xb7,0xac,0x87,0x77,0xa8,0xb9,0xf2
+,0x67,0x0b,0x94,0x43,0xb3,0xaf,0x3e,0x73
+,0xfa,0x42,0x36,0xb1,0x25,0xc5,0x0a,0x31
+,0x26,0x37,0x56,0x67,0xba,0xa3,0x0b,0x7d
+,0xd6,0xf7,0x89,0xcd,0x67,0xa1,0xb7,0x3a
+,0x1e,0x66,0x4f,0xf6,0xa0,0x55,0x14,0x25
+,0x4c,0x2c,0x33,0x0d,0xa6,0x41,0x8c,0xbd
+,0x04,0x31,0x6a,0x10,0x72,0x0a,0x9d,0x0e
+,0x2e,0x76,0xbd,0x5e,0xf3,0x51,0x89,0x8b
+,0xa8,0x3f,0x55,0x73,0xbf,0xdb,0x3a,0xc6
+,0x24,0x05,0x96,0x92,0x48,0xaa,0x4b,0x8d
+,0x2a,0x03,0xe5,0x57,0x91,0x10,0xf4,0x6a
+,0x28,0x15,0x6e,0x47,0x77,0x84,0x5c,0x51
+,0x74,0x9f,0x19,0xe9,0xe6,0x1e,0x63,0x16
+,0x39,0xe3,0x11,0x15,0xe3,0x58,0x1a,0x44
+,0xbd,0xcb,0xc4,0x6c,0x66,0xd7,0x84,0x06
+,0xdf,0x30,0xf4,0x37,0xa2,0x43,0x22,0x79
+,0xd2,0x10,0x6c,0xdf,0xbb,0xe6,0x13,0x11
+,0xfc,0x9d,0x84,0x0a,0x13,0x7b,0xf0,0x3b
+,0xd0,0xfc,0xa3,0x0a,0xd7,0x89,0xea,0x96
+,0x7e,0x8d,0x48,0x85,0x1e,0x64,0x5f,0xdb
+,0x54,0xa2,0xac,0xd5,0x7a,0x02,0x79,0x6b
+,0xd2,0x8a,0xf0,0x67,0xda,0x65,0x72,0x0d
+,0x14,0x70,0xe4,0xe9,0x8e,0x78,0x8f,0x32
+,0x74,0x7c,0x57,0xf2,0xd6,0xd6,0xf4,0x36
+,0x89,0x1b,0xf8,0x29,0x6c,0x8b,0xb9,0xf6
+,0x97,0xd1,0xa4,0x2e,0xaa,0xbe,0x0b,0x19
+,0xc2,0x45,0xe9,0x70,0x5d,0x02,0x03,0x00
+,0x9d,0xd9,0xa3,0x63,0x30,0x61,0x30,0x0f
+,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff
+,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30
+,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01
+,0xff,0x04,0x04,0x03,0x02,0x01,0x06,0x30
+,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16
+,0x04,0x14,0xe7,0xce,0xc6,0x4f,0xfc,0x16
+,0x67,0x96,0xfa,0x4a,0xa3,0x07,0xc1,0x04
+,0xa7,0xcb,0x6a,0xde,0xda,0x47,0x30,0x1f
+,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30
+,0x16,0x80,0x14,0xe7,0xce,0xc6,0x4f,0xfc
+,0x16,0x67,0x96,0xfa,0x4a,0xa3,0x07,0xc1
+,0x04,0xa7,0xcb,0x6a,0xde,0xda,0x47,0x30
+,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7
+,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82
+,0x02,0x01,0x00,0x9b,0x98,0x9a,0x5d,0xbe
+,0xf3,0x28,0x23,0x76,0xc6,0x6c,0xf7,0x7f
+,0xe6,0x40,0x9e,0xc0,0x36,0xdc,0x95,0x0d
+,0x1d,0xad,0x15,0xc5,0x36,0xd8,0xd5,0x39
+,0xef,0xf2,0x1e,0x22,0x5e,0xb3,0x82,0xb4
+,0x5d,0xbb,0x4c,0x1a,0xca,0x92,0x0d,0xdf
+,0x47,0x24,0x1e,0xb3,0x24,0xda,0x91,0x88
+,0xe9,0x83,0x70,0xdd,0x93,0xd7,0xe9,0xba
+,0xb3,0xdf,0x16,0x5a,0x3e,0xde,0xe0,0xc8
+,0xfb,0xd3,0xfd,0x6c,0x29,0xf8,0x15,0x46
+,0xa0,0x68,0x26,0xcc,0x93,0x52,0xae,0x82
+,0x01,0x93,0x90,0xca,0x77,0xca,0x4d,0x49
+,0xef,0xe2,0x5a,0xd9,0x2a,0xbd,0x30,0xce
+,0x4c,0xb2,0x81,0xb6,0x30,0xce,0x59,0x4f
+,0xda,0x59,0x1d,0x6a,0x7a,0xa4,0x45,0xb0
+,0x82,0x26,0x81,0x86,0x76,0xf5,0xf5,0x10
+,0x00,0xb8,0xee,0xb3,0x09,0xe8,0x4f,0x87
+,0x02,0x07,0xae,0x24,0x5c,0xf0,0x5f,0xac
+,0x0a,0x30,0xcc,0x8a,0x40,0xa0,0x73,0x04
+,0xc1,0xfb,0x89,0x24,0xf6,0x9a,0x1c,0x5c
+,0xb7,0x3c,0x0a,0x67,0x36,0x05,0x08,0x31
+,0xb3,0xaf,0xd8,0x01,0x68,0x2a,0xe0,0x78
+,0x8f,0x74,0xde,0xb8,0x51,0xa4,0x8c,0x6c
+,0x20,0x3d,0xa2,0xfb,0xb3,0xd4,0x09,0xfd
+,0x7b,0xc2,0x80,0xaa,0x93,0x6c,0x29,0x98
+,0x21,0xa8,0xbb,0x16,0xf3,0xa9,0x12,0x5f
+,0x74,0xb5,0x87,0x98,0xf2,0x95,0x26,0xdf
+,0x34,0xef,0x8a,0x53,0x91,0x88,0x5d,0x1a
+,0x94,0xa3,0x3f,0x7c,0x22,0xf8,0xd7,0x88
+,0xba,0xa6,0x8c,0x96,0xa8,0x3d,0x52,0x34
+,0x62,0x9f,0x00,0x1e,0x54,0x55,0x42,0x67
+,0xc6,0x4d,0x46,0x8f,0xbb,0x14,0x45,0x3d
+,0x0a,0x96,0x16,0x8e,0x10,0xa1,0x97,0x99
+,0xd5,0xd3,0x30,0x85,0xcc,0xde,0xb4,0x72
+,0xb7,0xbc,0x8a,0x3c,0x18,0x29,0x68,0xfd
+,0xdc,0x71,0x07,0xee,0x24,0x39,0x6a,0xfa
+,0xed,0xa5,0xac,0x38,0x2f,0xf9,0x1e,0x10
+,0x0e,0x06,0x71,0x1a,0x10,0x4c,0xfe,0x75
+,0x7e,0xff,0x1e,0x57,0x39,0x42,0xca,0xd7
+,0xe1,0x15,0xa1,0x56,0x55,0x59,0x1b,0xd1
+,0xa3,0xaf,0x11,0xd8,0x4e,0xc3,0xa5,0x2b
+,0xef,0x90,0xbf,0xc0,0xec,0x82,0x13,0x5b
+,0x8d,0xd6,0x72,0x2c,0x93,0x4e,0x8f,0x6a
+,0x29,0xdf,0x85,0x3c,0xd3,0x0d,0xe0,0xa2
+,0x18,0x12,0xcc,0x55,0x2f,0x47,0xb7,0xa7
+,0x9b,0x02,0xfe,0x41,0xf6,0x88,0x4c,0x6d
+,0xda,0xa9,0x01,0x47,0x83,0x64,0x27,0x62
+,0x10,0x82,0xd6,0x12,0x7b,0x5e,0x03,0x1f
+,0x34,0xa9,0xc9,0x91,0xfe,0xaf,0x5d,0x6d
+,0x86,0x27,0xb7,0x23,0xaa,0x75,0x18,0xca
+,0x20,0xe7,0xb0,0x0f,0xd7,0x89,0x0e,0xa6
+,0x67,0x22,0x63,0xf4,0x83,0x41,0x2b,0x06
+,0x4b,0xbb,0x58,0xd5,0xd1,0xd7,0xb7,0xb9
+,0x10,0x63,0xd8,0x89,0x4a,0xb4,0xaa,0xdd
+,0x16,0x63,0xf5,0x6e,0xbe,0x60,0xa1,0xf8
+,0xed,0xe8,0xd6,0x90,0x4f,0x1a,0xc6,0xc5
+,0xa0,0x29,0xd3,0xa7,0x21,0xa8,0xf5,0x5a
+,0x3c,0xf7,0xc7,0x49,0xa2,0x21,0x9a,0x4a
+,0x95,0x52,0x20,0x96,0x72,0x9a,0x66,0xcb
+,0xf7,0xd2,0x86,0x43,0x7c,0x22,0xbe,0x96
+,0xf9,0xbd,0x01,0xa8,0x47,0xdd,0xe5,0x3b
+,0x40,0xf9,0x75,0x2b,0x9b,0x2b,0x46,0x64
+,0x86,0x8d,0x1e,0xf4,0x8f,0xfb,0x07,0x77
+,0xd0,0xea,0x49,0xa2,0x1c,0x8d,0x52,0x14
+,0xa6,0x0a,0x93};
+const unsigned int NptTlsTrustAnchor_Extended_0012_Size = 1515;
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/NptTlsDefaultTrustAnchorsBase.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/NptTlsDefaultTrustAnchorsBase.cpp
new file mode 100644
index 0000000..001d3c9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/NptTlsDefaultTrustAnchorsBase.cpp
@@ -0,0 +1,313 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* This file is automatically generated by GenTrustAnchorsTables.py, do not edit */
+
+#include "NptTls.h"
+#include "Base/NptTlsTrustAnchor_Base_0000.cpp" /* Verisign/RSA Secure Server CA */
+#include "Base/NptTlsTrustAnchor_Base_0001.cpp" /* GTE CyberTrust Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0002.cpp" /* GTE CyberTrust Global Root */
+#include "Base/NptTlsTrustAnchor_Base_0003.cpp" /* Thawte Personal Basic CA */
+#include "Base/NptTlsTrustAnchor_Base_0004.cpp" /* Thawte Personal Premium CA */
+#include "Base/NptTlsTrustAnchor_Base_0005.cpp" /* Thawte Personal Freemail CA */
+#include "Base/NptTlsTrustAnchor_Base_0006.cpp" /* Thawte Server CA */
+#include "Base/NptTlsTrustAnchor_Base_0007.cpp" /* Thawte Premium Server CA */
+#include "Base/NptTlsTrustAnchor_Base_0008.cpp" /* Equifax Secure CA */
+#include "Base/NptTlsTrustAnchor_Base_0009.cpp" /* Digital Signature Trust Co. Global CA 1 */
+#include "Base/NptTlsTrustAnchor_Base_0010.cpp" /* Digital Signature Trust Co. Global CA 3 */
+#include "Base/NptTlsTrustAnchor_Base_0011.cpp" /* Digital Signature Trust Co. Global CA 2 */
+#include "Base/NptTlsTrustAnchor_Base_0012.cpp" /* Digital Signature Trust Co. Global CA 4 */
+#include "Base/NptTlsTrustAnchor_Base_0013.cpp" /* Verisign Class 1 Public Primary Certification Authority */
+#include "Base/NptTlsTrustAnchor_Base_0014.cpp" /* Verisign Class 2 Public Primary Certification Authority */
+#include "Base/NptTlsTrustAnchor_Base_0015.cpp" /* Verisign Class 3 Public Primary Certification Authority */
+#include "Base/NptTlsTrustAnchor_Base_0016.cpp" /* Verisign Class 1 Public Primary Certification Authority - G2 */
+#include "Base/NptTlsTrustAnchor_Base_0017.cpp" /* Verisign Class 2 Public Primary Certification Authority - G2 */
+#include "Base/NptTlsTrustAnchor_Base_0018.cpp" /* Verisign Class 3 Public Primary Certification Authority - G2 */
+#include "Base/NptTlsTrustAnchor_Base_0019.cpp" /* Verisign Class 4 Public Primary Certification Authority - G2 */
+#include "Base/NptTlsTrustAnchor_Base_0020.cpp" /* GlobalSign Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0021.cpp" /* GlobalSign Root CA - R2 */
+#include "Base/NptTlsTrustAnchor_Base_0022.cpp" /* ValiCert Class 1 VA */
+#include "Base/NptTlsTrustAnchor_Base_0023.cpp" /* ValiCert Class 2 VA */
+#include "Base/NptTlsTrustAnchor_Base_0024.cpp" /* RSA Root Certificate 1 */
+#include "Base/NptTlsTrustAnchor_Base_0025.cpp" /* Verisign Class 1 Public Primary Certification Authority - G3 */
+#include "Base/NptTlsTrustAnchor_Base_0026.cpp" /* Verisign Class 2 Public Primary Certification Authority - G3 */
+#include "Base/NptTlsTrustAnchor_Base_0027.cpp" /* Verisign Class 3 Public Primary Certification Authority - G3 */
+#include "Base/NptTlsTrustAnchor_Base_0028.cpp" /* Verisign Class 4 Public Primary Certification Authority - G3 */
+#include "Base/NptTlsTrustAnchor_Base_0029.cpp" /* Entrust.net Secure Server CA */
+#include "Base/NptTlsTrustAnchor_Base_0030.cpp" /* Entrust.net Secure Personal CA */
+#include "Base/NptTlsTrustAnchor_Base_0031.cpp" /* Entrust.net Premium 2048 Secure Server CA */
+#include "Base/NptTlsTrustAnchor_Base_0032.cpp" /* Baltimore CyberTrust Root */
+#include "Base/NptTlsTrustAnchor_Base_0033.cpp" /* Equifax Secure Global eBusiness CA */
+#include "Base/NptTlsTrustAnchor_Base_0034.cpp" /* Equifax Secure eBusiness CA 1 */
+#include "Base/NptTlsTrustAnchor_Base_0035.cpp" /* Equifax Secure eBusiness CA 2 */
+#include "Base/NptTlsTrustAnchor_Base_0036.cpp" /* Visa International Global Root 2 */
+#include "Base/NptTlsTrustAnchor_Base_0037.cpp" /* AddTrust Low-Value Services Root */
+#include "Base/NptTlsTrustAnchor_Base_0038.cpp" /* AddTrust External Root */
+#include "Base/NptTlsTrustAnchor_Base_0039.cpp" /* AddTrust Public Services Root */
+#include "Base/NptTlsTrustAnchor_Base_0040.cpp" /* AddTrust Qualified Certificates Root */
+#include "Base/NptTlsTrustAnchor_Base_0041.cpp" /* Verisign Time Stamping Authority CA */
+#include "Base/NptTlsTrustAnchor_Base_0042.cpp" /* Thawte Time Stamping CA */
+#include "Base/NptTlsTrustAnchor_Base_0043.cpp" /* Entrust.net Global Secure Server CA */
+#include "Base/NptTlsTrustAnchor_Base_0044.cpp" /* Entrust.net Global Secure Personal CA */
+#include "Base/NptTlsTrustAnchor_Base_0045.cpp" /* Entrust Root Certification Authority */
+#include "Base/NptTlsTrustAnchor_Base_0046.cpp" /* AOL Time Warner Root Certification Authority 1 */
+#include "Base/NptTlsTrustAnchor_Base_0047.cpp" /* AOL Time Warner Root Certification Authority 2 */
+#include "Base/NptTlsTrustAnchor_Base_0048.cpp" /* beTRUSTed Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0049.cpp" /* beTRUSTed Root CA-Baltimore Implementation */
+#include "Base/NptTlsTrustAnchor_Base_0050.cpp" /* beTRUSTed Root CA - Entrust Implementation */
+#include "Base/NptTlsTrustAnchor_Base_0051.cpp" /* beTRUSTed Root CA - RSA Implementation */
+#include "Base/NptTlsTrustAnchor_Base_0052.cpp" /* RSA Security 2048 v3 */
+#include "Base/NptTlsTrustAnchor_Base_0053.cpp" /* RSA Security 1024 v3 */
+#include "Base/NptTlsTrustAnchor_Base_0054.cpp" /* GeoTrust Global CA */
+#include "Base/NptTlsTrustAnchor_Base_0055.cpp" /* GeoTrust Global CA 2 */
+#include "Base/NptTlsTrustAnchor_Base_0056.cpp" /* GeoTrust Universal CA */
+#include "Base/NptTlsTrustAnchor_Base_0057.cpp" /* GeoTrust Universal CA 2 */
+#include "Base/NptTlsTrustAnchor_Base_0058.cpp" /* UTN-USER First-Network Applications */
+#include "Base/NptTlsTrustAnchor_Base_0059.cpp" /* America Online Root Certification Authority 1 */
+#include "Base/NptTlsTrustAnchor_Base_0060.cpp" /* America Online Root Certification Authority 2 */
+#include "Base/NptTlsTrustAnchor_Base_0061.cpp" /* Visa eCommerce Root */
+#include "Base/NptTlsTrustAnchor_Base_0062.cpp" /* TC TrustCenter, Germany, Class 2 CA */
+#include "Base/NptTlsTrustAnchor_Base_0063.cpp" /* TC TrustCenter, Germany, Class 3 CA */
+#include "Base/NptTlsTrustAnchor_Base_0064.cpp" /* Certum Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0065.cpp" /* Comodo AAA Services root */
+#include "Base/NptTlsTrustAnchor_Base_0066.cpp" /* Comodo Secure Services root */
+#include "Base/NptTlsTrustAnchor_Base_0067.cpp" /* Comodo Trusted Services root */
+#include "Base/NptTlsTrustAnchor_Base_0068.cpp" /* IPS Chained CAs root */
+#include "Base/NptTlsTrustAnchor_Base_0069.cpp" /* IPS CLASE1 root */
+#include "Base/NptTlsTrustAnchor_Base_0070.cpp" /* IPS CLASE3 root */
+#include "Base/NptTlsTrustAnchor_Base_0071.cpp" /* IPS CLASEA1 root */
+#include "Base/NptTlsTrustAnchor_Base_0072.cpp" /* IPS CLASEA3 root */
+#include "Base/NptTlsTrustAnchor_Base_0073.cpp" /* IPS Servidores root */
+#include "Base/NptTlsTrustAnchor_Base_0074.cpp" /* IPS Timestamping root */
+#include "Base/NptTlsTrustAnchor_Base_0075.cpp" /* QuoVadis Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0076.cpp" /* QuoVadis Root CA 2 */
+#include "Base/NptTlsTrustAnchor_Base_0077.cpp" /* QuoVadis Root CA 3 */
+#include "Base/NptTlsTrustAnchor_Base_0078.cpp" /* Security Communication Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0079.cpp" /* Sonera Class 1 Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0080.cpp" /* Sonera Class 2 Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0081.cpp" /* Staat der Nederlanden Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0082.cpp" /* TDC Internet Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0083.cpp" /* TDC OCES Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0084.cpp" /* UTN DATACorp SGC Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0085.cpp" /* UTN USERFirst Email Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0086.cpp" /* UTN USERFirst Hardware Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0087.cpp" /* UTN USERFirst Object Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0088.cpp" /* Camerfirma Chambers of Commerce Root */
+#include "Base/NptTlsTrustAnchor_Base_0089.cpp" /* Camerfirma Global Chambersign Root */
+#include "Base/NptTlsTrustAnchor_Base_0090.cpp" /* NetLock Qualified (Class QA) Root */
+#include "Base/NptTlsTrustAnchor_Base_0091.cpp" /* NetLock Notary (Class A) Root */
+#include "Base/NptTlsTrustAnchor_Base_0092.cpp" /* NetLock Business (Class B) Root */
+#include "Base/NptTlsTrustAnchor_Base_0093.cpp" /* NetLock Express (Class C) Root */
+#include "Base/NptTlsTrustAnchor_Base_0094.cpp" /* XRamp Global CA Root */
+#include "Base/NptTlsTrustAnchor_Base_0095.cpp" /* Go Daddy Class 2 CA */
+#include "Base/NptTlsTrustAnchor_Base_0096.cpp" /* Starfield Class 2 CA */
+#include "Base/NptTlsTrustAnchor_Base_0097.cpp" /* StartCom Ltd. */
+#include "Base/NptTlsTrustAnchor_Base_0098.cpp" /* StartCom Certification Authority */
+#include "Base/NptTlsTrustAnchor_Base_0099.cpp" /* Firmaprofesional Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0100.cpp" /* Wells Fargo Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0101.cpp" /* Swisscom Root CA 1 */
+#include "Base/NptTlsTrustAnchor_Base_0102.cpp" /* DigiCert Assured ID Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0103.cpp" /* DigiCert Global Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0104.cpp" /* DigiCert High Assurance EV Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0105.cpp" /* Certplus Class 2 Primary CA */
+#include "Base/NptTlsTrustAnchor_Base_0106.cpp" /* DST Root CA X3 */
+#include "Base/NptTlsTrustAnchor_Base_0107.cpp" /* DST ACES CA X6 */
+#include "Base/NptTlsTrustAnchor_Base_0108.cpp" /* SwissSign Platinum CA - G2 */
+#include "Base/NptTlsTrustAnchor_Base_0109.cpp" /* SwissSign Gold CA - G2 */
+#include "Base/NptTlsTrustAnchor_Base_0110.cpp" /* SwissSign Silver CA - G2 */
+#include "Base/NptTlsTrustAnchor_Base_0111.cpp" /* GeoTrust Primary Certification Authority */
+#include "Base/NptTlsTrustAnchor_Base_0112.cpp" /* thawte Primary Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0113.cpp" /* VeriSign Class 3 Public Primary Certification Authority - G5 */
+#include "Base/NptTlsTrustAnchor_Base_0114.cpp" /* SecureTrust CA */
+#include "Base/NptTlsTrustAnchor_Base_0115.cpp" /* Secure Global CA */
+#include "Base/NptTlsTrustAnchor_Base_0116.cpp" /* COMODO Certification Authority */
+#include "Base/NptTlsTrustAnchor_Base_0117.cpp" /* DigiNotar Root CA */
+#include "Base/NptTlsTrustAnchor_Base_0118.cpp" /* Network Solutions Certificate Authority */
+#include "Base/NptTlsTrustAnchor_Base_0119.cpp" /* WellsSecure Public Root Certificate Authority */
+#include "Base/NptTlsTrustAnchor_Base_0120.cpp" /* IGC/A */
+#include "Base/NptTlsTrustAnchor_Base_0121.cpp" /* Security Communication EV RootCA1 */
+#include "Base/NptTlsTrustAnchor_Base_0122.cpp" /* TC TrustCenter Class 2 CA II */
+#include "Base/NptTlsTrustAnchor_Base_0123.cpp" /* TC TrustCenter Class 3 CA II */
+#include "Base/NptTlsTrustAnchor_Base_0124.cpp" /* TC TrustCenter Universal CA I */
+#include "Base/NptTlsTrustAnchor_Base_0125.cpp" /* Deutsche Telekom Root CA 2 */
+#include "Base/NptTlsTrustAnchor_Base_0126.cpp" /* ComSign CA */
+#include "Base/NptTlsTrustAnchor_Base_0127.cpp" /* ComSign Secured CA */
+#include "Base/NptTlsTrustAnchor_Base_0128.cpp" /* Cybertrust Global Root */
+#include "Base/NptTlsTrustAnchor_Base_0129.cpp" /* Buypass Class 2 CA 1 */
+#include "Base/NptTlsTrustAnchor_Base_0130.cpp" /* Buypass Class 3 CA 1 */
+#include "Base/NptTlsTrustAnchor_Base_0131.cpp" /* certSIGN ROOT CA */
+#include "Base/NptTlsTrustAnchor_Base_0132.cpp" /* ApplicationCA - Japanese Government */
+#include "Base/NptTlsTrustAnchor_Base_0133.cpp" /* GeoTrust Primary Certification Authority - G3 */
+#include "Base/NptTlsTrustAnchor_Base_0134.cpp" /* thawte Primary Root CA - G2 */
+#include "Base/NptTlsTrustAnchor_Base_0135.cpp" /* GeoTrust Primary Certification Authority - G2 */
+/* total anchors size =147055 */
+
+const NPT_TlsTrustAnchorData NptTlsDefaultTrustAnchorsBase[137] = {
+ { NptTlsTrustAnchor_Base_0000_Data, NptTlsTrustAnchor_Base_0000_Size} /* Verisign/RSA Secure Server CA */,
+ { NptTlsTrustAnchor_Base_0001_Data, NptTlsTrustAnchor_Base_0001_Size} /* GTE CyberTrust Root CA */,
+ { NptTlsTrustAnchor_Base_0002_Data, NptTlsTrustAnchor_Base_0002_Size} /* GTE CyberTrust Global Root */,
+ { NptTlsTrustAnchor_Base_0003_Data, NptTlsTrustAnchor_Base_0003_Size} /* Thawte Personal Basic CA */,
+ { NptTlsTrustAnchor_Base_0004_Data, NptTlsTrustAnchor_Base_0004_Size} /* Thawte Personal Premium CA */,
+ { NptTlsTrustAnchor_Base_0005_Data, NptTlsTrustAnchor_Base_0005_Size} /* Thawte Personal Freemail CA */,
+ { NptTlsTrustAnchor_Base_0006_Data, NptTlsTrustAnchor_Base_0006_Size} /* Thawte Server CA */,
+ { NptTlsTrustAnchor_Base_0007_Data, NptTlsTrustAnchor_Base_0007_Size} /* Thawte Premium Server CA */,
+ { NptTlsTrustAnchor_Base_0008_Data, NptTlsTrustAnchor_Base_0008_Size} /* Equifax Secure CA */,
+ { NptTlsTrustAnchor_Base_0009_Data, NptTlsTrustAnchor_Base_0009_Size} /* Digital Signature Trust Co. Global CA 1 */,
+ { NptTlsTrustAnchor_Base_0010_Data, NptTlsTrustAnchor_Base_0010_Size} /* Digital Signature Trust Co. Global CA 3 */,
+ { NptTlsTrustAnchor_Base_0011_Data, NptTlsTrustAnchor_Base_0011_Size} /* Digital Signature Trust Co. Global CA 2 */,
+ { NptTlsTrustAnchor_Base_0012_Data, NptTlsTrustAnchor_Base_0012_Size} /* Digital Signature Trust Co. Global CA 4 */,
+ { NptTlsTrustAnchor_Base_0013_Data, NptTlsTrustAnchor_Base_0013_Size} /* Verisign Class 1 Public Primary Certification Authority */,
+ { NptTlsTrustAnchor_Base_0014_Data, NptTlsTrustAnchor_Base_0014_Size} /* Verisign Class 2 Public Primary Certification Authority */,
+ { NptTlsTrustAnchor_Base_0015_Data, NptTlsTrustAnchor_Base_0015_Size} /* Verisign Class 3 Public Primary Certification Authority */,
+ { NptTlsTrustAnchor_Base_0016_Data, NptTlsTrustAnchor_Base_0016_Size} /* Verisign Class 1 Public Primary Certification Authority - G2 */,
+ { NptTlsTrustAnchor_Base_0017_Data, NptTlsTrustAnchor_Base_0017_Size} /* Verisign Class 2 Public Primary Certification Authority - G2 */,
+ { NptTlsTrustAnchor_Base_0018_Data, NptTlsTrustAnchor_Base_0018_Size} /* Verisign Class 3 Public Primary Certification Authority - G2 */,
+ { NptTlsTrustAnchor_Base_0019_Data, NptTlsTrustAnchor_Base_0019_Size} /* Verisign Class 4 Public Primary Certification Authority - G2 */,
+ { NptTlsTrustAnchor_Base_0020_Data, NptTlsTrustAnchor_Base_0020_Size} /* GlobalSign Root CA */,
+ { NptTlsTrustAnchor_Base_0021_Data, NptTlsTrustAnchor_Base_0021_Size} /* GlobalSign Root CA - R2 */,
+ { NptTlsTrustAnchor_Base_0022_Data, NptTlsTrustAnchor_Base_0022_Size} /* ValiCert Class 1 VA */,
+ { NptTlsTrustAnchor_Base_0023_Data, NptTlsTrustAnchor_Base_0023_Size} /* ValiCert Class 2 VA */,
+ { NptTlsTrustAnchor_Base_0024_Data, NptTlsTrustAnchor_Base_0024_Size} /* RSA Root Certificate 1 */,
+ { NptTlsTrustAnchor_Base_0025_Data, NptTlsTrustAnchor_Base_0025_Size} /* Verisign Class 1 Public Primary Certification Authority - G3 */,
+ { NptTlsTrustAnchor_Base_0026_Data, NptTlsTrustAnchor_Base_0026_Size} /* Verisign Class 2 Public Primary Certification Authority - G3 */,
+ { NptTlsTrustAnchor_Base_0027_Data, NptTlsTrustAnchor_Base_0027_Size} /* Verisign Class 3 Public Primary Certification Authority - G3 */,
+ { NptTlsTrustAnchor_Base_0028_Data, NptTlsTrustAnchor_Base_0028_Size} /* Verisign Class 4 Public Primary Certification Authority - G3 */,
+ { NptTlsTrustAnchor_Base_0029_Data, NptTlsTrustAnchor_Base_0029_Size} /* Entrust.net Secure Server CA */,
+ { NptTlsTrustAnchor_Base_0030_Data, NptTlsTrustAnchor_Base_0030_Size} /* Entrust.net Secure Personal CA */,
+ { NptTlsTrustAnchor_Base_0031_Data, NptTlsTrustAnchor_Base_0031_Size} /* Entrust.net Premium 2048 Secure Server CA */,
+ { NptTlsTrustAnchor_Base_0032_Data, NptTlsTrustAnchor_Base_0032_Size} /* Baltimore CyberTrust Root */,
+ { NptTlsTrustAnchor_Base_0033_Data, NptTlsTrustAnchor_Base_0033_Size} /* Equifax Secure Global eBusiness CA */,
+ { NptTlsTrustAnchor_Base_0034_Data, NptTlsTrustAnchor_Base_0034_Size} /* Equifax Secure eBusiness CA 1 */,
+ { NptTlsTrustAnchor_Base_0035_Data, NptTlsTrustAnchor_Base_0035_Size} /* Equifax Secure eBusiness CA 2 */,
+ { NptTlsTrustAnchor_Base_0036_Data, NptTlsTrustAnchor_Base_0036_Size} /* Visa International Global Root 2 */,
+ { NptTlsTrustAnchor_Base_0037_Data, NptTlsTrustAnchor_Base_0037_Size} /* AddTrust Low-Value Services Root */,
+ { NptTlsTrustAnchor_Base_0038_Data, NptTlsTrustAnchor_Base_0038_Size} /* AddTrust External Root */,
+ { NptTlsTrustAnchor_Base_0039_Data, NptTlsTrustAnchor_Base_0039_Size} /* AddTrust Public Services Root */,
+ { NptTlsTrustAnchor_Base_0040_Data, NptTlsTrustAnchor_Base_0040_Size} /* AddTrust Qualified Certificates Root */,
+ { NptTlsTrustAnchor_Base_0041_Data, NptTlsTrustAnchor_Base_0041_Size} /* Verisign Time Stamping Authority CA */,
+ { NptTlsTrustAnchor_Base_0042_Data, NptTlsTrustAnchor_Base_0042_Size} /* Thawte Time Stamping CA */,
+ { NptTlsTrustAnchor_Base_0043_Data, NptTlsTrustAnchor_Base_0043_Size} /* Entrust.net Global Secure Server CA */,
+ { NptTlsTrustAnchor_Base_0044_Data, NptTlsTrustAnchor_Base_0044_Size} /* Entrust.net Global Secure Personal CA */,
+ { NptTlsTrustAnchor_Base_0045_Data, NptTlsTrustAnchor_Base_0045_Size} /* Entrust Root Certification Authority */,
+ { NptTlsTrustAnchor_Base_0046_Data, NptTlsTrustAnchor_Base_0046_Size} /* AOL Time Warner Root Certification Authority 1 */,
+ { NptTlsTrustAnchor_Base_0047_Data, NptTlsTrustAnchor_Base_0047_Size} /* AOL Time Warner Root Certification Authority 2 */,
+ { NptTlsTrustAnchor_Base_0048_Data, NptTlsTrustAnchor_Base_0048_Size} /* beTRUSTed Root CA */,
+ { NptTlsTrustAnchor_Base_0049_Data, NptTlsTrustAnchor_Base_0049_Size} /* beTRUSTed Root CA-Baltimore Implementation */,
+ { NptTlsTrustAnchor_Base_0050_Data, NptTlsTrustAnchor_Base_0050_Size} /* beTRUSTed Root CA - Entrust Implementation */,
+ { NptTlsTrustAnchor_Base_0051_Data, NptTlsTrustAnchor_Base_0051_Size} /* beTRUSTed Root CA - RSA Implementation */,
+ { NptTlsTrustAnchor_Base_0052_Data, NptTlsTrustAnchor_Base_0052_Size} /* RSA Security 2048 v3 */,
+ { NptTlsTrustAnchor_Base_0053_Data, NptTlsTrustAnchor_Base_0053_Size} /* RSA Security 1024 v3 */,
+ { NptTlsTrustAnchor_Base_0054_Data, NptTlsTrustAnchor_Base_0054_Size} /* GeoTrust Global CA */,
+ { NptTlsTrustAnchor_Base_0055_Data, NptTlsTrustAnchor_Base_0055_Size} /* GeoTrust Global CA 2 */,
+ { NptTlsTrustAnchor_Base_0056_Data, NptTlsTrustAnchor_Base_0056_Size} /* GeoTrust Universal CA */,
+ { NptTlsTrustAnchor_Base_0057_Data, NptTlsTrustAnchor_Base_0057_Size} /* GeoTrust Universal CA 2 */,
+ { NptTlsTrustAnchor_Base_0058_Data, NptTlsTrustAnchor_Base_0058_Size} /* UTN-USER First-Network Applications */,
+ { NptTlsTrustAnchor_Base_0059_Data, NptTlsTrustAnchor_Base_0059_Size} /* America Online Root Certification Authority 1 */,
+ { NptTlsTrustAnchor_Base_0060_Data, NptTlsTrustAnchor_Base_0060_Size} /* America Online Root Certification Authority 2 */,
+ { NptTlsTrustAnchor_Base_0061_Data, NptTlsTrustAnchor_Base_0061_Size} /* Visa eCommerce Root */,
+ { NptTlsTrustAnchor_Base_0062_Data, NptTlsTrustAnchor_Base_0062_Size} /* TC TrustCenter, Germany, Class 2 CA */,
+ { NptTlsTrustAnchor_Base_0063_Data, NptTlsTrustAnchor_Base_0063_Size} /* TC TrustCenter, Germany, Class 3 CA */,
+ { NptTlsTrustAnchor_Base_0064_Data, NptTlsTrustAnchor_Base_0064_Size} /* Certum Root CA */,
+ { NptTlsTrustAnchor_Base_0065_Data, NptTlsTrustAnchor_Base_0065_Size} /* Comodo AAA Services root */,
+ { NptTlsTrustAnchor_Base_0066_Data, NptTlsTrustAnchor_Base_0066_Size} /* Comodo Secure Services root */,
+ { NptTlsTrustAnchor_Base_0067_Data, NptTlsTrustAnchor_Base_0067_Size} /* Comodo Trusted Services root */,
+ { NptTlsTrustAnchor_Base_0068_Data, NptTlsTrustAnchor_Base_0068_Size} /* IPS Chained CAs root */,
+ { NptTlsTrustAnchor_Base_0069_Data, NptTlsTrustAnchor_Base_0069_Size} /* IPS CLASE1 root */,
+ { NptTlsTrustAnchor_Base_0070_Data, NptTlsTrustAnchor_Base_0070_Size} /* IPS CLASE3 root */,
+ { NptTlsTrustAnchor_Base_0071_Data, NptTlsTrustAnchor_Base_0071_Size} /* IPS CLASEA1 root */,
+ { NptTlsTrustAnchor_Base_0072_Data, NptTlsTrustAnchor_Base_0072_Size} /* IPS CLASEA3 root */,
+ { NptTlsTrustAnchor_Base_0073_Data, NptTlsTrustAnchor_Base_0073_Size} /* IPS Servidores root */,
+ { NptTlsTrustAnchor_Base_0074_Data, NptTlsTrustAnchor_Base_0074_Size} /* IPS Timestamping root */,
+ { NptTlsTrustAnchor_Base_0075_Data, NptTlsTrustAnchor_Base_0075_Size} /* QuoVadis Root CA */,
+ { NptTlsTrustAnchor_Base_0076_Data, NptTlsTrustAnchor_Base_0076_Size} /* QuoVadis Root CA 2 */,
+ { NptTlsTrustAnchor_Base_0077_Data, NptTlsTrustAnchor_Base_0077_Size} /* QuoVadis Root CA 3 */,
+ { NptTlsTrustAnchor_Base_0078_Data, NptTlsTrustAnchor_Base_0078_Size} /* Security Communication Root CA */,
+ { NptTlsTrustAnchor_Base_0079_Data, NptTlsTrustAnchor_Base_0079_Size} /* Sonera Class 1 Root CA */,
+ { NptTlsTrustAnchor_Base_0080_Data, NptTlsTrustAnchor_Base_0080_Size} /* Sonera Class 2 Root CA */,
+ { NptTlsTrustAnchor_Base_0081_Data, NptTlsTrustAnchor_Base_0081_Size} /* Staat der Nederlanden Root CA */,
+ { NptTlsTrustAnchor_Base_0082_Data, NptTlsTrustAnchor_Base_0082_Size} /* TDC Internet Root CA */,
+ { NptTlsTrustAnchor_Base_0083_Data, NptTlsTrustAnchor_Base_0083_Size} /* TDC OCES Root CA */,
+ { NptTlsTrustAnchor_Base_0084_Data, NptTlsTrustAnchor_Base_0084_Size} /* UTN DATACorp SGC Root CA */,
+ { NptTlsTrustAnchor_Base_0085_Data, NptTlsTrustAnchor_Base_0085_Size} /* UTN USERFirst Email Root CA */,
+ { NptTlsTrustAnchor_Base_0086_Data, NptTlsTrustAnchor_Base_0086_Size} /* UTN USERFirst Hardware Root CA */,
+ { NptTlsTrustAnchor_Base_0087_Data, NptTlsTrustAnchor_Base_0087_Size} /* UTN USERFirst Object Root CA */,
+ { NptTlsTrustAnchor_Base_0088_Data, NptTlsTrustAnchor_Base_0088_Size} /* Camerfirma Chambers of Commerce Root */,
+ { NptTlsTrustAnchor_Base_0089_Data, NptTlsTrustAnchor_Base_0089_Size} /* Camerfirma Global Chambersign Root */,
+ { NptTlsTrustAnchor_Base_0090_Data, NptTlsTrustAnchor_Base_0090_Size} /* NetLock Qualified (Class QA) Root */,
+ { NptTlsTrustAnchor_Base_0091_Data, NptTlsTrustAnchor_Base_0091_Size} /* NetLock Notary (Class A) Root */,
+ { NptTlsTrustAnchor_Base_0092_Data, NptTlsTrustAnchor_Base_0092_Size} /* NetLock Business (Class B) Root */,
+ { NptTlsTrustAnchor_Base_0093_Data, NptTlsTrustAnchor_Base_0093_Size} /* NetLock Express (Class C) Root */,
+ { NptTlsTrustAnchor_Base_0094_Data, NptTlsTrustAnchor_Base_0094_Size} /* XRamp Global CA Root */,
+ { NptTlsTrustAnchor_Base_0095_Data, NptTlsTrustAnchor_Base_0095_Size} /* Go Daddy Class 2 CA */,
+ { NptTlsTrustAnchor_Base_0096_Data, NptTlsTrustAnchor_Base_0096_Size} /* Starfield Class 2 CA */,
+ { NptTlsTrustAnchor_Base_0097_Data, NptTlsTrustAnchor_Base_0097_Size} /* StartCom Ltd. */,
+ { NptTlsTrustAnchor_Base_0098_Data, NptTlsTrustAnchor_Base_0098_Size} /* StartCom Certification Authority */,
+ { NptTlsTrustAnchor_Base_0099_Data, NptTlsTrustAnchor_Base_0099_Size} /* Firmaprofesional Root CA */,
+ { NptTlsTrustAnchor_Base_0100_Data, NptTlsTrustAnchor_Base_0100_Size} /* Wells Fargo Root CA */,
+ { NptTlsTrustAnchor_Base_0101_Data, NptTlsTrustAnchor_Base_0101_Size} /* Swisscom Root CA 1 */,
+ { NptTlsTrustAnchor_Base_0102_Data, NptTlsTrustAnchor_Base_0102_Size} /* DigiCert Assured ID Root CA */,
+ { NptTlsTrustAnchor_Base_0103_Data, NptTlsTrustAnchor_Base_0103_Size} /* DigiCert Global Root CA */,
+ { NptTlsTrustAnchor_Base_0104_Data, NptTlsTrustAnchor_Base_0104_Size} /* DigiCert High Assurance EV Root CA */,
+ { NptTlsTrustAnchor_Base_0105_Data, NptTlsTrustAnchor_Base_0105_Size} /* Certplus Class 2 Primary CA */,
+ { NptTlsTrustAnchor_Base_0106_Data, NptTlsTrustAnchor_Base_0106_Size} /* DST Root CA X3 */,
+ { NptTlsTrustAnchor_Base_0107_Data, NptTlsTrustAnchor_Base_0107_Size} /* DST ACES CA X6 */,
+ { NptTlsTrustAnchor_Base_0108_Data, NptTlsTrustAnchor_Base_0108_Size} /* SwissSign Platinum CA - G2 */,
+ { NptTlsTrustAnchor_Base_0109_Data, NptTlsTrustAnchor_Base_0109_Size} /* SwissSign Gold CA - G2 */,
+ { NptTlsTrustAnchor_Base_0110_Data, NptTlsTrustAnchor_Base_0110_Size} /* SwissSign Silver CA - G2 */,
+ { NptTlsTrustAnchor_Base_0111_Data, NptTlsTrustAnchor_Base_0111_Size} /* GeoTrust Primary Certification Authority */,
+ { NptTlsTrustAnchor_Base_0112_Data, NptTlsTrustAnchor_Base_0112_Size} /* thawte Primary Root CA */,
+ { NptTlsTrustAnchor_Base_0113_Data, NptTlsTrustAnchor_Base_0113_Size} /* VeriSign Class 3 Public Primary Certification Authority - G5 */,
+ { NptTlsTrustAnchor_Base_0114_Data, NptTlsTrustAnchor_Base_0114_Size} /* SecureTrust CA */,
+ { NptTlsTrustAnchor_Base_0115_Data, NptTlsTrustAnchor_Base_0115_Size} /* Secure Global CA */,
+ { NptTlsTrustAnchor_Base_0116_Data, NptTlsTrustAnchor_Base_0116_Size} /* COMODO Certification Authority */,
+ { NptTlsTrustAnchor_Base_0117_Data, NptTlsTrustAnchor_Base_0117_Size} /* DigiNotar Root CA */,
+ { NptTlsTrustAnchor_Base_0118_Data, NptTlsTrustAnchor_Base_0118_Size} /* Network Solutions Certificate Authority */,
+ { NptTlsTrustAnchor_Base_0119_Data, NptTlsTrustAnchor_Base_0119_Size} /* WellsSecure Public Root Certificate Authority */,
+ { NptTlsTrustAnchor_Base_0120_Data, NptTlsTrustAnchor_Base_0120_Size} /* IGC/A */,
+ { NptTlsTrustAnchor_Base_0121_Data, NptTlsTrustAnchor_Base_0121_Size} /* Security Communication EV RootCA1 */,
+ { NptTlsTrustAnchor_Base_0122_Data, NptTlsTrustAnchor_Base_0122_Size} /* TC TrustCenter Class 2 CA II */,
+ { NptTlsTrustAnchor_Base_0123_Data, NptTlsTrustAnchor_Base_0123_Size} /* TC TrustCenter Class 3 CA II */,
+ { NptTlsTrustAnchor_Base_0124_Data, NptTlsTrustAnchor_Base_0124_Size} /* TC TrustCenter Universal CA I */,
+ { NptTlsTrustAnchor_Base_0125_Data, NptTlsTrustAnchor_Base_0125_Size} /* Deutsche Telekom Root CA 2 */,
+ { NptTlsTrustAnchor_Base_0126_Data, NptTlsTrustAnchor_Base_0126_Size} /* ComSign CA */,
+ { NptTlsTrustAnchor_Base_0127_Data, NptTlsTrustAnchor_Base_0127_Size} /* ComSign Secured CA */,
+ { NptTlsTrustAnchor_Base_0128_Data, NptTlsTrustAnchor_Base_0128_Size} /* Cybertrust Global Root */,
+ { NptTlsTrustAnchor_Base_0129_Data, NptTlsTrustAnchor_Base_0129_Size} /* Buypass Class 2 CA 1 */,
+ { NptTlsTrustAnchor_Base_0130_Data, NptTlsTrustAnchor_Base_0130_Size} /* Buypass Class 3 CA 1 */,
+ { NptTlsTrustAnchor_Base_0131_Data, NptTlsTrustAnchor_Base_0131_Size} /* certSIGN ROOT CA */,
+ { NptTlsTrustAnchor_Base_0132_Data, NptTlsTrustAnchor_Base_0132_Size} /* ApplicationCA - Japanese Government */,
+ { NptTlsTrustAnchor_Base_0133_Data, NptTlsTrustAnchor_Base_0133_Size} /* GeoTrust Primary Certification Authority - G3 */,
+ { NptTlsTrustAnchor_Base_0134_Data, NptTlsTrustAnchor_Base_0134_Size} /* thawte Primary Root CA - G2 */,
+ { NptTlsTrustAnchor_Base_0135_Data, NptTlsTrustAnchor_Base_0135_Size} /* GeoTrust Primary Certification Authority - G2 */,
+ {0, 0} /* sentinel */
+};
diff --git a/lib/libUPnP/Neptune/Source/Data/TLS/NptTlsDefaultTrustAnchorsExtended.cpp b/lib/libUPnP/Neptune/Source/Data/TLS/NptTlsDefaultTrustAnchorsExtended.cpp
new file mode 100644
index 0000000..62ce4f9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Data/TLS/NptTlsDefaultTrustAnchorsExtended.cpp
@@ -0,0 +1,67 @@
+/*****************************************************************
+|
+| Neptune - Trust Anchors
+|
+| This file is automatically generated by a script, do not edit!
+|
+| Copyright (c) 2002-2010, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+ /* This file is automatically generated by GenTrustAnchorsTables.py, do not edit */
+
+#include "NptTls.h"
+#include "Extended/NptTlsTrustAnchor_Extended_0000.cpp" /* ABAecom (sub., Am. Bankers Assn.) Root CA */
+#include "Extended/NptTlsTrustAnchor_Extended_0001.cpp" /* Taiwan GRCA */
+#include "Extended/NptTlsTrustAnchor_Extended_0002.cpp" /* TURKTRUST Certificate Services Provider Root 1 */
+#include "Extended/NptTlsTrustAnchor_Extended_0003.cpp" /* TURKTRUST Certificate Services Provider Root 2 */
+#include "Extended/NptTlsTrustAnchor_Extended_0004.cpp" /* OISTE WISeKey Global Root GA CA */
+#include "Extended/NptTlsTrustAnchor_Extended_0005.cpp" /* S-TRUST Authentication and Encryption Root CA 2005 PN */
+#include "Extended/NptTlsTrustAnchor_Extended_0006.cpp" /* Microsec e-Szigno Root CA */
+#include "Extended/NptTlsTrustAnchor_Extended_0007.cpp" /* Certigna */
+#include "Extended/NptTlsTrustAnchor_Extended_0008.cpp" /* AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. */
+#include "Extended/NptTlsTrustAnchor_Extended_0009.cpp" /* ePKI Root Certification Authority */
+#include "Extended/NptTlsTrustAnchor_Extended_0010.cpp" /* TUBITAK UEKAE Kok Sertifika Hizmet Saglayicisi - Surum 3 */
+#include "Extended/NptTlsTrustAnchor_Extended_0011.cpp" /* CNNIC ROOT */
+#include "Extended/NptTlsTrustAnchor_Extended_0012.cpp" /* EBG Elektronik Sertifika Hizmet Saglayicisi */
+/* total anchors size =16311 */
+
+const NPT_TlsTrustAnchorData NptTlsDefaultTrustAnchorsExtended[14] = {
+ { NptTlsTrustAnchor_Extended_0000_Data, NptTlsTrustAnchor_Extended_0000_Size} /* ABAecom (sub., Am. Bankers Assn.) Root CA */,
+ { NptTlsTrustAnchor_Extended_0001_Data, NptTlsTrustAnchor_Extended_0001_Size} /* Taiwan GRCA */,
+ { NptTlsTrustAnchor_Extended_0002_Data, NptTlsTrustAnchor_Extended_0002_Size} /* TURKTRUST Certificate Services Provider Root 1 */,
+ { NptTlsTrustAnchor_Extended_0003_Data, NptTlsTrustAnchor_Extended_0003_Size} /* TURKTRUST Certificate Services Provider Root 2 */,
+ { NptTlsTrustAnchor_Extended_0004_Data, NptTlsTrustAnchor_Extended_0004_Size} /* OISTE WISeKey Global Root GA CA */,
+ { NptTlsTrustAnchor_Extended_0005_Data, NptTlsTrustAnchor_Extended_0005_Size} /* S-TRUST Authentication and Encryption Root CA 2005 PN */,
+ { NptTlsTrustAnchor_Extended_0006_Data, NptTlsTrustAnchor_Extended_0006_Size} /* Microsec e-Szigno Root CA */,
+ { NptTlsTrustAnchor_Extended_0007_Data, NptTlsTrustAnchor_Extended_0007_Size} /* Certigna */,
+ { NptTlsTrustAnchor_Extended_0008_Data, NptTlsTrustAnchor_Extended_0008_Size} /* AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. */,
+ { NptTlsTrustAnchor_Extended_0009_Data, NptTlsTrustAnchor_Extended_0009_Size} /* ePKI Root Certification Authority */,
+ { NptTlsTrustAnchor_Extended_0010_Data, NptTlsTrustAnchor_Extended_0010_Size} /* TUBITAK UEKAE Kok Sertifika Hizmet Saglayicisi - Surum 3 */,
+ { NptTlsTrustAnchor_Extended_0011_Data, NptTlsTrustAnchor_Extended_0011_Size} /* CNNIC ROOT */,
+ { NptTlsTrustAnchor_Extended_0012_Data, NptTlsTrustAnchor_Extended_0012_Size} /* EBG Elektronik Sertifika Hizmet Saglayicisi */,
+ {0, 0} /* sentinel */
+};
diff --git a/lib/libUPnP/Neptune/Source/System/Android/NptAndroidConsole.cpp b/lib/libUPnP/Neptune/Source/System/Android/NptAndroidConsole.cpp
new file mode 100644
index 0000000..c7a31f1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Android/NptAndroidConsole.cpp
@@ -0,0 +1,26 @@
+/*****************************************************************
+|
+| Neptune - Console Support: StdC Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <android/log.h>
+#include <stdio.h>
+
+#include "NptConfig.h"
+#include "NptConsole.h"
+
+/*----------------------------------------------------------------------
+| NPT_Console::Output
++---------------------------------------------------------------------*/
+void
+NPT_Console::Output(const char* message)
+{
+ __android_log_write(ANDROID_LOG_DEBUG, "Neptune", message);
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Android/NptAndroidDebug.cpp b/lib/libUPnP/Neptune/Source/System/Android/NptAndroidDebug.cpp
new file mode 100644
index 0000000..378ee45
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Android/NptAndroidDebug.cpp
@@ -0,0 +1,31 @@
+/*****************************************************************
+|
+| File: NptStdcDebug.c
+|
+| Atomix - Debug Support: Android Implementation
+|
+| (c) 2002-2009 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <android/log.h>
+#include <stdio.h>
+
+#include "NptConfig.h"
+#include "NptDefs.h"
+#include "NptTypes.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| NPT_DebugOuput
++---------------------------------------------------------------------*/
+void
+NPT_DebugOutput(const char* message)
+{
+ __android_log_write(ANDROID_LOG_DEBUG, "Neptune", message);
+ printf("%s", message);
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Android/NptAndroidFile.cpp b/lib/libUPnP/Neptune/Source/System/Android/NptAndroidFile.cpp
new file mode 100644
index 0000000..5d7f619
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Android/NptAndroidFile.cpp
@@ -0,0 +1,450 @@
+/*****************************************************************
+|
+| Neptune - Files :: Android Implementation
+|
+| (c) 2001-2016 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptUtils.h"
+#include "NptFile.h"
+#include "NptThreads.h"
+#include "NptInterfaces.h"
+#include "NptStrings.h"
+#include "NptDebug.h"
+
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+/*----------------------------------------------------------------------
+| MapErrno
++---------------------------------------------------------------------*/
+static NPT_Result
+MapErrno(int err) {
+ switch (err) {
+ case EACCES: return NPT_ERROR_PERMISSION_DENIED;
+ case EPERM: return NPT_ERROR_PERMISSION_DENIED;
+ case ENOENT: return NPT_ERROR_NO_SUCH_FILE;
+#if defined(ENAMETOOLONG)
+ case ENAMETOOLONG: return NPT_ERROR_INVALID_PARAMETERS;
+#endif
+ case EBUSY: return NPT_ERROR_FILE_BUSY;
+ case EROFS: return NPT_ERROR_FILE_NOT_WRITABLE;
+ case ENOTDIR: return NPT_ERROR_FILE_NOT_DIRECTORY;
+ default: return NPT_ERROR_ERRNO(err);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileWrapper
++---------------------------------------------------------------------*/
+class NPT_AndroidFileWrapper
+{
+public:
+ // constructors and destructor
+ NPT_AndroidFileWrapper(int fd, const char* name) : m_FD(fd), m_Position(0), m_Name(name) {}
+ ~NPT_AndroidFileWrapper() {
+ if (m_FD >= 0 &&
+ m_FD != STDIN_FILENO &&
+ m_FD != STDOUT_FILENO &&
+ m_FD != STDERR_FILENO) {
+ close(m_FD);
+ }
+ }
+
+ // members
+ int m_FD;
+ NPT_Position m_Position;
+ NPT_String m_Name;
+};
+
+typedef NPT_Reference<NPT_AndroidFileWrapper> NPT_AndroidFileReference;
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileStream
++---------------------------------------------------------------------*/
+class NPT_AndroidFileStream
+{
+public:
+ // constructors and destructor
+ NPT_AndroidFileStream(NPT_AndroidFileReference file) :
+ m_FileReference(file) {}
+
+ // NPT_FileInterface methods
+ NPT_Result Seek(NPT_Position offset);
+ NPT_Result Tell(NPT_Position& offset);
+ NPT_Result Flush();
+
+protected:
+ // constructors and destructors
+ virtual ~NPT_AndroidFileStream() {}
+
+ // members
+ NPT_AndroidFileReference m_FileReference;
+};
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileStream::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFileStream::Seek(NPT_Position offset)
+{
+ off64_t result = lseek64(m_FileReference->m_FD, offset, SEEK_SET);
+ if (result < 0) {
+ return MapErrno(errno);
+ }
+
+ m_FileReference->m_Position = offset;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileStream::Tell
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFileStream::Tell(NPT_Position& offset)
+{
+ offset = m_FileReference->m_Position;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileStream::Flush
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFileStream::Flush()
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileInputStream
++---------------------------------------------------------------------*/
+class NPT_AndroidFileInputStream : public NPT_InputStream,
+ private NPT_AndroidFileStream
+
+{
+public:
+ // constructors and destructor
+ NPT_AndroidFileInputStream(NPT_AndroidFileReference& file) :
+ NPT_AndroidFileStream(file) {}
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read);
+ NPT_Result Seek(NPT_Position offset) {
+ return NPT_AndroidFileStream::Seek(offset);
+ }
+ NPT_Result Tell(NPT_Position& offset) {
+ return NPT_AndroidFileStream::Tell(offset);
+ }
+ NPT_Result GetSize(NPT_LargeSize& size);
+ NPT_Result GetAvailable(NPT_LargeSize& available);
+};
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFileInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ // check the parameters
+ if (buffer == NULL) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // read from the file
+ ssize_t nb_read = read(m_FileReference->m_FD, buffer, bytes_to_read);
+ if (nb_read > 0) {
+ if (bytes_read) *bytes_read = (NPT_Size)nb_read;
+ m_FileReference->m_Position += nb_read;
+ return NPT_SUCCESS;
+ } else if (nb_read == 0) {
+ if (bytes_read) *bytes_read = 0;
+ return NPT_ERROR_EOS;
+ } else {
+ if (bytes_read) *bytes_read = 0;
+ return MapErrno(errno);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileInputStream::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFileInputStream::GetSize(NPT_LargeSize& size)
+{
+ NPT_FileInfo file_info;
+ NPT_Result result = NPT_File::GetInfo(m_FileReference->m_Name, &file_info);
+ if (NPT_FAILED(result)) return result;
+ size = file_info.m_Size;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFileInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ NPT_LargeSize size = 0;
+
+ if (NPT_SUCCEEDED(GetSize(size)) && m_FileReference->m_Position <= size) {
+ available = size - m_FileReference->m_Position;
+ return NPT_SUCCESS;
+ } else {
+ available = 0;
+ return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileOutputStream
++---------------------------------------------------------------------*/
+class NPT_AndroidFileOutputStream : public NPT_OutputStream,
+ private NPT_AndroidFileStream
+{
+public:
+ // constructors and destructor
+ NPT_AndroidFileOutputStream(NPT_AndroidFileReference& file) :
+ NPT_AndroidFileStream(file) {}
+
+ // NPT_InputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written);
+ NPT_Result Seek(NPT_Position offset) {
+ return NPT_AndroidFileStream::Seek(offset);
+ }
+ NPT_Result Tell(NPT_Position& offset) {
+ return NPT_AndroidFileStream::Tell(offset);
+ }
+ NPT_Result Flush() {
+ return NPT_AndroidFileStream::Flush();
+ }
+};
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFileOutputStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFileOutputStream::Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written)
+{
+ if (bytes_to_write == 0) {
+ if (bytes_written) *bytes_written = 0;
+ return NPT_SUCCESS;
+ }
+
+ ssize_t nb_written = write(m_FileReference->m_FD, buffer, bytes_to_write);
+
+ if (nb_written > 0) {
+ if (bytes_written) *bytes_written = (NPT_Size)nb_written;
+ m_FileReference->m_Position += nb_written;
+ return NPT_SUCCESS;
+ } else {
+ if (bytes_written) *bytes_written = 0;
+ return MapErrno(errno);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFile
++---------------------------------------------------------------------*/
+class NPT_AndroidFile: public NPT_FileInterface
+{
+public:
+ // constructors and destructor
+ NPT_AndroidFile(NPT_File& delegator);
+ ~NPT_AndroidFile();
+
+ // NPT_FileInterface methods
+ NPT_Result Open(OpenMode mode);
+ NPT_Result Close();
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream);
+
+private:
+ // members
+ NPT_File& m_Delegator;
+ OpenMode m_Mode;
+ NPT_AndroidFileReference m_FileReference;
+};
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFile::NPT_AndroidFile
++---------------------------------------------------------------------*/
+NPT_AndroidFile::NPT_AndroidFile(NPT_File& delegator) :
+ m_Delegator(delegator),
+ m_Mode(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFile::~NPT_AndroidFile
++---------------------------------------------------------------------*/
+NPT_AndroidFile::~NPT_AndroidFile()
+{
+ Close();
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFile::Open
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFile::Open(NPT_File::OpenMode mode)
+{
+ // check if we're already open
+ if (!m_FileReference.IsNull()) {
+ return NPT_ERROR_FILE_ALREADY_OPEN;
+ }
+
+ // store the mode
+ m_Mode = mode;
+
+ // check for special names
+ const char* name = (const char*)m_Delegator.GetPath();
+ int fd = -1;
+ if (NPT_StringsEqual(name, NPT_FILE_STANDARD_INPUT)) {
+ fd = STDIN_FILENO;
+ } else if (NPT_StringsEqual(name, NPT_FILE_STANDARD_OUTPUT)) {
+ fd = STDOUT_FILENO;
+ } else if (NPT_StringsEqual(name, NPT_FILE_STANDARD_ERROR)) {
+ fd = STDERR_FILENO;
+ } else {
+ int open_flags = 0;
+ int create_perm = 0;
+
+ if (mode & NPT_FILE_OPEN_MODE_WRITE) {
+ if (mode & NPT_FILE_OPEN_MODE_READ) {
+ open_flags |= O_RDWR;
+ } else {
+ open_flags |= O_WRONLY;
+ }
+ if (mode & NPT_FILE_OPEN_MODE_APPEND) {
+ open_flags |= O_APPEND;
+ }
+ if (mode & NPT_FILE_OPEN_MODE_CREATE) {
+ open_flags |= O_CREAT;
+ create_perm = 0666;
+ }
+ if (mode & NPT_FILE_OPEN_MODE_TRUNCATE) {
+ open_flags |= O_TRUNC;
+ }
+ } else {
+ open_flags |= O_RDONLY;
+ }
+
+ fd = open(name, open_flags, create_perm);
+
+ // test the result of the open
+ if (fd < 0) return MapErrno(errno);
+ }
+
+ // create a reference to the file descriptor
+ m_FileReference = new NPT_AndroidFileWrapper(fd, name);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFile::Close
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFile::Close()
+{
+ // release the file reference
+ m_FileReference = NULL;
+
+ // reset the mode
+ m_Mode = 0;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFile::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFile::GetInputStream(NPT_InputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ // check that the file is open
+ if (m_FileReference.IsNull()) return NPT_ERROR_FILE_NOT_OPEN;
+
+ // check that the mode is compatible
+ if (!(m_Mode & NPT_FILE_OPEN_MODE_READ)) {
+ return NPT_ERROR_FILE_NOT_READABLE;
+ }
+
+ // create a stream
+ stream = new NPT_AndroidFileInputStream(m_FileReference);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AndroidFile::GetOutputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_AndroidFile::GetOutputStream(NPT_OutputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ // check that the file is open
+ if (m_FileReference.IsNull()) return NPT_ERROR_FILE_NOT_OPEN;
+
+ // check that the mode is compatible
+ if (!(m_Mode & NPT_FILE_OPEN_MODE_WRITE)) {
+ return NPT_ERROR_FILE_NOT_WRITABLE;
+ }
+
+ // create a stream
+ stream = new NPT_AndroidFileOutputStream(m_FileReference);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::NPT_File
++---------------------------------------------------------------------*/
+NPT_File::NPT_File(const char* path) : m_Path(path), m_IsSpecial(false)
+{
+ m_Delegate = new NPT_AndroidFile(*this);
+
+ if (NPT_StringsEqual(path, NPT_FILE_STANDARD_INPUT) ||
+ NPT_StringsEqual(path, NPT_FILE_STANDARD_OUTPUT) ||
+ NPT_StringsEqual(path, NPT_FILE_STANDARD_ERROR)) {
+ m_IsSpecial = true;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::operator=
++---------------------------------------------------------------------*/
+NPT_File&
+NPT_File::operator=(const NPT_File& file)
+{
+ if (this != &file) {
+ delete m_Delegate;
+ m_Path = file.m_Path;
+ m_IsSpecial = file.m_IsSpecial;
+ m_Delegate = new NPT_AndroidFile(*this);
+ }
+ return *this;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Android/NptAndroidLogConfig.cpp b/lib/libUPnP/Neptune/Source/System/Android/NptAndroidLogConfig.cpp
new file mode 100644
index 0000000..2c4ef69
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Android/NptAndroidLogConfig.cpp
@@ -0,0 +1,45 @@
+extern "C" {
+#include <sys/system_properties.h>
+}
+#include <android/log.h>
+#include <dlfcn.h>
+#include "NptLogging.h"
+
+/*----------------------------------------------------------------------
+| android_property_get
++---------------------------------------------------------------------*/
+static int android_property_get(const char* name, char* value) {
+ static int (*__real_system_property_get)(const char*, char*) = NULL;
+ if (__real_system_property_get == NULL) {
+ void* handle = dlopen("libc.so", 0);
+ if (!handle) {
+ __android_log_print(ANDROID_LOG_DEBUG, "Neptune", "Cannot dlopen libc.so: %s", dlerror());
+ return 0;
+ }
+ __real_system_property_get = reinterpret_cast<int (*)(const char*, char*)>(
+ dlsym(handle, "__system_property_get"));
+ if (!__real_system_property_get) {
+ __android_log_print(ANDROID_LOG_DEBUG, "Neptune", "Cannot resolve __system_property_get(): %s", dlerror());
+ return 0;
+ }
+ }
+ return (*__real_system_property_get)(name, value);
+}
+
+/*----------------------------------------------------------------------
+| NPT_GetSystemLogConfig
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_GetSystemLogConfig(NPT_String& config)
+{
+ char android_npt_config[PROP_VALUE_MAX];
+ android_npt_config[0] = 0;
+ int prop_len = android_property_get("persist.neptune_log_config",
+ android_npt_config);
+ if (prop_len > 0) {
+ config = android_npt_config;
+ return NPT_SUCCESS;
+ } else {
+ return NPT_ERROR_NO_SUCH_PROPERTY;
+ }
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Apple/NptAppleAutoreleasePool.mm b/lib/libUPnP/Neptune/Source/System/Apple/NptAppleAutoreleasePool.mm
new file mode 100644
index 0000000..edced15
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Apple/NptAppleAutoreleasePool.mm
@@ -0,0 +1,61 @@
+/*****************************************************************
+|
+| Neptune - Autorelease Pool :: Apple Implementation
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <Foundation/Foundation.h>
+#include "NptAutoreleasePool.h"
+
+/*----------------------------------------------------------------------
+| AppleAutoReleasePool
++---------------------------------------------------------------------*/
+class AppleAutoreleasePool : public NPT_AutoreleasePoolInterface
+{
+public:
+ AppleAutoreleasePool();
+ virtual ~AppleAutoreleasePool();
+
+private:
+ NSAutoreleasePool* m_Pool;
+};
+
+/*----------------------------------------------------------------------
+| AppleAutoreleasePool::AppleAutoreleasePool
++---------------------------------------------------------------------*/
+AppleAutoreleasePool::AppleAutoreleasePool()
+{
+ m_Pool = [[NSAutoreleasePool alloc] init];
+}
+
+/*----------------------------------------------------------------------
+| AppleAutoreleasePool::~AppleAutoreleasePool
++---------------------------------------------------------------------*/
+AppleAutoreleasePool::~AppleAutoreleasePool()
+{
+ [m_Pool drain];
+ m_Pool = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AutoreleasePool::NPT_AutoreleasePool
++---------------------------------------------------------------------*/
+NPT_AutoreleasePool::NPT_AutoreleasePool()
+{
+ m_Delegate = new AppleAutoreleasePool;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AutoreleasePool::~NPT_AutoreleasePool
++---------------------------------------------------------------------*/
+NPT_AutoreleasePool::~NPT_AutoreleasePool()
+{
+ delete m_Delegate;
+ m_Delegate = NULL;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Apple/NptAppleLogConfig.mm b/lib/libUPnP/Neptune/Source/System/Apple/NptAppleLogConfig.mm
new file mode 100644
index 0000000..d050f38
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Apple/NptAppleLogConfig.mm
@@ -0,0 +1,38 @@
+/*****************************************************************
+|
+| Neptune - System Log Config
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+#import <Foundation/Foundation.h>
+
+#import "NptAutoreleasePool.h"
+#import "NptLogging.h"
+
+NPT_Result
+NPT_GetSystemLogConfig(NPT_String& config)
+{
+ NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+
+#if !defined(TARGET_OS_IPHONE) || !TARGET_OS_IPHONE
+ NSDictionary* env_vars = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"LSEnvironment"];
+ NSString* npt_log_config = [env_vars objectForKey:@"NEPTUNE_LOG_CONFIG"];
+#else
+ NSString *npt_log_config = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NEPTUNE_LOG_CONFIG"];
+#endif
+
+ NPT_Result result = NPT_SUCCESS;
+ if (npt_log_config) {
+ NSLog(@"NEPTUNE_LOG_CONFIG in plist is: %@", npt_log_config);
+ config = (const char*)[npt_log_config UTF8String];
+ } else {
+ NSLog(@"NEPTUNE_LOG_CONFIG not found in 'Info.plist'");
+ result = NPT_ERROR_NO_SUCH_PROPERTY;
+ }
+
+ [pool release];
+ return result;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdBlockerSocket.h b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdBlockerSocket.h
new file mode 100644
index 0000000..7aac6dc
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdBlockerSocket.h
@@ -0,0 +1,62 @@
+/*****************************************************************
+|
+| Wasabi - Blocker Socket internal header
+|
+| $Id: NptBsdBlockerSocket.h 268 2015-05-28 19:13:46Z ehodzic $
+| Original author: Edin Hodzic (dino@concisoft.com)
+|
+| This software is provided to you pursuant to your agreement
+| with Intertrust Technologies Corporation ("Intertrust").
+| This software may be used only in accordance with the terms
+| of the agreement.
+|
+| Copyright (c) 2015 by Intertrust. All rights reserved.
+|
+****************************************************************/
+
+#ifndef _NPT_BSD_BLOCKER_SOCKET_H_
+#define _NPT_BSD_BLOCKER_SOCKET_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptHash.h"
+#include "NptThreads.h"
+
+/*----------------------------------------------------------------------
+| forward declaration
++---------------------------------------------------------------------*/
+class NPT_BsdSocketFd;
+typedef NPT_Reference<NPT_BsdSocketFd> NPT_BsdSocketFdReference;
+
+/*----------------------------------------------------------------------
+| NPT_Hash<NPT_Thread::ThreadId>
++---------------------------------------------------------------------*/
+template <>
+struct NPT_Hash<NPT_Thread::ThreadId>
+{
+ NPT_UInt32 operator()(NPT_Thread::ThreadId i) const { return NPT_Fnv1aHash32(reinterpret_cast<const NPT_UInt8*>(&i), sizeof(i)); }
+};
+
+/*----------------------------------------------------------------------
+| NPT_BlockerSocket
++---------------------------------------------------------------------*/
+class NPT_BsdBlockerSocket {
+public:
+ NPT_BsdBlockerSocket(const NPT_BsdSocketFdReference& fd) {
+ Set(NPT_Thread::GetCurrentThreadId(), fd.AsPointer());
+ }
+ ~NPT_BsdBlockerSocket() {
+ Set(NPT_Thread::GetCurrentThreadId(), NULL);
+ }
+
+ static NPT_Result Cancel(NPT_Thread::ThreadId id);
+
+private:
+ static NPT_Result Set(NPT_Thread::ThreadId id, NPT_BsdSocketFd* fd);
+
+ static NPT_Mutex MapLock;
+ static NPT_HashMap<NPT_Thread::ThreadId, NPT_BsdSocketFd*> Map;
+};
+
+#endif // _NPT_BSD_BLOCKER_SOCKET_H_
diff --git a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdNetwork.cpp b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdNetwork.cpp
new file mode 100644
index 0000000..6208185
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdNetwork.cpp
@@ -0,0 +1,651 @@
+/*****************************************************************
+|
+| Neptune - Network :: BSD Implementation
+|
+| (c) 2001-2016 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#include <net/if.h>
+//#include <net/if_arp.h>
+#include <netdb.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptStreams.h"
+#include "NptThreads.h"
+#include "NptNetwork.h"
+#include "NptUtils.h"
+#include "NptConstants.h"
+#include "NptSockets.h"
+
+#if defined(NPT_CONFIG_HAVE_NET_IF_DL_H)
+#include <net/if_dl.h>
+#endif
+#if defined(NPT_CONFIG_HAVE_NET_IF_TYPES_H)
+#include <net/if_types.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_GETIFADDRS)
+#include <ifaddrs.h>
+#endif
+
+/*----------------------------------------------------------------------
+| platform adaptation
++---------------------------------------------------------------------*/
+#if !defined(IFHWADDRLEN)
+#define IFHWADDRLEN 6 // default to 48 bits
+#endif
+#if !defined(ARPHRD_ETHER)
+#define ARPHRD_ETHER 1
+#endif
+
+#if defined(_SIZEOF_ADDR_IFREQ)
+#define NPT_IFREQ_SIZE(ifr) _SIZEOF_ADDR_IFREQ(*ifr)
+#elif defined(NPT_CONFIG_HAVE_SOCKADDR_SA_LEN)
+#define NPT_IFREQ_SIZE(ifr) (sizeof(ifr->ifr_name) + ifr->ifr_addr.sa_len)
+#else
+#define NPT_IFREQ_SIZE(ifr) sizeof(*ifr)
+#endif
+
+/*----------------------------------------------------------------------
+| IPv6 support
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_HAVE_ARPA_INET_H)
+#include <arpa/inet.h>
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::Any and NPT_IpAddress::Loopback
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+const NPT_IpAddress NPT_IpAddress::Any(NPT_IpAddress::IPV6, in6addr_any.s6_addr, 16);
+const NPT_IpAddress NPT_IpAddress::Loopback(NPT_IpAddress::IPV6, in6addr_loopback.s6_addr, 16);
+#else
+const NPT_IpAddress NPT_IpAddress::Any;
+const NPT_IpAddress NPT_IpAddress::Loopback(127,0,0,1);
+#endif
+
+#if defined(NPT_CONFIG_HAVE_INET_NTOP)
+/*----------------------------------------------------------------------
+| NPT_IpAddress::ToString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_IpAddress::ToString() const
+{
+ NPT_String address;
+ char workspace[128];
+ int af = AF_INET;
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ if (m_Type == IPV6) {
+ af = AF_INET6;
+ }
+#endif
+ const char* string = inet_ntop(af, &m_Address[0], workspace, sizeof(workspace));
+ if (string) {
+ address = string;
+ }
+
+ return address;
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_IpAddress::ToString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_IpAddress::ToString() const
+{
+ NPT_String address;
+ address.Reserve(16);
+ address += NPT_String::FromInteger(m_Address[0]);
+ address += '.';
+ address += NPT_String::FromInteger(m_Address[1]);
+ address += '.';
+ address += NPT_String::FromInteger(m_Address[2]);
+ address += '.';
+ address += NPT_String::FromInteger(m_Address[3]);
+
+ return address;
+}
+#endif
+
+#if defined(NPT_CONFIG_HAVE_INET_PTON)
+/*----------------------------------------------------------------------
+| NPT_IpAddress::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_IpAddress::Parse(const char* name)
+{
+ int result;
+
+ // check the name
+ if (name == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // clear the address
+ NPT_SetMemory(&m_Address[0], 0, sizeof(m_Address));
+
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ // try IPv6 first
+ result = inet_pton(AF_INET6, name, &m_Address[0]);
+ if (result > 0) {
+ m_Type = IPV6;
+ return NPT_SUCCESS;
+ }
+#endif
+
+ // try IPv4 next
+ result = inet_pton(AF_INET, name, &m_Address[0]);
+ if (result > 0) {
+ m_Type = IPV4;
+ return NPT_SUCCESS;
+ }
+
+ if (result == 0) {
+ return NPT_ERROR_INVALID_SYNTAX;
+ } else {
+ return NPT_FAILURE;
+ }
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_IpAddress::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_IpAddress::Parse(const char* name)
+{
+ // check the name
+ if (name == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // clear the address
+ NPT_SetMemory(&m_Address[0], 0, sizeof(m_Address));
+
+ // parse
+ unsigned int fragment;
+ bool fragment_empty = true;
+ unsigned char address[4];
+ unsigned int accumulator;
+ for (fragment = 0, accumulator = 0; fragment < 4; ++name) {
+ if (*name == '\0' || *name == '.') {
+ // fragment terminator
+ if (fragment_empty) return NPT_ERROR_INVALID_SYNTAX;
+ address[fragment++] = accumulator;
+ if (*name == '\0') break;
+ accumulator = 0;
+ fragment_empty = true;
+ } else if (*name >= '0' && *name <= '9') {
+ // numerical character
+ accumulator = accumulator*10 + (*name - '0');
+ if (accumulator > 255) return NPT_ERROR_INVALID_SYNTAX;
+ fragment_empty = false;
+ } else {
+ // invalid character
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ }
+
+ if (fragment == 4 && *name == '\0' && !fragment_empty) {
+ m_Address[0] = address[0];
+ m_Address[1] = address[1];
+ m_Address[2] = address[2];
+ m_Address[3] = address[3];
+ return NPT_SUCCESS;
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+}
+#endif
+
+#if defined(NPT_CONFIG_HAVE_GETIFADDRS)
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::GetNetworkInterfaces
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces)
+{
+ interfaces.Clear();
+
+ struct ifaddrs* addrs = NULL;
+ int result = getifaddrs(&addrs);
+ if (result != 0) {
+ return NPT_ERROR_BASE_UNIX-errno;
+ }
+
+ for (struct ifaddrs* addr = addrs;
+ addr;
+ addr = addr->ifa_next) {
+
+ // get detailed info about the interface
+ NPT_Flags flags = 0;
+ // process the flags
+ if ((addr->ifa_flags & IFF_UP) == 0) {
+ // the interface is not up, ignore it
+ continue;
+ }
+ if (addr->ifa_flags & IFF_BROADCAST) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_BROADCAST;
+ }
+ if (addr->ifa_flags & IFF_LOOPBACK) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_LOOPBACK;
+ }
+#if defined(IFF_POINTOPOINT)
+ if (addr->ifa_flags & IFF_POINTOPOINT) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT;
+ }
+#endif // defined(IFF_POINTOPOINT)
+ if (addr->ifa_flags & IFF_PROMISC) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_PROMISCUOUS;
+ }
+ if (addr->ifa_flags & IFF_MULTICAST) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_MULTICAST;
+ }
+
+ // get a pointer to an interface we've looped over before
+ // or create a new one
+ NPT_NetworkInterface* interface = NULL;
+ for (NPT_List<NPT_NetworkInterface*>::Iterator iface_iter = interfaces.GetFirstItem();
+ iface_iter;
+ ++iface_iter) {
+ if ((*iface_iter)->GetName() == (const char*)addr->ifa_name) {
+ interface = *iface_iter;
+ break;
+ }
+ }
+ if (interface == NULL) {
+ // create a new interface object
+ interface = new NPT_NetworkInterface(addr->ifa_name, flags);
+
+ // add the interface to the list
+ interfaces.Add(interface);
+ }
+
+ if (addr->ifa_addr == NULL) {
+ continue;
+ }
+ switch (addr->ifa_addr->sa_family) {
+ case AF_INET: {
+ // primary address
+ NPT_IpAddress primary_address(ntohl(((struct sockaddr_in*)addr->ifa_addr)->sin_addr.s_addr));
+
+ // broadcast address
+ NPT_IpAddress broadcast_address;
+ if (addr->ifa_broadaddr) {
+ broadcast_address.Set(ntohl(((struct sockaddr_in*)addr->ifa_broadaddr)->sin_addr.s_addr));
+ }
+
+ // point to point address
+ NPT_IpAddress destination_address;
+ if (addr->ifa_dstaddr) {
+ destination_address.Set(ntohl(((struct sockaddr_in*)addr->ifa_dstaddr)->sin_addr.s_addr));
+ }
+
+ // netmask
+ NPT_IpAddress netmask(0xFFFFFFFF);
+ if (addr->ifa_netmask) {
+ netmask.Set(ntohl(((struct sockaddr_in*)addr->ifa_netmask)->sin_addr.s_addr));
+ }
+
+ // add the address to the interface
+ NPT_NetworkInterfaceAddress iface_address(
+ primary_address,
+ broadcast_address,
+ destination_address,
+ netmask);
+ interface->AddAddress(iface_address);
+
+ break;
+ }
+
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ case AF_INET6: {
+ // primary address
+ const struct sockaddr_in6* ipv6_address = (const struct sockaddr_in6*)addr->ifa_addr;
+ NPT_IpAddress primary_address(NPT_IpAddress::IPV6, ipv6_address->sin6_addr.s6_addr, 16, ipv6_address->sin6_scope_id);
+
+ // empty broadcast address (no broadcast address for IPv6)
+ NPT_IpAddress broadcast_address(NPT_IpAddress::IPV6);
+
+ // point to point address
+ NPT_IpAddress destination_address(NPT_IpAddress::IPV6);
+ if (flags & NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT) {
+ if (addr->ifa_dstaddr) {
+ ipv6_address = (const struct sockaddr_in6*)addr->ifa_dstaddr;
+ destination_address.Set(ipv6_address->sin6_addr.s6_addr, 16, ipv6_address->sin6_scope_id);
+ }
+ }
+
+ // empty netmask (does not work for IPv6)
+ NPT_IpAddress netmask((NPT_IpAddress::IPV6));
+
+ // add the address to the interface
+ NPT_NetworkInterfaceAddress iface_address(
+ primary_address,
+ broadcast_address,
+ destination_address,
+ netmask);
+ interface->AddAddress(iface_address);
+
+ break;
+ }
+#endif
+
+#if defined(AF_LINK) && defined(NPT_CONFIG_HAVE_SOCKADDR_DL)
+ case AF_LINK: {
+ struct sockaddr_dl* mac_addr = (struct sockaddr_dl*)addr->ifa_addr;
+ NPT_MacAddress::Type mac_addr_type = NPT_MacAddress::TYPE_UNKNOWN;
+ switch (mac_addr->sdl_type) {
+#if defined(IFT_LOOP)
+ case IFT_LOOP: mac_addr_type = NPT_MacAddress::TYPE_LOOPBACK; break;
+#endif
+#if defined(IFT_ETHER)
+ case IFT_ETHER: mac_addr_type = NPT_MacAddress::TYPE_ETHERNET; break;
+#endif
+#if defined(IFT_PPP)
+ case IFT_PPP: mac_addr_type = NPT_MacAddress::TYPE_PPP; break;
+#endif
+ }
+ interface->SetMacAddress(mac_addr_type,
+ (const unsigned char*)(&mac_addr->sdl_data[mac_addr->sdl_nlen]),
+ mac_addr->sdl_alen);
+ break;
+ }
+#endif
+ }
+ }
+
+ freeifaddrs(addrs);
+
+ return NPT_SUCCESS;
+}
+#else
+const unsigned int NPT_BSD_NETWORK_MAX_IFCONF_SIZE = 1<<20;
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::GetNetworkInterfaces
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces)
+{
+//#if defined(NPT_CONFIG_ENABLE_IPV6)
+// int net = socket(PF_INET6, SOCK_DGRAM, 0);
+//#else
+ int net = socket(PF_INET, SOCK_DGRAM, 0);
+//#endif
+ if (net < 0) {
+ return NPT_ERROR_BASE_UNIX-errno;
+ }
+
+ // Try to get the config until we have enough memory for it
+ // According to "Unix Network Programming", some implementations
+ // do not return an error when the supplied buffer is too small
+ // so we need to try, increasing the buffer size every time,
+ // until we get the same size twice. We cannot assume success when
+ // the returned size is smaller than the supplied buffer, because
+ // some implementations can return less that the buffer size if
+ // another structure does not fit.
+ unsigned int buffer_size = 4096; // initial guess
+ unsigned int last_size = 0;
+ struct ifconf config;
+ unsigned char* buffer = NULL;
+ for (;buffer_size < NPT_BSD_NETWORK_MAX_IFCONF_SIZE;) {
+ buffer = new unsigned char[buffer_size];
+ config.ifc_len = buffer_size;
+ config.ifc_buf = (char*)buffer;
+ if (ioctl(net, SIOCGIFCONF, &config) < 0) {
+ if (errno != EINVAL || last_size != 0) {
+ delete[] buffer;
+ close(net);
+ return NPT_ERROR_BASE_UNIX-errno;
+ }
+ } else {
+ if ((unsigned int)config.ifc_len == last_size) {
+ // same size, we can use the buffer
+ break;
+ }
+ // different size, we need to reallocate
+ last_size = config.ifc_len;
+ }
+
+ // supply 4096 more bytes more next time around
+ buffer_size += 4096;
+ delete[] buffer;
+ buffer = NULL;
+ }
+ if (buffer == NULL) {
+ close(net);
+ return NPT_ERROR_NOT_ENOUGH_SPACE;
+ }
+
+ // iterate over all objects
+ unsigned char *entries;
+ for (entries = (unsigned char*)config.ifc_req; entries < (unsigned char*)config.ifc_req+config.ifc_len;) {
+ struct ifreq* entry = (struct ifreq*)entries;
+
+ // point to the next entry
+ entries += NPT_IFREQ_SIZE(entry);
+
+ // ignore anything except AF_INET, AF_INET6 (if enabled) and AF_LINK addresses
+ if (entry->ifr_addr.sa_family != AF_INET
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ && entry->ifr_addr.sa_family != AF_INET6
+#endif
+#if defined(AF_LINK)
+ && entry->ifr_addr.sa_family != AF_LINK
+#endif
+ ) {
+ continue;
+ }
+
+ // get detailed info about the interface
+ NPT_Flags flags = 0;
+#if defined(SIOCGIFFLAGS)
+ struct ifreq query = *entry;
+ if (ioctl(net, SIOCGIFFLAGS, &query) < 0) continue;
+
+ // process the flags
+ if ((query.ifr_flags & IFF_UP) == 0) {
+ // the interface is not up, ignore it
+ continue;
+ }
+ if (query.ifr_flags & IFF_BROADCAST) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_BROADCAST;
+ }
+ if (query.ifr_flags & IFF_LOOPBACK) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_LOOPBACK;
+ }
+#if defined(IFF_POINTOPOINT)
+ if (query.ifr_flags & IFF_POINTOPOINT) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT;
+ }
+#endif // defined(IFF_POINTOPOINT)
+ if (query.ifr_flags & IFF_PROMISC) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_PROMISCUOUS;
+ }
+ if (query.ifr_flags & IFF_MULTICAST) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_MULTICAST;
+ }
+#endif // defined(SIOCGIFFLAGS)
+
+ // get a pointer to an interface we've looped over before
+ // or create a new one
+ NPT_NetworkInterface* interface = NULL;
+ for (NPT_List<NPT_NetworkInterface*>::Iterator iface_iter = interfaces.GetFirstItem();
+ iface_iter;
+ ++iface_iter) {
+ if ((*iface_iter)->GetName() == (const char*)entry->ifr_name) {
+ interface = *iface_iter;
+ break;
+ }
+ }
+ if (interface == NULL) {
+ // create a new interface object
+ interface = new NPT_NetworkInterface(entry->ifr_name, flags);
+
+ // add the interface to the list
+ interfaces.Add(interface);
+
+ // get the mac address
+#if defined(SIOCGIFHWADDR)
+ if (ioctl(net, SIOCGIFHWADDR, &query) == 0) {
+ NPT_MacAddress::Type mac_addr_type;
+ unsigned int mac_addr_length = IFHWADDRLEN;
+ switch (query.ifr_addr.sa_family) {
+#if defined(ARPHRD_ETHER)
+ case ARPHRD_ETHER:
+ mac_addr_type = NPT_MacAddress::TYPE_ETHERNET;
+ break;
+#endif
+
+#if defined(ARPHRD_LOOPBACK)
+ case ARPHRD_LOOPBACK:
+ mac_addr_type = NPT_MacAddress::TYPE_LOOPBACK;
+ length = 0;
+ break;
+#endif
+
+#if defined(ARPHRD_PPP)
+ case ARPHRD_PPP:
+ mac_addr_type = NPT_MacAddress::TYPE_PPP;
+ mac_addr_length = 0;
+ break;
+#endif
+
+#if defined(ARPHRD_IEEE80211)
+ case ARPHRD_IEEE80211:
+ mac_addr_type = NPT_MacAddress::TYPE_IEEE_802_11;
+ break;
+#endif
+
+ default:
+ mac_addr_type = NPT_MacAddress::TYPE_UNKNOWN;
+ mac_addr_length = sizeof(query.ifr_addr.sa_data);
+ break;
+ }
+
+ interface->SetMacAddress(mac_addr_type, (const unsigned char*)query.ifr_addr.sa_data, mac_addr_length);
+ }
+#endif
+ }
+
+ switch (entry->ifr_addr.sa_family) {
+ case AF_INET: {
+ // primary address
+ NPT_IpAddress primary_address(ntohl(((struct sockaddr_in*)&entry->ifr_addr)->sin_addr.s_addr));
+
+ // broadcast address
+ NPT_IpAddress broadcast_address;
+#if defined(SIOCGIFBRDADDR)
+ if (flags & NPT_NETWORK_INTERFACE_FLAG_BROADCAST) {
+ if (ioctl(net, SIOCGIFBRDADDR, &query) == 0) {
+ broadcast_address.Set(ntohl(((struct sockaddr_in*)&query.ifr_addr)->sin_addr.s_addr));
+ }
+ }
+#endif
+
+ // point to point address
+ NPT_IpAddress destination_address;
+#if defined(SIOCGIFDSTADDR)
+ if (flags & NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT) {
+ if (ioctl(net, SIOCGIFDSTADDR, &query) == 0) {
+ destination_address.Set(ntohl(((struct sockaddr_in*)&query.ifr_addr)->sin_addr.s_addr));
+ }
+ }
+#endif
+
+ // netmask
+ NPT_IpAddress netmask(0xFFFFFFFF);
+#if defined(SIOCGIFNETMASK)
+ if (ioctl(net, SIOCGIFNETMASK, &query) == 0) {
+ netmask.Set(ntohl(((struct sockaddr_in*)&query.ifr_addr)->sin_addr.s_addr));
+ }
+#endif
+
+ // add the address to the interface
+ NPT_NetworkInterfaceAddress iface_address(
+ primary_address,
+ broadcast_address,
+ destination_address,
+ netmask);
+ interface->AddAddress(iface_address);
+
+ break;
+ }
+
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ case AF_INET6: {
+ // primary address
+ const struct sockaddr_in6* ipv6_address = (const struct sockaddr_in6*)&entry->ifr_addr;
+ NPT_IpAddress primary_address(NPT_IpAddress::IPV6, ipv6_address->sin6_addr.s6_addr, 16, ipv6_address->sin6_scope_id);
+
+ // empty broadcast address (no broadcast address for IPv6)
+ NPT_IpAddress broadcast_address(NPT_IpAddress::IPV6);
+
+ // point to point address
+ NPT_IpAddress destination_address(NPT_IpAddress::IPV6);
+#if defined(SIOCGIFDSTADDR)
+ if (flags & NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT) {
+ if (ioctl(net, SIOCGIFDSTADDR, &query) == 0) {
+ ipv6_address = (const struct sockaddr_in6*)&query.ifr_addr;
+ destination_address.Set(ipv6_address->sin6_addr.s6_addr, 16, ipv6_address->sin6_scope_id);
+ }
+ }
+#endif
+
+ // empty netmask (does not work for IPv6)
+ NPT_IpAddress netmask((NPT_IpAddress::IPV6));
+
+ // add the address to the interface
+ NPT_NetworkInterfaceAddress iface_address(
+ primary_address,
+ broadcast_address,
+ destination_address,
+ netmask);
+ interface->AddAddress(iface_address);
+
+ break;
+ }
+#endif
+
+#if defined(AF_LINK) && defined(NPT_CONFIG_HAVE_SOCKADDR_DL)
+ case AF_LINK: {
+ struct sockaddr_dl* mac_addr = (struct sockaddr_dl*)&entry->ifr_addr;
+ NPT_MacAddress::Type mac_addr_type = NPT_MacAddress::TYPE_UNKNOWN;
+ switch (mac_addr->sdl_type) {
+#if defined(IFT_LOOP)
+ case IFT_LOOP: mac_addr_type = NPT_MacAddress::TYPE_LOOPBACK; break;
+#endif
+#if defined(IFT_ETHER)
+ case IFT_ETHER: mac_addr_type = NPT_MacAddress::TYPE_ETHERNET; break;
+#endif
+#if defined(IFT_PPP)
+ case IFT_PPP: mac_addr_type = NPT_MacAddress::TYPE_PPP; break;
+#endif
+ }
+ interface->SetMacAddress(mac_addr_type,
+ (const unsigned char*)(&mac_addr->sdl_data[mac_addr->sdl_nlen]),
+ mac_addr->sdl_alen);
+ break;
+ }
+#endif
+ }
+ }
+
+ // free resources
+ delete[] buffer;
+ close(net);
+
+ return NPT_SUCCESS;
+}
+#endif
diff --git a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdResolver.cpp b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdResolver.cpp
new file mode 100644
index 0000000..62e540f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdResolver.cpp
@@ -0,0 +1,137 @@
+/*****************************************************************
+|
+| Neptune - Network :: BSD Implementation
+|
+| (c) 2001-2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#if (defined(_WIN32) || defined(_WIN32_WCE) || defined(_XBOX)) && !defined(__SYMBIAN32__)
+#if !defined(__WINSOCK__)
+#define __WINSOCK__
+#endif
+#endif
+
+#if defined(__WINSOCK__) && !defined(_XBOX)
+#define STRICT
+#define NPT_WIN32_USE_WINSOCK2
+#ifdef NPT_WIN32_USE_WINSOCK2
+/* it is important to include this in this order, because winsock.h and ws2tcpip.h */
+/* have different definitions for the same preprocessor symbols, such as IP_ADD_MEMBERSHIP */
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <winsock.h>
+#endif
+#include <windows.h>
+
+// force a reference to the initializer so that the linker does not optimize it out
+#include "NptWin32Network.h" // we need this for the static initializer
+static NPT_WinsockSystem& WinsockInitializer = NPT_WinsockSystem::Initializer;
+
+#else
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <errno.h>
+
+#endif
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptNetwork.h"
+#include "NptUtils.h"
+#include "NptConstants.h"
+#include "NptResults.h"
+#include "NptSockets.h"
+
+#if defined(NPT_CONFIG_HAVE_GETADDRINFO)
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const unsigned int NPT_BSD_NETWORK_MAX_ADDR_LIST_LENGTH = 1024;
+
+/*----------------------------------------------------------------------
+| IPv6 support
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+#include <arpa/inet.h>
+#endif
+
+/*----------------------------------------------------------------------
+| MapGetAddrInfoErrorCode
++---------------------------------------------------------------------*/
+static NPT_Result
+MapGetAddrInfoErrorCode(int /*error_code*/)
+{
+ return NPT_ERROR_HOST_UNKNOWN;
+}
+
+/*----------------------------------------------------------------------
+| NPT_NetworkNameResolver::Resolve
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkNameResolver::Resolve(const char* name,
+ NPT_List<NPT_IpAddress>& addresses,
+ NPT_Timeout /*timeout*/)
+{
+ // empty the list first
+ addresses.Clear();
+
+
+ // get the addr list
+
+ //struct addrinfo hints;
+ //NPT_SetMemory(&hints, 0, sizeof(hints));
+ //hints.ai_family = PF_UNSPEC;
+ //hints.ai_socktype = SOCK_STREAM;
+ //hints.ai_flags = AI_DEFAULT;
+ struct addrinfo *infos = NULL;
+ int result = getaddrinfo(name, /* hostname */
+ NULL, /* servname */
+ NULL, /* hints */
+ &infos /* res */);
+ if (result != 0) {
+ return MapGetAddrInfoErrorCode(result);
+ }
+
+ for (struct addrinfo* info = infos;
+ info && addresses.GetItemCount() < NPT_BSD_NETWORK_MAX_ADDR_LIST_LENGTH;
+ info = info->ai_next) {
+ unsigned int expected_length;
+ if (info->ai_family == AF_INET) {
+ expected_length = sizeof(struct sockaddr_in);
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ } else if (info->ai_family == AF_INET6) {
+ expected_length = sizeof(struct sockaddr_in6);
+#endif
+ } else {
+ continue;
+ }
+ if ((unsigned int)info->ai_addrlen < expected_length) continue;
+ if (info->ai_protocol != 0 && info->ai_protocol != IPPROTO_TCP) continue;
+
+ if (info->ai_family == AF_INET) {
+ struct sockaddr_in* inet_addr = (struct sockaddr_in*)info->ai_addr;
+ NPT_IpAddress address(ntohl(inet_addr->sin_addr.s_addr));
+ addresses.Add(address);
+ }
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ else if (info->ai_family == AF_INET6) {
+ struct sockaddr_in6* inet_addr = (struct sockaddr_in6*)info->ai_addr;
+ NPT_IpAddress address(NPT_IpAddress::IPV6, inet_addr->sin6_addr.s6_addr, 16, inet_addr->sin6_scope_id);
+ addresses.Add(address);
+ }
+#endif
+ }
+ freeaddrinfo(infos);
+
+ return NPT_SUCCESS;
+}
+#endif
diff --git a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
new file mode 100644
index 0000000..063be46
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
@@ -0,0 +1,2337 @@
+/*****************************************************************
+|
+| Neptune - Sockets :: BSD/Winsock Implementation
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#if (defined(_WIN32) || defined(_WIN32_WCE) || defined(_XBOX)) && !defined(__SYMBIAN32__)
+#if !defined(__WINSOCK__)
+#define __WINSOCK__
+#endif
+#endif
+
+#if defined(__WINSOCK__) && !defined(_XBOX)
+#define STRICT
+#define NPT_WIN32_USE_WINSOCK2
+#ifdef NPT_WIN32_USE_WINSOCK2
+/* it is important to include this in this order, because winsock.h and ws2tcpip.h */
+/* have different definitions for the same preprocessor symbols, such as IP_ADD_MEMBERSHIP */
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <winsock.h>
+#endif
+#include <windows.h>
+
+// XBox
+#elif defined(_XBOX)
+#include <xtl.h>
+#include <winsockx.h>
+
+#elif defined(__TCS__)
+
+// Trimedia includes
+#include <sockets.h>
+
+#elif defined(__PSP__)
+
+// PSP includes
+#include <psptypes.h>
+#include <kernel.h>
+#include <pspnet.h>
+#include <pspnet_error.h>
+#include <pspnet_inet.h>
+#include <pspnet_resolver.h>
+#include <pspnet_apctl.h>
+#include <pspnet_ap_dialog_dummy.h>
+#include <errno.h>
+#include <wlan.h>
+#include <pspnet/sys/socket.h>
+#include <pspnet/sys/select.h>
+#include <pspnet/netinet/in.h>
+
+#elif defined(__PPU__)
+
+// PS3 includes
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/select.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <netdb.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <netex/net.h>
+#include <netex/errno.h>
+
+#else
+
+// default includes
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#if !defined(__SYMBIAN32__)
+#include <netinet/tcp.h>
+#endif
+#include <netdb.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <signal.h>
+
+#endif
+
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptStreams.h"
+#include "NptThreads.h"
+#include "NptSockets.h"
+#include "NptUtils.h"
+#include "NptConstants.h"
+#include "NptLogging.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.sockets.bsd")
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_TCP_SERVER_SOCKET_DEFAULT_LISTEN_COUNT = 20;
+
+/*----------------------------------------------------------------------
+| WinSock adaptation layer
++---------------------------------------------------------------------*/
+#if defined(__WINSOCK__)
+#if defined(_XBOX)
+#include "NptXboxNetwork.h"
+#define SO_ERROR 0x1007 /* unsupported */
+#else
+#include "NptWin32Network.h"
+#endif
+// force a reference to the initializer so that the linker does not optimize it out
+static NPT_WinsockSystem& WinsockInitializer = NPT_WinsockSystem::Initializer;
+
+#if defined(SetPort)
+#undef SetPort
+#endif
+
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#define EINPROGRESS WSAEINPROGRESS
+#define ECONNREFUSED WSAECONNREFUSED
+#define ECONNABORTED WSAECONNABORTED
+#define ECONNRESET WSAECONNRESET
+#define ETIMEDOUT WSAETIMEDOUT
+#define ENETRESET WSAENETRESET
+#define EADDRINUSE WSAEADDRINUSE
+#define ENETDOWN WSAENETDOWN
+#define ENETUNREACH WSAENETUNREACH
+#define ENOTCONN WSAENOTCONN
+#if !defined(EAGAIN)
+#define EAGAIN WSAEWOULDBLOCK
+#define EINTR WSAEINTR
+#endif
+#if !defined(SHUT_RDWR)
+#define SHUT_RDWR SD_BOTH
+#endif
+
+#if !defined(__MINGW32__)
+typedef int ssize_t;
+#endif
+typedef int socklen_t;
+typedef char* SocketBuffer;
+typedef const char* SocketConstBuffer;
+typedef char* SocketOption;
+typedef SOCKET SocketFd;
+
+#define GetSocketError() WSAGetLastError()
+#define NPT_BSD_SOCKET_IS_INVALID(_s) ((_s) == INVALID_SOCKET)
+#define NPT_BSD_SOCKET_CALL_FAILED(_e) ((_e) == SOCKET_ERROR)
+#define NPT_BSD_SOCKET_SELECT_FAILED(_e) ((_e) == SOCKET_ERROR)
+#define NPT_BSD_SOCKET_INVALID_HANDLE INVALID_SOCKET
+
+/*----------------------------------------------------------------------
+| Trimedia adaptation layer
++---------------------------------------------------------------------*/
+#elif defined(__TCS__) // trimedia PSOS w/ Target TCP
+typedef void* SocketBuffer;
+typedef const void* SocketConstBuffer;
+typedef void* SocketOption;
+typedef int SocketFd;
+
+#define GetSocketError() errno
+#define NPT_BSD_SOCKET_IS_INVALID(_s) ((_s) < 0)
+#define NPT_BSD_SOCKET_CALL_FAILED(_e) ((_e) < 0)
+#define NPT_BSD_SOCKET_SELECT_FAILED(_e) ((_e) < 0)
+#define NPT_BSD_SOCKET_INVALID_HANDLE (-1)
+
+/*----------------------------------------------------------------------
+| PSP adaptation layer
++---------------------------------------------------------------------*/
+#elif defined(__PSP__)
+typedef SceNetInetSocklen_t socklen_t;
+#define timeval SceNetInetTimeval
+#define inet_addr sceNetInetInetAddr
+#define select sceNetInetSelect
+#define socket sceNetInetSocket
+#define connect sceNetInetConnect
+#define bind sceNetInetBind
+#define accept sceNetInetAccept
+#define getpeername sceNetInetGetpeername
+#define getsockopt sceNetInetGetsockopt
+#define setsockopt sceNetInetSetsockopt
+#define listen sceNetInetListen
+#define getsockname sceNetInetGetsockname
+#define sockaddr SceNetInetSockaddr
+#define sockaddr_in SceNetInetSockaddrIn
+#define in_addr SceNetInetInAddr
+#define send sceNetInetSend
+#define sendto sceNetInetSendto
+#define recv sceNetInetRecv
+#define recvfrom sceNetInetRecvfrom
+#define closesocket sceNetInetClose
+#define htonl sceNetHtonl
+#define htons sceNetHtons
+#define ntohl sceNetNtohl
+#define ntohs sceNetNtohs
+#define SOL_SOCKET SCE_NET_INET_SOL_SOCKET
+#define AF_INET SCE_NET_INET_AF_INET
+#define SOCK_STREAM SCE_NET_INET_SOCK_STREAM
+#define SOCK_DGRAM SCE_NET_INET_SOCK_DGRAM
+#define SO_BROADCAST SCE_NET_INET_SO_BROADCAST
+#define SO_ERROR SCE_NET_INET_SO_ERROR
+#define IPPROTO_IP SCE_NET_INET_IPPROTO_IP
+#define IP_ADD_MEMBERSHIP SCE_NET_INET_IP_ADD_MEMBERSHIP
+#define IP_MULTICAST_IF SCE_NET_INET_IP_MULTICAST_IF
+#define IP_MULTICAST_TTL SCE_NET_INET_IP_MULTICAST_TTL
+#define SO_REUSEADDR SCE_NET_INET_SO_REUSEADDR
+#define INADDR_ANY SCE_NET_INET_INADDR_ANY
+#define ip_mreq SceNetInetIpMreq
+#ifdef fd_set
+#undef fd_set
+#endif
+#define fd_set SceNetInetFdSet
+#ifdef FD_ZERO
+#undef FD_ZERO
+#endif
+#define FD_ZERO SceNetInetFD_ZERO
+#ifdef FD_SET
+#undef FD_SET
+#endif
+#define FD_SET SceNetInetFD_SET
+#ifdef FD_CLR
+#undef FD_CLR
+#endif
+#define FD_CLR SceNetInetFD_CLR
+#ifdef FD_ISSET
+#undef FD_ISSET
+#endif
+#define FD_ISSET SceNetInetFD_ISSET
+
+#define RESOLVER_TIMEOUT (5 * 1000 * 1000)
+#define RESOLVER_RETRY 5
+
+typedef void* SocketBuffer;
+typedef const void* SocketConstBuffer;
+typedef void* SocketOption;
+typedef int SocketFd;
+
+#define GetSocketError() sceNetInetGetErrno()
+#define NPT_BSD_SOCKET_IS_INVALID(_s) ((_s) < 0)
+#define NPT_BSD_SOCKET_CALL_FAILED(_e) ((_e) < 0)
+#define NPT_BSD_SOCKET_SELECT_FAILED(_e) ((_e) < 0)
+#define NPT_BSD_SOCKET_INVALID_HANDLE (-1)
+
+/*----------------------------------------------------------------------
+| PS3 adaptation layer
++---------------------------------------------------------------------*/
+#elif defined(__PPU__)
+#undef EWOULDBLOCK
+#undef ECONNREFUSED
+#undef ECONNABORTED
+#undef ECONNRESET
+#undef ETIMEDOUT
+#undef ENETRESET
+#undef EADDRINUSE
+#undef ENETDOWN
+#undef ENETUNREACH
+#undef EAGAIN
+#undef EINTR
+#undef EINPROGRESS
+
+#define EWOULDBLOCK SYS_NET_EWOULDBLOCK
+#define ECONNREFUSED SYS_NET_ECONNREFUSED
+#define ECONNABORTED SYS_NET_ECONNABORTED
+#define ECONNRESET SYS_NET_ECONNRESET
+#define ETIMEDOUT SYS_NET_ETIMEDOUT
+#define ENETRESET SYS_NET_ENETRESET
+#define EADDRINUSE SYS_NET_EADDRINUSE
+#define ENETDOWN SYS_NET_ENETDOWN
+#define ENETUNREACH SYS_NET_ENETUNREACH
+#define EAGAIN SYS_NET_EAGAIN
+#define EINTR SYS_NET_EINTR
+#define EINPROGRESS SYS_NET_EINPROGRESS
+
+typedef void* SocketBuffer;
+typedef const void* SocketConstBuffer;
+typedef void* SocketOption;
+typedef int SocketFd;
+
+#define closesocket socketclose
+#define select socketselect
+
+#define GetSocketError() sys_net_errno
+#define NPT_BSD_SOCKET_IS_INVALID(_s) ((_s) < 0)
+#define NPT_BSD_SOCKET_CALL_FAILED(_e) ((_e) < 0)
+#define NPT_BSD_SOCKET_SELECT_FAILED(_e) ((_e) < 0)
+#define NPT_BSD_SOCKET_INVALID_HANDLE (-1)
+
+// network initializer
+static struct NPT_Ps3NetworkInitializer {
+ NPT_Ps3NetworkInitializer() {
+ sys_net_initialize_network();
+ }
+ ~NPT_Ps3NetworkInitializer() {
+ sys_net_finalize_network();
+ }
+} Ps3NetworkInitializer;
+
+/*----------------------------------------------------------------------
+| Default adaptation layer
++---------------------------------------------------------------------*/
+#else
+typedef void* SocketBuffer;
+typedef const void* SocketConstBuffer;
+typedef void* SocketOption;
+typedef int SocketFd;
+
+#define closesocket close
+#define ioctlsocket ioctl
+
+#define GetSocketError() errno
+#define NPT_BSD_SOCKET_IS_INVALID(_s) ((_s) < 0)
+#define NPT_BSD_SOCKET_CALL_FAILED(_e) ((_e) < 0)
+#define NPT_BSD_SOCKET_SELECT_FAILED(_e) ((_e) < 0)
+#define NPT_BSD_SOCKET_INVALID_HANDLE (-1)
+
+#endif
+
+/*----------------------------------------------------------------------
+| IPv6 support
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+#include <arpa/inet.h>
+
+#define NPT_SOCKETS_PF_INET PF_INET6
+typedef union {
+ struct sockaddr sa;
+ struct sockaddr_in sa_in;
+ struct sockaddr_in6 sa_in6;
+ struct sockaddr_storage sa_storage;
+} NPT_sockaddr_in;
+
+#else
+
+#define NPT_SOCKETS_PF_INET PF_INET
+typedef union {
+ struct sockaddr sa;
+ struct sockaddr_in sa_in;
+} NPT_sockaddr_in;
+
+#endif
+
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+/*----------------------------------------------------------------------
+| SocketAddressToInetAddress
++---------------------------------------------------------------------*/
+static void
+SocketAddressToInetAddress(const NPT_SocketAddress& socket_address,
+ NPT_sockaddr_in& inet_address,
+ socklen_t& inet_address_length)
+{
+ // initialize the structure
+ NPT_SetMemory(&inet_address, 0, sizeof(inet_address));
+
+ // setup the structure
+ inet_address_length = sizeof(sockaddr_in6);
+ inet_address.sa_in6.sin6_len = inet_address_length;
+ inet_address.sa_in6.sin6_family = AF_INET6;
+ inet_address.sa_in6.sin6_port = htons(socket_address.GetPort());
+ inet_address.sa_in6.sin6_scope_id = socket_address.GetIpAddress().GetScopeId();
+
+ NPT_IpAddress::Type type = socket_address.GetIpAddress().GetType();
+ if (type == NPT_IpAddress::IPV6) {
+ NPT_CopyMemory(inet_address.sa_in6.sin6_addr.s6_addr, socket_address.GetIpAddress().AsBytes(), 16);
+ } else {
+ NPT_SetMemory(&inet_address.sa_in6.sin6_addr.s6_addr[0], 0, 10);
+ inet_address.sa_in6.sin6_addr.s6_addr[10] = 0xFF;
+ inet_address.sa_in6.sin6_addr.s6_addr[11] = 0xFF;
+ NPT_CopyMemory(&inet_address.sa_in6.sin6_addr.s6_addr[12], socket_address.GetIpAddress().AsBytes(), 4);
+ }
+}
+
+/*----------------------------------------------------------------------
+| InetAddressToSocketAddress
++---------------------------------------------------------------------*/
+static void
+InetAddressToSocketAddress(const NPT_sockaddr_in& inet_address,
+ NPT_SocketAddress& socket_address)
+{
+ // setup the structure
+ socket_address.SetPort(inet_address.sa_in6.sin6_port);
+ if (inet_address.sa.sa_family == AF_INET6) {
+ socket_address.SetPort(ntohs(inet_address.sa_in6.sin6_port));
+ socket_address.SetIpAddress(NPT_IpAddress(NPT_IpAddress::IPV6, inet_address.sa_in6.sin6_addr.s6_addr, 16));
+ } else {
+ socket_address.SetPort(ntohs(inet_address.sa_in.sin_port));
+ socket_address.SetIpAddress(NPT_IpAddress(ntohl(inet_address.sa_in.sin_addr.s_addr)));
+ }
+}
+#else
+/*----------------------------------------------------------------------
+| SocketAddressToInetAddress
++---------------------------------------------------------------------*/
+static void
+SocketAddressToInetAddress(const NPT_SocketAddress& socket_address,
+ NPT_sockaddr_in& inet_address,
+ socklen_t& inet_address_length)
+{
+ // initialize the structure
+ NPT_SetMemory(&inet_address, 0, sizeof(inet_address));
+ inet_address_length = sizeof(sockaddr_in);
+
+#if defined(NPT_CONFIG_HAVE_SOCKADDR_IN_SIN_LEN)
+ inet_address.sa_in.sin_len = sizeof(inet_address);
+#endif
+
+ // setup the structure
+ inet_address.sa_in.sin_family = AF_INET;
+ inet_address.sa_in.sin_port = htons(socket_address.GetPort());
+ inet_address.sa_in.sin_addr.s_addr = htonl(socket_address.GetIpAddress().AsLong());
+}
+
+/*----------------------------------------------------------------------
+| InetAddressToSocketAddress
++---------------------------------------------------------------------*/
+static void
+InetAddressToSocketAddress(const NPT_sockaddr_in& inet_address,
+ NPT_SocketAddress& socket_address)
+{
+ socket_address.SetPort(ntohs(inet_address.sa_in.sin_port));
+ socket_address.SetIpAddress(NPT_IpAddress(ntohl(inet_address.sa_in.sin_addr.s_addr)));
+}
+#endif
+
+/*----------------------------------------------------------------------
+| MapErrorCode
++---------------------------------------------------------------------*/
+static NPT_Result
+MapErrorCode(int error)
+{
+ switch (error) {
+ case ECONNRESET:
+ case ENETRESET:
+ return NPT_ERROR_CONNECTION_RESET;
+
+ case ECONNABORTED:
+ return NPT_ERROR_CONNECTION_ABORTED;
+
+ case ECONNREFUSED:
+ return NPT_ERROR_CONNECTION_REFUSED;
+
+ case ETIMEDOUT:
+ return NPT_ERROR_TIMEOUT;
+
+ case EADDRINUSE:
+ return NPT_ERROR_ADDRESS_IN_USE;
+
+ case ENETDOWN:
+ return NPT_ERROR_NETWORK_DOWN;
+
+ case ENETUNREACH:
+ return NPT_ERROR_NETWORK_UNREACHABLE;
+
+ case EHOSTUNREACH:
+ return NPT_ERROR_HOST_UNREACHABLE;
+
+ case EINPROGRESS:
+ case EAGAIN:
+#if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
+ case EWOULDBLOCK:
+#endif
+ return NPT_ERROR_WOULD_BLOCK;
+
+#if defined(EPIPE)
+ case EPIPE:
+ return NPT_ERROR_CONNECTION_RESET;
+#endif
+
+#if defined(ENOTCONN)
+ case ENOTCONN:
+ return NPT_ERROR_NOT_CONNECTED;
+#endif
+
+#if defined(EINTR)
+ case EINTR:
+ return NPT_ERROR_INTERRUPTED;
+#endif
+
+#if defined(EACCES)
+ case EACCES:
+ return NPT_ERROR_PERMISSION_DENIED;
+#endif
+
+ default:
+ return NPT_ERROR_ERRNO(error);
+ }
+}
+
+#if defined(_XBOX)
+
+struct hostent {
+ char * h_name; /* official name of host */
+ char * * h_aliases; /* alias list */
+ short h_addrtype; /* host address type */
+ short h_length; /* length of address */
+ char * * h_addr_list; /* list of addresses */
+#define h_addr h_addr_list[0] /* address, for backward compat */
+};
+
+typedef struct {
+ struct hostent server;
+ char name[128];
+ char addr[16];
+ char* addr_list[4];
+} HostEnt;
+
+/*----------------------------------------------------------------------
+| gethostbyname
++---------------------------------------------------------------------*/
+static struct hostent*
+gethostbyname(const char* name)
+{
+ struct hostent* host = NULL;
+ HostEnt* host_entry = new HostEnt;
+ WSAEVENT hEvent = WSACreateEvent();
+ XNDNS* pDns = NULL;
+
+ INT err = XNetDnsLookup(name, hEvent, &pDns);
+ WaitForSingleObject(hEvent, INFINITE);
+ if (pDns) {
+ if (pDns->iStatus == 0) {
+ strcpy(host_entry->name, name);
+ host_entry->addr_list[0] = host_entry->addr;
+ memcpy(host_entry->addr, &(pDns->aina[0].s_addr), 4);
+ host_entry->server.h_name = host_entry->name;
+ host_entry->server.h_aliases = 0;
+ host_entry->server.h_addrtype = AF_INET;
+ host_entry->server.h_length = 4;
+ host_entry->server.h_addr_list = new char*[4];
+
+ host_entry->server.h_addr_list[0] = host_entry->addr_list[0];
+ host_entry->server.h_addr_list[1] = 0;
+
+ host = (struct hostent*)host_entry;
+ }
+ XNetDnsRelease(pDns);
+ }
+ WSACloseEvent(hEvent);
+ return host;
+};
+
+#endif // _XBOX
+
+#if defined(__WINSOCK__)
+/*----------------------------------------------------------------------
+| socketpair
++---------------------------------------------------------------------*/
+static int
+socketpair(int, int, int, SOCKET sockets[2]) // we ignore the first two params: we only use this for a strictly limited case
+{
+ int result = 0;
+ socklen_t name_length = 0;
+ int reuse = 1;
+
+ // initialize with default values
+ sockets[0] = INVALID_SOCKET;
+ sockets[1] = INVALID_SOCKET;
+
+ // create a listener socket and bind to the loopback address, any port
+ SOCKET listener = socket(PF_INET, SOCK_STREAM, 0);
+ if (listener == INVALID_SOCKET) goto fail;
+
+ // bind the listener and listen for connections
+ struct sockaddr_in inet_address;
+ memset(&inet_address, 0, sizeof(inet_address));
+ inet_address.sin_family = AF_INET;
+ inet_address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse));
+ result = bind(listener, (const sockaddr*)&inet_address, sizeof(inet_address));
+ if (result != 0) goto fail;
+ listen(listener, 1);
+
+ // read the port that was assigned to the listener socket
+ name_length = sizeof(inet_address);
+ result = getsockname(listener, (struct sockaddr*)&inet_address, &name_length);
+ if (result != 0) goto fail;
+
+ // create the first socket
+ sockets[0] = socket(PF_INET, SOCK_STREAM, 0);
+ if (sockets[0] == INVALID_SOCKET) goto fail;
+
+ // connect the first socket
+ result = connect(sockets[0], (const sockaddr*)&inet_address, sizeof(inet_address));
+ if (result != 0) goto fail;
+
+ // accept the connection, resulting in the second socket
+ name_length = sizeof(inet_address);
+ sockets[1] = accept(listener, (sockaddr*)&inet_address, &name_length);
+ if (result != 0) goto fail;
+
+ // we don't need the listener anymore
+ closesocket(listener);
+ return 0;
+
+fail:
+ result = MapErrorCode(GetSocketError());
+ if (listener != INVALID_SOCKET) closesocket(listener);
+ if (sockets[0] != INVALID_SOCKET) closesocket(sockets[0]);
+ if (sockets[1] != INVALID_SOCKET) closesocket(sockets[1]);
+ sockets[0] = sockets[1] = INVALID_SOCKET;
+ return result;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_Hash<NPT_Thread::ThreadId>
++---------------------------------------------------------------------*/
+template <>
+struct NPT_Hash<NPT_Thread::ThreadId>
+{
+ NPT_UInt32 operator()(NPT_Thread::ThreadId id) const {
+ return (NPT_UInt32)(id & 0xFFFFFFFF);
+ }
+};
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::ResolveName
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_IpAddress::ResolveName(const char* name, NPT_Timeout)
+{
+ // check parameters
+ if (name == NULL || name[0] == '\0') return NPT_ERROR_HOST_UNKNOWN;
+
+#if !defined(NPT_CONFIG_ENABLE_IPV6)
+ // handle numerical addrs
+ NPT_IpAddress numerical_address;
+ if (NPT_SUCCEEDED(numerical_address.Parse(name))) {
+ /* the name is a numerical IP addr */
+ *this = numerical_address;
+ return NPT_SUCCESS;
+ }
+#endif
+
+ // resolve the name into a list of addresses
+ NPT_List<NPT_IpAddress> addresses;
+ NPT_Result result = NPT_NetworkNameResolver::Resolve(name, addresses);
+ if (NPT_FAILED(result)) return result;
+ if (addresses.GetItemCount() < 1) {
+ return NPT_ERROR_NO_SUCH_NAME;
+ }
+
+ // pick the first address
+ *this = *(addresses.GetFirstItem());
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketFd
++---------------------------------------------------------------------*/
+class NPT_BsdSocketFd
+{
+public:
+ // constructors and destructor
+ NPT_BsdSocketFd(SocketFd fd, NPT_Flags flags) :
+ m_SocketFd(fd),
+ m_ReadTimeout(NPT_TIMEOUT_INFINITE),
+ m_WriteTimeout(NPT_TIMEOUT_INFINITE),
+ m_Position(0),
+ m_Cancelled(false),
+ m_Cancellable((flags & NPT_SOCKET_FLAG_CANCELLABLE) != 0) {
+ // always use non-blocking mode
+ SetBlockingMode(false);
+
+ // cancellation support
+ if (flags & NPT_SOCKET_FLAG_CANCELLABLE) {
+ int result = socketpair(AF_UNIX, SOCK_DGRAM, 0, m_CancelFds);
+ if (result != 0) {
+ NPT_LOG_WARNING_1("socketpair failed (%d)", GetSocketError());
+ m_CancelFds[0] = m_CancelFds[1] = -1;
+ m_Cancellable = false;
+ }
+ } else {
+ m_CancelFds[0] = m_CancelFds[1] = NPT_BSD_SOCKET_INVALID_HANDLE;
+ }
+ }
+ ~NPT_BsdSocketFd() {
+ if (m_Cancellable) {
+ if (!NPT_BSD_SOCKET_IS_INVALID(m_CancelFds[0])) closesocket(m_CancelFds[0]);
+ if (!NPT_BSD_SOCKET_IS_INVALID(m_CancelFds[1])) closesocket(m_CancelFds[1]);
+ }
+ closesocket(m_SocketFd);
+ }
+
+ // methods
+ NPT_Result SetBlockingMode(bool blocking);
+ NPT_Result WaitUntilReadable();
+ NPT_Result WaitUntilWriteable();
+ NPT_Result WaitForCondition(bool readable, bool writeable, bool async_connect, NPT_Timeout timeout);
+ NPT_Result Cancel(bool do_shutdown);
+
+ // members
+ SocketFd m_SocketFd;
+ NPT_Timeout m_ReadTimeout;
+ NPT_Timeout m_WriteTimeout;
+ NPT_Position m_Position;
+ volatile bool m_Cancelled;
+ bool m_Cancellable;
+ SocketFd m_CancelFds[2];
+
+private:
+ // methods
+ friend class NPT_BsdTcpServerSocket;
+ friend class NPT_BsdTcpClientSocket;
+};
+
+typedef NPT_Reference<NPT_BsdSocketFd> NPT_BsdSocketFdReference;
+
+/*----------------------------------------------------------------------
+| NPT_BsdBlockerSocket
++---------------------------------------------------------------------*/
+class NPT_BsdBlockerSocket {
+public:
+ NPT_BsdBlockerSocket(NPT_BsdSocketFd* fd) {
+ Set(NPT_Thread::GetCurrentThreadId(), fd);
+ }
+ ~NPT_BsdBlockerSocket() {
+ Set(NPT_Thread::GetCurrentThreadId(), NULL);
+ }
+
+ static NPT_Result Cancel(NPT_Thread::ThreadId id);
+
+private:
+ static NPT_Result Set(NPT_Thread::ThreadId id, NPT_BsdSocketFd* fd);
+
+ static NPT_Mutex MapLock;
+ static NPT_HashMap<NPT_Thread::ThreadId, NPT_BsdSocketFd*> Map;
+};
+
+/*----------------------------------------------------------------------
+| NPT_BsdBlockerSocket::MapLock
++---------------------------------------------------------------------*/
+NPT_Mutex NPT_BsdBlockerSocket::MapLock;
+
+/*----------------------------------------------------------------------
+| NPT_BsdBlockerSocket::Map
++---------------------------------------------------------------------*/
+NPT_HashMap<NPT_Thread::ThreadId, NPT_BsdSocketFd*> NPT_BsdBlockerSocket::Map;
+
+/*----------------------------------------------------------------------
+| NPT_BsdBlockerSocket::Set
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdBlockerSocket::Set(NPT_Thread::ThreadId id, NPT_BsdSocketFd* fd)
+{
+ NPT_AutoLock synchronized(MapLock);
+
+ if (fd) {
+ return Map.Put(id, fd);
+ } else {
+ return Map.Erase(id);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdBlockerSocket::Cancel
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdBlockerSocket::Cancel(NPT_Thread::ThreadId id)
+{
+ NPT_AutoLock synchronized(MapLock);
+
+ NPT_BsdSocketFd** fd = NULL;
+ NPT_Result result = Map.Get(id, fd);
+ if (NPT_SUCCEEDED(result) && fd && *fd) {
+ (*fd)->Cancel(true);
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Socket::CancelBlockerSocket
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Socket::CancelBlockerSocket(NPT_Thread::ThreadId thread_id)
+{
+ return NPT_BsdBlockerSocket::Cancel(thread_id);
+}
+
+
+#if defined(__WINSOCK__) || defined(__TCS__)
+/*----------------------------------------------------------------------
+| NPT_BsdSocketFd::SetBlockingMode
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketFd::SetBlockingMode(bool blocking)
+{
+ unsigned long args = blocking?0:1;
+ if (ioctlsocket(m_SocketFd, FIONBIO, &args)) {
+ return NPT_ERROR_SOCKET_CONTROL_FAILED;
+ }
+ return NPT_SUCCESS;
+}
+#elif defined(__PSP__) || defined(__PPU__)
+/*----------------------------------------------------------------------
+| NPT_BsdSocketFd::SetBlockingMode
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketFd::SetBlockingMode(bool blocking)
+{
+ int args = blocking?0:1;
+ if (setsockopt(m_SocketFd, SOL_SOCKET, SO_NBIO, &args, sizeof(args))) {
+ return NPT_ERROR_SOCKET_CONTROL_FAILED;
+ }
+ return NPT_SUCCESS;
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_BsdSocketFd::SetBlockingMode
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketFd::SetBlockingMode(bool blocking)
+{
+ int flags = fcntl(m_SocketFd, F_GETFL, 0);
+ if (blocking) {
+ flags &= ~O_NONBLOCK;
+ } else {
+ flags |= O_NONBLOCK;
+ }
+ if (fcntl(m_SocketFd, F_SETFL, flags)) {
+ return NPT_ERROR_SOCKET_CONTROL_FAILED;
+ }
+ return NPT_SUCCESS;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketFd::WaitUntilReadable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketFd::WaitUntilReadable()
+{
+ return WaitForCondition(true, false, false, m_ReadTimeout);
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketFd::WaitUntilWriteable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketFd::WaitUntilWriteable()
+{
+ return WaitForCondition(false, true, false, m_WriteTimeout);
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketFd::WaitForCondition
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketFd::WaitForCondition(bool wait_for_readable,
+ bool wait_for_writeable,
+ bool async_connect,
+ NPT_Timeout timeout)
+{
+ // wait for incoming connection
+ NPT_Result result = NPT_SUCCESS;
+ int max_fd = (int)m_SocketFd;
+ fd_set read_set;
+ fd_set write_set;
+ fd_set except_set;
+ FD_ZERO(&read_set);
+ if (wait_for_readable) FD_SET(m_SocketFd, &read_set);
+ FD_ZERO(&write_set);
+ if (wait_for_writeable) FD_SET(m_SocketFd, &write_set);
+ FD_ZERO(&except_set);
+ FD_SET(m_SocketFd, &except_set);
+
+ // if the socket is cancellable, add it to the blocker map so a thread can cancel it
+ NPT_BsdBlockerSocket blocker(this);
+
+ // setup the cancel fd
+ if (m_Cancellable && timeout) {
+ if ((int)m_CancelFds[1] > max_fd) max_fd = m_CancelFds[1];
+ FD_SET(m_CancelFds[1], &read_set);
+ }
+
+ struct timeval timeout_value;
+ if (timeout != NPT_TIMEOUT_INFINITE) {
+ timeout_value.tv_sec = timeout/1000;
+ timeout_value.tv_usec = 1000*(timeout-1000*(timeout/1000));
+ };
+
+ NPT_LOG_FINER_2("waiting for condition (%s %s)",
+ wait_for_readable?"read":"",
+ wait_for_writeable?"write":"");
+ int io_result;
+ do {
+ io_result = select(max_fd+1,
+ &read_set, &write_set, &except_set,
+ timeout == NPT_TIMEOUT_INFINITE ?
+ NULL : &timeout_value);
+ NPT_LOG_FINER_1("select returned %d", io_result);
+ } while (NPT_BSD_SOCKET_SELECT_FAILED(io_result) && GetSocketError() == EINTR);
+
+ if (m_Cancelled) return NPT_ERROR_CANCELLED;
+
+ if (io_result == 0) {
+ if (timeout == 0) {
+ // non-blocking call
+ result = NPT_ERROR_WOULD_BLOCK;
+ } else {
+ // timeout
+ result = NPT_ERROR_TIMEOUT;
+ }
+ } else if (NPT_BSD_SOCKET_SELECT_FAILED(io_result)) {
+ result = MapErrorCode(GetSocketError());
+ } else if ((wait_for_readable && FD_ISSET(m_SocketFd, &read_set)) ||
+ (wait_for_writeable && FD_ISSET(m_SocketFd, &write_set))) {
+ if (async_connect) {
+ // get error status from socket
+ // (some systems return the error in errno, others
+ // return it in the buffer passed to getsockopt)
+ int error = 0;
+ socklen_t length = sizeof(error);
+ io_result = getsockopt(m_SocketFd,
+ SOL_SOCKET,
+ SO_ERROR,
+ (SocketOption)&error,
+ &length);
+ if (NPT_BSD_SOCKET_CALL_FAILED(io_result)) {
+ result = MapErrorCode(GetSocketError());
+ } else if (error) {
+ result = MapErrorCode(error);
+ } else {
+ result = NPT_SUCCESS;
+ }
+ } else {
+ result = NPT_SUCCESS;
+ }
+ } else if (FD_ISSET(m_SocketFd, &except_set)) {
+ NPT_LOG_FINE("select socket exception is set");
+
+ int error = 0;
+ socklen_t length = sizeof(error);
+ io_result = getsockopt(m_SocketFd,
+ SOL_SOCKET,
+ SO_ERROR,
+ (SocketOption)&error,
+ &length);
+ if (NPT_BSD_SOCKET_CALL_FAILED(io_result)) {
+ result = MapErrorCode(GetSocketError());
+ } else if (error) {
+ result = MapErrorCode(error);
+ } else {
+ result = NPT_FAILURE;
+ }
+ } else {
+ // should not happen
+ NPT_LOG_FINE("unexected select state");
+ result = NPT_ERROR_INTERNAL;
+ }
+
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINER_1("select result = %d", result);
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketFd::Cancel
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketFd::Cancel(bool do_shutdown)
+{
+ // mark the socket as cancelled
+ m_Cancelled = true;
+
+ // force a shutdown if requested
+ if (do_shutdown) {
+ int result = shutdown(m_SocketFd, SHUT_RDWR);
+ if (NPT_BSD_SOCKET_CALL_FAILED(result)) {
+ NPT_LOG_FINE_1("shutdown failed (%d)", MapErrorCode(GetSocketError()));
+ }
+ }
+
+ // unblock waiting selects
+ if (m_Cancellable) {
+ char dummy = 0;
+ send(m_CancelFds[0], &dummy, 1, 0);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketStream
++---------------------------------------------------------------------*/
+class NPT_BsdSocketStream
+{
+ public:
+ // methods
+ NPT_BsdSocketStream(NPT_BsdSocketFdReference& socket_fd) :
+ m_SocketFdReference(socket_fd) {}
+
+ // NPT_InputStream and NPT_OutputStream methods
+ NPT_Result Seek(NPT_Position) { return NPT_ERROR_NOT_SUPPORTED; }
+ NPT_Result Tell(NPT_Position& where) {
+ where = 0;
+ return NPT_SUCCESS;
+ }
+
+ protected:
+ // destructor
+ virtual ~NPT_BsdSocketStream() {}
+
+ // members
+ NPT_BsdSocketFdReference m_SocketFdReference;
+};
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketInputStream
++---------------------------------------------------------------------*/
+class NPT_BsdSocketInputStream : public NPT_InputStream,
+ private NPT_BsdSocketStream
+{
+public:
+ // constructors and destructor
+ NPT_BsdSocketInputStream(NPT_BsdSocketFdReference& socket_fd) :
+ NPT_BsdSocketStream(socket_fd) {}
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read) override;
+ NPT_Result Seek(NPT_Position offset) override {
+ return NPT_BsdSocketStream::Seek(offset); }
+ NPT_Result Tell(NPT_Position& where) override {
+ return NPT_BsdSocketStream::Tell(where);
+ }
+ NPT_Result GetSize(NPT_LargeSize& size) override;
+ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+};
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ // if we're blocking, wait until the socket is readable
+ if (m_SocketFdReference->m_ReadTimeout) {
+ NPT_Result result = m_SocketFdReference->WaitUntilReadable();
+ if (result != NPT_SUCCESS) return result;
+ }
+
+ // read from the socket
+ NPT_LOG_FINEST_1("reading %d from socket", (int)bytes_to_read);
+ ssize_t nb_read = recv(m_SocketFdReference->m_SocketFd,
+ (SocketBuffer)buffer,
+ bytes_to_read, 0);
+ NPT_LOG_FINEST_1("recv returned %d", (int)nb_read);
+
+ if (nb_read <= 0) {
+ if (bytes_read) *bytes_read = 0;
+ if (m_SocketFdReference->m_Cancelled) return NPT_ERROR_CANCELLED;
+
+ if (nb_read == 0) {
+ NPT_LOG_FINE("socket end of stream");
+ return NPT_ERROR_EOS;
+ } else {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("socket result = %d", result);
+ return result;
+ }
+ }
+
+ // update position and return
+ if (bytes_read) *bytes_read = (NPT_Size)nb_read;
+ m_SocketFdReference->m_Position += nb_read;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketInputStream::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketInputStream::GetSize(NPT_LargeSize& size)
+{
+ // generic socket streams have no size
+ size = 0;
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+#if defined(__PPU__)
+/*----------------------------------------------------------------------
+| NPT_BsdSocketInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketInputStream::GetAvailable(NPT_LargeSize&)
+{
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_BsdSocketInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ unsigned long ready = 0;
+ int io_result = ioctlsocket(m_SocketFdReference->m_SocketFd, FIONREAD, &ready);
+ if (NPT_BSD_SOCKET_CALL_FAILED(io_result)) {
+ available = 0;
+ return NPT_ERROR_SOCKET_CONTROL_FAILED;
+ } else {
+ available = ready;
+ if (available == 0) {
+ // check if the socket is disconnected
+ NPT_Result result = m_SocketFdReference->WaitForCondition(true, false, false, 0);
+ if (result == NPT_ERROR_WOULD_BLOCK) {
+ return NPT_SUCCESS;
+ } else {
+ available = 1; // pretend that there's data available
+ }
+ }
+ return NPT_SUCCESS;
+ }
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketOutputStream
++---------------------------------------------------------------------*/
+class NPT_BsdSocketOutputStream : public NPT_OutputStream,
+ private NPT_BsdSocketStream
+{
+public:
+ // constructors and destructor
+ NPT_BsdSocketOutputStream(NPT_BsdSocketFdReference& socket_fd) :
+ NPT_BsdSocketStream(socket_fd) {}
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written) override;
+ NPT_Result Seek(NPT_Position offset) override {
+ return NPT_BsdSocketStream::Seek(offset); }
+ NPT_Result Tell(NPT_Position& where) override {
+ return NPT_BsdSocketStream::Tell(where);
+ }
+ NPT_Result Flush() override;
+};
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketOutputStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketOutputStream::Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written)
+{
+ // FIXME: A temporary hack to get to the Cancel method
+ if (buffer == NULL) {
+ NPT_LOG_INFO("Cancelling BSD socket output stream through write...");
+
+ m_SocketFdReference->Cancel(true);
+
+ NPT_LOG_INFO("Done cancelling BSD socket output stream through write.");
+ return NPT_SUCCESS;
+ }
+
+ int tries_left = 100;
+ for (;;) {
+ // if we're blocking, wait until the socket is writeable
+ if (m_SocketFdReference->m_WriteTimeout) {
+ NPT_Result result = m_SocketFdReference->WaitUntilWriteable();
+ if (result != NPT_SUCCESS) return result;
+ }
+
+ int flags = 0;
+ #if defined(MSG_NOSIGNAL)
+ // for some BSD stacks, ask for EPIPE to be returned instead
+ // of sending a SIGPIPE signal to the process
+ flags |= MSG_NOSIGNAL;
+ #endif
+
+ // write to the socket
+ NPT_LOG_FINEST_1("writing %d to socket", (int)bytes_to_write);
+ ssize_t nb_written = send(m_SocketFdReference->m_SocketFd,
+ (SocketConstBuffer)buffer,
+ bytes_to_write, flags);
+ NPT_LOG_FINEST_1("send returned %d", (int)nb_written);
+
+ if (nb_written <= 0) {
+ if (bytes_written) *bytes_written = 0;
+ if (m_SocketFdReference->m_Cancelled) return NPT_ERROR_CANCELLED;
+
+ if (nb_written == 0) {
+ NPT_LOG_FINE("connection reset");
+ return NPT_ERROR_CONNECTION_RESET;
+ } else {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("socket result = %d", result);
+ if (m_SocketFdReference->m_WriteTimeout && result == NPT_ERROR_WOULD_BLOCK) {
+ // Well, the socket was writeable but then failed with "would block"
+ // Loop back and try again, a certain number of times only...
+ NPT_LOG_FINE_1("Socket failed with 'would block' even though writeable?! Tries left: %d", tries_left);
+ if (--tries_left < 0) {
+ NPT_LOG_SEVERE("Failed to send any data, send kept returning with 'would block' even though timeout is not 0");
+ return NPT_ERROR_WRITE_FAILED;
+ }
+ continue;
+ }
+ return result;
+ }
+ }
+
+ // update position and return
+ if (bytes_written) *bytes_written = (NPT_Size)nb_written;
+ m_SocketFdReference->m_Position += nb_written;
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocketOutputStream::Flush
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocketOutputStream::Flush()
+{
+ int args = 0;
+ socklen_t size = sizeof(args);
+
+ NPT_LOG_FINEST("flushing socket");
+
+ // get the value of the nagle algorithm
+ if (getsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_TCP,
+ TCP_NODELAY,
+ (char*)&args,
+ &size)) {
+ return NPT_ERROR_GETSOCKOPT_FAILED;
+ }
+
+ // return now if nagle was already off
+ if (args == 1) return NPT_SUCCESS;
+
+ // disable the nagle algorithm
+ args = 1;
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_TCP,
+ TCP_NODELAY,
+ (const char*)&args,
+ sizeof(args))) {
+ return NPT_ERROR_SETSOCKOPT_FAILED;
+ }
+
+ // send an empty buffer to flush
+ int flags = 0;
+#if defined(MSG_NOSIGNAL)
+ // for some BSD stacks, ask for EPIPE to be returned instead
+ // of sending a SIGPIPE signal to the process
+ flags |= MSG_NOSIGNAL;
+#endif
+ char dummy = 0;
+ send(m_SocketFdReference->m_SocketFd, &dummy, 0, flags);
+
+ // restore the nagle algorithm to its original setting
+ args = 0;
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_TCP,
+ TCP_NODELAY,
+ (const char*)&args,
+ sizeof(args))) {
+ return NPT_ERROR_SETSOCKOPT_FAILED;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket
++---------------------------------------------------------------------*/
+class NPT_BsdSocket : public NPT_SocketInterface
+{
+ public:
+ // constructors and destructor
+ NPT_BsdSocket(SocketFd fd, NPT_Flags flags);
+ ~NPT_BsdSocket() override;
+
+ // methods
+ NPT_Result RefreshInfo();
+
+ // NPT_SocketInterface methods
+ NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true) override;
+ NPT_Result Connect(const NPT_SocketAddress& address, NPT_Timeout timeout) override;
+ NPT_Result WaitForConnection(NPT_Timeout timeout) override;
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override;
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override;
+ NPT_Result GetInfo(NPT_SocketInfo& info) override;
+ NPT_Result SetReadTimeout(NPT_Timeout timeout) override;
+ NPT_Result SetWriteTimeout(NPT_Timeout timeout) override;
+ NPT_Result Cancel(bool shutdown) override;
+
+ protected:
+ // members
+ NPT_BsdSocketFdReference m_SocketFdReference;
+ NPT_SocketInfo m_Info;
+};
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::NPT_BsdSocket
++---------------------------------------------------------------------*/
+NPT_BsdSocket::NPT_BsdSocket(SocketFd fd, NPT_Flags flags) :
+ m_SocketFdReference(new NPT_BsdSocketFd(fd, flags))
+{
+ // disable the SIGPIPE signal
+#if defined(SO_NOSIGPIPE)
+ int option = 1;
+ (void)setsockopt(m_SocketFdReference->m_SocketFd,
+ SOL_SOCKET,
+ SO_NOSIGPIPE,
+ (SocketOption)&option,
+ sizeof(option));
+#elif defined(SIGPIPE)
+ signal(SIGPIPE, SIG_IGN);
+#endif
+
+ RefreshInfo();
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::~NPT_BsdSocket
++---------------------------------------------------------------------*/
+NPT_BsdSocket::~NPT_BsdSocket()
+{
+ // release the socket fd reference
+ m_SocketFdReference = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::Bind
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::Bind(const NPT_SocketAddress& address, bool reuse_address)
+{
+ // set socket options
+ if (reuse_address) {
+ NPT_LOG_FINE("setting SO_REUSEADDR option on socket");
+ int option = 1;
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ SOL_SOCKET,
+ SO_REUSEADDR,
+ (SocketOption)&option,
+ sizeof(option))) {
+ return MapErrorCode(GetSocketError());
+ }
+ }
+
+ // convert the address
+ NPT_sockaddr_in inet_address;
+ socklen_t inet_address_length;
+ SocketAddressToInetAddress(address, inet_address, inet_address_length);
+
+#if defined(_XBOX)
+ if( address.GetIpAddress().AsLong() != NPT_IpAddress::Any.AsLong() ) {
+ // Xbox can't bind to specific address, defaulting to ANY
+ SocketAddressToInetAddress(NPT_SocketAddress(NPT_IpAddress::Any, address.GetPort()), &inet_address);
+ }
+#endif
+
+ // bind the socket
+ if (bind(m_SocketFdReference->m_SocketFd,
+ &inet_address.sa,
+ inet_address_length) < 0) {
+ return MapErrorCode(GetSocketError());
+ }
+
+ // refresh socket info
+ RefreshInfo();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::Connect
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::Connect(const NPT_SocketAddress&, NPT_Timeout)
+{
+ // this is unsupported unless overridden in a derived class
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::WaitForConnection
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::WaitForConnection(NPT_Timeout)
+{
+ // this is unsupported unless overridden in a derived class
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::GetInputStream(NPT_InputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ // check that we have a socket
+ if (m_SocketFdReference.IsNull()) return NPT_ERROR_INVALID_STATE;
+
+ // create a stream
+ stream = new NPT_BsdSocketInputStream(m_SocketFdReference);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::GetOutputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::GetOutputStream(NPT_OutputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ // check that the file is open
+ if (m_SocketFdReference.IsNull()) return NPT_ERROR_INVALID_STATE;
+
+ // create a stream
+ stream = new NPT_BsdSocketOutputStream(m_SocketFdReference);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::GetInfo(NPT_SocketInfo& info)
+{
+ // return the cached info
+ info = m_Info;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::RefreshInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::RefreshInfo()
+{
+ // check that we have a socket
+ if (m_SocketFdReference.IsNull()) return NPT_ERROR_INVALID_STATE;
+
+ // get the local socket addr
+ NPT_sockaddr_in inet_address;
+ socklen_t inet_address_length = sizeof(inet_address);
+ if (getsockname(m_SocketFdReference->m_SocketFd,
+ &inet_address.sa,
+ &inet_address_length) == 0) {
+ InetAddressToSocketAddress(inet_address, m_Info.local_address);
+ }
+
+ // get the peer socket addr
+ if (getpeername(m_SocketFdReference->m_SocketFd,
+ &inet_address.sa,
+ &inet_address_length) == 0) {
+ InetAddressToSocketAddress(inet_address, m_Info.remote_address);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::SetReadTimeout
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::SetReadTimeout(NPT_Timeout timeout)
+{
+ m_SocketFdReference->m_ReadTimeout = timeout;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::SetWriteTimeout
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::SetWriteTimeout(NPT_Timeout timeout)
+{
+ m_SocketFdReference->m_WriteTimeout = timeout;
+ setsockopt(m_SocketFdReference->m_SocketFd,
+ SOL_SOCKET,
+ SO_SNDTIMEO,
+ (SocketOption)&timeout,
+ sizeof(timeout));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdSocket::Cancel
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdSocket::Cancel(bool do_shutdown)
+{
+ return m_SocketFdReference->Cancel(do_shutdown);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Socket::~NPT_Socket
++---------------------------------------------------------------------*/
+NPT_Socket::~NPT_Socket()
+{
+ delete m_SocketDelegate;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdUdpSocket
++---------------------------------------------------------------------*/
+class NPT_BsdUdpSocket : public NPT_UdpSocketInterface,
+ protected NPT_BsdSocket
+
+{
+ public:
+ // constructor and destructor
+ NPT_BsdUdpSocket(NPT_Flags flags);
+ ~NPT_BsdUdpSocket() override {}
+
+ // NPT_SocketInterface methods
+ NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true) override;
+ NPT_Result Connect(const NPT_SocketAddress& address,
+ NPT_Timeout timeout) override;
+
+ // NPT_UdpSocketInterface methods
+ NPT_Result Send(const NPT_DataBuffer& packet,
+ const NPT_SocketAddress* address) override;
+ NPT_Result Receive(NPT_DataBuffer& packet,
+ NPT_SocketAddress* address) override;
+
+ // friends
+ friend class NPT_UdpSocket;
+};
+
+/*----------------------------------------------------------------------
+| NPT_BsdUdpSocket::NPT_BsdUdpSocket
++---------------------------------------------------------------------*/
+NPT_BsdUdpSocket::NPT_BsdUdpSocket(NPT_Flags flags) :
+ NPT_BsdSocket(socket(NPT_SOCKETS_PF_INET, SOCK_DGRAM, 0), flags)
+{
+ // set default socket options
+ int option = 1;
+ (void)setsockopt(m_SocketFdReference->m_SocketFd,
+ SOL_SOCKET,
+ SO_BROADCAST,
+ (SocketOption)&option,
+ sizeof(option));
+
+#if defined(_XBOX)
+ // set flag on the socket to allow sending of multicast
+ if (!NPT_BSD_SOCKET_IS_INVALID(m_SocketFdReference->m_SocketFd)) {
+ *(DWORD*)((char*)m_SocketFdReference->m_SocketFd+0xc) |= 0x02000000;
+ }
+#endif
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdUdpSocket::Bind
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpSocket::Bind(const NPT_SocketAddress& address, bool reuse_address)
+{
+ if (reuse_address) {
+#if defined(SO_REUSEPORT)
+ // some implementations (BSD 4.4) need this in addition to SO_REUSEADDR
+ NPT_LOG_FINE("setting SO_REUSEPORT option on socket");
+ int option = 1;
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ SOL_SOCKET,
+ SO_REUSEPORT,
+ (SocketOption)&option,
+ sizeof(option))) {
+ return MapErrorCode(GetSocketError());
+ }
+#endif
+ }
+ // call the inherited method
+ return NPT_BsdSocket::Bind(address, reuse_address);
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdUdpSocket::Connect
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpSocket::Connect(const NPT_SocketAddress& address,
+ NPT_Timeout /* ignored */)
+{
+ // setup an address structure
+ NPT_sockaddr_in inet_address;
+ socklen_t inet_address_length;
+ SocketAddressToInetAddress(address, inet_address, inet_address_length);
+
+ // connect so that we can have some addr bound to the socket
+ NPT_LOG_FINE_2("connecting to %s, port %d",
+ address.GetIpAddress().ToString().GetChars(),
+ address.GetPort());
+ int io_result = connect(m_SocketFdReference->m_SocketFd,
+ &inet_address.sa,
+ inet_address_length);
+ if (NPT_BSD_SOCKET_CALL_FAILED(io_result)) {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("socket error %d", result);
+ return result;
+ }
+
+ // refresh socket info
+ RefreshInfo();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdUdpSocket::Send
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpSocket::Send(const NPT_DataBuffer& packet,
+ const NPT_SocketAddress* address)
+{
+ // get the packet buffer
+ const NPT_Byte* buffer = packet.GetData();
+ ssize_t buffer_length = packet.GetDataSize();
+
+ // if we're blocking, wait until the socket is writeable
+ if (m_SocketFdReference->m_WriteTimeout) {
+ NPT_Result result = m_SocketFdReference->WaitUntilWriteable();
+ if (result != NPT_SUCCESS) return result;
+ }
+
+ // send the packet buffer
+ ssize_t io_result;
+ if (address) {
+ // send to the specified address
+
+ // setup an address structure
+ NPT_sockaddr_in inet_address;
+ socklen_t inet_address_length;
+ SocketAddressToInetAddress(*address, inet_address, inet_address_length);
+
+ // send the data
+ NPT_LOG_FINEST_2("sending datagram to %s port %d",
+ address->GetIpAddress().ToString().GetChars(),
+ address->GetPort());
+ io_result = sendto(m_SocketFdReference->m_SocketFd,
+ (SocketConstBuffer)buffer,
+ buffer_length,
+ 0,
+ &inet_address.sa,
+ inet_address_length);
+ } else {
+ int flags = 0;
+#if defined(MSG_NOSIGNAL)
+ // for some BSD stacks, ask for EPIPE to be returned instead
+ // of sending a SIGPIPE signal to the process
+ flags |= MSG_NOSIGNAL;
+#endif
+
+ // send to whichever addr the socket is connected
+ NPT_LOG_FINEST("sending datagram");
+ io_result = send(m_SocketFdReference->m_SocketFd,
+ (SocketConstBuffer)buffer,
+ buffer_length,
+ flags);
+ }
+
+ // check result
+ NPT_LOG_FINEST_1("send/sendto returned %d", (int)io_result);
+ if (m_SocketFdReference->m_Cancelled) return NPT_ERROR_CANCELLED;
+ if (NPT_BSD_SOCKET_CALL_FAILED(io_result)) {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("socket error %d", result);
+ return result;
+ }
+
+ // update position and return
+ m_SocketFdReference->m_Position += buffer_length;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdUdpSocket::Receive
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpSocket::Receive(NPT_DataBuffer& packet,
+ NPT_SocketAddress* address)
+{
+ // get the packet buffer
+ NPT_Byte* buffer = packet.UseData();
+ ssize_t buffer_size = packet.GetBufferSize();
+
+ // check that we have some space to receive
+ if (buffer_size == 0) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // if we're blocking, wait until the socket is readable
+ if (m_SocketFdReference->m_ReadTimeout) {
+ NPT_Result result = m_SocketFdReference->WaitUntilReadable();
+ if (result != NPT_SUCCESS) return result;
+ }
+
+ // receive a packet
+ ssize_t io_result = 0;
+ if (address) {
+ NPT_sockaddr_in inet_address;
+ socklen_t inet_address_length = sizeof(inet_address);
+
+ NPT_LOG_FINEST_2("receiving dagagram from %s port %d",
+ address->GetIpAddress().ToString().GetChars(),
+ address->GetPort());
+ io_result = recvfrom(m_SocketFdReference->m_SocketFd,
+ (SocketBuffer)buffer,
+ buffer_size,
+ 0,
+ &inet_address.sa,
+ &inet_address_length);
+
+ // convert the address format
+ if (!NPT_BSD_SOCKET_CALL_FAILED(io_result)) {
+ InetAddressToSocketAddress(inet_address, *address);
+ }
+ } else {
+ NPT_LOG_FINEST("receiving datagram");
+ io_result = recv(m_SocketFdReference->m_SocketFd,
+ (SocketBuffer)buffer,
+ buffer_size,
+ 0);
+ }
+
+ // check result
+ NPT_LOG_FINEST_1("recv/recvfrom returned %d", (int)io_result);
+ if (m_SocketFdReference->m_Cancelled) {
+ packet.SetDataSize(0);
+ return NPT_ERROR_CANCELLED;
+ }
+ if (NPT_BSD_SOCKET_CALL_FAILED(io_result)) {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("socket error %d", result);
+ packet.SetDataSize(0);
+ return result;
+ }
+
+ // update position and return
+ packet.SetDataSize((NPT_Size)io_result);
+ m_SocketFdReference->m_Position += io_result;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UdpSocket::NPT_UdpSocket
++---------------------------------------------------------------------*/
+NPT_UdpSocket::NPT_UdpSocket(NPT_Flags flags)
+{
+ NPT_BsdUdpSocket* delegate = new NPT_BsdUdpSocket(flags);
+ m_SocketDelegate = delegate;
+ m_UdpSocketDelegate = delegate;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UdpSocket::NPT_UdpSocket
++---------------------------------------------------------------------*/
+NPT_UdpSocket::NPT_UdpSocket(NPT_UdpSocketInterface* delegate) :
+ m_UdpSocketDelegate(delegate)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_UdpSocket::~NPT_UdpSocket
++---------------------------------------------------------------------*/
+NPT_UdpSocket::~NPT_UdpSocket()
+{
+ delete m_UdpSocketDelegate;
+
+ // set the delegate pointers to NULL because it is shared by the
+ // base classes, and we only want to delete the object once
+ m_UdpSocketDelegate = NULL;
+ m_SocketDelegate = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket
++---------------------------------------------------------------------*/
+class NPT_BsdUdpMulticastSocket : public NPT_UdpMulticastSocketInterface,
+ protected NPT_BsdUdpSocket
+
+{
+ public:
+ // methods
+ NPT_BsdUdpMulticastSocket(NPT_Flags flags);
+ ~NPT_BsdUdpMulticastSocket() override;
+
+ // NPT_UdpMulticastSocketInterface methods
+ NPT_Result JoinGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface) override;
+ NPT_Result LeaveGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface) override;
+ NPT_Result SetTimeToLive(unsigned char ttl) override;
+ NPT_Result SetInterface(const NPT_IpAddress& iface) override;
+
+ // friends
+ friend class NPT_UdpMulticastSocket;
+};
+
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::NPT_BsdUdpMulticastSocket
++---------------------------------------------------------------------*/
+NPT_BsdUdpMulticastSocket::NPT_BsdUdpMulticastSocket(NPT_Flags flags) :
+ NPT_BsdUdpSocket(flags)
+{
+#if !defined(_XBOX)
+ int option = 1;
+ setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_IP,
+ IP_MULTICAST_LOOP,
+ (SocketOption)&option,
+ sizeof(option));
+#endif
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::~NPT_BsdUdpMulticastSocket
++---------------------------------------------------------------------*/
+NPT_BsdUdpMulticastSocket::~NPT_BsdUdpMulticastSocket()
+{
+}
+
+#if defined(_XBOX)
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::JoinGroup
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpMulticastSocket::JoinGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface)
+{
+ return NPT_SUCCESS;
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::JoinGroup
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpMulticastSocket::JoinGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface)
+{
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ struct ipv6_mreq mreq;
+
+ // set the interface index
+ mreq.ipv6mr_interface = 0; // FIXME: hardcoded to 0 for now
+
+ // set the group address
+ if (group.GetType() == NPT_IpAddress::IPV6) {
+ NPT_CopyMemory(&mreq.ipv6mr_multiaddr.s6_addr[0], group.AsBytes(), 16);
+ } else {
+ NPT_SetMemory(&mreq.ipv6mr_multiaddr.s6_addr[0], 0, 10);
+ mreq.ipv6mr_multiaddr.s6_addr[10] = 0xFF;
+ mreq.ipv6mr_multiaddr.s6_addr[11] = 0xFF;
+ NPT_CopyMemory(&mreq.ipv6mr_multiaddr.s6_addr[12], group.AsBytes(), 4);
+ }
+
+ // set socket option
+ NPT_LOG_FINE_2("joining multicast addr %s group %s",
+ iface.ToString().GetChars(), group.ToString().GetChars());
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_IPV6, IPV6_JOIN_GROUP,
+ (SocketOption)&mreq, sizeof(mreq))) {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("setsockopt error %d", result);
+ return result;
+ }
+ return NPT_SUCCESS;
+#else
+ struct ip_mreq mreq;
+
+ // set the interface address
+ mreq.imr_interface.s_addr = htonl(iface.AsLong());
+
+ // set the group address
+ mreq.imr_multiaddr.s_addr = htonl(group.AsLong());
+
+ // set socket option
+ NPT_LOG_FINE_2("joining multicast addr %s group %s",
+ iface.ToString().GetChars(), group.ToString().GetChars());
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_IP, IP_ADD_MEMBERSHIP,
+ (SocketOption)&mreq, sizeof(mreq))) {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("setsockopt error %d", result);
+ return result;
+ }
+ return NPT_SUCCESS;
+#endif
+}
+#endif
+
+#if defined(_XBOX)
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::LeaveGroup
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpMulticastSocket::LeaveGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface)
+{
+ return NPT_SUCCESS;
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::LeaveGroup
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpMulticastSocket::LeaveGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface)
+{
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ struct ipv6_mreq mreq;
+
+ // set the interface index
+ mreq.ipv6mr_interface = 0; // FIXME: hardcoded to 0 for now
+
+ // set the group address
+ if (group.GetType() == NPT_IpAddress::IPV6) {
+ NPT_CopyMemory(&mreq.ipv6mr_multiaddr.s6_addr[0], group.AsBytes(), 16);
+ } else {
+ NPT_SetMemory(&mreq.ipv6mr_multiaddr.s6_addr[0], 0, 10);
+ mreq.ipv6mr_multiaddr.s6_addr[10] = 0xFF;
+ mreq.ipv6mr_multiaddr.s6_addr[11] = 0xFF;
+ NPT_CopyMemory(&mreq.ipv6mr_multiaddr.s6_addr[12], group.AsBytes(), 4);
+ }
+
+ // set socket option
+ NPT_LOG_FINE_2("leaving multicast addr %s group %s",
+ iface.ToString().GetChars(), group.ToString().GetChars());
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_IPV6, IPV6_LEAVE_GROUP,
+ (SocketOption)&mreq, sizeof(mreq))) {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("setsockopt error %d", result);
+ return result;
+ }
+#else
+ struct ip_mreq mreq;
+
+ // set the interface address
+ mreq.imr_interface.s_addr = htonl(iface.AsLong());
+
+ // set the group address
+ mreq.imr_multiaddr.s_addr = htonl(group.AsLong());
+
+ // set socket option
+ NPT_LOG_FINE_2("leaving multicast addr %s group %s",
+ iface.ToString().GetChars(), group.ToString().GetChars());
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_IP, IP_DROP_MEMBERSHIP,
+ (SocketOption)&mreq, sizeof(mreq))) {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("setsockopt error %d", result);
+ return result;
+ }
+#endif
+
+ return NPT_SUCCESS;
+}
+#endif
+
+#if defined(_XBOX)
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::SetInterface
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpMulticastSocket::SetInterface(const NPT_IpAddress& iface)
+{
+ return NPT_SUCCESS;
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::SetInterface
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpMulticastSocket::SetInterface(const NPT_IpAddress& iface)
+{
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ unsigned int ifindex = 0; // FIXME: hardcoded to 0 for now
+
+ // set socket option
+ NPT_LOG_FINE_1("setting multicast interface %s", iface.ToString().GetChars());
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_IPV6, IPV6_MULTICAST_IF,
+ (char*)&ifindex, sizeof(ifindex))) {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("setsockopt error %d", result);
+ return result;
+ }
+#else
+ struct in_addr iface_addr;
+ // set the interface address
+ iface_addr.s_addr = htonl(iface.AsLong());
+
+ // set socket option
+ NPT_LOG_FINE_1("setting multicast interface %s", iface.ToString().GetChars());
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_IP, IP_MULTICAST_IF,
+ (char*)&iface_addr, sizeof(iface_addr))) {
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("setsockopt error %d", result);
+ return result;
+ }
+#endif
+
+ return NPT_SUCCESS;
+}
+#endif
+
+#if defined(_XBOX)
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::SetTimeToLive
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpMulticastSocket::SetTimeToLive(unsigned char ttl)
+{
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_BsdUdpMulticastSocket::SetTimeToLive
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdUdpMulticastSocket::SetTimeToLive(unsigned char ttl)
+{
+
+ // set socket option
+ NPT_LOG_FINE_1("setting multicast TTL to %d", (int)ttl);
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ int ttl_opt = ttl;
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
+ (SocketOption)&ttl_opt, sizeof(ttl_opt))) {
+#else
+ unsigned char ttl_opt = ttl;
+ if (setsockopt(m_SocketFdReference->m_SocketFd,
+ IPPROTO_IP, IP_MULTICAST_TTL,
+ (SocketOption)&ttl_opt, sizeof(ttl_opt))) {
+#endif
+ NPT_Result result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("setsockopt error %d", result);
+ return result;
+ }
+
+ return NPT_SUCCESS;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_UdpMulticastSocket::NPT_UdpMulticastSocket
++---------------------------------------------------------------------*/
+NPT_UdpMulticastSocket::NPT_UdpMulticastSocket(NPT_Flags flags) :
+ NPT_UdpSocket((NPT_UdpSocketInterface*)0)
+{
+ NPT_BsdUdpMulticastSocket* delegate = new NPT_BsdUdpMulticastSocket(flags);
+ m_SocketDelegate = delegate;
+ m_UdpSocketDelegate = delegate;
+ m_UdpMulticastSocketDelegate = delegate;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UdpMulticastSocket::~NPT_UdpMulticastSocket
++---------------------------------------------------------------------*/
+NPT_UdpMulticastSocket::~NPT_UdpMulticastSocket()
+{
+ delete m_UdpMulticastSocketDelegate;
+
+ // set the delegate pointers to NULL because it is shared by the
+ // base classes, and we only want to delete the object once
+ m_SocketDelegate = NULL;
+ m_UdpSocketDelegate = NULL;
+ m_UdpMulticastSocketDelegate = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpClientSocket
++---------------------------------------------------------------------*/
+class NPT_BsdTcpClientSocket : protected NPT_BsdSocket
+{
+ public:
+ // methods
+ NPT_BsdTcpClientSocket(NPT_Flags flags);
+ ~NPT_BsdTcpClientSocket() override;
+
+ // NPT_SocketInterface methods
+ NPT_Result Connect(const NPT_SocketAddress& address,
+ NPT_Timeout timeout) override;
+ NPT_Result WaitForConnection(NPT_Timeout timeout) override;
+
+protected:
+ // friends
+ friend class NPT_TcpClientSocket;
+};
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpClientSocket::NPT_BsdTcpClientSocket
++---------------------------------------------------------------------*/
+NPT_BsdTcpClientSocket::NPT_BsdTcpClientSocket(NPT_Flags flags) :
+ NPT_BsdSocket(socket(NPT_SOCKETS_PF_INET, SOCK_STREAM, 0), flags)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpClientSocket::~NPT_BsdTcpClientSocket
++---------------------------------------------------------------------*/
+NPT_BsdTcpClientSocket::~NPT_BsdTcpClientSocket()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpClientSocket::Connect
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdTcpClientSocket::Connect(const NPT_SocketAddress& address,
+ NPT_Timeout timeout)
+{
+ // convert the address
+ NPT_sockaddr_in inet_address;
+ socklen_t inet_address_length;
+ SocketAddressToInetAddress(address, inet_address, inet_address_length);
+
+ // initiate connection
+ NPT_LOG_FINE_2("connecting to %s, port %d",
+ address.GetIpAddress().ToString().GetChars(),
+ address.GetPort());
+ int io_result;
+ io_result = connect(m_SocketFdReference->m_SocketFd,
+ &inet_address.sa,
+ inet_address_length);
+ if (io_result == 0) {
+ // immediate connection
+ NPT_LOG_FINE("immediate connection");
+
+ // get socket info
+ RefreshInfo();
+
+ return NPT_SUCCESS;
+ }
+
+ // test for errors
+ NPT_Result result = MapErrorCode(GetSocketError());
+
+ // if we're blocking, wait for a connection unless there was an error
+ if (timeout && result == NPT_ERROR_WOULD_BLOCK) {
+ return WaitForConnection(timeout);
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpClientSocket::WaitForConnection
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdTcpClientSocket::WaitForConnection(NPT_Timeout timeout)
+{
+ NPT_Result result = m_SocketFdReference->WaitForCondition(true, true, true, timeout);
+
+ // get socket info
+ RefreshInfo();
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TcpClientSocket::NPT_TcpClientSocket
++---------------------------------------------------------------------*/
+NPT_TcpClientSocket::NPT_TcpClientSocket(NPT_Flags flags) :
+ NPT_Socket(new NPT_BsdTcpClientSocket(flags))
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_TcpClientSocket::NPT_TcpClientSocket
++---------------------------------------------------------------------*/
+NPT_TcpClientSocket::~NPT_TcpClientSocket()
+{
+ delete m_SocketDelegate;
+
+ // set the delegate pointer to NULL because it is shared by the
+ // base classes, and we only want to delete the object once
+ m_SocketDelegate = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpServerSocket
++---------------------------------------------------------------------*/
+class NPT_BsdTcpServerSocket : public NPT_TcpServerSocketInterface,
+ protected NPT_BsdSocket
+
+{
+ public:
+ // methods
+ NPT_BsdTcpServerSocket(NPT_Flags flags);
+ ~NPT_BsdTcpServerSocket() override;
+
+ // NPT_SocketInterface methods
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override {
+ // no stream
+ stream = NULL;
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override {
+ // no stream
+ stream = NULL;
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+
+ // NPT_TcpServerSocket methods
+ NPT_Result Listen(unsigned int max_clients) override;
+ NPT_Result WaitForNewClient(NPT_Socket*& client,
+ NPT_Timeout timeout,
+ NPT_Flags flags) override;
+
+protected:
+ // members
+ unsigned int m_ListenMax;
+
+ // friends
+ friend class NPT_TcpServerSocket;
+};
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpServerSocket::NPT_BsdTcpServerSocket
++---------------------------------------------------------------------*/
+NPT_BsdTcpServerSocket::NPT_BsdTcpServerSocket(NPT_Flags flags) :
+ NPT_BsdSocket(socket(NPT_SOCKETS_PF_INET, SOCK_STREAM, 0), flags),
+ m_ListenMax(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpServerSocket::~NPT_BsdTcpServerSocket
++---------------------------------------------------------------------*/
+NPT_BsdTcpServerSocket::~NPT_BsdTcpServerSocket()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpServerSocket::Listen
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdTcpServerSocket::Listen(unsigned int max_clients)
+{
+ // listen for connections
+ if (listen(m_SocketFdReference->m_SocketFd, max_clients) < 0) {
+ m_ListenMax = 0;
+ return NPT_ERROR_LISTEN_FAILED;
+ }
+ m_ListenMax = max_clients;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_BsdTcpServerSocket::WaitForNewClient
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_BsdTcpServerSocket::WaitForNewClient(NPT_Socket*& client,
+ NPT_Timeout timeout,
+ NPT_Flags flags)
+{
+ // default value
+ client = NULL;
+
+ // check that we are listening for clients
+ if (m_ListenMax == 0) {
+ Listen(NPT_TCP_SERVER_SOCKET_DEFAULT_LISTEN_COUNT);
+ }
+
+ // wait until the socket is readable or writeable
+ NPT_LOG_FINER("waiting until socket is readable or writeable");
+ NPT_Result result = m_SocketFdReference->WaitForCondition(true, true, false, timeout);
+ if (result != NPT_SUCCESS) return result;
+
+ NPT_LOG_FINER("accepting connection");
+ NPT_sockaddr_in inet_address;
+ socklen_t inet_address_length = sizeof(inet_address);
+ SocketFd socket_fd = accept(m_SocketFdReference->m_SocketFd, &inet_address.sa, &inet_address_length);
+ if (NPT_BSD_SOCKET_IS_INVALID(socket_fd)) {
+ if (m_SocketFdReference->m_Cancelled) return NPT_ERROR_CANCELLED;
+ result = MapErrorCode(GetSocketError());
+ NPT_LOG_FINE_1("socket error %d", result);
+ return result;
+ } else {
+ client = new NPT_Socket(new NPT_BsdSocket(socket_fd, flags));
+ }
+
+ // done
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TcpServerSocket::NPT_TcpServerSocket
++---------------------------------------------------------------------*/
+NPT_TcpServerSocket::NPT_TcpServerSocket(NPT_Flags flags)
+{
+ NPT_BsdTcpServerSocket* delegate = new NPT_BsdTcpServerSocket(flags);
+ m_SocketDelegate = delegate;
+ m_TcpServerSocketDelegate = delegate;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TcpServerSocket::NPT_TcpServerSocket
++---------------------------------------------------------------------*/
+NPT_TcpServerSocket::~NPT_TcpServerSocket()
+{
+ delete m_TcpServerSocketDelegate;
+
+ // set the delegate pointers to NULL because it is shared by the
+ // base classes, and we only want to delete the object once
+ m_SocketDelegate = NULL;
+ m_TcpServerSocketDelegate = NULL;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaConsole.mm b/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaConsole.mm
new file mode 100755
index 0000000..b97e0d5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaConsole.mm
@@ -0,0 +1,27 @@
+/*****************************************************************
+|
+| Neptune - Console Support: Cocoa Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdio.h>
+#include <Foundation/Foundation.h>
+
+#include "NptConfig.h"
+#include "NptConsole.h"
+
+/*----------------------------------------------------------------------
+| NPT_Console::Output
++---------------------------------------------------------------------*/
+void
+NPT_Console::Output(const char* message)
+{
+ NSLog(@"%@", [@(message) stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]);
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaEnviroment.mm b/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaEnviroment.mm
new file mode 100644
index 0000000..bc0b8df
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaEnviroment.mm
@@ -0,0 +1,40 @@
+/*****************************************************************
+|
+| Neptune - System Support: Cocoa Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Sylvain Rebaud (sylvain@rebaud.com)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptSystem.h"
+
+#import <Foundation/Foundation.h>
+
+#if !defined(TARGET_OS_IPHONE) || !TARGET_OS_IPHONE
+#import <SystemConfiguration/SystemConfiguration.h>
+#else
+#import <UIKit/UIKit.h>
+#endif
+
+NPT_Result
+NPT_GetSystemMachineName(NPT_String& name)
+{
+ // we need a pool because of UTF8String
+ NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+
+#if !defined(TARGET_OS_IPHONE) || !TARGET_OS_IPHONE
+ CFStringRef _name = SCDynamicStoreCopyComputerName(NULL, NULL);
+ name = [(NSString *)_name UTF8String];
+ [(NSString *)_name release];
+#else
+ name = [[[UIDevice currentDevice] name] UTF8String];
+#endif
+
+ [pool release];
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.h b/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.h
new file mode 100644
index 0000000..cd3e89b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.h
@@ -0,0 +1,39 @@
+/*****************************************************************
+|
+| Neptune - Cocoa Message Queue
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+#ifndef _NPT_COCOA_MESSAGE_QUEUE_
+#define _NPT_COCOA_MESSAGE_QUEUE_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptStrings.h"
+#include "NptMessaging.h"
+#include "NptSimpleMessageQueue.h"
+
+/*----------------------------------------------------------------------
+| NPT_CocoaMessageQueue
++---------------------------------------------------------------------*/
+class NPT_CocoaMessageQueue : public NPT_MessageQueue
+{
+public:
+ NPT_CocoaMessageQueue();
+ ~NPT_CocoaMessageQueue();
+
+ // NPT_MessageQueue methods
+ virtual NPT_Result QueueMessage(NPT_Message* message,
+ NPT_MessageHandler* handler);
+ virtual NPT_Result PumpMessage(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+
+ // methods
+ NPT_Result HandleMessage(NPT_Message* message, NPT_MessageHandler* handler);
+};
+
+#endif /* _NPT_COCOA_MESSAGE_QUEUE_ */
+
diff --git a/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.mm b/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.mm
new file mode 100644
index 0000000..05cf46a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Cocoa/NptCocoaMessageQueue.mm
@@ -0,0 +1,104 @@
+/*****************************************************************
+|
+| Neptune - Cocoa Message Queue
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+
+#import <Foundation/Foundation.h>
+#include "NptCocoaMessageQueue.h"
+
+/*----------------------------------------------------------------------
+| NPT_CocoaMessageWrapper
++---------------------------------------------------------------------*/
+@interface NPT_CocoaMessageCapsule : NSObject
+{
+ NPT_Message* message;
+ NPT_MessageHandler* handler;
+ NPT_MessageHandlerProxy* proxy;
+}
+-(id) initWithMessage: (NPT_Message*) message andHandler: (NPT_MessageHandler*) handler;
+-(void) handle;
+@end
+
+@implementation NPT_CocoaMessageCapsule
+-(id) initWithMessage: (NPT_Message*) aMessage andHandler: (NPT_MessageHandler*) aHandler
+{
+ if ((self = [super init])) {
+ message = aMessage;
+ handler = aHandler;
+ proxy = NPT_DYNAMIC_CAST(NPT_MessageHandlerProxy, aHandler);
+ if (proxy) proxy->AddReference();
+ }
+ return self;
+}
+
+-(void) dealloc
+{
+ delete message;
+ if (proxy) proxy->Release();
+ [super dealloc];
+}
+
+-(void) handle
+{
+ if (handler && message) {
+ handler->HandleMessage(message);
+ }
+}
+@end
+
+/*----------------------------------------------------------------------
+| NPT_CocoaMessageQueue::NPT_CocoaMessageQueue
++---------------------------------------------------------------------*/
+NPT_CocoaMessageQueue::NPT_CocoaMessageQueue()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_CocoaMessageQueue::~NPT_CocoaMessageQueue
++---------------------------------------------------------------------*/
+NPT_CocoaMessageQueue::~NPT_CocoaMessageQueue()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_CocoaMessageQueue::PumpMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_CocoaMessageQueue::PumpMessage(NPT_Timeout)
+{
+ // you cannot pump messages on this type of queue, since they will
+ // be pumped by the main application message loop
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_CocoaMessageQueue::QueueMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_CocoaMessageQueue::QueueMessage(NPT_Message* message,
+ NPT_MessageHandler* handler)
+{
+ // create a capsule to represent the message and handler
+ NPT_CocoaMessageCapsule* capsule = [NPT_CocoaMessageCapsule alloc];
+ [capsule initWithMessage: message andHandler: handler];
+
+ // trigger the handling of the message on the main thread
+ [capsule performSelectorOnMainThread: @selector(handle)
+ withObject: nil
+ waitUntilDone: FALSE];
+
+ // we no longer hold a reference to the capsule (it will be released
+ // by the receiving thread)
+ [capsule release];
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Null/NptNullAutoreleasePool.cpp b/lib/libUPnP/Neptune/Source/System/Null/NptNullAutoreleasePool.cpp
new file mode 100644
index 0000000..f041bbe
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Null/NptNullAutoreleasePool.cpp
@@ -0,0 +1,27 @@
+/*****************************************************************
+|
+| Neptune - Autorelease Pool :: Null Implementation
+|
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptAutoreleasePool.h"
+
+/*----------------------------------------------------------------------
+| NPT_AutoreleasePool::NPT_AutoreleasePool
++---------------------------------------------------------------------*/
+NPT_AutoreleasePool::NPT_AutoreleasePool()
+{
+ m_Delegate = 0;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AutoreleasePool::~NPT_AutoreleasePool
++---------------------------------------------------------------------*/
+NPT_AutoreleasePool::~NPT_AutoreleasePool()
+{
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Null/NptNullDynamicLibraries.cpp b/lib/libUPnP/Neptune/Source/System/Null/NptNullDynamicLibraries.cpp
new file mode 100644
index 0000000..cc52d9b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Null/NptNullDynamicLibraries.cpp
@@ -0,0 +1,23 @@
+/*****************************************************************
+|
+| Neptune - Dynamic Libraries :: Null/Stub Implementation
+|
+| (c) 2001-2016 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptLogging.h"
+#include "NptDynamicLibraries.h"
+
+/*----------------------------------------------------------------------
+| NPT_DynamicLibrary::Load
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DynamicLibrary::Load(const char* /* name */, NPT_Flags /* flags */, NPT_DynamicLibrary*& /* library */)
+{
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Null/NptNullFile.cpp b/lib/libUPnP/Neptune/Source/System/Null/NptNullFile.cpp
new file mode 100644
index 0000000..3a8c4b2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Null/NptNullFile.cpp
@@ -0,0 +1,102 @@
+/*****************************************************************
+|
+| Neptune - File :: Null/Stub Implementation
+|
+| (c) 2001-2016 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptFile.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const char* const NPT_FilePath::Separator = "/";
+
+/*----------------------------------------------------------------------
+| NPT_File::GetRoots
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetRoots(NPT_List<NPT_String>& roots)
+{
+ roots.Clear();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::CreateDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::CreateDir(const char* /* path */)
+{
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::RemoveFile
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::RemoveFile(const char* /* path */)
+{
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::RemoveDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::RemoveDir(const char* /* path */)
+{
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Rename
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Rename(const char* /* from_path */, const char* /* to_path */)
+{
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::ListDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::ListDir(const char* path,
+ NPT_List<NPT_String>& entries,
+ NPT_Ordinal start /* = 0 */,
+ NPT_Cardinal max /* = 0 */)
+{
+ // default return value
+ entries.Clear();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::GetWorkingDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetWorkingDir(NPT_String& path)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetInfo(const char* path, NPT_FileInfo* info)
+{
+ // default value
+ if (info) NPT_SetMemory(info, 0, sizeof(*info));
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Null/NptNullHttpProxy.cpp b/lib/libUPnP/Neptune/Source/System/Null/NptNullHttpProxy.cpp
new file mode 100644
index 0000000..3b2f401
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Null/NptNullHttpProxy.cpp
@@ -0,0 +1,23 @@
+/*****************************************************************
+|
+| Neptune - HTTP Proxy :: Null Implementation
+|
+| (c) 2001-2007 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptResults.h"
+#include "NptHttp.h"
+
+/*----------------------------------------------------------------------
+| NPT_HttpProxySelector::GetDefault
++---------------------------------------------------------------------*/
+NPT_HttpProxySelector*
+NPT_HttpProxySelector::GetDefault()
+{
+ return NULL;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Null/NptNullNetwork.cpp b/lib/libUPnP/Neptune/Source/System/Null/NptNullNetwork.cpp
new file mode 100644
index 0000000..f4a5f3b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Null/NptNullNetwork.cpp
@@ -0,0 +1,23 @@
+/*****************************************************************
+|
+| Neptune - Network :: Null Implementation
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptResults.h"
+#include "NptNetwork.h"
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::GetNetworkInterfaces
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& /*interfaces*/)
+{
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Null/NptNullQueue.cpp b/lib/libUPnP/Neptune/Source/System/Null/NptNullQueue.cpp
new file mode 100644
index 0000000..d51a750
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Null/NptNullQueue.cpp
@@ -0,0 +1,30 @@
+/*****************************************************************
+|
+| Neptune - Queue :: Null Implementation
+|
+| (c) 2001-2002 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptQueue.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| NPT_GenericQueue::CreateInstance
++---------------------------------------------------------------------*/
+NPT_GenericQueue*
+NPT_GenericQueue::CreateInstance(NPT_Cardinal max_items)
+{
+ NPT_ASSERT(0);
+ return NULL;
+}
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/System/Null/NptNullSerialPort.cpp b/lib/libUPnP/Neptune/Source/System/Null/NptNullSerialPort.cpp
new file mode 100644
index 0000000..f9b3274
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Null/NptNullSerialPort.cpp
@@ -0,0 +1,83 @@
+/*****************************************************************
+|
+| Neptune - Serial Ports :: Null Implementation
+|
+| (c) 2001-2007 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptUtils.h"
+#include "NptSerialPort.h"
+
+/*----------------------------------------------------------------------
+| NPT_NullSerialPort
++---------------------------------------------------------------------*/
+class NPT_NullSerialPort: public NPT_SerialPortInterface
+{
+public:
+ // NPT_SerialPortInterface methods
+ NPT_Result Open(unsigned int speed,
+ NPT_SerialPortStopBits stop_bits = NPT_SERIAL_PORT_STOP_BITS_1,
+ NPT_SerialPortFlowControl flow_control = NPT_SERIAL_PORT_FLOW_CONTROL_NONE,
+ NPT_SerialPortParity parity = NPT_SERIAL_PORT_PARITY_NONE);
+ NPT_Result Close();
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream);
+};
+
+/*----------------------------------------------------------------------
+| NPT_NullSerialPort::Open
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NullSerialPort::Open(unsigned int /* speed */,
+ NPT_SerialPortStopBits /* stop_bits */,
+ NPT_SerialPortFlowControl /* flow_control */,
+ NPT_SerialPortParity /* parity */)
+{
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_NullSerialPort::Close
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NullSerialPort::Close()
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_NullSerialPort::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NullSerialPort::GetInputStream(NPT_InputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_NullSerialPort::GetOutputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NullSerialPort::GetOutputStream(NPT_OutputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SerialPort::NPT_SerialPort
++---------------------------------------------------------------------*/
+NPT_SerialPort::NPT_SerialPort(const char* /* name */)
+{
+ m_Delegate = new NPT_NullSerialPort();
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Null/NptNullSystem.cpp b/lib/libUPnP/Neptune/Source/System/Null/NptNullSystem.cpp
new file mode 100644
index 0000000..9190772
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Null/NptNullSystem.cpp
@@ -0,0 +1,71 @@
+/*****************************************************************
+|
+| Neptune - System :: Null/Stub Implementation
+|
+| (c) 2001-2016 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptSystem.h"
+
+/*----------------------------------------------------------------------
+| NPT_System::GetProcessId
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetProcessId(NPT_UInt32& id)
+{
+ id = 0;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetCurrentTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetCurrentTimeStamp(NPT_TimeStamp& now)
+{
+ now.SetNanos(0);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::Sleep
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::Sleep(const NPT_TimeInterval& /* duration */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SleepUntil
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SleepUntil(const NPT_TimeStamp& /* when */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SetRandomSeed
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SetRandomSeed(unsigned int /* seed */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetRandomInteger
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_System::GetRandomInteger()
+{
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Null/NptNullThreads.cpp b/lib/libUPnP/Neptune/Source/System/Null/NptNullThreads.cpp
new file mode 100644
index 0000000..56ac99f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Null/NptNullThreads.cpp
@@ -0,0 +1,42 @@
+/*****************************************************************
+|
+| Neptune - Threads :: Null Implementation
+|
+| (c) 2001-2002 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptThreads.h"
+
+/*----------------------------------------------------------------------
+| NPT_NullAtomicVariable
++---------------------------------------------------------------------*/
+class NPT_NullAtomicVariable : public NPT_AtomicVariableInterface
+{
+ public:
+ // methods
+ NPT_NullAtomicVariable(int value) : m_Value(value) {}
+ ~NPT_NullAtomicVariable() {}
+ int Increment() { return ++m_Value; }
+ int Decrement() { return --m_Value; }
+ int GetValue() { return m_Value; }
+ void SetValue(int value) { m_Value = value; }
+
+ private:
+ // members
+ volatile int m_Value;
+};
+
+/*----------------------------------------------------------------------
+| NPT_AtomicVariable::NPT_AtomicVariable
++---------------------------------------------------------------------*/
+NPT_AtomicVariable::NPT_AtomicVariable(int value)
+{
+ m_Delegate = new NPT_NullAtomicVariable(value);
+}
diff --git a/lib/libUPnP/Neptune/Source/System/PS3/NptPs3System.cpp b/lib/libUPnP/Neptune/Source/System/PS3/NptPs3System.cpp
new file mode 100644
index 0000000..30ecd1f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/PS3/NptPs3System.cpp
@@ -0,0 +1,113 @@
+/*****************************************************************
+|
+| Neptune - System :: PS3 Implementation
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <time.h>
+#include <sys/timer.h>
+#include <sys/sys_time.h>
+#include <unistd.h>
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptSystem.h"
+#include "NptResults.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| NPT_System::GetProcessId
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetProcessId(NPT_Integer& id)
+{
+ id = 0;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetCurrentTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetCurrentTimeStamp(NPT_TimeStamp& now)
+{
+ sys_time_sec_t sec;
+ sys_time_nsec_t nsec;
+
+ int result = sys_time_get_current_time(&sec, &nsec);
+ if (result != CELL_OK){
+ now.m_Seconds = 0;
+ now.m_NanoSeconds = 0;
+ return NPT_FAILURE;
+ }
+
+ /* convert format */
+ now.m_Seconds = sec;
+ now.m_NanoSeconds = nsec;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::Sleep
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::Sleep(const NPT_TimeInterval& duration)
+{
+ unsigned long usecs = 1000000*duration.m_Seconds + duration.m_NanoSeconds/1000;
+ sys_timer_usleep(usecs);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SleepUntil
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SleepUntil(const NPT_TimeStamp& when)
+{
+ NPT_TimeStamp now;
+ GetCurrentTimeStamp(now);
+ if (when > now) {
+ NPT_TimeInterval duration = when-now;
+ return NPT_System::Sleep(duration);
+ } else {
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SetRandomSeed
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SetRandomSeed(unsigned int seed)
+{
+ srand(seed);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetRandomInteger
++---------------------------------------------------------------------*/
+NPT_Integer
+NPT_System::GetRandomInteger()
+{
+ static bool seeded = false;
+ if (!seeded) {
+ NPT_TimeStamp now;
+ GetCurrentTimeStamp(now);
+ srand(now.m_NanoSeconds);
+ seeded = true;
+ }
+
+ return rand();
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixDynamicLibraries.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixDynamicLibraries.cpp
new file mode 100644
index 0000000..60d057c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixDynamicLibraries.cpp
@@ -0,0 +1,111 @@
+/*****************************************************************
+|
+| Neptune - Dynamic Libraries :: Posix Implementation
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptLogging.h"
+#include "NptDynamicLibraries.h"
+
+#include <dlfcn.h>
+#ifndef RTLD_LOCAL
+#define RTLD_LOCAL 0
+#endif
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.posix.dynamic-libraries")
+
+/*----------------------------------------------------------------------
+| NPT_PosixDynamicLibrary
++---------------------------------------------------------------------*/
+class NPT_PosixDynamicLibrary : public NPT_DynamicLibraryInterface
+{
+public:
+ // constructor and destructor
+ NPT_PosixDynamicLibrary(void* library, const char* name) :
+ m_Library(library), m_Name(name) {}
+
+ // NPT_DynamicLibraryInterface methods
+ virtual NPT_Result FindSymbol(const char* name, void*& symbol);
+ virtual NPT_Result Unload();
+
+private:
+ // members
+ void* m_Library;
+ NPT_String m_Name;
+};
+
+/*----------------------------------------------------------------------
+| NPT_DynamicLibrary::Load
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DynamicLibrary::Load(const char* name, NPT_Flags flags, NPT_DynamicLibrary*& library)
+{
+ if (name == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // default return value
+ library = NULL;
+
+ // compute the mode
+ int mode = RTLD_LOCAL;
+ if (flags & NPT_DYANMIC_LIBRARY_LOAD_FLAG_NOW) {
+ mode |= RTLD_NOW;
+ } else {
+ mode |= RTLD_LAZY;
+ }
+
+ // load the lib
+ NPT_LOG_FINE_3("loading library %s, flags=%x, mode=%x", name, flags, mode);
+ void* handle = dlopen(name, mode);
+ if (handle == NULL) {
+#if defined(NPT_CONFIG_ENABLE_LOGGING)
+ const char* error = dlerror();
+ NPT_LOG_FINE_1("library cannot be loaded (%s)", error?error:"");
+#endif
+ return NPT_FAILURE;
+ }
+
+ // instantiate the object
+ NPT_LOG_FINE_1("library %s loaded", name);
+ library = new NPT_DynamicLibrary(new NPT_PosixDynamicLibrary(handle, name));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixDynamicLibrary::FindSymbol
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixDynamicLibrary::FindSymbol(const char* name, void*& symbol)
+{
+ if (name == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+ symbol = NULL;
+ if (m_Library == NULL) return NPT_ERROR_NO_SUCH_ITEM;
+
+ NPT_LOG_FINE_1("finding symbol %s", name);
+ symbol = dlsym(m_Library, name);
+ return symbol?NPT_SUCCESS:NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixDynamicLibrary::Unload
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixDynamicLibrary::Unload()
+{
+ NPT_LOG_FINE_1("unloading library %s", (const char*)m_Name);
+ int result = dlclose(m_Library);
+ if (result == 0) {
+ return NPT_SUCCESS;
+ } else {
+ return NPT_FAILURE;
+ }
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixEnvironment.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixEnvironment.cpp
new file mode 100644
index 0000000..2426f91
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixEnvironment.cpp
@@ -0,0 +1,23 @@
+/*****************************************************************
+ |
+ | Neptune - System Support: Cocoa Implementation
+ |
+ | (c) 2002-2006 Gilles Boccon-Gibod
+ | Author: Sylvain Rebaud (sylvain@rebaud.com)
+ |
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptSystem.h"
+#include "NptUtils.h"
+
+#if defined(NPT_CONFIG_HAVE_SYSTEM_MACHINE_NAME)
+NPT_Result
+NPT_GetSystemMachineName(NPT_String& name)
+{
+ return NPT_GetEnvironment("USER", name);
+}
+#endif
diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixFile.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixFile.cpp
new file mode 100644
index 0000000..8cfe210
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixFile.cpp
@@ -0,0 +1,268 @@
+/*****************************************************************
+|
+| Neptune - File :: Posix Implementation
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#define _LARGEFILE_SOURCE
+#define _LARGEFILE_SOURCE64
+#define _LARGEFILE64_SOURCE
+#define _FILE_OFFSET_BITS 64
+
+#include <sys/stat.h>
+
+#include <errno.h>
+
+#if defined(_WIN32)
+#include <direct.h>
+#include <stdlib.h>
+#include <stdio.h>
+#else
+#include <unistd.h>
+#include <dirent.h>
+#endif
+
+#include "NptConfig.h"
+#include "NptLogging.h"
+#include "NptFile.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+//NPT_SET_LOCAL_LOGGER("neptune.posix.file")
+
+/*----------------------------------------------------------------------
+| Win32 adaptation
++---------------------------------------------------------------------*/
+#if defined(_WIN32) || defined(_XBOX)
+extern int NPT_stat_utf8(const char* path, NPT_stat_struct* info);
+extern char* NPT_getcwd_utf8(char* path, unsigned int path_size);
+#define getcwd NPT_getcwd_utf8
+#define S_ISDIR(_m) (((_m)&_S_IFMT) == _S_IFDIR)
+#define S_ISREG(_m) (((_m)&_S_IFMT) == _S_IFREG)
+#define S_IWUSR _S_IWRITE
+#endif
+
+/*----------------------------------------------------------------------
+| MapErrno
++---------------------------------------------------------------------*/
+static NPT_Result
+MapErrno(int err) {
+ switch (err) {
+ case EACCES: return NPT_ERROR_PERMISSION_DENIED;
+ case EPERM: return NPT_ERROR_PERMISSION_DENIED;
+ case ENOENT: return NPT_ERROR_NO_SUCH_FILE;
+ case ENAMETOOLONG: return NPT_ERROR_INVALID_PARAMETERS;
+ case EBUSY: return NPT_ERROR_FILE_BUSY;
+ case EROFS: return NPT_ERROR_FILE_NOT_WRITABLE;
+ case ENOTDIR: return NPT_ERROR_FILE_NOT_DIRECTORY;
+ case EEXIST: return NPT_ERROR_FILE_ALREADY_EXISTS;
+ case ENOSPC: return NPT_ERROR_FILE_NOT_ENOUGH_SPACE;
+ case ENOTEMPTY: return NPT_ERROR_DIRECTORY_NOT_EMPTY;
+ default: return NPT_ERROR_ERRNO(err);
+ }
+}
+
+#if !defined(_WIN32)
+/*----------------------------------------------------------------------
+| NPT_FilePath::Separator
++---------------------------------------------------------------------*/
+const char* const NPT_FilePath::Separator = "/";
+
+/*----------------------------------------------------------------------
+| NPT_File::GetRoots
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetRoots(NPT_List<NPT_String>& roots)
+{
+ roots.Clear();
+ roots.Add("/");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::CreateDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::CreateDir(const char* path)
+{
+ int result;
+
+ result = mkdir(path, 0755);
+ if (result != 0) {
+ return MapErrno(errno);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::RemoveFile
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::RemoveFile(const char* path)
+{
+ int result = unlink(path);
+ if (result != 0) return MapErrno(errno);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::RemoveDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::RemoveDir(const char* path)
+{
+ int result = rmdir(path);
+ if (result != 0) return MapErrno(errno);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Rename
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Rename(const char* from_path, const char* to_path)
+{
+ int result = rename(from_path, to_path);
+ if (result != 0) return MapErrno(errno);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::ListDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::ListDir(const char* path,
+ NPT_List<NPT_String>& entries,
+ NPT_Ordinal start /* = 0 */,
+ NPT_Cardinal max /* = 0 */)
+{
+ // default return value
+ entries.Clear();
+
+ // check the arguments
+ if (path == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // list the entries
+ DIR *directory = opendir(path);
+ if (directory == NULL) return NPT_ERROR_NO_SUCH_ITEM;
+
+ NPT_Cardinal count = 0;
+ for (;;) {
+ struct dirent* entry_pointer = NULL;
+#if defined(NPT_CONFIG_HAVE_READDIR_R)
+ struct dirent entry;
+ int result = readdir_r(directory, &entry, &entry_pointer);
+ if (result != 0 || entry_pointer == NULL) break;
+#else
+ entry_pointer = readdir(directory);
+ if (entry_pointer == NULL) break;
+#endif
+ // ignore odd names
+ if (entry_pointer->d_name[0] == '\0') continue;
+
+ // ignore . and ..
+ if (entry_pointer->d_name[0] == '.' &&
+ entry_pointer->d_name[1] == '\0') {
+ continue;
+ }
+ if (entry_pointer->d_name[0] == '.' &&
+ entry_pointer->d_name[1] == '.' &&
+ entry_pointer->d_name[2] == '\0') {
+ continue;
+ }
+
+ // continue if we still have some items to skip
+ if (start > 0) {
+ --start;
+ continue;
+ }
+ entries.Add(NPT_String(entry_pointer->d_name));
+
+ // stop when we have reached the maximum requested
+ if (max && ++count == max) break;
+ }
+
+ closedir(directory);
+
+ return NPT_SUCCESS;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_File::GetWorkingDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetWorkingDir(NPT_String& path)
+{
+ char buffer[1024+1];
+ char* dir = getcwd(buffer, 1024+1);
+ if (dir == NULL) return MapErrno(errno);
+ path = dir;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetInfo(const char* path, NPT_FileInfo* info)
+{
+ // default value
+ if (info) NPT_SetMemory(info, 0, sizeof(*info));
+
+#if defined(_WIN32) || defined(_XBOX)
+ // On Windows, stat will fail if a dir ends with a separator
+ NPT_String _path = path;
+ _path.TrimRight("\\/");
+ // keep a separator at the end for drive names such as C:<backslash>
+ if (NPT_StringLength(_path) == 2 && _path[1] == ':') {
+ _path += NPT_FilePath::Separator;
+ }
+#else
+#define _path path
+#endif
+
+ // get the file info
+ NPT_stat_struct stat_buffer;
+ int result = NPT_stat(_path, &stat_buffer);
+ if (result != 0) return MapErrno(errno);
+
+ // setup the returned fields
+ if (info) {
+ info->m_Size = stat_buffer.st_size;
+ if (S_ISREG(stat_buffer.st_mode)) {
+ info->m_Type = NPT_FileInfo::FILE_TYPE_REGULAR;
+ } else if (S_ISDIR(stat_buffer.st_mode)) {
+ info->m_Type = NPT_FileInfo::FILE_TYPE_DIRECTORY;
+ } else {
+ info->m_Type = NPT_FileInfo::FILE_TYPE_OTHER;
+ }
+ info->m_AttributesMask &= NPT_FILE_ATTRIBUTE_READ_ONLY;
+ if ((stat_buffer.st_mode & S_IWUSR) == 0) {
+ info->m_Attributes &= NPT_FILE_ATTRIBUTE_READ_ONLY;
+ }
+#if defined(NPT_CONFIG_HAVE_STAT_ST_BIRTHTIME)
+ info->m_CreationTime.SetSeconds(stat_buffer.st_birthtime);
+#elif defined(NPT_CONFIG_STAT_ST_CTIME_IS_ST_BIRTHTIME)
+ info->m_CreationTime.SetSeconds(stat_buffer.st_ctime);
+#else
+ info->m_CreationTime.SetSeconds(0);
+#endif
+ info->m_ModificationTime.SetSeconds(stat_buffer.st_mtime);
+ }
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixNetwork.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixNetwork.cpp
new file mode 100644
index 0000000..cf0b29f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixNetwork.cpp
@@ -0,0 +1,35 @@
+/*****************************************************************
+|
+| Neptune - Network :: POSIX Implementation
+|
+| (c) 2001-2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+
+#if defined(NPT_CONFIG_HAVE_NETCONFIG_H)
+#include <netconfig.h>
+
+#include "NptTypes.h"
+#include "NptStreams.h"
+#include "NptThreads.h"
+#include "NptNetwork.h"
+#include "NptUtils.h"
+#include "NptConstants.h"
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::GetNetworkInterfaces
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces)
+{
+ interfaces.Clear();
+ return NPT_SUCCESS;
+}
+
+#endif
diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixQueue.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixQueue.cpp
new file mode 100644
index 0000000..ad7977b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixQueue.cpp
@@ -0,0 +1,330 @@
+/*****************************************************************
+|
+| Neptune - Queue :: Posix Implementation
+|
+| (c) 2001-2002 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#if defined(__SYMBIAN32__)
+#include <stdio.h>
+#endif
+#include <pthread.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptQueue.h"
+#include "NptThreads.h"
+#include "NptList.h"
+#include "NptLogging.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.queue.posix")
+
+/*----------------------------------------------------------------------
+| NPT_PosixQueue
++---------------------------------------------------------------------*/
+class NPT_PosixQueue : public NPT_GenericQueue
+{
+public:
+ // methods
+ NPT_PosixQueue(NPT_Cardinal max_items);
+ ~NPT_PosixQueue() override;
+ NPT_Result Push(NPT_QueueItem* item, NPT_Timeout timeout) override;
+ NPT_Result Pop(NPT_QueueItem*& item, NPT_Timeout timeout) override;
+ NPT_Result Peek(NPT_QueueItem*& item, NPT_Timeout timeout) override;
+
+private:
+ void Abort();
+ NPT_Result GetTimeOut(NPT_Timeout timeout, struct timespec& timed);
+
+private:
+ // members
+ NPT_Cardinal m_MaxItems;
+ pthread_mutex_t m_Mutex;
+ pthread_cond_t m_CanPushCondition;
+ pthread_cond_t m_CanPopCondition;
+ NPT_Cardinal m_PushersWaitingCount;
+ NPT_Cardinal m_PoppersWaitingCount;
+ NPT_List<NPT_QueueItem*> m_Items;
+ bool m_Aborting;
+};
+
+/*----------------------------------------------------------------------
+| NPT_PosixQueue::NPT_PosixQueue
++---------------------------------------------------------------------*/
+NPT_PosixQueue::NPT_PosixQueue(NPT_Cardinal max_items) :
+ m_MaxItems(max_items),
+ m_PushersWaitingCount(0),
+ m_PoppersWaitingCount(0),
+ m_Aborting(false)
+{
+ pthread_mutex_init(&m_Mutex, NULL);
+ pthread_cond_init(&m_CanPushCondition, NULL);
+ pthread_cond_init(&m_CanPopCondition, NULL);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixQueue::~NPT_PosixQueue()
++---------------------------------------------------------------------*/
+NPT_PosixQueue::~NPT_PosixQueue()
+{
+ Abort();
+
+ // destroy resources
+ pthread_cond_destroy(&m_CanPushCondition);
+ pthread_cond_destroy(&m_CanPopCondition);
+ pthread_mutex_destroy(&m_Mutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixQueue::Abort
++---------------------------------------------------------------------*/
+void
+NPT_PosixQueue::Abort()
+{
+ pthread_cond_t abort_condition;
+ pthread_cond_init(&abort_condition, NULL);
+
+ struct timespec timed;
+ GetTimeOut(20, timed);
+
+ // acquire mutex
+ if (pthread_mutex_lock(&m_Mutex)) {
+ return;
+ }
+
+ // tell other threads that they should exit immediately
+ m_Aborting = true;
+
+ // notify clients
+ pthread_cond_broadcast(&m_CanPopCondition);
+ pthread_cond_broadcast(&m_CanPushCondition);
+
+ // wait for all waiters to exit
+ while (m_PoppersWaitingCount > 0 || m_PushersWaitingCount > 0) {
+ pthread_cond_timedwait(&abort_condition,
+ &m_Mutex,
+ &timed);
+ }
+
+ pthread_mutex_unlock(&m_Mutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixQueue::GetTimeOut
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixQueue::GetTimeOut(NPT_Timeout timeout, struct timespec& timed)
+{
+ if (timeout != NPT_TIMEOUT_INFINITE) {
+ // get current time from system
+ struct timeval now;
+ if (gettimeofday(&now, NULL)) {
+ return NPT_FAILURE;
+ }
+
+ now.tv_usec += timeout * 1000;
+ if (now.tv_usec >= 1000000) {
+ now.tv_sec += now.tv_usec / 1000000;
+ now.tv_usec = now.tv_usec % 1000000;
+ }
+
+ // setup timeout
+ timed.tv_sec = now.tv_sec;
+ timed.tv_nsec = now.tv_usec * 1000;
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixQueue::Push
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixQueue::Push(NPT_QueueItem* item, NPT_Timeout timeout)
+{
+ struct timespec timed;
+ if (timeout != NPT_TIMEOUT_INFINITE) {
+ NPT_CHECK(GetTimeOut(timeout, timed));
+ }
+
+ // lock the mutex that protects the list
+ if (pthread_mutex_lock(&m_Mutex)) {
+ return NPT_FAILURE;
+ }
+
+ NPT_Result result = NPT_SUCCESS;
+ // check that we have not exceeded the max
+ if (m_MaxItems) {
+ while (m_Items.GetItemCount() >= m_MaxItems) {
+ // wait until we can push
+ ++m_PushersWaitingCount;
+ if (timeout == NPT_TIMEOUT_INFINITE) {
+ pthread_cond_wait(&m_CanPushCondition, &m_Mutex);
+ --m_PushersWaitingCount;
+ } else {
+ int wait_res = pthread_cond_timedwait(&m_CanPushCondition,
+ &m_Mutex,
+ &timed);
+ --m_PushersWaitingCount;
+ if (wait_res == ETIMEDOUT) {
+ result = NPT_ERROR_TIMEOUT;
+ break;
+ }
+ }
+
+ if (m_Aborting) {
+ result = NPT_ERROR_INTERRUPTED;
+ break;
+ }
+ }
+ }
+
+ // add the item to the list
+ if (result == NPT_SUCCESS) {
+ m_Items.Add(item);
+
+ // wake up any thread that may be waiting to pop
+ if (m_PoppersWaitingCount) {
+ pthread_cond_broadcast(&m_CanPopCondition);
+ }
+ }
+
+ // unlock the mutex
+ pthread_mutex_unlock(&m_Mutex);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixQueue::Pop
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixQueue::Pop(NPT_QueueItem*& item, NPT_Timeout timeout)
+{
+ struct timespec timed;
+ if (timeout != NPT_TIMEOUT_INFINITE) {
+ NPT_CHECK(GetTimeOut(timeout, timed));
+ }
+
+ // lock the mutex that protects the list
+ if (pthread_mutex_lock(&m_Mutex)) {
+ return NPT_FAILURE;
+ }
+
+ NPT_Result result;
+ if (timeout) {
+ while ((result = m_Items.PopHead(item)) == NPT_ERROR_LIST_EMPTY) {
+ // no item in the list, wait for one
+ ++m_PoppersWaitingCount;
+ if (timeout == NPT_TIMEOUT_INFINITE) {
+ pthread_cond_wait(&m_CanPopCondition, &m_Mutex);
+ --m_PoppersWaitingCount;
+ } else {
+ int wait_res = pthread_cond_timedwait(&m_CanPopCondition,
+ &m_Mutex,
+ &timed);
+ --m_PoppersWaitingCount;
+ if (wait_res == ETIMEDOUT) {
+ result = NPT_ERROR_TIMEOUT;
+ break;
+ }
+ }
+
+ if (m_Aborting) {
+ result = NPT_ERROR_INTERRUPTED;
+ break;
+ }
+ }
+ } else {
+ result = m_Items.PopHead(item);
+ }
+
+ // wake up any thread that my be waiting to push
+ if (m_MaxItems && (result == NPT_SUCCESS) && m_PushersWaitingCount) {
+ pthread_cond_broadcast(&m_CanPushCondition);
+ }
+
+ // unlock the mutex
+ pthread_mutex_unlock(&m_Mutex);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixQueue::Peek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixQueue::Peek(NPT_QueueItem*& item, NPT_Timeout timeout)
+{
+ struct timespec timed;
+ if (timeout != NPT_TIMEOUT_INFINITE) {
+ NPT_CHECK(GetTimeOut(timeout, timed));
+ }
+
+ // lock the mutex that protects the list
+ if (pthread_mutex_lock(&m_Mutex)) {
+ return NPT_FAILURE;
+ }
+
+ NPT_Result result = NPT_SUCCESS;
+ NPT_List<NPT_QueueItem*>::Iterator head = m_Items.GetFirstItem();
+ if (timeout) {
+ while (!head) {
+ // no item in the list, wait for one
+ ++m_PoppersWaitingCount;
+ if (timeout == NPT_TIMEOUT_INFINITE) {
+ pthread_cond_wait(&m_CanPopCondition, &m_Mutex);
+ --m_PoppersWaitingCount;
+ } else {
+ int wait_res = pthread_cond_timedwait(&m_CanPopCondition,
+ &m_Mutex,
+ &timed);
+ --m_PoppersWaitingCount;
+ if (wait_res == ETIMEDOUT) {
+ result = NPT_ERROR_TIMEOUT;
+ break;
+ }
+ }
+
+ if (m_Aborting) {
+ result = NPT_ERROR_INTERRUPTED;
+ break;
+ }
+
+ head = m_Items.GetFirstItem();
+ }
+ } else {
+ if (!head) result = NPT_ERROR_LIST_EMPTY;
+ }
+
+ item = head?*head:NULL;
+
+ // unlock the mutex
+ pthread_mutex_unlock(&m_Mutex);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_GenericQueue::CreateInstance
++---------------------------------------------------------------------*/
+NPT_GenericQueue*
+NPT_GenericQueue::CreateInstance(NPT_Cardinal max_items)
+{
+ NPT_LOG_FINER_1("queue max_items = %d", (int)max_items);
+ return new NPT_PosixQueue(max_items);
+}
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixSystem.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixSystem.cpp
new file mode 100644
index 0000000..4fb31a0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixSystem.cpp
@@ -0,0 +1,201 @@
+/*****************************************************************
+|
+| Neptune - System :: Posix Implementation
+|
+| (c) 2001-2003 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <time.h>
+#include <sys/time.h>
+#include <pthread.h>
+#include <unistd.h>
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptSystem.h"
+#include "NptResults.h"
+#include "NptDebug.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| NPT_PosixSystem
++---------------------------------------------------------------------*/
+class NPT_PosixSystem
+{
+public:
+ // class variables
+ static NPT_PosixSystem System;
+
+ // methods
+ NPT_PosixSystem();
+ ~NPT_PosixSystem();
+
+ // members
+ pthread_mutex_t m_SleepMutex;
+ pthread_cond_t m_SleepCondition;
+};
+NPT_PosixSystem NPT_PosixSystem::System;
+
+/*----------------------------------------------------------------------
+| NPT_PosixSystem::NPT_PosixSystem
++---------------------------------------------------------------------*/
+NPT_PosixSystem::NPT_PosixSystem()
+{
+ pthread_mutex_init(&m_SleepMutex, NULL);
+ pthread_cond_init(&m_SleepCondition, NULL);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixSystem::~NPT_PosixSystem
++---------------------------------------------------------------------*/
+NPT_PosixSystem::~NPT_PosixSystem()
+{
+ pthread_cond_destroy(&m_SleepCondition);
+ pthread_mutex_destroy(&m_SleepMutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetProcessId
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetProcessId(NPT_UInt32& id)
+{
+ id = getpid();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_GetSystemMachineName
++---------------------------------------------------------------------*/
+#if !defined(NPT_CONFIG_HAVE_SYSTEM_MACHINE_NAME)
+NPT_Result NPT_GetSystemMachineName(NPT_String& /*name*/)
+{
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_System::GetMachineName
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetMachineName(NPT_String& name)
+{
+ return NPT_GetSystemMachineName(name);
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetCurrentTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetCurrentTimeStamp(NPT_TimeStamp& now)
+{
+ struct timeval now_tv;
+
+ // get current time from system
+ if (gettimeofday(&now_tv, NULL)) {
+ now.SetNanos(0);
+ return NPT_FAILURE;
+ }
+
+ // convert format
+ now.SetNanos((NPT_UInt64)now_tv.tv_sec * 1000000000 +
+ (NPT_UInt64)now_tv.tv_usec * 1000);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::Sleep
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::Sleep(const NPT_TimeInterval& duration)
+{
+ struct timespec time_req;
+ struct timespec time_rem;
+ int result;
+
+ // setup the time value
+ time_req.tv_sec = (time_t)duration.ToNanos()/1000000000;
+ time_req.tv_nsec = duration.ToNanos()%1000000000;
+
+ // sleep
+ do {
+ result = nanosleep(&time_req, &time_rem);
+ time_req = time_rem;
+ } while (result == -1 &&
+ errno == EINTR &&
+ (long)time_req.tv_sec >= 0 &&
+ (long)time_req.tv_nsec >= 0);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SleepUntil
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SleepUntil(const NPT_TimeStamp& when)
+{
+ struct timespec timeout;
+ struct timeval now;
+ int result;
+
+ // get current time from system
+ if (gettimeofday(&now, NULL)) {
+ return NPT_FAILURE;
+ }
+
+ // setup timeout
+ NPT_UInt64 limit = (NPT_UInt64)now.tv_sec*1000000000 +
+ (NPT_UInt64)now.tv_usec*1000 +
+ when.ToNanos();
+ timeout.tv_sec = (time_t)limit/1000000000;
+ timeout.tv_nsec = limit%1000000000;
+
+ // sleep
+ do {
+ result = pthread_cond_timedwait(&NPT_PosixSystem::System.m_SleepCondition,
+ &NPT_PosixSystem::System.m_SleepMutex,
+ &timeout);
+ if (result == ETIMEDOUT) {
+ return NPT_SUCCESS;
+ }
+ } while (result == EINTR);
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SetRandomSeed
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SetRandomSeed(unsigned int seed)
+{
+ srand(seed);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetRandomInteger
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_System::GetRandomInteger()
+{
+ static bool seeded = false;
+ if (seeded == false) {
+ NPT_TimeStamp now;
+ GetCurrentTimeStamp(now);
+ SetRandomSeed((NPT_UInt32)now.ToNanos());
+ seeded = true;
+ }
+
+ return rand();
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixThreads.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixThreads.cpp
new file mode 100644
index 0000000..510d3e9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixThreads.cpp
@@ -0,0 +1,716 @@
+/*****************************************************************
+|
+| Neptune - Threads :: Posix Implementation
+|
+| (c) 2001-2002 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#if defined(__SYMBIAN32__)
+#include <stdio.h>
+#endif
+#include <pthread.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptThreads.h"
+#include "NptLogging.h"
+#include "NptTime.h"
+#include "NptSystem.h"
+#include "NptUtils.h"
+#include "NptAutoreleasePool.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.threads.posix")
+
+/*----------------------------------------------------------------------
+| NPT_PosixMutex
++---------------------------------------------------------------------*/
+class NPT_PosixMutex : public NPT_MutexInterface
+{
+public:
+ // methods
+ NPT_PosixMutex(bool recursive = false);
+ ~NPT_PosixMutex() override;
+
+ // NPT_Mutex methods
+ NPT_Result Lock() override;
+ NPT_Result Unlock() override;
+
+private:
+ // members
+ pthread_mutex_t m_Mutex;
+};
+
+/*----------------------------------------------------------------------
+| NPT_PosixMutex::NPT_PosixMutex
++---------------------------------------------------------------------*/
+NPT_PosixMutex::NPT_PosixMutex(bool recursive)
+{
+ // Recursive by default
+ pthread_mutexattr_t attr;
+
+ if (recursive) {
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ }
+
+ pthread_mutex_init(&m_Mutex, recursive?&attr:NULL);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixMutex::~NPT_PosixMutex
++---------------------------------------------------------------------*/
+NPT_PosixMutex::~NPT_PosixMutex()
+{
+ pthread_mutex_destroy(&m_Mutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixMutex::Lock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixMutex::Lock()
+{
+ pthread_mutex_lock(&m_Mutex);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixMutex::Unlock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixMutex::Unlock()
+{
+ pthread_mutex_unlock(&m_Mutex);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Mutex::NPT_Mutex
++---------------------------------------------------------------------*/
+NPT_Mutex::NPT_Mutex(bool recursive)
+{
+ m_Delegate = new NPT_PosixMutex(recursive);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixSharedVariable
++---------------------------------------------------------------------*/
+class NPT_PosixSharedVariable : public NPT_SharedVariableInterface
+{
+public:
+ // methods
+ NPT_PosixSharedVariable(int value);
+ ~NPT_PosixSharedVariable() override;
+ void SetValue(int value) override;
+ int GetValue() override;
+ NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout) override;
+ NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout) override;
+
+ private:
+ // members
+ volatile int m_Value;
+ pthread_mutex_t m_Mutex;
+ pthread_cond_t m_Condition;
+};
+
+/*----------------------------------------------------------------------
+| NPT_PosixSharedVariable::NPT_PosixSharedVariable
++---------------------------------------------------------------------*/
+NPT_PosixSharedVariable::NPT_PosixSharedVariable(int value) :
+ m_Value(value)
+{
+ pthread_mutex_init(&m_Mutex, NULL);
+ pthread_cond_init(&m_Condition, NULL);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixSharedVariable::~NPT_PosixSharedVariable
++---------------------------------------------------------------------*/
+NPT_PosixSharedVariable::~NPT_PosixSharedVariable()
+{
+ pthread_cond_destroy(&m_Condition);
+ pthread_mutex_destroy(&m_Mutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixSharedVariable::SetValue
++---------------------------------------------------------------------*/
+void
+NPT_PosixSharedVariable::SetValue(int value)
+{
+ pthread_mutex_lock(&m_Mutex);
+ m_Value = value;
+ pthread_cond_broadcast(&m_Condition);
+ pthread_mutex_unlock(&m_Mutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixSharedVariable::GetValue
++---------------------------------------------------------------------*/
+int
+NPT_PosixSharedVariable::GetValue()
+{
+ // we assume that int read/write are atomic on the platform
+ return m_Value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixSharedVariable::WaitUntilEquals
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixSharedVariable::WaitUntilEquals(int value, NPT_Timeout timeout)
+{
+ NPT_Result result = NPT_SUCCESS;
+ struct timespec timed;
+
+ if (timeout != NPT_TIMEOUT_INFINITE) {
+ // get current time from system
+ struct timeval now;
+ if (gettimeofday(&now, NULL)) {
+ return NPT_FAILURE;
+ }
+
+ now.tv_usec += timeout * 1000;
+ if (now.tv_usec >= 1000000) {
+ now.tv_sec += now.tv_usec / 1000000;
+ now.tv_usec = now.tv_usec % 1000000;
+ }
+
+ // setup timeout
+ timed.tv_sec = now.tv_sec;
+ timed.tv_nsec = now.tv_usec * 1000;
+ }
+
+ pthread_mutex_lock(&m_Mutex);
+ while (value != m_Value) {
+ if (timeout == NPT_TIMEOUT_INFINITE) {
+ pthread_cond_wait(&m_Condition, &m_Mutex);
+ } else {
+ int wait_res = pthread_cond_timedwait(&m_Condition, &m_Mutex, &timed);
+ if (wait_res == ETIMEDOUT) {
+ result = NPT_ERROR_TIMEOUT;
+ break;
+ }
+ }
+ }
+ pthread_mutex_unlock(&m_Mutex);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixSharedVariable::WaitWhileEquals
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixSharedVariable::WaitWhileEquals(int value, NPT_Timeout timeout)
+{
+ NPT_Result result = NPT_SUCCESS;
+ struct timespec timed;
+
+ if (timeout != NPT_TIMEOUT_INFINITE) {
+ // get current time from system
+ struct timeval now;
+ if (gettimeofday(&now, NULL)) {
+ return NPT_FAILURE;
+ }
+
+ now.tv_usec += timeout * 1000;
+ if (now.tv_usec >= 1000000) {
+ now.tv_sec += now.tv_usec / 1000000;
+ now.tv_usec = now.tv_usec % 1000000;
+ }
+
+ // setup timeout
+ timed.tv_sec = now.tv_sec;
+ timed.tv_nsec = now.tv_usec * 1000;
+ }
+
+ pthread_mutex_lock(&m_Mutex);
+ while (value == m_Value) {
+ if (timeout == NPT_TIMEOUT_INFINITE) {
+ pthread_cond_wait(&m_Condition, &m_Mutex);
+ } else {
+ int wait_res = pthread_cond_timedwait(&m_Condition, &m_Mutex, &timed);
+ if (wait_res == ETIMEDOUT) {
+ result = NPT_ERROR_TIMEOUT;
+ break;
+ }
+ }
+ }
+ pthread_mutex_unlock(&m_Mutex);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SharedVariable::NPT_SharedVariable
++---------------------------------------------------------------------*/
+NPT_SharedVariable::NPT_SharedVariable(int value)
+{
+ m_Delegate = new NPT_PosixSharedVariable(value);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixAtomicVariable
++---------------------------------------------------------------------*/
+class NPT_PosixAtomicVariable : public NPT_AtomicVariableInterface
+{
+ public:
+ // methods
+ NPT_PosixAtomicVariable(int value);
+ ~NPT_PosixAtomicVariable() override;
+ int Increment() override;
+ int Decrement() override;
+ int GetValue() override;
+ void SetValue(int value) override;
+
+ private:
+ // members
+ volatile int m_Value;
+ pthread_mutex_t m_Mutex;
+};
+
+/*----------------------------------------------------------------------
+| NPT_PosixAtomicVariable::NPT_PosixAtomicVariable
++---------------------------------------------------------------------*/
+NPT_PosixAtomicVariable::NPT_PosixAtomicVariable(int value) :
+ m_Value(value)
+{
+ pthread_mutex_init(&m_Mutex, NULL);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixAtomicVariable::~NPT_PosixAtomicVariable
++---------------------------------------------------------------------*/
+NPT_PosixAtomicVariable::~NPT_PosixAtomicVariable()
+{
+ pthread_mutex_destroy(&m_Mutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixAtomicVariable::Increment
++---------------------------------------------------------------------*/
+int
+NPT_PosixAtomicVariable::Increment()
+{
+ int value;
+
+ pthread_mutex_lock(&m_Mutex);
+ value = ++m_Value;
+ pthread_mutex_unlock(&m_Mutex);
+
+ return value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixAtomicVariable::Decrement
++---------------------------------------------------------------------*/
+int
+NPT_PosixAtomicVariable::Decrement()
+{
+ int value;
+
+ pthread_mutex_lock(&m_Mutex);
+ value = --m_Value;
+ pthread_mutex_unlock(&m_Mutex);
+
+ return value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixAtomicVariable::GetValue
++---------------------------------------------------------------------*/
+int
+NPT_PosixAtomicVariable::GetValue()
+{
+ // we assume that int read/write are atomic on the platform
+ return m_Value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixAtomicVariable::SetValue
++---------------------------------------------------------------------*/
+void
+NPT_PosixAtomicVariable::SetValue(int value)
+{
+ pthread_mutex_lock(&m_Mutex);
+ m_Value = value;
+ pthread_mutex_unlock(&m_Mutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_AtomicVariable::NPT_AtomicVariable
++---------------------------------------------------------------------*/
+NPT_AtomicVariable::NPT_AtomicVariable(int value)
+{
+ m_Delegate = new NPT_PosixAtomicVariable(value);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread
++---------------------------------------------------------------------*/
+class NPT_PosixThread : public NPT_ThreadInterface
+{
+ public:
+ // methods
+ NPT_PosixThread(NPT_Thread* delegator,
+ NPT_Runnable& target,
+ bool detached);
+ ~NPT_PosixThread() override;
+ NPT_Result Start() override;
+ NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override;
+ NPT_Result CancelBlockerSocket() override;
+ NPT_Result SetPriority(int priority) override;
+ NPT_Result GetPriority(int& priority) override;
+
+ // class methods
+ static NPT_Result GetPriority(NPT_Thread::ThreadId thread_id, int& priority);
+ static NPT_Result SetPriority(NPT_Thread::ThreadId thread_id, int priority);
+
+ private:
+ // methods
+ static void* EntryPoint(void* argument);
+
+ // NPT_Runnable methods
+ void Run() override;
+
+ // NPT_Interruptible methods
+ NPT_Result Interrupt() override { return NPT_ERROR_NOT_IMPLEMENTED; }
+
+ // members
+ NPT_Thread* m_Delegator;
+ NPT_Runnable& m_Target;
+ bool m_Detached;
+ pthread_t m_ThreadId;
+ bool m_Joined;
+ NPT_PosixMutex m_JoinLock;
+ NPT_SharedVariable m_Done;
+};
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::NPT_PosixThread
++---------------------------------------------------------------------*/
+NPT_PosixThread::NPT_PosixThread(NPT_Thread* delegator,
+ NPT_Runnable& target,
+ bool detached) :
+ m_Delegator(delegator),
+ m_Target(target),
+ m_Detached(detached),
+ m_ThreadId(0),
+ m_Joined(false)
+{
+ NPT_LOG_FINE("NPT_PosixThread::NPT_PosixThread");
+ m_Done.SetValue(0);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::~NPT_PosixThread
++---------------------------------------------------------------------*/
+NPT_PosixThread::~NPT_PosixThread()
+{
+ //NPT_LOG_FINE_1("NPT_PosixThread::~NPT_PosixThread %lld\n", (NPT_Thread::ThreadId)m_ThreadId);
+
+ if (!m_Detached) {
+ // we're not detached, and not in the Run() method, so we need to
+ // wait until the thread is done
+ Wait();
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::GetCurrentThreadId
++---------------------------------------------------------------------*/
+NPT_Thread::ThreadId
+NPT_Thread::GetCurrentThreadId()
+{
+ pthread_t pid = pthread_self();
+ return (NPT_Thread::ThreadId)pid;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::SetCurrentThreadPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Thread::SetCurrentThreadPriority(int priority)
+{
+ return NPT_PosixThread::SetPriority(GetCurrentThreadId(), priority);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::GetCurrentThreadPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Thread::GetCurrentThreadPriority(int& priority)
+{
+ return NPT_PosixThread::GetPriority(GetCurrentThreadId(), priority);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::EntryPoint
++---------------------------------------------------------------------*/
+void*
+NPT_PosixThread::EntryPoint(void* argument)
+{
+ NPT_PosixThread* thread = reinterpret_cast<NPT_PosixThread*>(argument);
+
+ NPT_LOG_FINE("NPT_PosixThread::EntryPoint - in =======================");
+
+ // ensure there is the top level autorelease pool for each thread
+ NPT_AutoreleasePool pool;
+
+ // get the thread ID from this context, because m_ThreadId may not yet
+ // have been set by the parent thread in the Start() method
+ thread->m_ThreadId = pthread_self();
+
+ // set random seed per thread
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ NPT_System::SetRandomSeed((unsigned int)(now.ToNanos() + (long)thread->m_ThreadId));
+
+ // run the thread
+ thread->Run();
+
+ // Logging here will cause a crash on exit because LogManager may already be destroyed
+ //NPT_LOG_FINE("NPT_PosixThread::EntryPoint - out ======================");
+
+ // we're done with the thread object
+ // if we're detached, we need to delete ourselves
+ if (thread->m_Detached) {
+ delete thread->m_Delegator;
+ } else {
+ // notify we're done
+ thread->m_Done.SetValue(1);
+ }
+
+ // done
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::Start
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixThread::Start()
+{
+ NPT_LOG_FINE("NPT_PosixThread::Start - creating thread");
+
+ // reset values
+ m_Joined = false;
+ m_ThreadId = 0;
+ m_Done.SetValue(0);
+
+ pthread_attr_t *attributes = NULL;
+
+#if defined(NPT_CONFIG_THREAD_STACK_SIZE) && NPT_CONFIG_THREAD_STACK_SIZE
+ pthread_attr_t stack_size_attributes;
+ pthread_attr_init(&stack_size_attributes);
+ pthread_attr_setstacksize(&stack_size_attributes, NPT_CONFIG_THREAD_STACK_SIZE);
+ attributes = &stack_size_attributes;
+#endif
+
+ // use local copies of some of the object's members, because for
+ // detached threads, the object instance may have deleted itself
+ // before the pthread_create() function returns
+ bool detached = m_Detached;
+
+ // reset the joined flag
+ m_Joined = false;
+
+ // create the native thread
+ pthread_t thread_id;
+ int result = pthread_create(&thread_id, attributes, EntryPoint,
+ static_cast<NPT_PosixThread*>(this));
+ NPT_LOG_FINE_2("NPT_PosixThread::Start - id = %p, res=%d",
+ (void*)thread_id, result);
+ if (result != 0) {
+ // failed
+ return NPT_ERROR_ERRNO(result);
+ } else {
+ // detach the thread if we're not joinable
+ if (detached) {
+ pthread_detach(thread_id);
+ } else {
+ // store the thread ID (NOTE: this is also done by the thread Run() method
+ // but it is necessary to do it from both contexts, because we don't know
+ // which one will need it first.)
+ m_ThreadId = thread_id;
+ }
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::Run
++---------------------------------------------------------------------*/
+void
+NPT_PosixThread::Run()
+{
+ m_Target.Run();
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::Wait
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixThread::Wait(NPT_Timeout timeout /* = NPT_TIMEOUT_INFINITE */)
+{
+ void* return_value;
+ int result;
+
+ // check that we're not detached
+ if (m_ThreadId == 0 || m_Detached) {
+ return NPT_FAILURE;
+ }
+
+ // wait for the thread to finish
+ m_JoinLock.Lock();
+ if (m_Joined) {
+ result = 0;
+ } else {
+ if (timeout != NPT_TIMEOUT_INFINITE) {
+ result = m_Done.WaitUntilEquals(1, timeout);
+ if (NPT_FAILED(result)) {
+ result = -1;
+ goto timedout;
+ }
+ }
+
+ result = pthread_join(m_ThreadId, &return_value);
+ m_Joined = true;
+ }
+
+timedout:
+ m_JoinLock.Unlock();
+ if (result != 0) {
+ return NPT_FAILURE;
+ } else {
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::CancelBlockerSocket
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixThread::CancelBlockerSocket()
+{
+ return NPT_Socket::CancelBlockerSocket((NPT_Thread::ThreadId)m_ThreadId);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::SetPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixThread::SetPriority(int priority)
+{
+ // check that we're started
+ if (m_ThreadId == 0) {
+ return NPT_FAILURE;
+ }
+
+ return NPT_PosixThread::SetPriority((NPT_Thread::ThreadId)m_ThreadId, priority);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::SetPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixThread::SetPriority(NPT_Thread::ThreadId thread_id, int priority)
+{
+ // check that we're started
+ if (thread_id == 0) {
+ return NPT_FAILURE;
+ }
+
+ /* sched_priority will be the priority of the thread */
+ struct sched_param sp;
+ int policy;
+ int result = pthread_getschedparam((pthread_t)thread_id, &policy, &sp);
+
+ NPT_LOG_FINER_3("Current thread policy: %d, priority: %d, new priority: %d",
+ policy, sp.sched_priority, priority);
+ NPT_LOG_FINER_4("Thread max(SCHED_OTHER): %d, max(SCHED_RR): %d \
+ min(SCHED_OTHER): %d, min(SCHED_RR): %d",
+ sched_get_priority_max(SCHED_OTHER),
+ sched_get_priority_max(SCHED_RR),
+ sched_get_priority_min(SCHED_OTHER),
+ sched_get_priority_min(SCHED_RR));
+
+ sp.sched_priority = priority;
+
+ /*
+ if (sp.sched_priority <= 0)
+ sp.sched_priority += sched_get_priority_max (policy = SCHED_OTHER);
+ else
+ sp.sched_priority += sched_get_priority_min (policy = SCHED_RR);
+ */
+
+ /* scheduling parameters of target thread */
+ result = pthread_setschedparam((pthread_t)thread_id, policy, &sp);
+
+ return (result==0)?NPT_SUCCESS:NPT_ERROR_ERRNO(result);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::GetPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixThread::GetPriority(int& priority)
+{
+ // check that we're started
+ if (m_ThreadId == 0) {
+ return NPT_FAILURE;
+ }
+
+ return NPT_PosixThread::GetPriority((NPT_Thread::ThreadId)m_ThreadId, priority);
+}
+
+/*----------------------------------------------------------------------
+| NPT_PosixThread::GetPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_PosixThread::GetPriority(NPT_Thread::ThreadId thread_id, int& priority)
+{
+ // check that we're started
+ if (thread_id == 0) {
+ return NPT_FAILURE;
+ }
+
+ struct sched_param sp;
+ int policy;
+
+ int result = pthread_getschedparam((pthread_t)thread_id, &policy, &sp);
+ NPT_LOG_FINER_1("Current thread priority: %d", sp.sched_priority);
+
+ priority = sp.sched_priority;
+ return (result==0)?NPT_SUCCESS:NPT_ERROR_ERRNO(result);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::NPT_Thread
++---------------------------------------------------------------------*/
+NPT_Thread::NPT_Thread(bool detached)
+{
+ m_Delegate = new NPT_PosixThread(this, *this, detached);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::NPT_Thread
++---------------------------------------------------------------------*/
+NPT_Thread::NPT_Thread(NPT_Runnable& target, bool detached)
+{
+ m_Delegate = new NPT_PosixThread(this, target, detached);
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixTime.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixTime.cpp
new file mode 100644
index 0000000..bfd8d70
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixTime.cpp
@@ -0,0 +1,98 @@
+/*****************************************************************
+|
+| Neptune - Time: Posix Implementation
+|
+| (c) 2002-2009 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <time.h>
+#include <errno.h>
+
+#include "NptTime.h"
+#include "NptResults.h"
+#include "NptLogging.h"
+#include "NptSystem.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+//NPT_SET_LOCAL_LOGGER("neptune.system.posix.time")
+
+/*----------------------------------------------------------------------
+| compatibility wrappers
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_HAVE_GMTIME) && !defined(NPT_CONFIG_HAVE_GMTIME_R)
+static int gmtime_r(time_t* time, struct tm* _tm)
+{
+ struct tm* _gmt = gmtime(time);
+
+#if defined(_WIN32_WCE)
+ if (_gmt == NULL) return ENOENT;
+#else
+ if (_gmt== NULL) return errno;
+#endif
+
+ *_tm = *_gmt;
+ return 0;
+}
+#endif // defined(NPT_CONFIG_HAVE_GMTIME_S
+
+#if defined(NPT_CONFIG_HAVE_LOCALTIME) && !defined(NPT_CONFIG_HAVE_LOCALTIME_R)
+static int localtime_r(time_t* time, struct tm* _tm)
+{
+ struct tm* _local = localtime(time);
+
+#if defined(_WIN32_WCE)
+ if (_local == NULL) return ENOENT;
+#else
+ if (_local== NULL) return errno;
+#endif
+
+ *_tm = *_local;
+ return 0;
+}
+#endif // defined(NPT_CONFIG_HAVE_LOCALTIME_S
+
+#if defined(NPT_CONFIG_HAVE_TM_GMTOFF)
+/*----------------------------------------------------------------------
+| NPT_DateTime::GetLocalTimeZone
++---------------------------------------------------------------------*/
+NPT_Int32
+NPT_DateTime::GetLocalTimeZone()
+{
+ struct tm tm_local;
+ NPT_SetMemory(&tm_local, 0, sizeof(tm_local));
+ time_t epoch = 0;
+ localtime_r(&epoch, &tm_local);
+
+ return (NPT_Int32)(tm_local.tm_gmtoff/60);
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_DateTime::GetLocalTimeZone
++---------------------------------------------------------------------*/
+NPT_Int32
+NPT_DateTime::GetLocalTimeZone()
+{
+ time_t epoch = 0;
+
+ struct tm tm_gmt;
+ NPT_SetMemory(&tm_gmt, 0, sizeof(tm_gmt));
+ gmtime_r(&epoch, &tm_gmt);
+
+ struct tm tm_local;
+ NPT_SetMemory(&tm_local, 0, sizeof(tm_local));
+ localtime_r(&epoch, &tm_local);
+
+ time_t time_gmt = mktime(&tm_gmt);
+ time_t time_local = mktime(&tm_local);
+
+ return (NPT_Int32)((time_local-time_gmt)/60);
+}
+#endif
diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptSelectableMessageQueue.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptSelectableMessageQueue.cpp
new file mode 100644
index 0000000..3b48e2b
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Posix/NptSelectableMessageQueue.cpp
@@ -0,0 +1,84 @@
+/*****************************************************************
+|
+| Neptune - Selectable Message Queue
+|
+| (c) 2001-2003 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <unistd.h>
+
+#include "NptSelectableMessageQueue.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| NPT_SelectableMessageQueue::NPT_SelectableMessageQueue
++---------------------------------------------------------------------*/
+NPT_SelectableMessageQueue::NPT_SelectableMessageQueue()
+{
+ if (pipe(m_Pipe) != 0) {
+ m_Pipe[0] = -1;
+ m_Pipe[1] = -1;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_SelectableMessageQueue::~NPT_SelectableMessageQueue
++---------------------------------------------------------------------*/
+NPT_SelectableMessageQueue::~NPT_SelectableMessageQueue()
+{
+ close(m_Pipe[0]);
+ close(m_Pipe[1]);
+}
+
+/*----------------------------------------------------------------------
+| NPT_SelectableMessageQueue::QueueMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SelectableMessageQueue::QueueMessage(NPT_Message* message,
+ NPT_MessageHandler* handler)
+{
+ // first, queue the message
+ NPT_Result result = NPT_SimpleMessageQueue::QueueMessage(message, handler);
+
+ // then write a byte on the pipe to signal that there is a message
+ if (write(m_Pipe[1], "\0", 1) != 1) {
+ result = NPT_FAILURE;
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SelectableMessageQueue::PumpMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SelectableMessageQueue::PumpMessage(NPT_Timeout timeout)
+{
+ NPT_Result result = NPT_SimpleMessageQueue::PumpMessage(timeout);
+ if (NPT_SUCCEEDED(result)) {
+ // flush the event
+ FlushEvent();
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SelectableMessageQueue::FlushEvent
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_SelectableMessageQueue::FlushEvent()
+{
+ char buffer[1];
+ if (read(m_Pipe[0], buffer, 1) != 1) {
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+
diff --git a/lib/libUPnP/Neptune/Source/System/StdC/NptStdcConsole.cpp b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcConsole.cpp
new file mode 100644
index 0000000..9ca088c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcConsole.cpp
@@ -0,0 +1,25 @@
+/*****************************************************************
+|
+| Neptune - Console Support: StdC Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdio.h>
+
+#include "NptConfig.h"
+#include "NptConsole.h"
+
+/*----------------------------------------------------------------------
+| NPT_Console::Output
++---------------------------------------------------------------------*/
+void
+NPT_Console::Output(const char* message)
+{
+ printf("%s", message);
+}
diff --git a/lib/libUPnP/Neptune/Source/System/StdC/NptStdcDebug.cpp b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcDebug.cpp
new file mode 100644
index 0000000..ef07336
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcDebug.cpp
@@ -0,0 +1,30 @@
+/*****************************************************************
+|
+| File: NptStdcDebug.c
+|
+| Neptune - Debug Support: StdC Implementation
+|
+| (c) 2002-2009 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "NptConfig.h"
+#include "NptDefs.h"
+#include "NptTypes.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| NPT_DebugOuput
++---------------------------------------------------------------------*/
+void
+NPT_DebugOutput(const char* message)
+{
+ printf("%s", message);
+}
diff --git a/lib/libUPnP/Neptune/Source/System/StdC/NptStdcEnvironment.cpp b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcEnvironment.cpp
new file mode 100644
index 0000000..62894eb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcEnvironment.cpp
@@ -0,0 +1,80 @@
+/*****************************************************************
+|
+| Neptune - Environment variables: StdC Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+
+#include "NptConfig.h"
+#include "NptUtils.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| NPT_Environment::Get
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Environment::Get(const char* name, NPT_String& value)
+{
+ char* env = nullptr;
+
+ /* default value */
+ value.SetLength(0);
+
+#if defined(NPT_CONFIG_HAVE_GETENV)
+ env = getenv(name);
+ if (env) {
+ value = env;
+ return NPT_SUCCESS;
+ } else {
+ return NPT_ERROR_NO_SUCH_ITEM;
+ }
+#elif defined(NPT_CONFIG_HAVE_DUPENV_S)
+ if (dupenv_s(&env, NULL, name) != 0) {
+ return NPT_FAILURE;
+ } else if (env != NULL) {
+ value = env;
+ free(env);
+ return NPT_SUCCESS;
+ } else {
+ return NPT_ERROR_NO_SUCH_ITEM;
+ }
+#else
+ return NPT_ERROR_NOT_SUPPORTED;
+#endif
+}
+
+/*----------------------------------------------------------------------
+| NPT_Environment::Set
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Environment::Set(const char* name, const char* value)
+{
+ if (value) {
+#if defined(NPT_CONFIG_HAVE_SETENV)
+ // set the variable
+ setenv(name, value, 1); // ignore return value (some platforms have this function as void)
+ return NPT_SUCCESS;
+#elif defined(NPT_CONFIG_HAVE_PUTENV_S)
+ return putenv_s(name, value)==0?NPT_SUCCESS:NPT_FAILURE;
+#else
+ return NPT_ERROR_NOT_SUPPORTED;
+#endif
+ } else {
+ // remove the variable
+#if defined(NPT_CONFIG_HAVE_UNSETENV)
+ unsetenv(name); // ignore return value (some platforms have this function as void)
+ return NPT_SUCCESS;
+#elif defined(NPT_CONFIG_HAVE_PUTENV_S)
+ return putenv_s(name, "")==0?NPT_SUCCESS:NPT_FAILURE;
+#else
+ return NPT_ERROR_NOT_SUPPORTED;
+#endif
+ }
+}
diff --git a/lib/libUPnP/Neptune/Source/System/StdC/NptStdcFile.cpp b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcFile.cpp
new file mode 100644
index 0000000..cc549c3
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcFile.cpp
@@ -0,0 +1,509 @@
+/*****************************************************************
+|
+| Neptune - Files :: Standard C Implementation
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#define _LARGEFILE_SOURCE
+#define _LARGEFILE_SOURCE64
+#define _LARGEFILE64_SOURCE
+#define _FILE_OFFSET_BITS 64
+
+#include <stdio.h>
+#if !defined(_WIN32_WCE)
+#include <string.h>
+#include <sys/stat.h>
+#include <errno.h>
+#else
+#include <stdio.h>
+#define errno GetLastError()
+#endif
+
+#include "NptConfig.h"
+#include "NptUtils.h"
+#include "NptFile.h"
+#include "NptThreads.h"
+#include "NptInterfaces.h"
+#include "NptStrings.h"
+#include "NptDebug.h"
+
+#if defined(NPT_CONFIG_HAVE_SHARE_H)
+#include <share.h>
+#endif
+
+#if defined(_WIN32)
+extern FILE *NPT_fsopen_utf8(const char* path, const char* mode, int sh_flags);
+extern FILE *NPT_fopen_utf8(const char* path, const char* mode);
+#define fopen NPT_fopen_utf8
+#define fopen_s NPT_fopen_s_utf8
+#define _fsopen NPT_fsopen_utf8
+#endif
+
+/*----------------------------------------------------------------------
+| compatibility wrappers
++---------------------------------------------------------------------*/
+#if !defined(NPT_CONFIG_HAVE_FOPEN_S)
+static int fopen_s(FILE** file,
+ const char* filename,
+ const char* mode)
+{
+ *file = fopen(filename, mode);
+
+#if defined(_WIN32_WCE)
+ if (*file == NULL) return ENOENT;
+#else
+ if (*file == NULL) return errno;
+#endif
+ return 0;
+}
+#endif // defined(NPT_CONFIG_HAVE_FOPEN_S
+
+/*----------------------------------------------------------------------
+| MapErrno
++---------------------------------------------------------------------*/
+static NPT_Result
+MapErrno(int err) {
+ switch (err) {
+ case EACCES: return NPT_ERROR_PERMISSION_DENIED;
+ case EPERM: return NPT_ERROR_PERMISSION_DENIED;
+ case ENOENT: return NPT_ERROR_NO_SUCH_FILE;
+#if defined(ENAMETOOLONG)
+ case ENAMETOOLONG: return NPT_ERROR_INVALID_PARAMETERS;
+#endif
+ case EBUSY: return NPT_ERROR_FILE_BUSY;
+ case EROFS: return NPT_ERROR_FILE_NOT_WRITABLE;
+ case ENOTDIR: return NPT_ERROR_FILE_NOT_DIRECTORY;
+ default: return NPT_ERROR_ERRNO(err);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileWrapper
++---------------------------------------------------------------------*/
+class NPT_StdcFileWrapper
+{
+public:
+ // constructors and destructor
+ NPT_StdcFileWrapper(FILE* file, const char* name) : m_File(file), m_Name(name) {}
+ ~NPT_StdcFileWrapper() {
+ if (m_File != NULL &&
+ m_File != stdin &&
+ m_File != stdout &&
+ m_File != stderr) {
+ fclose(m_File);
+ }
+ }
+
+ // members
+ FILE* m_File;
+ NPT_String m_Name;
+};
+
+typedef NPT_Reference<NPT_StdcFileWrapper> NPT_StdcFileReference;
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileStream
++---------------------------------------------------------------------*/
+class NPT_StdcFileStream
+{
+public:
+ // constructors and destructor
+ NPT_StdcFileStream(NPT_StdcFileReference file) :
+ m_FileReference(file) {}
+
+ // NPT_FileInterface methods
+ NPT_Result Seek(NPT_Position offset);
+ NPT_Result Tell(NPT_Position& offset);
+ NPT_Result Flush();
+
+protected:
+ // constructors and destructors
+ virtual ~NPT_StdcFileStream() {}
+
+ // members
+ NPT_StdcFileReference m_FileReference;
+};
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileStream::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFileStream::Seek(NPT_Position offset)
+{
+ size_t result;
+
+ result = NPT_fseek(m_FileReference->m_File, offset, SEEK_SET);
+ if (result == 0) {
+ return NPT_SUCCESS;
+ } else {
+ return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileStream::Tell
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFileStream::Tell(NPT_Position& offset)
+{
+ offset = 0;
+
+ NPT_Int64 pos = NPT_ftell(m_FileReference->m_File);
+ if (pos < 0) return NPT_FAILURE;
+
+ offset = pos;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileStream::Flush
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFileStream::Flush()
+{
+ fflush(m_FileReference->m_File);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileInputStream
++---------------------------------------------------------------------*/
+class NPT_StdcFileInputStream : public NPT_InputStream,
+ private NPT_StdcFileStream
+
+{
+public:
+ // constructors and destructor
+ NPT_StdcFileInputStream(NPT_StdcFileReference& file) :
+ NPT_StdcFileStream(file) {}
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read);
+ NPT_Result Seek(NPT_Position offset) {
+ return NPT_StdcFileStream::Seek(offset);
+ }
+ NPT_Result Tell(NPT_Position& offset) {
+ return NPT_StdcFileStream::Tell(offset);
+ }
+ NPT_Result GetSize(NPT_LargeSize& size);
+ NPT_Result GetAvailable(NPT_LargeSize& available);
+};
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFileInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ size_t nb_read;
+
+ // check the parameters
+ if (buffer == NULL) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // read from the file
+ nb_read = fread(buffer, 1, bytes_to_read, m_FileReference->m_File);
+ if (nb_read > 0) {
+ if (bytes_read) *bytes_read = (NPT_Size)nb_read;
+ return NPT_SUCCESS;
+ } else if (feof(m_FileReference->m_File)) {
+ if (bytes_read) *bytes_read = 0;
+ return NPT_ERROR_EOS;
+ } else {
+ if (bytes_read) *bytes_read = 0;
+ return MapErrno(errno);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileInputStream::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFileInputStream::GetSize(NPT_LargeSize& size)
+{
+ NPT_FileInfo file_info;
+ NPT_Result result = NPT_File::GetInfo(m_FileReference->m_Name, &file_info);
+ if (NPT_FAILED(result)) return result;
+ size = file_info.m_Size;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFileInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ NPT_Int64 offset = NPT_ftell(m_FileReference->m_File);
+ NPT_LargeSize size = 0;
+
+ if (NPT_SUCCEEDED(GetSize(size)) && offset >= 0 && (NPT_LargeSize)offset <= size) {
+ available = size - offset;
+ return NPT_SUCCESS;
+ } else {
+ available = 0;
+ return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileOutputStream
++---------------------------------------------------------------------*/
+class NPT_StdcFileOutputStream : public NPT_OutputStream,
+ private NPT_StdcFileStream
+{
+public:
+ // constructors and destructor
+ NPT_StdcFileOutputStream(NPT_StdcFileReference& file) :
+ NPT_StdcFileStream(file) {}
+
+ // NPT_InputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written);
+ NPT_Result Seek(NPT_Position offset) {
+ return NPT_StdcFileStream::Seek(offset);
+ }
+ NPT_Result Tell(NPT_Position& offset) {
+ return NPT_StdcFileStream::Tell(offset);
+ }
+ NPT_Result Flush() {
+ return NPT_StdcFileStream::Flush();
+ }
+};
+
+/*----------------------------------------------------------------------
+| NPT_StdcFileOutputStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFileOutputStream::Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written)
+{
+ size_t nb_written;
+
+ nb_written = fwrite(buffer, 1, bytes_to_write, m_FileReference->m_File);
+
+ if (nb_written > 0) {
+ if (bytes_written) *bytes_written = (NPT_Size)nb_written;
+ return NPT_SUCCESS;
+ } else {
+ if (bytes_written) *bytes_written = 0;
+ return NPT_ERROR_WRITE_FAILED;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFile
++---------------------------------------------------------------------*/
+class NPT_StdcFile: public NPT_FileInterface
+{
+public:
+ // constructors and destructor
+ NPT_StdcFile(NPT_File& delegator);
+ ~NPT_StdcFile();
+
+ // NPT_FileInterface methods
+ NPT_Result Open(OpenMode mode);
+ NPT_Result Close();
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream);
+
+private:
+ // members
+ NPT_File& m_Delegator;
+ OpenMode m_Mode;
+ NPT_StdcFileReference m_FileReference;
+};
+
+/*----------------------------------------------------------------------
+| NPT_StdcFile::NPT_StdcFile
++---------------------------------------------------------------------*/
+NPT_StdcFile::NPT_StdcFile(NPT_File& delegator) :
+ m_Delegator(delegator),
+ m_Mode(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFile::~NPT_StdcFile
++---------------------------------------------------------------------*/
+NPT_StdcFile::~NPT_StdcFile()
+{
+ Close();
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFile::Open
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFile::Open(NPT_File::OpenMode mode)
+{
+ FILE* file = NULL;
+
+ // check if we're already open
+ if (!m_FileReference.IsNull()) {
+ return NPT_ERROR_FILE_ALREADY_OPEN;
+ }
+
+ // store the mode
+ m_Mode = mode;
+
+ // check for special names
+ const char* name = (const char*)m_Delegator.GetPath();
+ if (NPT_StringsEqual(name, NPT_FILE_STANDARD_INPUT)) {
+ file = stdin;
+ } else if (NPT_StringsEqual(name, NPT_FILE_STANDARD_OUTPUT)) {
+ file = stdout;
+ } else if (NPT_StringsEqual(name, NPT_FILE_STANDARD_ERROR)) {
+ file = stderr;
+ } else {
+ // compute mode
+ const char* fmode = "";
+ if (mode & NPT_FILE_OPEN_MODE_WRITE) {
+ if (mode & NPT_FILE_OPEN_MODE_APPEND) {
+ /* write, read, create, append */
+ /* (append implies create) */
+ fmode = "a+b";
+ } else {
+ if ((mode & NPT_FILE_OPEN_MODE_CREATE) || (mode & NPT_FILE_OPEN_MODE_TRUNCATE)) {
+ /* write, read, create, truncate */
+ /* (truncate implies create, create implies truncate) */
+ fmode = "w+b";
+ } else {
+ /* write, read */
+ fmode = "r+b";
+ }
+ }
+ } else {
+ /* read only */
+ fmode = "rb";
+ }
+
+ // open the file
+#if defined(NPT_CONFIG_HAVE_FSOPEN)
+ file = _fsopen(name, fmode, _SH_DENYNO);
+ int open_result = file == NULL ? ENOENT : 0;
+#else
+ int open_result = fopen_s(&file, name, fmode);
+#endif
+
+ // test the result of the open
+ if (open_result != 0) return MapErrno(open_result);
+ }
+
+ // unbuffer the file if needed
+ if ((mode & NPT_FILE_OPEN_MODE_UNBUFFERED) && file != NULL) {
+#if !defined(_WIN32_WCE)
+ setvbuf(file, NULL, _IONBF, 0);
+#endif
+ }
+
+ // create a reference to the FILE object
+ m_FileReference = new NPT_StdcFileWrapper(file, name);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFile::Close
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFile::Close()
+{
+ // release the file reference
+ m_FileReference = NULL;
+
+ // reset the mode
+ m_Mode = 0;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFile::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFile::GetInputStream(NPT_InputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ // check that the file is open
+ if (m_FileReference.IsNull()) return NPT_ERROR_FILE_NOT_OPEN;
+
+ // check that the mode is compatible
+ if (!(m_Mode & NPT_FILE_OPEN_MODE_READ)) {
+ return NPT_ERROR_FILE_NOT_READABLE;
+ }
+
+ // create a stream
+ stream = new NPT_StdcFileInputStream(m_FileReference);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_StdcFile::GetOutputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_StdcFile::GetOutputStream(NPT_OutputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ // check that the file is open
+ if (m_FileReference.IsNull()) return NPT_ERROR_FILE_NOT_OPEN;
+
+ // check that the mode is compatible
+ if (!(m_Mode & NPT_FILE_OPEN_MODE_WRITE)) {
+ return NPT_ERROR_FILE_NOT_WRITABLE;
+ }
+
+ // create a stream
+ stream = new NPT_StdcFileOutputStream(m_FileReference);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::NPT_File
++---------------------------------------------------------------------*/
+NPT_File::NPT_File(const char* path) : m_Path(path), m_IsSpecial(false)
+{
+ m_Delegate = new NPT_StdcFile(*this);
+
+ if (NPT_StringsEqual(path, NPT_FILE_STANDARD_INPUT) ||
+ NPT_StringsEqual(path, NPT_FILE_STANDARD_OUTPUT) ||
+ NPT_StringsEqual(path, NPT_FILE_STANDARD_ERROR)) {
+ m_IsSpecial = true;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::operator=
++---------------------------------------------------------------------*/
+NPT_File&
+NPT_File::operator=(const NPT_File& file)
+{
+ if (this != &file) {
+ delete m_Delegate;
+ m_Path = file.m_Path;
+ m_IsSpecial = file.m_IsSpecial;
+ m_Delegate = new NPT_StdcFile(*this);
+ }
+ return *this;
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/Symbian/NptSymbianSystem.cpp b/lib/libUPnP/Neptune/Source/System/Symbian/NptSymbianSystem.cpp
new file mode 100644
index 0000000..efcb461
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Symbian/NptSymbianSystem.cpp
@@ -0,0 +1,116 @@
+/*****************************************************************
+|
+| Neptune - System :: Win32 Implementation
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "e32cmn.h"
+#include "e32math.h"
+#include "sys/time.h"
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptSystem.h"
+#include "NptResults.h"
+#include "NptDebug.h"
+
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static TInt64 NPT_System_RandomGeneratorSeed = 0;
+
+
+/*----------------------------------------------------------------------
+| NPT_System::GetProcessId
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetProcessId(NPT_UInt32& id)
+{
+ //id = getpid();
+ id = 0;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetCurrentTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetCurrentTimeStamp(NPT_TimeStamp& now)
+{
+ struct timeval now_tv;
+
+ /* get current time from system */
+ if (gettimeofday(&now_tv, NULL)) {
+ now.m_Seconds = 0;
+ now.m_NanoSeconds = 0;
+ return NPT_FAILURE;
+ }
+
+ /* convert format */
+ now.m_Seconds = now_tv.tv_sec;
+ now.m_NanoSeconds = now_tv.tv_usec * 1000;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::Sleep
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::Sleep(const NPT_TimeInterval& duration)
+{
+ TTimeIntervalMicroSeconds32 milliseconds = 1000*duration.m_Seconds + duration.m_NanoSeconds/1000000;
+ User::After(milliseconds); /* FIXME: this doesn't behave like a normal sleep() where the processor idles. Need to use CTimer much more complicated logic. */
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SleepUntil
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SleepUntil(const NPT_TimeStamp& when)
+{
+ NPT_TimeStamp now;
+ GetCurrentTimeStamp(now);
+ if (when > now) {
+ NPT_TimeInterval duration = when-now;
+ return Sleep(duration);
+ } else {
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SetRandomSeed
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SetRandomSeed(unsigned int seed)
+{
+ NPT_System_RandomGeneratorSeed = seed;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::NPT_System
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_System::GetRandomInteger()
+{
+ if (!NPT_System_RandomGeneratorSeed) {
+ TTime time;
+ time.HomeTime();
+
+ NPT_System::SetRandomSeed(time.Int64());
+ }
+
+ return Math::Rand(NPT_System_RandomGeneratorSeed);
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Console.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Console.cpp
new file mode 100644
index 0000000..e897f8a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Console.cpp
@@ -0,0 +1,29 @@
+/*****************************************************************
+|
+| Neptune - Console Support: Win32 Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <windows.h>
+#include <stdio.h>
+
+#include "NptConfig.h"
+#include "NptConsole.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| NPT_Console::Output
++---------------------------------------------------------------------*/
+void
+NPT_Console::Output(const char* message)
+{
+ NPT_DebugOutput(message);
+ printf("%s", message);
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Debug.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Debug.cpp
new file mode 100644
index 0000000..5d9372a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Debug.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************
+|
+| Neptune - Debug Support: Win32 Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdio.h>
+#include <windows.h>
+
+#include "NptConfig.h"
+#include "NptDefs.h"
+#include "NptTypes.h"
+#include "NptDebug.h"
+#include <memory>
+
+/*----------------------------------------------------------------------
+| NPT_DebugOutput
++---------------------------------------------------------------------*/
+void
+NPT_DebugOutput(const char* message)
+{
+ int result = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, message, -1, nullptr, 0);
+ if (result == 0)
+ return;
+
+ auto newStr = std::make_unique<wchar_t[]>(result + 1);
+ result = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, message, result, newStr.get(), result);
+
+ if (result == 0)
+ return;
+
+ OutputDebugString(newStr.get());
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp
new file mode 100644
index 0000000..371aaf5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp
@@ -0,0 +1,150 @@
+/*****************************************************************
+ |
+ | Neptune - Dynamic Libraries :: Win32 Implementation
+ |
+ | (c) 2001-2008 Gilles Boccon-Gibod
+ | Author: Gilles Boccon-Gibod (bok@bok.net)
+ |
+ ****************************************************************/
+
+ /*----------------------------------------------------------------------
+ | includes
+ +---------------------------------------------------------------------*/
+#include "NptLogging.h"
+#include "NptDynamicLibraries.h"
+
+#include <windows.h>
+#include <assert.h>
+
+ /*----------------------------------------------------------------------
+ | logging
+ +---------------------------------------------------------------------*/
+ NPT_SET_LOCAL_LOGGER("neptune.win32.dynamic-libraries")
+
+/*----------------------------------------------------------------------
+| A2WHelper
++---------------------------------------------------------------------*/
+static LPWSTR A2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars, UINT acp)
+{
+ int ret;
+
+ assert(lpa != NULL);
+ assert(lpw != NULL);
+ if (lpw == NULL || lpa == NULL) return NULL;
+
+ lpw[0] = '\0';
+ ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
+ if (ret == 0) {
+ assert(0);
+ return NULL;
+ }
+ return lpw;
+}
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+/* UNICODE support */
+#if !defined(_XBOX)
+#define NPT_WIN32_USE_CHAR_CONVERSION int _convert = 0; LPCWSTR _lpw = NULL; LPCSTR _lpa = NULL
+
+#define NPT_WIN32_A2W(lpa) (\
+ ((_lpa = lpa) == NULL) ? NULL : (\
+ _convert = (int)(strlen(_lpa)+1),\
+ (INT_MAX/2<_convert)? NULL : \
+ A2WHelper((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, CP_UTF8)))
+
+#else
+#define NPT_WIN32_USE_CHAR_CONVERSION
+#define NPT_WIN32_A2W(_s) (_s)
+#define LoadLibraryW LoadLibrary
+#define GetProcAddressW GetProcAddress
+#endif
+
+ /*----------------------------------------------------------------------
+ | NPT_Win32DynamicLibrary
+ +---------------------------------------------------------------------*/
+class NPT_Win32DynamicLibrary : public NPT_DynamicLibraryInterface
+{
+public:
+ // constructor and destructor
+ NPT_Win32DynamicLibrary(HMODULE library, const char* name) :
+ m_Library(library), m_Name(name) {}
+
+ // NPT_DynamicLibraryInterface methods
+ virtual NPT_Result FindSymbol(const char* name, void*& symbol);
+ virtual NPT_Result Unload();
+
+private:
+ // members
+ HMODULE m_Library;
+ NPT_String m_Name;
+};
+
+/*----------------------------------------------------------------------
+| NPT_DynamicLibrary::Load
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_DynamicLibrary::Load(const char* name, NPT_Flags flags, NPT_DynamicLibrary*& library)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+
+ NPT_COMPILER_UNUSED(flags);
+ if (name == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // default return value
+ library = NULL;
+
+ // load the lib
+ NPT_LOG_FINE_2("loading library %s, flags=%x", name, flags);
+#ifdef TARGET_WINDOWS_STORE
+ HMODULE handle = LoadPackagedLibrary(NPT_WIN32_A2W(name), NULL);
+#else
+ HMODULE handle = LoadLibraryW(NPT_WIN32_A2W(name));
+#endif
+ if (handle == NULL) {
+ NPT_LOG_FINE("library not found");
+ return NPT_FAILURE;
+ }
+
+ // instantiate the object
+ NPT_LOG_FINE_1("library %s loaded", name);
+ library = new NPT_DynamicLibrary(new NPT_Win32DynamicLibrary(handle, name));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32DynamicLibrary::FindSymbol
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32DynamicLibrary::FindSymbol(const char* name, void*& symbol)
+{
+ if (name == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+ symbol = NULL;
+ if (m_Library == NULL) return NPT_ERROR_NO_SUCH_ITEM;
+
+ NPT_LOG_FINE_1("finding symbol %s", name);
+#if defined(_WIN32_WCE)
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ symbol = GetProcAddress(m_Library, NPT_WIN32_A2W(name));
+#else
+ symbol = GetProcAddress(m_Library, name);
+#endif
+ return symbol?NPT_SUCCESS:NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32DynamicLibrary::Unload
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32DynamicLibrary::Unload()
+{
+ NPT_LOG_FINE_1("unloading library %s", (const char*)m_Name);
+ BOOL result = FreeLibrary(m_Library);
+ if (result) {
+ return NPT_SUCCESS;
+ } else {
+ return NPT_FAILURE;
+ }
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32File.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32File.cpp
new file mode 100644
index 0000000..587b16e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32File.cpp
@@ -0,0 +1,414 @@
+/*****************************************************************
+|
+| Neptune - File :: Win32 Implementation
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptLogging.h"
+#include "NptFile.h"
+#include "NptUtils.h"
+
+#if defined(_XBOX)
+#include <xtl.h>
+#else
+#include <windows.h>
+#include <malloc.h>
+#include <limits.h>
+#endif
+#include <assert.h>
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+//NPT_SET_LOCAL_LOGGER("neptune.win32.file")
+
+/*----------------------------------------------------------------------
+| A2WHelper
++---------------------------------------------------------------------*/
+static LPWSTR A2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars, UINT acp)
+{
+ int ret;
+
+ assert(lpa != NULL);
+ assert(lpw != NULL);
+ if (lpw == NULL || lpa == NULL) return NULL;
+
+ lpw[0] = '\0';
+ ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
+ if (ret == 0) {
+ assert(0);
+ return NULL;
+ }
+ return lpw;
+}
+
+/*----------------------------------------------------------------------
+| W2AHelper
++---------------------------------------------------------------------*/
+static LPSTR W2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars, UINT acp)
+{
+ int ret;
+
+ assert(lpw != NULL);
+ assert(lpa != NULL);
+ if (lpa == NULL || lpw == NULL) return NULL;
+
+ lpa[0] = '\0';
+ ret = WideCharToMultiByte(acp, 0, lpw, -1, lpa, nChars, NULL, NULL);
+ if (ret == 0) {
+ int error = GetLastError();
+ assert(error);
+ return NULL;
+ }
+ return lpa;
+}
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+/* UNICODE support */
+#if !defined(_XBOX)
+#define NPT_WIN32_USE_CHAR_CONVERSION int _convert = 0; LPCWSTR _lpw = NULL; LPCSTR _lpa = NULL
+
+#define NPT_WIN32_A2W(lpa) (\
+ ((_lpa = lpa) == NULL) ? NULL : (\
+ _convert = (int)(strlen(_lpa)+1),\
+ (INT_MAX/2<_convert)? NULL : \
+ A2WHelper((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, CP_UTF8)))
+
+/* +2 instead of +1 temporary fix for Chinese characters */
+#define NPT_WIN32_W2A(lpw) (\
+ ((_lpw = lpw) == NULL) ? NULL : (\
+ (_convert = (lstrlenW(_lpw)+2), \
+ (_convert>INT_MAX/2) ? NULL : \
+ W2AHelper((LPSTR) alloca(_convert*sizeof(WCHAR)), _lpw, _convert*sizeof(WCHAR), CP_UTF8))))
+
+#else
+#define NPT_WIN32_USE_CHAR_CONVERSION
+#define NPT_WIN32_W2A(_s) (_s)
+#define NPT_WIN32_A2W(_s) (_s)
+#define GetFileAttributesW GetFileAttributes
+#define FindFirstFileW FindFirstFile
+#define FindNextFileW FindNextFile
+#define FindCloseW FindClose
+#define CreateDirectoryW CreateDirectoryA
+#define RemoveDirectoryW RemoveDirectoryA
+#define DeleteFileW DeleteFileA
+#define MoveFileW MoveFileA
+#define WIN32_FIND_DATAW WIN32_FIND_DATA
+#endif
+
+/*----------------------------------------------------------------------
+| MapError
++---------------------------------------------------------------------*/
+static NPT_Result
+MapError(DWORD err) {
+ switch (err) {
+ case ERROR_ALREADY_EXISTS: return NPT_ERROR_FILE_ALREADY_EXISTS;
+ case ERROR_PATH_NOT_FOUND:
+ case ERROR_FILE_NOT_FOUND:
+ case ERROR_INVALID_DRIVE:
+ case ERROR_BAD_PATHNAME:
+ case ERROR_BAD_NET_NAME:
+ case ERROR_FILENAME_EXCED_RANGE:
+ case ERROR_NO_MORE_FILES:
+ case ERROR_BAD_NETPATH: return NPT_ERROR_NO_SUCH_FILE;
+ case ERROR_LOCK_VIOLATION:
+ case ERROR_SEEK_ON_DEVICE:
+ case ERROR_CURRENT_DIRECTORY:
+ case ERROR_CANNOT_MAKE:
+ case ERROR_FAIL_I24:
+ case ERROR_NETWORK_ACCESS_DENIED:
+ case ERROR_DRIVE_LOCKED:
+ case ERROR_ACCESS_DENIED: return NPT_ERROR_PERMISSION_DENIED;
+ case ERROR_NOT_LOCKED:
+ case ERROR_LOCK_FAILED:
+ case ERROR_SHARING_VIOLATION: return NPT_ERROR_FILE_BUSY;
+ case ERROR_INVALID_FUNCTION: return NPT_ERROR_INTERNAL;
+ case ERROR_NOT_ENOUGH_QUOTA: return NPT_ERROR_OUT_OF_MEMORY;
+ case ERROR_ARENA_TRASHED:
+ case ERROR_NOT_ENOUGH_MEMORY:
+ case ERROR_INVALID_BLOCK: return NPT_ERROR_OUT_OF_MEMORY;
+ case ERROR_DISK_FULL: return NPT_ERROR_FILE_NOT_ENOUGH_SPACE;
+ case ERROR_TOO_MANY_OPEN_FILES: return NPT_ERROR_OUT_OF_RESOURCES;
+ case ERROR_INVALID_HANDLE:
+ case ERROR_INVALID_ACCESS:
+ case ERROR_INVALID_DATA: return NPT_ERROR_INVALID_PARAMETERS;
+ case ERROR_DIR_NOT_EMPTY: return NPT_ERROR_DIRECTORY_NOT_EMPTY;
+ case ERROR_NEGATIVE_SEEK: return NPT_ERROR_OUT_OF_RANGE;
+ default: return NPT_FAILURE;
+ }
+}
+
+#if defined(_WIN32_WCE)
+/*----------------------------------------------------------------------
+| NPT_stat_utf8
++---------------------------------------------------------------------*/
+int
+NPT_stat_utf8(const char* path, struct __stat64* info)
+{
+ return -1;
+}
+
+/*----------------------------------------------------------------------
+| NPT_getcwd_utf8
++---------------------------------------------------------------------*/
+char*
+NPT_getcwd_utf8(char* dir, int max_size)
+{
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_fopen_utf8
++---------------------------------------------------------------------*/
+FILE*
+NPT_fopen_utf8(const char* path, const char* mode)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ return _wfopen(NPT_WIN32_A2W(path), NPT_WIN32_A2W(mode));
+}
+#elif defined(_XBOX)
+#include <sys/stat.h>
+/*----------------------------------------------------------------------
+| NPT_stat_utf8
++---------------------------------------------------------------------*/
+int
+NPT_stat_utf8(const char* path, struct __stat64* info)
+{
+ return _stat64(path, info);
+}
+
+/*----------------------------------------------------------------------
+| NPT_getcwd_utf8
++---------------------------------------------------------------------*/
+char*
+NPT_getcwd_utf8(char* dir, unsigned int max_size)
+{
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_fsopen_utf8
++---------------------------------------------------------------------*/
+FILE*
+NPT_fsopen_utf8(const char* path, const char* mode, int sh_flags)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ return _fsopen(path, mode, sh_flags);
+}
+#else
+#include <sys/stat.h>
+#include <direct.h>
+
+/*----------------------------------------------------------------------
+| NPT_stat_utf8
++---------------------------------------------------------------------*/
+int
+NPT_stat_utf8(const char* path, struct __stat64* info)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ return _wstat64(NPT_WIN32_A2W(path), info);
+}
+
+/*----------------------------------------------------------------------
+| NPT_getcwd_utf8
++---------------------------------------------------------------------*/
+char*
+NPT_getcwd_utf8(char* dir, unsigned int max_size)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ WCHAR* wdir = (WCHAR*)alloca(2*(max_size+1));
+ WCHAR* result = _wgetcwd(wdir, max_size);
+ if (result == NULL) return NULL;
+ char* converted = NPT_WIN32_W2A(result);
+ NPT_CopyString(dir, converted);
+ return dir;
+}
+
+/*----------------------------------------------------------------------
+| NPT_fsopen_utf8
++---------------------------------------------------------------------*/
+FILE*
+NPT_fsopen_utf8(const char* path, const char* mode, int sh_flags)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ return _wfsopen(NPT_WIN32_A2W(path), NPT_WIN32_A2W(mode), sh_flags);
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_FilePath::Separator
++---------------------------------------------------------------------*/
+const char* const NPT_FilePath::Separator = "\\";
+
+/*----------------------------------------------------------------------
+| NPT_File::GetRoots
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetRoots(NPT_List<NPT_String>& roots)
+{
+ roots.Clear();
+#if defined(_WIN32_WCE) || defined(_XBOX)
+ return NPT_ERROR_NOT_IMPLEMENTED;
+#else
+ DWORD drives = GetLogicalDrives();
+ for (unsigned int i=0; i<26; i++) {
+ if (drives & (1<<i)) {
+ char drive_name[4] = {(char)('A'+i), ':', '\\', 0};
+ roots.Add(drive_name);
+ }
+ }
+ return NPT_SUCCESS;
+#endif
+}
+
+#if defined(_WIN32_WCE)
+/*----------------------------------------------------------------------
+| NPT_File::GetWorkingDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetWorkingDir(NPT_String& path)
+{
+ path.SetLength(0);
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetInfo(const char* path, NPT_FileInfo* info)
+{
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_File::CreateDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::CreateDir(const char* path)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ BOOL result = ::CreateDirectoryW(NPT_WIN32_A2W(path), NULL);
+ if (result == 0) {
+ return MapError(GetLastError());
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::RemoveFile
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::RemoveFile(const char* path)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ BOOL result = ::DeleteFileW(NPT_WIN32_A2W(path));
+ if (result == 0) {
+ return MapError(GetLastError());
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::RemoveDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::RemoveDir(const char* path)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ BOOL result = RemoveDirectoryW(NPT_WIN32_A2W(path));
+ if (result == 0) {
+ return MapError(GetLastError());
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Rename
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Rename(const char* from_path, const char* to_path)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+ BOOL result = MoveFileW(NPT_WIN32_A2W(from_path), NPT_WIN32_A2W(to_path));
+ if (result == 0) {
+ return MapError(GetLastError());
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File_ProcessFindData
++---------------------------------------------------------------------*/
+static bool
+NPT_File_ProcessFindData(WIN32_FIND_DATAW* find_data)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+
+ // discard system specific files/shortcuts
+ if (NPT_StringsEqual(NPT_WIN32_W2A(find_data->cFileName), ".") ||
+ NPT_StringsEqual(NPT_WIN32_W2A(find_data->cFileName), "..")) {
+ return false;
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::ListDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::ListDir(const char* path,
+ NPT_List<NPT_String>& entries,
+ NPT_Ordinal start /* = 0 */,
+ NPT_Cardinal max /* = 0 */)
+{
+ NPT_WIN32_USE_CHAR_CONVERSION;
+
+ // default return value
+ entries.Clear();
+
+ // check the arguments
+ if (path == NULL || path[0] == '\0') return NPT_ERROR_INVALID_PARAMETERS;
+
+ // construct a path name with a \* wildcard at the end
+ NPT_String path_pattern = path;
+ if (path_pattern.EndsWith("\\") || path_pattern.EndsWith("/")) {
+ path_pattern += "*";
+ } else {
+ path_pattern += "\\*";
+ }
+
+ // list the entries
+ WIN32_FIND_DATAW find_data;
+ HANDLE find_handle = FindFirstFileW(NPT_WIN32_A2W(path_pattern.GetChars()), &find_data);
+ if (find_handle == INVALID_HANDLE_VALUE) return MapError(GetLastError());
+ NPT_Cardinal count = 0;
+ do {
+ if (NPT_File_ProcessFindData(&find_data)) {
+ // continue if we still have entries to skip
+ if (start > 0) {
+ --start;
+ continue;
+ }
+ entries.Add(NPT_WIN32_W2A(find_data.cFileName));
+
+ // stop when we have reached the maximum requested
+ if (max && ++count == max) return NPT_SUCCESS;
+ }
+ } while (FindNextFileW(find_handle, &find_data));
+ DWORD last_error = GetLastError();
+ FindClose(find_handle);
+ if (last_error != ERROR_NO_MORE_FILES) return MapError(last_error);
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32HttpProxy.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32HttpProxy.cpp
new file mode 100644
index 0000000..c9729c4
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32HttpProxy.cpp
@@ -0,0 +1,43 @@
+/*****************************************************************
+|
+| Neptune - HTTP Proxy :: WinHttp Implementation
+|
+| (c) 2001-2007 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+//#include <Winhttp.h>
+#include "NptResults.h"
+#include "NptHttp.h"
+#include "NptThreads.h"
+
+#if 0 // not implemented yet
+HINTERNET NPT_Win32HttpHandle = INVALID_HANDLE_VALUE;
+NPT_Lock NPT_Win32HttpLock;
+
+/*----------------------------------------------------------------------
+| NPT_HttpProxySelector::GetSystemDefault
++---------------------------------------------------------------------*/
+NPT_HttpProxySelector*
+NPT_HttpProxySelector::GetSystemDefault()
+{
+ NPT_AutoLock lock(NPT_Win32HttpLock);
+
+ if (NPT_Win32HttpHandle == INVALID_HANDLE_VALUE) {
+ WINHTTP_CURRENT_USER_IE_PROXY_CONFIG config;
+ BOOL result = WinHttpGetIEProxyConfigForCurrentUser(&config);
+ }
+
+ return NULL;
+}
+#else
+NPT_HttpProxySelector*
+NPT_HttpProxySelector::GetSystemDefault()
+{
+ return NULL;
+}
+#endif
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.cpp
new file mode 100644
index 0000000..925849c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.cpp
@@ -0,0 +1,184 @@
+/*****************************************************************
+|
+| Neptune - Win32 Message Queue
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWin32MessageQueue.h"
+#ifndef TARGET_WINDOWS_STORE
+/*----------------------------------------------------------------------
+| platform adaptation
++---------------------------------------------------------------------*/
+#if defined(_WIN32_WCE)
+#define GetWindowLongPtr GetWindowLong
+#define SetWindowLongPtr SetWindowLong
+#endif
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_WIN32_MESSAGE_ID_BASE = WM_USER + 9200;
+
+/*----------------------------------------------------------------------
+| NPT_Win32WindowMessageQueue
++---------------------------------------------------------------------*/
+NPT_Win32WindowMessageQueue::NPT_Win32WindowMessageQueue()
+{
+ // create a hidden window to process our incoming messages
+ WNDCLASS wclass;
+
+ // compute a unique class name
+ m_ClassName[0] = 'N';
+ m_ClassName[1] = 'P';
+ m_ClassName[2] = 'T';
+ m_ClassName[3] = 'H';
+ m_ClassName[4] = 'W';
+ NPT_String tid = NPT_String::FromInteger(GetCurrentThreadId());
+ for (unsigned int i=0; i<=tid.GetLength(); i++) {
+ m_ClassName[5+i] = tid.GetChars()[i];
+ }
+
+ // register a window class
+ wclass.style = 0;
+ wclass.lpfnWndProc = NPT_Win32WindowMessageQueue::WindowProcedure;
+ wclass.cbClsExtra = 0;
+ wclass.cbWndExtra = 0;
+ wclass.hInstance = GetModuleHandle(NULL);
+ wclass.hIcon = NULL;
+ wclass.hCursor = NULL;
+ wclass.hbrBackground = NULL;
+ wclass.lpszMenuName = NULL;
+ wclass.lpszClassName = m_ClassName;
+
+ // register the class and ignore any error because we might
+ // be registering the class more than once
+ RegisterClass(&wclass);
+
+ // create the hidden window
+ m_WindowHandle = CreateWindow(
+ wclass.lpszClassName, // pointer to registered class name
+ TEXT(""), // pointer to window name
+ 0, // window style
+ 0, // horizontal position of window
+ 0, // vertical position of window
+ 0, // window width
+ 0, // window height
+ NULL, // handle to parent or owner window
+ NULL, // handle to menu or child-window identifier
+ wclass.hInstance, // handle to application instance
+ NULL);
+
+ // set a pointer to ourself as user data */
+#if defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable: 4244) // we have to test for this because SetWindowLongPtr
+ // is incorrectly defined, so we'll get a C4244 warning
+#endif // _MSC_VER
+ if (m_WindowHandle) {
+ SetWindowLongPtr(m_WindowHandle, GWLP_USERDATA, NPT_POINTER_TO_LONG(this));
+ }
+#if defined(_MSC_VER)
+#pragma warning( pop )
+#endif // _MSC_VER
+ m_hInstance = wclass.hInstance;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32WindowMessageQueue
++---------------------------------------------------------------------*/
+NPT_Win32WindowMessageQueue::~NPT_Win32WindowMessageQueue()
+{
+ // remove ourself as user data to ensure we're not called anymore
+ SetWindowLongPtr(m_WindowHandle, GWLP_USERDATA, 0);
+
+ // destroy the hidden window
+ DestroyWindow(m_WindowHandle);
+
+ // unregister the window class
+ UnregisterClass(m_ClassName, m_hInstance);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32WindowMessageQueue::WindowProcedure
++---------------------------------------------------------------------*/
+LRESULT CALLBACK
+NPT_Win32WindowMessageQueue::WindowProcedure(HWND window,
+ UINT message,
+ WPARAM wparam,
+ LPARAM lparam)
+{
+ // if it is a windows message, just pass it along
+ if (message != (UINT) NPT_WIN32_MESSAGE_ID_BASE) {
+ return DefWindowProc(window, message, wparam, lparam);
+ }
+
+ // dispatch the message to the handler
+#if defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable: 4312) // we have to test for this because GetWindowLongPtr
+ // is incorrectly defined, so we'll get a C4244 warning
+#endif // _MSC_VER
+ NPT_Win32WindowMessageQueue* queue = reinterpret_cast<NPT_Win32WindowMessageQueue *>(GetWindowLongPtr(window, GWLP_USERDATA));
+#if defined(_MSC_VER)
+#pragma warning( pop )
+#endif // _MSC_VER
+ if (queue == NULL) {
+ return 0;
+ }
+ queue->HandleMessage(reinterpret_cast<NPT_Message*>(lparam),
+ reinterpret_cast<NPT_MessageHandler*>(wparam));
+ return 0;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32WindowMessageQueue::PumpMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32WindowMessageQueue::PumpMessage(NPT_Timeout)
+{
+ // you cannot pump messages on this type of queue, since they will
+ // be pumped by the main windows message loop
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32WindowMessageQueue::QueueMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32WindowMessageQueue::QueueMessage(NPT_Message* message,
+ NPT_MessageHandler* handler)
+{
+ int result;
+
+ result = ::PostMessage(m_WindowHandle,
+ NPT_WIN32_MESSAGE_ID_BASE,
+ (WPARAM)handler,
+ (LPARAM)message);
+
+ if (result == 0) return NPT_FAILURE;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32WindowMessageQueue::HandleMessage
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32WindowMessageQueue::HandleMessage(NPT_Message* message,
+ NPT_MessageHandler* handler)
+{
+ NPT_Result result = NPT_FAILURE;
+
+ if (message && handler) {
+ result = handler->HandleMessage(message);
+ }
+ delete message;
+ return result;
+}
+
+#endif // ! TARGET_WINDOWS_STORE
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.h b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.h
new file mode 100644
index 0000000..1d84800
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.h
@@ -0,0 +1,52 @@
+/*****************************************************************
+|
+| Neptune - Win32 Message Queue
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+#ifndef _NPT_WIN32_MESSAGE_QUEUE_
+#define _NPT_WIN32_MESSAGE_QUEUE_
+
+#ifndef TARGET_WINDOWS_STORE
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <windows.h>
+#include <TCHAR.h>
+#include "NptStrings.h"
+#include "NptMessaging.h"
+#include "NptSimpleMessageQueue.h"
+
+/*----------------------------------------------------------------------
+| NPT_Win32WindowMessageQueue
++---------------------------------------------------------------------*/
+class NPT_Win32WindowMessageQueue : public NPT_MessageQueue
+{
+public:
+ NPT_Win32WindowMessageQueue();
+ ~NPT_Win32WindowMessageQueue();
+
+ // NPT_MessageQueue methods
+ virtual NPT_Result PumpMessage(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+ virtual NPT_Result QueueMessage(NPT_Message* message,
+ NPT_MessageHandler* handler);
+
+ NPT_Result HandleMessage(NPT_Message* message, NPT_MessageHandler* handler);
+
+private:
+ static LRESULT CALLBACK WindowProcedure(HWND window,
+ UINT message,
+ WPARAM wparam,
+ LPARAM lparam);
+ HWND m_WindowHandle;
+ TCHAR m_ClassName[16];
+ HINSTANCE m_hInstance;
+};
+
+#endif // ! TARGET_WINDOWS_STORE
+
+#endif // _NPT_WIN32_MESSAGE_QUEUE_
+
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Network.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Network.cpp
new file mode 100644
index 0000000..05bb065
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Network.cpp
@@ -0,0 +1,327 @@
+/*****************************************************************
+|
+| Neptune - Network :: Winsock Implementation
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#define STRICT
+#define _WINSOCK_DEPRECATED_NO_WARNINGS
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include "NptNetwork.h"
+#include "NptWin32Network.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| static initializer
++---------------------------------------------------------------------*/
+NPT_WinsockSystem::NPT_WinsockSystem() {
+ WORD wVersionRequested;
+ WSADATA wsaData;
+ wVersionRequested = MAKEWORD(2, 2);
+ /*wVersionRequested = MAKEWORD(1, 1);*/
+ WSAStartup( wVersionRequested, &wsaData );
+}
+NPT_WinsockSystem::~NPT_WinsockSystem() {
+ WSACleanup();
+}
+NPT_WinsockSystem NPT_WinsockSystem::Initializer;
+
+#if defined(_WIN32_WCE)
+// don't use the SIO_GET_INTERFACE_LIST on Windows CE, it is
+// hopelessly broken, and will crash your application.
+#define NPT_NETWORK_USE_IP_HELPER_API
+#else
+#define NPT_NETWORK_USE_SIO_GET_INTERFACE_LIST
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::Any and NPT_IpAddress::Loopback
++---------------------------------------------------------------------*/
+const NPT_IpAddress NPT_IpAddress::Any;
+const NPT_IpAddress NPT_IpAddress::Loopback(127,0,0,1);
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::ToString
++---------------------------------------------------------------------*/
+NPT_String
+NPT_IpAddress::ToString() const
+{
+ NPT_String address;
+ address.Reserve(16);
+ address += NPT_String::FromInteger(m_Address[0]);
+ address += '.';
+ address += NPT_String::FromInteger(m_Address[1]);
+ address += '.';
+ address += NPT_String::FromInteger(m_Address[2]);
+ address += '.';
+ address += NPT_String::FromInteger(m_Address[3]);
+
+ return address;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::Parse
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_IpAddress::Parse(const char* name)
+{
+ // check the name
+ if (name == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // clear the address
+ NPT_SetMemory(&m_Address[0], 0, sizeof(m_Address));
+
+ // parse
+ unsigned int fragment;
+ bool fragment_empty = true;
+ unsigned char address[4];
+ unsigned int accumulator;
+ for (fragment = 0, accumulator = 0; fragment < 4; ++name) {
+ if (*name == '\0' || *name == '.') {
+ // fragment terminator
+ if (fragment_empty) return NPT_ERROR_INVALID_SYNTAX;
+ address[fragment++] = accumulator;
+ if (*name == '\0') break;
+ accumulator = 0;
+ fragment_empty = true;
+ } else if (*name >= '0' && *name <= '9') {
+ // numerical character
+ accumulator = accumulator*10 + (*name - '0');
+ if (accumulator > 255) return NPT_ERROR_INVALID_SYNTAX;
+ fragment_empty = false;
+ } else {
+ // invalid character
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+ }
+
+ if (fragment == 4 && *name == '\0' && !fragment_empty) {
+ m_Address[0] = address[0];
+ m_Address[1] = address[1];
+ m_Address[2] = address[2];
+ m_Address[3] = address[3];
+ return NPT_SUCCESS;
+ } else {
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+}
+
+#if defined(NPT_NETWORK_USE_SIO_GET_INTERFACE_LIST)
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::GetNetworkInterfaces
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces)
+{
+ // create a socket to talk to the TCP/IP stack
+ SOCKET net;
+ if((net = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0)) == INVALID_SOCKET) {
+ return NPT_FAILURE;
+ }
+
+ // get a list of interfaces
+ INTERFACE_INFO query[32]; // get up to 32 interfaces
+ DWORD bytes_returned;
+ int io_result = WSAIoctl(net,
+ SIO_GET_INTERFACE_LIST,
+ NULL, 0,
+ &query, sizeof(query),
+ &bytes_returned,
+ NULL, NULL);
+ if (io_result == SOCKET_ERROR) {
+ closesocket(net);
+ return NPT_FAILURE;
+ }
+
+ // we don't need the socket anymore
+ closesocket(net);
+
+ // Display interface information
+ int interface_count = (bytes_returned/sizeof(INTERFACE_INFO));
+ unsigned int iface_index = 0;
+ for (int i=0; i<interface_count; i++) {
+ SOCKADDR_IN* address;
+ NPT_Flags flags = 0;
+
+ // primary address
+ address = (SOCKADDR_IN*)&query[i].iiAddress;
+ NPT_IpAddress primary_address(ntohl(address->sin_addr.s_addr));
+
+ // netmask
+ address = (SOCKADDR_IN*)&query[i].iiNetmask;
+ NPT_IpAddress netmask(ntohl(address->sin_addr.s_addr));
+
+ // broadcast address
+ address = (SOCKADDR_IN*)&query[i].iiBroadcastAddress;
+ NPT_IpAddress broadcast_address(ntohl(address->sin_addr.s_addr));
+
+ {
+ // broadcast address is incorrect
+ unsigned char addr[4];
+ for(int i=0; i<4; i++) {
+ addr[i] = (primary_address.AsBytes()[i] & netmask.AsBytes()[i]) |
+ ~netmask.AsBytes()[i];
+ }
+ broadcast_address.Set(addr);
+ }
+
+ // ignore interfaces that are not up
+ if (!(query[i].iiFlags & IFF_UP)) {
+ continue;
+ }
+ if (query[i].iiFlags & IFF_BROADCAST) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_BROADCAST;
+ }
+ if (query[i].iiFlags & IFF_MULTICAST) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_MULTICAST;
+ }
+ if (query[i].iiFlags & IFF_LOOPBACK) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_LOOPBACK;
+ }
+ if (query[i].iiFlags & IFF_POINTTOPOINT) {
+ flags |= NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT;
+ }
+
+ // mac address (no support for this for now)
+ NPT_MacAddress mac;
+
+ // create an interface object
+ char iface_name[5];
+ iface_name[0] = 'i';
+ iface_name[1] = 'f';
+ iface_name[2] = '0'+(iface_index/10);
+ iface_name[3] = '0'+(iface_index%10);
+ iface_name[4] = '\0';
+ NPT_NetworkInterface* iface = new NPT_NetworkInterface(iface_name, mac, flags);
+
+ // set the interface address
+ NPT_NetworkInterfaceAddress iface_address(
+ primary_address,
+ broadcast_address,
+ NPT_IpAddress::Any,
+ netmask);
+ iface->AddAddress(iface_address);
+
+ // add the interface to the list
+ interfaces.Add(iface);
+
+ // increment the index (used for generating the name
+ iface_index++;
+ }
+
+ return NPT_SUCCESS;
+}
+#elif defined(NPT_NETWORK_USE_IP_HELPER_API)
+// Use the IP Helper API
+#include <iphlpapi.h>
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::GetNetworkInterfaces
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces)
+{
+ IP_ADAPTER_ADDRESSES* iface_list = NULL;
+ ULONG size = sizeof(IP_ADAPTER_INFO);
+
+ // get the interface table
+ for(;;) {
+ iface_list = (IP_ADAPTER_ADDRESSES*)malloc(size);
+ DWORD result = GetAdaptersAddresses(AF_INET,
+ 0,
+ NULL,
+ iface_list, &size);
+ if (result == NO_ERROR) {
+ break;
+ } else {
+ // free and try again
+ free(iface_list);
+ if (result != ERROR_BUFFER_OVERFLOW) {
+ return NPT_FAILURE;
+ }
+ }
+ }
+
+ // iterate over the interfaces
+ for (IP_ADAPTER_ADDRESSES* iface = iface_list; iface; iface = iface->Next) {
+ // skip this interface if it is not up
+ if (iface->OperStatus != IfOperStatusUp) continue;
+
+ // get the interface type and mac address
+ NPT_MacAddress::Type mac_type;
+ switch (iface->IfType) {
+ case IF_TYPE_ETHERNET_CSMACD: mac_type = NPT_MacAddress::TYPE_ETHERNET; break;
+ case IF_TYPE_SOFTWARE_LOOPBACK: mac_type = NPT_MacAddress::TYPE_LOOPBACK; break;
+ case IF_TYPE_PPP: mac_type = NPT_MacAddress::TYPE_PPP; break;
+ default: mac_type = NPT_MacAddress::TYPE_UNKNOWN; break;
+ }
+ NPT_MacAddress mac(mac_type, iface->PhysicalAddress, iface->PhysicalAddressLength);
+
+ // compute interface flags
+ NPT_Flags flags = 0;
+ if (!(iface->Flags & IP_ADAPTER_NO_MULTICAST)) flags |= NPT_NETWORK_INTERFACE_FLAG_MULTICAST;
+ if (iface->IfType == IF_TYPE_SOFTWARE_LOOPBACK) flags |= NPT_NETWORK_INTERFACE_FLAG_LOOPBACK;
+ if (iface->IfType == IF_TYPE_PPP) flags |= NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT;
+
+ // compute the unicast address (only the first one is supported for now)
+ NPT_IpAddress primary_address;
+ if (iface->FirstUnicastAddress) {
+ if (iface->FirstUnicastAddress->Address.lpSockaddr == NULL) continue;
+ if (iface->FirstUnicastAddress->Address.iSockaddrLength != sizeof(SOCKADDR_IN)) continue;
+ SOCKADDR_IN* address = (SOCKADDR_IN*)iface->FirstUnicastAddress->Address.lpSockaddr;
+ if (address->sin_family != AF_INET) continue;
+ primary_address.Set(ntohl(address->sin_addr.s_addr));
+ }
+ NPT_IpAddress broadcast_address; // not supported yet
+ NPT_IpAddress netmask; // not supported yet
+
+ // convert the interface name to UTF-8
+ // BUG in Wine: FriendlyName is NULL
+ unsigned int iface_name_length = (unsigned int)iface->FriendlyName?wcslen(iface->FriendlyName):0;
+ char* iface_name = new char[4*iface_name_length+1];
+ int result = WideCharToMultiByte(
+ CP_UTF8, 0, iface->FriendlyName, iface_name_length,
+ iface_name, 4*iface_name_length+1,
+ NULL, NULL);
+ if (result > 0) {
+ iface_name[result] = '\0';
+ } else {
+ iface_name[0] = '\0';
+ }
+
+ // create an interface descriptor
+ NPT_NetworkInterface* iface_object = new NPT_NetworkInterface(iface_name, mac, flags);
+ NPT_NetworkInterfaceAddress iface_address(
+ primary_address,
+ broadcast_address,
+ NPT_IpAddress::Any,
+ netmask);
+ iface_object->AddAddress(iface_address);
+
+ // cleanup
+ delete[] iface_name;
+
+ // add the interface to the list
+ interfaces.Add(iface_object);
+ }
+
+ free(iface_list);
+ return NPT_SUCCESS;
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::GetNetworkInterfaces
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>&)
+{
+ return NPT_SUCCESS;
+}
+#endif
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Network.h b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Network.h
new file mode 100644
index 0000000..6552d79
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Network.h
@@ -0,0 +1,20 @@
+/*****************************************************************
+|
+| Neptune - Network :: Winsock Implementation
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| static initializer
++---------------------------------------------------------------------*/
+class NPT_WinsockSystem {
+public:
+ static NPT_WinsockSystem Initializer;
+ ~NPT_WinsockSystem();
+
+private:
+ NPT_WinsockSystem();
+};
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Queue.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Queue.cpp
new file mode 100644
index 0000000..33fa190
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Queue.cpp
@@ -0,0 +1,240 @@
+/*****************************************************************
+|
+| Neptune - Queue :: Win32 Implementation
+|
+| (c) 2001-2002 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#if defined(_XBOX)
+#include <xtl.h>
+#else
+#include <windows.h>
+#endif
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptQueue.h"
+#include "NptThreads.h"
+#include "NptList.h"
+#include "NptDebug.h"
+#include "NptLogging.h"
+
+#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP || defined(TARGET_WINDOWS_STORE)
+// for XBox, Windows 7 Desktop or earlier
+#include "NptWin32Threads.h"
+#elif WINAPI_FAMILY == WINAPI_FAMILY_APP
+// for WinRT Apps
+#include "NptWinRtThreads.h"
+#endif
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+//NPT_SET_LOCAL_LOGGER("neptune.queue.win32")
+
+/*----------------------------------------------------------------------
+| NPT_Win32Queue
++---------------------------------------------------------------------*/
+class NPT_Win32Queue : public NPT_GenericQueue
+{
+public:
+ // methods
+ NPT_Win32Queue(NPT_Cardinal max_items);
+ ~NPT_Win32Queue();
+ NPT_Result Push(NPT_QueueItem* item, NPT_Timeout timeout);
+ NPT_Result Pop(NPT_QueueItem*& item, NPT_Timeout timeout);
+ NPT_Result Peek(NPT_QueueItem*& item, NPT_Timeout timeout);
+
+
+private:
+ // members
+ NPT_Cardinal m_MaxItems;
+
+#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP || defined(TARGET_WINDOWS_STORE)
+ // for XBox, Windows 7 Desktop or earlier
+ NPT_Win32CriticalSection m_Mutex;
+ NPT_Win32Event* m_CanPushCondition;
+ NPT_Win32Event* m_CanPopCondition;
+#elif WINAPI_FAMILY == WINAPI_FAMILY_APP
+ // for WinRT Apps
+ NPT_WinRtCriticalSection m_Mutex;
+ NPT_WinRtEvent* m_CanPushCondition;
+ NPT_WinRtEvent* m_CanPopCondition;
+#endif
+
+ NPT_List<NPT_QueueItem*> m_Items; // should be volatile ?
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32Queue::NPT_Win32Queue
++---------------------------------------------------------------------*/
+NPT_Win32Queue::NPT_Win32Queue(NPT_Cardinal max_items) :
+ m_MaxItems(max_items)
+{
+#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP || defined(TARGET_WINDOWS_STORE)
+ // for XBox, Windows 7 Desktop or earlier
+ m_CanPushCondition = new NPT_Win32Event(true, true);
+ m_CanPopCondition = new NPT_Win32Event(true, false);
+#elif WINAPI_FAMILY == WINAPI_FAMILY_APP
+ // for WinRT Apps
+ m_CanPushCondition = new NPT_WinRtEvent(true, true);
+ m_CanPopCondition = new NPT_WinRtEvent(true, false);
+#endif
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Queue::~NPT_Win32Queue()
++---------------------------------------------------------------------*/
+NPT_Win32Queue::~NPT_Win32Queue()
+{
+ // destroy resources
+ delete m_CanPushCondition;
+ delete m_CanPopCondition;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Queue::Push
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Queue::Push(NPT_QueueItem* item, NPT_Timeout timeout)
+{
+ // lock the mutex that protects the list
+ NPT_CHECK(m_Mutex.Lock());
+
+ // check that we have not exceeded the max
+ if (m_MaxItems) {
+ while (m_Items.GetItemCount() >= m_MaxItems) {
+ // we must wait until some items have been removed
+
+ // reset the condition to indicate that the queue is full
+ m_CanPushCondition->Reset();
+
+ // unlock the mutex so that another thread can pop
+ m_Mutex.Unlock();
+
+ // wait for the condition to signal that we can push
+ NPT_Result result = m_CanPushCondition->Wait(timeout);
+ if (NPT_FAILED(result)) return result;
+
+ // relock the mutex so that we can check the list again
+ NPT_CHECK(m_Mutex.Lock());
+ }
+ }
+
+ // add the item to the list
+ m_Items.Add(item);
+
+ // wake up the threads waiting to pop
+ m_CanPopCondition->Signal();
+
+ // unlock the mutex
+ m_Mutex.Unlock();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Queue::Pop
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Queue::Pop(NPT_QueueItem*& item, NPT_Timeout timeout)
+{
+ // default value
+ item = NULL;
+
+ // lock the mutex that protects the list
+ NPT_CHECK(m_Mutex.Lock());
+
+ NPT_Result result;
+ if (timeout) {
+ while ((result = m_Items.PopHead(item)) == NPT_ERROR_LIST_EMPTY) {
+ // no item in the list, wait for one
+
+ // reset the condition to indicate that the queue is empty
+ m_CanPopCondition->Reset();
+
+ // unlock the mutex so that another thread can push
+ m_Mutex.Unlock();
+
+ // wait for the condition to signal that we can pop
+ result = m_CanPopCondition->Wait(timeout);
+ if (NPT_FAILED(result)) return result;
+
+ // relock the mutex so that we can check the list again
+ NPT_CHECK(m_Mutex.Lock());
+ }
+ } else {
+ result = m_Items.PopHead(item);
+ }
+
+ if (m_MaxItems && (result == NPT_SUCCESS)) {
+ // wake up the threads waiting to push
+ m_CanPushCondition->Signal();
+ }
+
+ // unlock the mutex
+ m_Mutex.Unlock();
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Queue::Peek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Queue::Peek(NPT_QueueItem*& item, NPT_Timeout timeout)
+{
+ // default value
+ item = NULL;
+
+ // lock the mutex that protects the list
+ NPT_CHECK(m_Mutex.Lock());
+
+ NPT_Result result = NPT_SUCCESS;
+ NPT_List<NPT_QueueItem*>::Iterator head = m_Items.GetFirstItem();
+ if (timeout) {
+ while (!head) {
+ // no item in the list, wait for one
+
+ // reset the condition to indicate that the queue is empty
+ m_CanPopCondition->Reset();
+
+ // unlock the mutex so that another thread can push
+ m_Mutex.Unlock();
+
+ // wait for the condition to signal that we can pop
+ result = m_CanPopCondition->Wait(timeout);
+ if (NPT_FAILED(result)) return result;
+
+ // relock the mutex so that we can check the list again
+ NPT_CHECK(m_Mutex.Lock());
+
+ // try again
+ head = m_Items.GetFirstItem();
+ }
+ } else {
+ if (!head) result = NPT_ERROR_LIST_EMPTY;
+ }
+
+ if (head) item = *head;
+
+ // unlock the mutex
+ m_Mutex.Unlock();
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_GenericQueue::CreateInstance
++---------------------------------------------------------------------*/
+NPT_GenericQueue*
+NPT_GenericQueue::CreateInstance(NPT_Cardinal max_items)
+{
+ return new NPT_Win32Queue(max_items);
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp
new file mode 100644
index 0000000..4dfc23a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp
@@ -0,0 +1,342 @@
+/*****************************************************************
+|
+| Neptune - Serial Ports :: Win32 Implementation
+|
+| (c) 2001-2007 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <windows.h>
+
+#include "NptUtils.h"
+#include "NptSerialPort.h"
+#include "NptStrings.h"
+#include "NptLogging.h"
+
+#ifndef TARGET_WINDOWS_STORE
+/*----------------------------------------------------------------------
+| NPT_Win32HandletWrapper
++---------------------------------------------------------------------*/
+class NPT_Win32HandleWrapper
+{
+public:
+ // constructors and destructor
+ NPT_Win32HandleWrapper(HANDLE handle) : m_Handle(handle) {}
+ ~NPT_Win32HandleWrapper() {
+ CloseHandle(m_Handle);
+ }
+
+ // methods
+ HANDLE GetHandle() { return m_Handle; }
+
+private:
+ // members
+ HANDLE m_Handle;
+};
+
+typedef NPT_Reference<NPT_Win32HandleWrapper> NPT_Win32HandleReference;
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPortStream
++---------------------------------------------------------------------*/
+class NPT_Win32SerialPortStream
+{
+public:
+ // constructors and destructor
+ NPT_Win32SerialPortStream(NPT_Win32HandleReference handle) :
+ m_HandleReference(handle) {}
+
+protected:
+ // constructors and destructors
+ virtual ~NPT_Win32SerialPortStream() {}
+
+ // members
+ NPT_Win32HandleReference m_HandleReference;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPortInputStream
++---------------------------------------------------------------------*/
+class NPT_Win32SerialPortInputStream : public NPT_InputStream,
+ private NPT_Win32SerialPortStream
+
+{
+public:
+ // constructors and destructor
+ NPT_Win32SerialPortInputStream(NPT_Win32HandleReference& handle) :
+ NPT_Win32SerialPortStream(handle) {}
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read);
+ NPT_Result Seek(NPT_Position /* offset */) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ NPT_Result Tell(NPT_Position& /* offset */) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ NPT_Result GetSize(NPT_LargeSize& /* size */) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ NPT_Result GetAvailable(NPT_LargeSize& /* available */) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPortInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32SerialPortInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ DWORD nb_read = 0;
+ BOOL result = ReadFile(m_HandleReference->GetHandle(),
+ buffer,
+ bytes_to_read,
+ &nb_read,
+ NULL);
+ if (result == TRUE) {
+ if (bytes_read) *bytes_read = nb_read;
+ return NPT_SUCCESS;
+ } else {
+ if (bytes_read) *bytes_read = 0;
+ return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPortOutputStream
++---------------------------------------------------------------------*/
+class NPT_Win32SerialPortOutputStream : public NPT_OutputStream,
+ private NPT_Win32SerialPortStream
+{
+public:
+ // constructors and destructor
+ NPT_Win32SerialPortOutputStream(NPT_Win32HandleReference& handle) :
+ NPT_Win32SerialPortStream(handle) {}
+
+ // NPT_InputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written);
+ NPT_Result Seek(NPT_Position /* offset */) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ NPT_Result Tell(NPT_Position& /* offset */) {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPortOutputStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32SerialPortOutputStream::Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written)
+{
+ DWORD nb_written = 0;
+
+ BOOL result = WriteFile(m_HandleReference->GetHandle(),
+ buffer,
+ bytes_to_write,
+ &nb_written,
+ NULL);
+ if (result == TRUE) {
+ if (bytes_written) *bytes_written = nb_written;
+ return NPT_SUCCESS;
+ } else {
+ if (bytes_written) *bytes_written = 0;
+ return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPort
++---------------------------------------------------------------------*/
+class NPT_Win32SerialPort: public NPT_SerialPortInterface
+{
+public:
+ // constructors and destructor
+ NPT_Win32SerialPort(const char* name);
+ ~NPT_Win32SerialPort();
+
+ // NPT_SerialPortInterface methods
+ NPT_Result Open(unsigned int speed,
+ NPT_SerialPortStopBits stop_bits = NPT_SERIAL_PORT_STOP_BITS_1,
+ NPT_SerialPortFlowControl flow_control = NPT_SERIAL_PORT_FLOW_CONTROL_NONE,
+ NPT_SerialPortParity parity = NPT_SERIAL_PORT_PARITY_NONE);
+ NPT_Result Close();
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream);
+
+private:
+ // members
+ NPT_String m_Name;
+ NPT_Win32HandleReference m_HandleReference;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPort::NPT_Win32SerialPort
++---------------------------------------------------------------------*/
+NPT_Win32SerialPort::NPT_Win32SerialPort(const char* name) :
+ m_Name(name)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPort::~NPT_Win32SerialPort
++---------------------------------------------------------------------*/
+NPT_Win32SerialPort::~NPT_Win32SerialPort()
+{
+ Close();
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPort::Open
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32SerialPort::Open(unsigned int speed,
+ NPT_SerialPortStopBits stop_bits,
+ NPT_SerialPortFlowControl flow_control,
+ NPT_SerialPortParity parity)
+{
+ return NPT_FAILURE; // We don't need serial port suppurt
+#if 0
+ // check if we're already open
+ if (!m_HandleReference.IsNull()) {
+ return NPT_ERROR_SERIAL_PORT_ALREADY_OPEN;
+ }
+
+ HANDLE handle = CreateFile(m_Name,
+ GENERIC_READ | GENERIC_WRITE,
+ 0,
+ 0,
+ OPEN_EXISTING,
+ 0,
+ 0);
+ if (handle == INVALID_HANDLE_VALUE) {
+ return NPT_ERROR_NO_SUCH_SERIAL_PORT;
+ }
+
+ // set the parameters
+ DCB dcb;
+ NPT_SetMemory(&dcb, 0, sizeof(dcb));
+ dcb.DCBlength = sizeof(DCB);
+ if (!GetCommState(handle, &dcb)) {
+ CloseHandle(handle);
+ return NPT_FAILURE;
+ }
+ dcb.fBinary = TRUE;
+ dcb.BaudRate = speed;
+ switch (stop_bits) {
+ case NPT_SERIAL_PORT_STOP_BITS_1: dcb.StopBits = ONESTOPBIT; break;
+ case NPT_SERIAL_PORT_STOP_BITS_1_5: dcb.StopBits = ONE5STOPBITS; break;
+ case NPT_SERIAL_PORT_STOP_BITS_2: dcb.StopBits = TWOSTOPBITS; break;
+ }
+ switch (flow_control) {
+ case NPT_SERIAL_PORT_FLOW_CONTROL_NONE:
+ dcb.fOutX = dcb.fOutxCtsFlow = dcb.fOutxDsrFlow = FALSE;
+ dcb.fInX = dcb.fDsrSensitivity = FALSE;
+ dcb.fRtsControl = RTS_CONTROL_DISABLE;
+ dcb.fDtrControl = DTR_CONTROL_DISABLE;
+ break;
+
+ case NPT_SERIAL_PORT_FLOW_CONTROL_HARDWARE:
+ dcb.fOutX = dcb.fOutxDsrFlow = FALSE;
+ dcb.fOutxCtsFlow = TRUE;
+ dcb.fInX = dcb.fDsrSensitivity = FALSE;
+ dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
+ dcb.fDtrControl = DTR_CONTROL_DISABLE;
+ break;
+
+ case NPT_SERIAL_PORT_FLOW_CONTROL_XON_XOFF:
+ dcb.fOutX = TRUE;
+ dcb.fOutxCtsFlow = dcb.fOutxDsrFlow = FALSE;
+ dcb.fInX = TRUE;
+ dcb.fDsrSensitivity = FALSE;
+ dcb.fRtsControl = RTS_CONTROL_DISABLE;
+ dcb.fDtrControl = DTR_CONTROL_DISABLE;
+ break;
+ }
+ switch (parity) {
+ case NPT_SERIAL_PORT_PARITY_NONE: dcb.fParity = FALSE; dcb.Parity = NOPARITY; break;
+ case NPT_SERIAL_PORT_PARITY_EVEN: dcb.fParity = TRUE; dcb.Parity = EVENPARITY; break;
+ case NPT_SERIAL_PORT_PARITY_ODD: dcb.fParity = TRUE; dcb.Parity = ODDPARITY; break;
+ case NPT_SERIAL_PORT_PARITY_MARK: dcb.fParity = TRUE; dcb.Parity = MARKPARITY; break;
+ }
+ if (!SetCommState(handle, &dcb)) {
+ CloseHandle(handle);
+ return NPT_FAILURE;
+ }
+
+ // create a reference to the FILE object
+ m_HandleReference = new NPT_Win32HandleWrapper(handle);
+
+ return NPT_SUCCESS;
+#endif
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPort::Close
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32SerialPort::Close()
+{
+ // release the file reference
+ m_HandleReference = NULL;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPort::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32SerialPort::GetInputStream(NPT_InputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ // check that the file is open
+ if (m_HandleReference.IsNull()) return NPT_ERROR_SERIAL_PORT_NOT_OPEN;
+
+ // create a stream
+ stream = new NPT_Win32SerialPortInputStream(m_HandleReference);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SerialPort::GetOutputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32SerialPort::GetOutputStream(NPT_OutputStreamReference& stream)
+{
+ // default value
+ stream = NULL;
+
+ // check that the file is open
+ if (m_HandleReference.IsNull()) return NPT_ERROR_SERIAL_PORT_NOT_OPEN;
+
+ // create a stream
+ stream = new NPT_Win32SerialPortOutputStream(m_HandleReference);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SerialPort::NPT_SerialPort
++---------------------------------------------------------------------*/
+NPT_SerialPort::NPT_SerialPort(const char* name)
+{
+ m_Delegate = new NPT_Win32SerialPort(name);
+}
+#endif // ! TARGET_WINDOWS_STORE
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32System.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32System.cpp
new file mode 100644
index 0000000..88c3451
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32System.cpp
@@ -0,0 +1,147 @@
+/*****************************************************************
+|
+| Neptune - System :: Win32 Implementation
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#if defined(_XBOX)
+#include <xtl.h>
+#else
+#include <windows.h>
+#endif
+
+#if !defined(_WIN32_WCE)
+#include <sys/timeb.h>
+#endif
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptSystem.h"
+#include "NptResults.h"
+#include "NptDebug.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| NPT_System::GetProcessId
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetProcessId(NPT_UInt32& id)
+{
+ //id = getpid();
+ id = 0;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetMachineName
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetMachineName(NPT_String& name)
+{
+ return NPT_GetEnvironment("COMPUTERNAME", name);
+}
+
+#if defined(_WIN32_WCE)
+/*----------------------------------------------------------------------
+| NPT_System::GetCurrentTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetCurrentTimeStamp(NPT_TimeStamp& now)
+{
+ SYSTEMTIME stime;
+ FILETIME ftime;
+ __int64 time64;
+ GetSystemTime(&stime);
+ SystemTimeToFileTime(&stime, &ftime);
+
+ /* convert to 64-bits 100-nanoseconds value */
+ time64 = (((unsigned __int64)ftime.dwHighDateTime)<<32) | ((unsigned __int64)ftime.dwLowDateTime);
+ time64 -= 116444736000000000; /* convert from the Windows epoch (Jan. 1, 1601) to the
+ * Unix epoch (Jan. 1, 1970) */
+
+ now.m_Seconds = (NPT_Int32)(time64/10000000);
+ now.m_NanoSeconds = 100*(NPT_Int32)(time64-((unsigned __int64)now.m_Seconds*10000000));
+
+ return NPT_SUCCESS;
+}
+#else
+/*----------------------------------------------------------------------
+| NPT_System::GetCurrentTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetCurrentTimeStamp(NPT_TimeStamp& now)
+{
+ struct _timeb time_stamp;
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+ _ftime_s(&time_stamp);
+#else
+ _ftime(&time_stamp);
+#endif
+ now.SetNanos(((NPT_UInt64)time_stamp.time) * 1000000000UL +
+ ((NPT_UInt64)time_stamp.millitm) * 1000000);
+
+ return NPT_SUCCESS;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_System::Sleep
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::Sleep(const NPT_TimeInterval& duration)
+{
+ ::Sleep((NPT_UInt32)duration.ToMillis());
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SleepUntil
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SleepUntil(const NPT_TimeStamp& when)
+{
+ NPT_TimeStamp now;
+ GetCurrentTimeStamp(now);
+ if (when > now) {
+ NPT_TimeInterval duration = when-now;
+ return Sleep(duration);
+ } else {
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SetRandomSeed
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SetRandomSeed(unsigned int seed)
+{
+ srand(seed);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::NPT_System
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_System::GetRandomInteger()
+{
+ static bool seeded = false;
+ if (seeded == false) {
+ NPT_TimeStamp now;
+ GetCurrentTimeStamp(now);
+ srand((NPT_UInt32)now.ToNanos());
+ seeded = true;
+ }
+
+ return rand();
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
new file mode 100644
index 0000000..3ab979a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
@@ -0,0 +1,704 @@
+/*****************************************************************
+|
+| Neptune - Threads :: Win32 Implementation
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#if defined(_XBOX)
+#include <xtl.h>
+#else
+#include <windows.h>
+#if !defined(_WIN32_WCE)
+#include <process.h>
+#endif
+#endif
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptThreads.h"
+#include "NptDebug.h"
+#include "NptResults.h"
+#include "NptWin32Threads.h"
+#include "NptTime.h"
+#include "NptSystem.h"
+#include "NptLogging.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.threads.win32")
+
+/*----------------------------------------------------------------------
+| configuration macros
++---------------------------------------------------------------------*/
+#if defined(_WIN32_WCE) || defined(_XBOX)
+#define NPT_WIN32_USE_CREATE_THREAD
+#endif
+
+#if defined(NPT_WIN32_USE_CREATE_THREAD)
+#define _beginthreadex(security, stack_size, start_proc, arg, flags, pid) \
+CreateThread(security, stack_size, (LPTHREAD_START_ROUTINE) start_proc, \
+ arg, flags, (LPDWORD)pid)
+#define _endthreadex ExitThread
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_Win32Mutex::NPT_Win32Mutex
++---------------------------------------------------------------------*/
+NPT_Win32Mutex::NPT_Win32Mutex()
+{
+ m_Handle = CreateMutex(NULL, FALSE, NULL);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Mutex::~NPT_Win32Mutex
++---------------------------------------------------------------------*/
+NPT_Win32Mutex::~NPT_Win32Mutex()
+{
+ CloseHandle(m_Handle);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Mutex::Lock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Mutex::Lock()
+{
+ DWORD result = WaitForSingleObject(m_Handle, INFINITE);
+ if (result == WAIT_OBJECT_0) {
+ return NPT_SUCCESS;
+ } else {
+ return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Mutex::Unlock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Mutex::Unlock()
+{
+ ReleaseMutex(m_Handle);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Mutex::NPT_Mutex
++---------------------------------------------------------------------*/
+NPT_Mutex::NPT_Mutex(bool recursive)
+{
+ NPT_COMPILER_UNUSED(recursive); // always recursive on Win32
+ m_Delegate = new NPT_Win32Mutex();
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32CriticalSection::NPT_Win32CriticalSection
++---------------------------------------------------------------------*/
+NPT_Win32CriticalSection::NPT_Win32CriticalSection()
+{
+ InitializeCriticalSection(&m_CriticalSection);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32CriticalSection::~NPT_Win32CriticalSection
++---------------------------------------------------------------------*/
+NPT_Win32CriticalSection::~NPT_Win32CriticalSection()
+{
+ DeleteCriticalSection(&m_CriticalSection);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32CriticalSection::Lock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32CriticalSection::Lock()
+{
+ EnterCriticalSection(&m_CriticalSection);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32CriticalSection::Unlock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32CriticalSection::Unlock()
+{
+ LeaveCriticalSection(&m_CriticalSection);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Event::NPT_Win32Event
++---------------------------------------------------------------------*/
+NPT_Win32Event::NPT_Win32Event(bool manual /* = false */, bool initial /* = false */)
+{
+ m_Event = CreateEvent(NULL, (manual==true)?TRUE:FALSE, (initial==true)?TRUE:FALSE, NULL);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Event::~NPT_Win32Event
++---------------------------------------------------------------------*/
+NPT_Win32Event::~NPT_Win32Event()
+{
+ CloseHandle(m_Event);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Event::Wait
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Event::Wait(NPT_Timeout timeout)
+{
+ if (m_Event) {
+ DWORD result = WaitForSingleObject(m_Event, timeout==NPT_TIMEOUT_INFINITE?INFINITE:timeout);
+ if (result == WAIT_TIMEOUT) {
+ return NPT_ERROR_TIMEOUT;
+ }
+ if (result != WAIT_OBJECT_0 && result != WAIT_ABANDONED) {
+ return NPT_FAILURE;
+ }
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Event::Signal
++---------------------------------------------------------------------*/
+void
+NPT_Win32Event::Signal()
+{
+ SetEvent(m_Event);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Event::Reset
++---------------------------------------------------------------------*/
+void
+NPT_Win32Event::Reset()
+{
+ ResetEvent(m_Event);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SharedVariable
++---------------------------------------------------------------------*/
+class NPT_Win32SharedVariable : public NPT_SharedVariableInterface
+{
+ public:
+ // methods
+ NPT_Win32SharedVariable(int value);
+ ~NPT_Win32SharedVariable();
+ void SetValue(int value);
+ int GetValue();
+ NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+ NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+ NPT_Result WaitWhileOrUntilEquals(int value, NPT_Timeout timeout, bool until);
+
+ private:
+ // members
+ volatile int m_Value;
+ volatile unsigned int m_Waiters;
+ NPT_Mutex m_Lock;
+ NPT_Win32Event m_Event;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32SharedVariable::NPT_Win32SharedVariable
++---------------------------------------------------------------------*/
+NPT_Win32SharedVariable::NPT_Win32SharedVariable(int value) :
+ m_Value(value),
+ m_Waiters(0),
+ m_Event(true)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SharedVariable::~NPT_Win32SharedVariable
++---------------------------------------------------------------------*/
+NPT_Win32SharedVariable::~NPT_Win32SharedVariable()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SharedVariable::SetValue
++---------------------------------------------------------------------*/
+void
+NPT_Win32SharedVariable::SetValue(int value)
+{
+ m_Lock.Lock();
+ if (value != m_Value) {
+ m_Value = value;
+ if (m_Waiters) m_Event.Signal();
+ }
+ m_Lock.Unlock();
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SharedVariable::GetValue
++---------------------------------------------------------------------*/
+int
+NPT_Win32SharedVariable::GetValue()
+{
+ // reading an integer should be atomic on all Win32 platforms
+ return m_Value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SharedVariable::WaitWhileOrUntilEquals
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32SharedVariable::WaitWhileOrUntilEquals(int value, NPT_Timeout timeout, bool until)
+{
+ do {
+ m_Lock.Lock();
+ if (until) {
+ if (m_Value == value) break;
+ } else {
+ if (m_Value != value) break;
+ }
+ ++m_Waiters;
+ m_Lock.Unlock();
+
+ NPT_Result result = m_Event.Wait(timeout);
+ bool last_waiter = true;
+ m_Lock.Lock();
+ if (--m_Waiters == 0) {
+ m_Event.Reset();
+ } else {
+ last_waiter = false;
+ }
+ m_Lock.Unlock();
+
+ if (NPT_FAILED(result)) return result;
+
+ // FIXME: this is suboptimal, but we need it to ensure we don't busy-loop
+ if (!last_waiter) {
+ Sleep(10);
+ }
+ } while (true);
+
+ m_Lock.Unlock();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SharedVariable::WaitUntilEquals
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32SharedVariable::WaitUntilEquals(int value, NPT_Timeout timeout)
+{
+ return WaitWhileOrUntilEquals(value, timeout, true);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32SharedVariable::WaitWhileEquals
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32SharedVariable::WaitWhileEquals(int value, NPT_Timeout timeout)
+{
+ return WaitWhileOrUntilEquals(value, timeout, false);
+}
+
+/*----------------------------------------------------------------------
+| NPT_SharedVariable::NPT_SharedVariable
++---------------------------------------------------------------------*/
+NPT_SharedVariable::NPT_SharedVariable(int value)
+{
+ m_Delegate = new NPT_Win32SharedVariable(value);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32AtomicVariable
++---------------------------------------------------------------------*/
+class NPT_Win32AtomicVariable : public NPT_AtomicVariableInterface
+{
+ public:
+ // methods
+ NPT_Win32AtomicVariable(int value);
+ ~NPT_Win32AtomicVariable();
+ int Increment();
+ int Decrement();
+ void SetValue(int value);
+ int GetValue();
+
+ private:
+ // members
+ volatile LONG m_Value;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32AtomicVariable::NPT_Win32AtomicVariable
++---------------------------------------------------------------------*/
+NPT_Win32AtomicVariable::NPT_Win32AtomicVariable(int value) :
+ m_Value(value)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32AtomicVariable::~NPT_Win32AtomicVariable
++---------------------------------------------------------------------*/
+NPT_Win32AtomicVariable::~NPT_Win32AtomicVariable()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32AtomicVariable::Increment
++---------------------------------------------------------------------*/
+int
+NPT_Win32AtomicVariable::Increment()
+{
+ return InterlockedIncrement(const_cast<LONG*>(&m_Value));
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32AtomicVariable::Decrement
++---------------------------------------------------------------------*/
+int
+NPT_Win32AtomicVariable::Decrement()
+{
+ return InterlockedDecrement(const_cast<LONG*>(&m_Value));
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32AtomicVariable::SetValue
++---------------------------------------------------------------------*/
+void
+NPT_Win32AtomicVariable::SetValue(int value)
+{
+ m_Value = value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32AtomicVariable::GetValue
++---------------------------------------------------------------------*/
+int
+NPT_Win32AtomicVariable::GetValue()
+{
+ return m_Value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AtomicVariable::NPT_AtomicVariable
++---------------------------------------------------------------------*/
+NPT_AtomicVariable::NPT_AtomicVariable(int value)
+{
+ m_Delegate = new NPT_Win32AtomicVariable(value);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread
++---------------------------------------------------------------------*/
+class NPT_Win32Thread : public NPT_ThreadInterface
+{
+ public:
+ // class methods
+ static NPT_Result SetThreadPriority(HANDLE thread, int priority);
+ static NPT_Result GetThreadPriority(HANDLE thread, int& priority);
+
+ // methods
+ NPT_Win32Thread(NPT_Thread* delegator,
+ NPT_Runnable& target,
+ bool detached);
+ ~NPT_Win32Thread();
+ NPT_Result Start();
+ NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+ NPT_Result GetPriority(int& priority);
+ NPT_Result SetPriority(int priority);
+ NPT_Result CancelBlockerSocket();
+
+ private:
+ // methods
+ static unsigned int __stdcall EntryPoint(void* argument);
+
+ // NPT_Runnable methods
+ void Run();
+
+ // NPT_Interruptible methods
+ NPT_Result Interrupt() { return NPT_ERROR_NOT_IMPLEMENTED; }
+
+ // members
+ NPT_Thread* m_Delegator;
+ NPT_Runnable& m_Target;
+ bool m_Detached;
+ HANDLE m_ThreadHandle;
+ DWORD m_ThreadId;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::NPT_Win32Thread
++---------------------------------------------------------------------*/
+NPT_Win32Thread::NPT_Win32Thread(NPT_Thread* delegator,
+ NPT_Runnable& target,
+ bool detached) :
+ m_Delegator(delegator),
+ m_Target(target),
+ m_Detached(detached),
+ m_ThreadHandle(nullptr),
+ m_ThreadId(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::~NPT_Win32Thread
++---------------------------------------------------------------------*/
+NPT_Win32Thread::~NPT_Win32Thread()
+{
+ if (!m_Detached) {
+ // we're not detached, and not in the Run() method, so we need to
+ // wait until the thread is done
+ Wait();
+ }
+
+ // close the thread handle
+ if (m_ThreadHandle) {
+ CloseHandle(m_ThreadHandle);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::SetThreadPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Thread::SetThreadPriority(HANDLE thread, int priority)
+{
+ int win32_priority;
+ if (priority < NPT_THREAD_PRIORITY_LOWEST) {
+ win32_priority = THREAD_PRIORITY_IDLE;
+ } else if (priority < NPT_THREAD_PRIORITY_BELOW_NORMAL) {
+ win32_priority = THREAD_PRIORITY_LOWEST;
+ } else if (priority < NPT_THREAD_PRIORITY_NORMAL) {
+ win32_priority = THREAD_PRIORITY_BELOW_NORMAL;
+ } else if (priority < NPT_THREAD_PRIORITY_ABOVE_NORMAL) {
+ win32_priority = THREAD_PRIORITY_NORMAL;
+ } else if (priority < NPT_THREAD_PRIORITY_HIGHEST) {
+ win32_priority = THREAD_PRIORITY_ABOVE_NORMAL;
+ } else if (priority < NPT_THREAD_PRIORITY_TIME_CRITICAL) {
+ win32_priority = THREAD_PRIORITY_HIGHEST;
+ } else {
+ win32_priority = THREAD_PRIORITY_TIME_CRITICAL;
+ }
+ BOOL result = ::SetThreadPriority(thread, win32_priority);
+ if (!result) {
+ NPT_LOG_WARNING_1("SetThreadPriority failed (%x)", GetLastError());
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::GetThreadPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Thread::GetThreadPriority(HANDLE thread, int& priority)
+{
+ int win32_priority = ::GetThreadPriority(thread);
+ if (win32_priority == THREAD_PRIORITY_ERROR_RETURN) {
+ NPT_LOG_WARNING_1("GetThreadPriority failed (%x)", GetLastError());
+ return NPT_FAILURE;
+ }
+
+ priority = win32_priority;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::EntryPoint
++---------------------------------------------------------------------*/
+unsigned int __stdcall
+NPT_Win32Thread::EntryPoint(void* argument)
+{
+ NPT_Win32Thread* thread = reinterpret_cast<NPT_Win32Thread*>(argument);
+
+ NPT_LOG_FINER("thread in =======================");
+
+ // set random seed per thread
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ NPT_System::SetRandomSeed((NPT_UInt32)(now.ToNanos()) + ::GetCurrentThreadId());
+
+ // set a default name
+ #pragma pack(push,8)
+ struct THREADNAME_INFO
+ {
+ DWORD dwType; // must be 0x1000
+ LPCSTR szName; // pointer to name (in same addr space)
+ DWORD dwThreadID; // thread ID (-1 caller thread)
+ DWORD dwFlags; // reserved for future use, most be zero
+ } info;
+ #pragma pack(pop)
+ info.dwType = 0x1000;
+ info.szName = "Neptune Thread";
+ info.dwThreadID = GetCurrentThreadId();
+ info.dwFlags = 0;
+ __try
+ {
+ RaiseException(0x406d1388, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info);
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
+
+ thread->m_ThreadId = (DWORD)::GetCurrentThreadId();
+
+ // run the thread
+ thread->Run();
+
+ // if the thread is detached, delete it
+ if (thread->m_Detached) {
+ delete thread->m_Delegator;
+ }
+
+ // done
+ return 0;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::Start
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Thread::Start()
+{
+ if (m_ThreadHandle != nullptr) {
+ // failed
+ NPT_LOG_WARNING("thread already started !");
+ return NPT_ERROR_INVALID_STATE;
+ }
+
+ NPT_LOG_FINER("creating thread");
+
+ // create the native thread
+#if defined(_WIN32_WCE)
+ DWORD thread_id;
+#else
+ unsigned int thread_id;
+#endif
+ // create a stack local variable 'detached', as this object
+ // may already be deleted when _beginthreadex returns and
+ // before we get to call detach on the given thread
+ bool detached = m_Detached;
+
+ HANDLE thread_handle = (HANDLE)
+ _beginthreadex(NULL,
+ NPT_CONFIG_THREAD_STACK_SIZE,
+ EntryPoint,
+ reinterpret_cast<void*>(this),
+ 0,
+ &thread_id);
+ if (thread_handle == 0) {
+ // failed
+ return NPT_FAILURE;
+ }
+
+ if (detached) {
+ CloseHandle(thread_handle);
+ } else {
+ m_ThreadHandle = thread_handle;
+ }
+
+ m_ThreadId = (DWORD)thread_id;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::Run
++---------------------------------------------------------------------*/
+void
+NPT_Win32Thread::Run()
+{
+ m_Target.Run();
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::SetPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Thread::SetPriority(int priority)
+{
+ if (m_ThreadHandle == 0) return NPT_ERROR_INVALID_STATE;
+ return NPT_Win32Thread::SetThreadPriority(m_ThreadHandle, priority);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::GetPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Thread::GetPriority(int& priority)
+{
+ if (m_ThreadHandle == 0) return NPT_ERROR_INVALID_STATE;
+ return NPT_Win32Thread::GetThreadPriority(m_ThreadHandle, priority);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::Wait
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Thread::Wait(NPT_Timeout timeout /* = NPT_TIMEOUT_INFINITE */)
+{
+ // check that we're not detached
+ if (m_ThreadHandle == 0 || m_Detached) {
+ return NPT_FAILURE;
+ }
+
+ // wait for the thread to finish
+ // Logging here will cause a crash on exit because LogManager may already be destroyed
+ DWORD result = WaitForSingleObject(m_ThreadHandle,
+ timeout==NPT_TIMEOUT_INFINITE?INFINITE:timeout);
+ if (result != WAIT_OBJECT_0) {
+ return NPT_FAILURE;
+ } else {
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Win32Thread::CancelBlockerSocket
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Win32Thread::CancelBlockerSocket()
+{
+ return NPT_Socket::CancelBlockerSocket((NPT_Thread::ThreadId)m_ThreadId);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::GetCurrentThreadId
++---------------------------------------------------------------------*/
+NPT_Thread::ThreadId
+NPT_Thread::GetCurrentThreadId()
+{
+ return ::GetCurrentThreadId();
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::SetCurrentThreadPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Thread::SetCurrentThreadPriority(int priority)
+{
+ return NPT_Win32Thread::SetThreadPriority(::GetCurrentThread(), priority);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::NPT_Thread
++---------------------------------------------------------------------*/
+NPT_Thread::NPT_Thread(bool detached)
+{
+ m_Delegate = new NPT_Win32Thread(this, *this, detached);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::NPT_Thread
++---------------------------------------------------------------------*/
+NPT_Thread::NPT_Thread(NPT_Runnable& target, bool detached)
+{
+ m_Delegate = new NPT_Win32Thread(this, target, detached);
+}
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.h b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.h
new file mode 100644
index 0000000..e8f32cc
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.h
@@ -0,0 +1,73 @@
+/*****************************************************************
+|
+| Neptune - Threads :: Win32 Implementation
+|
+| (c) 2001-2003 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptThreads.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| NPT_Win32Mutex
++---------------------------------------------------------------------*/
+class NPT_Win32Mutex : public NPT_MutexInterface
+{
+public:
+ // methods
+ NPT_Win32Mutex();
+ virtual ~NPT_Win32Mutex();
+
+ // NPT_Mutex methods
+ virtual NPT_Result Lock();
+ virtual NPT_Result Unlock();
+
+private:
+ // members
+ HANDLE m_Handle;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32Event
++---------------------------------------------------------------------*/
+class NPT_Win32Event
+{
+public:
+ // methods
+ NPT_Win32Event(bool manual = false, bool initial = false);
+ virtual ~NPT_Win32Event();
+
+ virtual NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+ virtual void Signal();
+ virtual void Reset();
+
+private:
+ // members
+ HANDLE m_Event;
+};
+
+/*----------------------------------------------------------------------
+| NPT_Win32CriticalSection
++---------------------------------------------------------------------*/
+class NPT_Win32CriticalSection
+{
+public:
+ // methods
+ NPT_Win32CriticalSection();
+ ~NPT_Win32CriticalSection();
+
+ // NPT_Mutex methods
+ NPT_Result Lock();
+ NPT_Result Unlock();
+
+private:
+ // members
+ CRITICAL_SECTION m_CriticalSection;
+};
diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Time.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Time.cpp
new file mode 100755
index 0000000..637b48c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Time.cpp
@@ -0,0 +1,33 @@
+/*****************************************************************
+|
+| Neptune - Time: Win32 Implementation
+|
+| (c) 2002-2009 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <windows.h>
+
+#include "NptTime.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+//NPT_SET_LOCAL_LOGGER("neptune.system.win32.time")
+
+/*----------------------------------------------------------------------
+| NPT_DateTime::GetTimeZone
++---------------------------------------------------------------------*/
+NPT_Int32
+NPT_DateTime::GetLocalTimeZone()
+{
+ TIME_ZONE_INFORMATION tz_info;
+ DWORD result = GetTimeZoneInformation(&tz_info);
+ if (result == TIME_ZONE_ID_INVALID) return 0;
+ return -tz_info.Bias;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/WinCE/NptWinCeUtils.h b/lib/libUPnP/Neptune/Source/System/WinCE/NptWinCeUtils.h
new file mode 100644
index 0000000..5ec28b9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinCE/NptWinCeUtils.h
@@ -0,0 +1,92 @@
+/*****************************************************************
+|
+| Neptune - Windows CE Utils
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+
+#ifndef _NPT_WINCE_UTILS_H_
+#define _NPT_WINCE_UTILS_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <windows.h>
+
+/*----------------------------------------------------------------------
+| fix windows macros
++---------------------------------------------------------------------*/
+#if defined(CreateDirectory)
+#undef CreateDirectory
+#endif
+
+#if defined(DeleteFile)
+#undef DeleteFile
+#endif
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+
+/*----------------------------------------------------------------------
+| A2WHelper
++---------------------------------------------------------------------*/
+static LPWSTR A2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars, UINT acp)
+{
+ int ret;
+
+ assert(lpa != NULL);
+ assert(lpw != NULL);
+ if (lpw == NULL || lpa == NULL) return NULL;
+
+ lpw[0] = '\0';
+ ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
+ if (ret == 0) {
+ assert(0);
+ return NULL;
+ }
+ return lpw;
+}
+
+/*----------------------------------------------------------------------
+| W2AHelper
++---------------------------------------------------------------------*/
+static LPSTR W2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars, UINT acp)
+{
+ int ret;
+
+ assert(lpw != NULL);
+ assert(lpa != NULL);
+ if (lpa == NULL || lpw == NULL) return NULL;
+
+ lpa[0] = '\0';
+ ret = WideCharToMultiByte(acp, 0, lpw, -1, lpa, nChars, NULL, NULL);
+ if (ret == 0) {
+ assert(0);
+ return NULL;
+ }
+ return lpa;
+}
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define USES_CONVERSION int _convert = 0; LPCWSTR _lpw = NULL; LPCSTR _lpa = NULL
+
+#define A2W(lpa) (\
+ ((_lpa = lpa) == NULL) ? NULL : (\
+ _convert = (strlen(_lpa)+1),\
+ (INT_MAX/2<_convert)? NULL : \
+ A2WHelper((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, CP_UTF8)))
+
+#define W2A(lpw) (\
+ ((_lpw = lpw) == NULL) ? NULL : (\
+ (_convert = (lstrlenW(_lpw)+1), \
+ (_convert>INT_MAX/2) ? NULL : \
+ W2AHelper((LPSTR) alloca(_convert*sizeof(WCHAR)), _lpw, _convert*sizeof(WCHAR), CP_UTF8))))
+
+#endif /* _NPT_WINCE_UTILS_H_ */ \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Source/System/WinCE/NptWinceConsole.cpp b/lib/libUPnP/Neptune/Source/System/WinCE/NptWinceConsole.cpp
new file mode 100644
index 0000000..0ffabf8
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinCE/NptWinceConsole.cpp
@@ -0,0 +1,26 @@
+/*****************************************************************
+|
+| Neptune - Console Support: Windows CE Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdio.h>
+
+#include "NptConfig.h"
+#include "NptConsole.h"
+
+/*----------------------------------------------------------------------
+| NPT_Console::Output
++---------------------------------------------------------------------*/
+void
+NPT_Console::Output(const char* message)
+{
+ printf("%s", message);
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/WinCE/NptWinceEnvironment.cpp b/lib/libUPnP/Neptune/Source/System/WinCE/NptWinceEnvironment.cpp
new file mode 100644
index 0000000..8dceefe
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinCE/NptWinceEnvironment.cpp
@@ -0,0 +1,63 @@
+/*****************************************************************
+|
+| Neptune - Environment variables: Windows CE Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <windows.h>
+
+#include "NptConfig.h"
+#include "NptUtils.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| NPT_GetEnvironment
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_GetEnvironment(const char* name, NPT_String& value)
+{
+ HKEY key = NULL;
+ DWORD type;
+ WCHAR* name_w;
+ DWORD name_length;
+ DWORD value_length;
+ NPT_Result result;
+
+ // default value
+ value.SetLength(0);
+
+ // convert name to unicode
+ name_length = NPT_StringLength(name);
+ name_w = new WCHAR[(name_length+1)];
+ MultiByteToWideChar(CP_UTF8, 0, name, -1, name_w, name_length+1);
+
+ if (RegOpenKeyEx(HKEY_CURRENT_USER,
+ _T("Software\\Axiomatic\\Neptune\\Environment"),
+ 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) {
+ if (RegQueryValueEx(key, name_w, 0, &type, (PBYTE)NULL, &value_length ) == ERROR_SUCCESS) {
+ // convert to UTF-8
+
+ WCHAR* value_w = new WCHAR[(value_length+1)];
+ int value_size = 4*value_length+1;
+ value.Reserve(value_size);
+
+ if (RegQueryValueEx(key, name_w, 0, &type, (PBYTE)value_w, &value_length ) == ERROR_SUCCESS) {
+ value_size = WideCharToMultiByte(CP_UTF8, 0, value_w, value_length, value.UseChars(), value_size, NULL, FALSE);
+ value.SetLength(value_size);
+ }
+
+ delete[] value_w;
+ result = NPT_SUCCESS;
+ }
+ }
+
+ delete[] name_w;
+
+ return result;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/WinCE/NptWinceMain.cpp b/lib/libUPnP/Neptune/Source/System/WinCE/NptWinceMain.cpp
new file mode 100644
index 0000000..1a89167
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinCE/NptWinceMain.cpp
@@ -0,0 +1,47 @@
+/*****************************************************************
+|
+| Neptune - Utils : WinCE Implementation
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <windows.h>
+
+/*----------------------------------------------------------------------
+| _tmain
++---------------------------------------------------------------------*/
+extern int main(int argc, char** argv);
+
+int
+_tmain(int argc, wchar_t** argv, wchar_t** envp)
+{
+ char** argv_utf8 = new char*[1+argc];
+ int i;
+ int result;
+
+ // allocate and convert args
+ for (i=0; i<argc; i++) {
+ unsigned int arg_length = wcslen(argv[i]);
+ argv_utf8[i] = new char[4*arg_length+1];
+ WideCharToMultiByte(CP_UTF8, 0, argv[i], -1, argv_utf8[i], 4*arg_length+1, 0, 0);
+ }
+
+ // terminate the array
+ argv_utf8[argc] = NULL;
+
+ // call the real main
+ result = main(argc, argv_utf8);
+
+ // cleanup
+ for (i=0; i<argc; i++) {
+ delete [] argv_utf8[i];
+ }
+ delete[] argv_utf8;
+
+ return result;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtConsole.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtConsole.cpp
new file mode 100644
index 0000000..e10ef50
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtConsole.cpp
@@ -0,0 +1,28 @@
+/*****************************************************************
+|
+| Neptune - Console Support: WinRT Implementation
+|
+| (c) 2002-2013 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWinRtPch.h"
+
+#include "NptConfig.h"
+#include "NptConsole.h"
+#include "NptWinRtUtils.h"
+
+/*----------------------------------------------------------------------
+| NPT_Console::Output
++---------------------------------------------------------------------*/
+void
+NPT_Console::Output(const char* message)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+ OutputDebugStringW(NPT_WINRT_A2W(message));
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtDebug.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtDebug.cpp
new file mode 100644
index 0000000..ba98324
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtDebug.cpp
@@ -0,0 +1,30 @@
+/*****************************************************************
+|
+| Neptune - Debug Support: WinRT Implementation
+|
+| (c) 2002-2013 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWinRtPch.h"
+
+#include "NptConfig.h"
+#include "NptDefs.h"
+#include "NptTypes.h"
+#include "NptDebug.h"
+#include "NptWinRtUtils.h"
+
+/*----------------------------------------------------------------------
+| NPT_DebugOutput
++---------------------------------------------------------------------*/
+void
+NPT_DebugOutput(const char* message)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+ OutputDebugStringW(NPT_WINRT_A2W(message));
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtEnvironment.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtEnvironment.cpp
new file mode 100644
index 0000000..c50f1e3
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtEnvironment.cpp
@@ -0,0 +1,36 @@
+/*****************************************************************
+|
+| Neptune - Environment variables: WinRT Implementation
+|
+| (c) 2002-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptUtils.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| NPT_Environment::Get
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Environment::Get(const char* name, NPT_String& value)
+{
+ /* default value */
+ value.SetLength(0);
+
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Environment::Set
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Environment::Set(const char* name, const char* value)
+{
+ return NPT_ERROR_NOT_SUPPORTED;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtFile.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtFile.cpp
new file mode 100644
index 0000000..a9c76f1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtFile.cpp
@@ -0,0 +1,270 @@
+/*****************************************************************
+|
+| Neptune - Files :: WinRT Implementation
+|
+| (c) 2001-2013 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWinRtPch.h"
+
+#include "NptConfig.h"
+#include "NptUtils.h"
+#include "NptFile.h"
+#include "NptStrings.h"
+#include "NptDebug.h"
+#include "NptWinRtUtils.h"
+
+/*----------------------------------------------------------------------
+| MapError
++---------------------------------------------------------------------*/
+static NPT_Result
+MapError(DWORD err) {
+ switch (err) {
+ case ERROR_ALREADY_EXISTS: return NPT_ERROR_FILE_ALREADY_EXISTS;
+ case ERROR_PATH_NOT_FOUND:
+ case ERROR_FILE_NOT_FOUND:
+ case ERROR_INVALID_DRIVE:
+ case ERROR_BAD_PATHNAME:
+ case ERROR_BAD_NET_NAME:
+ case ERROR_FILENAME_EXCED_RANGE:
+ case ERROR_NO_MORE_FILES:
+ case ERROR_BAD_NETPATH: return NPT_ERROR_NO_SUCH_FILE;
+ case ERROR_LOCK_VIOLATION:
+ case ERROR_SEEK_ON_DEVICE:
+ case ERROR_CURRENT_DIRECTORY:
+ case ERROR_CANNOT_MAKE:
+ case ERROR_FAIL_I24:
+ case ERROR_NETWORK_ACCESS_DENIED:
+ case ERROR_DRIVE_LOCKED:
+ case ERROR_ACCESS_DENIED: return NPT_ERROR_PERMISSION_DENIED;
+ case ERROR_NOT_LOCKED:
+ case ERROR_LOCK_FAILED:
+ case ERROR_SHARING_VIOLATION: return NPT_ERROR_FILE_BUSY;
+ case ERROR_INVALID_FUNCTION: return NPT_ERROR_INTERNAL;
+ case ERROR_NOT_ENOUGH_QUOTA: return NPT_ERROR_OUT_OF_MEMORY;
+ case ERROR_ARENA_TRASHED:
+ case ERROR_NOT_ENOUGH_MEMORY:
+ case ERROR_INVALID_BLOCK: return NPT_ERROR_OUT_OF_MEMORY;
+ case ERROR_DISK_FULL: return NPT_ERROR_FILE_NOT_ENOUGH_SPACE;
+ case ERROR_TOO_MANY_OPEN_FILES: return NPT_ERROR_OUT_OF_RESOURCES;
+ case ERROR_INVALID_HANDLE:
+ case ERROR_INVALID_ACCESS:
+ case ERROR_INVALID_DATA: return NPT_ERROR_INVALID_PARAMETERS;
+ case ERROR_DIR_NOT_EMPTY: return NPT_ERROR_DIRECTORY_NOT_EMPTY;
+ case ERROR_NEGATIVE_SEEK: return NPT_ERROR_OUT_OF_RANGE;
+ default: return NPT_FAILURE;
+}
+}
+
+#include <sys/stat.h>
+#include <direct.h>
+
+/*----------------------------------------------------------------------
+| NPT_stat_utf8
++---------------------------------------------------------------------*/
+int
+NPT_stat_utf8(const char* path, struct __stat64* info)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+ return _wstat64(NPT_WINRT_A2W(path), info);
+}
+
+/*----------------------------------------------------------------------
+| NPT_fsopen_utf8
++---------------------------------------------------------------------*/
+FILE*
+NPT_fsopen_utf8(const char* path, const char* mode, int sh_flags)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+ return _wfsopen(NPT_WINRT_A2W(path), NPT_WINRT_A2W(mode), sh_flags);
+}
+
+/*----------------------------------------------------------------------
+| NPT_FilePath::Separator
++---------------------------------------------------------------------*/
+const char* const NPT_FilePath::Separator = "\\";
+
+/*----------------------------------------------------------------------
+| NPT_File::GetRoots
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetRoots(NPT_List<NPT_String>& roots)
+{
+ roots.Clear();
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::GetWorkingDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetWorkingDir(NPT_String& path)
+{
+ path.SetLength(0);
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::GetInfo(const char* path, NPT_FileInfo* info)
+{
+ DWORD attributes = 0;
+ WIN32_FILE_ATTRIBUTE_DATA attribute_data;
+
+ NPT_WINRT_USE_CHAR_CONVERSION;
+
+ if (0 == GetFileAttributesEx(
+ NPT_WINRT_A2W(path),
+ GetFileExInfoStandard,
+ &attribute_data)) {
+ DWORD error_code = GetLastError();
+ return NPT_FAILURE;
+ }
+ attributes = attribute_data.dwFileAttributes;
+ if (attributes == INVALID_FILE_ATTRIBUTES) {
+ return NPT_FAILURE;
+ }
+
+ if (info != NULL) {
+ // (prasad) FIXME - fill in the attribute values in return value
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::CreateDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::CreateDir(const char* path)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+ BOOL result = ::CreateDirectoryW(NPT_WINRT_A2W(path), NULL);
+ if (result == 0) {
+ return MapError(GetLastError());
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::RemoveFile
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::RemoveFile(const char* path)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+ BOOL result = ::DeleteFileW(NPT_WINRT_A2W(path));
+ if (result == 0) {
+ return MapError(GetLastError());
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::RemoveDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::RemoveDir(const char* path)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+ BOOL result = ::RemoveDirectoryW(NPT_WINRT_A2W(path));
+ if (result == 0) {
+ return MapError(GetLastError());
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::Rename
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::Rename(const char* from_path, const char* to_path)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+ BOOL result = MoveFileEx(NPT_WINRT_A2W(from_path),
+ NPT_WINRT_A2W(to_path),
+ MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH);
+ if (result == 0) {
+ return MapError(GetLastError());
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File_ProcessFindData
++---------------------------------------------------------------------*/
+static bool
+NPT_File_ProcessFindData(WIN32_FIND_DATAW* find_data)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+
+ // discard system specific files/shortcuts
+ if (NPT_StringsEqual(NPT_WINRT_W2A(find_data->cFileName), ".") ||
+ NPT_StringsEqual(NPT_WINRT_W2A(find_data->cFileName), "..")) {
+ return false;
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| NPT_File::ListDir
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_File::ListDir(const char* path,
+ NPT_List<NPT_String>& entries,
+ NPT_Ordinal start /* = 0 */,
+ NPT_Cardinal max /* = 0 */)
+{
+ NPT_WINRT_USE_CHAR_CONVERSION;
+
+ // default return value
+ entries.Clear();
+
+ // check the arguments
+ if (path == NULL || path[0] == '\0') return NPT_ERROR_INVALID_PARAMETERS;
+
+ // construct a path name with a \* wildcard at the end
+ NPT_String path_pattern = path;
+ if (path_pattern.EndsWith("\\") || path_pattern.EndsWith("/")) {
+ path_pattern += "*";
+ } else {
+ path_pattern += "\\*";
+ }
+
+ // list the entries
+ WIN32_FIND_DATAW find_data;
+ HANDLE find_handle = FindFirstFileEx(NPT_WINRT_A2W(path_pattern.GetChars()),
+ FindExInfoStandard,
+ &find_data,
+ FindExSearchNameMatch,
+ NULL,
+ 0);
+ if (find_handle == INVALID_HANDLE_VALUE) return MapError(GetLastError());
+ NPT_Cardinal count = 0;
+ do {
+ if (NPT_File_ProcessFindData(&find_data)) {
+ // continue if we still have entries to skip
+ if (start > 0) {
+ --start;
+ continue;
+ }
+ entries.Add(NPT_WINRT_W2A(find_data.cFileName));
+
+ // stop when we have reached the maximum requested
+ if (max && ++count == max) return NPT_SUCCESS;
+ }
+ } while (FindNextFileW(find_handle, &find_data));
+ DWORD last_error = GetLastError();
+ FindClose(find_handle);
+ if (last_error != ERROR_NO_MORE_FILES) return MapError(last_error);
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtNetwork.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtNetwork.cpp
new file mode 100644
index 0000000..5b62d0a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtNetwork.cpp
@@ -0,0 +1,39 @@
+/*****************************************************************
+|
+| Neptune - Network :: WinRT Implementation
+|
+| (c) 2011-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptStreams.h"
+#include "NptThreads.h"
+#include "NptNetwork.h"
+#include "NptUtils.h"
+#include "NptConstants.h"
+#include "NptSockets.h"
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::GetNetworkInterfaces
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_IpAddress::ResolveName
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_IpAddress::ResolveName(const char* name, NPT_Timeout timeout)
+{
+ m_HostName = name;
+ return NPT_SUCCESS;
+} \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtPch.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtPch.cpp
new file mode 100644
index 0000000..0a77c70
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtPch.cpp
@@ -0,0 +1,13 @@
+/*****************************************************************
+|
+| Neptune - WinRT precompiled headers
+|
+| (c) 2002-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWinRtPch.h"
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtPch.h b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtPch.h
new file mode 100644
index 0000000..7319f9d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtPch.h
@@ -0,0 +1,20 @@
+/*****************************************************************
+|
+| Neptune - WinRT precompiled headers
+|
+| (c) 2002-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <windows.h>
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <strsafe.h>
+#include <ppltasks.h>
+
+#include "Neptune.h" \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtSockets.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtSockets.cpp
new file mode 100644
index 0000000..89ad573
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtSockets.cpp
@@ -0,0 +1,664 @@
+/*****************************************************************
+|
+| Neptune - Sockets :: WinRT Implementation
+|
+| (c) 2001-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWinRtPch.h"
+
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::Networking;
+using namespace Windows::Networking::Sockets;
+using namespace Windows::Storage::Streams;
+using namespace Concurrency;
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.sockets.winrt")
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const DWORD NPT_WINRT_SOCKET_DEFAULT_READ_TIMEOUT = 30000;
+const DWORD NPT_WINRT_SOCKET_DEFAULT_WRITE_TIMEOUT = 30000;
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket
++---------------------------------------------------------------------*/
+class NPT_WinRtTcpClientSocket : public NPT_SocketInterface
+{
+ public:
+ // constructors and destructor
+ NPT_WinRtTcpClientSocket();
+ virtual ~NPT_WinRtTcpClientSocket();
+
+ // NPT_SocketInterface methods
+ NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true);
+ NPT_Result Connect(const NPT_SocketAddress& address, NPT_Timeout timeout);
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream);
+ NPT_Result GetInfo(NPT_SocketInfo& info);
+ NPT_Result SetReadTimeout(NPT_Timeout timeout);
+ NPT_Result SetWriteTimeout(NPT_Timeout timeout);
+ NPT_Result Cancel(bool shutdown);
+
+protected:
+ StreamSocket^ m_Socket;
+ HostName^ m_RemoteHostName;
+ HANDLE m_WaitEvent;
+ NPT_Timeout m_ReadTimeout;
+ NPT_Timeout m_WriteTimeout;
+};
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketInputStream
++---------------------------------------------------------------------*/
+class NPT_WinRtSocketInputStream : public NPT_InputStream
+{
+public:
+ // constructors and destructor
+ NPT_WinRtSocketInputStream(StreamSocket^ socket, NPT_Timeout timeout);
+ virtual ~NPT_WinRtSocketInputStream();
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read);
+ NPT_Result Seek(NPT_Position offset);
+ NPT_Result Tell(NPT_Position& where);
+ NPT_Result GetSize(NPT_LargeSize& size);
+ NPT_Result GetAvailable(NPT_LargeSize& available);
+
+private:
+ StreamSocket^ m_Socket;
+ IInputStream^ m_InputStream;
+ DataReader^ m_Reader;
+ HANDLE m_WaitEvent;
+ NPT_Timeout m_Timeout;
+};
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketOutputStream
++---------------------------------------------------------------------*/
+class NPT_WinRtSocketOutputStream : public NPT_OutputStream
+{
+public:
+ // constructors and destructor
+ NPT_WinRtSocketOutputStream(StreamSocket^ socket, NPT_Timeout timeout);
+ virtual ~NPT_WinRtSocketOutputStream();
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written);
+ NPT_Result Seek(NPT_Position offset);
+ NPT_Result Tell(NPT_Position& where);
+ NPT_Result Flush();
+
+private:
+ StreamSocket^ m_Socket;
+ IOutputStream^ m_OutputStream;
+ DataWriter^ m_Writer;
+ HANDLE m_WaitEvent;
+ NPT_Timeout m_Timeout;
+};
+
+/*----------------------------------------------------------------------
+| StringFromUTF8
++---------------------------------------------------------------------*/
+static String^
+StringFromUTF8(const char* utf)
+{
+ unsigned int utf_len = NPT_StringLength(utf);
+ unsigned int wide_len = utf_len;
+ wchar_t* wide = new wchar_t[wide_len+1];
+ int result = MultiByteToWideChar(CP_UTF8,
+ 0,
+ utf,
+ utf_len+1,
+ wide,
+ wide_len+1);
+ String^ str;
+ if (result) {
+ str = ref new String(wide);
+ } else {
+ str = ref new String();
+ }
+ delete[] wide;
+ return str;
+}
+
+/*----------------------------------------------------------------------
+| TranslateHResult
++---------------------------------------------------------------------*/
+static NPT_Result
+TranslateHResult(HResult result)
+{
+ switch (HRESULT_FACILITY(result.Value)) {
+ case FACILITY_WIN32:
+ switch (HRESULT_CODE(result.Value)) {
+ case WSAHOST_NOT_FOUND:
+ return NPT_ERROR_HOST_UNKNOWN;
+
+ case WSAETIMEDOUT:
+ return NPT_ERROR_TIMEOUT;
+
+ case WSAECONNREFUSED:
+ return NPT_ERROR_CONNECTION_REFUSED;
+
+ case WSAEWOULDBLOCK:
+ return NPT_ERROR_WOULD_BLOCK;
+
+ case WSAECONNABORTED:
+ return NPT_ERROR_CONNECTION_ABORTED;
+
+ case WSAECONNRESET:
+ case WSAENETRESET:
+ return NPT_ERROR_CONNECTION_RESET;
+
+ case WSAEADDRINUSE:
+ return NPT_ERROR_ADDRESS_IN_USE;
+
+ case WSAENETDOWN:
+ return NPT_ERROR_NETWORK_DOWN;
+
+ case WSAENETUNREACH:
+ return NPT_ERROR_NETWORK_UNREACHABLE;
+
+ case WSAEINTR:
+ return NPT_ERROR_INTERRUPTED;
+
+ case WSAENOTCONN:
+ return NPT_ERROR_NOT_CONNECTED;
+
+ default:
+ return NPT_FAILURE;
+ }
+ break;
+
+ /* TODO: map error codes */
+ default:
+ return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| WaitForAsyncAction
++---------------------------------------------------------------------*/
+static NPT_Result
+WaitForAsyncAction(IAsyncAction^ action,
+ HANDLE wait_event,
+ DWORD timeout = INFINITE)
+{
+ NPT_Result result = NPT_ERROR_INTERNAL;
+
+ NPT_LOG_FINEST("waiting for async action...");
+ ResetEvent(wait_event);
+
+ action->Completed = ref new AsyncActionCompletedHandler
+ ([&](IAsyncAction^ action_, AsyncStatus status) {
+ switch (status) {
+ case AsyncStatus::Canceled:
+ result = NPT_ERROR_TIMEOUT;
+ break;
+
+ case AsyncStatus::Completed:
+ result = NPT_SUCCESS;
+ break;
+
+ case AsyncStatus::Error:
+ NPT_LOG_FINE_1("AsyncAction error %x", action_->ErrorCode.Value);
+ result = TranslateHResult(action_->ErrorCode);
+ break;
+
+ default:
+ result = NPT_ERROR_INTERNAL;
+ break;
+ }
+ SetEvent(wait_event);
+ });
+
+ DWORD wait_result = WaitForSingleObjectEx(wait_event, timeout, FALSE);
+ if (wait_result != WAIT_OBJECT_0) {
+ NPT_LOG_FINE("action timed out, canceling...");
+ action->Cancel();
+ WaitForSingleObjectEx(wait_event, INFINITE, FALSE);
+ }
+ NPT_LOG_FINEST("done waiting for async action");
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| WaitForAsyncOperation
++---------------------------------------------------------------------*/
+static NPT_Result
+WaitForAsyncOperation(IAsyncOperation<unsigned int>^ operation,
+ HANDLE wait_event,
+ unsigned int& return_value,
+ DWORD timeout = INFINITE)
+{
+ NPT_Result result = NPT_ERROR_INTERNAL;
+
+ NPT_LOG_FINEST("waiting for async operation...");
+ return_value = 0;
+ ResetEvent(wait_event);
+
+ operation->Completed = ref new AsyncOperationCompletedHandler<unsigned int>
+ ([&](IAsyncOperation<unsigned int>^ operation_, AsyncStatus status) {
+ switch (status) {
+ case AsyncStatus::Canceled:
+ result = NPT_ERROR_TIMEOUT;
+ break;
+
+ case AsyncStatus::Completed:
+ return_value = operation_->GetResults();
+ result = NPT_SUCCESS;
+ break;
+
+ case AsyncStatus::Error:
+ NPT_LOG_FINE_1("AsyncOperation error %x", operation_->ErrorCode.Value);
+ result = TranslateHResult(operation_->ErrorCode);
+ break;
+
+ default:
+ result = NPT_ERROR_INTERNAL;
+ break;
+ }
+ operation_->Close();
+ SetEvent(wait_event);
+ });
+
+ DWORD wait_result = WaitForSingleObjectEx(wait_event, timeout, FALSE);
+ if (wait_result != WAIT_OBJECT_0) {
+ NPT_LOG_FINE("operation timed out, canceling...");
+ operation->Cancel();
+ WaitForSingleObjectEx(wait_event, INFINITE, FALSE);
+ }
+ NPT_LOG_FINEST("done waiting for async operation");
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketInputStream::NPT_WinRtSocketInputStream
++---------------------------------------------------------------------*/
+NPT_WinRtSocketInputStream::NPT_WinRtSocketInputStream(StreamSocket^ socket,
+ NPT_Timeout timeout) :
+ m_Socket(socket),
+ m_Timeout(timeout)
+{
+ m_InputStream = socket->InputStream;
+ m_Reader = ref new DataReader(m_InputStream);
+ m_Reader->InputStreamOptions = InputStreamOptions::Partial;
+ m_WaitEvent = CreateEventExW(NULL, L"", 0, EVENT_ALL_ACCESS);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketInputStream::~NPT_WinRtSocketInputStream
++---------------------------------------------------------------------*/
+NPT_WinRtSocketInputStream::~NPT_WinRtSocketInputStream()
+{
+ m_Reader->DetachStream();
+ CloseHandle(m_WaitEvent);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketInputStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSocketInputStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ // init and shortcut
+ if (bytes_read) *bytes_read = 0;
+ if (bytes_to_read == 0) return NPT_SUCCESS;
+
+ NPT_LOG_FINER_1("reading %d bytes", bytes_to_read);
+ auto operation = m_Reader->LoadAsync(bytes_to_read);
+
+ unsigned int return_value = 0;
+ NPT_Result result = WaitForAsyncOperation(operation, m_WaitEvent, return_value, m_Timeout);
+
+ if (NPT_SUCCEEDED(result)) {
+ if (return_value) {
+ unsigned int bytes_available = m_Reader->UnconsumedBufferLength;
+ Array<unsigned char>^ bytes = ref new Array<unsigned char>(bytes_available);
+ m_Reader->ReadBytes(bytes);
+ NPT_CopyMemory(buffer, bytes->Data, bytes_available);
+ if (bytes_read) *bytes_read = bytes_available;
+ return NPT_SUCCESS;
+ } else {
+ return NPT_ERROR_EOS;
+ }
+ }
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketInputStream::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSocketInputStream::Seek(NPT_Position offset)
+{
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketInputStream::Tell
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSocketInputStream::Tell(NPT_Position& where)
+{
+ where = 0;
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketInputStream::GetSize
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSocketInputStream::GetSize(NPT_LargeSize& size)
+{
+ size = 0;
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketInputStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSocketInputStream::GetAvailable(NPT_LargeSize& available)
+{
+ available = 0;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketOutputStream::NPT_WinRtSocketOutputStream
++---------------------------------------------------------------------*/
+NPT_WinRtSocketOutputStream::NPT_WinRtSocketOutputStream(StreamSocket^ socket,
+ NPT_Timeout timeout) :
+ m_Socket(socket),
+ m_Timeout(timeout)
+{
+ m_OutputStream = socket->OutputStream;
+ m_Writer = ref new DataWriter(m_OutputStream);
+ m_WaitEvent = CreateEventExW(NULL, L"", 0, EVENT_ALL_ACCESS);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketOutputStream::~NPT_WinRtSocketOutputStream
++---------------------------------------------------------------------*/
+NPT_WinRtSocketOutputStream::~NPT_WinRtSocketOutputStream()
+{
+ m_Writer->DetachStream();
+ CloseHandle(m_WaitEvent);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketOutputStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSocketOutputStream::Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written)
+{
+ NPT_LOG_FINER_1("writing %d bytes", bytes_to_write);
+
+ Array<unsigned char>^ bytes = ref new Array<unsigned char>(bytes_to_write);
+ NPT_CopyMemory(bytes->Data, buffer, bytes_to_write);
+ m_Writer->WriteBytes(bytes);
+ auto operation = m_Writer->StoreAsync();
+ unsigned int return_value = 0;
+
+ NPT_Result result = WaitForAsyncOperation(operation, m_WaitEvent, return_value, m_Timeout);
+ if (bytes_written) *bytes_written = return_value;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketOutputStream::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSocketOutputStream::Seek(NPT_Position offset)
+{
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketOutputStream::Tell
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSocketOutputStream::Tell(NPT_Position& where)
+{
+ where = 0;
+ return NPT_ERROR_NOT_SUPPORTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSocketOutputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSocketOutputStream::Flush()
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::NPT_WinRtTcpClientSocket
++---------------------------------------------------------------------*/
+NPT_WinRtTcpClientSocket::NPT_WinRtTcpClientSocket() :
+ m_ReadTimeout(NPT_WINRT_SOCKET_DEFAULT_READ_TIMEOUT),
+ m_WriteTimeout(NPT_WINRT_SOCKET_DEFAULT_WRITE_TIMEOUT)
+{
+ m_Socket = ref new StreamSocket();
+ m_WaitEvent = CreateEventExW(NULL, L"", 0, EVENT_ALL_ACCESS);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::NPT_WinRtTcpClientSocket
++---------------------------------------------------------------------*/
+NPT_WinRtTcpClientSocket::~NPT_WinRtTcpClientSocket()
+{
+ CloseHandle(m_WaitEvent);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::Bind
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtTcpClientSocket::Bind(const NPT_SocketAddress& address, bool reuse_address)
+{
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::Connect
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtTcpClientSocket::Connect(const NPT_SocketAddress& address, NPT_Timeout timeout)
+{
+ try {
+ NPT_LOG_FINE_1("connecting to %s", address.GetIpAddress().m_HostName.GetChars());
+
+ m_RemoteHostName = ref new HostName(StringFromUTF8(address.GetIpAddress().m_HostName.GetChars()));
+ String^ remote_service = ref new String();
+ NPT_String port = NPT_String::FromIntegerU(address.GetPort());
+ IAsyncAction^ connection = m_Socket->ConnectAsync(m_RemoteHostName, StringFromUTF8(port.GetChars()));
+
+ // wait for the connection to be established
+ NPT_Result result = WaitForAsyncAction(connection, m_WaitEvent, timeout);
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE_1("connection failed (%d)", result);
+ } else {
+ NPT_LOG_FINE("connected");
+ }
+ return result;
+ } catch (Exception^ e) {
+ NPT_LOG_FINE("exception caught");
+ return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtTcpClientSocket::GetInputStream(NPT_InputStreamReference& stream)
+{
+ stream = new NPT_WinRtSocketInputStream(m_Socket, m_ReadTimeout);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::GetOutputStream
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtTcpClientSocket::GetOutputStream(NPT_OutputStreamReference& stream)
+{
+ stream = new NPT_WinRtSocketOutputStream(m_Socket, m_WriteTimeout);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtTcpClientSocket::GetInfo(NPT_SocketInfo& info)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::SetReadTimeout
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtTcpClientSocket::SetReadTimeout(NPT_Timeout timeout)
+{
+ m_ReadTimeout = timeout;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::SetWriteTimeout
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtTcpClientSocket::SetWriteTimeout(NPT_Timeout timeout)
+{
+ m_WriteTimeout = timeout;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtTcpClientSocket::Cancel
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtTcpClientSocket::Cancel(bool shutdown)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Socket::~NPT_Socket
++---------------------------------------------------------------------*/
+NPT_Socket::~NPT_Socket()
+{
+ delete m_SocketDelegate;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UdpSocket::NPT_UdpSocket
++---------------------------------------------------------------------*/
+NPT_UdpSocket::NPT_UdpSocket(NPT_Flags flags)
+{
+ m_SocketDelegate = NULL;
+ m_UdpSocketDelegate = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UdpSocket::NPT_UdpSocket
++---------------------------------------------------------------------*/
+NPT_UdpSocket::NPT_UdpSocket(NPT_UdpSocketInterface* delegate) :
+ m_UdpSocketDelegate(delegate)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_UdpSocket::~NPT_UdpSocket
++---------------------------------------------------------------------*/
+NPT_UdpSocket::~NPT_UdpSocket()
+{
+ m_UdpSocketDelegate = NULL;
+ m_SocketDelegate = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UdpMulticastSocket::NPT_UdpMulticastSocket
++---------------------------------------------------------------------*/
+NPT_UdpMulticastSocket::NPT_UdpMulticastSocket(NPT_Flags flags) :
+ NPT_UdpSocket((NPT_UdpSocketInterface*)0)
+{
+ m_SocketDelegate = NULL;
+ m_UdpSocketDelegate = NULL;
+ m_UdpMulticastSocketDelegate = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_UdpMulticastSocket::~NPT_UdpMulticastSocket
++---------------------------------------------------------------------*/
+NPT_UdpMulticastSocket::~NPT_UdpMulticastSocket()
+{
+ m_SocketDelegate = NULL;
+ m_UdpSocketDelegate = NULL;
+ m_UdpMulticastSocketDelegate = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TcpClientSocket::NPT_TcpClientSocket
++---------------------------------------------------------------------*/
+NPT_TcpClientSocket::NPT_TcpClientSocket(NPT_Flags flags) :
+ NPT_Socket(NULL)
+{
+ m_SocketDelegate = new NPT_WinRtTcpClientSocket();
+}
+
+/*----------------------------------------------------------------------
+| NPT_TcpClientSocket::NPT_TcpClientSocket
++---------------------------------------------------------------------*/
+NPT_TcpClientSocket::~NPT_TcpClientSocket()
+{
+ delete m_SocketDelegate;
+
+ m_SocketDelegate = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TcpServerSocket::NPT_TcpServerSocket
++---------------------------------------------------------------------*/
+NPT_TcpServerSocket::NPT_TcpServerSocket(NPT_Flags flags)
+{
+ m_SocketDelegate = NULL;
+ m_TcpServerSocketDelegate = NULL;
+}
+
+/*----------------------------------------------------------------------
+| NPT_TcpServerSocket::NPT_TcpServerSocket
++---------------------------------------------------------------------*/
+NPT_TcpServerSocket::~NPT_TcpServerSocket()
+{
+ m_SocketDelegate = NULL;
+ m_TcpServerSocketDelegate = NULL;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtSystem.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtSystem.cpp
new file mode 100644
index 0000000..195768f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtSystem.cpp
@@ -0,0 +1,115 @@
+/*****************************************************************
+|
+| Neptune - System :: WinRT Implementation
+|
+| (c) 2001-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWinRtPch.h"
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptSystem.h"
+#include "NptResults.h"
+#include "NptDebug.h"
+
+using namespace Windows::Security::Cryptography;
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSystemInitializer
++---------------------------------------------------------------------*/
+class NPT_WinRtSystem {
+public:
+ static NPT_WinRtSystem Global;
+ ~NPT_WinRtSystem() {
+ CloseHandle(m_WaitEvent);
+ }
+ HANDLE m_WaitEvent;
+
+private:
+ NPT_WinRtSystem() {
+ m_WaitEvent = CreateEventExW(NULL, L"", 0, EVENT_ALL_ACCESS);
+ }
+};
+NPT_WinRtSystem NPT_WinRtSystem::Global;
+
+/*----------------------------------------------------------------------
+| NPT_System::GetProcessId
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetProcessId(NPT_UInt32& id)
+{
+ id = GetCurrentProcessId();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::GetCurrentTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::GetCurrentTimeStamp(NPT_TimeStamp& now)
+{
+ FILETIME time;
+ GetSystemTimeAsFileTime(&time);
+ ULARGE_INTEGER ltime;
+ ltime.LowPart = time.dwLowDateTime;
+ ltime.HighPart = time.dwHighDateTime;
+
+ /* convert to 64-bits 100-nanoseconds value */
+ ULONGLONG time64 = ltime.QuadPart;
+ time64 -= 116444736000000000; /* convert from the Windows epoch (Jan. 1, 1601) to the
+ * Unix epoch (Jan. 1, 1970) */
+ now.FromNanos(time64*100);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::Sleep
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::Sleep(const NPT_TimeInterval& duration)
+{
+ DWORD timeout = (DWORD)duration.ToMillis();
+ WaitForSingleObjectEx(NPT_WinRtSystem::Global.m_WaitEvent, timeout, FALSE);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SleepUntil
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SleepUntil(const NPT_TimeStamp& when)
+{
+ NPT_TimeStamp now;
+ GetCurrentTimeStamp(now);
+ if (when > now) {
+ NPT_TimeInterval duration = when-now;
+ return Sleep(duration);
+ } else {
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::SetRandomSeed
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_System::SetRandomSeed(unsigned int seed)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_System::NPT_System
++---------------------------------------------------------------------*/
+NPT_UInt32
+NPT_System::GetRandomInteger()
+{
+ return CryptographicBuffer::GenerateRandomNumber();
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtThreads.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtThreads.cpp
new file mode 100644
index 0000000..0348718
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtThreads.cpp
@@ -0,0 +1,712 @@
+/*****************************************************************
+|
+| Neptune - Threads :: WinRT Implementation
+|
+| (c) 2001-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWinRtPch.h"
+
+using namespace Platform;
+using namespace Windows::System::Threading;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Concurrency;
+
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptThreads.h"
+#include "NptDebug.h"
+#include "NptResults.h"
+#include "NptWinRtThreads.h"
+#include "NptTime.h"
+#include "NptSystem.h"
+#include "NptLogging.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("neptune.threads.winrt")
+
+/*----------------------------------------------------------------------
+| NPT_WinRtMutex::NPT_WinRtMutex
++---------------------------------------------------------------------*/
+NPT_WinRtMutex::NPT_WinRtMutex()
+{
+ m_Handle = CreateMutexExW(NULL, L"", FALSE, MUTEX_ALL_ACCESS);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtMutex::~NPT_WinRtMutex
++---------------------------------------------------------------------*/
+NPT_WinRtMutex::~NPT_WinRtMutex()
+{
+ CloseHandle(m_Handle);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtMutex::Lock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtMutex::Lock()
+{
+ DWORD result = WaitForSingleObjectEx(m_Handle, INFINITE, FALSE);
+ if (result == WAIT_OBJECT_0) {
+ return NPT_SUCCESS;
+ } else {
+ return NPT_FAILURE;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtMutex::Unlock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtMutex::Unlock()
+{
+ ReleaseMutex(m_Handle);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_Mutex::NPT_Mutex
++---------------------------------------------------------------------*/
+NPT_Mutex::NPT_Mutex()
+{
+ m_Delegate = new NPT_WinRtMutex();
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtCriticalSection::NPT_WinRtCriticalSection
++---------------------------------------------------------------------*/
+NPT_WinRtCriticalSection::NPT_WinRtCriticalSection()
+{
+ InitializeCriticalSectionEx(&m_CriticalSection, 0, 0);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtCriticalSection::~NPT_WinRtCriticalSection
++---------------------------------------------------------------------*/
+NPT_WinRtCriticalSection::~NPT_WinRtCriticalSection()
+{
+ DeleteCriticalSection(&m_CriticalSection);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtCriticalSection::Lock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtCriticalSection::Lock()
+{
+ EnterCriticalSection(&m_CriticalSection);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtCriticalSection::Unlock
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtCriticalSection::Unlock()
+{
+ LeaveCriticalSection(&m_CriticalSection);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtEvent::NPT_WinRtEvent
++---------------------------------------------------------------------*/
+NPT_WinRtEvent::NPT_WinRtEvent(bool manual /* = false */, bool initial /* = false */)
+{
+ DWORD flags = 0;
+ if (manual) flags |= CREATE_EVENT_MANUAL_RESET;
+ if (initial) flags |= CREATE_EVENT_INITIAL_SET;
+ m_Event = CreateEventExW(NULL, L"", flags, EVENT_ALL_ACCESS);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtEvent::~NPT_WinRtEvent
++---------------------------------------------------------------------*/
+NPT_WinRtEvent::~NPT_WinRtEvent()
+{
+ CloseHandle(m_Event);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtEvent::Wait
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtEvent::Wait(NPT_Timeout timeout)
+{
+ if (m_Event) {
+ DWORD result = WaitForSingleObjectEx(m_Event, timeout==NPT_TIMEOUT_INFINITE?INFINITE:timeout, FALSE);
+ if (result == WAIT_TIMEOUT) {
+ return NPT_ERROR_TIMEOUT;
+ }
+ if (result != WAIT_OBJECT_0 && result != WAIT_ABANDONED) {
+ return NPT_FAILURE;
+ }
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtEvent::Signal
++---------------------------------------------------------------------*/
+void
+NPT_WinRtEvent::Signal()
+{
+ SetEvent(m_Event);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtEvent::Reset
++---------------------------------------------------------------------*/
+void
+NPT_WinRtEvent::Reset()
+{
+ ResetEvent(m_Event);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable
++---------------------------------------------------------------------*/
+class NPT_WinRtSharedVariable : public NPT_SharedVariableInterface
+{
+public:
+ // methods
+ NPT_WinRtSharedVariable(int value);
+ ~NPT_WinRtSharedVariable();
+ void SetValue(int value);
+ int GetValue();
+ NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout);
+ NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout);
+
+ private:
+ // members
+ volatile int m_Value;
+ CRITICAL_SECTION m_Mutex;
+ CONDITION_VARIABLE m_Condition;
+};
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::NPT_WinRtSharedVariable
++---------------------------------------------------------------------*/
+NPT_WinRtSharedVariable::NPT_WinRtSharedVariable(int value) :
+ m_Value(value)
+{
+ InitializeCriticalSectionEx(&m_Mutex, 0, 0);
+ InitializeConditionVariable(&m_Condition);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::~NPT_WinRtSharedVariable
++---------------------------------------------------------------------*/
+NPT_WinRtSharedVariable::~NPT_WinRtSharedVariable()
+{
+ DeleteCriticalSection(&m_Mutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::SetValue
++---------------------------------------------------------------------*/
+void
+NPT_WinRtSharedVariable::SetValue(int value)
+{
+ EnterCriticalSection(&m_Mutex);
+ m_Value = value;
+ WakeAllConditionVariable(&m_Condition);
+ LeaveCriticalSection(&m_Mutex);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::GetValue
++---------------------------------------------------------------------*/
+int
+NPT_WinRtSharedVariable::GetValue()
+{
+ // we assume that int read/write are atomic on the platform
+ return m_Value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::WaitUntilEquals
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSharedVariable::WaitUntilEquals(int value, NPT_Timeout timeout)
+{
+ NPT_Result result = NPT_SUCCESS;
+
+ EnterCriticalSection(&m_Mutex);
+ while (value != m_Value) {
+ if (!SleepConditionVariableCS(&m_Condition, &m_Mutex, timeout==NPT_TIMEOUT_INFINITE?INFINITE:timeout)) {
+ DWORD error = GetLastError();
+ if (error == ERROR_TIMEOUT) {
+ result = NPT_ERROR_TIMEOUT;
+ } else {
+ result = NPT_FAILURE;
+ }
+ }
+ }
+ LeaveCriticalSection(&m_Mutex);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::WaitWhileEquals
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSharedVariable::WaitWhileEquals(int value, NPT_Timeout timeout)
+{
+ NPT_Result result = NPT_SUCCESS;
+
+ EnterCriticalSection(&m_Mutex);
+ while (value == m_Value) {
+ if (!SleepConditionVariableCS(&m_Condition, &m_Mutex, timeout==NPT_TIMEOUT_INFINITE?INFINITE:timeout)) {
+ DWORD error = GetLastError();
+ if (error == ERROR_TIMEOUT) {
+ result = NPT_ERROR_TIMEOUT;
+ } else {
+ result = NPT_FAILURE;
+ }
+ }
+ }
+ LeaveCriticalSection(&m_Mutex);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SharedVariable::NPT_SharedVariable
++---------------------------------------------------------------------*/
+NPT_SharedVariable::NPT_SharedVariable(int value)
+{
+ m_Delegate = new NPT_WinRtSharedVariable(value);
+}
+
+#if 0
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable
++---------------------------------------------------------------------*/
+class NPT_WinRtSharedVariable : public NPT_SharedVariableInterface
+{
+ public:
+ // methods
+ NPT_WinRtSharedVariable(int value);
+ ~NPT_WinRtSharedVariable();
+ void SetValue(int value);
+ int GetValue();
+ NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+ NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+
+ private:
+ // members
+ volatile int m_Value;
+ NPT_Mutex m_Lock;
+ NPT_WinRtEvent m_Event;
+};
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::NPT_WinRtSharedVariable
++---------------------------------------------------------------------*/
+NPT_WinRtSharedVariable::NPT_WinRtSharedVariable(int value) :
+ m_Value(value)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::~NPT_WinRtSharedVariable
++---------------------------------------------------------------------*/
+NPT_WinRtSharedVariable::~NPT_WinRtSharedVariable()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::SetValue
++---------------------------------------------------------------------*/
+void
+NPT_WinRtSharedVariable::SetValue(int value)
+{
+ m_Lock.Lock();
+ if (value != m_Value) {
+ m_Value = value;
+ m_Event.Signal();
+ }
+ m_Lock.Unlock();
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::GetValue
++---------------------------------------------------------------------*/
+int
+NPT_WinRtSharedVariable::GetValue()
+{
+ // reading an integer should be atomic on all WinRt platforms
+ return m_Value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::WaitUntilEquals
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSharedVariable::WaitUntilEquals(int value, NPT_Timeout timeout)
+{
+ do {
+ m_Lock.Lock();
+ if (m_Value == value) {
+ break;
+ }
+ m_Lock.Unlock();
+ {
+ NPT_Result result = m_Event.Wait(timeout);
+ if (NPT_FAILED(result)) return result;
+ }
+ } while (1);
+
+ m_Lock.Unlock();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtSharedVariable::WaitWhileEquals
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtSharedVariable::WaitWhileEquals(int value, NPT_Timeout timeout)
+{
+ do {
+ m_Lock.Lock();
+ if (m_Value != value) {
+ break;
+ }
+ m_Lock.Unlock();
+ {
+ NPT_Result result = m_Event.Wait(timeout);
+ if (NPT_FAILED(result)) return result;
+ }
+ } while (1);
+
+ m_Lock.Unlock();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_SharedVariable::NPT_SharedVariable
++---------------------------------------------------------------------*/
+NPT_SharedVariable::NPT_SharedVariable(int value)
+{
+ m_Delegate = new NPT_WinRtSharedVariable(value);
+}
+#endif
+
+/*----------------------------------------------------------------------
+| NPT_WinRtAtomicVariable
++---------------------------------------------------------------------*/
+class NPT_WinRtAtomicVariable : public NPT_AtomicVariableInterface
+{
+ public:
+ // methods
+ NPT_WinRtAtomicVariable(int value);
+ ~NPT_WinRtAtomicVariable();
+ int Increment();
+ int Decrement();
+ void SetValue(int value);
+ int GetValue();
+
+ private:
+ // members
+ volatile LONG m_Value;
+};
+
+/*----------------------------------------------------------------------
+| NPT_WinRtAtomicVariable::NPT_WinRtAtomicVariable
++---------------------------------------------------------------------*/
+NPT_WinRtAtomicVariable::NPT_WinRtAtomicVariable(int value) :
+ m_Value(value)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtAtomicVariable::~NPT_WinRtAtomicVariable
++---------------------------------------------------------------------*/
+NPT_WinRtAtomicVariable::~NPT_WinRtAtomicVariable()
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtAtomicVariable::Increment
++---------------------------------------------------------------------*/
+int
+NPT_WinRtAtomicVariable::Increment()
+{
+ return InterlockedIncrement(const_cast<LONG*>(&m_Value));
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtAtomicVariable::Decrement
++---------------------------------------------------------------------*/
+int
+NPT_WinRtAtomicVariable::Decrement()
+{
+ return InterlockedDecrement(const_cast<LONG*>(&m_Value));
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtAtomicVariable::SetValue
++---------------------------------------------------------------------*/
+void
+NPT_WinRtAtomicVariable::SetValue(int value)
+{
+ m_Value = value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtAtomicVariable::GetValue
++---------------------------------------------------------------------*/
+int
+NPT_WinRtAtomicVariable::GetValue()
+{
+ return m_Value;
+}
+
+/*----------------------------------------------------------------------
+| NPT_AtomicVariable::NPT_AtomicVariable
++---------------------------------------------------------------------*/
+NPT_AtomicVariable::NPT_AtomicVariable(int value)
+{
+ m_Delegate = new NPT_WinRtAtomicVariable(value);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtThread
++---------------------------------------------------------------------*/
+class NPT_WinRtThread : public NPT_ThreadInterface
+{
+ public:
+ // class methods
+ static NPT_Result SetThreadPriority(HANDLE thread, int priority);
+
+ // methods
+ NPT_WinRtThread(NPT_Thread* delegator,
+ NPT_Runnable& target,
+ bool detached);
+ ~NPT_WinRtThread();
+ NPT_Result Start();
+ NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+ NPT_Result SetPriority(int priority);
+
+ private:
+ // methods
+ static unsigned int __stdcall EntryPoint(void* argument);
+
+ // NPT_Runnable methods
+ void Run();
+
+ // NPT_Interruptible methods
+ NPT_Result Interrupt() { return NPT_ERROR_NOT_IMPLEMENTED; }
+
+ // members
+ NPT_Thread* m_Delegator;
+ NPT_Runnable& m_Target;
+ bool m_Detached;
+ HANDLE m_ThreadHandle;
+};
+
+/*----------------------------------------------------------------------
+| NPT_WinRtThread::NPT_WinRtThread
++---------------------------------------------------------------------*/
+NPT_WinRtThread::NPT_WinRtThread(NPT_Thread* delegator,
+ NPT_Runnable& target,
+ bool detached) :
+ m_Delegator(delegator),
+ m_Target(target),
+ m_Detached(detached),
+ m_ThreadHandle(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtThread::~NPT_WinRtThread
++---------------------------------------------------------------------*/
+NPT_WinRtThread::~NPT_WinRtThread()
+{
+ if (!m_Detached) {
+ // we're not detached, and not in the Run() method, so we need to
+ // wait until the thread is done
+ Wait();
+ }
+
+ // close the thread handle
+ if (m_ThreadHandle) {
+ CloseHandle(m_ThreadHandle);
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtThread::SetThreadPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtThread::SetThreadPriority(HANDLE thread, int priority)
+{
+ int WinRt_priority;
+ if (priority < NPT_THREAD_PRIORITY_LOWEST) {
+ WinRt_priority = THREAD_PRIORITY_IDLE;
+ } else if (priority < NPT_THREAD_PRIORITY_BELOW_NORMAL) {
+ WinRt_priority = THREAD_PRIORITY_LOWEST;
+ } else if (priority < NPT_THREAD_PRIORITY_NORMAL) {
+ WinRt_priority = THREAD_PRIORITY_BELOW_NORMAL;
+ } else if (priority < NPT_THREAD_PRIORITY_ABOVE_NORMAL) {
+ WinRt_priority = THREAD_PRIORITY_NORMAL;
+ } else if (priority < NPT_THREAD_PRIORITY_HIGHEST) {
+ WinRt_priority = THREAD_PRIORITY_ABOVE_NORMAL;
+ } else if (priority < NPT_THREAD_PRIORITY_TIME_CRITICAL) {
+ WinRt_priority = THREAD_PRIORITY_HIGHEST;
+ } else {
+ WinRt_priority = THREAD_PRIORITY_TIME_CRITICAL;
+ }
+#if 0
+ BOOL result = ::SetThreadPriority(thread, WinRt_priority);
+ if (!result) {
+ NPT_LOG_WARNING_1("SetThreadPriority failed (%x)", GetLastError());
+ return NPT_FAILURE;
+ }
+#endif
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtThread::Start
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtThread::Start()
+{
+ if (m_ThreadHandle > 0) {
+ // failed
+ NPT_LOG_WARNING("thread already started !");
+ return NPT_ERROR_INVALID_STATE;
+ }
+
+ NPT_LOG_FINER("creating thread");
+
+ // create a stack local variable 'detached', as this object
+ // may already be deleted when the thread creation returns and
+ // before we get to call detach on the given thread
+ bool detached = m_Detached;
+
+ HANDLE thread_handle = CreateEventExW(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
+
+ auto handler = ref new WorkItemHandler([=](IAsyncAction^)
+ {
+ // run the thread routine
+ NPT_LOG_FINE("+++ thread routine start +++");
+ try {
+ Run();
+ } catch(...) {
+ NPT_LOG_FINE("*** exception caught during thread routine ***");
+ }
+ NPT_LOG_FINE("--- thread routine done +++");
+
+ // signal that we're done
+ SetEvent(thread_handle);
+
+ // if the thread is detached, delete it
+ if (detached) {
+ delete m_Delegator;
+ CloseHandle(thread_handle);
+ }
+ });
+
+ // remember the handle unless we're detached
+ if (!detached) {
+ m_ThreadHandle = thread_handle;
+ }
+
+ // run the thread
+ ThreadPool::RunAsync(handler, WorkItemPriority::Normal, WorkItemOptions::TimeSliced);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtThread::Run
++---------------------------------------------------------------------*/
+void
+NPT_WinRtThread::Run()
+{
+ m_Target.Run();
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtThread::SetPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtThread::SetPriority(int priority)
+{
+ if (m_ThreadHandle == 0) return NPT_ERROR_INVALID_STATE;
+ return NPT_WinRtThread::SetThreadPriority(m_ThreadHandle, priority);
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtThread::Wait
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_WinRtThread::Wait(NPT_Timeout timeout /* = NPT_TIMEOUT_INFINITE */)
+{
+ // check that we're not detached
+ if (m_ThreadHandle == 0 || m_Detached) {
+ return NPT_FAILURE;
+ }
+
+ // wait for the thread to finish
+ // Logging here will cause a crash on exit because LogManager may already be destroyed
+ DWORD result = WaitForSingleObjectEx(m_ThreadHandle,
+ timeout==NPT_TIMEOUT_INFINITE?INFINITE:timeout,
+ FALSE);
+ if (result != WAIT_OBJECT_0) {
+ return NPT_ERROR_TIMEOUT;
+ } else {
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::GetCurrentThreadId
++---------------------------------------------------------------------*/
+NPT_Thread::ThreadId
+NPT_Thread::GetCurrentThreadId()
+{
+ return ::GetCurrentThreadId();
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::SetCurrentThreadPriority
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_Thread::SetCurrentThreadPriority(int priority)
+{
+ return NPT_WinRtThread::SetThreadPriority(::GetCurrentThread(), priority);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::NPT_Thread
++---------------------------------------------------------------------*/
+NPT_Thread::NPT_Thread(bool detached)
+{
+ m_Delegate = new NPT_WinRtThread(this, *this, detached);
+}
+
+/*----------------------------------------------------------------------
+| NPT_Thread::NPT_Thread
++---------------------------------------------------------------------*/
+NPT_Thread::NPT_Thread(NPT_Runnable& target, bool detached)
+{
+ m_Delegate = new NPT_WinRtThread(this, target, detached);
+}
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtThreads.h b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtThreads.h
new file mode 100644
index 0000000..e38609d
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtThreads.h
@@ -0,0 +1,73 @@
+/*****************************************************************
+|
+| Neptune - Threads :: WinRT Implementation
+|
+| (c) 2001-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptTypes.h"
+#include "NptThreads.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| NPT_WinRtMutex
++---------------------------------------------------------------------*/
+class NPT_WinRtMutex : public NPT_MutexInterface
+{
+public:
+ // methods
+ NPT_WinRtMutex();
+ virtual ~NPT_WinRtMutex();
+
+ // NPT_Mutex methods
+ virtual NPT_Result Lock();
+ virtual NPT_Result Unlock();
+
+private:
+ // members
+ HANDLE m_Handle;
+};
+
+/*----------------------------------------------------------------------
+| NPT_WinRtEvent
++---------------------------------------------------------------------*/
+class NPT_WinRtEvent
+{
+public:
+ // methods
+ NPT_WinRtEvent(bool manual = false, bool initial = false);
+ virtual ~NPT_WinRtEvent();
+
+ virtual NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+ virtual void Signal();
+ virtual void Reset();
+
+private:
+ // members
+ HANDLE m_Event;
+};
+
+/*----------------------------------------------------------------------
+| NPT_WinRtCriticalSection
++---------------------------------------------------------------------*/
+class NPT_WinRtCriticalSection
+{
+public:
+ // methods
+ NPT_WinRtCriticalSection();
+ ~NPT_WinRtCriticalSection();
+
+ // NPT_Mutex methods
+ NPT_Result Lock();
+ NPT_Result Unlock();
+
+private:
+ // members
+ CRITICAL_SECTION m_CriticalSection;
+};
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtTime.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtTime.cpp
new file mode 100644
index 0000000..aad8eec
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtTime.cpp
@@ -0,0 +1,33 @@
+/*****************************************************************
+|
+| Neptune - Time: WinRT Implementation
+|
+| (c) 2002-2013 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWinRtPch.h"
+
+#include "NptTime.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+//NPT_SET_LOCAL_LOGGER("neptune.system.win32.time")
+
+/*----------------------------------------------------------------------
+| NPT_DateTime::GetTimeZone
++---------------------------------------------------------------------*/
+NPT_Int32
+NPT_DateTime::GetLocalTimeZone()
+{
+ TIME_ZONE_INFORMATION tz_info;
+ DWORD result = GetTimeZoneInformation(&tz_info);
+ if (result == TIME_ZONE_ID_INVALID) return 0;
+ return -tz_info.Bias;
+}
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtUtils.cpp b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtUtils.cpp
new file mode 100644
index 0000000..714e7fc
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtUtils.cpp
@@ -0,0 +1,73 @@
+/*****************************************************************
+|
+| Neptune - WinRT Utilities
+|
+| (c) 2001-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptWinRtPch.h"
+#include "NptWinRtUtils.h"
+
+/*----------------------------------------------------------------------
+| NPT_WinRtUtils::A2WHelper
++---------------------------------------------------------------------*/
+LPWSTR
+NPT_WinRtUtils::A2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars, UINT acp)
+{
+ int ret;
+
+ assert(lpa != NULL);
+ assert(lpw != NULL);
+ if (lpw == NULL || lpa == NULL) return NULL;
+
+ lpw[0] = '\0';
+ ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
+ if (ret == 0) {
+ assert(0);
+ return NULL;
+ }
+ return lpw;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtUtils::W2AHelper
++---------------------------------------------------------------------*/
+LPSTR
+NPT_WinRtUtils::W2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars, UINT acp)
+{
+ int ret;
+
+ assert(lpa != NULL);
+ assert(lpw != NULL);
+ if (lpa == NULL || lpw == NULL) return NULL;
+
+ lpa[0] = '\0';
+ ret = WideCharToMultiByte(acp, 0, lpw, -1, lpa, nChars, NULL, NULL);
+ if (ret == 0) {
+ int error = GetLastError();
+ assert(error);
+ return NULL;
+ }
+ return lpa;
+}
+
+/*----------------------------------------------------------------------
+| NPT_WinRtUtils::LStrLenW
++---------------------------------------------------------------------*/
+size_t
+NPT_WinRtUtils::LStrLenW(STRSAFE_LPCWSTR lpw)
+{
+ size_t len = 0;
+ HRESULT result = StringCchLengthW(lpw, STRSAFE_MAX_CCH, &len);
+ if (S_OK == result) {
+ return len;
+ } else {
+ return INT_MAX;
+ }
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtUtils.h b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtUtils.h
new file mode 100644
index 0000000..568669c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/WinRT/NptWinRtUtils.h
@@ -0,0 +1,39 @@
+/*****************************************************************
+|
+| Neptune - WinRT Utilities
+|
+| (c) 2001-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+ | NPT_WinRtUtils
+ +---------------------------------------------------------------------*/
+class NPT_WinRtUtils {
+public:
+ // unicode/ascii conversion
+ static LPWSTR A2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars, UINT acp);
+ static LPSTR W2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars, UINT acp);
+ static size_t LStrLenW(STRSAFE_LPCWSTR lpw);
+};
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+/* UNICODE support */
+#define NPT_WINRT_USE_CHAR_CONVERSION int _convert = 0; LPCWSTR _lpw = NULL; LPCSTR _lpa = NULL
+
+#define NPT_WINRT_A2W(lpa) (\
+ ((_lpa = lpa) == NULL) ? NULL : (\
+ _convert = (int)(strlen(_lpa)+1),\
+ (INT_MAX/2<_convert)? NULL : \
+ NPT_WinRtUtils::A2WHelper((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, CP_UTF8)))
+
+/* +2 instead of +1 temporary fix for Chinese characters */
+#define NPT_WINRT_W2A(lpw) (\
+ ((_lpw = lpw) == NULL) ? NULL : (\
+ (_convert = (NPT_WinRtUtils::LStrLenW(_lpw)+2), \
+ (_convert>INT_MAX/2) ? NULL : \
+ NPT_WinRtUtils::W2AHelper((LPSTR) alloca(_convert*sizeof(WCHAR)), _lpw, _convert*sizeof(WCHAR), CP_UTF8))))
+
diff --git a/lib/libUPnP/Neptune/Source/System/Xbox/NptXboxNetwork.cpp b/lib/libUPnP/Neptune/Source/System/Xbox/NptXboxNetwork.cpp
new file mode 100644
index 0000000..5f748a6
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Xbox/NptXboxNetwork.cpp
@@ -0,0 +1,97 @@
+/*****************************************************************
+|
+| Neptune - Network :: Xbox Winsock Implementation
+|
+| (c) 2001-2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <xtl.h>
+#include <winsockx.h>
+
+#include "NptNetwork.h"
+#include "NptXboxNetwork.h"
+
+/*----------------------------------------------------------------------
+| static initializer
++---------------------------------------------------------------------*/
+NPT_WinsockSystem::NPT_WinsockSystem() {
+ XNetStartupParams xnsp;
+ memset(&xnsp, 0, sizeof(xnsp));
+ xnsp.cfgSizeOfStruct = sizeof(XNetStartupParams);
+ xnsp.cfgFlags = XNET_STARTUP_BYPASS_SECURITY;
+
+ // create more memory for networking
+ xnsp.cfgPrivatePoolSizeInPages = 64; // == 256kb, default = 12 (48kb)
+ xnsp.cfgEnetReceiveQueueLength = 16; // == 32kb, default = 8 (16kb)
+ xnsp.cfgIpFragMaxSimultaneous = 16; // default = 4
+ xnsp.cfgIpFragMaxPacketDiv256 = 32; // == 8kb, default = 8 (2kb)
+ xnsp.cfgSockMaxSockets = 64; // default = 64
+ xnsp.cfgSockDefaultRecvBufsizeInK = 128; // default = 16
+ xnsp.cfgSockDefaultSendBufsizeInK = 128; // default = 16
+
+ INT err = XNetStartup(&xnsp);
+
+ WORD wVersionRequested;
+ WSADATA wsaData;
+ wVersionRequested = MAKEWORD(2, 2);
+ WSAStartup( wVersionRequested, &wsaData );
+}
+NPT_WinsockSystem::~NPT_WinsockSystem() {
+ WSACleanup();
+ XNetCleanup();
+}
+NPT_WinsockSystem NPT_WinsockSystem::Initializer;
+
+/*----------------------------------------------------------------------
+| NPT_NetworkInterface::GetNetworkInterfaces
++---------------------------------------------------------------------*/
+NPT_Result
+NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces)
+{
+ XNADDR xna;
+ DWORD state;
+ do {
+ state = XNetGetTitleXnAddr(&xna);
+ Sleep(100);
+ } while (state == XNET_GET_XNADDR_PENDING);
+
+ if (state & XNET_GET_XNADDR_STATIC || state & XNET_GET_XNADDR_DHCP) {
+ NPT_IpAddress primary_address(ntohl(xna.ina.s_addr));
+ NPT_IpAddress netmask; /* no support for netmask */
+ NPT_IpAddress broadcast_address(ntohl(xna.ina.s_addr));
+ NPT_Flags flags = NPT_NETWORK_INTERFACE_FLAG_BROADCAST;
+
+ NPT_MacAddress mac;
+ if (state & XNET_GET_XNADDR_ETHERNET) {
+ mac.SetAddress(NPT_MacAddress::TYPE_ETHERNET, xna.abEnet, 6);
+ }
+
+ // create an interface object
+ char iface_name[5];
+ iface_name[0] = 'i';
+ iface_name[1] = 'f';
+ iface_name[2] = '0';
+ iface_name[3] = '0';
+ iface_name[4] = '\0';
+ NPT_NetworkInterface* iface = new NPT_NetworkInterface(iface_name, mac, flags);
+
+ // set the interface address
+ NPT_NetworkInterfaceAddress iface_address(
+ primary_address,
+ broadcast_address,
+ NPT_IpAddress::Any,
+ netmask);
+ iface->AddAddress(iface_address);
+
+ // add the interface to the list
+ interfaces.Add(iface);
+ }
+
+ return NPT_SUCCESS;
+}
+
diff --git a/lib/libUPnP/Neptune/Source/System/Xbox/NptXboxNetwork.h b/lib/libUPnP/Neptune/Source/System/Xbox/NptXboxNetwork.h
new file mode 100644
index 0000000..4a5ff46
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/System/Xbox/NptXboxNetwork.h
@@ -0,0 +1,19 @@
+/*****************************************************************
+|
+| Neptune - Network :: Xbox Winsock Implementation
+|
+| (c) 2001-2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| static initializer
++---------------------------------------------------------------------*/
+class NPT_WinsockSystem {
+public:
+ static NPT_WinsockSystem Initializer;
+private:
+ NPT_WinsockSystem();
+ ~NPT_WinsockSystem();
+};
diff --git a/lib/libUPnP/Neptune/Source/Tests/Arrays1/ArraysTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Arrays1/ArraysTest1.cpp
new file mode 100644
index 0000000..b7de10c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Arrays1/ArraysTest1.cpp
@@ -0,0 +1,201 @@
+/*****************************************************************
+|
+| Arrays Test Program 1
+|
+| (c) 2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Neptune.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static unsigned int A_Count = 0;
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+class A {
+public:
+ A() : _a(0), _b(0), _c(&_a) {
+ //printf("A::A()\n");
+ A_Count++;
+ }
+ A(int a, char b) : _a(a), _b(b), _c(&_a) {
+ //printf("A::A(%d, %d)\n", a, b);
+ A_Count++;
+ }
+ A(const A& other) : _a(other._a), _b(other._b), _c(&_a) {
+ //printf("A::A(copy: a=%d, b=%d)\n", _a, _b);
+ A_Count++;
+ }
+ ~A() {
+ //printf("A::~A(), a=%d, b=%d\n", _a, _b);
+ A_Count--;
+ }
+ bool Check() { return _c == &_a; }
+ bool operator==(const A& other) {
+ return _a == other._a && _b == other._b;
+ }
+ int _a;
+ char _b;
+ int* _c;
+};
+
+#define CHECK(x) { \
+ if (!(x)) { \
+ printf("TEST FAILED line %d\n", __LINE__); \
+ return 1; \
+ } \
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ NPT_Result res;
+ NPT_Array<int> a;
+ a.Add(7);
+ CHECK(a[0] == 7);
+
+ NPT_Array<A> a_array;
+ a_array.Add(A(1,2));
+ a_array.Add(A(3,4));
+ a_array.Reserve(100);
+ a_array.Add(A(4,5));
+
+ CHECK(A_Count == 3);
+ NPT_Array<A> b_array = a_array;
+ CHECK(A_Count == 6);
+ CHECK(b_array.GetItemCount() == a_array.GetItemCount());
+ CHECK(b_array == a_array);
+ CHECK(a_array[0] == b_array[0]);
+ b_array[0] = A(7,8);
+ CHECK(A_Count == 6);
+ CHECK(!(a_array[0] == b_array[0]));
+
+ a_array.Resize(2);
+ CHECK(A_Count == 5);
+ CHECK(a_array.GetItemCount() == 2);
+ b_array.Resize(5);
+ CHECK(A_Count == 7);
+ CHECK(b_array[4]._a == 0);
+ CHECK(b_array[4]._b == 0);
+
+ a_array.Resize(6, A(9,10));
+ CHECK(A_Count == 11);
+ CHECK(a_array.GetItemCount() == 6);
+ CHECK(a_array[5] == A(9,10));
+
+ for (NPT_Ordinal i=0; i<a_array.GetItemCount(); i++) {
+ a_array[i].Check();
+ }
+ for (NPT_Ordinal i=0; i<b_array.GetItemCount(); i++) {
+ b_array[i].Check();
+ }
+
+ res = a_array.Erase(&a_array[6]);
+ CHECK(res != NPT_SUCCESS);
+ a_array.Erase(&a_array[2]);
+ CHECK(a_array.GetItemCount() == 5);
+ CHECK(A_Count == 10);
+ CHECK(a_array[4] == A(9,10));
+
+ a_array.Insert(a_array.GetItem(1), A(3, 110), 1);
+ CHECK(a_array.GetItemCount() == 6);
+ CHECK(A_Count == 11);
+ CHECK(a_array[1] == A(3,110));
+ CHECK(a_array[5] == A(9,10));
+
+ a_array.Erase(1, 3);
+ CHECK(a_array.GetItemCount() == 3);
+ CHECK(A_Count == 8);
+ CHECK(a_array[2] == A(9,10));
+
+ a_array.Insert(a_array.GetFirstItem(), A(34, 0), 4);
+ CHECK(a_array.GetItemCount() == 7);
+ CHECK(A_Count == 12);
+ CHECK(a_array[6] == A(9,10));
+
+ a_array.Insert(a_array.GetItem(5), A(116, 'e'), 200);
+ CHECK(a_array.GetItemCount() == 207);
+ CHECK(a_array[206] == A(9,10));
+
+ a_array.Clear();
+ a_array.Insert(a_array.GetFirstItem(), A(1, 'c'));
+ CHECK(a_array.GetItemCount() == 1);
+ CHECK(a_array[0] == A(1,'c'));
+
+ a_array.Insert(a_array.GetItem(1), A(2, 'd'));
+ CHECK(a_array.GetItemCount() == 2);
+ CHECK(a_array[0] == A(1,'c'));
+ CHECK(a_array[1] == A(2,'d'));
+
+ NPT_Array<int>* int_array = new NPT_Array<int>(100);
+ CHECK(int_array->GetItemCount() == 0);
+ int_array->Add(1);
+ int_array->Add(2);
+ CHECK(int_array->GetItemCount() == 2);
+ CHECK((*int_array)[0] == 1);
+ CHECK((*int_array)[1] == 2);
+ int_array->Clear();
+ CHECK(int_array->GetItemCount() == 0);
+ delete int_array;
+
+ NPT_Array<A*> c_array;
+ A* o = new A(3, 2);
+ c_array.Add(o);
+ CHECK(c_array.GetItemCount() == 1);
+ for (int i=0; i<4; i++) {
+ c_array.Insert(0,new A(55,'a'));
+ }
+
+ CHECK(c_array.Contains(o));
+ A* a66 = new A(66, 'b');
+ CHECK(!c_array.Contains(a66));
+ delete a66;
+
+ A** ai = c_array.Find(NPT_ObjectComparator<A*>(o));
+ CHECK(ai);
+ CHECK(**ai == *o);
+ c_array.Erase(ai);
+ delete o;
+ CHECK(c_array.GetItemCount() == 4);
+
+ c_array.Apply(NPT_ObjectDeleter<A>());
+
+ NPT_Array<int> i_array;
+ CHECK(NPT_SUCCEEDED(i_array.Resize(4, 0)));
+ CHECK(i_array.GetItemCount() == 4);
+ i_array[0] = 3;
+ i_array[1] = 7;
+ i_array[2] = 9;
+ i_array[3] = 12;
+
+ NPT_Array<int> j_array = i_array;
+ CHECK(i_array == j_array);
+ i_array[2] = 7;
+ CHECK(i_array != j_array);
+ CHECK(!(i_array == j_array));
+ i_array[2] = 9;
+ CHECK(i_array == j_array);
+ j_array.Add(12);
+ CHECK(i_array != j_array);
+ CHECK(!(i_array == j_array));
+
+ NPT_Array<int> k_array;
+ k_array.Add(1);
+ k_array = i_array;
+ CHECK(k_array == i_array);
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/BufferedStreams1/BufferedStreamsTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/BufferedStreams1/BufferedStreamsTest1.cpp
new file mode 100644
index 0000000..57a5663
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/BufferedStreams1/BufferedStreamsTest1.cpp
@@ -0,0 +1,70 @@
+/*****************************************************************
+|
+| BufferedStreams Test Program 1
+|
+| (c) 2001-2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include <stdlib.h>
+
+#if defined(_DEBUG) && defined(WIN32)
+#include <crtdbg.h>
+#endif
+
+#define CHECK(x) { \
+ if (!(x)) { \
+ printf("TEST FAILED line %d\n", __LINE__); \
+ return 1; \
+ } \
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ // setup debugging
+#if defined(_DEBUG) && defined(WIN32)
+ int flags = _crtDbgFlag |
+ _CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_DELAY_FREE_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF;
+
+ _CrtSetDbgFlag(flags);
+ //AllocConsole();
+ //freopen("CONOUT$", "w", stdout);
+#endif
+
+#if 0
+ const char* b0 = "";
+ const char* b1 = "\n";
+ const char* b2 = "\r";
+ const char* b3 = "\r\n";
+ const char* b4 = "0\r1\r\r2\r\r\r" // only \r, up to 3
+ "3\n4\n\n5\n\n\n" // only \n, up to 3
+ "6\r\n7\n\r" // one \r and one \n
+ "8\r\n\r9\r\r\na\n\r\r" // two \r and one \n
+ "b\n\r\nc\n\n\rd\r\n\n" // two \n and one \r
+ ;
+ const char* b5 = "aaa\r";
+ const char* b6 = "aaa\n";
+ const char* b7 = "aaa\r\n";
+
+ printf("BufferedInputStream test1 passed\n");
+#endif
+
+ NPT_InputStreamReference isr1(new NPT_MemoryStream("0123456789", 10));
+ NPT_BufferedInputStream bis(isr1, 3);
+ char buffer[256];
+ NPT_Result result = bis.ReadLine(buffer, 2);
+ CHECK(result == NPT_ERROR_NOT_ENOUGH_SPACE);
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Crypto1/CryptoTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Crypto1/CryptoTest1.cpp
new file mode 100755
index 0000000..94d5ad9
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Crypto1/CryptoTest1.cpp
@@ -0,0 +1,171 @@
+/*****************************************************************
+|
+| Crypto Test Program 1
+|
+| (c) 2005-2010 Axiomatic Systems, LLC.
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define SHOULD_SUCCEED(r) \
+ do { \
+ if (NPT_FAILED(r)) { \
+ NPT_Console::OutputF("failed line %d (%d)\n", __LINE__, r);\
+ return 1; \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL(a,b) \
+ do { \
+ if ((a) != (b)) { \
+ NPT_Console::OutputF("failed line %d (%d != %d)\n", __LINE__, a,b);\
+ return 1; \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_MEM(a,b,s) \
+ do { \
+ for (unsigned int x=0; x<s; x++) { \
+ if (a[x] != b[x]) { \
+ NPT_Console::OutputF("failed line %d (byte %d)\n", __LINE__, x); \
+ return 1; \
+ } \
+ } \
+ } while(0)
+
+#if defined(NPT_CONFIG_ENABLE_CRYPTO)
+/*----------------------------------------------------------------------
+| TestBlockCiphers
++---------------------------------------------------------------------*/
+static int
+TestBlockCiphers()
+{
+ NPT_BlockCipher* cipher = NULL;
+ NPT_UInt8 b0[16];
+ NPT_UInt8 k1[16] =
+ { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
+ NPT_UInt8 pt1[16] =
+ { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
+ NPT_UInt8 ct1[16] =
+ { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
+ 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a };
+
+ NPT_Result result;
+ result = NPT_BlockCipher::Create(NPT_BlockCipher::AES_128,
+ NPT_BlockCipher::ENCRYPT,
+ k1,
+ 16,
+ cipher);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(cipher->GetBlockSize(), 16);
+ result = cipher->ProcessBlock(pt1, b0);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL_MEM(b0, ct1, 16);
+ delete cipher;
+
+ result = NPT_BlockCipher::Create(NPT_BlockCipher::AES_128,
+ NPT_BlockCipher::DECRYPT,
+ k1,
+ 16,
+ cipher);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(cipher->GetBlockSize(), 16);
+ result = cipher->ProcessBlock(ct1, b0);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL_MEM(b0, pt1, 16);
+ delete cipher;
+
+ NPT_UInt8 key[16];
+ NPT_CopyMemory(key, k1, 16);
+ for (unsigned int i=0; i<100; i++) {
+ NPT_BlockCipher* encrypter;
+ NPT_BlockCipher* decrypter;
+ result = NPT_BlockCipher::Create(NPT_BlockCipher::AES_128,
+ NPT_BlockCipher::ENCRYPT,
+ key,
+ 16,
+ encrypter);
+ result = NPT_BlockCipher::Create(NPT_BlockCipher::AES_128,
+ NPT_BlockCipher::DECRYPT,
+ key,
+ 16,
+ decrypter);
+ NPT_UInt8 mem1[16];
+ NPT_UInt8 mem2[16];
+ NPT_UInt8 mem3[16];
+ NPT_SetMemory(mem1, 0, 16);
+ for (unsigned int j=0; j<1000; j++) {
+ encrypter->ProcessBlock(mem1, mem2);
+ decrypter->ProcessBlock(mem2, mem3);
+ SHOULD_EQUAL_MEM(mem1, mem3, 16);
+ NPT_CopyMemory(mem1, mem2, 16);
+ }
+ delete encrypter;
+ delete decrypter;
+ NPT_CopyMemory(key, mem1, 16);
+ }
+
+ return 0;
+}
+
+/*----------------------------------------------------------------------
+ | TestBenchmark
+ +---------------------------------------------------------------------*/
+static int
+TestBenchmark()
+{
+ unsigned char* data = new unsigned char[16*1024];
+ NPT_SetMemory(data, 0, sizeof(16*1024));
+ NPT_TimeStamp before;
+ NPT_TimeStamp after;
+ float elapsed;
+ unsigned char key[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
+ NPT_BlockCipher* cipher;
+ NPT_BlockCipher::Create(NPT_BlockCipher::AES_128,
+ NPT_BlockCipher::ENCRYPT,
+ key,
+ 16,
+ cipher);
+ NPT_System::GetCurrentTimeStamp(before);
+ unsigned int block_count = 0;
+ do {
+ unsigned char out[16];
+ for (unsigned int i=0; i<1024; i++) {
+ cipher->ProcessBlock(data+16*i, out);
+ }
+ block_count += 1024;
+ NPT_System::GetCurrentTimeStamp(after);
+ elapsed = after.ToSeconds()-before.ToSeconds();
+ } while (elapsed < 10.0f);
+ NPT_Console::OutputF("AES: %d blocks in 10 seconds: %f MB/s\n", block_count, ((block_count*16.0f)/1000000.0f)/elapsed);
+ delete[] data;
+
+ return 0;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+#if defined(NPT_CONFIG_ENABLE_CRYPTO)
+ TestBlockCiphers();
+ TestBenchmark();
+#endif
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Digests1/DigestsTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Digests1/DigestsTest1.cpp
new file mode 100755
index 0000000..09b0868
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Digests1/DigestsTest1.cpp
@@ -0,0 +1,232 @@
+/*****************************************************************
+|
+| Digests Test Program 1
+|
+| (c) 2005-2010 Axiomatic Systems, LLC.
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define SHOULD_SUCCEED(r) \
+ do { \
+ if (NPT_FAILED(r)) { \
+ NPT_Console::OutputF("failed line %d (%d)\n", __LINE__, r);\
+ return 1; \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL(a,b) \
+ do { \
+ if ((a) != (b)) { \
+ NPT_Console::OutputF("failed line %d (%d != %d)\n", __LINE__, a,b);\
+ return 1; \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_MEM(a,b,s) \
+ do { \
+ for (unsigned int x=0; x<s; x++) { \
+ if (a[x] != b[x]) { \
+ NPT_Console::OutputF("failed line %d (byte %d)\n", __LINE__, x); \
+ return 1; \
+ } \
+ } \
+ } while(0)
+
+#if defined(NPT_CONFIG_ENABLE_CRYPTO)
+/*----------------------------------------------------------------------
+| TestDigests
++---------------------------------------------------------------------*/
+static int
+TestDigests()
+{
+ NPT_Digest* sha1 = NULL;
+ NPT_Digest* sha256 = NULL;
+ NPT_Digest* md5 = NULL;
+ NPT_Result result;
+
+ result = NPT_Digest::Create(NPT_Digest::ALGORITHM_SHA1, sha1);
+ SHOULD_SUCCEED(result);
+ NPT_String data = "hello";
+ result = sha1->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ NPT_DataBuffer digest;
+ result = sha1->GetDigest(digest);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(sha1->GetSize(), 20);
+ SHOULD_EQUAL(digest.GetDataSize(), 20);
+ NPT_UInt8 digest1[] = {0xaa, 0xf4, 0xc6, 0x1d, 0xdc, 0xc5, 0xe8, 0xa2, 0xda, 0xbe, 0xde, 0x0f, 0x3b, 0x48, 0x2c, 0xd9, 0xae, 0xa9, 0x43, 0x4d};
+ SHOULD_EQUAL_MEM(digest.GetData(), digest1, 20);
+ delete sha1;
+
+ result = NPT_Digest::Create(NPT_Digest::ALGORITHM_SHA1, sha1);
+ SHOULD_SUCCEED(result);
+ data = "Hello, this is a test for the Neptune digest functionality. Blablabla. Bliblibli";
+ result = sha1->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ result = sha1->GetDigest(digest);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(digest.GetDataSize(), 20);
+ NPT_UInt8 digest2[] = {0x92, 0x6a, 0xd8, 0x38, 0xbf, 0x91, 0x51, 0x3b, 0xa6, 0xf9, 0x75, 0x6f, 0x8a, 0xa3, 0xcb, 0xe2, 0xe4, 0x5a, 0x95, 0xbd};
+ SHOULD_EQUAL_MEM(digest.GetData(), digest2, 20);
+ delete sha1;
+
+ result = NPT_Digest::Create(NPT_Digest::ALGORITHM_SHA1, sha1);
+ SHOULD_SUCCEED(result);
+ data = "0123456789";
+ for (unsigned int a=0; a<6; a++) {
+ result = sha1->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ }
+ result = sha1->GetDigest(digest);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(digest.GetDataSize(), 20);
+ NPT_UInt8 digest3[] = {0xf5, 0x2e, 0x3c, 0x27, 0x32, 0xde, 0x7b, 0xea, 0x28, 0xf2, 0x16, 0xd8, 0x77, 0xd7, 0x8d, 0xae, 0x1a, 0xa1, 0xac, 0x6a};
+ SHOULD_EQUAL_MEM(digest.GetData(), digest3, 20);
+ delete sha1;
+
+ result = NPT_Digest::Create(NPT_Digest::ALGORITHM_SHA256, sha256);
+ SHOULD_SUCCEED(result);
+ data = "hello";
+ result = sha256->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ result = sha256->GetDigest(digest);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(sha256->GetSize(), 32);
+ SHOULD_EQUAL(digest.GetDataSize(), 32);
+ NPT_UInt8 digest4[] = {0x2c, 0xf2, 0x4d, 0xba, 0x5f, 0xb0, 0xa3, 0x0e, 0x26, 0xe8, 0x3b, 0x2a, 0xc5, 0xb9, 0xe2, 0x9e, 0x1b, 0x16, 0x1e, 0x5c, 0x1f, 0xa7, 0x42, 0x5e, 0x73, 0x04, 0x33, 0x62, 0x93, 0x8b, 0x98, 0x24};
+ SHOULD_EQUAL_MEM(digest.GetData(), digest4, 32);
+ delete sha256;
+
+ result = NPT_Digest::Create(NPT_Digest::ALGORITHM_SHA256, sha256);
+ SHOULD_SUCCEED(result);
+ data = "Hello, this is a test for the Neptune digest functionality. Blablabla. Bliblibli";
+ result = sha256->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ result = sha256->GetDigest(digest);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(digest.GetDataSize(), 32);
+ NPT_UInt8 digest5[] = {0xed, 0x9a, 0xee, 0xd7, 0x7e, 0x07, 0x1d, 0x3d, 0x24, 0x99, 0xc9, 0x11, 0xf5, 0x56, 0x89, 0x5a, 0x90, 0x22, 0x99, 0x59, 0xee, 0x51, 0x83, 0x4b, 0x17, 0x8b, 0xa1, 0x7e, 0x4b, 0x50, 0x32, 0x7e};
+ SHOULD_EQUAL_MEM(digest.GetData(), digest5, 32);
+ delete sha256;
+
+ result = NPT_Digest::Create(NPT_Digest::ALGORITHM_SHA256, sha256);
+ SHOULD_SUCCEED(result);
+ data = "0123456789";
+ for (unsigned int a=0; a<6; a++) {
+ result = sha256->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ }
+ result = sha256->GetDigest(digest);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(digest.GetDataSize(), 32);
+ NPT_UInt8 digest6[] = {0x5e, 0x43, 0xc8, 0x70, 0x4a, 0xc8, 0x1f, 0x33, 0xd7, 0x01, 0xc1, 0xac, 0xe0, 0x46, 0xba, 0x9f, 0x25, 0x70, 0x62, 0xb4, 0xd1, 0x7e, 0x78, 0xf3, 0x25, 0x4c, 0xbf, 0x24, 0x31, 0x77, 0xe4, 0xf2};
+ SHOULD_EQUAL_MEM(digest.GetData(), digest6, 32);
+ delete sha256;
+
+ result = NPT_Digest::Create(NPT_Digest::ALGORITHM_MD5, md5);
+ SHOULD_SUCCEED(result);
+ data = "hello";
+ result = md5->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ result = md5->GetDigest(digest);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(digest.GetDataSize(), 16);
+ NPT_UInt8 digest11[] = {0x5d, 0x41, 0x40, 0x2a, 0xbc, 0x4b, 0x2a, 0x76, 0xb9, 0x71, 0x9d, 0x91, 0x10, 0x17, 0xc5, 0x92};
+ SHOULD_EQUAL_MEM(digest.GetData(), digest11, 16);
+ delete md5;
+
+ result = NPT_Digest::Create(NPT_Digest::ALGORITHM_MD5, md5);
+ SHOULD_SUCCEED(result);
+ data = "Hello, this is a test for the Neptune digest functionality. Blablabla. Bliblibli";
+ result = md5->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ result = md5->GetDigest(digest);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(digest.GetDataSize(), 16);
+ NPT_UInt8 digest12[] = {0x32, 0x90, 0x77, 0xc4, 0xfe, 0xa9, 0x00, 0xf5, 0x6b, 0xb2, 0x62, 0x7f, 0xe3, 0xc0, 0x93, 0x51};
+ SHOULD_EQUAL_MEM(digest.GetData(), digest12, 16);
+ delete md5;
+
+ result = NPT_Digest::Create(NPT_Digest::ALGORITHM_MD5, md5);
+ SHOULD_SUCCEED(result);
+ data = "0123456789";
+ for (unsigned int a=0; a<6; a++) {
+ result = md5->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ }
+ result = md5->GetDigest(digest);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(digest.GetDataSize(), 16);
+ NPT_UInt8 digest13[] = {0x1c, 0xed, 0x81, 0x1a, 0xf4, 0x7e, 0xad, 0x37, 0x48, 0x72, 0xfc, 0xca, 0x9d, 0x73, 0xdd, 0x71};
+ SHOULD_EQUAL_MEM(digest.GetData(), digest13, 16);
+ delete md5;
+
+ return 0;
+}
+
+/*----------------------------------------------------------------------
+| TestHmac
++---------------------------------------------------------------------*/
+static int
+TestHmac()
+{
+ NPT_Digest* hmac = NULL;
+ NPT_Result result;
+ NPT_String data;
+ NPT_DataBuffer mac;
+
+ char key1[] = "hello";
+ int key1_size = 5;
+ result = NPT_Hmac::Create(NPT_Digest::ALGORITHM_MD5, (const NPT_UInt8*)key1, key1_size, hmac);
+ SHOULD_SUCCEED(result);
+ data = "Hello, this is a test for the Neptune digest functionality. Blablabla. Bliblibli";
+ result = hmac->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ result = hmac->GetDigest(mac);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(mac.GetDataSize(), 16);
+ NPT_UInt8 mac1[] = {0xb2, 0x4f, 0x2f, 0x05, 0x76, 0xcf, 0x5a, 0xa9, 0xa6, 0x05, 0xe3, 0x21, 0x6e, 0x70, 0xb6, 0x84};
+ SHOULD_EQUAL_MEM(mac.GetData(), mac1, 16);
+ delete hmac;
+
+ char key2[] = "hello-this-is-a-long-key";
+ int key2_size = 24;
+ result = NPT_Hmac::Create(NPT_Digest::ALGORITHM_MD5, (const NPT_UInt8*)key2, key2_size, hmac);
+ SHOULD_SUCCEED(result);
+ data = "Hello, this is a test for the Neptune digest functionality. Blablabla. Bliblibli";
+ result = hmac->Update((const NPT_UInt8*)data.GetChars(), data.GetLength());
+ SHOULD_SUCCEED(result);
+ result = hmac->GetDigest(mac);
+ SHOULD_SUCCEED(result);
+ SHOULD_EQUAL(mac.GetDataSize(), 16);
+ NPT_UInt8 mac2[] = {0x35, 0xaf, 0x0f, 0x44, 0x63, 0x33, 0xdb, 0x44, 0x1c, 0x09, 0x25, 0xbb, 0xab, 0x95, 0xfb, 0x87};
+ SHOULD_EQUAL_MEM(mac.GetData(), mac2, 16);
+ delete hmac;
+
+ return 0;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+#if defined(NPT_CONFIG_ENABLE_CRYPTO)
+ TestDigests();
+ TestHmac();
+#endif
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/FileTest1/FileTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/FileTest1/FileTest1.cpp
new file mode 100644
index 0000000..f18f26e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/FileTest1/FileTest1.cpp
@@ -0,0 +1,370 @@
+/*****************************************************************
+|
+| File Test Program 1
+|
+| (c) 2005-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#define CHECK(x) \
+do {\
+ if (!(x)) {\
+ fprintf(stderr, "ERROR line %d\n", __LINE__);\
+ return NPT_FAILURE;\
+ }\
+} while(0)\
+
+/*----------------------------------------------------------------------
+| CreateNewFile
++---------------------------------------------------------------------*/
+NPT_Result
+CreateNewFile(const char* filename, NPT_Size chunk_count, NPT_Size chunk_size=1)
+{
+ NPT_File file(filename);
+ NPT_CHECK(file.Open(NPT_FILE_OPEN_MODE_CREATE|NPT_FILE_OPEN_MODE_WRITE|NPT_FILE_OPEN_MODE_TRUNCATE));
+ NPT_OutputStreamReference out;
+ file.GetOutputStream(out);
+ unsigned char* chunk_buffer = new unsigned char[chunk_size];
+ for (unsigned int i=0; i<chunk_size; i++) {
+ chunk_buffer[i] = (unsigned char)i;
+ }
+ for (unsigned int i=0; i<chunk_count; i++) {
+ CHECK(NPT_SUCCEEDED(out->WriteFully(chunk_buffer, chunk_size)));
+ }
+ delete[] chunk_buffer;
+ file.Close();
+ out = NULL;
+
+ NPT_FileInfo info;
+ NPT_Result result = NPT_File::GetInfo(filename, &info);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(info.m_Size == (NPT_LargeSize)chunk_count*(NPT_LargeSize)chunk_size);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ NPT_Result result;
+ NPT_FileInfo info;
+
+ CHECK(NPT_File::GetInfo("foobar.doesnotexist", NULL) == NPT_ERROR_NO_SUCH_FILE);
+ CHECK(!NPT_File::Exists("foobar.doesnotexist"));
+
+ // test special names
+ NPT_File file(NPT_FILE_STANDARD_INPUT);
+ CHECK(NPT_SUCCEEDED(file.GetInfo(info)));
+ CHECK(info.m_Type == NPT_FileInfo::FILE_TYPE_SPECIAL);
+ file = NPT_File(NPT_FILE_STANDARD_OUTPUT);
+
+ CHECK(NPT_SUCCEEDED(file.GetInfo(info)));
+ CHECK(info.m_Type == NPT_FileInfo::FILE_TYPE_SPECIAL);
+ file = NPT_File(NPT_FILE_STANDARD_ERROR);
+ CHECK(NPT_SUCCEEDED(file.GetInfo(info)));
+ CHECK(info.m_Type == NPT_FileInfo::FILE_TYPE_SPECIAL);
+
+ if (NPT_File::Exists("foobar.file1")) {
+ result = NPT_File::RemoveFile("foobar.file1");
+ CHECK(NPT_SUCCEEDED(result));
+ }
+
+ result = CreateNewFile("foobar.file1", 9);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(NPT_File::Exists("foobar.file1"));
+ result = NPT_File::GetInfo("foobar.file1", &info);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(info.m_Type == NPT_FileInfo::FILE_TYPE_REGULAR);
+ CHECK(info.m_Size == 9);
+
+ {
+ NPT_File f1("foobar.file1");
+ result = f1.GetInfo(info);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(info.m_Type == NPT_FileInfo::FILE_TYPE_REGULAR);
+ CHECK(info.m_Size == 9);
+ }
+ {
+ NPT_File f1("foobar.file1");
+ NPT_LargeSize size;
+ result = f1.GetSize(size);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(size == 9);
+ }
+
+ {
+ NPT_File f1("foobar.file1");
+ NPT_File::Remove("foobar.file1-r");
+ result = f1.Rename("foobar.file1-r");
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(f1.GetPath() == "foobar.file1-r");
+ }
+ CHECK(NPT_File::Exists("foobar.file1-r"));
+ result = NPT_File::GetInfo("foobar.file1-r", &info);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(info.m_Type == NPT_FileInfo::FILE_TYPE_REGULAR);
+ CHECK(info.m_Size == 9);
+
+ // dirs
+ NPT_File::RemoveDir("foobar.dir", true);
+ CHECK(!NPT_File::Exists("foobar.dir"));
+ result = NPT_File::CreateDir("foobar.dir");
+ CHECK(NPT_SUCCEEDED(result));
+ result = NPT_File::GetInfo("foobar.dir", &info);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(info.m_Type == NPT_FileInfo::FILE_TYPE_DIRECTORY);
+ {
+ NPT_File f1("foobar.dir");
+ result = f1.GetInfo(info);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(info.m_Type == NPT_FileInfo::FILE_TYPE_DIRECTORY);
+ }
+
+ NPT_String dirname = "foobar.dir";
+ NPT_String fname;
+ fname = dirname;
+ fname += NPT_FilePath::Separator;
+ fname += "file1";
+ result = CreateNewFile(fname, 1);
+ CHECK(NPT_SUCCEEDED(result));
+ fname = dirname;
+ fname += NPT_FilePath::Separator;
+ fname += "file2";
+ result = CreateNewFile(fname, 2);
+ CHECK(NPT_SUCCEEDED(result));
+ fname = dirname;
+ fname += NPT_FilePath::Separator;
+ fname += "file3";
+ result = CreateNewFile(fname, 3);
+ CHECK(NPT_SUCCEEDED(result));
+
+ NPT_List<NPT_String> entries;
+ result = NPT_File::ListDir("foobar.dir", entries);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(entries.GetItemCount() == 3);
+ NPT_LargeSize dir_size;
+ result = NPT_File::GetSize("foobar.dir", dir_size);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(dir_size == 3);
+
+ result = NPT_File::RemoveFile("foobar.dir");
+ CHECK(NPT_FAILED(result));
+ result = NPT_File::RemoveDir("foobar.dir");
+ CHECK(result == NPT_ERROR_DIRECTORY_NOT_EMPTY);
+
+ result = NPT_File::Rename("foobar.dir", "foobar.dir-r");
+ CHECK(NPT_SUCCEEDED(result));
+
+ dirname = "foobar.dir-r";
+ fname = dirname;
+ fname += NPT_FilePath::Separator;
+ fname += "file1";
+ result = NPT_File::RemoveFile(fname);
+ CHECK(NPT_SUCCEEDED(result));
+ fname = dirname;
+ fname += NPT_FilePath::Separator;
+ fname += "file2";
+ result = NPT_File::RemoveFile(fname);
+ CHECK(NPT_SUCCEEDED(result));
+ fname = dirname;
+ fname += NPT_FilePath::Separator;
+ fname += "file3";
+ result = NPT_File::RemoveFile(fname);
+ CHECK(NPT_SUCCEEDED(result));
+
+ result = NPT_File::RemoveDir("foobar.dir-r");
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(!NPT_File::Exists("foobar.dir-r"));
+
+ // dir creation with intermediates
+ result = NPT_File::CreateDir("foobar.dir/a/b/c/d", false);
+ CHECK(NPT_FAILED(result));
+ result = NPT_File::CreateDir("foobar.dir/a/b/c/d", true);
+ CHECK(NPT_SUCCEEDED(result));
+ CreateNewFile("foobar.dir/a/a.bin", 1, 1);
+ CreateNewFile("foobar.dir/a/b.bin", 1, 1);
+ CreateNewFile("foobar.dir/a/b/a.bin", 1, 1);
+ CreateNewFile("foobar.dir/a/b/c/d/foo.bin", 1, 1);
+ result = NPT_File::RemoveDir("foobar.dir", false);
+ CHECK(NPT_FAILED(result));
+ result = NPT_File::RemoveDir("foobar.dir", true);
+ CHECK(NPT_SUCCEEDED(result));
+
+ // paths
+ NPT_String test;
+ test = NPT_FilePath::BaseName("");
+ CHECK(test == "");
+ test = NPT_FilePath::BaseName("a");
+ CHECK(test == "a");
+ test = NPT_FilePath::BaseName("a"+NPT_String(NPT_FilePath::Separator)+"b");
+ CHECK(test == "b");
+ test = NPT_FilePath::BaseName("a"+NPT_String(NPT_FilePath::Separator)+"b"+NPT_FilePath::Separator);
+ CHECK(test == "");
+ test = NPT_FilePath::BaseName(NPT_String(NPT_FilePath::Separator)+"a");
+ CHECK(test == "a");
+ test = NPT_FilePath::BaseName(NPT_FilePath::Separator);
+ CHECK(test == "");
+
+ test = NPT_FilePath::DirName("");
+ CHECK(test == "");
+ test = NPT_FilePath::DirName("a");
+ CHECK(test == "");
+ test = NPT_FilePath::DirName("a"+NPT_String(NPT_FilePath::Separator)+"b");
+ CHECK(test == "a");
+ test = NPT_FilePath::DirName("a"+NPT_String(NPT_FilePath::Separator)+"b"+NPT_FilePath::Separator);
+ CHECK(test == "a"+NPT_String(NPT_FilePath::Separator)+"b");
+ test = NPT_FilePath::DirName(NPT_String(NPT_FilePath::Separator)+"a");
+ CHECK(test == NPT_FilePath::Separator);
+ test = NPT_FilePath::DirName(NPT_FilePath::Separator);
+ CHECK(test == NPT_FilePath::Separator);
+
+ // small files
+ result = CreateNewFile("small.bin", 0x100, 0x107);
+ CHECK(NPT_SUCCEEDED(result));
+
+ file = NPT_File("small.bin");
+ result = file.Open(NPT_FILE_OPEN_MODE_READ);
+ CHECK(NPT_SUCCEEDED(result));
+ NPT_InputStreamReference input;
+ file.GetInputStream(input);
+ NPT_Position position;
+ result = input->Tell(position);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(position == 0);
+ NPT_LargeSize large_size = (NPT_LargeSize)0x107 * (NPT_LargeSize)0x100;
+ result = input->Seek(large_size-0x107);
+ CHECK(NPT_SUCCEEDED(result));
+ result = input->Tell(position);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(position == large_size-0x107);
+ unsigned char* buffer = new unsigned char[0x107];
+ result = input->ReadFully(buffer, 0x107);
+ CHECK(NPT_SUCCEEDED(result));
+ result = input->Tell(position);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(position == large_size);
+ for (unsigned int i=0; i<0x107; i++) {
+ CHECK(buffer[i] == (unsigned char)i);
+ }
+ delete[] buffer;
+ file.Close();
+ NPT_File::RemoveFile(file.GetPath());
+
+ // large files
+ if (argc == 2) {
+ result = CreateNewFile(argv[1], 0x10000, 0x10007);
+ CHECK(NPT_SUCCEEDED(result));
+
+ NPT_String new_name = argv[1];
+ new_name += ".renamed";
+ result = NPT_File::Rename(argv[1], new_name);
+ CHECK(NPT_SUCCEEDED(result));
+ file = NPT_File(new_name);
+ result = file.Open(NPT_FILE_OPEN_MODE_READ);
+ CHECK(NPT_SUCCEEDED(result));
+ file.GetInputStream(input);
+ result = input->Tell(position);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(position == 0);
+ large_size = (NPT_LargeSize)0x10007 * (NPT_LargeSize)0x10000;
+ result = input->Seek(large_size-0x10007);
+ CHECK(NPT_SUCCEEDED(result));
+ result = input->Tell(position);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(position == large_size-0x10007);
+ buffer = new unsigned char[0x10007];
+ result = input->ReadFully(buffer, 0x10007);
+ CHECK(NPT_SUCCEEDED(result));
+ result = input->Tell(position);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(position == large_size);
+ for (unsigned int i=0; i<0x10007; i++) {
+ CHECK(buffer[i] == (unsigned char)i);
+ }
+ delete[] buffer;
+ file.Close();
+ NPT_File::RemoveFile(new_name);
+ }
+
+ // test dynamic size
+ unsigned char buff[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
+ const char* filename = "pi.\xCF\x80.test";
+ NPT_TimeInterval wait(2.0f);
+
+ if (argc > 1) {
+ filename = argv[1];
+ }
+
+ NPT_File file1(filename);
+ NPT_OutputStreamReference output;
+ NPT_LargeSize size;
+
+ CHECK(NPT_SUCCEEDED(file1.Open(NPT_FILE_OPEN_MODE_CREATE | NPT_FILE_OPEN_MODE_WRITE | NPT_FILE_OPEN_MODE_READ | NPT_FILE_OPEN_MODE_TRUNCATE)));
+ CHECK(NPT_SUCCEEDED(file1.GetSize(size)));
+ CHECK(size == 0);
+ CHECK(NPT_SUCCEEDED(file1.GetOutputStream(output)));
+ CHECK(NPT_SUCCEEDED(file1.GetInputStream(input)));
+ CHECK(NPT_SUCCEEDED(output->Tell(position)));
+ CHECK(position == 0);
+ CHECK(NPT_SUCCEEDED(input->Tell(position)));
+ CHECK(position == 0);
+ CHECK(NPT_SUCCEEDED(output->WriteFully(buff, 16)));
+ output->Flush();
+ NPT_System::Sleep(wait);
+ CHECK(NPT_SUCCEEDED(file1.GetSize(size)));
+ CHECK(size == 16);
+ CHECK(NPT_SUCCEEDED(output->Tell(position)));
+ CHECK(NPT_SUCCEEDED(input->GetSize(size)));
+ CHECK(size == 16);
+ CHECK(position == 16);
+ CHECK(NPT_SUCCEEDED(input->Tell(position)));
+ CHECK(position == 16);
+ CHECK(NPT_SUCCEEDED(output->Seek(8)));
+ CHECK(NPT_SUCCEEDED(output->Tell(position)));
+ CHECK(position == 8);
+
+ NPT_File file2(filename);
+ NPT_InputStreamReference input2;
+
+ CHECK(NPT_SUCCEEDED(file2.Open(NPT_FILE_OPEN_MODE_READ)));
+ CHECK(NPT_SUCCEEDED(file2.GetSize(size)));
+ CHECK(size == 16);
+ CHECK(NPT_SUCCEEDED(file2.GetInputStream(input2)));
+ CHECK(NPT_SUCCEEDED(input2->GetSize(size)));
+ CHECK(size == 16);
+ CHECK(NPT_SUCCEEDED(input2->Tell(position)));
+ CHECK(position == 0);
+ CHECK(NPT_SUCCEEDED(input2->Seek(8)));
+ CHECK(NPT_SUCCEEDED(input2->Tell(position)));
+ CHECK(position == 8);
+
+ CHECK(NPT_SUCCEEDED(output->WriteFully(buff, 16)));
+ output->Flush();
+ NPT_System::Sleep(wait);
+ CHECK(NPT_SUCCEEDED(file2.GetSize(size)));
+ CHECK(size == 24);
+ CHECK(NPT_SUCCEEDED(output->Tell(position)));
+ CHECK(position == 24);
+ CHECK(NPT_SUCCEEDED(input->Tell(position)));
+ CHECK(position == 24);
+
+ CHECK(NPT_SUCCEEDED(input2->GetSize(size)));
+ CHECK(size == 24);
+ CHECK(NPT_SUCCEEDED(input2->Seek(20)));
+ CHECK(NPT_SUCCEEDED(input2->Read(buff, 4, NULL)));
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/FileTest2/FileTest2.cpp b/lib/libUPnP/Neptune/Source/Tests/FileTest2/FileTest2.cpp
new file mode 100644
index 0000000..e093128
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/FileTest2/FileTest2.cpp
@@ -0,0 +1,121 @@
+/*****************************************************************
+|
+| File Test Program 2
+|
+| (c) 2005-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Neptune.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| FileTypeName
++---------------------------------------------------------------------*/
+static const char*
+FileTypeName(NPT_FileInfo::FileType type)
+{
+ switch (type) {
+ case NPT_FileInfo::FILE_TYPE_NONE: return "NONE";
+ case NPT_FileInfo::FILE_TYPE_REGULAR: return "REGULAR";
+ case NPT_FileInfo::FILE_TYPE_DIRECTORY: return "DIRECTORY";
+ case NPT_FileInfo::FILE_TYPE_SPECIAL: return "SPECIAL";
+ case NPT_FileInfo::FILE_TYPE_OTHER: return "OTHER";
+ default: return "??";
+ }
+}
+
+/*----------------------------------------------------------------------
+| WalkDir
++---------------------------------------------------------------------*/
+static NPT_Result
+WalkDir(const char* path, unsigned int indent)
+{
+ NPT_FileInfo info;
+ NPT_Result result = NPT_File::GetInfo(path, &info);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: NPT_File::GetInfo(\"%s\") returned %d (%s)\n",
+ path, result, NPT_ResultText(result));
+ return result;
+ }
+ if (info.m_Type != NPT_FileInfo::FILE_TYPE_DIRECTORY) {
+ fprintf(stderr, "WARNING: %s is not a directory\n", path);
+ return NPT_SUCCESS; // not fatal
+ }
+
+ NPT_List<NPT_String> entries;
+ result = NPT_File::ListDir(path, entries);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "WARNING: NPT_File::ListDirectory returned %d (%s)\n",
+ result, NPT_ResultText(result));
+ return NPT_SUCCESS; // not fatal
+ }
+
+ for (NPT_List<NPT_String>::Iterator entries_iterator = entries.GetFirstItem();
+ entries_iterator;
+ ++entries_iterator) {
+ if (*entries_iterator == "." || *entries_iterator == "..") continue;
+
+ NPT_String child = path;
+ child += NPT_FilePath::Separator;
+ child += *entries_iterator;
+ result = NPT_File::GetInfo(child, &info);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "WARNING: NPT_File::GetInfo(%s) returned %d (%s)\n",
+ child.GetChars(), result, NPT_ResultText(result));
+ continue;
+ }
+ for (unsigned int i=0; i<indent; i++) {
+ printf(" ");
+ }
+ printf("%s: type=%s", child.GetChars(), FileTypeName(info.m_Type));
+ if (info.m_Type != NPT_FileInfo::FILE_TYPE_DIRECTORY) printf(" size=%lld", info.m_Size);
+ if (info.m_AttributesMask & NPT_FILE_ATTRIBUTE_READ_ONLY &&
+ info.m_Attributes & NPT_FILE_ATTRIBUTE_READ_ONLY) {
+ printf(" RO");
+ }
+ if (info.m_AttributesMask & NPT_FILE_ATTRIBUTE_LINK &&
+ info.m_Attributes & NPT_FILE_ATTRIBUTE_LINK) {
+ printf(" LINK");
+ }
+ printf("\n");
+ NPT_String cre_time = NPT_DateTime(info.m_CreationTime, true).ToString(NPT_DateTime::FORMAT_RFC_1123);
+ for (unsigned int i=0; i<indent; i++) { printf(" "); }
+ printf("created: %s\n", cre_time.GetChars());
+ NPT_String mod_time = NPT_DateTime(info.m_ModificationTime, true).ToString(NPT_DateTime::FORMAT_RFC_1123);
+ for (unsigned int i=0; i<indent; i++) { printf(" "); }
+ printf("modified: %s\n", mod_time.GetChars());
+
+ if (info.m_Type == NPT_FileInfo::FILE_TYPE_DIRECTORY) {
+ result = WalkDir(child, indent+1);
+ if (NPT_FAILED(result)) return result;
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ if (argc != 2) {
+ fprintf(stderr,
+ "ERROR: root directory name not specified\n"
+ "usage: filetest2 <root_path>\n");
+ return 1;
+ }
+
+ WalkDir(argv[1], 0);
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/FileTest3/FileTest3.cpp b/lib/libUPnP/Neptune/Source/Tests/FileTest3/FileTest3.cpp
new file mode 100644
index 0000000..532227f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/FileTest3/FileTest3.cpp
@@ -0,0 +1,197 @@
+/*****************************************************************
+|
+| File Test Program 3
+|
+| (c) 2005-2016 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Neptune.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+const unsigned int BUFFER_SIZE = 8192;
+const unsigned int MAX_RANDOM = 123;
+typedef struct {
+ NPT_Position position;
+ unsigned int size;
+ unsigned char fill_value;
+} BufferInfo;
+const NPT_UInt64 TARGET_SIZE = 0x112345678;
+NPT_Array<BufferInfo> Buffers;
+
+#define CHECK(x) \
+do {\
+ if (!(x)) {\
+ fprintf(stderr, "ERROR line %d\n", __LINE__);\
+ return NPT_FAILURE;\
+ }\
+} while(0)\
+
+/*----------------------------------------------------------------------
+| TestLargeFiles
++---------------------------------------------------------------------*/
+static NPT_Result
+TestLargeFiles(const char* filename)
+{
+ // create enough buffers to fill up to the target size
+ NPT_UInt64 total_size = 0;
+ while (total_size < TARGET_SIZE) {
+ unsigned int random = NPT_System::GetRandomInteger() % MAX_RANDOM;
+ unsigned int buffer_size = 4096-MAX_RANDOM/2+random;
+ BufferInfo buffer_info;
+ buffer_info.position = total_size;
+ buffer_info.size = buffer_size;
+ buffer_info.fill_value = NPT_System::GetRandomInteger()%256;
+ Buffers.Add(buffer_info);
+
+ total_size += buffer_size;
+ }
+ unsigned char* buffer = new unsigned char[BUFFER_SIZE];
+ unsigned int progress = 0;
+
+ // write random buffers
+ printf("Writing sequential random-size buffers\n");
+ NPT_File test_file(filename);
+ NPT_Result result = test_file.Open(NPT_FILE_OPEN_MODE_WRITE | NPT_FILE_OPEN_MODE_CREATE | NPT_FILE_OPEN_MODE_TRUNCATE);
+ CHECK(result == NPT_SUCCESS);
+ NPT_OutputStreamReference output_stream;
+ result = test_file.GetOutputStream(output_stream);
+ CHECK(result == NPT_SUCCESS);
+
+ for (unsigned int i=0; i<Buffers.GetItemCount(); i++) {
+ unsigned int new_progress = (100*i)/Buffers.GetItemCount();
+ if (new_progress != progress) {
+ printf("\rProgress: %d%%", new_progress);
+ fflush(stdout);
+ progress = new_progress;
+ }
+
+ BufferInfo& buffer_info = Buffers[i];
+ NPT_SetMemory(buffer, buffer_info.fill_value, buffer_info.size);
+
+
+ NPT_Position cursor;
+ result = output_stream->Tell(cursor);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(cursor == buffer_info.position);
+
+ result = output_stream->WriteFully(buffer, buffer_info.size);
+ CHECK(result == NPT_SUCCESS);
+
+ if ((buffer_info.fill_value % 7) == 0) {
+ output_stream->Flush();
+ }
+
+ result = output_stream->Tell(cursor);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(cursor == buffer_info.position+buffer_info.size);
+ }
+
+ output_stream = NULL;
+ test_file.Close();
+
+ // read random buffers
+ printf("\nReading sequential random-size buffers\n");
+ result = test_file.Open(NPT_FILE_OPEN_MODE_READ);
+ CHECK(result == NPT_SUCCESS);
+ NPT_InputStreamReference input_stream;
+ result = test_file.GetInputStream(input_stream);
+ CHECK(result == NPT_SUCCESS);
+
+ for (unsigned int i=0; i<Buffers.GetItemCount(); i++) {
+ unsigned int new_progress = (100*i)/Buffers.GetItemCount();
+ if (new_progress != progress) {
+ printf("\rProgress: %d%%", new_progress);
+ fflush(stdout);
+ progress = new_progress;
+ }
+
+ BufferInfo& buffer_info = Buffers[i];
+
+ NPT_Position cursor;
+ result = input_stream->Tell(cursor);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(cursor == buffer_info.position);
+
+ result = input_stream->ReadFully(buffer, buffer_info.size);
+ CHECK(result == NPT_SUCCESS);
+
+ for (unsigned int x=0; x<buffer_info.size; x++) {
+ CHECK(buffer[x] == buffer_info.fill_value);
+ }
+
+ result = input_stream->Tell(cursor);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(cursor == buffer_info.position+buffer_info.size);
+ }
+ input_stream = NULL;
+ test_file.Close();
+
+ // read random buffers
+ printf("\nReading random-access random-size buffers\n");
+ result = test_file.Open(NPT_FILE_OPEN_MODE_READ);
+ CHECK(result == NPT_SUCCESS);
+ result = test_file.GetInputStream(input_stream);
+ CHECK(result == NPT_SUCCESS);
+
+ for (unsigned int i=0; i<Buffers.GetItemCount()*5; i++) {
+ unsigned int new_progress = (100*i)/(5*Buffers.GetItemCount());
+ if (new_progress != progress) {
+ printf("\rProgress: %d%%", new_progress);
+ fflush(stdout);
+ progress = new_progress;
+ }
+
+ unsigned int buffer_index = NPT_System::GetRandomInteger()%Buffers.GetItemCount();
+ BufferInfo& buffer_info = Buffers[buffer_index];
+
+ result = input_stream->Seek(buffer_info.position);
+ CHECK(result == NPT_SUCCESS);
+
+ NPT_Position cursor;
+ result = input_stream->Tell(cursor);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(cursor == buffer_info.position);
+
+ result = input_stream->ReadFully(buffer, buffer_info.size);
+ CHECK(result == NPT_SUCCESS);
+
+ for (unsigned int x=0; x<buffer_info.size; x++) {
+ CHECK(buffer[x] == buffer_info.fill_value);
+ }
+
+ result = input_stream->Tell(cursor);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(cursor == buffer_info.position+buffer_info.size);
+ }
+
+ printf("\nSUCCESS!\n");
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ const char* output_filename = "largefile.bin";
+ if (argc > 1) {
+ output_filename = argv[1];
+ }
+
+ TestLargeFiles(output_filename);
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/HttpClient1/HttpClientTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/HttpClient1/HttpClientTest1.cpp
new file mode 100644
index 0000000..d16daa3
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/HttpClient1/HttpClientTest1.cpp
@@ -0,0 +1,322 @@
+/*****************************************************************
+|
+| HTTP Client Test Program 1
+|
+| (c) 2001-2003 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+#ifdef __GCCE__
+#include <staticlibinit_gcce.h>
+#endif
+
+#define TEST_URL
+#if defined(TEST_URL)
+/*----------------------------------------------------------------------
+| TestUrlParser
++---------------------------------------------------------------------*/
+static void
+TestUrlParser(const char* url)
+{
+ NPT_HttpUrl url_object(url);
+ NPT_Debug("Parsing URL: '%s'\n", url ? url : "null");
+ if (url_object.IsValid()) {
+ NPT_Debug(" --> host=%s, port=%d, path=%s\n",
+ (const char*)url_object.GetHost(),
+ url_object.GetPort(),
+ (const char*)url_object.GetPath());
+ } else {
+ NPT_Debug(" --> Invalid URL\n");
+ }
+}
+#endif
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef enum {
+ SHOW_MODE_LOAD,
+ SHOW_MODE_STREAM_BLOCKING
+} ShowMode;
+
+/*----------------------------------------------------------------------
+| ShowResponse
++---------------------------------------------------------------------*/
+static void
+ShowResponse(NPT_HttpResponse* response, ShowMode mode)
+{
+ // show response info
+ NPT_Debug("RESPONSE: protocol=%s, code=%d, reason=%s\n",
+ response->GetProtocol().GetChars(),
+ response->GetStatusCode(),
+ response->GetReasonPhrase().GetChars());
+
+ // show headers
+ NPT_HttpHeaders& headers = response->GetHeaders();
+ NPT_List<NPT_HttpHeader*>::Iterator header = headers.GetHeaders().GetFirstItem();
+ while (header) {
+ NPT_Debug("%s: %s\n",
+ (const char*)(*header)->GetName(),
+ (const char*)(*header)->GetValue());
+ ++header;
+ }
+
+ // show entity
+ NPT_HttpEntity* entity = response->GetEntity();
+ if (entity != NULL) {
+ NPT_Debug("ENTITY: length=%lld, type=%s, encoding=%s\n",
+ entity->GetContentLength(),
+ entity->GetContentType().GetChars(),
+ entity->GetContentEncoding().GetChars());
+
+ switch (mode) {
+ case SHOW_MODE_LOAD: {
+ NPT_DataBuffer body;
+ NPT_Result result =entity->Load(body);
+ if (NPT_FAILED(result)) {
+ NPT_Debug("ERROR: failed to load entity (%d)\n", result);
+ } else {
+ NPT_Debug("BODY: loaded %d bytes\n", (int)body.GetDataSize());
+
+ // dump the body
+ NPT_OutputStreamReference output;
+ NPT_File standard_out(NPT_FILE_STANDARD_OUTPUT);
+ standard_out.Open(NPT_FILE_OPEN_MODE_WRITE);
+ standard_out.GetOutputStream(output);
+ output->Write(body.GetData(), body.GetDataSize());
+ }
+ break;
+ }
+
+ case SHOW_MODE_STREAM_BLOCKING: {
+ NPT_DataBuffer buffer(4096);
+ NPT_Result result;
+ NPT_InputStreamReference input;
+ entity->GetInputStream(input);
+ do {
+ NPT_Size bytes_read = 0;
+ result = input->Read(buffer.UseData(), 4096, &bytes_read);
+ NPT_Debug("read %d bytes\n", bytes_read);
+ } while (NPT_SUCCEEDED(result));
+ break;
+ }
+ }
+ }
+}
+
+#define TEST_GET
+#if defined(TEST_GET)
+/*----------------------------------------------------------------------
+| TestHttpGet
++---------------------------------------------------------------------*/
+static void
+TestHttpGet(const char* arg, ShowMode mode)
+{
+ NPT_HttpUrl url(arg);
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_GET);
+ NPT_HttpClient client;
+ NPT_HttpResponse* response;
+
+ NPT_Result result = client.SendRequest(request, response);
+ NPT_Debug("SendRequest returned %d\n", result);
+ if (NPT_FAILED(result)) return;
+
+ ShowResponse(response, mode);
+
+ delete response;
+}
+#endif
+
+#define TEST_TIMEOUTS
+#if defined(TEST_TIMEOUTS)
+/*----------------------------------------------------------------------
+| TestHttpTimeouts
++---------------------------------------------------------------------*/
+static void
+TestHttpTimeouts(const char* arg)
+{
+ NPT_HttpUrl url(arg);
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_GET);
+ NPT_HttpClient client;
+ NPT_HttpResponse* response;
+
+ NPT_Debug("### TIMEOUTS START ###\n");
+ client.SetTimeouts(10000, 10000, 10000);
+ NPT_TimeStamp before, after;
+ NPT_System::GetCurrentTimeStamp(before);
+ NPT_Result result = client.SendRequest(request, response);
+ NPT_Debug("SendRequest returned %d (%s)\n", result, NPT_ResultText(result));
+ NPT_System::GetCurrentTimeStamp(after);
+ NPT_Debug("time elapsed: %d ms\n", (after-before).ToMillis());
+
+ client.SetTimeouts(5000, 5000, 5000);
+ NPT_System::GetCurrentTimeStamp(before);
+ result = client.SendRequest(request, response);
+ NPT_Debug("SendRequest returned %d (%s)\n", result, NPT_ResultText(result));
+ NPT_System::GetCurrentTimeStamp(after);
+ NPT_Debug("time elapsed: %d ms\n", (after-before).ToMillis());
+
+ NPT_Debug("--- TIMEOUTS END ---\n");
+
+ delete response;
+}
+#endif
+
+#define TEST_CHUNKED
+#if defined(TEST_CHUNKED)
+/*----------------------------------------------------------------------
+| TestHttpChunked
++---------------------------------------------------------------------*/
+static void
+TestHttpChunked(const char* arg)
+{
+ NPT_HttpUrl url(arg);
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_GET);
+ request.SetProtocol(NPT_HTTP_PROTOCOL_1_1);
+ NPT_HttpClient client;
+ NPT_HttpResponse* response;
+
+ NPT_Result result = client.SendRequest(request, response);
+ NPT_Debug("SendRequest returned %d\n", result);
+ if (NPT_FAILED(result)) return;
+
+ ShowResponse(response, SHOW_MODE_STREAM_BLOCKING);
+
+ delete response;
+}
+#endif
+
+//#define TEST_PROXY
+#if defined(TEST_PROXY)
+/*----------------------------------------------------------------------
+| TestHttpGetWithProxy
++---------------------------------------------------------------------*/
+static void
+TestHttpGetWithProxy(const char* arg)
+{
+ NPT_HttpUrl url(arg);
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_GET);
+ NPT_HttpClient client;
+ NPT_HttpResponse* response;
+
+ client.SetProxy("proxy", 8080);
+ NPT_Result result = client.SendRequest(request, response);
+ NPT_Debug("SendRequest returned %d\n", result);
+ if (NPT_FAILED(result)) return;
+
+ ShowResponse(response);
+
+ delete response;
+}
+#endif
+
+#if defined(TEST_POST)
+/*----------------------------------------------------------------------
+| TestHttpPost
++---------------------------------------------------------------------*/
+static void
+TestHttpPost(const char* arg)
+{
+ NPT_HttpUrl url(arg);
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_POST);
+ NPT_HttpClient client;
+ NPT_HttpResponse* response;
+
+ NPT_HttpEntity* body_entity = new NPT_HttpEntity();
+ NPT_InputStreamReference body_stream(new NPT_MemoryStream((void*)"hello blabla", 12));
+ body_entity->SetInputStream(body_stream);
+
+ request.SetEntity(body_entity);
+ NPT_Result result = client.SendRequest(request, response);
+ NPT_Debug("SendRequest returned %d\n", result);
+ if (NPT_FAILED(result)) return;
+
+ ShowResponse(response);
+
+ delete response;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // setup debugging
+#if defined(WIN32) && defined(_DEBUG)
+ int flags = _crtDbgFlag |
+ _CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_DELAY_FREE_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF;
+
+ _CrtSetDbgFlag(flags);
+ //AllocConsole();
+ //freopen("CONOUT$", "w", stdout);
+#endif
+
+ // check args
+#if 1
+ if (argc != 2) {
+ NPT_Debug("HttpClient: missing URL argument\n");
+ return -1;
+ }
+#endif
+
+#if defined(TEST_URL)
+ // test URL parsing
+ TestUrlParser(NULL);
+ TestUrlParser("");
+ TestUrlParser("http");
+ TestUrlParser("http:/");
+ TestUrlParser("http://");
+ TestUrlParser("http://foo");
+ TestUrlParser("http://foo.bar");
+ TestUrlParser("http://foo.bar:");
+ TestUrlParser("http://foo.bar:1");
+ TestUrlParser("http://foo.bar:176");
+ TestUrlParser("http://foo.bar:176a");
+ TestUrlParser("http://foo.bar:176/");
+ TestUrlParser("http://foo.bar:176/blabla");
+ TestUrlParser("http://foo.bar:176/blabla/blibli");
+ TestUrlParser("http://foo.bar:176/blabla/blibli/");
+ TestUrlParser("http://foo.bar/");
+ TestUrlParser("http://foo.bar/blabla");
+#endif
+
+#if defined(TEST_CHUNKED)
+ TestHttpChunked("http://www.bok.net/cgi-bin/test/test-chunked.cgi");
+#endif
+
+#if defined(TEST_PROXY)
+ TestHttpGetWithProxy(argv[1]);
+#else
+ TestHttpGet(argv[1], SHOW_MODE_LOAD);
+ TestHttpGet(argv[1], SHOW_MODE_STREAM_BLOCKING);
+#endif
+
+#if defined(TEST_POST)
+ TestHttpPost(argv[1]);
+#endif
+
+#if defined(TEST_TIMEOUTS)
+ TestHttpTimeouts(argv[1]);
+#endif
+
+#if defined(WIN32) && defined(_DEBUG)
+ _CrtDumpMemoryLeaks();
+#endif
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/HttpClient2/HttpClientTest2.cpp b/lib/libUPnP/Neptune/Source/Tests/HttpClient2/HttpClientTest2.cpp
new file mode 100644
index 0000000..acdb8f5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/HttpClient2/HttpClientTest2.cpp
@@ -0,0 +1,253 @@
+/*****************************************************************
+|
+| HTTP Client Test Program 2
+|
+| (c) 2001-2011 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#define LOG_FORMAT "%30s,%3d,%8d, %8d, %8d, [%30s], %s\n"
+
+static NPT_HttpClient::Connector* HttpConnector = NULL;
+static NPT_TlsContext* TlsContext = NULL;
+
+/*----------------------------------------------------------------------
+| TestHttpGet
++---------------------------------------------------------------------*/
+static void
+TestHttpGet(const char* arg, bool use_http_1_1, int verbosity)
+{
+ const char* method = NPT_HTTP_METHOD_GET;
+ if (arg && arg[0] == '@') {
+ method = NPT_HTTP_METHOD_HEAD;
+ ++arg;
+ }
+ NPT_HttpUrl url(arg);
+ NPT_HttpRequest request(url, method);
+ NPT_HttpClient client;
+ NPT_HttpResponse* response;
+
+ if (!url.IsValid()) return;
+ if (use_http_1_1) request.SetProtocol(NPT_HTTP_PROTOCOL_1_1);
+ if (HttpConnector) client.SetConnector(HttpConnector);
+
+ NPT_TimeStamp before;
+ NPT_System::GetCurrentTimeStamp(before);
+ NPT_Result result = client.SendRequest(request, response);
+ NPT_TimeStamp after;
+ NPT_System::GetCurrentTimeStamp(after);
+ NPT_UInt64 elapsed = (after-before).ToMillis();
+ if (NPT_FAILED(result)) {
+ if (verbosity >= 1) printf(LOG_FORMAT, NPT_ResultText(result), 0, 0, 0, (int)elapsed, "", arg);
+ return;
+ }
+ int loaded = -1;
+ if (!NPT_StringsEqual(method, NPT_HTTP_METHOD_HEAD)) {
+ NPT_DataBuffer payload;
+ result = response->GetEntity()->Load(payload);
+ if (NPT_SUCCEEDED(result)) {
+ loaded = (int)payload.GetDataSize();
+ }
+ } else {
+ loaded = 0;
+ }
+ const NPT_String* server = response->GetHeaders().GetHeaderValue("Server");
+ if (verbosity >= 1) {
+ NPT_LargeSize entity_size = response->GetEntity()?response->GetEntity()->GetContentLength():0;
+ printf(LOG_FORMAT, "NPT_SUCCESS", response->GetStatusCode(), loaded, (int)entity_size, (int)elapsed, server?server->GetChars():"", arg);
+ }
+
+ delete response;
+}
+
+/*----------------------------------------------------------------------
+| TestHttpPost
++---------------------------------------------------------------------*/
+static void
+TestHttpPost(const char* arg, bool use_http_1_1, unsigned int verbosity)
+{
+ NPT_HttpUrl url(arg);
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_POST);
+ NPT_HttpClient client;
+ NPT_HttpResponse* response;
+
+ if (!url.IsValid()) return;
+ if (use_http_1_1) request.SetProtocol(NPT_HTTP_PROTOCOL_1_1);
+
+ NPT_HttpEntity* entity = new NPT_HttpEntity();
+ entity->SetInputStream("blabla");
+ request.SetEntity(entity);
+ request.GetHeaders().SetHeader("Expect", "100-continue");
+
+ NPT_TimeStamp before;
+ NPT_System::GetCurrentTimeStamp(before);
+ NPT_Result result = client.SendRequest(request, response);
+ NPT_TimeStamp after;
+ NPT_System::GetCurrentTimeStamp(after);
+ NPT_UInt64 elapsed = (after-before).ToMillis();
+ if (NPT_FAILED(result)) {
+ if (verbosity >= 1) printf(LOG_FORMAT, NPT_ResultText(result), 0, 0, 0, (int)elapsed, "", arg);
+ return;
+ }
+ NPT_DataBuffer payload;
+ result = response->GetEntity()->Load(payload);
+ int loaded = -1;
+ if (NPT_SUCCEEDED(result)) {
+ loaded = (int)payload.GetDataSize();
+ }
+ const NPT_String* server = response->GetHeaders().GetHeaderValue("Server");
+ if (verbosity >= 1) printf(LOG_FORMAT, "NPT_SUCCESS", response->GetStatusCode(), loaded, (int)response->GetEntity()->GetContentLength(), (int)elapsed, server?server->GetChars():"", arg);
+
+ delete response;
+}
+
+/*----------------------------------------------------------------------
+| ClientThread
++---------------------------------------------------------------------*/
+class ClientThread : public NPT_Thread
+{
+public:
+ ClientThread(const char* name,
+ const char* playlist,
+ bool use_http_1_1,
+ unsigned int loops,
+ bool random,
+ bool post,
+ unsigned int sleep,
+ unsigned int verbosity) :
+ m_Name(name),
+ m_Playlist(playlist),
+ m_UseHttp_1_1(use_http_1_1),
+ m_Loops(loops),
+ m_Random(random),
+ m_Post(post),
+ m_Sleep(sleep),
+ m_Verbosity(verbosity) {}
+
+ virtual void Run();
+
+private:
+ NPT_String m_Name;
+ NPT_String m_Playlist;
+ bool m_UseHttp_1_1;
+ unsigned int m_Loops;
+ bool m_Random;
+ bool m_Post;
+ unsigned int m_Sleep;
+ unsigned int m_Verbosity;
+};
+
+/*----------------------------------------------------------------------
+| ClientThread::Run
++---------------------------------------------------------------------*/
+void
+ClientThread::Run()
+{
+ NPT_DataBuffer list_buffer;
+ NPT_String list_string;
+ if (NPT_File::Exists(m_Playlist)) {
+ NPT_File::Load(m_Playlist, list_buffer);
+ list_string.Assign((const char*)list_buffer.GetData(), list_buffer.GetDataSize());
+ } else {
+ list_string = m_Playlist;
+ }
+ NPT_List<NPT_String> urls = list_string.Split("\n");
+ if (m_Verbosity >= 2) printf("urls: %d\n", urls.GetItemCount());
+ if (m_Verbosity >= 2) printf("loops: %d, random: %s, sleep: %d ms\n", m_Loops, m_Random?"true":"false", m_Sleep);
+ for (unsigned int i=0; i<m_Loops; i++) {
+ NPT_TimeStamp before;
+ NPT_System::GetCurrentTimeStamp(before);
+ for (unsigned int j=0; j<urls.GetItemCount(); j++) {
+ unsigned int choice = j;
+ if (m_Random) {
+ choice = NPT_System::GetRandomInteger()%urls.GetItemCount();
+ }
+ if (m_Post) {
+ TestHttpPost((*urls.GetItem(choice)).GetChars(), m_UseHttp_1_1, m_Verbosity);
+ } else {
+ TestHttpGet((*urls.GetItem(choice)).GetChars(), m_UseHttp_1_1, m_Verbosity);
+ }
+
+ if (m_Sleep) {
+ NPT_System::Sleep(NPT_TimeStamp(((float)m_Sleep)/1000.0f));
+ }
+ }
+ NPT_TimeStamp after;
+ NPT_System::GetCurrentTimeStamp(after);
+ float elapsed = (float)(after-before);
+ if (m_Verbosity >= 1) printf("%s [%04d] TOTAL time elapsed = %d ms\n", m_Name.GetChars(), i, (int)(elapsed*1000.0));
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // parse args
+ --argc; ++argv;
+ bool use_http_1_1 = false;
+ unsigned int loops = 1;
+ bool random = false;
+ bool post = false;
+ unsigned int sleep = 0;
+ unsigned int threads = 1;
+ unsigned int verbosity = 1;
+ while (*argv) {
+ if (NPT_StringsEqual(*argv, "--http-1-1")) {
+ use_http_1_1 = true;
+ } else if (NPT_StringsEqual(*argv, "--loops")) {
+ NPT_ParseInteger(*++argv, loops);
+ } else if (NPT_StringsEqual(*argv, "--post")) {
+ post = true;
+ } else if (NPT_StringsEqual(*argv, "--random")) {
+ random = true;
+ } else if (NPT_StringsEqual(*argv, "--sleep")) {
+ NPT_ParseInteger(*++argv, sleep);
+ } else if (NPT_StringsEqual(*argv, "--verbosity")) {
+ NPT_ParseInteger(*++argv, verbosity);
+ } else if (NPT_StringsEqual(*argv, "--threads")) {
+ NPT_ParseInteger(*++argv, threads);
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ } else if (NPT_StringsEqual(*argv, "--no-cert-check")) {
+ TlsContext = new NPT_TlsContext(NPT_TlsContext::OPTION_VERIFY_LATER | NPT_TlsContext::OPTION_ADD_DEFAULT_TRUST_ANCHORS);
+ HttpConnector = new NPT_HttpTlsConnector(*TlsContext, NPT_HttpTlsConnector::OPTION_ACCEPT_SELF_SIGNED_CERTS | NPT_HttpTlsConnector::OPTION_ACCEPT_HOSTNAME_MISMATCH);
+#endif
+ } else {
+ break;
+ }
+ ++argv;
+ }
+ if (*argv == NULL) {
+ fprintf(stderr, "ERROR: missing URL or list filename\n");
+ return 1;
+ }
+
+ NPT_Array<ClientThread*> cthreads;
+ cthreads.Resize(threads);
+ for (unsigned int i=0; i<threads; i++) {
+ NPT_String name = "THREAD ";
+ name += NPT_String::FromInteger(i);
+ ClientThread* thread = new ClientThread(name, *argv, use_http_1_1, loops, random, post, sleep, verbosity);
+ cthreads[i] = thread;
+ thread->Start();
+ }
+
+ for (unsigned int i=0; i<threads; i++) {
+ cthreads[i]->Wait();
+ delete cthreads[i];
+ }
+
+ delete TlsContext;
+ delete HttpConnector;
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/HttpServer1/HttpServerTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/HttpServer1/HttpServerTest1.cpp
new file mode 100644
index 0000000..2537f71
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/HttpServer1/HttpServerTest1.cpp
@@ -0,0 +1,272 @@
+/*****************************************************************
+|
+| HTTP Server Test Program 1
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+bool KillRequest = false;
+
+/*----------------------------------------------------------------------
+| KillHandler
++---------------------------------------------------------------------*/
+class KillHandler : public NPT_HttpRequestHandler
+{
+public:
+ NPT_Result SetupResponse(NPT_HttpRequest& /*request*/,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& response) {
+ NPT_HttpEntity* entity = response.GetEntity();
+ entity->SetContentType("text/html");
+ entity->SetInputStream("<html><body>Bye Bye!</body></html>");
+ KillRequest = true;
+
+ return NPT_SUCCESS;
+ }
+};
+
+/*----------------------------------------------------------------------
+| TestHandler1
++---------------------------------------------------------------------*/
+class TestHandler1 : public NPT_HttpRequestHandler
+{
+public:
+ TestHandler1(bool chunked = false) : m_Chunked(chunked) {}
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) {
+ NPT_String msg = "<HTML>";
+ msg += "PATH=";
+ msg += request.GetUrl().GetPath();
+ msg += "<P><B>Local Address:</B> ";
+ msg += context.GetLocalAddress().ToString();
+ msg += "<P>";
+ msg += "<B>Remote Address:</B> ";
+ msg += context.GetRemoteAddress().ToString();
+ msg += "<P><UL>";
+ if (request.GetUrl().HasQuery()) {
+ NPT_UrlQuery query(request.GetUrl().GetQuery());
+ for (NPT_List<NPT_UrlQuery::Field>::Iterator it = query.GetFields().GetFirstItem();
+ it;
+ ++it) {
+ NPT_UrlQuery::Field& field = *it;
+ msg += "<LI>";
+ msg += field.m_Name;
+ msg += " = ";
+ msg += field.m_Value;
+ msg += " </LI>";
+
+ // check for a 'delay' field
+ if (field.m_Name == "delay") {
+ NPT_UInt32 delay = 0;
+ field.m_Value.ToInteger(delay);
+ NPT_Debug("DELAY: %d seconds\n", delay);
+ NPT_System::Sleep(NPT_TimeInterval((float)delay));
+ }
+ }
+ }
+ msg += "</UL></HTML>";
+
+
+ if (request.GetMethod() == NPT_HTTP_METHOD_POST) {
+ NPT_DataBuffer request_body;
+ request.GetEntity()->Load(request_body);
+ NPT_Debug("REQUEST: body = %d bytes\n", request_body.GetDataSize());
+ NPT_Debug("REQUEST: content type = %s\n", request.GetEntity()->GetContentType().GetChars());
+ if (request.GetEntity()->GetContentType().StartsWith("text") ||
+ request.GetEntity()->GetContentType() == "application/x-www-form-urlencoded") {
+ NPT_String body_string;
+ body_string.Assign((char*)request_body.GetData(), request_body.GetDataSize());
+ NPT_Debug("%s", body_string.GetChars());
+ }
+ }
+
+ NPT_HttpEntity* entity = response.GetEntity();
+ entity->SetContentType("text/html");
+ entity->SetInputStream(msg);
+
+ if (m_Chunked) {
+ entity->SetTransferEncoding(NPT_HTTP_TRANSFER_ENCODING_CHUNKED);
+ entity->SetContentLength(0);
+ }
+
+ return NPT_SUCCESS;
+ }
+
+ bool m_Chunked;
+};
+
+/*----------------------------------------------------------------------
+| TestHandler2
++---------------------------------------------------------------------*/
+class TestHandler2 : public NPT_HttpRequestHandler
+{
+public:
+ NPT_Result SetupResponse(NPT_HttpRequest& /*request*/,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& response) {
+ NPT_HttpEntity* entity = response.GetEntity();
+ entity->SetContentType("text/html");
+ return NPT_SUCCESS;
+ }
+
+ NPT_Result SendResponseBody(const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& /*response*/,
+ NPT_OutputStream& output) {
+ output.WriteString("<html><body>\r\n");
+ for (unsigned int i=0; i<30; i++) {
+ output.WriteString("Line ");
+ output.WriteString(NPT_String::FromInteger(i).GetChars());
+ output.WriteString("\r\n");
+ output.Flush();
+ NPT_System::Sleep(NPT_TimeInterval(0.2f));
+ }
+ output.WriteString("</body></html>\r\n");
+ return NPT_SUCCESS;
+ }
+};
+
+/*----------------------------------------------------------------------
+| ChunkedHandler
++---------------------------------------------------------------------*/
+class ChunkedHandler : public NPT_HttpRequestHandler
+{
+public:
+ NPT_Result SetupResponse(NPT_HttpRequest& /*request*/,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& response) {
+ NPT_HttpEntity* entity = response.GetEntity();
+ entity->SetContentType("text/html");
+ entity->SetTransferEncoding("chunked");
+ response.SetProtocol(NPT_HTTP_PROTOCOL_1_1);
+ return NPT_SUCCESS;
+ }
+
+ NPT_Result SendResponseBody(const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& /*response*/,
+ NPT_OutputStream& output) {
+ NPT_HttpChunkedOutputStream chunker(output);
+ chunker.WriteString("<html><body>\r\n");
+ for (unsigned int i=0; i<30; i++) {
+ NPT_String line = "Line ";
+ line += NPT_String::FromInteger(i).GetChars();
+ chunker.WriteString(line.GetChars());
+ chunker.Flush();
+ NPT_System::Sleep(NPT_TimeInterval(0.2f));
+ }
+ chunker.WriteString("</body></html>\r\n");
+ return NPT_SUCCESS;
+ }
+};
+
+/*----------------------------------------------------------------------
+| TestHttp
++---------------------------------------------------------------------*/
+static NPT_Result
+TestHttp()
+{
+ NPT_HttpServer server(1234);
+ NPT_InputStreamReference input;
+ NPT_OutputStreamReference output;
+ NPT_HttpRequestContext context;
+
+ NPT_HttpStaticRequestHandler* static_handler = new NPT_HttpStaticRequestHandler(
+ "<html><body>"
+ "<h1>Neptune HTTP Server Test 1</h1>"
+ "<a href='/files-autodir'>List files working directory (autodir)</a><br>"
+ "<a href='/files'>List files working directory (no autodir)</a><br>"
+ "<a href='/test1'>Test 1</a><br>"
+ "<a href='/test2'>Test 2</a><br>"
+ "<a href='/chunked1'>Chunked 1</a><br>"
+ "<a href='/chunked2'>Chunked 2</a><br>"
+ "<a href='/kill'>Kill Test Server</a><br>"
+ "</body></html>",
+ "text/html");
+ server.AddRequestHandler(static_handler, "/", false);
+
+ KillHandler* kill_handler = new KillHandler();
+ server.AddRequestHandler(kill_handler, "/kill", false);
+
+ TestHandler1* test_handler1 = new TestHandler1();
+ server.AddRequestHandler(test_handler1, "/test1", false);
+
+ TestHandler2* test_handler2 = new TestHandler2();
+ server.AddRequestHandler(test_handler2, "/test2", false);
+
+ ChunkedHandler* chunked_handler1 = new ChunkedHandler();
+ server.AddRequestHandler(chunked_handler1, "/chunked1", false);
+
+ TestHandler1* chunked_handler2 = new TestHandler1(true);
+ server.AddRequestHandler(chunked_handler2, "/chunked2", false);
+
+ NPT_String cwd;
+ NPT_File::GetWorkingDir(cwd);
+ NPT_HttpFileRequestHandler* file_handler_autodir = new NPT_HttpFileRequestHandler("/files-autodir", cwd.GetChars(), true);
+ server.AddRequestHandler(file_handler_autodir, "/files-autodir", true);
+ NPT_HttpFileRequestHandler* file_handler_noautodir = new NPT_HttpFileRequestHandler("/files", cwd.GetChars(), false);
+ server.AddRequestHandler(file_handler_noautodir, "/files", true);
+
+ do {
+ NPT_Console::Output("Test HTTP server waiting for connection on port 1234...\n");
+ NPT_Result result = server.WaitForNewClient(input,
+ output,
+ &context);
+ NPT_Console::OutputF("WaitForNewClient returned %d (%s)\n", result, NPT_ResultText(result));
+ if (NPT_FAILED(result)) return result;
+
+ result = server.RespondToClient(input, output, context);
+ NPT_Console::OutputF("RespondToClient returned %d (%s)\n", result, NPT_ResultText(result));
+
+ input = NULL;
+ output = NULL;
+ } while (!KillRequest);
+
+ NPT_Console::OutputF("Killing Server\n");
+
+ delete static_handler;
+ delete test_handler1;
+ delete test_handler2;
+ delete file_handler_autodir;
+ delete file_handler_noautodir;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ // setup debugging
+#if defined(WIN32) && defined(_DEBUG)
+ int flags = _crtDbgFlag |
+ _CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_DELAY_FREE_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF;
+
+ _CrtSetDbgFlag(flags);
+ //AllocConsole();
+ //freopen("CONOUT$", "w", stdout);
+#endif
+
+ TestHttp();
+
+#if defined(WIN32) && defined(_DEBUG)
+ _CrtDumpMemoryLeaks();
+#endif
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Lists1/ListsTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Lists1/ListsTest1.cpp
new file mode 100644
index 0000000..22a8808
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Lists1/ListsTest1.cpp
@@ -0,0 +1,220 @@
+/*****************************************************************
+|
+| Lists Test Program 1
+|
+| (c) 2005-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Neptune.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static unsigned int A_Count = 0;
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+class A {
+public:
+ A() : _a(0), _b(0), _c(&_a) {
+ printf("A::A()\n");
+ A_Count++;
+ }
+ A(int a, char b) : _a(a), _b(b), _c(&_a) {
+ printf("A::A(%d, %d)\n", a, b);
+ A_Count++;
+ }
+ A(const A& other) : _a(other._a), _b(other._b), _c(&_a) {
+ printf("A::A(copy: a=%d, b=%d)\n", _a, _b);
+ A_Count++;
+ }
+ ~A() {
+ printf("A::~A(), a=%d, b=%d\n", _a, _b);
+ A_Count--;
+ }
+ bool Check() { return _c == &_a; }
+ bool operator==(const A& other) const {
+ return _a == other._a && _b == other._b;
+ }
+ int _a;
+ char _b;
+ int* _c;
+};
+
+static int ApplyCounter = 0;
+class Test1 {
+public:
+ NPT_Result operator()(const A& a) const {
+ ApplyCounter++;
+ A aa(3,4);
+ if (a == aa) return NPT_ERROR_OUT_OF_MEMORY;
+ return NPT_SUCCESS;
+ }
+};
+
+#define CHECK(x) { \
+ if (!(x)) { \
+ printf("TEST FAILED line %d\n", __LINE__); \
+ return 1; \
+ } \
+}
+
+/*----------------------------------------------------------------------
+| compare
++---------------------------------------------------------------------*/
+static int
+compare(NPT_UInt32 a, NPT_UInt32 b)
+{
+ return (a==b)?0:(a<b)?-1:1;
+}
+
+/*----------------------------------------------------------------------
+| SortTest
++---------------------------------------------------------------------*/
+static int
+SortTest()
+{
+ for (unsigned int i=0; i<10000; i++) {
+ unsigned int list_size = 1+NPT_System::GetRandomInteger()%100;
+ NPT_List<NPT_UInt32> list;
+ for (unsigned int j=0; j<list_size; j++) {
+ list.Add(NPT_System::GetRandomInteger()%(2*list_size));
+ }
+ CHECK(NPT_SUCCEEDED(list.Sort(compare)));
+ NPT_UInt32 value = 0;
+ for (unsigned int j=0; j<list_size; j++) {
+ NPT_UInt32 cursor = 0;
+ list.Get(j, cursor);
+ CHECK(cursor >= value);
+ value = cursor;
+ }
+ }
+
+ return 0;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ if (SortTest()) return 1;
+
+ NPT_List<A> a_list;
+ a_list.Add(A(1,2));
+ a_list.Add(A(2,3));
+ a_list.Add(A(3,4));
+ CHECK(a_list.GetItemCount() == 3);
+ CHECK(a_list.Contains(A(2,3)));
+ CHECK(!a_list.Contains(A(7,8)));
+ A a;
+ CHECK(NPT_SUCCEEDED(a_list.PopHead(a)));
+ CHECK(a == A(1,2));
+ CHECK(a_list.GetItemCount() == 2);
+ CHECK(NPT_SUCCEEDED(a_list.Get(0, a)));
+ CHECK(a == A(2,3));
+ A* pa = NULL;
+ CHECK(NPT_SUCCEEDED(a_list.Get(0,pa)));
+ CHECK(pa != NULL);
+ CHECK(*pa == A(2,3));
+ CHECK(a_list.GetItem(1) == ++a_list.GetFirstItem());
+
+ a_list.Clear();
+ CHECK(a_list.GetItemCount() == 0);
+ a_list.Insert(a_list.GetFirstItem(), A(7,9));
+ CHECK(a_list.GetItemCount() == 1);
+ CHECK(*a_list.GetFirstItem() == A(7,9));
+
+ a_list.Add(A(1, 2));
+ CHECK(a_list.GetItemCount() == 2);
+ CHECK(A_Count == 3);
+ CHECK(*a_list.GetFirstItem() == A(7,9));
+ CHECK(*a_list.GetLastItem() == A(1,2));
+
+ a_list.Insert(a_list.GetLastItem(), A(3,4));
+ CHECK(a_list.GetItemCount() == 3);
+ CHECK(*a_list.GetLastItem() == A(1,2));
+
+ // test ApplyUntil
+ ApplyCounter = 0;
+ bool applied;
+ NPT_Result result = a_list.ApplyUntil(Test1(), NPT_UntilResultEquals(NPT_ERROR_OUT_OF_MEMORY), &applied);
+ CHECK(applied == true);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(ApplyCounter == 2);
+
+ ApplyCounter = 0;
+ result = a_list.ApplyUntil(Test1(), NPT_UntilResultNotEquals(NPT_SUCCESS), &applied);
+ CHECK(applied == true);
+ CHECK(result == NPT_ERROR_OUT_OF_MEMORY);
+ CHECK(ApplyCounter == 2);
+
+ ApplyCounter = 0;
+ result = a_list.ApplyUntil(Test1(), NPT_UntilResultEquals(NPT_FAILURE), &applied);
+ CHECK(applied == false);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(ApplyCounter == 3);
+
+ a_list.Insert(NPT_List<A>::Iterator(NULL), A(3,4));
+ CHECK(a_list.GetItemCount() == 4);
+ CHECK(*a_list.GetLastItem() == A(3,4));
+
+ a_list.Insert(a_list.GetFirstItem(), A(7,8));
+ CHECK(a_list.GetItemCount() == 5);
+ CHECK(*a_list.GetFirstItem() == A(7,8));
+
+ a_list.Insert(a_list.GetItem(2), A(9,10));
+ CHECK(a_list.GetItemCount() == 6);
+ CHECK(*a_list.GetItem(2) == A(9,10));
+
+ a_list.Erase(a_list.GetItem(1));
+ CHECK(a_list.GetItemCount() == 5);
+ CHECK(*a_list.GetItem(1) == A(9,10));
+ CHECK(A_Count == 1+a_list.GetItemCount());
+
+ NPT_List<int> i1_list;
+ NPT_List<int> i2_list;
+ CHECK(i1_list == i2_list);
+ i1_list.Add(3);
+ CHECK(i1_list != i2_list);
+ CHECK(!(i1_list == i2_list));
+ i2_list.Add(3);
+ CHECK(i1_list == i2_list);
+ i2_list.Add(4);
+ CHECK(i1_list != i2_list);
+ i1_list.Add(4);
+ i1_list.Add(5);
+ i2_list.Add(6);
+ CHECK(i1_list != i2_list);
+
+
+ // NPT_Stack test
+ NPT_Stack<int> i_stack;
+ int i=0;
+ CHECK(NPT_FAILED(i_stack.Pop(i)));
+ CHECK(NPT_FAILED(i_stack.Peek(i)));
+ CHECK(NPT_SUCCEEDED(i_stack.Push(4)));
+ CHECK(NPT_SUCCEEDED(i_stack.Push(5)));
+ CHECK(NPT_SUCCEEDED(i_stack.Push(6)));
+ CHECK(NPT_SUCCEEDED(i_stack.Pop(i)));
+ CHECK(i == 6);
+ CHECK(NPT_SUCCEEDED(i_stack.Peek(i)));
+ CHECK(i == 5);
+ CHECK(NPT_SUCCEEDED(i_stack.Pop(i)));
+ CHECK(i == 5);
+ CHECK(NPT_SUCCEEDED(i_stack.Pop(i)));
+ CHECK(i == 4);
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Logging1/LoggingTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Logging1/LoggingTest1.cpp
new file mode 100644
index 0000000..428e279
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Logging1/LoggingTest1.cpp
@@ -0,0 +1,181 @@
+/*****************************************************************
+|
+| File: LoggingTest.c
+|
+| Atomix Tests - Logging Test
+|
+| (c) 2002-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+NPT_DEFINE_LOGGER(MyLogger, "neptune.test.my")
+NPT_DEFINE_LOGGER(FooLogger, "neptune.test.foo")
+NPT_SET_LOCAL_LOGGER("neptune.test")
+
+/*----------------------------------------------------------------------
+| TestCheck functions
++---------------------------------------------------------------------*/
+static NPT_Result TestCheck(void)
+{
+ NPT_CHECK_L(NPT_LOG_LEVEL_WARNING, NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckSevere(void)
+{
+ NPT_CHECK_SEVERE(NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckWarning(void)
+{
+ NPT_CHECK_WARNING(NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckInfo(void)
+{
+ NPT_CHECK_INFO(NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckFine(void)
+{
+ NPT_CHECK_FINE(NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckFiner(void)
+{
+ NPT_CHECK_FINER(NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckFinest(void)
+{
+ NPT_CHECK_FINEST(NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+
+static NPT_Result TestCheckL(void)
+{
+ NPT_CHECK_LL(FooLogger, NPT_LOG_LEVEL_WARNING, NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckSevereL(void)
+{
+ NPT_CHECK_SEVERE(NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckWarningL(void)
+{
+ NPT_CHECK_WARNING_L(FooLogger, NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckInfoL(void)
+{
+ NPT_CHECK_INFO_L(FooLogger, NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckFineL(void)
+{
+ NPT_CHECK_FINE_L(FooLogger, NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckFinerL(void)
+{
+ NPT_CHECK_FINER_L(FooLogger, NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+static NPT_Result TestCheckFinestL(void)
+{
+ NPT_CHECK_FINEST_L(FooLogger, NPT_FAILURE);
+ NPT_LOG_SEVERE("###");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| TestLargeBuffer
++---------------------------------------------------------------------*/
+static void
+TestLargeBuffer(void)
+{
+ char* buffer = new char[32768];
+ int i;
+ for (i=0; i<32768; i++) {
+ buffer[i] = 'a';
+ }
+ buffer[32767] = 0;
+ NPT_LOG_SEVERE_1("%s", buffer);
+ delete[] buffer;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int, char**)
+{
+ NPT_LOG_L(MyLogger, NPT_LOG_LEVEL_WARNING, "blabla");
+ NPT_LOG_L2(MyLogger, NPT_LOG_LEVEL_WARNING, "blabla %d %d", 8, 9);
+
+ NPT_LOG(NPT_LOG_LEVEL_WARNING, "blibli");
+ NPT_LOG_2(NPT_LOG_LEVEL_INFO, "fofo %d %d", 5, 7);
+
+ NPT_LOG_SEVERE("this is severe!");
+ NPT_LOG_SEVERE_1("this is severe (%d)", 9);
+
+ NPT_LOG_SEVERE_L(MyLogger, "this is severe!");
+ NPT_LOG_SEVERE_L1(MyLogger, "this is severe (%d)", 9);
+
+ NPT_LOG_SEVERE_L(FooLogger, "this is severe!");
+ NPT_LOG_SEVERE_L1(FooLogger, "this is severe (%d)", 9);
+
+ NPT_LOG_SEVERE("severe");
+ NPT_LOG_WARNING("warning");
+ NPT_LOG_INFO("info");
+ NPT_LOG_FINE("fine");
+ NPT_LOG_FINER("finer");
+ NPT_LOG_FINEST("finest");
+
+ NPT_LOG_SEVERE_L(FooLogger, "severe");
+ NPT_LOG_WARNING_L(FooLogger, "warning");
+ NPT_LOG_INFO_L(FooLogger, "info");
+ NPT_LOG_FINE_L(FooLogger, "fine");
+ NPT_LOG_FINER_L(FooLogger, "finer");
+ NPT_LOG_FINEST_L(FooLogger, "finest");
+
+ TestLargeBuffer();
+
+ TestCheck();
+ TestCheckSevere();
+ TestCheckWarning();
+ TestCheckInfo();
+ TestCheckFine();
+ TestCheckFiner();
+ TestCheckFinest();
+
+ TestCheckL();
+ TestCheckSevereL();
+ TestCheckWarningL();
+ TestCheckInfoL();
+ TestCheckFineL();
+ TestCheckFinerL();
+ TestCheckFinestL();
+
+ return 0;
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Tests/Logging2/LoggingTest2.cpp b/lib/libUPnP/Neptune/Source/Tests/Logging2/LoggingTest2.cpp
new file mode 100644
index 0000000..ee430c1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Logging2/LoggingTest2.cpp
@@ -0,0 +1,60 @@
+/*****************************************************************
+|
+| File: LoggingTest2.c
+|
+| Atomix Tests - Logging Test
+|
+| (c) 2002-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int, char**)
+{
+ NPT_LogManager::GetDefault().Configure("plist:hop.level=INFO;");
+
+ NPT_HttpLoggerConfigurator* server = new NPT_HttpLoggerConfigurator();
+ server->Start();
+
+ NPT_Logger* loggers[16];
+ loggers[ 0] = NPT_LogManager::GetLogger("test.log.one");
+ loggers[ 1] = NPT_LogManager::GetLogger("test.log.two");
+ loggers[ 2] = NPT_LogManager::GetLogger("test.log.three");
+ loggers[ 3] = NPT_LogManager::GetLogger("test.foo.bla.bli");
+ loggers[ 4] = NPT_LogManager::GetLogger("test.bar");
+ loggers[ 5] = NPT_LogManager::GetLogger("test.bar.one");
+ loggers[ 6] = NPT_LogManager::GetLogger("test.bar.two");
+ loggers[ 7] = NPT_LogManager::GetLogger("test.bar.three");
+ loggers[ 8] = NPT_LogManager::GetLogger("hop");
+ loggers[ 9] = NPT_LogManager::GetLogger("hop.hop.hop.boom");
+ loggers[10] = NPT_LogManager::GetLogger("kiki");
+ loggers[11] = NPT_LogManager::GetLogger("koko");
+ loggers[12] = NPT_LogManager::GetLogger("kaka.coucou");
+ loggers[13] = NPT_LogManager::GetLogger("kaka.test.coucou");
+ loggers[14] = NPT_LogManager::GetLogger("kaka.kaka");
+ loggers[15] = NPT_LogManager::GetLogger("kuku");
+
+ for (;;) {
+ NPT_System::Sleep(NPT_TimeInterval(1.0f));
+ for (unsigned int i=0; i<sizeof(loggers)/sizeof(loggers[0]); i++) {
+ NPT_LoggerReference logger = { loggers[i], "test" };
+ int level = NPT_System::GetRandomInteger()%800;
+ NPT_LOG_L2(logger, level, "hello from logger %d, level %d", i, level);
+ }
+ }
+
+ server->Wait();
+ delete server;
+
+ return 0;
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Tests/Maps1/MapsTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Maps1/MapsTest1.cpp
new file mode 100644
index 0000000..329cd62
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Maps1/MapsTest1.cpp
@@ -0,0 +1,395 @@
+/*****************************************************************
+|
+| Maps Test Program 1
+|
+| (c) 2005-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Neptune.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static unsigned int A_Count = 0;
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+class A {
+public:
+ A() : _a(0), _b(0), _c(&_a) {
+ A_Count++;
+ }
+ A(int a, char b) : _a(a), _b(b), _c(&_a) {
+ A_Count++;
+ }
+ A(const A& other) : _a(other._a), _b(other._b), _c(&_a) {
+ A_Count++;
+ }
+ ~A() {
+ A_Count--;
+ }
+ bool Check() { return _c == &_a; }
+ bool operator==(const A& other) const {
+ return _a == other._a && _b == other._b;
+ }
+ int _a;
+ char _b;
+ int* _c;
+};
+
+#define CHECK(x) { \
+ if (!(x)) { \
+ printf("TEST FAILED line %d\n", __LINE__); \
+ return 1; \
+ } \
+}
+
+/*----------------------------------------------------------------------
+| TestPerformance
++---------------------------------------------------------------------*/
+static void
+TestPerformance()
+{
+ for (unsigned int i=1; i<10000; i += 1000) {
+ NPT_TimeStamp before;
+ NPT_System::GetCurrentTimeStamp(before);
+ for (unsigned int j=0; j<10; j++) {
+ NPT_Map<NPT_String, NPT_String> map;
+ for (unsigned int k=0; k<i; k++) {
+ char key[64] = "blablabliblibloublou";
+ unsigned int run = NPT_System::GetRandomInteger()%8;
+ for (unsigned int x=0; x<run; x++) {
+ key[x] = 'A'+NPT_System::GetRandomInteger()%32;
+ }
+ map[key] = "hello";
+ }
+ }
+ NPT_TimeStamp after;
+ NPT_System::GetCurrentTimeStamp(after);
+ NPT_UInt64 duration = (after.ToNanos()-before.ToNanos())/10;
+ printf("LinearMap insert: %d\t%d ns\t\t%d ns/item\n", i, (NPT_UInt32)duration, (NPT_UInt32)(duration/i));
+ }
+
+ for (unsigned int i=1; i<10000; i += 1000) {
+ NPT_TimeStamp before;
+ NPT_System::GetCurrentTimeStamp(before);
+ for (unsigned int j=0; j<100; j++) {
+ NPT_HashMap<NPT_String, NPT_String> map;
+ for (unsigned int k=0; k<i; k++) {
+ char key[64] = "blablabliblibloublou";
+ unsigned int run = NPT_System::GetRandomInteger()%8;
+ for (unsigned int x=0; x<run; x++) {
+ key[x] = 'A'+NPT_System::GetRandomInteger()%32;
+ }
+ map[key] = "hello";
+ }
+ }
+ NPT_TimeStamp after;
+ NPT_System::GetCurrentTimeStamp(after);
+ NPT_UInt64 duration = (after.ToNanos()-before.ToNanos())/100;
+ printf("HashMap insert: %d\t%d ns\t\t%d ns/item\n", i, (NPT_UInt32)duration, (NPT_UInt32)(duration/i));
+ }
+
+ for (unsigned int i=1; i<10000; i += 1000) {
+ NPT_TimeStamp before;
+ NPT_System::GetCurrentTimeStamp(before);
+ for (unsigned int j=0; j<100; j++) {
+ NPT_HashMap<NPT_String, NPT_String> map;
+ for (unsigned int k=0; k<i; k++) {
+ char key[64] = "blablabliblibloublou";
+ unsigned int run = NPT_System::GetRandomInteger()%8;
+ for (unsigned int x=0; x<run; x++) {
+ key[x] = 'A'+NPT_System::GetRandomInteger()%32;
+ }
+ map[key] = "hello";
+ }
+ for (unsigned int k=0; k<i; k++) {
+ char key[64] = "blablabliblibloublou";
+ unsigned int run = NPT_System::GetRandomInteger()%8;
+ for (unsigned int x=0; x<run; x++) {
+ key[x] = 'A'+NPT_System::GetRandomInteger()%32;
+ }
+ map.Erase(key);
+ }
+ }
+ NPT_TimeStamp after;
+ NPT_System::GetCurrentTimeStamp(after);
+ NPT_UInt64 duration = (after.ToNanos()-before.ToNanos())/100;
+ printf("HashMap insert+erase: %d\t%d ns\t\t%d ns/item\n", i, (NPT_UInt32)duration, (NPT_UInt32)(duration/i));
+ }
+}
+
+/*----------------------------------------------------------------------
+| TestMap
++---------------------------------------------------------------------*/
+static int
+TestMap()
+{
+ NPT_Map<NPT_String,A> a_map;
+ A* a = NULL;
+
+ CHECK(a_map.GetEntryCount() == 0);
+ CHECK(a_map.HasKey("hello") == false);
+ CHECK(!a_map.HasValue(A(1,2)));
+ CHECK(NPT_FAILED(a_map.Get("bla", a)));
+ CHECK(a == NULL);
+
+ a_map.Put("hello", A(1,2));
+ CHECK(a_map.GetEntryCount() == 1);
+ CHECK(NPT_SUCCEEDED(a_map.Get("hello", a)));
+ CHECK(*a == A(1,2));
+ CHECK(a_map.HasKey("hello"));
+ CHECK(a_map.HasValue(A(1,2)));
+ CHECK(a_map["hello"] == A(1,2));
+
+ CHECK(a_map["bla"] == A());
+ CHECK(a_map.GetEntryCount() == 2);
+ a_map["bla"] = A(3,4);
+ CHECK(a_map["bla"] == A(3,4));
+ CHECK(a_map.GetEntryCount() == 2);
+
+ NPT_Map<NPT_String,A> b_map;
+ b_map["hello"] = A(1,2);
+ b_map["bla"] = A(3,4);
+ CHECK(a_map == b_map);
+
+ NPT_Map<NPT_String,A> c_map = a_map;
+ CHECK(c_map["hello"] == a_map["hello"]);
+ CHECK(c_map["bla"] == a_map["bla"]);
+
+ CHECK(NPT_SUCCEEDED(a_map.Put("bla", A(5,6))));
+ CHECK(NPT_SUCCEEDED(a_map.Get("bla", a)));
+ CHECK(*a == A(5,6));
+ CHECK(NPT_FAILED(a_map.Get("youyou", a)));
+
+ b_map.Clear();
+ CHECK(b_map.GetEntryCount() == 0);
+
+ a_map["youyou"] = A(6,7);
+ CHECK(NPT_FAILED(a_map.Erase("coucou")));
+ CHECK(NPT_SUCCEEDED(a_map.Erase("bla")));
+ CHECK(!a_map.HasKey("bla"));
+
+ CHECK(!(a_map == c_map));
+ CHECK(c_map != a_map);
+
+ c_map = a_map;
+ NPT_Map<NPT_String,A> d_map(c_map);
+ CHECK(d_map == c_map);
+
+ NPT_Map<int,int> i_map;
+ i_map[5] = 6;
+ i_map[6] = 7;
+ i_map[9] = 0;
+ CHECK(i_map[0] == 0 || i_map[0] != 0); // unknown value (will cause a valgrind warning)
+ CHECK(i_map.GetEntryCount() == 4);
+
+ NPT_Map<NPT_String,A> a1_map;
+ NPT_Map<NPT_String,A> a2_map;
+ a1_map["hello"] = A(1,2);
+ a1_map["bla"] = A(2,3);
+ a1_map["youyou"]= A(3,4);
+ a2_map["bla"] = A(2,3);
+ a2_map["youyou"]= A(3,4);
+ a2_map["hello"] = A(1,2);
+ CHECK(a1_map == a2_map);
+ a1_map["foo"] = A(0,0);
+ CHECK(a1_map != a2_map);
+ a2_map["foo"] = A(0,0);
+ CHECK(a1_map == a2_map);
+ a2_map["foo"] = A(7,8);
+ CHECK(a1_map != a2_map);
+ a2_map["foo"] = A(0,0);
+ a1_map["bir"] = A(0,0);
+ a2_map["bar"] = A(0,0);
+ CHECK(a1_map.GetEntryCount() == a2_map.GetEntryCount());
+ CHECK(a1_map != a2_map);
+ CHECK(!(a1_map == a2_map));
+
+ NPT_Map<NPT_String, NPT_String*> p_map;
+ p_map["1"] = new NPT_String("hello");
+ p_map["2"] = new NPT_String("good bye");
+ p_map.GetEntries().Apply(NPT_MapEntryValueDeleter<NPT_Map<NPT_String, NPT_String*>::Entry>());
+
+ return 0;
+}
+
+struct Hasher {
+ NPT_UInt32 operator()(const NPT_String& /*key*/) const { return 0; }
+};
+
+/*----------------------------------------------------------------------
+| TestHashMap
++---------------------------------------------------------------------*/
+static int
+TestHashMap()
+{
+ NPT_HashMap<NPT_String,A> a_map;
+ A* a = NULL;
+
+ CHECK(a_map.GetEntryCount() == 0);
+ CHECK(a_map.HasKey("hello") == false);
+ CHECK(!a_map.HasValue(A(1,2)));
+ CHECK(NPT_FAILED(a_map.Get("bla", a)));
+ CHECK(a == NULL);
+
+ a_map.Put("hello", A(1,2));
+ CHECK(a_map.GetEntryCount() == 1);
+ CHECK(NPT_SUCCEEDED(a_map.Get("hello", a)));
+ CHECK(*a == A(1,2));
+ CHECK(a_map.HasKey("hello"));
+ CHECK(a_map.HasValue(A(1,2)));
+ CHECK(a_map["hello"] == A(1,2));
+
+ CHECK(a_map["bla"] == A());
+ CHECK(a_map.GetEntryCount() == 2);
+ a_map["bla"] = A(3,4);
+ CHECK(a_map["bla"] == A(3,4));
+ CHECK(a_map.GetEntryCount() == 2);
+
+ NPT_HashMap<NPT_String,A> b_map;
+ b_map["hello"] = A(1,2);
+ b_map["bla"] = A(3,4);
+ CHECK(a_map == b_map);
+
+ NPT_HashMap<NPT_String,A> c_map = a_map;
+ CHECK(c_map["hello"] == a_map["hello"]);
+ CHECK(c_map["bla"] == a_map["bla"]);
+
+ CHECK(NPT_SUCCEEDED(a_map.Put("bla", A(5,6))));
+ CHECK(NPT_SUCCEEDED(a_map.Get("bla", a)));
+ CHECK(*a == A(5,6));
+ CHECK(NPT_FAILED(a_map.Get("youyou", a)));
+
+ b_map.Clear();
+ CHECK(b_map.GetEntryCount() == 0);
+
+ a_map["youyou"] = A(6,7);
+ CHECK(NPT_FAILED(a_map.Erase("coucou")));
+ CHECK(NPT_SUCCEEDED(a_map.Erase("bla")));
+ CHECK(!a_map.HasKey("bla"));
+
+ CHECK(!(a_map == c_map));
+ CHECK(c_map != a_map);
+
+ c_map = a_map;
+ NPT_HashMap<NPT_String,A> d_map(c_map);
+ CHECK(d_map == c_map);
+
+ NPT_HashMap<int,int> i_map;
+ i_map[5] = 6;
+ i_map[6] = 7;
+ i_map[9] = 0;
+ CHECK(i_map[0] == 0 || i_map[0] != 0); // unknown value (will cause a valgrind warning)
+ CHECK(i_map.GetEntryCount() == 4);
+
+ NPT_HashMap<NPT_String,A> a1_map;
+ NPT_HashMap<NPT_String,A> a2_map;
+ a1_map["hello"] = A(1,2);
+ a1_map["bla"] = A(2,3);
+ a1_map["youyou"]= A(3,4);
+ a2_map["bla"] = A(2,3);
+ a2_map["youyou"]= A(3,4);
+ a2_map["hello"] = A(1,2);
+ CHECK(a1_map == a2_map);
+ a1_map["foo"] = A(0,0);
+ CHECK(a1_map != a2_map);
+ a2_map["foo"] = A(0,0);
+ CHECK(a1_map == a2_map);
+ a2_map["foo"] = A(7,8);
+ CHECK(a1_map != a2_map);
+ a2_map["foo"] = A(0,0);
+ a1_map["bir"] = A(0,0);
+ a2_map["bar"] = A(0,0);
+ CHECK(a1_map.GetEntryCount() == a2_map.GetEntryCount());
+ CHECK(a1_map != a2_map);
+ CHECK(!(a1_map == a2_map));
+
+ NPT_HashMap<NPT_String, NPT_String> smap;
+ for (unsigned int i=0; i<24; i++) {
+ NPT_String s = NPT_String::Format("blabla%d", i);
+ smap[s] = "1234";
+ CHECK(smap[s] == "1234");
+ }
+ for (unsigned int i=0; i<24; i++) {
+ NPT_String s = NPT_String::Format("blabla%d", i);
+ CHECK(smap[s] == "1234");
+ }
+ for (unsigned int i=0; i<24; i++) {
+ NPT_String s = NPT_String::Format("blabla%d", i);
+ CHECK(NPT_SUCCEEDED(smap.Erase(s)));
+ CHECK(!smap.HasKey(s));
+ }
+ CHECK(smap.GetEntryCount() == 0);
+
+ Hasher hasher;
+ NPT_HashMap<NPT_String, int, Hasher> zmap(hasher);
+ for (unsigned int i=0; i<1024; i++) {
+ NPT_String s = NPT_String::Format("blabla%d", i);
+ zmap[s] = 1234;
+ CHECK(zmap[s] == 1234);
+ }
+ for (unsigned int i=0; i<1024; i++) {
+ NPT_String s = NPT_String::Format("blabla%d", i);
+ CHECK(zmap[s] == 1234);
+ }
+ for (unsigned int i=0; i<1024; i++) {
+ NPT_String s = NPT_String::Format("blabla%d", i);
+ CHECK(NPT_SUCCEEDED(zmap.Erase(s)));
+ CHECK(!zmap.HasKey(s));
+ }
+ CHECK(zmap.GetEntryCount() == 0);
+
+ NPT_HashMap<NPT_String, int> imap;
+ for (int i=0; i<1024; i++) {
+ NPT_String s = NPT_String::Format("blabla%d", i);
+ imap[s] = i;
+ CHECK(imap[s] == i);
+ }
+ unsigned int zz = 1024;
+ for (NPT_HashMap<NPT_String, int>::Iterator it = imap.GetEntries();
+ it;
+ ++it) {
+ CHECK(imap.HasKey((*it).GetKey()));
+ CHECK(imap.HasValue((*it).GetValue()));
+ --zz;
+ }
+ CHECK(zz==0);
+
+ NPT_HashMap<NPT_String, NPT_String*> p_map;
+ p_map["1"] = new NPT_String("hello");
+ p_map["2"] = new NPT_String("good bye");
+ p_map.Apply(NPT_MapEntryValueDeleter<NPT_HashMap<NPT_String, NPT_String*>::Entry>());
+
+ return 0;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+
+ int result;
+
+ result = TestMap();
+ if (result) return result;
+
+ result = TestHashMap();
+ if (result) return result;
+
+ TestPerformance();
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Messages1/MessagesTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Messages1/MessagesTest1.cpp
new file mode 100644
index 0000000..eb97ea1
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Messages1/MessagesTest1.cpp
@@ -0,0 +1,407 @@
+/*****************************************************************
+|
+| Messages Test Program 1
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdio.h>
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| FooServerMessageHandler
++---------------------------------------------------------------------*/
+class FooServerMessageHandler
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST(FooServerMessageHandler)
+
+ // destructor
+ virtual ~FooServerMessageHandler() {}
+
+ // methods
+ virtual void OnBarCmd1(NPT_MessageReceiver* /*receiver*/, int /*info*/) {}
+ virtual void OnBarCmd2(NPT_MessageReceiver* /*receiver*/,
+ int /*info1*/, int /*info2*/) { }
+ virtual void OnBarCmd3(NPT_MessageReceiver* /*receiver*/,
+ int /*info1*/, int /*info2*/, int /*info3*/) {}
+};
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(FooServerMessageHandler)
+
+/*----------------------------------------------------------------------
+| FooServerMessage
++---------------------------------------------------------------------*/
+class FooServerMessage : public NPT_Message
+{
+public:
+ static NPT_Message::Type MessageType;
+ NPT_Message::Type GetType() {
+ return MessageType;
+ }
+ virtual NPT_Result Deliver(FooServerMessageHandler* handler) = 0;
+ virtual NPT_Result Dispatch(NPT_MessageHandler* handler) {
+ FooServerMessageHandler* specific = NPT_DYNAMIC_CAST(FooServerMessageHandler, handler);
+ if (specific) {
+ return Deliver(specific);
+ } else {
+ return DefaultDeliver(handler);
+ }
+ }
+};
+
+NPT_Message::Type FooServerMessage::MessageType = "FooServer Message";
+
+/*----------------------------------------------------------------------
+| FooServerBarCmd1Message
++---------------------------------------------------------------------*/
+class FooServerBarCmd1Message : public FooServerMessage
+{
+public:
+ FooServerBarCmd1Message(NPT_MessageReceiver* receiver, int info) :
+ m_Receiver(receiver), m_Info(info) {}
+ NPT_Result Deliver(FooServerMessageHandler* handler) {
+ handler->OnBarCmd1(m_Receiver, m_Info);
+ return NPT_SUCCESS;
+ }
+
+private:
+ NPT_MessageReceiver* m_Receiver;
+ int m_Info;
+};
+
+/*----------------------------------------------------------------------
+| FooServerBarCmd2Message
++---------------------------------------------------------------------*/
+class FooServerBarCmd2Message : public FooServerMessage
+{
+public:
+ FooServerBarCmd2Message(NPT_MessageReceiver* receiver,
+ int info1, int info2) :
+ m_Receiver(receiver), m_Info1(info1), m_Info2(info2) {}
+ NPT_Result Deliver(FooServerMessageHandler* handler) {
+ handler->OnBarCmd2(m_Receiver, m_Info1, m_Info2);
+ return NPT_SUCCESS;
+ }
+
+private:
+ NPT_MessageReceiver* m_Receiver;
+ int m_Info1;
+ int m_Info2;
+};
+
+/*----------------------------------------------------------------------
+| FooServerBarCmd3Message
++---------------------------------------------------------------------*/
+class FooServerBarCmd3Message : public FooServerMessage
+{
+public:
+ FooServerBarCmd3Message(NPT_MessageReceiver* receiver,
+ int info1, int info2, int info3) :
+ m_Receiver(receiver), m_Info1(info1), m_Info2(info2), m_Info3(info3) {}
+ NPT_Result Deliver(FooServerMessageHandler* handler) {
+ handler->OnBarCmd3(m_Receiver, m_Info1, m_Info2, m_Info3);
+ return NPT_SUCCESS;
+ }
+
+private:
+ NPT_MessageReceiver* m_Receiver;
+ int m_Info1;
+ int m_Info2;
+ int m_Info3;
+};
+
+/*----------------------------------------------------------------------
+| FooServerBarCmd4Message
++---------------------------------------------------------------------*/
+class FooServerBarCmd4Message : public NPT_Message
+{
+public:
+ static NPT_Message::Type MessageType;
+ NPT_Message::Type GetType() {
+ return MessageType;
+ }
+ FooServerBarCmd4Message() {}
+};
+NPT_Message::Type FooServerBarCmd4Message::MessageType = "FooServerBarCmd4 Message";
+
+/*----------------------------------------------------------------------
+| FooClientMessageHandler
++---------------------------------------------------------------------*/
+class FooClientMessageHandler
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST(FooClientMessageHandler)
+
+ // destructor
+ virtual ~FooClientMessageHandler() {}
+
+ // methods
+ virtual void OnBarNotification1(int /*info*/) {}
+ virtual void OnBarNotification2(int /*info1*/, int /*info2*/) {}
+};
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(FooClientMessageHandler)
+
+/*----------------------------------------------------------------------
+| FooClientMessage
++---------------------------------------------------------------------*/
+class FooClientMessage : public NPT_Message
+{
+public:
+ static NPT_Message::Type MessageType;
+ NPT_Message::Type GetType() {
+ return MessageType;
+ }
+ virtual NPT_Result Deliver(FooClientMessageHandler* handler) = 0;
+ virtual NPT_Result Dispatch(NPT_MessageHandler* handler) {
+ FooClientMessageHandler* specific = NPT_DYNAMIC_CAST(FooClientMessageHandler, handler);
+ if (specific) {
+ return Deliver(specific);
+ } else {
+ return DefaultDeliver(handler);
+ }
+ }
+};
+NPT_Message::Type FooClientMessage::MessageType = "FooClient Message";
+
+/*----------------------------------------------------------------------
+| FooClientBarNotification1Message
++---------------------------------------------------------------------*/
+class FooClientBarNotification1Message : public FooClientMessage
+{
+public:
+ FooClientBarNotification1Message(int info) : m_Info(info) {}
+ NPT_Result Deliver(FooClientMessageHandler* handler) {
+ handler->OnBarNotification1(m_Info);
+ return NPT_SUCCESS;
+ }
+
+private:
+ int m_Info;
+};
+
+/*----------------------------------------------------------------------
+| FooServer
++---------------------------------------------------------------------*/
+class FooServer : public NPT_Thread,
+ public NPT_MessageReceiver,
+ public NPT_MessageHandler,
+ public FooServerMessageHandler
+{
+public:
+ FooServer();
+
+ // message posting wrappers
+ NPT_Result DoBarCmd1(NPT_MessageReceiver* receiver, int info);
+ NPT_Result DoBarCmd2(NPT_MessageReceiver* receiver, int info1, int info2);
+ NPT_Result DoBarCmd3(NPT_MessageReceiver* receiver,
+ int info1, int info2, int info3);
+ NPT_Result DoBarCmd4();
+
+ // NPT_Runnable methods (from NPT_Thread)
+ void Run();
+
+ // NPT_MessageHandler methods
+ void OnMessage(NPT_Message* message);
+ NPT_Result HandleMessage(NPT_Message* message);
+
+ // NPT_FooServerMessageHandler methods
+ void OnBarCmd1(NPT_MessageReceiver* receiver, int info);
+ void OnBarCmd2(NPT_MessageReceiver* receiver, int info1, int info2);
+
+private:
+ // members
+ NPT_SimpleMessageQueue* m_MessageQueue;
+};
+
+/*----------------------------------------------------------------------
+| FooServer::FooServer
++---------------------------------------------------------------------*/
+FooServer::FooServer()
+{
+ // create the message queue
+ m_MessageQueue = new NPT_SimpleMessageQueue();
+
+ // attach to the message queue
+ SetQueue(m_MessageQueue);
+ SetHandler(this);
+
+ // start the thread
+ Start();
+}
+
+/*----------------------------------------------------------------------
+| FooServer::Run
++---------------------------------------------------------------------*/
+void
+FooServer::Run()
+{
+ printf("FooServer::Run - begin\n");
+ while (m_MessageQueue->PumpMessage() == NPT_SUCCESS) {};
+ printf("FooServer::Run - end\n");
+}
+
+/*----------------------------------------------------------------------
+| FooServer::HandleMessage
++---------------------------------------------------------------------*/
+NPT_Result
+FooServer::HandleMessage(NPT_Message* message)
+{
+ // a handler typically does not implement this method unless it
+ // needs to catch all messages before they are dispatched
+ printf("FooServer::HandleMessage (%s)\n", message->GetType());
+ return NPT_MessageHandler::HandleMessage(message);
+}
+
+/*----------------------------------------------------------------------
+| FooServer::OnMessage
++---------------------------------------------------------------------*/
+void
+FooServer::OnMessage(NPT_Message* message)
+{
+ printf("FooServer::OnMessage (%s)\n", message->GetType());
+}
+
+/*----------------------------------------------------------------------
+| FooServer::OnBarCmd1
++---------------------------------------------------------------------*/
+void
+FooServer::OnBarCmd1(NPT_MessageReceiver* receiver, int info)
+{
+ printf("FooServer::OnBarCmd1 %d\n", info);
+ receiver->PostMessage(new FooClientBarNotification1Message(7));
+}
+
+/*----------------------------------------------------------------------
+| FooServer::OnBarCmd2
++---------------------------------------------------------------------*/
+void
+FooServer::OnBarCmd2(NPT_MessageReceiver* /*receiver*/, int info1, int info2)
+{
+ printf("FooServer::OnBarCmd2 %d %d\n", info1, info2);
+}
+
+/*----------------------------------------------------------------------
+| FooServer::DoBarCmd1
++---------------------------------------------------------------------*/
+NPT_Result
+FooServer::DoBarCmd1(NPT_MessageReceiver* receiver, int info)
+{
+ return PostMessage(new FooServerBarCmd1Message(receiver, info));
+}
+
+/*----------------------------------------------------------------------
+| FooServer::DoBarCmd2
++---------------------------------------------------------------------*/
+NPT_Result
+FooServer::DoBarCmd2(NPT_MessageReceiver* receiver, int info1, int info2)
+{
+ return PostMessage(new FooServerBarCmd2Message(receiver, info1,info2));
+}
+
+/*----------------------------------------------------------------------
+| FooServer::DoBarCmd3
++---------------------------------------------------------------------*/
+NPT_Result
+FooServer::DoBarCmd3(NPT_MessageReceiver* receiver,
+ int info1, int info2, int info3)
+{
+ return PostMessage(new FooServerBarCmd3Message(receiver,
+ info1, info2, info3));
+}
+
+/*----------------------------------------------------------------------
+| FooServer::DoBarCmd4
++---------------------------------------------------------------------*/
+NPT_Result
+FooServer::DoBarCmd4()
+{
+ return PostMessage(new FooServerBarCmd4Message());
+}
+
+/*----------------------------------------------------------------------
+| FooClient
++---------------------------------------------------------------------*/
+class FooClient : public NPT_MessageReceiver,
+ public NPT_MessageHandler,
+ public FooClientMessageHandler
+{
+public:
+ FooClient(FooServer* server, int id);
+
+ // NPT_MessageHandler methods
+ //void OnMessage(NPT_Message* message);
+
+ // NPT_FooServerMessageHandler methods
+ void OnBarNotification1(int info);
+ void OnBarNotification2(int info1, int info2);
+
+private:
+ // members
+ int m_Id;
+};
+
+/*----------------------------------------------------------------------
+| FooClient::FooClient
++---------------------------------------------------------------------*/
+FooClient::FooClient(FooServer* server, int id) :
+ m_Id(id)
+{
+ // set ourself as the message handler
+ SetHandler(this);
+
+ // send commands to server
+ server->DoBarCmd1(this, 1);
+ server->DoBarCmd2(this, 1, 2);
+ server->DoBarCmd3(this, 1, 2, 3);
+ server->DoBarCmd4();
+}
+
+/*----------------------------------------------------------------------
+| FooClient::OnBarNotification1
++---------------------------------------------------------------------*/
+void
+FooClient::OnBarNotification1(int info)
+{
+ printf("FooClient::OnBarNotification1 (client=%d) %d\n", m_Id, info);
+}
+
+/*----------------------------------------------------------------------
+| FooClient::OnBarNotification2
++---------------------------------------------------------------------*/
+void
+FooClient::OnBarNotification2(int info1, int info2)
+{
+ printf("FooClient::OnBarNotification2 (client=%d) %d %d\n", m_Id, info1, info2);
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ printf("MessagesTest1:: start\n");
+
+ FooServer* server = new FooServer();
+ FooClient* client1 = new FooClient(server, 1);
+ FooClient* client2 = new FooClient(server, 2);
+ NPT_MessageQueue* queue = new NPT_SimpleMessageQueue();
+
+ client1->SetQueue(queue);
+ client2->SetQueue(queue);
+
+ while (queue->PumpMessage() == NPT_SUCCESS) {}
+
+ delete client1;
+ delete client2;
+ delete server;
+ delete queue;
+
+ printf("MessagesTest1:: end\n");
+}
+
diff --git a/lib/libUPnP/Neptune/Source/Tests/Messages2/MessagesTest2.cpp b/lib/libUPnP/Neptune/Source/Tests/Messages2/MessagesTest2.cpp
new file mode 100644
index 0000000..26ad82e
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Messages2/MessagesTest2.cpp
@@ -0,0 +1,242 @@
+/*****************************************************************
+|
+| Messages Test Program 1
+|
+| (c) 2001-2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+/*----------------------------------------------------------------------
+| TestServerMessageHandler
++---------------------------------------------------------------------*/
+class TestServerMessageHandler
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST(TestServerMessageHandler)
+
+ // destructor
+ virtual ~TestServerMessageHandler() {}
+
+ // methods
+ virtual void OnTestCommand(NPT_MessageReceiver* /*receiver*/, int /*id*/) {}
+};
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(TestServerMessageHandler)
+
+/*----------------------------------------------------------------------
+| TestServerMessage
++---------------------------------------------------------------------*/
+class TestServerMessage : public NPT_Message
+{
+public:
+ static NPT_Message::Type MessageType;
+ NPT_Message::Type GetType() {
+ return MessageType;
+ }
+ virtual NPT_Result Deliver(TestServerMessageHandler* handler) = 0;
+ virtual NPT_Result Dispatch(NPT_MessageHandler* handler) {
+ TestServerMessageHandler* specific = NPT_DYNAMIC_CAST(TestServerMessageHandler, handler);
+ if (specific) {
+ return Deliver(specific);
+ } else {
+ return DefaultDeliver(handler);
+ }
+ }
+};
+NPT_Message::Type TestServerMessage::MessageType = "TestServer Message";
+/*----------------------------------------------------------------------
+| TestServerTestCommandMessage
++---------------------------------------------------------------------*/
+class TestServerTestCommandMessage : public TestServerMessage
+{
+public:
+ TestServerTestCommandMessage(NPT_MessageReceiver* receiver, int id) :
+ m_Receiver(receiver), m_Id(id) {}
+ NPT_Result Deliver(TestServerMessageHandler* handler) {
+ handler->OnTestCommand(m_Receiver, m_Id);
+ return NPT_SUCCESS;
+ }
+
+private:
+ NPT_MessageReceiver* m_Receiver;
+ int m_Id;
+};
+/*----------------------------------------------------------------------
+| TestClientMessageHandler
++---------------------------------------------------------------------*/
+class TestClientMessageHandler
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST(TestClientMessageHandler)
+
+ // destructor
+ virtual ~TestClientMessageHandler() {}
+
+ // methods
+ virtual void OnReply(int /*id*/) {}
+};
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(TestClientMessageHandler)
+
+/*----------------------------------------------------------------------
+| TestClientMessage
++---------------------------------------------------------------------*/
+class TestClientMessage : public NPT_Message
+{
+public:
+ static NPT_Message::Type MessageType;
+ NPT_Message::Type GetType() {
+ return MessageType;
+ }
+ virtual NPT_Result Deliver(TestClientMessageHandler* handler) = 0;
+ virtual NPT_Result Dispatch(NPT_MessageHandler* handler) {
+ TestClientMessageHandler* specific = NPT_DYNAMIC_CAST(TestClientMessageHandler, handler);
+ if (specific) {
+ return Deliver(specific);
+ } else {
+ return DefaultDeliver(handler);
+ }
+ }
+};
+NPT_Message::Type TestClientMessage::MessageType = "TestClient Message";
+/*----------------------------------------------------------------------
+| TestClientReplyMessage
++---------------------------------------------------------------------*/
+class TestClientReplyMessage : public TestClientMessage
+{
+public:
+ TestClientReplyMessage(int id) : m_Id(id) {}
+ NPT_Result Deliver(TestClientMessageHandler* handler) {
+ handler->OnReply(m_Id);
+ return NPT_SUCCESS;
+ }
+private:
+ int m_Id;
+};
+/*----------------------------------------------------------------------
+| TestServer
++---------------------------------------------------------------------*/
+class TestServer : public NPT_Thread,
+ public NPT_MessageReceiver,
+ public NPT_MessageHandler,
+ public TestServerMessageHandler
+{
+public:
+ TestServer();
+
+ // message posting wrappers
+ NPT_Result DoTestCommand(NPT_MessageReceiver* receiver, int id);
+ // NPT_Runnable methods (from NPT_Thread)
+ void Run();
+ // NPT_TestServerMessageHandler methods
+ void OnTestCommand(NPT_MessageReceiver* receiver, int id);
+private:
+ // members
+ NPT_SimpleMessageQueue* m_MessageQueue;
+};
+/*----------------------------------------------------------------------
+| TestServer::TestServer
++---------------------------------------------------------------------*/
+TestServer::TestServer()
+{
+ // create the message queue
+ m_MessageQueue = new NPT_SimpleMessageQueue();
+
+ // attach to the message queue
+ SetQueue(m_MessageQueue);
+ SetHandler(this);
+ // start the thread
+ Start();
+}
+/*----------------------------------------------------------------------
+| TestServer::Run
++---------------------------------------------------------------------*/
+void
+TestServer::Run()
+{
+ printf("TestServer::Run - begin\n");
+ while (m_MessageQueue->PumpMessage() == NPT_SUCCESS) {};
+ printf("TestServer::Run - end\n");
+}
+/*----------------------------------------------------------------------
+| TestServer::DoTestCommand
++---------------------------------------------------------------------*/
+NPT_Result
+TestServer::DoTestCommand(NPT_MessageReceiver* receiver, int id)
+{
+ return this->PostMessage(new TestServerTestCommandMessage(receiver, id));
+}
+/*----------------------------------------------------------------------
+| TestServer::OnTestCommand
++---------------------------------------------------------------------*/
+void
+TestServer::OnTestCommand(NPT_MessageReceiver* receiver, int id)
+{
+ printf("TestServer::OnTestCommand %d\n", id);
+ receiver->PostMessage(new TestClientReplyMessage(id+10000));
+}
+/*----------------------------------------------------------------------
+| TestClient
++---------------------------------------------------------------------*/
+class TestClient : public NPT_MessageReceiver,
+ public NPT_MessageHandler,
+ public TestClientMessageHandler
+{
+public:
+ TestClient(TestServer* server, int id);
+
+ // NPT_TestServerMessageHandler methods
+ void OnReply(int id);
+private:
+ // members
+ int m_Id;
+};
+/*----------------------------------------------------------------------
+| TestClient::TestClient
++---------------------------------------------------------------------*/
+TestClient::TestClient(TestServer* server, int id) :
+ m_Id(id)
+{
+ // set ourself as the message handler
+ SetHandler(this);
+
+ // send commands to server
+ server->DoTestCommand(this, 1);
+ server->DoTestCommand(this, 2);
+ server->DoTestCommand(this, 3);
+ server->DoTestCommand(this, 4);
+}
+/*----------------------------------------------------------------------
+| TestClient::OnReply
++---------------------------------------------------------------------*/
+void
+TestClient::OnReply(int id)
+{
+ printf("TestClient::OnReply (client=%d) %d\n", m_Id, id);
+}
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ NPT_COMPILER_UNUSED(argc);
+ NPT_COMPILER_UNUSED(argv);
+ printf("MessagesTest2:: start\n");
+ TestServer* server = new TestServer();
+ TestClient* client1 = new TestClient(server, 1);
+ TestClient* client2 = new TestClient(server, 2);
+ NPT_MessageQueue* queue = new NPT_SimpleMessageQueue();
+ client1->SetQueue(queue);
+ client2->SetQueue(queue);
+
+ server->Wait();
+
+ delete client1;
+ delete client2;
+ delete server;
+ delete queue;
+ printf("MessagesTest2:: end\n");
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Misc1/MiscTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Misc1/MiscTest1.cpp
new file mode 100644
index 0000000..98282ec
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Misc1/MiscTest1.cpp
@@ -0,0 +1,536 @@
+/*****************************************************************
+|
+| Misc Test Program 1
+|
+| (c) 2005-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Neptune.h"
+#include "NptDebug.h"
+#include "NptUtils.h"
+#include "NptTypes.h"
+#include "NptDynamicCast.h"
+#include "NptHash.h"
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define SHOULD_BE_TRUE(r) \
+ do { \
+ if (!(r)) { \
+ NPT_Debug("failed line %d (%d)\n", __LINE__, r);\
+ exit(1); \
+ } \
+ } while(0)
+
+#define SHOULD_SUCCEED(r) \
+ do { \
+ if (NPT_FAILED(r)) { \
+ NPT_Debug("failed line %d (%d)\n", __LINE__, r);\
+ exit(1); \
+ } \
+ } while(0)
+
+#define SHOULD_FAIL(r) \
+ do { \
+ if (NPT_SUCCEEDED(r)) { \
+ NPT_Debug("should have failed line %d (%d)\n", __LINE__, r);\
+ exit(1); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_I(a, b) \
+ do { \
+ if ((a) != (b)) { \
+ NPT_Debug("got %l, expected %l line %d\n", a, b, __LINE__);\
+ exit(1); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_F(a, b) \
+ do { \
+ if ((a) != (b)) { \
+ NPT_Debug("got %f, expected %f line %d\n", a, b, __LINE__);\
+ exit(1); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_S(a, b) \
+ do { \
+ if (!NPT_StringsEqual(a,b)) { \
+ NPT_Debug("got %s, expected %s line %d\n", a, b, __LINE__);\
+ exit(1); \
+ } \
+ } while(0)
+
+
+class BarA
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST(BarA)
+ virtual ~BarA() {}
+ virtual int bar() { return 1; }
+};
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(BarA)
+
+class FooA
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST(FooA)
+ virtual ~FooA() {}
+ virtual int foo() { return 2; }
+};
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(FooA)
+
+class FooB : public FooA
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST_D(FooB, FooA)
+ virtual int foo() { return 3; }
+};
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(FooB)
+
+class FooC : public FooB, public BarA
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST_D2(FooC, FooB, BarA)
+ virtual int foo() { return 4; }
+ virtual int bar() { return 5; }
+};
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(FooC)
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ NPT_Result result;
+
+ // dynamic cast
+ BarA* bar_a = new BarA();
+ SHOULD_BE_TRUE(bar_a != NULL);
+ SHOULD_BE_TRUE(NPT_DYNAMIC_CAST(BarA, bar_a) == bar_a);
+ SHOULD_BE_TRUE(NPT_DYNAMIC_CAST(FooA, bar_a) == NULL);
+ SHOULD_BE_TRUE(bar_a->bar() == 1);
+ delete bar_a;
+
+ FooA* foo_a = new FooA();
+ SHOULD_BE_TRUE(foo_a != NULL);
+ SHOULD_BE_TRUE(NPT_DYNAMIC_CAST(FooA, foo_a) == foo_a);
+ SHOULD_BE_TRUE(NPT_DYNAMIC_CAST(FooB, foo_a) == NULL);
+ SHOULD_BE_TRUE(foo_a->foo() == 2);
+ delete foo_a;
+
+ FooB* foo_b = new FooB();
+ SHOULD_BE_TRUE(foo_b != NULL);
+ foo_a = NPT_DYNAMIC_CAST(FooA, foo_b);
+ SHOULD_BE_TRUE(NPT_DYNAMIC_CAST(FooB, foo_b) == foo_b);
+ SHOULD_BE_TRUE(NPT_DYNAMIC_CAST(FooA, foo_b) != NULL);
+ SHOULD_BE_TRUE(NPT_DYNAMIC_CAST(FooC, foo_b) == NULL);
+ SHOULD_BE_TRUE(foo_a->foo() == 3);
+ delete foo_b;
+
+ FooC* foo_c = new FooC();
+ SHOULD_BE_TRUE(foo_c != NULL);
+ foo_a = NPT_DYNAMIC_CAST(FooA, foo_c);
+ foo_b = NPT_DYNAMIC_CAST(FooB, foo_c);
+ bar_a = NPT_DYNAMIC_CAST(BarA, foo_c);
+ SHOULD_BE_TRUE(NPT_DYNAMIC_CAST(FooC, foo_c) == foo_c);
+ SHOULD_BE_TRUE(foo_a != NULL);
+ SHOULD_BE_TRUE(foo_b != NULL);
+ SHOULD_BE_TRUE(bar_a != NULL);
+ SHOULD_BE_TRUE(foo_a->foo() == 4);
+ SHOULD_BE_TRUE(foo_b->foo() == 4);
+ SHOULD_BE_TRUE(foo_c->foo() == 4);
+ SHOULD_BE_TRUE(bar_a->bar() == 5);
+ delete foo_c;
+
+ // misc type tests
+ signed long sl;
+ unsigned long ul;
+ signed int si;
+ unsigned int ui;
+ NPT_Int64 si64;
+ NPT_UInt64 ui64;
+
+ SHOULD_BE_TRUE(sizeof(NPT_UInt32) == sizeof(NPT_Int32));
+ SHOULD_BE_TRUE(sizeof(NPT_Int32) >= 4);
+ SHOULD_BE_TRUE(sizeof(NPT_UInt64) == sizeof(NPT_Int64));
+ SHOULD_BE_TRUE(sizeof(NPT_Int64) >= 8);
+ sl = NPT_LONG_MAX;
+ sl += 1;
+ SHOULD_BE_TRUE(sl == NPT_LONG_MIN);
+ si = NPT_INT_MAX;
+ si += 1;
+ SHOULD_BE_TRUE(si == NPT_INT_MIN);
+ si64 = NPT_INT64_MAX;
+ si64 += 1;
+ SHOULD_BE_TRUE(si64 == NPT_INT64_MIN);
+ ul = NPT_ULONG_MAX;
+ ul += 1;
+ SHOULD_BE_TRUE(ul == 0);
+ ui = NPT_UINT_MAX;
+ ui += 1;
+ SHOULD_BE_TRUE(ui == 0);
+ ui64 = NPT_UINT64_MAX;
+ ui64 += 1;
+ SHOULD_BE_TRUE(ui64 == 0);
+
+ // base64
+ NPT_String t = "hello";
+ NPT_String base64;
+ NPT_DataBuffer data;
+ result = NPT_Base64::Encode((const NPT_Byte*)t.GetChars(), t.GetLength(), base64);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(base64 == "aGVsbG8=");
+ result = NPT_Base64::Decode(base64.GetChars(), base64.GetLength(), data);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(data.GetDataSize() == t.GetLength());
+ NPT_String tt((const char*)data.GetData(), data.GetDataSize());
+ SHOULD_BE_TRUE(tt == t);
+
+ t = "hello!";
+ result = NPT_Base64::Encode((const NPT_Byte*)t.GetChars(), t.GetLength(), base64);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(base64 == "aGVsbG8h");
+ result = NPT_Base64::Decode(base64.GetChars(), base64.GetLength(), data);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(data.GetDataSize() == t.GetLength());
+ tt.Assign((const char*)data.GetData(), data.GetDataSize());
+ SHOULD_BE_TRUE(tt == t);
+
+ t = "hello!!";
+ result = NPT_Base64::Encode((const NPT_Byte*)t.GetChars(), t.GetLength(), base64);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(base64 == "aGVsbG8hIQ==");
+ result = NPT_Base64::Decode(base64.GetChars(), base64.GetLength(), data);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(data.GetDataSize() == t.GetLength());
+ tt.Assign((const char*)data.GetData(), data.GetDataSize());
+ SHOULD_BE_TRUE(tt == t);
+
+ unsigned char r256_bin[] = {
+ 0x7d, 0x5f, 0xd0, 0xf4, 0x6a, 0xa8, 0xae, 0x34, 0x6e, 0x32, 0x1d, 0xa1,
+ 0xef, 0x66, 0xdd, 0x82, 0x76, 0xa6, 0xfd, 0x8c, 0x75, 0x97, 0xa0, 0x01,
+ 0x00, 0xde, 0x52, 0xef, 0xdf, 0xb6, 0x3e, 0xe4, 0x7b, 0x45, 0xdd, 0x2b,
+ 0xa1, 0x9c, 0xb0, 0x6d, 0x2c, 0x75, 0xb1, 0x87, 0x43, 0x0f, 0xea, 0x24,
+ 0x36, 0x11, 0x7e, 0xee, 0xd1, 0x91, 0x7f, 0x7b, 0x02, 0xea, 0x9a, 0x2a,
+ 0x25, 0xc0, 0xac, 0x99, 0xa4, 0x89, 0x55, 0x5b, 0x82, 0xdf, 0xb0, 0x7e,
+ 0xa1, 0x78, 0x0f, 0xdf, 0x25, 0x5f, 0x3d, 0xba, 0xcb, 0xbc, 0x35, 0x04,
+ 0xc3, 0xf4, 0xb8, 0xc0, 0x17, 0x8e, 0x75, 0x01, 0xe6, 0x2f, 0x88, 0x2c,
+ 0x76, 0x0a, 0x8c, 0x3f, 0x83, 0xd4, 0x10, 0xa8, 0x00, 0xfc, 0xa0, 0x92,
+ 0x7b, 0xae, 0xa3, 0x8c, 0x47, 0xea, 0x25, 0xf9, 0x29, 0x81, 0x1c, 0x21,
+ 0xf2, 0xf4, 0xfe, 0x07, 0x7e, 0x4b, 0x01, 0x79, 0x41, 0x3a, 0xb6, 0x71,
+ 0x0b, 0x75, 0xa7, 0x9d, 0x1b, 0x12, 0xc4, 0x46, 0x06, 0xf3, 0x5f, 0x00,
+ 0x05, 0x2a, 0x1b, 0x34, 0xd6, 0x87, 0xc4, 0x70, 0xcc, 0xc3, 0x9e, 0xa8,
+ 0x24, 0x2c, 0x97, 0x4e, 0xfc, 0x91, 0x70, 0x1c, 0x29, 0x66, 0xc3, 0x23,
+ 0xbf, 0xd7, 0x4d, 0x35, 0x51, 0xff, 0xeb, 0xde, 0x45, 0xbd, 0x8d, 0x80,
+ 0x44, 0x2a, 0x8d, 0xc0, 0xe8, 0x6a, 0xe2, 0x86, 0x46, 0x9f, 0xf2, 0x3c,
+ 0x93, 0x0d, 0x27, 0x02, 0xe4, 0x79, 0xa1, 0x21, 0xf4, 0x43, 0xcd, 0x4c,
+ 0x22, 0x25, 0x9e, 0x93, 0xeb, 0x77, 0x8e, 0x1e, 0x57, 0x1e, 0x9b, 0xcb,
+ 0x91, 0x86, 0xcf, 0x15, 0xaf, 0xd5, 0x03, 0x0f, 0x70, 0xbe, 0x6e, 0x37,
+ 0xea, 0x37, 0xdd, 0xf6, 0xa1, 0xb1, 0xf7, 0x05, 0xbc, 0x2d, 0x44, 0x60,
+ 0x35, 0xa4, 0x05, 0x0b, 0x22, 0x7d, 0x7a, 0x71, 0xe5, 0x1d, 0x8e, 0xcb,
+ 0xc3, 0xb8, 0x3a, 0xe1
+ };
+ NPT_String b64;
+ NPT_Base64::Encode(r256_bin, sizeof(r256_bin), b64);
+ NPT_DataBuffer r256_out;
+ NPT_Base64::Decode(b64.GetChars(), b64.GetLength(), r256_out);
+ SHOULD_BE_TRUE(r256_out.GetDataSize() == sizeof(r256_bin));
+ SHOULD_BE_TRUE(r256_bin[sizeof(r256_bin)-1] == r256_out.GetData()[sizeof(r256_bin)-1]);
+
+ unsigned char random_bytes[] = {
+ 0xc7, 0xee, 0x49, 0x9e, 0x2c, 0x8b, 0x1c, 0x16, 0x9e, 0x7f, 0x30, 0xd0,
+ 0xc6, 0x12, 0x30, 0x80, 0x81, 0xcd, 0x20, 0x20, 0x26, 0xaf, 0x4f, 0xd6,
+ 0xfc, 0x86, 0x2e, 0x85, 0xf3, 0x10, 0x38, 0x2b, 0x0e, 0xbb, 0x80, 0x68,
+ 0xbe, 0xff, 0x1c, 0xdc, 0x72, 0xb5, 0x0d, 0x8f, 0x8e, 0x6c, 0x09, 0x63,
+ 0xba, 0x21, 0x23, 0xb2, 0x24, 0x17, 0xd3, 0x17, 0x69, 0x44, 0x77, 0x11,
+ 0x36, 0x6a, 0x6e, 0xf2, 0x44, 0x87, 0xa1, 0xd3, 0xf3, 0x1f, 0x6c, 0x38,
+ 0x22, 0x4a, 0x44, 0x70, 0x66, 0xef, 0x8c, 0x3a, 0x51, 0xc8, 0xee, 0x85,
+ 0x00, 0x25, 0x93, 0x10, 0x2e, 0x0b, 0x1b, 0x03, 0x94, 0x47, 0x05, 0x22,
+ 0xd0, 0xc4, 0xec, 0x2e, 0xcc, 0xbc, 0xbb, 0x67, 0xfd, 0xec, 0x0e, 0xb1,
+ 0x3f, 0xbc, 0x82, 0xe0, 0xa7, 0x9c, 0xf3, 0xae, 0xbd, 0xb7, 0xab, 0x02,
+ 0xf1, 0xd9, 0x17, 0x4c, 0x9d, 0xeb, 0xe2, 0x00, 0x1e, 0x19, 0x6e, 0xb3,
+ 0xfd, 0x7d, 0xea, 0x49, 0x85, 0x43, 0x2f, 0x56, 0x81, 0x89, 0xba, 0x71,
+ 0x37, 0x10, 0xb5, 0x74, 0xab, 0x90, 0x4d, 0xc4, 0xd1, 0x0d, 0x8d, 0x6f,
+ 0x01, 0xf5, 0x2c, 0xc9, 0x1a, 0x79, 0xa1, 0x41, 0x71, 0x2b, 0xfb, 0xf3,
+ 0xd5, 0xe4, 0x2a, 0xf5, 0xad, 0x80, 0x7a, 0x03, 0xff, 0x5f, 0x45, 0x8c,
+ 0xec, 0x6a, 0x4b, 0x05, 0xe3, 0x65, 0x19, 0x70, 0x05, 0xad, 0xc4, 0xb8,
+ 0x4e, 0x9e, 0x9a, 0x36, 0x4a, 0x86, 0x9d, 0xf5, 0x99, 0xcb, 0x00, 0xb8,
+ 0xb9, 0xa7, 0x86, 0x18, 0xfc, 0x9a, 0xe7, 0x00, 0x6a, 0x67, 0xfa, 0x42,
+ 0x9d, 0xff, 0x4d, 0x7a, 0xe4, 0xe8, 0x03, 0x88, 0xff, 0x60, 0xe1, 0x8d,
+ 0x09, 0x5f, 0x6f, 0xde, 0x6b
+ };
+ NPT_Array<unsigned char> random(random_bytes, NPT_ARRAY_SIZE(random_bytes));
+
+ t = "x+5JniyLHBaefzDQxhIwgIHNICAmr0/W/IYuhfMQOCsOu4Bovv8c3HK1DY+ObAlj\r\n"
+ "uiEjsiQX0xdpRHcRNmpu8kSHodPzH2w4IkpEcGbvjDpRyO6FACWTEC4LGwOURwUi\r\n"
+ "0MTsLsy8u2f97A6xP7yC4Kec8669t6sC8dkXTJ3r4gAeGW6z/X3qSYVDL1aBibpx\r\n"
+ "NxC1dKuQTcTRDY1vAfUsyRp5oUFxK/vz1eQq9a2AegP/X0WM7GpLBeNlGXAFrcS4\r\n"
+ "Tp6aNkqGnfWZywC4uaeGGPya5wBqZ/pCnf9NeuToA4j/YOGNCV9v3ms=";
+ result = NPT_Base64::Decode(t.GetChars(), t.GetLength(), data);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(data.GetDataSize() == 233);
+ NPT_Array<unsigned char> verif(data.GetData(), data.GetDataSize());
+ SHOULD_BE_TRUE(verif == random);
+
+ result = NPT_Base64::Encode(&random[0], random.GetItemCount(), base64, NPT_BASE64_PEM_BLOCKS_PER_LINE);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(base64 == t);
+
+ NPT_String t_url = t;
+ t.Replace('/', '_');
+ t.Replace('+', '-');
+ result = NPT_Base64::Encode(&random[0], random.GetItemCount(), base64, NPT_BASE64_PEM_BLOCKS_PER_LINE, true);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(base64 == t);
+
+ t = "76768484767685839";
+ result = NPT_Base64::Decode(t.GetChars(), t.GetLength(), data);
+ SHOULD_BE_TRUE(result == NPT_ERROR_INVALID_FORMAT);
+
+ t = "76869=978686";
+ result = NPT_Base64::Decode(t.GetChars(), t.GetLength(), data);
+ SHOULD_BE_TRUE(result == NPT_ERROR_INVALID_FORMAT);
+
+ t = "7686=8978686";
+ result = NPT_Base64::Decode(t.GetChars(), t.GetLength(), data);
+ SHOULD_BE_TRUE(result == NPT_ERROR_INVALID_FORMAT);
+
+ t = "7686==978686";
+ result = NPT_Base64::Decode(t.GetChars(), t.GetLength(), data);
+ SHOULD_BE_TRUE(result == NPT_ERROR_INVALID_FORMAT);
+
+ // test IP address parsing
+ NPT_IpAddress ip;
+ SHOULD_BE_TRUE(NPT_FAILED(ip.Parse("")));
+ SHOULD_BE_TRUE(NPT_FAILED(ip.Parse("a.b.c.d")));
+ SHOULD_BE_TRUE(NPT_FAILED(ip.Parse("1.2.3.4.5")));
+ SHOULD_BE_TRUE(NPT_FAILED(ip.Parse("1")));
+ SHOULD_BE_TRUE(NPT_FAILED(ip.Parse("1.2.3.4.")));
+ SHOULD_BE_TRUE(NPT_FAILED(ip.Parse("1.2.3.4f")));
+ SHOULD_BE_TRUE(NPT_FAILED(ip.Parse("1.g.3.4")));
+ SHOULD_BE_TRUE(NPT_FAILED(ip.Parse("1.2..3.4")));
+ SHOULD_BE_TRUE(NPT_FAILED(ip.Parse("1.2.300.4")));
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(ip.Parse("1.2.3.4")));
+ SHOULD_BE_TRUE(ip.AsBytes()[0] == 1);
+ SHOULD_BE_TRUE(ip.AsBytes()[1] == 2);
+ SHOULD_BE_TRUE(ip.AsBytes()[2] == 3);
+ SHOULD_BE_TRUE(ip.AsBytes()[3] == 4);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(ip.Parse("255.255.0.1")));
+ SHOULD_BE_TRUE(ip.AsBytes()[0] == 255);
+ SHOULD_BE_TRUE(ip.AsBytes()[1] == 255);
+ SHOULD_BE_TRUE(ip.AsBytes()[2] == 0);
+ SHOULD_BE_TRUE(ip.AsBytes()[3] == 1);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(ip.Parse("0.0.0.0")));
+ SHOULD_BE_TRUE(ip.AsBytes()[0] == 0);
+ SHOULD_BE_TRUE(ip.AsBytes()[1] == 0);
+ SHOULD_BE_TRUE(ip.AsBytes()[2] == 0);
+ SHOULD_BE_TRUE(ip.AsBytes()[3] == 0);
+
+ // MIME parameter parser
+ NPT_Map<NPT_String,NPT_String> params;
+ result = NPT_ParseMimeParameters(NULL, params);
+ SHOULD_BE_TRUE(result == NPT_ERROR_INVALID_PARAMETERS);
+
+ result = NPT_ParseMimeParameters("", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 0);
+
+ result = NPT_ParseMimeParameters("foo=bar", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 1);
+ SHOULD_BE_TRUE(params["foo"] == "bar");
+ params.Clear();
+
+ result = NPT_ParseMimeParameters(" foo =bar", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 1);
+ SHOULD_BE_TRUE(params["foo"] == "bar");
+ params.Clear();
+
+ result = NPT_ParseMimeParameters(" foo= bar", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 1);
+ SHOULD_BE_TRUE(params["foo"] == "bar");
+ params.Clear();
+
+ result = NPT_ParseMimeParameters(" foo= bar;", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 1);
+ SHOULD_BE_TRUE(params["foo"] == "bar");
+ params.Clear();
+
+ result = NPT_ParseMimeParameters("foo=\"bar\"", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 1);
+ SHOULD_BE_TRUE(params["foo"] == "bar");
+ params.Clear();
+
+ result = NPT_ParseMimeParameters("foo=\"ba\"r\"", params);
+ SHOULD_BE_TRUE(result == NPT_ERROR_INVALID_SYNTAX);
+ params.Clear();
+
+ result = NPT_ParseMimeParameters("foo=\"ba\\\"r\"", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 1);
+ SHOULD_BE_TRUE(params["foo"] == "ba\"r");
+ params.Clear();
+
+ result = NPT_ParseMimeParameters("foo=\"bar\\\"\"", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 1);
+ SHOULD_BE_TRUE(params["foo"] == "bar\"");
+ params.Clear();
+
+ result = NPT_ParseMimeParameters("foo=\"bar\\\\\"", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 1);
+ SHOULD_BE_TRUE(params["foo"] == "bar\\");
+ params.Clear();
+
+ result = NPT_ParseMimeParameters("a=1;b=2; c=3; d=4 ; e=\"\\;\"; f=\";\"", params);
+ SHOULD_BE_TRUE(NPT_SUCCEEDED(result));
+ SHOULD_BE_TRUE(params.GetEntryCount() == 6);
+ SHOULD_BE_TRUE(params["a"] == "1");
+ SHOULD_BE_TRUE(params["b"] == "2");
+ SHOULD_BE_TRUE(params["c"] == "3");
+ SHOULD_BE_TRUE(params["d"] == "4");
+ SHOULD_BE_TRUE(params["e"] == ";");
+ SHOULD_BE_TRUE(params["f"] == ";");
+ params.Clear();
+
+ // number parsing
+ float f;
+ int i;
+ int l;
+ NPT_Int32 si32;
+ NPT_UInt32 ui32;
+
+ SHOULD_FAIL(NPT_ParseInteger("ssdfsdf", i, false));
+ SHOULD_FAIL(NPT_ParseInteger("", i, false));
+ SHOULD_FAIL(NPT_ParseInteger(NULL, i, false));
+ SHOULD_FAIL(NPT_ParseInteger("123a", i, false));
+ SHOULD_FAIL(NPT_ParseInteger("a123", i, false));
+ SHOULD_FAIL(NPT_ParseInteger(" 123", i, false));
+ SHOULD_FAIL(NPT_ParseInteger("a 123", i, true));
+ SHOULD_FAIL(NPT_ParseInteger(" a123", i, true));
+
+ SHOULD_SUCCEED(NPT_ParseInteger("+1", i, false));
+ SHOULD_EQUAL_I(i, 1);
+ SHOULD_SUCCEED(NPT_ParseInteger("+123", i, false));
+ SHOULD_EQUAL_I(i, 123);
+ SHOULD_SUCCEED(NPT_ParseInteger("-1", i, false));
+ SHOULD_EQUAL_I(i, -1);
+ SHOULD_SUCCEED(NPT_ParseInteger("-123", i, false));
+ SHOULD_EQUAL_I(i, -123);
+ SHOULD_SUCCEED(NPT_ParseInteger("-123fgs", i, true));
+ SHOULD_EQUAL_I(i, -123);
+ SHOULD_SUCCEED(NPT_ParseInteger(" -123fgs", i, true));
+ SHOULD_EQUAL_I(i, -123);
+ SHOULD_SUCCEED(NPT_ParseInteger("0", i, true));
+ SHOULD_EQUAL_I(i, 0);
+ SHOULD_SUCCEED(NPT_ParseInteger("7768", i, true));
+ SHOULD_EQUAL_I(i, 7768);
+
+ SHOULD_SUCCEED(NPT_ParseInteger("+1", l, false));
+ SHOULD_EQUAL_I(l, 1);
+ SHOULD_SUCCEED(NPT_ParseInteger("+123", l, false));
+ SHOULD_EQUAL_I(l, 123);
+ SHOULD_SUCCEED(NPT_ParseInteger("-1", l, false));
+ SHOULD_EQUAL_I(l, -1);
+ SHOULD_SUCCEED(NPT_ParseInteger("-123", l, false));
+ SHOULD_EQUAL_I(l, -123);
+ SHOULD_SUCCEED(NPT_ParseInteger("-123fgs", l, true));
+ SHOULD_EQUAL_I(l, -123);
+ SHOULD_SUCCEED(NPT_ParseInteger(" -123fgs", l, true));
+ SHOULD_EQUAL_I(l, -123);
+ SHOULD_SUCCEED(NPT_ParseInteger("0", l, true));
+ SHOULD_EQUAL_I(l, 0);
+ SHOULD_SUCCEED(NPT_ParseInteger("7768", l, true));
+ SHOULD_EQUAL_I(l, 7768);
+
+ SHOULD_SUCCEED(NPT_ParseInteger32("2147483647", si32, false));
+ SHOULD_EQUAL_I(si32, 2147483647);
+ SHOULD_SUCCEED(NPT_ParseInteger32("-2147483647", si32, false));
+ SHOULD_EQUAL_I(si32, -2147483647);
+ SHOULD_SUCCEED(NPT_ParseInteger32("-2147483648", si32, false));
+ SHOULD_EQUAL_I(si32, (-2147483647 - 1));
+ SHOULD_FAIL(NPT_ParseInteger32("2147483648", si32, false));
+ SHOULD_FAIL(NPT_ParseInteger32("-2147483649", si32, false));
+ SHOULD_FAIL(NPT_ParseInteger32("-21474836480", si32, false));
+ SHOULD_FAIL(NPT_ParseInteger32("21474836470", si32, false));
+
+ SHOULD_SUCCEED(NPT_ParseInteger32("4294967295", ui32, false));
+ SHOULD_EQUAL_I(ui32, 4294967295U);
+ SHOULD_FAIL(NPT_ParseInteger32("4294967296", ui32, false));
+ SHOULD_FAIL(NPT_ParseInteger32("-1", ui32, false));
+
+ SHOULD_SUCCEED(NPT_ParseInteger64("9223372036854775807", si64, false));
+ SHOULD_EQUAL_I(si64, NPT_INT64_C(9223372036854775807));
+ SHOULD_SUCCEED(NPT_ParseInteger64("-9223372036854775807", si64, false));
+ SHOULD_EQUAL_I(si64, NPT_INT64_C(-9223372036854775807));
+ SHOULD_SUCCEED(NPT_ParseInteger64("-9223372036854775808", si64, false));
+ SHOULD_EQUAL_I(si64, (NPT_INT64_C(-9223372036854775807) - NPT_INT64_C(1)));
+ SHOULD_FAIL(NPT_ParseInteger64("9223372036854775808", si64, false));
+ SHOULD_FAIL(NPT_ParseInteger64("-9223372036854775809", si64, false));
+ SHOULD_FAIL(NPT_ParseInteger64("-9223372036854775897", si64, false));
+ SHOULD_FAIL(NPT_ParseInteger64("9223372036854775897", si64, false));
+
+ SHOULD_SUCCEED(NPT_ParseInteger64("18446744073709551615", ui64, false));
+ SHOULD_EQUAL_I(ui64, NPT_UINT64_C(18446744073709551615));
+ SHOULD_FAIL(NPT_ParseInteger64("18446744073709551616", ui64, false));
+ SHOULD_FAIL(NPT_ParseInteger64("-1", ui64, false));
+
+ SHOULD_FAIL(NPT_ParseFloat("ssdfsdf", f, false));
+ SHOULD_FAIL(NPT_ParseFloat("", f, false));
+ SHOULD_FAIL(NPT_ParseFloat(NULL, f, false));
+ SHOULD_FAIL(NPT_ParseFloat("123.", f, false));
+ SHOULD_FAIL(NPT_ParseFloat("a123", f, false));
+ SHOULD_FAIL(NPT_ParseFloat(" 123", f, false));
+ SHOULD_FAIL(NPT_ParseFloat(" 127.89E5ff", f, false));
+
+ SHOULD_SUCCEED(NPT_ParseFloat("+1.0", f, false));
+ SHOULD_EQUAL_F(f, 1.0f);
+ SHOULD_SUCCEED(NPT_ParseFloat("+123", f, false));
+ SHOULD_EQUAL_F(f, 123.0f);
+ SHOULD_SUCCEED(NPT_ParseFloat("-0.1", f, false));
+ SHOULD_EQUAL_F(f, -0.1f);
+ SHOULD_SUCCEED(NPT_ParseFloat("0.23e-13", f, false));
+ SHOULD_EQUAL_F(f, 0.23e-13f);
+ SHOULD_SUCCEED(NPT_ParseFloat(" 127.89E5ff", f, true));
+ SHOULD_EQUAL_F(f, 127.89E5f);
+ SHOULD_SUCCEED(NPT_ParseFloat("+0.3db", f, true));
+ SHOULD_EQUAL_F(f, 0.3f);
+ SHOULD_SUCCEED(NPT_ParseFloat("+.3db", f, true));
+ SHOULD_EQUAL_F(f, 0.3f);
+ SHOULD_SUCCEED(NPT_ParseFloat("-.3db", f, true));
+ SHOULD_EQUAL_F(f, -0.3f);
+ SHOULD_SUCCEED(NPT_ParseFloat(".3db", f, true));
+ SHOULD_EQUAL_F(f, .3f);
+
+ // FNV hash
+ NPT_UInt32 h32 = NPT_Fnv1aHash32((const NPT_UInt8*)"curds and whey", 14);
+ SHOULD_EQUAL_I(h32, 0x22d5344e);
+ h32 = NPT_Fnv1aHashStr32("curds and whey");
+ SHOULD_EQUAL_I(h32, 0x22d5344e);
+ h32 = NPT_Hash<const char*>()("curds and whey");
+ SHOULD_EQUAL_I(h32, 0x22d5344e);
+
+ NPT_UInt64 h64 = NPT_Fnv1aHash64((const NPT_UInt8*)"curds and whey", 14);
+ SHOULD_EQUAL_I(h64, 0x23e520e2751bb46eULL);
+ h64 = NPT_Fnv1aHashStr64("curds and whey");
+ SHOULD_EQUAL_I(h64, 0x23e520e2751bb46eULL);
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Network1/NetworkTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Network1/NetworkTest1.cpp
new file mode 100644
index 0000000..02477cb
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Network1/NetworkTest1.cpp
@@ -0,0 +1,159 @@
+/*****************************************************************
+|
+| Network Test Program 1
+|
+| (c) 2001-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define CHECK(x) do { if (!(x)) NPT_Console::OutputF("FAILED line %d\n", __LINE__); } while(0)
+
+/*----------------------------------------------------------------------
+| functions
++---------------------------------------------------------------------*/
+static volatile bool NeedToStop = false;
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+class Resolver : public NPT_Thread
+{
+public:
+ Resolver(const char* name, NPT_IpAddress addr) : m_Result(NPT_SUCCESS), m_Name(name), m_Addr(addr) {}
+
+ virtual void Run() {
+ while (!NeedToStop) {
+ NPT_IpAddress addr;
+ m_Result = addr.ResolveName(m_Name);
+ if (NPT_FAILED(m_Result)) {
+ NPT_Console::OutputF("ERROR: ResolveName failed (%d)\n", m_Result);
+ return;
+ }
+ if (!(addr == m_Addr)) {
+ m_Result = NPT_FAILURE;
+ NPT_Console::OutputF("ERROR: wrong IP address (%s instead of %s for %s)\n", addr.ToString().GetChars(), m_Addr.ToString().GetChars(), m_Name.GetChars());
+ return;
+ }
+ }
+ }
+
+private:
+ NPT_Result m_Result;
+ NPT_String m_Name;
+ NPT_IpAddress m_Addr;
+};
+
+/*----------------------------------------------------------------------
+| TestAddresses
++---------------------------------------------------------------------*/
+static void
+TestAddresses()
+{
+ NPT_IpAddress a1 = NPT_IpAddress::Loopback;
+ CHECK(a1.IsLooppack());
+ CHECK(!a1.IsUnspecified());
+ NPT_IpAddress a2 = NPT_IpAddress::Any;
+ CHECK(a2.IsUnspecified());
+#if defined(NPT_CONFIG_ENABLE_IPV6)
+ NPT_IpAddress a3;
+ a3.ResolveName("::1");
+ CHECK(a3.IsLooppack());
+ NPT_IpAddress a4;
+ a4.ResolveName("127.0.0.1");
+ CHECK(a4.IsLooppack());
+
+ NPT_IpAddress a6;
+ a6.ResolveName("::abcd:1234");
+ CHECK(a6.IsV4Compatible());
+
+ NPT_IpAddress a7;
+ a7.ResolveName("::ffff:abcd:1234");
+ CHECK(a7.IsV4Mapped());
+
+ NPT_IpAddress a5;
+ a5.ResolveName("fe80::bae8:56ff:fe45:fc74");
+ CHECK(a5.IsLinkLocal());
+
+ NPT_IpAddress a8;
+ a8.ResolveName("fec3::bae8:56ff:fe45:fc74");
+ CHECK(a8.IsSiteLocal());
+
+ NPT_IpAddress a9;
+ a9.ResolveName("fd00::bae8:56ff:fe45:fc74");
+ CHECK(a9.IsUniqueLocal());
+
+ NPT_IpAddress a10;
+ a10.ResolveName("ff05::2");
+ CHECK(a10.IsMulticast());
+
+#endif
+ NPT_IpAddress b1(192, 168, 1, 1);
+ CHECK(b1.IsUniqueLocal());
+ NPT_IpAddress b2(172, 16, 1, 1);
+ CHECK(b2.IsUniqueLocal());
+ NPT_IpAddress b3(10, 1, 1, 1);
+ CHECK(b3.IsUniqueLocal());
+ NPT_IpAddress b4(169, 254, 1, 1);
+ CHECK(b4.IsLinkLocal());
+ NPT_IpAddress b5(239, 255, 255, 251);
+ CHECK(b5.IsMulticast());
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ // setup debugging
+#if defined(WIN32) && defined(_DEBUG)
+ int flags = _crtDbgFlag |
+ _CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_DELAY_FREE_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF;
+
+ _CrtSetDbgFlag(flags);
+ //AllocConsole();
+ //freopen("CONOUT$", "w", stdout);
+#endif
+
+ TestAddresses();
+
+ NPT_IpAddress addr;
+ NPT_Result result;
+
+ result = addr.ResolveName("www.perdu.com");
+ CHECK(NPT_SUCCEEDED(result));
+ Resolver resolver1("www.perdu.com", addr);
+
+ result = addr.ResolveName("zebulon.bok.net");
+ CHECK(NPT_SUCCEEDED(result));
+ Resolver resolver2("zebulon.bok.net", addr);
+
+ resolver1.Start();
+ resolver2.Start();
+
+ NPT_System::Sleep(10.0);
+ NeedToStop = true;
+ resolver1.Wait();
+ resolver2.Wait();
+
+#if defined(WIN32) && defined(_DEBUG)
+ _CrtDumpMemoryLeaks();
+#endif
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Queue1/QueueTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Queue1/QueueTest1.cpp
new file mode 100644
index 0000000..6afa535
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Queue1/QueueTest1.cpp
@@ -0,0 +1,302 @@
+/*****************************************************************
+|
+| Queue Test Program 1
+|
+| (c) 2008 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+#define CHECK(x) { \
+ if (!(x)) { \
+ printf("TEST FAILED line %d\n", __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+}
+
+/*----------------------------------------------------------------------
+| Item
++---------------------------------------------------------------------*/
+class Item
+{
+public:
+ typedef enum {
+ MSG_INCREMENT_COUNTER,
+ MSG_CHANGE_TIMEOUT,
+ MSG_TERMINATE
+ } Message;
+
+ Item(Message msg) : m_Message(msg) {}
+
+ Message m_Message;
+};
+
+/*----------------------------------------------------------------------
+| WriterThread
++---------------------------------------------------------------------*/
+class WriterThread : public NPT_Thread
+{
+public:
+ WriterThread(NPT_Queue<Item>& queue, const char* name) :
+ m_Queue(queue), m_Name(name), m_Counter(0) {}
+
+ void Run() {
+ NPT_Debug("WRITER %s starting ++++++++++++++++++++++++\n", (const char*)m_Name);
+
+ for (int i=0; i<1000; i++) {
+ if (i%5 == 0) {
+ NPT_Debug("WRITER %s post: change timeout\n", (const char*)m_Name);
+ m_Queue.Push(new Item(Item::MSG_CHANGE_TIMEOUT));
+ }
+ m_Queue.Push(new Item(Item::MSG_INCREMENT_COUNTER));
+ if (i%3 == 0) {
+ NPT_Debug("WRITER %s sleeping\n", (const char*)m_Name);
+ NPT_System::Sleep(NPT_TimeInterval(0.01f));
+ }
+ }
+
+ NPT_Debug("WRITER %s terminating ----------------------\n", (const char*)m_Name);
+ }
+
+ NPT_Queue<Item>& m_Queue;
+ NPT_String m_Name;
+ unsigned int m_Counter;
+};
+
+/*----------------------------------------------------------------------
+| ReaderThread
++---------------------------------------------------------------------*/
+class ReaderThread : public NPT_Thread
+{
+public:
+ ReaderThread(NPT_Queue<Item>& queue, const char* name, NPT_TimeInterval sleep_time) :
+ m_Queue(queue), m_Name(name), m_Counter(0), m_NbTimeouts(0), m_SleepTime(sleep_time) {}
+
+ void Run() {
+ NPT_Debug("READER %s starting =====================\n", (const char*)m_Name);
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE;
+ for (;;) {
+ if (m_SleepTime.ToNanos() != 0) {
+ NPT_Debug("READER %s sleeping...\n", (const char*)m_Name);
+ NPT_System::Sleep(m_SleepTime);
+ NPT_Debug("READER %s woke up!\n", (const char*)m_Name);
+ }
+
+ Item* item = NULL;
+ NPT_Result result = m_Queue.Pop(item, timeout);
+ if (NPT_SUCCEEDED(result)) {
+ CHECK(item != NULL);
+ Item::Message msg = item->m_Message;
+ delete item;
+ switch (msg) {
+ case Item::MSG_INCREMENT_COUNTER:
+ ++m_Counter;
+ NPT_Debug("READER %s new counter=%d\n", (const char*)m_Name, m_Counter);
+ break;
+
+ case Item::MSG_CHANGE_TIMEOUT:
+ if (timeout == 0) {
+ timeout = 15;
+ } else if (timeout == 15) {
+ timeout = NPT_TIMEOUT_INFINITE;
+ } else {
+ timeout = 0;
+ }
+ NPT_Debug("READER %s new timeout=%d\n", (const char*)m_Name, timeout);
+ break;
+
+ case Item::MSG_TERMINATE:
+ NPT_Debug("READER %s terminating #######################\n", (const char*)m_Name);
+ return;
+ }
+ } else {
+ NPT_Debug("READER %s pop returned %d\n", (const char*)m_Name, result);
+ if (timeout == 0) {
+ CHECK(result == NPT_ERROR_LIST_EMPTY);
+ NPT_System::Sleep(0.01f);
+ } else if (timeout != NPT_TIMEOUT_INFINITE) {
+ CHECK(result == NPT_ERROR_TIMEOUT);
+ ++m_NbTimeouts;
+ } else {
+ NPT_ASSERT(0);
+ }
+ }
+ }
+ }
+
+ NPT_Queue<Item>& m_Queue;
+ NPT_String m_Name;
+ unsigned int m_Counter;
+ unsigned int m_NbTimeouts;
+ NPT_TimeInterval m_SleepTime;
+};
+
+/*----------------------------------------------------------------------
+| Test1
++---------------------------------------------------------------------*/
+static void
+Test1()
+{
+ // create a queue
+ NPT_Queue<Item> queue;
+
+ // create 2 writers
+ NPT_Debug("creating writer 1\n");
+ WriterThread writer1(queue, "1"); writer1.Start();
+ NPT_System::Sleep(NPT_TimeInterval(0.3f));
+
+ NPT_Debug("creating writer 2\n");
+ WriterThread writer2(queue, "2"); writer2.Start();
+ NPT_System::Sleep(NPT_TimeInterval(0.3f));
+
+ // create 4 readers
+ NPT_Debug("creating reader 1\n");
+ ReaderThread reader1(queue, "1", NPT_TimeInterval(0.0f)); reader1.Start();
+ NPT_System::Sleep(NPT_TimeInterval(0.3f));
+
+ NPT_Debug("creating reader 2\n");
+ ReaderThread reader2(queue, "2", NPT_TimeInterval(0.0f)); reader2.Start();
+ NPT_System::Sleep(NPT_TimeInterval(0.3f));
+
+ NPT_Debug("creating reader 3\n");
+ ReaderThread reader3(queue, "3", NPT_TimeInterval(0.0f)); reader3.Start();
+ NPT_System::Sleep(NPT_TimeInterval(0.3f));
+
+ NPT_Debug("creating reader 4\n");
+ ReaderThread reader4(queue, "4", NPT_TimeInterval(0.0f)); reader4.Start();
+ NPT_System::Sleep(NPT_TimeInterval(0.3f));
+
+
+ // wait for the writers
+ NPT_Result result;
+ NPT_Debug("Waiting for Writer 1 *********************\n");
+ result = writer1.Wait();
+ NPT_Debug("Writer 1 done *********************\n");
+ CHECK(result == NPT_SUCCESS);
+ NPT_Debug("Waiting for Writer 2 *********************\n");
+ result = writer2.Wait();
+ NPT_Debug("Writer 1 done *********************\n");
+
+ // post 4 termination messages
+ queue.Push(new Item(Item::MSG_TERMINATE));
+ queue.Push(new Item(Item::MSG_TERMINATE));
+ queue.Push(new Item(Item::MSG_TERMINATE));
+ queue.Push(new Item(Item::MSG_TERMINATE));
+
+ // wait for the readers
+ CHECK(result == NPT_SUCCESS);
+ NPT_Debug("Waiting for Reader 1 *********************\n");
+ result = reader1.Wait();
+ NPT_Debug("Reader 1 done *********************\n");
+ CHECK(result == NPT_SUCCESS);
+ NPT_Debug("Waiting for Reader 2 *********************\n");
+ result = reader2.Wait();
+ NPT_Debug("Reader 2 done *********************\n");
+ CHECK(result == NPT_SUCCESS);
+ NPT_Debug("Waiting for Reader 3 *********************\n");
+ result = reader3.Wait();
+ NPT_Debug("Reader 3 done *********************\n");
+ CHECK(result == NPT_SUCCESS);
+ NPT_Debug("Waiting for Reader 4 *********************\n");
+ result = reader4.Wait();
+ NPT_Debug("Reader 4 done *********************\n");
+ CHECK(result == NPT_SUCCESS);
+
+ // check counters
+ unsigned int total = reader1.m_Counter+reader2.m_Counter+reader3.m_Counter+reader4.m_Counter;
+ CHECK(total == 2*1000);
+}
+
+/*----------------------------------------------------------------------
+| Test2
++---------------------------------------------------------------------*/
+static void
+Test2()
+{
+ // create a queue
+ NPT_Queue<Item> queue;
+
+ // create 2 readers
+ NPT_Debug("creating reader 1\n");
+ ReaderThread reader1(queue, "1", NPT_TimeInterval(0.05f)); reader1.Start();
+
+ NPT_Debug("creating reader 2\n");
+ ReaderThread reader2(queue, "2", NPT_TimeInterval(0.065f)); reader2.Start();
+
+ for (int i=0; i<30; i++) {
+ queue.Push(new Item(Item::MSG_INCREMENT_COUNTER));
+ }
+ queue.Push(new Item(Item::MSG_TERMINATE));
+ for (int i=0; i<30; i++) {
+ queue.Push(new Item(Item::MSG_INCREMENT_COUNTER));
+ }
+ queue.Push(new Item(Item::MSG_TERMINATE));
+
+ NPT_Result result;
+ NPT_Debug("Waiting for Reader 1 *********************\n");
+ result = reader1.Wait();
+ NPT_Debug("Reader 1 done *********************\n");
+ CHECK(result == NPT_SUCCESS);
+ NPT_Debug("Waiting for Reader 1 *********************\n");
+ result = reader2.Wait();
+ NPT_Debug("Reader 2 done *********************\n");
+ CHECK(result == NPT_SUCCESS);
+
+ // check counters
+ unsigned int total = reader1.m_Counter+reader2.m_Counter;
+ CHECK(total == 60);
+}
+
+#if defined(WIN32) && defined(_DEBUG)
+static int AllocHook( int allocType, void *userData, size_t size, int blockType,
+ long requestNumber, const unsigned char *filename, int lineNumber)
+{
+ (void)allocType;
+ (void)userData;
+ (void)size;
+ (void)blockType;
+ (void)requestNumber;
+ (void)lineNumber;
+ (void)filename;
+ return 1;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ NPT_COMPILER_UNUSED(argc);
+ NPT_COMPILER_UNUSED(argv);
+
+#if defined(WIN32) && defined(_DEBUG)
+ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF |
+ _CRTDBG_LEAK_CHECK_DF);
+ _CrtSetAllocHook(AllocHook);
+#endif
+
+ Test1();
+ Test2();
+
+ NPT_Debug("- program done -\n");
+
+ return 0;
+}
+
+
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Tests/RingBuffer1/RingBufferTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/RingBuffer1/RingBufferTest1.cpp
new file mode 100644
index 0000000..4347182
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/RingBuffer1/RingBufferTest1.cpp
@@ -0,0 +1,113 @@
+/*****************************************************************
+|
+| RingBuffer Test Program 1
+|
+| (c) 2001-2005 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include <stdlib.h>
+
+#if defined(WIN32)
+#include <crtdbg.h>
+#endif
+
+const unsigned int BUFFER_SIZE = 17;
+
+/*----------------------------------------------------------------------
+| ReadChunk
++---------------------------------------------------------------------*/
+static NPT_Result
+ReadChunk(NPT_RingBuffer& buffer)
+{
+ static unsigned int total_read = 0;
+ unsigned int chunk = rand()%BUFFER_SIZE;
+ unsigned int can_read = buffer.GetAvailable();
+ if (chunk > can_read) chunk = can_read;
+ if (chunk == 0) return NPT_SUCCESS;
+
+ // read a chunk
+ unsigned char bytes[BUFFER_SIZE];
+ NPT_CHECK(buffer.Read(bytes, chunk));
+
+ // check values
+ for (unsigned int i=0; i<chunk; i++) {
+ unsigned int index = total_read+i;
+ unsigned char expected = index & 0xFF;
+ if (bytes[i] != expected) {
+ printf("unexpected byte at index %d (expected %d, got %d)\n",
+ index, expected, bytes[i]);
+ return NPT_FAILURE;
+ }
+ }
+ total_read += chunk;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| WriteChunk
++---------------------------------------------------------------------*/
+static NPT_Result
+WriteChunk(NPT_RingBuffer& buffer)
+{
+ static unsigned int total_written = 0;
+ unsigned int chunk = rand()%BUFFER_SIZE;
+ unsigned int can_write = buffer.GetSpace();
+ if (chunk > can_write) chunk = can_write;
+ if (chunk == 0) return NPT_SUCCESS;
+
+ // generate buffer
+ unsigned char bytes[BUFFER_SIZE];
+ for (unsigned int i=0; i<chunk; i++) {
+ unsigned int index = total_written+i;
+ bytes[i] = index&0xFF;
+ }
+
+ // write chunk
+ NPT_CHECK(buffer.Write(bytes, chunk));
+ total_written += chunk;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ // setup debugging
+#if defined(WIN32) && defined(_DEBUG)
+ int flags = _crtDbgFlag |
+ _CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_DELAY_FREE_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF;
+
+ _CrtSetDbgFlag(flags);
+ //AllocConsole();
+ //freopen("CONOUT$", "w", stdout);
+#endif
+
+ NPT_RingBuffer buffer(BUFFER_SIZE);
+
+ for (int i=0; i<100000000; i++) {
+ if (NPT_FAILED(WriteChunk(buffer))) {
+ printf("WriteChunk failed\n");
+ return 1;
+ }
+ if (NPT_FAILED(ReadChunk(buffer))) {
+ printf("ReadChunk failed\n");
+ return 1;
+ }
+ }
+
+ printf("RingBufferTest1 passed\n");
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/SharedVariables1/SharedVariablesTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/SharedVariables1/SharedVariablesTest1.cpp
new file mode 100644
index 0000000..7dcff58
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/SharedVariables1/SharedVariablesTest1.cpp
@@ -0,0 +1,111 @@
+/*****************************************************************
+|
+| Threads Test Program 1
+|
+| (c) 2001-2012 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+#define CHECK(x) { \
+ if (!(x)) { \
+ NPT_Console::OutputF("TEST FAILED line %d\n", __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+}
+
+/*----------------------------------------------------------------------
+| SharedVariableThread
++---------------------------------------------------------------------*/
+class SharedVariableThread : public NPT_Thread
+{
+public:
+ SharedVariableThread(int ping, int pong, NPT_SharedVariable& shared, float wait) :
+ m_Ping(ping), m_Pong(pong), m_Shared(shared), m_Transitions(0), m_Wait(wait), m_Stop(false), m_Result(NPT_SUCCESS) {}
+
+ void Run() {
+ for (;;) {
+ if (m_Stop) return;
+ NPT_Result result = m_Shared.WaitUntilEquals(m_Ping, 1000);
+ if (result != NPT_SUCCESS) {
+ NPT_Console::Output("timeout\n");
+ m_Result = -1;
+ return;
+ }
+ if (m_Wait != 0.0f) NPT_System::Sleep(m_Wait);
+ m_Shared.SetValue(m_Pong);
+ ++m_Transitions;
+ }
+ }
+
+ int m_Ping;
+ int m_Pong;
+ NPT_SharedVariable& m_Shared;
+ unsigned long m_Transitions;
+ float m_Wait;
+ volatile bool m_Stop;
+ NPT_Result m_Result;
+};
+
+/*----------------------------------------------------------------------
+| TestSharedVariables
++---------------------------------------------------------------------*/
+static void
+TestSharedVariables()
+{
+ NPT_SharedVariable shared;
+ SharedVariableThread t0(1, 2, shared, 0);
+ SharedVariableThread t1(2, 1, shared, 0.001f);
+
+ t0.Start();
+ t1.Start();
+
+ shared.SetValue(1);
+ NPT_Result result = t0.Wait(10000);
+ t0.m_Stop = true;
+ t1.m_Stop = true;
+ t1.Wait();
+
+ NPT_Console::OutputF("T0 transitions=%d, result: %d\n", t0.m_Transitions, t0.m_Result);
+ NPT_Console::OutputF("T1 transitions=%d, result: %d\n", t1.m_Transitions, t1.m_Result);
+
+ CHECK(t0.m_Result == NPT_SUCCESS);
+ CHECK(t1.m_Result == NPT_SUCCESS);
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ NPT_COMPILER_UNUSED(argc);
+ NPT_COMPILER_UNUSED(argv);
+
+#if defined(WIN32) && defined(_DEBUG)
+ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF |
+ _CRTDBG_LEAK_CHECK_DF);
+#endif
+
+ TestSharedVariables();
+
+ NPT_Debug("- program done -\n");
+
+ return 0;
+}
+
+
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Tests/Sockets1/SocketsTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Sockets1/SocketsTest1.cpp
new file mode 100755
index 0000000..aaf46c7
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Sockets1/SocketsTest1.cpp
@@ -0,0 +1,295 @@
+/*****************************************************************
+|
+| Sockets Test Program 1
+|
+| (c) 2001-2010 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+#define CHECK(x) { \
+ if (!(x)) { \
+ printf("TEST FAILED line %d\n", __LINE__); \
+ return 1; \
+ } \
+}
+
+NPT_IpAddress RemoteIpAddress;
+
+/*----------------------------------------------------------------------
+| TcpServerThread
++---------------------------------------------------------------------*/
+class TcpServerThread : public NPT_Thread
+{
+public:
+ TcpServerThread() : m_Socket(NPT_SOCKET_FLAG_CANCELLABLE), m_Interrupted(false) {}
+
+ void Run() {
+ NPT_Console::Output("{02} waiting for connection on port 10000\n");
+ NPT_SocketAddress address(NPT_IpAddress::Any, 10000);
+ NPT_Result result = m_Socket.Bind(address, true);
+ m_Ready.SetValue(1);
+ if (NPT_FAILED(result)) {
+ NPT_Console::OutputF("bind failed (%d) (%s)\n", result, NPT_ResultText(result));
+ return;
+ }
+ NPT_Socket* client = NULL;
+ result = m_Socket.WaitForNewClient(client);
+ NPT_Console::Output("{02} client connected\n");
+ for (;;) {
+ NPT_System::Sleep(1.0);
+ if (m_Interrupted) {
+ NPT_Console::Output("{02} thread interrupted\n");
+ break;
+ }
+ }
+ delete client;
+ NPT_Console::Output("{02} tcp server thread done\n");
+ }
+
+ NPT_TcpServerSocket m_Socket;
+ NPT_SharedVariable m_Ready;
+ volatile bool m_Interrupted;
+};
+
+/*----------------------------------------------------------------------
+| CancellerThread
++---------------------------------------------------------------------*/
+class CancellerThread : public NPT_Thread
+{
+public:
+ CancellerThread(NPT_Socket* socket, NPT_Thread::ThreadId thread_id, float delay, bool shutdown) :
+ m_Socket(socket),
+ m_ThreadId(thread_id),
+ m_Delay(delay),
+ m_Shutdown(shutdown) {
+ Start();
+ m_Ready.WaitUntilEquals(1);
+ }
+
+ void Run() {
+ NPT_Console::OutputF("[XX] will cancel socket in %f\n", m_Delay);
+ m_Ready.SetValue(1);
+ NPT_System::Sleep(m_Delay);
+ if (m_Socket) {
+ NPT_Console::OutputF("[XX] cancelling socket (shutdown=%s)\n", m_Shutdown?"yes":"no");
+ m_Socket->Cancel(m_Shutdown);
+ } else {
+ NPT_Console::OutputF("[XX] cancelling blocker sockets for thread %p (shutdown=%s)\n", (void*)m_ThreadId, m_Shutdown?"yes":"no");
+ NPT_Socket::CancelBlockerSocket(m_ThreadId);
+ }
+ }
+
+ NPT_Socket* m_Socket;
+ NPT_Thread::ThreadId m_ThreadId;
+ float m_Delay;
+ bool m_Shutdown;
+ NPT_SharedVariable m_Ready;
+};
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ // setup debugging
+#if defined(WIN32) && defined(_DEBUG)
+ int flags = _crtDbgFlag |
+ _CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_DELAY_FREE_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF;
+
+ _CrtSetDbgFlag(flags);
+ //AllocConsole();
+ //freopen("CONOUT$", "w", stdout);
+#endif
+
+ NPT_Result result;
+ TcpServerThread* server_thread = NULL;
+ NPT_TcpClientSocket* tcp_client = NULL;
+ NPT_TcpServerSocket* tcp_server = NULL;
+ CancellerThread* canceller = NULL;
+
+ NPT_SocketAddress address(NPT_IpAddress(127,0,0,1), 10000);
+ result = RemoteIpAddress.ResolveName("google.com");
+ CHECK(result == NPT_SUCCESS);
+#if 0
+ NPT_Console::Output("--- test for immediate connection\n");
+ NPT_Console::Output("[01] starting write server thread\n");
+ server_thread = new TcpServerThread();
+ server_thread->Start();
+ NPT_Console::Output("[01] waiting for server to be ready...\n");
+ server_thread->m_Ready.WaitUntilEquals(1);
+ NPT_Console::Output("[01] server thread ready\n");
+ NPT_Console::Output("[01] waiting a while...\n");
+ NPT_System::Sleep(3.0);
+ tcp_client = new NPT_TcpClientSocket();
+ NPT_Console::Output("[01] connection to 127.0.0.1:10000\n");
+ result = tcp_client->Connect(address);
+ NPT_Console::OutputF("[01] connect returns %d : %s\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_SUCCESS);
+ delete tcp_client;
+ NPT_Console::Output("[01] terminating server\n");
+ server_thread->m_Interrupted = true;
+ server_thread->Wait();
+ delete server_thread;
+
+ NPT_Console::Output("\n--- test for refused local connection\n");
+ address.SetPort(89);
+ tcp_client = new NPT_TcpClientSocket();
+ NPT_Console::Output("[01] connecting to 127.0.0.1:89\n");
+ result = tcp_client->Connect(address);
+ NPT_Console::OutputF("[01] connect returns %d : %s\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_ERROR_CONNECTION_REFUSED);
+ delete tcp_client;
+
+ /*NPT_Console::Output("\n--- test for refused remote connection\n");
+ address.SetIpAddress(RemoteIpAddress);
+ address.SetPort(81);
+ tcp_client = new NPT_TcpClientSocket();
+ NPT_Console::Output("[01] connecting to www.google.com:81\n");
+ result = tcp_client->Connect(address);
+ NPT_Console::OutputF("[01] connect returns %d : %s\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_ERROR_CONNECTION_REFUSED);
+ delete tcp_client;*/
+
+ NPT_Console::Output("\n--- test for connection timeout\n");
+ address.SetIpAddress(NPT_IpAddress(1,1,1,1));
+ NPT_Console::Output("[01] connecting to 1.1.1.1:89\n");
+ tcp_client = new NPT_TcpClientSocket();
+ result = tcp_client->Connect(address, 3000);
+ NPT_Console::OutputF("[01] connect returns %d : %s\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_ERROR_TIMEOUT);
+ delete tcp_client;
+
+ NPT_Console::Output("\n--- test for remote connection\n");
+ address.SetIpAddress(RemoteIpAddress);
+ address.SetPort(80);
+ NPT_Console::Output("[01] connecting to www.google.com:80\n");
+ tcp_client = new NPT_TcpClientSocket();
+ result = tcp_client->Connect(address);
+ NPT_Console::OutputF("[01] connect returns %d : %s\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_SUCCESS);
+ delete tcp_client;
+#endif
+
+ for (int i=0; i<4; i++) {
+ bool shutdown = (i==1 || i==3);
+ NPT_Console::OutputF("\n--- test for cancelled connection, shutdown=%s\n", shutdown?"yes":"no");
+ address.SetIpAddress(NPT_IpAddress(1,1,1,1));
+ address.SetPort(89);
+ NPT_Console::Output("[01] connecting to 1.1.1.1:89\n");
+ tcp_client = new NPT_TcpClientSocket(NPT_SOCKET_FLAG_CANCELLABLE);
+ canceller = new CancellerThread(i < 2 ? tcp_client:NULL, NPT_Thread::GetCurrentThreadId(), 3.0f, shutdown);
+ result = tcp_client->Connect(address);
+ NPT_Console::OutputF("[01] connect returns %d : %s\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_ERROR_CANCELLED);
+ canceller->Wait();
+ delete canceller;
+ delete tcp_client;
+ }
+
+ for (int i=0; i<4; i++) {
+ bool shutdown = (i==1 || i==3);
+ NPT_Console::OutputF("\n--- testing read cancellation, shutdown=%s\n", shutdown?"yes":"no");
+ address.SetIpAddress(RemoteIpAddress);
+ address.SetPort(80);
+ NPT_Console::Output("[01] connecting to www.google.com:80\n");
+ tcp_client = new NPT_TcpClientSocket(NPT_SOCKET_FLAG_CANCELLABLE);
+ result = tcp_client->Connect(address);
+ NPT_Console::OutputF("[01] connect returns %d : %s\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_SUCCESS);
+ canceller = new CancellerThread(i < 2 ? tcp_client:NULL, NPT_Thread::GetCurrentThreadId(), 3.0f, shutdown);
+ NPT_InputStreamReference input;
+ tcp_client->GetInputStream(input);
+ unsigned char buffer[4096];
+ NPT_SetMemory(buffer, 0, sizeof(buffer));
+ result = input->Read(buffer, 4096);
+ NPT_Console::OutputF("{00} read returned %d (%s)\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_ERROR_CANCELLED);
+ delete tcp_client;
+ canceller->Wait();
+ delete canceller;
+ }
+
+ for (int i=0; i<4; i++) {
+ bool shutdown = (i==1 || i==3);
+ NPT_Console::OutputF("\n--- testing write cancellation, shutdown=%s\n", shutdown?"yes":"no");
+ server_thread = new TcpServerThread();
+ server_thread->Start();
+ NPT_Console::Output("[01] waiting for server to be ready...\n");
+ server_thread->m_Ready.WaitUntilEquals(1);
+ NPT_Console::Output("[01] server thread ready\n");
+ NPT_Console::Output("[01] waiting a while...\n");
+ NPT_System::Sleep(3.0);
+ address.SetIpAddress(NPT_IpAddress(127,0,0,1));
+ address.SetPort(10000);
+ NPT_Console::Output("[01] connecting to localhost:10000\n");
+ tcp_client = new NPT_TcpClientSocket(NPT_SOCKET_FLAG_CANCELLABLE);
+ result = tcp_client->Connect(address);
+ NPT_Console::OutputF("[01] connect returns %d : %s\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_SUCCESS);
+ canceller = new CancellerThread(i < 2 ? tcp_client:NULL, NPT_Thread::GetCurrentThreadId(), 3.0f, shutdown);
+ NPT_OutputStreamReference output;
+ tcp_client->GetOutputStream(output);
+ NPT_Size total_written = 0;
+ unsigned char buffer[4096];
+ NPT_SetMemory(buffer, 0, sizeof(buffer));
+ do {
+ NPT_Size bytes_written = 0;
+ result = output->Write(buffer, 4096, &bytes_written);
+ if (NPT_SUCCEEDED(result)) {
+ total_written += bytes_written;
+ }
+ } while (NPT_SUCCEEDED(result));
+ output = NULL;
+ NPT_Console::OutputF("{01} write returned %d (%s)\n", result, NPT_ResultText(result));
+ NPT_Console::OutputF("{01} wrote %d bytes total\n", total_written);
+ CHECK(result == NPT_ERROR_CANCELLED);
+ delete tcp_client;
+ canceller->Wait();
+ delete canceller;
+ server_thread->m_Interrupted = true;
+ server_thread->Wait();
+ delete server_thread;
+ }
+
+ for (int i=0; i<4; i++) {
+ bool shutdown = (i==1 || i==3);
+ NPT_Console::OutputF("\n--- testing accept cancellation, shutdown=%s\n", shutdown?"yes":"no");
+ NPT_Console::Output("{03} waiting for connection on port 10000\n");
+ address.SetIpAddress(NPT_IpAddress(127,0,0,1));
+ address.SetPort(10000);
+ tcp_server = new NPT_TcpServerSocket(NPT_SOCKET_FLAG_CANCELLABLE);
+ result = tcp_server->Bind(address, true);
+ CHECK(result == NPT_SUCCESS);
+ canceller = new CancellerThread(i < 2 ? tcp_server:NULL, NPT_Thread::GetCurrentThreadId(), 3.0f, shutdown);
+ NPT_Socket* new_client = NULL;
+ result = tcp_server->WaitForNewClient(new_client);
+ NPT_Console::OutputF("{03} WaitForNewClient returned %d (%s)\n", result, NPT_ResultText(result));
+ CHECK(result == NPT_ERROR_CANCELLED);
+ canceller->Wait();
+ delete canceller;
+ delete tcp_server;
+ }
+
+ NPT_Console::Output("------------\n");
+ NPT_Console::Output("bye bye\n");
+
+#if defined(WIN32) && defined(_DEBUG)
+ _CrtDumpMemoryLeaks();
+#endif
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Streams1/StreamsTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Streams1/StreamsTest1.cpp
new file mode 100644
index 0000000..8de83e2
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Streams1/StreamsTest1.cpp
@@ -0,0 +1,74 @@
+/*****************************************************************
+|
+| Streams Test Program 1
+|
+| (c) 2005-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Neptune.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ NPT_StringOutputStream sos;
+ NPT_ASSERT(sos.GetString().GetLength() == 0);
+ sos.WriteString("hello");
+ NPT_ASSERT(sos.GetString() == "hello");
+ sos.Reset();
+ NPT_ASSERT(sos.GetString().GetLength() == 0);
+
+ NPT_MemoryStream mems;
+ NPT_ASSERT(mems.GetDataSize() == 0);
+ NPT_LargeSize available;
+ NPT_ASSERT(mems.GetAvailable(available) == NPT_SUCCESS);
+ NPT_ASSERT(available == 0);
+ NPT_COMPILER_UNUSED(available);
+
+ mems.WriteUI08(1);
+ mems.WriteUI16(0x0203);
+ mems.WriteUI24(0x040506);
+ mems.WriteUI32(0x0708090A);
+ mems.WriteUI64( (((NPT_UInt64)0x0B0C0D0E)<<32) | (((NPT_UInt64)0x0F000102)) );
+ NPT_ASSERT(mems.GetAvailable(available) == NPT_SUCCESS);
+ NPT_ASSERT(available == 18);
+ NPT_ASSERT(mems.GetSize(available) == NPT_SUCCESS);
+ NPT_ASSERT(available == 18);
+ NPT_ASSERT(mems.GetDataSize() == 18);
+
+ for (int i=0; i<18; i++) {
+ NPT_ASSERT(mems.GetData()[i] == (1+i)%16);
+ }
+
+ NPT_UInt64 i64;
+ NPT_UInt32 i32;
+ NPT_UInt32 i24;
+ NPT_UInt16 i16;
+ NPT_UInt8 i8;
+ mems.ReadUI08(i8);
+ mems.ReadUI16(i16);
+ mems.ReadUI24(i24);
+ mems.ReadUI32(i32);
+ mems.ReadUI64(i64);
+ NPT_ASSERT(i8 == 1);
+ NPT_ASSERT(i16 == 0x0203);
+ NPT_ASSERT(i24 == 0x040506);
+ NPT_ASSERT(i32 == 0x0708090A);
+ NPT_ASSERT(i64 == ((((NPT_UInt64)0x0B0C0D0E)<<32) | (((NPT_UInt64)0x0F000102))));
+ NPT_ASSERT(mems.GetDataSize() == 18);
+ NPT_ASSERT(mems.GetAvailable(available) == NPT_SUCCESS);
+ NPT_ASSERT(available == 0);
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Strings1/StringsTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Strings1/StringsTest1.cpp
new file mode 100644
index 0000000..69e7132
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Strings1/StringsTest1.cpp
@@ -0,0 +1,663 @@
+/*****************************************************************
+|
+| Stings Test Program 1
+|
+| (c) 2001-2003 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| Fail
++---------------------------------------------------------------------*/
+static void
+Fail()
+{
+ printf("##################################\n");
+ NPT_ASSERT(0);
+ //exit(1);
+}
+
+/*----------------------------------------------------------------------
+| CompareTest
++---------------------------------------------------------------------*/
+static void
+CompareTest(const char* name, const char* a, const char* b, int result, int expected)
+{
+ printf("%s %s %s = %d [%s]\n", a, name, b, result, result == expected ? "pass" : "fail");
+ if (result != expected) Fail();
+}
+
+/*----------------------------------------------------------------------
+| EqualTest
++---------------------------------------------------------------------*/
+static void
+EqualTest(const char* name, const char* a, const char* b, const char* expected)
+{
+ printf("op %s on %s, result = %s ", name, a, b);
+ if (strcmp(expected, b)) {
+ printf(" [fail: expected %s, got %s]\n", expected, b);
+ } else {
+ printf(" [pass]\n");
+ }
+ if (strcmp(expected, b)) Fail();
+}
+
+/*----------------------------------------------------------------------
+| StringTest
++---------------------------------------------------------------------*/
+static void
+StringTest(const char* name, const char* a, const char* expected)
+{
+ printf("%s: %s", name, a);
+ if (strcmp(expected, a)) {
+ printf(" [fail: expected %s, got %s]\n", expected, a);
+ } else {
+ printf(" [pass]\n");
+ }
+ if (strcmp(expected, a)) Fail();
+}
+
+/*----------------------------------------------------------------------
+| IntTest
++---------------------------------------------------------------------*/
+static void
+IntTest(const char* name, int a, int expected)
+{
+ printf("%s: %d", name, a);
+ if (a != expected) {
+ printf(" [fail: expected %d, got %d]\n", expected, a);
+ } else {
+ printf(" [pass]\n");
+ }
+ if (a != expected) Fail();
+}
+
+/*----------------------------------------------------------------------
+| FloatTest
++---------------------------------------------------------------------*/
+static void
+FloatTest(const char* name, float a, float expected)
+{
+ printf("%s: %f", name, a);
+ if (a != expected) {
+ printf(" [fail: expected %f, got %f]\n", expected, a);
+ } else {
+ printf(" [pass]\n");
+ }
+ if (a != expected) Fail();
+}
+
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ printf(":: testing empty string\n");
+ NPT_String s;
+ printf("sizeof(s)=%d, chars = '%s'\n", (int)sizeof(s), s.GetChars());
+
+ printf(":: testing allocation, new and delete\n");
+ NPT_String* n0 = new NPT_String("Hello");
+ delete n0;
+ NPT_String n1 = "Bye";
+ n1 = "ByeBye";
+
+ printf(":: testing factories\n");
+ NPT_String f0 = NPT_String::FromInteger(0);
+ StringTest("FromInteger(0)", f0, "0");
+ f0 = NPT_String::FromInteger(1234567);
+ StringTest("FromInteger(1234567)", f0, "1234567");
+ f0 = NPT_String::FromInteger(-1234567);
+ StringTest("FromInteger(-1234567)", f0, "-1234567");
+ f0 = NPT_String::FromIntegerU(0xFFFFFFFF);
+ StringTest("FromIntegerU(0xFFFFFFFF)", f0, "4294967295");
+
+ printf(":: testing constructors\n");
+ NPT_String s00;
+ StringTest("constructor()", s00, "");
+ NPT_String s01("abcdef");
+ StringTest("constructor(const char*)", s01, "abcdef");
+ NPT_String s02(s01);
+ StringTest("constructor(const NPT_String&)", s02, "abcdef");
+ NPT_String s03("abcdefgh", 3);
+ StringTest("constructor(const char* s, unsigned int)", s03, "abc");
+ NPT_String s04('Z');
+ StringTest("constructor(char)", s04, "Z");
+ NPT_String s05('Z', 7);
+ StringTest("constructor(char, unsigned int)", s05, "ZZZZZZZ");
+ NPT_String s06((const char*)NULL);
+ StringTest("constructor(NULL)", s06, "");
+ NPT_String s07(s06);
+ StringTest("constructor(const NPT_String& = empty)", s07, "");
+ NPT_String s08("");
+ StringTest("constructor(const char* = \"\")", s08, "");
+ NPT_String s09("jkhlkjh\0fgsdfg\0fgsdfg", 10);
+ StringTest("NPT_String s09(\"jkhlkjh\0fgsdfg\0fgsdfg\", 0, 10)", s09, "jkhlkjh");
+ NPT_String s10((const char*)NULL, 0);
+ StringTest("NPT_String s10(NULL, 0)", s10, "");
+ NPT_String s11(' ', 0);
+ StringTest("NPT_String s11(' ', 0)", s11, "");
+
+ printf(":: testing assignments\n");
+ NPT_String a00 = (const char*)NULL;
+ StringTest("operator=(const char* = NULL)", a00, "");
+ NPT_String a01 = a00;
+ StringTest("operator=(const NPT_String& = empty)", a01, "");
+ NPT_String a02 = "ab";
+ StringTest("operator=(const char*)", a02, "ab");
+ a02 = "abc";
+ StringTest("operator=(const char* = bigger string)", a02, "abc");
+ a02 = "ab";
+ StringTest("operator=(const char* = smaller)", a02, "ab");
+ a02 = (const char*)NULL;
+ StringTest("operator=(const char* = NULL)", a02, "");
+ a02 = "abcd";
+ NPT_String a03 = a02;
+ a02 = "ab";
+ StringTest("operator=(const char*) with shared buffer", a02, "ab");
+ a02 = "";
+ StringTest("operator=(const char* = \"\")", a02, "");
+ NPT_String p2("self");
+ p2 = p2;
+ StringTest("self assignment", p2, "self");
+ NPT_String p3 = p2;
+ p2 = p2;
+ StringTest("self assignment with other ref", p2, "self");
+
+ printf(":: testing SetLength()\n");
+ NPT_String sl00;
+ IntTest("", sl00.SetLength(0), NPT_SUCCESS);
+ IntTest("", sl00.SetLength(3, true), NPT_SUCCESS);
+ StringTest("", sl00, " ");
+ sl00.Assign("blabla", 6);
+ IntTest("", sl00.SetLength(7, true), NPT_SUCCESS);
+ StringTest("", sl00, "blabla ");
+ IntTest("", sl00.SetLength(3), NPT_SUCCESS);
+ StringTest("", sl00, "bla");
+ IntTest("", sl00.SetLength(0), NPT_SUCCESS);
+ StringTest("", sl00, "");
+
+ printf(":: testing casts\n");
+ s = "hello";
+ printf(":: cast to char*\n");
+ StringTest("cast to char*", (char*)s, "hello");
+ StringTest("cast to const char*", (const char*)s, "hello");
+
+ printf(":: testing GetLength\n");
+ NPT_String gl0 = "abcefg";
+ IntTest("GetLength", gl0.GetLength(), 6);
+ gl0 = "";
+ IntTest("GetLength", gl0.GetLength(), 0);
+ gl0 = "abcd";
+ NPT_String gl1 = gl0;
+ IntTest("GetLength", gl1.GetLength(), 4);
+ gl1 += 'd';
+ IntTest("GetLength", gl1.GetLength(), 5);
+
+ printf("::testing references\n");
+ NPT_String* d1;
+ NPT_String d2;
+ NPT_String d3;
+ d1 = new NPT_String("first ref");
+ d2 = *d1;
+ delete d1;
+ d1 = NULL;
+ printf("%s", d2.GetChars());
+ d3 = d2;
+ d3 = "d3";
+ printf("%s", d2.GetChars());
+ printf("%s", d3.GetChars());
+
+ printf("::testing Append\n");
+ NPT_String l = "blabla";
+ l.Append("blibliblo", 6);
+ StringTest("append(const char*, int size)", l, "blablablibli");
+ NPT_String a;
+ a.Append("bloblo", 3);
+ StringTest("append to NULL", a, "blo");
+
+ printf("::testing Reserve\n");
+ NPT_String r = "123";
+ r.Reserve(100);
+ IntTest("size of string not changed", 3, r.GetLength());
+ r += "4";
+ r += "5";
+ r += "6";
+ NPT_String r2 = r; // make a new reference
+ r += "7";
+ r += "8";
+ r2 += "a";
+ r2 += "b";
+ StringTest("string r not changed", r, "12345678");
+ StringTest("string r2 not changed", r2, "123456ab");
+ NPT_String rr0 = "hello";
+ rr0.Reserve(0);
+ StringTest("string rr0 not changed", rr0, "hello");
+ rr0.Reserve(100);
+ StringTest("string rr0 not changed", rr0, "hello");
+
+ printf(":: testing substring");
+ NPT_String sup("abcdefghijklmnopqrstub");
+ NPT_String sub = sup.SubString(0, 2);
+ StringTest("substring [0,2] of 'abcdefghijklmnopqrstub'", sub, "ab");
+ sub = sup.SubString(3, 4);
+ StringTest("substring [3,4] of 'abcdefghijklmnopqrstub'", sub, "defg");
+ sub = sup.SubString(100, 5);
+ StringTest("substring [100,5] of 'abcdefghijklmnopqrstub'", sub, "");
+ sub = sup.SubString(8,100);
+ StringTest("substring [8,100] of 'abcdefghijklmnopqrstub'", sub, "ijklmnopqrstub");
+ printf(":: decl NPT_String sub2(p2, 1, 2);\n");
+
+ printf(":: testing trims");
+ NPT_String trim = "*&##just this$&**";
+ trim.TrimLeft('*');
+ StringTest("TrimLeft('*') of '*&##just this$&**'", trim, "&##just this$&**");
+ trim.TrimLeft("*&##");
+ StringTest("TrimLeft('&*##')", trim, "just this$&**");
+ trim.TrimRight('*');
+ StringTest("TrimRight('*')", trim, "just this$&");
+ trim.TrimRight("*&##");
+ StringTest("TrimRight('*&##')", trim, "just this$");
+ trim = "*&##just this$&**";
+ trim.Trim("$&*#");
+ StringTest("Trim('$&*#') of '*&##just this$&**'", trim, "just this");
+ trim = "\r\njust this\t \r\n";
+ trim.Trim();
+ StringTest("Trim() of '\\r\\njust this\\t \\r\\n'", trim, "just this");
+ trim = "*&##just this$&**";
+ trim.Trim('*');
+ StringTest("", trim, "&##just this$&");
+
+ printf(":: testing operator+=(NPT_String&)\n");
+ NPT_String o1 = "hello";
+ NPT_String o2 = ", gilles";
+ o1 += o2;
+ StringTest("operator +=", o1, "hello, gilles");
+ o1 += ", some more";
+ StringTest("operator +=", o1, "hello, gilles, some more");
+
+ o1 = "abc";
+ o1 += '#';
+ StringTest("operator+=(char)", o1, "abc#");
+
+ o1 = "hello";
+ o2 = ", gilles";
+ NPT_String o3 = o1+o2;
+ StringTest("operator+(NPT_String&, NPT_String&)", o3, "hello, gilles");
+ o3 = o1+", gilles";
+ StringTest("operator+(NPT_String&, const char*)", o3, "hello, gilles");
+ o3 = "I say:"+o1;
+ StringTest("operator+(const char*, NPT_String&)", o3, "I say:hello");
+ o3 = NPT_String("one, ") + "two";
+ StringTest("NPT_String(\"one, \") + \"two\";", o3, "one, two");
+
+ printf(":: testing operator[]\n");
+ o1 = "abcdefgh";
+ IntTest("o1[0]", 'a', o1[0]);
+ IntTest("o1[1]", 'b', o1[1]);
+ IntTest("o1[2]", 'c', o1[2]);
+ o1[0] = '7';
+ IntTest("o1[0]", '7', o1[0]);
+
+ printf(":: testing operator comparisons\n");
+ CompareTest(">", "abc", "abc", NPT_String("abc") > "abc", 0);
+ CompareTest(">=", "abc", "abc", NPT_String("abc") >= "abc", 1);
+ CompareTest("==", "abc", "abc", NPT_String("abc") == "abc", 1);
+ CompareTest("!=", "abc", "abc", NPT_String("abc") != "abc", 0);
+ CompareTest("<", "abc", "abc", NPT_String("abc") < "abc", 0);
+ CompareTest("<=", "abc", "abc", NPT_String("abc") <= "abc", 1);
+
+ CompareTest(">", "abc", "ab", NPT_String("abc") > "ab", 1);
+ CompareTest(">=", "abc", "ab", NPT_String("abc") >= "ab", 1);
+ CompareTest("==", "abc", "ab", NPT_String("abc") == "ab", 0);
+ CompareTest("!=", "abc", "ab", NPT_String("abc") != "ab", 1);
+ CompareTest("<", "abc", "ab", NPT_String("abc") < "ab", 0);
+ CompareTest("<=", "abc", "ab", NPT_String("abc") <= "ab", 0);
+
+ CompareTest(">", "ab", "abc", NPT_String("ab") > "abc", 0);
+ CompareTest(">=", "ab", "abc", NPT_String("ab") >= "abc", 0);
+ CompareTest("==", "ab", "abc", NPT_String("ab") == "abc", 0);
+ CompareTest("!=", "ab", "abc", NPT_String("ab") != "abc", 1);
+ CompareTest("<", "ab", "abc", NPT_String("ab") < "abc", 1);
+ CompareTest("<=", "ab", "abc", NPT_String("ab") <= "abc", 1);
+
+ CompareTest(">", "bc", "abc", NPT_String("bc") > "abc", 1);
+ CompareTest(">=", "bc", "abc", NPT_String("bc") >= "abc", 1);
+ CompareTest("==", "bc", "abc", NPT_String("bc") == "abc", 0);
+ CompareTest("!=", "bc", "abc", NPT_String("bc") != "abc", 1);
+ CompareTest("<", "bc", "abc", NPT_String("bc") < "abc", 0);
+ CompareTest("<=", "bc", "abc", NPT_String("bc") <= "abc", 0);
+
+ CompareTest(">", "abc", "bc", NPT_String("abc") > "bc", 0);
+ CompareTest(">=", "abc", "bc", NPT_String("abc") >= "bc", 0);
+ CompareTest("==", "abc", "bc", NPT_String("abc") == "bc", 0);
+ CompareTest("!=", "abc", "bc", NPT_String("abc") != "bc", 1);
+ CompareTest("<", "abc", "bc", NPT_String("abc") < "bc", 1);
+ CompareTest("<=", "abc", "bc", NPT_String("abc") <= "bc", 1);
+
+ printf(":: testing Compare\n");
+ CompareTest("cnc", "abc", "abc", NPT_String("abc").Compare("abc", true), 0);
+ CompareTest("cnc", "AbC3", "aBC3", NPT_String("AbC3").Compare("aBC3", true), 0);
+ CompareTest("cnc", "AbCc", "aBcD", NPT_String("AbCc").Compare("aBcD", true), -1);
+ CompareTest("cnc", "AbCC", "aBcd", NPT_String("AbCC").Compare("aBcd", true), -1);
+ CompareTest("cnc", "bbCc", "aBcc", NPT_String("bbCc").Compare("aBcc", true), 1);
+ CompareTest("cnc", "BbCC", "aBcc", NPT_String("BbCC").Compare("aBcc", true), 1);
+ CompareTest("cnc", "AbCC", "aBcd", NPT_String("AbCC").CompareN("aBcd", 4, true), -1);
+ CompareTest("cnc", "AbCC", "aBcd", NPT_String("AbCC").CompareN("aBcd", 5, true), -1);
+ CompareTest("cnc", "AbCC", "aBcd", NPT_String("AbCC").CompareN("aBcd", 3, true), 0);
+
+ printf(":: testing MakeLowercase\n");
+ NPT_String lower = "abcdEFGhijkl";
+ lower.MakeLowercase();
+ EqualTest("MakeLowercase (noref)", "abcdEFGhijkl", lower, "abcdefghijkl");
+ lower = "abcdEFGhijkl";
+ NPT_String lower2 = lower;
+ lower2.MakeLowercase();
+ EqualTest("MakeLowercase (ref)", "abcdEFGhijkl", lower2, "abcdefghijkl");
+
+ printf(":: testing MakeUppercase\n");
+ NPT_String upper = "abcdEFGhijkl";
+ upper.MakeUppercase();
+ EqualTest("MakeUppercase (noref)", "abcdEFGhijkl", upper, "ABCDEFGHIJKL");
+ upper = "abcdEFGhijkl";
+ NPT_String upper2 = upper;
+ upper2.MakeUppercase();
+ EqualTest("MakeUppercase (ref)", "abcdEFGhijkl", upper2, "ABCDEFGHIJKL");
+
+ printf(":: testing ToLowercase\n");
+ lower = "abcdEFGhijkl";
+ EqualTest("ToLowercase", "abcdEFGhijkl", lower.ToLowercase(), "abcdefghijkl");
+
+ printf(":: testing ToUppercase\n");
+ upper = "abcdEFGhijkl";
+ EqualTest("ToUppercase", "abcdEFGhijkl", lower.ToUppercase(), "ABCDEFGHIJKL");
+
+ printf(":: testing Find (s=\"au clair de la lune\")\n");
+ s = "au clair de la lune";
+ int f = s.Find("au");
+ IntTest("Find(\"au\")", f, 0);
+ f = s.Find("clair");
+ IntTest("Find(\"clair\")", f, 3);
+ f = s.Find("luneb");
+ IntTest("Find(\"luneb\")", f, -1);
+ f = s.Find((const char*)NULL);
+ IntTest("Find(NULL)", f, -1);
+ f = s.Find("hello");
+ IntTest("Find(\"hello\")", f, -1);
+ f = s.Find("");
+ IntTest("Find(\"\")", f, 0);
+ f = s.Find("clair", 2);
+ IntTest("Find(\"clair\", 2)", f, 3);
+ f = s.Find("clair", 100);
+ IntTest("Find(\"clair\", 100)", f, -1);
+ f = s.Find("cloir");
+ IntTest("Find(\"cloir\")", f, -1);
+ f = s.Find("au clair de la lune");
+ IntTest("Find(\"au clair de la lune\")", f, 0);
+ f = s.Find("au clair de la lune mon ami");
+ IntTest("Find(\"au clair de la lune mon ami\")", f, -1);
+ f = s.Find('c');
+ IntTest("Find('c')", f, 3);
+ NPT_String s1;
+ f = s1.Find("hello");
+ IntTest("Find() in empty string", f, -1);
+ f = s.Find("Clair De La Lune", 0, true);
+ IntTest("s.Find(\"Clair De La Lune\"", f, 3);
+ f = s.Find('z');
+ IntTest("", f, -1);
+ f = s.Find('a', 1);
+ IntTest("", f, 5);
+ f = s.Find('C', 0, true);
+ IntTest("", f, 3);
+
+ printf(":: testing ReverseFind\n");
+ s = "aabbccaa";
+ f = s.ReverseFind("a");
+ IntTest("", f, 7);
+ f = s.ReverseFind("a", 1);
+ IntTest("", f, 6);
+ f = s.ReverseFind("a", 9);
+ IntTest("", f, -1);
+ f = s.ReverseFind("aab");
+ IntTest("", f, 0);
+ f = s.ReverseFind((const char*)NULL);
+ IntTest("", f, -1);
+ f = s.ReverseFind("");
+ IntTest("", f, -1);
+ f = s.ReverseFind("aa", 1);
+ IntTest("", f, 0);
+ f = s.ReverseFind("aabbccaa");
+ IntTest("", f, 0);
+ f = s.ReverseFind("aabbccaaa");
+ IntTest("", f, -1);
+ f = s.ReverseFind("zz");
+ IntTest("", f, -1);
+ f = s.ReverseFind('z');
+ IntTest("", f, -1);
+ f = s.ReverseFind('b');
+ IntTest("", f, 3);
+ f = s.ReverseFind('a', 2);
+ IntTest("", f, 1);
+ f = s.ReverseFind('B', 0, true);
+ IntTest("", f, 3);
+ f = s.ReverseFind('B');
+ IntTest("", f, -1);
+
+ printf(":: testing StartsWith\n");
+ bool b = s.StartsWith("");
+ IntTest("", b, 1);
+ b = s.StartsWith("aaba");
+ IntTest("", b, 0);
+ b = s.StartsWith("aabbccaaa");
+ IntTest("", b, 0);
+ b = s.StartsWith("aabb");
+ IntTest("", b, 1);
+ b = s.StartsWith("AaB", true);
+ IntTest("", b, 1);
+ b = s.StartsWith("AaB");
+ IntTest("", b, 0);
+
+ printf(":: testing EndsWith\n");
+ b = s.EndsWith("");
+ IntTest("", b, 1);
+ b = s.EndsWith("aaba");
+ IntTest("", b, 0);
+ b = s.EndsWith("aabbccaaa");
+ IntTest("", b, 0);
+ b = s.EndsWith("ccaa");
+ IntTest("", b, 1);
+ b = s.EndsWith("CcAa", true);
+ IntTest("", b, 1);
+ b = s.EndsWith("CcAa");
+ IntTest("", b, 0);
+
+ printf(":: testing Replace\n");
+ NPT_String r0 = "abcdefghijefe";
+ r0.Replace('e','@');
+ StringTest("Replace(char, char)", r0, "abcd@fghij@f@");
+ NPT_String r1 = r0;
+ r1.Replace('@', '#');
+ StringTest("Replace(char, char)", r1, "abcd#fghij#f#");
+ r2 = "blablabla";
+ r2.Replace("bla", "blu");
+ StringTest("Replace(str, str)", r2, "blublublu");
+ r2 = "abcdefxxxxijxxxx0";
+ r2.Replace("xxxx", "y");
+ StringTest("Replace(str, str)", r2, "abcdefyijy0");
+ r2 = "abcdefxijx0";
+ r2.Replace("x", "yyyyyy");
+ StringTest("Replace(str, str)", r2, "abcdefyyyyyyijyyyyyy0");
+
+
+ printf(":: testing Insert\n");
+ NPT_String in0;
+ in0.Insert("hello", 1);
+ StringTest("Insert into NULL, past end", in0, "");
+ in0.Insert("hello");
+ StringTest("Insert into NULL, at start", in0, "hello");
+ in0.Insert("yoyo");
+ StringTest("Insert at start", in0, "yoyohello");
+ in0.Insert("yaya", 3);
+ StringTest("Insert at 3", in0, "yoyyayaohello");
+
+ printf(":: testing Erase\n");
+ NPT_String er0;
+ er0.Erase(0, 0);
+ StringTest("1", er0, "");
+ er0.Erase(0, 1);
+ StringTest("1", er0, "");
+ er0.Erase(1, 1);
+ StringTest("1", er0, "");
+ er0 = "hello world";
+ er0.Erase(0, 1);
+ StringTest("1", er0, "ello world");
+ er0.Erase(4);
+ StringTest("1", er0, "elloworld");
+ er0.Erase(7, 3);
+ StringTest("1", er0, "ellowor");
+ er0.Erase(5, 2);
+ StringTest("1", er0, "ellow");
+ er0.Erase(0, 5);
+ StringTest("1", er0, "");
+
+ printf(":: testing ToInteger");
+ NPT_String ti00("123");
+ unsigned int ul00;
+ int l00;
+ IntTest("", ti00.ToInteger(ul00), NPT_SUCCESS);
+ IntTest("", ul00, 123);
+ IntTest("", ti00.ToInteger(l00), NPT_SUCCESS);
+ IntTest("", l00, 123);
+ ti00 = "123ggds";
+ IntTest("", ti00.ToInteger(l00, false), NPT_ERROR_INVALID_PARAMETERS);
+ IntTest("", ti00.ToInteger(l00, true), NPT_SUCCESS);
+ IntTest("", l00, 123);
+ ti00 = "-123";
+ IntTest("", ti00.ToInteger(ul00, false), NPT_ERROR_INVALID_PARAMETERS);
+ IntTest("", ti00.ToInteger(l00), NPT_SUCCESS);
+ IntTest("", l00, -123);
+
+ printf(":: testing ToFloat");
+ NPT_String tf00("-1.234flo");
+ float fl00;
+ IntTest("", tf00.ToFloat(fl00, true), NPT_SUCCESS);
+ FloatTest("", fl00, -1.234f);
+ IntTest("", tf00.ToFloat(fl00, false), NPT_ERROR_INVALID_PARAMETERS);
+
+
+ NPT_List<NPT_String> sl;
+ sl = NPT_String("").Split("");
+ IntTest("", sl.GetItemCount(), 1);
+ StringTest("", *sl.GetFirstItem(), "");
+
+ sl = NPT_String("").Split("#");
+ IntTest("", sl.GetItemCount(), 1);
+ StringTest("", *sl.GetFirstItem(), "");
+
+ sl = NPT_String("aaa").Split("");
+ IntTest("", sl.GetItemCount(), 1);
+ StringTest("", *sl.GetFirstItem(), "aaa");
+
+ sl = NPT_String("aaa").Split("b");
+ IntTest("", sl.GetItemCount(), 1);
+ StringTest("", *sl.GetFirstItem(), "aaa");
+
+ sl = NPT_String("aaa").Split("a");
+ IntTest("", sl.GetItemCount(), 4);
+ NPT_String* sli;
+ sl.Get(0, sli);
+ StringTest("", *sli, "");
+ sl.Get(1, sli);
+ StringTest("", *sli, "");
+ sl.Get(2, sli);
+ StringTest("", *sli, "");
+ sl.Get(3, sli);
+ StringTest("", *sli, "");
+
+ sl = NPT_String("aaa").Split("aa");
+ IntTest("", sl.GetItemCount(), 2);
+ sl.Get(0, sli);
+ StringTest("", *sli, "");
+ sl.Get(1, sli);
+ StringTest("", *sli, "a");
+
+ sl = NPT_String("aaa").Split("aaa");
+ IntTest("", sl.GetItemCount(), 2);
+ sl.Get(0, sli);
+ StringTest("", *sli, "");
+ sl.Get(1, sli);
+ StringTest("", *sli, "");
+
+ sl = NPT_String("a;b;c;d;e").Split(";");
+ IntTest("", sl.GetItemCount(), 5);
+ sl.Get(0, sli);
+ StringTest("", *sli, "a");
+ sl.Get(1, sli);
+ StringTest("", *sli, "b");
+ sl.Get(2, sli);
+ StringTest("", *sli, "c");
+ sl.Get(3, sli);
+ StringTest("", *sli, "d");
+ sl.Get(4, sli);
+ StringTest("", *sli, "e");
+
+ NPT_String sf = NPT_String::Format("%s.%d", "hello", 3);
+ StringTest("", "hello.3", sf.GetChars());
+ for (unsigned int i=0; i<10; i++) {
+ sf = NPT_String::Format("%s%s", sf.GetChars(), sf.GetChars());
+ }
+ IntTest("", sf.GetLength(), (1<<10)*7);
+
+
+ NPT_LargeSize lu1=2000000;
+ NPT_LargeSize lu2=2000002;
+ NPT_String range = NPT_String::Format("bytes=%lu-%lu", (long)lu1, (long)lu2);
+ StringTest("", "bytes=2000000-2000002", range.GetChars());
+
+ char s_buf[7];
+ s_buf[5] = 'a';
+ NPT_CopyString(s_buf, "hello");
+ StringTest("", s_buf, "hello");
+ s_buf[5] = 'a';
+ NPT_CopyStringN(s_buf, "hello", 6);
+ StringTest("", s_buf, "hello");
+ s_buf[5] = 'a';
+ NPT_CopyStringN(s_buf, "hello", 5);
+ StringTest("", s_buf, "hello");
+ s_buf[5] = 'a';
+ NPT_CopyStringN(s_buf, "hello", 4);
+ StringTest("", s_buf, "hell");
+
+ NPT_String hs1 = "curds and whey";
+ IntTest("", hs1.GetHash32(), 0x22d5344e);
+
+
+ char buffer[6] = "abcde";
+ NPT_String tr0(buffer, 5);
+ IntTest("", tr0.GetLength(), 5);
+ buffer[1] = 0;
+ NPT_String tr1(buffer, 5);
+ IntTest("", tr1.GetLength(), 1);
+ buffer[0] = 0;
+ NPT_String tr2(buffer, 5);
+ IntTest("", tr2.GetLength(), 0);
+ tr0.Assign(buffer, 5);
+ IntTest("", tr0.GetLength(), 0);
+ buffer[0] = 'a';
+ tr0.Assign(buffer, 5);
+ IntTest("", tr0.GetLength(), 1);
+
+ printf("------------------------- done -----\n");
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Threads1/ThreadsTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Threads1/ThreadsTest1.cpp
new file mode 100644
index 0000000..badb394
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Threads1/ThreadsTest1.cpp
@@ -0,0 +1,547 @@
+/*****************************************************************
+|
+| Threads Test Program 1
+|
+| (c) 2001-2002 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+#define CHECK(x) { \
+ if (!(x)) { \
+ NPT_Console::OutputF("TEST FAILED line %d\n", __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+}
+
+/*----------------------------------------------------------------------
+| Thread1
++---------------------------------------------------------------------*/
+class Thread1 : public NPT_Thread
+{
+public:
+ virtual ~Thread1() {
+ NPT_Debug("~Thread1\n");
+ }
+ void Run() {
+ NPT_Debug("Thread1::Run - start\n");
+
+ // sleep a while
+ NPT_TimeInterval duration(1.2f);
+ NPT_System::Sleep(duration);
+
+ NPT_Debug("Thread1::Run - end\n");
+ }
+};
+
+/*----------------------------------------------------------------------
+| Thread2
++---------------------------------------------------------------------*/
+class Thread2 : public NPT_Runnable
+{
+public:
+ Thread2(NPT_SharedVariable* variable) : m_SharedVariable(variable) {}
+ virtual ~Thread2() { NPT_Debug("~Thread2\n"); }
+ void Run() {
+ NPT_Debug("Thread2::Run - start\n");
+
+ // sleep a while
+ NPT_TimeInterval duration(2.1f);
+ NPT_System::Sleep(duration);
+
+ NPT_Debug("Thread2::Run - waiting for variable == 3\n");
+ m_SharedVariable->WaitUntilEquals(3);
+ NPT_Debug("Thread2::Run - end\n");
+ NPT_Debug("Thread2::Run - deleting myself\n");
+ //FIXME: This causes a crash
+ //delete this;
+ }
+ NPT_SharedVariable* m_SharedVariable;
+};
+
+/*----------------------------------------------------------------------
+| Thread3
++---------------------------------------------------------------------*/
+class Thread3 : public NPT_Thread
+{
+public:
+ Thread3(NPT_SharedVariable* variable) : NPT_Thread(false),
+ m_SharedVariable(variable) {}
+ virtual ~Thread3() { NPT_Debug("~Thread3\n"); }
+ Thread3() : NPT_Thread(false) {}
+ void Run() {
+ NPT_Debug("Thread3::Run - start\n");
+
+ NPT_Thread::SetCurrentThreadPriority(NPT_THREAD_PRIORITY_ABOVE_NORMAL);
+
+ // sleep a while
+ NPT_TimeInterval duration(3.1f);
+ NPT_System::Sleep(duration);
+
+ NPT_Debug("Thread3::Run - setting shared var to 1\n");
+ m_SharedVariable->SetValue(1);
+
+ // sleep a while
+ NPT_System::Sleep(duration);
+
+ NPT_Debug("Thread3::Run - setting shared var to 2\n");
+ m_SharedVariable->SetValue(2);
+
+ // sleep a while
+ NPT_System::Sleep(duration);
+
+ NPT_Debug("Thread3::Run - setting shared var to 3\n");
+ m_SharedVariable->SetValue(3);
+ NPT_Debug("Thread3::Run - end\n");
+ }
+ NPT_SharedVariable* m_SharedVariable;
+};
+
+/*----------------------------------------------------------------------
+| Thread4
++---------------------------------------------------------------------*/
+class Thread4 : public NPT_Runnable
+{
+public:
+ virtual ~Thread4() {
+ NPT_Debug("~Thread4\n");
+ }
+ void Run() {
+ NPT_Debug("Thread4::Run - start\n");
+
+ // change the prio
+ NPT_Thread::SetCurrentThreadPriority(NPT_THREAD_PRIORITY_BELOW_NORMAL);
+
+ // sleep a while
+ NPT_TimeInterval duration(4.3f);
+ NPT_System::Sleep(duration);
+
+ NPT_Debug("Thread4::Run - end\n");
+ }
+};
+
+class T1 : public NPT_Runnable
+{
+ void Run() {
+ NPT_Debug("*** T1 running ***\n");
+ NPT_TimeInterval duration(1.0f);
+ NPT_Debug("*** T1 sleeping ***\n");
+ NPT_System::Sleep(duration);
+ NPT_Debug("*** T1 done ***\n");
+ }
+};
+
+/*----------------------------------------------------------------------
+| TestPrio
++---------------------------------------------------------------------*/
+class PrioThread : public NPT_Runnable
+{
+public:
+ PrioThread(int prio) : m_Prio(prio), m_Counter(0) {}
+ void Run() {
+ NPT_Thread::SetCurrentThreadPriority(m_Prio);
+ NPT_TimeStamp now;
+ NPT_TimeStamp then;
+ NPT_System::GetCurrentTimeStamp(now);
+ do {
+ for (unsigned int i=0; i<10000; i++) {
+ m_Counter++;
+ }
+ for (unsigned int i=0; i<10000; i++) {
+ m_Counter--;
+ }
+ m_Counter++;
+ NPT_System::GetCurrentTimeStamp(then);
+ } while (then.ToMillis()-now.ToMillis() < 30000);
+ }
+
+ int m_Prio;
+ NPT_UInt64 m_Counter;
+};
+static void
+TestPrio()
+{
+ PrioThread p1(NPT_THREAD_PRIORITY_NORMAL);
+ PrioThread p2(NPT_THREAD_PRIORITY_BELOW_NORMAL);
+ PrioThread p3(NPT_THREAD_PRIORITY_ABOVE_NORMAL);
+ NPT_Thread t1(p1);
+ NPT_Thread t2(p2);
+ NPT_Thread t3(p3);
+ t1.Start();
+ t2.Start();
+ t3.Start();
+ t1.Wait();
+ t2.Wait();
+ t3.Wait();
+ NPT_Debug("### Prio NORMAL -> %lld iterations\n", p1.m_Counter);
+ NPT_Debug("### Prio BELOW NORMAL -> %lld iterations\n", p2.m_Counter);
+ NPT_Debug("### Prio ABOVE NORMAL -> %lld iterations\n", p3.m_Counter);
+}
+
+/*----------------------------------------------------------------------
+| Test1
++---------------------------------------------------------------------*/
+static void
+Test1()
+{
+ NPT_Debug("--- Test1 Start ---\n");
+
+ T1 runnable;
+
+ NPT_Debug("+++ creating non-detached thread +++\n");
+ NPT_Thread* thread1 = new NPT_Thread(runnable); // not detached
+ NPT_Debug("+++ starting non-detached thread +++\n");
+ thread1->Start();
+ NPT_Debug("+++ waiting for non-detached thread +++\n");
+ NPT_Result result = thread1->Wait();
+ CHECK(NPT_SUCCEEDED(result));
+ NPT_Debug("+++ deleting non-detached thread +++\n");
+ delete thread1;
+ NPT_Debug("+++ done with non-detached thread +++\n");
+
+ NPT_Debug("+++ creating detached thread +++\n");
+ thread1 = new NPT_Thread(runnable, true); // detached
+ NPT_Debug("+++ starting detached thread +++\n");
+ thread1->Start();
+ NPT_Debug("+++ waiting for detached thread +++\n");
+ NPT_System::Sleep(NPT_TimeInterval(3.0f));
+ //delete thread1;
+ NPT_Debug("+++ done with detached thread +++\n");
+
+ NPT_Debug("+++ creating non-detached thread +++\n");
+ thread1 = new NPT_Thread(runnable); // not detached
+ NPT_Debug("+++ starting non-detached thread +++\n");
+ thread1->Start();
+ NPT_Debug("+++ deleting non-detached thread +++\n");
+ delete thread1;
+ NPT_Debug("+++ done with non-detached thread +++\n");
+}
+
+/*----------------------------------------------------------------------
+| Test2
++---------------------------------------------------------------------*/
+static void
+Test2()
+{
+ NPT_Debug("--- Test2 Start ---\n");
+
+ NPT_SharedVariable shv1(0);
+ NPT_Thread* thread1 = new Thread1();
+ Thread2 t2(&shv1);
+ NPT_Thread* thread2 = new NPT_Thread(t2, true);
+ NPT_Thread* thread3 = new Thread3(&shv1);
+ Thread4 t4;
+ NPT_Thread* thread4 = new NPT_Thread(t4, false);
+
+ NPT_Debug("starting thread1...\n");
+ thread1->Start();
+
+ NPT_Debug("starting thread2...\n");
+ thread2->Start();
+
+ NPT_Debug("starting thread3\n");
+ thread3->Start();
+ NPT_Debug("releasing thread3\n");
+ delete thread3;
+
+ NPT_Debug("starting thread4\n");
+ thread4->Start();
+ NPT_Debug("deleting thread4\n");
+ delete thread4;
+
+ NPT_Debug("deleting thread1...\n");
+ delete thread1;
+ NPT_Debug("...done\n");
+
+ // sleep a while
+ NPT_TimeInterval duration(15.0);
+ NPT_System::Sleep(duration);
+
+ NPT_Debug("--- Test2 End ---\n");
+}
+
+typedef struct {
+ volatile int* var;
+ int var_i;
+} _CB_T;
+
+static int _count_CBR[3] = {0,0,0};
+
+class CBR : public NPT_Runnable, public NPT_ThreadCallbackReceiver
+{
+public:
+ CBR(NPT_ThreadCallbackSlot& slot, int var, int cycles, float sleep_time) : m_Slot(slot), m_Var(var), m_FlipFlop(false), m_Cycles(cycles), m_Sleep(sleep_time) {}
+
+ void OnCallback(void* args) {
+ _CB_T* t_args = (_CB_T*)args;
+ CHECK(*t_args->var == -1);
+ (*t_args->var)+= t_args->var_i;
+ _count_CBR[m_Var]++;
+ m_FlipFlop = true;
+ if (m_Sleep != 0.0f) {
+ NPT_Debug(".CBR [%d] - on callback (%d)\n", m_Var, _count_CBR[m_Var]);
+ }
+ }
+
+ void Run() {
+ for (int i=0; i<m_Cycles;) {
+ if (m_Sleep != 0.0f) {
+ NPT_Debug(".CBR [%d] - processing\n", m_Var);
+ }
+ NPT_Result result = m_Slot.ReceiveCallback(*this);
+ if (result == NPT_ERROR_CALLBACK_NOTHING_PENDING) {
+ if (m_Sleep != 0.0f) {
+ NPT_Debug(".CBR [%d] - nothing pending\n", m_Var);
+ }
+ } else {
+ CHECK(result == NPT_SUCCESS);
+ CHECK(m_FlipFlop == true);
+ m_FlipFlop = false;
+ i++;
+ }
+ if (m_Sleep != 0.0f) {
+ NPT_Debug(".CBR [%d] - sleeping\n", m_Var);
+ }
+ if (m_Sleep != 0.0f) NPT_System::Sleep(NPT_TimeInterval(m_Sleep));
+ }
+ }
+
+private:
+ NPT_ThreadCallbackSlot& m_Slot;
+ int m_Var;
+ bool m_FlipFlop;
+ int m_Cycles;
+ float m_Sleep;
+};
+
+class CBW : public NPT_Runnable
+{
+public:
+ CBW(NPT_ThreadCallbackSlot& slot, int var, int cycles, float sleep_time) : m_Slot(slot), m_Var(var), m_Cycles(cycles), m_Sleep(sleep_time) {}
+
+ void Run() {
+ volatile int res = -1;
+ for (int i=0; i<m_Cycles; i++) {
+ _CB_T args = {&res, m_Var+1};
+ if (m_Sleep != 0.0f) {
+ NPT_Debug("@CBR [%d] - calling back\n", m_Var);
+ }
+ NPT_Result result = m_Slot.SendCallback(&args);
+ if (result == NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN) {
+ NPT_Debug("SHUTDOWN\n");
+ return;
+ }
+ CHECK(res == m_Var);
+ res -= (m_Var+1);
+ if (m_Sleep != 0.0f) {
+ NPT_Debug("@CBR [%d] - sleeping\n", m_Var);
+ }
+ if (m_Sleep != 0.0f) NPT_System::Sleep(NPT_TimeInterval(m_Sleep));
+ }
+ }
+
+private:
+ NPT_ThreadCallbackSlot& m_Slot;
+ int m_Var;
+ int m_Cycles;
+ float m_Sleep;
+};
+
+/*----------------------------------------------------------------------
+| Test3
++---------------------------------------------------------------------*/
+static void
+Test3(int cycles, float r_sleep, float w_sleep)
+{
+ NPT_Debug("--- Test3 Start ---\n");
+
+ NPT_ThreadCallbackSlot slot;
+
+ CBR cbr0(slot, 0, cycles, r_sleep);
+ CBR cbr1(slot, 1, cycles, r_sleep);
+ CBR cbr2(slot, 2, cycles, r_sleep);
+ NPT_Thread* rt1 = new NPT_Thread(cbr0);
+ NPT_Thread* rt2 = new NPT_Thread(cbr1);
+ NPT_Thread* rt3 = new NPT_Thread(cbr2);
+ CBW cbw0(slot, 0, cycles, w_sleep);
+ CBW cbw1(slot, 1, cycles, w_sleep);
+ CBW cbw2(slot, 2, cycles, w_sleep);
+ NPT_Thread* wt1 = new NPT_Thread(cbw0);
+ NPT_Thread* wt2 = new NPT_Thread(cbw1);
+ NPT_Thread* wt3 = new NPT_Thread(cbw2);
+
+ rt1->Start();
+ rt2->Start();
+ rt3->Start();
+ wt1->Start();
+ wt2->Start();
+ wt3->Start();
+
+ delete rt1;
+ delete rt2;
+ delete rt3;
+ delete wt1;
+ delete wt2;
+ delete wt3;
+
+ NPT_Debug("--- Test3: %d %d %d\n", _count_CBR[0], _count_CBR[1], _count_CBR[2]);
+ NPT_Debug("--- Test3 End ---\n");
+}
+
+class CBR2 : public NPT_Runnable, public NPT_ThreadCallbackReceiver
+{
+public:
+ CBR2(NPT_ThreadCallbackSlot& slot) : m_Slot(slot) {}
+
+ void OnCallback(void*) {
+ NPT_Debug("CBR2 - on callback\n");
+ }
+
+ void Run() {
+ for (int i=0; i<10;) {
+ NPT_Debug("CBR2: processing [%d]\n", i);
+ NPT_Result result = m_Slot.ReceiveCallback(*this);
+ if (result == NPT_ERROR_CALLBACK_NOTHING_PENDING) {
+ } else {
+ i++;
+ }
+ NPT_Debug("CBR2: sleeping\n");
+ NPT_System::Sleep(NPT_TimeInterval(0.2f));
+ }
+ NPT_Debug("CBR2: shutting down\n");
+ m_Slot.Shutdown();
+ }
+
+private:
+ NPT_ThreadCallbackSlot& m_Slot;
+};
+
+/*----------------------------------------------------------------------
+| Test4
++---------------------------------------------------------------------*/
+static void
+Test4()
+{
+ NPT_Debug("--- Test4 Start ---\n");
+
+ NPT_ThreadCallbackSlot slot;
+
+ CBR2 cbr(slot);
+ NPT_Thread* t = new NPT_Thread(cbr);
+ t->Start();
+
+ for (int i=0; i<20; i++) {
+ NPT_Debug("Test4: calling back [%d]\n", i);
+ NPT_Result result = slot.SendCallback(NULL);
+ if (NPT_FAILED(result)) {
+ CHECK(result == NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN);
+ CHECK(i >= 10);
+ NPT_Debug("Test4: slot shutdown\n");
+ }
+ }
+ delete t;
+
+ NPT_Debug("--- Test4 End ---\n");
+}
+
+/*----------------------------------------------------------------------
+| TestSharedVariables
++---------------------------------------------------------------------*/
+class SharedVarThread : public NPT_Thread {
+public:
+ SharedVarThread(int target, NPT_SharedVariable& shared) : m_Target(target), m_Shared(shared), m_Result(NPT_FAILURE) {}
+ void Run() {
+ m_Result = m_Shared.WaitUntilEquals(m_Target, 10000);
+ }
+
+ int m_Target;
+ NPT_SharedVariable& m_Shared;
+ NPT_Result m_Result;
+};
+
+static void
+TestSharedVariables()
+{
+ NPT_SharedVariable shared;
+ SharedVarThread t1(1, shared);
+ SharedVarThread t2(2, shared);
+ SharedVarThread t3(2, shared);
+
+ t1.Start();
+ t2.Start();
+ t3.Start();
+ NPT_System::Sleep(3.0);
+ shared.SetValue(1);
+ NPT_System::Sleep(2.0);
+ shared.SetValue(2);
+
+ NPT_Result result = t1.Wait(20000);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(t1.m_Result == NPT_SUCCESS);
+ result = t2.Wait(20000);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(t2.m_Result == NPT_SUCCESS);
+ result = t3.Wait(20000);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(t3.m_Result == NPT_SUCCESS);
+}
+
+#if defined(WIN32) && defined(_DEBUG)
+static int AllocHook( int allocType, void *userData, size_t size, int blockType,
+ long requestNumber, const unsigned char *filename, int lineNumber)
+{
+ (void)allocType;
+ (void)userData;
+ (void)size;
+ (void)blockType;
+ (void)requestNumber;
+ (void)lineNumber;
+ (void)filename;
+ return 1;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ NPT_COMPILER_UNUSED(argc);
+ NPT_COMPILER_UNUSED(argv);
+
+#if defined(WIN32) && defined(_DEBUG)
+ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF |
+ _CRTDBG_LEAK_CHECK_DF);
+ _CrtSetAllocHook(AllocHook);
+#endif
+
+ TestSharedVariables();
+ TestPrio();
+ Test3(100000, 0.0f, 0.0f);
+ Test3(300, 0.1f, 0.0f);
+ Test3(100, 0.5f, 0.4f);
+ Test4();
+ Test1();
+ Test2();
+
+ NPT_Debug("- program done -\n");
+
+ return 0;
+}
+
+
+
+
+
+
diff --git a/lib/libUPnP/Neptune/Source/Tests/Time1/TimeTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Time1/TimeTest1.cpp
new file mode 100644
index 0000000..e39edc5
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Time1/TimeTest1.cpp
@@ -0,0 +1,559 @@
+/*****************************************************************
+|
+| Time Test Program 1
+|
+| (c) 2005-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include "Neptune.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define SHOULD_SUCCEED(r) \
+ do { \
+ if (NPT_FAILED(r)) { \
+ fprintf(stderr, "FAILED: line %d\n", __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+#define SHOULD_FAIL(r) \
+ do { \
+ if (NPT_SUCCEEDED(r)) { \
+ fprintf(stderr, "should have failed line %d (%d)\n", \
+ __LINE__, r); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL(a, b) \
+ do { \
+ if ((a) != (b)) { \
+ fprintf(stderr, "not equal, line %d\n", __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_I(a, b) \
+ do { \
+ if ((a) != (b)) { \
+ fprintf(stderr, "got %d, expected %d line %d\n", \
+ a, b, __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_F(a, b) \
+ do { \
+ if ((a) != (b)) { \
+ fprintf(stderr, "got %f, expected %f line %d\n", \
+ (float)a, (float)b, __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_S(a, b) \
+ do { \
+ if (!NPT_StringsEqual(a,b)) { \
+ fprintf(stderr, "got %s, expected %s line %d\n", \
+ a, b, __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+/*----------------------------------------------------------------------
+| TestMisc
++---------------------------------------------------------------------*/
+static void
+TestMisc()
+{
+ NPT_DateTime date;
+ NPT_TimeStamp ts;
+ NPT_String s;
+
+ NPT_System::GetCurrentTimeStamp(ts);
+ SHOULD_SUCCEED(date.FromTimeStamp(ts, false));
+ s = date.ToString(NPT_DateTime::FORMAT_W3C);
+ NPT_Console::OutputF("%s\n", s.GetChars());
+ s = date.ToString(NPT_DateTime::FORMAT_ANSI);
+ NPT_Console::OutputF("%s\n", s.GetChars());
+ s = date.ToString(NPT_DateTime::FORMAT_RFC_1036);
+ NPT_Console::OutputF("%s\n", s.GetChars());
+ s = date.ToString(NPT_DateTime::FORMAT_RFC_1123);
+ NPT_Console::OutputF("%s\n", s.GetChars());
+ SHOULD_SUCCEED(date.FromTimeStamp(ts, true));
+ s = date.ToString(NPT_DateTime::FORMAT_W3C);
+ NPT_Console::OutputF("%s\n", s.GetChars());
+ s = date.ToString(NPT_DateTime::FORMAT_ANSI);
+ NPT_Console::OutputF("%s\n", s.GetChars());
+ s = date.ToString(NPT_DateTime::FORMAT_RFC_1036);
+ NPT_Console::OutputF("%s\n", s.GetChars());
+ s = date.ToString(NPT_DateTime::FORMAT_RFC_1123);
+ NPT_Console::OutputF("%s\n", s.GetChars());
+
+ ts = 0.0;
+ SHOULD_SUCCEED(date.FromTimeStamp(ts, false));
+ s = date.ToString(NPT_DateTime::FORMAT_W3C);
+ SHOULD_EQUAL_S(s.GetChars(), "1970-01-01T00:00:00Z");
+ s = date.ToString(NPT_DateTime::FORMAT_ANSI);
+ SHOULD_EQUAL_S(s.GetChars(), "Thu Jan 1 00:00:00 1970");
+ s = date.ToString(NPT_DateTime::FORMAT_RFC_1036);
+ SHOULD_EQUAL_S(s.GetChars(), "Thursday, 01-Jan-70 00:00:00 GMT");
+ s = date.ToString(NPT_DateTime::FORMAT_RFC_1123);
+ SHOULD_EQUAL_S(s.GetChars(), "Thu, 01 Jan 1970 00:00:00 GMT");
+
+ ts.SetSeconds(0xFFFFFFFF);
+ SHOULD_SUCCEED(date.FromTimeStamp(ts, false));
+ s = date.ToString(NPT_DateTime::FORMAT_W3C, false);
+ SHOULD_EQUAL_S(s.GetChars(), "2106-02-07T06:28:15Z");
+
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ NPT_DateTime now_local(now, true);
+ NPT_DateTime now_utc(now, false);
+ SHOULD_EQUAL_I(now_utc.m_TimeZone, 0);
+ NPT_TimeStamp ts1, ts2;
+ now_local.ToTimeStamp(ts1);
+ now_utc.ToTimeStamp(ts2);
+ SHOULD_EQUAL_I((int)ts1.ToSeconds(), (int)ts2.ToSeconds());
+
+ ts.SetSeconds(0);
+ NPT_DateTime d1(ts);
+ ts.SetSeconds(ts.ToSeconds()-3600);
+ NPT_DateTime d2(ts);
+ d1.ToTimeStamp(ts1);
+ d2.ToTimeStamp(ts2);
+ SHOULD_EQUAL_I((int)ts1.ToSeconds(), (int)ts2.ToSeconds()+3600);
+}
+
+/*----------------------------------------------------------------------
+| TestDateFromTimeStringW3C
++---------------------------------------------------------------------*/
+static void
+TestDateFromTimeStringW3C()
+{
+ NPT_DateTime date;
+
+ /* Valid date */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01:10.003Z", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 3000000);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date, 2 characters milliseconds */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01:10.02Z", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 20000000);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date, 1 character milliseconds */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01:10.9Z", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 900000000);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date, no seconds, Z */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01Z", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 0);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date, no seconds, timezone */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01+03:00", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 0);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 180);
+
+ /* Valid date, no millimseconds */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01:10Z", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date with microseconds, 'Z' */
+ SHOULD_SUCCEED(date.FromString("2005-09-06T17:16:10.003498Z", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2005);
+ SHOULD_EQUAL_I(date.m_Month , 9);
+ SHOULD_EQUAL_I(date.m_Day , 6);
+ SHOULD_EQUAL_I(date.m_Hours , 17);
+ SHOULD_EQUAL_I(date.m_Minutes , 16);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 3498000);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date, no milliseconds, with timezone offset */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01:10+03:00", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 180);
+
+ /* Valid date, no milliseconds, with negative m_TimeZone offset */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01:10-05:00", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , -300);
+
+ /* Valid date, with milliseconds, with positive m_TimeZone offset */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01:10.200+03:00", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 200000000);
+ SHOULD_EQUAL_I(date.m_TimeZone , 180);
+
+ /* Valid date, with milliseconds, with negative m_TimeZone offset */
+ SHOULD_SUCCEED(date.FromString("2006-04-14T12:01:10.030-05:00", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 30000000);
+ SHOULD_EQUAL_I(date.m_TimeZone , -300);
+
+ /* Valid date with microseconds and negative m_TimeZone offset */
+ SHOULD_SUCCEED(date.FromString("2005-09-06T17:16:10.001822-05:00", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2005);
+ SHOULD_EQUAL_I(date.m_Month , 9);
+ SHOULD_EQUAL_I(date.m_Day , 6);
+ SHOULD_EQUAL_I(date.m_Hours , 17);
+ SHOULD_EQUAL_I(date.m_Minutes , 16);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 1822000);
+ SHOULD_EQUAL_I(date.m_TimeZone , -300);
+
+ /* Valid date with microseconds and positive m_TimeZone offset */
+ SHOULD_SUCCEED(date.FromString("2005-09-06T17:16:10.001822+05:00", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2005);
+ SHOULD_EQUAL_I(date.m_Month , 9);
+ SHOULD_EQUAL_I(date.m_Day , 6);
+ SHOULD_EQUAL_I(date.m_Hours , 17);
+ SHOULD_EQUAL_I(date.m_Minutes , 16);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 1822000);
+ SHOULD_EQUAL_I(date.m_TimeZone , 300);
+
+ /* Valid date with no time and m_TimeZone offset */
+ SHOULD_SUCCEED(date.FromString("2006-10-05", NPT_DateTime::FORMAT_W3C));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 10);
+ SHOULD_EQUAL_I(date.m_Day , 5);
+
+ /* Invalid date with 3 digit year */
+ SHOULD_FAIL(date.FromString("206-04-14T12:01:10.003Z", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with 5 digit year */
+ SHOULD_FAIL(date.FromString("20076-04-14T12:01:10.003Z", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with 5 digit year */
+ SHOULD_FAIL(date.FromString("20076-04-14T12:01:10.003Z", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with garbage in the end */
+ SHOULD_FAIL(date.FromString("2006-04-14T12:01:10.003+69:696", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad month */
+ SHOULD_FAIL(date.FromString("2006-010-14T12:01:10.003", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad month, right overall length */
+ SHOULD_FAIL(date.FromString("2063-0--14T12:01:10.003", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad year-month separator */
+ SHOULD_FAIL(date.FromString("2063Y08-14T12:01:10.003", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad time separator */
+ SHOULD_FAIL(date.FromString("2063-08-14t12:01:10.003", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad hour */
+ SHOULD_FAIL(date.FromString("2063-08-14T012:01:10.003", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad GMT indicator */
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10.003z", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad GMT indicator */
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10.003g", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with millisecond separator but no digits */
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10.", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with millisecond separator but no digits */
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10.Z", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with millisecond separator but no digits */
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10.+10:38", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad m_TimeZone offset */
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10+10:338", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad m_TimeZone offset */
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10+001:38", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad m_TimeZone offset */
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10+10:33Z", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad m_TimeZone offset */
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10.08+10:33Z", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with bad m_TimeZone offset with m_Seconds*/
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10.08+10:33:30", NPT_DateTime::FORMAT_W3C));
+
+ /* Invalid date with m_TimeZone offset too big*/
+ SHOULD_FAIL(date.FromString("2063-08-14T12:01:10.08+14:33", NPT_DateTime::FORMAT_W3C));
+}
+
+/*----------------------------------------------------------------------
+| TestDateFromTimeStringANSI
++---------------------------------------------------------------------*/
+static void
+TestDateFromTimeStringANSI()
+{
+ NPT_DateTime date;
+
+ /* Valid date */
+ SHOULD_SUCCEED(date.FromString("Fri Apr 14 12:01:10 2006", NPT_DateTime::FORMAT_ANSI));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date with space in the days */
+ SHOULD_SUCCEED(date.FromString("Fri Apr 7 12:01:10 2006", NPT_DateTime::FORMAT_ANSI));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 7);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Wrong weekday */
+ SHOULD_FAIL(date.FromString("Wed Apr 14 12:01:10 2006", NPT_DateTime::FORMAT_ANSI));
+
+ /* Wrong year length */
+ SHOULD_FAIL(date.FromString("Mon Apr 14 12:01:10 95", NPT_DateTime::FORMAT_ANSI));
+}
+
+/*----------------------------------------------------------------------
+| TestDateFromTimeStringRFC_1036
++---------------------------------------------------------------------*/
+static void
+TestDateFromTimeStringRFC_1036()
+{
+ NPT_DateTime date;
+
+ /* Valid date */
+ SHOULD_SUCCEED(date.FromString("Friday, 14-Apr-2006 12:01:10 UT", NPT_DateTime::FORMAT_RFC_1036));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date with timezone */
+ SHOULD_SUCCEED(date.FromString("Friday, 14-Apr-95 12:01:10 GMT", NPT_DateTime::FORMAT_RFC_1036));
+ SHOULD_EQUAL_I(date.m_Year , 1995);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date with timezone */
+ SHOULD_SUCCEED(date.FromString("Friday, 14-Apr-95 12:01:10 -0800", NPT_DateTime::FORMAT_RFC_1036));
+ SHOULD_EQUAL_I(date.m_Year , 1995);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , -8*60);
+
+ /* Wrong day name */
+ SHOULD_FAIL(date.FromString("Fri, 14-Apr-95 12:01:10 -0800", NPT_DateTime::FORMAT_RFC_1036));
+
+ /* Wrong weekday */
+ SHOULD_FAIL(date.FromString("Wednesday, 14-Apr-95 12:01:10 GMT", NPT_DateTime::FORMAT_RFC_1036));
+
+ /* Wrong year length */
+ SHOULD_FAIL(date.FromString("Monday, 14-Apr-1995 12:01:10 GMT", NPT_DateTime::FORMAT_RFC_1036));
+}
+
+/*----------------------------------------------------------------------
+| TestDateFromTimeStringRFC_1123
++---------------------------------------------------------------------*/
+static void
+TestDateFromTimeStringRFC_1123()
+{
+ NPT_DateTime date;
+
+ /* Valid date */
+ SHOULD_SUCCEED(date.FromString("Fri, 14 Apr 2006 12:01:10 UT", NPT_DateTime::FORMAT_RFC_1123));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date with timezone*/
+ SHOULD_SUCCEED(date.FromString("Fri, 14 Apr 2006 12:01:10 GMT", NPT_DateTime::FORMAT_RFC_1123));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Valid date with timezone*/
+ SHOULD_SUCCEED(date.FromString("Fri, 14 Apr 2006 12:01:10 +0800", NPT_DateTime::FORMAT_RFC_1123));
+ SHOULD_EQUAL_I(date.m_Year , 2006);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 8*60);
+
+ /* Valid date, short year */
+ SHOULD_SUCCEED(date.FromString("Fri, 14 Apr 95 12:01:10 GMT", NPT_DateTime::FORMAT_RFC_1123));
+ SHOULD_EQUAL_I(date.m_Year , 1995);
+ SHOULD_EQUAL_I(date.m_Month , 4);
+ SHOULD_EQUAL_I(date.m_Day , 14);
+ SHOULD_EQUAL_I(date.m_Hours , 12);
+ SHOULD_EQUAL_I(date.m_Minutes , 1);
+ SHOULD_EQUAL_I(date.m_Seconds , 10);
+ SHOULD_EQUAL_I(date.m_NanoSeconds , 0);
+ SHOULD_EQUAL_I(date.m_TimeZone , 0);
+
+ /* Wrong day name */
+ SHOULD_FAIL(date.FromString("Friday, 14 Apr 95 12:01:10 GMT", NPT_DateTime::FORMAT_RFC_1123));
+
+ /* Wrong weekday */
+ SHOULD_FAIL(date.FromString("Wed, 14 Apr 2006 12:01:10 GMT", NPT_DateTime::FORMAT_RFC_1123));
+
+ /* Wrong year length */
+ SHOULD_FAIL(date.FromString("Mon, 14 Apr 95 12:01:10 GMT", NPT_DateTime::FORMAT_RFC_1123));
+}
+
+/*----------------------------------------------------------------------
+| TestRandom
++---------------------------------------------------------------------*/
+static void
+TestRandom()
+{
+ for (unsigned int i=0; i<10000; i++) {
+ NPT_TimeStamp ts((double)NPT_System::GetRandomInteger());
+ NPT_TimeStamp ts2;
+ NPT_DateTime date;
+ SHOULD_SUCCEED(date.FromTimeStamp(ts, false));
+ SHOULD_SUCCEED(date.ToTimeStamp(ts2));
+ NPT_String ds;
+ NPT_DateTime ndate;
+ ds = date.ToString(NPT_DateTime::FORMAT_ANSI);
+ ndate.FromString(ds);
+ //SHOULD_EQUAL(date, ndate);
+ SHOULD_SUCCEED(ndate.ToTimeStamp(ts2));
+ SHOULD_EQUAL_F((double)ts2.ToSeconds(), (double)ts.ToSeconds());
+
+ ds = date.ToString(NPT_DateTime::FORMAT_W3C);
+ ndate.FromString(ds);
+ //SHOULD_EQUAL(date, ndate);
+ SHOULD_SUCCEED(ndate.ToTimeStamp(ts2));
+ SHOULD_EQUAL_F((double)ts2.ToSeconds(), (double)ts.ToSeconds());
+
+ ds = date.ToString(NPT_DateTime::FORMAT_RFC_1123);
+ ndate.FromString(ds);
+ //SHOULD_EQUAL(date, ndate);
+ SHOULD_SUCCEED(ndate.ToTimeStamp(ts2));
+ SHOULD_EQUAL_F((double)ts2.ToSeconds(), (double)ts.ToSeconds());
+
+ ds = date.ToString(NPT_DateTime::FORMAT_RFC_1036);
+ ndate.FromString(ds);
+ //SHOULD_EQUAL(date, ndate);
+ SHOULD_SUCCEED(ndate.ToTimeStamp(ts2));
+ SHOULD_EQUAL_F((double)ts2.ToSeconds(), (double)ts.ToSeconds());
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ TestMisc();
+ TestDateFromTimeStringW3C();
+ TestDateFromTimeStringANSI();
+ TestDateFromTimeStringRFC_1036();
+ TestDateFromTimeStringRFC_1123();
+ TestRandom();
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Tls1/TlsClientPrivate1.h b/lib/libUPnP/Neptune/Source/Tests/Tls1/TlsClientPrivate1.h
new file mode 100644
index 0000000..5f0b656
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Tls1/TlsClientPrivate1.h
@@ -0,0 +1,27 @@
+/* RSA private key */
+const char TestClient_rsa_priv_base64_1[] =
+"MIIEpAIBAAKCAQEAuMQkzT618sNdZWgsCb7n4lHUG7wl4dYHUwpAslJqynvKCqSJ"
+"zvS5PmyrEx7NvuXDnRKoHAbrPHgQmYYn+e7GV3Q+GsIDicLUKY7Ro5k2ar8bsF2c"
+"/FHvE8VPWtWzljTYbJQy5hL+MriVI+qu45F9lOlJSxT2AxSyWNE/vtEh1tHTr+Rw"
+"pD10+sTt/mXe7zTh2hyz9bqWsNzfFh1k/L1izTh20mame7P9LoBCZiJfr1NR6oZR"
+"81sEPpRa7C5skj6HKWQZnTHb/U0PSnpzq4jal9+BvTLw8sSHl+BevsF5hri9+Y8P"
+"M6KuFM0foUL/LFYQnoyktXp9G5bXIRPnXAfmcQIDAQABAoIBAAe6RGPFLKzzmNNl"
+"8PmTX3VqwLlMPDVe0z2Y3y3WHptLZB7f1NewCpNeziTlk+tZBr5qClfpvirwRpl1"
+"L/TXFLqRpQtPdABuApueWoxCGzGJvqm4sJkpABvOk8wTxggRO8AGzr4qqzEJ4Ur4"
+"RMpFyn/Q5fza6pMkaXUng0gCzSyD1eeWyCoi3hUSbSAUQSAUOyvb3Q7Mk0Mjg7J0"
+"x6ThwBieIBj/wV7E+k2Sv0ntsJwKoi51XScIc7xY+6rfAojztELMI6HsE340nmb9"
+"iHitOV/9OSIDRlkYXeKq7scAdV5KzbZDtqRwbbgAsD9QNyg17XBZVjxO9u5FK4KF"
+"MDD07TUCgYEA4T1FBlFjFw8w+UwHlYUAPp5MiymwwlXhTTwPJ58pjixeklDof2Ac"
+"bbJgZK3+hLb3nFFiTG/OcmXx3qou8JyHuOgVF4UZb03m1sy/bI8rlbU7stf/hP+F"
+"6dp4bhQo4d+zx7doZEiADGQpoK45gLb3yY0xQWD0vQBq73tS5qu6Wg8CgYEA0f/e"
+"G4EsuOTmOETHVr1Llv2DrOQrQn8l5Mpp8h6XYbdWylfaBT/MItAtPBSC4f/+epAf"
+"qxGkaE2v1vWhNYrYmGluiTu06x4oPfHUG7tajkZsyUT82CmI3kYP60Fo1QmJZdxn"
+"Bs50tmI9q5e+04DBN6Gs9kauWwd0loPJJ7cEN38CgYEAyGCYioFXFQmXuQCxcowK"
+"5qovUFJ7hLegIvS+SrJm5quESsidvcuEHvbkmEzOM8UOTUt9lqCU2eLlpQBjl/y5"
+"JX+aW/013nZAWXF3Dp3j2WCMxpMwJ2KnAJ8yKkPXBvLbXl5FCYoSGHP3MJIuZ9re"
+"X7kzS4V01LuNZpWg78NwmnMCgYBFAR3bzduDOfwIW1lhQDx5df5xrlwksqEiB/0+"
+"SR0XR+ZmAO4sMWWDvwJOLrM/Th4x6e/uB5MNjxGLwhTiAijgFCz1PUBazgMNL8yx"
+"/CNqguu2S0wGP8ewujb65/hpoIOcjAryqp6hW7DGFMvotfNHs4GhP2KFmPKPjuhn"
+"e3UQQwKBgQCs2QAsB+5qjmVcJJOMkB7rwiQpH4GI9DWn77FbdrITtSxC5smXht/m"
+"51yTdCPlcoeVkrQ6VgAWKHN6fl/Y0fSGBgHM6MwvgVVMH5ks/kGWLJhhvWbT0qcV"
+"1fAWm3VThyXaOgP5r/01ecp4MN6k74i2hHuvuyiapJ5geK1JnONMpg==";
diff --git a/lib/libUPnP/Neptune/Source/Tests/Tls1/TlsClientPrivate2.h b/lib/libUPnP/Neptune/Source/Tests/Tls1/TlsClientPrivate2.h
new file mode 100644
index 0000000..fd294d0
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Tls1/TlsClientPrivate2.h
@@ -0,0 +1,108 @@
+static const unsigned char TestClient_p8_1[] = {
+ 0x30, 0x82, 0x04, 0xe4, 0x30, 0x1c, 0x06, 0x0a, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x01, 0x30, 0x0e, 0x04, 0x08, 0x3d, 0x1a,
+ 0x36, 0x1b, 0xeb, 0x19, 0x6d, 0x96, 0x02, 0x02, 0x08, 0x00, 0x04, 0x82,
+ 0x04, 0xc2, 0x4f, 0x37, 0xd0, 0x23, 0x95, 0x84, 0x84, 0x0f, 0x6e, 0xd5,
+ 0x2f, 0xfb, 0x64, 0x5e, 0xfd, 0x37, 0x05, 0x81, 0xf9, 0x3e, 0x7e, 0xb3,
+ 0x0f, 0x99, 0x04, 0x9e, 0x26, 0xe8, 0x1a, 0x7a, 0x9d, 0xbf, 0x17, 0x98,
+ 0x99, 0xd1, 0x66, 0xa5, 0xc0, 0xcc, 0x09, 0x8e, 0xc7, 0x9b, 0xc6, 0x09,
+ 0xe9, 0xf4, 0xd5, 0x5a, 0xc7, 0x21, 0xef, 0xc8, 0xc7, 0x46, 0x82, 0x06,
+ 0x63, 0x78, 0x80, 0x6c, 0xea, 0xed, 0xb8, 0x79, 0x7e, 0x2d, 0x2a, 0xe6,
+ 0x34, 0x17, 0xb7, 0xc8, 0xc2, 0x0d, 0x97, 0xf6, 0x0c, 0x60, 0xa2, 0xc0,
+ 0x86, 0xcc, 0x4b, 0xa6, 0x1f, 0x05, 0xbd, 0xae, 0x35, 0xc9, 0xdf, 0xe4,
+ 0x5f, 0x7d, 0xf8, 0x68, 0x0a, 0xa6, 0x6f, 0x7d, 0xb2, 0x17, 0xf9, 0xfd,
+ 0xea, 0xae, 0xfa, 0xed, 0xad, 0x0c, 0x52, 0x5f, 0x03, 0x74, 0x3f, 0xf0,
+ 0x15, 0x43, 0x05, 0x2f, 0x23, 0xd6, 0xdc, 0x74, 0xcc, 0x8c, 0x56, 0xc3,
+ 0x5f, 0x60, 0xd1, 0x12, 0x0d, 0x89, 0x29, 0xae, 0x49, 0x5b, 0x6e, 0xb0,
+ 0x67, 0x27, 0xad, 0x15, 0x46, 0x56, 0x1c, 0x7e, 0x25, 0x66, 0x6a, 0x81,
+ 0x38, 0x26, 0xac, 0x80, 0xcf, 0xce, 0x0d, 0x7d, 0x58, 0x26, 0xf9, 0xcd,
+ 0xc0, 0xf3, 0xf7, 0x30, 0xac, 0x61, 0xac, 0x4a, 0x9e, 0x02, 0xa1, 0x94,
+ 0xd5, 0x6e, 0x64, 0xce, 0x91, 0xc7, 0x4a, 0xfe, 0xcc, 0x88, 0x3d, 0x13,
+ 0xaa, 0x2e, 0x90, 0x2f, 0x5c, 0xca, 0x6b, 0x14, 0x11, 0x99, 0x13, 0x3e,
+ 0x59, 0xf7, 0x1b, 0x68, 0x72, 0xb7, 0x88, 0xe8, 0x31, 0xcb, 0x3e, 0xcd,
+ 0x01, 0xd0, 0x23, 0xcd, 0xc6, 0x00, 0x36, 0x5d, 0x29, 0xc3, 0xa1, 0xb7,
+ 0xeb, 0x50, 0xc7, 0x14, 0xc4, 0x05, 0x54, 0x7f, 0xe3, 0x6c, 0x37, 0x15,
+ 0x49, 0x65, 0x75, 0x63, 0xed, 0x2e, 0x1c, 0x8d, 0xde, 0x89, 0xde, 0xc8,
+ 0x2e, 0x66, 0x8b, 0x0c, 0x1a, 0xc4, 0x7b, 0x5a, 0x79, 0x31, 0x37, 0x65,
+ 0x1f, 0x0c, 0x0b, 0xc7, 0x79, 0xca, 0x09, 0x81, 0x40, 0x9f, 0x5f, 0x9a,
+ 0x61, 0xaf, 0xfa, 0x24, 0x4e, 0xb8, 0x14, 0x91, 0x54, 0xaa, 0xc4, 0xc6,
+ 0xea, 0xe5, 0x0e, 0x46, 0x9d, 0x1c, 0xea, 0x76, 0x9f, 0x75, 0xc0, 0xd1,
+ 0x40, 0xe4, 0x4e, 0x64, 0x8f, 0x01, 0x27, 0xb3, 0x85, 0x10, 0xd9, 0xaf,
+ 0x4c, 0x90, 0x0c, 0x96, 0x27, 0x3e, 0xf6, 0xa4, 0x03, 0xc8, 0xa8, 0xc6,
+ 0x19, 0x62, 0x72, 0xae, 0xc7, 0xcb, 0x97, 0x86, 0x83, 0x8e, 0x5a, 0x9e,
+ 0xe4, 0x28, 0xf2, 0xa6, 0xf2, 0x5e, 0xea, 0x97, 0x96, 0x92, 0x76, 0xde,
+ 0xf2, 0xf5, 0xe2, 0x62, 0x6a, 0xcf, 0x53, 0x1e, 0x37, 0x9a, 0xcb, 0x88,
+ 0x99, 0xe1, 0x15, 0xb8, 0x20, 0x71, 0xfc, 0x26, 0xfe, 0xd5, 0x1e, 0x8a,
+ 0xd1, 0x55, 0x4a, 0x45, 0x43, 0xee, 0x4d, 0x79, 0xe9, 0x57, 0x00, 0x88,
+ 0xf6, 0xf6, 0xf5, 0x86, 0x88, 0x37, 0x98, 0x92, 0x6f, 0x9d, 0xbf, 0x18,
+ 0x93, 0x7c, 0x45, 0xba, 0xaf, 0x30, 0x9c, 0xb5, 0x2b, 0xc4, 0x25, 0x2b,
+ 0x01, 0xba, 0x8e, 0x96, 0x28, 0x72, 0xf1, 0xb2, 0x2c, 0xa8, 0xbd, 0x97,
+ 0xa0, 0x30, 0x1b, 0xad, 0x22, 0x57, 0x85, 0x31, 0x42, 0x5b, 0x77, 0x37,
+ 0x7c, 0xd5, 0x54, 0x06, 0x1d, 0xa5, 0xd4, 0x39, 0x95, 0x7b, 0x80, 0x02,
+ 0xc5, 0x73, 0x6b, 0x78, 0xff, 0xa8, 0x98, 0x13, 0x0c, 0xc5, 0x76, 0xf3,
+ 0x4b, 0x9b, 0x66, 0xba, 0x40, 0xd1, 0xbe, 0xb7, 0xf5, 0x29, 0x05, 0x34,
+ 0xce, 0xab, 0x3f, 0xb8, 0xb6, 0xd4, 0x78, 0xb7, 0xe8, 0x46, 0x2e, 0xf2,
+ 0xe7, 0xd1, 0xe1, 0x69, 0xe2, 0x8d, 0x67, 0xca, 0xf1, 0x01, 0x92, 0x7c,
+ 0xdc, 0x88, 0x55, 0x26, 0xd8, 0x15, 0x6a, 0x39, 0x36, 0x5e, 0x8e, 0xc6,
+ 0xa7, 0xb4, 0xb1, 0x6e, 0xb1, 0xc9, 0x6f, 0x75, 0x0a, 0xb6, 0xf0, 0xa8,
+ 0xcd, 0xa2, 0xa5, 0xfa, 0x26, 0xdf, 0x8f, 0xf2, 0xd7, 0x3d, 0x58, 0x0d,
+ 0xa5, 0x8e, 0xf2, 0x04, 0xb9, 0x13, 0xb2, 0xe4, 0x8a, 0x30, 0x60, 0x14,
+ 0x46, 0xd7, 0x77, 0x38, 0x5d, 0x58, 0xcd, 0xf6, 0x69, 0x98, 0x76, 0x30,
+ 0x5c, 0x4d, 0xc0, 0x9e, 0xe8, 0x05, 0xda, 0x6c, 0xbb, 0x36, 0xf4, 0x5b,
+ 0xb9, 0x12, 0x6e, 0x39, 0xae, 0x2c, 0xb4, 0xc1, 0xd1, 0x69, 0x40, 0xc7,
+ 0x88, 0xbb, 0x1f, 0x4e, 0xbc, 0xec, 0x09, 0x2c, 0xb0, 0x84, 0x26, 0x23,
+ 0xf1, 0x37, 0x9b, 0x26, 0x18, 0x7b, 0x70, 0x58, 0xa4, 0x15, 0xca, 0x91,
+ 0x8f, 0x4b, 0xc3, 0xa2, 0x28, 0x8b, 0x77, 0xa7, 0x81, 0x1e, 0x87, 0xd0,
+ 0xb1, 0x0a, 0x87, 0x91, 0x2c, 0x60, 0x86, 0xac, 0x7f, 0x4f, 0xe6, 0xa4,
+ 0x84, 0x7e, 0x3f, 0xc3, 0xa2, 0x42, 0xb8, 0xb6, 0x6d, 0xb5, 0x2a, 0x7a,
+ 0x01, 0x2b, 0xfa, 0xc5, 0x37, 0xc0, 0x28, 0x20, 0xc1, 0x22, 0x17, 0x65,
+ 0xee, 0x71, 0xdc, 0xfc, 0xff, 0xac, 0x79, 0x52, 0x16, 0xc4, 0x07, 0xfa,
+ 0x3c, 0xc6, 0x8f, 0x96, 0xe3, 0xc2, 0xef, 0x34, 0xec, 0xc9, 0x7f, 0x28,
+ 0x4e, 0x51, 0xc7, 0xc7, 0xe9, 0xc5, 0x40, 0xd6, 0xef, 0xd3, 0x8b, 0x21,
+ 0x8d, 0x19, 0x86, 0xbb, 0x40, 0x71, 0x88, 0x90, 0x29, 0x1b, 0xdb, 0x8e,
+ 0xd1, 0x65, 0x08, 0xb6, 0xd1, 0x8e, 0xd9, 0x70, 0x79, 0xef, 0x86, 0xe3,
+ 0xef, 0x03, 0x2a, 0x9d, 0xc5, 0xb5, 0x77, 0x83, 0xcc, 0xf3, 0x30, 0xbe,
+ 0xee, 0x46, 0xf1, 0xdd, 0x7a, 0x67, 0x13, 0xbc, 0xc5, 0x26, 0xd7, 0x19,
+ 0x69, 0xd0, 0x22, 0xa7, 0xf2, 0xf3, 0x4d, 0xdc, 0x48, 0x1d, 0x5d, 0xdc,
+ 0x64, 0x09, 0x00, 0x80, 0x2c, 0xf6, 0x33, 0x8e, 0xe5, 0x58, 0x6e, 0xaa,
+ 0xc3, 0xc0, 0x15, 0xa2, 0x82, 0xe2, 0x2c, 0xf9, 0x91, 0xae, 0x1c, 0x19,
+ 0xd6, 0x7c, 0xa1, 0xaf, 0x0a, 0xef, 0x00, 0xd1, 0x87, 0xc7, 0x8c, 0x3a,
+ 0x6f, 0x75, 0x15, 0x5c, 0xe9, 0x0d, 0xd4, 0x7a, 0x22, 0xfb, 0x90, 0xaa,
+ 0x4a, 0x43, 0xe9, 0xcc, 0xf4, 0x30, 0xf9, 0x7a, 0xb1, 0x7b, 0x5c, 0xb0,
+ 0xfc, 0xbb, 0xfe, 0x38, 0x7d, 0x42, 0x2d, 0xed, 0x14, 0xd1, 0xf9, 0x3f,
+ 0x36, 0x80, 0xfc, 0xf6, 0xe3, 0xfe, 0xdf, 0xcf, 0xf1, 0xfd, 0x58, 0xf1,
+ 0xc1, 0xab, 0x03, 0x59, 0x28, 0x4d, 0xd7, 0x21, 0xc8, 0x8b, 0x43, 0x04,
+ 0xff, 0xc5, 0x9e, 0xa9, 0x08, 0xbb, 0xce, 0xaf, 0x3b, 0x20, 0x34, 0x2f,
+ 0x74, 0x37, 0xe4, 0x23, 0x5c, 0xa7, 0xd7, 0x5c, 0x5c, 0xa8, 0x97, 0x68,
+ 0x91, 0xb9, 0x02, 0x4f, 0x21, 0xac, 0x34, 0xc8, 0x80, 0x59, 0x75, 0x16,
+ 0xc6, 0xe9, 0x6b, 0x3c, 0x0d, 0xd2, 0x93, 0x07, 0x38, 0x00, 0xa4, 0x2d,
+ 0x0c, 0xb0, 0x8f, 0xcb, 0xa7, 0x7e, 0xaa, 0xec, 0xd9, 0xde, 0x21, 0x41,
+ 0x86, 0x52, 0xcc, 0x00, 0xb4, 0x84, 0x74, 0xd2, 0xee, 0xe2, 0xeb, 0x8b,
+ 0xac, 0x54, 0x73, 0x16, 0xa7, 0x70, 0x63, 0xbb, 0x7f, 0xaa, 0x18, 0xfb,
+ 0x12, 0x4d, 0x5f, 0x8c, 0x83, 0x3a, 0x94, 0x3a, 0xe9, 0xd1, 0x11, 0xaf,
+ 0x77, 0xf8, 0x27, 0xc5, 0x23, 0x5c, 0x95, 0xda, 0x2a, 0x85, 0xad, 0x6e,
+ 0xc6, 0xab, 0x12, 0x1a, 0xfe, 0x55, 0x97, 0x09, 0xb9, 0x10, 0xfa, 0xd4,
+ 0xe1, 0x9d, 0xbb, 0x41, 0xc5, 0xb8, 0xf8, 0xf7, 0x3a, 0xa4, 0x64, 0x2f,
+ 0xa2, 0xb4, 0x3f, 0x1d, 0x73, 0xde, 0x48, 0xf0, 0x39, 0xc5, 0x3c, 0x58,
+ 0x31, 0x0c, 0x3c, 0x7c, 0x77, 0xc9, 0x37, 0x0f, 0xe4, 0xef, 0x0f, 0x5f,
+ 0xd1, 0x9d, 0xa1, 0x29, 0x16, 0xc1, 0x89, 0x02, 0x15, 0xc3, 0x31, 0x7d,
+ 0x8e, 0x9a, 0x1f, 0x9d, 0x52, 0x95, 0xad, 0xb4, 0xd9, 0xd5, 0x77, 0x68,
+ 0x97, 0x20, 0xa3, 0xbc, 0x8a, 0x51, 0x01, 0x12, 0xda, 0xbb, 0x2a, 0x68,
+ 0x28, 0x4b, 0xca, 0x44, 0x7f, 0xf5, 0xa9, 0x15, 0xb5, 0xc2, 0x7c, 0x46,
+ 0xbe, 0xdb, 0xbb, 0xa7, 0x76, 0x43, 0x2f, 0xce, 0xb2, 0x10, 0x15, 0x5e,
+ 0x20, 0x97, 0x1e, 0x77, 0x3a, 0x90, 0x3b, 0xbe, 0x23, 0xe3, 0x5b, 0xee,
+ 0x29, 0x24, 0x44, 0x56, 0xed, 0xa7, 0x4b, 0x47, 0xb9, 0x28, 0x4c, 0xb3,
+ 0x08, 0xf2, 0x39, 0x34, 0xbe, 0x1e, 0xc6, 0xdc, 0xa7, 0xd3, 0x66, 0xe9,
+ 0x74, 0x2f, 0x85, 0xbb, 0xbe, 0x36, 0x53, 0xf2, 0xe4, 0x2c, 0x63, 0xca,
+ 0x91, 0xa8, 0x28, 0x3f, 0x3a, 0x2e, 0xa7, 0x37, 0x1b, 0x78, 0x88, 0xb6,
+ 0xf1, 0x9d, 0xe7, 0x68, 0x51, 0xcf, 0x2e, 0x25, 0x79, 0xfd, 0x1c, 0xa8,
+ 0x0d, 0x63, 0xf1, 0xd2, 0x72, 0xab, 0x9d, 0xc2, 0x00, 0x29, 0x3a, 0x7b,
+ 0x3c, 0x2f, 0xdf, 0x16, 0x55, 0x0d, 0x77, 0x1b, 0x0e, 0xd2, 0x5e, 0xa1,
+ 0xcf, 0xc2, 0xc1, 0x3c, 0xdf, 0x74, 0xf1, 0x27, 0x74, 0x3c, 0xeb, 0x4b,
+ 0x92, 0xd9, 0xfb, 0xa8, 0xf2, 0xa2, 0x06, 0xc3, 0xfe, 0x3f, 0x27, 0x4f,
+ 0xc0, 0xe4, 0x3a, 0x92, 0xb4, 0xc0, 0xb3, 0x4f, 0x77, 0x28, 0x8c, 0xb6,
+ 0x86, 0xf3, 0x7d, 0x6b, 0xc9, 0x77, 0xa0, 0x05, 0x8d, 0xa0, 0x14, 0x67,
+ 0xa0, 0x6b, 0xb4, 0x6f, 0xaa, 0xc4, 0xfb, 0x81, 0xd2, 0xcb, 0x3b, 0x57,
+ 0xa3, 0x2e, 0xf5, 0xab, 0x58, 0x2a, 0xee, 0x96
+};
+unsigned int TestClient_p8_1_len = 1256;
diff --git a/lib/libUPnP/Neptune/Source/Tests/Tls1/TlsTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Tls1/TlsTest1.cpp
new file mode 100644
index 0000000..9cf7510
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Tls1/TlsTest1.cpp
@@ -0,0 +1,423 @@
+/*****************************************************************
+|
+| TLS Test Program 1
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "NptDebug.h"
+
+
+#if defined(NPT_CONFIG_ENABLE_TLS)
+
+#include "TlsClientPrivate1.h"
+#include "TlsClientPrivate2.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+#define CHECK(x) \
+ do { \
+ if (!(x)) { \
+ fprintf(stderr, "ERROR line %d \n", __LINE__); \
+ } \
+ } while(0)
+
+const char*
+GetCipherSuiteName(unsigned int id)
+{
+ switch (id) {
+ case 0: return "NOT SET";
+ case NPT_TLS_RSA_WITH_RC4_128_MD5: return "RSA-WITH-RC4-128-MD5";
+ case NPT_TLS_RSA_WITH_RC4_128_SHA: return "RSA-WITH-RC4-128-SHA";
+ case NPT_TLS_RSA_WITH_AES_128_CBC_SHA: return "RSA-WITH-AES-128-CBC-SHA";
+ case NPT_TLS_RSA_WITH_AES_256_CBC_SHA: return "RSA-WITH-AES-256-CBC-SHA";
+ default: return "UNKNOWN";
+ }
+}
+
+static const char* EquifaxCA =
+"MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV\n"
+"UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy\n"
+"dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1\n"
+"MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx\n"
+"dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B\n"
+"AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f\n"
+"BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A\n"
+"cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC\n"
+"AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ\n"
+"MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm\n"
+"aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw\n"
+"ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj\n"
+"IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF\n"
+"MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA\n"
+"A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y\n"
+"7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh\n"
+"1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4\n";
+
+static void
+PrintCertificateInfo(NPT_TlsCertificateInfo& cert_info)
+{
+ printf("[6] Fingerprints:\n");
+ printf("MD5: %s\n", NPT_HexString(cert_info.fingerprint.md5, sizeof(cert_info.fingerprint.md5), ":").GetChars());
+ printf("SHA1: %s\n", NPT_HexString(cert_info.fingerprint.sha1, sizeof(cert_info.fingerprint.sha1), ":").GetChars());
+ printf("Subject Certificate:\n");
+ printf(" Common Name = %s\n", cert_info.subject.common_name.GetChars());
+ printf(" Organization = %s\n", cert_info.subject.organization.GetChars());
+ printf(" Organizational Name = %s\n", cert_info.subject.organizational_name.GetChars());
+ printf("Issuer Certificate:\n");
+ printf(" Common Name = %s\n", cert_info.issuer.common_name.GetChars());
+ printf(" Organization = %s\n", cert_info.issuer.organization.GetChars());
+ printf(" Organizational Name = %s\n", cert_info.issuer.organizational_name.GetChars());
+ printf("Issue Date: %d/%d/%d %02d:%02d:%02d\n", cert_info.issue_date.m_Year,
+ cert_info.issue_date.m_Month,
+ cert_info.issue_date.m_Day,
+ cert_info.issue_date.m_Hours,
+ cert_info.issue_date.m_Minutes,
+ cert_info.issue_date.m_Seconds);
+ printf("Expiration Date: %d/%d/%d %02d:%02d:%02d\n", cert_info.expiration_date.m_Year,
+ cert_info.expiration_date.m_Month,
+ cert_info.expiration_date.m_Day,
+ cert_info.expiration_date.m_Hours,
+ cert_info.expiration_date.m_Minutes,
+ cert_info.expiration_date.m_Seconds);
+ for (NPT_List<NPT_String>::Iterator i = cert_info.alternate_names.GetFirstItem();
+ i;
+ ++i) {
+ printf("DNS Name: %s\n", (*i).GetChars());
+ }
+ printf("\n");
+}
+
+static void
+PrintCertificateChain(NPT_TlsSession& session)
+{
+ NPT_Ordinal position = 0;
+ NPT_Result result;
+
+ do {
+ NPT_TlsCertificateInfo info;
+ result = session.GetPeerCertificateInfo(info, position++);
+ if (NPT_SUCCEEDED(result)) {
+ PrintCertificateInfo(info);
+ }
+ } while (NPT_SUCCEEDED(result));
+}
+
+static void
+PrintSessionInfo(NPT_TlsSession& session)
+{
+ NPT_Result result;
+
+ NPT_DataBuffer session_id;
+ result = session.GetSessionId(session_id);
+ CHECK(result == NPT_SUCCESS);
+ //CHECK(session_id.GetDataSize() > 0);
+ printf("[5] Session ID: ");
+ printf("%s", NPT_HexString(session_id.GetData(), session_id.GetDataSize()).GetChars());
+ printf("\n");
+
+ PrintCertificateChain(session);
+
+ printf("[7] Cipher Type = %d (%s)\n", session.GetCipherSuiteId(), GetCipherSuiteName(session.GetCipherSuiteId()));
+}
+
+static int
+TestRemoteServer(const char* hostname, unsigned int port, bool verify_cert, NPT_Result expected_cert_verif_result, bool client_key)
+{
+ printf("[1] Connecting to %s...\n", hostname);
+ NPT_Socket* client_socket = new NPT_TcpClientSocket();
+ NPT_IpAddress server_ip;
+ NPT_Result result = server_ip.ResolveName(hostname);
+ if (NPT_FAILED(result)) {
+ printf("!ERROR cannot resolve hostname\n");
+ return 1;
+ }
+ NPT_SocketAddress server_addr(server_ip, port);
+ result = client_socket->Connect(server_addr);
+ printf("[2] Connection result = %d (%s)\n", result, NPT_ResultText(result));
+ if (NPT_FAILED(result)) {
+ printf("!ERROR cannot connect\n");
+ return 1;
+ }
+
+ NPT_InputStreamReference input;
+ NPT_OutputStreamReference output;
+ client_socket->GetInputStream(input);
+ client_socket->GetOutputStream(output);
+ delete client_socket;
+ NPT_TlsContext context(NPT_TlsContext::OPTION_VERIFY_LATER);
+
+ NPT_DataBuffer ta_data;
+ NPT_Base64::Decode(EquifaxCA, NPT_StringLength(EquifaxCA), ta_data);
+ result = context.AddTrustAnchor(ta_data.GetData(), ta_data.GetDataSize());
+ if (NPT_FAILED(result)) {
+ printf("!ERROR: context->AddTrustAnchor() \n");
+ return 1;
+ }
+ result = context.AddTrustAnchors(NPT_Tls::GetDefaultTrustAnchors(0));
+ if (NPT_FAILED(result)) {
+ printf("!ERROR: context->AddTrustAnchors() \n");
+ return 1;
+ }
+
+ if (client_key) {
+ /* self-signed cert */
+ result = context.LoadKey(NPT_TLS_KEY_FORMAT_PKCS8, TestClient_p8_1, TestClient_p8_1_len, "neptune");
+ CHECK(result == NPT_SUCCESS);
+ result = context.SelfSignCertificate("MyClientCommonName", "MyClientOrganization", "MyClientOrganizationalName");
+ }
+
+ NPT_TlsClientSession session(context, input, output);
+ printf("[3] Performing Handshake\n");
+ result = session.Handshake();
+ printf("[4] Handshake Result = %d (%s)\n", result, NPT_ResultText(result));
+ if (NPT_FAILED(result)) {
+ printf("!ERROR handshake failed\n");
+ return 1;
+ }
+
+ PrintSessionInfo(session);
+ if (verify_cert) {
+ result = session.VerifyPeerCertificate();
+ printf("[9] Certificate Verification Result = %d (%s)\n", result, NPT_ResultText(result));
+ if (result != expected_cert_verif_result) {
+ printf("!ERROR, cert verification expected %d, got %d\n", expected_cert_verif_result, result);
+ return 1;
+ }
+ }
+
+ NPT_InputStreamReference ssl_input;
+ NPT_OutputStreamReference ssl_output;
+ session.GetInputStream(ssl_input);
+ session.GetOutputStream(ssl_output);
+
+ printf("[10] Getting / Document\n");
+ ssl_output->WriteString("GET / HTTP/1.0\n\n");
+ for (;;) {
+ unsigned char buffer[1];
+ NPT_Size bytes_read = 0;
+ result = ssl_input->Read(&buffer[0], 1, &bytes_read);
+ if (NPT_SUCCEEDED(result)) {
+ CHECK(bytes_read == 1);
+ printf("%c", buffer[0]);
+ } else {
+ if (result != NPT_ERROR_EOS && result != NPT_ERROR_CONNECTION_ABORTED) {
+ printf("!ERROR: Read() returned %d (%s)\n", result, NPT_ResultText(result));
+ }
+ break;
+ }
+ }
+ printf("[9] SUCCESS\n");
+
+ return 0;
+}
+
+class TlsTestServer : public NPT_Thread
+{
+ void Run();
+
+public:
+ TlsTestServer(int mode) : m_Mode(mode) {}
+
+ int m_Mode;
+ NPT_SharedVariable m_Ready;
+ NPT_SocketInfo m_SocketInfo;
+};
+
+void
+TlsTestServer::Run()
+{
+ printf("@@@ starting TLS server\n");
+ NPT_TcpServerSocket socket;
+ NPT_SocketAddress address(NPT_IpAddress::Any, 0);
+ NPT_Result result = socket.Bind(address);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "@@@ Bind failed (%d)\n", result);
+ return;
+ }
+ result = socket.GetInfo(m_SocketInfo);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "@@@ GetInfo failed (%d)\n", result);
+ return;
+ }
+ socket.Listen(5);
+ m_Ready.SetValue(1);
+
+ printf("@@@ Waiting for connection\n");
+ NPT_Socket* client = NULL;
+ socket.WaitForNewClient(client);
+ printf("@@@ Client connected\n");
+
+ NPT_TlsContext tls_context(m_Mode?(NPT_TlsContext::OPTION_REQUIRE_CLIENT_CERTIFICATE | NPT_TlsContext::OPTION_VERIFY_LATER):0);
+ /* self-signed cert */
+ result = tls_context.LoadKey(NPT_TLS_KEY_FORMAT_PKCS8, TestClient_p8_1, TestClient_p8_1_len, "neptune");
+ CHECK(result == NPT_SUCCESS);
+ result = tls_context.SelfSignCertificate("MyServerCommonName", "MyServerOrganization", "MyServerOrganizationalName");
+
+ NPT_InputStreamReference socket_input;
+ NPT_OutputStreamReference socket_output;
+ client->GetInputStream(socket_input);
+ client->GetOutputStream(socket_output);
+ NPT_TlsServerSession session(tls_context, socket_input, socket_output);
+ delete client;
+
+ result = session.Handshake();
+ if (m_Mode == 1) {
+ /* expect a self-signed client cert */
+ result = session.VerifyPeerCertificate();
+ printf("@@@ Certificate Verification Result = %d (%s)\n", result, NPT_ResultText(result));
+ if (result != NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED) {
+ printf("!ERROR, cert verification expected %d, got %d\n", NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED, result);
+ return;
+ }
+
+ PrintCertificateChain(session);
+ } else {
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "@@@ Handshake failed (%d : %s)\n", result, NPT_ResultText(result));
+ return;
+ }
+ }
+
+ NPT_OutputStreamReference tls_output;
+ session.GetOutputStream(tls_output);
+ tls_output->WriteString("Hello, Client\n");
+
+ printf("@@@ TLS server done\n");
+ //NPT_System::Sleep(1.0);
+}
+
+static void
+TestLocalServer()
+{
+ TlsTestServer* server = new TlsTestServer(0);
+ server->Start();
+
+ server->m_Ready.WaitUntilEquals(1);
+ TestRemoteServer("127.0.0.1", server->m_SocketInfo.local_address.GetPort(), true, NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED, true);
+ server->Wait();
+ delete server;
+
+ server = new TlsTestServer(1);
+ server->Start();
+
+ server->m_Ready.WaitUntilEquals(1);
+ TestRemoteServer("127.0.0.1", server->m_SocketInfo.local_address.GetPort(), true, NPT_ERROR_TLS_CERTIFICATE_SELF_SIGNED, true);
+ server->Wait();
+ delete server;
+}
+
+static void
+TestPrivateKeys()
+{
+ NPT_TlsContext context;
+ NPT_Result result;
+
+ NPT_DataBuffer key_data;
+ NPT_Base64::Decode(TestClient_rsa_priv_base64_1, NPT_StringLength(TestClient_rsa_priv_base64_1), key_data);
+
+ result = context.LoadKey(NPT_TLS_KEY_FORMAT_RSA_PRIVATE, key_data.GetData(), key_data.GetDataSize(), NULL);
+ CHECK(result == NPT_SUCCESS);
+
+ result = context.LoadKey(NPT_TLS_KEY_FORMAT_PKCS8, TestClient_p8_1, TestClient_p8_1_len, NULL);
+ CHECK(result != NPT_SUCCESS);
+ result = context.LoadKey(NPT_TLS_KEY_FORMAT_PKCS8, TestClient_p8_1, TestClient_p8_1_len, "neptune");
+ CHECK(result == NPT_SUCCESS);
+}
+
+class TestTlsConnector : public NPT_HttpTlsConnector
+{
+public:
+ virtual NPT_Result VerifyPeer(NPT_TlsClientSession& session,
+ const char* hostname) {
+ printf("+++ Verifying Peer (hostname=%s)\n", hostname);
+ PrintSessionInfo(session);
+ return NPT_HttpTlsConnector::VerifyPeer(session, hostname);
+ }
+};
+
+static void
+TestHttpConnector(const char* hostname)
+{
+ TestTlsConnector connector;
+ NPT_HttpClient client(&connector, false);
+ NPT_String url_string = "https://";
+ url_string += hostname;
+ url_string += "/index.html";
+ NPT_HttpUrl url(url_string);
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_GET);
+ NPT_HttpResponse* response = NULL;
+ NPT_Result result = client.SendRequest(request, response);
+ CHECK(result == NPT_SUCCESS);
+ if (NPT_SUCCEEDED(result)) {
+ CHECK(response->GetEntity() != NULL);
+ if (response->GetEntity()) {
+ printf("+++ HTTP Response: code=%d, type=%s, len=%d\n",
+ response->GetStatusCode(),
+ response->GetEntity()->GetContentType().GetChars(),
+ (int)response->GetEntity()->GetContentLength());
+ }
+ } else {
+ printf("!ERROR: SendRequest returns %d (%s)\n", result, NPT_ResultText(result));
+ }
+ delete response;
+}
+
+static void
+TestDnsNameMatch()
+{
+ CHECK(!NPT_Tls::MatchDnsName(NULL, NULL));
+ CHECK(!NPT_Tls::MatchDnsName(NULL, ""));
+ CHECK(!NPT_Tls::MatchDnsName(NULL, "a"));
+ CHECK(!NPT_Tls::MatchDnsName(NULL, "a.com"));
+ CHECK(!NPT_Tls::MatchDnsName(NULL, "*"));
+ CHECK(!NPT_Tls::MatchDnsName("", NULL));
+ CHECK(!NPT_Tls::MatchDnsName("", ""));
+ CHECK(!NPT_Tls::MatchDnsName("", "a"));
+ CHECK(!NPT_Tls::MatchDnsName("", "a.com"));
+ CHECK(!NPT_Tls::MatchDnsName("", "*"));
+ CHECK(!NPT_Tls::MatchDnsName("*", "*"));
+ CHECK(!NPT_Tls::MatchDnsName("a", "*"));
+ CHECK(!NPT_Tls::MatchDnsName("a.com", "*"));
+ CHECK(!NPT_Tls::MatchDnsName("a.com", "b.com"));
+ CHECK(!NPT_Tls::MatchDnsName("a.com", "*.a.com"));
+
+ CHECK(NPT_Tls::MatchDnsName("a.com", "a.com"));
+ CHECK(NPT_Tls::MatchDnsName("b.a.com", "*.a.com"));
+ CHECK(NPT_Tls::MatchDnsName("a.com", "A.com"));
+ CHECK(NPT_Tls::MatchDnsName("a.com", "a.COM"));
+}
+#endif
+
+int
+main(int argc, char** argv)
+{
+ NPT_COMPILER_UNUSED(argc);
+ NPT_COMPILER_UNUSED(argv);
+
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ /* test dns name matching */
+ TestDnsNameMatch();
+
+ /* test private keys */
+ TestPrivateKeys();
+
+ /* test a local connection */
+ TestLocalServer();
+
+ /* test a connection */
+ const char* hostname = argc==2?argv[1]:"zebulon.bok.net";
+ TestRemoteServer(hostname, 443, true, NPT_SUCCESS, false);
+
+ /* test using the http connector */
+ TestHttpConnector(hostname);
+#endif
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Udp1/UdpTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Udp1/UdpTest1.cpp
new file mode 100644
index 0000000..46b1381
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Udp1/UdpTest1.cpp
@@ -0,0 +1,94 @@
+/*****************************************************************
+|
+| Neptune Tests - UDP
+|
+| (c) 2001-2002 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(NPT_CONFIG_HAVE_STDLIB_H)
+#include <stdlib.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STRING_H)
+#include <string.h>
+#endif
+
+#if defined(NPT_CONFIG_HAVE_STDIO_H)
+#include <stdio.h>
+#endif
+
+/*----------------------------------------------------------------------
+| Receive
++---------------------------------------------------------------------*/
+static void
+Receive()
+{
+ printf("==== Receive\n");
+
+ NPT_UdpSocket receiver;
+ NPT_DataBuffer buffer(4096);
+ buffer.SetDataSize(4096);
+ NPT_Result result = receiver.Bind(NPT_SocketAddress(NPT_IpAddress::Any, 9123));
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "Bind() failed (%d)\n", result);
+ return;
+ }
+ NPT_SocketAddress address;
+ result = receiver.Receive(buffer, &address);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "Receive failed(%d)\n", result);
+ return;
+ }
+ NPT_String addr_string = address.GetIpAddress().ToString();
+ printf("received packet, size=%d, from %s:%d\n",
+ (int)buffer.GetDataSize(),
+ (const char*)addr_string,
+ (int)address.GetPort());
+}
+
+/*----------------------------------------------------------------------
+| Send
++---------------------------------------------------------------------*/
+static void
+Send()
+{
+ printf("==== Send\n");
+
+ NPT_UdpSocket sender;
+ NPT_DataBuffer buffer(1024);
+ buffer.SetDataSize(1024);
+ NPT_IpAddress address;
+ address.ResolveName("localhost");
+ NPT_SocketAddress socket_address(address, 9123);
+ NPT_Result result = sender.Send(buffer, &socket_address);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "Send() failed(%d)\n", result);
+ return;
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ if (argc >= 2) {
+ if (NPT_StringsEqual(argv[1], "send")) {
+ Receive();
+ } else {
+ Send();
+ }
+ } else {
+ }
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Url1/UrlTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Url1/UrlTest1.cpp
new file mode 100644
index 0000000..7a8e644
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Url1/UrlTest1.cpp
@@ -0,0 +1,309 @@
+/*****************************************************************
+|
+| URL Test Program 1
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+#define CHECK(x) \
+ do { \
+ if (!(x)) { \
+ fprintf(stderr, "ERROR line %d \n", __LINE__); \
+ } \
+ } while(0)
+
+/*----------------------------------------------------------------------
+| Parse Test Vectors
++---------------------------------------------------------------------*/
+typedef struct {
+ const char* url;
+ bool expected_to_be_valid;
+ const char* expected_scheme;
+ const char* expected_host;
+ int expected_port;
+ const char* expected_path;
+ const char* expected_query;
+ const char* expected_fragment;
+ const char* expected_string;
+} ParseTestVector;
+
+static ParseTestVector ParseTestVectors[] = {
+ {"", false, NULL, NULL, 0, NULL, NULL, NULL, NULL},
+ {"http", false, NULL, NULL, 0, NULL, NULL, NULL, NULL},
+ {"http:", false, NULL, NULL, 0, NULL, NULL, NULL, NULL},
+ {"http:/", false, NULL, NULL, 0, NULL, NULL, NULL, NULL},
+ {"http://", false, NULL, NULL, 0, NULL, NULL, NULL, NULL},
+ {"http://a", true, "http", "a", 80, "/", NULL, NULL, "http://a/"},
+ {"http://foo.bar", true, "http", "foo.bar", 80, "/", NULL, NULL, "http://foo.bar/"},
+ {"http://foo.bar:", false, NULL, NULL, 0, NULL, NULL, NULL, NULL},
+ {"http://foo.bar:156", true, "http", "foo.bar", 156, "/", NULL, NULL, "http://foo.bar:156/"},
+ {"http://foo.bar:176899", false, NULL, NULL, 0, NULL, NULL, NULL, NULL},
+ {"http://foo.bar:176a", false, NULL, NULL, 0, NULL, NULL, NULL, NULL},
+ {"http://foo.bar:176/", true, "http", "foo.bar", 176, "/", NULL, NULL, "http://foo.bar:176/"},
+ {"http://foo.bar:176/blabla", true, "http", "foo.bar", 176, "/blabla", NULL, NULL, "http://foo.bar:176/blabla"},
+ {"http://foo.bar/blabla/blibli", true, "http", "foo.bar", 80, "/blabla/blibli", NULL, NULL, "http://foo.bar/blabla/blibli"},
+ {"http://foo.bar/blabla/blibli", true, "http", "foo.bar", 80, "/blabla/blibli", NULL, NULL, "http://foo.bar/blabla/blibli"},
+ {"http://foo.bar:176/blabla/blibli/", true, "http", "foo.bar", 176, "/blabla/blibli/", NULL, NULL, "http://foo.bar:176/blabla/blibli/"},
+ {"http://foo.bar/", true, "http", "foo.bar", 80, "/", NULL, NULL, "http://foo.bar/"},
+ {"http://foo.bar/blabla/blibli/?query", true, "http", "foo.bar", 80, "/blabla/blibli/", "query", NULL, "http://foo.bar/blabla/blibli/?query"},
+ {"http://foo.bar/blabla/blibli/?query=1&bla=%20&slash=/&foo=a#fragment", true, "http", "foo.bar", 80, "/blabla/blibli/", "query=1&bla=%20&slash=/&foo=a", "fragment", "http://foo.bar/blabla/blibli/?query=1&bla=%20&slash=/&foo=a#fragment"},
+ {"http://foo.bar/blabla%20foo/blibli/?query=1&bla=2&slash=/&foo=a#fragment", true, "http", "foo.bar", 80, "/blabla%20foo/blibli/", "query=1&bla=2&slash=/&foo=a","fragment", "http://foo.bar/blabla%20foo/blibli/?query=1&bla=2&slash=/&foo=a#fragment"},
+ {"http://foo.bar?query", true, "http", "foo.bar", 80, NULL, "query", NULL, "http://foo.bar/?query"},
+ {"http://foo.bar#fragment", true, "http", "foo.bar", 80, NULL, NULL, "fragment", "http://foo.bar/#fragment"},
+ {"http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:8080/index.html", true, "http", "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", 8080, "/index.html", NULL, NULL, "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:8080/index.html"},
+ {"http://[::1]/", true, "http", "::1", 80, "/", NULL, NULL, "http://[::1]/"}
+ };
+
+typedef struct {
+ char* scheme;
+ char* host;
+ int port;
+ char* qery;
+ char* fragment;
+ char* expected_uri;
+} ConstructTestVector;
+
+typedef struct {
+ char* in;
+ char* out;
+ bool do_percent;
+} EncodeTestVector;
+
+typedef struct {
+ char* in;
+ char* out;
+} DecodeTestVector;
+
+/*----------------------------------------------------------------------
+| TestParse
++---------------------------------------------------------------------*/
+static void
+TestParse(ParseTestVector* vector, int test_index)
+{
+ NPT_HttpUrl url(vector->url);
+ if (url.IsValid() != vector->expected_to_be_valid) {
+ fprintf(stderr, "TEST %02d: expected IsValid() to return %s, got %s\n", test_index, vector->expected_to_be_valid?"true":"false", url.IsValid()?"true":"false");
+ return;
+ }
+ if (!vector->expected_to_be_valid) return;
+ if (vector->expected_scheme) {
+ if (url.GetScheme() != vector->expected_scheme) {
+ fprintf(stderr, "TEST %02d: expected GetScheme() to return %s, got %s\n", test_index, vector->expected_scheme, url.GetScheme().GetChars());
+ return;
+ }
+ }
+ if (vector->expected_host) {
+ if (url.GetHost() != vector->expected_host) {
+ fprintf(stderr, "TEST %02d: expected GetHost() to return %s, got %s\n", test_index, vector->expected_host, url.GetHost().GetChars());
+ return;
+ }
+ }
+ if (url.GetPort() != vector->expected_port) {
+ fprintf(stderr, "TEST %02d: expected GetPort() to return %d, got %d\n", test_index, vector->expected_port, url.GetPort());
+ return;
+ }
+ if (vector->expected_path) {
+ if (url.GetPath() != vector->expected_path) {
+ fprintf(stderr, "TEST %02d: expected GetPath() to return %s, got %s\n", test_index, vector->expected_path, url.GetPath().GetChars());
+ return;
+ }
+ }
+ if (url.HasQuery() != (vector->expected_query != NULL)) {
+ fprintf(stderr, "TEST %02d: expected a query, did not get one\n", test_index);
+ return;
+ }
+ if (vector->expected_query) {
+ if (url.GetQuery() != vector->expected_query) {
+ fprintf(stderr, "TEST %02d: expected GetQuery() to return %s, got %s\n", test_index, vector->expected_query, url.GetQuery().GetChars());
+ return;
+ }
+ }
+ if (url.HasFragment() != (vector->expected_fragment != NULL)) {
+ fprintf(stderr, "TEST %02d: expected a fragment, did not get one\n", test_index);
+ return;
+ }
+ if (vector->expected_fragment) {
+ if (url.GetFragment() != vector->expected_fragment) {
+ fprintf(stderr, "TEST %02d: expected GetFragment() to return %s, got %s\n", test_index, vector->expected_fragment, url.GetFragment().GetChars());
+ return;
+ }
+ }
+
+ NPT_String url_string = url.ToString();
+ if (url_string != vector->expected_string) {
+ fprintf(stderr, "TEST %02d: expected ToString() to return %s, got %s\n", test_index, vector->expected_string, url_string.GetChars());
+ return;
+ }
+ NPT_HttpUrl url2(url_string);
+ if (url2.ToString() != url_string) {
+ fprintf(stderr, "TEST %02d: url ToString() does not parse to same url\n", test_index);
+ return;
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ // setup debugging
+#if defined(WIN32) && defined(_DEBUG)
+ int flags = _crtDbgFlag |
+ _CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_DELAY_FREE_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF;
+
+ _CrtSetDbgFlag(flags);
+ //AllocConsole();
+ //freopen("CONOUT$", "w", stdout);
+#endif
+
+ printf("--- test starting\n");
+
+ // parsing test vectors
+ for (unsigned int i=0; i<sizeof(ParseTestVectors)/sizeof(ParseTestVectors[0]); i++) {
+ ParseTestVector* vector = &ParseTestVectors[i];
+ TestParse(vector, i);
+ }
+
+ // test URL parsing, special cases
+ NPT_HttpUrl url;
+ CHECK(!url.IsValid());
+
+ url = "http://foo.bar/blabla%20foo/blibli/?query=1&bla=2&slash=/&foo=a#fragment";
+ CHECK(url.IsValid());
+ CHECK(url.GetHost() == "foo.bar");
+ CHECK(url.GetPort() == 80);
+ CHECK(url.GetPath() == "/blabla%20foo/blibli/");
+ CHECK(url.GetQuery() == "query=1&bla=2&slash=/&foo=a");
+ CHECK(url.GetFragment() == "fragment");
+ CHECK(url.ToString(false) == "http://foo.bar/blabla%20foo/blibli/?query=1&bla=2&slash=/&foo=a");
+
+ url = NPT_HttpUrl("http://foo.bar/blabla%20foo/blibli/?query=1&bla=2&slash=/&foo=a#fragment");
+ CHECK(url.IsValid());
+ CHECK(url.GetHost() == "foo.bar");
+ CHECK(url.GetPort() == 80);
+ CHECK(url.GetPath() == "/blabla%20foo/blibli/");
+ CHECK(url.GetQuery() == "query=1&bla=2&slash=/&foo=a");
+ CHECK(url.GetFragment() == "fragment");
+ CHECK(url.ToRequestString() == "/blabla%20foo/blibli/?query=1&bla=2&slash=/&foo=a");
+
+ url.ParsePathPlus("/bla/foo?query=bar");
+ url.SetHost("bar.com:8080");
+ CHECK(url.IsValid());
+ CHECK(url.GetHost() == "bar.com");
+ CHECK(url.GetPort() == 8080);
+ CHECK(url.GetPath() == "/bla/foo");
+ CHECK(url.GetQuery() == "query=bar");
+
+ url.ParsePathPlus("bla/foo?query=bar");
+ url.SetHost("bar.com:8080");
+ CHECK(url.IsValid());
+ CHECK(url.GetHost() == "bar.com");
+ CHECK(url.GetPort() == 8080);
+ CHECK(url.GetPath() == "bla/foo");
+ CHECK(url.GetQuery() == "query=bar");
+
+ url.ParsePathPlus("*");
+ CHECK(url.IsValid());
+ CHECK(url.GetPath() == "*");
+
+ url = NPT_HttpUrl("http://foo/?query=1&bla=2&slash=/&foo=a#fragment");
+ CHECK(url.IsValid());
+ CHECK(url.GetHost() == "foo");
+ CHECK(url.GetPort() == 80);
+ CHECK(url.GetPath() == "/");
+ CHECK(url.GetQuery() == "query=1&bla=2&slash=/&foo=a");
+ CHECK(url.GetFragment() == "fragment");
+ CHECK(url.ToRequestString() == "/?query=1&bla=2&slash=/&foo=a");
+
+ url.Reset();
+ CHECK(url.GetHost().IsEmpty());
+ CHECK(url.GetPath().IsEmpty());
+ CHECK(url.GetPort() == 0);
+ CHECK(url.GetQuery().IsEmpty());
+ CHECK(url.GetFragment().IsEmpty());
+ CHECK(url.SetHost("foobar.com:x1234") == NPT_ERROR_INVALID_SYNTAX);
+ CHECK(url.SetHost("[::1]foo") == NPT_ERROR_INVALID_SYNTAX);
+ CHECK(url.SetHost("[::1]:-1234") == NPT_ERROR_INVALID_SYNTAX);
+ CHECK(url.SetHost("[::1") == NPT_ERROR_INVALID_SYNTAX);
+ CHECK(url.SetHost("a:65536") == NPT_ERROR_OUT_OF_RANGE);
+ CHECK(url.SetHost("foobar.com:1234") == NPT_SUCCESS);
+ CHECK(url.GetHost() == "foobar.com");
+ CHECK(url.GetPort() == 1234);
+ CHECK(url.SetHost("foobar.com") == NPT_SUCCESS);
+ CHECK(url.SetHost("[::1]") == NPT_SUCCESS);
+ CHECK(url.GetHost() == "::1");
+ CHECK(url.SetHost("[::1]:4567") == NPT_SUCCESS);
+ CHECK(url.GetHost() == "::1");
+ CHECK(url.GetPort() == 4567);
+
+ // url form encoding
+ NPT_UrlQuery query;
+ query.AddField("url1","http://foo.bar/foo?q=3&bar=+7/3&boo=a%3Db&bli=a b");
+ query.AddField("url2","(1234+456 789)");
+ CHECK(query.ToString() == "url1=http%3A%2F%2Ffoo.bar%2Ffoo%3Fq%3D3%26bar%3D%2B7%2F3%26boo%3Da%253Db%26bli%3Da+b&url2=(1234%2B456+789)");
+
+ query = "url1=http%3A%2F%2Ffoo.bar%2Ffoo%3Fq%3D3%26bar%3D%2B7%2F3&url2=12+34";
+ CHECK(query.ToString() == "url1=http%3A%2F%2Ffoo.bar%2Ffoo%3Fq%3D3%26bar%3D%2B7%2F3&url2=12+34");
+
+ // url query decoding
+ NPT_UrlQuery query2("a=1+2+3&b=http%3A%2F%2Ffoo.bar%2Ffoo%3Fq%3D3%26bar%3D%2B7%2F3%26boo%3Da%3Db%26bli%3Da+b");
+ const char* a_field = query2.GetField("a");
+ const char* b_field = query2.GetField("b");
+ const char* c_field = query2.GetField("c");
+ CHECK(a_field != NULL);
+ CHECK(NPT_StringsEqual(a_field, "1+2+3"));
+ CHECK(NPT_UrlQuery::UrlDecode(a_field) == "1 2 3");
+ CHECK(b_field != NULL);
+ CHECK(NPT_StringsEqual(b_field, "http%3A%2F%2Ffoo.bar%2Ffoo%3Fq%3D3%26bar%3D%2B7%2F3%26boo%3Da%3Db%26bli%3Da+b"));
+ CHECK(NPT_UrlQuery::UrlDecode(b_field) == "http://foo.bar/foo?q=3&bar=+7/3&boo=a=b&bli=a b");
+ CHECK(c_field == NULL);
+
+ // url query misc
+ NPT_UrlQuery query3;
+ query3.SetField("a b", "c&3", false);
+ query3.AddField("a b", "c&4 b&6", false);
+ query3.SetField("c d", "c&5", false);
+ query3.SetField("a+b", "c_3", true);
+ const char* field1 = query3.GetField("a b");
+ const char* field2 = query3.GetField("c d");
+ CHECK(field1 != NULL);
+ CHECK(NPT_UrlQuery::UrlDecode(field1) == "c_3");
+ CHECK(field2 != NULL);
+ CHECK(NPT_UrlQuery::UrlDecode(field2) == "c&5");
+
+ // url query with empty values
+ NPT_UrlQuery query4("a=1&b&c=");
+ a_field = query4.GetField("a");
+ b_field = query4.GetField("b");
+ c_field = query4.GetField("c");
+ CHECK(NPT_StringsEqual(a_field, "1"));
+ CHECK(NPT_StringsEqual(b_field, ""));
+ CHECK(NPT_StringsEqual(c_field, ""));
+
+ // IPv6 test
+ NPT_String localhost = NPT_IpAddress::Loopback.ToUrlHost();
+ if (NPT_IpAddress::Loopback.GetType() == NPT_IpAddress::IPV4) {
+ CHECK(localhost == "127.0.0.1");
+ } else {
+ CHECK(localhost == "[::1]");
+ }
+
+ printf("--- test done\n");
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Xml1/XmlTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Xml1/XmlTest1.cpp
new file mode 100644
index 0000000..0b101ee
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Xml1/XmlTest1.cpp
@@ -0,0 +1,591 @@
+/*****************************************************************
+|
+| XML Test Program 1
+|
+| (c) 2001-2003 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <assert.h>
+#include "Neptune.h"
+#include "NptDebug.h"
+
+/*----------------------------------------------------------------------
+| CHECK
++---------------------------------------------------------------------*/
+#define CHECK(test) \
+do { \
+ if (!(test)) { \
+ fprintf(stderr, "FAILED: line %d\n", __LINE__); \
+ assert(0); \
+ } \
+} while(0)
+
+/*----------------------------------------------------------------------
+| TestWriter
++---------------------------------------------------------------------*/
+static void
+TestWriter()
+{
+ NPT_XmlElementNode* top = new NPT_XmlElementNode("top");
+ NPT_XmlElementNode* child1 = new NPT_XmlElementNode("child1");
+ child1->SetAttribute("someAttribute", "someValue");
+ top->AddChild(child1);
+ NPT_XmlElementNode* child2 = new NPT_XmlElementNode("child2");
+ child2->SetAttribute("someOtherAttribute", "someOtherValue");
+ child2->AddText("Some Text");
+ child1->AddChild(child2);
+ NPT_XmlElementNode* child3 = new NPT_XmlElementNode("child3");
+ child3->SetAttribute("thirdArrtibute", "3");
+ child2->AddChild(child3);
+
+ NPT_XmlWriter writer;
+ NPT_File out(NPT_FILE_STANDARD_OUTPUT);
+ out.Open(NPT_FILE_OPEN_MODE_WRITE);
+ NPT_OutputStreamReference out_stream;
+ out.GetOutputStream(out_stream);
+
+ writer.Serialize(*top, *out_stream);
+}
+
+#if defined(_WIN32) && defined(_DEBUG) && !defined(UNDER_CE)
+#include <crtdbg.h>
+#endif
+
+/*----------------------------------------------------------------------
+| TestFinders
++---------------------------------------------------------------------*/
+static void
+TestFinders()
+{
+ const char* xml = "<a b='foo' c='bar' ns:b='bla' ns:d='123' xmlns:ns='ns-uri' xmlns:ns1='ns1-uri' xmlns:ns2='ns2-uri' xmlns:ns3='ns3-uri'><b xmlns='ns4-uri' ba='123' ns2:bo='345'></b><b ba='123' ns2:bo='345'></b><ns2:b></ns2:b><ns1:b></ns1:b></a>";
+ NPT_XmlParser parser;
+ NPT_XmlNode* root;
+ CHECK(NPT_SUCCEEDED(parser.Parse(xml, root)));
+
+ NPT_XmlElementNode* elem = root->AsElementNode();
+ const NPT_String* attr = elem->GetAttribute("d");
+ CHECK(attr == NULL);
+ attr = elem->GetAttribute("b");
+ CHECK(attr != NULL && *attr == "foo");
+ attr = elem->GetAttribute("b", "ns-uri");
+ CHECK(attr != NULL && *attr == "bla");
+ attr = elem->GetAttribute("c", NPT_XML_ANY_NAMESPACE);
+ CHECK(attr != NULL && *attr == "bar");
+ attr = elem->GetAttribute("b", NPT_XML_ANY_NAMESPACE);
+ CHECK(attr != NULL && *attr == "foo");
+ attr = elem->GetAttribute("b", "boubou");
+ CHECK(attr == NULL);
+ attr = elem->GetAttribute("d", NPT_XML_NO_NAMESPACE);
+ CHECK(attr == NULL);
+
+ NPT_XmlElementNode* child;
+ child = elem->GetChild("b");
+ CHECK(child != NULL && *child->GetAttribute("ba") == "123");
+ child = elem->GetChild("b", "ns4-uri");
+ CHECK(child != NULL && child->GetAttribute("ba", "ns4-uri") == NULL);
+ CHECK(child != NULL && *child->GetAttribute("bo", NPT_XML_ANY_NAMESPACE) == "345");
+ CHECK(child != NULL && child->GetAttribute("bo", NPT_XML_NO_NAMESPACE) == NULL);
+ CHECK(child != NULL && child->GetAttribute("bo", "foo") == NULL);
+ CHECK(child != NULL && *child->GetAttribute("bo", "ns2-uri") == "345");
+ child = elem->GetChild("b", NPT_XML_ANY_NAMESPACE);
+ CHECK(child != NULL && *child->GetNamespace() == "ns4-uri");
+ child = elem->GetChild("b", "ns2-uri");
+ CHECK(child != NULL && *child->GetNamespace() == "ns2-uri");
+ child = elem->GetChild("b", "boubou");
+ CHECK(child == NULL);
+
+ delete root;
+}
+
+/*----------------------------------------------------------------------
+| TestNamespaces
++---------------------------------------------------------------------*/
+static void
+TestNamespaces()
+{
+ NPT_XmlElementNode* top = new NPT_XmlElementNode("top");
+ top->SetNamespaceUri("", "http://namespace1.com");
+ CHECK(top->GetNamespaceUri("") &&
+ *(top->GetNamespaceUri("")) == "http://namespace1.com");
+
+ NPT_XmlElementNode* child1 = new NPT_XmlElementNode("child1");
+ top->AddChild(child1);
+ CHECK(child1->GetNamespaceUri(""));
+ CHECK(*(child1->GetNamespaceUri("")) == "http://namespace1.com");
+
+ NPT_XmlElementNode* child2 = new NPT_XmlElementNode("ns1", "child2");
+ top->AddChild(child2);
+ CHECK(child2->GetNamespaceUri(""));
+ CHECK(*(child2->GetNamespaceUri("")) == "http://namespace1.com");
+ CHECK(child2->GetNamespaceUri("ns1") == NULL);
+ child2->SetNamespaceUri("ns1", "http://blabla");
+ CHECK(child2->GetNamespaceUri("ns1"));
+ CHECK(*child2->GetNamespaceUri("ns1") == "http://blabla");
+ CHECK(*child2->GetNamespace() == "http://blabla");
+
+ // testing a child with a namespace defined in parent
+ NPT_XmlElementNode* child3 = new NPT_XmlElementNode("ns1", "child3");
+ child2->AddChild(child3);
+ CHECK(child3->GetNamespaceUri(""));
+ CHECK(*(child3->GetNamespaceUri("")) == "http://namespace1.com");
+ CHECK(child3->GetNamespaceUri("ns1"));
+ CHECK(*child3->GetNamespaceUri("ns1") == "http://blabla");
+ CHECK(*child3->GetNamespace() == "http://blabla");
+
+ // testing adding a namespace in a node which namespace is defined in parent
+ child3->SetNamespaceUri("ns3", "http://foofoo");
+ CHECK(child3->GetNamespaceUri("ns1"));
+ CHECK(*child3->GetNamespaceUri("ns1") == "http://blabla");
+ CHECK(*child3->GetNamespace() == "http://blabla");
+
+ const char* xml1 =
+ "<top>"
+ " <child1 xmlns:foo='blabla'><cc1 foo:attr1='0'/></child1>"
+ " <child2 xmlns='foobar' attr1='1'>"
+ " <cc2/>"
+ " <cc3 />"
+ " </child2 >"
+ " <ns2:child3 xmlns:ns2='abcd'><cc3/></ns2:child3>"
+ " <child4 ns3:attr1='3' xmlns:ns3='efgh'>"
+ " <ns3:cc4 ns3:attr1='4'/>"
+ " </child4>"
+ "</top>";
+ NPT_XmlParser parser;
+ NPT_XmlNode* root = NULL;
+ NPT_Result result = parser.Parse(xml1, root);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(root != NULL);
+
+ NPT_XmlWriter writer;
+ NPT_MemoryStream output;
+ writer.Serialize(*root, output);
+ NPT_LargeSize size;
+ output.GetSize(size);
+ printf("%s", NPT_String((const char*)output.GetData(), (NPT_Size)size).GetChars());
+
+ delete top;
+ delete root;
+
+ // test default and empty namespaces
+ const char* xml2 = "<top><a></a><b xmlns='foo'><c xmlns=''></c></b></top>";
+ result = parser.Parse(xml2, root);
+ CHECK(root->AsElementNode()->GetNamespace() == NULL);
+ NPT_XmlElementNode* a_elem = (*root->AsElementNode()->GetChildren().GetItem(0))->AsElementNode();
+ CHECK(a_elem->GetNamespace() == NULL);
+ NPT_XmlElementNode* b_elem = (*root->AsElementNode()->GetChildren().GetItem(1))->AsElementNode();
+ CHECK(*b_elem->GetNamespace() == "foo");
+ NPT_XmlElementNode* c_elem = (*b_elem->GetChildren().GetItem(0))->AsElementNode();
+ CHECK(c_elem->GetNamespace() == NULL);
+
+ delete root;
+}
+
+/*----------------------------------------------------------------------
+| TestSerializer
++---------------------------------------------------------------------*/
+static void
+TestSerializer()
+{
+ NPT_XmlWriter writer;
+ NPT_MemoryStream output;
+ NPT_String check;
+ NPT_LargeSize size;
+
+ //
+ // test without namespaces
+ //
+
+ // simple element with no prefix and no namespace
+ NPT_XmlElementNode* top = new NPT_XmlElementNode("top");
+ writer.Serialize(*top, output);
+ output.GetSize(size);
+ check.Assign((const char*)output.GetData(), (NPT_Size)size);
+ CHECK(check == "<top/>");
+
+ // with one attribute
+ output.SetDataSize(0);
+ top->SetAttribute("attr1", "b&w");
+ writer.Serialize(*top, output);
+ output.GetSize(size);
+ check.Assign((const char*)output.GetData(), (NPT_Size)size);
+ CHECK(check == "<top attr1=\"b&amp;w\"/>");
+
+ // add one child
+ output.SetDataSize(0);
+ delete top;
+ top = new NPT_XmlElementNode("top");
+ NPT_XmlElementNode* child1 = new NPT_XmlElementNode("child1");
+ top->AddChild(child1);
+ writer.Serialize(*top, output);
+ output.GetSize(size);
+ check.Assign((const char*)output.GetData(), (NPT_Size)size);
+ CHECK(check == "<top><child1/></top>");
+
+ //
+ // test with namespaces
+ //
+
+ // test default namespaces
+ output.SetDataSize(0);
+ delete top;
+ top = new NPT_XmlElementNode("top");
+ top->SetNamespaceUri("", "http://namespace.com");
+ writer.Serialize(*top, output);
+ output.GetSize(size);
+ check.Assign((const char*)output.GetData(), (NPT_Size)size);
+ CHECK(check == "<top xmlns=\"http://namespace.com\"/>");
+
+ // test attribute prefixes
+ output.SetDataSize(0);
+ delete top;
+ top = new NPT_XmlElementNode("top");
+ top->SetAttribute(NULL, "foo", "6");
+ top->SetAttribute("ns1", "foo", "3");
+ top->SetAttribute("ns2", "foo", "4");
+ top->SetAttribute("ns1", "foo", "5");
+ writer.Serialize(*top, output);
+ output.GetSize(size);
+ check.Assign((const char*)output.GetData(), (NPT_Size)size);
+ CHECK(check == "<top foo=\"6\" ns1:foo=\"5\" ns2:foo=\"4\"/>");
+
+ delete top;
+}
+
+/*----------------------------------------------------------------------
+| TestCanonicalizer
++---------------------------------------------------------------------*/
+static void
+TestCanonicalizer()
+{
+ extern const char* xml_cano_1[];
+
+ NPT_XmlParser parser(true); // do not ignore whitespaces
+ NPT_XmlNode* root;
+
+ for (unsigned int i=0; xml_cano_1[i]; i+=2) {
+ const char* xml_in = xml_cano_1[i];
+ const char* xml_out = xml_cano_1[i+1];
+ CHECK(NPT_SUCCEEDED(parser.Parse(xml_in, root)));
+ CHECK(root);
+
+ NPT_XmlCanonicalizer canonicalizer;
+ NPT_MemoryStream buffer1;
+ NPT_Result result = canonicalizer.Serialize(*root, buffer1);
+ CHECK(result == NPT_SUCCESS);
+
+ NPT_String str((const char*)buffer1.GetData(), buffer1.GetDataSize());
+ NPT_Debug("%s", str.GetChars());
+ CHECK(str == xml_out);
+
+ delete root;
+
+ CHECK(NPT_SUCCEEDED(parser.Parse(str, root)));
+ CHECK(root);
+ NPT_MemoryStream buffer2;
+ result = canonicalizer.Serialize(*root, buffer2);
+ CHECK(buffer1.GetBuffer() == buffer2.GetBuffer());
+
+ delete root;
+ }
+}
+
+/*----------------------------------------------------------------------
+| TestRegression
++---------------------------------------------------------------------*/
+static void
+TestRegression()
+{
+ // test for a bug found when the XML parser would try
+ // to compare a null prefix
+ NPT_XmlElementNode* element = new NPT_XmlElementNode("hello");
+ element->SetAttribute("ns", "foo", "6");
+ element->SetAttribute("foo", "5");
+ element->SetAttribute("ns", "foo", "7");
+ element->SetAttribute("foo", "8");
+ element->SetNamespaceUri("ns", "blabla");
+ CHECK(*element->GetAttribute("foo") == "8");
+ CHECK(*element->GetAttribute("foo", "blabla") == "7");
+
+ delete element;
+}
+
+/*----------------------------------------------------------------------
+| TestWhitespace
++---------------------------------------------------------------------*/
+static void
+TestWhitespace()
+{
+ const char* xml =
+"<doc>\r\n"
+" <clean> </clean>\r\n"
+" <dirty> A B </dirty>\r\n"
+" <mixed>\r\n"
+" A\r\n"
+" <clean> </clean>\r\n"
+" B\r\n"
+" <dirty> A B </dirty>\r\n"
+" C\r\n"
+" </mixed>\r\n"
+"</doc>\r\n";
+
+ const char* expect1 =
+"<doc><clean/><dirty> A B </dirty><mixed>\n"
+" A\n"
+" <clean/>\n"
+" B\n"
+" <dirty> A B </dirty>\n"
+" C\n"
+" </mixed></doc>";
+
+ const char* expect2 =
+"<doc>\n"
+" <clean> </clean>\n"
+" <dirty> A B </dirty>\n"
+" <mixed>\n"
+" A\n"
+" <clean> </clean>\n"
+" B\n"
+" <dirty> A B </dirty>\n"
+" C\n"
+" </mixed>\n"
+"</doc>";
+
+ NPT_XmlParser parser1(false); // ignore whitespace
+ NPT_XmlNode* root;
+ CHECK(NPT_SUCCEEDED(parser1.Parse(xml, root)));
+ CHECK(root);
+
+ NPT_XmlWriter writer;
+ NPT_MemoryStream buffer;
+ writer.Serialize(*root, buffer);
+ CHECK(buffer.GetBuffer() == NPT_DataBuffer(expect1, NPT_StringLength(expect1)));
+
+ delete root;
+
+ NPT_XmlParser parser2(true); // keep whitespace
+ CHECK(NPT_SUCCEEDED(parser2.Parse(xml, root)));
+ CHECK(root);
+
+ buffer.SetDataSize(0);
+ writer.Serialize(*root, buffer);
+ CHECK(buffer.GetBuffer() == NPT_DataBuffer(expect2, NPT_StringLength(expect2)));
+
+ delete root;
+}
+
+/*----------------------------------------------------------------------
+| TestComments
++---------------------------------------------------------------------*/
+static void
+TestComments()
+{
+ const char* xml =
+ "<!-- comment outside the element -->\n"
+ "<doc> blabla <!-- --> foo <!-- you <g> &foo -> &bar --> blibli</doc>";
+ const char* expect = "<doc> blabla foo blibli</doc>";
+
+ NPT_XmlParser parser;
+ NPT_XmlNode* root;
+ CHECK(NPT_SUCCEEDED(parser.Parse(xml, root)));
+ CHECK(root);
+
+ NPT_XmlWriter writer;
+ NPT_MemoryStream buffer;
+ writer.Serialize(*root, buffer);
+ CHECK(buffer.GetBuffer() == NPT_DataBuffer(expect, NPT_StringLength(expect)));
+
+ delete root;
+}
+
+/*----------------------------------------------------------------------
+| TestCdata
++---------------------------------------------------------------------*/
+static void
+TestCdata()
+{
+ const char* xml =
+ "<doc> blabla <![CDATA[ < [[ Smith ]] > ]]> blibli</doc>";
+ const char* expect = "<doc> blabla &lt; [[ Smith ]] &gt; blibli</doc>";
+
+ NPT_XmlParser parser;
+ NPT_XmlNode* root;
+ CHECK(NPT_SUCCEEDED(parser.Parse(xml, root)));
+ CHECK(root);
+
+ NPT_XmlWriter writer;
+ NPT_MemoryStream buffer;
+ writer.Serialize(*root, buffer);
+ CHECK(buffer.GetBuffer() == NPT_DataBuffer(expect, NPT_StringLength(expect)));
+
+ delete root;
+}
+
+/*----------------------------------------------------------------------
+| TestAttributes
++---------------------------------------------------------------------*/
+static void
+TestAttributes()
+{
+ const char* xml =
+ "<element foo='blabla'><cc1 attr1='0'/></element>";
+ NPT_XmlParser parser;
+ NPT_XmlNode* root = NULL;
+ NPT_Result result = parser.Parse(xml, root);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(root != NULL);
+ CHECK(root->AsElementNode() != NULL);
+ const NPT_String* a = root->AsElementNode()->GetAttribute("foo");
+ CHECK(*a == "blabla");
+ delete root;
+}
+
+/*----------------------------------------------------------------------
+| TestAttributeNormalization
++---------------------------------------------------------------------*/
+static void
+TestAttributeNormalization()
+{
+ const char* xml = "<x a='\n\n xyz abc &#xD; &#xA; &#x9; &#x20; 12\r\n3\r4\n5 6 '/>";
+ NPT_XmlParser parser;
+ NPT_XmlNode* root = NULL;
+ NPT_Result result = parser.Parse(xml, root);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(root != NULL);
+ CHECK(root->AsElementNode() != NULL);
+ const NPT_String* a = root->AsElementNode()->GetAttribute("a");
+ CHECK(*a == " xyz abc \r \n \t 12 3 4 5 6 ");
+ delete root;
+}
+
+
+/*----------------------------------------------------------------------
+| TestMakeStandalone
++---------------------------------------------------------------------*/
+static void
+TestMakeStandalone()
+{
+ const char* xml =
+ "<parent xmlns:foo='foo-ns' xmlns:bar='bar-ns' xmlns='default-ns'><inter xmlns:bli='bli-ns' xmlns:bou='bou-ns'><child><foo:a>a-text</foo:a><bar:b xml:fifi='0'>b-text</bar:b><c>c-text</c><d bou:att='b-att'/></child></inter></parent>";
+ const char* expected =
+ "<child xmlns=\"default-ns\" xmlns:foo=\"foo-ns\" xmlns:bar=\"bar-ns\" xmlns:bou=\"bou-ns\"><foo:a>a-text</foo:a><bar:b xml:fifi=\"0\">b-text</bar:b><c>c-text</c><d bou:att=\"b-att\"/></child>";
+ NPT_XmlParser parser;
+ NPT_XmlNode* root = NULL;
+ NPT_Result result = parser.Parse(xml, root);
+ CHECK(NPT_SUCCEEDED(result));
+ CHECK(root != NULL);
+ CHECK(root->AsElementNode() != NULL);
+ NPT_XmlElementNode* inter = root->AsElementNode()->GetChild("inter", NPT_XML_ANY_NAMESPACE);
+ CHECK(inter != NULL);
+ NPT_XmlElementNode* child = inter->GetChild("child", NPT_XML_ANY_NAMESPACE);
+ CHECK(child != NULL);
+ child->MakeStandalone();
+ NPT_XmlWriter writer;
+ NPT_MemoryStream buffer;
+ writer.Serialize(*child, buffer);
+ CHECK(buffer.GetBuffer() == NPT_DataBuffer(expected, NPT_StringLength(expected)));
+
+
+ delete root;
+}
+
+/*----------------------------------------------------------------------
+| TestFile
++---------------------------------------------------------------------*/
+static void
+TestFile(const char* filename)
+{
+ NPT_InputStreamReference stream;
+ NPT_Result result;
+
+ // open the input file
+ NPT_File input(filename);
+ result = input.Open(NPT_FILE_OPEN_MODE_READ);
+ if (NPT_FAILED(result)) {
+ NPT_Debug("XmtTest1:: cannot open input (%d)\n", result);
+ return;
+ }
+ result = input.GetInputStream(stream);
+
+ // parse the buffer
+ NPT_XmlParser parser;
+ NPT_XmlNode* tree = NULL;
+ result = parser.Parse(*stream, tree);
+ if (NPT_FAILED(result)) {
+ NPT_Debug("XmlTest1:: cannot parse input (%d)\n", result);
+ return;
+ }
+
+
+ // dump the tree
+ NPT_XmlWriter writer(2);
+ NPT_File output(NPT_FILE_STANDARD_OUTPUT);
+ output.Open(NPT_FILE_OPEN_MODE_WRITE);
+ NPT_OutputStreamReference output_stream_ref;
+ output.GetOutputStream(output_stream_ref);
+ writer.Serialize(*tree, *output_stream_ref);
+
+ // delete the tree
+ delete tree;
+}
+
+/*----------------------------------------------------------------------
+| TestBadInput
++---------------------------------------------------------------------*/
+static void
+TestBadInput()
+{
+ NPT_XmlParser parser;
+ NPT_XmlNode* root = NULL;
+
+ const char* doc = "<top1></top1><top2></top2>";
+ NPT_Result result = parser.Parse(doc, root);
+ CHECK(result == NPT_ERROR_XML_MULTIPLE_ROOTS);
+ CHECK(root == NULL);
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // setup debugging
+#if defined(_WIN32) && defined(_DEBUG) && !defined(UNDER_CE)
+ int flags = _crtDbgFlag |
+ _CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_DELAY_FREE_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF;
+
+ _CrtSetDbgFlag(flags);
+ //AllocConsole();
+ //freopen("CONOUT$", "w", stdout);
+#endif
+
+ // check args
+ if (argc == 2) {
+ TestFile(argv[1]);
+ return 0;
+ }
+
+ TestRegression();
+ TestComments();
+ TestCdata();
+ TestWhitespace();
+ TestAttributes();
+ TestAttributeNormalization();
+ TestNamespaces();
+ TestSerializer();
+ TestMakeStandalone();
+ TestCanonicalizer();
+ TestFinders();
+ TestWriter();
+ TestBadInput();
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Xml1/XmlTest1Data.cpp b/lib/libUPnP/Neptune/Source/Tests/Xml1/XmlTest1Data.cpp
new file mode 100644
index 0000000..3171284
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Xml1/XmlTest1Data.cpp
@@ -0,0 +1,843 @@
+const char* xml_cano_1[] = {
+// test 1
+"<doc>\r\n"
+" <e1 />\r\n"
+" <e2 ></e2>\r\n"
+" <e3 name = 'elem3' id='elem3' />\r\n"
+" <e4 name='elem4' id='elem4' ></e4>\r\n"
+" <e5 a:attr='out' b:attr='sorted' attr2='all' attr=\"I'm\"\r\n"
+" xmlns:b=\"http://www.ietf.org\"\r\n"
+" xmlns:a=\"http://www.w3.org\"\r\n"
+" xmlns=\"http://example.org\"/>\r\n"
+" <e6 xmlns=\"\" xmlns:a=\"http://www.w3.org\">\r\n"
+" <e7 xmlns=\"http://www.ietf.org\">\r\n"
+" <e8 xmlns=\"\" xmlns:a=\"http://www.w3.org\">\r\n"
+" <e9 xmlns=\"\" xmlns:a=\"http://www.ietf.org\"/>\r\n"
+" </e8>\r\n"
+" </e7>\r\n"
+" </e6>\r\n"
+"</doc>",
+
+"<doc>\n"
+" <e1></e1>\n"
+" <e2></e2>\n"
+" <e3 id=\"elem3\" name=\"elem3\"></e3>\n"
+" <e4 id=\"elem4\" name=\"elem4\"></e4>\n"
+" <e5 xmlns=\"http://example.org\" xmlns:a=\"http://www.w3.org\" xmlns:b=\"http://www.ietf.org\" attr=\"I'm\" attr2=\"all\" b:attr=\"sorted\" a:attr=\"out\"></e5>\n"
+" <e6>\n"
+" <e7 xmlns=\"http://www.ietf.org\">\n"
+" <e8 xmlns=\"\">\n"
+" <e9></e9>\n"
+" </e8>\n"
+" </e7>\n"
+" </e6>\n"
+"</doc>",
+
+// test 2
+"<a>\n"
+" <b xmlns:foo='foo-ns'>\n"
+" <c xmlns='d1-ns'>\n"
+" <foo:d/>\n"
+" <e xmlns='e1-ns'>\n"
+" <gloo:f xmlns:gloo='e1-ns'/>\n"
+" </e>\n"
+" <f xmlns=''>\n"
+" <foo:g/>\n"
+" </f>\n"
+" </c>\n"
+" </b>\n"
+"</a>",
+
+"<a>\n"
+" <b>\n"
+" <c xmlns=\"d1-ns\">\n"
+" <foo:d xmlns:foo=\"foo-ns\"></foo:d>\n"
+" <e xmlns=\"e1-ns\">\n"
+" <gloo:f xmlns:gloo=\"e1-ns\"></gloo:f>\n"
+" </e>\n"
+" <f xmlns=\"\">\n"
+" <foo:g xmlns:foo=\"foo-ns\"></foo:g>\n"
+" </f>\n"
+" </c>\n"
+" </b>\n"
+"</a>",
+
+// test 3
+"<foo:bar xmlns:foo=\"http://a.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt foo:att=\"att1\" bla:btt=\"att2\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>",
+
+"<foo:bar xmlns:foo=\"http://a.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt foo:att=\"att1\" bla:btt=\"att2\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>",
+
+// test 4
+"<foo:bar xmlns:foo=\"http://a.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt foo:btt=\"att1\" bla:att=\"att2\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>",
+
+"<foo:bar xmlns:foo=\"http://a.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt bla:att=\"att2\" foo:btt=\"att1\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>",
+// Test att1-xmlsec.xml
+"<elt xmlns:foo = 'http://a.org'>\n"
+"<elt2 foo:att='1'>lolo</elt2>\n"
+"</elt>"
+,
+"<elt>\n"
+"<elt2 xmlns:foo=\"http://a.org\" foo:att=\"1\">lolo</elt2>\n"
+"</elt>"
+,
+// Test att2-xmlsec.xml
+"<elt xmlns:foo = 'http://a.org' xmlns:bar='http://b.org'>\n"
+" <elt1 bar:att=\"2\" foo:att='1'>babar</elt1>\n"
+"</elt>"
+,
+"<elt>\n"
+" <elt1 xmlns:bar=\"http://b.org\" xmlns:foo=\"http://a.org\" foo:att=\"1\" bar:att=\"2\">babar</elt1>\n"
+"</elt>"
+,
+// Test char_modi-xmlsec.xml
+"<doc>\n"
+" <norm attr='&#9;'/>\n"
+"</doc>"
+,
+"<doc>\n"
+" <norm attr=\"&#x9;\"></norm>\n"
+"</doc>"
+,
+// Test char_modif_char_ref-xmlsec.xml
+"<doc>\n"
+" <text>First line&#x0d;&#10;Second line</text>\n"
+" <value>&#x32;</value>\n"
+" <compute></compute>\n"
+" <compute expr='value>\"0\" &amp;&amp; value&lt;\"10\" ?\"valid\":\"error\"'>valid</compute>\n"
+" <norm attr=' &apos; &#x20;&#13;&#xa;&#9; &apos; '/>\n"
+" <normNames attr=' A &#x20;&#13;&#xa;&#9; B '/>\n"
+"</doc>"
+,
+"<doc>\n"
+" <text>First line&#xD;\n"
+"Second line</text>\n"
+" <value>2</value>\n"
+" <compute></compute>\n"
+" <compute expr=\"value>&quot;0&quot; &amp;&amp; value&lt;&quot;10&quot; ?&quot;valid&quot;:&quot;error&quot;\">valid</compute>\n"
+" <norm attr=\" ' &#xD;&#xA;&#x9; ' \"></norm>\n"
+" <normNames attr=\" A &#xD;&#xA;&#x9; B \"></normNames>\n"
+"</doc>"
+,
+// Test comments-xmlsec.xml
+"<?xml version=\"1.0\"?>\n"
+"\n"
+"\n"
+"\n"
+"<doc>Bonjour le monde !<!-- Commentaire 1 --></doc>\n"
+"\n"
+"<!-- Commentaire 2 -->"
+,
+"<doc>Bonjour le monde !</doc>"
+,
+// Test document_subset-xmlsec.xml
+"<doc xmlns=\"http://www.ietf.org\" xmlns:w3c=\"http://www.w3.org\">\n"
+" <e1>\n"
+" <e2 xmlns=\"\">\n"
+" <e3 id=\"E3\"/>\n"
+" </e2>\n"
+" </e1>\n"
+"</doc>"
+,
+"<doc xmlns=\"http://www.ietf.org\">\n"
+" <e1>\n"
+" <e2 xmlns=\"\">\n"
+" <e3 id=\"E3\"></e3>\n"
+" </e2>\n"
+" </e1>\n"
+"</doc>"
+,
+// Test namespaces2-xmlsec.xml
+"<elt xmlns:foo = 'http://a.org' xmlns:bar='http://b.org'>\n"
+" <elt1 bar:att=\"2\" foo:att='1'>\n"
+" <elt2 xmlns:foo = 'http://c.org'>\n"
+" <elt3 xmlns:bar = \"http://d.org\">\n"
+" <elt4 bar:att2=\"rab\" foo:att2='oof'>octopous</elt4>\n"
+" </elt3>\n"
+" </elt2>\n"
+" </elt1>\n"
+"</elt>"
+,
+"<elt>\n"
+" <elt1 xmlns:bar=\"http://b.org\" xmlns:foo=\"http://a.org\" foo:att=\"1\" bar:att=\"2\">\n"
+" <elt2>\n"
+" <elt3>\n"
+" <elt4 xmlns:bar=\"http://d.org\" xmlns:foo=\"http://c.org\" foo:att2=\"oof\" bar:att2=\"rab\">octopous</elt4>\n"
+" </elt3>\n"
+" </elt2>\n"
+" </elt1>\n"
+"</elt>"
+,
+// Test namespaces3-xmlsec.xml
+"<elt xmlns:foo = 'http://a.org' xmlns:bar='http://b.org' xmlns=\"\">\n"
+" <elt1>\n"
+" <elt2 xmlns:foo = 'http://c.org'>\n"
+" <elt3 xmlns:bar = \"http://d.org\">\n"
+" <elt4 bar:att2=\"rab\" foo:att2='oof'>octopous</elt4>\n"
+" </elt3>\n"
+" </elt2>\n"
+" </elt1>\n"
+"</elt>"
+,
+"<elt>\n"
+" <elt1>\n"
+" <elt2>\n"
+" <elt3>\n"
+" <elt4 xmlns:bar=\"http://d.org\" xmlns:foo=\"http://c.org\" foo:att2=\"oof\" bar:att2=\"rab\">octopous</elt4>\n"
+" </elt3>\n"
+" </elt2>\n"
+" </elt1>\n"
+"</elt>"
+,
+// Test namespaces4-xmlsec.xml
+"<elt xmlns:foo = 'http://a.org' xmlns:bar='http://b.org'>\n"
+" <elt1>\n"
+" <elt2 xmlns:foo = 'http://c.org'>\n"
+" <elt3 bar:att=\"2\" foo:att='1' xmlns:bar = \"http://d.org\">\n"
+" <elt4 bar:att2=\"rab\" foo:att2='oof'>octopous</elt4>\n"
+" </elt3>\n"
+" </elt2>\n"
+" </elt1>\n"
+"</elt>"
+,
+"<elt>\n"
+" <elt1>\n"
+" <elt2>\n"
+" <elt3 xmlns:bar=\"http://d.org\" xmlns:foo=\"http://c.org\" foo:att=\"1\" bar:att=\"2\">\n"
+" <elt4 foo:att2=\"oof\" bar:att2=\"rab\">octopous</elt4>\n"
+" </elt3>\n"
+" </elt2>\n"
+" </elt1>\n"
+"</elt>"
+,
+// Test namespaces5-xmlsec.xml
+"<elt xmlns:foo = 'http://a.org' xmlns:bar='http://b.org'>\n"
+" <elt1>\n"
+" <elt2>\n"
+" <elt3 bar:att=\"2\" xmlns:bar = \"http://d.org\">\n"
+" <elt4 xmlns:bar='http://rab.org'>octopous</elt4>\n"
+" </elt3>\n"
+" </elt2>\n"
+" </elt1>\n"
+"</elt>"
+,
+"<elt>\n"
+" <elt1>\n"
+" <elt2>\n"
+" <elt3 xmlns:bar=\"http://d.org\" bar:att=\"2\">\n"
+" <elt4>octopous</elt4>\n"
+" </elt3>\n"
+" </elt2>\n"
+" </elt1>\n"
+"</elt>"
+,
+// Test prefixe-xmlsec.xml
+"<elt>\n"
+" <elt1 xmlns:bar=\"http://d.com\" bar:att=\"2\">\n"
+" <bar:elt2/>\n"
+" </elt1>\n"
+"</elt>"
+,
+"<elt>\n"
+" <elt1 xmlns:bar=\"http://d.com\" bar:att=\"2\">\n"
+" <bar:elt2></bar:elt2>\n"
+" </elt1>\n"
+"</elt>"
+,
+// Test same_namespaces-xmlsec.xml
+"<foo:bar xmlns:foo=\"http://a.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\"/>\n"
+"</foo:bar>"
+,
+"<foo:bar xmlns:foo=\"http://a.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\"></bla:zoo>\n"
+"</foo:bar>"
+,
+// Test same_namespaces2-xmlsec.xml
+"<foo:bar xmlns:foo=\"http://a.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt foo:att=\"att1\" bla:btt=\"att2\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>"
+,
+"<foo:bar xmlns:foo=\"http://a.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt foo:att=\"att1\" bla:btt=\"att2\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>"
+,
+// Test same_namespaces2b-xmlsec.xml
+"<foo:bar xmlns:foo=\"http://b.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt foo:att=\"att1\" bla:att2=\"att2\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>"
+,
+"<foo:bar xmlns:foo=\"http://b.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt bla:att2=\"att2\" foo:att=\"att1\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>"
+,
+// Test same_namespaces2c-xmlsec.xml
+"<foo:bar xmlns:foo=\"http://b.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt foo:att=\"att1\" bla:att=\"att2\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>"
+,
+"<foo:bar xmlns:foo=\"http://b.com\">\n"
+" <bla:zoo xmlns:bla=\"http://a.com\">\n"
+" <elt bla:att=\"att2\" foo:att=\"att1\">youf</elt>\n"
+" </bla:zoo>\n"
+"</foo:bar>"
+,
+// Test start_end_tags-xmlsec.xml
+"<doc>\n"
+" <e1 />\n"
+" <e2 ></e2>\n"
+" <e3 name = \"elem3\" id=\"elem3\" />\n"
+" <e4 name=\"elem4\" id=\"elem4\" ></e4>\n"
+" <e5 a:attr=\"out\" b:attr=\"sorted\" attr2=\"all\" attr=\"I'm\"\n"
+" xmlns:b=\"http://www.ietf.org\"\n"
+" xmlns:a=\"http://www.w3.org\"\n"
+" xmlns=\"http://example.org\"/>\n"
+" <e6 xmlns=\"\" xmlns:a=\"http://www.w3.org\">\n"
+" <e7 xmlns=\"http://www.ietf.org\">\n"
+" <e8 xmlns=\"\" xmlns:a=\"http://www.w3.org\">\n"
+" <e9 xmlns=\"\" xmlns:a=\"http://www.ietf.org\"/>\n"
+" </e8>\n"
+" </e7>\n"
+" </e6>\n"
+"</doc>"
+,
+"<doc>\n"
+" <e1></e1>\n"
+" <e2></e2>\n"
+" <e3 id=\"elem3\" name=\"elem3\"></e3>\n"
+" <e4 id=\"elem4\" name=\"elem4\"></e4>\n"
+" <e5 xmlns=\"http://example.org\" xmlns:a=\"http://www.w3.org\" xmlns:b=\"http://www.ietf.org\" attr=\"I'm\" attr2=\"all\" b:attr=\"sorted\" a:attr=\"out\"></e5>\n"
+" <e6>\n"
+" <e7 xmlns=\"http://www.ietf.org\">\n"
+" <e8 xmlns=\"\">\n"
+" <e9></e9>\n"
+" </e8>\n"
+" </e7>\n"
+" </e6>\n"
+"</doc>"
+,
+// Test utf8-xmlsec.xml
+"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
+"<doc>&#169;</doc>"
+,
+"<doc>\302\251</doc>"
+,
+// Test whitespaces-xmlsec.xml
+"<doc>\n"
+" <clean> </clean>\n"
+" <dirty> A B </dirty>\n"
+" <mixed>\n"
+" A\n"
+" <clean> </clean>\n"
+" B\n"
+" <dirty> A B </dirty>\n"
+" C\n"
+" </mixed>\n"
+"</doc>"
+,
+"<doc>\n"
+" <clean> </clean>\n"
+" <dirty> A B </dirty>\n"
+" <mixed>\n"
+" A\n"
+" <clean> </clean>\n"
+" B\n"
+" <dirty> A B </dirty>\n"
+" C\n"
+" </mixed>\n"
+"</doc>",
+// Test merlin-c14n-two-09.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-10.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-11.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-12.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-13.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-14.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-15.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-16.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-17.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-18.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-19.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-20.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-21.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-22.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-23.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-24.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-25.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+// Test merlin-c14n-two-26.xml
+"<?xml version=\"1.0\"?>\n"
+"<foo:Root xmlns:bar=\"http://example.org/bar\" xmlns:baz=\"http://example.org/baz\" xmlns:foo=\"http://example.org/foo\" xmlns=\"http://example.org/\" xml:lang=\"en-ie\">\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something />\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>"
+,
+"<foo:Root xmlns:foo=\"http://example.org/foo\" xml:lang=\"en-ie\">\n"
+" <bar:Something xmlns:bar=\"http://example.org/bar\">\n"
+" <foo:Something>\n"
+" <bar:Something>\n"
+" <foo:Something>\n"
+" <baz:Something xmlns:baz=\"http://example.org/baz\"></baz:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+" </foo:Something>\n"
+" </bar:Something>\n"
+"</foo:Root>",
+
+0
+};
diff --git a/lib/libUPnP/Neptune/Source/Tests/Xml1/big.xml b/lib/libUPnP/Neptune/Source/Tests/Xml1/big.xml
new file mode 100644
index 0000000..ef590ac
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Xml1/big.xml
@@ -0,0 +1,3277 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE spec PUBLIC "-//W3C//DTD Specification V2.1//EN"
+ "http://www.w3.org/XML/1998/06/xmlspec-v21.dtd" [
+<!--ArborText, Inc., 1988-2000, v.4002-->
+<!ENTITY http-ident "http://www.w3.org/TR/2000/REC-xml">
+<!ENTITY draft.month "October">
+<!ENTITY draft.day "6">
+<!ENTITY iso6.doc.date "20001006">
+<!ENTITY draft.year "2000">
+<!ENTITY versionOfXML "1.0">
+<!ENTITY pio "'&lt;?xml'">
+<!ENTITY doc.date "10 February 1998">
+<!ENTITY w3c.doc.date "02-Feb-1998">
+<!ENTITY WebSGML "WebSGML Adaptations Annex to ISO 8879">
+<!ENTITY pic "'?>'">
+<!ENTITY br "\n">
+<!ENTITY cellback "#c0d9c0">
+<!ENTITY mdash "--">
+<!ENTITY com "--">
+<!ENTITY como "--">
+<!ENTITY comc "--">
+<!ENTITY hcro "&amp;#x">
+<!ENTITY nbsp "&#160;">
+<!ENTITY magicents "<code>amp</code>,
+<code>lt</code>,
+<code>gt</code>,
+<code>apos</code>,
+<code>quot</code>">
+<!ENTITY doc.audience "public review and discussion">
+<!ENTITY doc.distribution "may be distributed freely, as long as
+all text and legal notices remain intact">
+]>
+<spec w3c-doctype="rec">
+<!--
+Notes on preparation of the Second Edition:
+
+- Worked from http://www.w3.org/XML/xml-19980210-errata.
+- Changed DTD reference to point to V2.1 of XMLspec.
+- Moved version number from <title> to <version> element and
+ added "second edition" wording. Mentioned edition information
+ in status.
+- Removed bgcolor="&cellback;" attributes from all <td>
+ elements because that attribute is not in the current table model.
+- Reversed status and abstract, so that abstract is first, according
+ to W3C guidelines.
+- Changed some <emph>s to <titleref>s in bibliography.
+- Changed some <code>s to <at> etc. throughout; where used <attval>,
+ removed existing <quote>s because the stylesheet produces them.
+- Removed some spurious spaces.
+- Added affiliation markup to the original member list.
+- Added commas between individual <thisver> elements, because
+ whitespace is now significant there.
+- Moved <eg>s, <scrap>s, and lists outside of <p>s for cleaner HTML
+ conversion.
+- Revised Status section to reflect new status.
+- Fixed all titleref hrefs so they get transformed properly; at
+ next revision, these all probably need to be changed to some
+ other markup.
+- Incorporated all errata (barring obsoleted and invalid ones);
+ added links to the errata document with <loc role="erratumref">
+ elements; used diff="{add|chg|del}" attribute. This version
+ expects that the official HTML output will have diff="del"
+ elements suppressed.
+-->
+<header>
+<title>Extensible Markup Language (XML)</title>
+<version>1.0 (Second Edition)</version>
+<w3c-designation>REC-xml-&iso6.doc.date;</w3c-designation>
+<w3c-doctype>W3C Recommendation</w3c-doctype>
+<pubdate><day>&draft.day;</day><month>&draft.month;</month><year>&draft.year;</year>
+</pubdate>
+<publoc><loc href="&http-ident;-&iso6.doc.date;">&http-ident;-&iso6.doc.date;</loc>
+(<loc href="&http-ident;-&iso6.doc.date;.html">XHTML</loc>, <loc href="&http-ident;-&iso6.doc.date;.xml">XML</loc>, <loc
+href="&http-ident;-&iso6.doc.date;.pdf">PDF</loc>, <loc href="&http-ident;-&iso6.doc.date;-review.html">XHTML
+review version</loc> with color-coded revision indicators)</publoc>
+<latestloc><loc href="http://www.w3.org/TR/REC-xml">http://www.w3.org/TR/REC-xml</loc></latestloc>
+<prevlocs><loc href="http://www.w3.org/TR/2000/WD-xml-2e-20000814"> http://www.w3.org/TR/2000/WD-xml-2e-20000814</loc>
+<loc href="http://www.w3.org/TR/1998/REC-xml-19980210"> http://www.w3.org/TR/1998/REC-xml-19980210</loc><!--
+<loc href='http://www.w3.org/TR/PR-xml-971208'>
+http://www.w3.org/TR/PR-xml-971208</loc>
+<loc href='http://www.w3.org/TR/WD-xml-961114'>
+http://www.w3.org/TR/WD-xml-961114</loc>
+<loc href='http://www.w3.org/TR/WD-xml-lang-970331'>
+http://www.w3.org/TR/WD-xml-lang-970331</loc>
+<loc href='http://www.w3.org/TR/WD-xml-lang-970630'>
+http://www.w3.org/TR/WD-xml-lang-970630</loc>
+<loc href='http://www.w3.org/TR/WD-xml-970807'>
+http://www.w3.org/TR/WD-xml-970807</loc>
+<loc href='http://www.w3.org/TR/WD-xml-971117'>
+http://www.w3.org/TR/WD-xml-971117</loc>--> </prevlocs>
+<authlist>
+<author role="1e"><name>Tim Bray</name><affiliation>Textuality and Netscape</affiliation>
+<email href="mailto:tbray@textuality.com">tbray@textuality.com</email></author>
+<author role="1e"><name>Jean Paoli</name><affiliation>Microsoft</affiliation>
+<email href="mailto:jeanpa@microsoft.com">jeanpa@microsoft.com</email></author>
+<author role="1e" diff="chg"><name>C. M. Sperberg-McQueen</name><affiliation>University
+of Illinois at Chicago and Text Encoding Initiative</affiliation><email href="mailto:cmsmcq@uic.edu">cmsmcq@uic.edu</email>
+</author>
+<author role="2e" diff="add"><name>Eve Maler</name><affiliation>Sun Microsystems,
+Inc.</affiliation><email href="mailto:elm@east.sun.com">eve.maler@east.sun.com</email>
+</author>
+</authlist>
+<abstract>
+<p>The Extensible Markup Language (XML) is a subset of SGML that is completely
+described in this document. Its goal is to enable generic SGML to be served,
+received, and processed on the Web in the way that is now possible with HTML.
+XML has been designed for ease of implementation and for interoperability
+with both SGML and HTML.</p>
+</abstract>
+<status>
+<p>This document has been reviewed by W3C Members and other interested parties
+and has been endorsed by the Director as a W3C Recommendation. It is a stable
+document and may be used as reference material or cited as a normative reference
+from another document. W3C's role in making the Recommendation is to draw
+attention to the specification and to promote its widespread deployment. This
+enhances the functionality and interoperability of the Web.</p>
+<p>This document specifies a syntax created by subsetting an existing, widely
+used international text processing standard (Standard Generalized Markup Language,
+ISO 8879:1986(E) as amended and corrected) for use on the World Wide Web.
+It is a product of the W3C XML Activity, details of which can be found at <loc
+href="http://www.w3.org/XML/">http://www.w3.org/XML</loc>. <phrase diff="add"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E100">[E100]</loc>
+The English version of this specification is the only normative version. However,
+for translations of this document, see <loc href="http://www.w3.org/XML/#trans">http://www.w3.org/XML/#trans</loc>. </phrase>A
+list of current W3C Recommendations and other technical documents can be found
+at <loc href="http://www.w3.org/TR/">http://www.w3.org/TR</loc>.</p>
+<p diff="del"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E66">[E66]</loc>This
+specification uses the term URI, which is defined by <bibref ref="Berners-Lee"/>,
+a work in progress expected to update <bibref ref="RFC1738"/> and <bibref
+ref="RFC1808"/>.</p>
+<p diff="add">This second edition is <emph>not</emph> a new version of XML (first published 10 February 1998);
+it merely incorporates the changes dictated by the first-edition errata (available
+at <loc href="http://www.w3.org/XML/xml-19980210-errata">http://www.w3.org/XML/xml-19980210-errata</loc>)
+as a convenience to readers. The errata list for this second edition is available
+at <loc href="http://www.w3.org/XML/xml-V10-2e-errata">http://www.w3.org/XML/xml-V10-2e-errata</loc>.</p>
+<p>Please report errors in this document to <loc href="mailto:xml-editor@w3.org">xml-editor@w3.org</loc><phrase
+diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E101">[E101]</loc>; <loc
+href="http://lists.w3.org/Archives/Public/xml-editor">archives</loc> are available</phrase>.</p>
+<note diff="add">
+<p>C. M. Sperberg-McQueen's affiliation has changed since the publication
+of the first edition. He is now at the World Wide Web Consortium, and can
+be contacted at <loc href="mailto:cmsmcq@w3.org">cmsmcq@w3.org</loc>.</p>
+</note>
+</status>
+<pubstmt>
+<p>Chicago, Vancouver, Mountain View, et al.: World-Wide Web Consortium, XML
+Working Group, 1996, 1997, 2000.</p>
+</pubstmt>
+<sourcedesc>
+<p>Created in electronic form.</p>
+</sourcedesc>
+<langusage>
+<language id="EN">English</language>
+<language id="ebnf">Extended Backus-Naur Form (formal grammar)</language>
+</langusage>
+<revisiondesc>
+<slist>
+<sitem>1997-12-03 : CMSMcQ : yet further changes</sitem>
+<sitem>1997-12-02 : TB : further changes (see TB to XML WG, 2 December 1997)</sitem>
+<sitem>1997-12-02 : CMSMcQ : deal with as many corrections and comments from
+the proofreaders as possible: entify hard-coded document date in pubdate element,
+change expansion of entity WebSGML, update status description as per Dan Connolly
+(am not sure about refernece to Berners-Lee et al.), add 'The' to abstract
+as per WG decision, move Relationship to Existing Standards to back matter
+and combine with References, re-order back matter so normative appendices
+come first, re-tag back matter so informative appendices are tagged informdiv1,
+remove XXX XXX from list of 'normative' specs in prose, move some references
+from Other References to Normative References, add RFC 1738, 1808, and 2141
+to Other References (they are not normative since we do not require the processor
+to enforce any rules based on them), add reference to 'Fielding draft' (Berners-Lee
+et al.), move notation section to end of body, drop URIchar non-terminal and
+use SkipLit instead, lose stray reference to defunct nonterminal 'markupdecls',
+move reference to Aho et al. into appendix (Tim's right), add prose note saying
+that hash marks and fragment identifiers are NOT part of the URI formally
+speaking, and are NOT legal in system identifiers (processor 'may' signal
+an error). Work through: Tim Bray reacting to James Clark, Tim Bray on his
+own, Eve Maler, NOT DONE YET: change binary / text to unparsed / parsed. handle
+James's suggestion about &lt; in attriubte values uppercase hex characters,
+namechar list, </sitem>
+<sitem>1997-12-01 : JB : add some column-width parameters</sitem>
+<sitem>1997-12-01 : CMSMcQ : begin round of changes to incorporate recent
+WG decisions and other corrections: binding sources of character encoding
+info (27 Aug / 3 Sept), correct wording of Faust quotation (restore dropped
+line), drop SDD from EncodingDecl, change text at version number 1.0, drop
+misleading (wrong!) sentence about ignorables and extenders, modify definition
+of PCData to make bar on msc grammatical, change grammar's handling of internal
+subset (drop non-terminal markupdecls), change definition of includeSect to
+allow conditional sections, add integral-declaration constraint on internal
+subset, drop misleading / dangerous sentence about relationship of entities
+with system storage objects, change table body tag to htbody as per EM change
+to DTD, add rule about space normalization in public identifiers, add description
+of how to generate our name-space rules from Unicode character database (needs
+further work!). </sitem>
+<sitem>1997-10-08 : TB : Removed %-constructs again, new rules for PE appearance.</sitem>
+<sitem>1997-10-01 : TB : Case-sensitive markup; cleaned up element-type defs,
+lotsa little edits for style</sitem>
+<sitem>1997-09-25 : TB : Change to elm's new DTD, with substantial detail
+cleanup as a side-effect</sitem>
+<sitem>1997-07-24 : CMSMcQ : correct error (lost *) in definition of ignoreSectContents
+(thanks to Makoto Murata)</sitem>
+<sitem>Allow all empty elements to have end-tags, consistent with SGML TC
+(as per JJC).</sitem>
+<sitem>1997-07-23 : CMSMcQ : pre-emptive strike on pending corrections: introduce
+the term 'empty-element tag', note that all empty elements may use it, and
+elements declared EMPTY must use it. Add WFC requiring encoding decl to come
+first in an entity. Redefine notations to point to PIs as well as binary entities.
+Change autodetection table by removing bytes 3 and 4 from examples with Byte
+Order Mark. Add content model as a term and clarify that it applies to both
+mixed and element content. </sitem>
+<sitem>1997-06-30 : CMSMcQ : change date, some cosmetic changes, changes to
+productions for choice, seq, Mixed, NotationType, Enumeration. Follow James
+Clark's suggestion and prohibit conditional sections in internal subset. TO
+DO: simplify production for ignored sections as a result, since we don't need
+to worry about parsers which don't expand PErefs finding a conditional section.</sitem>
+<sitem>1997-06-29 : TB : various edits</sitem>
+<sitem>1997-06-29 : CMSMcQ : further changes: Suppress old FINAL EDIT comments
+and some dead material. Revise occurrences of % in grammar to exploit Henry
+Thompson's pun, especially markupdecl and attdef. Remove RMD requirement relating
+to element content (?). </sitem>
+<sitem>1997-06-28 : CMSMcQ : Various changes for 1 July draft: Add text for
+draconian error handling (introduce the term Fatal Error). RE deleta est (changing
+wording from original announcement to restrict the requirement to validating
+parsers). Tag definition of validating processor and link to it. Add colon
+as name character. Change def of %operator. Change standard definitions of
+lt, gt, amp. Strip leading zeros from #x00nn forms.</sitem>
+<sitem>1997-04-02 : CMSMcQ : final corrections of editorial errors found in
+last night's proofreading. Reverse course once more on well-formed: Webster's
+Second hyphenates it, and that's enough for me.</sitem>
+<sitem>1997-04-01 : CMSMcQ : corrections from JJC, EM, HT, and self</sitem>
+<sitem>1997-03-31 : Tim Bray : many changes</sitem>
+<sitem>1997-03-29 : CMSMcQ : some Henry Thompson (on entity handling), some
+Charles Goldfarb, some ERB decisions (PE handling in miscellaneous declarations.
+Changed Ident element to accept def attribute. Allow normalization of Unicode
+characters. move def of systemliteral into section on literals.</sitem>
+<sitem>1997-03-28 : CMSMcQ : make as many corrections as possible, from Terry
+Allen, Norbert Mikula, James Clark, Jon Bosak, Henry Thompson, Paul Grosso,
+and self. Among other things: give in on "well formed" (Terry is right), tentatively
+rename QuotedCData as AttValue and Literal as EntityValue to be more informative,
+since attribute values are the <emph>only</emph> place QuotedCData was used,
+and vice versa for entity text and Literal. (I'd call it Entity Text, but
+8879 uses that name for both internal and external entities.)</sitem>
+<sitem>1997-03-26 : CMSMcQ : resynch the two forks of this draft, reapply
+my changes dated 03-20 and 03-21. Normalize old 'may not' to 'must not' except
+in the one case where it meant 'may or may not'.</sitem>
+<sitem>1997-03-21 : TB : massive changes on plane flight from Chicago to Vancouver</sitem>
+<sitem>1997-03-21 : CMSMcQ : correct as many reported errors as possible. </sitem>
+<sitem>1997-03-20 : CMSMcQ : correct typos listed in CMSMcQ hand copy of spec.</sitem>
+<sitem>1997-03-20 : CMSMcQ : cosmetic changes preparatory to revision for
+WWW conference April 1997: restore some of the internal entity references
+(e.g. to docdate, etc.), change character xA0 to &amp;nbsp; and define nbsp
+as &amp;#160;, and refill a lot of paragraphs for legibility.</sitem>
+<sitem>1996-11-12 : CMSMcQ : revise using Tim's edits: Add list type of NUMBERED
+and change most lists either to BULLETS or to NUMBERED. Suppress QuotedNames,
+Names (not used). Correct trivial-grammar doc type decl. Rename 'marked section'
+as 'CDATA section' passim. Also edits from James Clark: Define the set of
+characters from which [^abc] subtracts. Charref should use just [0-9] not
+Digit. Location info needs cleaner treatment: remove? (ERB question). One
+example of a PI has wrong pic. Clarify discussion of encoding names. Encoding
+failure should lead to unspecified results; don't prescribe error recovery.
+Don't require exposure of entity boundaries. Ignore white space in element
+content. Reserve entity names of the form u-NNNN. Clarify relative URLs. And
+some of my own: Correct productions for content model: model cannot consist
+of a name, so "elements ::= cp" is no good. </sitem>
+<sitem>1996-11-11 : CMSMcQ : revise for style. Add new rhs to entity declaration,
+for parameter entities.</sitem>
+<sitem>1996-11-10 : CMSMcQ : revise for style. Fix / complete section on names,
+characters. Add sections on parameter entities, conditional sections. Still
+to do: Add compatibility note on deterministic content models. Finish stylistic
+revision.</sitem>
+<sitem>1996-10-31 : TB : Add Entity Handling section</sitem>
+<sitem>1996-10-30 : TB : Clean up term &amp; termdef. Slip in ERB decision
+re EMPTY.</sitem>
+<sitem>1996-10-28 : TB : Change DTD. Implement some of Michael's suggestions.
+Change comments back to //. Introduce language for XML namespace reservation.
+Add section on white-space handling. Lots more cleanup.</sitem>
+<sitem>1996-10-24 : CMSMcQ : quick tweaks, implement some ERB decisions. Characters
+are not integers. Comments are /* */ not //. Add bibliographic refs to 10646,
+HyTime, Unicode. Rename old Cdata as MsData since it's <emph>only</emph> seen
+in marked sections. Call them attribute-value pairs not name-value pairs,
+except once. Internal subset is optional, needs '?'. Implied attributes should
+be signaled to the app, not have values supplied by processor.</sitem>
+<sitem>1996-10-16 : TB : track down &amp; excise all DSD references; introduce
+some EBNF for entity declarations.</sitem>
+<sitem>1996-10-?? : TB : consistency check, fix up scraps so they all parse,
+get formatter working, correct a few productions.</sitem>
+<sitem>1996-10-10/11 : CMSMcQ : various maintenance, stylistic, and organizational
+changes: Replace a few literals with xmlpio and pic entities, to make them
+consistent and ensure we can change pic reliably when the ERB votes. Drop
+paragraph on recognizers from notation section. Add match, exact match to
+terminology. Move old 2.2 XML Processors and Apps into intro. Mention comments,
+PIs, and marked sections in discussion of delimiter escaping. Streamline discussion
+of doctype decl syntax. Drop old section of 'PI syntax' for doctype decl,
+and add section on partial-DTD summary PIs to end of Logical Structures section.
+Revise DSD syntax section to use Tim's subset-in-a-PI mechanism.</sitem>
+<sitem>1996-10-10 : TB : eliminate name recognizers (and more?)</sitem>
+<sitem>1996-10-09 : CMSMcQ : revise for style, consistency through 2.3 (Characters)</sitem>
+<sitem>1996-10-09 : CMSMcQ : re-unite everything for convenience, at least
+temporarily, and revise quickly</sitem>
+<sitem>1996-10-08 : TB : first major homogenization pass</sitem>
+<sitem>1996-10-08 : TB : turn "current" attribute on div type into CDATA</sitem>
+<sitem>1996-10-02 : TB : remould into skeleton + entities</sitem>
+<sitem>1996-09-30 : CMSMcQ : add a few more sections prior to exchange with
+Tim.</sitem>
+<sitem>1996-09-20 : CMSMcQ : finish transcribing notes.</sitem>
+<sitem>1996-09-19 : CMSMcQ : begin transcribing notes for draft.</sitem>
+<sitem>1996-09-13 : CMSMcQ : made outline from notes of 09-06, do some housekeeping</sitem>
+</slist>
+</revisiondesc>
+</header>
+<body>
+<div1 id="sec-intro">
+<head>Introduction</head>
+<p>Extensible Markup Language, abbreviated XML, describes a class of data
+objects called <termref def="dt-xml-doc">XML documents</termref> and partially
+describes the behavior of computer programs which process them. XML is an
+application profile or restricted form of SGML, the Standard Generalized Markup
+Language <bibref ref="ISO8879"/>. By construction, XML documents are conforming
+SGML documents.</p>
+<p>XML documents are made up of storage units called <termref def="dt-entity">entities</termref>,
+which contain either parsed or unparsed data. Parsed data is made up of <termref
+def="dt-character">characters</termref>, some of which form <termref def="dt-chardata">character
+data</termref>, and some of which form <termref def="dt-markup">markup</termref>.
+Markup encodes a description of the document's storage layout and logical
+structure. XML provides a mechanism to impose constraints on the storage layout
+and logical structure.</p>
+<p><termdef id="dt-xml-proc" term="XML Processor">A software module called
+an <term>XML processor</term> is used to read XML documents and provide access
+to their content and structure.</termdef> <termdef id="dt-app" term="Application">It
+is assumed that an XML processor is doing its work on behalf of another module,
+called the <term>application</term>.</termdef> This specification describes
+the required behavior of an XML processor in terms of how it must read XML
+data and the information it must provide to the application.</p>
+<div2 id="sec-origin-goals">
+<head>Origin and Goals</head>
+<p>XML was developed by an XML Working Group (originally known as the SGML
+Editorial Review Board) formed under the auspices of the World Wide Web Consortium
+(W3C) in 1996. It was chaired by Jon Bosak of Sun Microsystems with the active
+participation of an XML Special Interest Group (previously known as the SGML
+Working Group) also organized by the W3C. The membership of the XML Working
+Group is given in an appendix. Dan Connolly served as the WG's contact with
+the W3C.</p>
+<p>The design goals for XML are:</p>
+<olist>
+<item><p>XML shall be straightforwardly usable over the Internet.</p></item>
+<item><p>XML shall support a wide variety of applications.</p></item>
+<item><p>XML shall be compatible with SGML.</p></item>
+<item><p>It shall be easy to write programs which process XML documents.</p>
+</item>
+<item><p>The number of optional features in XML is to be kept to the absolute
+minimum, ideally zero.</p></item>
+<item><p>XML documents should be human-legible and reasonably clear.</p></item>
+<item><p>The XML design should be prepared quickly.</p></item>
+<item><p>The design of XML shall be formal and concise.</p></item>
+<item><p>XML documents shall be easy to create.</p></item>
+<item><p>Terseness in XML markup is of minimal importance.</p></item>
+</olist>
+<p>This specification, together with associated standards (Unicode and ISO/IEC
+10646 for characters, Internet RFC 1766 for language identification tags,
+ISO 639 for language name codes, and ISO 3166 for country name codes), provides
+all the information necessary to understand XML Version &versionOfXML; and
+construct computer programs to process it.</p>
+<p>This version of the XML specification <!-- is for &doc.audience;.--> &doc.distribution;.</p>
+</div2>
+<div2 id="sec-terminology">
+<head>Terminology</head>
+<p>The terminology used to describe XML documents is defined in the body of
+this specification. The terms defined in the following list are used in building
+those definitions and in describing the actions of an XML processor: <glist>
+<gitem><label>may</label>
+<def>
+<p><termdef id="dt-may" term="May">Conforming documents and XML processors
+are permitted to but need not behave as described.</termdef></p>
+</def></gitem>
+<gitem><label>must</label>
+<def>
+<p><termdef id="dt-must" term="Must">Conforming documents and XML processors
+are required to behave as described; otherwise they are in error. <!-- do NOT change this! this is what defines a violation of
+a 'must' clause as 'an error'. -MSM --></termdef></p>
+</def></gitem>
+<gitem><label>error</label>
+<def>
+<p><termdef id="dt-error" term="Error">A violation of the rules of this specification;
+results are undefined. Conforming software may detect and report an error
+and may recover from it.</termdef></p>
+</def></gitem>
+<gitem><label>fatal error</label>
+<def>
+<p><termdef id="dt-fatal" term="Fatal Error">An error which a conforming <termref
+def="dt-xml-proc">XML processor</termref> must detect and report to the application.
+After encountering a fatal error, the processor may continue processing the
+data to search for further errors and may report such errors to the application.
+In order to support correction of errors, the processor may make unprocessed
+data from the document (with intermingled character data and markup) available
+to the application. Once a fatal error is detected, however, the processor
+must not continue normal processing (i.e., it must not continue to pass character
+data and information about the document's logical structure to the application
+in the normal way).</termdef></p>
+</def></gitem>
+<gitem><label>at user option</label>
+<def>
+<p><termdef id="dt-atuseroption" term="At user option">Conforming software
+may or must (depending on the modal verb in the sentence) behave as described;
+if it does, it must provide users a means to enable or disable the behavior
+described.</termdef></p>
+</def></gitem>
+<gitem><label>validity constraint</label>
+<def>
+<p><termdef id="dt-vc" term="Validity constraint">A rule which applies to
+all <termref def="dt-valid">valid</termref> XML documents. Violations of validity
+constraints are errors; they must, at user option, be reported by <termref
+def="dt-validating">validating XML processors</termref>.</termdef></p>
+</def></gitem>
+<gitem><label>well-formedness constraint</label>
+<def>
+<p><termdef id="dt-wfc" term="Well-formedness constraint">A rule which applies
+to all <termref def="dt-wellformed">well-formed</termref> XML documents. Violations
+of well-formedness constraints are <termref def="dt-fatal">fatal errors</termref>.</termdef></p>
+</def></gitem>
+<gitem><label>match</label>
+<def>
+<p><termdef id="dt-match" term="match">(Of strings or names:) Two strings
+or names being compared must be identical. Characters with multiple possible
+representations in ISO/IEC 10646 (e.g. characters with both precomposed and
+base+diacritic forms) match only if they have the same representation in both
+strings. <phrase diff="del"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E85">[E85]</loc>At
+user option, processors may normalize such characters to some canonical form. </phrase>No
+case folding is performed. (Of strings and rules in the grammar:) A string
+matches a grammatical production if it belongs to the language generated by
+that production. (Of content and content models:) An element matches its declaration
+when it conforms in the fashion described in the constraint <specref ref="elementvalid"/>.</termdef></p>
+</def></gitem>
+<gitem><label>for compatibility</label>
+<def>
+<p><termdef id="dt-compat" term="For Compatibility"><phrase diff="add"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E87">[E87]</loc>Marks
+a sentence describing</phrase> a feature of XML included solely to ensure
+that XML remains compatible with SGML.</termdef></p>
+</def></gitem>
+<gitem><label>for interoperability</label>
+<def>
+<p><termdef id="dt-interop" term="For interoperability"><phrase diff="add"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E87">[E87]</loc>Marks
+a sentence describing</phrase> a non-binding recommendation included to increase
+the chances that XML documents can be processed by the existing installed
+base of SGML processors which predate the &WebSGML;.</termdef></p>
+</def></gitem>
+</glist></p>
+</div2>
+</div1>
+<!-- &Docs; -->
+<div1 id="sec-documents">
+<head>Documents</head>
+<p><termdef id="dt-xml-doc" term="XML Document"> A data object is an <term>XML
+document</term> if it is <termref def="dt-wellformed">well-formed</termref>,
+as defined in this specification. A well-formed XML document may in addition
+be <termref def="dt-valid">valid</termref> if it meets certain further constraints.</termdef></p>
+<p>Each XML document has both a logical and a physical structure. Physically,
+the document is composed of units called <termref def="dt-entity">entities</termref>.
+An entity may <termref def="dt-entref">refer</termref> to other entities to
+cause their inclusion in the document. A document begins in a <quote>root</quote>
+or <termref def="dt-docent">document entity</termref>. Logically, the document
+is composed of declarations, elements, comments, character references, and
+processing instructions, all of which are indicated in the document by explicit
+markup. The logical and physical structures must nest properly, as described
+in <specref ref="wf-entities"/>.</p>
+<div2 id="sec-well-formed">
+<head>Well-Formed XML Documents</head>
+<p><termdef id="dt-wellformed" term="Well-Formed"> A textual object is a <term>well-formed</term>
+XML document if:</termdef></p>
+<olist>
+<item><p>Taken as a whole, it matches the production labeled <nt def="NT-document">document</nt>.</p>
+</item>
+<item><p>It meets all the well-formedness constraints given in this specification.</p>
+</item>
+<item><p>Each of the <termref def="dt-parsedent">parsed entities</termref>
+which is referenced directly or indirectly within the document is <termref
+def="dt-wellformed">well-formed</termref>.</p></item>
+</olist>
+<scrap id="document" lang="ebnf">
+<head>Document</head>
+<prod id="NT-document">
+<lhs>document</lhs><rhs><nt def="NT-prolog">prolog</nt> <nt def="NT-element">element</nt> <nt
+def="NT-Misc">Misc</nt>*</rhs>
+</prod>
+</scrap>
+<p>Matching the <nt def="NT-document">document</nt> production implies that:</p>
+<olist>
+<item><p>It contains one or more <termref def="dt-element">elements</termref>.</p>
+</item>
+<!--* N.B. some readers (notably JC) find the following
+paragraph awkward and redundant. I agree it's logically redundant:
+it *says* it is summarizing the logical implications of
+matching the grammar, and that means by definition it's
+logically redundant. I don't think it's rhetorically
+redundant or unnecessary, though, so I'm keeping it. It
+could however use some recasting when the editors are feeling
+stronger. -MSM *-->
+<item><p><termdef id="dt-root" term="Root Element">There is exactly one element,
+called the <term>root</term>, or document element, no part of which appears
+in the <termref def="dt-content">content</termref> of any other element.</termdef> <phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E17">[E17]</loc>For
+all other elements, if the <termref def="dt-stag">start-tag</termref> is in
+the content of another element, the <termref def="dt-etag">end-tag</termref>
+is in the content of the same element.</phrase> More simply stated, the elements,
+delimited by start- and end-tags, nest properly within each other.</p></item>
+</olist>
+<p><termdef id="dt-parentchild" term="Parent/Child">As a consequence of this,
+for each non-root element <el>C</el> in the document, there is one other element <el>P</el>
+in the document such that <el>C</el> is in the content of <el>P</el>, but
+is not in the content of any other element that is in the content of <el>P</el>. <el>P</el>
+is referred to as the <term>parent</term> of <el>C</el>, and <el>C</el> as
+a <term>child</term> of <el>P</el>.</termdef></p>
+</div2>
+<div2 id="charsets">
+<head>Characters</head>
+<p><termdef id="dt-text" term="Text">A parsed entity contains <term>text</term>,
+a sequence of <termref def="dt-character">characters</termref>, which may
+represent markup or character data.</termdef> <termdef id="dt-character" term="Character">A <term>character</term>
+is an atomic unit of text as specified by ISO/IEC 10646 <bibref ref="ISO10646"/> <phrase
+diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E67">[E67]</loc>(see
+also <bibref ref="ISO10646-2000"/>)</phrase>. Legal characters are tab, carriage
+return, line feed, and the legal <phrase diff="del"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E35">[E35]</loc>graphic </phrase>characters
+of Unicode and ISO/IEC 10646. <phrase diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E69">[E69]</loc>The
+versions of these standards cited in <specref ref="sec-existing-stds"/> were
+current at the time this document was prepared. New characters may be added
+to these standards by amendments or new editions. Consequently, XML processors
+must accept any character in the range specified for <nt def="NT-Char">Char</nt>.</phrase>
+The use of <quote>compatibility characters</quote>, as defined in section
+6.8 of <bibref ref="Unicode"/> <phrase diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E67">[E67]</loc>(see
+also D21 in section 3.6 of <bibref ref="Unicode3"/>)</phrase>, is discouraged.</termdef></p>
+<scrap id="char32" lang="ebnf">
+<head>Character Range</head>
+<prodgroup pcw2="4" pcw4="17.5" pcw5="11">
+<prod id="NT-Char">
+<lhs>Char</lhs><rhs>#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]</rhs>
+<com>any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.</com>
+</prod>
+</prodgroup></scrap>
+<p>The mechanism for encoding character code points into bit patterns may
+vary from entity to entity. All XML processors must accept the UTF-8 and UTF-16
+encodings of 10646; the mechanisms for signaling which of the two is in use,
+or for bringing other encodings into play, are discussed later, in <specref
+ref="charencoding"/>.</p>
+<!--
+<p>Regardless of the specific encoding used, any character in
+the ISO/IEC 10646 character set may be referred to by the decimal
+or hexadecimal equivalent of its UCS-4 code value.
+</p>-->
+</div2>
+<div2 id="sec-common-syn">
+<head>Common Syntactic Constructs</head>
+<p>This section defines some symbols used widely in the grammar.</p>
+<p><nt def="NT-S">S</nt> (white space) consists of one or more space (#x20)
+characters, carriage returns, line feeds, or tabs.</p>
+<scrap id="white" lang="ebnf">
+<head>White Space</head>
+<prodgroup pcw2="4" pcw4="17.5" pcw5="11">
+<prod id="NT-S">
+<lhs>S</lhs><rhs>(#x20 | #x9 | #xD | #xA)+</rhs>
+</prod>
+</prodgroup></scrap>
+<p>Characters are classified for convenience as letters, digits, or other
+characters. <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E30">[E30]</loc>A
+letter consists of an alphabetic or syllabic base character or an ideographic
+character.</phrase> Full definitions of the specific characters in each class
+are given in <specref ref="CharClasses"/>.</p>
+<p><termdef id="dt-name" term="Name">A <term>Name</term> is a token beginning
+with a letter or one of a few punctuation characters, and continuing with
+letters, digits, hyphens, underscores, colons, or full stops, together known
+as name characters.</termdef> Names beginning with the string <quote><code>xml</code></quote>,
+or any string which would match <code>(('X'|'x') ('M'|'m') ('L'|'l'))</code>,
+are reserved for standardization in this or future versions of this specification.</p>
+<note>
+<p diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E98">[E98]</loc>The
+Namespaces in XML Recommendation <bibref ref="xml-names"/> assigns a meaning
+to names containing colon characters. Therefore, authors should not use the
+colon in XML names except for namespace purposes, but XML processors must
+accept the colon as a name character.</p>
+</note>
+<p>An <nt def="NT-Nmtoken">Nmtoken</nt> (name token) is any mixture of name
+characters.</p>
+<scrap lang="ebnf">
+<head>Names and Tokens</head>
+<prod id="NT-NameChar">
+<lhs>NameChar</lhs><rhs><nt def="NT-Letter">Letter</nt> | <nt def="NT-Digit">Digit</nt>
+| '.' | '-' | '_' | ':' | <nt def="NT-CombiningChar">CombiningChar</nt> | <nt
+def="NT-Extender">Extender</nt></rhs>
+</prod>
+<prod id="NT-Name">
+<lhs>Name</lhs><rhs>(<nt def="NT-Letter">Letter</nt> | '_' | ':') (<nt def="NT-NameChar">NameChar</nt>)*</rhs>
+</prod>
+<prod id="NT-Names">
+<lhs>Names</lhs><rhs><nt def="NT-Name">Name</nt> (<nt def="NT-S">S</nt> <nt
+def="NT-Name">Name</nt>)*</rhs>
+</prod>
+<prod id="NT-Nmtoken">
+<lhs>Nmtoken</lhs><rhs>(<nt def="NT-NameChar">NameChar</nt>)+</rhs>
+</prod>
+<prod id="NT-Nmtokens">
+<lhs>Nmtokens</lhs><rhs><nt def="NT-Nmtoken">Nmtoken</nt> (<nt def="NT-S">S</nt> <nt
+def="NT-Nmtoken">Nmtoken</nt>)*</rhs>
+</prod>
+</scrap>
+<p>Literal data is any quoted string not containing the quotation mark used
+as a delimiter for that string. Literals are used for specifying the content
+of internal entities (<nt def="NT-EntityValue">EntityValue</nt>), the values
+of attributes (<nt def="NT-AttValue">AttValue</nt>), and external identifiers
+(<nt def="NT-SystemLiteral">SystemLiteral</nt>). Note that a <nt def="NT-SystemLiteral">SystemLiteral</nt>
+can be parsed without scanning for markup.</p>
+<scrap lang="ebnf">
+<head>Literals</head>
+<prod id="NT-EntityValue">
+<lhs>EntityValue</lhs><rhs>'"' ([^%&amp;"] | <nt def="NT-PEReference">PEReference</nt>
+| <nt def="NT-Reference">Reference</nt>)* '"' </rhs>
+<rhs>|&nbsp; "'" ([^%&amp;'] | <nt def="NT-PEReference">PEReference</nt> | <nt
+def="NT-Reference">Reference</nt>)* "'"</rhs>
+</prod>
+<prod id="NT-AttValue">
+<lhs>AttValue</lhs><rhs>'"' ([^&lt;&amp;"] | <nt def="NT-Reference">Reference</nt>)*
+'"' </rhs>
+<rhs>|&nbsp; "'" ([^&lt;&amp;'] | <nt def="NT-Reference">Reference</nt>)*
+"'"</rhs>
+</prod>
+<prod id="NT-SystemLiteral">
+<lhs>SystemLiteral</lhs><rhs>('"' [^"]* '"') |&nbsp;("'" [^']* "'") </rhs>
+</prod>
+<prod id="NT-PubidLiteral">
+<lhs>PubidLiteral</lhs><rhs>'"' <nt def="NT-PubidChar">PubidChar</nt>* '"'
+| "'" (<nt def="NT-PubidChar">PubidChar</nt> - "'")* "'"</rhs>
+</prod>
+<prod id="NT-PubidChar">
+<lhs>PubidChar</lhs><rhs>#x20 | #xD | #xA |&nbsp;[a-zA-Z0-9] |&nbsp;[-'()+,./:=?;!*#@$_%]</rhs>
+</prod>
+</scrap>
+<note diff="add">
+<p><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E72">[E72]</loc>Although
+the <nt def="NT-EntityValue">EntityValue</nt> production allows the definition
+of an entity consisting of a single explicit <code>&lt;</code> in the literal
+(e.g., <code>&lt;!ENTITY mylt "&lt;"></code>), it is strongly advised to avoid
+this practice since any reference to that entity will cause a well-formedness
+error.</p>
+</note>
+</div2>
+<div2 id="syntax">
+<head>Character Data and Markup</head>
+<p><termref def="dt-text">Text</termref> consists of intermingled <termref
+def="dt-chardata">character data</termref> and markup. <termdef id="dt-markup"
+term="Markup"><term>Markup</term> takes the form of <termref def="dt-stag">start-tags</termref>, <termref
+def="dt-etag">end-tags</termref>, <termref def="dt-empty">empty-element tags</termref>, <termref
+def="dt-entref">entity references</termref>, <termref def="dt-charref">character
+references</termref>, <termref def="dt-comment">comments</termref>, <termref
+def="dt-cdsection">CDATA section</termref> delimiters, <termref def="dt-doctype">document
+type declarations</termref>, <termref def="dt-pi">processing instructions</termref>, <phrase
+diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E89">[E89]</loc><nt
+def="NT-XMLDecl">XML declarations</nt>, <nt def="NT-TextDecl">text declarations</nt>,
+and any white space that is at the top level of the document entity (that
+is, outside the document element and not inside any other markup).</phrase></termdef></p>
+<p><termdef id="dt-chardata" term="Character Data">All text that is not markup
+constitutes the <term>character data</term> of the document.</termdef></p>
+<p>The ampersand character (&amp;) and the left angle bracket (&lt;) may appear
+in their literal form <emph>only</emph> when used as markup delimiters, or
+within a <termref def="dt-comment">comment</termref>, a <termref def="dt-pi">processing
+instruction</termref>, or a <termref def="dt-cdsection">CDATA section</termref>.<phrase
+diff="del"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E18">[E18]</loc>They
+are also legal within the <termref def="dt-litentval">literal entity value</termref>
+of an internal entity declaration; see <specref ref="wf-entities"/>.</phrase> <!-- FINAL EDIT: restore internal entity decl or leave it out. -->
+If they are needed elsewhere, they must be <termref def="dt-escape">escaped</termref>
+using either <termref def="dt-charref">numeric character references</termref>
+or the strings <quote><code>&amp;amp;</code></quote> and <quote><code>&amp;lt;</code></quote>
+respectively. The right angle bracket (>) may be represented using the string <quote><code>&amp;gt;</code></quote>,
+and must, <termref def="dt-compat">for compatibility</termref>, be escaped
+using <quote><code>&amp;gt;</code></quote> or a character reference when it
+appears in the string <quote><code>]]&gt;</code></quote> in content, when
+that string is not marking the end of a <termref def="dt-cdsection">CDATA
+section</termref>.</p>
+<p>In the content of elements, character data is any string of characters
+which does not contain the start-delimiter of any markup. In a CDATA section,
+character data is any string of characters not including the CDATA-section-close
+delimiter, <quote><code>]]&gt;</code></quote>.</p>
+<p>To allow attribute values to contain both single and double quotes, the
+apostrophe or single-quote character (') may be represented as <quote><code>&amp;apos;</code></quote>,
+and the double-quote character (") as <quote><code>&amp;quot;</code></quote>.</p>
+<scrap lang="ebnf">
+<head>Character Data</head>
+<prod id="NT-CharData">
+<lhs>CharData</lhs><rhs>[^&lt;&amp;]* - ([^&lt;&amp;]* ']]&gt;' [^&lt;&amp;]*)</rhs>
+</prod>
+</scrap>
+</div2>
+<div2 id="sec-comments">
+<head>Comments</head>
+<p><termdef id="dt-comment" term="Comment"><term>Comments</term> may appear
+anywhere in a document outside other <termref def="dt-markup">markup</termref>;
+in addition, they may appear within the document type declaration at places
+allowed by the grammar. They are not part of the document's <termref def="dt-chardata">character
+data</termref>; an XML processor may, but need not, make it possible for an
+application to retrieve the text of comments. <termref def="dt-compat">For
+compatibility</termref>, the string <quote><code>--</code></quote> (double-hyphen)
+must not occur within comments.</termdef> <phrase diff="add"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E63">[E63]</loc>Parameter
+entity references are not recognized within comments.</phrase></p>
+<scrap lang="ebnf">
+<head>Comments</head>
+<prod id="NT-Comment">
+<lhs>Comment</lhs><rhs>'&lt;!--' ((<nt def="NT-Char">Char</nt> - '-') | ('-'
+(<nt def="NT-Char">Char</nt> - '-')))* '-->'</rhs>
+</prod>
+</scrap>
+<p>An example of a comment:</p>
+<eg>&lt;!&como; declarations for &lt;head> &amp; &lt;body> &comc;></eg>
+<p diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E27">[E27]</loc>Note
+that the grammar does not allow a comment ending in <code>---></code>. The
+following example is <emph>not</emph> well-formed.</p>
+<eg diff="add">&lt;!-- B+, B, or B---></eg>
+</div2>
+<div2 id="sec-pi">
+<head>Processing Instructions</head>
+<p><termdef id="dt-pi" term="Processing instruction"><term>Processing instructions</term>
+(PIs) allow documents to contain instructions for applications.</termdef></p>
+<scrap lang="ebnf">
+<head>Processing Instructions</head>
+<prod id="NT-PI">
+<lhs>PI</lhs><rhs>'&lt;?' <nt def="NT-PITarget">PITarget</nt> (<nt def="NT-S">S</nt>
+(<nt def="NT-Char">Char</nt>* - (<nt def="NT-Char">Char</nt>* &pic; <nt def="NT-Char">Char</nt>*)))? &pic;</rhs>
+</prod>
+<prod id="NT-PITarget">
+<lhs>PITarget</lhs><rhs><nt def="NT-Name">Name</nt> - (('X' | 'x') ('M' |
+'m') ('L' | 'l'))</rhs>
+</prod>
+</scrap>
+<p>PIs are not part of the document's <termref def="dt-chardata">character
+data</termref>, but must be passed through to the application. The PI begins
+with a target (<nt def="NT-PITarget">PITarget</nt>) used to identify the application
+to which the instruction is directed. The target names <quote><code>XML</code></quote>, <quote><code>xml</code></quote>,
+and so on are reserved for standardization in this or future versions of this
+specification. The XML <termref def="dt-notation">Notation</termref> mechanism
+may be used for formal declaration of PI targets. <phrase diff="add"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E63">[E63]</loc>Parameter
+entity references are not recognized within processing instructions.</phrase></p>
+</div2>
+<div2 id="sec-cdata-sect">
+<head>CDATA Sections</head>
+<p><termdef id="dt-cdsection" term="CDATA Section"><term>CDATA sections</term>
+may occur anywhere character data may occur; they are used to escape blocks
+of text containing characters which would otherwise be recognized as markup.
+CDATA sections begin with the string <quote><code>&lt;![CDATA[</code></quote>
+and end with the string <quote><code>]]&gt;</code></quote>:</termdef></p>
+<scrap lang="ebnf">
+<head>CDATA Sections</head>
+<prod id="NT-CDSect">
+<lhs>CDSect</lhs><rhs><nt def="NT-CDStart">CDStart</nt> <nt def="NT-CData">CData</nt> <nt
+def="NT-CDEnd">CDEnd</nt></rhs>
+</prod>
+<prod id="NT-CDStart">
+<lhs>CDStart</lhs><rhs>'&lt;![CDATA['</rhs>
+</prod>
+<prod id="NT-CData">
+<lhs>CData</lhs><rhs>(<nt def="NT-Char">Char</nt>* - (<nt def="NT-Char">Char</nt>*
+']]&gt;' <nt def="NT-Char">Char</nt>*)) </rhs>
+</prod>
+<prod id="NT-CDEnd">
+<lhs>CDEnd</lhs><rhs>']]&gt;'</rhs>
+</prod>
+</scrap>
+<p>Within a CDATA section, only the <nt def="NT-CDEnd">CDEnd</nt> string is
+recognized as markup, so that left angle brackets and ampersands may occur
+in their literal form; they need not (and cannot) be escaped using <quote><code>&amp;lt;</code></quote>
+and <quote><code>&amp;amp;</code></quote>. CDATA sections cannot nest.</p>
+<p>An example of a CDATA section, in which <quote><code>&lt;greeting></code></quote>
+and <quote><code>&lt;/greeting></code></quote> are recognized as <termref
+def="dt-chardata">character data</termref>, not <termref def="dt-markup">markup</termref>:</p>
+<eg>&lt;![CDATA[&lt;greeting>Hello, world!&lt;/greeting>]]&gt; </eg>
+</div2>
+<div2 id="sec-prolog-dtd">
+<head>Prolog and Document Type Declaration</head>
+<p><termdef id="dt-xmldecl" term="XML Declaration">XML documents <phrase diff="chg"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E107">[E107]</loc>should</phrase>
+begin with an <term>XML declaration</term> which specifies the version of
+XML being used.</termdef> For example, the following is a complete XML document, <termref
+def="dt-wellformed">well-formed</termref> but not <termref def="dt-valid">valid</termref>:</p>
+<eg><![CDATA[<?xml version="1.0"?> <greeting>Hello, world!</greeting> ]]></eg>
+<p>and so is this:</p>
+<eg><![CDATA[<greeting>Hello, world!</greeting>]]></eg>
+<p>The version number <quote><code>1.0</code></quote> should be used to indicate
+conformance to this version of this specification; it is an error for a document
+to use the value <quote><code>1.0</code></quote> if it does not conform to
+this version of this specification. It is the intent of the XML working group
+to give later versions of this specification numbers other than <quote><code>1.0</code></quote>,
+but this intent does not indicate a commitment to produce any future versions
+of XML, nor if any are produced, to use any particular numbering scheme. Since
+future versions are not ruled out, this construct is provided as a means to
+allow the possibility of automatic version recognition, should it become necessary.
+Processors may signal an error if they receive documents labeled with versions
+they do not support.</p>
+<p>The function of the markup in an XML document is to describe its storage
+and logical structure and to associate attribute-value pairs with its logical
+structures. XML provides a mechanism, the <termref def="dt-doctype">document
+type declaration</termref>, to define constraints on the logical structure
+and to support the use of predefined storage units. <termdef id="dt-valid"
+term="Validity">An XML document is <term>valid</term> if it has an associated
+document type declaration and if the document complies with the constraints
+expressed in it.</termdef></p>
+<p>The document type declaration must appear before the first <termref def="dt-element">element</termref>
+in the document.</p>
+<scrap id="xmldoc" lang="ebnf">
+<head>Prolog</head>
+<prodgroup pcw2="6" pcw4="17.5" pcw5="9">
+<prod id="NT-prolog">
+<lhs>prolog</lhs><rhs><nt def="NT-XMLDecl">XMLDecl</nt>? <nt def="NT-Misc">Misc</nt>*
+(<nt def="NT-doctypedecl">doctypedecl</nt> <nt def="NT-Misc">Misc</nt>*)?</rhs>
+</prod>
+<prod id="NT-XMLDecl">
+<lhs>XMLDecl</lhs><rhs>&pio; <nt def="NT-VersionInfo">VersionInfo</nt> <nt
+def="NT-EncodingDecl">EncodingDecl</nt>? <nt def="NT-SDDecl">SDDecl</nt>? <nt
+def="NT-S">S</nt>? &pic;</rhs>
+</prod>
+<prod id="NT-VersionInfo" diff="chg">
+<lhs>VersionInfo</lhs><rhs><nt def="NT-S">S</nt> 'version' <nt def="NT-Eq">Eq</nt>
+("'" <nt def="NT-VersionNum">VersionNum</nt> "'" | '"' <nt def="NT-VersionNum">VersionNum</nt>
+'"')<com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E15">[E15]</loc></com></rhs>
+</prod>
+<prod id="NT-Eq">
+<lhs>Eq</lhs><rhs><nt def="NT-S">S</nt>? '=' <nt def="NT-S">S</nt>?</rhs>
+</prod>
+<prod id="NT-VersionNum">
+<lhs>VersionNum</lhs><rhs>([a-zA-Z0-9_.:] | '-')+</rhs>
+</prod>
+<prod id="NT-Misc">
+<lhs>Misc</lhs><rhs><nt def="NT-Comment">Comment</nt> | <nt def="NT-PI">PI</nt>
+| <nt def="NT-S">S</nt></rhs>
+</prod>
+</prodgroup></scrap>
+<p><termdef id="dt-doctype" term="Document Type Declaration">The XML <term>document
+type declaration</term> contains or points to <termref def="dt-markupdecl">markup
+declarations</termref> that provide a grammar for a class of documents. This
+grammar is known as a document type definition, or <term>DTD</term>. The document
+type declaration can point to an external subset (a special kind of <termref
+def="dt-extent">external entity</termref>) containing markup declarations,
+or can contain the markup declarations directly in an internal subset, or
+can do both. The DTD for a document consists of both subsets taken together.</termdef></p>
+<p><termdef id="dt-markupdecl" term="markup declaration"> A <term>markup declaration</term>
+is an <termref def="dt-eldecl">element type declaration</termref>, an <termref
+def="dt-attdecl">attribute-list declaration</termref>, an <termref def="dt-entdecl">entity
+declaration</termref>, or a <termref def="dt-notdecl">notation declaration</termref>.</termdef>
+These declarations may be contained in whole or in part within <termref def="dt-PE">parameter
+entities</termref>, as described in the well-formedness and validity constraints
+below. For <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E14">[E14]</loc>further</phrase>
+information, see <specref ref="sec-physical-struct"/>.</p>
+<scrap id="dtd" lang="ebnf">
+<head>Document Type Definition</head>
+<prodgroup pcw2="6" pcw4="17.5" pcw5="9">
+<prod id="NT-doctypedecl" diff="chg">
+<lhs>doctypedecl</lhs><rhs>'&lt;!DOCTYPE' <nt def="NT-S">S</nt> <nt def="NT-Name">Name</nt>
+(<nt def="NT-S">S</nt> <nt def="NT-ExternalID">ExternalID</nt>)? <nt def="NT-S">S</nt>?
+('[' (<nt def="NT-markupdecl">markupdecl</nt> | <nt diff="chg" def="NT-DeclSep">DeclSep</nt>)*
+']' <nt def="NT-S">S</nt>?)? '>'</rhs><vc def="vc-roottype"/><wfc def="ExtSubset"
+diff="add"/><com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E109">[E109]</loc></com>
+</prod>
+<prod id="NT-DeclSep" diff="add">
+<lhs>DeclSep</lhs><rhs><nt def="NT-PEReference">PEReference</nt> | <nt def="NT-S">S</nt></rhs>
+<wfc def="PE-between-Decls" diff="add"/><com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E109">[E109]</loc></com>
+</prod>
+<prod id="NT-markupdecl">
+<lhs>markupdecl</lhs><rhs><nt def="NT-elementdecl">elementdecl</nt> | <nt
+def="NT-AttlistDecl">AttlistDecl</nt> | <nt def="NT-EntityDecl">EntityDecl</nt>
+| <nt def="NT-NotationDecl">NotationDecl</nt> | <nt def="NT-PI">PI</nt> | <nt
+def="NT-Comment">Comment</nt> </rhs><vc def="vc-PEinMarkupDecl"/><wfc def="wfc-PEinInternalSubset"/>
+</prod>
+</prodgroup></scrap>
+<p diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E82">[E82]</loc>Note
+that it is possible to construct a well-formed document containing a <nt def="NT-doctypedecl">doctypedecl</nt>
+that neither points to an external subset nor contains an internal subset.</p>
+<p>The markup declarations may be made up in whole or in part of the <termref
+def="dt-repltext">replacement text</termref> of <termref def="dt-PE">parameter
+entities</termref>. The productions later in this specification for individual
+nonterminals (<nt def="NT-elementdecl">elementdecl</nt>, <nt def="NT-AttlistDecl">AttlistDecl</nt>,
+and so on) describe the declarations <emph>after</emph> all the parameter
+entities have been <termref def="dt-include">included</termref>.</p>
+<p diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E75">[E75]</loc>Parameter
+entity references are recognized anywhere in the DTD (internal and external
+subsets and external parameter entities), except in literals, processing instructions,
+comments, and the contents of ignored conditional sections (see <specref ref="sec-condition-sect"/>).
+They are also recognized in entity value literals. The use of parameter entities
+in the internal subset is restricted as described below.</p>
+<vcnote id="vc-roottype"><head>Root Element Type</head><p>The <nt def="NT-Name">Name</nt>
+in the document type declaration must match the element type of the <termref
+def="dt-root">root element</termref>.</p>
+</vcnote>
+<vcnote id="vc-PEinMarkupDecl"><head>Proper Declaration/PE Nesting</head>
+<p>Parameter-entity <termref def="dt-repltext">replacement text</termref>
+must be properly nested with markup declarations. That is to say, if either
+the first character or the last character of a markup declaration (<nt def="NT-markupdecl">markupdecl</nt>
+above) is contained in the replacement text for a <termref def="dt-PERef">parameter-entity
+reference</termref>, both must be contained in the same replacement text.</p>
+</vcnote>
+<wfcnote id="wfc-PEinInternalSubset"><head>PEs in Internal Subset</head><p>In
+the internal DTD subset, <termref def="dt-PERef">parameter-entity references</termref>
+can occur only where markup declarations can occur, not within markup declarations.
+(This does not apply to references that occur in external parameter entities
+or to the external subset.)</p>
+</wfcnote>
+<wfcnote id="ExtSubset" diff="add"><head><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E109">[E109]</loc>External
+Subset</head><p>The external subset, if any, must match the production for <nt
+def="NT-extSubset">extSubset</nt>.</p>
+</wfcnote>
+<wfcnote id="PE-between-Decls" diff="add"><head><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E109">[E109]</loc>PE
+Between Declarations</head><p>The replacement text of a parameter entity reference
+in a <nt def="NT-DeclSep">DeclSep</nt> must match the production <nt def="NT-extSubsetDecl">extSubsetDecl</nt>.</p>
+</wfcnote>
+<p>Like the internal subset, the external subset and any external parameter
+entities <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E109">[E109]</loc>referenced
+in a <nt def="NT-DeclSep">DeclSep</nt></phrase> must consist of a series of
+complete markup declarations of the types allowed by the non-terminal symbol <nt
+def="NT-markupdecl">markupdecl</nt>, interspersed with white space or <termref
+def="dt-PERef">parameter-entity references</termref>. However, portions of
+the contents of the external subset or of <phrase diff="add"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E109">[E109]</loc>these </phrase>
+external parameter entities may conditionally be ignored by using the <termref
+def="dt-cond-section">conditional section</termref> construct; this is not
+allowed in the internal subset.</p>
+<scrap id="ext-Subset">
+<head>External Subset</head>
+<prodgroup pcw2="6" pcw4="17.5" pcw5="9">
+<prod id="NT-extSubset">
+<lhs>extSubset</lhs><rhs><nt def="NT-TextDecl">TextDecl</nt>? <nt def="NT-extSubsetDecl">extSubsetDecl</nt></rhs>
+</prod>
+<prod id="NT-extSubsetDecl" diff="chg">
+<lhs>extSubsetDecl</lhs><rhs>( <nt def="NT-markupdecl">markupdecl</nt> | <nt
+def="NT-conditionalSect">conditionalSect</nt> | <nt diff="chg" def="NT-DeclSep">DeclSep</nt>)*</rhs>
+<com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E109">[E109]</loc></com>
+</prod>
+</prodgroup></scrap>
+<p>The external subset and external parameter entities also differ from the
+internal subset in that in them, <termref def="dt-PERef">parameter-entity
+references</termref> are permitted <emph>within</emph> markup declarations,
+not only <emph>between</emph> markup declarations.</p>
+<p>An example of an XML document with a document type declaration:</p>
+<eg><![CDATA[<?xml version="1.0"?> <!DOCTYPE greeting SYSTEM "hello.dtd"> <greeting>Hello, world!</greeting> ]]></eg>
+<p>The <termref def="dt-sysid">system identifier</termref> <quote><code>hello.dtd</code></quote>
+gives the <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E78">[E78]</loc>address
+(a URI reference)</phrase> of a DTD for the document.</p>
+<p>The declarations can also be given locally, as in this example:</p>
+<eg><![CDATA[<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE greeting [
+ <!ELEMENT greeting (#PCDATA)>
+]>
+<greeting>Hello, world!</greeting>]]></eg>
+<p>If both the external and internal subsets are used, the internal subset
+is considered to occur before the external subset. <!-- 'is considered to'? boo. whazzat mean? -->
+This has the effect that entity and attribute-list declarations in the internal
+subset take precedence over those in the external subset.</p>
+</div2>
+<div2 id="sec-rmd">
+<head>Standalone Document Declaration</head>
+<p>Markup declarations can affect the content of the document, as passed from
+an <termref def="dt-xml-proc">XML processor</termref> to an application; examples
+are attribute defaults and entity declarations. The standalone document declaration,
+which may appear as a component of the XML declaration, signals whether or
+not there are such declarations which appear external to the <termref def="dt-docent">document
+entity</termref><phrase diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E64">[E64]</loc>
+or in parameter entities. <termdef id="dt-extmkpdecl" term="External Markup Declaration">An <term>external
+markup declaration</term> is defined as a markup declaration occurring in
+the external subset or in a parameter entity (external or internal, the latter
+being included because non-validating processors are not required to read
+them).</termdef></phrase></p>
+<scrap id="fulldtd" lang="ebnf">
+<head>Standalone Document Declaration</head>
+<prodgroup pcw2="4" pcw4="19.5" pcw5="9">
+<prod id="NT-SDDecl">
+<lhs>SDDecl</lhs><rhs> <nt def="NT-S">S</nt> 'standalone' <nt def="NT-Eq">Eq</nt>
+(("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) </rhs><vc def="vc-check-rmd"/>
+</prod>
+</prodgroup></scrap>
+<p>In a standalone document declaration, the value <attval>yes</attval> indicates
+that there are no <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E64">[E64]</loc><termref
+def="dt-extmkpdecl">external markup declarations</termref></phrase> which
+affect the information passed from the XML processor to the application. The
+value <attval>no</attval> indicates that there are or may be such external
+markup declarations. Note that the standalone document declaration only denotes
+the presence of external <emph>declarations</emph>; the presence, in a document,
+of references to external <emph>entities</emph>, when those entities are internally
+declared, does not change its standalone status.</p>
+<p>If there are no external markup declarations, the standalone document declaration
+has no meaning. If there are external markup declarations but there is no
+standalone document declaration, the value <attval>no</attval> is assumed.</p>
+<p>Any XML document for which <code>standalone="no"</code> holds can be converted
+algorithmically to a standalone document, which may be desirable for some
+network delivery applications.</p>
+<vcnote id="vc-check-rmd"><head>Standalone Document Declaration</head><p>The
+standalone document declaration must have the value <attval>no</attval> if
+any external markup declarations contain declarations of:</p>
+<ulist>
+<item><p>attributes with <termref def="dt-default">default</termref> values,
+if elements to which these attributes apply appear in the document without
+specifications of values for these attributes, or</p></item>
+<item><p>entities (other than &magicents;), if <termref def="dt-entref">references</termref>
+to those entities appear in the document, or</p></item>
+<item><p>attributes with values subject to <titleref href="#AVNormalize">normalization</titleref>,
+where the attribute appears in the document with a value which will change
+as a result of normalization, or</p></item>
+<item><p>element types with <termref def="dt-elemcontent">element content</termref>,
+if white space occurs directly within any instance of those types.</p></item>
+</ulist>
+</vcnote>
+<p>An example XML declaration with a standalone document declaration:</p>
+<eg>&lt;?xml version="&versionOfXML;" standalone='yes'?></eg>
+</div2>
+<div2 id="sec-white-space">
+<head>White Space Handling</head>
+<p>In editing XML documents, it is often convenient to use <quote>white space</quote>
+(spaces, tabs, and blank lines<phrase diff="del"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E39">[E39]</loc>,
+denoted by the nonterminal <nt def="NT-S">S</nt> in this specification</phrase>)
+to set apart the markup for greater readability. Such white space is typically
+not intended for inclusion in the delivered version of the document. On the
+other hand, <quote>significant</quote> white space that should be preserved
+in the delivered version is common, for example in poetry and source code.</p>
+<p>An <termref def="dt-xml-proc">XML processor</termref> must always pass
+all characters in a document that are not markup through to the application.
+A <termref def="dt-validating"> validating XML processor</termref> must also
+inform the application which of these characters constitute white space appearing
+in <termref def="dt-elemcontent">element content</termref>.</p>
+<p>A special <termref def="dt-attr">attribute</termref> named <att>xml:space</att>
+may be attached to an element to signal an intention that in that element,
+white space should be preserved by applications. In valid documents, this
+attribute, like any other, must be <termref def="dt-attdecl">declared</termref>
+if it is used. When declared, it must be given as an <termref def="dt-enumerated">enumerated
+type</termref> whose <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E81">[E81]</loc>values
+are one or both of</phrase> <attval>default</attval> and <attval>preserve</attval>.
+For example:</p>
+<eg diff="chg"><![CDATA[<!ATTLIST poem xml:space (default|preserve) 'preserve'>]]>
+
+&lt;!-- <loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E81">[E81]</loc>-->
+&lt;!ATTLIST pre xml:space (preserve) #FIXED 'preserve'></eg>
+<p>The value <attval>default</attval> signals that applications' default white-space
+processing modes are acceptable for this element; the value <attval>preserve</attval>
+indicates the intent that applications preserve all the white space. This
+declared intent is considered to apply to all elements within the content
+of the element where it is specified, unless overriden with another instance
+of the <att>xml:space</att> attribute.</p>
+<p>The <termref def="dt-root">root element</termref> of any document is considered
+to have signaled no intentions as regards application space handling, unless
+it provides a value for this attribute or the attribute is declared with a
+default value.</p>
+</div2>
+<div2 id="sec-line-ends">
+<head>End-of-Line Handling</head>
+<p>XML <termref def="dt-parsedent">parsed entities</termref> are often stored
+in computer files which, for editing convenience, are organized into lines.
+These lines are typically separated by some combination of the characters
+carriage-return (#xD) and line-feed (#xA).</p>
+<p diff="del">To simplify the tasks of <termref def="dt-app">applications</termref>,
+wherever an external parsed entity or the literal entity value of an internal
+parsed entity contains either the literal two-character sequence <quote>#xD#xA</quote>
+or a standalone literal #xD, an <termref def="dt-xml-proc">XML processor</termref>
+must pass to the application the single character #xA. (This behavior can
+conveniently be produced by normalizing all line breaks to #xA on input, before
+parsing.)</p>
+<p diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E104">[E104]</loc>To
+simplify the tasks of <termref def="dt-app">applications</termref>, the characters
+passed to an application by the <termref def="dt-xml-proc">XML processor</termref>
+must be as if the XML processor normalized all line breaks in external parsed
+entities (including the document entity) on input, before parsing, by translating
+both the two-character sequence #xD #xA and any #xD that is not followed by
+#xA to a single #xA character.</p>
+</div2>
+<div2 id="sec-lang-tag">
+<head>Language Identification</head>
+<p>In document processing, it is often useful to identify the natural or formal
+language in which the content is written. A special <termref def="dt-attr">attribute</termref>
+named <att>xml:lang</att> may be inserted in documents to specify the language
+used in the contents and attribute values of any element in an XML document.
+In valid documents, this attribute, like any other, must be <termref def="dt-attdecl">declared</termref>
+if it is used. <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E73">[E73]</loc>The
+values of the attribute are language identifiers as defined by <bibref ref="RFC1766"/>, <titleref>Tags
+for the Identification of Languages</titleref>, or its successor on the IETF
+Standards Track.</phrase></p>
+<note diff="add">
+<p><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E73">[E73]</loc><bibref
+ref="RFC1766"/> tags are constructed from two-letter language codes as defined
+by <bibref ref="ISO639"/>, from two-letter country codes as defined by <bibref
+ref="ISO3166"/>, or from language identifiers registered with the Internet
+Assigned Numbers Authority <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E58">[E58]</loc><bibref
+diff="chg" ref="IANA-LANGCODES"/></phrase>. It is expected that the successor
+to <bibref ref="RFC1766"/> will introduce three-letter language codes for
+languages not presently covered by <bibref ref="ISO639"/>.</p>
+</note>
+<p diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E73">[E73]</loc>(Productions
+33 through 38 have been removed.)</p>
+<scrap diff="del" lang="ebnf">
+<head>Language Identification</head>
+<prod id="NT-LanguageID">
+<lhs>LanguageID</lhs><rhs><nt def="NT-Langcode">Langcode</nt> ('-' <nt def="NT-Subcode">Subcode</nt>)*</rhs>
+</prod>
+<prod id="NT-Langcode">
+<lhs>Langcode</lhs><rhs><nt def="NT-ISO639Code">ISO639Code</nt> | <nt def="NT-IanaCode">IanaCode</nt>
+| <nt def="NT-UserCode">UserCode</nt></rhs>
+</prod>
+<prod id="NT-ISO639Code">
+<lhs>ISO639Code</lhs><rhs>([a-z] | [A-Z]) ([a-z] | [A-Z])</rhs>
+</prod>
+<prod id="NT-IanaCode">
+<lhs>IanaCode</lhs><rhs>('i' | 'I') '-' ([a-z] | [A-Z])+</rhs>
+</prod>
+<prod id="NT-UserCode">
+<lhs>UserCode</lhs><rhs>('x' | 'X') '-' ([a-z] | [A-Z])+</rhs>
+</prod>
+<prod id="NT-Subcode">
+<lhs>Subcode</lhs><rhs>([a-z] | [A-Z])+</rhs>
+</prod>
+</scrap>
+<p diff="del">The <nt def="NT-Langcode">Langcode</nt> may be any of the following:</p>
+<ulist diff="del">
+<item><p>a two-letter language code as defined by <bibref ref="ISO639"/>, <titleref>Codes
+for the representation of names of languages</titleref></p></item>
+<item><p>a language identifier registered with the Internet Assigned Numbers
+Authority <bibref diff="chg" ref="IANA-LANGCODES"/>; these begin with the
+prefix <quote><code>i-</code></quote> (or <quote><code>I-</code></quote>)</p>
+</item>
+<item><p>a language identifier assigned by the user, or agreed on between
+parties in private use; these must begin with the prefix <quote><code>x-</code></quote>
+or <quote><code>X-</code></quote> in order to ensure that they do not conflict
+with names later standardized or registered with IANA</p></item>
+</ulist>
+<p diff="del">There may be any number of <nt def="NT-Subcode">Subcode</nt>
+segments; if the first subcode segment exists and the Subcode consists of
+two letters, then it must be a country code from <bibref ref="ISO3166"/>,
+"Codes for the representation of names of countries." If the first subcode
+consists of more than two letters, it must be a subcode for the language in
+question registered with IANA, unless the <nt def="NT-Langcode">Langcode</nt>
+begins with the prefix "<code>x-</code>" or "<code>X-</code>". </p>
+<p diff="del">It is customary to give the language code in lower case, and
+the country code (if any) in upper case. Note that these values, unlike other
+names in XML documents, are case insensitive.</p>
+<p>For example:</p>
+<eg><![CDATA[<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
+<p xml:lang="en-GB">What colour is it?</p>
+<p xml:lang="en-US">What color is it?</p>
+<sp who="Faust" desc='leise' xml:lang="de">
+ <l>Habe nun, ach! Philosophie,</l>
+ <l>Juristerei, und Medizin</l>
+ <l>und leider auch Theologie</l>
+ <l>durchaus studiert mit heißem Bemüh'n.</l>
+</sp>]]></eg>
+<!--<p>The xml:lang value is considered to apply both to the contents of an
+element and
+(unless otherwise via attribute default values) to the
+values of all of its attributes with free-text (CDATA) values. -->
+<p>The intent declared with <att>xml:lang</att> is considered to apply to
+all attributes and content of the element where it is specified, unless overridden
+with an instance of <att>xml:lang</att> on another element within that content.</p>
+<!--
+If no
+value is specified for xml:lang on an element, and no default value is
+defined for it in the DTD, then the xml:lang attribute of any element
+takes the same value it has in the parent element, if any. The two
+technical terms in the following example both have the same effective
+value for xml:lang:
+
+ <p xml:lang="en">Here the keywords are
+ <term xml:lang="en">shift</term> and
+ <term>reduce</term>. ...</p>
+
+The application, not the XML processor, is responsible for this '
+inheritance' of attribute values.
+-->
+<p>A simple declaration for <att>xml:lang</att> might take the form</p>
+<eg>xml:lang NMTOKEN #IMPLIED</eg>
+<p>but specific default values may also be given, if appropriate. In a collection
+of French poems for English students, with glosses and notes in English, the <att>xml:lang</att>
+attribute might be declared this way:</p>
+<eg><![CDATA[<!ATTLIST poem xml:lang NMTOKEN 'fr'>
+<!ATTLIST gloss xml:lang NMTOKEN 'en'>
+<!ATTLIST note xml:lang NMTOKEN 'en'>]]></eg>
+</div2>
+</div1>
+<!-- &Elements; -->
+<div1 id="sec-logical-struct">
+<head>Logical Structures</head>
+<p><termdef id="dt-element" term="Element">Each <termref def="dt-xml-doc">XML
+document</termref> contains one or more <term>elements</term>, the boundaries
+of which are either delimited by <termref def="dt-stag">start-tags</termref>
+and <termref def="dt-etag">end-tags</termref>, or, for <termref def="dt-empty">empty</termref>
+elements, by an <termref def="dt-eetag">empty-element tag</termref>. Each
+element has a type, identified by name, sometimes called its <quote>generic
+identifier</quote> (GI), and may have a set of attribute specifications.</termdef>
+Each attribute specification has a <termref def="dt-attrname">name</termref>
+and a <termref def="dt-attrval">value</termref>.</p>
+<scrap lang="ebnf">
+<head>Element</head>
+<prod id="NT-element">
+<lhs>element</lhs><rhs><nt def="NT-EmptyElemTag">EmptyElemTag</nt></rhs>
+<rhs>| <nt def="NT-STag">STag</nt> <nt def="NT-content">content</nt> <nt def="NT-ETag">ETag</nt></rhs>
+<wfc def="GIMatch"/><vc def="elementvalid"/>
+</prod>
+</scrap>
+<p>This specification does not constrain the semantics, use, or (beyond syntax)
+names of the element types and attributes, except that names beginning with
+a match to <code>(('X'|'x')('M'|'m')('L'|'l'))</code> are reserved for standardization
+in this or future versions of this specification.</p>
+<wfcnote id="GIMatch"><head>Element Type Match</head><p>The <nt def="NT-Name">Name</nt>
+in an element's end-tag must match the element type in the start-tag.</p>
+</wfcnote>
+<vcnote id="elementvalid"><head>Element Valid</head><p>An element is valid
+if there is a declaration matching <nt def="NT-elementdecl">elementdecl</nt>
+where the <nt def="NT-Name">Name</nt> matches the element type, and one of
+the following holds:</p>
+<olist>
+<item><p>The declaration matches <kw>EMPTY</kw> and the element has no <termref
+def="dt-content">content</termref>.</p></item>
+<item><p>The declaration matches <nt def="NT-children">children</nt> and the
+sequence of <termref def="dt-parentchild">child elements</termref> belongs
+to the language generated by the regular expression in the content model,
+with optional white space (characters matching the nonterminal <nt def="NT-S">S</nt>)
+between <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E59">[E59]</loc>the
+start-tag and the first child element, between child elements, or between
+the last child element and the end-tag. Note that a CDATA section containing
+only white space does not match the nonterminal <nt def="NT-S">S</nt>, and
+hence cannot appear in these positions.</phrase></p></item>
+<item><p>The declaration matches <nt def="NT-Mixed">Mixed</nt> and the content
+consists of <termref def="dt-chardata">character data</termref> and <termref
+def="dt-parentchild">child elements</termref> whose types match names in the
+content model.</p></item>
+<item><p>The declaration matches <kw>ANY</kw>, and the types of any <termref
+def="dt-parentchild">child elements</termref> have been declared.</p></item>
+</olist>
+</vcnote>
+<div2 id="sec-starttags">
+<head>Start-Tags, End-Tags, and Empty-Element Tags</head>
+<p><termdef id="dt-stag" term="Start-Tag">The beginning of every non-empty
+XML element is marked by a <term>start-tag</term>.</termdef></p>
+<scrap lang="ebnf">
+<head>Start-tag</head>
+<prodgroup pcw2="6" pcw4="15" pcw5="11.5">
+<prod id="NT-STag">
+<lhs>STag</lhs><rhs>'&lt;' <nt def="NT-Name">Name</nt> (<nt def="NT-S">S</nt> <nt
+def="NT-Attribute">Attribute</nt>)* <nt def="NT-S">S</nt>? '>'</rhs><wfc def="uniqattspec"/>
+</prod>
+<prod id="NT-Attribute">
+<lhs>Attribute</lhs><rhs><nt def="NT-Name">Name</nt> <nt def="NT-Eq">Eq</nt> <nt
+def="NT-AttValue">AttValue</nt></rhs><vc def="ValueType"/><wfc def="NoExternalRefs"/>
+<wfc def="CleanAttrVals"/>
+</prod>
+</prodgroup></scrap>
+<p>The <nt def="NT-Name">Name</nt> in the start- and end-tags gives the element's <term>type</term>. <termdef
+id="dt-attr" term="Attribute"> The <nt def="NT-Name">Name</nt>-<nt def="NT-AttValue">AttValue</nt>
+pairs are referred to as the <term>attribute specifications</term> of the
+element</termdef>, <termdef id="dt-attrname" term="Attribute Name">with the <nt
+def="NT-Name">Name</nt> in each pair referred to as the <term>attribute name</term></termdef>
+and <termdef id="dt-attrval" term="Attribute Value">the content of the <nt
+def="NT-AttValue">AttValue</nt> (the text between the <code>'</code> or <code>"</code>
+delimiters) as the <term>attribute value</term>.</termdef><phrase diff="add"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E46">[E46]</loc>Note
+that the order of attribute specifications in a start-tag or empty-element
+tag is not significant.</phrase></p>
+<wfcnote id="uniqattspec"><head>Unique Att Spec</head><p>No attribute name
+may appear more than once in the same start-tag or empty-element tag.</p>
+</wfcnote>
+<vcnote id="ValueType"><head>Attribute Value Type</head><p>The attribute must
+have been declared; the value must be of the type declared for it. (For attribute
+types, see <specref ref="attdecls"/>.)</p>
+</vcnote>
+<wfcnote id="NoExternalRefs"><head>No External Entity References</head><p>Attribute
+values cannot contain direct or indirect entity references to external entities.</p>
+</wfcnote>
+<wfcnote id="CleanAttrVals"><head>No <code>&lt;</code> in Attribute Values</head>
+<p>The <termref def="dt-repltext">replacement text</termref> of any entity
+referred to directly or indirectly in an attribute value <phrase diff="del"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E83">[E83]</loc>(other
+than <quote><code>&amp;lt;</code></quote>) </phrase>must not contain a <code>&lt;</code>.</p>
+</wfcnote>
+<p>An example of a start-tag:</p>
+<eg>&lt;termdef id="dt-dog" term="dog"></eg>
+<p><termdef id="dt-etag" term="End Tag">The end of every element that begins
+with a start-tag must be marked by an <term>end-tag</term> containing a name
+that echoes the element's type as given in the start-tag:</termdef></p>
+<scrap lang="ebnf">
+<head>End-tag</head>
+<prodgroup pcw2="6" pcw4="15" pcw5="11.5">
+<prod id="NT-ETag">
+<lhs>ETag</lhs><rhs>'&lt;/' <nt def="NT-Name">Name</nt> <nt def="NT-S">S</nt>?
+'>'</rhs>
+</prod>
+</prodgroup></scrap>
+<p>An example of an end-tag:</p>
+<eg>&lt;/termdef></eg>
+<p><termdef id="dt-content" term="Content">The <termref def="dt-text">text</termref>
+between the start-tag and end-tag is called the element's <term>content</term>:</termdef></p>
+<scrap lang="ebnf">
+<head>Content of Elements</head>
+<prodgroup pcw2="6" pcw4="15" pcw5="11.5">
+<prod id="NT-content" diff="chg">
+<lhs>content</lhs><rhs><nt def="NT-CharData">CharData</nt>? ((<nt def="NT-element">element</nt>
+| <nt def="NT-Reference">Reference</nt> | <nt def="NT-CDSect">CDSect</nt>
+| <nt def="NT-PI">PI</nt> | <nt def="NT-Comment">Comment</nt>) <nt def="NT-CharData">CharData</nt>?)*</rhs>
+<com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E71">[E71]</loc></com>
+</prod>
+</prodgroup></scrap>
+<p><phrase diff="chg"><termdef id="dt-empty" term="Empty"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E97">[E97]</loc>An element
+with no content is said to be <term>empty</term>.</termdef> The representation
+of an empty element is either a start-tag immediately followed by an end-tag,
+or an empty-element tag.</phrase> <termdef id="dt-eetag" term="empty-element tag">An <term>empty-element
+tag</term> takes a special form:</termdef></p>
+<scrap lang="ebnf">
+<head>Tags for Empty Elements</head>
+<prodgroup pcw2="6" pcw4="15" pcw5="11.5">
+<prod id="NT-EmptyElemTag">
+<lhs>EmptyElemTag</lhs><rhs>'&lt;' <nt def="NT-Name">Name</nt> (<nt def="NT-S">S</nt> <nt
+def="NT-Attribute">Attribute</nt>)* <nt def="NT-S">S</nt>? '/>'</rhs><wfc
+def="uniqattspec"/>
+</prod>
+</prodgroup></scrap>
+<p>Empty-element tags may be used for any element which has no content, whether
+or not it is declared using the keyword <kw>EMPTY</kw>. <termref def="dt-interop">For
+interoperability</termref>, the empty-element tag <phrase diff="chg"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E45">[E45]</loc>should
+be used, and should only be used,</phrase> for elements which are declared
+EMPTY.</p>
+<p>Examples of empty elements:</p>
+<eg>&lt;IMG align="left"
+ src="http://www.w3.org/Icons/WWW/w3c_home" />
+&lt;br>&lt;/br>
+&lt;br/></eg>
+</div2>
+<div2 id="elemdecls">
+<head>Element Type Declarations</head>
+<p>The <termref def="dt-element">element</termref> structure of an <termref
+def="dt-xml-doc">XML document</termref> may, for <termref def="dt-valid">validation</termref>
+purposes, be constrained using element type and attribute-list declarations.
+An element type declaration constrains the element's <termref def="dt-content">content</termref>.</p>
+<p>Element type declarations often constrain which element types can appear
+as <termref def="dt-parentchild">children</termref> of the element. At user
+option, an XML processor may issue a warning when a declaration mentions an
+element type for which no declaration is provided, but this is not an error.</p>
+<p><termdef id="dt-eldecl" term="Element Type declaration">An <term>element
+type declaration</term> takes the form:</termdef></p>
+<scrap lang="ebnf">
+<head>Element Type Declaration</head>
+<prodgroup pcw2="5.5" pcw4="18" pcw5="9">
+<prod id="NT-elementdecl">
+<lhs>elementdecl</lhs><rhs>'&lt;!ELEMENT' <nt def="NT-S">S</nt> <nt def="NT-Name">Name</nt> <nt
+def="NT-S">S</nt> <nt def="NT-contentspec">contentspec</nt> <nt def="NT-S">S</nt>?
+'>'</rhs><vc def="EDUnique"/>
+</prod>
+<prod id="NT-contentspec">
+<lhs>contentspec</lhs><rhs>'EMPTY' | 'ANY' | <nt def="NT-Mixed">Mixed</nt>
+| <nt def="NT-children">children</nt> </rhs>
+</prod>
+</prodgroup></scrap>
+<p>where the <nt def="NT-Name">Name</nt> gives the element type being declared.</p>
+<vcnote id="EDUnique"><head>Unique Element Type Declaration</head><p>No element
+type may be declared more than once.</p>
+</vcnote>
+<p>Examples of element type declarations:</p>
+<eg>&lt;!ELEMENT br EMPTY>
+&lt;!ELEMENT p (#PCDATA|emph)* >
+&lt;!ELEMENT %name.para; %content.para; >
+&lt;!ELEMENT container ANY></eg>
+<div3 id="sec-element-content">
+<head>Element Content</head>
+<p><termdef id="dt-elemcontent" term="Element content">An element <termref
+def="dt-stag">type</termref> has <term>element content</term> when elements
+of that type must contain only <termref def="dt-parentchild">child</termref>
+elements (no character data), optionally separated by white space (characters
+matching the nonterminal <nt def="NT-S">S</nt>).</termdef><termdef id="dt-content-model"
+term="Content model">In this case, the constraint includes a <phrase diff="chg"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E55">[E55]</loc><term>content
+model</term></phrase>, a simple grammar governing the allowed types of the
+child elements and the order in which they are allowed to appear.</termdef>
+The grammar is built on content particles (<nt def="NT-cp">cp</nt>s), which
+consist of names, choice lists of content particles, or sequence lists of
+content particles:</p>
+<scrap lang="ebnf">
+<head>Element-content Models</head>
+<prodgroup pcw2="5.5" pcw4="16" pcw5="11">
+<prod id="NT-children">
+<lhs>children</lhs><rhs>(<nt def="NT-choice">choice</nt> | <nt def="NT-seq">seq</nt>)
+('?' | '*' | '+')?</rhs>
+</prod>
+<prod id="NT-cp">
+<lhs>cp</lhs><rhs>(<nt def="NT-Name">Name</nt> | <nt def="NT-choice">choice</nt>
+| <nt def="NT-seq">seq</nt>) ('?' | '*' | '+')?</rhs>
+</prod>
+<prod id="NT-choice" diff="chg">
+<lhs>choice</lhs><rhs>'(' <nt def="NT-S">S</nt>? <nt def="NT-cp">cp</nt> ( <nt
+def="NT-S">S</nt>? '|' <nt def="NT-S">S</nt>? <nt def="NT-cp">cp</nt> )+ <nt
+def="NT-S">S</nt>? ')'</rhs><com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E50">[E50]</loc></com>
+<com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E52">[E52]</loc></com>
+<vc def="vc-PEinGroup"/>
+</prod>
+<prod id="NT-seq" diff="chg">
+<lhs>seq</lhs><rhs>'(' <nt def="NT-S">S</nt>? <nt def="NT-cp">cp</nt> ( <nt
+def="NT-S">S</nt>? ',' <nt def="NT-S">S</nt>? <nt def="NT-cp">cp</nt> )* <nt
+def="NT-S">S</nt>? ')'</rhs><com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E52">[E52]</loc></com>
+<vc def="vc-PEinGroup"/>
+</prod>
+</prodgroup></scrap>
+<p>where each <nt def="NT-Name">Name</nt> is the type of an element which
+may appear as a <termref def="dt-parentchild">child</termref>. Any content
+particle in a choice list may appear in the <termref def="dt-elemcontent">element
+content</termref> at the location where the choice list appears in the grammar;
+content particles occurring in a sequence list must each appear in the <termref
+def="dt-elemcontent">element content</termref> in the order given in the list.
+The optional character following a name or list governs whether the element
+or the content particles in the list may occur one or more (<code>+</code>),
+zero or more (<code>*</code>), or zero or one times (<code>?</code>). The
+absence of such an operator means that the element or content particle must
+appear exactly once. This syntax and meaning are identical to those used in
+the productions in this specification.</p>
+<p>The content of an element matches a content model if and only if it is
+possible to trace out a path through the content model, obeying the sequence,
+choice, and repetition operators and matching each element in the content
+against an element type in the content model. <termref def="dt-compat">For
+compatibility</termref>, it is an error if an element in the document can
+match more than one occurrence of an element type in the content model. For
+more information, see <specref ref="determinism"/>.</p>
+<!--appendix <specref ref="determinism"/>.-->
+<!-- appendix on deterministic content models. -->
+<vcnote id="vc-PEinGroup"><head>Proper Group/PE Nesting</head><p>Parameter-entity <termref
+def="dt-repltext">replacement text</termref> must be properly nested with <phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E11">[E11]</loc>parenthesized</phrase>
+groups. That is to say, if either of the opening or closing parentheses in
+a <nt def="NT-choice">choice</nt>, <nt def="NT-seq">seq</nt>, or <nt def="NT-Mixed">Mixed</nt>
+construct is contained in the replacement text for a <termref def="dt-PERef">parameter
+entity</termref>, both must be contained in the same replacement text.</p>
+<p diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E19">[E19]</loc><termref
+def="dt-interop">For interoperability</termref>, if a parameter-entity reference
+appears in a <nt def="NT-choice">choice</nt>, <nt def="NT-seq">seq</nt>, or <nt
+def="NT-Mixed">Mixed</nt> construct, its replacement text should contain at
+least one non-blank character, and neither the first nor last non-blank character
+of the replacement text should be a connector (<code>|</code> or <code>,</code>).</p>
+</vcnote>
+<p>Examples of element-content models:</p>
+<eg>&lt;!ELEMENT spec (front, body, back?)>
+&lt;!ELEMENT div1 (head, (p | list | note)*, div2*)>
+&lt;!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*></eg>
+</div3>
+<div3 id="sec-mixed-content">
+<head>Mixed Content</head>
+<p><termdef id="dt-mixed" term="Mixed Content">An element <termref def="dt-stag">type</termref>
+has <term>mixed content</term> when elements of that type may contain character
+data, optionally interspersed with <termref def="dt-parentchild">child</termref>
+elements.</termdef> In this case, the types of the child elements may be constrained,
+but not their order or their number of occurrences:</p>
+<scrap lang="ebnf">
+<head>Mixed-content Declaration</head>
+<prodgroup pcw2="5.5" pcw4="16" pcw5="11">
+<prod id="NT-Mixed">
+<lhs>Mixed</lhs><rhs>'(' <nt def="NT-S">S</nt>? '#PCDATA' (<nt def="NT-S">S</nt>?
+'|' <nt def="NT-S">S</nt>? <nt def="NT-Name">Name</nt>)* <nt def="NT-S">S</nt>?
+')*' </rhs>
+<rhs>| '(' <nt def="NT-S">S</nt>? '#PCDATA' <nt def="NT-S">S</nt>? ')' </rhs>
+<vc def="vc-PEinGroup"/><vc def="vc-MixedChildrenUnique"/>
+</prod>
+</prodgroup></scrap>
+<p>where the <nt def="NT-Name">Name</nt>s give the types of elements that
+may appear as children. <phrase diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E10">[E10]</loc>The
+keyword <kw>#PCDATA</kw> derives historically from the term <quote>parsed
+character data.</quote></phrase></p>
+<vcnote id="vc-MixedChildrenUnique"><head>No Duplicate Types</head><p>The
+same name must not appear more than once in a single mixed-content declaration.</p>
+</vcnote>
+<p>Examples of mixed content declarations:</p>
+<eg>&lt;!ELEMENT p (#PCDATA|a|ul|b|i|em)*>
+&lt;!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* >
+&lt;!ELEMENT b (#PCDATA)></eg>
+</div3>
+</div2>
+<div2 id="attdecls">
+<head>Attribute-List Declarations</head>
+<p><termref def="dt-attr">Attributes</termref> are used to associate name-value
+pairs with <termref def="dt-element">elements</termref>. Attribute specifications
+may appear only within <termref def="dt-stag">start-tags</termref> and <termref
+def="dt-eetag">empty-element tags</termref>; thus, the productions used to
+recognize them appear in <specref ref="sec-starttags"/>. Attribute-list declarations
+may be used:</p>
+<ulist>
+<item><p>To define the set of attributes pertaining to a given element type.</p>
+</item>
+<item><p>To establish type constraints for these attributes.</p></item>
+<item><p>To provide <termref def="dt-default">default values</termref> for
+attributes.</p></item>
+</ulist>
+<p><termdef id="dt-attdecl" term="Attribute-List Declaration"> <term>Attribute-list
+declarations</term> specify the name, data type, and default value (if any)
+of each attribute associated with a given element type:</termdef></p>
+<scrap lang="ebnf">
+<head>Attribute-list Declaration</head>
+<prod id="NT-AttlistDecl">
+<lhs>AttlistDecl</lhs><rhs>'&lt;!ATTLIST' <nt def="NT-S">S</nt> <nt def="NT-Name">Name</nt> <nt
+def="NT-AttDef">AttDef</nt>* <nt def="NT-S">S</nt>? '>'</rhs>
+</prod>
+<prod id="NT-AttDef">
+<lhs>AttDef</lhs><rhs><nt def="NT-S">S</nt> <nt def="NT-Name">Name</nt> <nt
+def="NT-S">S</nt> <nt def="NT-AttType">AttType</nt> <nt def="NT-S">S</nt> <nt
+def="NT-DefaultDecl">DefaultDecl</nt></rhs>
+</prod>
+</scrap>
+<p>The <nt def="NT-Name">Name</nt> in the <nt def="NT-AttlistDecl">AttlistDecl</nt>
+rule is the type of an element. At user option, an XML processor may issue
+a warning if attributes are declared for an element type not itself declared,
+but this is not an error. The <nt def="NT-Name">Name</nt> in the <nt def="NT-AttDef">AttDef</nt>
+rule is the name of the attribute.</p>
+<p>When more than one <nt def="NT-AttlistDecl">AttlistDecl</nt> is provided
+for a given element type, the contents of all those provided are merged. When
+more than one definition is provided for the same attribute of a given element
+type, the first declaration is binding and later declarations are ignored. <phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E9">[E9]</loc><termref
+def="dt-interop">For interoperability,</termref> writers of DTDs may choose
+to provide at most one attribute-list declaration for a given element type,
+at most one attribute definition for a given attribute name in an attribute-list
+declaration, and at least one attribute definition in each attribute-list
+declaration.</phrase> For interoperability, an XML processor may at user option
+issue a warning when more than one attribute-list declaration is provided
+for a given element type, or more than one attribute definition is provided
+for a given attribute, but this is not an error.</p>
+<div3 id="sec-attribute-types">
+<head>Attribute Types</head>
+<p>XML attribute types are of three kinds: a string type, a set of tokenized
+types, and enumerated types. The string type may take any literal string as
+a value; the tokenized types have varying lexical and semantic constraints<phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E8">[E8]</loc>.
+The validity constraints noted in the grammar are applied after the attribute
+value has been normalized as described in <specref ref="attdecls"/>.</phrase></p>
+<scrap lang="ebnf">
+<head>Attribute Types</head>
+<prodgroup pcw4="14" pcw5="11.5">
+<prod id="NT-AttType">
+<lhs>AttType</lhs><rhs><nt def="NT-StringType">StringType</nt> | <nt def="NT-TokenizedType">TokenizedType</nt>
+| <nt def="NT-EnumeratedType">EnumeratedType</nt> </rhs>
+</prod>
+<prod id="NT-StringType">
+<lhs>StringType</lhs><rhs>'CDATA'</rhs>
+</prod>
+<prod id="NT-TokenizedType">
+<lhs>TokenizedType</lhs><rhs>'ID'</rhs><vc def="id"/><vc def="one-id-per-el"/>
+<vc def="id-default"/>
+<rhs>| 'IDREF'</rhs><vc def="idref"/>
+<rhs>| 'IDREFS'</rhs><vc def="idref"/>
+<rhs>| 'ENTITY'</rhs><vc def="entname"/>
+<rhs>| 'ENTITIES'</rhs><vc def="entname"/>
+<rhs>| 'NMTOKEN'</rhs><vc def="nmtok"/>
+<rhs>| 'NMTOKENS'</rhs><vc def="nmtok"/>
+</prod>
+</prodgroup></scrap>
+<vcnote id="id"><head>ID</head><p>Values of type <kw>ID</kw> must match the <nt
+def="NT-Name">Name</nt> production. A name must not appear more than once
+in an XML document as a value of this type; i.e., ID values must uniquely
+identify the elements which bear them.</p>
+</vcnote>
+<vcnote id="one-id-per-el"><head>One ID per Element Type</head><p>No element
+type may have more than one ID attribute specified.</p>
+</vcnote>
+<vcnote id="id-default"><head>ID Attribute Default</head><p>An ID attribute
+must have a declared default of <kw>#IMPLIED</kw> or <kw>#REQUIRED</kw>.</p>
+</vcnote>
+<vcnote id="idref"><head>IDREF</head><p>Values of type <kw>IDREF</kw> must
+match the <nt def="NT-Name">Name</nt> production, and values of type <kw>IDREFS</kw>
+must match <nt def="NT-Names">Names</nt>; each <nt def="NT-Name">Name</nt>
+must match the value of an ID attribute on some element in the XML document;
+i.e. <kw>IDREF</kw> values must match the value of some ID attribute.</p>
+</vcnote>
+<vcnote id="entname"><head>Entity Name</head><p>Values of type <kw>ENTITY</kw>
+must match the <nt def="NT-Name">Name</nt> production, values of type <kw>ENTITIES</kw>
+must match <nt def="NT-Names">Names</nt>; each <nt def="NT-Name">Name</nt>
+must match the name of an <termref def="dt-unparsed">unparsed entity</termref>
+declared in the <termref def="dt-doctype">DTD</termref>.</p>
+</vcnote>
+<vcnote id="nmtok"><head>Name Token</head><p>Values of type <kw>NMTOKEN</kw>
+must match the <nt def="NT-Nmtoken">Nmtoken</nt> production; values of type <kw>NMTOKENS</kw>
+must match <termref def="NT-Nmtokens">Nmtokens</termref>.</p>
+</vcnote>
+<!-- why?
+<p>The XML processor must normalize attribute values before
+passing them to the application, as described in
+<specref ref="AVNormalize"/>.</p>-->
+<p><termdef id="dt-enumerated" term="Enumerated Attribute
+Values"><term>Enumerated attributes</term> can take one of a list of values
+provided in the declaration</termdef>. There are two kinds of enumerated types:</p>
+<scrap lang="ebnf">
+<head>Enumerated Attribute Types</head>
+<prod id="NT-EnumeratedType">
+<lhs>EnumeratedType</lhs><rhs><nt def="NT-NotationType">NotationType</nt>
+| <nt def="NT-Enumeration">Enumeration</nt> </rhs>
+</prod>
+<prod id="NT-NotationType">
+<lhs>NotationType</lhs><rhs>'NOTATION' <nt def="NT-S">S</nt> '(' <nt def="NT-S">S</nt>? <nt
+def="NT-Name">Name</nt> (<nt def="NT-S">S</nt>? '|' <nt def="NT-S">S</nt>? <nt
+def="NT-Name">Name</nt>)* <nt def="NT-S">S</nt>? ')' </rhs><vc def="notatn"/>
+<vc def="OneNotationPer" diff="add"/><vc def="NoNotationEmpty" diff="add"/>
+</prod>
+<prod id="NT-Enumeration">
+<lhs>Enumeration</lhs><rhs>'(' <nt def="NT-S">S</nt>? <nt def="NT-Nmtoken">Nmtoken</nt>
+(<nt def="NT-S">S</nt>? '|' <nt def="NT-S">S</nt>? <nt def="NT-Nmtoken">Nmtoken</nt>)* <nt
+def="NT-S">S</nt>? ')'</rhs><vc def="enum"/>
+</prod>
+</scrap>
+<p>A <kw>NOTATION</kw> attribute identifies a <termref def="dt-notation">notation</termref>,
+declared in the DTD with associated system and/or public identifiers, to be
+used in interpreting the element to which the attribute is attached.</p>
+<vcnote id="notatn"><head>Notation Attributes</head><p>Values of this type
+must match one of the <titleref href="#Notations">notation</titleref> names
+included in the declaration; all notation names in the declaration must be
+declared.</p>
+</vcnote>
+<vcnote id="OneNotationPer" diff="add"><head><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E7">[E7]</loc>One
+Notation Per Element Type</head><p>No element type may have more than one <kw>NOTATION</kw>
+attribute specified.</p>
+</vcnote>
+<vcnote id="NoNotationEmpty" diff="add"><head><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E68">[E68]</loc>No
+Notation on Empty Element</head><p><termref def="dt-compat">For compatibility</termref>,
+an attribute of type <kw>NOTATION</kw> must not be declared on an element
+declared <kw>EMPTY</kw>.</p>
+</vcnote>
+<vcnote id="enum"><head>Enumeration</head><p>Values of this type must match
+one of the <nt def="NT-Nmtoken">Nmtoken</nt> tokens in the declaration.</p>
+</vcnote>
+<p><termref def="dt-interop">For interoperability,</termref> the same <nt
+def="NT-Nmtoken">Nmtoken</nt> should not occur more than once in the enumerated
+attribute types of a single element type.</p>
+</div3>
+<div3 id="sec-attr-defaults">
+<head>Attribute Defaults</head>
+<p>An <termref def="dt-attdecl">attribute declaration</termref> provides information
+on whether the attribute's presence is required, and if not, how an XML processor
+should react if a declared attribute is absent in a document.</p>
+<scrap lang="ebnf">
+<head>Attribute Defaults</head>
+<prodgroup pcw4="14" pcw5="11.5">
+<prod id="NT-DefaultDecl">
+<lhs>DefaultDecl</lhs><rhs>'#REQUIRED' |&nbsp;'#IMPLIED' </rhs>
+<rhs>| (('#FIXED' S)? <nt def="NT-AttValue">AttValue</nt>)</rhs><vc def="RequiredAttr"/>
+<vc def="defattrvalid"/><wfc def="CleanAttrVals"/><vc def="FixedAttr"/>
+</prod>
+</prodgroup></scrap>
+<p>In an attribute declaration, <kw>#REQUIRED</kw> means that the attribute
+must always be provided, <kw>#IMPLIED</kw> that no default value is provided. <!-- not any more!!
+<kw>#IMPLIED</kw> means that if the attribute is omitted
+from an element of this type,
+the XML processor must inform the application
+that no value was specified; no constraint is placed on the behavior
+of the application. --> <termdef id="dt-default" term="Attribute Default">If
+the declaration is neither <kw>#REQUIRED</kw> nor <kw>#IMPLIED</kw>, then
+the <nt def="NT-AttValue">AttValue</nt> value contains the declared <term>default</term>
+value; the <kw>#FIXED</kw> keyword states that the attribute must always have
+the default value. If a default value is declared, when an XML processor encounters
+an omitted attribute, it is to behave as though the attribute were present
+with the declared default value.</termdef></p>
+<vcnote id="RequiredAttr"><head>Required Attribute</head><p>If the default
+declaration is the keyword <kw>#REQUIRED</kw>, then the attribute must be
+specified for all elements of the type in the attribute-list declaration.</p>
+</vcnote>
+<vcnote id="defattrvalid"><head>Attribute Default Legal</head><p>The declared
+default value must meet the lexical constraints of the declared attribute
+type.</p>
+</vcnote>
+<vcnote id="FixedAttr"><head>Fixed Attribute Default</head><p>If an attribute
+has a default value declared with the <kw>#FIXED</kw> keyword, instances of
+that attribute must match the default value.</p>
+</vcnote>
+<p>Examples of attribute-list declarations:</p>
+<eg>&lt;!ATTLIST termdef
+ id ID #REQUIRED
+ name CDATA #IMPLIED>
+&lt;!ATTLIST list
+ type (bullets|ordered|glossary) "ordered">
+&lt;!ATTLIST form
+ method CDATA #FIXED "POST"></eg>
+</div3>
+<div3 id="AVNormalize" diff="chg">
+<head><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E70">[E70]</loc>Attribute-Value
+Normalization</head>
+<p>Before the value of an attribute is passed to the application or checked
+for validity, the XML processor must normalize the attribute value by applying
+the algorithm below, or by using some other method such that the value passed
+to the application is the same as that produced by the algorithm.</p>
+<olist>
+<item><p>All line breaks must have been normalized on input to #xA as described
+in <specref ref="sec-line-ends"/>, so the rest of this algorithm operates
+on text normalized in this way.</p></item>
+<item><p>Begin with a normalized value consisting of the empty string.</p>
+</item>
+<item><p>For each character, entity reference, or character reference in the
+unnormalized attribute value, beginning with the first and continuing to the
+last, do the following:</p>
+<ulist>
+<item><p>For a character reference, append the referenced character to the
+normalized value.</p></item>
+<item><p>For an entity reference, recursively apply step 3 of this algorithm
+to the replacement text of the entity.</p></item>
+<item><p>For a white space character (#x20, #xD, #xA, #x9), append a space
+character (#x20) to the normalized value.</p></item>
+<item><p>For another character, append the character to the normalized value.</p>
+</item>
+</ulist>
+</item>
+</olist>
+<p>If the attribute type is not CDATA, then the XML processor must further
+process the normalized attribute value by discarding any leading and trailing
+space (#x20) characters, and by replacing sequences of space (#x20) characters
+by a single space (#x20) character.</p>
+<p>Note that if the unnormalized attribute value contains a character reference
+to a white space character other than space (#x20), the normalized value contains
+the referenced character itself (#xD, #xA or #x9). This contrasts with the
+case where the unnormalized value contains a white space character (not a
+reference), which is replaced with a space character (#x20) in the normalized
+value and also contrasts with the case where the unnormalized value contains
+an entity reference whose replacement text contains a white space character;
+being recursively processed, the white space character is replaced with a
+space character (#x20) in the normalized value.</p>
+<p>All attributes for which no declaration has been read should be treated
+by a non-validating <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E95">[E95]</loc>processor</phrase>
+as if declared <kw>CDATA</kw>.</p>
+<p>Following are examples of attribute normalization. Given the following
+declarations:</p>
+<eg>&lt;!ENTITY d "&amp;#xD;">
+&lt;!ENTITY a "&amp;#xA;">
+&lt;!ENTITY da "&amp;#xD;&amp;#xA;"></eg>
+<p>the attribute specifications in the left column below would be normalized
+to the character sequences of the middle column if the attribute <att>a</att>
+is declared <kw>NMTOKENS</kw> and to those of the right columns if <att>a</att>
+is declared <kw>CDATA</kw>.</p>
+<table border="1" frame="border"><thead><tr><th>Attribute specification</th>
+<th>a is NMTOKENS</th><th>a is CDATA</th></tr></thead><tbody><tr><td><eg>a="
+
+xyz"</eg></td><td><code>x y z</code></td><td><code>#x20 #x20 x y z</code></td>
+</tr><tr><td><eg>a="&amp;d;&amp;d;A&amp;a;&amp;a;B&amp;da;"</eg></td><td><code>A
+#x20 B</code></td><td><code>#x20 #x20 A #x20 #x20 B #x20 #x20</code></td>
+</tr><tr><td><eg>a=
+"&amp;#xd;&amp;#xd;A&amp;#xa;&amp;#xa;B&amp;#xd;&amp;#xa;"</eg></td><td><code>#xD
+#xD A #xA #xA B #xD #xA</code></td><td><code>#xD #xD A #xA #xA B #xD #xD</code></td>
+</tr></tbody></table>
+<p>Note that the last example is invalid (but well-formed) if <att>a</att>
+is declared to be of type <kw>NMTOKENS</kw>.</p>
+</div3>
+</div2>
+<div2 id="sec-condition-sect">
+<head>Conditional Sections</head>
+<p><termdef id="dt-cond-section" term="conditional section"> <term>Conditional
+sections</term> are portions of the <termref def="dt-doctype">document type
+declaration external subset</termref> which are included in, or excluded from,
+the logical structure of the DTD based on the keyword which governs them.</termdef></p>
+<scrap lang="ebnf">
+<head>Conditional Section</head>
+<prodgroup pcw2="9" pcw4="14.5">
+<prod id="NT-conditionalSect">
+<lhs>conditionalSect</lhs><rhs><nt def="NT-includeSect">includeSect</nt> | <nt
+def="NT-ignoreSect">ignoreSect</nt> </rhs>
+</prod>
+<prod id="NT-includeSect">
+<lhs>includeSect</lhs><rhs>'&lt;![' S? 'INCLUDE' S? '[' <nt def="NT-extSubsetDecl">extSubsetDecl</nt>
+']]&gt;' </rhs><com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E90">[E90]</loc></com>
+<vc def="condsec-nesting" diff="add"/>
+</prod>
+<prod id="NT-ignoreSect">
+<lhs>ignoreSect</lhs><rhs>'&lt;![' S? 'IGNORE' S? '[' <nt def="NT-ignoreSectContents">ignoreSectContents</nt>*
+']]&gt;'</rhs><com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E90">[E90]</loc></com>
+<vc def="condsec-nesting" diff="add"/>
+</prod>
+<prod id="NT-ignoreSectContents">
+<lhs>ignoreSectContents</lhs><rhs><nt def="NT-Ignore">Ignore</nt> ('&lt;![' <nt
+def="NT-ignoreSectContents">ignoreSectContents</nt> ']]&gt;' <nt def="NT-Ignore">Ignore</nt>)*</rhs>
+</prod>
+<prod id="NT-Ignore">
+<lhs>Ignore</lhs><rhs><nt def="NT-Char">Char</nt>* - (<nt def="NT-Char">Char</nt>*
+('&lt;![' | ']]&gt;') <nt def="NT-Char">Char</nt>*) </rhs>
+</prod>
+</prodgroup></scrap>
+<vcnote id="condsec-nesting" diff="add"><head><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E90">[E90]</loc>Proper
+Conditional Section/PE Nesting</head><p>If any of the "<code>&lt;![</code>",
+"<code>[</code>", or "<code>]]&gt;</code>" of a conditional section is contained
+in the replacement text for a parameter-entity reference, all of them must
+be contained in the same replacement text.</p>
+</vcnote>
+<p>Like the internal and external DTD subsets, a conditional section may contain
+one or more complete declarations, comments, processing instructions, or nested
+conditional sections, intermingled with white space.</p>
+<p>If the keyword of the conditional section is <kw>INCLUDE</kw>, then the
+contents of the conditional section are part of the DTD. If the keyword of
+the conditional section is <kw>IGNORE</kw>, then the contents of the conditional
+section are not logically part of the DTD. <phrase diff="del"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E90">[E90]</loc>Note that
+for reliable parsing, the contents of even ignored conditional sections must
+be read in order to detect nested conditional sections and ensure that the
+end of the outermost (ignored) conditional section is properly detected.</phrase>
+If a conditional section with a keyword of <kw>INCLUDE</kw> occurs within
+a larger conditional section with a keyword of <kw>IGNORE</kw>, both the outer
+and the inner conditional sections are ignored.<phrase diff="add"> <loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E90">[E90]</loc>The contents
+of an ignored conditional section are parsed by ignoring all characters after
+the "<code>[</code>" following the keyword, except conditional section starts
+"<code>&lt;![</code>" and ends "<code>]]&gt;</code>", until the matching conditional
+section end is found. Parameter entity references are not recognized in this
+process.</phrase></p>
+<p>If the keyword of the conditional section is a parameter-entity reference,
+the parameter entity must be replaced by its content before the processor
+decides whether to include or ignore the conditional section.</p>
+<p>An example:</p>
+<eg>&lt;!ENTITY % draft 'INCLUDE' >
+&lt;!ENTITY % final 'IGNORE' >
+
+&lt;![%draft;[
+&lt;!ELEMENT book (comments*, title, body, supplements?)>
+]]&gt;
+&lt;![%final;[
+&lt;!ELEMENT book (title, body, supplements?)>
+]]&gt;</eg>
+</div2>
+<!--
+<div2 id='sec-pass-to-app'>
+<head>XML Processor Treatment of Logical Structure</head>
+<p>When an XML processor encounters a start-tag, it must make
+at least the following information available to the application:
+<ulist>
+<item>
+<p>the element type's generic identifier</p>
+</item>
+<item>
+<p>the names of attributes known to apply to this element type
+(validating processors must make available names of all attributes
+declared for the element type; non-validating processors must
+make available at least the names of the attributes for which
+values are specified.
+</p>
+</item>
+</ulist>
+</p>
+</div2>
+-->
+</div1>
+<!-- &Entities; -->
+<div1 id="sec-physical-struct">
+<head>Physical Structures</head>
+<p><termdef id="dt-entity" term="Entity">An XML document may consist of one
+or many storage units. <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E6">[E6]</loc>These
+are called <term>entities</term>; they all have <term>content</term> and are
+all (except for the <termref def="dt-docent">document entity</termref> and
+the <termref def="dt-doctype">external DTD subset</termref>) identified by
+entity <term>name</term></phrase>.</termdef> Each XML document has one entity
+called the <termref def="dt-docent">document entity</termref>, which serves
+as the starting point for the <termref def="dt-xml-proc">XML processor</termref>
+and may contain the whole document.</p>
+<p>Entities may be either parsed or unparsed. <termdef id="dt-parsedent" term="Text Entity">A <term>parsed
+entity's</term> contents are referred to as its <termref def="dt-repltext">replacement
+text</termref>; this <termref def="dt-text">text</termref> is considered an
+integral part of the document.</termdef></p>
+<p><termdef id="dt-unparsed" term="Unparsed Entity">An <term>unparsed entity</term>
+is a resource whose contents may or may not be <termref def="dt-text">text</termref>,
+and if text, <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E25">[E25]</loc>may
+be other than</phrase> XML. Each unparsed entity has an associated <termref
+def="dt-notation">notation</termref>, identified by name. Beyond a requirement
+that an XML processor make the identifiers for the entity and notation available
+to the application, XML places no constraints on the contents of unparsed
+entities.</termdef></p>
+<p>Parsed entities are invoked by name using entity references; unparsed entities
+by name, given in the value of <kw>ENTITY</kw> or <kw>ENTITIES</kw> attributes.</p>
+<p><termdef id="gen-entity" term="general entity"><term>General entities</term>
+are entities for use within the document content. In this specification, general
+entities are sometimes referred to with the unqualified term <emph>entity</emph>
+when this leads to no ambiguity.</termdef> <termdef id="dt-PE" term="Parameter entity"><phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E53">[E53]</loc><term>Parameter
+entities</term></phrase> are parsed entities for use within the DTD.</termdef>
+These two types of entities use different forms of reference and are recognized
+in different contexts. Furthermore, they occupy different namespaces; a parameter
+entity and a general entity with the same name are two distinct entities.</p>
+<div2 id="sec-references">
+<head>Character and Entity References</head>
+<p><termdef id="dt-charref" term="Character Reference"> A <term>character
+reference</term> refers to a specific character in the ISO/IEC 10646 character
+set, for example one not directly accessible from available input devices.</termdef></p>
+<scrap lang="ebnf">
+<head>Character Reference</head>
+<prod id="NT-CharRef">
+<lhs>CharRef</lhs><rhs>'&amp;#' [0-9]+ ';' </rhs>
+<rhs>| '&hcro;' [0-9a-fA-F]+ ';'</rhs><wfc def="wf-Legalchar"/>
+</prod>
+</scrap>
+<wfcnote id="wf-Legalchar"><head>Legal Character</head><p>Characters referred
+to using character references must match the production for <termref def="NT-Char">Char</termref>.</p>
+</wfcnote>
+<p>If the character reference begins with <quote><code>&amp;#x</code></quote>,
+the digits and letters up to the terminating <code>;</code> provide a hexadecimal
+representation of the character's code point in ISO/IEC 10646. If it begins
+just with <quote><code>&amp;#</code></quote>, the digits up to the terminating <code>;</code>
+provide a decimal representation of the character's code point.</p>
+<p><termdef id="dt-entref" term="Entity Reference">An <term>entity reference</term>
+refers to the content of a named entity.</termdef> <termdef id="dt-GERef"
+term="General Entity Reference">References to parsed general entities use
+ampersand (<code>&amp;</code>) and semicolon (<code>;</code>) as delimiters.</termdef> <termdef
+id="dt-PERef" term="Parameter-entity reference"> <term>Parameter-entity references</term>
+use percent-sign (<code>%</code>) and semicolon (<code>;</code>) as delimiters.</termdef></p>
+<scrap lang="ebnf">
+<head>Entity Reference</head>
+<prod id="NT-Reference">
+<lhs>Reference</lhs><rhs><nt def="NT-EntityRef">EntityRef</nt> | <nt def="NT-CharRef">CharRef</nt></rhs>
+</prod>
+<prod id="NT-EntityRef">
+<lhs>EntityRef</lhs><rhs>'&amp;' <nt def="NT-Name">Name</nt> ';'</rhs><wfc
+def="wf-entdeclared"/><vc def="vc-entdeclared"/><wfc def="textent"/><wfc def="norecursion"/>
+</prod>
+<prod id="NT-PEReference">
+<lhs>PEReference</lhs><rhs>'%' <nt def="NT-Name">Name</nt> ';'</rhs><vc def="vc-entdeclared"/>
+<wfc def="norecursion"/><wfc def="indtd"/>
+</prod>
+</scrap>
+<wfcnote id="wf-entdeclared"><head>Entity Declared</head><p>In a document
+without any DTD, a document with only an internal DTD subset which contains
+no parameter entity references, or a document with <quote><code>standalone='yes'</code></quote>, <phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E34">[E34]</loc>for
+an entity reference that does not occur within the external subset or a parameter
+entity, the <nt def="NT-Name">Name</nt> given in the entity reference must <termref
+def="dt-match">match</termref> that in an <titleref href="#sec-entity-decl">entity
+declaration</titleref> that does not occur within the external subset or a
+parameter entity</phrase>, except that well-formed documents need not declare
+any of the following entities: &magicents;. <phrase diff="del"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E29">[E29]</loc>The declaration
+of a parameter entity must precede any reference to it. Similarly, </phrase>The
+declaration of a general entity must precede any reference to it which appears
+in a default value in an attribute-list declaration.</p>
+<p>Note that if entities are declared in the external subset or in external
+parameter entities, a non-validating processor is <titleref href="#include-if-valid">not
+obligated to</titleref> read and process their declarations; for such documents,
+the rule that an entity must be declared is a well-formedness constraint only
+if <titleref href="#sec-rmd">standalone='yes'</titleref>.</p>
+</wfcnote>
+<vcnote id="vc-entdeclared"><head>Entity Declared</head><p>In a document with
+an external subset or external parameter entities with <quote><code>standalone='no'</code></quote>,
+the <nt def="NT-Name">Name</nt> given in the entity reference must <termref
+def="dt-match">match</termref> that in an <titleref href="#sec-entity-decl">entity
+declaration</titleref>. For interoperability, valid documents should declare
+the entities &magicents;, in the form specified in <specref ref="sec-predefined-ent"/>.
+The declaration of a parameter entity must precede any reference to it. Similarly,
+the declaration of a general entity must precede any <phrase diff="chg"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E92">[E92]</loc>attribute-list
+declaration containing a default value with a direct or indirect reference
+to that general entity.</phrase></p>
+</vcnote>
+<!-- FINAL EDIT: is this duplication too clumsy? -->
+<wfcnote id="textent"><head>Parsed Entity</head><p>An entity reference must
+not contain the name of an <termref def="dt-unparsed">unparsed entity</termref>.
+Unparsed entities may be referred to only in <termref def="dt-attrval">attribute
+values</termref> declared to be of type <kw>ENTITY</kw> or <kw>ENTITIES</kw>.</p>
+</wfcnote>
+<wfcnote id="norecursion"><head>No Recursion</head><p>A parsed entity must
+not contain a recursive reference to itself, either directly or indirectly.</p>
+</wfcnote>
+<wfcnote id="indtd"><head>In DTD</head><p>Parameter-entity references may
+only appear in the <termref def="dt-doctype">DTD</termref>.</p>
+</wfcnote>
+<p>Examples of character and entity references:</p>
+<eg>Type &lt;key>less-than&lt;/key> (&hcro;3C;) to save options.
+This document was prepared on &amp;docdate; and
+is classified &amp;security-level;.</eg>
+<p>Example of a parameter-entity reference:</p>
+<eg><![CDATA[<!-- declare the parameter entity "ISOLat2"... -->
+<!ENTITY % ISOLat2
+ SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
+<!-- ... now reference it. -->
+%ISOLat2;]]></eg>
+</div2>
+<div2 id="sec-entity-decl">
+<head>Entity Declarations</head>
+<p><termdef id="dt-entdecl" term="entity declaration"> Entities are declared
+thus:</termdef></p>
+<scrap lang="ebnf">
+<head>Entity Declaration</head>
+<prodgroup pcw2="5" pcw4="18.5">
+<prod id="NT-EntityDecl">
+<lhs>EntityDecl</lhs><rhs><nt def="NT-GEDecl">GEDecl</nt><!--</rhs><com>General entities</com>
+<rhs>--> | <nt def="NT-PEDecl">PEDecl</nt></rhs>
+<!--<com>Parameter entities</com>-->
+</prod>
+<prod id="NT-GEDecl">
+<lhs>GEDecl</lhs><rhs>'&lt;!ENTITY' <nt def="NT-S">S</nt> <nt def="NT-Name">Name</nt> <nt
+def="NT-S">S</nt> <nt def="NT-EntityDef">EntityDef</nt> <nt def="NT-S">S</nt>?
+'>'</rhs>
+</prod>
+<prod id="NT-PEDecl">
+<lhs>PEDecl</lhs><rhs>'&lt;!ENTITY' <nt def="NT-S">S</nt> '%' <nt def="NT-S">S</nt> <nt
+def="NT-Name">Name</nt> <nt def="NT-S">S</nt> <nt def="NT-PEDef">PEDef</nt> <nt
+def="NT-S">S</nt>? '>'</rhs>
+<!--<com>Parameter entities</com>-->
+</prod>
+<prod id="NT-EntityDef">
+<lhs>EntityDef</lhs><rhs><nt def="NT-EntityValue">EntityValue</nt> <!--</rhs>
+<rhs>-->| (<nt def="NT-ExternalID">ExternalID</nt> <nt def="NT-NDataDecl">NDataDecl</nt>?)</rhs>
+<!-- <nt def='NT-ExternalDef'>ExternalDef</nt></rhs> -->
+</prod>
+<!-- FINAL EDIT: what happened to WFs here? -->
+<prod id="NT-PEDef">
+<lhs>PEDef</lhs><rhs><nt def="NT-EntityValue">EntityValue</nt> | <nt def="NT-ExternalID">ExternalID</nt></rhs>
+</prod>
+</prodgroup></scrap>
+<p>The <nt def="NT-Name">Name</nt> identifies the entity in an <termref def="dt-entref">entity
+reference</termref> or, in the case of an unparsed entity, in the value of
+an <kw>ENTITY</kw> or <kw>ENTITIES</kw> attribute. If the same entity is declared
+more than once, the first declaration encountered is binding; at user option,
+an XML processor may issue a warning if entities are declared multiple times.</p>
+<div3 id="sec-internal-ent">
+<head>Internal Entities</head>
+<p><termdef id="dt-internent" term="Internal Entity Replacement Text">If the
+entity definition is an <nt def="NT-EntityValue">EntityValue</nt>, the defined
+entity is called an <term>internal entity</term>. There is no separate physical
+storage object, and the content of the entity is given in the declaration.</termdef>
+Note that some processing of entity and character references in the <termref
+def="dt-litentval">literal entity value</termref> may be required to produce
+the correct <termref def="dt-repltext">replacement text</termref>: see <specref
+ref="intern-replacement"/>.</p>
+<p>An internal entity is a <termref def="dt-parsedent">parsed entity</termref>.</p>
+<p>Example of an internal entity declaration:</p>
+<eg>&lt;!ENTITY Pub-Status "This is a pre-release of the
+ specification."></eg>
+</div3>
+<div3 id="sec-external-ent">
+<head>External Entities</head>
+<p><termdef id="dt-extent" term="External Entity">If the entity is not internal,
+it is an <term>external entity</term>, declared as follows:</termdef></p>
+<scrap lang="ebnf">
+<head>External Entity Declaration</head>
+<!--
+<prod id='NT-ExternalDef'><lhs>ExternalDef</lhs>
+<rhs></prod> -->
+<prod id="NT-ExternalID">
+<lhs>ExternalID</lhs><rhs>'SYSTEM' <nt def="NT-S">S</nt> <nt def="NT-SystemLiteral">SystemLiteral</nt></rhs>
+<rhs>| 'PUBLIC' <nt def="NT-S">S</nt> <nt def="NT-PubidLiteral">PubidLiteral</nt> <nt
+def="NT-S">S</nt> <nt def="NT-SystemLiteral">SystemLiteral</nt> </rhs>
+</prod>
+<prod id="NT-NDataDecl">
+<lhs>NDataDecl</lhs><rhs><nt def="NT-S">S</nt> 'NDATA' <nt def="NT-S">S</nt> <nt
+def="NT-Name">Name</nt></rhs><vc def="not-declared"/>
+</prod>
+</scrap>
+<p>If the <nt def="NT-NDataDecl">NDataDecl</nt> is present, this is a general <termref
+def="dt-unparsed">unparsed entity</termref>; otherwise it is a parsed entity.</p>
+<vcnote id="not-declared"><head>Notation Declared</head><p>The <nt def="NT-Name">Name</nt>
+must match the declared name of a <termref def="dt-notation">notation</termref>.</p>
+</vcnote>
+<p><phrase diff="chg"><termdef id="dt-sysid" term="System Identifier">The <nt
+def="NT-SystemLiteral">SystemLiteral</nt> is called the entity's <term>system
+identifier</term>. It is a <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E88">[E88]</loc>URI
+reference</phrase><phrase diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E66">[E66]</loc>
+(as defined in <bibref ref="rfc2396"/>, updated by <bibref ref="rfc2732"/>)</phrase>, <loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E76">[E76]</loc>meant
+to be dereferenced to obtain input for the XML processor to construct the
+entity's replacement text.</termdef> It is an error for a fragment identifier
+(beginning with a <code>#</code> character) to be part of a system identifier.</phrase>
+Unless otherwise provided by information outside the scope of this specification
+(e.g. a special XML element type defined by a particular DTD, or a processing
+instruction defined by a particular application specification), relative URIs
+are relative to the location of the resource within which the entity declaration
+occurs. A URI might thus be relative to the <termref def="dt-docent">document
+entity</termref>, to the entity containing the <termref def="dt-doctype">external
+DTD subset</termref>, or to some other <termref def="dt-extent">external parameter
+entity</termref>.</p>
+<p diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E78">[E78]</loc>URI
+references require encoding and escaping of certain characters. The disallowed
+characters include all non-ASCII characters, plus the excluded characters
+listed in Section 2.4 of <bibref ref="rfc2396"/>, except for the number sign
+(<code>#</code>) and percent sign (<code>%</code>) characters and the square
+bracket characters re-allowed in <bibref ref="rfc2732"/>. Disallowed characters
+must be escaped as follows:</p>
+<olist diff="add">
+<item><p>Each disallowed character is converted to UTF-8 <bibref ref="rfc2279"/>
+as one or more bytes.</p></item>
+<item><p>Any octets corresponding to a disallowed character are escaped with
+the URI escaping mechanism (that is, converted to <code>%</code><var>HH</var>,
+where HH is the hexadecimal notation of the byte value).</p></item>
+<item><p>The original character is replaced by the resulting character sequence.</p>
+</item>
+</olist>
+<p><termdef id="dt-pubid" term="Public identifier"> In addition to a system
+identifier, an external identifier may include a <term>public identifier</term>.</termdef>
+An XML processor attempting to retrieve the entity's content may use the public
+identifier to try to generate an alternative <phrase diff="chg"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E88">[E88]</loc>URI reference</phrase>.
+If the processor is unable to do so, it must use the <phrase diff="chg"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E88">[E88]</loc>URI
+reference</phrase> specified in the system literal. Before a match is attempted,
+all strings of white space in the public identifier must be normalized to
+single space characters (#x20), and leading and trailing white space must
+be removed.</p>
+<p>Examples of external entity declarations:</p>
+<eg>&lt;!ENTITY open-hatch
+ SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml">
+&lt;!ENTITY open-hatch
+ PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN"
+ "http://www.textuality.com/boilerplate/OpenHatch.xml">
+&lt;!ENTITY hatch-pic
+ SYSTEM "../grafix/OpenHatch.gif"
+ NDATA gif ></eg>
+</div3>
+</div2>
+<div2 id="TextEntities">
+<head>Parsed Entities</head>
+<div3 id="sec-TextDecl">
+<head>The Text Declaration</head>
+<p>External parsed entities <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E107">[E107]</loc>should</phrase
+> each begin with a <term>text declaration</term>.</p>
+<scrap lang="ebnf">
+<head>Text Declaration</head>
+<prodgroup pcw4="12.5" pcw5="13">
+<prod id="NT-TextDecl">
+<lhs>TextDecl</lhs><rhs>&pio; <nt def="NT-VersionInfo">VersionInfo</nt>? <nt
+def="NT-EncodingDecl">EncodingDecl</nt> <nt def="NT-S">S</nt>? &pic;</rhs>
+</prod>
+</prodgroup></scrap>
+<p>The text declaration must be provided literally, not by reference to a
+parsed entity. No text declaration may appear at any position other than the
+beginning of an external parsed entity. <phrase diff="add"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E94">[E94]</loc>The text declaration
+in an external parsed entity is not considered part of its <termref def="dt-repltext">replacement
+text</termref>.</phrase></p>
+</div3>
+<div3 id="wf-entities">
+<head>Well-Formed Parsed Entities</head>
+<p>The document entity is well-formed if it matches the production labeled <nt
+def="NT-document">document</nt>. An external general parsed entity is well-formed
+if it matches the production labeled <nt def="NT-extParsedEnt">extParsedEnt</nt>. <phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E109">[E109]</loc>All
+external parameter entities are well-formed by definition.</phrase></p>
+<scrap lang="ebnf">
+<head>Well-Formed External Parsed Entity</head>
+<prod id="NT-extParsedEnt">
+<lhs>extParsedEnt</lhs><rhs><nt def="NT-TextDecl">TextDecl</nt>? <nt def="NT-content">content</nt></rhs>
+</prod>
+<prod id="NT-extPE" diff="del">
+<lhs>extPE</lhs><rhs><nt def="NT-TextDecl">TextDecl</nt>? <nt def="NT-extSubsetDecl">extSubsetDecl</nt></rhs>
+<com><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E109">[E109]</loc></com>
+</prod>
+</scrap>
+<p>An internal general parsed entity is well-formed if its replacement text
+matches the production labeled <nt def="NT-content">content</nt>. All internal
+parameter entities are well-formed by definition.</p>
+<p>A consequence of well-formedness in entities is that the logical and physical
+structures in an XML document are properly nested; no <termref def="dt-stag">start-tag</termref>, <termref
+def="dt-etag">end-tag</termref>, <termref def="dt-empty">empty-element tag</termref>, <termref
+def="dt-element">element</termref>, <termref def="dt-comment">comment</termref>, <termref
+def="dt-pi">processing instruction</termref>, <termref def="dt-charref">character
+reference</termref>, or <termref def="dt-entref">entity reference</termref>
+can begin in one entity and end in another.</p>
+</div3>
+<div3 id="charencoding">
+<head>Character Encoding in Entities</head>
+<p>Each external parsed entity in an XML document may use a different encoding
+for its characters. All XML processors must be able to read entities in <phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E56">[E56]</loc>both
+the UTF-8 and UTF-16 encodings.</phrase> <phrase diff="add"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E77">[E77]</loc>The terms <quote>UTF-8</quote>
+and <quote>UTF-16</quote> in this specification do not apply to character
+encodings with any other labels, even if the encodings or labels are very
+similar to UTF-8 or UTF-16.</phrase></p>
+<p>Entities encoded in UTF-16 must begin with the Byte Order Mark described
+by <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E67">[E67]</loc>Annex
+F of <bibref ref="ISO10646"/>, Annex H of <bibref ref="ISO10646-2000"/>, section
+2.4 of <bibref ref="Unicode"/>, and section 2.7 of <bibref ref="Unicode3"/></phrase>
+(the ZERO WIDTH NO-BREAK SPACE character, #xFEFF). This is an encoding signature,
+not part of either the markup or the character data of the XML document. XML
+processors must be able to use this character to differentiate between UTF-8
+and UTF-16 encoded documents.</p>
+<p>Although an XML processor is required to read only entities in the UTF-8
+and UTF-16 encodings, it is recognized that other encodings are used around
+the world, and it may be desired for XML processors to read entities that
+use them. <phrase diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E47">[E47]</loc>In
+the absence of external character encoding information (such as MIME headers),</phrase>
+parsed entities which are stored in an encoding other than UTF-8 or UTF-16
+must begin with a text declaration <phrase diff="add">(see <specref ref="sec-TextDecl"/>) </phrase>containing
+an encoding declaration:</p>
+<scrap lang="ebnf">
+<head>Encoding Declaration</head>
+<prod id="NT-EncodingDecl">
+<lhs>EncodingDecl</lhs><rhs><nt def="NT-S">S</nt> 'encoding' <nt def="NT-Eq">Eq</nt>
+('"' <nt def="NT-EncName">EncName</nt> '"' | "'" <nt def="NT-EncName">EncName</nt>
+"'" ) </rhs>
+</prod>
+<prod id="NT-EncName">
+<lhs>EncName</lhs><rhs>[A-Za-z] ([A-Za-z0-9._] | '-')*</rhs><com>Encoding
+name contains only Latin characters</com>
+</prod>
+</scrap>
+<p>In the <termref def="dt-docent">document entity</termref>, the encoding
+declaration is part of the <termref def="dt-xmldecl">XML declaration</termref>.
+The <nt def="NT-EncName">EncName</nt> is the name of the encoding used.</p>
+<!-- FINAL EDIT: check name of IANA and charset names -->
+<p>In an encoding declaration, the values <quote><code>UTF-8</code></quote>, <quote><code>UTF-16</code></quote>, <quote><code>ISO-10646-UCS-2</code
+></quote>, and <quote><code>ISO-10646-UCS-4</code></quote> should be used
+for the various encodings and transformations of Unicode / ISO/IEC 10646,
+the values <quote><code>ISO-8859-1</code></quote>, <quote><code>ISO-8859-2</code></quote>,
+... <loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E106">[E106]</loc><phrase
+diff="chg"><quote><code>ISO-8859-</code><var>n</var></quote> (where <var>n</var>
+is the part number)</phrase> should be used for the parts of ISO 8859, and
+the values <quote><code>ISO-2022-JP</code></quote>, <quote><code>Shift_JIS</code></quote>,
+and <quote><code>EUC-JP</code></quote> should be used for the various encoded
+forms of JIS X-0208-1997. <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E57">[E57]</loc>It
+is recommended that character encodings registered (as <emph>charset</emph>s)
+with the Internet Assigned Numbers Authority <phrase diff="chg"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E58">[E58]</loc><bibref ref="IANA"/></phrase>,
+other than those just listed, be referred to using their registered names;
+other encodings should use names starting with an <quote>x-</quote> prefix.
+XML processors should match character encoding names in a case-insensitive
+way and should either interpret an IANA-registered name as the encoding registered
+at IANA for that name or treat it as unknown (processors are, of course, not
+required to support all IANA-registered encodings).</phrase></p>
+<p>In the absence of information provided by an external transport protocol
+(e.g. HTTP or MIME), it is an <termref def="dt-error">error</termref> for
+an entity including an encoding declaration to be presented to the XML processor
+in an encoding other than that named in the declaration, <phrase diff="del"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E5">[E5]</loc>for
+an encoding declaration to occur other than at the beginning of an external
+entity, </phrase>or for an entity which begins with neither a Byte Order Mark
+nor an encoding declaration to use an encoding other than UTF-8. Note that
+since ASCII is a subset of UTF-8, ordinary ASCII entities do not strictly
+need an encoding declaration.</p>
+<p diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E5">[E5]</loc>It
+is <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E36">[E36]</loc>a
+fatal</phrase> error for a <nt def="NT-TextDecl">TextDecl</nt> to occur other
+than at the beginning of an external entity.</p>
+<p>It is a <termref def="dt-fatal">fatal error</termref> when an XML processor
+encounters an entity with an encoding that it is unable to process. <phrase
+diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E79">[E79]</loc>It
+is a fatal error if an XML entity is determined (via default, encoding declaration,
+or higher-level protocol) to be in a certain encoding but contains octet sequences
+that are not legal in that encoding. It is also a fatal error if an XML entity
+contains no encoding declaration and its content is not legal UTF-8 or UTF-16.</phrase></p>
+<p>Examples of <phrase diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E23">[E23]</loc>text
+declarations containing </phrase>encoding declarations:</p>
+<eg>&lt;?xml encoding='UTF-8'?>
+&lt;?xml encoding='EUC-JP'?></eg>
+</div3>
+</div2>
+<div2 id="entproc">
+<head>XML Processor Treatment of Entities and References</head>
+<p>The table below summarizes the contexts in which character references,
+entity references, and invocations of unparsed entities might appear and the
+required behavior of an <termref def="dt-xml-proc">XML processor</termref>
+in each case. The labels in the leftmost column describe the recognition context: <glist>
+<gitem><label>Reference in Content</label>
+<def>
+<p>as a reference anywhere after the <termref def="dt-stag">start-tag</termref>
+and before the <termref def="dt-etag">end-tag</termref> of an element; corresponds
+to the nonterminal <nt def="NT-content">content</nt>.</p>
+</def></gitem>
+<gitem><label>Reference in Attribute Value</label>
+<def>
+<p>as a reference within either the value of an attribute in a <termref def="dt-stag">start-tag</termref>,
+or a default value in an <termref def="dt-attdecl">attribute declaration</termref>;
+corresponds to the nonterminal <nt def="NT-AttValue">AttValue</nt>.</p>
+</def></gitem>
+<gitem><label>Occurs as Attribute Value</label>
+<def>
+<p>as a <nt def="NT-Name">Name</nt>, not a reference, appearing either as
+the value of an attribute which has been declared as type <kw>ENTITY</kw>,
+or as one of the space-separated tokens in the value of an attribute which
+has been declared as type <kw>ENTITIES</kw>.</p>
+</def></gitem>
+<gitem><label>Reference in Entity Value</label>
+<def>
+<p>as a reference within a parameter or internal entity's <termref def="dt-litentval">literal
+entity value</termref> in the entity's declaration; corresponds to the nonterminal <nt
+def="NT-EntityValue">EntityValue</nt>.</p>
+</def></gitem>
+<gitem><label>Reference in DTD</label>
+<def>
+<p diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E90">[E90]</loc>as
+a reference within either the internal or external subsets of the <termref
+def="dt-doctype">DTD</termref>, but outside of an <nt def="NT-EntityValue">EntityValue</nt>, <nt
+def="NT-AttValue">AttValue</nt>, <nt def="NT-PI">PI</nt>, <nt def="NT-Comment">Comment</nt>, <nt
+def="NT-SystemLiteral">SystemLiteral</nt>, <nt def="NT-PubidLiteral">PubidLiteral</nt>,
+or the contents of an ignored conditional section (see <specref ref="sec-condition-sect"/>).</p>
+<p>.</p>
+</def></gitem>
+</glist></p>
+<table border="1" frame="border" cellpadding="7"><tbody align="center"><tr>
+<td rowspan="2" colspan="1"></td><td colspan="4" align="center" valign="bottom">Entity
+Type</td><td rowspan="2" align="center">Character</td></tr><tr align="center"
+valign="bottom"><td>Parameter</td><td>Internal General</td><td>External Parsed
+General</td><td>Unparsed</td></tr><tr align="center" valign="middle"><td align="right">Reference
+in Content</td><td><titleref href="#not-recognized">Not recognized</titleref></td>
+<td><titleref href="#included">Included</titleref></td><td><titleref href="#include-if-valid">Included
+if validating</titleref></td><td><titleref href="#forbidden">Forbidden</titleref></td>
+<td><titleref href="#included">Included</titleref></td></tr><tr align="center"
+valign="middle"><td align="right">Reference in Attribute Value</td><td><titleref
+href="#not-recognized">Not recognized</titleref></td><td><titleref href="#inliteral">Included
+in literal</titleref></td><td><titleref href="#forbidden">Forbidden</titleref></td>
+<td><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E51">[E51]</loc><titleref
+diff="chg" href="#forbidden">Forbidden</titleref></td><td><titleref href="#included">Included</titleref></td>
+</tr><tr align="center" valign="middle"><td align="right">Occurs as Attribute
+Value</td><td><titleref href="#not-recognized">Not recognized</titleref></td>
+<td><titleref href="#forbidden">Forbidden</titleref></td><td><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E51">[E51]</loc><titleref
+diff="chg" href="#forbidden">Forbidden</titleref></td><td><titleref href="#notify">Notify</titleref></td>
+<td><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E51">[E51]</loc><titleref
+diff="chg" href="#not-recognized">Not recognized</titleref></td></tr><tr align="center"
+valign="middle"><td align="right">Reference in EntityValue</td><td><titleref
+href="#inliteral">Included in literal</titleref></td><td><titleref href="#bypass">Bypassed</titleref></td>
+<td><titleref href="#bypass">Bypassed</titleref></td><td><titleref href="#forbidden">Forbidden</titleref></td>
+<td><titleref href="#included">Included</titleref></td></tr><tr align="center"
+valign="middle"><td align="right">Reference in DTD</td><td><titleref href="#as-PE">Included
+as PE</titleref></td><td><titleref href="#forbidden">Forbidden</titleref></td>
+<td><titleref href="#forbidden">Forbidden</titleref></td><td><titleref href="#forbidden">Forbidden</titleref></td>
+<td><titleref href="#forbidden">Forbidden</titleref></td></tr></tbody></table>
+<div3 id="not-recognized">
+<head>Not Recognized</head>
+<p>Outside the DTD, the <code>%</code> character has no special significance;
+thus, what would be parameter entity references in the DTD are not recognized
+as markup in <nt def="NT-content">content</nt>. Similarly, the names of unparsed
+entities are not recognized except when they appear in the value of an appropriately
+declared attribute.</p>
+</div3>
+<div3 id="included">
+<head>Included</head>
+<p><termdef id="dt-include" term="Include">An entity is <term>included</term>
+when its <termref def="dt-repltext">replacement text</termref> is retrieved
+and processed, in place of the reference itself, as though it were part of
+the document at the location the reference was recognized.</termdef> The replacement
+text may contain both <termref def="dt-chardata">character data</termref>
+and (except for parameter entities) <termref def="dt-markup">markup</termref>,
+which must be recognized in the usual way<phrase diff="del"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E65">[E65]</loc>, except that
+the replacement text of entities used to escape markup delimiters (the entities &magicents;)
+is always treated as data</phrase>. (The string <quote><code>AT&amp;amp;T;</code></quote>
+expands to <quote><code>AT&amp;T;</code></quote> and the remaining ampersand
+is not recognized as an entity-reference delimiter.) A character reference
+is <term>included</term> when the indicated character is processed in place
+of the reference itself. </p>
+</div3>
+<div3 id="include-if-valid">
+<head>Included If Validating</head>
+<p>When an XML processor recognizes a reference to a parsed entity, in order
+to <termref def="dt-valid">validate</termref> the document, the processor
+must <termref def="dt-include">include</termref> its replacement text. If
+the entity is external, and the processor is not attempting to validate the
+XML document, the processor <termref def="dt-may">may</termref>, but need
+not, include the entity's replacement text. If a non-validating <phrase diff="chg"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E95">[E95]</loc>processor</phrase>
+does not include the replacement text, it must inform the application that
+it recognized, but did not read, the entity.</p>
+<p>This rule is based on the recognition that the automatic inclusion provided
+by the SGML and XML entity mechanism, primarily designed to support modularity
+in authoring, is not necessarily appropriate for other applications, in particular
+document browsing. Browsers, for example, when encountering an external parsed
+entity reference, might choose to provide a visual indication of the entity's
+presence and retrieve it for display only on demand.</p>
+</div3>
+<div3 id="forbidden">
+<head>Forbidden</head>
+<p>The following are forbidden, and constitute <termref def="dt-fatal">fatal</termref>
+errors:</p>
+<ulist>
+<item><p>the appearance of a reference to an <termref def="dt-unparsed">unparsed
+entity</termref>.</p></item>
+<item><p>the appearance of any character or general-entity reference in the
+DTD except within an <nt def="NT-EntityValue">EntityValue</nt> or <nt def="NT-AttValue">AttValue</nt>.</p>
+</item>
+<item><p>a reference to an external entity in an attribute value.</p></item>
+</ulist>
+</div3>
+<div3 id="inliteral">
+<head>Included in Literal</head>
+<p>When an <termref def="dt-entref">entity reference</termref> appears in
+an attribute value, or a parameter entity reference appears in a literal entity
+value, its <termref def="dt-repltext">replacement text</termref> is processed
+in place of the reference itself as though it were part of the document at
+the location the reference was recognized, except that a single or double
+quote character in the replacement text is always treated as a normal data
+character and will not terminate the literal. For example, this is well-formed:</p>
+<eg diff="chg">&lt;!-- <loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E4">[E4]</loc> -->
+<![CDATA[<!ENTITY % YN '"Yes"' >
+<!ENTITY WhatHeSaid "He said %YN;" >]]></eg>
+<p>while this is not:</p>
+<eg>&lt;!ENTITY EndAttr "27'" >
+&lt;element attribute='a-&amp;EndAttr;></eg>
+</div3>
+<div3 id="notify">
+<head>Notify</head>
+<p>When the name of an <termref def="dt-unparsed">unparsed entity</termref>
+appears as a token in the value of an attribute of declared type <kw>ENTITY</kw>
+or <kw>ENTITIES</kw>, a validating processor must inform the application of
+the <termref def="dt-sysid">system</termref> and <termref def="dt-pubid">public</termref>
+(if any) identifiers for both the entity and its associated <termref def="dt-notation">notation</termref>.</p>
+</div3>
+<div3 id="bypass">
+<head>Bypassed</head>
+<p>When a general entity reference appears in the <nt def="NT-EntityValue">EntityValue</nt>
+in an entity declaration, it is bypassed and left as is.</p>
+</div3>
+<div3 id="as-PE">
+<head>Included as PE</head>
+<p>Just as with external parsed entities, parameter entities need only be <titleref
+href="#include-if-valid">included if validating</titleref>. When a parameter-entity
+reference is recognized in the DTD and included, its <termref def="dt-repltext">replacement
+text</termref> is enlarged by the attachment of one leading and one following
+space (#x20) character; the intent is to constrain the replacement text of
+parameter entities to contain an integral number of grammatical tokens in
+the DTD. <phrase diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E96">[E96]</loc>This
+behavior does not apply to parameter entity references within entity values;
+these are described in <specref ref="inliteral"/>.</phrase></p>
+</div3>
+</div2>
+<div2 id="intern-replacement">
+<head>Construction of Internal Entity Replacement Text</head>
+<p>In discussing the treatment of internal entities, it is useful to distinguish
+two forms of the entity's value. <termdef id="dt-litentval" term="Literal Entity Value">The <term>literal
+entity value</term> is the quoted string actually present in the entity declaration,
+corresponding to the non-terminal <nt def="NT-EntityValue">EntityValue</nt>.</termdef> <termdef
+id="dt-repltext" term="Replacement Text">The <term>replacement text</term>
+is the content of the entity, after replacement of character references and
+parameter-entity references.</termdef></p>
+<p>The literal entity value as given in an internal entity declaration (<nt
+def="NT-EntityValue">EntityValue</nt>) may contain character, parameter-entity,
+and general-entity references. Such references must be contained entirely
+within the literal entity value. The actual replacement text that is <termref
+def="dt-include">included</termref> as described above must contain the <emph>replacement
+text</emph> of any parameter entities referred to, and must contain the character
+referred to, in place of any character references in the literal entity value;
+however, general-entity references must be left as-is, unexpanded. For example,
+given the following declarations:</p>
+<eg><![CDATA[<!ENTITY % pub "&#xc9;ditions Gallimard" >
+<!ENTITY rights "All rights reserved" >
+<!ENTITY book "La Peste: Albert Camus,
+&#xA9; 1947 %pub;. &rights;" >]]></eg>
+<p>then the replacement text for the entity <quote><code>book</code></quote>
+is:</p>
+<eg>La Peste: Albert Camus,
+© 1947 Éditions Gallimard. &amp;rights;</eg>
+<p>The general-entity reference <quote><code>&amp;rights;</code></quote> would
+be expanded should the reference <quote><code>&amp;book;</code></quote> appear
+in the document's content or an attribute value.</p>
+<p>These simple rules may have complex interactions; for a detailed discussion
+of a difficult example, see <specref ref="sec-entexpand"/>.</p>
+</div2>
+<div2 id="sec-predefined-ent">
+<head>Predefined Entities</head>
+<p><termdef id="dt-escape" term="escape">Entity and character references can
+both be used to <term>escape</term> the left angle bracket, ampersand, and
+other delimiters. A set of general entities (&magicents;) is specified for
+this purpose. Numeric character references may also be used; they are expanded
+immediately when recognized and must be treated as character data, so the
+numeric character references <quote><code>&amp;#60;</code></quote> and <quote><code>&amp;#38;</code></quote>
+may be used to escape <code>&lt;</code> and <code>&amp;</code> when they occur
+in character data.</termdef></p>
+<p>All XML processors must recognize these entities whether they are declared
+or not. <termref def="dt-interop">For interoperability</termref>, valid XML
+documents should declare these entities, like any others, before using them. <phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E80">[E80]</loc>If
+the entities <code>lt</code> or <code>amp</code> are declared, they must be
+declared as internal entities whose replacement text is a character reference
+to the <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E103">[E103]</loc>respective
+character (less-than sign or ampersand)</phrase> being escaped; the double
+escaping is required for these entities so that references to them produce
+a well-formed result. If the entities <code>gt</code>, <code>apos</code>,
+or <code>quot</code> are declared, they must be declared as internal entities
+whose replacement text is the single character being escaped (or a character
+reference to that character; the double escaping here is unnecessary but harmless).
+For example:</phrase></p>
+<eg><![CDATA[<!ENTITY lt "&#38;#60;">
+<!ENTITY gt "&#62;">
+<!ENTITY amp "&#38;#38;">
+<!ENTITY apos "&#39;">
+<!ENTITY quot "&#34;">]]></eg>
+<p diff="del">Note that the <code>&lt;</code> and <code>&amp;</code> characters
+in the declarations of <quote><code>lt</code></quote> and <quote><code>amp</code></quote>
+are doubly escaped to meet the requirement that entity replacement be well-formed.</p>
+</div2>
+<div2 id="Notations">
+<head>Notation Declarations</head>
+<p><termdef id="dt-notation" term="Notation"><term>Notations</term> identify
+by name the format of <termref def="dt-extent">unparsed entities</termref>,
+the format of elements which bear a notation attribute, or the application
+to which a <termref def="dt-pi">processing instruction</termref> is addressed.</termdef></p>
+<p><termdef id="dt-notdecl" term="Notation Declaration"> <term>Notation declarations</term>
+provide a name for the notation, for use in entity and attribute-list declarations
+and in attribute specifications, and an external identifier for the notation
+which may allow an XML processor or its client application to locate a helper
+application capable of processing data in the given notation.</termdef></p>
+<scrap lang="ebnf">
+<head>Notation Declarations</head>
+<prod id="NT-NotationDecl">
+<lhs>NotationDecl</lhs><rhs>'&lt;!NOTATION' <nt def="NT-S">S</nt> <nt def="NT-Name">Name</nt> <nt
+def="NT-S">S</nt> (<nt def="NT-ExternalID">ExternalID</nt> | <nt def="NT-PublicID">PublicID</nt>) <nt
+def="NT-S">S</nt>? '>'</rhs><vc def="UniqueNotationName" diff="add"/>
+</prod>
+<prod id="NT-PublicID">
+<lhs>PublicID</lhs><rhs>'PUBLIC' <nt def="NT-S">S</nt> <nt def="NT-PubidLiteral">PubidLiteral</nt> </rhs>
+</prod>
+</scrap>
+<vcnote id="UniqueNotationName" diff="add"><head><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E22">[E22]</loc>Unique
+Notation Name</head><p>Only one notation declaration can declare a given <nt
+def="NT-Name">Name</nt>.</p>
+</vcnote>
+<p>XML processors must provide applications with the name and external identifier(s)
+of any notation declared and referred to in an attribute value, attribute
+definition, or entity declaration. They may additionally resolve the external
+identifier into the <termref def="dt-sysid">system identifier</termref>, file
+name, or other information needed to allow the application to call a processor
+for data in the notation described. (It is not an error, however, for XML
+documents to declare and refer to notations for which notation-specific applications
+are not available on the system where the XML processor or application is
+running.)</p>
+</div2>
+<div2 id="sec-doc-entity">
+<head>Document Entity</head>
+<p><termdef id="dt-docent" term="Document Entity">The <term>document entity</term>
+serves as the root of the entity tree and a starting-point for an <termref
+def="dt-xml-proc">XML processor</termref>.</termdef> This specification does
+not specify how the document entity is to be located by an XML processor;
+unlike other entities, the document entity has no name and might well appear
+on a processor input stream without any identification at all.</p>
+</div2>
+</div1>
+<!-- &Conformance; -->
+<div1 id="sec-conformance">
+<head>Conformance</head>
+<div2 id="proc-types">
+<head>Validating and Non-Validating Processors</head>
+<p>Conforming <termref def="dt-xml-proc">XML processors</termref> fall into
+two classes: validating and non-validating.</p>
+<p>Validating and non-validating processors alike must report violations of
+this specification's well-formedness constraints in the content of the <termref
+def="dt-docent">document entity</termref> and any other <termref def="dt-parsedent">parsed
+entities</termref> that they read.</p>
+<p><termdef id="dt-validating" term="Validating Processor"><term>Validating
+processors</term> must<phrase diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E21">[E21]</loc>,
+at user option,</phrase> report violations of the constraints expressed by
+the declarations in the <termref def="dt-doctype">DTD</termref>, and failures
+to fulfill the validity constraints given in this specification.</termdef>
+To accomplish this, validating XML processors must read and process the entire
+DTD and all external parsed entities referenced in the document.</p>
+<p>Non-validating processors are required to check only the <termref def="dt-docent">document
+entity</termref>, including the entire internal DTD subset, for well-formedness. <termdef
+id="dt-use-mdecl" term="Process Declarations"> While they are not required
+to check the document for validity, they are required to <term>process</term>
+all the declarations they read in the internal DTD subset and in any parameter
+entity that they read, up to the first reference to a parameter entity that
+they do <emph>not</emph> read; that is to say, they must use the information
+in those declarations to <titleref href="#AVNormalize">normalize</titleref>
+attribute values, <titleref href="#included">include</titleref> the replacement
+text of internal entities, and supply <titleref href="#sec-attr-defaults">default
+attribute values</titleref>.</termdef> <phrase diff="add"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E33">[E33]</loc>Except when <code>standalone="yes"</code>, </phrase>they
+must not <termref def="dt-use-mdecl">process</termref> <termref def="dt-entdecl">entity
+declarations</termref> or <termref def="dt-attdecl">attribute-list declarations</termref>
+encountered after a reference to a parameter entity that is not read, since
+the entity may have contained overriding declarations.</p>
+</div2>
+<div2 id="safe-behavior">
+<head>Using XML Processors</head>
+<p>The behavior of a validating XML processor is highly predictable; it must
+read every piece of a document and report all well-formedness and validity
+violations. Less is required of a non-validating processor; it need not read
+any part of the document other than the document entity. This has two effects
+that may be important to users of XML processors:</p>
+<ulist>
+<item><p>Certain well-formedness errors, specifically those that require reading
+external entities, may not be detected by a non-validating processor. Examples
+include the constraints entitled <titleref href="#wf-entdeclared">Entity Declared</titleref>, <titleref
+href="#textent">Parsed Entity</titleref>, and <titleref href="#norecursion">No
+Recursion</titleref>, as well as some of the cases described as <titleref
+href="#forbidden">forbidden</titleref> in <specref ref="entproc"/>.</p></item>
+<item><p>The information passed from the processor to the application may
+vary, depending on whether the processor reads parameter and external entities.
+For example, a non-validating processor may not <titleref href="#AVNormalize">normalize</titleref>
+attribute values, <titleref href="#included">include</titleref> the replacement
+text of internal entities, or supply <titleref href="#sec-attr-defaults">default
+attribute values</titleref>, where doing so depends on having read declarations
+in external or parameter entities.</p></item>
+</ulist>
+<p>For maximum reliability in interoperating between different XML processors,
+applications which use non-validating processors should not rely on any behaviors
+not required of such processors. Applications which require facilities such
+as the use of default attributes or internal entities which are declared in
+external entities should use validating XML processors.</p>
+</div2>
+</div1>
+<div1 id="sec-notation">
+<head>Notation</head>
+<p>The formal grammar of XML is given in this specification using a simple
+Extended Backus-Naur Form (EBNF) notation. Each rule in the grammar defines
+one symbol, in the form</p>
+<eg>symbol ::= expression</eg>
+<p>Symbols are written with an initial capital letter if they are <phrase
+diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E42">[E42]</loc>the
+start symbol of a regular language,</phrase> otherwise with an initial lower
+case letter. Literal strings are quoted.</p>
+<p>Within the expression on the right-hand side of a rule, the following expressions
+are used to match strings of one or more characters: <glist>
+<gitem><label><code>#xN</code></label>
+<def>
+<p>where <code>N</code> is a hexadecimal integer, the expression matches the
+character in ISO/IEC 10646 whose canonical (UCS-4) code value, when interpreted
+as an unsigned binary number, has the value indicated. The number of leading
+zeros in the <code>#xN</code> form is insignificant; the number of leading
+zeros in the corresponding code value is governed by the character encoding
+in use and is not significant for XML.</p>
+</def></gitem>
+<gitem><label><code>[a-zA-Z]</code>, <code>[#xN-#xN]</code></label>
+<def>
+<p>matches any <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E93">[E93]</loc><nt
+def="NT-Char">Char</nt></phrase> with a value in the range(s) indicated (inclusive).</p>
+</def></gitem>
+<gitem diff="add"><label><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E3">[E3]</loc><code>[abc]</code>, <code>[#xN#xN#xN]</code
+></label>
+<def>
+<p>matches any <nt def="NT-Char">Char</nt> with a value among the characters
+enumerated. Enumerations and ranges can be mixed in one set of brackets.</p>
+</def></gitem>
+<gitem><label><code>[^a-z]</code>, <code>[^#xN-#xN]</code></label>
+<def>
+<p>matches any <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E93">[E93]</loc><nt
+def="NT-Char">Char</nt></phrase> with a value <emph>outside</emph> the range
+indicated.</p>
+</def></gitem>
+<gitem><label><code>[^abc]</code>, <code>[^#xN#xN#xN]</code></label>
+<def>
+<p>matches any <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E93">[E93]</loc><nt
+def="NT-Char">Char</nt></phrase> with a value not among the characters given. <phrase
+diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E3">[E3]</loc>Enumerations
+and ranges of forbidden values can be mixed in one set of brackets.</phrase></p>
+</def></gitem>
+<gitem><label><code>"string"</code></label>
+<def>
+<p>matches a literal string <termref def="dt-match">matching</termref> that
+given inside the double quotes.</p>
+</def></gitem>
+<gitem><label><code>'string'</code></label>
+<def>
+<p>matches a literal string <termref def="dt-match">matching</termref> that
+given inside the single quotes.</p>
+</def></gitem>
+</glist> These symbols may be combined to match more complex patterns as follows,
+where <code>A</code> and <code>B</code> represent simple expressions: <glist>
+<gitem><label>(<code>expression</code>)</label>
+<def>
+<p><code>expression</code> is treated as a unit and may be combined as described
+in this list.</p>
+</def></gitem>
+<gitem><label><code>A?</code></label>
+<def>
+<p>matches <code>A</code> or nothing; optional <code>A</code>.</p>
+</def></gitem>
+<gitem><label><code>A B</code></label>
+<def>
+<p>matches <code>A</code> followed by <code>B</code>. <phrase diff="add"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E20">[E20]</loc>This
+operator has higher precedence than alternation; thus <code>A B | C D</code>
+is identical to <code>(A B) | (C D)</code>.</phrase></p>
+</def></gitem>
+<gitem><label><code>A | B</code></label>
+<def>
+<p>matches <code>A</code> or <code>B</code> but not both.</p>
+</def></gitem>
+<gitem><label><code>A - B</code></label>
+<def>
+<p>matches any string that matches <code>A</code> but does not match <code>B</code>.</p>
+</def></gitem>
+<gitem><label><code>A+</code></label>
+<def>
+<p>matches one or more occurrences of <code>A</code>.<phrase diff="add"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E20">[E20]</loc>Concatenation
+has higher precedence than alternation; thus <code>A+ | B+</code> is identical
+to <code>(A+) | (B+)</code>.</phrase></p>
+</def></gitem>
+<gitem><label><code>A*</code></label>
+<def>
+<p>matches zero or more occurrences of <code>A</code>. <phrase diff="add"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E20">[E20]</loc>Concatenation
+has higher precedence than alternation; thus <code>A* | B*</code> is identical
+to <code>(A*) | (B*)</code>.</phrase></p>
+</def></gitem>
+</glist> Other notations used in the productions are: <glist>
+<gitem><label><code>/* ... */</code></label>
+<def>
+<p>comment.</p>
+</def></gitem>
+<gitem><label><code>[ wfc: ... ]</code></label>
+<def>
+<p>well-formedness constraint; this identifies by name a constraint on <termref
+def="dt-wellformed">well-formed</termref> documents associated with a production.</p>
+</def></gitem>
+<gitem><label><code>[ vc: ... ]</code></label>
+<def>
+<p>validity constraint; this identifies by name a constraint on <termref def="dt-valid">valid</termref>
+documents associated with a production.</p>
+</def></gitem>
+</glist></p>
+</div1>
+</body><back>
+<!-- &SGML; -->
+<!-- &Biblio; -->
+<div1 id="sec-bibliography">
+<head>References</head>
+<div2 id="sec-existing-stds">
+<head>Normative References</head>
+<blist>
+<bibl id="IANA" diff="chg" key="IANA-CHARSETS"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E58">[E58]</loc>(Internet
+Assigned Numbers Authority) <titleref>Official Names for Character Sets</titleref>,
+ed. Keld Simonsen et al. See <loc href="ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets">ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets</loc
+>. </bibl>
+<bibl id="RFC1766" href="http://www.ietf.org/rfc/rfc1766.txt" key="IETF RFC 1766">IETF
+(Internet Engineering Task Force). <titleref>RFC 1766: Tags for the Identification
+of Languages</titleref>, ed. H. Alvestrand. 1995.</bibl>
+<bibl id="ISO639-old" diff="del" key="ISO 639"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E38">[E38]</loc>
+(International Organization for Standardization). <titleref>ISO 639:1988 (E).
+Code for the representation of names of languages.</titleref> [Geneva]: International
+Organization for Standardization, 1988.</bibl>
+<bibl id="ISO3166-old" diff="del" key="ISO 3166"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E38">[E38]</loc>
+(International Organization for Standardization). <titleref>ISO 3166-1:1997
+(E). Codes for the representation of names of countries and their subdivisions &mdash;
+Part 1: Country codes</titleref> [Geneva]: International Organization for
+Standardization, 1997.</bibl>
+<bibl id="ISO10646" key="ISO/IEC 10646">ISO (International Organization for
+Standardization). <titleref>ISO/IEC 10646-1993 (E). Information technology &mdash;
+Universal Multiple-Octet Coded Character Set (UCS) &mdash; Part 1: Architecture
+and Basic Multilingual Plane.</titleref> [Geneva]: International Organization
+for Standardization, 1993 (plus amendments AM 1 through AM 7).</bibl>
+<bibl id="ISO10646-2000" diff="add" key="ISO/IEC 10646-2000"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E67">[E67]</loc> ISO (International
+Organization for Standardization). <titleref>ISO/IEC 10646-1:2000. Information
+technology &mdash; Universal Multiple-Octet Coded Character Set (UCS) &mdash;
+Part 1: Architecture and Basic Multilingual Plane.</titleref> [Geneva]: International
+Organization for Standardization, 2000.</bibl>
+<bibl id="Unicode" key="Unicode">The Unicode Consortium. <emph>The Unicode
+Standard, Version 2.0.</emph> Reading, Mass.: Addison-Wesley Developers Press,
+1996.</bibl>
+<bibl id="Unicode3" diff="add" key="Unicode3"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E67">[E67]</loc>
+The Unicode Consortium. <emph>The Unicode Standard, Version 3.0.</emph> Reading,
+Mass.: Addison-Wesley Developers Press, 2000. ISBN 0-201-61633-5.</bibl>
+</blist></div2>
+<div2 id="null">
+<!--
+ID made "null" to match its previous value in the First
+Edition; it's odd, but if there's no set value, the stylesheet
+currently generates an odd string that would be backwards
+incompatible with any references anyone might have made before.
+-->
+<head>Other References</head>
+<blist>
+<bibl id="Aho" key="Aho/Ullman">Aho, Alfred V., Ravi Sethi, and Jeffrey D.
+Ullman. <titleref>Compilers: Principles, Techniques, and Tools</titleref>.
+Reading: Addison-Wesley, 1986, rpt. corr. 1988.</bibl>
+<bibl id="Berners-Lee" key="Berners-Lee et al."> Berners-Lee, T., R. Fielding,
+and L. Masinter. <titleref>Uniform Resource Identifiers (URI): Generic Syntax
+and Semantics</titleref>. 1997. (Work in progress; see updates to RFC1738.)</bibl>
+<bibl id="ABK" diff="chg" key="Brüggemann-Klein"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E2">[E2]</loc>Brüggemann-Klein,
+Anne. Formal Models in Document Processing. Habilitationsschrift. Faculty
+of Mathematics at the University of Freiburg, 1993. (See <loc href="ftp://ftp.informatik.uni-freiburg.de/documents/papers/brueggem/habil.ps">ftp://ftp.informatik.uni-freiburg.de/documents/papers/brueggem/habil.ps</loc
+>.)</bibl>
+<bibl id="ABKDW" diff="chg" key="Brüggemann-Klein and Wood"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E2">[E2]</loc>Brüggemann-Klein,
+Anne, and Derick Wood. <titleref>Deterministic Regular Languages</titleref>.
+Universität Freiburg, Institut für Informatik, Bericht 38, Oktober 1991. Extended
+abstract in A. Finkel, M. Jantzen, Hrsg., STACS 1992, S. 173-184. Springer-Verlag,
+Berlin 1992. Lecture Notes in Computer Science 577. Full version titled <titleref>One-Unambiguous
+Regular Languages</titleref> in Information and Computation 140 (2): 229-253,
+February 1998.</bibl>
+<bibl id="Clark" key="Clark">James Clark. Comparison of SGML and XML. See <loc
+href="http://www.w3.org/TR/NOTE-sgml-xml-971215">http://www.w3.org/TR/NOTE-sgml-xml-971215</loc>. </bibl>
+<bibl id="IANA-LANGCODES" diff="add" href="http://www.isi.edu/in-notes/iana/assignments/languages/"
+key="IANA-LANGCODES"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E58">[E58]</loc>(Internet
+Assigned Numbers Authority) <titleref>Registry of Language Tags</titleref>,
+ed. Keld Simonsen et al.</bibl>
+<bibl id="RFC1738" diff="del" href="http://www.ietf.org/rfc/rfc1738.txt" key="IETF RFC1738">IETF
+(Internet Engineering Task Force). <titleref>RFC 1738: Uniform Resource Locators
+(URL)</titleref>, ed. T. Berners-Lee, L. Masinter, M. McCahill. 1994. </bibl>
+<bibl id="RFC1808" diff="del" href="http://www.ietf.org/rfc/rfc1808.txt" key="IETF RFC1808">IETF
+(Internet Engineering Task Force). <titleref>RFC 1808: Relative Uniform Resource
+Locators</titleref>, ed. R. Fielding. 1995. </bibl>
+<bibl id="RFC2141" href="http://www.ietf.org/rfc/rfc2141.txt" key="IETF RFC2141">IETF
+(Internet Engineering Task Force). <emph>RFC 2141: URN Syntax</emph>, ed.
+R. Moats. 1997. </bibl>
+<bibl id="rfc2279" diff="add" href="http://www.ietf.org/rfc/rfc2279.txt" key="IETF RFC 2279"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E78">[E78]</loc>IETF
+(Internet Engineering Task Force). <titleref>RFC 2279: UTF-8, a transformation
+format of ISO 10646</titleref>, <phrase diff="add">ed. F. Yergeau, </phrase>1998.</bibl>
+<bibl id="rfc2376" diff="add" href="http://www.ietf.org/rfc/rfc2376.txt" key="IETF RFC 2376"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E48">[E48]</loc>IETF
+(Internet Engineering Task Force). <titleref>RFC 2376: XML Media Types</titleref>.
+ed. E. Whitehead, M. Murata. 1998.</bibl>
+<bibl id="rfc2396" diff="add" href="http://www.ietf.org/rfc/rfc2396.txt" key="IETF RFC 2396"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E66">[E66]</loc>IETF
+(Internet Engineering Task Force). <titleref>RFC 2396: Uniform Resource Identifiers
+(URI): Generic Syntax</titleref>. T. Berners-Lee, R. Fielding, L. Masinter.
+1998.</bibl>
+<bibl id="rfc2732" diff="add" href="http://www.ietf.org/rfc/rfc2732.txt" key="IETF RFC 2732"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E66">[E66]</loc>IETF
+(Internet Engineering Task Force). <titleref>RFC 2732: Format for Literal
+IPv6 Addresses in URL's</titleref>. R. Hinden, B. Carpenter, L. Masinter.
+1999.</bibl>
+<bibl id="rfc2781" diff="add" href="http://www.ietf.org/rfc/rfc2781.txt" key="IETF RFC 2781"><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E77">[E77]</loc>
+IETF (Internet Engineering Task Force). <emph>RFC 2781: UTF-16, an encoding
+of ISO 10646</emph>, ed. P. Hoffman, F. Yergeau. 2000.</bibl>
+<bibl id="ISO639" diff="add" key="ISO 639"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E38">[E38]</loc>
+(International Organization for Standardization). <titleref>ISO 639:1988 (E).
+Code for the representation of names of languages.</titleref> [Geneva]: International
+Organization for Standardization, 1988.</bibl>
+<bibl id="ISO3166" diff="add" key="ISO 3166"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E38">[E38]</loc>
+(International Organization for Standardization). <titleref>ISO 3166-1:1997
+(E). Codes for the representation of names of countries and their subdivisions &mdash;
+Part 1: Country codes</titleref> [Geneva]: International Organization for
+Standardization, 1997.</bibl>
+<bibl id="ISO8879" key="ISO 8879">ISO (International Organization for Standardization). <titleref>ISO
+8879:1986(E). Information processing &mdash; Text and Office Systems &mdash;
+Standard Generalized Markup Language (SGML).</titleref> First edition &mdash;
+1986-10-15. [Geneva]: International Organization for Standardization, 1986. </bibl>
+<bibl id="ISO10744" key="ISO/IEC 10744">ISO (International Organization for
+Standardization). <titleref>ISO/IEC 10744-1992 (E). Information technology &mdash;
+Hypermedia/Time-based Structuring Language (HyTime). </titleref> [Geneva]:
+International Organization for Standardization, 1992. <emph>Extended Facilities
+Annexe.</emph> [Geneva]: International Organization for Standardization, 1996. </bibl>
+<bibl id="websgml" diff="add" href="http://www.sgmlsource.com/8879rev/n0029.htm"
+key="WEBSGML"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E43">[E43]</loc>ISO
+(International Organization for Standardization). <titleref>ISO 8879:1986
+TC2. Information technology &mdash; Document Description and Processing Languages. </titleref>
+[Geneva]: International Organization for Standardization, 1998.</bibl>
+<bibl id="xml-names" diff="add" xmlns:xlink="http://www.w3.org/TR/WD-xlink"
+href="http://www.w3.org/TR/REC-xml-names/" key="XML Names"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E98">[E98]</loc>Tim Bray,
+Dave Hollander, and Andrew Layman, editors. <titleref>Namespaces in XML</titleref>.
+Textuality, Hewlett-Packard, and Microsoft. World Wide Web Consortium, 1999.</bibl>
+</blist></div2>
+</div1>
+<div1 id="CharClasses">
+<head>Character Classes</head>
+<p>Following the characteristics defined in the Unicode standard, characters
+are classed as base characters (among others, these contain the alphabetic
+characters of the Latin alphabet<phrase diff="del"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E84">[E84]</loc>, without
+diacritics</phrase>), ideographic characters, and combining characters (among
+others, this class contains most diacritics)<phrase diff="del"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E30">[E30]</loc>; these classes
+combine to form the class of letters.</phrase> Digits and extenders are also
+distinguished.</p>
+<scrap id="CHARACTERS" lang="ebnf">
+<head>Characters</head>
+<prodgroup pcw3="3" pcw4="15">
+<prod id="NT-Letter">
+<lhs>Letter</lhs><rhs><nt def="NT-BaseChar">BaseChar</nt> | <nt def="NT-Ideographic">Ideographic</nt></rhs>
+</prod>
+<prod id="NT-BaseChar">
+<lhs>BaseChar</lhs><rhs>[#x0041-#x005A] |&nbsp;[#x0061-#x007A] |&nbsp;[#x00C0-#x00D6]
+|&nbsp;[#x00D8-#x00F6] |&nbsp;[#x00F8-#x00FF] |&nbsp;[#x0100-#x0131] |&nbsp;[#x0134-#x013E]
+|&nbsp;[#x0141-#x0148] |&nbsp;[#x014A-#x017E] |&nbsp;[#x0180-#x01C3] |&nbsp;[#x01CD-#x01F0]
+|&nbsp;[#x01F4-#x01F5] |&nbsp;[#x01FA-#x0217] |&nbsp;[#x0250-#x02A8] |&nbsp;[#x02BB-#x02C1]
+|&nbsp;#x0386 |&nbsp;[#x0388-#x038A] |&nbsp;#x038C |&nbsp;[#x038E-#x03A1]
+|&nbsp;[#x03A3-#x03CE] |&nbsp;[#x03D0-#x03D6] |&nbsp;#x03DA |&nbsp;#x03DC
+|&nbsp;#x03DE |&nbsp;#x03E0 |&nbsp;[#x03E2-#x03F3] |&nbsp;[#x0401-#x040C]
+|&nbsp;[#x040E-#x044F] |&nbsp;[#x0451-#x045C] |&nbsp;[#x045E-#x0481] |&nbsp;[#x0490-#x04C4]
+|&nbsp;[#x04C7-#x04C8] |&nbsp;[#x04CB-#x04CC] |&nbsp;[#x04D0-#x04EB] |&nbsp;[#x04EE-#x04F5]
+|&nbsp;[#x04F8-#x04F9] |&nbsp;[#x0531-#x0556] |&nbsp;#x0559 |&nbsp;[#x0561-#x0586]
+|&nbsp;[#x05D0-#x05EA] |&nbsp;[#x05F0-#x05F2] |&nbsp;[#x0621-#x063A] |&nbsp;[#x0641-#x064A]
+|&nbsp;[#x0671-#x06B7] |&nbsp;[#x06BA-#x06BE] |&nbsp;[#x06C0-#x06CE] |&nbsp;[#x06D0-#x06D3]
+|&nbsp;#x06D5 |&nbsp;[#x06E5-#x06E6] |&nbsp;[#x0905-#x0939] |&nbsp;#x093D
+|&nbsp;[#x0958-#x0961] |&nbsp;[#x0985-#x098C] |&nbsp;[#x098F-#x0990] |&nbsp;[#x0993-#x09A8]
+|&nbsp;[#x09AA-#x09B0] |&nbsp;#x09B2 |&nbsp;[#x09B6-#x09B9] |&nbsp;[#x09DC-#x09DD]
+|&nbsp;[#x09DF-#x09E1] |&nbsp;[#x09F0-#x09F1] |&nbsp;[#x0A05-#x0A0A] |&nbsp;[#x0A0F-#x0A10]
+|&nbsp;[#x0A13-#x0A28] |&nbsp;[#x0A2A-#x0A30] |&nbsp;[#x0A32-#x0A33] |&nbsp;[#x0A35-#x0A36]
+|&nbsp;[#x0A38-#x0A39] |&nbsp;[#x0A59-#x0A5C] |&nbsp;#x0A5E |&nbsp;[#x0A72-#x0A74]
+|&nbsp;[#x0A85-#x0A8B] |&nbsp;#x0A8D |&nbsp;[#x0A8F-#x0A91] |&nbsp;[#x0A93-#x0AA8]
+|&nbsp;[#x0AAA-#x0AB0] |&nbsp;[#x0AB2-#x0AB3] |&nbsp;[#x0AB5-#x0AB9] |&nbsp;#x0ABD
+|&nbsp;#x0AE0 |&nbsp;[#x0B05-#x0B0C] |&nbsp;[#x0B0F-#x0B10] |&nbsp;[#x0B13-#x0B28]
+|&nbsp;[#x0B2A-#x0B30] |&nbsp;[#x0B32-#x0B33] |&nbsp;[#x0B36-#x0B39] |&nbsp;#x0B3D
+|&nbsp;[#x0B5C-#x0B5D] |&nbsp;[#x0B5F-#x0B61] |&nbsp;[#x0B85-#x0B8A] |&nbsp;[#x0B8E-#x0B90]
+|&nbsp;[#x0B92-#x0B95] |&nbsp;[#x0B99-#x0B9A] |&nbsp;#x0B9C |&nbsp;[#x0B9E-#x0B9F]
+|&nbsp;[#x0BA3-#x0BA4] |&nbsp;[#x0BA8-#x0BAA] |&nbsp;[#x0BAE-#x0BB5] |&nbsp;[#x0BB7-#x0BB9]
+|&nbsp;[#x0C05-#x0C0C] |&nbsp;[#x0C0E-#x0C10] |&nbsp;[#x0C12-#x0C28] |&nbsp;[#x0C2A-#x0C33]
+|&nbsp;[#x0C35-#x0C39] |&nbsp;[#x0C60-#x0C61] |&nbsp;[#x0C85-#x0C8C] |&nbsp;[#x0C8E-#x0C90]
+|&nbsp;[#x0C92-#x0CA8] |&nbsp;[#x0CAA-#x0CB3] |&nbsp;[#x0CB5-#x0CB9] |&nbsp;#x0CDE
+|&nbsp;[#x0CE0-#x0CE1] |&nbsp;[#x0D05-#x0D0C] |&nbsp;[#x0D0E-#x0D10] |&nbsp;[#x0D12-#x0D28]
+|&nbsp;[#x0D2A-#x0D39] |&nbsp;[#x0D60-#x0D61] |&nbsp;[#x0E01-#x0E2E] |&nbsp;#x0E30
+|&nbsp;[#x0E32-#x0E33] |&nbsp;[#x0E40-#x0E45] |&nbsp;[#x0E81-#x0E82] |&nbsp;#x0E84
+|&nbsp;[#x0E87-#x0E88] |&nbsp;#x0E8A |&nbsp;#x0E8D |&nbsp;[#x0E94-#x0E97]
+|&nbsp;[#x0E99-#x0E9F] |&nbsp;[#x0EA1-#x0EA3] |&nbsp;#x0EA5 |&nbsp;#x0EA7
+|&nbsp;[#x0EAA-#x0EAB] |&nbsp;[#x0EAD-#x0EAE] |&nbsp;#x0EB0 |&nbsp;[#x0EB2-#x0EB3]
+|&nbsp;#x0EBD |&nbsp;[#x0EC0-#x0EC4] |&nbsp;[#x0F40-#x0F47] |&nbsp;[#x0F49-#x0F69]
+|&nbsp;[#x10A0-#x10C5] |&nbsp;[#x10D0-#x10F6] |&nbsp;#x1100 |&nbsp;[#x1102-#x1103]
+|&nbsp;[#x1105-#x1107] |&nbsp;#x1109 |&nbsp;[#x110B-#x110C] |&nbsp;[#x110E-#x1112]
+|&nbsp;#x113C |&nbsp;#x113E |&nbsp;#x1140 |&nbsp;#x114C |&nbsp;#x114E |&nbsp;#x1150
+|&nbsp;[#x1154-#x1155] |&nbsp;#x1159 |&nbsp;[#x115F-#x1161] |&nbsp;#x1163
+|&nbsp;#x1165 |&nbsp;#x1167 |&nbsp;#x1169 |&nbsp;[#x116D-#x116E] |&nbsp;[#x1172-#x1173]
+|&nbsp;#x1175 |&nbsp;#x119E |&nbsp;#x11A8 |&nbsp;#x11AB |&nbsp;[#x11AE-#x11AF]
+|&nbsp;[#x11B7-#x11B8] |&nbsp;#x11BA |&nbsp;[#x11BC-#x11C2] |&nbsp;#x11EB
+|&nbsp;#x11F0 |&nbsp;#x11F9 |&nbsp;[#x1E00-#x1E9B] |&nbsp;[#x1EA0-#x1EF9]
+|&nbsp;[#x1F00-#x1F15] |&nbsp;[#x1F18-#x1F1D] |&nbsp;[#x1F20-#x1F45] |&nbsp;[#x1F48-#x1F4D]
+|&nbsp;[#x1F50-#x1F57] |&nbsp;#x1F59 |&nbsp;#x1F5B |&nbsp;#x1F5D |&nbsp;[#x1F5F-#x1F7D]
+|&nbsp;[#x1F80-#x1FB4] |&nbsp;[#x1FB6-#x1FBC] |&nbsp;#x1FBE |&nbsp;[#x1FC2-#x1FC4]
+|&nbsp;[#x1FC6-#x1FCC] |&nbsp;[#x1FD0-#x1FD3] |&nbsp;[#x1FD6-#x1FDB] |&nbsp;[#x1FE0-#x1FEC]
+|&nbsp;[#x1FF2-#x1FF4] |&nbsp;[#x1FF6-#x1FFC] |&nbsp;#x2126 |&nbsp;[#x212A-#x212B]
+|&nbsp;#x212E |&nbsp;[#x2180-#x2182] |&nbsp;[#x3041-#x3094] |&nbsp;[#x30A1-#x30FA]
+|&nbsp;[#x3105-#x312C] |&nbsp;[#xAC00-#xD7A3] </rhs>
+</prod>
+<prod id="NT-Ideographic">
+<lhs>Ideographic</lhs><rhs>[#x4E00-#x9FA5] |&nbsp;#x3007 |&nbsp;[#x3021-#x3029] </rhs>
+</prod>
+<prod id="NT-CombiningChar">
+<lhs>CombiningChar</lhs><rhs>[#x0300-#x0345] |&nbsp;[#x0360-#x0361] |&nbsp;[#x0483-#x0486]
+|&nbsp;[#x0591-#x05A1] |&nbsp;[#x05A3-#x05B9] |&nbsp;[#x05BB-#x05BD] |&nbsp;#x05BF
+|&nbsp;[#x05C1-#x05C2] |&nbsp;#x05C4 |&nbsp;[#x064B-#x0652] |&nbsp;#x0670
+|&nbsp;[#x06D6-#x06DC] |&nbsp;[#x06DD-#x06DF] |&nbsp;[#x06E0-#x06E4] |&nbsp;[#x06E7-#x06E8]
+|&nbsp;[#x06EA-#x06ED] |&nbsp;[#x0901-#x0903] |&nbsp;#x093C |&nbsp;[#x093E-#x094C]
+|&nbsp;#x094D |&nbsp;[#x0951-#x0954] |&nbsp;[#x0962-#x0963] |&nbsp;[#x0981-#x0983]
+|&nbsp;#x09BC |&nbsp;#x09BE |&nbsp;#x09BF |&nbsp;[#x09C0-#x09C4] |&nbsp;[#x09C7-#x09C8]
+|&nbsp;[#x09CB-#x09CD] |&nbsp;#x09D7 |&nbsp;[#x09E2-#x09E3] |&nbsp;#x0A02
+|&nbsp;#x0A3C |&nbsp;#x0A3E |&nbsp;#x0A3F |&nbsp;[#x0A40-#x0A42] |&nbsp;[#x0A47-#x0A48]
+|&nbsp;[#x0A4B-#x0A4D] |&nbsp;[#x0A70-#x0A71] |&nbsp;[#x0A81-#x0A83] |&nbsp;#x0ABC
+|&nbsp;[#x0ABE-#x0AC5] |&nbsp;[#x0AC7-#x0AC9] |&nbsp;[#x0ACB-#x0ACD] |&nbsp;[#x0B01-#x0B03]
+|&nbsp;#x0B3C |&nbsp;[#x0B3E-#x0B43] |&nbsp;[#x0B47-#x0B48] |&nbsp;[#x0B4B-#x0B4D]
+|&nbsp;[#x0B56-#x0B57] |&nbsp;[#x0B82-#x0B83] |&nbsp;[#x0BBE-#x0BC2] |&nbsp;[#x0BC6-#x0BC8]
+|&nbsp;[#x0BCA-#x0BCD] |&nbsp;#x0BD7 |&nbsp;[#x0C01-#x0C03] |&nbsp;[#x0C3E-#x0C44]
+|&nbsp;[#x0C46-#x0C48] |&nbsp;[#x0C4A-#x0C4D] |&nbsp;[#x0C55-#x0C56] |&nbsp;[#x0C82-#x0C83]
+|&nbsp;[#x0CBE-#x0CC4] |&nbsp;[#x0CC6-#x0CC8] |&nbsp;[#x0CCA-#x0CCD] |&nbsp;[#x0CD5-#x0CD6]
+|&nbsp;[#x0D02-#x0D03] |&nbsp;[#x0D3E-#x0D43] |&nbsp;[#x0D46-#x0D48] |&nbsp;[#x0D4A-#x0D4D]
+|&nbsp;#x0D57 |&nbsp;#x0E31 |&nbsp;[#x0E34-#x0E3A] |&nbsp;[#x0E47-#x0E4E]
+|&nbsp;#x0EB1 |&nbsp;[#x0EB4-#x0EB9] |&nbsp;[#x0EBB-#x0EBC] |&nbsp;[#x0EC8-#x0ECD]
+|&nbsp;[#x0F18-#x0F19] |&nbsp;#x0F35 |&nbsp;#x0F37 |&nbsp;#x0F39 |&nbsp;#x0F3E
+|&nbsp;#x0F3F |&nbsp;[#x0F71-#x0F84] |&nbsp;[#x0F86-#x0F8B] |&nbsp;[#x0F90-#x0F95]
+|&nbsp;#x0F97 |&nbsp;[#x0F99-#x0FAD] |&nbsp;[#x0FB1-#x0FB7] |&nbsp;#x0FB9
+|&nbsp;[#x20D0-#x20DC] |&nbsp;#x20E1 |&nbsp;[#x302A-#x302F] |&nbsp;#x3099
+|&nbsp;#x309A </rhs>
+</prod>
+<prod id="NT-Digit">
+<lhs>Digit</lhs><rhs>[#x0030-#x0039] |&nbsp;[#x0660-#x0669] |&nbsp;[#x06F0-#x06F9]
+|&nbsp;[#x0966-#x096F] |&nbsp;[#x09E6-#x09EF] |&nbsp;[#x0A66-#x0A6F] |&nbsp;[#x0AE6-#x0AEF]
+|&nbsp;[#x0B66-#x0B6F] |&nbsp;[#x0BE7-#x0BEF] |&nbsp;[#x0C66-#x0C6F] |&nbsp;[#x0CE6-#x0CEF]
+|&nbsp;[#x0D66-#x0D6F] |&nbsp;[#x0E50-#x0E59] |&nbsp;[#x0ED0-#x0ED9] |&nbsp;[#x0F20-#x0F29] </rhs>
+</prod>
+<prod id="NT-Extender">
+<lhs>Extender</lhs><rhs>#x00B7 |&nbsp;#x02D0 |&nbsp;#x02D1 |&nbsp;#x0387 |&nbsp;#x0640
+|&nbsp;#x0E46 |&nbsp;#x0EC6 |&nbsp;#x3005 |&nbsp;[#x3031-#x3035] |&nbsp;[#x309D-#x309E]
+|&nbsp;[#x30FC-#x30FE] </rhs>
+</prod>
+</prodgroup></scrap>
+<p>The character classes defined here can be derived from the Unicode <phrase
+diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E67">[E67]</loc>2.0</phrase>
+character database as follows:</p>
+<ulist>
+<item><p>Name start characters must have one of the categories Ll, Lu, Lo,
+Lt, Nl.</p></item>
+<item><p>Name characters other than Name-start characters must have one of
+the categories Mc, Me, Mn, Lm, or Nd.</p></item>
+<item><p>Characters in the compatibility area (i.e. with character code greater
+than #xF900 and less than #xFFFE) are not allowed in XML names.</p></item>
+<item><p>Characters which have a font or compatibility decomposition (i.e.
+those with a <quote>compatibility formatting tag</quote> in field 5 of the
+database -- marked by field 5 beginning with a <quote>&lt;</quote>) are not
+allowed.</p></item>
+<item><p>The following characters are treated as name-start characters rather
+than name characters, because the property file classifies them as Alphabetic:
+[#x02BB-#x02C1], #x0559, #x06E5, #x06E6.</p></item>
+<item><p>Characters #x20DD-#x20E0 are excluded (in accordance with Unicode <phrase
+diff="add"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E67">[E67]</loc>2.0</phrase>,
+section 5.14).</p></item>
+<item><p>Character #x00B7 is classified as an extender, because the property
+list so identifies it.</p></item>
+<item><p>Character #x0387 is added as a name character, because #x00B7 is
+its canonical equivalent.</p></item>
+<item><p>Characters ':' and '_' are allowed as name-start characters.</p>
+</item>
+<item><p>Characters '-' and '.' are allowed as name characters.</p></item>
+</ulist>
+</div1>
+<inform-div1 id="sec-xml-and-sgml">
+<head>XML and SGML</head>
+<p><phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E43">[E43]</loc>XML
+is designed to be a subset of SGML, in that every XML document should also
+be a conforming SGML document.</phrase> For a detailed comparison of the additional
+restrictions that XML places on documents beyond those of SGML, see <bibref
+ref="Clark"/>.</p>
+</inform-div1>
+<inform-div1 id="sec-entexpand">
+<head>Expansion of Entity and Character References</head>
+<p>This appendix contains some examples illustrating the sequence of entity-
+and character-reference recognition and expansion, as specified in <specref
+ref="entproc"/>.</p>
+<p>If the DTD contains the declaration</p>
+<eg><![CDATA[<!ENTITY example "<p>An ampersand (&#38;#38;) may be escaped
+numerically (&#38;#38;#38;) or with a general entity
+(&amp;amp;).</p>" >]]></eg>
+<p>then the XML processor will recognize the character references when it
+parses the entity declaration, and resolve them before storing the following
+string as the value of the entity <quote><code>example</code></quote>:</p>
+<eg><![CDATA[<p>An ampersand (&#38;) may be escaped
+numerically (&#38;#38;) or with a general entity
+(&amp;amp;).</p>]]></eg>
+<p>A reference in the document to <quote><code>&amp;example;</code></quote>
+will cause the text to be reparsed, at which time the start- and end-tags
+of the <el>p</el> element will be recognized and the three references will
+be recognized and expanded, resulting in a <el>p</el> element with the following
+content (all data, no delimiters or markup):</p>
+<eg><![CDATA[An ampersand (&) may be escaped
+numerically (&#38;) or with a general entity
+(&amp;).]]></eg>
+<p>A more complex example will illustrate the rules and their effects fully.
+In the following example, the line numbers are solely for reference.</p>
+<eg><![CDATA[1 <?xml version='1.0'?>
+2 <!DOCTYPE test [
+3 <!ELEMENT test (#PCDATA) >
+4 <!ENTITY % xx '&#37;zz;'>
+5 <!ENTITY % zz '&#60;!ENTITY tricky "error-prone" >' >
+6 %xx;
+7 ]>
+8 <test>This sample shows a &tricky; method.</test>]]></eg>
+<p>This produces the following:</p>
+<ulist spacing="compact">
+<item><p>in line 4, the reference to character 37 is expanded immediately,
+and the parameter entity <quote><code>xx</code></quote> is stored in the symbol
+table with the value <quote><code>%zz;</code></quote>. Since the replacement
+text is not rescanned, the reference to parameter entity <quote><code>zz</code></quote>
+is not recognized. (And it would be an error if it were, since <quote><code>zz</code></quote>
+is not yet declared.)</p></item>
+<item><p>in line 5, the character reference <quote><code>&amp;#60;</code></quote>
+is expanded immediately and the parameter entity <quote><code>zz</code></quote>
+is stored with the replacement text <quote><code>&lt;!ENTITY tricky "error-prone"
+></code></quote>, which is a well-formed entity declaration.</p></item>
+<item><p>in line 6, the reference to <quote><code>xx</code></quote> is recognized,
+and the replacement text of <quote><code>xx</code></quote> (namely <quote><code>%zz;</code></quote>)
+is parsed. The reference to <quote><code>zz</code></quote> is recognized in
+its turn, and its replacement text (<quote><code>&lt;!ENTITY tricky "error-prone"
+></code></quote>) is parsed. The general entity <quote><code>tricky</code></quote>
+has now been declared, with the replacement text <quote><code>error-prone</code></quote>.</p>
+</item>
+<item><p>in line 8, the reference to the general entity <quote><code>tricky</code></quote>
+is recognized, and it is expanded, so the full content of the <el>test</el>
+element is the self-describing (and ungrammatical) string <emph>This sample
+shows a error-prone method.</emph></p></item>
+</ulist>
+</inform-div1>
+<inform-div1 id="determinism">
+<head>Deterministic Content Models</head>
+<p><phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E102">[E102]</loc>As
+noted in <specref ref="sec-element-content"/>, it is required that content
+models in element type declarations be deterministic. This requirement is <termref
+def="dt-compat">for compatibility</termref> with SGML (which calls deterministic
+content models <quote>unambiguous</quote>);</phrase> XML processors built
+using SGML systems may flag non-deterministic content models as errors.</p>
+<p>For example, the content model <code>((b, c) | (b, d))</code> is non-deterministic,
+because given an initial <el>b</el> the <phrase diff="chg"><loc role="erratumref"
+href="http://www.w3.org/XML/xml-19980210-errata#E95">[E95]</loc>XML processor</phrase>
+cannot know which <el>b</el> in the model is being matched without looking
+ahead to see which element follows the <el>b</el>. In this case, the two references
+to <el>b</el> can be collapsed into a single reference, making the model read <code>(b,
+(c | d))</code>. An initial <el>b</el> now clearly matches only a single name
+in the content model. The <phrase diff="chg"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E95">[E95]</loc>processor</phrase
+> doesn't need to look ahead to see what follows; either <el>c</el> or <el>d</el>
+would be accepted.</p>
+<p>More formally: a finite state automaton may be constructed from the content
+model using the standard algorithms, e.g. algorithm 3.5 in section 3.9 of
+Aho, Sethi, and Ullman <bibref ref="Aho"/>. In many such algorithms, a follow
+set is constructed for each position in the regular expression (i.e., each
+leaf node in the syntax tree for the regular expression); if any position
+has a follow set in which more than one following position is labeled with
+the same element type name, then the content model is in error and may be
+reported as an error.</p>
+<p>Algorithms exist which allow many but not all non-deterministic content
+models to be reduced automatically to equivalent deterministic models; see
+Brüggemann-Klein 1991 <bibref ref="ABK"/>.</p>
+</inform-div1>
+<inform-div1 id="sec-guessing">
+<head><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E105">[E105]</loc><loc
+role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E48">[E48]</loc>Autodetection
+of Character Encodings</head>
+<p>The XML encoding declaration functions as an internal label on each entity,
+indicating which character encoding is in use. Before an XML processor can
+read the internal label, however, it apparently has to know what character
+encoding is in use&mdash;which is what the internal label is trying to indicate.
+In the general case, this is a hopeless situation. It is not entirely hopeless
+in XML, however, because XML limits the general case in two ways: each implementation
+is assumed to support only a finite set of character encodings, and the XML
+encoding declaration is restricted in position and content in order to make
+it feasible to autodetect the character encoding in use in each entity in
+normal cases. Also, in many cases other sources of information are available
+in addition to the XML data stream itself. Two cases may be distinguished,
+depending on whether the XML entity is presented to the processor without,
+or with, any accompanying (external) information. We consider the first case
+first.</p>
+<div2 id="sec-guessing-no-ext-info">
+<head diff="add">Detection Without External Encoding Information</head>
+<p>Because each XML entity <phrase diff="add">not accompanied by external
+encoding information and </phrase>not in UTF-8 or UTF-16 <phrase diff="chg">encoding</phrase> <emph>must</emph>
+begin with an XML encoding declaration, in which the first characters must
+be '<code>&lt;?xml</code>', any conforming processor can detect, after two
+to four octets of input, which of the following cases apply. In reading this
+list, it may help to know that in UCS-4, '&lt;' is <quote><code>#x0000003C</code></quote>
+and '?' is <quote><code>#x0000003F</code></quote>, and the Byte Order Mark
+required of UTF-16 data streams is <quote><code>#xFEFF</code></quote>. <phrase
+diff="add">The notation <var>##</var> is used to denote any byte value except <phrase
+diff="chg">that two consecutive <var>##</var>s cannot be both 00</phrase>.</phrase></p>
+<p diff="add">With a Byte Order Mark:</p>
+<table diff="add" border="1" frame="border"><tbody><tr><td><code>00 00 FE
+FF</code></td><td>UCS-4, big-endian machine (1234 order)</td></tr><tr><td><code>FF
+FE 00 00</code></td><td>UCS-4, little-endian machine (4321 order)</td></tr>
+<tr><td><code>00 00 FF FE</code></td><td>UCS-4, unusual octet order (2143)</td>
+</tr><tr><td><code>FE FF 00 00</code></td><td>UCS-4, unusual octet order (3412)</td>
+</tr><tr><td><code>FE FF ## ##</code></td><td>UTF-16, big-endian</td></tr>
+<tr><td><code>FF FE ## ##</code></td><td>UTF-16, little-endian</td></tr><tr>
+<td><code>EF BB BF</code></td><td>UTF-8</td></tr></tbody></table>
+<p diff="add">Without a Byte Order Mark:</p>
+<table diff="add" border="1" frame="border"><tbody><tr><td><code>00&nbsp;00&nbsp;00&nbsp;3C</code></td>
+<td rowspan="4">UCS-4 or other encoding with a 32-bit code unit and ASCII
+characters encoded as ASCII values, in respectively big-endian (1234), little-endian
+(4321) and two unusual byte orders (2143 and 3412). The encoding declaration
+must be read to determine which of UCS-4 or other supported 32-bit encodings
+applies.</td></tr><tr><td><code>3C 00 00 00</code></td>
+<!--<td>UCS-4, little-endian machine (4321 order)</td>-->
+</tr><tr><td><code>00 00 3C 00</code></td>
+<!--<td>UCS-4, unusual octet order (2143)</td>-->
+</tr><tr><td><code>00 3C 00 00</code></td>
+<!--<td>UCS-4, unusual octet order (3412)</td>-->
+</tr><tr><td><code>00 3C 00 3F</code></td><td>UTF-16BE or big-endian ISO-10646-UCS-2
+or other encoding with a 16-bit code unit in big-endian order and ASCII characters
+encoded as ASCII values (the encoding declaration must be read to determine
+which)</td></tr><tr><td><code>3C 00 3F 00</code></td><td>UTF-16LE or little-endian
+ISO-10646-UCS-2 or other encoding with a 16-bit code unit in little-endian
+order and ASCII characters encoded as ASCII values (the encoding declaration
+must be read to determine which)</td></tr><tr><td><code>3C 3F 78 6D</code></td>
+<td>UTF-8, ISO 646, ASCII, some part of ISO 8859, Shift-JIS, EUC, or any other
+7-bit, 8-bit, or mixed-width encoding which ensures that the characters of
+ASCII have their normal positions, width, and values; the actual encoding
+declaration must be read to detect which of these applies, but since all of
+these encodings use the same bit patterns for the relevant ASCII characters,
+the encoding declaration itself may be read reliably</td></tr><tr><td><code>4C
+6F A7 94</code></td><td>EBCDIC (in some flavor; the full encoding declaration
+must be read to tell which code page is in use)</td></tr><tr><td>Other</td>
+<td>UTF-8 without an encoding declaration, or else the data stream is mislabeled
+(lacking a required encoding declaration), corrupt, fragmentary, or enclosed
+in a wrapper of some kind</td></tr></tbody></table>
+<note diff="add">
+<p>In cases above which do not require reading the encoding declaration to
+determine the encoding, section 4.3.3 still requires that the encoding declaration,
+if present, be read and that the encoding name be checked to match the actual
+encoding of the entity. Also, it is possible that new character encodings
+will be invented that will make it necessary to use the encoding declaration
+to determine the encoding, in cases where this is not required at present.</p>
+</note>
+<p>This level of autodetection is enough to read the XML encoding declaration
+and parse the character-encoding identifier, which is still necessary to distinguish
+the individual members of each family of encodings (e.g. to tell UTF-8 from
+8859, and the parts of 8859 from each other, or to distinguish the specific
+EBCDIC code page in use, and so on).</p>
+<p>Because the contents of the encoding declaration are restricted to <phrase
+diff="chg">characters from the ASCII repertoire (however encoded)</phrase>,
+a processor can reliably read the entire encoding declaration as soon as it
+has detected which family of encodings is in use. Since in practice, all widely
+used character encodings fall into one of the categories above, the XML encoding
+declaration allows reasonably reliable in-band labeling of character encodings,
+even when external sources of information at the operating-system or transport-protocol
+level are unreliable. <phrase diff="del">Note that since external parsed entities
+in UTF-16 may begin with any character, this autodetection does not always
+work. Also, </phrase><phrase diff="add">Character encodings such as UTF-7
+that make overloaded usage of ASCII-valued bytes may fail to be reliably detected.</phrase></p>
+<p>Once the processor has detected the character encoding in use, it can act
+appropriately, whether by invoking a separate input routine for each case,
+or by calling the proper conversion function on each character of input.</p>
+<p>Like any self-labeling system, the XML encoding declaration will not work
+if any software changes the entity's character set or encoding without updating
+the encoding declaration. Implementors of character-encoding routines should
+be careful to ensure the accuracy of the internal and external information
+used to label the entity.</p>
+</div2>
+<div2 id="sec-guessing-with-ext-info">
+<head diff="add">Priorities in the Presence of External Encoding Information</head>
+<p>The second possible case occurs when the XML entity is accompanied by encoding
+information, as in some file systems and some network protocols. When multiple
+sources of information are available, their relative priority and the preferred
+method of handling conflict should be specified as part of the higher-level
+protocol used to deliver XML. <phrase diff="chg">In particular, please refer
+to <bibref ref="rfc2376"/> or its successor, which defines the <code>text/xml</code>
+and <code>application/xml</code> MIME types and provides some useful guidance.
+In the interests of interoperability, however, the following rule is recommended.</phrase></p>
+<ulist>
+<item><p>If an XML entity is in a file, the Byte-Order Mark and encoding declaration <phrase
+diff="del">PI </phrase>are used (if present) to determine the character encoding.<phrase
+diff="del"><loc role="erratumref" href="http://www.w3.org/XML/xml-19980210-errata#E74">[E74]</loc>
+All other heuristics and sources of information are solely for error recovery.</phrase></p>
+</item>
+</ulist>
+<ulist diff="del">
+<item><p>If an XML entity is delivered with a MIME type of text/xml, then
+the <code>charset</code> parameter on the MIME type determines the character
+encoding method; all other heuristics and sources of information are solely
+for error recovery.</p></item>
+<item><p>If an XML entity is delivered with a MIME type of application/xml,
+then the Byte-Order Mark and encoding-declaration PI are used (if present)
+to determine the character encoding. All other heuristics and sources of information
+are solely for error recovery.</p></item>
+</ulist>
+<p diff="del">These rules apply only in the absence of protocol-level documentation;
+in particular, when the MIME types text/xml and application/xml are defined,
+the recommendations of the relevant RFC will supersede these rules.</p>
+</div2>
+</inform-div1>
+<inform-div1 id="sec-xml-wg">
+<head>W3C XML Working Group</head>
+<p>This specification was prepared and approved for publication by the W3C
+XML Working Group (WG). WG approval of this specification does not necessarily
+imply that all WG members voted for its approval. The current and former members
+of the XML WG are:</p>
+<orglist>
+<member><name>Jon Bosak</name><affiliation>Sun</affiliation><role>Chair</role>
+</member>
+<member><name>James Clark</name><role>Technical Lead</role></member>
+<member><name>Tim Bray</name><affiliation>Textuality and Netscape</affiliation>
+<role>XML Co-editor</role></member>
+<member><name>Jean Paoli</name><affiliation>Microsoft</affiliation><role>XML
+Co-editor</role></member>
+<member><name>C. M. Sperberg-McQueen</name><affiliation>U. of Ill.</affiliation>
+<role>XML Co-editor</role></member>
+<member><name>Dan Connolly</name><affiliation>W3C</affiliation><role>W3C Liaison</role>
+</member>
+<member><name>Paula Angerstein</name><affiliation>Texcel</affiliation></member>
+<member><name>Steve DeRose</name><affiliation>INSO</affiliation></member>
+<member><name>Dave Hollander</name><affiliation>HP</affiliation></member>
+<member><name>Eliot Kimber</name><affiliation>ISOGEN</affiliation></member>
+<member><name>Eve Maler</name><affiliation>ArborText</affiliation></member>
+<member><name>Tom Magliery</name><affiliation>NCSA</affiliation></member>
+<member><name>Murray Maloney</name><affiliation diff="chg">SoftQuad, Grif
+SA, Muzmo and Veo Systems</affiliation></member>
+<member><name diff="chg">MURATA Makoto (FAMILY Given)</name><affiliation>Fuji
+Xerox Information Systems</affiliation></member>
+<member><name>Joel Nava</name><affiliation>Adobe</affiliation></member>
+<member><name>Conleth O'Connell</name><affiliation>Vignette</affiliation>
+</member>
+<member><name>Peter Sharpe</name><affiliation>SoftQuad</affiliation></member>
+<member><name>John Tigue</name><affiliation>DataChannel</affiliation></member>
+</orglist>
+</inform-div1>
+<inform-div1 id="sec-core-wg" diff="add">
+<head>W3C XML Core Group</head>
+<p>The second edition of this specification was prepared by the W3C XML Core
+Working Group (WG). The members of the WG at the time of publication of this
+edition were:</p>
+<orglist>
+<member><name>Paula Angerstein</name><affiliation>Vignette</affiliation></member>
+<member><name>Daniel Austin</name><affiliation>Ask Jeeves</affiliation></member>
+<member><name>Tim Boland</name></member>
+<member><name>Allen Brown</name><affiliation>Microsoft</affiliation></member>
+<member><name>Dan Connolly</name><affiliation>W3C</affiliation><role>Staff
+Contact</role></member>
+<member><name>John Cowan</name><affiliation>Reuters Limited</affiliation>
+</member>
+<member><name>John Evdemon</name><affiliation>XMLSolutions Corporation</affiliation>
+</member>
+<member><name>Paul Grosso</name><affiliation>Arbortext</affiliation><role>Co-Chair</role>
+</member>
+<member><name>Arnaud Le Hors</name><affiliation>IBM</affiliation><role>Co-Chair</role>
+</member>
+<member><name>Eve Maler</name><affiliation>Sun Microsystems</affiliation>
+<role>Second Edition Editor</role></member>
+<member><name>Jonathan Marsh</name><affiliation>Microsoft</affiliation></member>
+<member><name>MURATA Makoto (FAMILY Given)</name><affiliation>IBM</affiliation>
+</member>
+<member><name>Mark Needleman</name><affiliation>Data Research Associates</affiliation>
+</member>
+<member><name>David Orchard</name><affiliation>Jamcracker</affiliation></member>
+<member><name>Lew Shannon</name><affiliation>NCR</affiliation></member>
+<member><name>Richard Tobin</name><affiliation>University of Edinburgh</affiliation>
+</member>
+<member><name>Daniel Veillard</name><affiliation>W3C</affiliation></member>
+<member><name>Dan Vint</name><affiliation>Lexica</affiliation></member>
+<member><name>Norman Walsh</name><affiliation>Sun Microsystems</affiliation>
+</member>
+<member><name>François Yergeau</name><affiliation>Alis Technologies</affiliation>
+<role>Errata List Editor</role></member>
+<member><name>Kongyi Zhou</name><affiliation>Oracle</affiliation></member>
+</orglist>
+</inform-div1>
+<inform-div1 diff="add">
+<head>Production Notes</head>
+<p>This Second Edition was encoded in the <loc href="http://www.w3.org/XML/1998/06/xmlspec-v21.dtd">XMLspec
+DTD</loc> (which has <loc href="http://www.w3.org/XML/1998/06/xmlspec-report-v21.htm">documentation</loc>
+available). The HTML versions were produced with a combination of the <loc
+href="http://www.w3.org/XML/1998/06/xmlspec.xsl">xmlspec.xsl</loc>, <loc href="http://www.w3.org/XML/1998/06/diffspec.xsl">diffspec.xsl</loc>,
+and <loc href="http://www.w3.org/XML/1998/06/REC-xml-2e.xsl">REC-xml-2e.xsl</loc>
+XSLT stylesheets. The PDF version was produced with the <loc href="http://www.tdb.uu.se/~jan/html2ps.html">html2ps</loc>
+facility and a distiller program.</p>
+</inform-div1>
+</back></spec>
diff --git a/lib/libUPnP/Neptune/Source/Tests/Xml1/test.xml b/lib/libUPnP/Neptune/Source/Tests/Xml1/test.xml
new file mode 100644
index 0000000..87e9ccc
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Xml1/test.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by Gilles Boccon-Gibod -->
+<RootElement xmlns="foo.com" xmlns:pfy="bar.com" xmlns:prefix="prefix.com">Hello, I'm the first part<FirstChild first-attribute="some value">Hi, I'm at level 1</FirstChild>I'm the second part &lt;ubu &gt; oh &amp; hu<prefix:SecondChild pfy:second-attribute="hello">some text here in brackets</prefix:SecondChild>
+<data>Hello <![CDATA[This is some <cdata> stuff with ] and ] and ]] ]]> bla</data>
+ <TestElement some-attr='single quotes' attr2='single quote with " also' attr3="double quotes" attr4="double quotes with ' also" attr5='single with "&lt;" entity' attr6="double with '&gt;' entity"/>
+ <SomeElement>
+ the white
+ spaces &#xD;&#xA;should be
+ preserved
+ </SomeElement>
+<EmptyElement attr1="foo"/>
+
+
+<TestEscapes attr1="'&quot;'">&#xA;&#x0a;&amp;&#32;&#x20;&#64;&#14;&#15;&#xa9;</TestEscapes>
+</RootElement>
+<!--this is a comment - and some stuff - -->
diff --git a/lib/libUPnP/Neptune/Source/Tests/Xml1/unicode.xml b/lib/libUPnP/Neptune/Source/Tests/Xml1/unicode.xml
new file mode 100644
index 0000000..947e44f
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Xml1/unicode.xml
@@ -0,0 +1 @@
+<text>For example, the references &amp;#916;, &amp;#1049;, &amp;#1511;, &amp;#1605;, &amp;#3671;, &amp;#12354;, &amp;#21494;, &amp;#33865;, and &amp;#45307; (or the same numeric values expressed in hexadecimal, with &amp;#x as the prefix) display on browsers as &#916;, &#1049;, &#1511;,? &#1605;, &#3671;, &#12354;, &#21494;, &#33865; and &#45307;— if the proper fonts exist, these symbols look like the Greek capital letter "Delta", Cyrillic capital letter "Short I", Hebrew letter "Qof", Arabic letter "Meem", Thai numeral 7, Japanese Hiragana "A", simplified Chinese "Leaf", traditional Chinese "Leaf", and Korean Hangul syllable "Nyaelh", respectively</text> \ No newline at end of file
diff --git a/lib/libUPnP/Neptune/Source/Tests/Zip1/ZipTest1.cpp b/lib/libUPnP/Neptune/Source/Tests/Zip1/ZipTest1.cpp
new file mode 100644
index 0000000..75fbf5a
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Zip1/ZipTest1.cpp
@@ -0,0 +1,193 @@
+/*****************************************************************
+|
+| Zip Test Program 1
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+#define CHECK(x) \
+ do { \
+ if (!(x)) { \
+ fprintf(stderr, "ERROR line %d \n", __LINE__); \
+ error_hook(); \
+ return -1; \
+ } \
+ } while(0)
+
+/*----------------------------------------------------------------------
+| test vectors
++---------------------------------------------------------------------*/
+extern unsigned char t1[];
+extern unsigned int t1_len;
+extern unsigned char t1_gz[];
+extern unsigned int t1_gz_len;
+extern unsigned int t1_gz_header_len;
+
+extern unsigned char t2[];
+extern unsigned int t2_len;
+extern unsigned char t2_gz[];
+extern unsigned int t2_gz_len;
+extern unsigned int t2_gz_header_len;
+
+typedef struct {
+ unsigned char* uncompressed;
+ unsigned int uncompressed_len;
+ unsigned char* compressed;
+ unsigned int compressed_len;
+ unsigned int compressed_header_len;
+} TestVector;
+TestVector TestVectors[] = {
+ {t1, t1_len, t1_gz, t1_gz_len, t1_gz_header_len},
+ {t2, t2_len, t2_gz, t2_gz_len, t2_gz_header_len},
+};
+
+/*----------------------------------------------------------------------
+| error_hook
++---------------------------------------------------------------------*/
+static void
+error_hook()
+{
+ fprintf(stderr, "STOPPING\n");
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ // setup debugging
+#if defined(WIN32) && defined(_DEBUG)
+ int flags = _crtDbgFlag |
+ _CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_DELAY_FREE_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF;
+
+ _CrtSetDbgFlag(flags);
+ //AllocConsole();
+ //freopen("CONOUT$", "w", stdout);
+#endif
+
+for (unsigned int t=0; t<sizeof(TestVectors)/sizeof(TestVectors[0]); t++) {
+ TestVector* v = &TestVectors[t];
+ NPT_DataBuffer in1(v->compressed, v->compressed_len);
+ NPT_DataBuffer out1;
+ NPT_Result result = NPT_Zip::Inflate(in1, out1);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(out1.GetDataSize() == v->uncompressed_len);
+ CHECK(NPT_MemoryEqual(out1.GetData(), v->uncompressed, v->uncompressed_len));
+
+ NPT_DataBuffer in2(v->uncompressed, v->uncompressed_len);
+ NPT_DataBuffer out2;
+ NPT_DataBuffer out2_check;
+ result = NPT_Zip::Deflate(in2, out2, NPT_ZIP_COMPRESSION_LEVEL_MAX, NPT_Zip::GZIP);
+ CHECK(result == NPT_SUCCESS);
+ result = NPT_Zip::Inflate(out2, out2_check);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(out2_check.GetDataSize() == in2.GetDataSize());
+ CHECK(NPT_MemoryEqual(v->uncompressed, out2_check.GetData(), in2.GetDataSize()));
+
+ // try with random data
+ NPT_DataBuffer in3(300000);
+ unsigned char* in3_p = in3.UseData();
+ for (int i=0; i<300000; i++) {
+ *in3_p++ = NPT_System::GetRandomInteger();
+ }
+ in3.SetDataSize(300000);
+ NPT_DataBuffer out3;
+ result = NPT_Zip::Deflate(in3, out3);
+ CHECK(result == NPT_SUCCESS);
+ NPT_DataBuffer out3_check;
+ result = NPT_Zip::Inflate(out3, out3_check);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(in3 == out3_check);
+
+ // try with redundant data
+ in3_p = in3.UseData();
+ for (int i=0; i<200000; i+=4) {
+ *in3_p++ = NPT_System::GetRandomInteger();
+ *in3_p++ = 0;
+ *in3_p++ = 0;
+ *in3_p++ = 0;
+ }
+ result = NPT_Zip::Deflate(in3, out3);
+ CHECK(result == NPT_SUCCESS);
+ result = NPT_Zip::Inflate(out3, out3_check);
+ CHECK(result == NPT_SUCCESS);
+ CHECK(in3 == out3_check);
+
+ // streams
+ for (unsigned int x=0; x<1000; x++) {
+ NPT_MemoryStream* ms_gz = new NPT_MemoryStream(v->compressed, v->compressed_len);
+ NPT_InputStreamReference ms_gz_ref(ms_gz);
+ NPT_ZipInflatingInputStream ziis(ms_gz_ref);
+ NPT_DataBuffer buffer;
+ NPT_Position position = 0;
+ bool expect_eos = false;
+ for (;;) {
+ NPT_Size chunk = NPT_System::GetRandomInteger()%40000;
+ buffer.SetDataSize(chunk);
+ NPT_Size bytes_read = 0;
+ result = ziis.Read(buffer.UseData(), chunk, &bytes_read);
+ if (expect_eos) {
+ CHECK(result == NPT_ERROR_EOS);
+ break;
+ }
+ if (result == NPT_ERROR_EOS) {
+ CHECK(position == v->uncompressed_len);
+ } else {
+ CHECK(result == NPT_SUCCESS);
+ }
+ CHECK(bytes_read <= chunk);
+ if (bytes_read != chunk) expect_eos = true;
+ CHECK(NPT_MemoryEqual(v->uncompressed+position,
+ buffer.GetData(),
+ bytes_read));
+ position += bytes_read;
+ }
+ CHECK(position == v->uncompressed_len);
+ }
+
+ for (unsigned int x=0; x<1000; x++) {
+ NPT_MemoryStream* ms = new NPT_MemoryStream(v->uncompressed, v->uncompressed_len);
+ NPT_InputStreamReference ms_ref(ms);
+ NPT_ZipDeflatingInputStream zdis(ms_ref, NPT_ZIP_COMPRESSION_LEVEL_MAX, NPT_Zip::GZIP);
+ NPT_DataBuffer buffer;
+ NPT_Position position = 0;
+ bool expect_eos = false;
+ for (;;) {
+ NPT_Size chunk = NPT_System::GetRandomInteger()%40000;
+ buffer.Reserve(buffer.GetDataSize()+chunk);
+ NPT_Size bytes_read = 0;
+ result = zdis.Read(buffer.UseData()+buffer.GetDataSize(), chunk, &bytes_read);
+ if (expect_eos) {
+ CHECK(result == NPT_ERROR_EOS);
+ break;
+ }
+ CHECK(result == NPT_SUCCESS);
+ CHECK(bytes_read <= chunk);
+ if (bytes_read != chunk) expect_eos = true;
+ position += bytes_read;
+ buffer.SetDataSize(buffer.GetDataSize()+bytes_read);
+ }
+ NPT_DataBuffer out;
+ NPT_DataBuffer check(v->uncompressed, v->uncompressed_len);
+ CHECK(NPT_Zip::Inflate(buffer, out) == NPT_SUCCESS);
+ CHECK(out == check);
+ }
+}
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/Source/Tests/Zip1/ZipTestData1.cpp b/lib/libUPnP/Neptune/Source/Tests/Zip1/ZipTestData1.cpp
new file mode 100644
index 0000000..9ea0129
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Zip1/ZipTestData1.cpp
@@ -0,0 +1,21332 @@
+unsigned char t1_gz[] = {
+ 0x1f, 0x8b, 0x08, 0x08, 0xf3, 0x53, 0xcf, 0x46, 0x02, 0x03, 0x68, 0x65,
+ 0x6c, 0x6c, 0x6f, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xf3, 0x48, 0xcd, 0xc9,
+ 0xc9, 0x57, 0xf0, 0x4b, 0x2d, 0x28, 0x29, 0xcd, 0x4b, 0x05, 0x00, 0xf2,
+ 0xed, 0xac, 0x76, 0x0d, 0x00, 0x00, 0x00
+};
+unsigned int t1_gz_len = 43;
+unsigned int t1_gz_header_len = 20;
+unsigned char t1[] = {
+ 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x4e, 0x65, 0x70, 0x74, 0x75, 0x6e,
+ 0x65
+};
+unsigned int t1_len = 13;
+
+unsigned char t2_gz[] = {
+ 0x1f, 0x8b, 0x08, 0x08, 0x3a, 0x08, 0x0c, 0x47, 0x02, 0x03, 0x62, 0x69,
+ 0x67, 0x2e, 0x78, 0x6d, 0x6c, 0x00, 0xac, 0x5b, 0x6b, 0x53, 0x1b, 0x49,
+ 0x96, 0xfd, 0x4e, 0x04, 0xff, 0x21, 0x5b, 0x8e, 0x69, 0x60, 0x43, 0x4f,
+ 0xf0, 0x60, 0x8c, 0x65, 0x75, 0x63, 0xc0, 0x6e, 0x1c, 0xc6, 0x66, 0x0c,
+ 0x6d, 0x7b, 0x62, 0x76, 0x3e, 0xa4, 0xaa, 0x52, 0x52, 0x0d, 0xf5, 0x50,
+ 0xd7, 0x03, 0x50, 0xef, 0xec, 0x7f, 0xdf, 0x73, 0x6e, 0x66, 0x96, 0x54,
+ 0x20, 0xfc, 0x98, 0xd8, 0x88, 0x19, 0x77, 0xa9, 0x2a, 0xf3, 0xe6, 0xcd,
+ 0xfb, 0x3c, 0xf7, 0x66, 0x32, 0xfc, 0xe5, 0x2e, 0x89, 0xd5, 0x8d, 0xc9,
+ 0x8b, 0x28, 0x4b, 0x5f, 0xb6, 0x06, 0xdd, 0x7e, 0x4b, 0x99, 0x34, 0xc8,
+ 0xc2, 0x28, 0x9d, 0xbe, 0x6c, 0x45, 0x45, 0xd6, 0x39, 0x38, 0xf8, 0xeb,
+ 0xf3, 0xce, 0xa0, 0xf5, 0xcb, 0x68, 0x73, 0x63, 0xf8, 0xd3, 0xc9, 0x87,
+ 0xe3, 0xab, 0xbf, 0x5f, 0x9c, 0xaa, 0x62, 0x6e, 0x02, 0x75, 0xf1, 0xfb,
+ 0xab, 0x77, 0x67, 0xc7, 0xaa, 0xd5, 0xe9, 0xf5, 0x3e, 0xef, 0x1d, 0xf7,
+ 0x7a, 0x27, 0x57, 0x27, 0xea, 0x12, 0x1f, 0xa2, 0x49, 0x14, 0xe8, 0x12,
+ 0xf4, 0xd4, 0xa7, 0xdd, 0xee, 0xa0, 0xd7, 0x3b, 0x7d, 0xdf, 0xda, 0xdc,
+ 0x50, 0xad, 0x59, 0x59, 0xce, 0x0f, 0x7b, 0xbd, 0xdb, 0xdb, 0xdb, 0xee,
+ 0xed, 0x5e, 0x37, 0xcb, 0xa7, 0xbd, 0x2f, 0xe7, 0xef, 0x7a, 0x83, 0xe7,
+ 0xcf, 0x0f, 0x7a, 0xfd, 0xfd, 0x1e, 0xd8, 0x20, 0xd1, 0xce, 0xcd, 0xee,
+ 0xa0, 0x1b, 0x96, 0x61, 0x4b, 0xfd, 0x83, 0xeb, 0x75, 0x3a, 0x47, 0xf9,
+ 0x38, 0xcb, 0xaf, 0xcc, 0x5d, 0xd9, 0x56, 0x67, 0x69, 0xd0, 0x6d, 0xab,
+ 0xc1, 0xf3, 0x83, 0x83, 0xce, 0x6e, 0xbf, 0xdf, 0x6f, 0xab, 0x9b, 0xee,
+ 0xd3, 0x7e, 0x7f, 0xb7, 0xd3, 0x11, 0xd6, 0x4e, 0xdf, 0x5f, 0x9d, 0x5d,
+ 0xfd, 0x5d, 0x71, 0x95, 0x4e, 0x14, 0x9a, 0xb4, 0x5c, 0xb7, 0xe2, 0xd5,
+ 0xc7, 0x1e, 0xa7, 0xf6, 0x3e, 0x9e, 0x1e, 0x77, 0xb0, 0x62, 0x6b, 0x75,
+ 0x66, 0x98, 0xeb, 0x49, 0xd9, 0x4d, 0xb2, 0xb4, 0x9c, 0xa9, 0xd6, 0x87,
+ 0xa0, 0xcc, 0xc6, 0x26, 0x5f, 0x33, 0x20, 0xd4, 0x0b, 0xd5, 0xda, 0x6f,
+ 0x7c, 0x80, 0x98, 0xf6, 0xbb, 0x61, 0x16, 0xe0, 0x5b, 0x69, 0x54, 0x8b,
+ 0x2b, 0x0c, 0xfa, 0xfd, 0xfd, 0x35, 0x93, 0x17, 0x46, 0xe7, 0x76, 0x40,
+ 0xe3, 0xa3, 0x93, 0xff, 0x87, 0x09, 0x24, 0xa2, 0x44, 0x09, 0xab, 0x5f,
+ 0xe7, 0x51, 0xa6, 0x5a, 0x5b, 0x3f, 0xc7, 0xe5, 0x0b, 0x2a, 0x6b, 0xab,
+ 0x49, 0xb6, 0x5e, 0x75, 0xd0, 0x57, 0xaf, 0xcd, 0x38, 0xaf, 0x74, 0xbe,
+ 0x50, 0x14, 0x6a, 0x63, 0xd8, 0xed, 0x5e, 0xb0, 0xc2, 0x20, 0x64, 0x86,
+ 0xa1, 0x9d, 0x07, 0xa3, 0x3e, 0x9b, 0xf1, 0xe5, 0x1b, 0x72, 0xe0, 0x1f,
+ 0x8e, 0x42, 0x3d, 0x2f, 0x45, 0x95, 0x85, 0x3a, 0x4a, 0x53, 0x73, 0xa7,
+ 0xca, 0x4c, 0x9d, 0x5d, 0x7e, 0x50, 0x07, 0x07, 0xcf, 0x9e, 0xdf, 0xe3,
+ 0x31, 0x00, 0x8f, 0xbf, 0x8c, 0x9a, 0xdc, 0x8d, 0xb1, 0xd9, 0xff, 0x4e,
+ 0x1b, 0xaf, 0x02, 0x13, 0xc7, 0x63, 0x1d, 0x5c, 0xab, 0xd6, 0x93, 0xa0,
+ 0x1f, 0x3e, 0x0f, 0x9a, 0x5b, 0x4d, 0x42, 0x5d, 0x40, 0xfa, 0x9d, 0x4e,
+ 0x73, 0x4e, 0x96, 0xac, 0x7b, 0x97, 0xad, 0x7b, 0x19, 0x3c, 0x78, 0x39,
+ 0x0b, 0x72, 0x8c, 0xfc, 0x59, 0x27, 0xf3, 0x17, 0x4f, 0xee, 0x1a, 0x5f,
+ 0xd2, 0x71, 0x31, 0xc7, 0x97, 0x27, 0x83, 0xfd, 0xfe, 0x8b, 0x26, 0x1b,
+ 0x7a, 0x1a, 0x05, 0x30, 0xa1, 0x42, 0xb5, 0x86, 0xf0, 0x05, 0x33, 0xc2,
+ 0xe4, 0x61, 0x4f, 0x9e, 0xda, 0x18, 0x26, 0x0f, 0x71, 0x79, 0xff, 0xcd,
+ 0xf4, 0xc1, 0x1b, 0x3d, 0xcf, 0x8a, 0xfb, 0xef, 0xfe, 0xa8, 0x32, 0x3f,
+ 0xee, 0x81, 0x26, 0x75, 0x15, 0x46, 0xf0, 0x3e, 0xa8, 0x68, 0x5e, 0x8d,
+ 0x63, 0x88, 0x34, 0x37, 0x37, 0x91, 0xb9, 0x55, 0x3a, 0x0d, 0x55, 0x18,
+ 0x15, 0x41, 0x55, 0xd0, 0x4c, 0x1e, 0x1a, 0x40, 0x54, 0x94, 0x79, 0x34,
+ 0xae, 0xc4, 0xe7, 0x5a, 0x09, 0x0c, 0x74, 0x6c, 0x54, 0xfd, 0xd2, 0x84,
+ 0x6a, 0x92, 0x1b, 0x13, 0x2f, 0xda, 0x4a, 0x17, 0x2a, 0xce, 0xd2, 0x29,
+ 0xfe, 0xbb, 0xb9, 0xa1, 0xe3, 0x58, 0x95, 0xf0, 0x2b, 0x21, 0x1e, 0x9b,
+ 0xa9, 0x8e, 0x55, 0x9a, 0x95, 0xd8, 0x76, 0x81, 0x55, 0x13, 0x1d, 0xa5,
+ 0x2a, 0x4a, 0x4b, 0x1d, 0x94, 0x5c, 0xed, 0x9f, 0x5c, 0x51, 0x7c, 0x1e,
+ 0x86, 0xd4, 0xc1, 0x92, 0xe5, 0x62, 0x6e, 0x5e, 0xb6, 0x72, 0x13, 0x58,
+ 0x5e, 0x3a, 0x9d, 0xcd, 0x8d, 0xf7, 0x59, 0x89, 0xa9, 0x60, 0x60, 0x9e,
+ 0x9b, 0xb9, 0xce, 0x6d, 0x00, 0xc8, 0x26, 0xaa, 0x9c, 0x19, 0x75, 0x69,
+ 0x82, 0x0c, 0xab, 0x9c, 0x86, 0x11, 0xdf, 0x1e, 0x6e, 0x6e, 0x6c, 0x6e,
+ 0x74, 0xd4, 0xe7, 0x2c, 0xbf, 0x16, 0xde, 0xa0, 0xdd, 0xf5, 0xb1, 0x01,
+ 0xd6, 0x2e, 0x46, 0xda, 0xdf, 0x1d, 0xf4, 0x3b, 0x26, 0x07, 0x4d, 0xdd,
+ 0xe5, 0xcc, 0xe3, 0x99, 0x4e, 0xa7, 0x98, 0xca, 0x80, 0x93, 0x9b, 0x89,
+ 0xc9, 0x45, 0x66, 0x30, 0xcd, 0x79, 0x06, 0x9e, 0xf9, 0xc0, 0xc0, 0xc3,
+ 0xc5, 0x41, 0x85, 0x6c, 0xcb, 0xac, 0xf3, 0xec, 0x06, 0x73, 0x9c, 0xab,
+ 0xa9, 0xb4, 0x4a, 0xe0, 0xdf, 0x76, 0xf5, 0x61, 0x19, 0x95, 0xb1, 0x19,
+ 0x71, 0xe2, 0xd0, 0x7d, 0x1f, 0x29, 0x13, 0x9b, 0x84, 0x51, 0x04, 0xe2,
+ 0x41, 0xf4, 0x52, 0x3a, 0x0c, 0x31, 0xbb, 0x55, 0xd8, 0x9d, 0x18, 0xbb,
+ 0x93, 0x96, 0xba, 0xcd, 0x72, 0x86, 0xca, 0xae, 0x52, 0xe7, 0x18, 0x8c,
+ 0x57, 0xa6, 0xfe, 0x08, 0xf9, 0x4d, 0xb2, 0x3c, 0x11, 0x41, 0x90, 0x02,
+ 0x24, 0x5a, 0xc0, 0x99, 0xaa, 0x42, 0xb8, 0xf9, 0x68, 0x12, 0xe1, 0x67,
+ 0x3c, 0x0d, 0xb2, 0x38, 0xcb, 0x5f, 0xb6, 0x7e, 0xf6, 0x9e, 0xf1, 0xa2,
+ 0xa5, 0x74, 0xe9, 0x54, 0x57, 0x58, 0x06, 0xa9, 0xab, 0x61, 0x19, 0x8e,
+ 0x48, 0xc6, 0xf1, 0x55, 0x40, 0xc7, 0x81, 0xae, 0x0a, 0xec, 0x7b, 0xa6,
+ 0xcb, 0xe5, 0x0c, 0x04, 0x23, 0xea, 0x91, 0xab, 0x51, 0xf2, 0x41, 0x95,
+ 0xe7, 0xdc, 0x45, 0xa9, 0xc7, 0xb1, 0x51, 0x09, 0xac, 0x2e, 0x76, 0xcb,
+ 0x73, 0xa3, 0x58, 0xdf, 0xb2, 0x24, 0x46, 0xa0, 0xc7, 0xb0, 0x18, 0x68,
+ 0xbc, 0xad, 0x8a, 0xcc, 0x51, 0x75, 0x6f, 0x48, 0x74, 0x12, 0xe5, 0x05,
+ 0x3e, 0xe9, 0x20, 0xb0, 0x5b, 0x26, 0x2f, 0x10, 0x18, 0x22, 0xbf, 0x9a,
+ 0x56, 0x08, 0xb8, 0x71, 0x94, 0x9a, 0xa2, 0xa1, 0x9e, 0x22, 0x4b, 0x8c,
+ 0x1a, 0x9a, 0x64, 0x3e, 0x1b, 0x15, 0x22, 0x5b, 0x11, 0x33, 0x14, 0x86,
+ 0x9f, 0x60, 0x6f, 0x1c, 0xc1, 0xc4, 0xb3, 0x69, 0xae, 0xe7, 0xb3, 0xc5,
+ 0x9a, 0x79, 0xe2, 0x21, 0x76, 0x9e, 0x2e, 0xa1, 0x8e, 0x32, 0xe8, 0x82,
+ 0xa9, 0x3c, 0xab, 0xa6, 0xb3, 0xac, 0x2a, 0x5f, 0xa8, 0xdb, 0x19, 0x48,
+ 0xa9, 0x8a, 0x7b, 0xc0, 0x80, 0xf2, 0x46, 0xc7, 0xf4, 0x31, 0x45, 0xe3,
+ 0x15, 0xc1, 0x9a, 0x3b, 0x38, 0x00, 0xf8, 0x54, 0x43, 0x7a, 0x1c, 0x49,
+ 0x2d, 0x05, 0x66, 0xb0, 0xed, 0x45, 0x6c, 0x8a, 0x99, 0x31, 0x25, 0xec,
+ 0x35, 0x0b, 0x2b, 0x9a, 0x3d, 0xde, 0x27, 0x0d, 0xdd, 0x08, 0x23, 0xc5,
+ 0xbc, 0xca, 0xa3, 0x0c, 0x22, 0x2a, 0xe6, 0x3a, 0x70, 0x3b, 0x3c, 0x12,
+ 0x63, 0xd0, 0x93, 0x49, 0x14, 0x47, 0xd6, 0xd0, 0x13, 0x9d, 0x5f, 0x57,
+ 0x73, 0x72, 0x4b, 0xea, 0x59, 0x1e, 0x4d, 0xa3, 0x14, 0x1e, 0x95, 0x18,
+ 0xb1, 0xb2, 0x18, 0xac, 0xac, 0x4c, 0x44, 0x98, 0x4a, 0x34, 0xf9, 0x29,
+ 0x6f, 0x8d, 0xa1, 0x9d, 0x84, 0xd1, 0x4d, 0x14, 0x56, 0x9a, 0x4a, 0x9e,
+ 0x45, 0x05, 0x34, 0x53, 0x9b, 0x5f, 0xd1, 0xf6, 0x6c, 0x73, 0x6f, 0xb7,
+ 0xb3, 0x08, 0x36, 0x41, 0x3e, 0xac, 0x9a, 0x6f, 0x55, 0x11, 0x4d, 0x53,
+ 0xc9, 0xb7, 0xd4, 0x31, 0x25, 0xb2, 0x62, 0xea, 0x43, 0x33, 0x1d, 0x61,
+ 0xfe, 0xb0, 0x08, 0x20, 0x63, 0x3e, 0x89, 0xa7, 0x83, 0x15, 0xb8, 0x69,
+ 0x55, 0x16, 0xd0, 0x19, 0x5d, 0x64, 0x88, 0x4f, 0x0a, 0x86, 0xaa, 0x82,
+ 0xd8, 0xe8, 0x14, 0xcc, 0xfe, 0x76, 0x75, 0xfe, 0x8e, 0x8b, 0xc1, 0xd0,
+ 0x9d, 0x33, 0x78, 0x8b, 0x89, 0x28, 0xec, 0x4b, 0x6b, 0x30, 0x70, 0x04,
+ 0xd9, 0x38, 0x76, 0x0c, 0x8d, 0xc6, 0xf8, 0xa5, 0x52, 0x44, 0xaa, 0x15,
+ 0x0b, 0x7f, 0x1d, 0xdd, 0x51, 0x48, 0x0c, 0x33, 0x4e, 0xef, 0x6a, 0x86,
+ 0x7f, 0x0a, 0x6b, 0x5d, 0x66, 0xa1, 0xa6, 0x10, 0x3e, 0xcc, 0x2b, 0x2d,
+ 0xe8, 0x26, 0x18, 0x0a, 0x45, 0xcc, 0x4d, 0x1e, 0x2f, 0x5e, 0xc0, 0x9a,
+ 0xc9, 0x40, 0xca, 0xe8, 0xc4, 0x08, 0x48, 0x1e, 0xda, 0x9c, 0x03, 0xe5,
+ 0x91, 0x1e, 0x06, 0x8e, 0x61, 0xcf, 0x0b, 0x8c, 0xc0, 0x34, 0x70, 0x80,
+ 0x70, 0x17, 0x38, 0xe3, 0xc1, 0x2f, 0xaa, 0x8d, 0xf3, 0x33, 0x0a, 0xc4,
+ 0x69, 0x46, 0x38, 0x02, 0x80, 0xc8, 0xf2, 0x79, 0x86, 0x38, 0xe2, 0x18,
+ 0xb3, 0x31, 0x45, 0x6d, 0x8f, 0x75, 0x9e, 0xd3, 0x54, 0xb2, 0x71, 0x91,
+ 0xc5, 0x46, 0xbe, 0x42, 0x54, 0x51, 0x0a, 0xa3, 0x8a, 0x42, 0xc4, 0x34,
+ 0x53, 0xec, 0xbc, 0x58, 0x06, 0x01, 0x58, 0xfa, 0x75, 0xe1, 0x55, 0xed,
+ 0x48, 0x20, 0x26, 0x56, 0x12, 0x2e, 0x6e, 0x23, 0xc0, 0x87, 0x61, 0x9c,
+ 0x21, 0x76, 0x83, 0xd4, 0xcb, 0x96, 0x7c, 0xaf, 0x12, 0x6c, 0xbc, 0xd5,
+ 0x70, 0xdf, 0x17, 0xd6, 0x74, 0xc3, 0x68, 0x32, 0x79, 0xd9, 0xfa, 0x1f,
+ 0x10, 0xfe, 0x77, 0x30, 0x9b, 0xfe, 0x1b, 0x6e, 0xf4, 0xbf, 0x2b, 0xee,
+ 0x8f, 0xb0, 0x72, 0x05, 0x83, 0xa8, 0x83, 0x96, 0x10, 0xb8, 0x43, 0x40,
+ 0x2b, 0x0b, 0xeb, 0xa0, 0x62, 0x6c, 0x30, 0xc3, 0x20, 0x82, 0xf1, 0x50,
+ 0x71, 0xd4, 0xec, 0xbc, 0x22, 0x1b, 0xd8, 0xde, 0x4c, 0xdf, 0x18, 0xb7,
+ 0x02, 0x08, 0xb7, 0x54, 0x23, 0x7c, 0x14, 0xd5, 0x1c, 0x91, 0xba, 0x00,
+ 0x13, 0x94, 0x8d, 0x60, 0xa8, 0x99, 0xd1, 0x21, 0x6c, 0x0f, 0x4f, 0x36,
+ 0x20, 0x9e, 0xde, 0x95, 0x26, 0x2d, 0x22, 0x46, 0x8e, 0x73, 0x6b, 0xdf,
+ 0xef, 0x20, 0xe4, 0x4a, 0x4f, 0x8d, 0xda, 0x46, 0x64, 0xdd, 0x19, 0xf6,
+ 0xec, 0x38, 0x4c, 0xf0, 0x61, 0x13, 0xd8, 0x45, 0x6d, 0x37, 0xc3, 0x3d,
+ 0x86, 0xf9, 0xaf, 0x18, 0x28, 0x09, 0xc4, 0xd0, 0x6c, 0xc5, 0x71, 0x46,
+ 0x0e, 0x89, 0x75, 0x7e, 0x6e, 0x80, 0xa8, 0x17, 0xc3, 0xde, 0xfd, 0x81,
+ 0x7e, 0xae, 0x4d, 0x3e, 0x23, 0xc6, 0x9d, 0x8f, 0x86, 0x9e, 0x64, 0xd2,
+ 0x50, 0x46, 0xb8, 0x29, 0xee, 0x3b, 0x86, 0x23, 0x87, 0x92, 0xd6, 0x68,
+ 0x08, 0xc8, 0x36, 0xfa, 0xb9, 0x46, 0x6f, 0xa0, 0xcd, 0x17, 0x43, 0x41,
+ 0x7a, 0xfe, 0xbd, 0xfc, 0xc0, 0x17, 0xfb, 0x72, 0x48, 0x9c, 0xe6, 0x3f,
+ 0xf1, 0x19, 0x5f, 0xe4, 0x15, 0xa8, 0xf6, 0x3c, 0x59, 0xbb, 0x02, 0x34,
+ 0x3d, 0x12, 0x75, 0xd3, 0xb6, 0x11, 0xc5, 0x97, 0xf8, 0xf3, 0xc5, 0xfd,
+ 0x3d, 0xb5, 0x46, 0x5f, 0xfb, 0x3a, 0xec, 0x91, 0xd4, 0xe6, 0xc6, 0xf6,
+ 0x77, 0x52, 0xeb, 0xce, 0x4a, 0x02, 0xd8, 0x2f, 0xd4, 0xba, 0x9d, 0xdb,
+ 0x56, 0xdf, 0x3b, 0x55, 0xa0, 0xef, 0x97, 0xe6, 0xbc, 0xcd, 0x8d, 0xef,
+ 0x98, 0x38, 0x0f, 0x61, 0xc6, 0x17, 0x27, 0xaf, 0x7f, 0x70, 0xc1, 0x8e,
+ 0xc5, 0x31, 0xab, 0x2c, 0x6f, 0x6e, 0x38, 0x6c, 0xe3, 0x6c, 0xc3, 0x52,
+ 0xb4, 0xee, 0x23, 0x19, 0xb1, 0xc3, 0x04, 0x10, 0xd6, 0xfe, 0x2f, 0x51,
+ 0x12, 0x65, 0x45, 0x96, 0x17, 0x3b, 0xa2, 0x03, 0x2b, 0xad, 0x61, 0x0c,
+ 0xfa, 0x45, 0x79, 0x4f, 0x0b, 0x6b, 0x81, 0x7f, 0x8d, 0xf9, 0xbf, 0xf6,
+ 0xd5, 0xb2, 0x81, 0x7f, 0x6b, 0xb2, 0x54, 0x33, 0x98, 0xc0, 0x63, 0xf1,
+ 0xcd, 0x25, 0xa4, 0xb6, 0xf8, 0x7c, 0x22, 0x06, 0xbd, 0x6b, 0xa4, 0x4a,
+ 0xe9, 0x1f, 0x0c, 0x9e, 0xb6, 0x46, 0xea, 0x47, 0x86, 0x7b, 0x4b, 0xf8,
+ 0xd6, 0x6a, 0x52, 0x3a, 0x79, 0xff, 0xf1, 0x38, 0xe9, 0xb1, 0xb5, 0xd6,
+ 0x0e, 0x76, 0xbb, 0x15, 0xfc, 0xb6, 0x5c, 0x6d, 0x6b, 0x2d, 0x81, 0x8b,
+ 0x8f, 0x32, 0xf5, 0xf9, 0xb3, 0xc1, 0x6e, 0xff, 0x60, 0x0b, 0xec, 0x7d,
+ 0x7b, 0xd4, 0xc3, 0x8d, 0xac, 0x27, 0xed, 0x44, 0xf0, 0x7c, 0x7f, 0x30,
+ 0x18, 0x3c, 0x7d, 0x94, 0x74, 0x63, 0xd4, 0x0f, 0x92, 0x8e, 0x11, 0xb7,
+ 0xc0, 0x54, 0x7f, 0x6f, 0x6f, 0xf0, 0x2d, 0xfa, 0x2b, 0x43, 0xff, 0xc3,
+ 0x45, 0xf6, 0xf7, 0xfa, 0xdf, 0xbb, 0x08, 0x86, 0xfe, 0xa8, 0x90, 0x9e,
+ 0xf5, 0x0f, 0xfa, 0xcf, 0xbe, 0x29, 0x24, 0x19, 0xf5, 0xc3, 0xa4, 0x21,
+ 0xd9, 0xef, 0x20, 0xcd, 0x51, 0x96, 0x34, 0xd2, 0x86, 0x82, 0x33, 0x7a,
+ 0xf7, 0xc0, 0x4a, 0xba, 0x2a, 0x67, 0x84, 0x18, 0xfe, 0x19, 0xb8, 0xc2,
+ 0xe6, 0xc1, 0x81, 0x69, 0x8d, 0x86, 0xa9, 0x4e, 0xcc, 0xe8, 0x2a, 0x4a,
+ 0xd4, 0xab, 0x5c, 0x2f, 0x86, 0x3d, 0xf9, 0x39, 0x5c, 0x81, 0x51, 0x23,
+ 0x16, 0xfa, 0xc0, 0x41, 0x51, 0xb9, 0x90, 0x0c, 0xfc, 0xde, 0x94, 0x45,
+ 0xa0, 0xe7, 0x66, 0xd8, 0x5b, 0x1d, 0x04, 0xd2, 0x2c, 0x50, 0x62, 0xe7,
+ 0x1b, 0x7c, 0x2c, 0xb3, 0xc3, 0x72, 0x0c, 0x9a, 0xbf, 0x96, 0x35, 0x81,
+ 0x2e, 0x72, 0x43, 0x6b, 0xb4, 0xee, 0xed, 0xb0, 0x27, 0xd3, 0xe1, 0xe5,
+ 0x96, 0xc3, 0xaf, 0xf0, 0xfa, 0x16, 0x90, 0x48, 0x5d, 0xe8, 0x2c, 0x8e,
+ 0xd6, 0x71, 0x7b, 0x1e, 0xa1, 0xb4, 0x2c, 0xb2, 0x49, 0xf9, 0x3d, 0xfc,
+ 0xfd, 0x0b, 0xa4, 0xe6, 0xfa, 0xd7, 0xc4, 0xcf, 0xb1, 0xfc, 0xad, 0x7b,
+ 0xfb, 0x3d, 0xfc, 0xb9, 0xb4, 0x0e, 0xcc, 0xe0, 0x59, 0x3d, 0xee, 0xaa,
+ 0xf3, 0x2e, 0xfb, 0x2f, 0x39, 0x10, 0xe7, 0xb4, 0x73, 0x1e, 0xfc, 0xad,
+ 0x02, 0xb8, 0x5c, 0xc7, 0xf6, 0xef, 0x69, 0x24, 0x41, 0xb7, 0x5c, 0x6c,
+ 0x6e, 0x00, 0x00, 0x9e, 0xc5, 0x00, 0x34, 0x19, 0x50, 0x06, 0xf0, 0xc4,
+ 0xf1, 0x0c, 0x31, 0x76, 0x9a, 0x89, 0xf0, 0xa9, 0x0b, 0x75, 0xea, 0x7a,
+ 0x41, 0xc0, 0x4e, 0x48, 0xe6, 0x98, 0x7f, 0x73, 0x4f, 0x19, 0xeb, 0xb6,
+ 0x1a, 0x24, 0x45, 0x12, 0xfc, 0xf1, 0x6b, 0x15, 0x05, 0x5d, 0x13, 0x56,
+ 0xad, 0x51, 0xf3, 0xb7, 0xdf, 0x1e, 0x73, 0xe9, 0x23, 0x1b, 0xdc, 0xad,
+ 0x37, 0x08, 0x60, 0xe4, 0x37, 0x78, 0x7a, 0x43, 0x18, 0x02, 0x20, 0xb9,
+ 0x6e, 0x4f, 0x97, 0x55, 0xaa, 0xac, 0x3a, 0x16, 0x45, 0x69, 0x92, 0x02,
+ 0xa5, 0x00, 0xdb, 0x45, 0xdf, 0xe6, 0xd5, 0xc4, 0xc9, 0xaf, 0x46, 0x03,
+ 0x9e, 0x17, 0x55, 0x6a, 0x55, 0x82, 0xca, 0xa8, 0x9b, 0x70, 0x9d, 0xc6,
+ 0xfb, 0xf5, 0x5c, 0xf7, 0x1a, 0xf6, 0xee, 0xaa, 0x25, 0x49, 0x19, 0xa3,
+ 0x2b, 0x40, 0xb3, 0x6f, 0x01, 0x28, 0xa2, 0x78, 0x0d, 0x24, 0x36, 0x2e,
+ 0x00, 0x85, 0xa1, 0x0a, 0x69, 0xba, 0x08, 0xb0, 0xc3, 0x07, 0x2c, 0x3a,
+ 0x27, 0x18, 0x8d, 0xa1, 0x26, 0x00, 0xa1, 0x00, 0x90, 0xd0, 0x84, 0xb6,
+ 0xae, 0xc3, 0x57, 0x0f, 0x38, 0xbb, 0xea, 0x0c, 0x60, 0x6e, 0x9a, 0x01,
+ 0xff, 0x45, 0x02, 0x4a, 0x4d, 0x2a, 0xa5, 0xde, 0xd4, 0x00, 0xcb, 0x47,
+ 0x81, 0x23, 0x29, 0x10, 0xb9, 0x30, 0x39, 0xca, 0x82, 0x36, 0x33, 0x6f,
+ 0x60, 0x22, 0x3e, 0x8a, 0x9e, 0x81, 0xa6, 0x03, 0xc1, 0x81, 0x2c, 0xde,
+ 0x09, 0x28, 0x3f, 0x9b, 0xb1, 0x2f, 0x1f, 0x6f, 0xf5, 0xa2, 0xe6, 0x87,
+ 0xe5, 0xc6, 0x3c, 0x2b, 0xec, 0x76, 0x24, 0x4f, 0x33, 0x8f, 0x03, 0x3c,
+ 0xb2, 0x69, 0x35, 0x93, 0x7a, 0x06, 0xc5, 0x8c, 0x85, 0x6c, 0xac, 0xeb,
+ 0xa1, 0x4d, 0x08, 0x50, 0x6a, 0x8c, 0x88, 0x3b, 0x21, 0xb7, 0xb6, 0x58,
+ 0xe2, 0xaa, 0xfc, 0x8c, 0x62, 0xdd, 0x08, 0xe6, 0xd7, 0xe3, 0x28, 0x16,
+ 0x73, 0x14, 0xb2, 0x63, 0x00, 0x77, 0xcb, 0x37, 0x07, 0xca, 0x22, 0x08,
+ 0x32, 0x56, 0xdc, 0x2b, 0x22, 0xb6, 0xa5, 0x86, 0x17, 0xf6, 0x8a, 0x48,
+ 0x96, 0xcc, 0x58, 0x88, 0xc1, 0x2a, 0x7b, 0x21, 0x85, 0xea, 0xb9, 0x94,
+ 0x63, 0xb6, 0xda, 0xb5, 0xd5, 0x81, 0xb0, 0x80, 0x4c, 0xcf, 0xf2, 0x43,
+ 0xe7, 0x65, 0x64, 0xd8, 0x19, 0xc1, 0xd7, 0x9a, 0x04, 0xd0, 0x65, 0x26,
+ 0x85, 0xf2, 0x78, 0x21, 0x12, 0x39, 0x89, 0x20, 0x3d, 0xa0, 0x10, 0xf6,
+ 0x52, 0xb4, 0x7a, 0x88, 0x42, 0xa9, 0x0f, 0xa7, 0x56, 0xa9, 0xb9, 0xa1,
+ 0x3b, 0xcf, 0x16, 0xe9, 0xba, 0xe6, 0x8c, 0x60, 0x7f, 0x5d, 0xac, 0x74,
+ 0x2f, 0x12, 0x00, 0x8e, 0x9c, 0x28, 0x9e, 0x95, 0x58, 0x54, 0xda, 0xcf,
+ 0x1a, 0x42, 0x97, 0x0e, 0x02, 0x4c, 0xbf, 0x1e, 0xba, 0xb9, 0x61, 0x7b,
+ 0x02, 0xa9, 0xdd, 0xc1, 0xd2, 0x10, 0xc0, 0xcc, 0x56, 0x21, 0x1e, 0x44,
+ 0xf5, 0x25, 0xfa, 0x9a, 0x7e, 0x4b, 0x9e, 0x9b, 0x1c, 0x3a, 0x3b, 0x01,
+ 0xb8, 0xbd, 0xc5, 0x5e, 0xcb, 0xd2, 0xf6, 0x2d, 0x7c, 0x3d, 0x53, 0x34,
+ 0x1a, 0xb8, 0x64, 0x99, 0x7d, 0x15, 0x2c, 0x98, 0xb1, 0xb7, 0x00, 0x53,
+ 0xbb, 0x05, 0xc4, 0x2b, 0x10, 0xf2, 0x35, 0x8a, 0x17, 0x33, 0x8f, 0xb3,
+ 0x85, 0x5d, 0x9c, 0x1a, 0xd8, 0xdc, 0x30, 0x29, 0xca, 0x30, 0x57, 0x4b,
+ 0xab, 0x49, 0x95, 0x4a, 0x8d, 0xb8, 0x8c, 0xe7, 0xf7, 0x15, 0xee, 0xfb,
+ 0x43, 0xb0, 0x38, 0xaf, 0xe2, 0xfb, 0xba, 0x74, 0xfc, 0x18, 0x91, 0xe8,
+ 0x02, 0x16, 0x74, 0xa7, 0x02, 0x2c, 0x5e, 0x5a, 0x8d, 0x58, 0xd7, 0x91,
+ 0x32, 0x1f, 0x81, 0xda, 0x97, 0xfc, 0x6d, 0x61, 0x92, 0x7e, 0x23, 0x72,
+ 0x96, 0x55, 0x6d, 0x15, 0xa1, 0x5d, 0xcf, 0xcb, 0xd9, 0x3c, 0xe7, 0x41,
+ 0x4d, 0x10, 0x4c, 0x1e, 0xa2, 0x6c, 0xf1, 0x4f, 0x6f, 0xe8, 0x3b, 0xe0,
+ 0xfa, 0x4f, 0x4c, 0xbe, 0xe7, 0xb7, 0x8c, 0x2b, 0xae, 0xff, 0x79, 0x38,
+ 0x78, 0x7e, 0xb0, 0xbf, 0x7d, 0xba, 0x23, 0x8a, 0xa2, 0x74, 0x5d, 0xd9,
+ 0x88, 0x1a, 0x93, 0x26, 0x62, 0xc2, 0x1d, 0x31, 0x72, 0x76, 0x1c, 0xbc,
+ 0x63, 0x65, 0x79, 0x1c, 0xaa, 0xcf, 0x2c, 0xbc, 0xb9, 0x63, 0x90, 0x72,
+ 0xa6, 0x62, 0x5b, 0x10, 0x65, 0x2d, 0x0e, 0x58, 0x15, 0x9d, 0xea, 0x08,
+ 0xe2, 0xbb, 0x81, 0x98, 0xda, 0x90, 0x74, 0x89, 0xe0, 0x53, 0x70, 0xc0,
+ 0x2d, 0x42, 0x34, 0x20, 0x32, 0xb6, 0x0b, 0x3b, 0x9a, 0x64, 0x15, 0x1b,
+ 0x37, 0x65, 0x03, 0xc1, 0xaf, 0x6f, 0xa6, 0xad, 0xc3, 0xbd, 0x75, 0x09,
+ 0xd0, 0x55, 0xc3, 0xf9, 0x2c, 0xa7, 0xb7, 0xae, 0x86, 0x5d, 0xa1, 0xf9,
+ 0xa0, 0x8c, 0x55, 0x5f, 0x5b, 0x65, 0x4d, 0xcb, 0xee, 0xc9, 0xe9, 0x80,
+ 0xed, 0xee, 0x7f, 0xf0, 0x3f, 0xff, 0xf4, 0x90, 0x44, 0xa2, 0x63, 0x3a,
+ 0x45, 0xe8, 0x9c, 0xd5, 0xd5, 0xad, 0xec, 0x3e, 0x2a, 0xee, 0x99, 0x60,
+ 0x64, 0x8d, 0x29, 0x4b, 0x59, 0xef, 0xd7, 0xde, 0xe0, 0x3b, 0x13, 0xea,
+ 0xb7, 0xec, 0x96, 0xad, 0x2c, 0xe8, 0x85, 0xc2, 0x96, 0x76, 0x42, 0xec,
+ 0x3a, 0xd6, 0x9e, 0x9e, 0xb7, 0xa5, 0x36, 0x22, 0xa0, 0x51, 0x5f, 0x45,
+ 0xd5, 0xdc, 0xc2, 0x13, 0x21, 0xf2, 0x88, 0xb8, 0xdc, 0xd7, 0x5a, 0x6a,
+ 0x3d, 0x2b, 0xb6, 0xd1, 0xd1, 0xe6, 0x06, 0xd3, 0x00, 0xd7, 0xf4, 0x2d,
+ 0xb7, 0x87, 0xb1, 0x61, 0x35, 0xf0, 0x94, 0x26, 0x98, 0xa5, 0xd8, 0x63,
+ 0x5c, 0xb3, 0x57, 0x34, 0x94, 0x4a, 0xd7, 0x54, 0xdf, 0xaa, 0x00, 0xd6,
+ 0xd7, 0x32, 0x8e, 0x39, 0xef, 0x50, 0x2b, 0x1d, 0x80, 0xd1, 0xfa, 0xc6,
+ 0xc4, 0x8f, 0x6b, 0x74, 0x7f, 0x9f, 0x0a, 0xdd, 0xdf, 0x77, 0xfa, 0xb4,
+ 0xce, 0xdf, 0xd4, 0x1b, 0xec, 0xde, 0x6a, 0x0e, 0xce, 0x97, 0xa8, 0xdf,
+ 0x3f, 0x9e, 0xb5, 0x9d, 0xe9, 0x52, 0x23, 0x66, 0x12, 0xa5, 0xd6, 0x83,
+ 0x87, 0xe3, 0x68, 0xcc, 0xd6, 0x90, 0x70, 0xf0, 0x0a, 0x7e, 0x0a, 0xc5,
+ 0x76, 0xde, 0x19, 0xd3, 0xea, 0xb1, 0x9d, 0xa7, 0xd9, 0x60, 0xbd, 0x66,
+ 0x38, 0x83, 0x8b, 0x4c, 0xd9, 0xae, 0x70, 0xfd, 0x0f, 0xdb, 0xe9, 0xa9,
+ 0xe6, 0x72, 0xa0, 0xd1, 0xa0, 0xf1, 0xf1, 0xf5, 0xf1, 0xe0, 0xd9, 0xde,
+ 0x01, 0xe6, 0x8b, 0xb4, 0xdd, 0x37, 0x26, 0x3d, 0xf7, 0xf1, 0xa0, 0xcf,
+ 0x8f, 0xf7, 0xc5, 0x23, 0x16, 0x2f, 0xa1, 0xa7, 0xd9, 0xe2, 0x25, 0xbb,
+ 0xb6, 0x87, 0x99, 0xb2, 0x6f, 0x2f, 0x4f, 0x8c, 0xcb, 0xcb, 0xca, 0xd5,
+ 0xf5, 0x99, 0xd5, 0xb6, 0x74, 0x48, 0x95, 0x74, 0xee, 0x8b, 0x19, 0x18,
+ 0xbc, 0x7f, 0x22, 0xc3, 0x1e, 0x52, 0x54, 0xaa, 0x04, 0x61, 0x1c, 0xb6,
+ 0x1c, 0x2d, 0x9b, 0x51, 0x56, 0x4e, 0xb6, 0x83, 0x05, 0xe1, 0x44, 0x41,
+ 0xe9, 0xe3, 0x9b, 0x84, 0x51, 0x92, 0xed, 0x78, 0x76, 0x7c, 0xcb, 0x4a,
+ 0xdf, 0x20, 0x20, 0xd8, 0x04, 0xf3, 0x2d, 0x43, 0x79, 0x44, 0x8b, 0x8f,
+ 0x59, 0xf8, 0x9a, 0xa1, 0x56, 0xcb, 0x3b, 0x58, 0x8a, 0xd1, 0x4a, 0x1a,
+ 0x83, 0x69, 0xe4, 0x9b, 0xee, 0xb9, 0x74, 0x8d, 0x0a, 0xa6, 0x80, 0xba,
+ 0x1d, 0x26, 0xbe, 0x20, 0x0e, 0xb9, 0x5e, 0xa2, 0xff, 0x01, 0xf7, 0x9f,
+ 0xc0, 0x0d, 0x8a, 0xe4, 0x6f, 0xf3, 0xde, 0x18, 0x78, 0xcf, 0x17, 0x46,
+ 0x17, 0xb1, 0x60, 0x92, 0xdc, 0x40, 0xf2, 0x25, 0xb9, 0x45, 0x72, 0x7f,
+ 0x80, 0xa9, 0xa4, 0xe9, 0xbc, 0xe4, 0xc9, 0x21, 0x45, 0xd2, 0xe6, 0x16,
+ 0xb2, 0xfc, 0x57, 0xbb, 0x62, 0x6b, 0xf4, 0xe0, 0x95, 0x2b, 0xa8, 0x6d,
+ 0x50, 0x40, 0xea, 0x6f, 0x06, 0x53, 0xf5, 0xff, 0x12, 0x4b, 0x07, 0x36,
+ 0x96, 0x0e, 0x9c, 0xef, 0xbd, 0x58, 0x17, 0xfb, 0xa5, 0xcb, 0xeb, 0x69,
+ 0x1d, 0xe5, 0xc1, 0x0c, 0x31, 0xb3, 0xe8, 0x5d, 0xc8, 0xa1, 0x52, 0x6f,
+ 0xc9, 0x75, 0x6b, 0xa4, 0xdd, 0x37, 0xd7, 0x7e, 0xd1, 0xb9, 0x59, 0xea,
+ 0xa6, 0x0e, 0x6e, 0x5e, 0x7c, 0x29, 0x31, 0xc0, 0xca, 0x9e, 0x44, 0xa2,
+ 0xeb, 0xeb, 0x0e, 0x00, 0x91, 0xd5, 0xf6, 0x38, 0xe1, 0x94, 0xef, 0xd0,
+ 0x22, 0xeb, 0x06, 0xb6, 0x09, 0x6f, 0x0f, 0xb9, 0xdc, 0x01, 0x89, 0xcb,
+ 0x7d, 0xd6, 0x89, 0x9c, 0xa9, 0x20, 0xbc, 0xd7, 0x9d, 0x6e, 0xd7, 0xed,
+ 0x6c, 0xe6, 0x50, 0x75, 0x8c, 0xa8, 0x0a, 0x4d, 0x46, 0x55, 0x62, 0xc1,
+ 0x2c, 0x42, 0xe8, 0xe6, 0x06, 0xdb, 0xc1, 0x99, 0x1c, 0x5e, 0x99, 0x3a,
+ 0x39, 0xae, 0xad, 0x50, 0xbc, 0x1e, 0x1b, 0x3f, 0x9b, 0x26, 0xd3, 0xe3,
+ 0xa6, 0xe5, 0x61, 0x05, 0x6f, 0x02, 0x75, 0x94, 0x89, 0xc3, 0xf9, 0xae,
+ 0x64, 0x6a, 0xab, 0x4f, 0x40, 0x3e, 0x59, 0xc5, 0x5c, 0xa4, 0xce, 0x11,
+ 0xc1, 0x4b, 0x1e, 0xa1, 0x7d, 0x02, 0xfc, 0x6c, 0x2b, 0x80, 0x7b, 0x1d,
+ 0x77, 0x0f, 0x2d, 0xef, 0x9d, 0xb5, 0xbc, 0x7f, 0x61, 0x47, 0x8c, 0x27,
+ 0x62, 0x84, 0x24, 0x6f, 0xf2, 0xac, 0x9a, 0xf3, 0xa4, 0xfb, 0xf9, 0xbe,
+ 0xfc, 0xfb, 0xac, 0xad, 0xd8, 0x1b, 0xaa, 0x59, 0x5a, 0x59, 0xbf, 0xc8,
+ 0xaa, 0x3c, 0x30, 0x2c, 0x0f, 0x1c, 0x37, 0x0e, 0x1b, 0x61, 0x6d, 0xc3,
+ 0xa6, 0x7c, 0x9e, 0x21, 0xc9, 0xd0, 0x13, 0x93, 0x7a, 0x76, 0x73, 0x0a,
+ 0x3b, 0x11, 0x55, 0x01, 0x64, 0x53, 0xff, 0x60, 0x75, 0x12, 0x85, 0x2f,
+ 0x5b, 0xa7, 0xef, 0x5b, 0x23, 0x97, 0xa2, 0xd9, 0x0f, 0xb3, 0x5f, 0x1e,
+ 0x8c, 0x32, 0xe3, 0x74, 0xd2, 0xb2, 0x9d, 0x62, 0x02, 0xa0, 0x57, 0x3a,
+ 0xb8, 0xae, 0x8a, 0xce, 0x7b, 0x5d, 0xe5, 0xea, 0x35, 0x56, 0x45, 0x54,
+ 0x64, 0xce, 0x8e, 0xd5, 0x34, 0xd7, 0x49, 0xa2, 0xf3, 0x9d, 0x26, 0xa9,
+ 0x5e, 0x63, 0x79, 0xdf, 0xeb, 0xf3, 0xbc, 0x15, 0xbe, 0xb2, 0x42, 0xad,
+ 0x6a, 0x92, 0x11, 0x25, 0xd1, 0x19, 0xec, 0x76, 0xfa, 0x7b, 0xea, 0x50,
+ 0x1d, 0x9f, 0x5f, 0xc2, 0xd4, 0xf0, 0xb0, 0x80, 0x74, 0x27, 0x55, 0x2e,
+ 0x49, 0xd5, 0x85, 0x50, 0xec, 0x51, 0x26, 0x3c, 0x9c, 0xb9, 0x8b, 0x09,
+ 0x57, 0xaf, 0xf0, 0xcf, 0xbd, 0x19, 0x6a, 0x9b, 0xd0, 0x00, 0x5f, 0xe0,
+ 0xf9, 0x8c, 0xe5, 0x9f, 0xdf, 0x40, 0xe4, 0xea, 0x04, 0x75, 0x92, 0x9c,
+ 0xdf, 0x70, 0xfe, 0xce, 0xd7, 0xa9, 0xd6, 0xfc, 0x84, 0x06, 0xbb, 0x95,
+ 0x3a, 0x06, 0x36, 0x9f, 0xe8, 0x74, 0xe1, 0x01, 0x61, 0x0d, 0x00, 0x2c,
+ 0x24, 0x28, 0xed, 0xd9, 0xde, 0xe6, 0x86, 0x78, 0x42, 0x9e, 0x65, 0x13,
+ 0x17, 0x48, 0x39, 0xcf, 0xd7, 0x59, 0x87, 0x8a, 0xe8, 0x7c, 0xb2, 0x80,
+ 0x03, 0xe5, 0xa1, 0xeb, 0x88, 0xd6, 0x51, 0x4a, 0x72, 0x1f, 0x53, 0xa3,
+ 0x6d, 0x48, 0xfb, 0xd6, 0x3e, 0xd2, 0xa6, 0xdd, 0x15, 0x53, 0x25, 0xb0,
+ 0x8a, 0x4b, 0x51, 0x24, 0x04, 0xc4, 0xed, 0x8e, 0xf6, 0xdb, 0x3e, 0x77,
+ 0xba, 0xf3, 0x3f, 0x5b, 0x60, 0xce, 0x2d, 0xe8, 0xc7, 0xfa, 0xd8, 0xf4,
+ 0x09, 0xd0, 0x08, 0x4c, 0x34, 0xcd, 0x62, 0x22, 0xe9, 0x6d, 0x9d, 0xc8,
+ 0xb9, 0x62, 0x51, 0x31, 0x44, 0x8c, 0xb3, 0xaa, 0xb4, 0x15, 0x49, 0x6a,
+ 0x6c, 0x16, 0x58, 0x49, 0xdd, 0xce, 0xde, 0x77, 0xda, 0x3c, 0x2f, 0x51,
+ 0x5b, 0x48, 0x0b, 0x5b, 0x1c, 0xe1, 0x6b, 0x37, 0xc9, 0x22, 0x5c, 0xe0,
+ 0xf3, 0x1b, 0x2c, 0x1b, 0xb8, 0xd3, 0x1d, 0x9e, 0xb8, 0x01, 0x2e, 0x39,
+ 0xec, 0x36, 0x8b, 0xe4, 0x2c, 0xed, 0xd4, 0x9f, 0xe1, 0x79, 0x68, 0x2e,
+ 0x95, 0x8b, 0x5c, 0x1f, 0x48, 0x58, 0xb9, 0xe4, 0xb6, 0x58, 0x83, 0x40,
+ 0xc7, 0xc0, 0x13, 0x56, 0xea, 0x1f, 0x7d, 0x9d, 0x54, 0xb4, 0xc1, 0x61,
+ 0x27, 0xcb, 0x21, 0xd3, 0xd5, 0x29, 0x3c, 0x7e, 0x5a, 0xe2, 0x48, 0x3d,
+ 0x9f, 0x1b, 0x36, 0x96, 0x59, 0xf7, 0x05, 0x3c, 0xee, 0x73, 0xc7, 0x9c,
+ 0x98, 0x59, 0xea, 0xe9, 0xfd, 0x79, 0xf5, 0x89, 0x6e, 0x63, 0xa6, 0x44,
+ 0x4d, 0x8c, 0x9e, 0x8a, 0xdf, 0x71, 0x44, 0x18, 0xdd, 0x0c, 0xa4, 0xce,
+ 0x96, 0x5d, 0x7d, 0xf9, 0xf2, 0x45, 0xfe, 0x2f, 0x65, 0x9b, 0x47, 0x89,
+ 0x5b, 0x35, 0x0f, 0x5b, 0x02, 0x78, 0x0b, 0x07, 0x72, 0x0a, 0xe3, 0x64,
+ 0x21, 0x87, 0x8f, 0x75, 0xd1, 0x57, 0xb8, 0xaa, 0xef, 0x83, 0x58, 0xed,
+ 0x72, 0x8f, 0x94, 0xc7, 0xfb, 0x9a, 0xa7, 0xd5, 0xbd, 0x53, 0xf6, 0x80,
+ 0x3b, 0x8a, 0x60, 0x08, 0x51, 0x04, 0xa8, 0xc7, 0x46, 0xc8, 0xdd, 0xc1,
+ 0xd3, 0x01, 0x8c, 0x2e, 0x7b, 0x48, 0x6a, 0x5b, 0x4e, 0xe5, 0xb8, 0x19,
+ 0x2a, 0x7a, 0x29, 0x23, 0x1b, 0xb0, 0x6f, 0x11, 0xfa, 0x33, 0xf9, 0x92,
+ 0x9b, 0x3f, 0xaa, 0x28, 0x77, 0x21, 0xdc, 0x16, 0x52, 0x59, 0x2e, 0x24,
+ 0x0d, 0x77, 0x8f, 0xb1, 0xb4, 0xfa, 0xbc, 0x8a, 0x41, 0x73, 0xac, 0x97,
+ 0x8d, 0x85, 0xc4, 0x59, 0x44, 0xe3, 0xc8, 0x7e, 0xeb, 0x75, 0x64, 0x62,
+ 0xe9, 0x30, 0xc9, 0x69, 0xcb, 0x96, 0xda, 0x5e, 0xb1, 0x24, 0x14, 0x94,
+ 0xde, 0x94, 0x44, 0x26, 0x58, 0xdd, 0xe6, 0x93, 0x95, 0xd3, 0x47, 0x43,
+ 0x48, 0x3d, 0x51, 0xe3, 0x2c, 0x64, 0x9d, 0x84, 0xea, 0x92, 0x58, 0x13,
+ 0x0e, 0x90, 0x63, 0x74, 0xda, 0x21, 0xf8, 0x94, 0x93, 0x58, 0x39, 0xc6,
+ 0x67, 0x2d, 0x76, 0x79, 0x1d, 0xcd, 0xdf, 0x45, 0x3c, 0x20, 0x47, 0xd5,
+ 0xaf, 0xc3, 0xb6, 0x8a, 0x21, 0x73, 0x45, 0xd3, 0x5c, 0x34, 0x39, 0x03,
+ 0x48, 0x65, 0x01, 0x4b, 0x32, 0x35, 0x95, 0x2d, 0x7b, 0x9a, 0x08, 0xb3,
+ 0x8d, 0x8b, 0x2d, 0x68, 0x58, 0xb8, 0x6a, 0xcc, 0x3a, 0x9a, 0x65, 0xce,
+ 0xfe, 0x59, 0x77, 0x66, 0xde, 0x4c, 0xee, 0xd4, 0xf6, 0x55, 0x94, 0xb0,
+ 0x3c, 0x8f, 0xa6, 0xb3, 0xd2, 0x09, 0x42, 0xd4, 0xad, 0x24, 0xab, 0x16,
+ 0x7a, 0x21, 0x67, 0xea, 0xd2, 0x6c, 0x99, 0xf1, 0x12, 0x0c, 0x57, 0xb2,
+ 0xf1, 0x62, 0x92, 0xeb, 0xa9, 0x38, 0xbc, 0x1c, 0xae, 0xb0, 0x18, 0xce,
+ 0xad, 0xcd, 0xbd, 0xff, 0x70, 0x25, 0x5d, 0x0b, 0x5f, 0x37, 0x62, 0xe3,
+ 0xca, 0x86, 0x5b, 0x7a, 0x2c, 0xac, 0x4a, 0x5a, 0x00, 0x56, 0xed, 0x7e,
+ 0xbc, 0xbd, 0xe9, 0xc1, 0xbb, 0x08, 0xd2, 0x28, 0x6b, 0xd0, 0xdc, 0xae,
+ 0xb5, 0xc9, 0x8d, 0x2e, 0xb6, 0xe4, 0x74, 0x59, 0xc7, 0x74, 0x32, 0x0b,
+ 0x95, 0x76, 0xba, 0x72, 0x6b, 0xc3, 0x9f, 0xc3, 0x23, 0x96, 0xba, 0x5e,
+ 0x2e, 0x41, 0x60, 0x20, 0x9e, 0x8a, 0x2d, 0xbf, 0x45, 0x35, 0x5c, 0xa8,
+ 0xe3, 0x18, 0x1b, 0x68, 0x2f, 0x47, 0x10, 0x05, 0xb0, 0x4a, 0xc8, 0x6e,
+ 0xe1, 0xed, 0x75, 0x2f, 0xaf, 0x2d, 0x4c, 0x9d, 0x7c, 0x78, 0x7f, 0xaa,
+ 0xfe, 0x7e, 0x7a, 0x75, 0xe8, 0xe2, 0xb1, 0x82, 0x3b, 0x13, 0x35, 0xf7,
+ 0x6c, 0xb5, 0x4e, 0xa4, 0x9f, 0x62, 0xa3, 0x34, 0xa5, 0x9e, 0xb2, 0x0f,
+ 0x5d, 0x48, 0x29, 0x0d, 0x09, 0x20, 0x65, 0xb9, 0x2d, 0x1e, 0x68, 0xc2,
+ 0x03, 0x0b, 0x1b, 0xc1, 0x24, 0x3e, 0xf1, 0xc6, 0x14, 0x77, 0x2a, 0xc7,
+ 0xa9, 0xd5, 0x18, 0x52, 0xbe, 0xd1, 0x71, 0x05, 0xd6, 0x2a, 0xe8, 0x24,
+ 0x0f, 0x88, 0x03, 0x67, 0xe6, 0x8e, 0x4b, 0x32, 0x2c, 0x41, 0x00, 0x50,
+ 0x28, 0x3b, 0x8b, 0x62, 0x3c, 0xf4, 0xd3, 0xb6, 0x7a, 0x3c, 0xe6, 0x0f,
+ 0x10, 0xea, 0xdf, 0x32, 0x93, 0x50, 0x91, 0xe2, 0xab, 0x41, 0x16, 0x57,
+ 0x49, 0xda, 0xb9, 0x8d, 0x42, 0x44, 0x21, 0xde, 0x80, 0x49, 0x0c, 0x89,
+ 0x7e, 0x9d, 0x44, 0x9d, 0x36, 0xc6, 0x66, 0x0a, 0x56, 0x73, 0xa9, 0xe7,
+ 0x59, 0x44, 0xba, 0xbc, 0x54, 0x66, 0xab, 0x85, 0x82, 0x62, 0xe7, 0x2e,
+ 0x45, 0x04, 0x5d, 0x09, 0x9d, 0xab, 0x45, 0xe5, 0x4a, 0xa6, 0x39, 0xa4,
+ 0x0c, 0xc5, 0xaf, 0x6c, 0xbe, 0x2f, 0x1c, 0x55, 0xbb, 0xd5, 0xfa, 0x8e,
+ 0x1f, 0x2a, 0x12, 0xf8, 0xac, 0xda, 0xde, 0x7d, 0xa6, 0x8e, 0xaa, 0x29,
+ 0xa4, 0xbb, 0xa7, 0x2e, 0xcd, 0x9c, 0x06, 0xea, 0x68, 0xf9, 0x1b, 0x2e,
+ 0x9c, 0xfe, 0x5a, 0x57, 0x08, 0x5e, 0xbc, 0x4e, 0x61, 0xbd, 0x70, 0x9b,
+ 0x9d, 0xb3, 0x0c, 0x86, 0x45, 0xb7, 0x9b, 0x9b, 0x90, 0x35, 0x70, 0x6a,
+ 0x76, 0x9c, 0x1b, 0x5e, 0x9e, 0x9c, 0xd8, 0x90, 0xe7, 0x7b, 0xc8, 0x48,
+ 0xa7, 0x71, 0xdb, 0x6b, 0xd8, 0x5e, 0x3d, 0x2a, 0xef, 0xdf, 0xc7, 0x19,
+ 0x74, 0xfb, 0x76, 0x3a, 0x7c, 0x2b, 0x2a, 0x00, 0xd6, 0x65, 0xed, 0xed,
+ 0x5b, 0xe0, 0x98, 0xe9, 0x4f, 0x3b, 0xf0, 0x7b, 0xf8, 0x22, 0x3d, 0xcd,
+ 0x6a, 0x18, 0xe6, 0x09, 0xb9, 0x8c, 0x19, 0x68, 0x28, 0x04, 0x63, 0x51,
+ 0x08, 0x14, 0xc9, 0x9b, 0x2e, 0x4c, 0x9b, 0x52, 0x68, 0x46, 0x35, 0xc0,
+ 0xbc, 0x38, 0x3e, 0x61, 0x75, 0x02, 0xa1, 0x26, 0xfa, 0x1a, 0x56, 0x06,
+ 0x3d, 0xf3, 0xee, 0x46, 0x11, 0x38, 0x78, 0x52, 0xb2, 0x20, 0xaf, 0x59,
+ 0x74, 0x90, 0x05, 0xa6, 0x25, 0xa6, 0xe6, 0x84, 0xe0, 0xba, 0x49, 0xf0,
+ 0x0a, 0xd7, 0xb7, 0xdd, 0x96, 0xdd, 0x36, 0x82, 0xcd, 0x4a, 0x94, 0xd8,
+ 0xa9, 0xc9, 0x2d, 0x79, 0xb1, 0x64, 0x82, 0xb8, 0x0a, 0xcd, 0x25, 0x45,
+ 0x5c, 0x66, 0x72, 0x1d, 0x0b, 0x20, 0x97, 0x75, 0x52, 0xe4, 0x1a, 0x55,
+ 0x2e, 0xc6, 0xb9, 0x50, 0xce, 0x65, 0xc1, 0x50, 0xdc, 0x21, 0x55, 0x7f,
+ 0xbd, 0x0a, 0xc3, 0x19, 0xb8, 0x78, 0xe9, 0x49, 0x4e, 0x48, 0x9b, 0x9c,
+ 0x39, 0x3d, 0xac, 0xc8, 0xb1, 0x07, 0xcc, 0x00, 0x56, 0x72, 0xb9, 0xce,
+ 0xd2, 0x14, 0x65, 0xbe, 0x9a, 0x7a, 0x3d, 0x5c, 0x90, 0x76, 0xa8, 0x64,
+ 0x55, 0x17, 0x2d, 0xa8, 0x6e, 0x22, 0xbf, 0x6c, 0xfc, 0x2f, 0x5e, 0x42,
+ 0x58, 0x6a, 0x53, 0x7a, 0xce, 0x8c, 0xc1, 0x4c, 0x84, 0x14, 0xf0, 0xac,
+ 0x94, 0x5f, 0x2e, 0xd5, 0x9f, 0x9e, 0xbb, 0x91, 0x92, 0x26, 0x4e, 0xae,
+ 0x4e, 0x5c, 0x26, 0x40, 0x8e, 0x70, 0xeb, 0xdb, 0x5b, 0x2d, 0x92, 0x74,
+ 0xe2, 0xe8, 0x4f, 0xd7, 0xfa, 0x49, 0x5d, 0x89, 0xb0, 0x1a, 0xa5, 0xec,
+ 0xcc, 0x15, 0xbc, 0x22, 0x9a, 0x9d, 0x41, 0x78, 0xa0, 0x2c, 0x5d, 0x6f,
+ 0x3a, 0x0a, 0x6c, 0x5e, 0xd1, 0x97, 0x3b, 0x96, 0xae, 0x4d, 0x46, 0x62,
+ 0x8d, 0xbf, 0x03, 0x10, 0x03, 0x47, 0xad, 0xf8, 0x02, 0x70, 0x90, 0x66,
+ 0x9e, 0x52, 0xdb, 0xbc, 0x4f, 0xc2, 0x4c, 0xeb, 0xc0, 0x21, 0x7b, 0x0f,
+ 0x3f, 0xed, 0x74, 0x1f, 0x8b, 0x02, 0xfd, 0x4e, 0xff, 0xc0, 0xe3, 0x49,
+ 0x7f, 0x65, 0xe8, 0x2f, 0x1d, 0xab, 0x93, 0x8a, 0x57, 0x34, 0xf4, 0x14,
+ 0xaa, 0x69, 0x4b, 0xaf, 0xc0, 0x31, 0x80, 0xc8, 0x7a, 0x71, 0x2a, 0x39,
+ 0x01, 0x8b, 0x43, 0xf8, 0xdd, 0xc7, 0x49, 0x0f, 0x3c, 0xe9, 0x63, 0xb0,
+ 0xd6, 0x29, 0x78, 0x8e, 0x20, 0xd9, 0xd8, 0xda, 0xd6, 0x0b, 0x77, 0x5d,
+ 0x27, 0x44, 0x30, 0xf3, 0xc0, 0xaf, 0xc3, 0x8b, 0x0f, 0x34, 0x33, 0x06,
+ 0xb2, 0x38, 0x2b, 0x0b, 0xd6, 0xe1, 0x65, 0x09, 0x11, 0xb3, 0x9c, 0xb2,
+ 0xab, 0xcb, 0xbd, 0xa7, 0xf5, 0x8b, 0xf6, 0x9f, 0x77, 0x76, 0xff, 0x5a,
+ 0x2f, 0xea, 0xf4, 0x8a, 0x64, 0x16, 0x33, 0x6d, 0x71, 0x0f, 0xa2, 0x36,
+ 0x6b, 0x0d, 0x2c, 0x40, 0x34, 0x34, 0xc2, 0xf6, 0x95, 0xb4, 0x26, 0x81,
+ 0x9e, 0xc8, 0x0f, 0x98, 0x91, 0x16, 0x01, 0x2f, 0x17, 0x75, 0xcc, 0x64,
+ 0x02, 0x23, 0x79, 0x64, 0xb1, 0x67, 0x9d, 0xdd, 0xa7, 0xab, 0xf1, 0xcf,
+ 0x87, 0x1b, 0xc9, 0x33, 0x6a, 0x1b, 0x49, 0xb9, 0x54, 0xff, 0xb5, 0x43,
+ 0x13, 0xb8, 0xe7, 0x37, 0x74, 0x79, 0x71, 0x9b, 0x63, 0xe6, 0x65, 0xc0,
+ 0x68, 0x60, 0x53, 0x64, 0x4d, 0x77, 0x25, 0xe7, 0x5c, 0x5f, 0x67, 0xfc,
+ 0x4f, 0xc5, 0x6a, 0xf9, 0x21, 0x64, 0x3f, 0x12, 0x2f, 0x93, 0xab, 0x3f,
+ 0xc9, 0x1c, 0x68, 0xb8, 0xbe, 0x0d, 0x43, 0x8b, 0xe5, 0x6d, 0x19, 0xc4,
+ 0x0f, 0x02, 0x3f, 0x5a, 0x36, 0xf4, 0x88, 0x1c, 0x50, 0xdf, 0xe9, 0x91,
+ 0x03, 0x89, 0xab, 0x63, 0x22, 0x61, 0x6b, 0xd3, 0x6f, 0xdf, 0x1e, 0xef,
+ 0x74, 0x1f, 0xdf, 0x5d, 0xa3, 0x48, 0x99, 0x03, 0x4f, 0x72, 0x45, 0x81,
+ 0x53, 0xc8, 0x46, 0xd7, 0xd2, 0x13, 0x16, 0x64, 0x00, 0xb7, 0x6c, 0x84,
+ 0x6d, 0x78, 0xb1, 0xbd, 0x90, 0x66, 0x2b, 0x03, 0xe9, 0x9e, 0x6d, 0x09,
+ 0xb7, 0x1d, 0x7f, 0x25, 0x11, 0x0c, 0x6e, 0xb5, 0x2d, 0x6e, 0xb0, 0xd7,
+ 0xf4, 0x1e, 0xee, 0x87, 0xe7, 0x0c, 0x44, 0x3b, 0x51, 0xd9, 0xb6, 0xd0,
+ 0xa7, 0xfe, 0x62, 0xe3, 0x07, 0x0c, 0xe7, 0xf4, 0xfc, 0x82, 0x57, 0x5d,
+ 0x19, 0xd2, 0xed, 0xc8, 0x2e, 0xaf, 0xa7, 0xa9, 0xcf, 0xc0, 0x8c, 0x16,
+ 0xe1, 0x91, 0x35, 0x9f, 0x27, 0x64, 0x1a, 0xa5, 0x14, 0xc8, 0xe5, 0x2a,
+ 0x5b, 0xa5, 0x33, 0xb7, 0xa6, 0xae, 0xb0, 0xe8, 0xc2, 0x05, 0x6c, 0x5b,
+ 0xaf, 0x46, 0x69, 0x45, 0xe3, 0x4a, 0xe6, 0xc5, 0x99, 0x54, 0x36, 0xb7,
+ 0x06, 0xcc, 0xf2, 0x70, 0xc5, 0x66, 0x78, 0x1f, 0x66, 0xba, 0x9b, 0x1b,
+ 0xce, 0xe4, 0x74, 0x55, 0xc2, 0x3d, 0x4b, 0x0f, 0xf0, 0x6c, 0x60, 0x59,
+ 0xd8, 0x6b, 0x7d, 0x64, 0x64, 0xbc, 0x60, 0xc3, 0x6c, 0x4f, 0x02, 0xfe,
+ 0x53, 0xeb, 0xd2, 0xe6, 0x4e, 0xf3, 0x80, 0xa9, 0xb0, 0x8a, 0x7a, 0x85,
+ 0x01, 0x9b, 0x1b, 0x1f, 0x04, 0xf7, 0xb3, 0x7b, 0x6f, 0xb7, 0x15, 0x58,
+ 0x6b, 0xb1, 0x57, 0x20, 0xad, 0x91, 0x8a, 0x68, 0xa5, 0x7e, 0x80, 0x40,
+ 0x98, 0x2d, 0xec, 0x49, 0x57, 0x49, 0xff, 0x8c, 0x23, 0x9b, 0x7c, 0x79,
+ 0x16, 0xc5, 0x54, 0x74, 0xe7, 0x9a, 0xfb, 0x5e, 0x05, 0x8e, 0xdc, 0x63,
+ 0xb1, 0xa1, 0xbf, 0xdf, 0xd9, 0xeb, 0x37, 0xcc, 0xdb, 0xe5, 0x00, 0xc4,
+ 0xa6, 0xb6, 0x87, 0x0b, 0x05, 0x00, 0x02, 0x62, 0x9b, 0x4b, 0xf5, 0xed,
+ 0x95, 0x9c, 0xbf, 0xb9, 0xe1, 0x4e, 0x04, 0x44, 0x8a, 0x72, 0x39, 0x6f,
+ 0x96, 0xa1, 0xd4, 0x60, 0x07, 0xfb, 0x8f, 0xb6, 0x3a, 0x27, 0x3b, 0x40,
+ 0x4e, 0x4e, 0xce, 0x57, 0x70, 0x7b, 0x40, 0x2a, 0x64, 0x50, 0x93, 0xbb,
+ 0x33, 0xa8, 0xd7, 0x99, 0x18, 0xba, 0x40, 0x23, 0x48, 0x96, 0x50, 0xec,
+ 0x1e, 0x42, 0xb2, 0x07, 0x7f, 0xb3, 0x68, 0x1c, 0x95, 0x6b, 0xb3, 0x8e,
+ 0x8a, 0x96, 0x09, 0xc5, 0x1d, 0xb3, 0x74, 0xd5, 0xd5, 0x87, 0xcd, 0x8d,
+ 0x93, 0x0f, 0x87, 0x70, 0x6f, 0xc8, 0x9b, 0x12, 0x5b, 0xb2, 0x69, 0x0f,
+ 0xf4, 0xc4, 0x39, 0xc3, 0x25, 0x11, 0x91, 0x33, 0x50, 0x42, 0x15, 0xb3,
+ 0xfb, 0xbe, 0xac, 0x23, 0xd2, 0xad, 0x52, 0x2e, 0xef, 0x49, 0x3a, 0x40,
+ 0x98, 0x85, 0x25, 0xd8, 0x34, 0x20, 0xe0, 0x0e, 0x50, 0xd4, 0xb6, 0x8a,
+ 0xed, 0x40, 0x29, 0x63, 0x43, 0x04, 0x4e, 0xb9, 0x3d, 0x38, 0x71, 0xb0,
+ 0x46, 0xaf, 0x63, 0xbb, 0xfb, 0xa8, 0x3a, 0x76, 0x9f, 0xfb, 0xd0, 0x76,
+ 0xa3, 0xed, 0x7d, 0x4e, 0x09, 0x8a, 0x5f, 0x1f, 0x5f, 0xab, 0xef, 0x5e,
+ 0xbb, 0xe0, 0x50, 0x5d, 0xba, 0xdb, 0x73, 0x2a, 0x8b, 0x43, 0xf5, 0xfa,
+ 0xec, 0xfd, 0xd1, 0x3b, 0x75, 0x7a, 0x72, 0x76, 0x55, 0xd7, 0xf6, 0xb6,
+ 0x30, 0x15, 0x45, 0x87, 0x3c, 0x2a, 0xf3, 0xc7, 0x7b, 0x5d, 0x77, 0x8f,
+ 0x52, 0x65, 0x81, 0x3d, 0x27, 0x70, 0xc8, 0xec, 0x2f, 0x94, 0xb7, 0x03,
+ 0x1c, 0x12, 0x75, 0xef, 0xe6, 0x71, 0x06, 0xd5, 0xfc, 0x66, 0xd2, 0x7c,
+ 0xc1, 0xe3, 0x92, 0x2c, 0x99, 0x17, 0x19, 0xdb, 0x6a, 0xf3, 0x0a, 0x29,
+ 0xc5, 0x48, 0xaf, 0x9d, 0x38, 0x7f, 0x05, 0x6b, 0x58, 0x9c, 0x5f, 0x96,
+ 0x70, 0xc3, 0xae, 0x4b, 0x48, 0xea, 0xe3, 0xf9, 0x89, 0xaf, 0xd7, 0xc4,
+ 0x6e, 0x6d, 0x9a, 0x97, 0x4a, 0x23, 0xbb, 0x6f, 0xcc, 0x6a, 0xfb, 0x97,
+ 0x9d, 0xaf, 0x18, 0xf4, 0xee, 0xc1, 0xaa, 0x44, 0x3e, 0x39, 0x29, 0x7a,
+ 0xa3, 0xa5, 0xfa, 0x07, 0xea, 0x6d, 0x05, 0x8e, 0xa4, 0x90, 0x3b, 0x14,
+ 0xaf, 0x13, 0x94, 0x37, 0x61, 0x75, 0x88, 0x97, 0x58, 0x26, 0xf2, 0x95,
+ 0xc4, 0x12, 0x52, 0x6d, 0xd7, 0x01, 0x6f, 0x79, 0x5a, 0xf0, 0x1a, 0xc1,
+ 0x3b, 0x56, 0xa7, 0xae, 0xe4, 0xf8, 0x78, 0x0a, 0x19, 0xc6, 0x48, 0x33,
+ 0xd8, 0x36, 0x98, 0x94, 0x15, 0x65, 0x0b, 0x1e, 0x9a, 0x4a, 0x10, 0xa8,
+ 0xef, 0xdc, 0xea, 0x34, 0x05, 0x8a, 0x0e, 0x8c, 0xef, 0xe4, 0x12, 0xa4,
+ 0xe6, 0x51, 0x60, 0xdb, 0x87, 0xab, 0xb2, 0xc0, 0x37, 0xb9, 0xe0, 0xe9,
+ 0x04, 0xe2, 0x4c, 0x0f, 0x0b, 0x5e, 0xe9, 0xe9, 0xbd, 0xac, 0xb3, 0x1c,
+ 0xb7, 0xac, 0x78, 0xdd, 0x75, 0xda, 0xf4, 0x5a, 0x40, 0x7a, 0xe9, 0xc3,
+ 0x4c, 0x4c, 0x44, 0x02, 0xbb, 0x27, 0xfa, 0x58, 0x82, 0x8c, 0xae, 0xcf,
+ 0xa8, 0xa0, 0x2b, 0xfa, 0x96, 0x53, 0x50, 0xa0, 0xa9, 0xfa, 0x43, 0x7d,
+ 0x0e, 0xb9, 0x5c, 0x99, 0x96, 0x81, 0x4c, 0x0e, 0xd7, 0x99, 0x32, 0x8c,
+ 0x27, 0xf3, 0xae, 0xba, 0xc4, 0x56, 0xe6, 0xca, 0xe3, 0xb9, 0x3f, 0x01,
+ 0xe5, 0x1c, 0xac, 0x79, 0x72, 0xd7, 0xef, 0xa7, 0xe2, 0x85, 0x49, 0xf1,
+ 0x98, 0x17, 0x3c, 0xbd, 0xd7, 0xaa, 0x9a, 0x88, 0xbc, 0x56, 0xdb, 0x53,
+ 0x04, 0x7e, 0xd2, 0x19, 0x66, 0x66, 0x77, 0xdd, 0x71, 0x7b, 0xc6, 0x18,
+ 0x61, 0x57, 0xb1, 0x86, 0xfc, 0x53, 0x16, 0xb0, 0xb4, 0x43, 0xdf, 0xb2,
+ 0x92, 0xeb, 0xef, 0xee, 0x3e, 0x39, 0x88, 0x55, 0xb9, 0x1c, 0x78, 0xf2,
+ 0x48, 0x9b, 0xa5, 0x01, 0xe4, 0xc7, 0x90, 0xdf, 0xb1, 0x77, 0x7c, 0x0f,
+ 0xd9, 0x7f, 0x42, 0x52, 0x05, 0xa8, 0xde, 0xdc, 0x70, 0xd7, 0x44, 0x67,
+ 0x8b, 0xf9, 0xcc, 0xa4, 0x72, 0x0c, 0xe2, 0xb2, 0x95, 0x04, 0x62, 0x2c,
+ 0x61, 0x52, 0x56, 0x99, 0x62, 0x5a, 0x89, 0xf9, 0xca, 0xa6, 0x06, 0x6b,
+ 0x80, 0x84, 0x8d, 0x9c, 0x94, 0x0c, 0xf2, 0x34, 0xa2, 0xe3, 0x79, 0x5b,
+ 0xfd, 0x76, 0x65, 0xa9, 0x17, 0x26, 0x9e, 0x3c, 0x42, 0x6c, 0xaf, 0xb3,
+ 0x27, 0xb8, 0xcb, 0x17, 0xad, 0x87, 0xae, 0x83, 0xf7, 0xb5, 0xbe, 0x22,
+ 0x26, 0x35, 0x83, 0x85, 0x78, 0xbd, 0x38, 0xae, 0xf2, 0x7e, 0xab, 0xb6,
+ 0x33, 0x9f, 0x28, 0x6b, 0xcb, 0xdf, 0x69, 0xbb, 0x9b, 0xca, 0x30, 0x80,
+ 0x9c, 0xd9, 0xeb, 0x0d, 0x62, 0xc9, 0x44, 0xe7, 0x63, 0x97, 0x20, 0x4e,
+ 0x3f, 0xbe, 0x5a, 0x29, 0xf2, 0xb6, 0x81, 0x1b, 0x6b, 0x9f, 0xe1, 0xf1,
+ 0x7e, 0x54, 0xf0, 0x0f, 0x06, 0x00, 0x01, 0xb3, 0xca, 0x27, 0x75, 0x9b,
+ 0x75, 0xeb, 0x54, 0x1a, 0xaa, 0x33, 0xf9, 0x3b, 0xa8, 0x1a, 0x36, 0x64,
+ 0xbc, 0xbd, 0x8f, 0xea, 0x4e, 0x8c, 0x70, 0xe5, 0x92, 0xb1, 0x45, 0x45,
+ 0x4d, 0xec, 0x0d, 0x4b, 0x70, 0x48, 0x59, 0xda, 0x89, 0xae, 0x42, 0xee,
+ 0xda, 0x3e, 0x8c, 0x33, 0x62, 0x5b, 0x14, 0x00, 0x63, 0xf2, 0xb4, 0xdc,
+ 0xb6, 0x3b, 0x7c, 0x63, 0x06, 0xff, 0x73, 0xef, 0x1f, 0xb5, 0xc6, 0xbd,
+ 0x7b, 0x11, 0x45, 0x4a, 0xb2, 0xb5, 0x3d, 0xd3, 0x65, 0x3f, 0xb4, 0x6d,
+ 0x55, 0x7a, 0x05, 0xd3, 0x44, 0x54, 0x04, 0xdf, 0x26, 0x65, 0x1e, 0xe4,
+ 0xd1, 0x43, 0x89, 0xb4, 0x78, 0x5d, 0xc5, 0xba, 0xdd, 0xec, 0x3f, 0xbc,
+ 0x05, 0x27, 0xaf, 0xb2, 0x42, 0xe3, 0xb1, 0xa9, 0x92, 0xb6, 0xba, 0xd0,
+ 0x55, 0xcc, 0x5e, 0x3b, 0x9c, 0xb9, 0xed, 0xe2, 0x35, 0x2c, 0x03, 0xe2,
+ 0x48, 0xf8, 0x37, 0x32, 0xee, 0x98, 0x76, 0x06, 0x79, 0x23, 0xde, 0x4f,
+ 0x89, 0xdc, 0x22, 0xd9, 0x57, 0x4b, 0x20, 0x8c, 0xb5, 0xe7, 0x96, 0xda,
+ 0x16, 0x5e, 0x78, 0x48, 0xe1, 0x3b, 0x3b, 0xa5, 0xbd, 0xe7, 0x72, 0x23,
+ 0x17, 0x10, 0x10, 0xe1, 0x19, 0x07, 0xfe, 0xc6, 0x3f, 0x41, 0x08, 0x6d,
+ 0xf5, 0x89, 0xed, 0x1c, 0x95, 0xe5, 0x27, 0xb6, 0x22, 0xc4, 0x1c, 0xdf,
+ 0x39, 0xf9, 0xe1, 0xfd, 0xa9, 0x58, 0x88, 0xfd, 0x64, 0xef, 0xec, 0x88,
+ 0x0f, 0xad, 0xb4, 0x1d, 0xc1, 0xa8, 0x4d, 0xa3, 0xcb, 0x3f, 0xf8, 0x70,
+ 0x4d, 0x0d, 0xed, 0x3a, 0x72, 0xf6, 0xb0, 0x92, 0xc7, 0xe5, 0xfe, 0xb4,
+ 0x72, 0x1e, 0xb3, 0x04, 0x5a, 0x65, 0xe1, 0x16, 0x6b, 0xf1, 0x6a, 0x84,
+ 0xdb, 0xf6, 0x0d, 0xa0, 0x85, 0x14, 0xe2, 0xda, 0xde, 0xda, 0xb1, 0x76,
+ 0x5a, 0xff, 0x71, 0x90, 0x63, 0xb0, 0xab, 0xb6, 0xcf, 0xb6, 0x78, 0xc2,
+ 0x82, 0xdd, 0x47, 0xa5, 0xe3, 0x55, 0xd9, 0x3f, 0xcd, 0x03, 0x23, 0x9b,
+ 0x1b, 0xbc, 0x14, 0xe1, 0x8f, 0x7d, 0x01, 0xa4, 0x64, 0xe3, 0xa4, 0x27,
+ 0xf7, 0x79, 0x6a, 0x2c, 0xe1, 0x0b, 0x75, 0xf9, 0x51, 0xc3, 0xbf, 0x9d,
+ 0xc7, 0x8d, 0x64, 0x7f, 0xd5, 0x48, 0xfe, 0xaf, 0xbd, 0x7f, 0x5d, 0x6e,
+ 0xe4, 0x48, 0xf2, 0xc5, 0xc1, 0xef, 0x34, 0xe3, 0x3b, 0x64, 0x43, 0xdb,
+ 0x22, 0xa9, 0x06, 0xc0, 0xfb, 0xad, 0x28, 0x51, 0x0b, 0x82, 0xa0, 0xc4,
+ 0x9e, 0xba, 0x9d, 0x22, 0x25, 0x75, 0x1f, 0x99, 0x66, 0x2c, 0x09, 0x24,
+ 0xc9, 0x9c, 0x02, 0x90, 0x6c, 0x24, 0x50, 0x2c, 0xca, 0x64, 0xfb, 0x3e,
+ 0xfb, 0x28, 0xfb, 0x14, 0xfb, 0x65, 0xcd, 0xf6, 0x25, 0xce, 0x87, 0x0d,
+ 0xbf, 0x45, 0x78, 0x44, 0x46, 0x02, 0x60, 0xa9, 0x6a, 0xce, 0x9c, 0xb5,
+ 0x7f, 0x5b, 0xab, 0x08, 0x24, 0x32, 0x23, 0xe3, 0xe2, 0xe1, 0xe1, 0xd7,
+ 0x9f, 0x1b, 0x66, 0xfe, 0x34, 0x36, 0x92, 0x01, 0x1e, 0x15, 0x8f, 0x05,
+ 0xb4, 0xff, 0x5e, 0x79, 0xfa, 0xe1, 0xe4, 0x01, 0xe3, 0x2d, 0x48, 0x70,
+ 0x66, 0xf6, 0x47, 0x4f, 0xce, 0xab, 0x8a, 0x6e, 0x11, 0x68, 0x6f, 0x0b,
+ 0xbb, 0x00, 0x9f, 0xb6, 0xdb, 0x64, 0x3b, 0x85, 0x48, 0x0f, 0x3c, 0xc8,
+ 0xc1, 0xea, 0x05, 0xe2, 0x2b, 0xda, 0xab, 0xd7, 0x50, 0x34, 0xc6, 0x6f,
+ 0xd9, 0x47, 0xd8, 0x36, 0x60, 0x2b, 0xe1, 0x58, 0x04, 0xc3, 0xe8, 0x40,
+ 0x61, 0xa4, 0x1c, 0x14, 0xf4, 0xe9, 0x42, 0x02, 0x06, 0x3e, 0x0e, 0xcc,
+ 0x8a, 0x5b, 0x99, 0x43, 0xf9, 0x56, 0xbb, 0x1b, 0xa5, 0x86, 0xb2, 0x3f,
+ 0x38, 0xef, 0x2f, 0xa8, 0x05, 0xb0, 0xab, 0x93, 0xdb, 0x21, 0xd0, 0x13,
+ 0xd1, 0xbb, 0x84, 0xe5, 0x41, 0x66, 0x93, 0x78, 0x99, 0xe6, 0xb7, 0x5d,
+ 0xd1, 0xab, 0x64, 0x63, 0x91, 0xe7, 0x13, 0xf2, 0x63, 0x88, 0xbb, 0xab,
+ 0xcd, 0x55, 0x7b, 0xf6, 0xe3, 0xa4, 0x45, 0xda, 0x34, 0xfa, 0xa6, 0x39,
+ 0x7e, 0xc0, 0x52, 0x46, 0x1e, 0x27, 0xbe, 0xe1, 0x9e, 0x6c, 0xf2, 0x0f,
+ 0x18, 0xde, 0x83, 0xe9, 0x57, 0x4b, 0xb7, 0xeb, 0x8b, 0xc4, 0x36, 0x95,
+ 0xac, 0x30, 0x3b, 0x0c, 0x4f, 0x72, 0x8e, 0x05, 0x47, 0x89, 0xe2, 0x97,
+ 0x5f, 0x7e, 0x01, 0xc9, 0x45, 0x6c, 0xaf, 0x9d, 0x87, 0x49, 0x3e, 0x44,
+ 0x4f, 0x0d, 0x52, 0x09, 0xda, 0xa5, 0x90, 0x8f, 0xb2, 0x71, 0xd4, 0x12,
+ 0x20, 0x93, 0xb7, 0x36, 0xad, 0xaf, 0x67, 0x6d, 0x73, 0x86, 0x81, 0xcd,
+ 0xb7, 0xe8, 0x93, 0x88, 0x0e, 0xe9, 0x46, 0xce, 0x74, 0xe3, 0x6c, 0x05,
+ 0x1f, 0x3b, 0x5b, 0x70, 0x1f, 0x66, 0x13, 0x42, 0xfa, 0xe0, 0x09, 0xe5,
+ 0xe6, 0xb1, 0xe2, 0x63, 0x2e, 0xe0, 0xd9, 0x4f, 0xc9, 0x86, 0x90, 0x56,
+ 0x48, 0x27, 0x8e, 0x79, 0x17, 0xe4, 0x63, 0x18, 0x7d, 0xbc, 0x40, 0x63,
+ 0x2d, 0x0c, 0x0a, 0x13, 0x9f, 0x48, 0x6e, 0x1a, 0x66, 0x77, 0x39, 0x05,
+ 0x44, 0x45, 0x67, 0xea, 0xa0, 0xb5, 0xbd, 0xdd, 0xda, 0xde, 0xf1, 0xb7,
+ 0x01, 0x0a, 0x91, 0x33, 0x8c, 0x60, 0x22, 0xc3, 0x32, 0x8a, 0xb3, 0x24,
+ 0x75, 0xa1, 0x8f, 0x01, 0x8d, 0x01, 0xe6, 0x5d, 0xaf, 0x7f, 0x7a, 0x75,
+ 0xd6, 0x7b, 0xd7, 0x3b, 0x67, 0x57, 0x09, 0x0d, 0x68, 0x04, 0xea, 0x35,
+ 0xa5, 0x02, 0x65, 0x39, 0x31, 0xba, 0x22, 0x39, 0xfb, 0xe9, 0xe5, 0xcb,
+ 0xde, 0xf5, 0x15, 0x50, 0x30, 0x78, 0x15, 0xf8, 0xb9, 0xb6, 0x93, 0x75,
+ 0x89, 0x85, 0xbc, 0x06, 0xf6, 0x6a, 0x38, 0x07, 0xfe, 0x4d, 0xd6, 0xc1,
+ 0x23, 0x00, 0xbc, 0xc4, 0xc8, 0x4d, 0x5d, 0xa1, 0x8b, 0x49, 0xfe, 0xc1,
+ 0x08, 0x10, 0x2d, 0x91, 0x67, 0xcd, 0xac, 0x26, 0x6c, 0x9b, 0xe8, 0xa3,
+ 0x04, 0x8c, 0xac, 0x01, 0x6d, 0xe9, 0x4e, 0x59, 0x58, 0xc3, 0x99, 0x5b,
+ 0xeb, 0x9e, 0x77, 0xae, 0x3b, 0xf6, 0x9a, 0x99, 0x29, 0x43, 0x9b, 0x23,
+ 0x38, 0xa2, 0xca, 0x42, 0xcc, 0x18, 0x78, 0xa8, 0x3b, 0x1e, 0xff, 0x22,
+ 0x39, 0xa7, 0xe9, 0xc7, 0xf0, 0x35, 0x0c, 0xa4, 0xd4, 0x47, 0x16, 0xdd,
+ 0x4f, 0xfa, 0xc4, 0xaf, 0xff, 0x9e, 0xde, 0xf4, 0x7f, 0x03, 0x75, 0x06,
+ 0x3d, 0x51, 0x25, 0x0a, 0x5f, 0x13, 0x08, 0x1d, 0x29, 0xef, 0x8b, 0x99,
+ 0x61, 0x00, 0xa0, 0x08, 0xff, 0x27, 0x6c, 0xfb, 0x5f, 0xb7, 0x5a, 0xc7,
+ 0xbf, 0xc1, 0x26, 0x36, 0x0a, 0x8f, 0x91, 0x2b, 0x8d, 0x74, 0xf7, 0xb2,
+ 0x90, 0x80, 0x24, 0x30, 0x98, 0xa2, 0xa5, 0xc8, 0xa6, 0x4c, 0x4d, 0xc1,
+ 0xeb, 0x0a, 0x67, 0xec, 0x0b, 0x4e, 0x3f, 0xfb, 0x3e, 0x59, 0x87, 0xe3,
+ 0xfb, 0x5f, 0x33, 0x52, 0xb7, 0xcc, 0xdc, 0xbc, 0x19, 0x83, 0x37, 0x83,
+ 0x14, 0x55, 0x58, 0x96, 0xd4, 0x28, 0xc4, 0xe8, 0x16, 0x47, 0xd3, 0x26,
+ 0xe4, 0xcf, 0xb6, 0x71, 0x38, 0x68, 0xb5, 0xb4, 0xa9, 0x9e, 0x64, 0x89,
+ 0x63, 0x15, 0x1c, 0x66, 0xcd, 0x74, 0xb9, 0x67, 0x4d, 0xb7, 0xb7, 0x69,
+ 0x3e, 0x04, 0x77, 0x1c, 0x77, 0x1e, 0xa4, 0x42, 0xb2, 0x95, 0x4b, 0xd0,
+ 0xdc, 0x80, 0x75, 0xaf, 0xf2, 0x84, 0x55, 0x29, 0x58, 0x47, 0x0c, 0x24,
+ 0x65, 0x29, 0xdc, 0x2c, 0x97, 0xe9, 0xed, 0x04, 0xf2, 0xef, 0xce, 0xf1,
+ 0x06, 0xf1, 0xed, 0x18, 0xfd, 0xa3, 0x40, 0x57, 0x9f, 0xf3, 0x1c, 0xde,
+ 0x80, 0x1c, 0x68, 0x3a, 0x08, 0x7d, 0xb8, 0x44, 0x45, 0x8f, 0xf2, 0xd1,
+ 0xd8, 0x74, 0x47, 0x1e, 0xe7, 0x11, 0x9a, 0xa7, 0xad, 0x76, 0xfc, 0x2e,
+ 0xc3, 0xa0, 0x53, 0x69, 0x02, 0x47, 0x20, 0x1b, 0x12, 0xce, 0xb4, 0x64,
+ 0xd6, 0x7a, 0x6d, 0xfe, 0xe7, 0x86, 0x4e, 0xfa, 0xc9, 0x07, 0xf0, 0x65,
+ 0xbc, 0x34, 0xef, 0xe9, 0x80, 0xe9, 0x42, 0x76, 0xb1, 0xe1, 0xe6, 0xc5,
+ 0xe3, 0xf8, 0x85, 0x25, 0xb3, 0x8a, 0x8e, 0xac, 0x55, 0xfc, 0x17, 0xac,
+ 0xe9, 0xf7, 0x41, 0x1d, 0x98, 0x8a, 0x35, 0x07, 0x6d, 0x85, 0x29, 0xf6,
+ 0x03, 0xb3, 0x1c, 0x1b, 0xd6, 0x2c, 0xf2, 0xe2, 0xc5, 0x77, 0x49, 0xff,
+ 0xa1, 0x41, 0xd1, 0x06, 0xc9, 0x5d, 0x51, 0x0c, 0xe2, 0xec, 0x90, 0x36,
+ 0xe3, 0x76, 0x64, 0x33, 0x5a, 0xf3, 0x1a, 0x69, 0x02, 0x68, 0xf5, 0xbb,
+ 0xe7, 0x90, 0x5c, 0x1c, 0xbd, 0x12, 0xd2, 0x38, 0x5c, 0xcd, 0x7a, 0x09,
+ 0xdc, 0x41, 0x58, 0xff, 0xce, 0xad, 0xf9, 0xef, 0xbc, 0xc8, 0x3f, 0x26,
+ 0x9b, 0x36, 0x68, 0x58, 0x0b, 0x62, 0x63, 0xde, 0xb0, 0x5a, 0x8c, 0x83,
+ 0x1e, 0x5a, 0x2d, 0x1d, 0xce, 0x9c, 0x4a, 0x4f, 0x9a, 0x51, 0xb3, 0x00,
+ 0x68, 0x20, 0x86, 0x95, 0xa1, 0xfa, 0x38, 0x28, 0x5e, 0xb0, 0xce, 0x33,
+ 0x7a, 0x30, 0xa3, 0xe2, 0x90, 0x4e, 0x34, 0x4b, 0x15, 0x60, 0xb6, 0x23,
+ 0x73, 0x38, 0x78, 0x70, 0xfb, 0xfe, 0xda, 0x94, 0xd0, 0xdb, 0x31, 0x84,
+ 0xfe, 0x41, 0xdf, 0xf1, 0x06, 0x4a, 0x07, 0x2a, 0xeb, 0x54, 0xf8, 0x03,
+ 0x30, 0x89, 0xee, 0xda, 0x43, 0x13, 0xde, 0xca, 0xf2, 0xc7, 0x8f, 0x22,
+ 0x13, 0x73, 0x0f, 0xeb, 0x9f, 0xde, 0xb2, 0xb6, 0x4d, 0xd8, 0xb5, 0x60,
+ 0x37, 0x45, 0x5d, 0x13, 0x79, 0x35, 0x7e, 0x44, 0xbd, 0xf9, 0x6a, 0x68,
+ 0xf4, 0x2b, 0x43, 0xcb, 0x5a, 0xfa, 0x86, 0xce, 0x91, 0xb9, 0xac, 0xbe,
+ 0x73, 0x3b, 0x47, 0x81, 0xe9, 0xf4, 0xfc, 0xda, 0xb0, 0xce, 0x4b, 0x09,
+ 0x7c, 0xb6, 0x47, 0xd1, 0x2b, 0xc3, 0x87, 0xd2, 0x6c, 0xe8, 0x59, 0x63,
+ 0x94, 0xf5, 0xcb, 0xc6, 0x06, 0xa0, 0xe7, 0xd9, 0x4c, 0xf2, 0xe6, 0xa6,
+ 0x69, 0xc5, 0x6a, 0xc8, 0x36, 0xf4, 0x02, 0x16, 0x1e, 0x02, 0x15, 0x70,
+ 0x6d, 0xc9, 0xc4, 0x8d, 0x5b, 0x8d, 0xec, 0x3f, 0x46, 0x34, 0x76, 0xeb,
+ 0x8b, 0x2a, 0x18, 0x6c, 0x54, 0xb6, 0x85, 0x8b, 0x16, 0x01, 0x2c, 0x0d,
+ 0x2c, 0x85, 0xb0, 0x91, 0xd9, 0x78, 0x3b, 0x67, 0x78, 0x9e, 0xb1, 0xd6,
+ 0xf0, 0x08, 0xe8, 0xdd, 0x63, 0x96, 0xbe, 0x37, 0x74, 0x92, 0xfb, 0x83,
+ 0xf4, 0xf4, 0x16, 0xe2, 0xb0, 0x44, 0x75, 0x86, 0xc1, 0xb3, 0x6f, 0x19,
+ 0x9d, 0x19, 0x48, 0x87, 0x5d, 0x19, 0x2f, 0xfc, 0xb4, 0xf9, 0x4d, 0xf2,
+ 0xcd, 0x26, 0xde, 0x00, 0xa3, 0x86, 0x21, 0xa8, 0x1c, 0x61, 0xcc, 0x86,
+ 0xbf, 0xc5, 0xfd, 0xb4, 0xbd, 0x75, 0xb0, 0x77, 0x60, 0x08, 0xfa, 0xc7,
+ 0x27, 0x73, 0xf4, 0x99, 0x8d, 0xcc, 0x8a, 0x8a, 0x3d, 0x59, 0x40, 0x94,
+ 0xeb, 0x0e, 0x58, 0xd6, 0x7e, 0x55, 0xa2, 0xc8, 0x4b, 0x52, 0x73, 0x0e,
+ 0x6a, 0x65, 0x55, 0x42, 0x2e, 0xb3, 0x6c, 0x8c, 0xd2, 0x9d, 0x7f, 0x24,
+ 0x41, 0xff, 0x30, 0x7f, 0xf5, 0x3e, 0x1b, 0x39, 0x81, 0xbb, 0x85, 0x02,
+ 0xb7, 0xd9, 0x31, 0xf9, 0x84, 0x52, 0xad, 0xd1, 0xcf, 0xa0, 0x2e, 0x36,
+ 0x81, 0xd1, 0xa3, 0x9e, 0x05, 0x6a, 0x30, 0x2e, 0x9f, 0x36, 0xa3, 0x01,
+ 0x8b, 0x29, 0x1e, 0x68, 0x5f, 0x35, 0xf9, 0x20, 0x59, 0xfb, 0x7e, 0x8d,
+ 0x88, 0x25, 0xc7, 0x88, 0x25, 0x9b, 0xfd, 0x4d, 0x9c, 0x1d, 0x23, 0x9a,
+ 0xc8, 0x17, 0x4b, 0x71, 0x8f, 0xc0, 0x3e, 0x8d, 0x88, 0x8b, 0x36, 0x60,
+ 0xb2, 0x5b, 0xb3, 0x12, 0x00, 0x49, 0x9d, 0xd8, 0xc6, 0xcd, 0x93, 0x33,
+ 0x54, 0xd4, 0xaf, 0xea, 0xf6, 0x81, 0x10, 0x2d, 0x9c, 0x87, 0xef, 0xcd,
+ 0x8e, 0x7e, 0x1c, 0xf3, 0x86, 0x30, 0x23, 0xc8, 0x39, 0xdd, 0xf6, 0xfc,
+ 0x4a, 0xa5, 0xd9, 0x97, 0x27, 0xda, 0x42, 0x4d, 0x0b, 0x7e, 0xf6, 0xfa,
+ 0x42, 0x2b, 0x0e, 0x9e, 0x32, 0x5a, 0xfb, 0xee, 0xef, 0xbf, 0x97, 0x77,
+ 0x5b, 0x4b, 0x7b, 0x1f, 0xc4, 0xf5, 0xac, 0x6f, 0x54, 0xb5, 0x5b, 0xc3,
+ 0xcc, 0xcc, 0x06, 0xc5, 0xcc, 0x65, 0x97, 0x30, 0x8c, 0xb9, 0xbf, 0x60,
+ 0xa5, 0x31, 0x33, 0x0c, 0xc9, 0xc3, 0xa4, 0x15, 0x4d, 0xd9, 0x53, 0x83,
+ 0xae, 0x6e, 0x2b, 0xee, 0x26, 0xb7, 0x86, 0xff, 0xaa, 0x13, 0x62, 0xce,
+ 0x24, 0x6c, 0x6d, 0xfa, 0xfc, 0x5c, 0x0c, 0x84, 0x00, 0x82, 0x60, 0x7a,
+ 0x05, 0x7e, 0x9a, 0xa6, 0xe3, 0x54, 0x24, 0xd1, 0x15, 0x93, 0xbb, 0x74,
+ 0xcc, 0xba, 0x32, 0x78, 0xdc, 0xac, 0x61, 0xf0, 0x5d, 0x46, 0xea, 0x16,
+ 0x75, 0x40, 0x74, 0x60, 0xb2, 0x4c, 0x7f, 0x1c, 0x0d, 0x01, 0xcb, 0x03,
+ 0x6d, 0xaf, 0x86, 0x9c, 0x1d, 0xa7, 0x15, 0x87, 0x24, 0x10, 0x1a, 0x9e,
+ 0x9e, 0xe2, 0x79, 0x40, 0x65, 0x69, 0x8c, 0x07, 0xf1, 0x63, 0x86, 0xf1,
+ 0xc1, 0x2c, 0xc0, 0x3d, 0xe0, 0x76, 0x18, 0xe6, 0x98, 0x06, 0x6d, 0xd4,
+ 0x10, 0x52, 0x4c, 0x60, 0xeb, 0x7d, 0x00, 0x1c, 0x86, 0x76, 0x72, 0x8e,
+ 0x3e, 0x54, 0x2b, 0x68, 0x02, 0x13, 0x80, 0xc3, 0xfe, 0xce, 0x74, 0xda,
+ 0x0a, 0x45, 0x61, 0x38, 0x05, 0xed, 0x39, 0x33, 0xa5, 0xfd, 0xfb, 0x26,
+ 0x18, 0xd5, 0xcd, 0x3c, 0xe2, 0x17, 0xb4, 0x48, 0x13, 0x37, 0x2f, 0x86,
+ 0xc5, 0xdd, 0x53, 0x1b, 0x13, 0xcc, 0x71, 0x9b, 0xed, 0xb4, 0x77, 0x90,
+ 0x0f, 0xbd, 0x15, 0x62, 0x23, 0x4f, 0x6c, 0xe7, 0xe1, 0xa1, 0x24, 0x83,
+ 0x00, 0x12, 0x4b, 0x5b, 0xd0, 0x11, 0x2c, 0x7f, 0x33, 0x2b, 0xf8, 0xf6,
+ 0x92, 0x53, 0xd2, 0x83, 0x4d, 0x87, 0x3e, 0x1f, 0x4f, 0x02, 0x02, 0x70,
+ 0x81, 0x51, 0x8e, 0x87, 0x13, 0xa4, 0x83, 0x21, 0xef, 0xba, 0x02, 0x99,
+ 0x6b, 0x04, 0xfe, 0x66, 0x75, 0x33, 0x1e, 0xef, 0x9c, 0x01, 0x4c, 0x1e,
+ 0x0b, 0x4a, 0x19, 0xa0, 0xe9, 0xc0, 0x0e, 0x5b, 0xa6, 0x78, 0x9b, 0xac,
+ 0x19, 0x09, 0x8c, 0x7e, 0x5f, 0x43, 0xf2, 0xd5, 0x0f, 0xb2, 0x66, 0x9c,
+ 0xfa, 0x6c, 0x14, 0x53, 0x44, 0x8c, 0x60, 0x0b, 0xc0, 0x13, 0xe5, 0x0c,
+ 0x64, 0xdb, 0x27, 0xf4, 0x6b, 0xb8, 0x30, 0x94, 0x97, 0xc5, 0x1d, 0x06,
+ 0x75, 0x5f, 0xa1, 0x0b, 0xd0, 0xac, 0x9b, 0xcd, 0x94, 0x37, 0x4c, 0x99,
+ 0x4d, 0xbf, 0xb0, 0x9f, 0x38, 0x95, 0x41, 0xc5, 0xb1, 0x80, 0xe8, 0x49,
+ 0x92, 0x3c, 0xb1, 0x89, 0x56, 0x3e, 0x6e, 0xa5, 0x2d, 0xd3, 0x45, 0x0c,
+ 0x48, 0x30, 0xa7, 0xe5, 0x68, 0x1e, 0x09, 0xcb, 0x5e, 0xc2, 0x99, 0x02,
+ 0x63, 0x1a, 0xa9, 0xdf, 0x7a, 0xc9, 0xd7, 0x71, 0xae, 0x0d, 0xb7, 0xff,
+ 0x7e, 0xa3, 0xb6, 0xa1, 0xad, 0xe3, 0x79, 0x42, 0x46, 0xd3, 0xdb, 0xaa,
+ 0x1c, 0x04, 0x62, 0x48, 0x60, 0x37, 0x59, 0x77, 0x5c, 0x7e, 0xf9, 0xc6,
+ 0x5b, 0xb3, 0x31, 0x88, 0x8f, 0x60, 0x39, 0x7c, 0x42, 0x3b, 0x8b, 0x48,
+ 0x71, 0x12, 0x5d, 0xdc, 0x84, 0x00, 0x01, 0x08, 0xd8, 0x9d, 0x02, 0xf9,
+ 0x8d, 0x20, 0x06, 0xc2, 0xe8, 0x78, 0x4f, 0xa2, 0x53, 0x61, 0xe7, 0xf0,
+ 0x28, 0x02, 0x4e, 0x5e, 0xf7, 0x52, 0x7b, 0x2e, 0x93, 0xcf, 0x6a, 0x94,
+ 0xfe, 0x27, 0x58, 0x9f, 0x8b, 0x51, 0x71, 0x97, 0xc9, 0x06, 0x46, 0x2d,
+ 0x63, 0x89, 0x16, 0xcc, 0x7a, 0x8e, 0x93, 0x06, 0xc7, 0xf7, 0xab, 0x34,
+ 0x7d, 0x14, 0x77, 0xf2, 0x0f, 0xa4, 0xe3, 0x20, 0xd5, 0xa3, 0x16, 0x53,
+ 0xdf, 0xa2, 0x0d, 0x43, 0x04, 0x6d, 0x01, 0x44, 0x77, 0xb2, 0x9d, 0xbd,
+ 0x07, 0x2b, 0xb7, 0x69, 0xeb, 0x6f, 0x96, 0x35, 0xc4, 0x9b, 0xd8, 0x3a,
+ 0x0e, 0xbc, 0x4b, 0x40, 0xa6, 0xc4, 0x70, 0xf0, 0x34, 0xb7, 0x3b, 0xc9,
+ 0xa8, 0xc4, 0x05, 0xbb, 0x13, 0x98, 0x6f, 0x00, 0x1f, 0x5a, 0x5d, 0x31,
+ 0x74, 0xd6, 0xae, 0x6d, 0xda, 0xd7, 0xc9, 0x6f, 0x49, 0x50, 0xc3, 0xac,
+ 0x07, 0xd0, 0x1c, 0x50, 0x11, 0x41, 0x16, 0x53, 0xdb, 0xc0, 0xf6, 0x71,
+ 0x35, 0xb0, 0xa5, 0xfa, 0x3c, 0x6d, 0x39, 0xcc, 0xb0, 0xaf, 0x6f, 0x69,
+ 0xd7, 0x37, 0x10, 0x02, 0x62, 0xc5, 0x6c, 0x8a, 0x9b, 0x5e, 0x18, 0x18,
+ 0xe9, 0x13, 0xe6, 0xde, 0xad, 0x83, 0x26, 0x04, 0xa8, 0xe1, 0x89, 0x64,
+ 0x4e, 0xcd, 0x32, 0x7b, 0x9f, 0x65, 0xc0, 0x2a, 0x54, 0xe3, 0x9b, 0x36,
+ 0xa0, 0x74, 0x33, 0x0c, 0x35, 0xdd, 0x74, 0xd8, 0x07, 0x10, 0xb7, 0x00,
+ 0x7f, 0x21, 0x88, 0x0f, 0x43, 0x5c, 0xcd, 0x74, 0xb6, 0x90, 0x8d, 0x35,
+ 0x04, 0x24, 0xe1, 0x54, 0x24, 0x32, 0x92, 0x38, 0xf1, 0x12, 0x86, 0xdf,
+ 0xd6, 0x27, 0xfc, 0x19, 0xa2, 0xbd, 0xb9, 0x81, 0xb7, 0xa2, 0x1d, 0xea,
+ 0x1f, 0x10, 0x81, 0x29, 0x49, 0x7d, 0x18, 0x53, 0x3f, 0x4c, 0x4b, 0x1c,
+ 0x09, 0x88, 0x2d, 0x86, 0x8d, 0x51, 0x7c, 0x05, 0x1a, 0xdb, 0x00, 0xc9,
+ 0x03, 0x98, 0x2f, 0xa8, 0xa9, 0x03, 0x88, 0x61, 0x1e, 0x4c, 0x31, 0x11,
+ 0xd7, 0xb0, 0x2b, 0x4c, 0xe2, 0x77, 0x09, 0x24, 0xdf, 0x6e, 0xf2, 0x7d,
+ 0x94, 0xfa, 0xc0, 0xdc, 0x4a, 0xe7, 0x0f, 0x52, 0xa6, 0xc1, 0x4d, 0x66,
+ 0x64, 0x06, 0xa0, 0x0c, 0x08, 0x09, 0x32, 0xc2, 0xfb, 0x0c, 0x58, 0x2b,
+ 0x26, 0x58, 0xa4, 0x23, 0x71, 0xbd, 0xb1, 0xf4, 0x40, 0xa0, 0x28, 0xc8,
+ 0xe2, 0x21, 0x6c, 0x1f, 0x5c, 0x1b, 0x20, 0x61, 0xb0, 0x2a, 0x6c, 0x6e,
+ 0xba, 0xcd, 0x41, 0x9f, 0x9d, 0x58, 0x2f, 0x0b, 0x65, 0xfe, 0x8d, 0x24,
+ 0x9b, 0xb1, 0x49, 0xf8, 0x3f, 0xf5, 0x99, 0x55, 0xab, 0x2b, 0x36, 0x25,
+ 0xd2, 0x4b, 0xe3, 0xb8, 0xbc, 0x7a, 0x83, 0x20, 0x53, 0x9b, 0xa7, 0xed,
+ 0xe4, 0xec, 0x29, 0xb1, 0x51, 0x15, 0x18, 0x2c, 0xea, 0x8d, 0x1a, 0x45,
+ 0x47, 0x30, 0x04, 0x15, 0x70, 0x40, 0x19, 0xb5, 0x18, 0x3d, 0xf5, 0xf6,
+ 0x67, 0x17, 0xfb, 0x5f, 0x7d, 0x0a, 0x29, 0x6a, 0x86, 0xf1, 0x2e, 0x12,
+ 0xd9, 0x02, 0x3c, 0xa9, 0x7e, 0xde, 0x49, 0xc2, 0x69, 0x9c, 0xba, 0xfd,
+ 0x29, 0x33, 0x6e, 0x0e, 0x0c, 0xce, 0xcc, 0x2a, 0x28, 0xf4, 0x9b, 0xed,
+ 0x2a, 0x1c, 0xb6, 0x06, 0x89, 0x60, 0x12, 0xc2, 0x06, 0x4b, 0xdc, 0x4e,
+ 0xde, 0xba, 0x2f, 0x30, 0xb5, 0xaa, 0x2b, 0xf2, 0x56, 0x58, 0x36, 0x7a,
+ 0xad, 0xd5, 0xdc, 0x1a, 0xa7, 0x4e, 0x89, 0x53, 0xef, 0xb6, 0xda, 0x05,
+ 0x75, 0x01, 0x17, 0xa0, 0xd2, 0x77, 0x78, 0x72, 0x80, 0xb9, 0x13, 0xb6,
+ 0x0d, 0xf3, 0x06, 0xcc, 0x91, 0x70, 0x0d, 0x59, 0xaf, 0xe5, 0x82, 0xc6,
+ 0xc8, 0xeb, 0xd8, 0x38, 0xa5, 0xbf, 0xae, 0x05, 0x73, 0xca, 0x31, 0xe1,
+ 0xa3, 0xd9, 0x02, 0x69, 0x5b, 0xc7, 0x16, 0xb3, 0xee, 0x2f, 0xcb, 0x00,
+ 0xa7, 0x1d, 0x4f, 0xfc, 0x30, 0x7d, 0x02, 0x07, 0x30, 0x3a, 0xd5, 0xe8,
+ 0x10, 0x35, 0xe2, 0xa5, 0x9c, 0xa2, 0x44, 0x81, 0x86, 0xdc, 0x3e, 0xe4,
+ 0xd4, 0xa6, 0x3d, 0x14, 0xd1, 0xf9, 0x66, 0x8e, 0x06, 0xf4, 0x3d, 0x49,
+ 0x34, 0x54, 0x29, 0x19, 0x77, 0x7e, 0xe3, 0x74, 0xa6, 0x73, 0xeb, 0x89,
+ 0x6b, 0xdc, 0x52, 0xc8, 0xb7, 0xac, 0x06, 0xe2, 0xb6, 0xe7, 0x6d, 0x06,
+ 0x1b, 0xa1, 0x81, 0xfa, 0xe1, 0x77, 0x0d, 0x4f, 0xd2, 0x69, 0x9c, 0x76,
+ 0x12, 0x48, 0xd9, 0x7e, 0x44, 0x4a, 0x32, 0xdc, 0x60, 0x98, 0x31, 0xdd,
+ 0x60, 0xc0, 0x24, 0xb6, 0x75, 0xca, 0xdd, 0xa6, 0x27, 0x68, 0x9a, 0x4e,
+ 0x61, 0xb9, 0x31, 0x31, 0x91, 0x93, 0x67, 0x42, 0x72, 0x26, 0xd7, 0x3c,
+ 0x8c, 0x14, 0xfd, 0x35, 0x65, 0x89, 0xda, 0xb6, 0x19, 0x4e, 0xee, 0x6c,
+ 0x1c, 0xb8, 0x4e, 0x6a, 0x00, 0xdc, 0xf1, 0xd3, 0x24, 0x1c, 0x82, 0xd9,
+ 0xae, 0xd2, 0xfb, 0x8e, 0xdb, 0xb9, 0x8d, 0xd3, 0x4b, 0x30, 0x67, 0x83,
+ 0xf9, 0xd7, 0xc8, 0x31, 0xd9, 0x80, 0xe3, 0x48, 0xc6, 0x89, 0xd7, 0x5f,
+ 0x4c, 0xd5, 0x2a, 0xd0, 0xe1, 0x04, 0x89, 0x9f, 0x10, 0xf9, 0x59, 0x8c,
+ 0x91, 0x7b, 0x0c, 0xd1, 0xff, 0x23, 0x29, 0xa8, 0x34, 0x78, 0xb0, 0x30,
+ 0xd0, 0xb6, 0x41, 0x37, 0x04, 0x0e, 0x55, 0x31, 0x0b, 0x1e, 0xbc, 0xee,
+ 0xeb, 0x75, 0x35, 0xdb, 0xcf, 0x32, 0x2a, 0x8a, 0x7e, 0x61, 0x73, 0xd4,
+ 0xc0, 0x63, 0x59, 0xd5, 0x6e, 0x8e, 0x71, 0x84, 0xc8, 0x3f, 0x21, 0x10,
+ 0x0c, 0x0c, 0xf2, 0x60, 0xc4, 0x93, 0xc9, 0x25, 0x32, 0x67, 0xcf, 0x62,
+ 0xa6, 0x71, 0xb9, 0xec, 0xad, 0x32, 0xe1, 0x4e, 0xb9, 0x92, 0x7e, 0x0b,
+ 0x75, 0x98, 0xe3, 0x60, 0xc7, 0x1e, 0x07, 0xe4, 0x6c, 0x6e, 0x41, 0xda,
+ 0x75, 0xe9, 0x4e, 0x85, 0x37, 0x78, 0x15, 0xdf, 0xf3, 0x03, 0xfc, 0xa2,
+ 0x4f, 0x06, 0xe8, 0x31, 0xb8, 0x5d, 0x06, 0x46, 0xdc, 0x19, 0x16, 0x0f,
+ 0xa4, 0xa2, 0xf1, 0x48, 0xbc, 0xbc, 0x8f, 0x64, 0x5d, 0x3c, 0xd9, 0x46,
+ 0xb2, 0x7f, 0x3f, 0x06, 0x8d, 0x2c, 0x25, 0xb6, 0x0d, 0x7c, 0x6d, 0x75,
+ 0xa5, 0x67, 0xfd, 0xb3, 0xef, 0x08, 0x40, 0xe5, 0xac, 0x30, 0xfb, 0x7a,
+ 0x83, 0x1d, 0x52, 0x86, 0xcb, 0x0c, 0xd0, 0x6d, 0x05, 0x81, 0x34, 0xe5,
+ 0x43, 0xde, 0x77, 0xf6, 0xb6, 0xda, 0xcc, 0x99, 0xd5, 0x95, 0xf5, 0x5f,
+ 0x76, 0xbb, 0x18, 0x6b, 0x05, 0x07, 0x2f, 0x66, 0x30, 0x3f, 0x52, 0xc2,
+ 0x0e, 0xcd, 0xfd, 0x93, 0xf3, 0xa2, 0x21, 0x5f, 0x0f, 0x72, 0xed, 0x49,
+ 0xb9, 0xc1, 0x57, 0x42, 0xc2, 0x6a, 0x86, 0x6a, 0x87, 0xd1, 0x94, 0xf2,
+ 0x07, 0xeb, 0x4a, 0xe4, 0x81, 0x5e, 0x51, 0xd4, 0x02, 0x69, 0xc4, 0xe0,
+ 0xcc, 0xe7, 0x11, 0x03, 0x82, 0x04, 0xa8, 0x5c, 0xf1, 0x11, 0x7b, 0xd3,
+ 0xb3, 0x61, 0xb4, 0x40, 0xa3, 0x0f, 0xb2, 0xfe, 0xe5, 0xb2, 0xe4, 0xcc,
+ 0x08, 0x28, 0x03, 0x8d, 0x20, 0xb7, 0x24, 0x8c, 0x11, 0x7e, 0x52, 0x53,
+ 0xbc, 0xba, 0x42, 0x6f, 0x34, 0x74, 0x07, 0x1e, 0xbd, 0x31, 0x87, 0x30,
+ 0x49, 0x90, 0x76, 0xdb, 0x4b, 0x7a, 0xe0, 0x84, 0x79, 0xe9, 0xcc, 0x2f,
+ 0x3f, 0xac, 0x95, 0x92, 0x57, 0xc4, 0x72, 0x94, 0xbc, 0x58, 0xe5, 0x2e,
+ 0x67, 0x9c, 0x01, 0x8f, 0x29, 0xf9, 0xa5, 0xb5, 0xd3, 0x18, 0x1e, 0xf1,
+ 0x82, 0xef, 0x2a, 0x44, 0x08, 0x41, 0xb1, 0x84, 0x49, 0xa3, 0xbc, 0x07,
+ 0xe5, 0xf6, 0x86, 0x02, 0xd1, 0xc1, 0xf1, 0x63, 0x1e, 0x34, 0x8c, 0x65,
+ 0x30, 0x84, 0x30, 0x2e, 0x8c, 0x81, 0x02, 0x3b, 0x2d, 0xf6, 0x83, 0xcc,
+ 0x09, 0xd9, 0x14, 0xdf, 0xfa, 0xed, 0xa6, 0x08, 0x37, 0xd5, 0xd6, 0xc0,
+ 0x18, 0x00, 0x59, 0x6e, 0x29, 0xa6, 0x43, 0xa3, 0x5a, 0x9b, 0x51, 0xce,
+ 0xb5, 0x22, 0xef, 0x72, 0x61, 0x33, 0x98, 0x4d, 0x45, 0x16, 0x3e, 0x49,
+ 0xfc, 0x87, 0x75, 0xa9, 0x79, 0xce, 0xd0, 0x8e, 0x7d, 0xcc, 0x48, 0xee,
+ 0xe8, 0xb7, 0x79, 0x9c, 0x80, 0x9c, 0x5f, 0x23, 0x60, 0xfc, 0x23, 0x76,
+ 0x58, 0x57, 0x9a, 0x85, 0x89, 0xe5, 0x10, 0x61, 0xd3, 0x7f, 0x31, 0x9f,
+ 0x18, 0x91, 0x37, 0x25, 0x25, 0x2b, 0x1f, 0x8b, 0x8c, 0x42, 0x7e, 0xd3,
+ 0xf7, 0x60, 0x7e, 0x91, 0xcd, 0x0c, 0xa8, 0x5e, 0x33, 0x08, 0x0a, 0x03,
+ 0x73, 0xe4, 0x08, 0xd2, 0xad, 0x72, 0xc8, 0xd2, 0x31, 0x73, 0x0b, 0x01,
+ 0x14, 0x73, 0x26, 0xc0, 0x31, 0x65, 0x36, 0xb1, 0x9b, 0x96, 0xef, 0x67,
+ 0xa3, 0x74, 0xdc, 0x42, 0x97, 0xcd, 0x30, 0x63, 0x4d, 0x24, 0x2d, 0x8b,
+ 0x31, 0x6a, 0xe2, 0x60, 0x47, 0x9b, 0xd4, 0x34, 0x78, 0xcd, 0xa4, 0xc8,
+ 0xf4, 0xe1, 0x5a, 0x24, 0x2f, 0x97, 0x21, 0x34, 0xd6, 0x65, 0xe6, 0x3c,
+ 0xcf, 0xcf, 0x72, 0xc6, 0xa9, 0x9d, 0x68, 0xce, 0xb1, 0x22, 0xbf, 0xdb,
+ 0x18, 0x0c, 0x37, 0x4b, 0x0e, 0x2a, 0x58, 0x28, 0xca, 0xac, 0xaf, 0x7b,
+ 0x3f, 0x04, 0x78, 0x8c, 0x61, 0xc9, 0x78, 0xb2, 0x19, 0xf3, 0x2e, 0x47,
+ 0x0e, 0x83, 0x53, 0x0b, 0x51, 0x00, 0xa0, 0xa6, 0x4d, 0x39, 0xb6, 0x55,
+ 0x37, 0xb3, 0x69, 0xe9, 0x9e, 0x53, 0xfc, 0x3d, 0xc6, 0x0f, 0x36, 0x90,
+ 0xbb, 0x8c, 0xa2, 0x6e, 0x29, 0x77, 0xaa, 0x2c, 0xfa, 0x24, 0x2b, 0x97,
+ 0x36, 0xf7, 0x67, 0x5d, 0x62, 0x77, 0x61, 0xa0, 0x46, 0x40, 0xdc, 0xbc,
+ 0xec, 0x75, 0x57, 0x57, 0xd0, 0x1a, 0xc8, 0x41, 0x72, 0x36, 0x92, 0xdf,
+ 0xee, 0x12, 0xce, 0x81, 0x39, 0xa0, 0x3b, 0x54, 0xea, 0x1a, 0x05, 0x14,
+ 0xf3, 0xb1, 0x83, 0x21, 0x9f, 0x94, 0xda, 0x7f, 0xb0, 0x7b, 0xec, 0xdf,
+ 0x4a, 0x81, 0x3c, 0x20, 0xcb, 0x34, 0xe5, 0xc5, 0xc9, 0xee, 0x36, 0x37,
+ 0xd8, 0x87, 0x4c, 0xbf, 0xc9, 0x93, 0xba, 0x69, 0xa3, 0x69, 0xe5, 0x14,
+ 0x06, 0xd9, 0x0c, 0x8e, 0x1c, 0xc8, 0x98, 0x2a, 0xcb, 0x94, 0x5c, 0x9a,
+ 0xc8, 0xae, 0x71, 0x84, 0x38, 0xa5, 0x3f, 0x73, 0x34, 0xfc, 0xd7, 0x1a,
+ 0x11, 0xf6, 0x84, 0x22, 0x38, 0xad, 0x08, 0x1c, 0x91, 0xd9, 0x09, 0xa3,
+ 0x01, 0xf7, 0x53, 0x3e, 0x0d, 0xa0, 0x14, 0xbc, 0xf4, 0x7a, 0x22, 0x41,
+ 0xff, 0xcc, 0x05, 0xfc, 0x27, 0x44, 0x78, 0x34, 0xe3, 0xf9, 0x5a, 0xc3,
+ 0x90, 0x9e, 0xb4, 0x01, 0xe0, 0xe7, 0xeb, 0x10, 0x62, 0xf4, 0xc4, 0xee,
+ 0x52, 0x38, 0x13, 0x2b, 0x67, 0xa3, 0x32, 0x14, 0xb9, 0xa3, 0xf1, 0xda,
+ 0x5d, 0xd4, 0xa7, 0xe2, 0x35, 0x47, 0x7c, 0xf1, 0x4f, 0x56, 0x2c, 0x12,
+ 0x31, 0x20, 0x10, 0x8d, 0x54, 0xea, 0x38, 0xbb, 0xe2, 0x31, 0xc8, 0x1c,
+ 0x1c, 0x7e, 0x55, 0xe4, 0x00, 0x3a, 0x0e, 0x48, 0x30, 0x08, 0x9e, 0xba,
+ 0xc5, 0xf0, 0x48, 0x38, 0x53, 0xd0, 0x55, 0x9a, 0x0a, 0x90, 0x24, 0xa0,
+ 0x52, 0xce, 0xf2, 0xe1, 0x80, 0x53, 0x71, 0x40, 0xa8, 0xd4, 0xd1, 0x58,
+ 0x04, 0x61, 0x21, 0x9d, 0x13, 0x74, 0x8d, 0xd4, 0xc5, 0x4e, 0x85, 0x92,
+ 0xc9, 0x8b, 0xe4, 0xdb, 0x3b, 0xa1, 0xfa, 0x3b, 0xda, 0x47, 0xc3, 0xf4,
+ 0x26, 0x1b, 0x1a, 0xb1, 0xf9, 0x09, 0x72, 0x1f, 0xe1, 0x23, 0x4c, 0x9f,
+ 0x11, 0x86, 0xa2, 0xf2, 0xa7, 0xb9, 0x4d, 0x84, 0xb7, 0x57, 0xe6, 0xe3,
+ 0x69, 0xd7, 0x6a, 0x39, 0x81, 0xbc, 0xe8, 0xbd, 0x95, 0x0d, 0xed, 0x0f,
+ 0x30, 0xaf, 0x53, 0xce, 0x94, 0x37, 0x2b, 0x47, 0x68, 0x89, 0x60, 0x31,
+ 0x46, 0x61, 0x0a, 0x63, 0x6d, 0x2c, 0xae, 0x8c, 0x12, 0xcb, 0xec, 0xe2,
+ 0xe2, 0xe7, 0x3b, 0xd9, 0xbf, 0x7e, 0xff, 0x8d, 0xcc, 0xb4, 0xd4, 0x00,
+ 0xcc, 0x7d, 0x76, 0x04, 0xf0, 0xf9, 0x79, 0x43, 0xb0, 0xe2, 0x1f, 0x32,
+ 0xf5, 0x4a, 0xa7, 0x4f, 0x28, 0x48, 0xe7, 0x31, 0x27, 0x50, 0x4f, 0xca,
+ 0x5d, 0xcb, 0x39, 0xc2, 0xb0, 0x4d, 0x74, 0x3d, 0x28, 0x30, 0xc3, 0x48,
+ 0xf2, 0x14, 0x0c, 0x95, 0xfc, 0x85, 0x62, 0x45, 0x72, 0x38, 0x88, 0xd2,
+ 0x29, 0x93, 0x06, 0xe8, 0x14, 0x46, 0x04, 0x19, 0x8a, 0xc4, 0x02, 0xd0,
+ 0x03, 0x18, 0x00, 0xb2, 0x06, 0xaa, 0x39, 0xd8, 0xe6, 0xc0, 0x39, 0x2d,
+ 0xd1, 0x8b, 0x6b, 0xed, 0xa4, 0xf5, 0xea, 0xea, 0x55, 0x62, 0xb6, 0xc7,
+ 0xf3, 0xe6, 0x0d, 0x9f, 0x5e, 0x66, 0xe2, 0xf0, 0x46, 0x99, 0x39, 0x0c,
+ 0x84, 0x04, 0x75, 0x43, 0xf7, 0x90, 0xc2, 0x19, 0x31, 0xad, 0x20, 0x0a,
+ 0x9c, 0x71, 0x02, 0x5e, 0x2b, 0x74, 0xfe, 0x12, 0x7d, 0x8f, 0x79, 0x0f,
+ 0x80, 0xcf, 0xc5, 0x2e, 0x81, 0xd3, 0x5f, 0xd2, 0xa7, 0x84, 0xa2, 0xae,
+ 0xf9, 0x48, 0x23, 0xc9, 0x81, 0xc7, 0x4b, 0x8a, 0xd3, 0x08, 0xf3, 0xbc,
+ 0xd0, 0x61, 0x4c, 0xe6, 0x17, 0x64, 0x35, 0xcf, 0x19, 0xfe, 0x2d, 0xc6,
+ 0x75, 0x2e, 0x3d, 0x09, 0x78, 0xbb, 0x4c, 0x82, 0x8a, 0x09, 0x35, 0x53,
+ 0x21, 0x61, 0xa4, 0x24, 0x4b, 0xa4, 0x4a, 0xff, 0x8f, 0xa8, 0xcf, 0x56,
+ 0x8d, 0x8b, 0xa9, 0x63, 0x68, 0x2e, 0x41, 0x1d, 0xa0, 0x3a, 0xfe, 0x88,
+ 0x36, 0xb0, 0xba, 0xd2, 0xb9, 0x95, 0x04, 0xaa, 0x19, 0x9c, 0x31, 0x14,
+ 0x8b, 0xac, 0x46, 0xd6, 0xf4, 0x13, 0x23, 0x71, 0xda, 0x40, 0x6c, 0xcc,
+ 0xc7, 0xb3, 0x4c, 0x03, 0xcf, 0x98, 0xbb, 0x58, 0x31, 0xc1, 0xb8, 0x39,
+ 0xc8, 0xc4, 0x47, 0x16, 0x2c, 0xb1, 0xc6, 0x12, 0xa0, 0x63, 0x67, 0x1e,
+ 0xbb, 0x54, 0xce, 0xcc, 0x6d, 0xfc, 0x53, 0xb4, 0x7b, 0x97, 0x86, 0x38,
+ 0x30, 0xf6, 0x1d, 0x5a, 0x65, 0x09, 0xd0, 0x45, 0xd3, 0xa1, 0x3f, 0x1f,
+ 0x9f, 0x8e, 0x75, 0x13, 0x9d, 0x10, 0xb3, 0xb1, 0x45, 0x84, 0xe2, 0xfe,
+ 0xe1, 0x62, 0x6b, 0xb5, 0x3d, 0x59, 0xc7, 0x43, 0x3a, 0xe7, 0xc4, 0xc8,
+ 0x3b, 0x50, 0xfa, 0xfc, 0x7c, 0x1a, 0x6b, 0xd8, 0x47, 0x89, 0xdd, 0xa1,
+ 0x3d, 0x44, 0xba, 0x9c, 0xbc, 0x19, 0x93, 0xbf, 0xc4, 0x4d, 0x21, 0x31,
+ 0xfa, 0x29, 0xe2, 0x7c, 0x34, 0x41, 0xa5, 0x43, 0x88, 0x97, 0x30, 0xe1,
+ 0x54, 0xe2, 0xb3, 0xdc, 0xec, 0x52, 0x08, 0xa3, 0x9e, 0xe4, 0xf5, 0xbc,
+ 0x9d, 0xb5, 0x9b, 0x56, 0xcd, 0xf3, 0xee, 0x86, 0x43, 0x13, 0xac, 0x6e,
+ 0x81, 0x39, 0x84, 0xd9, 0xbc, 0x3b, 0xb0, 0x29, 0x32, 0x3d, 0x30, 0x5b,
+ 0x54, 0xac, 0x08, 0x91, 0xd5, 0xb0, 0x01, 0x63, 0xdc, 0xaf, 0xc7, 0xf4,
+ 0x69, 0xe3, 0x99, 0x3b, 0x26, 0xc5, 0xe0, 0x9a, 0x09, 0x4b, 0xbc, 0xcb,
+ 0x6c, 0x1a, 0x48, 0xe7, 0x06, 0x90, 0x25, 0xc2, 0xa7, 0x66, 0xcd, 0xdf,
+ 0x6b, 0xc5, 0x63, 0xc2, 0xc2, 0x01, 0xcc, 0x74, 0x72, 0xf0, 0x1a, 0xcc,
+ 0xd3, 0xfa, 0x20, 0x93, 0xe4, 0x14, 0xb6, 0xa4, 0x18, 0x1d, 0x3f, 0xc5,
+ 0x42, 0x01, 0x16, 0x1b, 0x4c, 0x12, 0xc8, 0x36, 0xa2, 0xac, 0xd9, 0x8c,
+ 0xfd, 0x16, 0xa6, 0x7d, 0x50, 0x80, 0xdc, 0x14, 0xaa, 0xd9, 0x33, 0x0c,
+ 0xf2, 0x4f, 0x31, 0x6e, 0x4e, 0xa3, 0x96, 0x81, 0x49, 0x38, 0x27, 0x7d,
+ 0x47, 0x1b, 0x2a, 0x15, 0x00, 0xda, 0x33, 0xe7, 0x0f, 0x03, 0xb7, 0xc1,
+ 0x29, 0xe9, 0x8c, 0x43, 0xcb, 0x4c, 0xe2, 0x07, 0x6b, 0xf2, 0xf9, 0xb9,
+ 0xda, 0x00, 0x70, 0x62, 0xcc, 0x5c, 0x63, 0xe6, 0x63, 0xb3, 0x45, 0x48,
+ 0xde, 0xab, 0xd8, 0xca, 0xb0, 0x0f, 0x0d, 0xea, 0x8a, 0xe2, 0x39, 0xbe,
+ 0xe2, 0x93, 0xfc, 0x2c, 0xbc, 0xbd, 0xb4, 0x01, 0xe7, 0x08, 0x89, 0xa6,
+ 0xad, 0x5a, 0xc0, 0xa9, 0x69, 0xf7, 0x9e, 0xd0, 0x81, 0x07, 0x93, 0x8a,
+ 0x5e, 0x12, 0xb5, 0xbc, 0x80, 0x18, 0xed, 0xc2, 0xfc, 0x00, 0x62, 0xa7,
+ 0xc2, 0x10, 0x5d, 0x38, 0x3b, 0x77, 0x8b, 0x42, 0xdb, 0xfd, 0x23, 0x58,
+ 0x19, 0xf5, 0x9e, 0x37, 0xe7, 0x2a, 0xde, 0x1b, 0xd5, 0x85, 0xe7, 0x4d,
+ 0xfd, 0xe3, 0xad, 0x9d, 0xfb, 0x5f, 0x6a, 0x1b, 0x8a, 0x2f, 0x01, 0xb2,
+ 0x97, 0xe8, 0x12, 0x40, 0x97, 0x38, 0x62, 0x57, 0x77, 0x6f, 0x99, 0xd5,
+ 0x40, 0x9f, 0x62, 0xfd, 0x90, 0x68, 0x51, 0x2a, 0x2f, 0xa4, 0xa3, 0x4b,
+ 0x1f, 0x78, 0x9f, 0x3e, 0x9f, 0xe8, 0x83, 0x5d, 0x4e, 0x5c, 0x34, 0x37,
+ 0xca, 0xe4, 0xd1, 0x97, 0xd3, 0xf5, 0x37, 0xb7, 0x98, 0x71, 0x36, 0xbe,
+ 0x2b, 0x61, 0x77, 0x61, 0xbc, 0xc8, 0x8b, 0x8d, 0xe4, 0xfa, 0xb1, 0x90,
+ 0xcb, 0x66, 0x80, 0x7c, 0xdd, 0x10, 0x0e, 0xa5, 0xa3, 0x8d, 0x48, 0x1f,
+ 0xc5, 0x2d, 0x7b, 0x23, 0xca, 0x52, 0x1f, 0x42, 0x80, 0x9d, 0x9f, 0x8f,
+ 0xf4, 0xb4, 0x91, 0x11, 0x30, 0x72, 0x08, 0x69, 0x93, 0x20, 0x52, 0x90,
+ 0x3a, 0x20, 0xca, 0x4c, 0xc0, 0xfe, 0x50, 0x5b, 0x64, 0x5d, 0x8d, 0x02,
+ 0x37, 0x12, 0x8a, 0xb6, 0xec, 0x07, 0x2d, 0x61, 0x94, 0xf0, 0x03, 0xc8,
+ 0x17, 0x68, 0xcd, 0x1d, 0x90, 0xd2, 0x03, 0x79, 0x99, 0x7f, 0x1b, 0xe4,
+ 0xa9, 0xd9, 0xfc, 0x53, 0x06, 0x32, 0x29, 0x37, 0xd8, 0x2b, 0x8d, 0x90,
+ 0x60, 0xf9, 0x2d, 0xed, 0x04, 0xe4, 0x40, 0xc8, 0x96, 0xc8, 0xef, 0xa9,
+ 0xfb, 0x80, 0x72, 0x3d, 0x26, 0x72, 0xf1, 0x90, 0x43, 0xb8, 0xb3, 0xcf,
+ 0x8a, 0x8d, 0x75, 0xb4, 0x0f, 0x00, 0x3d, 0x47, 0xfb, 0x8c, 0xcf, 0xd3,
+ 0x99, 0x22, 0xee, 0x80, 0xdb, 0x9d, 0x6e, 0x87, 0x71, 0xa0, 0xb0, 0x44,
+ 0x20, 0xe3, 0xd1, 0xae, 0xa6, 0x85, 0xa1, 0xcc, 0xc1, 0xed, 0x5f, 0x10,
+ 0x54, 0x18, 0xe2, 0xb8, 0x38, 0xd0, 0xb1, 0xd7, 0x05, 0x98, 0x5c, 0xd1,
+ 0x43, 0x4b, 0x10, 0x0a, 0x39, 0x66, 0x26, 0x12, 0x9d, 0xb6, 0x13, 0xbd,
+ 0xf4, 0x28, 0xd4, 0xa0, 0xb0, 0xc8, 0xdc, 0x9b, 0x63, 0x33, 0x0d, 0x29,
+ 0x74, 0xf8, 0x26, 0x38, 0x01, 0xcc, 0xb4, 0xa2, 0x28, 0xac, 0xd2, 0xa1,
+ 0x75, 0x8e, 0x17, 0xb1, 0x74, 0x43, 0x86, 0x05, 0xb4, 0xc9, 0x07, 0x9e,
+ 0x55, 0x94, 0x25, 0xf9, 0x16, 0x98, 0x0e, 0x23, 0x19, 0xb8, 0x67, 0xa9,
+ 0x3b, 0xda, 0x7c, 0xed, 0x87, 0x84, 0x41, 0x47, 0x6c, 0x04, 0x61, 0x22,
+ 0x3d, 0xc9, 0xa7, 0x5e, 0x6e, 0x03, 0xf8, 0x58, 0x32, 0x34, 0xda, 0xb2,
+ 0xbc, 0x67, 0x87, 0x73, 0x9b, 0x96, 0xf7, 0xda, 0x7e, 0x6c, 0x55, 0x3d,
+ 0x95, 0x22, 0x8d, 0x15, 0x2c, 0xac, 0x83, 0x89, 0x5f, 0x45, 0xcc, 0x79,
+ 0xf3, 0xb9, 0x7b, 0x92, 0x74, 0x7f, 0x15, 0xf7, 0xb6, 0xcc, 0xfe, 0xa4,
+ 0x07, 0xac, 0x40, 0x6b, 0x9a, 0xe8, 0xea, 0x26, 0x1a, 0xa7, 0x5f, 0x12,
+ 0x84, 0xef, 0xe8, 0x10, 0xc9, 0xf2, 0x90, 0xc9, 0x12, 0xbc, 0x34, 0xa0,
+ 0x65, 0xb9, 0x3c, 0x70, 0xa7, 0xd6, 0x5a, 0x02, 0x43, 0xa7, 0x32, 0x5a,
+ 0xd8, 0xc4, 0xe4, 0xc4, 0x69, 0xeb, 0xe0, 0x24, 0x1a, 0x02, 0x8a, 0x19,
+ 0x1e, 0xdd, 0x10, 0x9f, 0xc2, 0x0b, 0x0e, 0xf7, 0x50, 0xf9, 0x90, 0xb2,
+ 0xce, 0x6a, 0xf8, 0xdc, 0x69, 0x0e, 0x41, 0x23, 0x97, 0x99, 0x69, 0x7e,
+ 0x46, 0x4f, 0x75, 0xd8, 0xcc, 0x7f, 0xcb, 0xd9, 0x06, 0x14, 0x01, 0xc1,
+ 0x6d, 0x98, 0x04, 0xa8, 0x9d, 0x32, 0xf3, 0x04, 0x09, 0x01, 0x46, 0x47,
+ 0x4e, 0x11, 0xee, 0x5b, 0xcc, 0x4d, 0x5e, 0x80, 0x0a, 0xa2, 0xa0, 0x83,
+ 0x78, 0x65, 0x6b, 0xb9, 0x2d, 0x8e, 0x01, 0x28, 0x28, 0xec, 0xb3, 0xba,
+ 0x61, 0xb0, 0x56, 0x74, 0x9f, 0x2a, 0x26, 0x25, 0xe6, 0xda, 0x0c, 0xf1,
+ 0x82, 0xe0, 0xe9, 0xaf, 0x19, 0x44, 0xe8, 0x64, 0xf1, 0x6a, 0x6e, 0x92,
+ 0xfd, 0x23, 0x34, 0x18, 0xc1, 0x87, 0x6d, 0x2e, 0x1d, 0x93, 0x7c, 0x7d,
+ 0x5e, 0xf4, 0x8d, 0x40, 0x43, 0x35, 0x08, 0x3c, 0xaf, 0xbb, 0x1d, 0x88,
+ 0x33, 0x24, 0x9d, 0x3b, 0x67, 0xb7, 0x33, 0x23, 0xc5, 0xfc, 0x76, 0x03,
+ 0xdf, 0x6d, 0x27, 0xcf, 0x35, 0x4e, 0x0d, 0xc3, 0x43, 0x31, 0x9f, 0x7c,
+ 0xec, 0xe4, 0xd6, 0x76, 0xde, 0x3a, 0x87, 0xd7, 0x6a, 0xbd, 0x75, 0xc8,
+ 0xf4, 0x00, 0x06, 0xf0, 0xd9, 0x52, 0x45, 0x13, 0x63, 0xda, 0x3d, 0xe3,
+ 0x53, 0xd5, 0x4a, 0xd5, 0xd1, 0xd2, 0x85, 0xb7, 0x7e, 0x78, 0x3e, 0x80,
+ 0x87, 0x62, 0x30, 0x60, 0x0c, 0x8b, 0x9b, 0x6c, 0x69, 0xf1, 0x92, 0xba,
+ 0x3d, 0xca, 0x32, 0x20, 0x83, 0x6c, 0x82, 0x3e, 0x69, 0x9b, 0xc6, 0xea,
+ 0xc4, 0x97, 0xea, 0x12, 0x3e, 0x9c, 0xf6, 0x52, 0xb3, 0xe0, 0x5e, 0x47,
+ 0x10, 0x0e, 0x17, 0x0e, 0xe8, 0xd4, 0x2a, 0x3e, 0x18, 0x1e, 0x95, 0x3c,
+ 0xdc, 0x3f, 0x95, 0x81, 0x37, 0x35, 0x79, 0xcb, 0xd7, 0x86, 0x4f, 0x4d,
+ 0x22, 0x50, 0xdb, 0x0c, 0xa3, 0x1a, 0xe3, 0xf1, 0x6e, 0x28, 0xed, 0x53,
+ 0x7d, 0xed, 0xa0, 0x84, 0xdb, 0x74, 0x3a, 0x98, 0xa3, 0xd8, 0xb3, 0x58,
+ 0x71, 0x03, 0xc3, 0x16, 0xd5, 0xa4, 0x98, 0xbd, 0x43, 0x2e, 0x4b, 0x69,
+ 0x14, 0xa5, 0x76, 0x5b, 0x16, 0x26, 0x9f, 0xd0, 0x36, 0xe3, 0x82, 0x03,
+ 0x9e, 0xce, 0x07, 0x0b, 0x65, 0x07, 0x82, 0x41, 0x2d, 0x78, 0xf8, 0xa4,
+ 0x52, 0x5f, 0x66, 0x52, 0x00, 0x3e, 0x24, 0x7d, 0x46, 0x91, 0xaa, 0xd2,
+ 0x29, 0xf3, 0x34, 0x12, 0xa0, 0x6d, 0x85, 0x46, 0xa0, 0xc6, 0x25, 0xe1,
+ 0x63, 0x10, 0xe3, 0xa4, 0xdf, 0x8d, 0xae, 0x5a, 0x3d, 0x73, 0x3a, 0xc4,
+ 0xb2, 0xa9, 0x6a, 0xc5, 0xd8, 0xf0, 0x3a, 0xa5, 0x8e, 0x4f, 0x34, 0x28,
+ 0x14, 0xc8, 0x54, 0x4a, 0x3d, 0xce, 0x5d, 0x54, 0x05, 0xfc, 0x6a, 0x44,
+ 0x67, 0xeb, 0xf7, 0x27, 0x5b, 0x1a, 0xd6, 0x5c, 0x70, 0xa7, 0xa9, 0x9b,
+ 0x80, 0x27, 0x4c, 0x51, 0xce, 0xfb, 0xf9, 0x14, 0xe4, 0x06, 0x2c, 0xb1,
+ 0x82, 0xf6, 0x56, 0x4d, 0x1e, 0x55, 0xe2, 0x28, 0x59, 0x0d, 0xcf, 0x48,
+ 0x17, 0xc4, 0x72, 0x2f, 0x4d, 0x4f, 0x71, 0x44, 0x9d, 0xd9, 0x3f, 0xa9,
+ 0x1f, 0x6f, 0x5b, 0xb2, 0x5c, 0x0a, 0xb8, 0xd3, 0xb3, 0x39, 0xab, 0x1d,
+ 0xe4, 0x58, 0x05, 0xaa, 0x0f, 0x17, 0x6e, 0x5b, 0x2d, 0xc5, 0x3a, 0xd4,
+ 0x9e, 0xd6, 0x5a, 0xc8, 0x05, 0xb7, 0x6d, 0x88, 0x80, 0xc1, 0xe4, 0x35,
+ 0xff, 0x60, 0xf6, 0x51, 0xe1, 0x01, 0xa7, 0x04, 0x8e, 0xed, 0xe8, 0xff,
+ 0xf6, 0x45, 0x65, 0xbb, 0x55, 0xdc, 0x81, 0xd7, 0xe9, 0xfb, 0x6c, 0x4c,
+ 0x99, 0xf3, 0x8f, 0xf7, 0x05, 0x44, 0xdd, 0xe5, 0x4e, 0x20, 0x62, 0x13,
+ 0x88, 0x08, 0x64, 0x78, 0x12, 0xc2, 0xe6, 0x19, 0x4f, 0x89, 0xcc, 0x5e,
+ 0x5f, 0x5b, 0xa6, 0xe9, 0x08, 0xed, 0xdb, 0xcd, 0xf1, 0xf4, 0xb4, 0xd6,
+ 0xb5, 0x76, 0x29, 0x5c, 0x42, 0x9c, 0x15, 0xf3, 0x94, 0x1d, 0xeb, 0x35,
+ 0x8d, 0x70, 0xb2, 0xba, 0x17, 0x20, 0x3b, 0x61, 0x83, 0x65, 0x65, 0x53,
+ 0x50, 0x4c, 0x0c, 0x76, 0x97, 0xc3, 0x63, 0xaa, 0xfb, 0x5d, 0x42, 0x6b,
+ 0x72, 0x05, 0x98, 0x0d, 0xa5, 0x73, 0xc0, 0xa6, 0x35, 0x44, 0xa3, 0x05,
+ 0x10, 0x2a, 0x7f, 0x03, 0x51, 0x23, 0xa4, 0x56, 0xc5, 0xbc, 0x9d, 0x12,
+ 0xbc, 0x90, 0x7b, 0xd7, 0x3a, 0xb0, 0x30, 0x2c, 0x99, 0x08, 0x46, 0xe6,
+ 0x1a, 0xa5, 0x60, 0x41, 0x43, 0x0c, 0xcf, 0x2a, 0x45, 0x6f, 0x66, 0xe9,
+ 0xf0, 0x41, 0x6f, 0x9d, 0x00, 0x53, 0xf1, 0xbe, 0x54, 0xcb, 0x05, 0xdf,
+ 0xbe, 0x9d, 0xc0, 0x3f, 0x6a, 0x5d, 0xcd, 0xb3, 0x66, 0x73, 0x99, 0x69,
+ 0xc2, 0xbf, 0xb8, 0xa6, 0xde, 0xba, 0x33, 0x17, 0x30, 0x0c, 0x93, 0x3e,
+ 0xd8, 0x3b, 0x78, 0xc8, 0xe6, 0x96, 0x57, 0x79, 0xd9, 0x6f, 0x9c, 0xc2,
+ 0xbf, 0xf8, 0xe3, 0x37, 0xdf, 0x6e, 0xc2, 0x4b, 0x10, 0x52, 0xd2, 0x74,
+ 0x8c, 0x42, 0xe4, 0xb0, 0x58, 0x14, 0x6e, 0x8d, 0x57, 0x40, 0x73, 0xe2,
+ 0xe5, 0x58, 0x82, 0xc2, 0x3c, 0x4d, 0x61, 0xc4, 0x46, 0x11, 0x23, 0x93,
+ 0xd4, 0x3a, 0xbe, 0x2f, 0xa7, 0x12, 0x2d, 0x55, 0x62, 0x4e, 0x25, 0x58,
+ 0x9f, 0x8a, 0x98, 0x36, 0x1d, 0x0e, 0xad, 0x0c, 0x16, 0x49, 0x53, 0x9d,
+ 0x91, 0x28, 0xbe, 0x49, 0x5e, 0xb7, 0xcf, 0xda, 0x82, 0xa0, 0x47, 0xa0,
+ 0x8a, 0x90, 0xa7, 0x86, 0x2e, 0xda, 0xbf, 0x77, 0x37, 0x10, 0x43, 0xc2,
+ 0x77, 0x04, 0xe9, 0x50, 0xe9, 0xf4, 0xf1, 0x3d, 0xb8, 0xde, 0xd9, 0x10,
+ 0x3c, 0x80, 0xac, 0x27, 0xc4, 0xd9, 0x4f, 0xcc, 0xef, 0x19, 0xe7, 0x10,
+ 0x0c, 0x85, 0x51, 0xbb, 0x3b, 0x5e, 0x20, 0xba, 0xef, 0x37, 0x65, 0xfa,
+ 0x54, 0x7e, 0xc3, 0x12, 0x03, 0xc5, 0x08, 0xe7, 0xbf, 0xcb, 0x24, 0x0a,
+ 0x73, 0xc4, 0xd9, 0xe9, 0xa7, 0x2e, 0xc7, 0x7f, 0xa4, 0xa7, 0x9a, 0x55,
+ 0x33, 0x97, 0x0a, 0xcf, 0x66, 0xb2, 0x1b, 0x8d, 0x67, 0x85, 0xdd, 0x00,
+ 0x98, 0x9f, 0x4a, 0x3f, 0xa0, 0xa7, 0x94, 0xed, 0x05, 0x1b, 0xe1, 0x3d,
+ 0xf5, 0x77, 0x72, 0x9f, 0x41, 0xd4, 0x48, 0x9f, 0xc2, 0x01, 0xed, 0xbd,
+ 0x14, 0x97, 0x66, 0x3d, 0x92, 0x70, 0xea, 0x40, 0x4c, 0x2f, 0xe6, 0x46,
+ 0x5d, 0xae, 0x8d, 0x12, 0x8e, 0xa1, 0x44, 0x78, 0x83, 0x4b, 0x4c, 0xec,
+ 0x02, 0x9f, 0x35, 0x1b, 0x64, 0x31, 0x64, 0x99, 0x27, 0xd9, 0xa8, 0xa1,
+ 0x28, 0x4f, 0xda, 0x50, 0x74, 0x82, 0x11, 0x20, 0xeb, 0xc8, 0x6d, 0x06,
+ 0xd5, 0xe1, 0xee, 0x50, 0xfd, 0x2e, 0x00, 0x7f, 0x8a, 0xdd, 0x27, 0xdf,
+ 0x90, 0xc8, 0x27, 0xe4, 0x10, 0xb2, 0x62, 0x38, 0x51, 0x85, 0x09, 0xbf,
+ 0x33, 0x9f, 0x93, 0x9e, 0x90, 0xc1, 0x35, 0xe5, 0xdd, 0x96, 0x14, 0xa4,
+ 0x0e, 0x2c, 0x60, 0xec, 0xc1, 0x5f, 0x86, 0x61, 0x48, 0x74, 0x36, 0xe3,
+ 0xc7, 0x66, 0x52, 0x38, 0xcc, 0x7c, 0xfb, 0x0c, 0xe4, 0x7c, 0x09, 0x92,
+ 0x9e, 0x35, 0x29, 0x65, 0x29, 0xf8, 0xa1, 0x98, 0x97, 0x54, 0xc3, 0xe9,
+ 0x48, 0x7d, 0x6d, 0x9c, 0xf2, 0x07, 0x25, 0x65, 0xa0, 0x27, 0xf0, 0x49,
+ 0x24, 0x0d, 0x7a, 0x85, 0x17, 0xa3, 0xe5, 0xe3, 0x03, 0x53, 0x11, 0x8f,
+ 0xcf, 0x85, 0x0f, 0x8c, 0x8a, 0xc7, 0xb6, 0x28, 0x1e, 0x17, 0xe8, 0xbc,
+ 0x81, 0x73, 0x5d, 0x77, 0x06, 0x2c, 0xb2, 0x35, 0xfc, 0xd8, 0xa8, 0x03,
+ 0xa6, 0x37, 0xe6, 0xdf, 0xc9, 0x14, 0x80, 0x90, 0xb4, 0x40, 0x59, 0x22,
+ 0x08, 0x04, 0x2b, 0xd5, 0xa8, 0xba, 0xab, 0x18, 0x30, 0x3b, 0x93, 0xd1,
+ 0x56, 0x33, 0x6c, 0x95, 0xc1, 0x95, 0x34, 0x63, 0xcf, 0x4b, 0xa5, 0xa8,
+ 0x4b, 0x9b, 0xd6, 0x8c, 0xe3, 0xe6, 0x4e, 0x54, 0xa4, 0x57, 0x18, 0xdf,
+ 0x0c, 0xfb, 0xe7, 0x09, 0xa1, 0x4b, 0xc1, 0x3f, 0x80, 0xe4, 0x26, 0x03,
+ 0x03, 0x66, 0x47, 0xd9, 0x02, 0x54, 0x20, 0x00, 0x07, 0xc2, 0x79, 0x14,
+ 0x02, 0xed, 0xe4, 0x89, 0x1f, 0x72, 0x60, 0x64, 0x78, 0x4a, 0xc1, 0x58,
+ 0xe6, 0x04, 0x2e, 0x84, 0x24, 0x0a, 0x76, 0xb2, 0x31, 0x6c, 0xdd, 0xa1,
+ 0x15, 0x17, 0xde, 0xe2, 0xa5, 0xcd, 0x2e, 0x5e, 0x3b, 0xed, 0x30, 0x60,
+ 0x76, 0x99, 0xfd, 0x6b, 0x86, 0x7a, 0x1f, 0xfb, 0xea, 0x38, 0x01, 0x10,
+ 0x5f, 0x0a, 0x4a, 0x1f, 0x50, 0xa8, 0xb5, 0x7e, 0x7c, 0x6b, 0xb4, 0xdb,
+ 0xee, 0xb7, 0x9b, 0xe6, 0xdf, 0x50, 0xee, 0x6a, 0x52, 0x91, 0x3f, 0x8c,
+ 0xb9, 0x00, 0x86, 0xa9, 0xa7, 0x1e, 0x1f, 0x7b, 0x8b, 0x8f, 0x59, 0xaa,
+ 0x75, 0x65, 0x14, 0x66, 0x98, 0x34, 0x9f, 0xfa, 0x8d, 0xc7, 0x26, 0xdf,
+ 0xb5, 0xc2, 0x69, 0xfd, 0x41, 0x41, 0x49, 0xbd, 0xf4, 0x01, 0x8d, 0xdb,
+ 0x52, 0x21, 0xf3, 0x5a, 0x6d, 0xfb, 0xfd, 0xe4, 0x23, 0x9d, 0x9d, 0xbc,
+ 0x1c, 0x6a, 0x45, 0xbb, 0x96, 0x26, 0x57, 0xd4, 0x30, 0x6e, 0xa4, 0xcb,
+ 0x5d, 0x43, 0x6c, 0x77, 0x37, 0x14, 0xac, 0x68, 0xca, 0xcf, 0xe1, 0x72,
+ 0x04, 0x8f, 0xf1, 0xbb, 0x23, 0xfa, 0x6a, 0x18, 0xc2, 0x00, 0x82, 0x73,
+ 0x99, 0x69, 0x95, 0xb3, 0xab, 0x42, 0x6e, 0xeb, 0x05, 0x47, 0x10, 0x0b,
+ 0x85, 0x06, 0x00, 0x14, 0x01, 0x4c, 0xd4, 0x5a, 0xa2, 0x79, 0x72, 0x67,
+ 0x1d, 0x75, 0x13, 0x1e, 0x10, 0xa6, 0x44, 0xa6, 0x01, 0x47, 0x22, 0xd1,
+ 0xe0, 0xdd, 0xb9, 0x11, 0xc0, 0xc4, 0xb5, 0x8c, 0x32, 0xa4, 0x0c, 0xb0,
+ 0x12, 0xa1, 0xa3, 0x43, 0x63, 0x28, 0xfa, 0x78, 0x4e, 0xc0, 0xa8, 0x7b,
+ 0x13, 0x0f, 0xa6, 0xeb, 0x5e, 0xdd, 0xb1, 0x33, 0xcc, 0x97, 0xac, 0x98,
+ 0x4b, 0x5a, 0x74, 0x3a, 0x2d, 0x46, 0x79, 0x1f, 0xf5, 0x3a, 0x24, 0x74,
+ 0x44, 0x90, 0xb0, 0x62, 0x22, 0xed, 0x48, 0xdf, 0x16, 0x1c, 0xc6, 0x7c,
+ 0xe3, 0x55, 0xc0, 0xee, 0xff, 0x92, 0x18, 0xea, 0x07, 0xc8, 0x23, 0x0f,
+ 0x84, 0x47, 0x02, 0xf6, 0x33, 0x30, 0x49, 0x73, 0xe6, 0x45, 0xbb, 0x83,
+ 0x85, 0xd9, 0x4c, 0x9f, 0x36, 0x1c, 0x20, 0x7a, 0xf2, 0x12, 0x61, 0x54,
+ 0x95, 0xb1, 0x96, 0x30, 0x80, 0x6f, 0x8c, 0xe2, 0x05, 0xb5, 0x24, 0xd3,
+ 0x3b, 0x34, 0x84, 0x43, 0xc2, 0x48, 0x33, 0xa1, 0x7c, 0x85, 0x4c, 0xea,
+ 0xed, 0xa0, 0x20, 0x80, 0x8f, 0x2f, 0x6d, 0x84, 0x9e, 0x5f, 0xd9, 0x23,
+ 0x3a, 0xc6, 0x5d, 0xb4, 0x42, 0xef, 0x8a, 0x15, 0x5a, 0x52, 0x28, 0xed,
+ 0x10, 0xfa, 0x2a, 0x2d, 0xd3, 0x61, 0xbd, 0xe8, 0xc8, 0x2a, 0x5a, 0xa1,
+ 0xda, 0xca, 0x20, 0x9f, 0x65, 0x21, 0x8e, 0x71, 0x21, 0x8e, 0x6d, 0x19,
+ 0x09, 0x33, 0x6b, 0x1c, 0xae, 0x24, 0x61, 0xab, 0x65, 0xa6, 0x02, 0xc0,
+ 0xa8, 0x30, 0x4e, 0x45, 0x41, 0x04, 0x0d, 0x50, 0x2c, 0x5a, 0xe6, 0x00,
+ 0x1b, 0x80, 0x9a, 0x68, 0xb4, 0x18, 0x30, 0x4a, 0x4a, 0x31, 0x0e, 0x46,
+ 0x8f, 0x9f, 0xe6, 0xa3, 0x2c, 0xc0, 0xfa, 0x87, 0x48, 0x57, 0x89, 0xc0,
+ 0x6b, 0x27, 0xaf, 0xb3, 0x47, 0xbd, 0xaa, 0x5c, 0xae, 0x07, 0xeb, 0x7e,
+ 0x8a, 0xf3, 0xda, 0xeb, 0x11, 0x04, 0xf1, 0x82, 0x8d, 0x8e, 0xcc, 0x6d,
+ 0xe0, 0x48, 0x31, 0x0d, 0x30, 0x7a, 0x3d, 0xa6, 0xb7, 0x32, 0xe7, 0x9f,
+ 0x82, 0x9e, 0x1b, 0x86, 0xb8, 0xa0, 0x2e, 0xcc, 0x90, 0x3c, 0x0c, 0x33,
+ 0xc4, 0x9b, 0x94, 0x19, 0xe8, 0x84, 0x90, 0xa1, 0xec, 0xf6, 0x81, 0x23,
+ 0x43, 0x0b, 0xe2, 0xb0, 0x35, 0x1b, 0xc8, 0x9f, 0xac, 0x8a, 0x47, 0xab,
+ 0x4b, 0x05, 0x56, 0x66, 0x64, 0xd0, 0x63, 0x03, 0x85, 0x9f, 0xa6, 0xad,
+ 0xb9, 0x08, 0xfd, 0xce, 0x7a, 0xb8, 0xb5, 0x55, 0x71, 0x16, 0xd1, 0xea,
+ 0xca, 0x41, 0xfb, 0x08, 0x9b, 0xd1, 0x7b, 0x83, 0xe9, 0x45, 0xed, 0xd4,
+ 0xe4, 0xbf, 0x74, 0xa3, 0x9e, 0xef, 0x6c, 0xab, 0x3e, 0x26, 0xbb, 0xed,
+ 0x83, 0xba, 0x2e, 0xee, 0x7a, 0x3b, 0xb7, 0x89, 0xa1, 0x05, 0x46, 0x01,
+ 0x2a, 0x66, 0x90, 0x18, 0x10, 0x71, 0x27, 0x3b, 0xe5, 0x0e, 0xa6, 0x68,
+ 0x77, 0x27, 0xae, 0xda, 0x59, 0xa6, 0x98, 0xbc, 0x83, 0x35, 0xf2, 0x35,
+ 0xbc, 0x3b, 0x8c, 0x31, 0x7e, 0xe8, 0x3f, 0xee, 0x7c, 0xd7, 0xd8, 0x6b,
+ 0xc0, 0x87, 0xbd, 0xef, 0x1a, 0xdb, 0x87, 0xed, 0x7d, 0xfc, 0xbc, 0x6f,
+ 0x3e, 0x6f, 0x37, 0x42, 0x6d, 0x90, 0x96, 0x92, 0x35, 0x41, 0x5a, 0x51,
+ 0xab, 0x05, 0x7e, 0xf5, 0xf1, 0x38, 0xf9, 0x23, 0xf9, 0xea, 0x63, 0x07,
+ 0xff, 0x3d, 0x37, 0xff, 0xfe, 0xfa, 0xd5, 0xc7, 0x9d, 0xad, 0x96, 0xf9,
+ 0x7c, 0x78, 0x71, 0xf1, 0x1b, 0x7d, 0xef, 0x19, 0x26, 0x65, 0xae, 0x5c,
+ 0x5c, 0x5c, 0x9c, 0xf3, 0x95, 0xed, 0x2d, 0xba, 0xb4, 0xbd, 0x65, 0x2e,
+ 0x5e, 0xfc, 0x66, 0x95, 0x3d, 0x43, 0x08, 0xa7, 0x40, 0x6e, 0x15, 0x24,
+ 0x54, 0x48, 0xfa, 0x04, 0x23, 0xb3, 0x28, 0x22, 0xa5, 0xd9, 0x3c, 0xc5,
+ 0x1d, 0x58, 0x7d, 0xa1, 0xda, 0x26, 0xa4, 0x7a, 0x9b, 0x76, 0x7a, 0xc4,
+ 0xc5, 0xa0, 0xc9, 0x36, 0xd4, 0x31, 0x1f, 0xf9, 0xfa, 0xa3, 0x1d, 0xff,
+ 0xa9, 0xa7, 0x4b, 0x52, 0x64, 0xb6, 0xe4, 0x6c, 0x50, 0xb2, 0x30, 0xc3,
+ 0x5a, 0x38, 0xaa, 0xc7, 0xde, 0x20, 0x60, 0x24, 0x27, 0x8f, 0x02, 0x38,
+ 0xe1, 0x03, 0x66, 0xf8, 0x8e, 0x4b, 0x3a, 0xdb, 0x3e, 0x40, 0xdc, 0x24,
+ 0x81, 0x3e, 0x32, 0x4a, 0x51, 0x61, 0x01, 0x28, 0x3b, 0x46, 0xcc, 0xf5,
+ 0xb7, 0x58, 0xa2, 0x77, 0x18, 0x22, 0x64, 0x5f, 0x5f, 0xb4, 0x8e, 0xb0,
+ 0xff, 0xf0, 0x69, 0xfb, 0x00, 0x2a, 0x56, 0x51, 0x37, 0x90, 0xdf, 0x20,
+ 0xc7, 0x3b, 0xa1, 0x78, 0x07, 0xe9, 0x2c, 0xe3, 0xa6, 0x62, 0xf6, 0x35,
+ 0x69, 0x38, 0xb9, 0x33, 0x67, 0x00, 0x04, 0x11, 0xc9, 0x3b, 0x33, 0xcc,
+ 0x4a, 0x86, 0xf0, 0x1d, 0x40, 0x3c, 0x02, 0x7f, 0x5a, 0x6e, 0x41, 0xa4,
+ 0xdc, 0x3b, 0x70, 0x54, 0x0f, 0xc3, 0x14, 0x8c, 0x5e, 0x13, 0x9b, 0xb9,
+ 0x0a, 0x35, 0x85, 0x53, 0x9c, 0x7f, 0xc5, 0xda, 0xb8, 0x62, 0x0d, 0xcc,
+ 0x8e, 0x3c, 0xaf, 0xac, 0x5f, 0x54, 0xb2, 0xf3, 0xe1, 0xf4, 0x9d, 0x39,
+ 0x48, 0x26, 0x83, 0x61, 0x56, 0xda, 0x30, 0x7f, 0xb1, 0xc9, 0xb8, 0x09,
+ 0x46, 0xa4, 0xa7, 0x0a, 0x83, 0x21, 0x49, 0xde, 0x3f, 0x8d, 0xdd, 0xef,
+ 0x90, 0xa7, 0xce, 0xcc, 0x4f, 0xcb, 0x67, 0xec, 0x3e, 0x80, 0xf4, 0xfe,
+ 0x11, 0x24, 0xe8, 0x40, 0x2a, 0xa5, 0xd1, 0xc1, 0xf8, 0x7b, 0x02, 0xe1,
+ 0x7a, 0x1f, 0xd2, 0x21, 0xcb, 0x7c, 0x60, 0xdc, 0xfd, 0xa9, 0x7b, 0xd5,
+ 0xda, 0xa3, 0x85, 0xc5, 0x14, 0xf5, 0x36, 0xd2, 0xc8, 0x29, 0x29, 0x7e,
+ 0xf1, 0xf8, 0x51, 0xb0, 0x61, 0x1a, 0x89, 0xb8, 0x7c, 0x1a, 0xab, 0xed,
+ 0x86, 0xd7, 0x92, 0xab, 0x27, 0x8c, 0xbe, 0x37, 0x83, 0xeb, 0x5a, 0x94,
+ 0x5d, 0x3f, 0x9c, 0x34, 0x77, 0x95, 0xa9, 0x25, 0xb0, 0x8f, 0xaa, 0x78,
+ 0x3f, 0x8d, 0x6e, 0x8a, 0x21, 0xe7, 0xdd, 0x50, 0x75, 0xb0, 0xc0, 0x13,
+ 0xaa, 0xb2, 0x80, 0x14, 0x87, 0xbd, 0x6a, 0x9c, 0x5e, 0x91, 0x71, 0x63,
+ 0x5d, 0x81, 0x9d, 0x6c, 0x48, 0x22, 0x2c, 0xce, 0xba, 0x36, 0x5d, 0x10,
+ 0xc4, 0xc2, 0x3a, 0x6c, 0xcf, 0x0d, 0x8d, 0xb8, 0xe1, 0xe4, 0x82, 0x84,
+ 0xc4, 0x82, 0x52, 0xc9, 0x05, 0x25, 0x2a, 0xa5, 0x46, 0x7a, 0xb0, 0xf1,
+ 0xef, 0x8e, 0x09, 0xe1, 0x5b, 0xe3, 0x3c, 0xe8, 0x17, 0xec, 0xd0, 0x15,
+ 0xbc, 0xf1, 0xcf, 0xf3, 0x9f, 0x2b, 0xcb, 0x7c, 0xae, 0x14, 0xe7, 0xc1,
+ 0x81, 0x20, 0xd7, 0x39, 0xb6, 0xbc, 0xc7, 0xf0, 0xa1, 0x8d, 0xbf, 0x45,
+ 0x2c, 0x47, 0x35, 0x3b, 0xbf, 0xeb, 0xcb, 0x48, 0x98, 0xe8, 0xe8, 0x4e,
+ 0x33, 0x5d, 0x4b, 0xc8, 0x1c, 0x3f, 0xc3, 0x6c, 0x4a, 0xb3, 0x35, 0x00,
+ 0xd0, 0x1d, 0x9a, 0x17, 0xdc, 0x43, 0x3e, 0x7a, 0x89, 0x7f, 0xe4, 0x7c,
+ 0x56, 0xfd, 0x79, 0x17, 0x4b, 0x95, 0xed, 0x4a, 0xa5, 0x32, 0xa8, 0xeb,
+ 0x85, 0x7d, 0xf2, 0x56, 0x1c, 0x44, 0xdd, 0xe1, 0xc3, 0x7d, 0x7a, 0x83,
+ 0x68, 0x55, 0xc0, 0x1e, 0x9e, 0x86, 0xc3, 0xf4, 0xc6, 0x7c, 0x46, 0x27,
+ 0x9a, 0xdb, 0x46, 0x88, 0x12, 0x09, 0xf1, 0x13, 0x82, 0x61, 0xa1, 0xc6,
+ 0xa1, 0xb4, 0xda, 0x8b, 0xd9, 0x70, 0x18, 0xe0, 0x3e, 0xfa, 0x7b, 0x59,
+ 0x89, 0x24, 0xa2, 0xaa, 0xe2, 0x44, 0x52, 0x98, 0xac, 0x35, 0xca, 0xfa,
+ 0x62, 0x11, 0xcc, 0x7c, 0x17, 0xee, 0xf2, 0xec, 0xe6, 0x55, 0xcd, 0x05,
+ 0x62, 0x3f, 0x44, 0xd8, 0x07, 0x50, 0x27, 0x27, 0xe7, 0xc3, 0x37, 0x95,
+ 0xb4, 0x06, 0x91, 0x8a, 0x60, 0x9b, 0x46, 0xef, 0xc7, 0x98, 0x20, 0x38,
+ 0x73, 0x72, 0x0a, 0xd1, 0x1c, 0xc1, 0x6a, 0x8d, 0x19, 0xde, 0x08, 0xf1,
+ 0x17, 0xa0, 0x80, 0xc2, 0x8c, 0xb1, 0xca, 0xd5, 0x5e, 0x10, 0xf7, 0x7f,
+ 0x3e, 0x9e, 0x21, 0x4b, 0xc5, 0x64, 0x9a, 0xca, 0xda, 0x13, 0x30, 0xa4,
+ 0xf9, 0x40, 0x41, 0xf2, 0x7d, 0xb3, 0xbf, 0xd0, 0xc5, 0x31, 0x44, 0x67,
+ 0x05, 0x46, 0x4a, 0x42, 0x96, 0xcb, 0xb4, 0x78, 0x28, 0x55, 0xfa, 0x00,
+ 0x26, 0x10, 0x45, 0x10, 0x38, 0xb5, 0xa7, 0x2b, 0x79, 0xcd, 0xe1, 0x2e,
+ 0x3c, 0x0e, 0x97, 0xc1, 0x44, 0xa1, 0x10, 0x22, 0x32, 0x7d, 0x0b, 0x8c,
+ 0xeb, 0x14, 0xcb, 0x42, 0xe3, 0x27, 0x2b, 0x2a, 0x21, 0xe7, 0x03, 0x8e,
+ 0xca, 0xf7, 0xd3, 0xa1, 0xf0, 0x88, 0xd6, 0x31, 0x0a, 0x4e, 0xa1, 0x47,
+ 0xd7, 0xd7, 0xd7, 0xfe, 0xb1, 0xf6, 0xc7, 0xda, 0xc7, 0xb5, 0x8d, 0x64,
+ 0x7d, 0xed, 0x95, 0xf9, 0x34, 0xc2, 0x4f, 0x2f, 0xcd, 0xa7, 0xe1, 0xda,
+ 0xc6, 0x06, 0x37, 0xdb, 0x94, 0x68, 0x67, 0x4e, 0x38, 0xa2, 0x84, 0x7b,
+ 0x12, 0x31, 0x15, 0x16, 0x3a, 0xca, 0xad, 0x38, 0x6c, 0xf4, 0xc8, 0xfb,
+ 0x82, 0x72, 0x9d, 0x35, 0x5e, 0xca, 0x17, 0x3d, 0x7c, 0x89, 0xcd, 0x72,
+ 0x7c, 0x04, 0x9b, 0xe5, 0xf8, 0x48, 0xcb, 0xef, 0xaf, 0x05, 0x91, 0xc6,
+ 0xe6, 0x89, 0x04, 0xe5, 0x27, 0x3d, 0x21, 0x0d, 0x9a, 0xc5, 0xd8, 0x23,
+ 0xac, 0xd7, 0x56, 0xc2, 0x31, 0x2b, 0x71, 0x81, 0x82, 0x52, 0x4b, 0xa1,
+ 0x49, 0xac, 0x3c, 0x53, 0x7c, 0xd2, 0xd0, 0xa3, 0x27, 0x74, 0x3c, 0x99,
+ 0xd6, 0x0c, 0x7d, 0x34, 0x13, 0xaa, 0xcd, 0x6a, 0x13, 0x76, 0x18, 0x9d,
+ 0x8c, 0x82, 0x6d, 0xe9, 0x41, 0xee, 0x15, 0x35, 0xcb, 0x40, 0x2d, 0xb7,
+ 0x12, 0x02, 0x85, 0xec, 0xfb, 0x61, 0x36, 0x01, 0x4f, 0x5b, 0x89, 0x06,
+ 0x90, 0x98, 0x48, 0x61, 0xd6, 0xcb, 0xc9, 0x14, 0xd4, 0x2a, 0x55, 0xeb,
+ 0xf4, 0x31, 0x5f, 0xc3, 0x12, 0x52, 0x0f, 0x10, 0xb7, 0xac, 0x4f, 0x97,
+ 0xd7, 0x23, 0xdc, 0x50, 0x8d, 0x53, 0xfe, 0xc0, 0x27, 0x0d, 0x36, 0x83,
+ 0x17, 0xa8, 0x42, 0xac, 0xa1, 0xb3, 0x51, 0xfe, 0x51, 0xc2, 0x30, 0xe0,
+ 0x57, 0x8f, 0x1d, 0x7a, 0x67, 0x46, 0xec, 0xa0, 0x20, 0x6a, 0xc7, 0x9a,
+ 0xbe, 0xd0, 0x68, 0x19, 0xf7, 0x47, 0xc0, 0x5d, 0x9e, 0x14, 0x2a, 0x17,
+ 0x6a, 0xfc, 0x11, 0x2f, 0x71, 0xbf, 0x36, 0x4e, 0xe9, 0x2f, 0x75, 0xfd,
+ 0x0f, 0x6f, 0x78, 0x88, 0x9c, 0xd6, 0x38, 0xc5, 0x3f, 0xf8, 0xfb, 0xea,
+ 0xca, 0x1f, 0xc9, 0x5a, 0x7b, 0xcd, 0xdc, 0xb6, 0xd6, 0xc2, 0x7f, 0xff,
+ 0x03, 0xff, 0x7d, 0xb1, 0x16, 0x3c, 0xd8, 0xc5, 0x82, 0x3e, 0x66, 0xad,
+ 0x59, 0xc1, 0xd1, 0x5f, 0xd5, 0x8b, 0x9c, 0x63, 0x83, 0xeb, 0x4f, 0x4d,
+ 0x6c, 0x25, 0x2a, 0xba, 0xad, 0x7a, 0x4a, 0x85, 0x03, 0xf6, 0x06, 0xab,
+ 0x0f, 0xbe, 0xc5, 0x23, 0xb5, 0x9d, 0x37, 0x3b, 0xda, 0x5b, 0x54, 0x3b,
+ 0x8f, 0x6e, 0x02, 0xcd, 0x13, 0x1b, 0xdf, 0x2c, 0xee, 0x4d, 0xe9, 0x75,
+ 0xa7, 0xac, 0x99, 0x78, 0xea, 0x37, 0x75, 0x18, 0xe9, 0x25, 0x2e, 0xb0,
+ 0x78, 0x13, 0x14, 0x3c, 0xb3, 0xb0, 0x33, 0x42, 0x98, 0xd2, 0x1d, 0xa1,
+ 0xcf, 0xf8, 0x04, 0xd5, 0x0d, 0xf9, 0x6f, 0x4b, 0xbd, 0xa5, 0x0c, 0x5f,
+ 0x53, 0x3b, 0xf0, 0xf8, 0x76, 0x59, 0x66, 0xf8, 0xb1, 0x27, 0x37, 0x16,
+ 0xf8, 0xbf, 0x04, 0x98, 0x55, 0x52, 0xf4, 0x61, 0x1f, 0x22, 0xff, 0x1f,
+ 0x08, 0xdb, 0x97, 0x70, 0x72, 0x66, 0x4c, 0xc0, 0x0d, 0x5c, 0x75, 0x14,
+ 0x30, 0xbe, 0xa1, 0xbc, 0xc9, 0x65, 0x13, 0x1d, 0x8a, 0x0d, 0x15, 0x46,
+ 0x4c, 0xa7, 0xdc, 0x4c, 0x5b, 0x10, 0x56, 0x4b, 0x97, 0x89, 0x84, 0x47,
+ 0x00, 0xf2, 0xf3, 0x27, 0x69, 0x99, 0xad, 0xa9, 0x68, 0xae, 0xf1, 0xc1,
+ 0x2c, 0xc1, 0xd1, 0xe6, 0xcd, 0x82, 0xc2, 0x91, 0x85, 0x1a, 0x6e, 0xf6,
+ 0x0b, 0x0d, 0x9b, 0x2c, 0xe6, 0x84, 0x18, 0x45, 0x80, 0x78, 0x0e, 0x70,
+ 0xca, 0x6b, 0x46, 0x60, 0x6a, 0x8d, 0x40, 0xc0, 0x9f, 0xa4, 0x01, 0x0f,
+ 0xc4, 0x55, 0x15, 0xe7, 0x58, 0x5d, 0xf1, 0x57, 0x03, 0x13, 0x84, 0x79,
+ 0x74, 0x66, 0x65, 0xf4, 0x57, 0x6a, 0x0a, 0x10, 0x58, 0x6d, 0x19, 0x83,
+ 0xe4, 0x59, 0xcf, 0x82, 0x9f, 0x87, 0xa2, 0x9b, 0xc8, 0xca, 0x0a, 0x67,
+ 0x38, 0x56, 0x12, 0x01, 0xc8, 0x3f, 0x41, 0x93, 0xe1, 0xd0, 0x84, 0x85,
+ 0x2c, 0x52, 0x56, 0x20, 0xce, 0x1a, 0xbd, 0xf9, 0x64, 0x5a, 0xf5, 0xa6,
+ 0xd5, 0x92, 0xeb, 0x5a, 0x63, 0x2d, 0x59, 0xff, 0xf5, 0xdf, 0xff, 0x8a,
+ 0x20, 0x5a, 0x8d, 0xdf, 0x02, 0xbe, 0xf6, 0xb6, 0x67, 0xcb, 0x6d, 0x35,
+ 0x4e, 0xd5, 0x17, 0xcb, 0x1c, 0xf5, 0xcd, 0xea, 0x56, 0xff, 0xc6, 0x8d,
+ 0x6f, 0x12, 0x78, 0x8d, 0x25, 0x5e, 0xf8, 0xf3, 0xc7, 0xd7, 0x84, 0x46,
+ 0xda, 0x58, 0x6b, 0xb8, 0xf7, 0xaf, 0x3d, 0xeb, 0xfd, 0x21, 0x4f, 0x9d,
+ 0xf7, 0x7e, 0xf3, 0x9a, 0xf9, 0x5b, 0xdb, 0x91, 0x0e, 0x4f, 0x97, 0xa3,
+ 0xa0, 0x70, 0xae, 0xa0, 0x4c, 0x53, 0x7c, 0xba, 0xe6, 0xf4, 0x60, 0x75,
+ 0x65, 0xd1, 0x14, 0xd8, 0x66, 0xd7, 0x9e, 0xd5, 0xec, 0xc2, 0x91, 0x05,
+ 0x74, 0x29, 0x4a, 0x93, 0x4f, 0x9e, 0x8e, 0x4d, 0x42, 0x37, 0x7f, 0xfd,
+ 0xf7, 0xc6, 0x6f, 0xb8, 0x66, 0x1b, 0x09, 0x77, 0x72, 0x1d, 0x3a, 0xf9,
+ 0xeb, 0xbf, 0xaf, 0xfd, 0x86, 0x53, 0xb9, 0x91, 0xcc, 0x7f, 0xe5, 0xdb,
+ 0xd9, 0x4d, 0x3e, 0x08, 0xdf, 0xa8, 0x2f, 0x06, 0x93, 0xea, 0x2d, 0x39,
+ 0xdc, 0x46, 0xbc, 0xd9, 0x7e, 0x24, 0xe7, 0x3f, 0x74, 0x08, 0x68, 0x0e,
+ 0xe7, 0x6b, 0xa9, 0x47, 0x92, 0x16, 0xf6, 0x76, 0x89, 0xe5, 0x57, 0x4d,
+ 0xe8, 0xee, 0x56, 0xec, 0x5a, 0xac, 0x5c, 0x9e, 0x8b, 0x79, 0x8b, 0x66,
+ 0xe7, 0xd7, 0xb4, 0xf5, 0x7b, 0xa7, 0xf5, 0x3f, 0x11, 0x82, 0x55, 0x2e,
+ 0xb5, 0xd6, 0xd6, 0x37, 0xfe, 0xd6, 0x6c, 0x6f, 0xbe, 0xf8, 0xee, 0xfb,
+ 0x93, 0xbf, 0x7c, 0xf3, 0xd5, 0xff, 0xfd, 0xff, 0xf6, 0x1f, 0x7f, 0xfd,
+ 0x6d, 0x1e, 0xfb, 0x8e, 0xd6, 0x2a, 0xfd, 0x5c, 0x72, 0xef, 0xe1, 0x0e,
+ 0xc8, 0xbd, 0x87, 0x3b, 0xa2, 0x24, 0x0e, 0xc9, 0x6d, 0x4e, 0x26, 0x95,
+ 0xa5, 0x19, 0xb1, 0x8e, 0x97, 0xc0, 0xf2, 0x4f, 0x25, 0x1b, 0x57, 0xbc,
+ 0x9a, 0x55, 0xb6, 0xc2, 0x8a, 0x68, 0xa0, 0x5c, 0x87, 0x0a, 0x21, 0x0d,
+ 0xef, 0x86, 0x99, 0x8d, 0xc3, 0x62, 0x95, 0x03, 0xe8, 0x9e, 0xf5, 0x0a,
+ 0xb1, 0x70, 0x30, 0x0a, 0x1d, 0xe3, 0x1c, 0x37, 0xd5, 0x8d, 0x7f, 0xe9,
+ 0xbd, 0xbe, 0xbe, 0x84, 0x2a, 0x30, 0x4f, 0xc3, 0x69, 0xd2, 0x80, 0x2b,
+ 0x46, 0x39, 0xa0, 0x87, 0x37, 0x9a, 0x12, 0xc4, 0x80, 0x4e, 0xfb, 0xe1,
+ 0x53, 0x92, 0x0e, 0x00, 0x71, 0x8b, 0xfc, 0x74, 0x1f, 0x8a, 0x7c, 0xc0,
+ 0x49, 0xb7, 0x0f, 0x13, 0x34, 0xc9, 0x48, 0x9d, 0x40, 0x02, 0x99, 0x56,
+ 0x15, 0xf1, 0x90, 0xb7, 0xf3, 0x10, 0x1e, 0x01, 0x06, 0x99, 0xc2, 0xed,
+ 0xd2, 0x30, 0xce, 0x68, 0x75, 0x85, 0xf2, 0x36, 0x2b, 0x85, 0x57, 0xab,
+ 0x56, 0x22, 0x04, 0x4f, 0x8b, 0x19, 0x63, 0xcf, 0x25, 0x7f, 0xeb, 0x15,
+ 0xe3, 0xd2, 0x04, 0xfe, 0x3a, 0xed, 0x52, 0x43, 0x87, 0xdd, 0xe9, 0xb5,
+ 0xf5, 0xc2, 0xa1, 0x93, 0x5b, 0x6b, 0xf9, 0x5e, 0x7a, 0x5b, 0x1c, 0x94,
+ 0x27, 0xc0, 0xd3, 0x49, 0x7c, 0x38, 0x1d, 0x95, 0x04, 0xd7, 0x4e, 0xaa,
+ 0xc9, 0x1a, 0x88, 0xa0, 0x43, 0xc0, 0x7a, 0x90, 0xdf, 0x4b, 0x80, 0x3a,
+ 0xa4, 0x78, 0xbf, 0x52, 0xb0, 0x3a, 0xa7, 0xc9, 0x34, 0x7d, 0xcf, 0xa1,
+ 0x5f, 0x02, 0xad, 0xb4, 0xc8, 0x6d, 0xef, 0xb9, 0x06, 0xab, 0x5d, 0xf7,
+ 0xdc, 0xf1, 0xd1, 0x7b, 0x9d, 0xe7, 0x1e, 0xea, 0x0a, 0x99, 0x7b, 0xc3,
+ 0x02, 0x44, 0x8b, 0xde, 0xc0, 0x01, 0x98, 0x15, 0xb0, 0xed, 0xb9, 0x2f,
+ 0xeb, 0x13, 0x1a, 0xb3, 0x87, 0x50, 0xb4, 0xec, 0xa3, 0x14, 0xf9, 0x08,
+ 0xe1, 0x18, 0xa3, 0x20, 0x44, 0x28, 0xd6, 0xbf, 0xfe, 0x80, 0xcd, 0x84,
+ 0x46, 0xbb, 0xd0, 0x88, 0xd3, 0x6a, 0xf1, 0xac, 0xbc, 0x56, 0x36, 0xa3,
+ 0xb1, 0x9c, 0x80, 0xf6, 0xe6, 0x22, 0xa0, 0xcc, 0x3a, 0x0a, 0x76, 0xa0,
+ 0x04, 0x66, 0xce, 0xed, 0xef, 0x43, 0x8e, 0x91, 0x5c, 0xb1, 0x40, 0x4c,
+ 0xef, 0xb9, 0x2f, 0xe8, 0x06, 0x3d, 0x42, 0xef, 0xdb, 0x91, 0x78, 0xdf,
+ 0xbc, 0xc3, 0xdf, 0x3c, 0x04, 0xe5, 0xfa, 0x18, 0x60, 0xcc, 0x1b, 0x94,
+ 0xe1, 0x5c, 0x4d, 0x8f, 0xc9, 0xc1, 0x16, 0xa2, 0x9b, 0xd1, 0xe1, 0x5b,
+ 0xbd, 0x9b, 0xb1, 0x14, 0xc7, 0x4f, 0x1e, 0x60, 0xb4, 0x04, 0x0b, 0x88,
+ 0x6b, 0xae, 0x80, 0xba, 0x26, 0x1f, 0xb2, 0x61, 0x88, 0x11, 0x25, 0xbc,
+ 0x03, 0xaa, 0x7c, 0x61, 0x38, 0x42, 0x13, 0x40, 0xe0, 0x4a, 0x44, 0xeb,
+ 0xf1, 0x6e, 0x63, 0xe2, 0x84, 0x77, 0x51, 0xc0, 0x02, 0xde, 0xe3, 0xa2,
+ 0x14, 0x38, 0x1d, 0xd5, 0xd9, 0xdd, 0x22, 0xa1, 0xcf, 0x31, 0x6f, 0x38,
+ 0x6e, 0xf2, 0xd0, 0x19, 0x8e, 0xac, 0xa6, 0x01, 0x05, 0xc5, 0xb8, 0x46,
+ 0x25, 0x8f, 0x06, 0xde, 0x3c, 0x62, 0x64, 0x33, 0x0c, 0x9c, 0xcc, 0xa7,
+ 0x33, 0xa9, 0xf0, 0x1e, 0x38, 0xcf, 0x15, 0xb7, 0x38, 0x0d, 0x07, 0x1d,
+ 0x0b, 0xcb, 0x06, 0x1f, 0x8a, 0x11, 0x68, 0xa0, 0x4e, 0xc3, 0x58, 0xe7,
+ 0xdb, 0xae, 0xa3, 0x98, 0xb3, 0xa1, 0x9c, 0xcb, 0xb7, 0x30, 0x0b, 0x70,
+ 0x36, 0xdc, 0x00, 0xac, 0x2b, 0xd4, 0x28, 0x04, 0xd6, 0xbe, 0x81, 0x16,
+ 0x7d, 0x0a, 0x6c, 0x92, 0x08, 0x91, 0x7c, 0x22, 0xa7, 0x03, 0x03, 0x7d,
+ 0x55, 0xb0, 0x71, 0x31, 0xa2, 0x0b, 0x75, 0x12, 0x2c, 0x21, 0x80, 0x01,
+ 0x05, 0x7a, 0x6b, 0x40, 0x80, 0x11, 0x87, 0xd0, 0xa4, 0x8b, 0xb7, 0xa5,
+ 0x87, 0x35, 0xb6, 0x68, 0x57, 0x40, 0x27, 0xed, 0xb6, 0xd0, 0x4f, 0x82,
+ 0xf1, 0x2d, 0xf2, 0xae, 0x85, 0x7b, 0xba, 0x1d, 0x6c, 0xa7, 0xcf, 0x9a,
+ 0xf7, 0xb5, 0x8d, 0xc6, 0xb0, 0x6d, 0x65, 0x0c, 0x7b, 0x22, 0xbb, 0x1e,
+ 0x3a, 0x2c, 0xc9, 0xe3, 0xaf, 0x82, 0x53, 0x2b, 0xdd, 0x87, 0x75, 0xc0,
+ 0x7c, 0xa4, 0xc6, 0xa9, 0x2c, 0x09, 0x53, 0xfe, 0x07, 0x12, 0x19, 0x5c,
+ 0xd4, 0x14, 0x89, 0x05, 0x61, 0x45, 0x03, 0xb5, 0xf1, 0x4e, 0x00, 0xd2,
+ 0x78, 0x61, 0x18, 0x35, 0x5b, 0x9f, 0x31, 0x09, 0xc3, 0xd5, 0xb0, 0x72,
+ 0xe5, 0x13, 0x62, 0x2f, 0x48, 0xb0, 0x5e, 0x01, 0x24, 0xdb, 0x41, 0x8c,
+ 0xc7, 0x6c, 0xda, 0xa6, 0xbc, 0x8d, 0xcb, 0x5b, 0x87, 0xc0, 0x00, 0x38,
+ 0x13, 0x10, 0xf5, 0x32, 0x2c, 0x33, 0x2c, 0x90, 0xd1, 0x74, 0xb9, 0xaa,
+ 0x49, 0x2c, 0x81, 0x01, 0x41, 0x5d, 0x0d, 0x2b, 0xa5, 0xbf, 0x03, 0x3d,
+ 0x50, 0x2a, 0x70, 0xc0, 0x50, 0x7a, 0xf5, 0xc7, 0x05, 0x96, 0x3e, 0xd3,
+ 0x66, 0xf2, 0xe8, 0x81, 0x83, 0x46, 0x5b, 0x67, 0xe4, 0x2d, 0x7d, 0x2b,
+ 0x2f, 0x6e, 0x22, 0xf8, 0x2f, 0xb0, 0xf5, 0x52, 0xa4, 0x51, 0xe5, 0x4e,
+ 0x27, 0x65, 0xb9, 0xa0, 0xff, 0x09, 0x96, 0xe5, 0xa2, 0xd2, 0x2f, 0x14,
+ 0x0d, 0x8f, 0x35, 0x61, 0xc2, 0xbd, 0x78, 0xba, 0xe1, 0x5c, 0x6b, 0x1c,
+ 0xa9, 0x03, 0xc0, 0x5d, 0xa5, 0x75, 0xbb, 0x46, 0x6c, 0xd0, 0xf8, 0xce,
+ 0xbb, 0xca, 0x3b, 0x99, 0xb5, 0x52, 0x1a, 0x70, 0x6c, 0xf3, 0x41, 0xbe,
+ 0x59, 0x2c, 0x59, 0xcd, 0xed, 0x25, 0x80, 0xff, 0xa1, 0x89, 0x97, 0xe9,
+ 0x5e, 0xe6, 0xc5, 0xb4, 0x05, 0x23, 0xf3, 0x9d, 0x70, 0x86, 0x1e, 0x02,
+ 0x45, 0x42, 0x04, 0xa5, 0x4d, 0x17, 0x8f, 0x8c, 0xea, 0xb7, 0xdf, 0xbe,
+ 0x8e, 0x34, 0x9d, 0x8f, 0xc5, 0xd6, 0xd1, 0xc4, 0xd6, 0x38, 0xb5, 0x8c,
+ 0x1b, 0x50, 0x3c, 0x56, 0x26, 0x8c, 0xb1, 0x77, 0x97, 0x60, 0x09, 0xab,
+ 0x2b, 0x11, 0x9e, 0x20, 0xfc, 0xf5, 0xb2, 0x12, 0xb5, 0xa6, 0x12, 0x2b,
+ 0x7c, 0x74, 0x03, 0xb6, 0x06, 0x71, 0x97, 0x74, 0x65, 0xdd, 0x52, 0x82,
+ 0xd5, 0x21, 0xf1, 0x5d, 0x1b, 0x88, 0x78, 0x12, 0x40, 0x40, 0x73, 0x96,
+ 0x20, 0x8e, 0xa2, 0x13, 0x19, 0xf1, 0x12, 0x78, 0xa8, 0xc7, 0xbb, 0x34,
+ 0x6c, 0xff, 0xc2, 0x57, 0xf3, 0xb1, 0xa7, 0x5d, 0xf8, 0xd8, 0x58, 0x8b,
+ 0x1b, 0x6b, 0xf5, 0xa1, 0xd6, 0xb5, 0x8b, 0x90, 0x9c, 0x34, 0x97, 0x58,
+ 0x0e, 0x85, 0x26, 0x54, 0x90, 0x9a, 0x52, 0xad, 0x3d, 0x84, 0x75, 0x21,
+ 0x69, 0x94, 0x98, 0x25, 0xc4, 0x9a, 0x09, 0x96, 0x46, 0x29, 0x66, 0x90,
+ 0x00, 0x88, 0x6d, 0x11, 0xe6, 0x04, 0x50, 0x46, 0x01, 0x4a, 0xc5, 0xc3,
+ 0x3d, 0xfa, 0x4d, 0xe9, 0xe6, 0x16, 0xde, 0xa1, 0x4f, 0xb5, 0xb5, 0xe8,
+ 0x36, 0x49, 0xa3, 0xdb, 0xd6, 0x34, 0x58, 0xb3, 0x35, 0xe8, 0x50, 0x85,
+ 0x3e, 0x54, 0xdf, 0x60, 0x14, 0xef, 0x68, 0x73, 0x70, 0xa1, 0x6e, 0x1a,
+ 0xea, 0x4d, 0x48, 0xbe, 0x68, 0x10, 0x37, 0x24, 0xc1, 0x3d, 0x24, 0x38,
+ 0xa8, 0x48, 0x0f, 0xba, 0xdd, 0x6a, 0xc5, 0xca, 0x74, 0xf1, 0xdb, 0x37,
+ 0x46, 0xe5, 0x5e, 0xf7, 0x2f, 0xac, 0xd1, 0x2a, 0x81, 0x55, 0x41, 0x5d,
+ 0xde, 0x98, 0xa7, 0x0b, 0xd7, 0xfb, 0xd9, 0xfd, 0xdc, 0xba, 0xae, 0x15,
+ 0x9d, 0xeb, 0xc3, 0x1c, 0xe5, 0x40, 0x17, 0x79, 0x48, 0xce, 0x77, 0x92,
+ 0x6d, 0xba, 0x9e, 0xf0, 0x7d, 0xea, 0x09, 0x1c, 0x86, 0x6a, 0xb9, 0x5e,
+ 0x12, 0x50, 0xb9, 0x15, 0xdb, 0x44, 0x96, 0x2b, 0xe2, 0x3c, 0xbe, 0x0e,
+ 0x68, 0xf4, 0x04, 0x25, 0x18, 0xc9, 0x8c, 0x93, 0x23, 0xc6, 0xbe, 0x2e,
+ 0x9a, 0x06, 0x12, 0x4a, 0xe8, 0x20, 0x7a, 0x22, 0x5a, 0x7b, 0xc9, 0xf5,
+ 0x97, 0x5d, 0x82, 0xa4, 0x04, 0x05, 0x00, 0x17, 0xe7, 0x53, 0xad, 0x98,
+ 0x7a, 0xc5, 0xd6, 0x15, 0x16, 0xc8, 0xa7, 0x40, 0xad, 0x9e, 0x54, 0x61,
+ 0x2c, 0x47, 0x10, 0x16, 0xa2, 0x81, 0x9a, 0x9a, 0x04, 0xc8, 0x02, 0x41,
+ 0x30, 0x9c, 0x5d, 0x8f, 0x36, 0xcd, 0x10, 0x85, 0x17, 0x61, 0x44, 0xcd,
+ 0x8e, 0xcc, 0x3e, 0x48, 0x09, 0xc5, 0x8f, 0x53, 0x86, 0xf6, 0x65, 0x34,
+ 0x83, 0xda, 0x93, 0x01, 0xc3, 0xc3, 0x6b, 0x8f, 0x86, 0x3a, 0xb6, 0xdd,
+ 0x6a, 0x85, 0x2c, 0x7b, 0x9d, 0xb7, 0x18, 0xb9, 0x6c, 0x37, 0x14, 0x36,
+ 0x0b, 0xd6, 0xb9, 0x94, 0xd5, 0xb0, 0x3d, 0xaa, 0x06, 0xc3, 0x2f, 0x0e,
+ 0x1f, 0xfb, 0x84, 0x20, 0xc8, 0x83, 0x5d, 0x8c, 0x1f, 0xdb, 0x65, 0x91,
+ 0xec, 0xad, 0x14, 0x39, 0x81, 0xb0, 0x9f, 0x40, 0x2f, 0xb5, 0x6b, 0x6c,
+ 0x21, 0xd3, 0x07, 0x91, 0x5e, 0x5b, 0xc5, 0x61, 0x11, 0x2f, 0xa8, 0xee,
+ 0x24, 0xcd, 0x05, 0x64, 0xd3, 0x08, 0x13, 0x10, 0xd9, 0xd8, 0x59, 0xf1,
+ 0xd0, 0x38, 0xd3, 0x6a, 0xad, 0x25, 0xeb, 0xeb, 0x73, 0x02, 0xfe, 0x0c,
+ 0x77, 0x58, 0x6b, 0x81, 0x55, 0xd1, 0x70, 0xcb, 0xd6, 0x5a, 0x60, 0x7c,
+ 0x8f, 0xdf, 0xbb, 0x01, 0xd6, 0x63, 0x23, 0xb2, 0xad, 0xcd, 0xf7, 0x7d,
+ 0x40, 0x7e, 0xa5, 0x2e, 0x56, 0xc4, 0x73, 0x20, 0xa9, 0x3c, 0xd9, 0x1d,
+ 0x99, 0x8f, 0xbe, 0x36, 0xd7, 0x8b, 0x13, 0x4f, 0xe5, 0x23, 0x18, 0x39,
+ 0xf3, 0x23, 0x8e, 0x9c, 0xab, 0x49, 0xc0, 0x77, 0xc4, 0xd5, 0x4e, 0xe0,
+ 0x89, 0xfe, 0x89, 0x99, 0x41, 0xd3, 0x84, 0x72, 0x4b, 0x7f, 0x56, 0xc5,
+ 0x76, 0x07, 0xc3, 0x06, 0x77, 0x24, 0x6c, 0x10, 0x3c, 0x0c, 0x2c, 0x43,
+ 0xa8, 0xad, 0xed, 0x0e, 0x68, 0x3e, 0xd4, 0x64, 0x8c, 0x09, 0x03, 0xdf,
+ 0x40, 0x3c, 0x05, 0x93, 0x7b, 0x4b, 0x8c, 0x62, 0xc8, 0x0f, 0x20, 0x74,
+ 0x5f, 0xf0, 0xe3, 0x64, 0x92, 0x72, 0x29, 0x2b, 0x32, 0x86, 0x4c, 0x13,
+ 0xd6, 0x9c, 0x9c, 0x7d, 0xab, 0x6d, 0xe7, 0x4d, 0x8f, 0x97, 0x17, 0x39,
+ 0x39, 0xfb, 0x5b, 0x33, 0x39, 0x43, 0xad, 0xe6, 0x8c, 0xde, 0x45, 0x73,
+ 0x13, 0x67, 0xdb, 0xa0, 0x22, 0x09, 0x99, 0xbd, 0x75, 0x06, 0x84, 0x4b,
+ 0xcf, 0x80, 0x50, 0xcf, 0xbf, 0xcd, 0xe3, 0x92, 0xa8, 0x10, 0xb5, 0x3e,
+ 0x08, 0x27, 0x7f, 0x3b, 0xcf, 0x36, 0x61, 0x9a, 0x5e, 0x7f, 0x7b, 0x59,
+ 0x6e, 0xf0, 0xd4, 0xb9, 0x7c, 0x73, 0x25, 0x08, 0xe8, 0xa7, 0x88, 0x6d,
+ 0xf9, 0xa0, 0xa3, 0xd1, 0xb0, 0xcb, 0xd8, 0x5e, 0x5a, 0x3c, 0x48, 0x6d,
+ 0x78, 0xbe, 0x74, 0x16, 0xe7, 0xcb, 0x70, 0x43, 0x7d, 0x1f, 0x98, 0xc6,
+ 0x2f, 0xaf, 0xd3, 0xc9, 0x5d, 0x66, 0xf6, 0xa1, 0x7c, 0x9a, 0xe7, 0x50,
+ 0x9c, 0xbf, 0xbb, 0xf0, 0xa0, 0x9e, 0xfb, 0xfb, 0xd7, 0x0f, 0x79, 0xff,
+ 0x64, 0x5e, 0xf4, 0xee, 0x37, 0x66, 0x6f, 0x7e, 0x4f, 0xb7, 0x2d, 0x30,
+ 0xae, 0xdb, 0x7e, 0xdb, 0x91, 0x4a, 0xf7, 0x97, 0xf2, 0x17, 0x9b, 0x9e,
+ 0x42, 0x58, 0x0a, 0x38, 0xaf, 0x25, 0x30, 0x25, 0xf9, 0x63, 0x75, 0xc5,
+ 0xc6, 0xa6, 0xc0, 0x0f, 0x14, 0x9d, 0x32, 0x8f, 0x43, 0x60, 0x3d, 0xef,
+ 0xcf, 0x7f, 0x2e, 0xd2, 0x09, 0x28, 0xba, 0x22, 0xe0, 0x73, 0x61, 0x26,
+ 0x17, 0x95, 0x9a, 0x88, 0xa1, 0x87, 0x81, 0x9a, 0xf5, 0xf6, 0x92, 0x33,
+ 0xb2, 0x6d, 0x40, 0xd2, 0x14, 0x27, 0x24, 0xf0, 0x6b, 0xc4, 0xd7, 0x7b,
+ 0xc3, 0xa2, 0x4e, 0xb2, 0x23, 0xf3, 0xa9, 0x8a, 0xe3, 0x05, 0x20, 0xb6,
+ 0x28, 0xd5, 0x13, 0x98, 0xa7, 0xa5, 0x42, 0x8a, 0x26, 0x9e, 0x20, 0x50,
+ 0x19, 0xe3, 0x4d, 0xd2, 0x8b, 0x29, 0xba, 0xc4, 0x3b, 0x35, 0x0d, 0xbb,
+ 0x0a, 0x45, 0xd4, 0x25, 0xe2, 0x8c, 0x08, 0x90, 0x1d, 0x50, 0xb8, 0x3e,
+ 0x43, 0x88, 0x90, 0x51, 0x7f, 0xaa, 0x08, 0x99, 0x20, 0x84, 0x54, 0x56,
+ 0x4a, 0x4a, 0xc3, 0x34, 0x4e, 0xa5, 0xca, 0xb8, 0x46, 0xcb, 0x93, 0xd8,
+ 0x58, 0x02, 0x0d, 0xbb, 0x51, 0x3e, 0x6b, 0x46, 0xa2, 0xd5, 0x42, 0x96,
+ 0x79, 0xb7, 0x59, 0x1f, 0x9a, 0x97, 0xb2, 0x36, 0x9d, 0xe0, 0xb3, 0xa0,
+ 0x6e, 0x7c, 0x9e, 0xf3, 0xbe, 0xc6, 0x2c, 0x5b, 0x39, 0xfe, 0x6b, 0xc4,
+ 0x6a, 0xa0, 0x67, 0xd4, 0xb8, 0x94, 0x38, 0x80, 0x2a, 0xdd, 0x55, 0xb6,
+ 0x98, 0x3d, 0x3b, 0x85, 0x55, 0x04, 0x6c, 0xfd, 0xa8, 0x15, 0xb3, 0xb5,
+ 0x8a, 0xe8, 0x78, 0x32, 0x22, 0xb8, 0xa1, 0xbc, 0x65, 0x65, 0xed, 0x40,
+ 0x79, 0xb4, 0x77, 0x9c, 0x38, 0x73, 0x8d, 0x50, 0x3f, 0x59, 0x01, 0x38,
+ 0xd4, 0x1b, 0x6d, 0x4c, 0x28, 0x48, 0xea, 0xc0, 0x2b, 0x05, 0xd9, 0xa4,
+ 0x02, 0xde, 0x1c, 0x08, 0xe7, 0x4d, 0xa6, 0xa7, 0xd3, 0xda, 0x0b, 0xa1,
+ 0xbc, 0x99, 0xd7, 0x63, 0x2e, 0x0a, 0x32, 0x37, 0xea, 0x0e, 0x0f, 0xc7,
+ 0x5f, 0xf1, 0xb9, 0x5f, 0x2b, 0x96, 0x16, 0xce, 0xe7, 0x9b, 0xdf, 0x42,
+ 0x54, 0x9d, 0x7d, 0xf1, 0x8c, 0x93, 0xa7, 0x76, 0xd9, 0xb4, 0x2c, 0x77,
+ 0x7e, 0x25, 0x4b, 0x8d, 0xa2, 0x1c, 0x7e, 0xad, 0x61, 0xc4, 0xe6, 0x47,
+ 0xd0, 0xff, 0xc1, 0x16, 0x81, 0x1f, 0xaa, 0x39, 0xdc, 0x5d, 0x52, 0x0e,
+ 0xbb, 0xa4, 0x12, 0x56, 0xc2, 0x58, 0xba, 0xe7, 0xbd, 0xf1, 0x00, 0x7e,
+ 0x36, 0x7f, 0x96, 0x08, 0x70, 0xb2, 0xef, 0x73, 0x9d, 0xa3, 0xd7, 0x06,
+ 0x72, 0x26, 0xcf, 0xf2, 0xda, 0xa2, 0xd6, 0x3c, 0xc5, 0x35, 0xd0, 0x5a,
+ 0xff, 0xd4, 0xe1, 0x68, 0x0e, 0x1f, 0xd1, 0x6a, 0xe7, 0x1f, 0x90, 0xc9,
+ 0xa2, 0x2e, 0xe2, 0xfc, 0xd8, 0x2e, 0xe2, 0x34, 0xb9, 0xc1, 0xf2, 0x3b,
+ 0xe6, 0x9f, 0x6b, 0xbf, 0x88, 0x2d, 0xdb, 0xb7, 0xc3, 0x10, 0xda, 0x58,
+ 0xe8, 0xdf, 0xad, 0x2c, 0x88, 0xb3, 0x52, 0x81, 0x39, 0xb0, 0xba, 0x15,
+ 0x9a, 0x54, 0xcc, 0x0c, 0xeb, 0x1a, 0x85, 0x56, 0x7a, 0x0a, 0xd1, 0xb3,
+ 0x16, 0xfe, 0xd2, 0xed, 0xd6, 0x1a, 0x6b, 0x3d, 0x6f, 0x62, 0x8b, 0xeb,
+ 0x8b, 0x15, 0x9e, 0xa8, 0xe0, 0xe5, 0x86, 0xb2, 0xeb, 0x25, 0x75, 0x66,
+ 0xbd, 0x98, 0x0d, 0x33, 0x6e, 0xed, 0x8c, 0xd8, 0x45, 0xdb, 0x49, 0xb0,
+ 0xa7, 0xb9, 0xd2, 0x26, 0x24, 0xd7, 0x3a, 0x9b, 0x51, 0xa8, 0x47, 0x04,
+ 0x93, 0x9a, 0x8f, 0x99, 0x93, 0x54, 0xb6, 0x3e, 0xa4, 0xda, 0x83, 0xab,
+ 0xfb, 0x74, 0x89, 0x1e, 0x9a, 0xdb, 0x37, 0xeb, 0xee, 0xe7, 0x63, 0x53,
+ 0xaf, 0xc4, 0xa7, 0xb8, 0x72, 0xa9, 0xd4, 0xde, 0xd2, 0xd6, 0x89, 0x50,
+ 0x4f, 0xe2, 0x1d, 0xe6, 0x0d, 0xec, 0x47, 0xa3, 0x1e, 0x14, 0x4d, 0x28,
+ 0xab, 0x31, 0x1c, 0xfc, 0xc5, 0x1f, 0x03, 0x11, 0x6a, 0xb2, 0x40, 0x11,
+ 0x40, 0x1c, 0x88, 0xd6, 0x60, 0x3a, 0xf0, 0x64, 0x65, 0x73, 0x0d, 0xe9,
+ 0x48, 0xc0, 0x27, 0x92, 0x6b, 0xb0, 0x7a, 0x9c, 0xbb, 0x03, 0x79, 0x01,
+ 0x70, 0x12, 0x1c, 0xdd, 0x1e, 0x70, 0x92, 0x7b, 0x32, 0x28, 0x37, 0x54,
+ 0x17, 0x86, 0xff, 0x59, 0x8e, 0xf2, 0xed, 0x2d, 0x4a, 0x64, 0xdf, 0x12,
+ 0x2d, 0x8e, 0x02, 0x7a, 0x55, 0x86, 0x9b, 0x3a, 0x43, 0xbc, 0x72, 0x2b,
+ 0x03, 0x3d, 0x54, 0x32, 0x43, 0x11, 0x8d, 0x49, 0x1e, 0x1d, 0x39, 0xe3,
+ 0x1c, 0x2c, 0x3a, 0x81, 0xb4, 0x10, 0xf6, 0x21, 0x1c, 0x86, 0xda, 0x3a,
+ 0x01, 0xc8, 0x61, 0x4c, 0xc0, 0xcd, 0x00, 0x3a, 0x3c, 0xa7, 0xd4, 0x6e,
+ 0xae, 0xb7, 0xaa, 0x67, 0xa6, 0xf9, 0x29, 0x68, 0x23, 0x64, 0xf9, 0x89,
+ 0x11, 0x59, 0x1c, 0xe0, 0x49, 0x91, 0xd8, 0xb7, 0xf6, 0x9c, 0xfc, 0xde,
+ 0xcc, 0xa5, 0x8c, 0xec, 0xbb, 0xc6, 0x76, 0x7b, 0xab, 0xf1, 0xbd, 0x39,
+ 0x42, 0xe2, 0x24, 0xf7, 0xad, 0xa3, 0xb7, 0xe4, 0xb7, 0xdf, 0x9c, 0x46,
+ 0x7e, 0xca, 0x22, 0x27, 0xd4, 0x52, 0x30, 0x32, 0x63, 0xf4, 0x3d, 0x0b,
+ 0x5b, 0xf4, 0x1a, 0xbc, 0x56, 0xd3, 0xcd, 0x45, 0x1c, 0xbc, 0x0d, 0x6c,
+ 0xfa, 0x19, 0xee, 0x5a, 0x57, 0x1d, 0xc1, 0x0a, 0xe7, 0x8c, 0x45, 0x84,
+ 0x6e, 0x55, 0x14, 0x33, 0x6d, 0x7c, 0x49, 0x08, 0x72, 0x5f, 0x81, 0xc2,
+ 0xe6, 0x48, 0x16, 0x81, 0xb3, 0x26, 0x75, 0x54, 0xa1, 0x2b, 0x71, 0xf9,
+ 0x3d, 0x1b, 0x16, 0xb9, 0xb0, 0x7b, 0x0e, 0xdb, 0x56, 0x4c, 0xfc, 0xe8,
+ 0x3d, 0xc5, 0x3a, 0x89, 0x0b, 0xbb, 0x83, 0x05, 0x56, 0xf2, 0xd2, 0x56,
+ 0x25, 0x77, 0xa0, 0x07, 0x58, 0x24, 0x86, 0xab, 0x9d, 0x60, 0x2a, 0x0d,
+ 0x76, 0x0d, 0xd2, 0x3b, 0x28, 0x41, 0x6c, 0x41, 0xcc, 0x3f, 0x4f, 0x6e,
+ 0xc9, 0xb6, 0x54, 0x73, 0xcc, 0x8c, 0x17, 0x8d, 0xc4, 0x68, 0x18, 0x37,
+ 0x08, 0x6e, 0x8c, 0x59, 0x6c, 0xd8, 0x17, 0x3b, 0x2a, 0x99, 0x71, 0x36,
+ 0x8d, 0xe4, 0x53, 0x32, 0xa2, 0x16, 0x1c, 0xb7, 0x44, 0xae, 0xf5, 0x40,
+ 0xd3, 0x40, 0xb9, 0x11, 0xab, 0x9b, 0x8d, 0x01, 0x96, 0x87, 0xdc, 0x1b,
+ 0x88, 0x46, 0x4f, 0xcf, 0x0c, 0x9a, 0x52, 0xeb, 0x10, 0x7e, 0xa0, 0x3a,
+ 0x31, 0x33, 0xb3, 0x5d, 0xb9, 0xeb, 0x88, 0x48, 0xdc, 0xbf, 0xcf, 0x46,
+ 0x59, 0x3b, 0xb9, 0x82, 0x70, 0xa2, 0xd5, 0x95, 0x50, 0x95, 0xb1, 0x72,
+ 0xfb, 0x0c, 0xc2, 0x72, 0x8a, 0x19, 0x62, 0x22, 0xe4, 0xa5, 0xab, 0x10,
+ 0x86, 0x28, 0x98, 0x84, 0x33, 0x3c, 0xa0, 0xb0, 0x7c, 0x41, 0x19, 0x66,
+ 0x2b, 0x2f, 0x81, 0x28, 0xa1, 0x45, 0x95, 0x72, 0x61, 0xe1, 0x64, 0x9a,
+ 0x4d, 0x0b, 0x04, 0xbc, 0xb4, 0x4b, 0xc7, 0x67, 0x06, 0x9d, 0x53, 0x4c,
+ 0x8e, 0x08, 0x7e, 0xd9, 0x87, 0x7c, 0x32, 0x0b, 0x99, 0x62, 0x64, 0xdb,
+ 0xb7, 0x3e, 0xa0, 0x27, 0xa5, 0x0a, 0x3a, 0x62, 0x13, 0x84, 0x52, 0xd3,
+ 0x60, 0x06, 0x2b, 0xe9, 0xf8, 0xa7, 0xa0, 0x37, 0x21, 0x0f, 0x73, 0x33,
+ 0x88, 0x77, 0x0f, 0x0a, 0x1c, 0x25, 0x23, 0x78, 0xfb, 0x15, 0x66, 0x6e,
+ 0x21, 0xad, 0x46, 0xa1, 0xc0, 0x4b, 0x21, 0x8e, 0xb1, 0xd8, 0x94, 0x35,
+ 0xf0, 0x91, 0xae, 0xa6, 0x00, 0x19, 0x79, 0x5c, 0x12, 0xab, 0xa6, 0x16,
+ 0x16, 0x05, 0x11, 0x14, 0xae, 0xfe, 0x46, 0x4d, 0xdd, 0x5b, 0xc2, 0xff,
+ 0x9e, 0x96, 0x91, 0x5a, 0x5d, 0x65, 0x7d, 0xb1, 0xae, 0x1a, 0x74, 0x90,
+ 0x25, 0x82, 0x69, 0x3c, 0xb3, 0x74, 0xc1, 0xb9, 0x7d, 0xb1, 0x8a, 0x5f,
+ 0x95, 0x11, 0xb1, 0x1b, 0xc8, 0x81, 0xa1, 0x4f, 0x5d, 0x66, 0x34, 0x80,
+ 0x1a, 0x72, 0xc2, 0xb3, 0x57, 0xff, 0xad, 0x1a, 0xad, 0x45, 0x3c, 0x58,
+ 0x82, 0xb5, 0x04, 0x14, 0x1a, 0x81, 0xe8, 0xc3, 0x09, 0xa7, 0x93, 0x48,
+ 0x71, 0x6b, 0x61, 0x17, 0x00, 0xa2, 0x07, 0x99, 0x63, 0xb6, 0xb4, 0x89,
+ 0xc3, 0x1a, 0x8c, 0xb8, 0x26, 0x00, 0x84, 0x3c, 0x08, 0x84, 0xc1, 0xc3,
+ 0x06, 0xce, 0x2f, 0xab, 0xf6, 0xa8, 0x09, 0x80, 0xa2, 0xc3, 0xe0, 0x26,
+ 0xe3, 0x3a, 0x16, 0x79, 0x6d, 0x08, 0x49, 0xfd, 0x3b, 0x29, 0x5b, 0x96,
+ 0xfc, 0x27, 0x37, 0x98, 0x4f, 0x43, 0x47, 0x1e, 0x16, 0xce, 0x5c, 0x08,
+ 0xca, 0xe4, 0xc1, 0xba, 0x8c, 0xc3, 0x68, 0x96, 0x20, 0xad, 0x11, 0x04,
+ 0x0d, 0x00, 0x68, 0xac, 0x31, 0xf8, 0x21, 0xc0, 0x55, 0x5d, 0x4a, 0xe3,
+ 0x41, 0x2c, 0xa5, 0xf1, 0xb8, 0x92, 0xd1, 0x28, 0x78, 0x59, 0xac, 0x0d,
+ 0x08, 0x6c, 0x56, 0x54, 0x33, 0xd3, 0xe1, 0x4e, 0xf0, 0x01, 0x65, 0xf9,
+ 0xef, 0x3d, 0x51, 0x3f, 0xc4, 0xce, 0x0a, 0xec, 0x81, 0x4c, 0xc3, 0x28,
+ 0x3d, 0x9d, 0xaa, 0x2f, 0x55, 0x1d, 0x2f, 0x6c, 0x68, 0xe3, 0xfb, 0xf9,
+ 0x4a, 0x8d, 0xed, 0x1b, 0x0f, 0xc4, 0x76, 0xd1, 0x8e, 0xe4, 0xeb, 0x87,
+ 0xbc, 0xf0, 0x4d, 0x8b, 0x5c, 0x47, 0xe6, 0xd2, 0x1c, 0x4b, 0x8d, 0x53,
+ 0xf5, 0x25, 0xa2, 0x53, 0xf6, 0x38, 0x4d, 0x98, 0xde, 0xa1, 0xbf, 0x45,
+ 0x26, 0xe1, 0xea, 0x9c, 0x6e, 0xa3, 0xbf, 0xee, 0x06, 0xd7, 0x9c, 0xb5,
+ 0x97, 0x2e, 0x65, 0xca, 0xd4, 0xfd, 0xd4, 0x62, 0x24, 0x0f, 0xd5, 0xeb,
+ 0x79, 0x74, 0xe1, 0x5c, 0xbe, 0xc7, 0x1a, 0x33, 0x50, 0x5f, 0x85, 0xec,
+ 0xfd, 0xcb, 0x8c, 0xe9, 0x5f, 0x62, 0xc0, 0x85, 0x50, 0xe7, 0xc8, 0x34,
+ 0xbd, 0x9e, 0x8d, 0xec, 0x2c, 0x99, 0xcf, 0xd4, 0x1e, 0xdc, 0xfb, 0x47,
+ 0x12, 0x86, 0x53, 0xcf, 0x79, 0x02, 0x43, 0xd2, 0x37, 0x30, 0xbb, 0xfe,
+ 0xb3, 0x85, 0x14, 0x21, 0x88, 0xc7, 0xb6, 0x80, 0x78, 0x50, 0xba, 0xfd,
+ 0xfc, 0x19, 0x85, 0x01, 0x4b, 0x86, 0xc2, 0xbf, 0x16, 0x4d, 0xda, 0xf7,
+ 0xc9, 0xda, 0x77, 0xfe, 0xf8, 0xdc, 0x4f, 0x4b, 0x2d, 0x1c, 0xce, 0x83,
+ 0xbf, 0x58, 0x38, 0x1d, 0xce, 0x2c, 0xe0, 0x62, 0xb9, 0xff, 0xa3, 0xfd,
+ 0xe2, 0x37, 0xca, 0xfc, 0x5a, 0x94, 0x17, 0x44, 0x3b, 0x84, 0x9b, 0xa5,
+ 0x8d, 0x12, 0xb7, 0xa7, 0x88, 0x1f, 0xcd, 0x3a, 0xd0, 0xaa, 0x39, 0x68,
+ 0xe0, 0x10, 0x00, 0x4f, 0x40, 0x24, 0xc1, 0xc2, 0x8e, 0x75, 0xf9, 0x64,
+ 0xe6, 0xf0, 0x58, 0x90, 0x93, 0x8b, 0xf5, 0xa5, 0x5a, 0x9d, 0xab, 0x71,
+ 0xea, 0x59, 0x5a, 0x17, 0x1e, 0x74, 0xa7, 0x0a, 0x18, 0x6f, 0x22, 0x90,
+ 0x08, 0xe6, 0x0c, 0xab, 0x51, 0x40, 0x89, 0xeb, 0x48, 0xd8, 0x61, 0x3c,
+ 0x06, 0x35, 0x11, 0x40, 0x6e, 0x2a, 0x2c, 0x69, 0xdd, 0x60, 0x24, 0x0b,
+ 0xbb, 0xfa, 0xb3, 0x0e, 0x03, 0xff, 0x1a, 0x2d, 0xc6, 0x72, 0x9f, 0x39,
+ 0xd9, 0x6c, 0x6d, 0xbe, 0xb4, 0x72, 0x88, 0x48, 0xc8, 0x3a, 0x7a, 0xb1,
+ 0x68, 0x8c, 0xe7, 0xd7, 0xe7, 0x52, 0xf3, 0x31, 0xb9, 0xf6, 0xc0, 0x4c,
+ 0x2b, 0x07, 0x0f, 0x24, 0xf2, 0xe0, 0x20, 0x51, 0xf4, 0x18, 0xbb, 0xd4,
+ 0x22, 0x2a, 0x85, 0x9d, 0xac, 0xa7, 0x24, 0xe8, 0x9a, 0x2b, 0xef, 0x73,
+ 0x0a, 0xf6, 0x89, 0x84, 0x1c, 0x7f, 0x24, 0x3c, 0x36, 0xfb, 0x70, 0x08,
+ 0xaf, 0xba, 0xa1, 0x6d, 0x99, 0x36, 0x92, 0x51, 0x01, 0xa9, 0x62, 0x80,
+ 0x18, 0x16, 0x59, 0x57, 0x21, 0x3b, 0x91, 0x1b, 0x1d, 0xf4, 0x24, 0x89,
+ 0x5c, 0x36, 0x4e, 0x8e, 0xba, 0x4b, 0x31, 0x91, 0xd0, 0x8e, 0x11, 0xe2,
+ 0x20, 0x1e, 0x86, 0xc6, 0x0f, 0x45, 0xc3, 0x7d, 0xc5, 0xc3, 0x8b, 0x36,
+ 0xa7, 0xc0, 0x19, 0x6c, 0xa0, 0xc4, 0x88, 0xef, 0xb1, 0xcd, 0x69, 0x6e,
+ 0x2f, 0x11, 0xa8, 0xaa, 0x08, 0xc1, 0x16, 0x00, 0x08, 0x3b, 0x8e, 0xf0,
+ 0xa5, 0xb4, 0x38, 0xd5, 0x1f, 0x03, 0x28, 0xa7, 0xc8, 0x71, 0x4f, 0x54,
+ 0x66, 0x63, 0xc0, 0xe7, 0x48, 0x68, 0xea, 0x79, 0xb7, 0x3e, 0x46, 0x90,
+ 0xa4, 0x16, 0x9c, 0x44, 0x89, 0xd5, 0xb7, 0x16, 0xb7, 0xa1, 0x61, 0x7d,
+ 0xb9, 0x13, 0xb8, 0xb4, 0x1e, 0xa9, 0x2f, 0x8e, 0x0f, 0x35, 0xf2, 0x34,
+ 0x3d, 0x6d, 0xeb, 0xde, 0x47, 0x1f, 0x57, 0xb3, 0x8d, 0x30, 0x3a, 0xa5,
+ 0x1f, 0xd5, 0x2d, 0x41, 0x49, 0x4c, 0x23, 0x24, 0x6d, 0x21, 0x50, 0x2b,
+ 0x01, 0x91, 0x92, 0x33, 0x8c, 0x5d, 0x09, 0x95, 0x3e, 0xbc, 0xed, 0x21,
+ 0xce, 0xa9, 0xe7, 0x96, 0xf0, 0xeb, 0x08, 0x7b, 0x68, 0xb8, 0x12, 0x3c,
+ 0x17, 0x42, 0xb2, 0x82, 0x74, 0x18, 0x29, 0x6d, 0x52, 0x82, 0x55, 0xc4,
+ 0x68, 0x38, 0x6d, 0xb4, 0x5b, 0x7c, 0x41, 0x94, 0x84, 0xed, 0x3d, 0x3c,
+ 0x98, 0xf6, 0xf8, 0x60, 0x62, 0x5c, 0x69, 0x65, 0x9c, 0x51, 0xf5, 0x73,
+ 0x9a, 0x91, 0x58, 0x54, 0xb4, 0x5f, 0x31, 0x3a, 0x70, 0x8b, 0x44, 0x75,
+ 0x05, 0x51, 0xa0, 0xf0, 0x55, 0xa7, 0x83, 0xf9, 0xd0, 0xaa, 0xc2, 0x69,
+ 0x85, 0xff, 0xfc, 0x69, 0xa9, 0x51, 0xcb, 0x71, 0x11, 0x89, 0xc4, 0x93,
+ 0xec, 0x02, 0x33, 0xfa, 0xf9, 0x9b, 0xee, 0xf5, 0x3f, 0xdf, 0xf6, 0x6a,
+ 0x0e, 0xd4, 0x64, 0x8e, 0x4b, 0x36, 0x4c, 0x9b, 0x8c, 0x3e, 0xd3, 0x63,
+ 0xbe, 0x76, 0x79, 0x4e, 0x59, 0xce, 0xf4, 0x99, 0x5c, 0x98, 0xdf, 0xd7,
+ 0x1c, 0xe2, 0xa6, 0xe1, 0xb5, 0x5f, 0xd7, 0x7c, 0xe3, 0x7b, 0xf5, 0xc8,
+ 0x70, 0x72, 0x2a, 0x1f, 0x90, 0x76, 0xd8, 0x2e, 0x95, 0xdb, 0xdc, 0x72,
+ 0x95, 0x3d, 0x34, 0x4e, 0xf9, 0x83, 0x4b, 0xc3, 0xfb, 0xad, 0x4e, 0x80,
+ 0x30, 0x9d, 0x5a, 0x93, 0x30, 0x93, 0x6f, 0x3f, 0xf4, 0xe9, 0x8e, 0x0f,
+ 0x7d, 0x84, 0x3a, 0xc4, 0x43, 0x73, 0xf3, 0xf4, 0xdb, 0xc7, 0x5b, 0xbe,
+ 0x6e, 0x06, 0x74, 0x85, 0xbc, 0xaf, 0xa1, 0x53, 0x1d, 0x36, 0x4f, 0x3f,
+ 0xaf, 0x38, 0xb5, 0x75, 0x4c, 0x36, 0xc5, 0x63, 0x4f, 0xa0, 0xaa, 0x13,
+ 0x43, 0x64, 0xcc, 0x41, 0x1a, 0x19, 0xac, 0xba, 0x9d, 0x85, 0xa8, 0x5c,
+ 0xb2, 0x44, 0x9a, 0xe5, 0x1c, 0x21, 0xc4, 0xce, 0xc9, 0xdb, 0x5e, 0xeb,
+ 0x26, 0x9b, 0x3e, 0x66, 0xd9, 0x18, 0xbb, 0x52, 0xea, 0x8e, 0xfc, 0xef,
+ 0x9d, 0x19, 0x4d, 0x42, 0x3c, 0x23, 0x9a, 0x92, 0xa2, 0x93, 0xc2, 0xe7,
+ 0x86, 0x77, 0x88, 0x04, 0x84, 0xe7, 0xb4, 0x88, 0xce, 0x74, 0x0a, 0x67,
+ 0x03, 0x29, 0x1b, 0xea, 0x4b, 0x6c, 0x06, 0x29, 0xad, 0x4e, 0xd4, 0x17,
+ 0xf9, 0x1c, 0x95, 0xf8, 0xc4, 0x97, 0x4d, 0x37, 0xeb, 0x6f, 0x0b, 0x44,
+ 0xc7, 0xb0, 0x7f, 0x71, 0xc9, 0xb3, 0x4a, 0xeb, 0x6f, 0x7b, 0xf9, 0x98,
+ 0x72, 0xb9, 0xf0, 0x95, 0x9a, 0xe2, 0xcd, 0x07, 0xfc, 0xf9, 0x92, 0x85,
+ 0x07, 0x26, 0xff, 0xcd, 0x65, 0xe4, 0xd0, 0x2f, 0x11, 0x34, 0x75, 0x84,
+ 0x39, 0x8d, 0x47, 0x3b, 0xd5, 0xa0, 0x29, 0x32, 0x9e, 0xda, 0x10, 0x44,
+ 0x8a, 0xf1, 0x61, 0x5b, 0x9b, 0x97, 0xc5, 0xe7, 0x09, 0x36, 0x22, 0x68,
+ 0xa5, 0xc9, 0xd2, 0x6a, 0x32, 0xbf, 0x6f, 0xcc, 0xf1, 0xfe, 0x4e, 0xec,
+ 0x8d, 0x88, 0x84, 0x63, 0x02, 0x0f, 0x22, 0x19, 0xb9, 0x2a, 0x83, 0xf9,
+ 0x06, 0xb3, 0x98, 0x0c, 0xc7, 0xc7, 0xf8, 0x28, 0x85, 0x72, 0x64, 0x0f,
+ 0xd1, 0x43, 0x3c, 0xc0, 0x2c, 0x77, 0xa2, 0xcc, 0x24, 0x7b, 0x18, 0x52,
+ 0xfa, 0x20, 0x7c, 0x4a, 0xfb, 0x2c, 0x11, 0xf9, 0xa9, 0x84, 0xb1, 0x34,
+ 0xbd, 0x85, 0xc7, 0x3f, 0x89, 0x8a, 0x2e, 0x31, 0xb4, 0x64, 0xc3, 0x6f,
+ 0x14, 0x71, 0x3d, 0xb9, 0x65, 0xe8, 0x73, 0x23, 0xd2, 0xcf, 0xc0, 0x06,
+ 0x37, 0x2e, 0x38, 0x65, 0x11, 0xb0, 0x04, 0xd6, 0x97, 0xde, 0x7d, 0x7e,
+ 0x3a, 0xd7, 0xdc, 0xbd, 0xa7, 0x23, 0x52, 0x36, 0x9c, 0x61, 0x91, 0x41,
+ 0xc1, 0xdc, 0xec, 0x52, 0x30, 0x5c, 0x7a, 0x8b, 0x78, 0x19, 0x14, 0x0e,
+ 0x27, 0xf0, 0xf2, 0x91, 0xf1, 0x53, 0xf5, 0xa6, 0x1b, 0xc3, 0xe9, 0xaa,
+ 0x53, 0xc6, 0x75, 0x4f, 0x1a, 0xa7, 0x52, 0x00, 0x25, 0x12, 0xba, 0xff,
+ 0x25, 0xf6, 0xc3, 0x21, 0xea, 0xde, 0x87, 0xfb, 0xcb, 0xc6, 0x92, 0x68,
+ 0x1f, 0xa3, 0x8a, 0x74, 0x9e, 0xb2, 0xe4, 0xbf, 0x6e, 0x09, 0x54, 0x63,
+ 0x27, 0xac, 0xae, 0x88, 0xc4, 0xef, 0x21, 0x2a, 0xd8, 0x29, 0xb2, 0xf8,
+ 0x0e, 0x1b, 0x4d, 0x81, 0xaa, 0x31, 0x6d, 0xb2, 0x0f, 0xb8, 0x6c, 0xd6,
+ 0x85, 0xaa, 0x34, 0x31, 0xa8, 0x97, 0x53, 0x17, 0x24, 0x0a, 0x9e, 0xf3,
+ 0x1a, 0x28, 0xb5, 0xf5, 0xce, 0xec, 0x9f, 0x0c, 0x41, 0x98, 0x28, 0x80,
+ 0x1a, 0x36, 0x8e, 0x38, 0x72, 0xd7, 0xe3, 0xf2, 0x9a, 0xbd, 0x97, 0x82,
+ 0x5b, 0x36, 0x4f, 0x37, 0xda, 0x28, 0x1f, 0x93, 0x7d, 0x1f, 0x93, 0x9c,
+ 0xd4, 0x1c, 0xe4, 0x63, 0x2f, 0x7b, 0xc9, 0xf6, 0x99, 0x08, 0x5c, 0xec,
+ 0xaf, 0x95, 0x71, 0x5a, 0xd3, 0x61, 0xb0, 0x9f, 0x09, 0xfb, 0x1f, 0x9c,
+ 0xeb, 0x7d, 0xce, 0x02, 0x70, 0x32, 0x32, 0x89, 0xbc, 0x4c, 0x0b, 0x1f,
+ 0xfa, 0x98, 0xf9, 0x0d, 0x07, 0x95, 0x96, 0x35, 0x4e, 0x49, 0x6c, 0xd4,
+ 0x30, 0xe2, 0x28, 0x3a, 0xb2, 0xbc, 0xc8, 0x7c, 0x62, 0xae, 0x88, 0xb6,
+ 0x30, 0x9a, 0x1c, 0xcd, 0xa7, 0x84, 0xfe, 0xa4, 0x20, 0xa9, 0xe9, 0xbe,
+ 0x7a, 0x56, 0x02, 0x20, 0xe7, 0xa7, 0x1a, 0xfe, 0x39, 0x82, 0x6d, 0x4f,
+ 0x83, 0xaa, 0x0e, 0x2f, 0x38, 0x5e, 0x4e, 0xad, 0xfd, 0xf4, 0x01, 0xb2,
+ 0x10, 0x5c, 0xd7, 0x36, 0xdf, 0xf6, 0x92, 0xd7, 0x19, 0xa6, 0x8e, 0x6b,
+ 0xef, 0xaf, 0xa5, 0x69, 0xae, 0xb5, 0x52, 0xdd, 0x7c, 0xcb, 0x30, 0x3a,
+ 0x0e, 0xf6, 0xa6, 0x32, 0x43, 0x04, 0xa9, 0x0d, 0x31, 0x00, 0xe2, 0xd7,
+ 0x88, 0xf0, 0x5e, 0xa0, 0x81, 0x54, 0x9c, 0x13, 0x25, 0x44, 0xbd, 0xe7,
+ 0xb7, 0x9c, 0xe4, 0x45, 0x29, 0xf4, 0x64, 0x71, 0xf6, 0x60, 0xd4, 0xa8,
+ 0xd2, 0x98, 0x7f, 0x15, 0x02, 0x0a, 0xaa, 0xcd, 0x2f, 0x2d, 0xed, 0x1a,
+ 0x56, 0x76, 0x53, 0x7c, 0xc8, 0x36, 0xa8, 0x2c, 0x8d, 0xd2, 0xe6, 0x10,
+ 0x7a, 0x35, 0x18, 0x2f, 0xab, 0xee, 0x11, 0x8e, 0xfe, 0x0e, 0x32, 0xd0,
+ 0x1e, 0x82, 0xa9, 0x54, 0x79, 0xcb, 0x5e, 0x6c, 0x63, 0x81, 0x35, 0xf3,
+ 0x68, 0xba, 0x2a, 0xef, 0x94, 0xd2, 0x75, 0xde, 0x8b, 0x23, 0x44, 0x60,
+ 0x44, 0x07, 0x4b, 0x05, 0x35, 0x62, 0x84, 0x90, 0x42, 0x8f, 0xea, 0xef,
+ 0xc9, 0x66, 0xa2, 0x5f, 0x1d, 0xd1, 0x5f, 0x32, 0x0c, 0xa4, 0xdd, 0x6d,
+ 0xc0, 0xaa, 0xc4, 0x8a, 0xb1, 0xec, 0x58, 0x6b, 0x92, 0xed, 0xc0, 0x00,
+ 0x42, 0xd1, 0x68, 0x18, 0x3a, 0x43, 0x1c, 0x31, 0x76, 0x12, 0xdb, 0x1b,
+ 0x29, 0xc8, 0x82, 0x55, 0xe7, 0x18, 0xdd, 0x18, 0x75, 0xe6, 0x9a, 0xc0,
+ 0x7b, 0x25, 0x74, 0xfb, 0xe1, 0x81, 0x8a, 0x90, 0x29, 0x66, 0x8c, 0x32,
+ 0x04, 0xbd, 0x38, 0x1f, 0xcf, 0xe3, 0xa9, 0x94, 0x0f, 0x58, 0x70, 0x41,
+ 0x2c, 0x5f, 0x7c, 0xd8, 0x90, 0x59, 0xe7, 0xb9, 0x0e, 0xa7, 0xdd, 0xe9,
+ 0x2b, 0xde, 0xd9, 0x43, 0xf3, 0xfa, 0xa5, 0x84, 0xf2, 0x9e, 0x3d, 0x35,
+ 0xc2, 0x75, 0xbc, 0xae, 0x0e, 0xa1, 0xc9, 0xde, 0xd7, 0x66, 0xc8, 0x97,
+ 0x14, 0xea, 0x04, 0xe3, 0x09, 0x3b, 0xb9, 0x36, 0xb3, 0xc3, 0x3a, 0xb5,
+ 0x1f, 0xfd, 0xea, 0x31, 0x35, 0xf3, 0x31, 0x4f, 0x57, 0xf9, 0xd2, 0xd3,
+ 0xf2, 0xb6, 0xb7, 0xba, 0x72, 0x46, 0x2f, 0xd7, 0x4c, 0xaf, 0xf4, 0xa7,
+ 0xa7, 0xb2, 0xa1, 0x91, 0x7d, 0x04, 0x54, 0xa1, 0x68, 0x99, 0xf2, 0x8b,
+ 0x7c, 0x3c, 0xb3, 0x98, 0x12, 0x3c, 0x67, 0x7a, 0x3d, 0x01, 0x4c, 0xa6,
+ 0x93, 0x38, 0xb5, 0xf7, 0xb5, 0x76, 0x86, 0x01, 0x83, 0xea, 0x7d, 0x16,
+ 0x3b, 0x0f, 0x9b, 0x31, 0xaa, 0x4d, 0x24, 0xcd, 0xbe, 0x4a, 0xf4, 0x4a,
+ 0xd6, 0xfa, 0x92, 0x66, 0xa1, 0x70, 0x69, 0x5c, 0xb9, 0x9e, 0x65, 0xa7,
+ 0xd3, 0xa5, 0x25, 0xe3, 0xbc, 0xb2, 0x85, 0x94, 0x01, 0x4f, 0xb2, 0x49,
+ 0x9e, 0x51, 0xc1, 0x14, 0x1b, 0x77, 0x13, 0x63, 0x28, 0x02, 0xce, 0x6b,
+ 0x0e, 0xde, 0x32, 0x09, 0x12, 0xbb, 0xa0, 0xd8, 0x82, 0xc8, 0xc8, 0x8c,
+ 0x0a, 0xeb, 0x6f, 0x81, 0x39, 0x07, 0x46, 0x93, 0x56, 0xa1, 0x84, 0x00,
+ 0x3d, 0x39, 0xde, 0x34, 0xa2, 0x81, 0x2a, 0xfa, 0xe5, 0x0e, 0xf8, 0xe7,
+ 0x30, 0xcd, 0x76, 0xf2, 0xa3, 0xd4, 0xba, 0x06, 0x57, 0xb5, 0x2d, 0x0f,
+ 0x13, 0x8a, 0x6f, 0xb1, 0xb5, 0x2f, 0xf0, 0x40, 0xfc, 0x92, 0xd9, 0x54,
+ 0x95, 0xd5, 0x25, 0x30, 0x74, 0x65, 0xf5, 0x9b, 0xc3, 0x6c, 0xa5, 0x0c,
+ 0xba, 0x88, 0x9b, 0x43, 0xd4, 0xbe, 0x44, 0x0e, 0x35, 0x8b, 0xe3, 0xf2,
+ 0x9f, 0x23, 0xf1, 0x79, 0xe6, 0xb9, 0x96, 0xcd, 0xe4, 0x8d, 0x08, 0xad,
+ 0x01, 0x82, 0x0b, 0x0a, 0xc2, 0x27, 0x1c, 0xd5, 0x82, 0x27, 0x85, 0x4b,
+ 0xf0, 0x8b, 0xcb, 0x97, 0x55, 0xd3, 0xa3, 0x19, 0x4b, 0x4b, 0x78, 0xa1,
+ 0x58, 0x1d, 0x85, 0x01, 0xfb, 0xe7, 0xe8, 0xa7, 0x1b, 0x1b, 0x15, 0xbb,
+ 0x65, 0x33, 0x8a, 0xe2, 0xba, 0x51, 0x2b, 0x8a, 0xc3, 0xda, 0x90, 0x4f,
+ 0x11, 0x2f, 0xed, 0x42, 0x5e, 0x33, 0xdf, 0xfd, 0xe6, 0x3f, 0x1e, 0x31,
+ 0x82, 0x06, 0x0d, 0x3a, 0x67, 0x5f, 0xf2, 0x2c, 0x3b, 0xa3, 0xdb, 0x73,
+ 0x6a, 0x45, 0x29, 0x9a, 0x3a, 0xb8, 0xf0, 0x69, 0xc6, 0x49, 0x0f, 0xf0,
+ 0xfc, 0xbf, 0xd0, 0x52, 0x36, 0x0f, 0x03, 0x3d, 0xc6, 0xb1, 0xe7, 0xed,
+ 0x1a, 0x54, 0xab, 0x60, 0xc8, 0x00, 0x1b, 0x08, 0xb0, 0xe7, 0x98, 0x40,
+ 0x5d, 0x51, 0x8e, 0xc6, 0x8c, 0x3f, 0x82, 0xb4, 0x3d, 0x6a, 0x7e, 0x8a,
+ 0x98, 0xaa, 0x5d, 0x85, 0x18, 0xb0, 0x05, 0x4c, 0x72, 0x0a, 0x62, 0x3c,
+ 0xe9, 0xf2, 0x24, 0x96, 0x89, 0x32, 0x1f, 0x77, 0x9f, 0x61, 0xc2, 0x27,
+ 0x08, 0x7b, 0xf4, 0x08, 0x4b, 0x04, 0x73, 0x9e, 0xa9, 0x0d, 0x14, 0x0e,
+ 0xc2, 0x6a, 0x38, 0xab, 0xa7, 0x56, 0xf7, 0x7a, 0x46, 0x30, 0xa4, 0x98,
+ 0xe9, 0x13, 0x89, 0x55, 0x4c, 0xae, 0xfe, 0x79, 0x75, 0xdd, 0x7b, 0x95,
+ 0x34, 0xee, 0x21, 0x96, 0xb1, 0x8d, 0xf1, 0xb4, 0xcf, 0x8e, 0x99, 0xbc,
+ 0x8e, 0xd6, 0x52, 0x7a, 0x2a, 0x21, 0x70, 0xb3, 0x44, 0x6c, 0x38, 0x05,
+ 0x93, 0xa8, 0x66, 0xda, 0x0b, 0xcf, 0xb3, 0x1d, 0xa8, 0xc4, 0x3c, 0x43,
+ 0x08, 0x20, 0x63, 0xc8, 0x7c, 0xb9, 0xd3, 0xfb, 0x10, 0x01, 0x4c, 0x0e,
+ 0x05, 0xc0, 0xc4, 0x1c, 0x1e, 0x13, 0x84, 0xe5, 0x5a, 0x4f, 0x93, 0x9f,
+ 0xde, 0x5d, 0xba, 0x03, 0xcb, 0x55, 0x53, 0xa0, 0x63, 0x59, 0x1c, 0x9b,
+ 0xb1, 0x88, 0x1f, 0x0e, 0x39, 0x0a, 0xc5, 0x7d, 0x24, 0xeb, 0x1b, 0x41,
+ 0xae, 0x36, 0x6f, 0xa3, 0x9a, 0x97, 0x69, 0x69, 0x0d, 0x5d, 0x4c, 0x0c,
+ 0x4b, 0x2e, 0xac, 0x05, 0xbb, 0xff, 0xae, 0x81, 0x10, 0xff, 0x8d, 0xe4,
+ 0x7b, 0x44, 0xc9, 0xaf, 0xac, 0xf5, 0xaf, 0xab, 0x2b, 0x89, 0xa1, 0x81,
+ 0xde, 0xcb, 0xde, 0xab, 0xde, 0xeb, 0x6b, 0x77, 0x7d, 0xfd, 0xab, 0xb7,
+ 0xd8, 0xf8, 0x86, 0x79, 0xec, 0x37, 0x2c, 0x43, 0xfc, 0xac, 0x08, 0xd7,
+ 0x4b, 0xf6, 0xdf, 0x7a, 0x07, 0x33, 0x86, 0x70, 0xf9, 0x3b, 0xd5, 0x21,
+ 0x7c, 0x36, 0x63, 0xa7, 0x10, 0xd7, 0xf9, 0x44, 0xe0, 0x22, 0x46, 0xdc,
+ 0x27, 0x45, 0x46, 0x45, 0x63, 0x85, 0x9a, 0x0a, 0xc1, 0xb7, 0xac, 0x85,
+ 0x0f, 0xae, 0x7d, 0x6f, 0x7a, 0x54, 0xb4, 0x8d, 0x7c, 0x92, 0xfe, 0xfe,
+ 0x3b, 0x97, 0x90, 0xfb, 0x9e, 0xb0, 0x5a, 0x50, 0x85, 0xba, 0xe7, 0x52,
+ 0x4b, 0x99, 0x61, 0x2d, 0xfd, 0xa9, 0x07, 0xd2, 0x86, 0x52, 0x64, 0xad,
+ 0x8f, 0xb6, 0x0c, 0x4f, 0x50, 0xb1, 0x61, 0xa1, 0xd3, 0x1a, 0x2b, 0xb8,
+ 0x43, 0x3d, 0x47, 0x10, 0x87, 0x3e, 0x60, 0x10, 0x6a, 0x51, 0x5a, 0x43,
+ 0x58, 0xd8, 0xf7, 0xb9, 0x89, 0x54, 0x93, 0x91, 0x0a, 0x6c, 0xbf, 0xc2,
+ 0x5c, 0xb7, 0x21, 0xa0, 0x8b, 0x5b, 0xd7, 0x5f, 0x4d, 0x4c, 0xfb, 0xab,
+ 0x1a, 0x15, 0x33, 0x95, 0x91, 0x56, 0x6a, 0x8d, 0xb9, 0xb8, 0x6d, 0xa8,
+ 0x05, 0x43, 0x29, 0x87, 0xc0, 0x6c, 0xc1, 0xd6, 0x59, 0xdd, 0xd5, 0xb0,
+ 0x77, 0xc0, 0xee, 0x46, 0xd1, 0xf0, 0x36, 0x7d, 0xdf, 0xaf, 0x32, 0x0b,
+ 0xef, 0x73, 0x09, 0x84, 0x27, 0x42, 0xce, 0x0c, 0xd8, 0xee, 0x00, 0x34,
+ 0x4c, 0xa3, 0xe9, 0x6c, 0x28, 0xf6, 0xbf, 0x0a, 0x8e, 0x0f, 0x9b, 0xcb,
+ 0x4a, 0x37, 0x7a, 0xcb, 0x02, 0xd5, 0x5d, 0x4d, 0xc1, 0x1c, 0x51, 0xf8,
+ 0x07, 0xa9, 0x44, 0xa7, 0x9b, 0x87, 0xfc, 0x00, 0x63, 0xfd, 0x20, 0x07,
+ 0xab, 0x42, 0x3e, 0x17, 0xa1, 0xa7, 0x43, 0xe4, 0x02, 0x70, 0x71, 0x2a,
+ 0x33, 0x06, 0x7d, 0xc5, 0xca, 0x61, 0xde, 0x64, 0xea, 0x02, 0x79, 0x6e,
+ 0x49, 0x59, 0x91, 0x5e, 0x58, 0xf5, 0x56, 0xec, 0xa7, 0x6e, 0xbe, 0xbe,
+ 0x64, 0x01, 0x19, 0xf4, 0x53, 0x1f, 0x88, 0x9f, 0x1a, 0x35, 0x7e, 0xb2,
+ 0xee, 0x07, 0x07, 0x6d, 0x35, 0xe2, 0xd3, 0x0c, 0x6c, 0xf4, 0xde, 0x0b,
+ 0xa8, 0xb0, 0xd2, 0x1f, 0x53, 0x98, 0x17, 0xdf, 0xd3, 0x91, 0x14, 0x04,
+ 0x67, 0xda, 0xad, 0x8d, 0xb1, 0xc0, 0xac, 0x51, 0x8e, 0x3b, 0xa5, 0x00,
+ 0xe5, 0xaa, 0x11, 0x0b, 0xf7, 0x3d, 0xa5, 0x12, 0xb1, 0x8d, 0x26, 0x22,
+ 0xf0, 0xa3, 0x4a, 0x55, 0x51, 0x61, 0xd7, 0xed, 0x9d, 0x52, 0xf6, 0xdc,
+ 0x7c, 0x6e, 0xb2, 0x05, 0x6d, 0x8a, 0xca, 0x20, 0x25, 0x3b, 0xd8, 0x92,
+ 0xe2, 0x37, 0x19, 0x61, 0x32, 0x82, 0x72, 0x84, 0x61, 0x05, 0x29, 0x32,
+ 0x45, 0x85, 0x7a, 0xee, 0xb2, 0x25, 0xff, 0x35, 0xcb, 0x99, 0x35, 0x41,
+ 0x69, 0x4d, 0xec, 0xda, 0x68, 0xc3, 0x8f, 0x50, 0x89, 0x80, 0x24, 0xc0,
+ 0xa4, 0x02, 0x5c, 0x7f, 0xad, 0x43, 0x7f, 0xf9, 0x0d, 0x5e, 0x5b, 0xe0,
+ 0xe2, 0x78, 0x9e, 0xa8, 0x2d, 0x91, 0x8b, 0x82, 0xd7, 0x7a, 0x1e, 0xc8,
+ 0xae, 0x35, 0x4e, 0xfb, 0x35, 0xb7, 0xf5, 0xe6, 0x05, 0x16, 0x62, 0x64,
+ 0xe1, 0xfa, 0xda, 0x53, 0x56, 0x62, 0xf6, 0xf4, 0xb8, 0x58, 0xdb, 0x20,
+ 0x60, 0x57, 0x40, 0x66, 0x00, 0x98, 0x5b, 0xff, 0x27, 0x08, 0x14, 0xdc,
+ 0x88, 0xb8, 0x0b, 0xfb, 0xf7, 0x59, 0xff, 0x3d, 0x32, 0xbe, 0xa5, 0xdc,
+ 0x80, 0xa7, 0x88, 0x17, 0xb4, 0x88, 0x39, 0xe8, 0xb4, 0x06, 0xb3, 0xfc,
+ 0xe6, 0xd3, 0xe9, 0x13, 0x48, 0x7b, 0xfc, 0xd9, 0x86, 0xf9, 0x97, 0x0e,
+ 0x23, 0x81, 0xb7, 0xfe, 0xb8, 0xf8, 0x92, 0xe2, 0x46, 0xb0, 0x37, 0xa3,
+ 0x01, 0x5d, 0xb2, 0x03, 0x5d, 0x50, 0x57, 0x44, 0x88, 0x54, 0x9c, 0xc4,
+ 0x0a, 0x26, 0xc8, 0xa3, 0x0c, 0xb3, 0x75, 0x3c, 0x5f, 0x45, 0xa4, 0x68,
+ 0x1e, 0x6f, 0xd9, 0xa2, 0xc3, 0x61, 0xa9, 0xc9, 0x32, 0x87, 0xe2, 0x43,
+ 0x7a, 0x12, 0xc7, 0x45, 0x64, 0x0e, 0x93, 0x60, 0x0a, 0x09, 0xd6, 0x05,
+ 0x44, 0x1d, 0xe4, 0xa3, 0xf3, 0x98, 0x43, 0xa9, 0xb1, 0xb0, 0xa7, 0x8b,
+ 0xb9, 0x3e, 0x49, 0xda, 0xe6, 0xa8, 0x2d, 0x78, 0xed, 0xf0, 0xf0, 0x2d,
+ 0xa5, 0x84, 0xa0, 0x9d, 0x31, 0x92, 0xc5, 0xfd, 0x09, 0xc3, 0x4b, 0x27,
+ 0x89, 0x7e, 0xa6, 0xe9, 0xe3, 0xf2, 0x34, 0x31, 0x93, 0x43, 0x9b, 0x55,
+ 0x8b, 0xb0, 0x49, 0xe7, 0xbd, 0xc4, 0xaf, 0x4d, 0x29, 0xfe, 0x0a, 0x07,
+ 0xbe, 0x53, 0x60, 0x14, 0x8e, 0xdc, 0xd0, 0x46, 0x6c, 0x81, 0xfc, 0xe3,
+ 0xb2, 0x67, 0xee, 0xb1, 0xcc, 0x19, 0x25, 0x27, 0xd8, 0x21, 0x43, 0x75,
+ 0xcf, 0x99, 0x52, 0x10, 0x08, 0x61, 0xce, 0x51, 0xe6, 0x3c, 0x8a, 0x68,
+ 0x2e, 0x33, 0x7f, 0xab, 0x2b, 0x20, 0x03, 0x99, 0x96, 0xb8, 0xd8, 0x44,
+ 0x3b, 0xf1, 0x5e, 0x31, 0xaf, 0xfd, 0x84, 0x72, 0x66, 0xb8, 0x12, 0xe7,
+ 0xb8, 0x80, 0xec, 0x87, 0x67, 0x6f, 0x42, 0x8f, 0x7e, 0x4a, 0x48, 0x0b,
+ 0x98, 0x29, 0xa4, 0x10, 0xd0, 0x88, 0x9e, 0x7c, 0x25, 0x08, 0x64, 0x6c,
+ 0xce, 0x96, 0x44, 0xf5, 0xc0, 0xbd, 0xf3, 0xbb, 0xc6, 0xb8, 0x68, 0x08,
+ 0xe8, 0xef, 0x7d, 0x31, 0x1c, 0x90, 0xc4, 0x43, 0x3e, 0x06, 0x23, 0x85,
+ 0x61, 0xae, 0x41, 0x3a, 0xbc, 0x2b, 0x26, 0x46, 0x8f, 0x1a, 0x71, 0xc1,
+ 0x60, 0x90, 0x52, 0x62, 0x73, 0xa4, 0x6a, 0x49, 0x42, 0x0b, 0x83, 0xac,
+ 0xcc, 0x27, 0xa9, 0x60, 0x0f, 0x41, 0x31, 0x25, 0x23, 0x21, 0x18, 0xc5,
+ 0xae, 0x98, 0xbc, 0x47, 0x1c, 0x48, 0xd3, 0xfc, 0x53, 0x88, 0xed, 0x11,
+ 0xf1, 0xc4, 0x39, 0xd6, 0x76, 0xfa, 0x1c, 0x86, 0x4f, 0x0a, 0xc4, 0xc2,
+ 0xf9, 0x25, 0x63, 0x21, 0x7a, 0x91, 0x17, 0x4c, 0xf4, 0x2d, 0x02, 0x51,
+ 0xcd, 0x5f, 0x5d, 0x09, 0xff, 0x0c, 0x8c, 0x8a, 0xa2, 0x8b, 0xcc, 0xc2,
+ 0x3a, 0xd6, 0x0a, 0x3f, 0x1f, 0x15, 0xd5, 0xaa, 0x0c, 0x44, 0x52, 0x9e,
+ 0x11, 0x82, 0xe8, 0x83, 0x92, 0x15, 0x09, 0x41, 0xcd, 0xec, 0xb6, 0xdc,
+ 0xc1, 0xcd, 0x25, 0x1a, 0x6e, 0xa2, 0xcc, 0x34, 0x3e, 0x3f, 0x39, 0x3c,
+ 0x58, 0xf6, 0x0a, 0x3d, 0x92, 0x8c, 0x80, 0x1f, 0xa0, 0x3c, 0xa0, 0xc5,
+ 0x90, 0x81, 0xda, 0x58, 0x4d, 0xf3, 0xda, 0x84, 0x70, 0x49, 0xbf, 0xe2,
+ 0xad, 0x8c, 0xcb, 0x15, 0x17, 0x50, 0x09, 0x65, 0x5f, 0x8f, 0xd2, 0xbb,
+ 0x1c, 0x44, 0xba, 0xf2, 0x64, 0x03, 0x7d, 0x0c, 0xb1, 0x28, 0x4d, 0x44,
+ 0x65, 0x8c, 0xbb, 0x85, 0x90, 0xbb, 0xfa, 0x2c, 0x22, 0x3a, 0x9a, 0xfa,
+ 0x6e, 0x85, 0xd3, 0xcd, 0x63, 0x33, 0x62, 0xd1, 0x7f, 0x22, 0xb3, 0x87,
+ 0x30, 0xe9, 0x7c, 0x3a, 0x84, 0x92, 0x30, 0x7c, 0x2a, 0x7d, 0xd5, 0xf9,
+ 0xf9, 0x35, 0x02, 0x53, 0xe4, 0xbf, 0x67, 0x10, 0xfe, 0x49, 0x1f, 0x45,
+ 0x24, 0xe3, 0x7b, 0x4f, 0x51, 0x8c, 0xce, 0x58, 0xcd, 0x72, 0x22, 0x7a,
+ 0x80, 0x63, 0x18, 0xda, 0x24, 0x88, 0xd6, 0x18, 0x0f, 0x01, 0xe1, 0xad,
+ 0x91, 0x9d, 0x71, 0xd1, 0x07, 0xc3, 0x5c, 0xcd, 0x7a, 0x63, 0xd9, 0x16,
+ 0xfd, 0xd6, 0x39, 0x73, 0xae, 0xbc, 0xc6, 0x75, 0xe4, 0x04, 0xf7, 0xd8,
+ 0xf2, 0xd3, 0xf2, 0x40, 0xa5, 0x0c, 0x35, 0xd1, 0x94, 0x67, 0x9f, 0x06,
+ 0x99, 0x52, 0x45, 0x2f, 0x0b, 0x6c, 0xeb, 0xf8, 0x09, 0xa3, 0x07, 0x52,
+ 0x5b, 0x9f, 0x18, 0x96, 0x07, 0x3b, 0x10, 0x96, 0x42, 0xb6, 0xa4, 0xaf,
+ 0xbc, 0x91, 0x9e, 0xed, 0x26, 0x50, 0x30, 0x64, 0x92, 0x16, 0x6c, 0xdf,
+ 0x20, 0x5d, 0xda, 0xd7, 0xef, 0xbf, 0xe6, 0x4f, 0x6f, 0x6e, 0x4d, 0xe3,
+ 0x27, 0x0d, 0xd5, 0xd6, 0x77, 0x28, 0x55, 0x7d, 0xbf, 0x00, 0x30, 0x09,
+ 0x67, 0xa0, 0x85, 0x33, 0x10, 0xad, 0x9d, 0x96, 0xfc, 0x68, 0xda, 0x1b,
+ 0x06, 0xae, 0x71, 0x23, 0x59, 0x61, 0x15, 0x4f, 0x23, 0x05, 0x7b, 0x39,
+ 0xcf, 0x02, 0x8a, 0x5e, 0xdc, 0x9a, 0xc9, 0x76, 0xd5, 0xcb, 0xa6, 0x92,
+ 0xd5, 0xc8, 0xf6, 0x1c, 0x35, 0xeb, 0xce, 0x88, 0xb3, 0x4e, 0x65, 0x91,
+ 0x9a, 0x58, 0xe9, 0x8d, 0xe2, 0x32, 0x6e, 0x8c, 0x28, 0xfc, 0x1e, 0x0b,
+ 0xc1, 0x95, 0x4b, 0x17, 0x83, 0xfd, 0x84, 0x9a, 0x66, 0x68, 0xb2, 0xdc,
+ 0x15, 0x8b, 0x25, 0xd6, 0xc8, 0x1e, 0x17, 0x53, 0xcf, 0x29, 0x62, 0x7d,
+ 0x22, 0x71, 0x39, 0x38, 0x1a, 0x7f, 0x64, 0xc5, 0xad, 0x0d, 0xdc, 0xd6,
+ 0x68, 0xcf, 0xc4, 0xc0, 0x29, 0x15, 0x37, 0x0f, 0x1c, 0xe7, 0xce, 0x68,
+ 0x0a, 0x04, 0x12, 0x9a, 0x0e, 0x52, 0xca, 0xb9, 0x6c, 0x27, 0x57, 0x20,
+ 0x0f, 0x69, 0xea, 0x84, 0x70, 0x80, 0xa7, 0x07, 0x29, 0x51, 0x4f, 0x09,
+ 0xa8, 0x58, 0xcb, 0x67, 0xc0, 0x71, 0x4e, 0x46, 0x59, 0x29, 0x2d, 0xce,
+ 0x4d, 0x26, 0x87, 0x8f, 0xf9, 0xd9, 0xcb, 0xb6, 0x55, 0x36, 0xa8, 0xe4,
+ 0xcd, 0x98, 0xec, 0xa5, 0xc4, 0xbe, 0xcc, 0xbe, 0x1c, 0x58, 0xc8, 0x1d,
+ 0x50, 0x7c, 0x71, 0x20, 0xb0, 0x65, 0x38, 0xab, 0xb7, 0x82, 0x4e, 0xed,
+ 0xb2, 0x90, 0x1f, 0x04, 0x79, 0xc7, 0xc5, 0x81, 0x54, 0x5e, 0x8f, 0x26,
+ 0x18, 0xa8, 0x53, 0xd8, 0xa4, 0x02, 0x97, 0x02, 0x0d, 0x06, 0xb9, 0x0d,
+ 0xd9, 0x74, 0x42, 0x86, 0x95, 0xb2, 0x98, 0x4d, 0xfa, 0x19, 0x56, 0x44,
+ 0xf4, 0x8c, 0x9f, 0x9f, 0x60, 0x66, 0xa0, 0x74, 0xbd, 0xe1, 0x63, 0xfa,
+ 0x44, 0x56, 0x0b, 0x2a, 0xf4, 0xee, 0x97, 0x8a, 0xd3, 0x36, 0x53, 0xac,
+ 0xb1, 0xc2, 0x7a, 0x1c, 0xaf, 0xce, 0x1c, 0x60, 0xa5, 0xd5, 0x95, 0x4e,
+ 0x4d, 0x2a, 0x3a, 0x2a, 0x87, 0x8d, 0xd3, 0x44, 0x69, 0x8a, 0x0b, 0xba,
+ 0x58, 0x16, 0x12, 0x11, 0x1e, 0xbe, 0xc6, 0x2b, 0xa7, 0xa9, 0x4b, 0xe7,
+ 0x71, 0x42, 0x2f, 0xa2, 0x67, 0x7b, 0x0b, 0x43, 0xec, 0x98, 0xd1, 0xa1,
+ 0x3f, 0x95, 0x37, 0xaa, 0xa9, 0xb7, 0x99, 0x25, 0x95, 0xa6, 0xe0, 0x08,
+ 0x50, 0xd9, 0x0a, 0x6a, 0x58, 0x80, 0xee, 0x34, 0x40, 0xf9, 0x02, 0x40,
+ 0x9b, 0x5e, 0xf0, 0x3e, 0x87, 0xaf, 0x16, 0x11, 0xc9, 0x7c, 0x49, 0x8d,
+ 0xcc, 0x33, 0x90, 0xf0, 0x45, 0x61, 0xeb, 0x85, 0xca, 0x0f, 0xa6, 0x84,
+ 0x6b, 0x84, 0x70, 0xb4, 0xd6, 0xfb, 0xd4, 0xc6, 0x01, 0x91, 0x55, 0xc7,
+ 0x8e, 0x3b, 0x42, 0x8b, 0x58, 0x7d, 0x58, 0x4b, 0x5e, 0x00, 0x20, 0x8b,
+ 0xab, 0xa2, 0x19, 0x16, 0x01, 0x3f, 0xd9, 0x61, 0x40, 0xdd, 0xc9, 0xf7,
+ 0x0a, 0x16, 0xbd, 0x59, 0x0f, 0xcc, 0x6c, 0x33, 0x36, 0x44, 0x68, 0xf7,
+ 0x52, 0x3c, 0x6f, 0x99, 0x15, 0x22, 0x64, 0x42, 0xf2, 0x0b, 0xc8, 0xfe,
+ 0x4e, 0xb8, 0xcf, 0x1d, 0x86, 0x17, 0xd9, 0x78, 0xd3, 0x9a, 0xac, 0x12,
+ 0x84, 0x6e, 0x86, 0x64, 0x58, 0x48, 0xea, 0x90, 0xcf, 0x94, 0x22, 0xa4,
+ 0x26, 0xfc, 0x11, 0x8f, 0xa4, 0x2f, 0xa8, 0x8c, 0x1e, 0x6d, 0x63, 0xf4,
+ 0xeb, 0x36, 0xb3, 0x48, 0x29, 0x8e, 0x84, 0x2a, 0x1c, 0x95, 0xf7, 0x44,
+ 0xfb, 0x6e, 0x71, 0xab, 0x60, 0xb3, 0x59, 0xa6, 0xb4, 0x32, 0x9d, 0xc8,
+ 0x98, 0x08, 0x50, 0xc2, 0x5f, 0x64, 0xad, 0xec, 0xaf, 0x66, 0x5f, 0x29,
+ 0x4c, 0x89, 0x17, 0x21, 0x2e, 0x20, 0x0d, 0xca, 0x5a, 0xba, 0xff, 0xd2,
+ 0xb9, 0xbe, 0x7e, 0x79, 0x79, 0x75, 0x0d, 0x1c, 0x64, 0x94, 0x24, 0x96,
+ 0xd8, 0x92, 0x75, 0x7e, 0xeb, 0x1f, 0xf2, 0x82, 0x8d, 0x64, 0x4d, 0x3e,
+ 0xae, 0x81, 0x6d, 0x7a, 0x75, 0x65, 0x75, 0x45, 0xf0, 0x05, 0xbf, 0xd0,
+ 0x24, 0xa1, 0x31, 0x19, 0xdf, 0x61, 0x7b, 0x69, 0xa6, 0x4b, 0xf5, 0xd1,
+ 0xf5, 0xed, 0xab, 0x8b, 0xcb, 0x7f, 0xf4, 0xce, 0x75, 0x17, 0x03, 0x74,
+ 0x08, 0x4f, 0x60, 0xaf, 0xcc, 0xa8, 0x58, 0x29, 0x89, 0x85, 0x29, 0x8a,
+ 0x5f, 0x13, 0x03, 0x6a, 0xa2, 0x4e, 0xf9, 0xd5, 0x15, 0x15, 0x16, 0x39,
+ 0x2a, 0x06, 0xac, 0x85, 0x52, 0xc9, 0x3e, 0xab, 0xc9, 0x90, 0x97, 0x81,
+ 0xb6, 0xda, 0x49, 0x44, 0x6b, 0xa8, 0xac, 0x1c, 0xf0, 0x1b, 0xa7, 0xe5,
+ 0x5b, 0xe8, 0x86, 0x4a, 0x9f, 0xec, 0xfe, 0xb4, 0x11, 0xaf, 0x6a, 0x1b,
+ 0x4b, 0x56, 0x9d, 0xec, 0x14, 0x69, 0xa5, 0x62, 0xf7, 0xb7, 0x91, 0x4d,
+ 0xd0, 0x88, 0x55, 0x0c, 0x14, 0xaa, 0xad, 0x2e, 0x07, 0xa6, 0xc3, 0x0d,
+ 0x39, 0xf2, 0x94, 0x4a, 0xb7, 0x48, 0xe5, 0x70, 0xa8, 0xa1, 0x49, 0x45,
+ 0x82, 0xcd, 0x61, 0x35, 0x01, 0x4f, 0x94, 0x00, 0xa7, 0xd0, 0xd1, 0x28,
+ 0xe2, 0x9f, 0x6d, 0x2d, 0xc6, 0xdb, 0x9c, 0x4c, 0xec, 0x7b, 0x77, 0xaa,
+ 0x51, 0x83, 0x73, 0x62, 0x1a, 0x05, 0xf2, 0x5a, 0x67, 0xcc, 0xbb, 0x91,
+ 0xa3, 0x1c, 0x81, 0x6a, 0x1c, 0x2d, 0x39, 0x02, 0x1b, 0x39, 0x3e, 0x09,
+ 0x5a, 0xb2, 0x91, 0x22, 0xee, 0xb0, 0xf4, 0xba, 0x3e, 0x45, 0x88, 0xe0,
+ 0xee, 0x59, 0x90, 0x93, 0xd1, 0x9a, 0x15, 0x9b, 0x6a, 0x1c, 0x02, 0x5a,
+ 0x60, 0xbb, 0xf8, 0x4e, 0xc4, 0x67, 0xe7, 0x95, 0xbb, 0x80, 0x06, 0x5a,
+ 0x5e, 0x21, 0x9a, 0x28, 0x34, 0x4b, 0x21, 0xa5, 0x51, 0x1d, 0xe3, 0xb9,
+ 0xae, 0x0b, 0x10, 0xe8, 0x0c, 0x6b, 0x1b, 0x28, 0x6c, 0xe5, 0xde, 0x78,
+ 0xd0, 0x2a, 0x6e, 0x5b, 0x2f, 0x01, 0xb6, 0x20, 0x26, 0x70, 0x46, 0x51,
+ 0xf8, 0xa8, 0xb2, 0x19, 0x1e, 0x65, 0x5c, 0xe4, 0xac, 0x1a, 0x31, 0x4e,
+ 0x66, 0x26, 0x14, 0x47, 0x11, 0xb5, 0x9f, 0x24, 0x14, 0xb0, 0xfc, 0xcf,
+ 0xb0, 0xd6, 0x5c, 0x3e, 0xcc, 0xd8, 0x64, 0xcf, 0x62, 0x09, 0x8b, 0xb5,
+ 0xaa, 0xf2, 0x6e, 0x93, 0x4d, 0x55, 0x77, 0xa9, 0xc4, 0xee, 0x9a, 0x55,
+ 0x40, 0xa1, 0xb4, 0x2d, 0x19, 0x70, 0xf8, 0x0d, 0x6f, 0xb3, 0x32, 0x9a,
+ 0x91, 0xf7, 0xc0, 0xf4, 0xcc, 0x62, 0x24, 0x56, 0x59, 0xee, 0x63, 0xa1,
+ 0xc6, 0x54, 0x63, 0x53, 0x68, 0x60, 0x74, 0x29, 0x81, 0xdc, 0xa2, 0x12,
+ 0xc8, 0x50, 0x26, 0xf9, 0x9c, 0xca, 0x56, 0xe0, 0x84, 0x41, 0x29, 0x64,
+ 0xb8, 0xd6, 0xd9, 0x08, 0x03, 0xbb, 0x51, 0x1a, 0xbe, 0x86, 0xa3, 0x13,
+ 0x00, 0x10, 0x18, 0xa0, 0x71, 0x9a, 0x96, 0xef, 0xcb, 0x68, 0x94, 0xbd,
+ 0xa1, 0x0c, 0x73, 0x6e, 0xab, 0x2d, 0xe9, 0x29, 0x45, 0xb8, 0x41, 0xc0,
+ 0x35, 0x95, 0xfa, 0xd1, 0x81, 0x76, 0x7a, 0x9f, 0x6c, 0xbc, 0x69, 0xa4,
+ 0x0c, 0x43, 0xe2, 0xd7, 0x5e, 0x30, 0xbc, 0xc6, 0x7b, 0xd2, 0xa6, 0x24,
+ 0x70, 0x0e, 0x83, 0x6e, 0x66, 0xfa, 0x58, 0xb4, 0x74, 0x85, 0xed, 0x7f,
+ 0xcd, 0xd0, 0x56, 0xc7, 0x02, 0xa9, 0x99, 0x0b, 0x33, 0x74, 0xa7, 0x2d,
+ 0x60, 0xb8, 0xa9, 0xd2, 0x9b, 0xa4, 0x15, 0x73, 0x5f, 0x3c, 0x39, 0x72,
+ 0xa1, 0xc0, 0xc8, 0x81, 0xba, 0x20, 0x2a, 0x46, 0x04, 0x3e, 0x32, 0x99,
+ 0x11, 0x70, 0xbb, 0xeb, 0xa5, 0xe9, 0x52, 0x3b, 0xa1, 0xa0, 0xcb, 0x9b,
+ 0xcc, 0x6c, 0xcc, 0x9c, 0x32, 0x64, 0x11, 0x84, 0x87, 0x55, 0x1f, 0x8a,
+ 0xe4, 0x11, 0x7c, 0x17, 0xa0, 0x05, 0x51, 0x75, 0x31, 0xfd, 0xc3, 0xb0,
+ 0x2f, 0x2c, 0x74, 0x7d, 0x63, 0xa4, 0xff, 0xf7, 0xf8, 0x62, 0xa8, 0xf4,
+ 0x85, 0x62, 0xfc, 0x03, 0x80, 0xb7, 0x90, 0x6b, 0x93, 0xe6, 0x11, 0xac,
+ 0x70, 0x1b, 0x5f, 0x32, 0xa8, 0x7f, 0x7b, 0x8b, 0x12, 0x17, 0xb7, 0xc4,
+ 0xea, 0x7c, 0x0d, 0xb6, 0xbb, 0x3f, 0x4f, 0x55, 0x15, 0x52, 0x17, 0xe0,
+ 0xd2, 0xd0, 0x13, 0x28, 0x1a, 0xd7, 0x27, 0xaf, 0xde, 0x0d, 0xd6, 0xc9,
+ 0xce, 0x6f, 0x23, 0x76, 0x6b, 0x99, 0x76, 0xf0, 0x2a, 0x05, 0xb3, 0x9e,
+ 0x57, 0x48, 0x5d, 0x05, 0x04, 0xae, 0xfb, 0x25, 0x03, 0x82, 0xba, 0x3b,
+ 0x1b, 0x95, 0xb5, 0x4a, 0x78, 0xa9, 0x9a, 0x38, 0x98, 0x49, 0x3a, 0x2e,
+ 0x87, 0xa8, 0x05, 0xac, 0xae, 0x58, 0x1f, 0x78, 0x0d, 0xa9, 0x43, 0xa5,
+ 0x37, 0x58, 0x7d, 0x89, 0x53, 0x84, 0xef, 0xba, 0x70, 0x0e, 0x81, 0x6b,
+ 0x21, 0x11, 0xad, 0xae, 0xc0, 0x8d, 0x64, 0xa3, 0x24, 0xa2, 0x84, 0xef,
+ 0xd5, 0xda, 0xba, 0x71, 0xfe, 0x9b, 0x8e, 0xef, 0x5a, 0x58, 0xe3, 0xca,
+ 0xd6, 0x77, 0x34, 0x57, 0x66, 0x80, 0xef, 0x72, 0xc9, 0x51, 0x18, 0xfd,
+ 0x8a, 0xdf, 0xf8, 0x72, 0xec, 0x86, 0xee, 0x04, 0x08, 0x5f, 0xe1, 0x37,
+ 0xb2, 0xee, 0xed, 0x6c, 0x58, 0xc1, 0x8a, 0x35, 0x2c, 0x6f, 0x36, 0x21,
+ 0x7f, 0x1b, 0x01, 0xa0, 0xae, 0xae, 0x0c, 0xe5, 0x85, 0x16, 0xe2, 0x4e,
+ 0x3b, 0x9e, 0x4d, 0x83, 0x8f, 0x13, 0x88, 0xae, 0x19, 0xb7, 0x93, 0x4f,
+ 0xd1, 0x40, 0x8c, 0x7e, 0xec, 0xab, 0x20, 0xf0, 0x3a, 0x3e, 0xa5, 0x59,
+ 0x01, 0x31, 0x4c, 0x08, 0x0d, 0xbf, 0xd0, 0x01, 0x0f, 0xa0, 0x99, 0xcb,
+ 0x8a, 0xb2, 0x3f, 0x90, 0x7a, 0x09, 0xa5, 0x3f, 0x5c, 0x6c, 0x9c, 0x0d,
+ 0x35, 0xf4, 0x22, 0x01, 0xc4, 0xce, 0xc6, 0x07, 0xb8, 0xc8, 0x1b, 0x55,
+ 0xd4, 0x21, 0x73, 0x68, 0xd4, 0xe9, 0x21, 0xc9, 0x97, 0x56, 0x43, 0xbe,
+ 0x64, 0x78, 0x0c, 0x82, 0xcb, 0x1e, 0xee, 0xea, 0x62, 0xd7, 0x6e, 0x4a,
+ 0x02, 0x9b, 0xe1, 0xc4, 0xcd, 0xad, 0xae, 0x8f, 0x4a, 0x89, 0x2b, 0xe4,
+ 0xf9, 0x35, 0x9b, 0xc7, 0x2b, 0x85, 0xfd, 0xee, 0xa2, 0xbb, 0x7d, 0x78,
+ 0x70, 0xd0, 0xd8, 0xc4, 0x72, 0x61, 0x62, 0x94, 0xbc, 0x4e, 0xef, 0x4a,
+ 0x00, 0x1c, 0xa7, 0xa3, 0xc4, 0xa7, 0x5e, 0x78, 0xaf, 0x10, 0x76, 0xa9,
+ 0x0d, 0x99, 0xe8, 0xf8, 0x05, 0x77, 0xca, 0xac, 0xcf, 0xbc, 0x81, 0xf9,
+ 0xfb, 0x65, 0xef, 0xfa, 0x62, 0x75, 0xe5, 0x8a, 0x81, 0x83, 0xcb, 0xe4,
+ 0x1a, 0x90, 0x27, 0x2b, 0xc0, 0xb6, 0x5f, 0xb6, 0x76, 0xa2, 0x3f, 0x8d,
+ 0x3c, 0x05, 0x18, 0x88, 0xa6, 0xe7, 0x00, 0x6b, 0xcc, 0xe1, 0x3c, 0xda,
+ 0x80, 0x4e, 0xeb, 0xb1, 0x33, 0xcc, 0x85, 0x0b, 0xce, 0xdb, 0x39, 0xee,
+ 0x93, 0x98, 0x6f, 0x67, 0xd7, 0xf0, 0xa2, 0x60, 0x7a, 0x2f, 0xaf, 0xde,
+ 0x1c, 0xec, 0x1e, 0xe3, 0xec, 0x86, 0xad, 0xf4, 0x8b, 0xd9, 0x18, 0xec,
+ 0x33, 0x61, 0x23, 0x6a, 0x89, 0xb8, 0x7f, 0xa6, 0x91, 0xdd, 0x6d, 0x5e,
+ 0xa3, 0x82, 0x23, 0xf2, 0xa2, 0xeb, 0x6c, 0x84, 0xd4, 0xbc, 0x9c, 0x66,
+ 0x56, 0x7e, 0xc4, 0xc9, 0x47, 0x99, 0x01, 0xa2, 0x7c, 0x3a, 0x58, 0xe8,
+ 0xdc, 0xfc, 0xf6, 0x9a, 0x01, 0xdb, 0x3a, 0x58, 0xb5, 0x1c, 0x53, 0x70,
+ 0xbe, 0x1c, 0x01, 0xef, 0x63, 0x7c, 0xd7, 0xfe, 0x51, 0x38, 0xf3, 0x2a,
+ 0xa2, 0x92, 0x06, 0xd9, 0x79, 0xdd, 0x69, 0xbd, 0xec, 0xbc, 0xfe, 0xa1,
+ 0xfb, 0xe6, 0xbc, 0x77, 0x05, 0x49, 0xab, 0x42, 0x1f, 0x82, 0x5c, 0x97,
+ 0x7d, 0x7c, 0x40, 0xc8, 0x6b, 0xe5, 0xab, 0x14, 0x4a, 0x43, 0x09, 0xbe,
+ 0x86, 0xae, 0xc9, 0x3e, 0x6e, 0x44, 0x27, 0xc6, 0x8f, 0x9b, 0x9a, 0x21,
+ 0x64, 0x35, 0x4b, 0x79, 0x0b, 0x4d, 0xc9, 0x35, 0x3a, 0x1d, 0xb8, 0x08,
+ 0xcc, 0x10, 0x16, 0x8a, 0x2c, 0x6f, 0xb5, 0x6b, 0x5c, 0x2d, 0xbd, 0xfe,
+ 0x45, 0x52, 0x04, 0x7d, 0x52, 0x5e, 0x7f, 0xeb, 0xd2, 0x36, 0x57, 0x57,
+ 0x76, 0x77, 0xad, 0x75, 0x6d, 0xf7, 0x48, 0x25, 0x38, 0x4e, 0xb2, 0x91,
+ 0xe9, 0xfd, 0xc0, 0xca, 0x39, 0x14, 0x1f, 0xe1, 0xe4, 0xdc, 0x78, 0x79,
+ 0xe2, 0x85, 0xc7, 0x97, 0x0a, 0x75, 0x90, 0x9b, 0x01, 0x28, 0x80, 0xc3,
+ 0x1d, 0xdc, 0xa5, 0xba, 0x62, 0xee, 0xe6, 0x06, 0x98, 0xf8, 0xc6, 0xa9,
+ 0x7c, 0x62, 0x2c, 0x7c, 0x28, 0xd4, 0xee, 0x99, 0x84, 0x67, 0x37, 0x74,
+ 0x1f, 0x7f, 0x58, 0xaa, 0x9c, 0xb8, 0x6b, 0x5d, 0xf5, 0x87, 0x9e, 0x8e,
+ 0xf6, 0x86, 0xd6, 0xb1, 0x8b, 0x4f, 0xb8, 0xcf, 0xb1, 0x1c, 0xed, 0xcb,
+ 0x74, 0x9c, 0xf2, 0x7d, 0xfc, 0x29, 0x9a, 0xf8, 0xfd, 0x93, 0x39, 0x0b,
+ 0xe9, 0x36, 0xf9, 0xb4, 0x44, 0x1c, 0xb4, 0xee, 0x05, 0xf7, 0x5b, 0x77,
+ 0xc6, 0xc7, 0x38, 0x02, 0x68, 0xa3, 0x5f, 0x3b, 0xad, 0xff, 0xf9, 0xdb,
+ 0x46, 0x12, 0x7c, 0x5f, 0xf0, 0x12, 0x3b, 0x00, 0x79, 0x85, 0x1d, 0x87,
+ 0x2a, 0x22, 0x9c, 0x63, 0xec, 0xc8, 0x25, 0x84, 0x8e, 0x40, 0x4d, 0x10,
+ 0xff, 0x05, 0x0b, 0xd0, 0x94, 0xdc, 0xd8, 0xf9, 0x0d, 0x6e, 0x0a, 0xd4,
+ 0x1b, 0x3e, 0xe2, 0x1b, 0xfe, 0xf1, 0x49, 0x6f, 0xb0, 0x34, 0x21, 0xc1,
+ 0x35, 0x42, 0x1a, 0x75, 0x53, 0xf4, 0xb7, 0xb9, 0x10, 0xcc, 0x9e, 0xd2,
+ 0x17, 0x64, 0x65, 0xd6, 0xd1, 0xa9, 0x58, 0x5d, 0xc7, 0x4f, 0x72, 0x18,
+ 0x5b, 0xa0, 0x56, 0xcf, 0x6d, 0xab, 0xdb, 0xd6, 0x2e, 0xc5, 0xda, 0x43,
+ 0x65, 0xde, 0x89, 0xad, 0x8e, 0x14, 0x77, 0x60, 0xc3, 0xcc, 0xaa, 0x13,
+ 0xdb, 0xd6, 0xae, 0xb2, 0x27, 0x36, 0x95, 0x06, 0x30, 0x1f, 0x86, 0x91,
+ 0xa3, 0xbb, 0xc6, 0xe3, 0x19, 0x3b, 0x64, 0xe6, 0x9e, 0x31, 0x49, 0x78,
+ 0xc4, 0x98, 0x43, 0xc7, 0x9d, 0x31, 0x3c, 0x88, 0x85, 0x8c, 0xff, 0x84,
+ 0xad, 0xf2, 0x3e, 0x5c, 0x3b, 0xd8, 0xd7, 0xcc, 0x8c, 0x7c, 0xf4, 0x83,
+ 0x97, 0xf3, 0x6a, 0x51, 0xa0, 0x22, 0xc0, 0x79, 0xbd, 0x0c, 0x6f, 0xb1,
+ 0x59, 0x76, 0xcb, 0x0d, 0x38, 0x95, 0x31, 0xb1, 0x12, 0x65, 0x44, 0xbe,
+ 0x09, 0x81, 0xfd, 0x40, 0x54, 0xee, 0x00, 0x84, 0x1c, 0x0e, 0x39, 0x47,
+ 0x75, 0x12, 0x95, 0x1b, 0xc4, 0xf3, 0xcf, 0x3f, 0x00, 0x92, 0xa5, 0xb9,
+ 0x5d, 0x06, 0xc4, 0xb2, 0xa6, 0x07, 0x42, 0x1f, 0x1b, 0xd4, 0xc7, 0x56,
+ 0x25, 0x14, 0x3b, 0x1c, 0xd4, 0x3f, 0x5a, 0x91, 0xfa, 0x75, 0xc5, 0x64,
+ 0x90, 0x61, 0x20, 0x51, 0x36, 0x2e, 0x67, 0x13, 0x17, 0xd3, 0x63, 0x71,
+ 0x3d, 0x01, 0x31, 0xd6, 0xe8, 0x84, 0x53, 0x2e, 0x58, 0x41, 0x34, 0x41,
+ 0xa9, 0xfe, 0xae, 0xac, 0x03, 0x0c, 0xa9, 0xba, 0xcc, 0xb0, 0x4a, 0x75,
+ 0x6e, 0xd9, 0x70, 0xef, 0x60, 0xc6, 0xa5, 0xdd, 0x19, 0x8c, 0xbd, 0x0b,
+ 0xca, 0xed, 0x22, 0x8e, 0x0e, 0x85, 0xf2, 0xee, 0x50, 0x70, 0x3f, 0x11,
+ 0x65, 0x93, 0x92, 0x72, 0x4b, 0xba, 0x29, 0xe1, 0x9f, 0x8d, 0x28, 0x80,
+ 0x00, 0x56, 0x92, 0x64, 0xce, 0x6d, 0x68, 0x64, 0x2b, 0x23, 0x11, 0x3c,
+ 0x42, 0xfd, 0xcb, 0x29, 0xd5, 0x0b, 0x9d, 0x52, 0x7d, 0x40, 0x2b, 0xee,
+ 0xa7, 0x9e, 0xf8, 0x45, 0x22, 0x55, 0xb8, 0xcb, 0x44, 0xe6, 0x5a, 0x5d,
+ 0x69, 0x74, 0x45, 0x3a, 0x58, 0xb4, 0xbb, 0xa8, 0x55, 0x08, 0xed, 0x6c,
+ 0x70, 0x60, 0x8f, 0x3f, 0x02, 0x2a, 0xcf, 0x2a, 0xe8, 0x5b, 0x23, 0x0a,
+ 0xaf, 0x36, 0x9a, 0x8c, 0xd7, 0x59, 0xaf, 0x9f, 0x32, 0xf4, 0x5b, 0x9b,
+ 0x8e, 0x6c, 0x55, 0xbc, 0xd5, 0x15, 0xa3, 0xe1, 0x96, 0x53, 0xc2, 0x8d,
+ 0xad, 0x2e, 0x97, 0x35, 0xbf, 0x4e, 0x97, 0x63, 0x67, 0x0c, 0x6e, 0x5d,
+ 0x56, 0x88, 0xb3, 0x11, 0x90, 0x65, 0x03, 0x08, 0xa4, 0x11, 0x10, 0x62,
+ 0xa3, 0x9d, 0xc4, 0xec, 0x67, 0x24, 0xba, 0xf5, 0xcd, 0x70, 0x8a, 0x51,
+ 0x3a, 0x41, 0xdb, 0x32, 0x22, 0x0b, 0x7b, 0x43, 0xc1, 0x01, 0x02, 0xc4,
+ 0x80, 0x51, 0xc3, 0xc1, 0xd2, 0x53, 0x66, 0xe8, 0xa8, 0x96, 0x14, 0x34,
+ 0xb5, 0x50, 0xeb, 0x94, 0x5e, 0xba, 0x01, 0x77, 0xcf, 0x1e, 0x1e, 0xf8,
+ 0xee, 0x20, 0x86, 0xad, 0x14, 0xad, 0x11, 0x67, 0x00, 0x14, 0xbe, 0x82,
+ 0xb2, 0xbc, 0x69, 0x99, 0xf2, 0x71, 0xe8, 0x5d, 0x47, 0x81, 0x3f, 0x2d,
+ 0x49, 0x7d, 0x35, 0xcb, 0x03, 0xc5, 0x34, 0x9d, 0xb5, 0x39, 0xea, 0x39,
+ 0x51, 0xee, 0x92, 0x87, 0x44, 0x74, 0x61, 0x23, 0x40, 0x31, 0xe8, 0xde,
+ 0xbf, 0x66, 0x79, 0xff, 0x7d, 0x72, 0x33, 0x01, 0xe8, 0xba, 0xdb, 0xe2,
+ 0x63, 0xf2, 0x9f, 0xb3, 0xd1, 0x43, 0x29, 0xb1, 0xe9, 0x30, 0xf2, 0xdf,
+ 0x61, 0x53, 0xde, 0x39, 0x93, 0xa3, 0x6e, 0xa2, 0xf5, 0xc3, 0x59, 0xe3,
+ 0xf4, 0x17, 0x18, 0x4c, 0xbf, 0x18, 0x16, 0x33, 0x44, 0xc1, 0xcb, 0xa7,
+ 0xdf, 0xc7, 0xef, 0xfd, 0xe9, 0x4a, 0xdd, 0x1b, 0xdc, 0x5a, 0x3e, 0x80,
+ 0x0f, 0xeb, 0xbb, 0xc6, 0x45, 0x6a, 0xe6, 0xbf, 0x81, 0xe0, 0x05, 0xdf,
+ 0xad, 0x0d, 0xb3, 0xbc, 0xcc, 0xd6, 0x54, 0x23, 0x74, 0x86, 0x26, 0xc9,
+ 0xb7, 0xc3, 0xd3, 0x1f, 0x53, 0x43, 0x73, 0xe3, 0xd9, 0xd8, 0x4c, 0x49,
+ 0xff, 0xfe, 0x2f, 0xc9, 0xdb, 0xfb, 0x7c, 0x58, 0x94, 0xc5, 0xc3, 0x7d,
+ 0x9e, 0x35, 0xcd, 0xb9, 0x2a, 0x77, 0xfd, 0x7d, 0x36, 0x21, 0x62, 0xcb,
+ 0x61, 0x82, 0x07, 0xc9, 0xab, 0x6c, 0x00, 0x66, 0x37, 0x75, 0x07, 0x5c,
+ 0x35, 0xef, 0x01, 0x76, 0x94, 0x82, 0xc7, 0xdd, 0x4c, 0x09, 0xe0, 0xa0,
+ 0xe6, 0x99, 0xba, 0x67, 0x30, 0x9b, 0xf4, 0xef, 0x4d, 0xc7, 0x0c, 0xeb,
+ 0x99, 0x0d, 0x0c, 0xa3, 0x35, 0x44, 0x0f, 0x70, 0xb5, 0x59, 0xfe, 0xff,
+ 0xce, 0x46, 0xc9, 0x59, 0x36, 0xfa, 0x5f, 0xf7, 0x6b, 0xe3, 0x36, 0xdd,
+ 0x6f, 0xce, 0xe9, 0x07, 0x9d, 0xfa, 0xf0, 0x97, 0x56, 0x8b, 0xbd, 0x00,
+ 0x32, 0x0a, 0x36, 0x93, 0xd6, 0x38, 0x34, 0xc8, 0x42, 0x54, 0x54, 0x00,
+ 0x29, 0xc0, 0xa4, 0xa8, 0x0a, 0x38, 0xaf, 0xae, 0xac, 0x8b, 0xc3, 0xc2,
+ 0x16, 0x17, 0xf9, 0x90, 0xa7, 0xd5, 0xc0, 0x79, 0x26, 0xaf, 0x0d, 0x6e,
+ 0x53, 0x6b, 0xe4, 0x60, 0x03, 0x03, 0xa8, 0x8b, 0x69, 0x99, 0x84, 0x11,
+ 0x43, 0xb7, 0xa0, 0x77, 0x60, 0x12, 0xf0, 0x3a, 0x65, 0x7d, 0x70, 0x33,
+ 0x5c, 0xcc, 0x96, 0x47, 0x24, 0x78, 0xd8, 0x9e, 0x23, 0x20, 0x66, 0x71,
+ 0xa9, 0x75, 0xde, 0x90, 0x47, 0x5e, 0x87, 0x6f, 0x8d, 0x07, 0x61, 0xf2,
+ 0xc1, 0xb3, 0xfc, 0x36, 0x03, 0x38, 0xda, 0x04, 0xf2, 0x5e, 0xc7, 0xec,
+ 0xc4, 0xba, 0x85, 0x28, 0xc2, 0xe4, 0xdf, 0xb1, 0x2f, 0x11, 0xff, 0x51,
+ 0x6a, 0x9d, 0xe2, 0x42, 0xf8, 0x66, 0x25, 0xb1, 0x8c, 0x2f, 0x44, 0x33,
+ 0xda, 0x25, 0xb4, 0x1d, 0x41, 0xa6, 0x67, 0x97, 0x18, 0x5b, 0xb6, 0x7e,
+ 0x6a, 0xae, 0xb8, 0xed, 0x2f, 0x49, 0x42, 0x5e, 0x2e, 0x12, 0x9c, 0x30,
+ 0x7e, 0x63, 0xaa, 0xe0, 0x50, 0xf8, 0x18, 0x98, 0x6a, 0xba, 0x51, 0xee,
+ 0x18, 0xcf, 0xc2, 0x64, 0x78, 0x4f, 0xfa, 0x9e, 0x7d, 0x6e, 0x88, 0x90,
+ 0xc0, 0xed, 0x13, 0xa0, 0x32, 0xb7, 0x69, 0x8e, 0x7b, 0x55, 0x03, 0x5c,
+ 0x72, 0xdf, 0xb9, 0x24, 0xd3, 0x23, 0xc0, 0xb2, 0x67, 0xfd, 0xfb, 0x31,
+ 0x22, 0x43, 0x83, 0xed, 0xc8, 0x3e, 0x57, 0xad, 0xe4, 0x86, 0x14, 0x6a,
+ 0x23, 0x09, 0xf1, 0x85, 0x94, 0x23, 0x63, 0x38, 0x91, 0xcc, 0x8c, 0x9e,
+ 0x8c, 0x17, 0xe0, 0x69, 0x35, 0xdb, 0x28, 0xe4, 0x3d, 0x3f, 0x4a, 0x24,
+ 0xd9, 0xfb, 0xec, 0xe9, 0xb1, 0x40, 0x87, 0x15, 0x98, 0xb9, 0x13, 0xb2,
+ 0x6f, 0x05, 0x37, 0x97, 0xf7, 0xf9, 0xed, 0x54, 0xb2, 0x03, 0x90, 0xfe,
+ 0xf9, 0xbe, 0x53, 0x43, 0x51, 0x33, 0xc1, 0x90, 0x30, 0xfa, 0x77, 0xbb,
+ 0xcd, 0xeb, 0x85, 0x8e, 0x19, 0x6d, 0x59, 0x26, 0xf0, 0x84, 0x8a, 0x55,
+ 0xb8, 0xc9, 0xc8, 0x29, 0x0f, 0x40, 0xa0, 0x9e, 0xef, 0x73, 0x0d, 0x1c,
+ 0x45, 0x86, 0x38, 0x72, 0x24, 0xa2, 0x35, 0x9c, 0xf5, 0xc0, 0xd6, 0xd7,
+ 0x5e, 0x5d, 0x91, 0x0d, 0xd1, 0x21, 0xe7, 0x8b, 0x8f, 0x78, 0x82, 0xf8,
+ 0x01, 0x31, 0x13, 0x24, 0x96, 0x3d, 0xc6, 0x7c, 0x20, 0x9a, 0xe4, 0xc9,
+ 0xc8, 0xb1, 0x6b, 0xbb, 0xe0, 0xaf, 0x5f, 0x5d, 0xbf, 0xf9, 0xb7, 0xde,
+ 0xeb, 0xe4, 0xab, 0xcb, 0x57, 0x6f, 0x5f, 0x5e, 0xf6, 0xce, 0x9d, 0x4b,
+ 0x18, 0xc2, 0x6b, 0x25, 0xd2, 0x28, 0xd8, 0xe9, 0x94, 0xe3, 0xa2, 0xd3,
+ 0xc7, 0x68, 0xb1, 0x1f, 0x00, 0x7c, 0x64, 0x02, 0xb0, 0xda, 0x5c, 0x46,
+ 0xd7, 0x30, 0xe1, 0x21, 0x25, 0x07, 0xa3, 0x53, 0xf3, 0x02, 0x22, 0x11,
+ 0xef, 0xd1, 0x8f, 0x4e, 0xe2, 0x43, 0x6f, 0x7c, 0x67, 0xa4, 0xa6, 0x7b,
+ 0xe4, 0x79, 0x74, 0xf6, 0xe0, 0xbe, 0xba, 0x33, 0x6c, 0xb6, 0xe4, 0x9d,
+ 0x8a, 0x91, 0xd5, 0x40, 0x29, 0x7c, 0x6f, 0xd3, 0x77, 0x8d, 0xba, 0x01,
+ 0xab, 0xf0, 0x0a, 0x1e, 0xfb, 0x4d, 0xe6, 0xf8, 0x06, 0xce, 0xf6, 0x63,
+ 0xfa, 0x14, 0x3d, 0xb2, 0x02, 0x0f, 0x7f, 0x52, 0x99, 0x9d, 0xb5, 0xdb,
+ 0xc9, 0x1a, 0xee, 0x4f, 0xb9, 0x11, 0x7b, 0x18, 0xbb, 0x31, 0x1b, 0xfb,
+ 0x37, 0xa2, 0x19, 0xaf, 0xee, 0x46, 0xc5, 0xc3, 0xad, 0x0d, 0x1d, 0x3e,
+ 0x6c, 0x33, 0x2f, 0x48, 0xbe, 0x66, 0x98, 0x1c, 0x23, 0x00, 0x12, 0x0d,
+ 0xc0, 0x8f, 0xce, 0xc2, 0x4e, 0x30, 0xeb, 0x82, 0xdd, 0xe8, 0x0c, 0x15,
+ 0x0c, 0xbf, 0x7e, 0x65, 0xd1, 0xe0, 0xe7, 0x95, 0x1b, 0x11, 0x08, 0x71,
+ 0x49, 0xb0, 0x11, 0x44, 0xf1, 0x5e, 0xda, 0xbf, 0x8f, 0xbb, 0x48, 0x06,
+ 0xec, 0x21, 0x71, 0xd0, 0xe9, 0x7e, 0xea, 0x37, 0x63, 0xe6, 0x52, 0xc8,
+ 0x06, 0x0a, 0x75, 0x9c, 0x95, 0xc3, 0x83, 0xe1, 0x8d, 0x44, 0x2b, 0x79,
+ 0x63, 0xe4, 0x19, 0x23, 0x69, 0x13, 0x14, 0xc8, 0xad, 0xe4, 0x35, 0x41,
+ 0xec, 0x37, 0x39, 0xef, 0xa4, 0x4e, 0x32, 0x69, 0x7e, 0x95, 0xec, 0x4e,
+ 0x74, 0x30, 0x50, 0x45, 0x67, 0x30, 0x56, 0x6a, 0xab, 0x34, 0x86, 0x80,
+ 0x54, 0x62, 0x5d, 0xf0, 0x81, 0x6c, 0x3c, 0x08, 0x6e, 0x07, 0x15, 0x86,
+ 0x7c, 0xb3, 0xd5, 0x47, 0x46, 0x0f, 0x80, 0x32, 0x8f, 0x7f, 0x74, 0xfb,
+ 0xae, 0x30, 0x35, 0x84, 0x00, 0xc5, 0xe2, 0x6a, 0xf8, 0x65, 0xf0, 0x60,
+ 0xcb, 0x06, 0x1f, 0xa5, 0x77, 0x1a, 0x6b, 0x00, 0x66, 0xd9, 0x9d, 0xba,
+ 0x88, 0x4e, 0x8f, 0x51, 0x9f, 0x4d, 0xa7, 0x73, 0x91, 0x3b, 0xcf, 0xf0,
+ 0xc0, 0x26, 0x3a, 0x78, 0xa7, 0x39, 0x48, 0x6d, 0xe0, 0xfd, 0x05, 0x67,
+ 0xc1, 0xd4, 0x16, 0xb8, 0xbb, 0xcb, 0xc6, 0x50, 0x7f, 0xdd, 0x30, 0x14,
+ 0x95, 0xe3, 0x2a, 0x5a, 0xe0, 0x0f, 0x97, 0x1b, 0x74, 0x44, 0xc0, 0xce,
+ 0x45, 0xc6, 0x9a, 0x62, 0xa8, 0xa0, 0xc7, 0x6f, 0xfc, 0x88, 0x65, 0x0f,
+ 0x82, 0x15, 0x89, 0xa1, 0xe6, 0x4e, 0xee, 0x75, 0xd4, 0x71, 0x32, 0x46,
+ 0x00, 0xa7, 0x31, 0x02, 0x38, 0xf9, 0x2b, 0x53, 0xf3, 0x80, 0x61, 0x30,
+ 0x0d, 0x8a, 0xfc, 0xa9, 0x06, 0x8a, 0xd5, 0x17, 0x09, 0xeb, 0x49, 0x84,
+ 0x43, 0xcc, 0x14, 0x67, 0x31, 0xf2, 0x25, 0x73, 0x5e, 0x6e, 0x8e, 0x9a,
+ 0xbd, 0x7a, 0xb0, 0x5a, 0xd0, 0xde, 0x35, 0xac, 0x9d, 0xfe, 0xe6, 0x5b,
+ 0xab, 0xe0, 0x4f, 0x80, 0x22, 0x89, 0x4f, 0x5c, 0xc9, 0x9d, 0xde, 0x6f,
+ 0x36, 0x1a, 0xce, 0x46, 0xc1, 0x55, 0x90, 0x45, 0xe9, 0x7d, 0x95, 0xf7,
+ 0x58, 0xac, 0xc2, 0x1f, 0x2e, 0x5f, 0x01, 0xbe, 0x09, 0x98, 0x82, 0x25,
+ 0x5b, 0x89, 0x47, 0x42, 0x75, 0x11, 0x36, 0x6b, 0xab, 0x69, 0x5d, 0x57,
+ 0x41, 0xeb, 0x74, 0xd5, 0x14, 0xc2, 0xad, 0xa5, 0x93, 0x36, 0x1b, 0xa5,
+ 0x86, 0x76, 0xfa, 0xa0, 0x2a, 0x80, 0xd6, 0x61, 0xb6, 0xc3, 0xfa, 0x4d,
+ 0xf6, 0x54, 0x40, 0xcc, 0xe4, 0x93, 0xd9, 0xd7, 0x1f, 0x37, 0x44, 0x6b,
+ 0x08, 0x04, 0x27, 0x86, 0xf9, 0xd0, 0xae, 0xaa, 0xd2, 0xa2, 0xa5, 0x11,
+ 0xa0, 0x20, 0x3e, 0x86, 0x2a, 0x15, 0x42, 0x12, 0x02, 0xa3, 0x37, 0x94,
+ 0x20, 0xa0, 0x2d, 0x05, 0xe7, 0x53, 0x60, 0x55, 0xcc, 0x3f, 0xa0, 0x26,
+ 0x26, 0x94, 0xc4, 0xfc, 0x03, 0xea, 0x61, 0x42, 0x39, 0xcc, 0x3f, 0xb8,
+ 0x18, 0x26, 0x65, 0x57, 0x2c, 0xaa, 0xc2, 0xc8, 0xf1, 0xa1, 0x73, 0xcb,
+ 0x30, 0x06, 0xe5, 0x60, 0x98, 0xc4, 0x34, 0x9c, 0x8e, 0x4c, 0xf8, 0xa9,
+ 0x47, 0x63, 0x04, 0x76, 0x8b, 0xbf, 0x3c, 0x0f, 0xb7, 0xcc, 0x09, 0x6b,
+ 0x6b, 0x65, 0xc2, 0x0c, 0x68, 0x2e, 0x5c, 0x99, 0x57, 0xae, 0xde, 0xdc,
+ 0x1c, 0x03, 0xa7, 0x51, 0xf9, 0x1d, 0x1e, 0x31, 0x04, 0x7d, 0xfe, 0x99,
+ 0x0a, 0x61, 0x48, 0x77, 0x3b, 0x2e, 0x16, 0x12, 0xea, 0xe4, 0xc0, 0x8f,
+ 0xe8, 0xc4, 0xb3, 0xd9, 0x34, 0xa9, 0x9f, 0xd7, 0x01, 0xfd, 0xc3, 0xea,
+ 0x65, 0xcb, 0x82, 0x19, 0xea, 0x20, 0xfe, 0x79, 0x55, 0x50, 0xb1, 0x65,
+ 0x16, 0x2b, 0xf5, 0xd8, 0x89, 0x57, 0xe1, 0x09, 0xc2, 0xc8, 0x2b, 0x4e,
+ 0x46, 0xc4, 0xd4, 0x1a, 0x39, 0xc6, 0x8b, 0x30, 0x0d, 0x24, 0xc8, 0x74,
+ 0xb7, 0x6f, 0xf8, 0xf6, 0xfd, 0xe3, 0x69, 0xef, 0xd5, 0xdb, 0xeb, 0x7f,
+ 0x7e, 0xbb, 0x69, 0x3e, 0x59, 0x53, 0x89, 0x66, 0xbc, 0xe3, 0x22, 0x8e,
+ 0x7a, 0x12, 0x6c, 0x5c, 0x8f, 0x2b, 0x55, 0xad, 0x66, 0xb5, 0x1d, 0xd0,
+ 0xdc, 0xc0, 0x28, 0x92, 0x83, 0x09, 0xc8, 0x9c, 0xf2, 0x89, 0xa6, 0x83,
+ 0x7b, 0x05, 0x76, 0x1f, 0x76, 0xd6, 0xc7, 0x62, 0x20, 0x48, 0xcc, 0xc6,
+ 0x27, 0xb9, 0x81, 0xc4, 0x3f, 0x59, 0xa9, 0x92, 0x55, 0x36, 0x2c, 0xc6,
+ 0xe0, 0xb6, 0x64, 0x45, 0xcf, 0x5a, 0x17, 0xf0, 0x9c, 0x48, 0x55, 0xe0,
+ 0xf9, 0x24, 0xbb, 0xc3, 0xea, 0x3f, 0x5c, 0xba, 0x44, 0x45, 0x77, 0x8b,
+ 0x96, 0x04, 0xf1, 0x7b, 0xc3, 0x26, 0x2b, 0x3d, 0xc5, 0x03, 0xc3, 0xbe,
+ 0xe8, 0xc0, 0xd8, 0x75, 0x15, 0x33, 0x6c, 0xc9, 0x65, 0xa9, 0xa8, 0xf6,
+ 0x0d, 0xb0, 0xb3, 0x10, 0x6e, 0xd4, 0x97, 0x74, 0xbb, 0x61, 0xf4, 0xfd,
+ 0xbe, 0x02, 0xcd, 0xc1, 0x74, 0x26, 0xda, 0x58, 0x96, 0x1a, 0x04, 0xf2,
+ 0x4e, 0x4d, 0x69, 0x53, 0xac, 0x99, 0xfe, 0x65, 0x4c, 0xd8, 0x71, 0x86,
+ 0x4e, 0x05, 0x8c, 0xa7, 0x6e, 0x72, 0x54, 0x46, 0xbb, 0x5d, 0xdb, 0x65,
+ 0x82, 0x2a, 0x7c, 0x0a, 0xac, 0xd5, 0x88, 0x41, 0x04, 0xd5, 0xe6, 0x66,
+ 0xd7, 0x72, 0x6b, 0xc7, 0x29, 0x16, 0xce, 0x2b, 0x9b, 0x8c, 0xee, 0x91,
+ 0x8c, 0xb8, 0x2c, 0xa0, 0x97, 0xe4, 0x53, 0x62, 0xfd, 0xa5, 0x3c, 0x52,
+ 0x56, 0xf5, 0xd3, 0x88, 0xfa, 0x55, 0xfe, 0x11, 0x02, 0x88, 0xf1, 0x8f,
+ 0x47, 0xce, 0x2e, 0x4a, 0x52, 0x1b, 0xfb, 0x96, 0xa9, 0x4b, 0x1c, 0xd4,
+ 0xff, 0x4b, 0xb4, 0x44, 0xe7, 0xb6, 0xe8, 0x72, 0xfb, 0xe1, 0xd1, 0x25,
+ 0xd4, 0xf0, 0x34, 0x5a, 0xf3, 0x17, 0x52, 0x83, 0x47, 0xeb, 0xcf, 0xdd,
+ 0xdb, 0x86, 0xa5, 0x74, 0x5e, 0x13, 0x6b, 0x71, 0x58, 0x9f, 0xf4, 0x2e,
+ 0xd6, 0xa3, 0x3f, 0xb5, 0xdb, 0xce, 0x67, 0x29, 0xaa, 0x4c, 0x98, 0x0e,
+ 0x54, 0x44, 0xd2, 0x81, 0xbc, 0x40, 0x1c, 0xa4, 0x73, 0x90, 0x76, 0xbd,
+ 0x44, 0x6f, 0x43, 0xfa, 0x10, 0xd6, 0xd0, 0x4c, 0x20, 0x28, 0x92, 0x3e,
+ 0x41, 0xc7, 0x51, 0xe0, 0x69, 0xd9, 0xb3, 0x0e, 0x65, 0xe4, 0x7a, 0xdd,
+ 0x01, 0xc5, 0x6f, 0x56, 0x1c, 0x6c, 0x9b, 0x64, 0xf2, 0x73, 0x27, 0x3d,
+ 0xe4, 0xc1, 0x62, 0x82, 0x22, 0x64, 0xb6, 0xa3, 0x30, 0x4c, 0xc5, 0xfe,
+ 0xd4, 0x11, 0x04, 0x99, 0x10, 0x1c, 0x4a, 0xcf, 0xba, 0x82, 0xdd, 0x9c,
+ 0xa2, 0x75, 0x3f, 0xa3, 0x64, 0xec, 0x95, 0x7b, 0x76, 0x31, 0x36, 0x94,
+ 0x4d, 0x57, 0xdf, 0xde, 0x6e, 0xef, 0x57, 0x33, 0xd6, 0xaf, 0x53, 0x07,
+ 0xb9, 0x44, 0xa2, 0x9d, 0x0f, 0x38, 0xbf, 0x36, 0xf7, 0x7c, 0xab, 0x47,
+ 0x94, 0xf7, 0x60, 0xb6, 0x49, 0x60, 0x42, 0xa0, 0x5f, 0x09, 0x32, 0x42,
+ 0x87, 0x6e, 0x52, 0x57, 0x30, 0xc6, 0x42, 0xba, 0x5b, 0xe9, 0x70, 0x36,
+ 0xce, 0xff, 0x65, 0x44, 0x2f, 0x10, 0x6a, 0x02, 0x49, 0x50, 0x0f, 0x47,
+ 0xbd, 0x8b, 0xc7, 0xa4, 0x5e, 0xb9, 0x54, 0xdd, 0xf2, 0x9a, 0xf4, 0xfb,
+ 0xca, 0x90, 0x7e, 0x06, 0x11, 0x1e, 0x47, 0xf4, 0x33, 0x09, 0xf3, 0x56,
+ 0xa6, 0xb5, 0xd2, 0x2b, 0xfe, 0x70, 0x1d, 0x82, 0xd0, 0xbf, 0x2e, 0x04,
+ 0xe2, 0xe1, 0x5d, 0x76, 0x5b, 0xd2, 0x58, 0xec, 0x8f, 0xdd, 0x61, 0x96,
+ 0x8e, 0xa1, 0xcb, 0xe6, 0xd9, 0x72, 0xc9, 0xfc, 0xfc, 0x05, 0xb2, 0x99,
+ 0x2f, 0x66, 0x31, 0x04, 0x08, 0x69, 0x87, 0x89, 0x43, 0xfc, 0x71, 0x92,
+ 0x1b, 0x91, 0xa7, 0x4b, 0x8d, 0x38, 0x75, 0xa8, 0x15, 0xa0, 0x7a, 0xb9,
+ 0x90, 0x31, 0xde, 0x16, 0x6a, 0xca, 0x93, 0x05, 0x5d, 0x69, 0x05, 0x08,
+ 0xd0, 0xb1, 0x39, 0x04, 0xa7, 0x5a, 0x3e, 0x11, 0xb4, 0xe3, 0x5b, 0x73,
+ 0xbe, 0xb1, 0xb5, 0xb3, 0x74, 0x21, 0x8d, 0xa7, 0x75, 0x2a, 0x9d, 0x18,
+ 0xb7, 0x48, 0x78, 0xb7, 0x6a, 0xa7, 0xdb, 0x5a, 0xcd, 0x0a, 0x02, 0x87,
+ 0x55, 0xe2, 0xc2, 0xe1, 0x24, 0xd4, 0x79, 0xeb, 0x1c, 0xf1, 0x08, 0x20,
+ 0x32, 0xc7, 0x19, 0x68, 0x90, 0xd0, 0xf7, 0x65, 0xba, 0xed, 0x14, 0xc6,
+ 0x53, 0xad, 0x85, 0x5a, 0xfe, 0x1f, 0x74, 0x10, 0x94, 0xc6, 0x4a, 0xff,
+ 0x78, 0xf6, 0x22, 0x50, 0x33, 0xcb, 0xd0, 0x6a, 0xb2, 0x8e, 0x2c, 0x1c,
+ 0xcc, 0xd3, 0x22, 0x00, 0xe0, 0xa3, 0xa8, 0x80, 0xac, 0x89, 0x22, 0x02,
+ 0xe6, 0x02, 0x72, 0xf7, 0xf0, 0x15, 0x68, 0x97, 0xec, 0x15, 0x93, 0x72,
+ 0xa3, 0x6e, 0x74, 0x4a, 0xbd, 0xf5, 0xf8, 0xda, 0x17, 0x2c, 0xca, 0xbe,
+ 0x77, 0x00, 0xf2, 0xcf, 0xde, 0x41, 0x15, 0x58, 0x1e, 0x3a, 0x48, 0x9e,
+ 0xd2, 0x39, 0xb6, 0x00, 0xca, 0x62, 0x73, 0x02, 0x13, 0xb8, 0x80, 0xb4,
+ 0x55, 0x03, 0xcc, 0xc3, 0x77, 0x12, 0x40, 0xaa, 0xb2, 0xfa, 0x2a, 0x51,
+ 0x6d, 0x5a, 0xbf, 0xd2, 0x2c, 0x8b, 0xf5, 0x95, 0x9f, 0xcc, 0xa5, 0x59,
+ 0x96, 0x98, 0x95, 0x48, 0xae, 0xcc, 0x65, 0xa7, 0xb1, 0xbc, 0x2e, 0x12,
+ 0x9f, 0x3a, 0x28, 0xc7, 0x8b, 0x05, 0x1a, 0xe7, 0x38, 0x2c, 0x40, 0xda,
+ 0xd1, 0x48, 0xbe, 0xf5, 0x7d, 0x4e, 0x16, 0xab, 0x54, 0x8e, 0x43, 0x71,
+ 0xff, 0x02, 0xea, 0x8a, 0xa0, 0x57, 0x2b, 0x1b, 0xa4, 0x51, 0xed, 0x00,
+ 0xde, 0x20, 0x3c, 0xbf, 0x75, 0x9e, 0x8b, 0xf8, 0x35, 0x15, 0x58, 0xa6,
+ 0x33, 0x59, 0x92, 0xc1, 0xbe, 0x9d, 0xac, 0x83, 0xc7, 0xcd, 0xb6, 0x4b,
+ 0x69, 0x59, 0x65, 0xac, 0xa0, 0x0b, 0xc7, 0x68, 0x02, 0x63, 0x74, 0xd8,
+ 0xb9, 0x71, 0xc4, 0xe2, 0x80, 0xcb, 0xf2, 0xf0, 0xcc, 0x2c, 0x5b, 0x7c,
+ 0x1d, 0xaa, 0xe2, 0x90, 0xbc, 0x53, 0xf9, 0xe3, 0x56, 0x7d, 0x74, 0x7d,
+ 0x61, 0x7b, 0x30, 0xcb, 0x97, 0x36, 0x67, 0x1f, 0x93, 0x9b, 0x13, 0x06,
+ 0xc6, 0xc7, 0xcf, 0x55, 0xbc, 0x76, 0x8d, 0x65, 0x61, 0x11, 0x80, 0x16,
+ 0x20, 0xdc, 0xfa, 0xfc, 0xdf, 0xf5, 0xda, 0xd5, 0xa0, 0x96, 0x9d, 0x69,
+ 0x7a, 0x11, 0x2c, 0x96, 0x27, 0xc8, 0xc4, 0x53, 0x66, 0x96, 0xac, 0x28,
+ 0x80, 0x7e, 0x11, 0x0d, 0xdd, 0xc7, 0xcc, 0xcc, 0xe6, 0x74, 0xab, 0x81,
+ 0xdb, 0xfa, 0x54, 0xc1, 0xf6, 0x4f, 0x6a, 0x52, 0x8d, 0x3f, 0xcb, 0x6e,
+ 0x3f, 0xc2, 0x98, 0xb8, 0x23, 0x1b, 0x13, 0x57, 0x08, 0xaa, 0x77, 0x58,
+ 0x8b, 0xb6, 0xa6, 0x02, 0xf9, 0x86, 0xc3, 0x13, 0x45, 0x0a, 0xd5, 0x6b,
+ 0x9b, 0x56, 0x27, 0x3b, 0x8e, 0x9a, 0x1b, 0x56, 0x1d, 0xb7, 0x3b, 0x31,
+ 0x48, 0x34, 0xaf, 0x54, 0x73, 0xb3, 0x12, 0x25, 0x7c, 0x54, 0x39, 0x6a,
+ 0x15, 0xc3, 0xb5, 0x12, 0x3e, 0x8d, 0x10, 0x9b, 0x58, 0xd1, 0x33, 0xa3,
+ 0xea, 0x64, 0x24, 0x74, 0xda, 0xdd, 0x0e, 0xcc, 0x8e, 0x3c, 0xfa, 0xe2,
+ 0xbd, 0x53, 0xcc, 0x41, 0x36, 0xa2, 0x12, 0x44, 0x2d, 0x96, 0x14, 0x49,
+ 0x03, 0x41, 0x4d, 0x38, 0xaa, 0xaa, 0x41, 0x9c, 0x88, 0x12, 0x46, 0xfb,
+ 0xf7, 0x45, 0x45, 0x58, 0xc0, 0x0d, 0x9d, 0x96, 0x9c, 0x7e, 0x19, 0x1a,
+ 0x74, 0x5e, 0x3c, 0x43, 0xa6, 0xed, 0x49, 0x2f, 0xfe, 0xac, 0x44, 0xdb,
+ 0xd3, 0x12, 0x6d, 0x2f, 0x22, 0xd1, 0x6e, 0xce, 0x17, 0x69, 0xeb, 0x6a,
+ 0x1c, 0x59, 0x99, 0x74, 0x19, 0x99, 0xac, 0x02, 0x34, 0xc9, 0x93, 0x1c,
+ 0x90, 0x86, 0x9a, 0x9e, 0x3a, 0x22, 0x10, 0xfb, 0x0c, 0xd3, 0x41, 0x57,
+ 0xcc, 0x35, 0xd1, 0x0d, 0x4e, 0x9b, 0x3b, 0x44, 0xce, 0xd7, 0xe7, 0xbb,
+ 0x6f, 0x13, 0x10, 0x2b, 0x5d, 0x6e, 0xed, 0xed, 0x31, 0x59, 0xd0, 0xb3,
+ 0x0c, 0x9d, 0x3e, 0x67, 0x51, 0xbb, 0x4e, 0x2e, 0xe9, 0x59, 0xd5, 0xef,
+ 0xcf, 0x2e, 0xb0, 0x9d, 0x91, 0x2a, 0x66, 0xac, 0xed, 0x69, 0xbc, 0x92,
+ 0xa3, 0x51, 0xbb, 0xcf, 0x51, 0x01, 0x97, 0x4f, 0xac, 0x6e, 0xac, 0xc7,
+ 0xaa, 0x98, 0xa8, 0x92, 0xb3, 0x91, 0x58, 0x4f, 0x55, 0x7b, 0x69, 0x6e,
+ 0xe5, 0xa5, 0xee, 0x39, 0x61, 0xcd, 0xd2, 0xdf, 0x68, 0x53, 0x95, 0x0a,
+ 0x40, 0xf3, 0x4b, 0x4f, 0x6e, 0x24, 0xcb, 0x8c, 0xe9, 0x0b, 0x01, 0xd3,
+ 0x1e, 0x62, 0x72, 0xee, 0xe1, 0xf6, 0xb3, 0x61, 0x69, 0x63, 0xa6, 0xaf,
+ 0x90, 0xdd, 0xa1, 0x1b, 0x4a, 0xf8, 0x1d, 0xf9, 0xa4, 0x3e, 0x1b, 0xac,
+ 0xf4, 0xf1, 0x21, 0x74, 0xfc, 0xf8, 0x90, 0x3b, 0xee, 0x0c, 0xc4, 0x12,
+ 0x1b, 0x57, 0xe8, 0xb4, 0x99, 0x32, 0xcd, 0xf1, 0xc0, 0xbb, 0xb1, 0x9e,
+ 0x3d, 0xe7, 0x1b, 0xd3, 0x12, 0x6d, 0x72, 0x5d, 0x09, 0x0f, 0x43, 0x27,
+ 0x1f, 0x6c, 0x78, 0x78, 0x42, 0x9b, 0x00, 0xd8, 0xdd, 0xa7, 0x99, 0x72,
+ 0x6e, 0x56, 0x75, 0x00, 0xde, 0x64, 0x73, 0x88, 0xaa, 0xac, 0x24, 0xc5,
+ 0x2f, 0xa8, 0x5a, 0xa4, 0x34, 0x17, 0x4a, 0x76, 0x92, 0x23, 0x1e, 0x4e,
+ 0xa4, 0x3e, 0x38, 0x2a, 0x0f, 0x6a, 0x14, 0xc1, 0x8a, 0x88, 0x2b, 0x87,
+ 0x00, 0x05, 0x43, 0xb8, 0x82, 0x98, 0xe0, 0x5c, 0x7f, 0xce, 0xc6, 0x07,
+ 0xbb, 0x0a, 0x39, 0xc0, 0x71, 0x1a, 0x3e, 0xdf, 0xe6, 0xf7, 0xbd, 0x57,
+ 0xc2, 0xe5, 0x3d, 0x27, 0xd6, 0x7f, 0x07, 0xfb, 0xc5, 0xa6, 0x36, 0x60,
+ 0x70, 0x53, 0xf5, 0x16, 0x8c, 0xba, 0x4d, 0xd3, 0x0b, 0xd7, 0xce, 0x16,
+ 0x94, 0xc2, 0x44, 0x2a, 0x2c, 0x16, 0xa2, 0x92, 0xa4, 0xc8, 0xb5, 0xcc,
+ 0x96, 0x7e, 0xa6, 0xe6, 0xa6, 0x80, 0x6e, 0x22, 0x21, 0x21, 0xde, 0xc9,
+ 0xd4, 0x4b, 0x3c, 0x76, 0x88, 0xe8, 0x1c, 0x42, 0x12, 0x78, 0x12, 0xda,
+ 0xb1, 0x62, 0x49, 0xe6, 0x4a, 0xf1, 0xd0, 0x80, 0x48, 0x39, 0x86, 0x89,
+ 0x86, 0x92, 0x2c, 0x0c, 0xba, 0x12, 0x26, 0x2c, 0x56, 0x08, 0xb0, 0xce,
+ 0x0c, 0xfe, 0x79, 0xf4, 0x40, 0x2c, 0xa8, 0xb4, 0x27, 0x05, 0x95, 0x08,
+ 0xcf, 0x02, 0x8e, 0x40, 0xc6, 0xc3, 0x45, 0x74, 0x14, 0x02, 0xb9, 0x40,
+ 0x2b, 0xb4, 0xfc, 0xe0, 0x76, 0x13, 0xa6, 0x2f, 0xdb, 0x54, 0x78, 0xeb,
+ 0xad, 0x97, 0x09, 0x5b, 0x5d, 0xc1, 0xb9, 0x71, 0xe1, 0x82, 0x3d, 0x06,
+ 0x5d, 0x45, 0x89, 0x4c, 0x6f, 0xfa, 0x32, 0x38, 0xec, 0x2f, 0x5f, 0xfd,
+ 0x90, 0xa4, 0x43, 0xa3, 0x3b, 0x7e, 0xd7, 0x18, 0x66, 0xb7, 0x50, 0x83,
+ 0x30, 0x29, 0x27, 0xfd, 0xd8, 0xe8, 0x2e, 0xc1, 0x8e, 0xbc, 0xf9, 0xcb,
+ 0x2f, 0xbf, 0x6c, 0x3e, 0xee, 0xf6, 0xff, 0xe3, 0xbe, 0x00, 0xeb, 0xc4,
+ 0x26, 0xc3, 0x20, 0xdc, 0x4c, 0x48, 0x72, 0x30, 0x7f, 0xe5, 0xc2, 0xe6,
+ 0x1c, 0x6c, 0x22, 0xe8, 0x0b, 0xe9, 0x4c, 0xa1, 0x2f, 0xb9, 0x52, 0x3e,
+ 0x78, 0xb1, 0xfe, 0x50, 0x5f, 0x8c, 0x3d, 0x29, 0x25, 0x14, 0x83, 0xe5,
+ 0x9d, 0xaa, 0x39, 0x58, 0x07, 0x56, 0x24, 0x91, 0xb8, 0x8a, 0x11, 0x94,
+ 0xe8, 0x89, 0xc6, 0x27, 0xb0, 0xc7, 0x4f, 0x90, 0x60, 0x34, 0x10, 0xff,
+ 0xea, 0xca, 0xc3, 0x6c, 0xf2, 0x50, 0x94, 0xa0, 0x2f, 0xde, 0xa8, 0x4a,
+ 0xf5, 0x96, 0xb0, 0x3d, 0x87, 0xe3, 0x02, 0xcc, 0x61, 0x40, 0xa3, 0x19,
+ 0x27, 0x75, 0xa5, 0x67, 0x5d, 0xe3, 0x51, 0x8b, 0x99, 0x67, 0xe9, 0x9f,
+ 0xef, 0x53, 0x23, 0xb2, 0xa9, 0x79, 0x8d, 0x42, 0x7d, 0x62, 0xbf, 0x35,
+ 0xd1, 0xa0, 0xef, 0x88, 0xee, 0x53, 0xc2, 0x6f, 0x96, 0x4e, 0x10, 0x02,
+ 0x6c, 0x09, 0x17, 0x1a, 0xfa, 0xe0, 0xb4, 0x92, 0xa7, 0xc6, 0xd0, 0x36,
+ 0xaa, 0x24, 0xc6, 0xb9, 0x1b, 0x26, 0xf1, 0x40, 0x61, 0x5e, 0x9c, 0x6d,
+ 0xe9, 0xf2, 0x7e, 0x81, 0xf1, 0xe4, 0x65, 0x39, 0x83, 0xc0, 0x8a, 0xc7,
+ 0x74, 0x42, 0x2e, 0x6e, 0x08, 0xaf, 0x0b, 0x5c, 0xa9, 0x16, 0x43, 0x41,
+ 0xc5, 0x5a, 0xe2, 0x18, 0x1d, 0xb0, 0x20, 0x46, 0xf1, 0xb9, 0x47, 0xa0,
+ 0xec, 0x1f, 0xc1, 0x27, 0x98, 0xfd, 0x49, 0x98, 0x87, 0xb6, 0xa2, 0x02,
+ 0x1e, 0x7d, 0x93, 0x49, 0x31, 0x69, 0xd7, 0xd6, 0x24, 0xe6, 0x92, 0xc1,
+ 0x7e, 0x74, 0x0f, 0x11, 0xf7, 0x20, 0x8e, 0x9d, 0x6b, 0xcf, 0xbb, 0x9a,
+ 0xaa, 0xd8, 0x2e, 0x12, 0xf0, 0xb9, 0xc7, 0x5e, 0xdd, 0xd6, 0xaa, 0x3f,
+ 0xf7, 0xf6, 0x19, 0x4e, 0x16, 0x4e, 0xbe, 0xa3, 0x39, 0x35, 0x1c, 0xb4,
+ 0x33, 0xda, 0x0f, 0xf3, 0x88, 0x56, 0x89, 0x65, 0xe8, 0xf1, 0x4f, 0xa8,
+ 0x12, 0xeb, 0x9f, 0x7d, 0xf1, 0x47, 0x24, 0xa6, 0x16, 0x0d, 0x5b, 0xea,
+ 0xcb, 0x92, 0x0a, 0x94, 0x35, 0x90, 0xf7, 0xce, 0xc9, 0x1e, 0x36, 0xc7,
+ 0xa0, 0xef, 0xbd, 0xca, 0x97, 0xf2, 0xe9, 0x8d, 0x6e, 0xe0, 0xc8, 0x97,
+ 0x31, 0xc1, 0xa8, 0xf3, 0x1a, 0xff, 0xce, 0x75, 0xde, 0x85, 0x52, 0x78,
+ 0x9d, 0xcb, 0x7a, 0x79, 0x9d, 0x6f, 0xb9, 0x88, 0x80, 0x8a, 0xc9, 0x9d,
+ 0x76, 0x07, 0x61, 0x25, 0x7b, 0x2e, 0x30, 0xdf, 0x54, 0x67, 0xe7, 0xca,
+ 0xb7, 0x24, 0x2e, 0xa0, 0x38, 0xb2, 0x2c, 0xfa, 0x14, 0x6f, 0x21, 0x37,
+ 0x59, 0x02, 0xf0, 0x8d, 0x8b, 0x91, 0x4a, 0x60, 0xc1, 0x19, 0x57, 0xc7,
+ 0xb8, 0x82, 0xe3, 0xce, 0xc2, 0xdf, 0xdf, 0x18, 0x29, 0x10, 0x96, 0x46,
+ 0x70, 0x7c, 0xe4, 0xfa, 0x83, 0xc5, 0xc3, 0xff, 0x03, 0xa0, 0x5d, 0x8d,
+ 0x34, 0x15, 0xde, 0xf1, 0x57, 0x30, 0x3f, 0xb4, 0x01, 0xff, 0xe3, 0x24,
+ 0xf9, 0xab, 0x44, 0x12, 0xd3, 0xd7, 0xf0, 0x56, 0x29, 0x73, 0x36, 0x49,
+ 0xcc, 0xe2, 0xdb, 0xf3, 0xd0, 0x1c, 0x83, 0xbb, 0xd6, 0x4d, 0xc8, 0x1d,
+ 0x77, 0xdc, 0x39, 0xdc, 0xb5, 0x5d, 0xe1, 0xd6, 0xf3, 0x63, 0x09, 0x03,
+ 0x8d, 0xbc, 0xe7, 0xc3, 0x7f, 0x35, 0x74, 0xf0, 0x49, 0xf5, 0x14, 0xa4,
+ 0x78, 0xbe, 0x00, 0x78, 0xea, 0x5e, 0x58, 0x78, 0x1c, 0x4b, 0xec, 0x94,
+ 0x18, 0xad, 0x88, 0x15, 0x0c, 0x9f, 0x93, 0xf2, 0x12, 0x48, 0x05, 0x23,
+ 0x34, 0x5e, 0x51, 0x5d, 0x8c, 0xc5, 0xa7, 0x41, 0x2c, 0xcc, 0x2f, 0x59,
+ 0x07, 0xb1, 0xd1, 0x73, 0x4d, 0x6f, 0x34, 0x6d, 0x34, 0x44, 0x08, 0xc5,
+ 0x52, 0x13, 0x1c, 0x01, 0x66, 0xeb, 0x67, 0x45, 0x47, 0x68, 0xff, 0x40,
+ 0xdc, 0xf4, 0xd1, 0x42, 0x8f, 0x75, 0x03, 0xa2, 0xab, 0x95, 0x05, 0x84,
+ 0xfc, 0xd8, 0x0d, 0x00, 0x54, 0xc0, 0xf3, 0x82, 0xb2, 0x48, 0xd8, 0x19,
+ 0xc2, 0x95, 0xca, 0x05, 0x7b, 0x1c, 0xa3, 0xf7, 0xbe, 0xa0, 0xd0, 0xb9,
+ 0x8f, 0x42, 0xe7, 0xfe, 0xbe, 0x06, 0x99, 0x3e, 0xb5, 0x41, 0x01, 0xd8,
+ 0x51, 0xeb, 0xec, 0x61, 0x31, 0xb3, 0x89, 0x90, 0x13, 0x68, 0x20, 0xba,
+ 0x9b, 0xa4, 0xa3, 0x51, 0x3a, 0x49, 0xee, 0x20, 0xfc, 0x7e, 0x2c, 0x33,
+ 0x27, 0x95, 0x84, 0xac, 0x93, 0x9d, 0x9c, 0xf8, 0x9e, 0x1b, 0xdd, 0x7a,
+ 0xe2, 0xc9, 0xbf, 0xa1, 0x41, 0x20, 0xa4, 0x5e, 0x26, 0x37, 0x52, 0xb0,
+ 0xb4, 0x10, 0x96, 0x9d, 0xb7, 0x2f, 0x07, 0xe8, 0x95, 0x59, 0x0e, 0x20,
+ 0xa2, 0x63, 0xab, 0x08, 0x63, 0x76, 0x5b, 0x1f, 0xb6, 0xbd, 0xa7, 0x26,
+ 0xf5, 0x8d, 0xe4, 0xdf, 0xa7, 0xf2, 0x37, 0x50, 0x31, 0x94, 0x41, 0xb0,
+ 0x55, 0x0d, 0x2d, 0x8c, 0x3b, 0x68, 0x1a, 0x52, 0x2a, 0xf2, 0x3e, 0x40,
+ 0xca, 0x70, 0x40, 0x44, 0xa5, 0x59, 0x0c, 0x31, 0xb1, 0x91, 0x40, 0x43,
+ 0x9b, 0xc9, 0x55, 0xb9, 0xf1, 0xc5, 0xb2, 0x07, 0xaf, 0x90, 0x4c, 0xf2,
+ 0x0a, 0xe6, 0xbc, 0x5c, 0xee, 0xd8, 0x3d, 0x70, 0x0a, 0x67, 0xd5, 0xd6,
+ 0x64, 0x4f, 0x05, 0x39, 0x7b, 0xec, 0xe1, 0xe0, 0xd2, 0x4e, 0xfd, 0x63,
+ 0x04, 0x06, 0x0d, 0xbb, 0x0c, 0xfe, 0xc6, 0x8c, 0x3a, 0x66, 0xc0, 0x8d,
+ 0x53, 0xf3, 0x8f, 0x04, 0x07, 0xad, 0xaf, 0x7d, 0x8f, 0x87, 0xd6, 0x37,
+ 0xf8, 0xef, 0xdf, 0xd6, 0x36, 0xbe, 0x9f, 0x9f, 0x07, 0x0b, 0xd3, 0x2f,
+ 0x9d, 0x79, 0xa8, 0xeb, 0x46, 0x78, 0xea, 0x84, 0x67, 0x5d, 0xa5, 0x93,
+ 0xe1, 0x71, 0xe8, 0xf7, 0x32, 0x79, 0x76, 0x27, 0xe9, 0x0d, 0x31, 0x13,
+ 0x1d, 0xbf, 0xd3, 0x9d, 0xdb, 0xeb, 0x75, 0xb5, 0xdd, 0x93, 0x1a, 0xaa,
+ 0x4b, 0xd6, 0x6b, 0x84, 0x14, 0xa3, 0x78, 0xff, 0xf1, 0xec, 0xc6, 0x36,
+ 0xfe, 0x56, 0xdf, 0xda, 0x86, 0x48, 0x2c, 0x9f, 0xd3, 0x86, 0xb6, 0xbf,
+ 0x85, 0xdc, 0x62, 0x2b, 0xb4, 0xa1, 0x7d, 0xd6, 0x77, 0x60, 0x9d, 0xed,
+ 0xfd, 0x9d, 0xf0, 0x1d, 0x41, 0xd5, 0xf0, 0x1f, 0x60, 0x4b, 0xcc, 0x91,
+ 0xbe, 0x80, 0x0a, 0x22, 0x6b, 0x88, 0x74, 0xf1, 0x85, 0x16, 0xb0, 0xf9,
+ 0xfc, 0x05, 0xfc, 0xe6, 0xbf, 0x7a, 0x01, 0x3f, 0x7d, 0x72, 0xe7, 0xcb,
+ 0x8e, 0x18, 0x42, 0x30, 0x37, 0x94, 0xa3, 0x74, 0x6e, 0x54, 0x36, 0x33,
+ 0x6a, 0xdb, 0x8f, 0xe7, 0x33, 0x8e, 0xc7, 0xac, 0xcf, 0x13, 0x05, 0x8c,
+ 0x1a, 0x38, 0x7e, 0x72, 0xc1, 0x6c, 0xc2, 0x7e, 0xc9, 0x37, 0xae, 0xb8,
+ 0xb9, 0xae, 0x00, 0xc3, 0x2e, 0x9f, 0xa5, 0x10, 0x52, 0x2d, 0x67, 0xd7,
+ 0x11, 0x6f, 0xe4, 0xa0, 0x87, 0xe2, 0x4c, 0x8c, 0xd4, 0x2a, 0x42, 0xb4,
+ 0x7e, 0x61, 0x80, 0x8e, 0xcd, 0x87, 0xd6, 0x49, 0xe4, 0xa8, 0xf0, 0x4a,
+ 0x9a, 0x60, 0x0e, 0x80, 0x3a, 0x5e, 0x48, 0x56, 0xc2, 0x59, 0x8e, 0x77,
+ 0x5f, 0x95, 0x85, 0x58, 0x0a, 0xe1, 0x55, 0x9e, 0xa7, 0xf3, 0xd7, 0x73,
+ 0x82, 0xc1, 0xfb, 0x08, 0xd8, 0xce, 0x05, 0x94, 0x3a, 0xe1, 0xca, 0x45,
+ 0xfb, 0x92, 0x8f, 0x0d, 0x4e, 0x42, 0xec, 0x21, 0x09, 0x01, 0xae, 0x54,
+ 0x8e, 0x52, 0x14, 0xa8, 0x92, 0xac, 0x8a, 0xf6, 0x70, 0x83, 0x56, 0xef,
+ 0xc4, 0xc5, 0x91, 0x8a, 0xb8, 0x2e, 0x41, 0x65, 0x9d, 0x9c, 0x9a, 0x7f,
+ 0x63, 0x8f, 0xe6, 0x46, 0x73, 0x75, 0xe5, 0xf7, 0x6c, 0x52, 0x84, 0xbf,
+ 0x7f, 0x63, 0x7f, 0x87, 0x5f, 0xe4, 0x0e, 0x68, 0x88, 0xb2, 0x32, 0xf8,
+ 0xb6, 0xef, 0xe5, 0x36, 0xae, 0x59, 0x91, 0xde, 0xd8, 0x8a, 0x10, 0x58,
+ 0x81, 0x02, 0x74, 0x09, 0xb0, 0x08, 0x4e, 0xa1, 0xf9, 0x2c, 0x1d, 0xbb,
+ 0x8a, 0x15, 0x96, 0x60, 0x01, 0xe2, 0x2d, 0x18, 0x07, 0x47, 0x14, 0xd8,
+ 0x9a, 0x3f, 0x29, 0xf9, 0x9a, 0xc7, 0x02, 0x68, 0xc9, 0x21, 0xfa, 0x94,
+ 0xe6, 0x41, 0xe5, 0x14, 0xa8, 0xf2, 0x03, 0xe6, 0x83, 0xf4, 0xa5, 0x3c,
+ 0x10, 0x84, 0x41, 0x32, 0xd0, 0x94, 0x14, 0xac, 0x70, 0x85, 0xee, 0xa3,
+ 0x10, 0xd3, 0x3e, 0xd2, 0xa4, 0x0a, 0xa6, 0x51, 0x1b, 0x4c, 0x42, 0x21,
+ 0x53, 0x3f, 0x68, 0x98, 0x72, 0x00, 0xd9, 0x98, 0x28, 0x30, 0x51, 0x66,
+ 0xef, 0x14, 0x25, 0x25, 0xc2, 0x41, 0x8f, 0x26, 0x08, 0x8b, 0x3e, 0x9b,
+ 0x62, 0x19, 0x1d, 0x8c, 0x26, 0x62, 0x3c, 0xe4, 0x4a, 0x04, 0x72, 0x52,
+ 0xdc, 0x64, 0x4f, 0x22, 0x01, 0x0a, 0xe9, 0x42, 0x9d, 0x75, 0xdc, 0x0b,
+ 0x64, 0xbd, 0x9c, 0x64, 0x0f, 0xd9, 0x34, 0xa7, 0x4c, 0x74, 0x9e, 0xe3,
+ 0x92, 0x33, 0x5f, 0x58, 0xf0, 0x46, 0x02, 0x57, 0xc8, 0x59, 0x5e, 0x88,
+ 0x6a, 0x7a, 0x07, 0x16, 0xac, 0xa9, 0x07, 0x17, 0xac, 0x82, 0xf1, 0xfd,
+ 0x28, 0xd1, 0x98, 0x69, 0x6b, 0x64, 0xc6, 0xc0, 0xa6, 0x5f, 0xfa, 0x92,
+ 0x57, 0xed, 0xbe, 0x64, 0x63, 0x16, 0xdb, 0x0d, 0xcd, 0x51, 0xd8, 0x23,
+ 0x0b, 0x83, 0x86, 0x48, 0x7f, 0x14, 0xb1, 0xaa, 0x55, 0x51, 0x46, 0x92,
+ 0x9f, 0x08, 0x61, 0x2d, 0xd7, 0x61, 0xec, 0x17, 0x36, 0xa3, 0x4a, 0xb1,
+ 0xc4, 0x62, 0x49, 0x06, 0x19, 0x29, 0x26, 0x79, 0x39, 0x52, 0x50, 0x3e,
+ 0x7f, 0x69, 0x01, 0x02, 0x5f, 0x36, 0x1e, 0x00, 0x46, 0xc3, 0xbc, 0xfb,
+ 0x29, 0x5b, 0x0d, 0x52, 0xd8, 0xec, 0xfd, 0x90, 0x75, 0x62, 0x6f, 0x32,
+ 0xf4, 0xe8, 0x77, 0xcd, 0xa6, 0xfd, 0x56, 0x8b, 0xab, 0xd3, 0x41, 0xe1,
+ 0xd7, 0x55, 0xc7, 0x6b, 0xd5, 0x8a, 0xea, 0xf3, 0xea, 0xa9, 0xab, 0x72,
+ 0xef, 0xcb, 0xc4, 0x79, 0xcc, 0xad, 0xa7, 0xce, 0xda, 0x92, 0x86, 0x6d,
+ 0xfa, 0x7c, 0xf0, 0x88, 0xe8, 0x43, 0xdc, 0x16, 0x1f, 0x22, 0x9d, 0x48,
+ 0x66, 0x6b, 0x01, 0x14, 0x85, 0x2a, 0xf3, 0x8a, 0xa7, 0xe4, 0xbc, 0x2a,
+ 0xee, 0x62, 0xc4, 0x34, 0xdd, 0xa7, 0x30, 0x5c, 0xc3, 0x51, 0x86, 0x05,
+ 0x5a, 0x7d, 0x6d, 0x9b, 0xc8, 0x1b, 0x21, 0x0b, 0x67, 0x81, 0xf8, 0xdb,
+ 0xac, 0x17, 0x7e, 0x91, 0x13, 0x2e, 0x30, 0x25, 0x59, 0xf4, 0xb0, 0xcf,
+ 0x5a, 0xe5, 0xbd, 0x5a, 0xc4, 0xec, 0x4f, 0xd5, 0x76, 0x7f, 0xf8, 0x22,
+ 0xc5, 0x98, 0xa9, 0x50, 0xe9, 0x71, 0x6d, 0x7d, 0x25, 0xed, 0x2c, 0x4a,
+ 0xe6, 0xf9, 0x8a, 0x72, 0xaf, 0x52, 0x76, 0xab, 0x5a, 0x29, 0x5b, 0x09,
+ 0x01, 0x9f, 0x63, 0x3d, 0x9d, 0xc0, 0x58, 0x0d, 0xec, 0xb7, 0xeb, 0xd9,
+ 0xc4, 0x04, 0xc4, 0xca, 0x02, 0xb2, 0x07, 0xc9, 0x86, 0x0c, 0x99, 0xc6,
+ 0x86, 0x19, 0xa4, 0x47, 0x00, 0xdb, 0x82, 0x28, 0x70, 0x2a, 0xb9, 0x60,
+ 0xcf, 0x7b, 0xce, 0x5e, 0x57, 0x70, 0xad, 0x94, 0x89, 0x31, 0x86, 0x63,
+ 0x3f, 0xc5, 0x0f, 0x95, 0x67, 0x2c, 0x4a, 0x72, 0xdd, 0xdb, 0x19, 0xd6,
+ 0x64, 0x3c, 0xce, 0xfa, 0x70, 0xce, 0xf2, 0xd1, 0xfc, 0x47, 0x25, 0x74,
+ 0xb3, 0x69, 0x0f, 0xeb, 0x25, 0x4d, 0x7b, 0x2d, 0x9f, 0x71, 0xd5, 0xd9,
+ 0xf5, 0x80, 0x3d, 0x26, 0xeb, 0xb7, 0x93, 0x02, 0x93, 0x48, 0x8a, 0x81,
+ 0xd9, 0x9b, 0x37, 0x69, 0xff, 0xfd, 0xf7, 0x1b, 0xa1, 0x6d, 0x0e, 0x73,
+ 0x7a, 0xd7, 0x81, 0x7f, 0x35, 0x93, 0xf5, 0x07, 0xa3, 0x40, 0xa2, 0x9c,
+ 0xf2, 0x07, 0xa6, 0x0e, 0x6f, 0x7c, 0xd3, 0x84, 0xdf, 0x77, 0xbe, 0x89,
+ 0x3c, 0x85, 0x47, 0x76, 0x3a, 0x79, 0x6a, 0x41, 0xe3, 0xc9, 0xfa, 0x5f,
+ 0xcd, 0x7d, 0xed, 0x51, 0xfe, 0xf1, 0xc4, 0x3c, 0xfa, 0x57, 0xf8, 0x15,
+ 0xbf, 0x6c, 0x7c, 0xe3, 0x79, 0xbf, 0x76, 0x2b, 0x66, 0xbf, 0x11, 0x2c,
+ 0x6b, 0xd5, 0xe8, 0x87, 0xab, 0xbd, 0x8c, 0xc9, 0x0f, 0x9f, 0x17, 0x63,
+ 0x9f, 0xf7, 0x54, 0xd4, 0xd4, 0x97, 0xcc, 0xb3, 0xf4, 0x51, 0x35, 0x28,
+ 0xb2, 0x0f, 0x61, 0xbb, 0x73, 0x0d, 0x7d, 0x89, 0x6f, 0xe7, 0x4b, 0x2d,
+ 0xf0, 0xaf, 0x26, 0x12, 0x30, 0xd3, 0x79, 0x56, 0xba, 0x6a, 0xf5, 0xf0,
+ 0x4f, 0xb4, 0x07, 0xea, 0x38, 0x87, 0xaa, 0x95, 0x4d, 0xdb, 0xa5, 0x82,
+ 0xd4, 0x21, 0xb1, 0x30, 0x2b, 0x6f, 0x9c, 0x91, 0x61, 0xc0, 0xb3, 0xc3,
+ 0xe0, 0x01, 0xf9, 0x44, 0x22, 0x72, 0x27, 0xfc, 0xd5, 0x81, 0x06, 0xb9,
+ 0x43, 0x7f, 0x09, 0xb3, 0xcf, 0x2b, 0xbd, 0xb6, 0xcf, 0x77, 0xb8, 0xcc,
+ 0xb3, 0xfc, 0x30, 0x53, 0x60, 0x8d, 0x97, 0x79, 0xc3, 0x32, 0x3a, 0xef,
+ 0x1a, 0x1b, 0xb5, 0xd7, 0x6a, 0x82, 0x0b, 0xc0, 0x13, 0xb2, 0x9c, 0x95,
+ 0x22, 0xd0, 0xfe, 0x6a, 0xc3, 0x0d, 0x4c, 0x83, 0x1b, 0xdf, 0xac, 0x25,
+ 0x41, 0xe6, 0xee, 0x52, 0x5d, 0xac, 0xbb, 0x61, 0x43, 0x35, 0x57, 0xa3,
+ 0xd6, 0xea, 0xeb, 0x38, 0x3d, 0x5d, 0x36, 0x8d, 0x45, 0x7d, 0x3a, 0x7f,
+ 0xca, 0x69, 0x52, 0x3a, 0x0c, 0x21, 0x4b, 0x76, 0xae, 0x8c, 0xd5, 0x3d,
+ 0xb0, 0x5f, 0x5f, 0xf1, 0x15, 0x2b, 0x5d, 0x3b, 0xf9, 0x82, 0x65, 0x3f,
+ 0xb7, 0xb7, 0x08, 0xe5, 0x59, 0x43, 0xb5, 0xea, 0x18, 0x0a, 0x9e, 0x64,
+ 0xca, 0xc7, 0x34, 0xd4, 0x8e, 0x8e, 0x1f, 0xb3, 0x89, 0x0c, 0xb3, 0x66,
+ 0x6c, 0x73, 0x5b, 0x1a, 0x10, 0xc1, 0x3a, 0x38, 0x70, 0x55, 0x90, 0x93,
+ 0x7d, 0x4b, 0x7c, 0x5b, 0x42, 0x57, 0xc3, 0x80, 0x73, 0x5f, 0x9c, 0x8c,
+ 0x2d, 0x84, 0x8b, 0x22, 0x3e, 0x9f, 0x11, 0x90, 0x07, 0xc5, 0x75, 0x97,
+ 0x61, 0xf5, 0x33, 0x10, 0x1e, 0x50, 0x19, 0xb5, 0x31, 0xb1, 0xb5, 0xe1,
+ 0xe7, 0x16, 0x2f, 0xd9, 0xe3, 0xae, 0xda, 0x1d, 0xb4, 0xf0, 0xb0, 0xf1,
+ 0xf8, 0xdf, 0x52, 0x8e, 0x24, 0xe5, 0x30, 0x4a, 0xff, 0x98, 0x0d, 0xff,
+ 0xb8, 0xf9, 0x23, 0xff, 0x23, 0x1b, 0x99, 0x03, 0xa0, 0xd6, 0xb1, 0x04,
+ 0x27, 0xc5, 0x6d, 0x01, 0xa5, 0x17, 0xcc, 0x07, 0x9a, 0x37, 0xfc, 0xc8,
+ 0x61, 0x4d, 0x27, 0xf4, 0xfb, 0x64, 0x74, 0x12, 0x71, 0x3e, 0xdd, 0xa8,
+ 0x72, 0xcd, 0x95, 0x13, 0xa6, 0x1a, 0x68, 0x61, 0x63, 0xd3, 0x2d, 0x73,
+ 0xb2, 0xc1, 0x42, 0xad, 0x97, 0x70, 0xde, 0xd5, 0x45, 0x5a, 0xd4, 0xe0,
+ 0x31, 0xdb, 0xa7, 0x43, 0x14, 0xfe, 0x99, 0x40, 0x7e, 0x97, 0x65, 0xd1,
+ 0x87, 0xe0, 0x31, 0x5c, 0xb3, 0x16, 0x06, 0x5d, 0x4b, 0xf2, 0x4c, 0x7d,
+ 0x45, 0x2f, 0x6d, 0xcf, 0x28, 0x3d, 0xd3, 0x4f, 0x4d, 0x66, 0x84, 0xb7,
+ 0xb5, 0x28, 0x71, 0x93, 0xe0, 0x7d, 0x9e, 0x01, 0x55, 0x51, 0x93, 0xd7,
+ 0x58, 0x07, 0x1f, 0xa1, 0x9e, 0x84, 0x5c, 0x82, 0x19, 0x57, 0x5a, 0xd4,
+ 0x6a, 0x3c, 0x4f, 0x02, 0x84, 0xa7, 0xf7, 0x8b, 0x3b, 0x28, 0x28, 0x80,
+ 0x35, 0xe9, 0x95, 0x59, 0xc7, 0xd7, 0xde, 0xfc, 0x34, 0xc1, 0x4d, 0x3d,
+ 0xde, 0x6a, 0x1c, 0x88, 0x2d, 0xaf, 0x03, 0x6f, 0xa9, 0xad, 0xc7, 0x77,
+ 0x5d, 0x30, 0x64, 0x23, 0x2b, 0xeb, 0x3e, 0xd6, 0x44, 0x09, 0xa5, 0xed,
+ 0x25, 0x8e, 0x1a, 0x01, 0xc6, 0xc9, 0x3a, 0xa4, 0x55, 0xd8, 0x76, 0x1d,
+ 0x30, 0xa1, 0x69, 0xda, 0xe8, 0x62, 0xe9, 0x0d, 0x42, 0xc7, 0xe0, 0xe1,
+ 0xef, 0x7c, 0x5a, 0xf1, 0xf2, 0x7a, 0x75, 0xf9, 0x9c, 0x85, 0x84, 0x56,
+ 0x2c, 0x2e, 0x17, 0xc8, 0xd0, 0x37, 0x6a, 0xd5, 0x10, 0x1d, 0xb7, 0xf6,
+ 0x1d, 0x0a, 0x0f, 0xf0, 0x34, 0x92, 0xb3, 0xa4, 0x83, 0x32, 0xea, 0x77,
+ 0x42, 0x83, 0xa3, 0x17, 0x4f, 0xfd, 0xe5, 0x90, 0xd2, 0x25, 0x7e, 0x56,
+ 0x97, 0xc6, 0x14, 0x27, 0xb8, 0x10, 0xe0, 0x8c, 0x2a, 0x9f, 0xde, 0xc7,
+ 0x86, 0x12, 0xec, 0x38, 0x14, 0xa4, 0x33, 0x1f, 0xdf, 0xc3, 0x6e, 0x1e,
+ 0xa9, 0xbc, 0x11, 0x59, 0x9e, 0xe7, 0x04, 0x7e, 0x04, 0xd4, 0x54, 0x2b,
+ 0x89, 0xa8, 0x3c, 0x45, 0xb8, 0xd1, 0xab, 0x16, 0xac, 0xae, 0x55, 0xe2,
+ 0x39, 0x18, 0x6d, 0xe7, 0x4f, 0xc7, 0x73, 0x98, 0x77, 0x9c, 0x83, 0x8e,
+ 0x49, 0x7f, 0xf1, 0x86, 0xc5, 0x49, 0x98, 0x73, 0x92, 0x2d, 0xb1, 0x31,
+ 0xd7, 0x7f, 0x6c, 0x33, 0x1a, 0x7b, 0xfd, 0xd9, 0x62, 0x4f, 0xcc, 0x5b,
+ 0x28, 0x61, 0x89, 0x3f, 0xcc, 0x89, 0x39, 0xf1, 0x9b, 0x3b, 0x27, 0xe2,
+ 0xa0, 0x29, 0x57, 0x5f, 0x6a, 0x30, 0x7a, 0x3f, 0x21, 0xc3, 0x32, 0xe8,
+ 0xa6, 0x5b, 0x60, 0x6f, 0x65, 0xd1, 0x60, 0x30, 0x99, 0x0d, 0xb3, 0x7a,
+ 0x6b, 0xbe, 0x8d, 0xc7, 0x4a, 0x16, 0x87, 0x63, 0x81, 0x71, 0x43, 0xe2,
+ 0xb1, 0x72, 0x8f, 0x01, 0xe9, 0xa8, 0x45, 0x8e, 0x15, 0xf5, 0x2d, 0x68,
+ 0x14, 0x0d, 0x5a, 0x66, 0xc3, 0x5b, 0x57, 0x53, 0x8b, 0xe4, 0xf4, 0x68,
+ 0x04, 0x56, 0xf2, 0x69, 0xd3, 0x10, 0xd2, 0x9b, 0x3f, 0x78, 0x32, 0x7e,
+ 0x07, 0xc8, 0xf6, 0xce, 0x1e, 0x8b, 0x05, 0xbf, 0x7c, 0xab, 0xe0, 0xd2,
+ 0xb3, 0xac, 0x03, 0xcb, 0x08, 0x2a, 0x37, 0xb6, 0xcb, 0x9b, 0x55, 0x94,
+ 0x40, 0x2c, 0xa8, 0x04, 0x56, 0x64, 0x79, 0x1a, 0xa7, 0x72, 0x94, 0x4d,
+ 0xee, 0xa4, 0x06, 0x19, 0x9b, 0x18, 0x6d, 0x9f, 0xf0, 0x20, 0xc8, 0xc3,
+ 0x68, 0x36, 0x8b, 0xe1, 0x89, 0x92, 0x95, 0x8f, 0x3c, 0xe7, 0xf7, 0x84,
+ 0x22, 0x73, 0x9a, 0xca, 0x32, 0x10, 0x04, 0xc8, 0xdd, 0x40, 0xba, 0xd5,
+ 0x98, 0x92, 0x36, 0x08, 0xc0, 0xd5, 0x0b, 0x19, 0x44, 0x2b, 0xf8, 0xdd,
+ 0x18, 0x0a, 0xf3, 0xb4, 0xbf, 0xa8, 0xed, 0x0e, 0xad, 0x3d, 0x9f, 0x68,
+ 0xec, 0x69, 0x6a, 0xb0, 0x82, 0x09, 0x66, 0x90, 0xc2, 0x54, 0x9c, 0x5f,
+ 0x9f, 0x93, 0xc6, 0xd8, 0xbf, 0x2f, 0x0a, 0xe8, 0xf6, 0xd4, 0x1d, 0x5a,
+ 0x29, 0xd8, 0x20, 0xd8, 0xac, 0x52, 0x1f, 0xb8, 0x99, 0xd4, 0xae, 0x2d,
+ 0x1c, 0x5f, 0x91, 0x16, 0xf4, 0x7a, 0xe9, 0x67, 0xfd, 0x0c, 0xcc, 0x30,
+ 0xaf, 0xad, 0x7a, 0x32, 0x35, 0x39, 0xa2, 0x34, 0x71, 0xc6, 0x9f, 0xe8,
+ 0x3b, 0x24, 0x3b, 0x78, 0x4e, 0x53, 0x2a, 0x9c, 0x3f, 0x3a, 0x77, 0x71,
+ 0x0e, 0x90, 0x7a, 0x6c, 0x62, 0x75, 0x25, 0x1a, 0xa0, 0xe9, 0x93, 0xea,
+ 0x9c, 0x69, 0x5c, 0x72, 0xbf, 0x14, 0x93, 0xba, 0x26, 0x6b, 0xf6, 0x81,
+ 0xdf, 0x98, 0x2a, 0xce, 0xb1, 0x28, 0xd8, 0xd3, 0xb3, 0xe3, 0xb8, 0x8e,
+ 0xa3, 0x0e, 0x18, 0x39, 0x7b, 0x3d, 0xad, 0xc6, 0xd6, 0xbb, 0x72, 0xbd,
+ 0x63, 0x0c, 0xa7, 0x09, 0x33, 0x9c, 0x49, 0x96, 0x25, 0xef, 0xcd, 0xbe,
+ 0x2a, 0x5f, 0x60, 0x52, 0x06, 0xfa, 0x0c, 0x59, 0x96, 0x10, 0x71, 0x6e,
+ 0x5a, 0xbc, 0xcf, 0xb0, 0x5a, 0x95, 0x4d, 0x4a, 0xa5, 0xac, 0x29, 0x29,
+ 0x21, 0xc8, 0xf5, 0x6b, 0x91, 0x33, 0xaa, 0x16, 0x70, 0x6d, 0x10, 0x98,
+ 0x10, 0xc2, 0xf3, 0xa5, 0xa6, 0x12, 0xdf, 0x90, 0x42, 0xc5, 0x3f, 0x12,
+ 0x51, 0x28, 0x53, 0xd6, 0xbe, 0x84, 0x3b, 0x88, 0x19, 0xb5, 0x1f, 0xd2,
+ 0x09, 0x3a, 0x82, 0x86, 0xd9, 0x47, 0xf4, 0x6c, 0x61, 0xdc, 0x3a, 0x83,
+ 0x57, 0x69, 0x69, 0xf0, 0x4b, 0x6e, 0x76, 0xac, 0xe4, 0x20, 0x85, 0x1c,
+ 0xd8, 0x97, 0x89, 0x41, 0xd8, 0x5c, 0x83, 0xca, 0x4a, 0xa4, 0x54, 0xe6,
+ 0xd5, 0x77, 0xce, 0x52, 0xfc, 0x11, 0x20, 0x47, 0x02, 0xff, 0xbc, 0x9d,
+ 0x66, 0x41, 0xf5, 0x33, 0x41, 0xb9, 0x04, 0x83, 0x18, 0xa6, 0x0f, 0xeb,
+ 0xc2, 0x42, 0x25, 0x62, 0xd7, 0x9a, 0x1b, 0xa9, 0xd9, 0xfa, 0x2c, 0xe0,
+ 0x50, 0x1b, 0x5e, 0x42, 0x42, 0xab, 0x50, 0x89, 0x36, 0x10, 0x81, 0x55,
+ 0x68, 0x6f, 0x6e, 0x02, 0x8a, 0x95, 0x3f, 0x9c, 0xd4, 0x43, 0x62, 0x48,
+ 0x5c, 0xec, 0xc1, 0x35, 0xa7, 0x07, 0xdc, 0xe7, 0x58, 0x4c, 0xce, 0xb5,
+ 0x50, 0x01, 0xdd, 0xec, 0x7d, 0x8d, 0x46, 0xe8, 0xf4, 0x2c, 0x15, 0xd2,
+ 0x13, 0xfe, 0xf7, 0xba, 0xe0, 0x55, 0x0f, 0xfb, 0x43, 0x75, 0x4e, 0x10,
+ 0x40, 0x54, 0x1f, 0x9d, 0x08, 0x4a, 0xc6, 0xa2, 0xf9, 0x8d, 0x05, 0xfd,
+ 0xe7, 0xf6, 0x82, 0x61, 0xb8, 0x26, 0x2f, 0xcf, 0xc3, 0x60, 0x60, 0x44,
+ 0x78, 0xb3, 0xdf, 0x0c, 0x5f, 0x69, 0xe5, 0x83, 0xd6, 0x03, 0x78, 0x02,
+ 0x86, 0x64, 0x4b, 0x72, 0x37, 0x5a, 0xdd, 0x65, 0x53, 0x99, 0xbb, 0x2e,
+ 0xcf, 0xdf, 0xf5, 0x2e, 0xaa, 0x8d, 0x02, 0xe9, 0x57, 0x6e, 0xbb, 0x5a,
+ 0x7c, 0x5f, 0xef, 0xf5, 0xf5, 0xe5, 0xf5, 0x3f, 0xc3, 0xfb, 0x0c, 0x17,
+ 0x44, 0xb0, 0x88, 0xca, 0x9d, 0x97, 0xbd, 0xab, 0x65, 0xee, 0x65, 0x74,
+ 0xcc, 0xf0, 0xd6, 0xf1, 0xc8, 0x30, 0x81, 0xd8, 0x8d, 0x57, 0x73, 0xee,
+ 0x5c, 0x60, 0x5b, 0x53, 0x86, 0x21, 0x87, 0x97, 0x06, 0xa5, 0x39, 0xc4,
+ 0xe8, 0xf3, 0xb3, 0x2b, 0x2b, 0x04, 0x3c, 0x0b, 0x4c, 0x56, 0xf0, 0x33,
+ 0x58, 0xab, 0x02, 0xd4, 0xb6, 0xb9, 0xd0, 0x17, 0x4e, 0x2d, 0x87, 0x2a,
+ 0x53, 0x4b, 0xd8, 0x8f, 0x04, 0x2c, 0x4e, 0xe7, 0x81, 0x50, 0xb4, 0x8a,
+ 0xad, 0x7d, 0x87, 0x87, 0x02, 0xf4, 0xea, 0x24, 0xc9, 0xdb, 0x59, 0xbb,
+ 0x99, 0x5c, 0x9e, 0x5b, 0x64, 0x56, 0x68, 0x7b, 0x86, 0x96, 0x2d, 0xa8,
+ 0xe0, 0xec, 0x55, 0xc8, 0x0a, 0xd2, 0x76, 0x6e, 0xe0, 0xdd, 0x60, 0x16,
+ 0x88, 0xd8, 0xa2, 0xd4, 0xec, 0xf8, 0xa4, 0xc6, 0x13, 0xf5, 0xc6, 0x9c,
+ 0x6b, 0xe6, 0xa5, 0xe0, 0x8a, 0xd5, 0x21, 0xd6, 0x0b, 0xc2, 0xaa, 0x91,
+ 0x75, 0xfb, 0x87, 0xa3, 0x69, 0xa4, 0x02, 0x3a, 0xe1, 0x02, 0xbc, 0xe3,
+ 0x3d, 0x52, 0x14, 0x6e, 0xd7, 0x4d, 0x19, 0x68, 0xce, 0xa5, 0x72, 0xa9,
+ 0x82, 0xbb, 0xd3, 0xaf, 0xe1, 0x22, 0x6e, 0x8c, 0x82, 0x69, 0x55, 0x00,
+ 0xd1, 0x8e, 0x01, 0x9b, 0x0a, 0xcc, 0x93, 0x16, 0x10, 0x17, 0x56, 0x1c,
+ 0xbc, 0x45, 0x70, 0xf1, 0x5d, 0xef, 0x7f, 0xfc, 0x74, 0xf9, 0x8e, 0xaf,
+ 0x2e, 0xea, 0x25, 0xec, 0x19, 0xdb, 0x41, 0xb3, 0xad, 0x16, 0xd0, 0x16,
+ 0xde, 0x21, 0xe4, 0x25, 0x2e, 0xff, 0x45, 0xf1, 0xf2, 0x8e, 0xbc, 0xe8,
+ 0xf0, 0xfd, 0x50, 0xd3, 0xf2, 0x15, 0x36, 0xcd, 0x43, 0xa7, 0xa6, 0xc3,
+ 0x66, 0x4b, 0x6a, 0xb7, 0xc4, 0x86, 0x4f, 0x16, 0x46, 0x5b, 0x79, 0x6d,
+ 0x39, 0x48, 0x0b, 0xd2, 0xd4, 0xbc, 0x65, 0x85, 0xda, 0xa0, 0x50, 0x99,
+ 0x32, 0x88, 0x70, 0xd0, 0x04, 0x7e, 0x62, 0x48, 0xd5, 0x50, 0x72, 0x38,
+ 0x13, 0x9a, 0xa8, 0x23, 0x2f, 0xc2, 0x56, 0xf5, 0xab, 0xe6, 0xaf, 0x88,
+ 0x70, 0x1c, 0x01, 0x47, 0x24, 0x17, 0x2a, 0x0d, 0x68, 0xce, 0xca, 0x10,
+ 0xab, 0xab, 0xce, 0xdf, 0x73, 0x96, 0xe6, 0x43, 0x4d, 0xb3, 0x86, 0x2f,
+ 0x7e, 0xf9, 0x85, 0x11, 0x25, 0x32, 0x86, 0x51, 0x3b, 0x1b, 0x93, 0x41,
+ 0xbd, 0x71, 0x2a, 0x9f, 0x92, 0xd0, 0xab, 0xee, 0x15, 0xca, 0x8d, 0x87,
+ 0xb3, 0x99, 0x65, 0x9c, 0xe2, 0xb9, 0x66, 0xb4, 0x95, 0x6a, 0x36, 0x57,
+ 0x7c, 0x35, 0x88, 0x55, 0x8b, 0xf5, 0x1d, 0xba, 0x88, 0xa7, 0xe1, 0xdc,
+ 0xa5, 0x60, 0xb6, 0xbf, 0xc4, 0x5a, 0x8c, 0x50, 0x6c, 0x34, 0xb3, 0x42,
+ 0x1f, 0xc2, 0x15, 0x39, 0x89, 0xad, 0x88, 0x1c, 0x2a, 0x91, 0x15, 0xf1,
+ 0x06, 0xec, 0xda, 0x2f, 0xed, 0x0b, 0xca, 0xb9, 0xc3, 0x86, 0x40, 0x98,
+ 0xc7, 0xfb, 0xa7, 0xef, 0xad, 0xb9, 0x24, 0xd0, 0x55, 0xe8, 0x40, 0x60,
+ 0x01, 0xaf, 0x5a, 0xed, 0xcf, 0x95, 0xe7, 0x2c, 0x25, 0x1d, 0x75, 0x14,
+ 0xa9, 0x1e, 0xda, 0x0c, 0x25, 0x43, 0xac, 0x79, 0xa0, 0x44, 0xc3, 0xce,
+ 0xcf, 0xaf, 0xe5, 0x25, 0x12, 0xd4, 0x23, 0xd0, 0xe2, 0x95, 0x4c, 0x0e,
+ 0x57, 0x13, 0xdc, 0x42, 0x6c, 0x58, 0xb1, 0x5e, 0x01, 0xc0, 0xd0, 0x22,
+ 0x71, 0xb6, 0xba, 0x12, 0xb2, 0x94, 0xa5, 0xc5, 0x22, 0x67, 0x40, 0x61,
+ 0x0f, 0x90, 0xfa, 0x09, 0xd7, 0xd3, 0xf0, 0xde, 0x21, 0x47, 0xc4, 0x4b,
+ 0xa5, 0x6f, 0x6b, 0x19, 0x90, 0x18, 0xa8, 0x30, 0xf9, 0x6c, 0x80, 0xb6,
+ 0x78, 0xaa, 0xa9, 0x82, 0x75, 0x70, 0x1f, 0x0b, 0xd2, 0x51, 0xd0, 0xe5,
+ 0x15, 0xe8, 0x1d, 0x4b, 0x84, 0xc5, 0x47, 0x86, 0x14, 0x93, 0x7f, 0x6d,
+ 0x76, 0x75, 0x20, 0x53, 0x4a, 0x7e, 0x75, 0x20, 0x5a, 0xc6, 0x81, 0xd4,
+ 0x0a, 0x4a, 0x80, 0xa7, 0x27, 0xf5, 0xb7, 0xb9, 0xe2, 0x2b, 0x1a, 0x81,
+ 0xd5, 0x97, 0x65, 0x04, 0x57, 0xff, 0x55, 0xdc, 0x49, 0xff, 0x8d, 0x4e,
+ 0xd2, 0x7c, 0xfd, 0xe6, 0xba, 0x73, 0x7d, 0xf9, 0xe6, 0x75, 0x9d, 0xed,
+ 0x74, 0x7e, 0xf8, 0x72, 0xbd, 0xdc, 0xb3, 0x5e, 0x67, 0x36, 0xfd, 0xe3,
+ 0x93, 0xda, 0x9b, 0x93, 0x4c, 0x6e, 0x9d, 0xb1, 0x4e, 0x0a, 0x84, 0xb1,
+ 0x8e, 0x7d, 0xb1, 0xd8, 0x48, 0x2c, 0x32, 0x05, 0x6f, 0xb3, 0x49, 0x43,
+ 0x79, 0x3c, 0x95, 0x58, 0xfd, 0xba, 0x90, 0x7b, 0x08, 0x60, 0xc1, 0xbb,
+ 0xab, 0x6e, 0xba, 0xbd, 0xa5, 0x0a, 0x48, 0x02, 0x57, 0xec, 0xb9, 0xa1,
+ 0xe0, 0x51, 0xe6, 0xb5, 0xba, 0xf2, 0x69, 0x33, 0x3a, 0xbf, 0xd5, 0xa5,
+ 0x82, 0xc3, 0x9d, 0xc4, 0x3e, 0x1b, 0xcd, 0x81, 0x99, 0xee, 0x10, 0x13,
+ 0x65, 0x7a, 0x62, 0x9c, 0x5d, 0x57, 0xcd, 0x5b, 0x50, 0xc9, 0xa3, 0x71,
+ 0xd7, 0x63, 0x9e, 0xf6, 0xc6, 0xa9, 0x7c, 0xf2, 0xca, 0x45, 0x87, 0x07,
+ 0x90, 0x39, 0x66, 0xd8, 0x31, 0xe1, 0x1c, 0x15, 0xe5, 0x53, 0x39, 0x05,
+ 0x17, 0xd7, 0x78, 0xb0, 0x69, 0x58, 0xea, 0xc3, 0xec, 0xc6, 0xb0, 0x45,
+ 0x5d, 0x0e, 0xb2, 0x49, 0x88, 0x15, 0xae, 0xca, 0x2a, 0x1a, 0x91, 0x1e,
+ 0x26, 0xd9, 0x54, 0x22, 0x4a, 0xad, 0x1d, 0xa7, 0x50, 0xd5, 0x62, 0xbd,
+ 0x7a, 0xe4, 0xe6, 0x8b, 0x39, 0x7c, 0xa3, 0x09, 0x88, 0x4c, 0x73, 0xd6,
+ 0x9b, 0xcc, 0xd5, 0x90, 0xb4, 0x9f, 0x32, 0x72, 0xb0, 0x89, 0x20, 0xef,
+ 0x9d, 0x36, 0xcc, 0x1f, 0xe9, 0xa4, 0xe5, 0xa2, 0x64, 0x6c, 0x9e, 0xf8,
+ 0x4a, 0x1a, 0x2e, 0xbd, 0x99, 0x92, 0xca, 0x65, 0x94, 0x5b, 0x04, 0x1a,
+ 0x04, 0x26, 0x76, 0xc5, 0x18, 0xe9, 0x09, 0x1a, 0x70, 0xe5, 0x59, 0x0f,
+ 0x04, 0xd5, 0xcf, 0x54, 0xa6, 0x20, 0x3a, 0x37, 0xf7, 0xf3, 0x4f, 0xf3,
+ 0xfa, 0xed, 0xc5, 0x33, 0xf2, 0xd9, 0x20, 0x56, 0x10, 0x61, 0x85, 0xad,
+ 0x2e, 0xe6, 0xad, 0xab, 0x2b, 0x76, 0xae, 0xdf, 0x2e, 0xa1, 0x8d, 0x24,
+ 0xf3, 0x94, 0x91, 0x0a, 0xfd, 0xea, 0x9a, 0x12, 0x4b, 0x2a, 0x27, 0x73,
+ 0x58, 0xc8, 0x67, 0x9e, 0x89, 0x03, 0x34, 0x40, 0x1d, 0x1c, 0x59, 0x4c,
+ 0x3f, 0x35, 0x15, 0xe6, 0xff, 0x1e, 0xb4, 0x88, 0x9b, 0x8a, 0x79, 0x21,
+ 0xcb, 0x49, 0x5d, 0xc4, 0x32, 0x40, 0x2f, 0xfa, 0x16, 0x7a, 0x27, 0x34,
+ 0x79, 0xfb, 0xdd, 0xaa, 0xb6, 0x3a, 0x83, 0xd6, 0xab, 0x54, 0xa3, 0x36,
+ 0x73, 0x80, 0xa4, 0xb1, 0x40, 0x76, 0x37, 0xbc, 0xe7, 0xd4, 0x3f, 0xb6,
+ 0xbd, 0x3c, 0xde, 0xc8, 0xa6, 0x52, 0x7a, 0x03, 0x80, 0x2a, 0x67, 0x0a,
+ 0xff, 0x71, 0x81, 0xa0, 0x48, 0x22, 0x5d, 0x64, 0x5b, 0x44, 0xc3, 0x36,
+ 0xe6, 0x22, 0x80, 0xcc, 0xb5, 0xf3, 0x5b, 0xef, 0x87, 0x7f, 0xf4, 0x45,
+ 0xfb, 0xc4, 0x61, 0x8d, 0x30, 0xb9, 0x94, 0xbf, 0x10, 0x47, 0x3d, 0x74,
+ 0x52, 0x90, 0x26, 0x5e, 0x87, 0x45, 0x2c, 0x91, 0x29, 0x51, 0x4f, 0x7b,
+ 0x34, 0x42, 0x10, 0x5a, 0x11, 0x85, 0x3b, 0x6a, 0x57, 0x66, 0x85, 0xdb,
+ 0x33, 0x2d, 0x77, 0xc6, 0x73, 0x6a, 0x48, 0x6b, 0x8b, 0x78, 0x20, 0xe1,
+ 0xe1, 0xb4, 0xb0, 0x1c, 0x58, 0xea, 0x20, 0x75, 0x58, 0x41, 0x2f, 0xed,
+ 0xc3, 0x36, 0xb2, 0x56, 0x72, 0x55, 0xda, 0x7e, 0x46, 0x75, 0x76, 0xfe,
+ 0x35, 0xcb, 0x27, 0x02, 0x66, 0x92, 0x43, 0x31, 0xa5, 0x69, 0x33, 0xb9,
+ 0x2f, 0x1e, 0x2b, 0x3e, 0x82, 0xd5, 0x15, 0x9e, 0xd3, 0x89, 0x51, 0xa9,
+ 0xa6, 0x14, 0x61, 0x6b, 0x89, 0xd3, 0xe7, 0xfb, 0x90, 0xc0, 0x41, 0x65,
+ 0xb6, 0x5d, 0x85, 0xed, 0x67, 0xd8, 0x54, 0x23, 0x33, 0xf4, 0x3c, 0xb3,
+ 0xaa, 0xe7, 0x9d, 0x65, 0x19, 0xc3, 0x73, 0xd2, 0x3a, 0x19, 0xc3, 0xda,
+ 0x28, 0xd6, 0x92, 0x3f, 0xbe, 0x1e, 0xdf, 0x94, 0x0f, 0x27, 0x6b, 0x62,
+ 0xcb, 0xa8, 0x04, 0xc1, 0xad, 0xaf, 0xaf, 0x7d, 0x75, 0x71, 0xf9, 0x0f,
+ 0xf8, 0xe5, 0x6a, 0xe3, 0xfb, 0x64, 0x09, 0xfc, 0xd9, 0x8d, 0x40, 0x26,
+ 0x78, 0xc7, 0xb3, 0x0d, 0x63, 0xf5, 0x05, 0x2e, 0xa0, 0x18, 0xc2, 0x66,
+ 0x25, 0xd3, 0x65, 0x2d, 0x88, 0xaf, 0x7d, 0xe2, 0x02, 0x42, 0x9e, 0x5c,
+ 0x43, 0x0b, 0x83, 0xe3, 0x2e, 0x03, 0x60, 0x45, 0xcf, 0xf5, 0x54, 0x35,
+ 0xd7, 0x84, 0xa9, 0x36, 0xa1, 0x41, 0x28, 0x1d, 0x3e, 0xa6, 0x4f, 0x25,
+ 0xc7, 0xfc, 0x33, 0xde, 0x46, 0xd5, 0x12, 0x44, 0xc5, 0x2c, 0xaa, 0x85,
+ 0xb6, 0xec, 0x43, 0xed, 0x04, 0xd5, 0x3d, 0x72, 0xd8, 0x3c, 0xe1, 0x2e,
+ 0xfd, 0xcb, 0x5f, 0x4c, 0x7f, 0x2b, 0x2d, 0xa9, 0xee, 0xe4, 0xb7, 0x55,
+ 0x59, 0xa3, 0x18, 0x41, 0x6d, 0x7a, 0xf0, 0x0e, 0x41, 0x18, 0x9c, 0x72,
+ 0x4e, 0x6b, 0x16, 0xd7, 0xa4, 0x14, 0x9e, 0x88, 0x3a, 0x49, 0x5b, 0x27,
+ 0x54, 0x11, 0x19, 0xac, 0xd0, 0xf4, 0x9f, 0xfa, 0xfd, 0x98, 0xaa, 0xfa,
+ 0x62, 0x27, 0x0c, 0x8c, 0x64, 0xd3, 0xc3, 0xcd, 0xa0, 0x20, 0xb4, 0x7a,
+ 0x20, 0x95, 0xcb, 0x6f, 0x32, 0x73, 0x68, 0xe6, 0x85, 0x8b, 0xbd, 0x56,
+ 0x2d, 0x63, 0xfe, 0x46, 0x05, 0x6b, 0x4b, 0xec, 0x74, 0x15, 0x74, 0xde,
+ 0x73, 0x31, 0xe0, 0x5d, 0x72, 0x81, 0x87, 0xc0, 0xd3, 0x26, 0xc1, 0xe0,
+ 0x91, 0x65, 0x1c, 0x8b, 0x31, 0x4e, 0xcf, 0x26, 0x15, 0x33, 0xa3, 0xa6,
+ 0x96, 0x20, 0x63, 0x1e, 0xbe, 0x2d, 0x56, 0xe4, 0x7a, 0x90, 0x71, 0x28,
+ 0x96, 0xc4, 0xfd, 0xb0, 0xf6, 0xca, 0xfe, 0x18, 0x72, 0x49, 0xe1, 0xdb,
+ 0x71, 0xdf, 0x50, 0x8f, 0x24, 0xac, 0xb1, 0x34, 0xa7, 0x6f, 0x16, 0xa3,
+ 0xb0, 0x44, 0x13, 0x18, 0x08, 0x1e, 0x32, 0x66, 0x45, 0x43, 0x6d, 0xa8,
+ 0x90, 0x99, 0x56, 0xe9, 0xca, 0xc6, 0x1e, 0x30, 0x9e, 0x4c, 0xe8, 0xe8,
+ 0x34, 0x7c, 0x0f, 0x4a, 0x42, 0x22, 0xb8, 0x00, 0x9c, 0x05, 0x44, 0x36,
+ 0xda, 0x8f, 0x98, 0x4b, 0x82, 0x08, 0xae, 0x5f, 0x46, 0xb0, 0xc4, 0x36,
+ 0xc5, 0xca, 0x75, 0xf2, 0x11, 0xd4, 0x6a, 0x06, 0x6b, 0x63, 0xdc, 0x37,
+ 0x6f, 0x5e, 0xfc, 0xee, 0x56, 0xc2, 0x7f, 0xd4, 0x69, 0xed, 0x71, 0x05,
+ 0x3e, 0xb5, 0xe5, 0x5a, 0xa2, 0x50, 0xc2, 0xe4, 0xf0, 0xe6, 0xda, 0xa0,
+ 0xfc, 0x02, 0xcf, 0xf3, 0x2b, 0x91, 0x10, 0x5e, 0xe8, 0xa8, 0x47, 0x10,
+ 0xaa, 0x8e, 0x5d, 0x30, 0xe1, 0x20, 0xbe, 0xfa, 0xd5, 0xf3, 0x40, 0xf6,
+ 0xf5, 0xe3, 0xc7, 0x33, 0x2f, 0x5d, 0xaa, 0xde, 0xfd, 0x3b, 0x5f, 0x3c,
+ 0xf1, 0x98, 0xdd, 0x69, 0x0d, 0xfb, 0x4f, 0x5e, 0x66, 0x77, 0xe9, 0xd0,
+ 0xc7, 0x0b, 0x76, 0xb8, 0x59, 0xfe, 0xc2, 0x93, 0xe8, 0x92, 0x65, 0x9c,
+ 0xff, 0xc9, 0x6e, 0x4e, 0xed, 0x55, 0x2c, 0x6e, 0xfd, 0xd5, 0x09, 0x10,
+ 0x82, 0xe7, 0xf7, 0xd7, 0xb1, 0x5a, 0xee, 0x2c, 0x5e, 0x98, 0x67, 0x44,
+ 0xbf, 0xbc, 0xf5, 0x98, 0x2d, 0x85, 0xea, 0x87, 0xe4, 0xea, 0x97, 0x69,
+ 0x9c, 0xb3, 0x55, 0x9a, 0xb6, 0x70, 0x22, 0x57, 0xa7, 0xc5, 0x9a, 0x18,
+ 0xfe, 0xea, 0x39, 0xcb, 0x5e, 0x48, 0x78, 0xf3, 0x23, 0x67, 0xe7, 0x40,
+ 0x58, 0x85, 0xa1, 0xb3, 0x52, 0xa5, 0xcd, 0x02, 0xb8, 0x27, 0xf6, 0x7f,
+ 0xf9, 0x80, 0xfe, 0x5e, 0x9e, 0xd3, 0x5f, 0x4b, 0x73, 0xfa, 0x26, 0xb4,
+ 0xac, 0x9a, 0xff, 0x51, 0x34, 0x6d, 0x62, 0xab, 0xe8, 0x49, 0xb0, 0xac,
+ 0xb4, 0x4f, 0xf1, 0x0c, 0xee, 0x39, 0x24, 0x39, 0xf3, 0xbf, 0xf5, 0x9b,
+ 0xd9, 0x70, 0x98, 0x4d, 0xcb, 0x3f, 0x30, 0xde, 0x3f, 0x1b, 0xfc, 0x81,
+ 0x75, 0xe5, 0xd2, 0xc9, 0xd3, 0x46, 0x92, 0x34, 0xf8, 0x5a, 0x23, 0x6c,
+ 0x0c, 0xf8, 0xba, 0x6e, 0x6c, 0x64, 0x64, 0x22, 0x23, 0x29, 0xb8, 0x4e,
+ 0xe0, 0x74, 0x27, 0x8d, 0xb7, 0x6f, 0xae, 0xae, 0x1b, 0x73, 0xb2, 0x3f,
+ 0xb4, 0x35, 0x30, 0xc8, 0x62, 0xff, 0xbc, 0x1a, 0x1b, 0x06, 0x82, 0x1f,
+ 0x4a, 0x20, 0xb8, 0x8b, 0x05, 0xfc, 0x99, 0x62, 0x72, 0xa5, 0x17, 0x61,
+ 0x3c, 0xe0, 0xe9, 0x19, 0x9a, 0x3d, 0x2b, 0xbe, 0x05, 0xef, 0x94, 0x04,
+ 0x93, 0x28, 0x05, 0xfc, 0x06, 0xe7, 0x11, 0xe6, 0xbb, 0xdd, 0x67, 0xfd,
+ 0xf7, 0x12, 0x60, 0x21, 0xae, 0xf9, 0x66, 0x32, 0x5d, 0x64, 0x80, 0xf5,
+ 0x59, 0x09, 0xbd, 0xfb, 0xe6, 0x89, 0x2a, 0x8a, 0x62, 0x85, 0x16, 0x42,
+ 0x20, 0xb9, 0x83, 0x4a, 0xde, 0xf7, 0x23, 0x2c, 0xb5, 0xf3, 0x48, 0x05,
+ 0x61, 0x9e, 0x18, 0x57, 0x0d, 0x3d, 0x13, 0x54, 0xf6, 0x93, 0x97, 0x07,
+ 0x13, 0x7f, 0xed, 0xc9, 0x40, 0x6d, 0x52, 0xe7, 0x6d, 0x89, 0x1e, 0xdd,
+ 0xfb, 0x5c, 0xd5, 0xda, 0x4c, 0xf9, 0x48, 0x21, 0xf3, 0xb5, 0x2b, 0xdc,
+ 0x63, 0x7b, 0xd0, 0xae, 0xab, 0x86, 0xd4, 0x31, 0xec, 0x6e, 0x08, 0x31,
+ 0xb8, 0x37, 0x46, 0xc4, 0x7d, 0xcf, 0x8e, 0x14, 0x07, 0x49, 0xae, 0x62,
+ 0x0a, 0x30, 0x0c, 0xe7, 0x61, 0x86, 0xc6, 0x8f, 0xaf, 0x3e, 0x76, 0x3c,
+ 0x4b, 0x32, 0x7a, 0x24, 0xab, 0x01, 0xc3, 0xd0, 0x70, 0x2b, 0x1b, 0x0f,
+ 0x4a, 0x2c, 0xbe, 0x5e, 0x16, 0x9c, 0x8d, 0x55, 0x3a, 0x09, 0xc5, 0x4d,
+ 0x11, 0xa5, 0xe2, 0x62, 0x8d, 0xbf, 0x31, 0x65, 0x69, 0xa9, 0x77, 0x4b,
+ 0xd2, 0xb1, 0x39, 0x1d, 0x6b, 0x02, 0x75, 0xcf, 0x5c, 0x95, 0xf0, 0x54,
+ 0x3f, 0x69, 0x4f, 0x71, 0xc0, 0x56, 0xe1, 0x5a, 0x23, 0x16, 0x54, 0x91,
+ 0x23, 0x4a, 0x6a, 0xc3, 0x88, 0xb1, 0x90, 0x31, 0xf8, 0x52, 0x54, 0x1e,
+ 0x5a, 0x98, 0x56, 0xd7, 0x24, 0x32, 0x92, 0x54, 0x03, 0x7b, 0xdd, 0x96,
+ 0x8d, 0x99, 0x8d, 0x75, 0x60, 0x86, 0x4f, 0x33, 0xcd, 0xa0, 0xdc, 0x99,
+ 0x8a, 0x5f, 0x93, 0x1a, 0xb4, 0xf9, 0x78, 0xc6, 0x11, 0xd0, 0xd8, 0x1a,
+ 0x24, 0xbb, 0x35, 0xa1, 0x3c, 0xb9, 0x57, 0xf2, 0xaa, 0x36, 0xc6, 0x1a,
+ 0x81, 0xe1, 0x63, 0xdd, 0x6b, 0x72, 0xda, 0x2d, 0x2f, 0x09, 0x5f, 0x1d,
+ 0xa8, 0x5b, 0xe5, 0x8d, 0xe1, 0x64, 0xd6, 0x2c, 0xc0, 0x05, 0xc7, 0x47,
+ 0x56, 0xa6, 0x67, 0x92, 0x19, 0x55, 0xb4, 0xcc, 0x3f, 0x00, 0x46, 0x2b,
+ 0x55, 0xdc, 0x2d, 0xa7, 0xd9, 0x43, 0xb2, 0x5b, 0xa5, 0x01, 0x4b, 0xe6,
+ 0x95, 0x84, 0x3d, 0x59, 0x34, 0x6c, 0x7c, 0x5e, 0x07, 0x3c, 0x54, 0x25,
+ 0x37, 0x96, 0xf5, 0xaf, 0x3e, 0xee, 0x6c, 0x35, 0x0d, 0xd9, 0x9e, 0xc3,
+ 0x3f, 0x1d, 0xf8, 0xe7, 0x78, 0xc3, 0x4e, 0x41, 0x4a, 0xf7, 0xeb, 0x8c,
+ 0x11, 0x7c, 0x40, 0xca, 0x15, 0x27, 0xcf, 0x9a, 0x02, 0xda, 0xd3, 0x3a,
+ 0x73, 0xd1, 0x4d, 0x74, 0x38, 0xbb, 0xf1, 0x96, 0x35, 0x29, 0xba, 0x20,
+ 0xf1, 0x48, 0x3d, 0x1f, 0x2b, 0x16, 0xf9, 0x6a, 0xbc, 0x44, 0x83, 0x21,
+ 0xbb, 0x57, 0xb2, 0x4f, 0x84, 0xa3, 0xdd, 0xce, 0x26, 0x84, 0x6d, 0xca,
+ 0xd7, 0xc3, 0x4e, 0x45, 0x78, 0xdc, 0x20, 0x2f, 0xfb, 0x50, 0x48, 0x0f,
+ 0x83, 0x29, 0x9f, 0x20, 0x72, 0xcf, 0x06, 0x56, 0x82, 0xe0, 0x31, 0x44,
+ 0xf6, 0xc7, 0xb0, 0x56, 0x34, 0x8b, 0x0e, 0xdc, 0x8a, 0x34, 0xee, 0x9b,
+ 0x27, 0x5e, 0x61, 0xe4, 0x83, 0x9c, 0xa4, 0x8f, 0x07, 0x73, 0xcd, 0x63,
+ 0xab, 0x2b, 0x58, 0xf7, 0x87, 0xed, 0x12, 0xf1, 0x9b, 0x5c, 0xc8, 0xab,
+ 0x2b, 0xa1, 0xc5, 0x4a, 0xd3, 0xbc, 0x1d, 0xe8, 0x04, 0xfc, 0xe8, 0x36,
+ 0x41, 0x92, 0xac, 0xa3, 0xaa, 0x82, 0x2d, 0x0d, 0x86, 0xec, 0x75, 0x9f,
+ 0x9a, 0xd1, 0x95, 0xb5, 0x2f, 0xa2, 0xb3, 0x21, 0xba, 0xe5, 0x38, 0x96,
+ 0x78, 0x5d, 0xe8, 0x14, 0x58, 0x0b, 0x50, 0x2a, 0xa3, 0x37, 0x40, 0x0b,
+ 0x93, 0x14, 0x40, 0x9e, 0x84, 0x57, 0x18, 0x92, 0x85, 0xdc, 0x2c, 0x97,
+ 0x03, 0xe6, 0x0d, 0xb5, 0x32, 0xc0, 0x9a, 0xcd, 0x81, 0x8a, 0x28, 0x17,
+ 0x2a, 0x80, 0x2e, 0x09, 0x26, 0x15, 0xd9, 0x4a, 0x58, 0xc1, 0x13, 0x40,
+ 0xfc, 0xd8, 0xce, 0xda, 0x10, 0xe1, 0xd8, 0xbd, 0x5c, 0xa2, 0xd3, 0x30,
+ 0xbe, 0x13, 0xea, 0x00, 0x57, 0x3b, 0x9f, 0x2c, 0xdf, 0x77, 0xd4, 0x5b,
+ 0x42, 0xd6, 0xc2, 0x05, 0xbb, 0x2a, 0xcc, 0x62, 0xd1, 0x80, 0x4f, 0x00,
+ 0xcd, 0x16, 0x48, 0x4f, 0x73, 0x26, 0xa6, 0x7f, 0x50, 0xa2, 0xa0, 0x2f,
+ 0xf1, 0x99, 0xaa, 0xce, 0x87, 0x50, 0xfa, 0xe2, 0x09, 0xf1, 0xf7, 0x37,
+ 0x1d, 0xbc, 0x2a, 0xd6, 0xbc, 0x16, 0xdc, 0xd3, 0x86, 0xf7, 0x99, 0xf3,
+ 0x79, 0xa0, 0x32, 0x97, 0xa7, 0xe6, 0x3b, 0x2a, 0xff, 0xb8, 0x35, 0x20,
+ 0xfd, 0x59, 0xe0, 0x5d, 0xc7, 0x77, 0x5f, 0xb2, 0x4e, 0xde, 0x31, 0x42,
+ 0xb5, 0x1d, 0x0b, 0x54, 0x9b, 0xe5, 0x27, 0x0a, 0x78, 0x00, 0xea, 0x7d,
+ 0xdf, 0x26, 0x9e, 0x11, 0xd7, 0x25, 0xf2, 0xb9, 0x19, 0xb8, 0x70, 0x10,
+ 0x2e, 0x00, 0xdd, 0x13, 0x93, 0xcf, 0xed, 0xfc, 0xb1, 0x01, 0xe1, 0x07,
+ 0x0c, 0x80, 0xf5, 0x8e, 0x3e, 0x3f, 0xd3, 0xa5, 0x92, 0xf9, 0x86, 0x91,
+ 0x19, 0xc9, 0x20, 0x69, 0x60, 0x21, 0x0b, 0xb3, 0xb1, 0x4e, 0xac, 0xb4,
+ 0xcc, 0xbf, 0xa5, 0xf6, 0xb7, 0x4e, 0xe5, 0xb7, 0x41, 0xaa, 0x1e, 0x54,
+ 0x77, 0xb9, 0x6a, 0x03, 0x3e, 0xf7, 0xad, 0xd6, 0xc4, 0x21, 0xdd, 0xec,
+ 0x16, 0xa8, 0x72, 0x38, 0x1b, 0x8d, 0x49, 0x12, 0x4c, 0x1e, 0x65, 0x15,
+ 0xf5, 0x86, 0xe1, 0x23, 0xc1, 0x91, 0x92, 0xc7, 0x1a, 0xe1, 0xa7, 0x51,
+ 0x3e, 0x18, 0x0c, 0x33, 0x69, 0xaa, 0x62, 0x12, 0xc2, 0x92, 0xd7, 0xa9,
+ 0xd4, 0xba, 0xd6, 0x18, 0xd5, 0x95, 0xd8, 0x05, 0x62, 0xd7, 0x02, 0xf6,
+ 0x22, 0x79, 0xf2, 0x58, 0x13, 0x9b, 0x5a, 0xc7, 0x25, 0x9c, 0xdf, 0x60,
+ 0x75, 0x4d, 0x21, 0xe3, 0x0a, 0xea, 0x35, 0x83, 0x5a, 0xf2, 0x5d, 0x63,
+ 0xbb, 0x91, 0xdc, 0x02, 0x18, 0xc1, 0x77, 0x0d, 0xba, 0x02, 0x21, 0x00,
+ 0xa4, 0x36, 0x4c, 0x27, 0xf0, 0xf1, 0xb4, 0x26, 0x63, 0xee, 0xdb, 0x4d,
+ 0xf3, 0x1b, 0xb4, 0x76, 0x7f, 0x9a, 0xc2, 0x96, 0x73, 0x1d, 0x37, 0x57,
+ 0xec, 0x55, 0x7e, 0x3b, 0x5c, 0xda, 0x84, 0xf6, 0x36, 0xa5, 0x6d, 0xc8,
+ 0x75, 0xe7, 0x57, 0x98, 0xaf, 0x66, 0x9d, 0xd2, 0xef, 0x1a, 0x50, 0x88,
+ 0xfd, 0xe3, 0xd3, 0xef, 0x0d, 0x5c, 0x37, 0x73, 0xeb, 0x80, 0x7e, 0xc4,
+ 0xac, 0xfe, 0x8f, 0xc9, 0x53, 0xf2, 0xbb, 0x2d, 0x6f, 0xe2, 0xfd, 0x04,
+ 0x5b, 0x39, 0xc1, 0x7f, 0x2a, 0x37, 0xc1, 0x39, 0x8c, 0xef, 0xf0, 0xde,
+ 0x83, 0x24, 0x32, 0x38, 0xe1, 0x3f, 0x1d, 0xfc, 0x9b, 0x9e, 0xf0, 0x9f,
+ 0x33, 0xba, 0x9c, 0x9e, 0x44, 0xbb, 0xd1, 0x59, 0x5d, 0xc1, 0x37, 0x9d,
+ 0x2d, 0xea, 0x4a, 0x27, 0x71, 0x9f, 0xcf, 0xdc, 0xe7, 0x85, 0x9d, 0x5b,
+ 0x5d, 0x11, 0x52, 0x1e, 0x9c, 0xd8, 0x0f, 0x1d, 0xfe, 0x94, 0x9e, 0xd8,
+ 0x0f, 0x67, 0xe1, 0x5d, 0x35, 0x1d, 0x36, 0x5b, 0x02, 0xba, 0x7c, 0x8e,
+ 0x1d, 0xa2, 0xff, 0xa0, 0x3b, 0xe7, 0xf0, 0xa9, 0x6e, 0x0c, 0xe7, 0x49,
+ 0xfc, 0x81, 0xf3, 0x58, 0xef, 0x37, 0x79, 0x29, 0x37, 0x91, 0xac, 0xc2,
+ 0xb3, 0xdd, 0x16, 0xd4, 0x94, 0x32, 0x21, 0x10, 0x05, 0x3f, 0x46, 0x1e,
+ 0x08, 0x4a, 0xf3, 0x34, 0x79, 0xcc, 0x86, 0xc3, 0x16, 0x68, 0xc2, 0xd9,
+ 0x60, 0x63, 0x3e, 0x31, 0x53, 0x9d, 0x82, 0xda, 0x38, 0x9f, 0x8a, 0xef,
+ 0xa3, 0x9a, 0xbb, 0x0a, 0xca, 0x8e, 0x39, 0x76, 0x06, 0x18, 0xb9, 0xdf,
+ 0x2a, 0x33, 0x5d, 0x6b, 0xbd, 0x2b, 0xd7, 0xa1, 0xde, 0x3a, 0xd5, 0xf2,
+ 0x9c, 0x5b, 0x31, 0x11, 0xda, 0x69, 0x71, 0xd1, 0x4f, 0xb1, 0x8a, 0xf6,
+ 0x55, 0x1b, 0xf2, 0x93, 0x24, 0xfe, 0xa9, 0xf6, 0xa1, 0x2c, 0x6c, 0xdf,
+ 0xcb, 0xf8, 0x03, 0xce, 0xfa, 0x50, 0x4c, 0xa6, 0xae, 0xae, 0xf1, 0xbc,
+ 0xd8, 0x2c, 0x1b, 0x4c, 0x4a, 0x0e, 0x67, 0x7d, 0x0c, 0xd9, 0x42, 0x4c,
+ 0xe5, 0xec, 0xa6, 0xcc, 0xa6, 0x5e, 0xd9, 0x4c, 0x41, 0x78, 0x57, 0x3e,
+ 0x65, 0xd4, 0x8a, 0xb2, 0x8f, 0xfc, 0x1d, 0xec, 0xd3, 0x6c, 0x87, 0xe6,
+ 0x8a, 0xf4, 0x3e, 0xdc, 0xb9, 0x38, 0xec, 0x6f, 0xd2, 0xd2, 0x99, 0x92,
+ 0xc5, 0x9c, 0x47, 0xed, 0x0b, 0xac, 0x17, 0x47, 0xa3, 0x3e, 0xa7, 0x80,
+ 0x4a, 0x38, 0xfb, 0xf5, 0xd0, 0x06, 0xc7, 0x16, 0xd8, 0x60, 0x2f, 0x5e,
+ 0x36, 0x45, 0x9a, 0xba, 0x92, 0x15, 0x66, 0x34, 0x65, 0x7d, 0xbd, 0x26,
+ 0xba, 0x87, 0x27, 0x87, 0x9e, 0x54, 0x5f, 0x54, 0x28, 0xbb, 0xf3, 0xef,
+ 0x51, 0x2a, 0x12, 0xdf, 0x6b, 0x3f, 0x2f, 0x13, 0xd9, 0xe3, 0xbd, 0x86,
+ 0x3b, 0xe8, 0xbd, 0x2d, 0xc8, 0x8b, 0xfc, 0x75, 0x2d, 0xb9, 0xfa, 0x3e,
+ 0x59, 0xbb, 0x7c, 0xdd, 0x7d, 0xf9, 0xd3, 0x79, 0x8f, 0xbe, 0xfc, 0xea,
+ 0x47, 0x8b, 0x98, 0xa5, 0xbf, 0xc2, 0x45, 0x27, 0xdf, 0x92, 0xf7, 0x95,
+ 0x03, 0x4f, 0xd6, 0x7e, 0xfb, 0xed, 0xeb, 0x3b, 0x2c, 0x15, 0xf1, 0xf9,
+ 0xc1, 0x02, 0x8f, 0xd1, 0x38, 0x74, 0xbc, 0x55, 0x07, 0x16, 0x08, 0xd3,
+ 0x0f, 0xfb, 0x6f, 0x4c, 0x38, 0x4f, 0xcb, 0x45, 0xe4, 0xe8, 0x09, 0x96,
+ 0x59, 0x52, 0xf3, 0x5c, 0x33, 0x49, 0x3f, 0xbc, 0x7e, 0xf3, 0x2e, 0x3e,
+ 0x47, 0xee, 0x61, 0x86, 0x36, 0x29, 0xf5, 0xc2, 0xc9, 0x35, 0x4a, 0x17,
+ 0x75, 0xd3, 0xf5, 0x7f, 0xde, 0x6c, 0xb9, 0xd1, 0x55, 0x66, 0xcd, 0x0d,
+ 0x32, 0x4a, 0xff, 0x97, 0x78, 0x63, 0xe3, 0x94, 0xfe, 0x72, 0x04, 0x98,
+ 0x9d, 0xde, 0x1a, 0xea, 0x5f, 0x38, 0x99, 0x89, 0xa3, 0xbc, 0xf9, 0xef,
+ 0x52, 0xe5, 0x7c, 0xa2, 0x43, 0x94, 0x47, 0x78, 0x58, 0xf2, 0x64, 0x6d,
+ 0x19, 0x24, 0x2a, 0x17, 0xc4, 0xf9, 0xbf, 0x2d, 0x3f, 0x96, 0x2d, 0xfc,
+ 0x1d, 0x20, 0x6a, 0x65, 0xa0, 0x7f, 0xd8, 0x1e, 0x57, 0xcb, 0x10, 0xe9,
+ 0x67, 0x36, 0x96, 0xc6, 0x4d, 0x57, 0x36, 0xfb, 0x39, 0x8b, 0xfb, 0x99,
+ 0x23, 0x4b, 0x02, 0x32, 0x23, 0xcc, 0xb5, 0xd5, 0x95, 0x08, 0xb7, 0x8d,
+ 0x42, 0xb0, 0x5d, 0x52, 0x89, 0x3c, 0x66, 0xfd, 0x0d, 0x57, 0x2f, 0xee,
+ 0x2f, 0xbf, 0xb2, 0x24, 0xd0, 0x30, 0xe7, 0x05, 0x5f, 0x77, 0x97, 0xe0,
+ 0x50, 0xe1, 0x8b, 0x34, 0x89, 0xf2, 0x0b, 0xc5, 0x2d, 0x44, 0x4e, 0x49,
+ 0x0f, 0x4e, 0x0c, 0xad, 0x94, 0x73, 0xf0, 0xc4, 0xea, 0xb1, 0xb3, 0x9a,
+ 0xe8, 0x16, 0xa2, 0xee, 0x8e, 0x38, 0xfa, 0xfe, 0xd9, 0xf0, 0x61, 0x9e,
+ 0x3b, 0xe2, 0x65, 0xfe, 0x9e, 0xb4, 0x5e, 0x0c, 0xfe, 0x18, 0x73, 0x82,
+ 0x9a, 0x3d, 0x65, 0xe1, 0x34, 0xa4, 0x93, 0x16, 0x6c, 0x26, 0xd1, 0x91,
+ 0x29, 0x38, 0x23, 0x8e, 0x5d, 0xe1, 0x80, 0x0f, 0x08, 0xd1, 0x19, 0x66,
+ 0xbe, 0xb7, 0x1b, 0xd0, 0xa4, 0xa9, 0x04, 0x96, 0xf9, 0xc4, 0x3a, 0x1b,
+ 0x41, 0x7c, 0xd2, 0x41, 0x4c, 0xb7, 0x40, 0x81, 0x1b, 0xc4, 0xb0, 0x43,
+ 0x40, 0xb6, 0xf0, 0x8d, 0x65, 0x93, 0x3a, 0x3b, 0x42, 0x33, 0x0c, 0x6b,
+ 0xc0, 0x4a, 0x51, 0x76, 0x9a, 0x1d, 0x5b, 0xa5, 0xe4, 0x04, 0x17, 0x8c,
+ 0xa3, 0xf8, 0xf2, 0x60, 0x40, 0x3f, 0x1d, 0x3f, 0x81, 0xb3, 0xce, 0xa2,
+ 0x93, 0x96, 0xf3, 0x9a, 0x40, 0x11, 0x27, 0x9d, 0x4c, 0x95, 0x20, 0x81,
+ 0x8e, 0x52, 0xbf, 0x07, 0x24, 0x7d, 0xcc, 0xeb, 0x02, 0x32, 0xf7, 0xd0,
+ 0x5d, 0x38, 0xa7, 0x03, 0x56, 0xd8, 0xc2, 0x1e, 0x80, 0x0d, 0x85, 0x65,
+ 0x1b, 0xb0, 0x26, 0x84, 0xfd, 0xa9, 0xa9, 0xe5, 0xf8, 0x79, 0x2a, 0x73,
+ 0xf9, 0x7b, 0xd1, 0x8a, 0xc8, 0xe4, 0xd4, 0x98, 0x64, 0xc3, 0x1c, 0xd5,
+ 0x32, 0x88, 0xdd, 0x37, 0x2b, 0x57, 0x4d, 0xd7, 0xce, 0x10, 0x74, 0x95,
+ 0x92, 0x9f, 0x63, 0x33, 0x54, 0x3a, 0x82, 0x47, 0x1b, 0x04, 0xa0, 0xe4,
+ 0x23, 0xf8, 0x14, 0x14, 0xb4, 0x34, 0x74, 0xd6, 0x9f, 0x0a, 0xf2, 0x61,
+ 0xf4, 0x61, 0x4a, 0xf8, 0x2c, 0x67, 0x13, 0x27, 0xb8, 0x03, 0x2e, 0x9f,
+ 0x25, 0x8b, 0x62, 0x06, 0x34, 0x05, 0x29, 0xc6, 0xeb, 0xdc, 0x89, 0x8d,
+ 0xba, 0x75, 0xb2, 0x48, 0x8b, 0xf4, 0x5a, 0x0a, 0xb4, 0x13, 0xab, 0xc3,
+ 0x65, 0x1d, 0x0b, 0x60, 0xcb, 0x95, 0xa2, 0xc6, 0x90, 0xe4, 0x28, 0x5c,
+ 0xaa, 0x64, 0x60, 0x16, 0xc8, 0x2e, 0x35, 0xfb, 0xe6, 0x2e, 0x9b, 0x3c,
+ 0xa7, 0x39, 0x4d, 0x3e, 0x88, 0x31, 0x68, 0xc7, 0x46, 0x55, 0x89, 0x69,
+ 0xaf, 0x8f, 0xe3, 0x8d, 0xfa, 0x09, 0xe8, 0x11, 0xc8, 0xa5, 0xe4, 0x4b,
+ 0x51, 0x8b, 0xc2, 0x6b, 0x2d, 0xa5, 0xf2, 0xda, 0x1c, 0x5a, 0x90, 0xdd,
+ 0x56, 0x92, 0x8f, 0x09, 0xef, 0x44, 0x0b, 0xce, 0x50, 0x81, 0xf3, 0x96,
+ 0x94, 0xae, 0x4a, 0x5b, 0x2e, 0x64, 0xe2, 0x0a, 0xb9, 0x57, 0xed, 0xd0,
+ 0x26, 0x28, 0x0b, 0xd9, 0xc3, 0x34, 0xfa, 0x4e, 0xc4, 0x9d, 0x29, 0xed,
+ 0x79, 0xe0, 0x9f, 0x13, 0x52, 0x86, 0xb1, 0x8c, 0x9f, 0x0c, 0xcd, 0x64,
+ 0x66, 0x78, 0xf9, 0x90, 0xcc, 0x27, 0x82, 0xef, 0x1a, 0xdd, 0xc5, 0x40,
+ 0x92, 0x39, 0x18, 0xe2, 0x66, 0xe3, 0x41, 0x3b, 0xb1, 0x20, 0xa1, 0x91,
+ 0xba, 0xb4, 0xb2, 0xdf, 0x2d, 0x74, 0x8e, 0x75, 0x50, 0x59, 0x3b, 0x7a,
+ 0x25, 0xaf, 0xf6, 0x99, 0x4c, 0x71, 0xee, 0x61, 0xc4, 0xa0, 0xbc, 0x61,
+ 0x0f, 0x05, 0xd4, 0xd2, 0x9a, 0x28, 0x61, 0x81, 0xa6, 0xa5, 0x45, 0x88,
+ 0xba, 0x71, 0xce, 0x52, 0x15, 0xe0, 0x66, 0x0e, 0x09, 0x0c, 0xa4, 0xb3,
+ 0x81, 0x73, 0x85, 0xe8, 0x71, 0x58, 0xa4, 0x16, 0x49, 0xa1, 0xae, 0xa7,
+ 0xca, 0x9a, 0x69, 0xcb, 0x75, 0xd6, 0x58, 0xe0, 0xfe, 0x9a, 0x0c, 0x26,
+ 0x86, 0x2a, 0x94, 0xa6, 0x11, 0x98, 0xda, 0xfe, 0x9a, 0xdc, 0x62, 0x91,
+ 0x0b, 0x2b, 0x65, 0x9f, 0x82, 0xd1, 0x86, 0xd6, 0xfa, 0xaf, 0xf8, 0xec,
+ 0xc9, 0xaf, 0x21, 0xc0, 0x54, 0x51, 0xbc, 0x4f, 0xd6, 0xe5, 0x5c, 0xfb,
+ 0xc6, 0x70, 0x36, 0x88, 0x72, 0x16, 0x28, 0xc5, 0x72, 0xf6, 0xf0, 0xc0,
+ 0x71, 0x1c, 0x88, 0xa8, 0x48, 0x74, 0x61, 0x9b, 0xc4, 0xb7, 0xd5, 0x34,
+ 0xb9, 0x44, 0x3b, 0x95, 0x82, 0x61, 0x7f, 0x69, 0xb5, 0x94, 0x45, 0x60,
+ 0x0d, 0xc4, 0x30, 0x70, 0xde, 0xb6, 0xa6, 0x05, 0x00, 0xe2, 0xae, 0x59,
+ 0x85, 0x14, 0x9c, 0x30, 0x6f, 0xad, 0x13, 0xe6, 0x1a, 0xac, 0xb8, 0x12,
+ 0xb3, 0xf5, 0x92, 0x75, 0xe3, 0x2b, 0xd1, 0x8d, 0xb5, 0x99, 0xe0, 0x97,
+ 0x05, 0xa1, 0x3d, 0xba, 0x2e, 0x22, 0x06, 0xf4, 0x70, 0x84, 0xc4, 0xfb,
+ 0x0c, 0x31, 0x1c, 0x08, 0x60, 0xc1, 0xb3, 0x9c, 0xea, 0xd8, 0xc9, 0x24,
+ 0xfd, 0x90, 0xe6, 0xc3, 0x54, 0x00, 0x97, 0x7d, 0x57, 0xf3, 0x8b, 0x8a,
+ 0x67, 0xd1, 0x9a, 0x3e, 0x75, 0x8c, 0xe8, 0x5a, 0x99, 0xdc, 0x65, 0x86,
+ 0xc1, 0x79, 0x41, 0xf5, 0x51, 0xd7, 0xaa, 0x7d, 0x9c, 0x62, 0xcb, 0x7d,
+ 0xd8, 0xa7, 0xf7, 0xe3, 0xe2, 0x71, 0xcc, 0x05, 0x37, 0x0c, 0xab, 0xc7,
+ 0xee, 0x40, 0xf5, 0x47, 0xf5, 0x26, 0x23, 0x50, 0x2b, 0x63, 0xb7, 0x9d,
+ 0x8d, 0xd2, 0x8d, 0x59, 0x8d, 0xc7, 0xbd, 0xc3, 0xb3, 0xb8, 0xab, 0x28,
+ 0x63, 0x41, 0x19, 0xd1, 0xaf, 0x38, 0x09, 0x4d, 0xea, 0xc1, 0x5b, 0x20,
+ 0xfb, 0xd2, 0x7b, 0x8d, 0x37, 0xc7, 0xf6, 0x9d, 0x9e, 0x81, 0x56, 0x59,
+ 0xf9, 0x6d, 0x5d, 0x6c, 0xe0, 0x25, 0x2e, 0x6e, 0x1c, 0x85, 0xfc, 0x3a,
+ 0xff, 0xdf, 0x83, 0xa6, 0x37, 0xca, 0xca, 0x82, 0x6f, 0xdb, 0x92, 0x3e,
+ 0xf6, 0x75, 0x8f, 0x6b, 0x64, 0x9f, 0x30, 0x50, 0x32, 0xc2, 0x86, 0x8a,
+ 0x79, 0xea, 0xe1, 0xfe, 0xa9, 0x04, 0xea, 0x6a, 0x91, 0xc0, 0xe7, 0x2c,
+ 0x24, 0x6f, 0xf9, 0x07, 0x47, 0x76, 0x73, 0xcd, 0x53, 0xc4, 0x6c, 0x5c,
+ 0xca, 0x17, 0x7e, 0x83, 0xfd, 0xef, 0x65, 0x23, 0xb3, 0x70, 0x2a, 0x05,
+ 0x4d, 0x0a, 0x88, 0xc2, 0x47, 0xc8, 0x8d, 0x31, 0xb8, 0x7f, 0x8b, 0x49,
+ 0x7a, 0x07, 0xfe, 0x1e, 0xc3, 0x9d, 0xda, 0x5f, 0xd2, 0x57, 0x81, 0x25,
+ 0xed, 0x0f, 0xdc, 0x49, 0x07, 0x30, 0x0f, 0x30, 0xe1, 0x5c, 0xaa, 0x57,
+ 0xaa, 0x37, 0xd3, 0xac, 0xb1, 0xc9, 0xec, 0x84, 0x8b, 0xbf, 0x18, 0x62,
+ 0xc1, 0x30, 0x88, 0x58, 0x05, 0x5f, 0xf2, 0x6a, 0x41, 0xbe, 0x1d, 0xdc,
+ 0xb6, 0xce, 0x47, 0x97, 0x90, 0x51, 0xcc, 0xbe, 0x86, 0xa8, 0x71, 0x76,
+ 0x76, 0xc2, 0xfc, 0x49, 0x68, 0x8f, 0x03, 0x13, 0x6b, 0x6d, 0x73, 0x11,
+ 0xd5, 0xc0, 0x35, 0xb0, 0xe1, 0x76, 0x1c, 0xb0, 0x7d, 0xc1, 0x3d, 0xe6,
+ 0xce, 0x8f, 0x31, 0x45, 0xca, 0x2f, 0x9f, 0xa3, 0xb1, 0x49, 0x7b, 0x10,
+ 0xe2, 0xe0, 0x2d, 0x1f, 0x38, 0x9d, 0x40, 0xa5, 0x90, 0x1a, 0xe6, 0xaa,
+ 0xb6, 0xf1, 0xf3, 0x47, 0x27, 0xde, 0xc4, 0x32, 0x9b, 0x7c, 0x80, 0x7d,
+ 0x97, 0x96, 0xae, 0x90, 0x32, 0xee, 0xac, 0x02, 0x42, 0x49, 0x6b, 0x67,
+ 0x0f, 0x56, 0x16, 0x36, 0x1f, 0xd5, 0x3d, 0x54, 0xfe, 0x26, 0x97, 0x7d,
+ 0x4a, 0xe0, 0xed, 0x0e, 0xdd, 0x95, 0x3c, 0x78, 0x86, 0x7e, 0x2a, 0xa1,
+ 0xd8, 0x0f, 0xa7, 0xb2, 0x49, 0x04, 0x63, 0x95, 0xa3, 0x48, 0x59, 0xa6,
+ 0x31, 0x9d, 0x90, 0x2c, 0xd7, 0x76, 0x25, 0x54, 0x95, 0xae, 0xab, 0xca,
+ 0x55, 0xd7, 0xa0, 0x3b, 0xda, 0x2d, 0xc0, 0xb3, 0x2d, 0xf0, 0x93, 0x34,
+ 0x0d, 0x6b, 0xa5, 0x2e, 0x0b, 0x4e, 0x35, 0x87, 0x26, 0xec, 0xfe, 0x9d,
+ 0x08, 0x0e, 0x21, 0x1e, 0xd3, 0xcb, 0x15, 0x9b, 0x87, 0x22, 0x4e, 0x1a,
+ 0x85, 0xfc, 0x84, 0xb8, 0xe3, 0x52, 0x85, 0xac, 0x59, 0x19, 0x2e, 0x73,
+ 0x8c, 0x1a, 0xc3, 0x02, 0x83, 0xa0, 0xd0, 0xdd, 0x01, 0xb6, 0x8a, 0xd6,
+ 0x58, 0xd4, 0xa4, 0x05, 0x76, 0xd6, 0x2a, 0x3b, 0xb0, 0xd9, 0xc1, 0x3c,
+ 0x25, 0x3f, 0x49, 0x8e, 0xb0, 0xe2, 0x0c, 0x34, 0x2f, 0xd1, 0xec, 0x61,
+ 0xb2, 0xc4, 0xa7, 0x10, 0x14, 0x54, 0xcc, 0x26, 0xd6, 0xa7, 0x6b, 0xe7,
+ 0x0a, 0x6b, 0x31, 0x10, 0x54, 0x0f, 0xe7, 0x8c, 0x2c, 0x35, 0xd2, 0x26,
+ 0xd1, 0x04, 0x78, 0xc8, 0xcc, 0xf5, 0xe6, 0x97, 0xe4, 0x31, 0x3b, 0xe8,
+ 0x0f, 0xdd, 0x11, 0x7f, 0xa8, 0xe9, 0x29, 0x6a, 0x4a, 0x2e, 0x36, 0xc0,
+ 0xe1, 0x12, 0x99, 0x36, 0xda, 0xb4, 0xd9, 0x82, 0xb9, 0xc0, 0xfd, 0x06,
+ 0x71, 0x6b, 0x2e, 0x57, 0xad, 0x0a, 0x0d, 0x35, 0x37, 0x01, 0xce, 0xdf,
+ 0xff, 0x78, 0xfe, 0xb4, 0x93, 0xb3, 0xec, 0xa9, 0xc0, 0xf0, 0x16, 0x4e,
+ 0x78, 0x60, 0xfa, 0xc1, 0x40, 0xca, 0x2a, 0x18, 0x92, 0xd8, 0x23, 0x5c,
+ 0x3e, 0x9c, 0x3b, 0x18, 0xa9, 0x97, 0x08, 0xc1, 0x2d, 0xf9, 0x43, 0xf6,
+ 0xe4, 0x8b, 0x05, 0xa7, 0x35, 0xa9, 0x75, 0x20, 0xda, 0xd2, 0x0f, 0x19,
+ 0x2f, 0xc5, 0xbc, 0xaf, 0x35, 0x50, 0x99, 0x0e, 0xde, 0x34, 0x79, 0x56,
+ 0xc6, 0x48, 0xef, 0xad, 0x9a, 0xb2, 0x9c, 0x8f, 0xce, 0x7c, 0xfc, 0xa1,
+ 0x78, 0xef, 0xc6, 0x2c, 0x35, 0x4b, 0x43, 0x91, 0xfd, 0x24, 0x98, 0xf1,
+ 0x3c, 0xa3, 0x98, 0x12, 0x02, 0x41, 0xf4, 0xca, 0x8e, 0xd8, 0x38, 0xc2,
+ 0x20, 0xb1, 0x5f, 0x00, 0x1e, 0xbc, 0xa4, 0xfc, 0x10, 0x40, 0xb2, 0xba,
+ 0x45, 0x8c, 0x44, 0x14, 0x1c, 0x99, 0x28, 0x23, 0x99, 0x1d, 0xc7, 0x57,
+ 0x39, 0x2f, 0xfa, 0x07, 0x7d, 0xd5, 0x9d, 0x46, 0x74, 0x5e, 0xd9, 0x21,
+ 0xc3, 0x82, 0xcc, 0x20, 0x68, 0x82, 0x10, 0x44, 0xfd, 0x2a, 0x10, 0x5c,
+ 0xde, 0xcf, 0x42, 0x4d, 0x7b, 0x4e, 0xd5, 0x66, 0xc2, 0xef, 0x75, 0x73,
+ 0x4c, 0xb2, 0x47, 0x61, 0x74, 0x08, 0xac, 0x4c, 0xa2, 0x59, 0x92, 0x0d,
+ 0xd1, 0x98, 0x8d, 0xff, 0x35, 0x33, 0x32, 0x10, 0xd2, 0x15, 0x61, 0xec,
+ 0x42, 0xa5, 0xc1, 0x53, 0xd9, 0xc2, 0xf8, 0x65, 0x75, 0xe5, 0x91, 0xcc,
+ 0x25, 0xe6, 0x9d, 0x10, 0x0d, 0x84, 0x81, 0xe4, 0x66, 0xd1, 0xd3, 0xd1,
+ 0x4d, 0x7e, 0x37, 0xa3, 0x80, 0x2d, 0x7b, 0xd6, 0x84, 0xfc, 0xe3, 0x6d,
+ 0x4f, 0xe6, 0x25, 0xd4, 0xb8, 0x1a, 0xa7, 0x5f, 0x12, 0x9a, 0x69, 0x7f,
+ 0x17, 0x4b, 0x10, 0xed, 0x7a, 0x15, 0xe7, 0xde, 0x06, 0x85, 0x03, 0xdc,
+ 0x3a, 0xb8, 0x4d, 0xac, 0x14, 0xe0, 0x79, 0xcb, 0x02, 0x56, 0x9f, 0xa0,
+ 0x54, 0x5c, 0x49, 0xd9, 0xe8, 0x0e, 0x80, 0x59, 0x1e, 0x9f, 0x31, 0x67,
+ 0x02, 0x62, 0xc5, 0x83, 0x70, 0x84, 0xbf, 0xbb, 0x40, 0x17, 0x16, 0x37,
+ 0x94, 0xc2, 0x89, 0xa6, 0x4c, 0xf7, 0x0c, 0xae, 0xfd, 0x47, 0x90, 0xa6,
+ 0x2e, 0x28, 0xa0, 0x0b, 0x0c, 0x81, 0x4d, 0x92, 0x64, 0xc0, 0xb6, 0xf1,
+ 0xf0, 0xa4, 0x6e, 0x46, 0xe1, 0x14, 0x0c, 0x76, 0x66, 0x5b, 0x28, 0x3d,
+ 0xd3, 0x0a, 0x0d, 0xf8, 0xb6, 0xc4, 0x27, 0x53, 0x47, 0x11, 0x0e, 0xe4,
+ 0x58, 0xd2, 0xeb, 0x07, 0x18, 0x59, 0xd9, 0x9f, 0x26, 0x6a, 0xf3, 0x3e,
+ 0x54, 0xdc, 0xa3, 0x6e, 0x33, 0x2a, 0xe7, 0x9c, 0x0d, 0x75, 0x80, 0x77,
+ 0x32, 0xda, 0xc6, 0x3b, 0x7b, 0xe3, 0x5c, 0x2f, 0xa9, 0x79, 0x14, 0x57,
+ 0x9e, 0x6b, 0x1a, 0xda, 0x96, 0xec, 0xe3, 0x8d, 0xd3, 0x44, 0x8e, 0x64,
+ 0x85, 0xf6, 0x6e, 0xbb, 0x21, 0xc7, 0x32, 0x5e, 0x28, 0x09, 0x61, 0x56,
+ 0x76, 0x8c, 0x0e, 0xf9, 0xa1, 0xe5, 0xbc, 0xbc, 0x7a, 0xb3, 0x79, 0xd9,
+ 0xeb, 0x26, 0xdb, 0x5b, 0x07, 0x7b, 0x07, 0x1a, 0x3d, 0xde, 0x88, 0x61,
+ 0x54, 0x74, 0x59, 0xdc, 0xd0, 0x54, 0xc0, 0x60, 0x6a, 0x66, 0xc5, 0xac,
+ 0x16, 0x94, 0xdf, 0x49, 0xfb, 0x68, 0x6c, 0x05, 0x1d, 0x81, 0xf2, 0x74,
+ 0xac, 0xca, 0x40, 0xe1, 0xb4, 0x83, 0xec, 0x43, 0xde, 0x8f, 0x71, 0xbc,
+ 0x39, 0x4e, 0xcd, 0xea, 0x68, 0xe3, 0x70, 0x04, 0x70, 0xe3, 0x3b, 0x85,
+ 0x30, 0xca, 0xdf, 0x3d, 0x07, 0x17, 0x3a, 0xf9, 0xd7, 0x92, 0x5f, 0xb7,
+ 0x5a, 0xc7, 0xbf, 0xfd, 0x2d, 0x59, 0x3b, 0xa9, 0xe2, 0xa0, 0x7f, 0x7d,
+ 0xdf, 0x9f, 0x14, 0x27, 0x74, 0x4b, 0xda, 0xba, 0xed, 0xb4, 0x2e, 0xe8,
+ 0x46, 0x57, 0xa0, 0x9d, 0x0e, 0xe3, 0xc7, 0xdb, 0x16, 0xe6, 0x2f, 0xc0,
+ 0xf4, 0xd4, 0x66, 0x81, 0x9b, 0xbb, 0xad, 0xbf, 0xc2, 0x7b, 0x80, 0x3d,
+ 0x14, 0x78, 0x21, 0xb1, 0x23, 0x74, 0x3e, 0x83, 0xae, 0x33, 0x2f, 0x09,
+ 0xab, 0xc2, 0xa3, 0x87, 0x58, 0x7e, 0x24, 0x76, 0xaf, 0x82, 0x0a, 0xe3,
+ 0xc0, 0x3d, 0x22, 0x65, 0xb2, 0x03, 0x1f, 0x4c, 0x05, 0xaa, 0x83, 0xfb,
+ 0xed, 0xd9, 0x72, 0x62, 0x61, 0xbf, 0x18, 0xd0, 0x2b, 0x00, 0xd2, 0x8c,
+ 0x38, 0x4e, 0x66, 0x2b, 0x8a, 0xa6, 0xb0, 0x91, 0x0e, 0xf4, 0x1b, 0x1b,
+ 0x73, 0x06, 0xf9, 0x5d, 0xce, 0xe5, 0x28, 0x87, 0xd9, 0x14, 0x07, 0x39,
+ 0x7b, 0x10, 0x55, 0x9c, 0x0b, 0x80, 0x52, 0x64, 0x17, 0x3e, 0x2d, 0xe6,
+ 0x2d, 0x87, 0xf3, 0x98, 0xdc, 0x1b, 0x02, 0x04, 0x5b, 0xce, 0x08, 0x58,
+ 0xbc, 0x11, 0x18, 0x29, 0x49, 0x87, 0x03, 0xdd, 0x83, 0xee, 0xae, 0x81,
+ 0x1c, 0x38, 0xc8, 0x58, 0xf2, 0x36, 0x24, 0xee, 0x91, 0x37, 0x5a, 0xcf,
+ 0xf3, 0x29, 0x8f, 0x64, 0x75, 0xe5, 0x3f, 0x61, 0x16, 0xeb, 0xc6, 0x13,
+ 0x0e, 0x27, 0x51, 0xa3, 0x59, 0x66, 0x04, 0x16, 0xd2, 0x83, 0x32, 0x2b,
+ 0xa1, 0xfb, 0xc9, 0x73, 0x7a, 0x3f, 0xa7, 0xac, 0xf5, 0x78, 0xaa, 0x18,
+ 0x44, 0xc8, 0x5c, 0x74, 0x39, 0xeb, 0x40, 0x5a, 0xb0, 0x47, 0xaf, 0x63,
+ 0x0d, 0xd3, 0xa0, 0xaa, 0x15, 0x32, 0xc0, 0x81, 0x8b, 0x47, 0xae, 0x3d,
+ 0xde, 0x7e, 0xc0, 0x8a, 0x34, 0x52, 0x79, 0x55, 0x0e, 0xf9, 0x6a, 0x67,
+ 0x1c, 0xd3, 0x83, 0xd7, 0xf1, 0xf9, 0x72, 0x17, 0xc8, 0x04, 0x70, 0x50,
+ 0x18, 0x81, 0x60, 0x04, 0xa5, 0x29, 0x80, 0x52, 0xd6, 0xd5, 0x42, 0x48,
+ 0x89, 0x12, 0xc1, 0x39, 0xcc, 0xfb, 0xc5, 0xd0, 0xcc, 0xdd, 0xba, 0x3f,
+ 0xdb, 0x1b, 0x14, 0xb5, 0x3f, 0xcc, 0x47, 0x88, 0x1e, 0x1a, 0xeb, 0x39,
+ 0x20, 0x82, 0xa9, 0x62, 0x3a, 0xe1, 0xe1, 0x5c, 0xb1, 0x46, 0xda, 0x38,
+ 0x94, 0xfa, 0x5b, 0x9c, 0x30, 0x03, 0x27, 0x9d, 0xe9, 0x3d, 0x28, 0x8c,
+ 0xad, 0x32, 0xbf, 0xb3, 0xfd, 0xfb, 0xeb, 0x9f, 0xed, 0xfe, 0x12, 0x40,
+ 0x2e, 0xfe, 0x94, 0xc7, 0xf9, 0xa5, 0x5a, 0x11, 0xe6, 0x98, 0xea, 0x81,
+ 0xa8, 0x2f, 0x98, 0xda, 0x45, 0x1e, 0x6b, 0x3f, 0xc6, 0xd0, 0x09, 0x2d,
+ 0x27, 0xb6, 0x2c, 0x38, 0x0a, 0x9a, 0xec, 0xa3, 0x86, 0xd8, 0xa6, 0x2d,
+ 0x66, 0x88, 0x7d, 0x43, 0xc0, 0xc0, 0xd7, 0xe6, 0xe2, 0x4c, 0x79, 0xbc,
+ 0x9a, 0x35, 0x0a, 0xc3, 0x7b, 0xb9, 0xf6, 0x39, 0xd8, 0xc0, 0x82, 0x72,
+ 0x14, 0xc1, 0x2f, 0x96, 0xc3, 0x83, 0x90, 0x01, 0xfa, 0xaf, 0xbe, 0x06,
+ 0x06, 0x62, 0x8c, 0xa3, 0x2d, 0xc6, 0x73, 0x42, 0x08, 0x90, 0x9a, 0x82,
+ 0xb9, 0x55, 0xd7, 0xf4, 0x80, 0xfe, 0xba, 0xec, 0x60, 0x6a, 0x3b, 0x4c,
+ 0xc7, 0x4c, 0xac, 0x7b, 0xee, 0x7a, 0x3e, 0x1e, 0x4c, 0x07, 0xcb, 0x9e,
+ 0x52, 0xba, 0x79, 0x1f, 0x1b, 0xec, 0x9c, 0x2f, 0x2b, 0xdf, 0xb6, 0x4e,
+ 0x01, 0xa7, 0x24, 0x49, 0x2c, 0x5d, 0x37, 0x7e, 0x02, 0xa1, 0xb0, 0xa9,
+ 0x7e, 0x24, 0xa6, 0x8a, 0x25, 0x01, 0xd2, 0xb1, 0x73, 0x04, 0x3b, 0x03,
+ 0x0f, 0x1b, 0x4e, 0x5c, 0x14, 0xf4, 0xb8, 0xa8, 0x9a, 0xfd, 0xdd, 0x36,
+ 0x43, 0x07, 0x6e, 0xd8, 0xbc, 0xc7, 0xb3, 0x21, 0xa1, 0x6e, 0x90, 0x9a,
+ 0x9d, 0x95, 0x7d, 0xb7, 0xf6, 0x94, 0x95, 0x6b, 0x15, 0xee, 0xfd, 0x25,
+ 0x45, 0xee, 0xdd, 0x3d, 0x10, 0xb9, 0x77, 0xf7, 0x58, 0xe4, 0x26, 0x70,
+ 0xfc, 0x48, 0x58, 0x37, 0x2a, 0xa8, 0x83, 0x22, 0x2b, 0x15, 0x92, 0x81,
+ 0x92, 0xac, 0x83, 0x48, 0xb4, 0xc4, 0x77, 0xdd, 0x8b, 0x14, 0xdb, 0x5c,
+ 0xaa, 0x8e, 0xfc, 0xd8, 0x61, 0x22, 0x04, 0x9d, 0x40, 0xd1, 0xa1, 0xaa,
+ 0x84, 0xa3, 0x30, 0xd1, 0x38, 0xc5, 0x3f, 0x1e, 0x4a, 0x43, 0x3a, 0x65,
+ 0xb4, 0xe3, 0x0a, 0x1e, 0x0b, 0x56, 0x4e, 0xc7, 0xe6, 0x5b, 0x84, 0x6d,
+ 0x20, 0x46, 0x35, 0x1f, 0xd9, 0xc0, 0x02, 0xb4, 0x7c, 0xc2, 0xf0, 0xb1,
+ 0xd4, 0xa8, 0x47, 0x15, 0xaa, 0x4c, 0x36, 0x5b, 0x27, 0xb1, 0x59, 0x15,
+ 0x13, 0x69, 0xc9, 0x04, 0x32, 0xa9, 0x33, 0x42, 0x8d, 0x60, 0x1a, 0x87,
+ 0x65, 0xb1, 0xc1, 0x19, 0xce, 0x5d, 0x20, 0xc7, 0xd0, 0x8b, 0xe4, 0xeb,
+ 0x51, 0x7a, 0x97, 0x03, 0x13, 0x2f, 0x4f, 0xbe, 0xac, 0x6b, 0x7b, 0x07,
+ 0xe1, 0xb2, 0x77, 0x8e, 0x95, 0xb3, 0x52, 0xcd, 0x1a, 0xf9, 0x2b, 0x6b,
+ 0x1c, 0x61, 0x46, 0x84, 0xe8, 0x67, 0x03, 0x02, 0x10, 0x56, 0xb4, 0x55,
+ 0x18, 0xc9, 0xa6, 0x9d, 0x5c, 0x99, 0x13, 0xc4, 0xb4, 0x32, 0x34, 0x64,
+ 0x62, 0x67, 0x0a, 0x4b, 0xb8, 0xe8, 0x90, 0x47, 0x42, 0x19, 0xf7, 0xd5,
+ 0xa0, 0x45, 0x4d, 0x4b, 0x34, 0x24, 0x55, 0x5a, 0x23, 0xa0, 0xce, 0x30,
+ 0x61, 0x3b, 0x02, 0x8a, 0x1d, 0x4b, 0x23, 0x0e, 0x12, 0x59, 0x3c, 0xad,
+ 0x3d, 0x44, 0x3b, 0x8a, 0x10, 0x45, 0xee, 0x62, 0x36, 0x2b, 0xe4, 0x91,
+ 0x23, 0x10, 0x73, 0xad, 0x87, 0x03, 0x43, 0x22, 0x42, 0x32, 0x66, 0xa7,
+ 0x60, 0x2b, 0xbf, 0x6d, 0x71, 0x0e, 0xb3, 0xa1, 0x18, 0xb3, 0x02, 0x37,
+ 0xc3, 0xfc, 0x8e, 0x10, 0xd5, 0x0a, 0x4d, 0xc5, 0x18, 0x29, 0x00, 0x87,
+ 0xb9, 0x4a, 0x2c, 0xca, 0x7d, 0xd0, 0xf5, 0x13, 0x94, 0xc2, 0x31, 0xeb,
+ 0xd1, 0xd2, 0x22, 0x8b, 0xc3, 0x08, 0x70, 0x2f, 0x86, 0xaa, 0xc0, 0xbd,
+ 0xe9, 0xc6, 0x8e, 0x19, 0x1e, 0x8e, 0xa2, 0xc7, 0xf0, 0x1a, 0x05, 0x4e,
+ 0x00, 0x8c, 0xd5, 0xac, 0xc0, 0x6d, 0x7c, 0x4b, 0x1a, 0xb9, 0xa1, 0x11,
+ 0xe1, 0x87, 0x76, 0x04, 0x31, 0xc1, 0xdf, 0x2f, 0x15, 0xf4, 0xc9, 0x87,
+ 0x02, 0x6e, 0x67, 0xe2, 0x7d, 0xd5, 0x75, 0xb3, 0x97, 0xaa, 0x6b, 0xb6,
+ 0x80, 0xa1, 0x8f, 0x8b, 0xb5, 0xb8, 0x72, 0xf1, 0x7f, 0x20, 0x17, 0x6c,
+ 0xd7, 0x80, 0xb8, 0x53, 0x7c, 0xb7, 0x63, 0x5d, 0x9c, 0x0f, 0x63, 0x19,
+ 0x97, 0x1d, 0x05, 0x4c, 0x97, 0x62, 0x53, 0x4d, 0x19, 0x22, 0x42, 0x5e,
+ 0xb8, 0x8c, 0xff, 0x68, 0xda, 0xaa, 0xd9, 0xdf, 0x54, 0x98, 0x66, 0xd0,
+ 0x22, 0x61, 0x87, 0xa1, 0xbb, 0x2b, 0xcc, 0xe1, 0x4f, 0x71, 0x9e, 0x2a,
+ 0xa8, 0xc5, 0x52, 0x0c, 0xa7, 0xc6, 0x94, 0x6d, 0xb4, 0x95, 0xcf, 0x10,
+ 0xd5, 0x87, 0x75, 0xb9, 0x8f, 0xa5, 0x2e, 0xf7, 0x1c, 0xb4, 0x7d, 0x91,
+ 0x49, 0xa8, 0x00, 0xb3, 0xcf, 0xe0, 0x38, 0x40, 0x86, 0x0c, 0x20, 0xc4,
+ 0x8a, 0xf8, 0xb3, 0x9f, 0x56, 0x87, 0xe4, 0xe2, 0x0f, 0xb7, 0x12, 0x36,
+ 0x11, 0x20, 0x64, 0x5e, 0x5c, 0xbe, 0xee, 0xbc, 0x4c, 0x7a, 0xe7, 0x97,
+ 0xd7, 0x2f, 0x28, 0xff, 0x19, 0xc2, 0xf8, 0x67, 0x2e, 0x27, 0x7a, 0x5a,
+ 0x14, 0x89, 0x61, 0x53, 0xa3, 0xf2, 0xe9, 0x7b, 0xf6, 0x81, 0x6a, 0x41,
+ 0x4e, 0xa4, 0x57, 0x29, 0x14, 0xab, 0x1d, 0x15, 0x1e, 0x16, 0x70, 0x74,
+ 0x1f, 0x80, 0xf4, 0x35, 0xf5, 0x5c, 0x4c, 0x7f, 0x12, 0x35, 0xd5, 0x50,
+ 0xd5, 0x4f, 0xa1, 0x55, 0x5a, 0xbc, 0x52, 0xda, 0x18, 0x4b, 0x95, 0x91,
+ 0xe3, 0x68, 0x49, 0x80, 0x27, 0xa1, 0xd0, 0x92, 0xc4, 0xad, 0xac, 0x36,
+ 0xe5, 0x9c, 0x2c, 0x87, 0x45, 0xd6, 0xed, 0x18, 0x0b, 0xd4, 0xf3, 0xa9,
+ 0x45, 0x6b, 0x57, 0x23, 0xed, 0x9d, 0x5c, 0x53, 0x53, 0x9a, 0xf8, 0xee,
+ 0x8e, 0xea, 0x74, 0xa6, 0x2e, 0x19, 0x2f, 0xdc, 0x33, 0x90, 0x12, 0xd9,
+ 0x14, 0x37, 0x9d, 0xb5, 0xaa, 0x29, 0xb2, 0x1a, 0x3e, 0x2d, 0xea, 0x28,
+ 0xc9, 0xfa, 0x02, 0xb4, 0x3c, 0x4e, 0x10, 0x83, 0xb6, 0xb6, 0x1c, 0xb0,
+ 0x36, 0x20, 0x81, 0x37, 0x87, 0x04, 0xf4, 0xf9, 0xd5, 0xda, 0x17, 0xc0,
+ 0xdb, 0x7a, 0xc6, 0x23, 0x8d, 0x44, 0xd1, 0xf7, 0x2c, 0xa0, 0x95, 0x0e,
+ 0xa8, 0x60, 0x1a, 0x80, 0xab, 0x4b, 0x20, 0x56, 0xe5, 0x7d, 0xf6, 0x74,
+ 0x6a, 0x9e, 0x2e, 0x5b, 0xe0, 0x5c, 0x82, 0x0b, 0x9b, 0x70, 0x25, 0x59,
+ 0x27, 0x2b, 0xdd, 0x6e, 0xf7, 0x64, 0x83, 0x2a, 0xfd, 0x7e, 0x90, 0xba,
+ 0xe9, 0x25, 0xb2, 0x2f, 0xd8, 0x29, 0xf6, 0xfc, 0x49, 0x11, 0x10, 0xeb,
+ 0x41, 0xb0, 0xd7, 0x28, 0x31, 0xa9, 0xe8, 0x1b, 0x41, 0x20, 0x3b, 0x21,
+ 0x67, 0x34, 0xb8, 0x0a, 0x87, 0x00, 0x26, 0x8b, 0x6c, 0x12, 0x6f, 0x28,
+ 0x61, 0x85, 0x80, 0x81, 0x0f, 0xb3, 0x0f, 0xd9, 0xf0, 0xa4, 0xed, 0x92,
+ 0xe0, 0x7a, 0x62, 0xfb, 0x9c, 0x5f, 0x81, 0x56, 0x8d, 0xe6, 0xdb, 0xbf,
+ 0xfc, 0x8a, 0x09, 0x5c, 0xbf, 0xe2, 0xb6, 0x66, 0x1a, 0x4d, 0xa2, 0x61,
+ 0x4d, 0x8d, 0xcb, 0xab, 0x37, 0x2f, 0xd3, 0xe9, 0x4e, 0xa3, 0xdd, 0x96,
+ 0x0a, 0xd0, 0x2e, 0x66, 0x88, 0x7f, 0x53, 0x60, 0x17, 0x57, 0xff, 0xbc,
+ 0xba, 0xee, 0xbd, 0x4a, 0x34, 0xdb, 0x33, 0xbc, 0xae, 0xdd, 0x2f, 0x46,
+ 0x9b, 0x79, 0x59, 0xc0, 0x7f, 0x43, 0xf3, 0x00, 0x78, 0x95, 0xdb, 0xb2,
+ 0xe9, 0x1a, 0x89, 0xf0, 0x17, 0x78, 0xc5, 0xb8, 0x78, 0xd4, 0x59, 0xfc,
+ 0x53, 0x7e, 0xe9, 0x5f, 0xf9, 0x55, 0x27, 0xbf, 0xfd, 0x76, 0x5a, 0x09,
+ 0xfe, 0xf1, 0x2c, 0xdd, 0xde, 0x31, 0x17, 0xd8, 0x1f, 0xe6, 0xd6, 0xb0,
+ 0xf3, 0x8d, 0x57, 0xba, 0xfe, 0x17, 0x4f, 0xc5, 0xc0, 0xab, 0xfb, 0xd5,
+ 0x8b, 0x49, 0x84, 0x70, 0xaa, 0xcc, 0xca, 0x17, 0xcf, 0xb7, 0x8c, 0x2c,
+ 0x57, 0xfb, 0xd3, 0x26, 0xc8, 0x1c, 0x45, 0x12, 0x64, 0xa8, 0x25, 0x0f,
+ 0x81, 0xcc, 0x5d, 0xaa, 0xb1, 0x9f, 0xfc, 0xd0, 0xa3, 0xfb, 0xe9, 0x2f,
+ 0x59, 0x45, 0xcc, 0x4a, 0xa8, 0xcc, 0x88, 0xaa, 0x67, 0x8c, 0x53, 0x1a,
+ 0xe0, 0x0e, 0x40, 0x94, 0xf2, 0x0d, 0x2d, 0x6f, 0xb9, 0xc1, 0xb7, 0xbd,
+ 0x6a, 0x6d, 0x2a, 0x68, 0x18, 0x1e, 0x7e, 0x5b, 0x11, 0xad, 0xa8, 0x51,
+ 0x0e, 0xaa, 0x89, 0xd9, 0x2f, 0xa4, 0x9f, 0x3c, 0x2e, 0xe9, 0x6e, 0x90,
+ 0x28, 0xc2, 0x35, 0x0f, 0x92, 0x2f, 0x52, 0xb8, 0x4b, 0xe6, 0xd2, 0x9a,
+ 0x9a, 0xa4, 0x20, 0x54, 0x7d, 0x55, 0xd3, 0x45, 0x05, 0xc8, 0xde, 0xfa,
+ 0xa3, 0x7a, 0xfb, 0x29, 0xa3, 0x0a, 0xed, 0x35, 0x35, 0xd5, 0xc3, 0x22,
+ 0x03, 0x5e, 0x30, 0x45, 0xd0, 0x9b, 0x5b, 0x5a, 0xc8, 0xdb, 0x79, 0x93,
+ 0xe4, 0x17, 0x5a, 0xfb, 0x13, 0x6b, 0xac, 0x26, 0x38, 0x20, 0xdf, 0xdb,
+ 0xb9, 0xd6, 0x3f, 0x86, 0x0f, 0x53, 0x5f, 0xb8, 0xbb, 0x96, 0x90, 0x1d,
+ 0xb5, 0xfe, 0xe1, 0xa7, 0x8a, 0xf4, 0x58, 0xda, 0xbf, 0x3c, 0x37, 0xcf,
+ 0xdb, 0xcf, 0x11, 0x72, 0x39, 0x37, 0x02, 0x1a, 0xad, 0x95, 0xfd, 0x48,
+ 0x83, 0xdf, 0xd0, 0x23, 0xb7, 0xcf, 0xac, 0xa9, 0xb6, 0x4d, 0xf7, 0xd7,
+ 0x4e, 0xd5, 0x17, 0xb5, 0x27, 0x92, 0x60, 0x36, 0x42, 0x19, 0xeb, 0x11,
+ 0x44, 0xb4, 0x7b, 0x04, 0xb0, 0x20, 0x09, 0xe2, 0x97, 0x8b, 0x32, 0x81,
+ 0x84, 0x7d, 0x11, 0xaf, 0x42, 0x62, 0xba, 0xf5, 0x68, 0xe9, 0xd3, 0xa6,
+ 0x2d, 0x80, 0xb9, 0xae, 0x9f, 0xa1, 0x65, 0x33, 0x64, 0x96, 0xa8, 0x3f,
+ 0xe7, 0xa0, 0x87, 0x95, 0x1e, 0x24, 0xaa, 0x4c, 0x58, 0x05, 0x94, 0x1c,
+ 0x0b, 0x56, 0x83, 0x09, 0x1c, 0x07, 0x28, 0x75, 0x15, 0x13, 0xab, 0x71,
+ 0x20, 0xca, 0x01, 0x49, 0x89, 0x81, 0x28, 0xd8, 0x0c, 0x63, 0x0e, 0x50,
+ 0x27, 0x7c, 0x5e, 0xdc, 0x81, 0x4d, 0x75, 0x40, 0xbf, 0xac, 0x74, 0xbc,
+ 0x54, 0xe7, 0x81, 0x0f, 0x02, 0x5a, 0x57, 0x22, 0xcd, 0x06, 0x92, 0x92,
+ 0x62, 0xcd, 0xe5, 0xd2, 0x4e, 0x82, 0x02, 0x59, 0x04, 0xf3, 0x5a, 0x53,
+ 0x48, 0x2f, 0xf1, 0xea, 0xe8, 0xc5, 0xed, 0x15, 0x23, 0xa3, 0x26, 0xe4,
+ 0x20, 0x2a, 0x60, 0xcc, 0x41, 0xb4, 0x4c, 0x95, 0xd8, 0x41, 0x5b, 0x5e,
+ 0xb5, 0xf1, 0x4b, 0xb1, 0x8e, 0xf6, 0xec, 0x6e, 0xae, 0x3f, 0x3d, 0xa9,
+ 0x09, 0x15, 0xa8, 0xe5, 0x3f, 0x0d, 0x6e, 0x00, 0x97, 0xa2, 0x73, 0x8d,
+ 0xf1, 0x43, 0x34, 0x8b, 0xd6, 0x07, 0xee, 0xd7, 0xe1, 0x82, 0x55, 0x59,
+ 0x96, 0x7c, 0x9b, 0x82, 0x47, 0x46, 0x19, 0x47, 0x6e, 0x45, 0x38, 0x86,
+ 0x4e, 0x28, 0xea, 0xd4, 0xda, 0x7b, 0xbd, 0x78, 0x28, 0xc1, 0xae, 0x47,
+ 0x08, 0x97, 0xa4, 0x04, 0x19, 0x0d, 0x2a, 0xd4, 0x4a, 0xf4, 0xe6, 0xea,
+ 0x8a, 0x44, 0x4f, 0x16, 0x37, 0xff, 0x69, 0x64, 0x5f, 0x02, 0x54, 0x09,
+ 0xdc, 0x53, 0x9a, 0x84, 0x4b, 0x5f, 0xc3, 0xf7, 0xed, 0x4c, 0x2e, 0x3c,
+ 0xc1, 0x99, 0x9a, 0x10, 0x97, 0x4a, 0x65, 0x08, 0x49, 0xa0, 0x02, 0xc5,
+ 0x05, 0x44, 0xdd, 0xac, 0x81, 0x50, 0xec, 0xec, 0x04, 0x50, 0xb8, 0x6b,
+ 0x3c, 0x45, 0x15, 0x45, 0x6a, 0x78, 0x71, 0x5b, 0x1f, 0x68, 0xbe, 0xec,
+ 0x7e, 0xb1, 0x6a, 0x0f, 0x23, 0x00, 0x52, 0x09, 0x3b, 0xc0, 0xb2, 0x92,
+ 0xc4, 0x9d, 0x09, 0x6a, 0x90, 0xcb, 0x05, 0xc9, 0x25, 0x7e, 0x34, 0xd8,
+ 0x0b, 0x33, 0x8f, 0x99, 0xd5, 0xf3, 0x71, 0xc3, 0x82, 0x4e, 0x00, 0xd3,
+ 0xdf, 0x52, 0x4f, 0x49, 0xc1, 0x03, 0x09, 0x68, 0x0f, 0x16, 0x88, 0xec,
+ 0x4d, 0xb1, 0x52, 0xf0, 0x1c, 0x14, 0x78, 0x5a, 0xa7, 0xe7, 0xb9, 0xd8,
+ 0x43, 0x25, 0x27, 0x57, 0xdb, 0x57, 0x6b, 0x53, 0x13, 0x44, 0xff, 0x76,
+ 0x76, 0xd3, 0xba, 0x9a, 0x1a, 0xfd, 0xbe, 0x4c, 0x1a, 0xd7, 0x5c, 0xf6,
+ 0x2d, 0x05, 0x49, 0xde, 0x0c, 0x03, 0x82, 0x8f, 0x25, 0x99, 0xda, 0x88,
+ 0xc3, 0x5e, 0xf0, 0x4f, 0x7b, 0x1e, 0xc8, 0x1b, 0x8a, 0xac, 0x1f, 0x63,
+ 0x7b, 0x4e, 0xd8, 0xed, 0x52, 0x7b, 0x8e, 0x75, 0x6b, 0x71, 0xb7, 0x7a,
+ 0x8f, 0x3e, 0xc9, 0xfe, 0x52, 0x53, 0x89, 0xb5, 0x33, 0x79, 0x06, 0x0c,
+ 0x5b, 0x21, 0x04, 0x4a, 0xbb, 0x39, 0xac, 0x15, 0xcc, 0xdb, 0x1c, 0x4d,
+ 0x85, 0x65, 0x58, 0xb2, 0x65, 0xfa, 0x79, 0xb2, 0xae, 0xdf, 0xad, 0xb8,
+ 0xd0, 0x4b, 0x91, 0xfc, 0x72, 0xb2, 0x55, 0x4e, 0x52, 0x12, 0x0c, 0xf4,
+ 0x71, 0x3a, 0x74, 0x27, 0x3c, 0x1f, 0x45, 0x91, 0xd3, 0x51, 0x9f, 0x63,
+ 0x22, 0x5d, 0xa8, 0xe3, 0xcc, 0x89, 0x5c, 0xa4, 0xc0, 0x2c, 0x23, 0x43,
+ 0x5e, 0x21, 0x9e, 0xfd, 0x4b, 0xda, 0x59, 0xe6, 0x0e, 0xfd, 0xd5, 0x3f,
+ 0x20, 0x39, 0x90, 0xe3, 0xed, 0x4f, 0x67, 0x2f, 0x2f, 0xbb, 0xcb, 0x34,
+ 0x6d, 0x28, 0x2d, 0x1f, 0xd8, 0x96, 0xf5, 0xb7, 0xa5, 0xc5, 0xd5, 0x85,
+ 0xbd, 0x5b, 0x54, 0xa3, 0xc2, 0x89, 0x3c, 0x52, 0xa0, 0xc2, 0x49, 0x3e,
+ 0x0b, 0x4a, 0xe4, 0xae, 0xbd, 0xc6, 0x82, 0x6b, 0x9f, 0x20, 0x97, 0x56,
+ 0xeb, 0x44, 0xb4, 0x7c, 0xc7, 0x62, 0xb4, 0xb0, 0xc1, 0x65, 0x04, 0x36,
+ 0xbc, 0x4e, 0x62, 0xa3, 0x44, 0x36, 0x8c, 0x6f, 0x68, 0xda, 0xe2, 0x8d,
+ 0xce, 0xee, 0x57, 0xe5, 0xa2, 0x4b, 0x98, 0x92, 0x4e, 0x28, 0xde, 0xf4,
+ 0x31, 0x2f, 0x33, 0xc6, 0x72, 0x4d, 0x7d, 0x93, 0x4b, 0xbc, 0x1c, 0x41,
+ 0x2b, 0xb4, 0x5f, 0x5b, 0x74, 0xf8, 0xaa, 0x05, 0x7b, 0x81, 0x08, 0x55,
+ 0xa9, 0xb5, 0x63, 0x77, 0xaa, 0xb5, 0x92, 0x3d, 0xaf, 0xa6, 0x43, 0x1c,
+ 0x47, 0x3d, 0x62, 0xfc, 0x0c, 0xf8, 0x50, 0x69, 0x0e, 0x4a, 0x1b, 0x8d,
+ 0x4c, 0x44, 0x97, 0x5c, 0xda, 0x98, 0xd6, 0x86, 0x8c, 0x43, 0x51, 0xef,
+ 0x42, 0x3a, 0x75, 0x87, 0xb7, 0x63, 0x61, 0x6b, 0x1c, 0x73, 0x7d, 0x4a,
+ 0x45, 0x25, 0x6c, 0x1d, 0x35, 0x4c, 0x79, 0xe1, 0x93, 0xfc, 0x92, 0x57,
+ 0xe2, 0x0b, 0x46, 0x1f, 0x1f, 0x51, 0x89, 0x49, 0x41, 0xf8, 0xff, 0xe9,
+ 0xdd, 0xa5, 0x27, 0x8f, 0x8a, 0x31, 0xb5, 0x9a, 0x50, 0xf8, 0xd9, 0x52,
+ 0x2c, 0x28, 0xc7, 0x42, 0x92, 0x2c, 0x56, 0x57, 0xd6, 0x31, 0x44, 0xe3,
+ 0x56, 0xb2, 0xa2, 0xbf, 0xbd, 0xc9, 0x6f, 0xac, 0x71, 0x7d, 0x72, 0xdb,
+ 0xdf, 0xd9, 0x3d, 0x3e, 0x40, 0x34, 0xc8, 0xd9, 0xc3, 0x00, 0xdd, 0x46,
+ 0x37, 0x4f, 0xd5, 0x7b, 0x0e, 0x77, 0x77, 0xcc, 0x3d, 0x1b, 0xca, 0x89,
+ 0xf9, 0xd9, 0x4c, 0xdc, 0x87, 0xd8, 0xdf, 0x43, 0xe9, 0x2f, 0x20, 0x6c,
+ 0x4f, 0xd1, 0x1a, 0x8d, 0x9e, 0x25, 0x85, 0xca, 0x06, 0x86, 0xd7, 0x1b,
+ 0xb4, 0x4d, 0x52, 0x98, 0x9e, 0xc4, 0x42, 0xfb, 0xc2, 0xef, 0x54, 0x62,
+ 0x9b, 0x67, 0xfd, 0xa9, 0x16, 0x20, 0xd7, 0xca, 0x58, 0x1a, 0xb8, 0x0d,
+ 0xb6, 0xb9, 0x94, 0xd3, 0x0e, 0xab, 0xb5, 0x72, 0xfa, 0xf9, 0xad, 0x91,
+ 0xeb, 0xa8, 0xfa, 0x99, 0x25, 0x25, 0x33, 0x9d, 0x01, 0x40, 0x64, 0xca,
+ 0xf1, 0x53, 0x12, 0x78, 0xe5, 0x24, 0xb2, 0x0d, 0xb6, 0xf0, 0x4a, 0x24,
+ 0x7f, 0x2a, 0xf5, 0x4e, 0x5c, 0x73, 0x3a, 0x5d, 0xf6, 0xa7, 0x31, 0x18,
+ 0x11, 0x15, 0xdf, 0xb0, 0xa5, 0x95, 0x20, 0x6d, 0x50, 0x65, 0x86, 0x15,
+ 0xb3, 0x29, 0x64, 0x0c, 0x90, 0x92, 0xd1, 0x2f, 0x1e, 0x5c, 0x7d, 0x41,
+ 0x4f, 0xc6, 0x30, 0x5d, 0xcd, 0xda, 0x77, 0x6d, 0x89, 0xa2, 0x34, 0x9c,
+ 0x0c, 0x66, 0xca, 0xab, 0xa9, 0x21, 0x64, 0x81, 0x88, 0x65, 0xd0, 0xcd,
+ 0xbc, 0x3f, 0x33, 0x3c, 0x82, 0xc2, 0x22, 0xc8, 0x8d, 0x6f, 0xe5, 0x4e,
+ 0x70, 0x9d, 0xda, 0xd4, 0xf4, 0xda, 0x27, 0x35, 0x1e, 0xaa, 0xd7, 0x9b,
+ 0x0d, 0xc0, 0x9d, 0x1c, 0x9a, 0x8f, 0x1f, 0xb2, 0xc4, 0x6c, 0x8a, 0x92,
+ 0xe2, 0xa8, 0xed, 0x25, 0x0e, 0xe9, 0x32, 0x14, 0xe0, 0x85, 0x98, 0xb9,
+ 0x2c, 0x04, 0xf2, 0xb7, 0xbb, 0x1a, 0x2f, 0x55, 0x11, 0x6d, 0x75, 0x85,
+ 0x92, 0x86, 0xa1, 0x66, 0xa3, 0x79, 0x43, 0x32, 0x42, 0xf0, 0x2c, 0x30,
+ 0xbe, 0x91, 0x20, 0xeb, 0xbf, 0x69, 0x61, 0xd6, 0x8c, 0x10, 0x8e, 0x8e,
+ 0xe9, 0xe7, 0x67, 0xf9, 0xdd, 0xca, 0xe3, 0xb2, 0x5c, 0xa6, 0xd0, 0xea,
+ 0x4a, 0x2c, 0x55, 0x08, 0x67, 0x1a, 0x0c, 0xc4, 0x0e, 0x7f, 0xb6, 0xaa,
+ 0xe1, 0xb2, 0x9f, 0xa4, 0xea, 0x8b, 0xac, 0x76, 0xd3, 0x4a, 0xb7, 0x5f,
+ 0x82, 0xbd, 0x1d, 0x22, 0x7b, 0x3b, 0x8c, 0xb3, 0x37, 0x5b, 0xc8, 0x01,
+ 0x95, 0x57, 0x0b, 0x42, 0x99, 0x95, 0xfd, 0xf4, 0x81, 0x35, 0x97, 0x7e,
+ 0x36, 0xc1, 0x2d, 0xec, 0x52, 0x93, 0xa9, 0xd4, 0xf0, 0x20, 0x2f, 0x53,
+ 0x10, 0x1e, 0x11, 0xe9, 0xc0, 0xc5, 0x95, 0x4a, 0xe2, 0x2b, 0xd5, 0xbf,
+ 0x19, 0xb7, 0x3a, 0x57, 0xdd, 0xcb, 0x4b, 0x0f, 0xbe, 0xf2, 0x61, 0x38,
+ 0x63, 0x13, 0x81, 0x60, 0x1b, 0x69, 0x94, 0x4a, 0x70, 0x93, 0x11, 0xdb,
+ 0x63, 0xf0, 0x8b, 0x64, 0xa7, 0xbd, 0x87, 0xb9, 0x04, 0x75, 0x5c, 0x30,
+ 0x48, 0x1d, 0x1b, 0xcf, 0x46, 0x37, 0x00, 0xfc, 0x96, 0xdf, 0xc1, 0x7e,
+ 0xf2, 0x77, 0x3a, 0xc5, 0xc6, 0x71, 0xf4, 0x5c, 0x12, 0x8f, 0x9e, 0xd3,
+ 0x29, 0xd8, 0xac, 0x17, 0x96, 0xff, 0x9a, 0xa1, 0x67, 0xf4, 0xc6, 0xfc,
+ 0xf0, 0x3e, 0x9b, 0xea, 0x5b, 0x8c, 0xde, 0xc0, 0xb3, 0x10, 0xe5, 0xd4,
+ 0xc4, 0x85, 0xdb, 0xc9, 0xb9, 0x9d, 0x2c, 0x6f, 0xb0, 0xe2, 0x8f, 0xc7,
+ 0xf9, 0x0e, 0x25, 0x72, 0x07, 0x36, 0xac, 0x0f, 0x1d, 0x85, 0x95, 0x8a,
+ 0x69, 0x30, 0x83, 0x48, 0xcb, 0x9c, 0xa4, 0xf4, 0xc1, 0xac, 0x1c, 0x71,
+ 0xe1, 0x9f, 0xae, 0x2f, 0x5a, 0x47, 0xd5, 0xde, 0xed, 0x1c, 0x1e, 0xa3,
+ 0x40, 0xc6, 0x99, 0x6a, 0x02, 0x7e, 0x71, 0xf3, 0x24, 0xb9, 0x18, 0x55,
+ 0x7c, 0xd6, 0x0e, 0x44, 0xb5, 0x98, 0x77, 0x60, 0x4e, 0xb4, 0xd1, 0x27,
+ 0xcb, 0x87, 0x82, 0x8a, 0xc2, 0x63, 0xf0, 0x77, 0xb4, 0x33, 0x98, 0x7d,
+ 0xc1, 0x03, 0x24, 0xaf, 0x3d, 0xcc, 0x29, 0xec, 0x77, 0x4b, 0x66, 0xa3,
+ 0xcc, 0xdc, 0x3e, 0xce, 0xcb, 0x51, 0xb2, 0x4e, 0x0e, 0x70, 0xc4, 0xda,
+ 0x50, 0x03, 0xf0, 0x17, 0xe9, 0xdb, 0x0f, 0xe9, 0xe4, 0xf4, 0xc7, 0x1f,
+ 0x8d, 0x5c, 0x63, 0xfe, 0x36, 0x31, 0x77, 0xc2, 0xbc, 0xe3, 0xc7, 0x1f,
+ 0x05, 0xcf, 0x59, 0xc5, 0xf1, 0xba, 0x64, 0x1b, 0xe6, 0x4f, 0x30, 0x38,
+ 0x52, 0x9d, 0x37, 0x6a, 0x86, 0x08, 0xc4, 0x5d, 0x4c, 0xf2, 0x3b, 0x4c,
+ 0xa5, 0x8e, 0x03, 0x57, 0x32, 0x34, 0xb4, 0x19, 0x3e, 0xd8, 0x62, 0xbc,
+ 0xd0, 0x69, 0x01, 0x1c, 0xac, 0xa2, 0xd0, 0x2a, 0xc8, 0xd9, 0x4a, 0x56,
+ 0x1c, 0x28, 0x07, 0x36, 0x4e, 0x34, 0x2c, 0xaa, 0xd5, 0x38, 0x85, 0x7c,
+ 0x14, 0xb3, 0xfa, 0x39, 0x3b, 0x68, 0xed, 0xb9, 0xa4, 0x45, 0x26, 0xac,
+ 0xce, 0x6e, 0xb9, 0x8d, 0xbb, 0x4e, 0xc6, 0x25, 0xd9, 0x95, 0x92, 0x60,
+ 0x17, 0xbe, 0x43, 0x04, 0x2e, 0x6d, 0xd0, 0xe8, 0x84, 0x66, 0xaa, 0x74,
+ 0x3a, 0x05, 0xcc, 0x67, 0x5e, 0xee, 0x49, 0x36, 0x9d, 0xe4, 0xd9, 0x87,
+ 0xcc, 0x97, 0xe8, 0xc4, 0x86, 0x02, 0x6f, 0x85, 0x50, 0x55, 0xf4, 0x47,
+ 0xe1, 0xdb, 0x74, 0x67, 0x91, 0x2f, 0x4f, 0x30, 0x33, 0x99, 0x84, 0xf6,
+ 0x69, 0x86, 0x11, 0x3d, 0x43, 0xec, 0x3e, 0x72, 0xfd, 0xa5, 0x25, 0xbe,
+ 0x4f, 0x88, 0x89, 0xaa, 0x8a, 0x7c, 0x49, 0x55, 0xe2, 0x6b, 0x23, 0x1e,
+ 0x86, 0x97, 0xea, 0x0f, 0x44, 0x30, 0x1b, 0x4b, 0x8a, 0xf7, 0x00, 0x4e,
+ 0x00, 0x97, 0x27, 0x2e, 0xa3, 0xfd, 0x92, 0xd1, 0x05, 0xcb, 0xc9, 0xaa,
+ 0x7e, 0x70, 0x06, 0x72, 0x30, 0x12, 0x63, 0xd8, 0x82, 0x04, 0x69, 0x6d,
+ 0x88, 0x63, 0x90, 0xb2, 0xb2, 0x41, 0x45, 0xd7, 0x60, 0x6d, 0xb3, 0x41,
+ 0x93, 0x32, 0x72, 0x09, 0xd6, 0x1b, 0x1d, 0xac, 0x1a, 0xc8, 0x95, 0xdb,
+ 0xab, 0xd0, 0x8f, 0x0d, 0x2d, 0x52, 0x68, 0xad, 0xd3, 0x62, 0x75, 0xc5,
+ 0xc3, 0x1b, 0x56, 0x7c, 0x53, 0x60, 0x7e, 0x29, 0x5a, 0xbf, 0x0a, 0x7f,
+ 0xec, 0xbd, 0x54, 0x61, 0xa7, 0x8c, 0x8a, 0x0f, 0xae, 0x36, 0x98, 0xef,
+ 0x07, 0x0e, 0xec, 0x1d, 0xc9, 0x12, 0x98, 0xa6, 0x46, 0x12, 0x1b, 0xb7,
+ 0xee, 0xa9, 0x74, 0xd5, 0x3c, 0xef, 0x27, 0xc8, 0x9e, 0x90, 0xc3, 0x65,
+ 0x94, 0x40, 0x70, 0x82, 0xde, 0x14, 0xf9, 0x30, 0x9b, 0x18, 0x5e, 0x30,
+ 0xcd, 0x36, 0xdf, 0x98, 0x26, 0x7e, 0x84, 0x16, 0xc0, 0x45, 0x1a, 0x62,
+ 0x9f, 0x46, 0xdb, 0x27, 0x0b, 0x42, 0xd2, 0x68, 0x6d, 0x6e, 0x5e, 0xdb,
+ 0x76, 0xcd, 0xe7, 0xde, 0x3f, 0xae, 0x93, 0x2b, 0x8c, 0x45, 0x02, 0x68,
+ 0x0b, 0xfb, 0x64, 0xa2, 0xdf, 0xb6, 0xd9, 0x7b, 0xdd, 0x50, 0x4d, 0x7d,
+ 0x8e, 0x3e, 0xe2, 0x4b, 0x5a, 0x0f, 0xb0, 0x3f, 0x2b, 0x53, 0xd0, 0x6e,
+ 0x6f, 0xde, 0x4d, 0xd2, 0xdb, 0xfc, 0xa3, 0x6a, 0xe2, 0x2e, 0xbf, 0xd5,
+ 0x5d, 0x40, 0x2b, 0x41, 0x62, 0x2e, 0x26, 0x55, 0xfb, 0x58, 0xd5, 0xb7,
+ 0x0b, 0x03, 0x16, 0x4b, 0x98, 0x4a, 0x9f, 0x57, 0x51, 0x24, 0x9e, 0x89,
+ 0xcc, 0x33, 0xb0, 0xc1, 0xb3, 0xe7, 0x9e, 0x43, 0x18, 0x38, 0x35, 0xe6,
+ 0x0f, 0xc7, 0x1d, 0xaf, 0xce, 0x54, 0x15, 0x46, 0x88, 0x7c, 0x41, 0x6d,
+ 0x72, 0x7b, 0x0b, 0x6b, 0xe7, 0x99, 0x3f, 0xbc, 0x47, 0x29, 0xbc, 0x4a,
+ 0xf6, 0xe6, 0xea, 0xca, 0x29, 0xc1, 0xe1, 0xdf, 0x68, 0xb0, 0x7d, 0x62,
+ 0xca, 0x08, 0xa3, 0x55, 0xa9, 0xd5, 0x75, 0xba, 0xb8, 0x04, 0xd6, 0x9c,
+ 0x39, 0x08, 0x0b, 0x60, 0xed, 0xb4, 0xf7, 0x6d, 0x09, 0xac, 0xdd, 0x8a,
+ 0xf7, 0xd9, 0x9b, 0x62, 0xb0, 0x0f, 0xc9, 0x05, 0x65, 0x2d, 0xfa, 0xfa,
+ 0x21, 0x2f, 0x4e, 0x3c, 0x33, 0xc6, 0xcf, 0x19, 0xc6, 0xaa, 0x5c, 0x1a,
+ 0x85, 0xa7, 0x71, 0xaa, 0xbe, 0xc4, 0x0a, 0x8e, 0xf6, 0x58, 0xcc, 0xa4,
+ 0xb7, 0xe8, 0x6f, 0xf3, 0xdc, 0xb0, 0x89, 0x79, 0x69, 0xff, 0xe4, 0x79,
+ 0xbe, 0xaa, 0x70, 0x36, 0x2d, 0x87, 0xb2, 0x4a, 0x1a, 0x73, 0x43, 0x88,
+ 0x60, 0xc5, 0xc4, 0xe8, 0x20, 0xd4, 0x8c, 0x42, 0x82, 0x95, 0xfd, 0x27,
+ 0x79, 0x5d, 0x44, 0x5a, 0x4d, 0x6d, 0x60, 0x4b, 0x4a, 0x11, 0xea, 0x0f,
+ 0x45, 0x49, 0x07, 0xb5, 0xc2, 0x36, 0x47, 0xb5, 0xd6, 0xa9, 0xa1, 0x64,
+ 0xbc, 0xce, 0x62, 0xe4, 0xf9, 0x14, 0x46, 0x03, 0xcf, 0x31, 0x35, 0x7c,
+ 0x0a, 0x74, 0x11, 0x06, 0x90, 0x1f, 0xef, 0xa9, 0x68, 0xe0, 0x70, 0x48,
+ 0x14, 0x71, 0x5b, 0xd7, 0x3d, 0xb1, 0x3b, 0xab, 0x24, 0x78, 0xd1, 0x96,
+ 0x3f, 0x3d, 0x03, 0xbf, 0x1a, 0xb3, 0x56, 0x31, 0xb1, 0x53, 0x06, 0x41,
+ 0xc0, 0x38, 0x7e, 0x81, 0xc8, 0xd5, 0x0b, 0x8a, 0xc5, 0xae, 0x65, 0x22,
+ 0x5c, 0x02, 0xc8, 0x87, 0x56, 0x80, 0x61, 0xe8, 0x48, 0xee, 0x1c, 0xd3,
+ 0xb5, 0xf0, 0x34, 0x64, 0x07, 0xa6, 0xca, 0x74, 0x1b, 0xa6, 0x37, 0x19,
+ 0x82, 0x5d, 0x68, 0x4a, 0x96, 0x06, 0x9d, 0xfe, 0x89, 0xb4, 0x6a, 0x74,
+ 0x59, 0x35, 0x75, 0x62, 0x91, 0xac, 0x4c, 0xa1, 0x7a, 0x37, 0xc6, 0xd7,
+ 0x2e, 0xf5, 0x72, 0x0d, 0x27, 0x4a, 0xc3, 0xed, 0xb1, 0x8a, 0x69, 0xbf,
+ 0x71, 0x1f, 0xbe, 0x64, 0x0e, 0xc2, 0xf6, 0xd6, 0x31, 0x71, 0x38, 0x09,
+ 0x29, 0xef, 0x0c, 0x21, 0x23, 0x7a, 0x4e, 0xcc, 0x2d, 0x68, 0x00, 0x7a,
+ 0xb2, 0x6f, 0xb4, 0x73, 0xb0, 0xb2, 0xf6, 0xf5, 0x7c, 0x4e, 0x2f, 0xb7,
+ 0xe5, 0xed, 0xb1, 0x10, 0xc4, 0x80, 0xad, 0xf9, 0xd3, 0xc5, 0xac, 0xcd,
+ 0x9f, 0xb5, 0xa8, 0x31, 0xdc, 0xb1, 0x43, 0xc7, 0x07, 0x2b, 0x15, 0x7f,
+ 0x59, 0xe0, 0x6d, 0x38, 0x7c, 0x93, 0x85, 0x59, 0x49, 0xf0, 0xea, 0x5e,
+ 0x43, 0x47, 0xfb, 0xab, 0x3e, 0xf5, 0xfe, 0x4c, 0x67, 0x16, 0xe2, 0xcc,
+ 0xda, 0x8e, 0x7d, 0x4e, 0xc0, 0xd4, 0x0a, 0x45, 0xd8, 0xf8, 0xa2, 0x78,
+ 0x09, 0x63, 0xe5, 0xb7, 0x5b, 0x66, 0x83, 0xd0, 0xe6, 0xac, 0x5a, 0x03,
+ 0x01, 0x3f, 0x68, 0xe9, 0x2d, 0x13, 0x5d, 0x26, 0xb3, 0x59, 0x8d, 0xa8,
+ 0x2b, 0x9d, 0x89, 0xc5, 0xf8, 0x2f, 0xa6, 0x5d, 0x29, 0xcb, 0x0c, 0x0c,
+ 0x91, 0x75, 0x3f, 0x14, 0x9a, 0x83, 0xa0, 0xfa, 0x7c, 0xec, 0xda, 0xcc,
+ 0x55, 0xf5, 0x3a, 0x01, 0x73, 0x46, 0xc3, 0x84, 0xf2, 0x50, 0x0b, 0x8e,
+ 0x10, 0x47, 0x50, 0x78, 0xd0, 0x32, 0x98, 0x3f, 0x2f, 0x38, 0x7e, 0x84,
+ 0x1b, 0x88, 0x55, 0x05, 0x2b, 0xcc, 0xb7, 0x9c, 0xa6, 0x77, 0x18, 0xa1,
+ 0x4f, 0x98, 0x56, 0xda, 0x82, 0x55, 0xf5, 0x91, 0x64, 0x78, 0x73, 0x36,
+ 0x1e, 0xd4, 0xdd, 0xea, 0x6c, 0x5b, 0x58, 0x73, 0xf7, 0x14, 0xff, 0xb4,
+ 0xac, 0x79, 0x72, 0x61, 0xfb, 0x74, 0xa3, 0x79, 0x4e, 0xaa, 0xe5, 0xce,
+ 0x79, 0x05, 0x23, 0x92, 0xc1, 0x72, 0x8d, 0xea, 0x6e, 0x76, 0x4d, 0x3f,
+ 0xe4, 0x8d, 0xd3, 0x38, 0x22, 0xe7, 0xfc, 0x97, 0x70, 0x02, 0xfc, 0x9c,
+ 0xe4, 0x76, 0x6b, 0xee, 0x5b, 0x10, 0xc2, 0x92, 0x44, 0x9e, 0x03, 0xcc,
+ 0x9f, 0x31, 0x0b, 0x7a, 0xf9, 0x58, 0x81, 0x01, 0x09, 0xde, 0x1e, 0xad,
+ 0x2d, 0x8a, 0x09, 0xf5, 0xc5, 0x61, 0xa1, 0x6f, 0x62, 0x9c, 0x8b, 0xa5,
+ 0xaf, 0x8b, 0x0c, 0x05, 0x8d, 0xc5, 0x0e, 0x3f, 0xb4, 0x12, 0xd5, 0x9d,
+ 0xe5, 0x55, 0xda, 0x12, 0xbd, 0x3d, 0x55, 0x68, 0x07, 0xf2, 0x7a, 0x42,
+ 0xc3, 0x44, 0x3c, 0x3c, 0x65, 0x0c, 0x84, 0x2d, 0xe4, 0xd9, 0x09, 0x4a,
+ 0x2b, 0x6a, 0x89, 0xa6, 0x8c, 0x99, 0x2c, 0x8e, 0xfc, 0xc7, 0x5f, 0xf4,
+ 0x7c, 0xda, 0x47, 0xf7, 0xc4, 0xbe, 0xb8, 0x27, 0x00, 0x48, 0x92, 0x4d,
+ 0x4e, 0x68, 0x05, 0x83, 0xb9, 0x87, 0x4f, 0xdb, 0x07, 0x76, 0x5c, 0x0a,
+ 0x6a, 0xf0, 0x8b, 0x0a, 0x5f, 0x87, 0x54, 0x56, 0xfb, 0xd0, 0x13, 0xbe,
+ 0x00, 0xa9, 0x82, 0xf3, 0x51, 0xb0, 0x83, 0x92, 0x78, 0x42, 0xf0, 0x3b,
+ 0xea, 0x97, 0xed, 0x03, 0xf9, 0xc9, 0xd6, 0xf2, 0xf2, 0xec, 0xf5, 0x60,
+ 0x8f, 0xc0, 0x32, 0x34, 0x82, 0xf9, 0xa6, 0xa8, 0xda, 0x8e, 0x94, 0x35,
+ 0x0e, 0xb0, 0xe2, 0xa1, 0x74, 0x8a, 0xac, 0xb2, 0x6c, 0x32, 0x80, 0xa9,
+ 0x04, 0x18, 0xc8, 0xcd, 0x85, 0xdc, 0x80, 0x2c, 0xe7, 0x43, 0x36, 0x79,
+ 0x02, 0x8d, 0x1e, 0xb3, 0x2f, 0x9c, 0x59, 0xd1, 0xdc, 0x44, 0xdd, 0x8b,
+ 0x00, 0x36, 0xda, 0xf8, 0x5a, 0x6c, 0x93, 0xec, 0x11, 0x3c, 0xf9, 0x4c,
+ 0x23, 0x56, 0x0b, 0x82, 0x37, 0x9f, 0x81, 0x71, 0xee, 0x0d, 0x02, 0xa3,
+ 0xbe, 0x4a, 0x27, 0xef, 0x75, 0x71, 0xb4, 0x9b, 0xa7, 0x2f, 0x8a, 0x72,
+ 0x86, 0x2b, 0x73, 0x20, 0x2b, 0xd3, 0x19, 0x8f, 0xb3, 0x8f, 0xab, 0x2b,
+ 0x17, 0x15, 0xbb, 0xf3, 0xe5, 0xd5, 0x1b, 0xcc, 0xef, 0x47, 0xc3, 0x33,
+ 0xde, 0x95, 0xfc, 0x58, 0x7b, 0x53, 0x6b, 0x67, 0x6b, 0x6b, 0x8b, 0xca,
+ 0xb6, 0x91, 0x29, 0x7b, 0x75, 0x25, 0x66, 0xcb, 0xfe, 0x69, 0x9c, 0xc3,
+ 0xdc, 0xe0, 0x8d, 0x94, 0xba, 0x2d, 0x76, 0xef, 0xc3, 0xba, 0x7b, 0x77,
+ 0x21, 0x0d, 0xd7, 0xf9, 0xa1, 0xd6, 0x61, 0xee, 0xfe, 0x67, 0xef, 0xdd,
+ 0x9b, 0xe4, 0x97, 0xcb, 0xf3, 0xeb, 0x1f, 0x93, 0xd7, 0x6f, 0x5a, 0x67,
+ 0xef, 0x7a, 0x9d, 0x7f, 0x4b, 0xae, 0xde, 0x76, 0xba, 0x3d, 0x5d, 0x47,
+ 0xeb, 0xab, 0x8f, 0x17, 0xbd, 0x8b, 0x0b, 0x29, 0x86, 0xc4, 0xfe, 0x33,
+ 0x61, 0x20, 0x60, 0x0f, 0x4f, 0xe1, 0xd0, 0x69, 0x52, 0x62, 0x81, 0xc8,
+ 0xf5, 0x9c, 0x37, 0x40, 0xf0, 0x9f, 0x93, 0xf7, 0x46, 0x99, 0x64, 0x53,
+ 0xbb, 0xb3, 0x7a, 0x0e, 0xcc, 0x2c, 0x8a, 0x85, 0x55, 0xb3, 0x93, 0x36,
+ 0x7c, 0xb3, 0x88, 0x9e, 0x31, 0xd6, 0x40, 0x56, 0xb3, 0xbc, 0xf4, 0xeb,
+ 0x7a, 0x59, 0xde, 0x03, 0x48, 0x4e, 0xe6, 0xf6, 0xe9, 0x23, 0x94, 0xef,
+ 0x41, 0x7a, 0xa3, 0x7d, 0xa1, 0x77, 0xb0, 0x4e, 0xc4, 0xd4, 0xc5, 0x81,
+ 0xb8, 0xfc, 0x6a, 0x25, 0xda, 0x4e, 0x95, 0xaf, 0xb6, 0xcc, 0x09, 0x13,
+ 0x14, 0x34, 0x87, 0xb2, 0x0c, 0xa3, 0xfa, 0x3e, 0xd8, 0x1a, 0x52, 0xef,
+ 0x55, 0xe1, 0x97, 0xe2, 0x91, 0x4e, 0xbb, 0xca, 0xed, 0x20, 0xd8, 0x37,
+ 0x33, 0xe0, 0xb8, 0xe9, 0x04, 0x40, 0x51, 0x89, 0x11, 0x3d, 0x16, 0x93,
+ 0xa1, 0x54, 0xce, 0x9e, 0x4a, 0xdc, 0x96, 0xa1, 0xf5, 0x5c, 0x90, 0x14,
+ 0x03, 0x76, 0x5a, 0xe1, 0xa0, 0x04, 0x4d, 0xcc, 0x06, 0xc7, 0xd1, 0x33,
+ 0x34, 0xc6, 0xe7, 0xef, 0x8c, 0x3d, 0xdc, 0x19, 0x7b, 0xb2, 0x33, 0x2e,
+ 0xb9, 0xfa, 0x2f, 0xd6, 0xea, 0x26, 0x49, 0xc7, 0x9e, 0x2d, 0x6e, 0x05,
+ 0x33, 0x77, 0x26, 0x39, 0x27, 0xe8, 0x3a, 0xa6, 0x29, 0xa6, 0x65, 0xf2,
+ 0xea, 0xf2, 0x55, 0x2f, 0x81, 0x03, 0xca, 0x1c, 0x1f, 0x1b, 0x4d, 0x45,
+ 0xc7, 0xa1, 0x99, 0xc6, 0x95, 0xc5, 0x80, 0x88, 0xbd, 0x8c, 0xcf, 0x4b,
+ 0xd7, 0xba, 0x52, 0xb0, 0x03, 0x56, 0x64, 0x5d, 0x2b, 0xca, 0xc8, 0x52,
+ 0x51, 0xdd, 0x23, 0xb3, 0xb6, 0xae, 0xa3, 0xdc, 0x5c, 0x36, 0x9b, 0x95,
+ 0xbd, 0x37, 0x4f, 0x37, 0x5c, 0xb6, 0xab, 0xf3, 0x26, 0x72, 0x12, 0x36,
+ 0x77, 0x2b, 0x12, 0x84, 0x36, 0x2f, 0x75, 0x80, 0x9f, 0xaa, 0xb5, 0xdf,
+ 0xb8, 0xd0, 0x6a, 0x6d, 0x3a, 0xb1, 0xd1, 0xd5, 0xda, 0x82, 0xb2, 0x28,
+ 0xa4, 0x47, 0xba, 0xe8, 0x47, 0xf5, 0xf4, 0xfe, 0xd5, 0x38, 0xed, 0xfd,
+ 0x8b, 0x43, 0x50, 0xd6, 0xd7, 0x1a, 0xc1, 0xaf, 0xe3, 0x3e, 0xc5, 0xa9,
+ 0xf0, 0x07, 0x6e, 0xaa, 0x01, 0x38, 0xfc, 0x8d, 0xb5, 0xc6, 0xe2, 0x7b,
+ 0x57, 0x57, 0xe0, 0xb6, 0x8d, 0x64, 0x11, 0x52, 0x03, 0x3f, 0xea, 0x06,
+ 0x46, 0x2d, 0xd8, 0x31, 0xfd, 0xda, 0x69, 0xfd, 0xcf, 0xb4, 0xf5, 0xfb,
+ 0x6f, 0xc9, 0x3a, 0x7f, 0xda, 0x6a, 0x1d, 0xb7, 0xff, 0xe3, 0x37, 0x28,
+ 0x07, 0xd0, 0x5a, 0x93, 0xda, 0x04, 0xa8, 0xd7, 0xf4, 0xac, 0xbc, 0x82,
+ 0x81, 0x33, 0xb6, 0x98, 0x19, 0x6e, 0xf2, 0x97, 0x90, 0xa9, 0xab, 0x04,
+ 0x98, 0xf9, 0xba, 0xca, 0xe5, 0xf8, 0x93, 0x11, 0x1b, 0xf5, 0x51, 0x5a,
+ 0x29, 0xb6, 0xac, 0xb1, 0x02, 0x63, 0x70, 0x8d, 0x94, 0xf9, 0x82, 0xac,
+ 0x34, 0x34, 0x08, 0x72, 0xde, 0x5b, 0x18, 0x4c, 0x14, 0x5f, 0x27, 0xf6,
+ 0x88, 0x49, 0x00, 0x91, 0xee, 0x13, 0xf2, 0x25, 0xe1, 0x97, 0x61, 0xd4,
+ 0x3a, 0x16, 0x75, 0xb5, 0x8f, 0x5d, 0x76, 0x5e, 0x77, 0x6c, 0xec, 0x2a,
+ 0x24, 0xd9, 0x12, 0x38, 0x2b, 0x47, 0xe8, 0x71, 0x89, 0xf8, 0x18, 0xfd,
+ 0x37, 0x5d, 0x6c, 0x76, 0xe9, 0x67, 0xdd, 0xb2, 0xac, 0x13, 0x62, 0x27,
+ 0x84, 0xb7, 0x80, 0xd0, 0x33, 0xef, 0x1e, 0x73, 0xd6, 0xb6, 0xe8, 0xb0,
+ 0xfd, 0xa9, 0x7b, 0xd5, 0xda, 0xa1, 0x9b, 0x57, 0x57, 0xd4, 0xed, 0x4a,
+ 0x8a, 0x8a, 0x3d, 0xb2, 0x17, 0xb4, 0xaf, 0xca, 0xc3, 0xcd, 0x4a, 0xa9,
+ 0x6a, 0x4b, 0x83, 0x98, 0xe4, 0xc5, 0xac, 0xd4, 0xbc, 0x9d, 0xfc, 0x15,
+ 0xe3, 0xd2, 0xf2, 0x38, 0xf4, 0x43, 0xf0, 0x19, 0x9d, 0x6c, 0xfa, 0x90,
+ 0x40, 0x9c, 0xac, 0x1a, 0x9b, 0x0b, 0xe8, 0xd1, 0xd1, 0xd1, 0xfe, 0x71,
+ 0x6b, 0x7b, 0xf1, 0x60, 0xf1, 0xbe, 0x9d, 0x6a, 0x92, 0x32, 0xa4, 0x5d,
+ 0x7d, 0x3e, 0x7d, 0xfe, 0x80, 0xf4, 0x79, 0x91, 0xa1, 0xa3, 0xe2, 0x7a,
+ 0xb4, 0x67, 0xda, 0x43, 0x3b, 0x26, 0x07, 0xad, 0x9d, 0xd9, 0x75, 0xf2,
+ 0xd3, 0xea, 0xdf, 0x30, 0x49, 0x8e, 0x53, 0xd6, 0xa6, 0xec, 0xba, 0xdf,
+ 0x50, 0x7e, 0x2c, 0x6f, 0x2d, 0xac, 0x8b, 0x1f, 0x6e, 0xc6, 0xa9, 0x36,
+ 0xaf, 0x4d, 0xe0, 0xb5, 0x4d, 0x87, 0xfe, 0x5a, 0x37, 0xbf, 0x3b, 0x5b,
+ 0x3b, 0x3b, 0xad, 0xbf, 0xbf, 0x9d, 0x3f, 0xc1, 0x57, 0xf7, 0xf9, 0xed,
+ 0xf4, 0x3f, 0xfe, 0x7e, 0x79, 0x55, 0x9d, 0xdf, 0x0a, 0x19, 0xf5, 0x7e,
+ 0xea, 0x56, 0xdb, 0xab, 0xeb, 0xb1, 0x47, 0x3c, 0x4c, 0x55, 0x84, 0x50,
+ 0x67, 0x5e, 0x96, 0xfc, 0xa3, 0xb5, 0xb5, 0xb3, 0x75, 0x04, 0xeb, 0x70,
+ 0xf8, 0x45, 0xb1, 0x7c, 0xf7, 0xf1, 0x2c, 0xdf, 0xb7, 0x67, 0xf9, 0x14,
+ 0xa7, 0x1f, 0x44, 0x18, 0xd0, 0xb1, 0x07, 0x22, 0xc3, 0x54, 0xcf, 0x71,
+ 0xb8, 0xe9, 0x0e, 0x02, 0x33, 0xe0, 0x10, 0x86, 0xe8, 0x34, 0x82, 0x30,
+ 0x64, 0x6e, 0xc0, 0x18, 0x86, 0xe5, 0x86, 0x2a, 0x67, 0x4f, 0xd9, 0x02,
+ 0x86, 0x53, 0x74, 0x4a, 0x10, 0x2b, 0xcd, 0x63, 0xaf, 0x71, 0x71, 0xcb,
+ 0xa4, 0x33, 0x33, 0x72, 0xd9, 0x04, 0x91, 0x75, 0xbf, 0xa0, 0x87, 0x77,
+ 0x1f, 0x1d, 0xa5, 0xfb, 0xe2, 0x28, 0xf5, 0xe5, 0x73, 0xc3, 0xcd, 0xb4,
+ 0x00, 0x6d, 0x56, 0xd7, 0x33, 0xd5, 0x03, 0x7a, 0x2a, 0x02, 0x76, 0x51,
+ 0x2c, 0x4a, 0x33, 0x4c, 0x26, 0x26, 0xb4, 0x34, 0x02, 0x63, 0x50, 0xf3,
+ 0x82, 0x3c, 0xf1, 0x44, 0xda, 0x72, 0x53, 0xc7, 0x24, 0x01, 0xd2, 0x1a,
+ 0xb1, 0x4d, 0x8b, 0xda, 0xcb, 0xba, 0x98, 0xd0, 0xd5, 0xc7, 0x96, 0x25,
+ 0xa3, 0x07, 0xf3, 0xbe, 0xfc, 0xa3, 0xe1, 0xf2, 0x81, 0x24, 0xc8, 0x6d,
+ 0x91, 0xd7, 0x36, 0x22, 0x6f, 0xd1, 0x0b, 0x30, 0x19, 0x18, 0x72, 0x66,
+ 0x5a, 0xe6, 0xd4, 0xcb, 0xc6, 0xe0, 0x8e, 0xf8, 0x60, 0x36, 0xef, 0x63,
+ 0x4a, 0x96, 0x07, 0x6e, 0x84, 0xc5, 0x7a, 0xb4, 0x7e, 0x99, 0xf7, 0x21,
+ 0x4e, 0x04, 0x4c, 0x4d, 0x2b, 0x18, 0x53, 0x92, 0x96, 0xfe, 0xb9, 0xe1,
+ 0x7e, 0x47, 0x58, 0x74, 0x3c, 0x1c, 0x88, 0xd0, 0xd3, 0x29, 0x1f, 0x19,
+ 0x13, 0xaa, 0xad, 0x09, 0xe2, 0x6d, 0x0a, 0x2e, 0x73, 0x02, 0x24, 0x5f,
+ 0x57, 0x23, 0x49, 0x01, 0x5c, 0x11, 0xc2, 0x8b, 0x8a, 0x99, 0xa1, 0x21,
+ 0xf4, 0xc0, 0x80, 0xf1, 0xc5, 0x89, 0xe5, 0x80, 0x19, 0x5f, 0x18, 0xa6,
+ 0x00, 0xce, 0xe8, 0xb0, 0x5b, 0x76, 0x72, 0x37, 0x62, 0x45, 0x02, 0xe8,
+ 0xc8, 0x56, 0x12, 0xaa, 0x96, 0x42, 0x75, 0x88, 0x9e, 0x76, 0x72, 0x20,
+ 0x23, 0xc7, 0x17, 0x9a, 0x3b, 0xa6, 0x45, 0xbf, 0x18, 0x4a, 0x34, 0xde,
+ 0x8f, 0xd7, 0xd7, 0x6f, 0x61, 0x44, 0x20, 0xb6, 0x6e, 0x88, 0xdc, 0x1f,
+ 0x4d, 0x6a, 0x82, 0x40, 0xc4, 0xc6, 0x29, 0xfe, 0x51, 0x79, 0x19, 0x01,
+ 0x48, 0x0f, 0x85, 0x62, 0x90, 0xbf, 0x3b, 0x7a, 0x66, 0x4a, 0x0c, 0x22,
+ 0xc5, 0x37, 0xbb, 0xb2, 0xeb, 0x1e, 0x29, 0x58, 0x27, 0x4d, 0x44, 0x16,
+ 0xb6, 0xeb, 0x30, 0x88, 0xa4, 0xac, 0x34, 0xeb, 0xc0, 0x66, 0x3e, 0x4b,
+ 0x7c, 0x02, 0x02, 0xf9, 0xee, 0x57, 0xd0, 0x89, 0xe2, 0x83, 0x24, 0x5c,
+ 0x1e, 0xd5, 0x71, 0x36, 0x89, 0xd6, 0xf9, 0xc9, 0x1c, 0x2e, 0x91, 0x5d,
+ 0x74, 0x09, 0xfc, 0xb4, 0xb3, 0x4b, 0x2a, 0x83, 0x06, 0x10, 0x1c, 0x33,
+ 0x9d, 0xa7, 0xa1, 0x75, 0x01, 0xcb, 0x72, 0xcf, 0x5b, 0x04, 0x34, 0x83,
+ 0xcd, 0x51, 0x37, 0xc0, 0x21, 0x68, 0xeb, 0xc4, 0x18, 0x9e, 0x60, 0x88,
+ 0x8d, 0xa2, 0xdd, 0x30, 0x62, 0x59, 0xe0, 0x48, 0x6e, 0xe9, 0x66, 0x30,
+ 0x22, 0x9a, 0x56, 0xd2, 0xc9, 0x13, 0xdf, 0x64, 0xb5, 0x1c, 0x36, 0xdb,
+ 0x40, 0xc0, 0x05, 0x24, 0xe2, 0x9b, 0x6e, 0x65, 0x94, 0xe3, 0x14, 0xeb,
+ 0x57, 0x18, 0x2a, 0xf8, 0x59, 0x75, 0x3d, 0x6f, 0xf5, 0xf8, 0x74, 0xf8,
+ 0x82, 0xc7, 0xd1, 0x2e, 0x4a, 0x19, 0xbb, 0x22, 0x64, 0xa4, 0xe6, 0x54,
+ 0x34, 0xd7, 0x87, 0xee, 0xf8, 0xd7, 0x91, 0xbd, 0x4b, 0xb8, 0x42, 0x02,
+ 0x9a, 0x42, 0x98, 0xe6, 0x85, 0x44, 0x15, 0x04, 0xf7, 0x1b, 0xf6, 0x31,
+ 0xad, 0xc9, 0x52, 0xc2, 0xce, 0x35, 0x4e, 0xf1, 0x4f, 0x12, 0x6e, 0xf2,
+ 0xc7, 0x58, 0x69, 0x09, 0xb2, 0xbb, 0x49, 0x6d, 0x89, 0xb1, 0x87, 0x03,
+ 0xab, 0xd7, 0x97, 0x62, 0xde, 0xa6, 0x7e, 0x74, 0x91, 0x54, 0x41, 0x09,
+ 0x6d, 0xa5, 0x9f, 0x75, 0xc5, 0x0f, 0xd1, 0x71, 0x73, 0x78, 0xec, 0xaf,
+ 0x79, 0x9a, 0xa8, 0x41, 0x82, 0x55, 0x90, 0x07, 0xa6, 0x53, 0x23, 0x09,
+ 0x8e, 0x12, 0xc4, 0x81, 0x0f, 0xb9, 0x45, 0x2f, 0x69, 0xc6, 0x95, 0x00,
+ 0xac, 0x5b, 0x70, 0x9f, 0xdf, 0x99, 0x45, 0x21, 0xe0, 0x03, 0xcb, 0x63,
+ 0x25, 0xe0, 0x9a, 0x4e, 0x2c, 0x8e, 0x34, 0xb5, 0x6d, 0x40, 0x09, 0x52,
+ 0xa7, 0xbc, 0x41, 0xd4, 0xa1, 0xab, 0xe7, 0x2b, 0x20, 0xdc, 0x52, 0x37,
+ 0x0a, 0x21, 0x4f, 0x73, 0x66, 0x7e, 0xd2, 0x82, 0xcd, 0x1f, 0x80, 0xea,
+ 0xd9, 0xf3, 0x47, 0x45, 0x85, 0xb2, 0xf0, 0x4d, 0xe3, 0x22, 0xce, 0x12,
+ 0xc8, 0x5e, 0xe3, 0x42, 0xdc, 0xd8, 0x13, 0x4e, 0xaf, 0x5e, 0xc2, 0x16,
+ 0xaa, 0x62, 0x95, 0xbe, 0xa0, 0xc1, 0x66, 0x07, 0x51, 0x99, 0x77, 0x04,
+ 0x95, 0x99, 0x1c, 0x65, 0x3a, 0x16, 0x4a, 0x47, 0x41, 0xdb, 0x5e, 0xc6,
+ 0x06, 0x1c, 0x46, 0x4d, 0x7d, 0x6f, 0xde, 0x67, 0x67, 0xe6, 0xbb, 0x35,
+ 0x1c, 0xf1, 0xda, 0xf7, 0x1c, 0x4e, 0x14, 0xfc, 0x48, 0xd2, 0xb1, 0xf9,
+ 0x75, 0x89, 0xa0, 0x20, 0x33, 0x97, 0x54, 0x9c, 0x60, 0x89, 0xfa, 0x2e,
+ 0x0e, 0xb0, 0xc1, 0x2c, 0x46, 0x1c, 0xe6, 0x18, 0xcd, 0xea, 0x54, 0x45,
+ 0x19, 0x0b, 0x45, 0x97, 0xb3, 0xd1, 0xc8, 0x88, 0xdf, 0xbf, 0xb3, 0x9f,
+ 0x50, 0x70, 0x9e, 0x13, 0x1b, 0x9c, 0x1e, 0x4b, 0xc8, 0x6c, 0xda, 0xb4,
+ 0x53, 0x8d, 0x0d, 0x88, 0x14, 0x30, 0xfe, 0x50, 0xf4, 0x9d, 0xb6, 0x37,
+ 0xab, 0xc2, 0xcf, 0x60, 0x14, 0xbb, 0xc4, 0x84, 0x50, 0x08, 0xb1, 0x12,
+ 0x6d, 0x6e, 0xb2, 0xfb, 0xf4, 0x43, 0x6e, 0xc6, 0x55, 0x83, 0x7a, 0xb3,
+ 0x44, 0xad, 0x06, 0xd8, 0x23, 0xe0, 0xd5, 0x01, 0x11, 0x8f, 0x82, 0xb1,
+ 0xd9, 0x4a, 0xaf, 0x8a, 0x65, 0x63, 0x35, 0x30, 0xae, 0x72, 0x2d, 0x66,
+ 0x74, 0x0e, 0x5a, 0x45, 0x8b, 0xa5, 0x45, 0x20, 0x32, 0x73, 0xf1, 0x22,
+ 0xf9, 0xf6, 0x4e, 0x82, 0x53, 0xef, 0x28, 0x0c, 0x16, 0x1b, 0x74, 0xc8,
+ 0x9d, 0xd0, 0x72, 0x57, 0x1c, 0xa7, 0xf4, 0x1b, 0xac, 0x20, 0xf6, 0xc6,
+ 0x4c, 0x79, 0x4a, 0xf5, 0x07, 0x1c, 0xd6, 0xf6, 0x13, 0xa9, 0x7a, 0x58,
+ 0xc3, 0x2a, 0x6e, 0xe3, 0xa8, 0x75, 0x4d, 0x92, 0xaa, 0xa5, 0x0a, 0x2d,
+ 0x55, 0xe5, 0xac, 0xb8, 0xa3, 0x52, 0x18, 0x3b, 0x79, 0x17, 0x4f, 0x54,
+ 0x7c, 0x72, 0x69, 0xf1, 0xf5, 0xc7, 0x05, 0x57, 0xdf, 0x83, 0x2c, 0xb1,
+ 0x85, 0xde, 0x61, 0xeb, 0x93, 0xc3, 0xbc, 0xc8, 0x3b, 0x89, 0xe4, 0xad,
+ 0x9f, 0x22, 0x57, 0x8d, 0x9b, 0x93, 0x99, 0x17, 0x4e, 0x15, 0x67, 0x49,
+ 0x28, 0x13, 0xbb, 0x05, 0xcf, 0xd7, 0x08, 0x77, 0xc4, 0x20, 0x9f, 0xe1,
+ 0xdf, 0x45, 0x96, 0x1b, 0x87, 0xcd, 0x8b, 0x61, 0x20, 0x91, 0xb9, 0xc9,
+ 0xbd, 0x2e, 0x6a, 0x74, 0x3a, 0x01, 0x1e, 0x69, 0xe7, 0x34, 0x59, 0x30,
+ 0xa5, 0x66, 0x2e, 0x38, 0xbd, 0x5b, 0x3e, 0x2d, 0x3f, 0xa9, 0x6f, 0xa8,
+ 0x96, 0x9c, 0x99, 0xab, 0x65, 0x67, 0x74, 0x4e, 0x5a, 0x1d, 0x45, 0x77,
+ 0xa5, 0x5e, 0x25, 0x4a, 0xdc, 0x9c, 0x08, 0xc8, 0xc8, 0xc2, 0x61, 0xa9,
+ 0xac, 0x07, 0x95, 0xc9, 0x27, 0x36, 0x01, 0x05, 0x26, 0x6e, 0xc0, 0x0d,
+ 0xa1, 0x13, 0x68, 0x63, 0x40, 0x50, 0x3c, 0xf9, 0x1c, 0x54, 0xcf, 0xd0,
+ 0x02, 0x10, 0xc8, 0xda, 0x92, 0x5c, 0x74, 0x90, 0xe9, 0xdf, 0x67, 0xae,
+ 0xba, 0xfd, 0x9c, 0xd7, 0x1a, 0xdd, 0x77, 0xf1, 0x7b, 0x2b, 0x68, 0x53,
+ 0x4b, 0x53, 0x2c, 0x27, 0xf1, 0x3e, 0x93, 0x5c, 0x35, 0x6c, 0x9b, 0x60,
+ 0xcc, 0x39, 0x59, 0x6a, 0x2d, 0x12, 0x06, 0x56, 0x4d, 0x63, 0xb7, 0x0c,
+ 0x36, 0xcc, 0x63, 0xf7, 0x80, 0xf4, 0xd6, 0x4a, 0x4d, 0x8b, 0xde, 0xa6,
+ 0xae, 0x21, 0x40, 0x1d, 0x6b, 0x38, 0x07, 0x63, 0xe0, 0xf9, 0x53, 0x85,
+ 0xb0, 0x54, 0x95, 0x19, 0xfa, 0x12, 0x82, 0x71, 0x50, 0x5f, 0x10, 0x88,
+ 0x73, 0x3e, 0xcf, 0xb0, 0x0b, 0xa0, 0xc1, 0x0f, 0xb9, 0xf6, 0x69, 0x68,
+ 0x65, 0x76, 0x51, 0x13, 0x71, 0xc0, 0xad, 0x26, 0x8a, 0x5d, 0x92, 0xb1,
+ 0xc6, 0x87, 0xd4, 0xf2, 0xc8, 0x0d, 0xde, 0x0a, 0xd4, 0xf0, 0x80, 0xa6,
+ 0x9f, 0x27, 0x7d, 0xd9, 0x38, 0x7d, 0x7b, 0x19, 0xf9, 0xa1, 0x2b, 0x31,
+ 0x20, 0x5d, 0x89, 0x01, 0xa9, 0xbe, 0x61, 0x61, 0xe6, 0x69, 0xf3, 0x39,
+ 0x39, 0xd9, 0xb4, 0x73, 0xc3, 0xd2, 0x2a, 0x0b, 0xca, 0x39, 0xd6, 0xf8,
+ 0x8c, 0x82, 0x5a, 0xf6, 0x9b, 0xa7, 0x1b, 0x4e, 0xc7, 0xa8, 0x23, 0xbe,
+ 0x4d, 0x3a, 0x86, 0xf9, 0x57, 0x16, 0x62, 0xb0, 0x50, 0xe8, 0x77, 0x8d,
+ 0xed, 0x06, 0x64, 0x37, 0x8e, 0x0c, 0x6d, 0xd1, 0x95, 0x86, 0x91, 0x97,
+ 0x87, 0xc3, 0x07, 0x48, 0x0b, 0x01, 0xaf, 0xd2, 0x21, 0xa4, 0xf1, 0x42,
+ 0xb5, 0x3d, 0x23, 0xec, 0x9a, 0xde, 0x1a, 0x8a, 0x04, 0xe3, 0x01, 0x94,
+ 0x04, 0x98, 0x4e, 0xb0, 0xb1, 0x81, 0xa1, 0xcc, 0x47, 0xc3, 0x86, 0xcc,
+ 0x4f, 0x3b, 0x0d, 0x90, 0x0c, 0xe8, 0xf3, 0x36, 0xe0, 0x1a, 0x4c, 0x07,
+ 0xa7, 0x70, 0x83, 0xbd, 0xb8, 0xd7, 0x08, 0x5a, 0x41, 0xd0, 0x48, 0xf8,
+ 0x7e, 0x53, 0x4c, 0xa7, 0xc5, 0x48, 0x16, 0x7e, 0x75, 0x05, 0x20, 0xd5,
+ 0xec, 0xf3, 0xfa, 0x05, 0x41, 0x2f, 0x54, 0x31, 0x02, 0xb8, 0x79, 0xd3,
+ 0x74, 0xca, 0x74, 0x2c, 0xb8, 0x0b, 0xa1, 0xf7, 0xbc, 0xd7, 0x98, 0x56,
+ 0x1d, 0x0a, 0x91, 0xbc, 0xc7, 0x01, 0x99, 0x30, 0xae, 0x95, 0xfd, 0x21,
+ 0x08, 0x0a, 0x5c, 0x5d, 0x09, 0x6f, 0x10, 0xb0, 0xc0, 0x79, 0xbd, 0xb0,
+ 0x63, 0x1d, 0xe5, 0x83, 0xc1, 0x30, 0xc3, 0x4e, 0xc8, 0x2d, 0x13, 0x90,
+ 0xed, 0x14, 0xd4, 0x3c, 0xca, 0x62, 0x56, 0x30, 0xe2, 0x97, 0x54, 0x80,
+ 0x3b, 0x21, 0x4d, 0xdc, 0x39, 0x8a, 0x1b, 0x90, 0x22, 0xae, 0x1c, 0xc7,
+ 0x0a, 0xb2, 0x13, 0x9b, 0xc0, 0xc5, 0x3a, 0xad, 0x03, 0x8f, 0x35, 0x8f,
+ 0x5f, 0xf2, 0xa7, 0xf0, 0xc1, 0x79, 0x8f, 0x29, 0xcc, 0x59, 0x79, 0x1c,
+ 0xe3, 0x4e, 0x1d, 0x76, 0xed, 0x52, 0xad, 0x19, 0xa1, 0xcc, 0x6c, 0x99,
+ 0x41, 0x36, 0x6e, 0x9c, 0x5e, 0xc8, 0xc7, 0xcf, 0xd7, 0xff, 0x45, 0x54,
+ 0xb1, 0xc4, 0x82, 0x44, 0xa5, 0xb0, 0x70, 0x34, 0x62, 0x4f, 0x7e, 0xe6,
+ 0xc2, 0xd4, 0x0c, 0x6b, 0x28, 0xec, 0x44, 0x4d, 0xec, 0x58, 0x82, 0xcb,
+ 0x3f, 0xf7, 0xac, 0x7e, 0x2e, 0x4b, 0xcf, 0x36, 0x9a, 0x7a, 0xb6, 0x6d,
+ 0xe9, 0x1e, 0x3b, 0x33, 0xee, 0x38, 0x7b, 0x4e, 0xef, 0x3e, 0x71, 0xc5,
+ 0x81, 0xe5, 0x7d, 0xea, 0x1e, 0x8c, 0xc8, 0x88, 0xab, 0x2b, 0x35, 0x0b,
+ 0xfe, 0x59, 0x37, 0xe2, 0xd2, 0xf3, 0xf1, 0xd9, 0x7c, 0x19, 0xff, 0x15,
+ 0x8b, 0x65, 0xa6, 0x26, 0xbf, 0x7d, 0xc2, 0x29, 0x31, 0x7f, 0xff, 0xfb,
+ 0x50, 0xdf, 0x33, 0xb7, 0xe8, 0x67, 0x62, 0x21, 0x9e, 0x5c, 0x53, 0xcb,
+ 0x3e, 0x22, 0x7b, 0x3f, 0x79, 0xe6, 0xd6, 0xbf, 0x79, 0x82, 0x0a, 0xb7,
+ 0x8d, 0xd3, 0x33, 0xfc, 0xbb, 0x34, 0x0d, 0x2e, 0x7a, 0xec, 0xff, 0x5c,
+ 0xe6, 0x4d, 0xb2, 0x68, 0xcd, 0x08, 0xd2, 0x12, 0x8a, 0x9d, 0x29, 0x46,
+ 0x6b, 0x76, 0x3f, 0x04, 0xcc, 0x7f, 0xd9, 0xc1, 0x7f, 0xf2, 0x9e, 0xfa,
+ 0xd2, 0xef, 0xc4, 0x29, 0xdf, 0x44, 0xa9, 0x0f, 0xfe, 0x82, 0xb8, 0xe8,
+ 0x85, 0x0e, 0x87, 0x7b, 0x47, 0xec, 0x6b, 0xb0, 0x87, 0xde, 0xa9, 0x3d,
+ 0xe4, 0x6c, 0x67, 0x6f, 0x14, 0x50, 0x05, 0x42, 0x4a, 0xa0, 0xe6, 0xe0,
+ 0x25, 0x5f, 0x2b, 0x73, 0x19, 0x68, 0xa6, 0x80, 0xb0, 0xc6, 0x60, 0x15,
+ 0xe0, 0xe8, 0xc5, 0x68, 0x54, 0xb3, 0x94, 0x27, 0x04, 0xa2, 0xda, 0x24,
+ 0xf8, 0xc3, 0x47, 0x71, 0x8a, 0xcf, 0xa9, 0xbc, 0x91, 0xb8, 0xaa, 0x6f,
+ 0x91, 0xea, 0xe0, 0xb8, 0xd4, 0x1c, 0x7d, 0x98, 0x8f, 0x97, 0x89, 0xec,
+ 0x57, 0xf5, 0x09, 0xbc, 0x72, 0xc2, 0xd5, 0x42, 0x89, 0xb1, 0x62, 0xe4,
+ 0x0c, 0x2a, 0xc0, 0x55, 0xf9, 0xb2, 0x10, 0xbc, 0xd8, 0x53, 0xd8, 0x1f,
+ 0x20, 0x16, 0x7f, 0x02, 0x91, 0x8a, 0xc3, 0x27, 0x55, 0x12, 0xd9, 0xe1,
+ 0x0b, 0xd6, 0xc6, 0x76, 0xbb, 0x6d, 0xe5, 0x30, 0xfa, 0x64, 0x7b, 0xcd,
+ 0x83, 0xe6, 0xc3, 0x7b, 0x1c, 0x30, 0x1f, 0x7d, 0x55, 0xa8, 0xdb, 0x52,
+ 0xcd, 0xf4, 0x34, 0x77, 0xbb, 0x95, 0xaa, 0x07, 0xe1, 0x80, 0x96, 0x4f,
+ 0xd4, 0x4a, 0xaa, 0xd5, 0x4f, 0x25, 0xed, 0x7b, 0x40, 0x86, 0x3a, 0x36,
+ 0x50, 0x82, 0x9b, 0xdc, 0xcc, 0x0d, 0x3e, 0xe8, 0xa0, 0x40, 0x1c, 0x02,
+ 0x30, 0x21, 0x50, 0xa3, 0x27, 0x19, 0x83, 0x32, 0xa1, 0xcc, 0x43, 0x36,
+ 0xb1, 0x48, 0x2b, 0x0c, 0xe4, 0x6e, 0x13, 0x1c, 0xa6, 0x3e, 0xb6, 0x88,
+ 0xdf, 0x1a, 0x40, 0x2f, 0xbb, 0xa5, 0xd2, 0x98, 0x30, 0xd7, 0xf7, 0x59,
+ 0x52, 0x49, 0x33, 0xf3, 0xca, 0xda, 0x42, 0x34, 0x78, 0x3c, 0x11, 0x00,
+ 0x42, 0x58, 0x55, 0x26, 0x00, 0x86, 0xb4, 0x86, 0x56, 0x49, 0x5d, 0xa6,
+ 0xb8, 0x9a, 0x2b, 0xb2, 0x51, 0x6d, 0x98, 0x28, 0x16, 0x60, 0xfe, 0xe1,
+ 0xaf, 0x67, 0x9f, 0x23, 0xa3, 0x92, 0x2b, 0x38, 0x6f, 0x49, 0x8f, 0x49,
+ 0x6c, 0x56, 0xce, 0xcc, 0x9e, 0x7a, 0x4c, 0x9f, 0xbe, 0x64, 0x71, 0x90,
+ 0x03, 0x74, 0xf9, 0x1d, 0x88, 0xcf, 0xcf, 0xab, 0x74, 0xc2, 0x65, 0x24,
+ 0x02, 0x62, 0x08, 0xab, 0x2e, 0xa2, 0x7b, 0x9a, 0xe0, 0x1d, 0x64, 0x7f,
+ 0xba, 0xea, 0x52, 0xc9, 0x7a, 0x5d, 0x31, 0x81, 0x0d, 0x72, 0x34, 0x0d,
+ 0xcd, 0xf8, 0x4a, 0x8a, 0x15, 0x20, 0xbb, 0x16, 0xcd, 0xba, 0x64, 0xe0,
+ 0x27, 0xeb, 0xd7, 0x58, 0xe5, 0x18, 0x4d, 0x75, 0x5e, 0xf4, 0x4d, 0xe7,
+ 0x1a, 0xf1, 0xb4, 0xe1, 0xbf, 0xeb, 0x93, 0x20, 0x08, 0x07, 0x92, 0xd1,
+ 0x8c, 0x1a, 0x4a, 0x16, 0xa2, 0xd8, 0x53, 0x95, 0x27, 0x2c, 0xd2, 0xc7,
+ 0x24, 0x1b, 0x09, 0x22, 0xbf, 0x94, 0x08, 0xc3, 0x8e, 0x06, 0xdc, 0x21,
+ 0x55, 0xee, 0x3c, 0x57, 0x95, 0xd1, 0x0d, 0xbc, 0xbd, 0x91, 0x74, 0x62,
+ 0x6e, 0x05, 0xf2, 0xa8, 0xc6, 0x76, 0xa6, 0xe5, 0x34, 0x08, 0xc9, 0xde,
+ 0xc7, 0xe9, 0xf0, 0xb0, 0x27, 0xec, 0x3e, 0xb3, 0xdb, 0x0c, 0x4b, 0xb7,
+ 0xc4, 0xf6, 0x59, 0x3b, 0x59, 0xc4, 0x70, 0x94, 0x36, 0x18, 0x32, 0x1e,
+ 0xc0, 0x42, 0xfd, 0x59, 0x29, 0x85, 0x8e, 0x0d, 0xfd, 0x12, 0x73, 0x71,
+ 0xba, 0x59, 0xf1, 0x0d, 0x85, 0x08, 0x52, 0x51, 0x45, 0x6a, 0x45, 0xcb,
+ 0x05, 0x5a, 0xe3, 0x2b, 0x5b, 0x85, 0xfb, 0xc3, 0x0a, 0x69, 0xe6, 0xd5,
+ 0xc4, 0x70, 0xac, 0xa1, 0xe9, 0x03, 0x32, 0x70, 0x9c, 0x6f, 0xa5, 0x31,
+ 0x61, 0x91, 0x32, 0xcd, 0x9a, 0x85, 0x45, 0x32, 0xc9, 0x00, 0x01, 0x56,
+ 0x15, 0xbe, 0x40, 0x06, 0x2a, 0x76, 0x34, 0x07, 0x0f, 0xea, 0x45, 0x90,
+ 0xa3, 0x4d, 0xd9, 0xc3, 0xc3, 0x90, 0x9e, 0x93, 0xbf, 0x47, 0x47, 0xc1,
+ 0x07, 0x9d, 0x8e, 0xb1, 0x89, 0x27, 0xe0, 0x11, 0x4f, 0xa1, 0x15, 0x0e,
+ 0x22, 0x01, 0x30, 0x16, 0xbf, 0x69, 0x11, 0x3c, 0x3c, 0xd3, 0x68, 0x6c,
+ 0x1c, 0xd5, 0xa2, 0x34, 0x5f, 0xb4, 0xdc, 0x05, 0x32, 0x90, 0x63, 0x61,
+ 0x20, 0xca, 0x5d, 0x65, 0xa3, 0xba, 0x6d, 0x1d, 0x26, 0x3d, 0x84, 0xb0,
+ 0xe7, 0x0e, 0x46, 0x83, 0x82, 0x75, 0xc2, 0x6a, 0xc8, 0xcc, 0x91, 0x72,
+ 0xbd, 0x0d, 0x69, 0x8e, 0x06, 0xf9, 0x80, 0xb7, 0x67, 0x3a, 0x68, 0xaa,
+ 0xe9, 0x71, 0xd6, 0x36, 0xcc, 0x75, 0xc0, 0x72, 0x38, 0x80, 0xca, 0x9b,
+ 0x96, 0x04, 0xd8, 0x1f, 0xfa, 0xc2, 0x6c, 0x46, 0x5e, 0x3a, 0x9b, 0x16,
+ 0x10, 0x2c, 0xd4, 0xa7, 0x0e, 0x97, 0x3a, 0x6a, 0x08, 0xf3, 0x50, 0xe0,
+ 0xa6, 0xab, 0x1f, 0xcc, 0xfa, 0x02, 0x61, 0x28, 0xbf, 0xb8, 0x45, 0xb1,
+ 0x69, 0x9a, 0xfb, 0x73, 0xf0, 0x39, 0x0e, 0x9f, 0x30, 0xac, 0xff, 0x6e,
+ 0xec, 0x87, 0x34, 0x8d, 0x8a, 0x01, 0x40, 0x6f, 0xa1, 0x01, 0x0d, 0xac,
+ 0xe9, 0x14, 0x11, 0x37, 0xbe, 0x6b, 0x0a, 0x61, 0x8d, 0x33, 0x98, 0x45,
+ 0x6a, 0x40, 0x89, 0x17, 0x78, 0xee, 0x50, 0x14, 0x8a, 0x9a, 0x9a, 0x92,
+ 0x4e, 0x5e, 0x8b, 0xe8, 0x05, 0x33, 0xce, 0xe7, 0xe8, 0x0d, 0x58, 0xe4,
+ 0xd0, 0x0f, 0x7e, 0x06, 0x9f, 0x10, 0x7e, 0x49, 0x15, 0x5a, 0x6d, 0x12,
+ 0xd7, 0xb1, 0x41, 0x0a, 0x12, 0x94, 0xe4, 0x27, 0x8b, 0x55, 0x3d, 0xa1,
+ 0x4d, 0xf6, 0x71, 0xf6, 0xef, 0x0b, 0x88, 0x95, 0xa3, 0x60, 0x05, 0x2e,
+ 0x40, 0xf9, 0x21, 0xc7, 0x73, 0x8b, 0xb9, 0x98, 0x02, 0xde, 0x11, 0xa2,
+ 0x85, 0x6c, 0x90, 0xac, 0xb4, 0x35, 0x79, 0x2d, 0x8a, 0x4c, 0x4e, 0xc7,
+ 0xea, 0x20, 0x2f, 0x0d, 0x65, 0x3c, 0x51, 0xac, 0x36, 0xc2, 0x96, 0x8d,
+ 0xcc, 0x6d, 0xf5, 0x22, 0x94, 0x12, 0x94, 0x85, 0x95, 0x29, 0x81, 0xd9,
+ 0xf7, 0x0a, 0xbb, 0x3a, 0x5c, 0x20, 0xf1, 0xd9, 0x27, 0x69, 0x87, 0x23,
+ 0x06, 0x5d, 0x3e, 0x05, 0xb3, 0xd1, 0xdc, 0xd0, 0x0f, 0x2d, 0x13, 0x60,
+ 0x28, 0x81, 0x75, 0x93, 0xcf, 0xc4, 0x87, 0x2a, 0x48, 0x42, 0x4c, 0xc3,
+ 0x46, 0x6e, 0x4c, 0x39, 0x12, 0x2d, 0x64, 0x91, 0x4b, 0x55, 0x3d, 0xa9,
+ 0x01, 0x0c, 0xab, 0x22, 0x17, 0x45, 0xde, 0x37, 0x7e, 0x52, 0xc7, 0x88,
+ 0x99, 0x5e, 0xce, 0xb7, 0xad, 0xd4, 0x95, 0x60, 0xa9, 0x83, 0xf0, 0xce,
+ 0x44, 0xf8, 0x65, 0x67, 0xcf, 0x33, 0xec, 0xff, 0x98, 0x29, 0xf9, 0x0c,
+ 0x27, 0x60, 0x38, 0x82, 0xea, 0xfc, 0x84, 0xa8, 0x2e, 0x41, 0xe9, 0x2f,
+ 0x92, 0xc4, 0x83, 0xf9, 0xd8, 0xb4, 0x2b, 0x11, 0x3b, 0x01, 0xad, 0xce,
+ 0x5e, 0x39, 0xfa, 0x4c, 0xdb, 0xd6, 0x1b, 0x50, 0x3d, 0xf7, 0x3e, 0x21,
+ 0x03, 0x54, 0x8a, 0x98, 0x99, 0x96, 0x31, 0x12, 0x2e, 0xe8, 0x76, 0x33,
+ 0x28, 0xbc, 0x57, 0x2d, 0x9a, 0xe3, 0x9e, 0x37, 0xf7, 0xf9, 0xf8, 0xcf,
+ 0x5c, 0xa7, 0xa6, 0xf9, 0xe7, 0xa4, 0x79, 0x2b, 0x56, 0x20, 0x27, 0x9a,
+ 0x2b, 0xbe, 0xd7, 0x4b, 0xef, 0x49, 0x20, 0xbc, 0xd3, 0x51, 0xba, 0x94,
+ 0xf4, 0xee, 0xd7, 0xd6, 0x4b, 0x13, 0xc6, 0x0b, 0x02, 0x46, 0x50, 0xcc,
+ 0x8c, 0x3e, 0xbb, 0xba, 0x82, 0x12, 0x5a, 0xb5, 0x9a, 0x74, 0x45, 0x2e,
+ 0x8d, 0x8a, 0x93, 0x29, 0xe3, 0x11, 0xa1, 0x5c, 0xa9, 0x70, 0xea, 0x70,
+ 0xc7, 0x3f, 0xe6, 0x88, 0x51, 0x37, 0xb5, 0xa5, 0x75, 0xe9, 0x68, 0xb2,
+ 0x20, 0x49, 0x17, 0x9a, 0x53, 0x0a, 0xca, 0xac, 0xca, 0xeb, 0x76, 0xe1,
+ 0x31, 0xfa, 0x68, 0x45, 0x6c, 0x1d, 0x28, 0x23, 0xf0, 0xb9, 0x12, 0xb0,
+ 0x30, 0xff, 0x8a, 0xcf, 0x57, 0x29, 0xde, 0x62, 0x2b, 0xbf, 0xd8, 0x2a,
+ 0x2e, 0xff, 0x7c, 0x9d, 0xac, 0x35, 0xfe, 0x99, 0x95, 0x8d, 0xb5, 0x44,
+ 0x97, 0x77, 0xf9, 0xc5, 0x4c, 0xeb, 0x8f, 0xd9, 0x55, 0x6a, 0x0e, 0xc9,
+ 0xc6, 0x8f, 0x80, 0x70, 0x6f, 0x3e, 0xfc, 0xf5, 0x9f, 0xaf, 0x4f, 0x1a,
+ 0xc9, 0xa9, 0x2a, 0xc2, 0xf2, 0x70, 0x6a, 0xb4, 0x91, 0x61, 0x66, 0x07,
+ 0x69, 0x26, 0xa5, 0x06, 0x31, 0xa9, 0x37, 0x1e, 0x80, 0xb9, 0x35, 0x69,
+ 0xec, 0x1c, 0xae, 0x61, 0xcd, 0x17, 0xf8, 0x51, 0x52, 0xc0, 0x2d, 0x79,
+ 0x7f, 0xb7, 0x96, 0xb6, 0x50, 0xd2, 0xe6, 0xdb, 0x4f, 0xe6, 0x60, 0x67,
+ 0x8b, 0xe1, 0x51, 0x19, 0x27, 0xd0, 0x00, 0x19, 0x6c, 0xc0, 0xcf, 0x50,
+ 0x2c, 0xca, 0x6c, 0x41, 0xde, 0x4e, 0x48, 0x19, 0xe8, 0x82, 0x9f, 0xef,
+ 0x81, 0x2f, 0x6e, 0x55, 0xed, 0xa7, 0x88, 0xa7, 0x1f, 0xdd, 0x85, 0x15,
+ 0x2f, 0x3c, 0xd4, 0x05, 0x8c, 0xd6, 0x04, 0x9c, 0x27, 0xdf, 0x88, 0x0e,
+ 0x5c, 0x8d, 0xf1, 0x40, 0x30, 0x5e, 0xc6, 0xc8, 0xd5, 0xac, 0x05, 0x12,
+ 0x12, 0x2a, 0x48, 0xea, 0x08, 0x24, 0xc7, 0xf0, 0x6e, 0x7a, 0xe4, 0xeb,
+ 0x18, 0xef, 0xf6, 0xb4, 0xa1, 0x20, 0xbb, 0x4a, 0x3c, 0x6f, 0x51, 0x21,
+ 0x56, 0x92, 0xaf, 0x04, 0xb9, 0xa5, 0xa6, 0xc7, 0xfd, 0x1c, 0xf7, 0xd1,
+ 0xa7, 0x61, 0x0e, 0x57, 0x16, 0x5a, 0x6c, 0x96, 0xb2, 0xd0, 0xce, 0x76,
+ 0x19, 0xf2, 0xda, 0xb0, 0x80, 0x5b, 0x94, 0x1f, 0x4e, 0x2b, 0xf9, 0x4f,
+ 0x73, 0xce, 0x25, 0x17, 0x2e, 0x1d, 0x42, 0x83, 0x49, 0x40, 0xf7, 0x0d,
+ 0xf7, 0x86, 0x11, 0xc9, 0x6e, 0x31, 0x70, 0x3d, 0x2f, 0xeb, 0x87, 0xc3,
+ 0xb6, 0xc8, 0xca, 0x21, 0xc2, 0x26, 0x49, 0x37, 0xa6, 0xbf, 0xc3, 0xaa,
+ 0xa7, 0x1c, 0x8d, 0x9c, 0xd5, 0x40, 0x52, 0x35, 0x63, 0xb8, 0x29, 0x18,
+ 0x08, 0x8c, 0x82, 0xd0, 0x4d, 0x96, 0xc4, 0xcc, 0xcf, 0xa1, 0x32, 0x97,
+ 0xdb, 0x93, 0xac, 0xc6, 0xb3, 0xd7, 0x4e, 0x78, 0x86, 0xc3, 0x0a, 0x53,
+ 0x0a, 0xf8, 0x20, 0x48, 0x6b, 0xd5, 0x66, 0x39, 0x0c, 0x7f, 0xa3, 0x57,
+ 0x34, 0xff, 0x04, 0xdc, 0x0f, 0xaa, 0x57, 0x63, 0xb3, 0x02, 0x77, 0x0e,
+ 0x4b, 0xd1, 0x6c, 0xba, 0xb4, 0x7f, 0x2f, 0x61, 0x7e, 0x10, 0x39, 0xa3,
+ 0x61, 0xe1, 0xe0, 0xbb, 0x95, 0xde, 0x56, 0x57, 0x08, 0x16, 0x8e, 0x30,
+ 0xe4, 0xdc, 0xd1, 0x70, 0x62, 0x63, 0x21, 0x28, 0x38, 0xd3, 0x02, 0x0b,
+ 0xa7, 0x75, 0x67, 0x06, 0x6c, 0xba, 0xc8, 0xbc, 0xd3, 0x83, 0x54, 0x54,
+ 0x8d, 0xb0, 0x4a, 0xee, 0x80, 0x1a, 0x19, 0x59, 0xd4, 0x74, 0xcf, 0x7c,
+ 0x1d, 0xa1, 0x8a, 0x00, 0x89, 0x03, 0x12, 0xc9, 0x43, 0xfb, 0xd7, 0xcc,
+ 0xd3, 0x17, 0xcd, 0xc7, 0x3d, 0xc6, 0xa0, 0xe9, 0xe3, 0x03, 0x8b, 0x21,
+ 0x90, 0x97, 0x80, 0x2c, 0xc5, 0x31, 0x85, 0x56, 0xd7, 0xb2, 0x20, 0x00,
+ 0xf3, 0x2c, 0xae, 0x12, 0x48, 0xa2, 0xe2, 0x70, 0x4a, 0x34, 0xdc, 0x66,
+ 0x10, 0xf9, 0x8e, 0x35, 0x47, 0x38, 0xff, 0xbe, 0x5a, 0xe4, 0xd1, 0xc9,
+ 0x51, 0x9b, 0x73, 0xe0, 0x9b, 0xaa, 0xc1, 0x9e, 0x91, 0x9a, 0x11, 0x0e,
+ 0xd4, 0xa2, 0x50, 0x78, 0xc5, 0x90, 0xde, 0xb5, 0xa0, 0xe4, 0x88, 0xde,
+ 0x65, 0x97, 0x63, 0x50, 0x1d, 0xfa, 0xb3, 0x52, 0x92, 0x73, 0x48, 0x0c,
+ 0x10, 0x82, 0xf2, 0x43, 0x94, 0x70, 0xc3, 0x71, 0xc0, 0x75, 0x99, 0xdd,
+ 0xce, 0x86, 0x94, 0x73, 0x5e, 0xc2, 0x6e, 0x99, 0xe5, 0x25, 0xe0, 0x45,
+ 0x3c, 0x16, 0x89, 0xcd, 0xd1, 0xf2, 0x74, 0x6e, 0x12, 0x38, 0x2b, 0x55,
+ 0xea, 0x5d, 0x80, 0x13, 0x9b, 0x65, 0x59, 0x92, 0xf4, 0x22, 0xac, 0x18,
+ 0x3a, 0x1d, 0x2d, 0x3e, 0x73, 0xc2, 0xa0, 0x6c, 0xda, 0x26, 0xca, 0x3e,
+ 0x03, 0x31, 0x80, 0x19, 0x22, 0x9f, 0x01, 0x5c, 0x99, 0xa4, 0x86, 0x04,
+ 0x25, 0x47, 0xfd, 0x88, 0xeb, 0x0a, 0x3a, 0x2b, 0x87, 0x4a, 0xb5, 0xa2,
+ 0xc1, 0x7a, 0x8b, 0x42, 0xa5, 0xea, 0x4b, 0xdc, 0xdb, 0x0d, 0xcf, 0xc3,
+ 0xae, 0x96, 0x85, 0x71, 0x43, 0x8e, 0x8b, 0xa2, 0x2e, 0x09, 0x30, 0x5a,
+ 0x7f, 0xa5, 0xc9, 0x51, 0xa4, 0xfa, 0x61, 0xaf, 0xea, 0x9f, 0x22, 0x68,
+ 0x34, 0xd7, 0xd5, 0x17, 0xcf, 0x8b, 0x54, 0xbb, 0x27, 0xc5, 0x30, 0x56,
+ 0x59, 0x05, 0x58, 0xb6, 0xad, 0xfb, 0x32, 0xbf, 0xd4, 0x08, 0xd6, 0xa3,
+ 0x5a, 0x32, 0xee, 0x6c, 0xc3, 0x33, 0x47, 0x2b, 0x68, 0x86, 0xb0, 0xdb,
+ 0x9c, 0x73, 0x58, 0xa7, 0xb0, 0x95, 0xed, 0xe4, 0x0a, 0xf2, 0xe9, 0x75,
+ 0xa5, 0x45, 0xb6, 0x25, 0x73, 0xe3, 0x7c, 0xba, 0x4c, 0xd0, 0x2b, 0xa1,
+ 0xaa, 0x5f, 0xc7, 0x06, 0x4b, 0x51, 0xc4, 0x44, 0x60, 0x55, 0x36, 0xc9,
+ 0x98, 0xbc, 0x91, 0x10, 0xb2, 0xd0, 0xce, 0x36, 0xd0, 0x02, 0x4a, 0xa9,
+ 0xf8, 0x47, 0x7a, 0x53, 0x7c, 0xe0, 0x5a, 0xb8, 0xba, 0xfc, 0x27, 0xe5,
+ 0x11, 0x46, 0x8e, 0x0a, 0xbc, 0x2e, 0x1a, 0x6c, 0x84, 0x45, 0xab, 0x7c,
+ 0x3c, 0x52, 0xdf, 0x2b, 0x4d, 0x87, 0x98, 0x3e, 0x72, 0xb3, 0x56, 0x73,
+ 0x7c, 0xf5, 0xb8, 0xea, 0x8b, 0x8a, 0x4d, 0x95, 0x61, 0x90, 0xf7, 0xc5,
+ 0x63, 0xf6, 0x01, 0xd6, 0xac, 0x76, 0x71, 0xec, 0x5a, 0xb0, 0x24, 0xd1,
+ 0x02, 0x44, 0xe3, 0xd9, 0x98, 0xec, 0xd2, 0xd9, 0xc0, 0xd7, 0x2d, 0x56,
+ 0x57, 0x88, 0xce, 0xfc, 0x52, 0xe1, 0x35, 0x81, 0xf8, 0x31, 0xd9, 0xdf,
+ 0x88, 0x7b, 0x88, 0x06, 0xfa, 0xf5, 0x57, 0x1f, 0xfb, 0xc7, 0x27, 0x14,
+ 0x75, 0x56, 0x26, 0x3f, 0x18, 0x5e, 0x01, 0x56, 0xa8, 0x41, 0xc3, 0xd3,
+ 0x08, 0x92, 0x04, 0xdd, 0xae, 0x65, 0xd2, 0x00, 0xe0, 0x1e, 0xfe, 0x0c,
+ 0x0c, 0x65, 0xf2, 0x21, 0xab, 0xdc, 0x7a, 0x53, 0x14, 0xef, 0xa1, 0xe5,
+ 0x97, 0x69, 0xf2, 0x16, 0x70, 0xa6, 0x5e, 0x24, 0x9d, 0xa1, 0x39, 0x03,
+ 0xa7, 0x49, 0x37, 0x35, 0x23, 0x34, 0x3d, 0x37, 0xaf, 0xec, 0x1c, 0x9f,
+ 0x24, 0xdb, 0xc7, 0x7b, 0x87, 0xc9, 0x5f, 0x4d, 0x3f, 0x4e, 0xda, 0xc9,
+ 0xd7, 0xd4, 0x66, 0x45, 0xc5, 0x98, 0x8a, 0x18, 0x5f, 0xa1, 0x2f, 0xc9,
+ 0x92, 0xe5, 0x69, 0xf4, 0x4c, 0xf6, 0xd0, 0x83, 0x8a, 0x7d, 0x3f, 0xd7,
+ 0x33, 0x52, 0xdb, 0xb7, 0xff, 0x27, 0x75, 0xeb, 0xff, 0x55, 0x99, 0x90,
+ 0x36, 0x15, 0xe3, 0xe4, 0x7e, 0xba, 0x1e, 0xc2, 0x1e, 0xa8, 0x35, 0x90,
+ 0x78, 0xbd, 0xf2, 0x9f, 0xf7, 0x7d, 0x09, 0xe8, 0xec, 0x44, 0xb8, 0x5a,
+ 0x59, 0x6e, 0xc9, 0xb8, 0xf4, 0x15, 0xe1, 0x6a, 0x83, 0x30, 0xd6, 0xaa,
+ 0x6b, 0x02, 0x45, 0x5e, 0x14, 0x60, 0xb5, 0x9a, 0xad, 0xa0, 0x96, 0x29,
+ 0x8b, 0x2d, 0x66, 0x12, 0x91, 0x51, 0x99, 0xe3, 0xbc, 0xcc, 0xb1, 0x6c,
+ 0x12, 0x98, 0x41, 0xa9, 0x42, 0xee, 0x3d, 0x54, 0x37, 0xed, 0x17, 0x70,
+ 0xf5, 0x23, 0x31, 0xb7, 0xb4, 0xaf, 0x6a, 0x8a, 0x43, 0xec, 0xb8, 0xd9,
+ 0x4b, 0x00, 0xa3, 0x26, 0xe7, 0xaa, 0xad, 0x16, 0x0f, 0x62, 0x0d, 0xd8,
+ 0x1a, 0xa7, 0x4e, 0x3d, 0x8e, 0xc7, 0x40, 0x42, 0x0c, 0x00, 0xce, 0x81,
+ 0xaa, 0x0b, 0x15, 0x2f, 0xf8, 0x19, 0xd4, 0x8b, 0x76, 0xd0, 0xb0, 0xf6,
+ 0xfa, 0x72, 0x15, 0x94, 0xd0, 0x11, 0x65, 0x4b, 0x7e, 0xd2, 0x37, 0x29,
+ 0xcf, 0x59, 0x5b, 0x7c, 0xab, 0x9f, 0x9a, 0x91, 0xa1, 0x22, 0x24, 0x79,
+ 0xdb, 0xe2, 0xa0, 0x38, 0xa5, 0x26, 0xe4, 0x58, 0x96, 0xe4, 0x0a, 0xd3,
+ 0x14, 0x58, 0x29, 0x18, 0x0f, 0xbe, 0xe9, 0x9c, 0x45, 0x9c, 0x88, 0x4e,
+ 0x36, 0x5a, 0xe7, 0x07, 0x83, 0x02, 0x07, 0x9c, 0x0c, 0x78, 0x17, 0x94,
+ 0xe2, 0x4c, 0xd6, 0xb5, 0x57, 0x2c, 0x71, 0xa0, 0x4e, 0x94, 0x3d, 0x0e,
+ 0xd2, 0x18, 0x98, 0x69, 0x66, 0x93, 0x87, 0x02, 0x92, 0x3d, 0x5e, 0x9b,
+ 0xc5, 0x9f, 0xe4, 0xfd, 0xf8, 0x38, 0x10, 0x8b, 0x14, 0x52, 0x9d, 0x78,
+ 0x18, 0x27, 0xec, 0xba, 0x9e, 0x38, 0x52, 0x34, 0x74, 0x34, 0x1a, 0x65,
+ 0x03, 0x72, 0x56, 0x93, 0xf9, 0x57, 0xfb, 0xb5, 0x84, 0x91, 0xde, 0x64,
+ 0xda, 0x8a, 0xe2, 0x3b, 0x45, 0xcd, 0x62, 0x17, 0x64, 0x2b, 0x1c, 0xcf,
+ 0xeb, 0x4c, 0x95, 0xbc, 0xbf, 0x3a, 0xd8, 0x8a, 0x3a, 0xde, 0x22, 0x77,
+ 0xee, 0x1e, 0x55, 0x9d, 0x7a, 0x8c, 0x93, 0x13, 0xf8, 0x1c, 0xf9, 0xa9,
+ 0xe1, 0x54, 0x1e, 0xa0, 0x26, 0x5d, 0x5b, 0x72, 0xd9, 0xb9, 0xf2, 0x31,
+ 0x47, 0x10, 0x37, 0x94, 0x3f, 0xb0, 0x98, 0x74, 0x50, 0x07, 0x6e, 0x66,
+ 0x27, 0x2d, 0x21, 0x69, 0x59, 0x61, 0xd6, 0x64, 0x12, 0x96, 0xfd, 0x14,
+ 0x54, 0x95, 0x35, 0xbb, 0xca, 0x88, 0xe6, 0xed, 0x98, 0xb7, 0x0a, 0x6b,
+ 0xb4, 0x63, 0xa8, 0x47, 0xa5, 0x60, 0xbb, 0xf6, 0x09, 0x51, 0xe9, 0x76,
+ 0x84, 0x54, 0xaa, 0xab, 0xdf, 0x1e, 0xf4, 0xa7, 0x69, 0xce, 0xb0, 0xf7,
+ 0x99, 0x03, 0xfc, 0x2a, 0x9b, 0x92, 0x5a, 0x63, 0xb3, 0xd8, 0x47, 0x5f,
+ 0x16, 0x2e, 0xf4, 0x08, 0x83, 0xd9, 0x8f, 0x24, 0x98, 0xdd, 0x73, 0xb4,
+ 0x21, 0x16, 0x33, 0x2e, 0xcf, 0x70, 0x2a, 0xeb, 0x04, 0x16, 0x15, 0xfc,
+ 0x64, 0x16, 0xcf, 0x2e, 0xa9, 0x9a, 0xc7, 0x26, 0x4d, 0x2d, 0x93, 0xa9,
+ 0x8e, 0xb7, 0x28, 0xab, 0x52, 0xbe, 0x59, 0x0e, 0xf0, 0x50, 0x44, 0x8d,
+ 0x85, 0x71, 0x07, 0xad, 0x14, 0x1b, 0xf9, 0x92, 0x08, 0xd1, 0xbb, 0x84,
+ 0xae, 0x21, 0x29, 0x7a, 0x20, 0xa7, 0x43, 0x2c, 0x39, 0xe4, 0xe8, 0xbb,
+ 0x3e, 0xad, 0xdb, 0x02, 0xd5, 0x54, 0xa8, 0x02, 0x78, 0xb2, 0xb0, 0x19,
+ 0x05, 0x91, 0x71, 0x93, 0x61, 0x1a, 0x0b, 0xd5, 0x57, 0x38, 0xe1, 0x23,
+ 0x82, 0x2c, 0xa7, 0xb6, 0xbc, 0x82, 0x06, 0xbc, 0xe2, 0xb3, 0x56, 0x93,
+ 0x6c, 0xc9, 0x75, 0xe4, 0xd5, 0xe6, 0xa5, 0x59, 0x18, 0xb9, 0x02, 0x82,
+ 0xa9, 0x07, 0x82, 0x49, 0x85, 0x0f, 0x6c, 0xdd, 0xcc, 0x60, 0x2d, 0xef,
+ 0x64, 0x2d, 0x9b, 0xb2, 0x92, 0x86, 0x77, 0xc9, 0x25, 0x32, 0x99, 0xe1,
+ 0x67, 0xd8, 0xd8, 0x8b, 0x57, 0x38, 0x99, 0xbb, 0xc0, 0x10, 0x47, 0x51,
+ 0xb7, 0xc2, 0x98, 0x77, 0x43, 0xf6, 0x64, 0x37, 0xad, 0xde, 0x7c, 0x25,
+ 0xeb, 0x78, 0xd2, 0xc5, 0xe0, 0x1f, 0x69, 0x0a, 0x34, 0x1a, 0x86, 0x9e,
+ 0x5c, 0x57, 0xba, 0x42, 0x2a, 0x4d, 0xce, 0xc6, 0xe2, 0xb4, 0x7b, 0x42,
+ 0xb7, 0xa4, 0x79, 0x6a, 0x04, 0x2b, 0xb8, 0xd1, 0x5e, 0x5d, 0x51, 0xc2,
+ 0xde, 0x8b, 0x50, 0x55, 0x8e, 0x8a, 0x74, 0xe6, 0x64, 0x65, 0x81, 0xce,
+ 0x30, 0x42, 0x60, 0x9b, 0x0d, 0x2d, 0x96, 0xdd, 0xd9, 0x5f, 0x0f, 0x76,
+ 0xfc, 0x5f, 0xcc, 0x2b, 0xd4, 0x73, 0xe6, 0x3f, 0xff, 0x57, 0xb3, 0x0c,
+ 0xfc, 0xeb, 0xb1, 0xff, 0x0b, 0xac, 0x04, 0xff, 0xb2, 0x67, 0x7e, 0xd1,
+ 0x62, 0x9b, 0x0e, 0x3b, 0x71, 0x15, 0x2e, 0x5d, 0x58, 0xd8, 0x12, 0x9c,
+ 0x57, 0x57, 0x3c, 0xa9, 0x02, 0x12, 0x50, 0x3e, 0xac, 0x3e, 0x02, 0x2c,
+ 0x2f, 0xa8, 0x3f, 0x25, 0x1c, 0x6f, 0x50, 0x70, 0x89, 0x13, 0x5e, 0x9d,
+ 0x27, 0xbb, 0xbc, 0x66, 0x0d, 0x47, 0x59, 0x36, 0x65, 0xc1, 0x0b, 0x77,
+ 0x00, 0x51, 0x08, 0x25, 0x09, 0xb3, 0x84, 0xe7, 0x28, 0xe7, 0xc6, 0xc3,
+ 0x7a, 0xad, 0x97, 0x58, 0xa4, 0xc6, 0x5b, 0xe9, 0x99, 0xad, 0x75, 0xd9,
+ 0xb7, 0xc5, 0xe5, 0xc9, 0xad, 0x11, 0x95, 0x85, 0x95, 0xd7, 0xd6, 0xa8,
+ 0x4a, 0x92, 0x87, 0x7d, 0x87, 0xb5, 0x09, 0x90, 0xe5, 0xf6, 0x09, 0x7d,
+ 0xd0, 0x68, 0x0a, 0x27, 0x85, 0x01, 0x90, 0x2d, 0x70, 0x0e, 0xeb, 0x4a,
+ 0x10, 0x55, 0x52, 0x54, 0xbd, 0x38, 0x24, 0xbf, 0x11, 0x36, 0xe5, 0x97,
+ 0x16, 0x48, 0x01, 0x72, 0x58, 0x5d, 0x11, 0x15, 0x2b, 0x64, 0x36, 0x05,
+ 0x03, 0x50, 0xd9, 0xb0, 0x91, 0x79, 0x32, 0x66, 0x5b, 0xc4, 0x34, 0xbd,
+ 0x04, 0x46, 0x2b, 0xf2, 0xe5, 0xc1, 0x60, 0x82, 0x1e, 0xa9, 0xd8, 0x71,
+ 0x1c, 0x99, 0x44, 0x5d, 0xe3, 0x3d, 0xb6, 0x08, 0x0d, 0x36, 0x5a, 0xb8,
+ 0x15, 0x1a, 0x78, 0x2b, 0xc4, 0x26, 0x08, 0xe7, 0xc1, 0xc6, 0xa9, 0xb5,
+ 0xd5, 0x84, 0xf8, 0x21, 0xf2, 0x9b, 0x03, 0x22, 0x84, 0x33, 0x98, 0x01,
+ 0x55, 0xda, 0x09, 0x69, 0x51, 0xa1, 0x1e, 0xd5, 0x34, 0xe9, 0xef, 0xb9,
+ 0x96, 0xcc, 0x3d, 0xbc, 0x4e, 0xce, 0x27, 0xae, 0xa9, 0xda, 0x12, 0x76,
+ 0xc0, 0x06, 0x8c, 0xa1, 0x8c, 0x07, 0x79, 0xcd, 0x95, 0x50, 0x1c, 0xc1,
+ 0x66, 0x1d, 0xe6, 0xe8, 0x8c, 0xd1, 0xc1, 0x13, 0x05, 0x79, 0xe3, 0x60,
+ 0x78, 0xf7, 0xd9, 0xf0, 0x01, 0x38, 0x9d, 0xfe, 0xdd, 0xec, 0x16, 0xcc,
+ 0x35, 0x32, 0x04, 0xa0, 0x96, 0x08, 0x41, 0x1d, 0x79, 0xc3, 0x92, 0x86,
+ 0x2a, 0x9d, 0x69, 0x3f, 0xa3, 0x5e, 0xe8, 0xa2, 0x8d, 0xa1, 0xcb, 0x55,
+ 0xf2, 0xad, 0x7e, 0xc5, 0x4a, 0x75, 0xb1, 0x52, 0x56, 0xfd, 0xf5, 0x9b,
+ 0xeb, 0xce, 0xf5, 0xe5, 0x9b, 0xd7, 0x9f, 0xb1, 0x5c, 0xfc, 0xd2, 0xb5,
+ 0xc5, 0xff, 0x08, 0x33, 0xcb, 0xcc, 0x74, 0xc2, 0x7d, 0xf2, 0x89, 0xcd,
+ 0x3d, 0x0b, 0x0b, 0xae, 0xdb, 0x42, 0x99, 0x3f, 0x8d, 0xf3, 0x7f, 0xcd,
+ 0x32, 0x19, 0x2f, 0x76, 0x57, 0x59, 0x90, 0x37, 0xeb, 0x2b, 0xd0, 0xdb,
+ 0x57, 0x4b, 0xdd, 0x70, 0xdb, 0x03, 0x37, 0x5d, 0x9f, 0xb1, 0x6e, 0x69,
+ 0xb5, 0x0c, 0x83, 0x05, 0xcc, 0x53, 0xb5, 0x31, 0xe7, 0x8f, 0x86, 0x8b,
+ 0x65, 0x7e, 0x36, 0xd0, 0x83, 0x1d, 0x04, 0x3d, 0xd8, 0x91, 0xba, 0x38,
+ 0xf8, 0x6e, 0x2c, 0xc9, 0x4c, 0xb4, 0x47, 0xab, 0x2e, 0x75, 0x38, 0xdf,
+ 0x50, 0x6c, 0x89, 0xdb, 0x5c, 0x9e, 0x31, 0x0f, 0x40, 0x9b, 0x45, 0x98,
+ 0x4e, 0x99, 0xf0, 0xe7, 0x95, 0x3b, 0x8d, 0x56, 0xd9, 0x8c, 0xe9, 0x0c,
+ 0x96, 0xc5, 0xa8, 0xd8, 0x1d, 0x87, 0x7d, 0x4b, 0x50, 0x4b, 0x00, 0x0c,
+ 0x5d, 0xe5, 0x06, 0xeb, 0x80, 0xad, 0xc5, 0xf6, 0xaa, 0xa0, 0xcf, 0xac,
+ 0xb5, 0x69, 0x7c, 0xaa, 0x68, 0x88, 0x44, 0xd3, 0x5d, 0xc0, 0x91, 0x30,
+ 0x82, 0x39, 0xf2, 0xf1, 0xaa, 0x45, 0x13, 0xed, 0x81, 0x4f, 0xc4, 0x6c,
+ 0x06, 0x92, 0xf1, 0x38, 0x7c, 0xc2, 0xea, 0x7e, 0x43, 0x29, 0xf9, 0x64,
+ 0x61, 0x79, 0x14, 0xdb, 0x32, 0x02, 0x5a, 0x4d, 0xb5, 0x3e, 0xcf, 0x8f,
+ 0x59, 0xa9, 0x3c, 0x45, 0xfa, 0xcd, 0x6d, 0x0e, 0x72, 0x2b, 0xcc, 0x04,
+ 0xf6, 0xab, 0x60, 0x80, 0x2a, 0x87, 0xde, 0x04, 0x1e, 0x31, 0x1a, 0x24,
+ 0xf1, 0xc0, 0x4a, 0x94, 0x58, 0x81, 0x65, 0x46, 0x5d, 0x19, 0x44, 0xd0,
+ 0xa0, 0x31, 0xac, 0x48, 0xf1, 0x32, 0x35, 0x83, 0x6c, 0x9e, 0x6c, 0x27,
+ 0xeb, 0x97, 0x16, 0xcf, 0x43, 0x4a, 0x4a, 0x36, 0x13, 0x6b, 0xe7, 0x63,
+ 0x4c, 0x56, 0xad, 0x75, 0x81, 0xc3, 0x40, 0x88, 0x44, 0xe6, 0x1f, 0x2e,
+ 0x4a, 0xe3, 0xe4, 0x5d, 0x25, 0x9e, 0x2d, 0xd7, 0x5a, 0xc2, 0xff, 0x3d,
+ 0x12, 0x20, 0xc9, 0x05, 0xdf, 0xfc, 0x21, 0xcd, 0x87, 0xc4, 0x88, 0xbd,
+ 0xb2, 0x4d, 0x04, 0xa6, 0x50, 0xad, 0x9c, 0x59, 0xf8, 0xd5, 0x1b, 0xc1,
+ 0x13, 0x34, 0x99, 0x21, 0xc8, 0x4d, 0x7b, 0x63, 0xae, 0xb5, 0xc5, 0x0c,
+ 0x83, 0x0d, 0x5c, 0x8e, 0x4f, 0x9f, 0x4b, 0xfc, 0x46, 0xa5, 0x92, 0x42,
+ 0xe5, 0xd4, 0x65, 0xf0, 0x4b, 0x3e, 0x74, 0x83, 0x07, 0xb5, 0xc1, 0x3f,
+ 0x8a, 0x8e, 0x69, 0xda, 0x44, 0x63, 0x63, 0x29, 0xc0, 0x62, 0x93, 0xa2,
+ 0x08, 0x6b, 0xae, 0x4f, 0x27, 0x19, 0xcd, 0x6b, 0x6a, 0xd1, 0xd2, 0x5a,
+ 0x0f, 0x85, 0x21, 0x2e, 0x81, 0x7b, 0xaa, 0x9a, 0xa2, 0x17, 0xe2, 0x66,
+ 0xf8, 0x81, 0xe2, 0x11, 0xf4, 0x6c, 0xd0, 0x26, 0x10, 0x89, 0x09, 0xaf,
+ 0x3f, 0xc1, 0xf2, 0xfb, 0x91, 0x2d, 0x2e, 0x38, 0x94, 0x50, 0x6b, 0xe8,
+ 0x4c, 0x15, 0x28, 0x31, 0xef, 0xb5, 0x27, 0xab, 0x2b, 0xb3, 0x31, 0xaa,
+ 0xde, 0x02, 0x07, 0x27, 0xfa, 0x78, 0xac, 0x45, 0x4e, 0xa4, 0xb0, 0x2c,
+ 0x80, 0xc2, 0xeb, 0x40, 0x14, 0xb5, 0xe6, 0xbf, 0x62, 0xac, 0x89, 0x9a,
+ 0x0b, 0xaa, 0x96, 0x60, 0xa4, 0x19, 0x21, 0x0f, 0x29, 0x66, 0x54, 0x7d,
+ 0x46, 0x36, 0x56, 0x5f, 0x04, 0x36, 0xd8, 0x29, 0x15, 0x49, 0x16, 0x3e,
+ 0x6c, 0x0b, 0xee, 0xe7, 0xd7, 0xdd, 0x82, 0xb6, 0x18, 0xe4, 0x6d, 0x70,
+ 0x84, 0x09, 0xfc, 0x6e, 0xc9, 0xa5, 0xef, 0x7e, 0xf7, 0x9c, 0x75, 0x72,
+ 0xd1, 0x2b, 0xd8, 0x44, 0x54, 0x06, 0x3d, 0x6d, 0x41, 0xc8, 0x84, 0x12,
+ 0x91, 0x5d, 0x58, 0x31, 0x0e, 0xf2, 0xb5, 0xd9, 0x10, 0xea, 0x92, 0x05,
+ 0x7c, 0xf1, 0xa4, 0x66, 0x7e, 0x0b, 0x86, 0xb1, 0x2e, 0x89, 0x94, 0x52,
+ 0x6a, 0xec, 0xb5, 0x94, 0xea, 0x3b, 0x14, 0xe4, 0xd1, 0x33, 0xfb, 0xd5,
+ 0x48, 0x96, 0xe5, 0x0b, 0x1d, 0x9e, 0x01, 0x5d, 0xf1, 0x03, 0x66, 0x9d,
+ 0xe9, 0xf4, 0xe7, 0x79, 0xb7, 0x69, 0xfe, 0x9e, 0xe2, 0x52, 0xb3, 0x65,
+ 0x08, 0x63, 0x3c, 0x3f, 0xe4, 0xc5, 0xd0, 0xea, 0x37, 0x6c, 0xc5, 0xf3,
+ 0x08, 0x6e, 0xad, 0xac, 0xd4, 0x88, 0xb0, 0xde, 0xea, 0xa9, 0xf5, 0x40,
+ 0x04, 0x2e, 0xb1, 0x68, 0x12, 0xff, 0x7c, 0x20, 0x5a, 0x16, 0x32, 0x9f,
+ 0xea, 0x0a, 0x95, 0x92, 0x6e, 0x80, 0x6d, 0x84, 0x89, 0x31, 0x5e, 0x0c,
+ 0x36, 0x69, 0x7d, 0x4f, 0x18, 0x67, 0xdb, 0xae, 0x15, 0xc8, 0xdd, 0xf4,
+ 0x08, 0x7b, 0x88, 0x2d, 0xb1, 0xe8, 0x38, 0xee, 0x37, 0x8d, 0x11, 0x2e,
+ 0x0a, 0x0f, 0x4c, 0xe7, 0x97, 0x04, 0x4a, 0xc2, 0x2c, 0xc4, 0x1d, 0xc9,
+ 0x42, 0x6c, 0x22, 0x98, 0xa1, 0x91, 0xf0, 0x0d, 0x5f, 0x7d, 0xc0, 0xa3,
+ 0xd1, 0x19, 0x59, 0x62, 0x6b, 0x2a, 0xcb, 0x63, 0x57, 0x2c, 0xfb, 0xf8,
+ 0x40, 0x8a, 0x8b, 0xe1, 0x07, 0x9c, 0xcf, 0xa2, 0xb5, 0xdc, 0x7c, 0xbc,
+ 0xa0, 0xe6, 0x6c, 0x80, 0xc2, 0x00, 0xcb, 0x76, 0x6b, 0xce, 0x03, 0x28,
+ 0x02, 0x82, 0x9a, 0xd5, 0xed, 0x6c, 0x78, 0x0b, 0x11, 0x6b, 0x1c, 0xae,
+ 0x94, 0x0f, 0xb8, 0xa2, 0xad, 0xed, 0x80, 0xf5, 0x56, 0x56, 0x89, 0xcd,
+ 0xab, 0xeb, 0x78, 0x6d, 0x4e, 0xcf, 0x3e, 0x5a, 0xfe, 0xf3, 0xf2, 0x1e,
+ 0x6f, 0x6e, 0xea, 0x0d, 0x11, 0x37, 0x77, 0xa6, 0x24, 0x67, 0xf0, 0x0f,
+ 0x96, 0x57, 0x4f, 0x38, 0x64, 0x14, 0x89, 0xcc, 0x74, 0xae, 0x2e, 0xbe,
+ 0x25, 0x51, 0x65, 0xa1, 0x03, 0x4f, 0x86, 0x23, 0xa6, 0xd7, 0xf5, 0xfb,
+ 0x6b, 0x92, 0x79, 0x98, 0xed, 0x04, 0x4f, 0x8c, 0xa1, 0x31, 0x9f, 0x5c,
+ 0x1a, 0xd8, 0x01, 0x31, 0xba, 0xc1, 0x38, 0x03, 0x93, 0xab, 0xfb, 0x4b,
+ 0xc7, 0x7f, 0xb0, 0x57, 0xdb, 0x55, 0x4f, 0xb8, 0x21, 0x9d, 0xd6, 0x48,
+ 0x6b, 0xa3, 0x4c, 0xee, 0x9e, 0xe2, 0x63, 0xb4, 0xd1, 0x5f, 0x38, 0xd4,
+ 0x8e, 0xed, 0xc3, 0x14, 0xbb, 0x4e, 0x43, 0xc3, 0x75, 0xa6, 0xb1, 0x79,
+ 0xc7, 0x04, 0x74, 0x40, 0x96, 0xbc, 0xe9, 0x1e, 0xd5, 0x33, 0xc2, 0x75,
+ 0x3d, 0xe9, 0x95, 0xf6, 0xa0, 0x4d, 0x99, 0x5e, 0x3c, 0x4a, 0xb4, 0xdb,
+ 0x58, 0x56, 0x22, 0x32, 0xe8, 0x44, 0x74, 0x57, 0xed, 0x7e, 0xb5, 0xb1,
+ 0x0a, 0x3e, 0x37, 0x80, 0x42, 0xe4, 0x12, 0x61, 0x70, 0x9b, 0x4f, 0xca,
+ 0x69, 0x24, 0x0f, 0xc4, 0x8f, 0x41, 0xb1, 0xe9, 0x45, 0x4f, 0x80, 0x7e,
+ 0x48, 0x4e, 0xe0, 0x71, 0x61, 0xdd, 0xbe, 0xd0, 0xe8, 0x89, 0xf5, 0x3a,
+ 0x43, 0xe0, 0x7c, 0xfa, 0xa4, 0x8d, 0x82, 0x52, 0x69, 0x53, 0x49, 0x86,
+ 0x6c, 0x59, 0x02, 0x53, 0xa0, 0x3f, 0xd6, 0x22, 0xa9, 0xe4, 0x56, 0x76,
+ 0x7e, 0x7e, 0x2d, 0x45, 0x2a, 0x21, 0x82, 0x8d, 0x3f, 0xaa, 0x28, 0x29,
+ 0xe0, 0x04, 0x9e, 0xf0, 0x5c, 0x36, 0x93, 0x39, 0x29, 0xb1, 0x2e, 0xc7,
+ 0x44, 0x1a, 0x08, 0xdd, 0x9c, 0x9c, 0x88, 0x16, 0x8f, 0x43, 0x41, 0x48,
+ 0xd6, 0x19, 0xc6, 0xeb, 0x54, 0x5e, 0x02, 0xa7, 0x2f, 0xf4, 0xa5, 0xc5,
+ 0x40, 0x4e, 0x86, 0x7e, 0xf8, 0x53, 0xb5, 0x8f, 0x3a, 0xcc, 0x4b, 0x47,
+ 0x6c, 0x7c, 0xc1, 0x82, 0x26, 0xbb, 0x68, 0xc9, 0xde, 0x15, 0x43, 0x76,
+ 0x4f, 0x25, 0x4d, 0x92, 0x9d, 0xae, 0xc4, 0x7a, 0x96, 0x43, 0xa3, 0x6b,
+ 0x7d, 0xd7, 0x78, 0x32, 0xb2, 0x80, 0x33, 0x0c, 0x0b, 0x6f, 0x85, 0x55,
+ 0xe5, 0x2c, 0x1e, 0xd8, 0x09, 0xd5, 0xb8, 0x4e, 0xbb, 0xab, 0x7c, 0xe2,
+ 0x9e, 0xd8, 0x68, 0x94, 0x20, 0x24, 0x9b, 0xee, 0x95, 0xa8, 0xb6, 0xaa,
+ 0xad, 0x87, 0xa0, 0xc2, 0x26, 0xcb, 0xc0, 0x60, 0x55, 0x6d, 0x3a, 0x5e,
+ 0xf0, 0xbf, 0xa4, 0x4d, 0x80, 0x0a, 0x86, 0x21, 0x2a, 0xe9, 0x52, 0x84,
+ 0x9f, 0xd8, 0x7c, 0x32, 0xd8, 0x3a, 0x88, 0x1b, 0xea, 0xe5, 0x1e, 0x29,
+ 0xe7, 0xac, 0xc4, 0x71, 0x14, 0x46, 0x0b, 0x99, 0xe4, 0x15, 0x7c, 0xbe,
+ 0x39, 0x2e, 0xd5, 0xf4, 0x36, 0x6b, 0x49, 0x54, 0x98, 0x93, 0xc0, 0x7e,
+ 0x2a, 0x85, 0xc1, 0xc7, 0xa5, 0xad, 0x6b, 0x04, 0xca, 0x54, 0xf8, 0x74,
+ 0xb5, 0xe7, 0x02, 0x0c, 0x02, 0x10, 0x1d, 0x29, 0x1a, 0x69, 0x90, 0xf7,
+ 0x31, 0xfb, 0xf8, 0x44, 0xb2, 0x78, 0xc0, 0x90, 0x0e, 0x05, 0x2b, 0xa0,
+ 0x64, 0x4c, 0xf2, 0x90, 0x67, 0x92, 0xfd, 0xe0, 0x82, 0xc4, 0x51, 0x67,
+ 0xb2, 0x00, 0xbf, 0xa1, 0x24, 0x04, 0x3f, 0x0b, 0xc3, 0x5b, 0x5d, 0x71,
+ 0xe7, 0x6e, 0x3b, 0x79, 0x89, 0xc5, 0xb4, 0x94, 0x43, 0xa3, 0x88, 0x64,
+ 0x3c, 0x39, 0x31, 0x1c, 0x3a, 0x84, 0x61, 0x94, 0x32, 0xe3, 0x60, 0x95,
+ 0x7b, 0x8a, 0x07, 0xae, 0xfb, 0xf5, 0x1a, 0x43, 0x21, 0x9d, 0x6b, 0xa6,
+ 0x80, 0xa8, 0x0e, 0xa2, 0x64, 0x76, 0x7b, 0x9b, 0xf5, 0xa7, 0x02, 0x43,
+ 0xc9, 0xbe, 0xc9, 0x7c, 0x04, 0x23, 0x4a, 0xc1, 0xc2, 0x8c, 0xf0, 0xb1,
+ 0x13, 0x14, 0x14, 0xfc, 0x03, 0xb5, 0x36, 0x5b, 0xa4, 0xcb, 0xf0, 0x97,
+ 0xe1, 0x5c, 0x50, 0x92, 0x49, 0xd3, 0x1d, 0xe8, 0x43, 0x3c, 0xf5, 0x30,
+ 0xf3, 0x86, 0xdc, 0x36, 0x54, 0xc1, 0x7d, 0x42, 0xf1, 0x92, 0xaa, 0x14,
+ 0x9f, 0xe3, 0x31, 0xd0, 0x3f, 0xac, 0x71, 0x99, 0x21, 0x74, 0x67, 0x5f,
+ 0xb4, 0x96, 0xda, 0x89, 0x6b, 0x27, 0x02, 0x57, 0x09, 0x9c, 0xd5, 0xe5,
+ 0x6d, 0x79, 0x02, 0xcf, 0x18, 0x19, 0xce, 0xa0, 0xca, 0xb6, 0xa8, 0x58,
+ 0xa3, 0x18, 0x28, 0xac, 0x03, 0xfe, 0x9c, 0x2f, 0x28, 0x4e, 0xd5, 0x8c,
+ 0xc4, 0xb5, 0x4e, 0xc5, 0x70, 0x1d, 0x94, 0xf6, 0x53, 0x0f, 0x51, 0xf0,
+ 0x73, 0x05, 0xc2, 0x62, 0x92, 0x01, 0x26, 0x08, 0x1a, 0x7d, 0x5f, 0x1b,
+ 0x91, 0xff, 0x9d, 0x7c, 0xf5, 0x9f, 0x2d, 0x59, 0xb3, 0x02, 0xcf, 0x97,
+ 0x2b, 0x8b, 0x00, 0x60, 0x8a, 0x5e, 0xc4, 0x52, 0x19, 0xe9, 0x9a, 0xca,
+ 0x36, 0xba, 0x8d, 0xa4, 0xe5, 0x57, 0xc3, 0x24, 0x05, 0xdb, 0x72, 0xf3,
+ 0x74, 0x4e, 0xb5, 0x71, 0x0f, 0x9f, 0x9a, 0xa2, 0x90, 0x6f, 0x27, 0xc5,
+ 0x28, 0xc8, 0x1a, 0xe4, 0x13, 0x56, 0x6b, 0xfc, 0x66, 0x59, 0x21, 0x0d,
+ 0x64, 0x62, 0x4e, 0xc7, 0x41, 0xf6, 0x90, 0x51, 0xac, 0x5f, 0x31, 0xd6,
+ 0x4e, 0x68, 0x2f, 0x55, 0x33, 0x1d, 0x94, 0x8a, 0x27, 0x79, 0xc6, 0x26,
+ 0xa1, 0x15, 0xdf, 0x5d, 0xd5, 0x9c, 0x43, 0x22, 0x96, 0xa8, 0xfe, 0xbb,
+ 0x1f, 0xb0, 0xa6, 0xab, 0x9f, 0xf9, 0x7c, 0x6d, 0xb2, 0x49, 0x66, 0x50,
+ 0x60, 0xdd, 0xa4, 0x82, 0x67, 0x1f, 0x10, 0xff, 0x80, 0x75, 0x13, 0x48,
+ 0x7a, 0x3a, 0x08, 0xdc, 0x01, 0xb9, 0xb2, 0xf4, 0x47, 0x13, 0xc8, 0x6b,
+ 0xd3, 0x98, 0x1e, 0x30, 0x32, 0x60, 0x94, 0x7e, 0xcc, 0x47, 0xb3, 0x91,
+ 0x69, 0x7a, 0x98, 0x73, 0x70, 0x40, 0x92, 0x8f, 0x55, 0xc0, 0x00, 0xae,
+ 0x8f, 0x14, 0x4b, 0x72, 0xe5, 0xdb, 0x7c, 0xfe, 0xd3, 0xf4, 0x4c, 0xff,
+ 0xe2, 0xe8, 0x41, 0x74, 0xfa, 0x5a, 0xf1, 0x9b, 0x43, 0x0c, 0x88, 0x87,
+ 0x52, 0x5e, 0x1e, 0x70, 0x51, 0x39, 0x2a, 0xd8, 0x6e, 0xa2, 0x59, 0x32,
+ 0xd6, 0xfa, 0x71, 0x2d, 0xb4, 0x93, 0x4e, 0xf5, 0x9d, 0xc2, 0xb8, 0x6e,
+ 0xd3, 0x3e, 0x0c, 0x06, 0x5d, 0xd1, 0x33, 0x40, 0x3c, 0x64, 0xbb, 0x10,
+ 0xf4, 0x09, 0x33, 0x30, 0x08, 0xc3, 0xd2, 0xae, 0x47, 0x59, 0xc5, 0x1c,
+ 0xf4, 0xab, 0x05, 0x59, 0xcb, 0x28, 0x04, 0x65, 0x57, 0x28, 0x5c, 0x03,
+ 0xf2, 0xd7, 0xaa, 0x3d, 0xf5, 0x16, 0x13, 0xcf, 0x32, 0xe2, 0x32, 0x21,
+ 0x42, 0x77, 0x47, 0x35, 0xf7, 0x10, 0xf3, 0x90, 0x28, 0x72, 0x7c, 0x22,
+ 0xc7, 0x42, 0x3e, 0x57, 0x6b, 0xe3, 0x18, 0x8d, 0x94, 0x83, 0xb7, 0x56,
+ 0x57, 0xc0, 0x05, 0x81, 0x01, 0x65, 0x67, 0x69, 0xff, 0xfd, 0xac, 0x6c,
+ 0xbd, 0x4e, 0x67, 0x13, 0x08, 0x25, 0x1c, 0x25, 0xeb, 0xbd, 0xb3, 0xd7,
+ 0x17, 0x1b, 0xce, 0x41, 0x93, 0x60, 0xd9, 0x3f, 0x4a, 0x7a, 0x65, 0x0f,
+ 0x0e, 0xbf, 0x99, 0xc2, 0xa9, 0x4a, 0xb0, 0x28, 0x81, 0x81, 0x71, 0x74,
+ 0x53, 0x0c, 0x9b, 0x72, 0x0f, 0x74, 0xd2, 0xf9, 0xa5, 0xe9, 0xc7, 0xe4,
+ 0xc5, 0x8b, 0xef, 0x44, 0xb7, 0xc5, 0x71, 0x49, 0xb4, 0xdc, 0x15, 0xfe,
+ 0xcc, 0x15, 0x32, 0x27, 0xf9, 0xd4, 0x74, 0xcd, 0x42, 0x5b, 0xa3, 0x75,
+ 0x19, 0x4a, 0x42, 0xa5, 0x0f, 0x39, 0x60, 0x2e, 0x0f, 0xb3, 0x29, 0xe6,
+ 0x6e, 0xdd, 0x3a, 0xe5, 0xe5, 0x4b, 0xc6, 0x9c, 0xec, 0xa1, 0x3b, 0x60,
+ 0x4f, 0xdc, 0x01, 0x18, 0xac, 0x84, 0x76, 0x44, 0x1e, 0xb0, 0xa4, 0x62,
+ 0xde, 0x41, 0xbe, 0x2c, 0x7a, 0xad, 0x66, 0xe9, 0x5d, 0xa6, 0x14, 0x7e,
+ 0x14, 0x05, 0x1e, 0xf3, 0x32, 0xab, 0x8c, 0x68, 0x58, 0x3c, 0x82, 0x22,
+ 0x04, 0xa7, 0x05, 0x8f, 0xaa, 0x2d, 0x49, 0x83, 0x1c, 0xa7, 0x4d, 0x33,
+ 0x42, 0xa1, 0xdb, 0x4e, 0xb7, 0xfd, 0xc5, 0x05, 0xe0, 0xba, 0xc9, 0xb4,
+ 0x79, 0xc8, 0x60, 0xef, 0x6b, 0xdd, 0xa3, 0x26, 0x20, 0xa8, 0x8b, 0xb8,
+ 0x78, 0xcd, 0x20, 0x28, 0xd4, 0x3d, 0xca, 0x66, 0x63, 0x89, 0x86, 0xa2,
+ 0x8a, 0x10, 0xd2, 0x01, 0xce, 0xa0, 0x00, 0x9e, 0x01, 0xa1, 0x3e, 0xce,
+ 0x01, 0x5f, 0x8b, 0xf4, 0x4b, 0xe2, 0xfa, 0x57, 0x1f, 0x5f, 0x5b, 0xb7,
+ 0x7a, 0x15, 0x0b, 0x94, 0xcb, 0xb7, 0xe0, 0xef, 0x72, 0x1f, 0x45, 0xd2,
+ 0xdc, 0x9b, 0xe3, 0xc2, 0x6c, 0xba, 0x7c, 0x94, 0x52, 0x35, 0xd5, 0x3b,
+ 0x30, 0x9a, 0x07, 0x43, 0x55, 0xb5, 0x5a, 0x75, 0x98, 0x8b, 0x99, 0x13,
+ 0xaf, 0x4c, 0x0e, 0x47, 0xec, 0xf4, 0x53, 0xc3, 0x8d, 0x30, 0xbf, 0x62,
+ 0x1d, 0xab, 0xf4, 0x6c, 0x24, 0x58, 0x53, 0x87, 0x5d, 0x19, 0x84, 0x62,
+ 0x22, 0x85, 0x2b, 0x18, 0x1d, 0xc6, 0x2c, 0xd2, 0x6c, 0xcc, 0xc9, 0xd6,
+ 0x37, 0x84, 0xb4, 0x4f, 0x19, 0x1b, 0x4d, 0x12, 0xda, 0x6c, 0x96, 0x97,
+ 0x45, 0x58, 0xa0, 0xa8, 0x67, 0x97, 0xd6, 0x31, 0x14, 0x09, 0xea, 0x77,
+ 0xc3, 0x50, 0x9d, 0xc5, 0x26, 0x98, 0x1a, 0xdc, 0x25, 0x30, 0xee, 0x7c,
+ 0xec, 0x10, 0x6f, 0xa6, 0x14, 0x1d, 0xb2, 0xa8, 0x2d, 0x3f, 0x2a, 0xdf,
+ 0x0d, 0x09, 0x19, 0x01, 0x48, 0xf9, 0x63, 0x97, 0x11, 0x53, 0x2d, 0xef,
+ 0x81, 0x47, 0x08, 0x55, 0x25, 0x18, 0x88, 0x16, 0xa1, 0xba, 0x20, 0x6e,
+ 0x8a, 0xa5, 0xa0, 0x4d, 0x69, 0x54, 0xbf, 0xa6, 0xad, 0xdf, 0x3b, 0xad,
+ 0xff, 0xf9, 0x5b, 0x10, 0xb0, 0xf3, 0xab, 0x19, 0x6d, 0xcb, 0xfc, 0xf7,
+ 0xdb, 0x1c, 0x6a, 0x90, 0xf5, 0x84, 0x83, 0xe0, 0x0b, 0x46, 0x4b, 0x1d,
+ 0xa3, 0x8a, 0x79, 0x2c, 0x2a, 0xa6, 0xe7, 0x88, 0x03, 0x50, 0x49, 0x82,
+ 0x96, 0xe4, 0xda, 0xc6, 0xb2, 0x7d, 0xb9, 0xe2, 0x9b, 0x45, 0x3d, 0xc6,
+ 0x3d, 0x66, 0x76, 0x79, 0xb6, 0x5e, 0x6e, 0x28, 0x80, 0x8d, 0x75, 0x4e,
+ 0xf0, 0xff, 0x90, 0x6d, 0xcc, 0x9d, 0x33, 0x5f, 0x77, 0xa6, 0xe9, 0xfb,
+ 0x5c, 0x35, 0x10, 0x50, 0x81, 0x96, 0xc1, 0xf1, 0x9a, 0xdc, 0xf4, 0x63,
+ 0x0b, 0x42, 0xff, 0xff, 0x4d, 0x95, 0xb8, 0x5a, 0xb0, 0x28, 0x1a, 0x4a,
+ 0xd5, 0x9f, 0x29, 0x7f, 0x82, 0xd2, 0x51, 0xc1, 0x46, 0x30, 0x1d, 0xa9,
+ 0x93, 0x61, 0x74, 0x27, 0x6d, 0x93, 0x1e, 0x7f, 0xc6, 0xc3, 0x1b, 0x55,
+ 0x37, 0x98, 0x4c, 0x0c, 0x9c, 0x05, 0x95, 0x62, 0x94, 0x7f, 0x24, 0xb3,
+ 0x1e, 0x1e, 0x29, 0x14, 0xe7, 0xca, 0xb1, 0xb1, 0xe5, 0x73, 0x88, 0xf1,
+ 0xdf, 0xa1, 0xbc, 0x5b, 0x38, 0xf2, 0x7f, 0xff, 0xff, 0x27, 0x5a, 0x24,
+ 0x53, 0x17, 0x83, 0xeb, 0x8a, 0xb9, 0xcb, 0x52, 0x27, 0xec, 0x6f, 0x61,
+ 0x4d, 0xcf, 0x9a, 0xb6, 0x08, 0xc1, 0xfc, 0x7b, 0x48, 0x31, 0xff, 0x67,
+ 0x4f, 0x1c, 0xba, 0x47, 0x23, 0x74, 0x4a, 0xe2, 0xd3, 0x97, 0x2d, 0x92,
+ 0xe1, 0xed, 0x51, 0xbd, 0x15, 0x28, 0xc2, 0x87, 0xf7, 0x82, 0xa1, 0x79,
+ 0xab, 0x12, 0x4a, 0x15, 0xb2, 0x25, 0xf7, 0x47, 0x90, 0x3b, 0xb7, 0x70,
+ 0xc5, 0x1b, 0x74, 0xce, 0x37, 0x96, 0x59, 0x58, 0x9b, 0xc3, 0x22, 0x28,
+ 0x4a, 0x55, 0xec, 0x19, 0x73, 0x67, 0x83, 0x1e, 0xa0, 0x64, 0x51, 0xed,
+ 0xf3, 0x91, 0xdc, 0x14, 0x38, 0xeb, 0xd8, 0x04, 0xc0, 0x11, 0x90, 0x28,
+ 0xe0, 0x3c, 0x67, 0x7b, 0xaf, 0x51, 0x0f, 0xd6, 0xfe, 0xf7, 0xf4, 0x9a,
+ 0x03, 0x41, 0xe7, 0xf7, 0x9a, 0xf1, 0x97, 0x13, 0x4e, 0x99, 0x60, 0x01,
+ 0x97, 0x8d, 0x3b, 0xfd, 0x62, 0x74, 0x93, 0x8f, 0xb5, 0xb8, 0x45, 0xc2,
+ 0x15, 0xa7, 0x50, 0x3c, 0x00, 0x1a, 0xd0, 0x64, 0x8c, 0x5e, 0x6d, 0x12,
+ 0xd8, 0x4a, 0x44, 0xf9, 0x72, 0x32, 0x53, 0xa7, 0x1a, 0x27, 0x79, 0x26,
+ 0x97, 0x8c, 0x2e, 0xcb, 0x49, 0x7d, 0x9c, 0xa8, 0xa1, 0x24, 0xbd, 0x5a,
+ 0xa1, 0x6d, 0x9d, 0x1a, 0xd1, 0xc2, 0x39, 0x5e, 0xd8, 0x88, 0xcd, 0x6d,
+ 0xcd, 0xbd, 0x68, 0x61, 0xd7, 0x80, 0x09, 0xb3, 0x71, 0x4e, 0xe6, 0xb9,
+ 0x70, 0xd8, 0x3a, 0x9f, 0x8b, 0xcd, 0xed, 0xe6, 0x59, 0xe8, 0xd8, 0x33,
+ 0x88, 0xa0, 0xf3, 0xfd, 0x12, 0xcb, 0x1f, 0x4c, 0x17, 0xc5, 0xcd, 0xc3,
+ 0x32, 0x9f, 0xb0, 0x6b, 0x0e, 0xb2, 0x17, 0xbd, 0x7b, 0x9e, 0xd3, 0x83,
+ 0xe4, 0xec, 0xf9, 0x5d, 0xa0, 0x05, 0x25, 0xd9, 0xcc, 0x5f, 0xb9, 0xda,
+ 0x64, 0xdf, 0xcf, 0x02, 0xaf, 0xb4, 0x83, 0xc1, 0xf3, 0x3b, 0x5b, 0x5e,
+ 0xb6, 0x2f, 0xe9, 0xfa, 0x05, 0xe1, 0x2f, 0x52, 0x59, 0x1d, 0x30, 0xc2,
+ 0xf6, 0xc1, 0x8b, 0xdb, 0xcf, 0xb8, 0x94, 0xd6, 0x10, 0xb5, 0x5e, 0x02,
+ 0xcd, 0x07, 0x24, 0xc6, 0xc4, 0x8e, 0x3e, 0xf9, 0x23, 0xe9, 0x26, 0xe7,
+ 0xdc, 0x7d, 0xcc, 0xbd, 0xa4, 0x98, 0x01, 0x4a, 0x66, 0xe6, 0xfb, 0xd6,
+ 0xcd, 0x8d, 0x1b, 0xe6, 0xce, 0x75, 0x73, 0xeb, 0x86, 0x9a, 0xe4, 0xe7,
+ 0xb2, 0xaa, 0x8e, 0x69, 0xe3, 0xec, 0x93, 0x96, 0x3c, 0xd8, 0x20, 0x08,
+ 0x87, 0x05, 0x16, 0x4c, 0x43, 0x09, 0xcf, 0x5a, 0xed, 0xd6, 0x52, 0xef,
+ 0x87, 0x03, 0x90, 0x79, 0x0d, 0x1b, 0x74, 0xa3, 0xfd, 0x42, 0xc0, 0x29,
+ 0xc9, 0xb1, 0x26, 0x26, 0x10, 0x90, 0xc3, 0x33, 0xba, 0xf6, 0xb7, 0x25,
+ 0xfa, 0xa5, 0xd5, 0x38, 0xcc, 0x5b, 0xe1, 0x00, 0x7d, 0x88, 0xf7, 0x0d,
+ 0x76, 0xc0, 0x7f, 0x1d, 0x19, 0x76, 0x8b, 0x31, 0x08, 0x29, 0x63, 0xf6,
+ 0xbc, 0x7d, 0x0a, 0x19, 0xfe, 0x0d, 0xe8, 0xe2, 0x6f, 0x8a, 0x07, 0x59,
+ 0x1a, 0x24, 0x74, 0x38, 0x26, 0xc2, 0xbf, 0x21, 0x0d, 0x9e, 0xfd, 0xed,
+ 0x4f, 0x91, 0xe0, 0x37, 0x4b, 0xcc, 0x33, 0x68, 0x69, 0x4b, 0x4e, 0x74,
+ 0xf2, 0x7f, 0xd6, 0x4c, 0x7f, 0x03, 0x33, 0xfd, 0xcd, 0xc2, 0x99, 0xfe,
+ 0x86, 0x66, 0xfa, 0x9b, 0xa5, 0x67, 0x5a, 0xce, 0xca, 0x37, 0x68, 0x69,
+ 0x76, 0x61, 0x6f, 0xb3, 0xd2, 0xb9, 0xf8, 0x29, 0x7d, 0x84, 0xd5, 0x86,
+ 0x49, 0xb6, 0xc0, 0xfa, 0xb0, 0xf9, 0x4d, 0x02, 0x55, 0x6c, 0xbf, 0xd9,
+ 0x9c, 0xb3, 0x5e, 0x54, 0xaa, 0xf4, 0x39, 0x27, 0xce, 0xaf, 0xc9, 0xe3,
+ 0x6d, 0xff, 0x05, 0xb6, 0x3c, 0x4f, 0x12, 0xae, 0x8f, 0xc5, 0x39, 0x61,
+ 0x58, 0x1c, 0x89, 0x58, 0x04, 0xac, 0x10, 0x0e, 0xd5, 0x52, 0x77, 0x81,
+ 0x29, 0xa7, 0x1a, 0x9d, 0x03, 0xad, 0x52, 0xa3, 0x0d, 0xfd, 0x06, 0x25,
+ 0xae, 0xb8, 0x88, 0x42, 0x85, 0xb8, 0xc2, 0xa2, 0xaf, 0x9b, 0xbe, 0x67,
+ 0x8d, 0xf7, 0xc3, 0x12, 0xc3, 0x8d, 0x04, 0x90, 0x3c, 0x7f, 0x9c, 0x51,
+ 0xec, 0x46, 0xed, 0x22, 0xfd, 0x73, 0x83, 0xf3, 0xab, 0x61, 0x58, 0x03,
+ 0xec, 0x26, 0xe1, 0x1d, 0xdf, 0x18, 0xf9, 0xd9, 0x46, 0xb0, 0x01, 0x1c,
+ 0x9f, 0x84, 0xae, 0xe1, 0x85, 0xb3, 0xfc, 0x66, 0x98, 0x17, 0xd1, 0x68,
+ 0xb6, 0x1b, 0xfc, 0xe9, 0x6e, 0x92, 0x3e, 0xdc, 0xab, 0xf0, 0xc7, 0x58,
+ 0x2d, 0x31, 0x2f, 0x66, 0x32, 0xfb, 0x48, 0xf8, 0x10, 0xad, 0x72, 0x3a,
+ 0xf0, 0xf2, 0x3e, 0xd0, 0x73, 0xf3, 0x21, 0x8b, 0x56, 0x23, 0xbb, 0x11,
+ 0x72, 0x87, 0x97, 0x62, 0x53, 0x58, 0x7c, 0x56, 0xe9, 0x58, 0xc9, 0xfb,
+ 0xec, 0x89, 0xae, 0xb6, 0xba, 0x3f, 0x76, 0xde, 0x5d, 0xf5, 0xae, 0xaf,
+ 0x3e, 0x63, 0x41, 0x47, 0xbf, 0x0a, 0xee, 0xba, 0x54, 0xe5, 0x5d, 0x5d,
+ 0xa9, 0x2f, 0xcb, 0xbb, 0xe1, 0xbc, 0x24, 0xa7, 0x6f, 0x20, 0xcf, 0x17,
+ 0xac, 0x9e, 0xaf, 0x11, 0x3d, 0x19, 0xec, 0x4b, 0xb6, 0x90, 0x47, 0x72,
+ 0x65, 0xb4, 0x17, 0xed, 0x13, 0x59, 0x5d, 0x01, 0x53, 0xc1, 0xbf, 0x65,
+ 0xc3, 0x01, 0x60, 0x2f, 0x17, 0x50, 0x79, 0x36, 0x81, 0x40, 0x92, 0x61,
+ 0xdb, 0xdc, 0x9a, 0x11, 0x1e, 0x16, 0x8d, 0xe0, 0x16, 0x07, 0x60, 0xfe,
+ 0x6d, 0xe7, 0x65, 0xde, 0xce, 0x06, 0xb3, 0xcd, 0x7c, 0x0c, 0xa6, 0xf4,
+ 0xac, 0xdc, 0xcc, 0xd3, 0x71, 0xba, 0x99, 0x62, 0xe7, 0x90, 0x70, 0x36,
+ 0xad, 0xaa, 0xd7, 0x82, 0x62, 0x36, 0x8d, 0xd3, 0x4f, 0x7f, 0x16, 0xe7,
+ 0x60, 0x75, 0x05, 0x18, 0xf8, 0x26, 0x2c, 0x87, 0xb7, 0x2c, 0xef, 0x2e,
+ 0xba, 0xdb, 0x87, 0x07, 0x07, 0x91, 0x39, 0xce, 0xb3, 0xe9, 0x2d, 0xce,
+ 0xf2, 0xe4, 0xb6, 0x0f, 0xff, 0xc1, 0x6d, 0xed, 0x29, 0x00, 0x5e, 0xd0,
+ 0xca, 0xf5, 0xae, 0x2f, 0x12, 0xf3, 0x74, 0x82, 0x8f, 0x9f, 0xc2, 0xd7,
+ 0xd5, 0x15, 0x3b, 0xd1, 0x49, 0x6f, 0x7c, 0x67, 0x84, 0x67, 0x82, 0x56,
+ 0xbc, 0x4e, 0xcb, 0xf7, 0x60, 0xad, 0xef, 0x67, 0x1b, 0x6d, 0x35, 0xc9,
+ 0xf2, 0xf0, 0x0b, 0x73, 0xc3, 0x5d, 0x69, 0x13, 0x3f, 0x2e, 0xbd, 0x40,
+ 0x4e, 0x0c, 0xff, 0x7e, 0xc9, 0x86, 0x6a, 0xdf, 0x15, 0x05, 0xb3, 0xfe,
+ 0x63, 0x3b, 0xe9, 0x0c, 0x3f, 0x64, 0xb0, 0x47, 0xc7, 0xe6, 0xab, 0x21,
+ 0x84, 0xfd, 0x76, 0x64, 0x94, 0x97, 0x57, 0x6f, 0x0e, 0x76, 0x8f, 0x5b,
+ 0xc5, 0x70, 0xd0, 0x50, 0x79, 0x5d, 0x3c, 0x90, 0xab, 0x37, 0x89, 0xf9,
+ 0xf1, 0x33, 0xaa, 0xcd, 0x48, 0x7c, 0xbb, 0x42, 0x7c, 0x76, 0x56, 0x52,
+ 0x96, 0xe0, 0xdf, 0x4c, 0xee, 0xd2, 0x71, 0xfe, 0x3b, 0x79, 0x3a, 0x60,
+ 0xd4, 0x57, 0x18, 0x2c, 0x32, 0x19, 0xf0, 0x35, 0x6f, 0x92, 0xb8, 0x77,
+ 0x2f, 0xb6, 0x8f, 0x8f, 0x8e, 0x92, 0xf5, 0x1e, 0x64, 0xd5, 0x75, 0xc1,
+ 0x7a, 0x2a, 0xb3, 0x65, 0xf5, 0x27, 0x8b, 0x39, 0x69, 0x01, 0xbf, 0xc5,
+ 0xbc, 0x8f, 0xe8, 0x1f, 0xd6, 0x81, 0xf8, 0x2b, 0x94, 0x86, 0xf9, 0x90,
+ 0xfe, 0xf6, 0x22, 0xf1, 0x7a, 0xb5, 0xba, 0xb2, 0xa8, 0x5b, 0xcd, 0x04,
+ 0xfa, 0x50, 0x33, 0xbb, 0xbb, 0xdb, 0x07, 0x07, 0xf5, 0xd3, 0x0b, 0xbf,
+ 0xfe, 0x37, 0x9e, 0x5f, 0xec, 0xfc, 0xf6, 0x0b, 0x28, 0x43, 0x6e, 0x1a,
+ 0x33, 0x73, 0x9c, 0xc0, 0x14, 0x97, 0xcb, 0xcc, 0x31, 0x46, 0xc2, 0x4c,
+ 0xa4, 0x2e, 0x23, 0x95, 0xc6, 0x2e, 0x67, 0x37, 0x86, 0x81, 0xe6, 0xa8,
+ 0xc2, 0x26, 0x5f, 0x8f, 0x06, 0x69, 0x79, 0x7f, 0xb2, 0xba, 0xf2, 0x16,
+ 0xbc, 0x30, 0xdb, 0x2f, 0x4c, 0xd3, 0xf0, 0xc4, 0x13, 0xda, 0xc0, 0xcb,
+ 0x25, 0x16, 0xa6, 0x32, 0x9c, 0xd5, 0x95, 0xc8, 0xc2, 0x1c, 0x1f, 0xd6,
+ 0x2c, 0x0c, 0xfa, 0x16, 0xdc, 0x52, 0x38, 0x7f, 0x43, 0x03, 0x87, 0xbe,
+ 0xfe, 0xcc, 0x77, 0x85, 0x73, 0xe7, 0xda, 0x83, 0x75, 0xda, 0x45, 0x0a,
+ 0x35, 0xfd, 0x77, 0x6e, 0xfd, 0x69, 0xd6, 0xbf, 0x1f, 0x17, 0xc3, 0xe2,
+ 0xee, 0xc9, 0x4d, 0xc5, 0x4f, 0x63, 0x73, 0x6c, 0x4c, 0x4a, 0xf3, 0xbe,
+ 0x57, 0xb3, 0xe1, 0x34, 0x37, 0x5a, 0x7f, 0xeb, 0x0d, 0x16, 0x39, 0x85,
+ 0x69, 0x1f, 0xf8, 0x9c, 0x16, 0xdd, 0x20, 0x1b, 0xf2, 0x6c, 0x22, 0xb3,
+ 0xd8, 0x99, 0xf4, 0xef, 0x73, 0x88, 0xe7, 0x98, 0x41, 0x20, 0x26, 0xcc,
+ 0xfd, 0x59, 0x5a, 0xe6, 0x7d, 0x6a, 0x70, 0x08, 0x68, 0x46, 0x50, 0x0c,
+ 0xc9, 0xec, 0x80, 0xac, 0xfd, 0xdc, 0x39, 0xa6, 0xbc, 0x89, 0xd8, 0x1c,
+ 0x9b, 0xe1, 0x3d, 0x0c, 0x8d, 0x80, 0x99, 0x42, 0xd1, 0x78, 0x3a, 0xde,
+ 0x3b, 0xaf, 0x92, 0x6d, 0xb3, 0xec, 0x13, 0x44, 0x87, 0x34, 0x5f, 0x0e,
+ 0x37, 0xe6, 0xad, 0x43, 0x6b, 0x67, 0x6b, 0x6b, 0x4b, 0x67, 0x03, 0x45,
+ 0xd6, 0x85, 0xee, 0xf9, 0x8c, 0x48, 0xe7, 0x87, 0x88, 0x74, 0x7e, 0x28,
+ 0x40, 0x8a, 0xd5, 0x55, 0x5f, 0xbc, 0xf5, 0xe7, 0xad, 0xfa, 0x0b, 0xe8,
+ 0xaf, 0xb7, 0xe6, 0x10, 0x93, 0x10, 0x2e, 0x7a, 0xf2, 0xe9, 0x6b, 0xee,
+ 0xb6, 0x8e, 0x5e, 0xf4, 0xe4, 0xcf, 0xae, 0xf9, 0x32, 0x0c, 0x0f, 0x87,
+ 0x16, 0x59, 0x4f, 0x33, 0x18, 0xd8, 0xbe, 0xbc, 0x7c, 0xf2, 0x0d, 0xdd,
+ 0xdd, 0xfc, 0x05, 0x6a, 0x63, 0x95, 0xc5, 0x64, 0x9a, 0xcf, 0x00, 0x65,
+ 0x00, 0xcd, 0xdd, 0xea, 0x57, 0xb7, 0xad, 0x9a, 0xc9, 0xcf, 0x19, 0x46,
+ 0xea, 0x24, 0x3b, 0x6d, 0x78, 0x15, 0x19, 0xc6, 0xdf, 0x91, 0x0f, 0xad,
+ 0x99, 0xbc, 0x32, 0xa7, 0x7a, 0xdb, 0x0c, 0x7c, 0x30, 0xc8, 0xcb, 0x62,
+ 0xdc, 0xfa, 0x25, 0x2b, 0x87, 0x19, 0x84, 0x13, 0x7d, 0xc8, 0x86, 0x60,
+ 0x0c, 0x29, 0x93, 0xb7, 0x60, 0xd4, 0x32, 0x12, 0x88, 0x59, 0xf6, 0x83,
+ 0x39, 0x3d, 0xdd, 0xad, 0x12, 0x9d, 0xfd, 0xe5, 0xb3, 0xf1, 0xe5, 0x80,
+ 0xd2, 0x56, 0x57, 0x96, 0x9e, 0x8f, 0xa4, 0x3a, 0x1d, 0xbb, 0x91, 0xe9,
+ 0x58, 0x5d, 0x59, 0x72, 0x3e, 0x12, 0xa6, 0xc9, 0xab, 0xb3, 0xd7, 0xc9,
+ 0x96, 0xd9, 0x50, 0xdb, 0xad, 0x83, 0xed, 0x83, 0xdd, 0xdd, 0x96, 0x96,
+ 0x0d, 0x36, 0x6f, 0x58, 0xc8, 0xae, 0xc4, 0x10, 0x8e, 0x67, 0x43, 0xca,
+ 0xc2, 0x34, 0x02, 0xf5, 0xea, 0xca, 0xe5, 0x79, 0x32, 0x4a, 0x4d, 0x17,
+ 0xe9, 0xb2, 0xb3, 0x81, 0x42, 0xc6, 0xa9, 0x39, 0x16, 0x3e, 0xe4, 0xc5,
+ 0xac, 0xf4, 0x1d, 0x6e, 0x17, 0x10, 0x0a, 0xbc, 0xba, 0xd2, 0xa3, 0xf4,
+ 0x31, 0x88, 0xc4, 0x5b, 0x33, 0x67, 0xc5, 0x80, 0x61, 0xbb, 0x29, 0x14,
+ 0x60, 0x92, 0xad, 0x51, 0x09, 0x91, 0x6c, 0x2a, 0xbe, 0x5d, 0x34, 0xd6,
+ 0x4e, 0x9f, 0x86, 0x59, 0x79, 0x0f, 0xa9, 0xdb, 0xab, 0x2b, 0xa4, 0x8b,
+ 0x4f, 0x87, 0x4f, 0x8c, 0x9d, 0x32, 0xc5, 0x53, 0x06, 0x5a, 0xf2, 0x2c,
+ 0x36, 0xb6, 0xc6, 0x08, 0x28, 0x06, 0x8f, 0x66, 0x12, 0x29, 0x72, 0xad,
+ 0x18, 0x3d, 0x18, 0x2a, 0x06, 0x83, 0x35, 0x7b, 0xf2, 0x9f, 0x7c, 0xc0,
+ 0xb0, 0x27, 0xb0, 0xb0, 0x50, 0xbe, 0x0d, 0x06, 0x5d, 0xe2, 0x20, 0x09,
+ 0x22, 0xc3, 0xc8, 0x18, 0xa4, 0x3e, 0xa0, 0x34, 0x4f, 0x7a, 0xee, 0x72,
+ 0x42, 0x7e, 0xe7, 0xbe, 0x60, 0xf2, 0x32, 0x9f, 0x36, 0x7f, 0x1a, 0x0e,
+ 0x47, 0xe9, 0xb8, 0x71, 0x6a, 0x3e, 0x37, 0x8d, 0x98, 0x76, 0x0b, 0x91,
+ 0x29, 0x3f, 0xb7, 0x9b, 0xc9, 0xbb, 0xf4, 0x43, 0x0e, 0xfb, 0xfc, 0x3e,
+ 0xa7, 0x80, 0xb6, 0xbf, 0x67, 0xb7, 0xe6, 0x37, 0xb3, 0x8e, 0xe6, 0xc5,
+ 0xf4, 0x8c, 0xe6, 0x37, 0x5d, 0x33, 0x92, 0x7c, 0x88, 0x3e, 0xfc, 0xb7,
+ 0x66, 0xd4, 0x7d, 0xe0, 0x1d, 0x66, 0x89, 0xaf, 0x81, 0xc7, 0x40, 0xb6,
+ 0x23, 0x47, 0x12, 0x5f, 0x17, 0xc5, 0xd0, 0x0b, 0x05, 0x86, 0x30, 0x38,
+ 0xa4, 0x9b, 0x90, 0x5e, 0x50, 0x90, 0x39, 0x68, 0x26, 0x93, 0x87, 0x69,
+ 0x1b, 0x1d, 0xd3, 0xed, 0x5a, 0xc9, 0xe6, 0x0c, 0x84, 0xd9, 0x49, 0xd9,
+ 0x7a, 0x99, 0xc9, 0x66, 0x57, 0x57, 0x58, 0xc8, 0x6f, 0x9c, 0x26, 0xea,
+ 0xa2, 0xe9, 0x18, 0x8c, 0xb0, 0x6d, 0xa8, 0xc0, 0x28, 0x04, 0x44, 0xb5,
+ 0xd0, 0xbd, 0x97, 0x6d, 0xd8, 0xcc, 0xe8, 0xba, 0xd7, 0x83, 0x33, 0x1b,
+ 0x00, 0xbd, 0xea, 0xef, 0xb2, 0xb2, 0x98, 0x19, 0x01, 0xd9, 0x4a, 0xbf,
+ 0x58, 0x44, 0xe2, 0xa7, 0x77, 0x97, 0x1b, 0x2f, 0xa8, 0xd8, 0x9f, 0xe1,
+ 0x73, 0x57, 0x4f, 0x46, 0x02, 0xf9, 0x48, 0xcd, 0x5d, 0x01, 0x3a, 0xf8,
+ 0x34, 0xef, 0x7b, 0x23, 0x26, 0x39, 0x20, 0x59, 0xff, 0xa5, 0x98, 0xbc,
+ 0x47, 0xb8, 0xaf, 0x89, 0xd1, 0xf6, 0xcc, 0x7e, 0x38, 0x41, 0x94, 0xa2,
+ 0xd9, 0xc3, 0x00, 0x49, 0xc8, 0x50, 0x30, 0x0a, 0xfd, 0xbb, 0x47, 0x90,
+ 0x2c, 0x57, 0x19, 0x72, 0xe7, 0xec, 0xdf, 0xaa, 0x6a, 0xda, 0xd9, 0xe4,
+ 0x7f, 0xdd, 0xdd, 0xc1, 0x2b, 0xc7, 0xad, 0x7f, 0x1b, 0x66, 0xf9, 0xf8,
+ 0x33, 0x26, 0xa3, 0xa0, 0xd9, 0x87, 0x59, 0x46, 0xf8, 0x1a, 0x33, 0x77,
+ 0x9d, 0xb1, 0x61, 0xe7, 0x18, 0xea, 0x03, 0x47, 0x87, 0xe1, 0x15, 0x54,
+ 0xed, 0xd9, 0xe6, 0xde, 0xbd, 0xb5, 0x69, 0xdb, 0x46, 0x19, 0xa0, 0xe0,
+ 0x30, 0xb2, 0xc7, 0x94, 0xfd, 0xfb, 0x49, 0x7e, 0x6b, 0x56, 0xf8, 0x22,
+ 0x05, 0xc4, 0xa6, 0x27, 0x54, 0x24, 0x5e, 0xa5, 0x80, 0xee, 0x01, 0x00,
+ 0x96, 0xa5, 0xd4, 0x5a, 0xe1, 0x83, 0x09, 0x4c, 0x02, 0xe6, 0x86, 0x8b,
+ 0x49, 0x96, 0xdf, 0xcc, 0x26, 0x77, 0x74, 0xde, 0x9b, 0xb9, 0xac, 0xd7,
+ 0xe0, 0xe4, 0xc0, 0x7b, 0xdf, 0x9e, 0x8d, 0xf3, 0xd6, 0x2d, 0x3f, 0xd8,
+ 0x1e, 0x64, 0x9b, 0x56, 0xfb, 0xdf, 0x7c, 0x48, 0x81, 0x2b, 0x6d, 0xde,
+ 0x4c, 0x66, 0x19, 0x0c, 0x6c, 0xf3, 0x1e, 0x7a, 0xd8, 0x7e, 0xf0, 0xd5,
+ 0xb9, 0x3f, 0xd3, 0x90, 0xd5, 0xed, 0x6a, 0x96, 0xf2, 0xfc, 0x97, 0xc5,
+ 0x8b, 0x89, 0xdb, 0xe7, 0x97, 0xa2, 0xf8, 0x9c, 0x01, 0xf2, 0xcb, 0x2c,
+ 0x2b, 0xed, 0xdb, 0x73, 0xa0, 0xed, 0xf7, 0xf8, 0x7e, 0xbd, 0x31, 0xce,
+ 0x33, 0xc2, 0x6b, 0x04, 0xdb, 0x43, 0xdf, 0x6c, 0x0f, 0x8a, 0x58, 0x8a,
+ 0x29, 0x82, 0x6d, 0x2b, 0x50, 0xe6, 0xd3, 0xff, 0xcf, 0x54, 0xad, 0xe0,
+ 0x25, 0xe3, 0xda, 0x27, 0xb7, 0xff, 0x6b, 0xe2, 0xe4, 0x93, 0xf7, 0x4d,
+ 0xd8, 0xae, 0x79, 0xdf, 0xf0, 0xbd, 0xdd, 0xa3, 0x66, 0xf2, 0xe6, 0xfd,
+ 0xb4, 0x80, 0xc8, 0x15, 0x33, 0x82, 0x6d, 0x88, 0xfd, 0xa5, 0x38, 0x33,
+ 0xb3, 0xc9, 0x6e, 0x40, 0xa7, 0xec, 0x23, 0xd6, 0x64, 0x07, 0x76, 0xf3,
+ 0xf8, 0x7d, 0x36, 0x34, 0x07, 0x72, 0x3b, 0xf9, 0xbb, 0xd9, 0x78, 0xbf,
+ 0x03, 0x78, 0xfe, 0x8f, 0x93, 0xf2, 0xce, 0xec, 0xf5, 0xab, 0xeb, 0x4e,
+ 0xf7, 0x0a, 0x9e, 0xdf, 0x31, 0x9f, 0xcd, 0x1e, 0x3c, 0xdc, 0x6d, 0x6d,
+ 0x1f, 0xed, 0x19, 0xdd, 0xff, 0x01, 0x78, 0xb4, 0xd1, 0xc1, 0xcd, 0x91,
+ 0x36, 0x4c, 0x81, 0x0f, 0x98, 0xf7, 0x1a, 0x31, 0x05, 0x6f, 0x85, 0x78,
+ 0x6e, 0x92, 0x63, 0x00, 0x5b, 0xa4, 0xa4, 0x32, 0xe3, 0xa3, 0x87, 0x19,
+ 0x4a, 0x40, 0xfd, 0x1c, 0xcd, 0x9b, 0xfb, 0x87, 0x66, 0x33, 0x5f, 0x98,
+ 0x53, 0x27, 0xf9, 0xc0, 0x87, 0x62, 0x18, 0x76, 0x7c, 0xfa, 0x66, 0x9c,
+ 0xb5, 0x7e, 0x32, 0xca, 0xc8, 0x4d, 0x7e, 0x37, 0x33, 0xe7, 0x10, 0xb0,
+ 0xbc, 0xfa, 0x89, 0xc2, 0x90, 0x23, 0x25, 0x9a, 0xc3, 0xec, 0xd3, 0x4b,
+ 0xe9, 0xfb, 0xf6, 0xde, 0x56, 0xb2, 0xbe, 0x63, 0x18, 0xce, 0xce, 0xce,
+ 0x71, 0x6b, 0x67, 0x7f, 0xd7, 0xf4, 0xf8, 0x22, 0x33, 0x14, 0x07, 0x01,
+ 0x45, 0xb0, 0xc0, 0x31, 0x06, 0xd9, 0x35, 0x2f, 0x7b, 0xcf, 0x74, 0x45,
+ 0x9f, 0x4f, 0xff, 0x8e, 0xba, 0x11, 0x7e, 0x69, 0x63, 0xfb, 0xe9, 0x04,
+ 0x98, 0x2f, 0xec, 0x2e, 0x5d, 0x3c, 0xc2, 0x19, 0x47, 0xea, 0xc9, 0xeb,
+ 0xfa, 0xdd, 0xe6, 0xeb, 0x37, 0xd7, 0xbd, 0x56, 0x79, 0x67, 0x68, 0x0c,
+ 0xe8, 0xec, 0xf8, 0x70, 0x7b, 0x67, 0x7b, 0xbf, 0x71, 0xba, 0xf4, 0xad,
+ 0x44, 0x80, 0x51, 0xcb, 0x07, 0x9a, 0x9e, 0x5e, 0x76, 0x5e, 0xff, 0xd0,
+ 0x7d, 0x73, 0xde, 0xbb, 0xf2, 0x04, 0xa4, 0xaa, 0x2d, 0x64, 0xa1, 0xc9,
+ 0xc5, 0x2a, 0xdb, 0x9b, 0x66, 0xbb, 0x38, 0xd3, 0x96, 0x6b, 0xff, 0xbf,
+ 0x8d, 0x6d, 0xcb, 0x90, 0x88, 0xd9, 0x54, 0x13, 0x64, 0x77, 0x42, 0x26,
+ 0x68, 0x81, 0x59, 0xce, 0xa6, 0x55, 0x67, 0x43, 0x32, 0x5a, 0xb9, 0xd6,
+ 0xfd, 0x97, 0x30, 0x27, 0x99, 0x03, 0xa8, 0x6a, 0x4e, 0xc2, 0x86, 0x3e,
+ 0xdd, 0x9a, 0xb4, 0x7b, 0xf4, 0x22, 0xa9, 0x9c, 0xa9, 0x2f, 0x21, 0x5d,
+ 0x19, 0xa3, 0x75, 0xcd, 0x89, 0xfa, 0x72, 0xa3, 0x62, 0x44, 0xba, 0x6e,
+ 0xfb, 0x27, 0xb8, 0x3a, 0xab, 0x71, 0xc7, 0xbf, 0xea, 0x77, 0xd3, 0xfb,
+ 0x7c, 0x38, 0xc4, 0x03, 0x76, 0xaf, 0xd6, 0x8c, 0x76, 0xb4, 0xf5, 0xdc,
+ 0x29, 0x30, 0x4f, 0xc4, 0xa6, 0x00, 0x1a, 0xfa, 0xe4, 0x29, 0x30, 0x0f,
+ 0xbf, 0x30, 0x43, 0x1f, 0x92, 0x6d, 0x36, 0x9c, 0x8b, 0xd5, 0x15, 0x99,
+ 0x8c, 0xca, 0x2c, 0x28, 0x99, 0x85, 0x0d, 0x69, 0x35, 0x03, 0xdd, 0xd9,
+ 0xde, 0xdb, 0x5e, 0x62, 0x74, 0x70, 0x5b, 0x64, 0x74, 0xf8, 0xf4, 0x33,
+ 0x46, 0x87, 0x2a, 0x00, 0x8c, 0x0c, 0x1e, 0x34, 0x8b, 0xfb, 0xee, 0x35,
+ 0x0b, 0x42, 0xac, 0x1d, 0x60, 0xe7, 0x0d, 0xe3, 0x33, 0xcb, 0x54, 0xa4,
+ 0xd3, 0x52, 0x84, 0xa0, 0x48, 0xd7, 0xa1, 0x4f, 0x3b, 0x87, 0xc7, 0x0b,
+ 0x76, 0x7a, 0x38, 0x0a, 0xf3, 0x44, 0xcc, 0xea, 0x89, 0x2d, 0x7d, 0x3e,
+ 0xf7, 0xd7, 0x21, 0x6e, 0xea, 0x43, 0xd9, 0xd4, 0x9f, 0xb8, 0xf8, 0xd0,
+ 0x29, 0x33, 0x45, 0xd7, 0x17, 0xad, 0x23, 0x48, 0x60, 0x00, 0xa3, 0x68,
+ 0xa9, 0xd4, 0x72, 0x87, 0x76, 0x04, 0x46, 0x00, 0xd4, 0xdf, 0xfd, 0x8c,
+ 0x94, 0xaa, 0x7f, 0x0f, 0x21, 0x5b, 0xdb, 0xc9, 0x3f, 0xb3, 0xc9, 0x5d,
+ 0x96, 0xce, 0x54, 0xfa, 0x5a, 0xdd, 0x81, 0x00, 0x53, 0xb6, 0x7b, 0x78,
+ 0xf0, 0xcc, 0x49, 0x36, 0x4f, 0x44, 0x27, 0x19, 0x5a, 0xfa, 0x7c, 0x93,
+ 0xbc, 0x87, 0x93, 0xbc, 0xf7, 0x67, 0x27, 0xd9, 0x74, 0xea, 0x05, 0x06,
+ 0xb1, 0xbf, 0x02, 0x3c, 0xc9, 0x04, 0x2a, 0x81, 0x07, 0xf2, 0x08, 0x86,
+ 0x0e, 0x02, 0xe4, 0x7c, 0x3e, 0xcd, 0xee, 0x31, 0xdb, 0x0d, 0xb8, 0xc8,
+ 0x0c, 0x7a, 0xd1, 0x4e, 0xe6, 0xce, 0xdc, 0xf1, 0xb3, 0x67, 0xee, 0xb8,
+ 0x66, 0xe6, 0x8e, 0x3f, 0xe7, 0xcc, 0x1d, 0x20, 0xf8, 0xfa, 0xc1, 0xc1,
+ 0x9f, 0x9d, 0xb9, 0xe3, 0x83, 0x08, 0x7b, 0x56, 0x2a, 0x0f, 0x72, 0xe8,
+ 0xaa, 0xce, 0xe3, 0x29, 0x39, 0x21, 0xb7, 0xd6, 0xba, 0x96, 0xa7, 0x66,
+ 0xa1, 0x55, 0xa4, 0x76, 0xaa, 0x0f, 0x77, 0x77, 0x9e, 0x39, 0xd5, 0xe6,
+ 0x89, 0xe8, 0x54, 0x43, 0x4b, 0xff, 0xed, 0xa6, 0xda, 0x74, 0xea, 0x05,
+ 0xa9, 0x4d, 0x14, 0x1e, 0xfd, 0x52, 0x50, 0xd7, 0x2f, 0xdf, 0x7e, 0x38,
+ 0x00, 0x85, 0x18, 0x53, 0xf6, 0x51, 0xf0, 0x34, 0x67, 0xe2, 0x9a, 0xaf,
+ 0x47, 0x9a, 0x29, 0xfd, 0x31, 0x1f, 0x63, 0x85, 0xa8, 0x33, 0x23, 0xc3,
+ 0xa5, 0x93, 0x87, 0x8c, 0x0e, 0xc3, 0xca, 0xf4, 0x1e, 0xd7, 0x4e, 0xef,
+ 0xd1, 0xf6, 0x73, 0xa7, 0xf7, 0x68, 0x3b, 0x3e, 0xbd, 0xa6, 0xa5, 0xcf,
+ 0xc8, 0x68, 0xd1, 0x48, 0x75, 0xe8, 0x8c, 0x54, 0xf8, 0xa2, 0xe7, 0x1d,
+ 0x44, 0xa6, 0x47, 0xc4, 0x65, 0xb7, 0x0f, 0x9a, 0x54, 0x5c, 0x43, 0xc2,
+ 0xd4, 0x7d, 0xd6, 0xea, 0xce, 0xa7, 0xe4, 0xad, 0x99, 0xd1, 0xe2, 0xf6,
+ 0xd6, 0xe8, 0x40, 0x4d, 0xc5, 0x4f, 0xdb, 0xb5, 0x16, 0x46, 0x72, 0x58,
+ 0x45, 0x4d, 0xc5, 0xff, 0x97, 0xb3, 0xea, 0x73, 0x38, 0xab, 0xe2, 0x53,
+ 0xfb, 0x7f, 0x39, 0xaa, 0xfe, 0xb7, 0x39, 0xaa, 0x8e, 0x8e, 0x40, 0x34,
+ 0xb3, 0x2b, 0x81, 0x5f, 0x97, 0x71, 0x51, 0x2d, 0x9a, 0xb4, 0xd5, 0x15,
+ 0x68, 0x0a, 0x48, 0xf2, 0xa0, 0xe2, 0x9c, 0x52, 0x98, 0x7f, 0xe2, 0xa7,
+ 0x80, 0xd2, 0x0d, 0x38, 0x45, 0x18, 0x02, 0x90, 0x99, 0x03, 0x08, 0x90,
+ 0xa8, 0xd4, 0xf4, 0xc8, 0xeb, 0xe8, 0x88, 0xc2, 0x04, 0xcf, 0x81, 0x61,
+ 0x8a, 0x58, 0x00, 0xd6, 0xaa, 0x53, 0xeb, 0xa0, 0xe9, 0x6e, 0x78, 0xa4,
+ 0x8c, 0x56, 0x61, 0xc3, 0x0b, 0xa8, 0xe8, 0xa2, 0x6d, 0x0e, 0xfa, 0xd5,
+ 0x32, 0x34, 0xb3, 0x6d, 0xc4, 0xed, 0x65, 0x27, 0x36, 0x4a, 0xec, 0x07,
+ 0x71, 0x25, 0x17, 0x3c, 0x4f, 0x87, 0x7b, 0x7b, 0x15, 0x4f, 0x13, 0x5c,
+ 0xfb, 0x9c, 0x1e, 0x40, 0xd3, 0x1e, 0x6c, 0x80, 0x9d, 0xe5, 0x3c, 0x80,
+ 0x3f, 0x1a, 0x99, 0x69, 0x82, 0x70, 0xdc, 0x9b, 0xd7, 0xf9, 0x28, 0x6b,
+ 0x51, 0x71, 0xca, 0x2b, 0x04, 0xc6, 0x9c, 0x21, 0xef, 0x75, 0x53, 0xf9,
+ 0xe3, 0x13, 0xdc, 0x02, 0xaf, 0x8d, 0xd1, 0xa0, 0x61, 0xe0, 0xcf, 0x9e,
+ 0x2b, 0x30, 0xbf, 0x10, 0x3b, 0xb7, 0x79, 0x85, 0x17, 0x36, 0x15, 0x93,
+ 0x6c, 0x53, 0x1f, 0x33, 0xeb, 0x7d, 0xf8, 0x33, 0xab, 0x72, 0x1c, 0x5f,
+ 0x95, 0xc7, 0xec, 0x06, 0xec, 0x14, 0xf3, 0x0f, 0x48, 0xb8, 0x83, 0x24,
+ 0xa4, 0x76, 0xbf, 0x18, 0x6d, 0x02, 0x15, 0x4f, 0xb2, 0x0f, 0x9b, 0xe3,
+ 0xad, 0xad, 0x9d, 0xe3, 0xf6, 0xfd, 0x74, 0x24, 0x76, 0x86, 0x5f, 0x7a,
+ 0x67, 0x40, 0x6d, 0x9f, 0x31, 0x89, 0x10, 0xe3, 0xfe, 0xf7, 0x24, 0xf0,
+ 0x1f, 0xf7, 0xd0, 0x9f, 0xe5, 0x5c, 0x76, 0x0f, 0xae, 0xae, 0x5c, 0x77,
+ 0x77, 0x16, 0x11, 0x88, 0x33, 0xef, 0x9e, 0x63, 0xe0, 0xf5, 0x83, 0xb5,
+ 0x57, 0x39, 0x73, 0xaf, 0x33, 0x71, 0x79, 0x94, 0xb1, 0xba, 0xf2, 0xa7,
+ 0xd6, 0x2b, 0x7a, 0x64, 0xc0, 0x2c, 0x21, 0x23, 0xf5, 0x16, 0xcc, 0x5c,
+ 0x1d, 0x97, 0x2f, 0x3e, 0x0e, 0xf3, 0xf1, 0xfb, 0x1a, 0xdb, 0xd5, 0x2f,
+ 0xe7, 0x2d, 0xfc, 0xb9, 0x31, 0xd7, 0xc2, 0xf5, 0xae, 0xd7, 0x6d, 0xd9,
+ 0x37, 0x6c, 0xf2, 0x46, 0x05, 0xf5, 0x02, 0x63, 0x8f, 0x3e, 0xa3, 0x4d,
+ 0xf6, 0x18, 0x8f, 0xa3, 0x63, 0x39, 0x8e, 0xcc, 0xae, 0x4a, 0xce, 0x26,
+ 0x29, 0xd4, 0x5b, 0x39, 0x07, 0x07, 0xd0, 0x8f, 0xc5, 0x70, 0x08, 0x50,
+ 0xf9, 0x13, 0xb2, 0xcb, 0x76, 0xc6, 0x46, 0x44, 0x7c, 0x34, 0xb3, 0xfc,
+ 0x84, 0x42, 0x0b, 0x30, 0x2e, 0xcc, 0x67, 0x76, 0xeb, 0x8a, 0xfd, 0x83,
+ 0x82, 0x54, 0x28, 0x45, 0x9a, 0xd7, 0xfa, 0x4a, 0x10, 0x70, 0xd2, 0x59,
+ 0x3a, 0x44, 0xe4, 0x9e, 0x1f, 0xb3, 0x47, 0xc8, 0x19, 0x6d, 0xbd, 0x4d,
+ 0xfb, 0xef, 0xd1, 0xcd, 0x07, 0x6f, 0x78, 0x95, 0xf7, 0x27, 0x45, 0x59,
+ 0x80, 0x8d, 0xfe, 0x97, 0x62, 0x32, 0x1c, 0x24, 0xbf, 0x40, 0xce, 0xc2,
+ 0x2f, 0xd9, 0x8d, 0x72, 0x16, 0xe2, 0xa2, 0x1c, 0xcf, 0x73, 0xdb, 0x55,
+ 0xf3, 0x93, 0xc1, 0x97, 0xdc, 0x25, 0xc0, 0x33, 0x85, 0xda, 0x66, 0x1d,
+ 0xcc, 0xfc, 0x93, 0xce, 0x53, 0xbe, 0xb0, 0x79, 0xa6, 0x5e, 0x92, 0x0d,
+ 0xda, 0x9e, 0xcb, 0x44, 0xea, 0x30, 0xb0, 0x7b, 0x4f, 0x7c, 0x96, 0xa5,
+ 0xf5, 0x59, 0xea, 0xec, 0x31, 0xc8, 0x4d, 0x25, 0xb4, 0x35, 0x4c, 0x1c,
+ 0x00, 0xc6, 0xa6, 0xb3, 0x76, 0xd6, 0x29, 0x97, 0x47, 0x20, 0xe9, 0x09,
+ 0x90, 0x5c, 0x57, 0x6f, 0x49, 0x87, 0x0f, 0xf7, 0xe9, 0x4d, 0x66, 0x5e,
+ 0xac, 0x92, 0x45, 0x2d, 0xec, 0xd6, 0x4b, 0x48, 0xd9, 0xb6, 0xf7, 0x7c,
+ 0xc9, 0x02, 0xe9, 0x47, 0x58, 0x7e, 0xf1, 0x68, 0xcf, 0x16, 0x48, 0x67,
+ 0xac, 0x3d, 0x48, 0x34, 0x4a, 0xcd, 0x96, 0x24, 0xdf, 0x13, 0x1b, 0x03,
+ 0x36, 0x9a, 0x10, 0x3d, 0x49, 0xa1, 0x85, 0xba, 0x2c, 0x42, 0x29, 0x15,
+ 0x66, 0x21, 0x93, 0x02, 0x13, 0x3f, 0xc3, 0x99, 0xe0, 0x92, 0x11, 0x25,
+ 0xd7, 0x99, 0xc4, 0x99, 0x93, 0xf9, 0x28, 0x93, 0x51, 0x01, 0x30, 0x34,
+ 0xf6, 0x7d, 0x1b, 0x5f, 0x72, 0xc0, 0xbb, 0x18, 0x80, 0xbc, 0x2b, 0x01,
+ 0xc8, 0x27, 0xb2, 0x36, 0x44, 0x2d, 0x50, 0x57, 0x0a, 0xd3, 0x41, 0xc0,
+ 0x7d, 0x66, 0xeb, 0x18, 0x52, 0x77, 0x31, 0xe9, 0x75, 0x8a, 0xe5, 0x2e,
+ 0x5c, 0x12, 0xd7, 0x79, 0x7e, 0x87, 0xd5, 0x04, 0x19, 0x6a, 0x02, 0xf6,
+ 0x15, 0xe5, 0x47, 0x43, 0x9d, 0x0a, 0x98, 0x44, 0x5b, 0x73, 0xcb, 0xe5,
+ 0xbc, 0x11, 0x96, 0x30, 0x92, 0xf0, 0x8f, 0x9d, 0x77, 0x9d, 0xee, 0x75,
+ 0xef, 0xdd, 0x55, 0x23, 0x8a, 0x2d, 0x6c, 0xa9, 0x39, 0x00, 0x14, 0xbe,
+ 0x9b, 0x14, 0x46, 0x0c, 0x79, 0xe8, 0x3f, 0xee, 0x7e, 0xd7, 0xd8, 0x6d,
+ 0xc0, 0x87, 0xbd, 0xef, 0x1a, 0x60, 0x30, 0x0f, 0x90, 0x73, 0x5f, 0x62,
+ 0x7f, 0x2d, 0x6e, 0x2e, 0x7d, 0x55, 0xa8, 0xb9, 0x3a, 0x85, 0xf2, 0xcc,
+ 0x8c, 0x87, 0x72, 0xd5, 0xe4, 0x53, 0x0c, 0x06, 0xf8, 0xd2, 0xad, 0xbf,
+ 0x91, 0x2b, 0xdc, 0x17, 0xce, 0x6d, 0x0b, 0x91, 0x73, 0x75, 0x67, 0xdc,
+ 0x0b, 0xb8, 0x3b, 0xee, 0x3d, 0xb6, 0x43, 0xbf, 0x7e, 0xf5, 0x71, 0x6b,
+ 0x6b, 0x6f, 0xbb, 0x05, 0x7f, 0xf6, 0x3b, 0xbf, 0x25, 0x7f, 0x7c, 0x3d,
+ 0xbe, 0x29, 0x1f, 0x4e, 0xf0, 0xf2, 0x01, 0x5d, 0x3e, 0x0c, 0x2e, 0x77,
+ 0xb7, 0xf0, 0xf2, 0xf9, 0xc1, 0x6f, 0xab, 0x2b, 0xfa, 0xfa, 0xf9, 0x11,
+ 0x5e, 0xbf, 0x38, 0xf0, 0x6f, 0xbf, 0xe0, 0xcb, 0x17, 0xde, 0xe5, 0xed,
+ 0x2d, 0x6c, 0x65, 0x7b, 0x77, 0xdb, 0xbf, 0xbc, 0xbb, 0x47, 0x97, 0x7b,
+ 0x7e, 0xe3, 0xdb, 0xd4, 0xc5, 0xed, 0xbd, 0x23, 0xff, 0xf6, 0xbd, 0x0e,
+ 0x5e, 0x3e, 0xec, 0xf9, 0x97, 0x8f, 0xa8, 0xf1, 0xee, 0xae, 0x7f, 0xb9,
+ 0x7b, 0x8e, 0x97, 0x2f, 0xb6, 0x82, 0xc6, 0x2f, 0xe8, 0xa5, 0x17, 0xfb,
+ 0xfe, 0xed, 0x17, 0xd8, 0xf8, 0xce, 0xf6, 0xa1, 0x77, 0x79, 0x67, 0x1f,
+ 0x1b, 0xdf, 0xe9, 0xf8, 0x5d, 0xd9, 0x39, 0x3b, 0xc3, 0xcb, 0xdd, 0x6d,
+ 0xd7, 0xb8, 0xf9, 0xbe, 0x7b, 0x74, 0xa0, 0xef, 0xda, 0x3d, 0xc2, 0xd9,
+ 0xd8, 0x3d, 0x72, 0x73, 0x8a, 0x5f, 0xbb, 0xfe, 0x4d, 0x3d, 0xbc, 0xa9,
+ 0xb3, 0xed, 0xf7, 0x73, 0xb7, 0xb3, 0x8b, 0xd7, 0xbb, 0xfe, 0x68, 0x77,
+ 0xcf, 0xb1, 0x43, 0xbb, 0xe7, 0x07, 0x5e, 0x9b, 0xe7, 0x1d, 0xef, 0x5b,
+ 0xd7, 0xeb, 0xd5, 0x79, 0x4f, 0xff, 0xd8, 0xdb, 0xf2, 0xda, 0xeb, 0xed,
+ 0x60, 0x7b, 0x17, 0xfe, 0xec, 0xed, 0x6d, 0xe1, 0x12, 0xec, 0x6d, 0x75,
+ 0xfd, 0x5e, 0xed, 0x6d, 0x61, 0x6f, 0xf7, 0xf6, 0xfc, 0x05, 0xde, 0xdb,
+ 0xa7, 0xdb, 0xf7, 0xbb, 0xc1, 0x65, 0xba, 0xfb, 0xc8, 0x5f, 0xf7, 0xbd,
+ 0x63, 0x1c, 0xc3, 0x5e, 0x77, 0x2f, 0x68, 0xbc, 0x7b, 0x48, 0xd7, 0xfd,
+ 0xc9, 0xde, 0xeb, 0x9e, 0xd1, 0xe5, 0xa0, 0x71, 0x9a, 0x89, 0xbd, 0xde,
+ 0x99, 0x7f, 0xb9, 0x47, 0xef, 0x34, 0xeb, 0xeb, 0x37, 0x4e, 0xa4, 0xb9,
+ 0x77, 0x71, 0xec, 0xdd, 0xbe, 0xbf, 0x8b, 0x3d, 0xdf, 0xdf, 0xf7, 0xe6,
+ 0x73, 0x7f, 0xff, 0xd8, 0xbb, 0x89, 0x36, 0xc7, 0xfe, 0x51, 0xb0, 0x0b,
+ 0xf6, 0xa9, 0x0b, 0xfb, 0x3d, 0x7f, 0xd3, 0xec, 0x5f, 0xd0, 0xe5, 0x8b,
+ 0x1d, 0xef, 0xf2, 0xc1, 0x0e, 0xb6, 0x72, 0xb0, 0xeb, 0xdf, 0x7d, 0x40,
+ 0xd4, 0x7e, 0xb0, 0xd7, 0xf1, 0x1b, 0x3f, 0x38, 0xa4, 0xeb, 0x67, 0x3e,
+ 0x45, 0x1e, 0x9c, 0x75, 0xe8, 0xb2, 0x4f, 0x17, 0x07, 0xb4, 0x51, 0x0f,
+ 0x02, 0x72, 0x39, 0xa0, 0x1e, 0x1e, 0x9c, 0xef, 0x7a, 0x84, 0x7a, 0x70,
+ 0xbe, 0xef, 0xdd, 0xd5, 0xdb, 0xc7, 0xbb, 0x7a, 0xfe, 0x6e, 0x3e, 0xde,
+ 0xc2, 0xcb, 0xc7, 0xbb, 0xc7, 0x7a, 0x6e, 0x8e, 0x77, 0xcf, 0xbd, 0x7e,
+ 0x1e, 0xef, 0xe3, 0xc4, 0x1e, 0x1f, 0xf8, 0x8b, 0x7c, 0x7c, 0x44, 0x0f,
+ 0x1f, 0x75, 0x83, 0xcb, 0x17, 0x78, 0xf9, 0x78, 0xcb, 0xbf, 0x7c, 0x8c,
+ 0xd4, 0x7e, 0x6c, 0xf6, 0x99, 0xdf, 0x78, 0x07, 0x47, 0x7b, 0x7c, 0xb6,
+ 0xe5, 0x75, 0xe1, 0x6c, 0xc7, 0x7b, 0xf8, 0xec, 0x80, 0x6e, 0xf2, 0x97,
+ 0xf6, 0xf8, 0xbc, 0x8b, 0x97, 0xcf, 0xcf, 0x83, 0x36, 0xcf, 0xa9, 0x0b,
+ 0xbd, 0xa0, 0xc3, 0xb4, 0x6a, 0xc7, 0x17, 0xfe, 0xe5, 0x0e, 0x4d, 0x42,
+ 0x67, 0xab, 0x13, 0x5c, 0xc6, 0x46, 0x3a, 0xdb, 0x01, 0x7b, 0xe9, 0x6c,
+ 0xe3, 0x40, 0x3a, 0x3b, 0x3e, 0x0d, 0x77, 0x76, 0x70, 0x1c, 0x9d, 0x5d,
+ 0x7f, 0xd8, 0x9d, 0xdd, 0x1d, 0xba, 0xbc, 0x1b, 0x5c, 0xa6, 0x77, 0xee,
+ 0x06, 0xf4, 0xd6, 0xd9, 0x3d, 0xa2, 0xeb, 0xfe, 0x40, 0x3b, 0xfb, 0xc7,
+ 0x78, 0x59, 0xed, 0x3e, 0xfc, 0xda, 0xf3, 0x6e, 0x3a, 0xa4, 0x57, 0x1d,
+ 0x06, 0x9b, 0xae, 0x43, 0xeb, 0xd4, 0x39, 0x3a, 0xf3, 0x1e, 0x3e, 0x3a,
+ 0xf7, 0x1e, 0xa6, 0x55, 0xeb, 0x1c, 0x07, 0x73, 0x43, 0xab, 0xd6, 0x09,
+ 0x57, 0xad, 0x43, 0xab, 0xd6, 0x39, 0x0b, 0x46, 0x7b, 0x46, 0x5d, 0x38,
+ 0x0b, 0x46, 0x7b, 0x46, 0x3d, 0x38, 0xf3, 0xc8, 0xac, 0x73, 0x76, 0xae,
+ 0x29, 0xb6, 0xe3, 0xb3, 0xad, 0x33, 0x5a, 0x95, 0xb3, 0x2d, 0x9f, 0xba,
+ 0xce, 0x68, 0x55, 0xce, 0xb6, 0xfd, 0x17, 0x9f, 0xd1, 0xa2, 0x9c, 0xed,
+ 0x04, 0xfd, 0x3c, 0xa3, 0x55, 0x39, 0x0b, 0x56, 0xe5, 0x8c, 0x56, 0xe5,
+ 0x2c, 0x58, 0x95, 0xb3, 0xdd, 0x03, 0xba, 0xec, 0xf5, 0xf3, 0x2c, 0xd8,
+ 0x0e, 0x67, 0xfb, 0x48, 0x75, 0x67, 0xfb, 0xe7, 0xfe, 0xc3, 0xfb, 0xd4,
+ 0xb3, 0x60, 0x97, 0x9c, 0xd1, 0xec, 0x9f, 0x1d, 0x75, 0x82, 0xcb, 0xc8,
+ 0xc4, 0xce, 0x8e, 0x03, 0xea, 0x3a, 0x3b, 0xa6, 0x9e, 0x1d, 0xfb, 0x87,
+ 0xd7, 0xd9, 0xf1, 0x31, 0x5d, 0xf6, 0x0e, 0x9a, 0xb3, 0xe3, 0xae, 0x7f,
+ 0x13, 0xb7, 0x79, 0x11, 0xb4, 0x49, 0x07, 0xcd, 0x59, 0x67, 0xcf, 0x6f,
+ 0xb3, 0x73, 0x44, 0x97, 0x83, 0x9e, 0x75, 0xa8, 0x95, 0xb3, 0xa0, 0x07,
+ 0x67, 0x87, 0x74, 0xf9, 0xd8, 0x6f, 0xbc, 0x4b, 0xeb, 0xd4, 0x0d, 0xd6,
+ 0xa9, 0x4b, 0xc7, 0x48, 0x37, 0x58, 0xa7, 0xee, 0x36, 0x0e, 0xaf, 0x1b,
+ 0x6c, 0x9e, 0x2e, 0x2d, 0x53, 0x77, 0x77, 0x37, 0x68, 0x9c, 0xb6, 0x49,
+ 0x37, 0xd8, 0x0e, 0xdd, 0x03, 0xdc, 0xc8, 0xdd, 0x60, 0xaa, 0xbb, 0x34,
+ 0xd5, 0xdd, 0x80, 0x21, 0x75, 0x69, 0xaa, 0xbb, 0xe1, 0x54, 0x77, 0x69,
+ 0xaa, 0xbb, 0xc1, 0xc9, 0xdf, 0x25, 0xd2, 0xee, 0x06, 0x34, 0xdc, 0x25,
+ 0x1a, 0xee, 0xfa, 0x34, 0xdc, 0x3d, 0xef, 0xf9, 0x6d, 0xf6, 0xa8, 0x67,
+ 0x01, 0xe7, 0x39, 0xa7, 0x49, 0x3a, 0x0f, 0x26, 0xe9, 0x9c, 0x26, 0xe9,
+ 0x3c, 0x98, 0xa4, 0x73, 0x9a, 0xa4, 0xf3, 0x90, 0x98, 0xcf, 0x69, 0x96,
+ 0xce, 0x83, 0xd9, 0x38, 0xa7, 0xd9, 0x38, 0x0f, 0x66, 0xa3, 0x47, 0x07,
+ 0x7c, 0x6f, 0xa7, 0xa7, 0x3b, 0x6c, 0x24, 0x77, 0xaf, 0xcd, 0x1e, 0xed,
+ 0x84, 0x5e, 0xb0, 0x13, 0x7a, 0x7b, 0xd8, 0x66, 0x6f, 0xcf, 0x27, 0x82,
+ 0xde, 0x11, 0xb5, 0x79, 0xb4, 0xe3, 0xb5, 0x79, 0xb4, 0xe7, 0xb7, 0x79,
+ 0x74, 0x48, 0x77, 0x1d, 0xf9, 0x77, 0x75, 0xbc, 0x6f, 0x1e, 0xfb, 0xe9,
+ 0x1d, 0xa3, 0xcc, 0xd6, 0x3b, 0x3e, 0xf4, 0x87, 0xdc, 0x23, 0xba, 0xef,
+ 0x1d, 0xfb, 0xd2, 0x48, 0xaf, 0x43, 0xfd, 0xe8, 0xec, 0x7a, 0x6f, 0xe8,
+ 0xec, 0x7b, 0xdf, 0x0e, 0xfd, 0xa6, 0x68, 0x5d, 0x7b, 0x9d, 0xb3, 0xa0,
+ 0xa9, 0x73, 0xba, 0xec, 0x4f, 0xd3, 0x99, 0xc7, 0x8c, 0x7a, 0xc4, 0xd7,
+ 0x7a, 0x67, 0xfe, 0x21, 0xdb, 0x3b, 0xf3, 0x07, 0x41, 0x27, 0x74, 0xaf,
+ 0xeb, 0xef, 0xb3, 0x0b, 0x9a, 0xcb, 0x8b, 0xbd, 0xc3, 0xe0, 0x32, 0x0e,
+ 0xed, 0xe2, 0xc0, 0xdf, 0x50, 0xdb, 0xe6, 0xe0, 0x69, 0xc1, 0x9f, 0xae,
+ 0x37, 0xf5, 0xdb, 0x5b, 0xe7, 0x74, 0xf9, 0x42, 0x8b, 0x31, 0xdb, 0x46,
+ 0xee, 0xd6, 0x37, 0x6d, 0x6f, 0x41, 0x3f, 0xb7, 0xa1, 0x74, 0x98, 0xd7,
+ 0xe6, 0x36, 0xd2, 0x9f, 0xf9, 0x73, 0xe8, 0x3f, 0x7c, 0xec, 0x3f, 0x7c,
+ 0x46, 0x37, 0x79, 0x44, 0x6a, 0xbe, 0xf7, 0xf0, 0xf2, 0xf6, 0x8e, 0x1e,
+ 0xfb, 0xf6, 0xf6, 0x6e, 0x57, 0x37, 0xb5, 0xdb, 0xd3, 0xdf, 0xf6, 0xb6,
+ 0xbc, 0x6f, 0xde, 0x9d, 0x7b, 0xde, 0x9d, 0xfb, 0x5b, 0x7e, 0x47, 0xf7,
+ 0xf7, 0xf0, 0x65, 0xfb, 0xfb, 0x5e, 0x47, 0xf7, 0xfd, 0x8e, 0x22, 0xa7,
+ 0xdd, 0xde, 0x56, 0x04, 0x8f, 0x5f, 0x77, 0xbd, 0xfe, 0x1d, 0xec, 0x7b,
+ 0x3f, 0x1e, 0x7a, 0xdf, 0xfc, 0xf6, 0x0e, 0xce, 0xa9, 0xbd, 0x9e, 0x3f,
+ 0xf0, 0x43, 0x9a, 0xcc, 0xc3, 0x5d, 0x7f, 0xe0, 0x87, 0x5e, 0xc3, 0xc7,
+ 0xde, 0x70, 0x3a, 0x47, 0xde, 0xb7, 0x33, 0xaf, 0xbd, 0x0e, 0x4d, 0x64,
+ 0xe7, 0x22, 0x58, 0x1c, 0xe4, 0xac, 0xe6, 0xcf, 0x91, 0x37, 0x9c, 0xb3,
+ 0x8e, 0xf7, 0xf0, 0x59, 0x17, 0x6f, 0xea, 0xee, 0x78, 0x37, 0xf5, 0xce,
+ 0xbc, 0xae, 0x5d, 0x78, 0xf3, 0x7e, 0xe1, 0x8d, 0xb2, 0x87, 0x2a, 0xda,
+ 0x76, 0xef, 0xd8, 0xa3, 0xff, 0xed, 0x1e, 0x91, 0x5b, 0xef, 0x22, 0x20,
+ 0xc3, 0x0b, 0xba, 0xfd, 0x62, 0xdb, 0x27, 0xc3, 0x8b, 0xed, 0x23, 0xba,
+ 0x7c, 0xee, 0x5f, 0xde, 0xa1, 0xbb, 0xf7, 0x82, 0xbb, 0xf7, 0xe8, 0xee,
+ 0xbd, 0xf3, 0xa0, 0xf1, 0x7d, 0xba, 0x7d, 0xdf, 0xa3, 0xc7, 0x0b, 0xb7,
+ 0xcc, 0xf8, 0xed, 0xcc, 0xfb, 0x76, 0xee, 0x35, 0x4c, 0x24, 0x70, 0x71,
+ 0x18, 0x36, 0x7c, 0x44, 0x0d, 0x9f, 0xed, 0xf9, 0xfd, 0x40, 0xf9, 0xd1,
+ 0xfc, 0xe9, 0x7a, 0xef, 0x3b, 0xeb, 0x79, 0x37, 0x75, 0x71, 0xbd, 0x2f,
+ 0x02, 0xa5, 0xc5, 0x5c, 0xa0, 0x87, 0x7d, 0xed, 0x64, 0xfb, 0x82, 0x36,
+ 0xe4, 0xc5, 0xf9, 0x6e, 0x70, 0x99, 0xee, 0x3e, 0xf7, 0xa7, 0xf9, 0xa2,
+ 0x47, 0x77, 0xf7, 0xba, 0x41, 0xe3, 0x17, 0xf4, 0xd2, 0x8b, 0xa0, 0xc3,
+ 0x17, 0xd4, 0xca, 0x85, 0xee, 0xf0, 0xce, 0xf6, 0x8e, 0xd6, 0x3e, 0xcd,
+ 0x57, 0xe0, 0x68, 0xe6, 0xcf, 0x99, 0x26, 0x50, 0xf3, 0xbd, 0xe7, 0xdd,
+ 0x85, 0x53, 0x62, 0xfe, 0x78, 0xba, 0xca, 0x2e, 0x59, 0x09, 0x76, 0xb7,
+ 0x8e, 0xf7, 0xfc, 0xcb, 0x1d, 0xba, 0x7c, 0xe1, 0xeb, 0x2a, 0xbb, 0xc4,
+ 0x41, 0x76, 0xb7, 0x77, 0xbc, 0x49, 0xe8, 0x74, 0x91, 0x4a, 0xce, 0x0f,
+ 0x81, 0x11, 0xcf, 0xb7, 0x5e, 0x78, 0x86, 0x0f, 0x36, 0x60, 0x78, 0xf6,
+ 0x0f, 0x6d, 0xc3, 0xd8, 0x23, 0x62, 0x3d, 0xbe, 0xe8, 0x68, 0x3e, 0xb0,
+ 0xbb, 0xb5, 0x75, 0xe8, 0xf5, 0x75, 0x87, 0xfa, 0xba, 0x73, 0xbc, 0xe8,
+ 0xe5, 0x5d, 0xb1, 0xac, 0x79, 0xf6, 0x13, 0xef, 0x6a, 0x60, 0x44, 0xd9,
+ 0x25, 0x83, 0xc6, 0x6e, 0x70, 0x00, 0xee, 0xd2, 0x59, 0xbb, 0x1b, 0x9c,
+ 0xb5, 0x7b, 0x47, 0xbb, 0xa4, 0x06, 0x87, 0xea, 0xe3, 0x31, 0xa9, 0x95,
+ 0x1d, 0xff, 0xf6, 0x7d, 0x12, 0xc8, 0xf6, 0x03, 0x75, 0x66, 0x9f, 0x6c,
+ 0x0e, 0xfb, 0x67, 0xe7, 0x9e, 0xa6, 0x7a, 0x76, 0xe1, 0xb7, 0xd9, 0xa5,
+ 0x36, 0x3d, 0x4e, 0x60, 0xbe, 0xee, 0xf9, 0x2a, 0x27, 0x36, 0x75, 0xb0,
+ 0xef, 0xdd, 0x74, 0x70, 0xe8, 0x1f, 0xfe, 0x07, 0x48, 0xab, 0xe6, 0x4f,
+ 0x37, 0x50, 0x29, 0xcf, 0xe9, 0xb2, 0x7f, 0xe8, 0x1e, 0x90, 0x6c, 0x73,
+ 0xd0, 0xdb, 0x0b, 0x2e, 0x1f, 0xd2, 0xe5, 0x40, 0x5a, 0x39, 0xe8, 0x91,
+ 0x1a, 0xdb, 0x3b, 0x0f, 0x54, 0x4e, 0xec, 0xfe, 0xf1, 0xd6, 0xae, 0xaf,
+ 0x72, 0x7a, 0x92, 0xec, 0xf1, 0x2e, 0x0a, 0x46, 0xc7, 0x7b, 0x5d, 0xef,
+ 0xbc, 0x3d, 0xde, 0xf3, 0xce, 0xdb, 0x63, 0xb2, 0x49, 0x1c, 0xef, 0xfb,
+ 0x1d, 0x3a, 0x3e, 0xd8, 0x21, 0x75, 0x75, 0x37, 0xd0, 0x4b, 0xe9, 0xee,
+ 0x23, 0xff, 0x0c, 0x3f, 0x3e, 0xeb, 0x7a, 0x7a, 0x67, 0xcf, 0xfb, 0x76,
+ 0xe1, 0xb5, 0x40, 0xe7, 0xfb, 0x71, 0x70, 0xbe, 0x1f, 0x93, 0x51, 0xe3,
+ 0xb8, 0x1b, 0x6a, 0xb6, 0x64, 0xd5, 0x38, 0xee, 0x7a, 0xcb, 0x79, 0x7c,
+ 0x7e, 0xe8, 0x3d, 0x4c, 0xd6, 0x99, 0xe3, 0x9e, 0x37, 0x1d, 0x9d, 0xad,
+ 0x1d, 0x4f, 0x35, 0xd2, 0x67, 0xad, 0xf9, 0xd6, 0xf3, 0xbe, 0x79, 0x7d,
+ 0xec, 0x90, 0xb0, 0xd1, 0xd9, 0xf3, 0x2d, 0x13, 0x9d, 0xbd, 0x43, 0xba,
+ 0x1c, 0xea, 0x71, 0x44, 0x27, 0x9d, 0x3d, 0x7f, 0x91, 0x3a, 0x87, 0xd4,
+ 0xca, 0x61, 0xa0, 0x0d, 0xd2, 0x14, 0x76, 0x8e, 0xfc, 0xce, 0x9e, 0x75,
+ 0xfd, 0x36, 0xcf, 0x70, 0xf1, 0x3a, 0xbe, 0x00, 0x63, 0xbe, 0x53, 0x17,
+ 0xba, 0x81, 0x6a, 0x4b, 0xb3, 0xd4, 0xe9, 0x06, 0xda, 0x14, 0x91, 0xc9,
+ 0xd9, 0x96, 0xbf, 0x5a, 0x67, 0x3e, 0x9d, 0x9c, 0x11, 0x9d, 0x9c, 0xed,
+ 0x05, 0x7a, 0x1c, 0x8d, 0xf6, 0x2c, 0x30, 0x2f, 0x9e, 0xd1, 0x60, 0xcf,
+ 0x82, 0xd3, 0xc8, 0x68, 0x6e, 0xa4, 0xf6, 0xed, 0x1f, 0x06, 0x2a, 0x1a,
+ 0xa9, 0x62, 0x47, 0x41, 0xe3, 0x34, 0xbc, 0xb3, 0xae, 0x3f, 0xc3, 0x67,
+ 0x5d, 0x6a, 0x24, 0xa4, 0x82, 0xb3, 0x2e, 0x69, 0xa0, 0x3e, 0x15, 0x9c,
+ 0xf9, 0x54, 0xd0, 0xa5, 0xd1, 0x76, 0xb7, 0x02, 0x9d, 0x83, 0x86, 0xd7,
+ 0xdd, 0x0b, 0x34, 0xfa, 0xee, 0xde, 0x01, 0x5d, 0x0f, 0x34, 0x17, 0x32,
+ 0x9f, 0x76, 0x83, 0xc5, 0xec, 0xee, 0x93, 0xe6, 0xb2, 0x7f, 0x10, 0xa8,
+ 0x45, 0xa4, 0xfe, 0x1c, 0x85, 0x3a, 0x17, 0x8d, 0xaf, 0x1b, 0x50, 0x79,
+ 0x97, 0xc6, 0xd7, 0x0d, 0x4c, 0x77, 0x5d, 0x1a, 0x5e, 0x37, 0x58, 0xbe,
+ 0xee, 0x39, 0xbd, 0x33, 0xb4, 0x2a, 0x9f, 0x6f, 0x91, 0x6a, 0x13, 0x0c,
+ 0xf4, 0x9c, 0x06, 0x7a, 0x1e, 0xac, 0xe3, 0x39, 0x8d, 0xf3, 0x3c, 0x18,
+ 0xe7, 0x39, 0x8d, 0xf3, 0x5c, 0xaf, 0x23, 0x7c, 0xdf, 0x3f, 0xf4, 0x14,
+ 0x9d, 0x6d, 0x4f, 0x36, 0x27, 0x4b, 0x74, 0x2f, 0x30, 0xcd, 0xf5, 0x88,
+ 0x52, 0x7a, 0x7b, 0xbd, 0x40, 0xb0, 0xf7, 0x1f, 0x3e, 0xa3, 0x87, 0x03,
+ 0x7e, 0xdd, 0x23, 0x7e, 0xdd, 0x3b, 0xf3, 0xd9, 0x67, 0xaf, 0x7b, 0x44,
+ 0x6a, 0x40, 0x40, 0x66, 0x24, 0x3a, 0x99, 0x3f, 0x9e, 0x06, 0x79, 0xb1,
+ 0xbb, 0xef, 0x7d, 0x3b, 0xf4, 0xbe, 0x1d, 0x7b, 0xdf, 0x7a, 0xba, 0x8f,
+ 0x17, 0xfe, 0xc6, 0xbf, 0x20, 0x63, 0xe2, 0xc5, 0x51, 0xa0, 0x7c, 0x1c,
+ 0x1d, 0xd0, 0x65, 0x5f, 0xeb, 0xb9, 0x20, 0x03, 0xed, 0xc5, 0xf1, 0xbe,
+ 0x37, 0xee, 0x8b, 0xe3, 0x43, 0xff, 0x2e, 0x52, 0x51, 0x3a, 0xfe, 0xe2,
+ 0x5e, 0x9c, 0xd1, 0xab, 0xce, 0x0e, 0xbd, 0x81, 0x9c, 0x1d, 0xeb, 0xe1,
+ 0xee, 0x90, 0xc2, 0x62, 0xfe, 0x78, 0x22, 0xcc, 0x56, 0x6f, 0xdb, 0x3f,
+ 0xc2, 0x3b, 0x74, 0x84, 0x5f, 0x78, 0xe7, 0xfc, 0xf1, 0xb1, 0xea, 0x95,
+ 0xf9, 0xda, 0x59, 0x70, 0xbe, 0xa3, 0x17, 0xc9, 0x9e, 0xeb, 0xf8, 0x2d,
+ 0x74, 0x8a, 0xec, 0x92, 0x9b, 0x23, 0xd0, 0x9d, 0x0f, 0xe8, 0x3c, 0x3f,
+ 0x38, 0x08, 0x2e, 0x93, 0xa5, 0xf0, 0x20, 0x10, 0x8a, 0xcd, 0x99, 0x42,
+ 0x76, 0xc8, 0x03, 0xff, 0x64, 0x3c, 0xee, 0xd1, 0xe5, 0x9e, 0x7f, 0xb9,
+ 0x43, 0x77, 0x77, 0x82, 0xbb, 0x3b, 0x74, 0x77, 0xa7, 0x17, 0x9a, 0x69,
+ 0xe8, 0xf6, 0xb3, 0xe0, 0xf6, 0x33, 0x3a, 0x5f, 0xcf, 0x82, 0xc6, 0xbb,
+ 0x74, 0x77, 0x37, 0xb8, 0xbb, 0x4b, 0x8d, 0x77, 0xc3, 0xc6, 0xcf, 0xe9,
+ 0xf6, 0xf3, 0xe0, 0xf6, 0x1e, 0x79, 0x3f, 0x7a, 0xfb, 0x01, 0x65, 0x93,
+ 0x51, 0xb9, 0x77, 0xee, 0x5f, 0x26, 0x29, 0xdf, 0xfc, 0x59, 0x28, 0x70,
+ 0x71, 0xc0, 0x88, 0x93, 0xb5, 0xe4, 0x82, 0x5a, 0x16, 0x58, 0x8e, 0x33,
+ 0x4d, 0xee, 0x3b, 0xe7, 0x5b, 0xde, 0xb7, 0x6d, 0xcf, 0xa7, 0xa2, 0xef,
+ 0x3c, 0xd8, 0xdb, 0xf2, 0xb6, 0xeb, 0xde, 0x81, 0xde, 0xf9, 0xdd, 0x03,
+ 0x4f, 0x66, 0xdc, 0xf7, 0x08, 0x6e, 0x97, 0x64, 0xc6, 0xdd, 0x7d, 0x5f,
+ 0xec, 0x3d, 0x3e, 0x27, 0x69, 0xd8, 0x77, 0x54, 0x19, 0x39, 0xb8, 0x4b,
+ 0xe2, 0x70, 0x2f, 0x36, 0xe2, 0x4d, 0xeb, 0x4b, 0x3c, 0x55, 0x35, 0x2e,
+ 0x09, 0xcf, 0xdb, 0xa1, 0xf3, 0xb2, 0x6b, 0xd4, 0xfa, 0xc7, 0x11, 0xf1,
+ 0x8f, 0x91, 0x1f, 0xcd, 0x8c, 0xe4, 0x1f, 0x34, 0x9c, 0xbf, 0x78, 0xcd,
+ 0xbf, 0x24, 0x5e, 0x65, 0x90, 0x80, 0xbc, 0xd3, 0xde, 0xb2, 0xfe, 0x58,
+ 0x8d, 0xbc, 0x0c, 0x25, 0x11, 0xd1, 0x2f, 0xef, 0x00, 0x0b, 0x6b, 0x6b,
+ 0x53, 0x40, 0x8c, 0x03, 0x55, 0xe2, 0xd3, 0xbe, 0x6b, 0xac, 0xda, 0x82,
+ 0x59, 0xb3, 0x08, 0x53, 0x26, 0x75, 0x14, 0xa6, 0xd9, 0x5d, 0x81, 0x21,
+ 0x76, 0x2f, 0x87, 0xcd, 0xe4, 0xe5, 0xcc, 0xfc, 0x57, 0x34, 0x57, 0x57,
+ 0x5e, 0x4e, 0x9b, 0xc9, 0xeb, 0x61, 0x4d, 0x15, 0x04, 0x6c, 0x5f, 0xfb,
+ 0xf9, 0x5d, 0x29, 0x0e, 0xf8, 0xa9, 0xb5, 0xf0, 0xd5, 0x54, 0x41, 0x45,
+ 0xbd, 0xfb, 0x55, 0xbf, 0x99, 0xbc, 0xca, 0xcc, 0x7f, 0x63, 0xf3, 0xfe,
+ 0x11, 0x16, 0x01, 0x78, 0x3d, 0xa8, 0x79, 0xbb, 0x73, 0x23, 0x3b, 0x9c,
+ 0x66, 0x4a, 0x1b, 0x26, 0x90, 0xfd, 0x74, 0x92, 0xa5, 0xc9, 0x7a, 0xde,
+ 0xce, 0xda, 0x94, 0x44, 0xac, 0xd6, 0x1e, 0xd6, 0xf2, 0x0e, 0xe1, 0x13,
+ 0x27, 0x58, 0x0a, 0x64, 0x9c, 0x7c, 0xf5, 0xd1, 0x30, 0xdf, 0x2d, 0xf4,
+ 0x78, 0x0f, 0xa9, 0x52, 0x16, 0x5d, 0xbc, 0xb8, 0xe8, 0x6d, 0xd8, 0x82,
+ 0x4f, 0x29, 0xc3, 0x09, 0x52, 0xc0, 0x08, 0x85, 0x27, 0x2e, 0xee, 0x1c,
+ 0x21, 0xdc, 0xe3, 0xa8, 0x53, 0xb3, 0x64, 0x00, 0xc6, 0x34, 0x09, 0xba,
+ 0x3a, 0xc8, 0xe0, 0x7b, 0x51, 0x52, 0x78, 0x1d, 0xf6, 0x19, 0xfa, 0x55,
+ 0x58, 0x24, 0x73, 0xa9, 0xa3, 0xed, 0x3f, 0x46, 0x51, 0x48, 0x88, 0x83,
+ 0x3f, 0x4d, 0xef, 0x6c, 0xdd, 0x6d, 0xd3, 0xbd, 0x5b, 0x88, 0x29, 0x4f,
+ 0xf6, 0x79, 0x75, 0x0d, 0xbd, 0x0a, 0xd5, 0xb4, 0x5a, 0xc9, 0x28, 0x9d,
+ 0xbc, 0x27, 0x4c, 0x44, 0xb9, 0xeb, 0x26, 0xbb, 0xcb, 0xb1, 0x00, 0x65,
+ 0xf0, 0x36, 0xaa, 0x12, 0x4e, 0x9f, 0xed, 0x2c, 0x60, 0x79, 0x2a, 0x98,
+ 0x86, 0x39, 0xa5, 0x31, 0x1c, 0xf4, 0xb9, 0x5a, 0x7c, 0x78, 0x5e, 0x61,
+ 0x56, 0x8e, 0xa3, 0x14, 0x32, 0x81, 0x1c, 0x57, 0x59, 0x94, 0xb1, 0x4f,
+ 0x5f, 0x4d, 0xd3, 0xd1, 0x7e, 0x2a, 0x65, 0xa4, 0x1e, 0xb0, 0x7a, 0x02,
+ 0xcc, 0x02, 0x14, 0xe6, 0xc2, 0xed, 0x4c, 0xf8, 0x57, 0x90, 0x24, 0x0b,
+ 0x2f, 0xe8, 0xd8, 0x60, 0x94, 0x17, 0xab, 0x2b, 0x81, 0xf7, 0xb8, 0x99,
+ 0x90, 0xb7, 0x11, 0xff, 0x1e, 0xf4, 0xf6, 0xf9, 0xef, 0xc1, 0xe2, 0xd5,
+ 0xc4, 0xc3, 0xf3, 0x1c, 0xcf, 0xd0, 0xde, 0x16, 0x8e, 0x29, 0xfb, 0x48,
+ 0x15, 0x2f, 0x00, 0x98, 0x1a, 0x4b, 0xb4, 0x4d, 0x06, 0x50, 0x5e, 0x91,
+ 0xe6, 0xf2, 0x7f, 0x33, 0xe7, 0x68, 0x42, 0xd5, 0x4e, 0x84, 0xeb, 0x4a,
+ 0xf6, 0xdb, 0xdb, 0x7b, 0x1b, 0x8b, 0xc6, 0x97, 0x30, 0xfb, 0x97, 0x68,
+ 0x16, 0x98, 0x51, 0x42, 0x18, 0x1d, 0xdb, 0x48, 0x90, 0xf8, 0x32, 0xac,
+ 0xae, 0x60, 0xd9, 0xa5, 0xb2, 0xd0, 0x50, 0x64, 0xf9, 0x74, 0x99, 0x17,
+ 0xc2, 0x29, 0x42, 0x25, 0xc4, 0x05, 0xcd, 0xd4, 0x5f, 0x78, 0xf7, 0x42,
+ 0xdb, 0xbb, 0xd5, 0x15, 0xac, 0x99, 0x6d, 0xe1, 0xe6, 0xa1, 0x26, 0xc5,
+ 0x87, 0x74, 0x28, 0x18, 0x73, 0x73, 0x57, 0x70, 0xed, 0xc5, 0x1a, 0xee,
+ 0xf3, 0xb5, 0xff, 0x58, 0xe3, 0x98, 0x16, 0xda, 0xd5, 0x75, 0x34, 0x69,
+ 0x81, 0xce, 0xe6, 0xb5, 0xd9, 0xe2, 0x36, 0xdb, 0xd1, 0x36, 0xc3, 0xd6,
+ 0x62, 0xd5, 0x42, 0x6c, 0x28, 0x18, 0xa5, 0x54, 0xb7, 0x3c, 0xf4, 0x33,
+ 0x58, 0x77, 0xd3, 0x3e, 0x26, 0x88, 0xba, 0x40, 0x9a, 0x7f, 0x70, 0x42,
+ 0x2a, 0x44, 0x50, 0x7a, 0x95, 0x5f, 0xbf, 0x1c, 0x26, 0x74, 0x10, 0x5e,
+ 0x89, 0xe5, 0x75, 0x73, 0x84, 0x98, 0xa5, 0xe4, 0x4d, 0x2a, 0xb1, 0x9a,
+ 0x4a, 0x3d, 0x3a, 0x4e, 0x9b, 0xe5, 0x52, 0x15, 0xe9, 0x94, 0x6b, 0x4b,
+ 0x41, 0xc7, 0x6d, 0xa1, 0x26, 0x2e, 0xec, 0x41, 0xa1, 0x45, 0x37, 0x8c,
+ 0x5b, 0x27, 0xe5, 0x43, 0x31, 0xe9, 0x56, 0xd7, 0x1c, 0xe4, 0x08, 0x25,
+ 0xa8, 0xac, 0x92, 0x42, 0x55, 0xa4, 0x34, 0x87, 0xa4, 0xe2, 0xbe, 0x97,
+ 0xa9, 0x8b, 0xa1, 0x68, 0xb6, 0x00, 0x32, 0x54, 0xb5, 0x02, 0xc8, 0x89,
+ 0xbe, 0xd4, 0xd1, 0x4b, 0xb9, 0xb8, 0xca, 0x10, 0xa3, 0xff, 0xb0, 0x88,
+ 0xac, 0x00, 0xde, 0xdd, 0x64, 0x4f, 0x05, 0x46, 0x98, 0x17, 0x54, 0xc5,
+ 0x84, 0x3a, 0x0f, 0x00, 0x04, 0x10, 0x50, 0x89, 0x20, 0x81, 0x38, 0x63,
+ 0x94, 0x2d, 0xbc, 0xe9, 0x80, 0x43, 0xd5, 0xa2, 0xd5, 0xad, 0x21, 0x64,
+ 0xa1, 0x7c, 0x7c, 0x30, 0xeb, 0xe5, 0x16, 0xb0, 0x07, 0xdf, 0x4b, 0x8e,
+ 0x76, 0xef, 0xb9, 0xfa, 0xf4, 0x6e, 0x7b, 0xc4, 0x90, 0x2b, 0x1e, 0x10,
+ 0x51, 0x16, 0x6b, 0xcc, 0x8e, 0x07, 0xf9, 0x47, 0x17, 0x71, 0x86, 0x85,
+ 0x91, 0xb8, 0x06, 0x90, 0xd9, 0x7c, 0xc3, 0xe1, 0x0c, 0xd2, 0xc0, 0xa7,
+ 0x12, 0x1a, 0x58, 0x9a, 0x5d, 0x82, 0xb9, 0xd9, 0xe6, 0x65, 0x54, 0x1d,
+ 0xab, 0x45, 0x78, 0x0c, 0x0e, 0x71, 0xcd, 0x55, 0x42, 0x9b, 0x98, 0x23,
+ 0xe9, 0x8e, 0xaa, 0x4d, 0x73, 0x1c, 0x18, 0x77, 0x15, 0x4b, 0x31, 0x71,
+ 0xc1, 0x13, 0x3a, 0x0b, 0xa5, 0x76, 0x12, 0xcf, 0x4d, 0x50, 0x3c, 0x09,
+ 0x3b, 0x7c, 0x49, 0x8b, 0x02, 0x95, 0x0a, 0x6d, 0x6f, 0x83, 0x0a, 0x87,
+ 0xae, 0x82, 0xc9, 0xb7, 0x7f, 0xf9, 0xb5, 0x7b, 0xde, 0xb9, 0xee, 0xfc,
+ 0xfa, 0xed, 0x5f, 0x7a, 0xaf, 0xaf, 0x2f, 0xaf, 0xff, 0x29, 0x63, 0x4a,
+ 0x1a, 0xa6, 0xa9, 0x8e, 0xe9, 0xcf, 0x08, 0xf0, 0x04, 0xa0, 0x57, 0xeb,
+ 0x5f, 0x7f, 0xb5, 0x7b, 0x74, 0x02, 0xff, 0x6d, 0x08, 0xf2, 0x71, 0x56,
+ 0xf6, 0xd3, 0x07, 0x48, 0x82, 0x47, 0xc8, 0x6f, 0x2e, 0xbc, 0xe5, 0xee,
+ 0xa3, 0x7b, 0xa1, 0x34, 0x24, 0x1d, 0x75, 0x84, 0x4e, 0xc2, 0x75, 0x66,
+ 0x0c, 0x17, 0x5b, 0xff, 0xda, 0xb4, 0x7e, 0x02, 0xff, 0x11, 0xb3, 0x6c,
+ 0x24, 0xa7, 0xbf, 0xfd, 0x76, 0xea, 0xea, 0xa7, 0x4c, 0xa1, 0x88, 0x45,
+ 0xb5, 0xa8, 0xf3, 0x23, 0xd4, 0xf8, 0xe4, 0x39, 0xfb, 0x3d, 0x0b, 0x2a,
+ 0x41, 0x28, 0xe8, 0x12, 0xaa, 0x81, 0x61, 0x0e, 0x51, 0xac, 0xb4, 0x59,
+ 0xea, 0xea, 0xc9, 0x6a, 0x2e, 0x9a, 0x5c, 0x69, 0xcd, 0x96, 0xed, 0x1e,
+ 0x31, 0xb8, 0x89, 0x91, 0xe6, 0x8a, 0x89, 0xac, 0xa7, 0x3d, 0x65, 0xa1,
+ 0x4c, 0x0a, 0x5e, 0xf5, 0x0a, 0x66, 0xf8, 0xb5, 0x99, 0xf9, 0x48, 0x17,
+ 0x3c, 0x69, 0x9c, 0x4f, 0x8b, 0x34, 0x49, 0xbf, 0xbd, 0x88, 0x2d, 0x41,
+ 0x74, 0xc2, 0x97, 0x9d, 0xec, 0xe7, 0x4c, 0xb4, 0x37, 0xcb, 0x1d, 0x55,
+ 0x93, 0x2f, 0x28, 0x3c, 0x8a, 0x68, 0xc7, 0x7a, 0x30, 0xd8, 0x0e, 0x8f,
+ 0xe8, 0x24, 0x18, 0xd2, 0xea, 0x0a, 0x2e, 0x8c, 0x3b, 0xae, 0xb0, 0xe0,
+ 0x14, 0x31, 0xa9, 0x49, 0x46, 0xd5, 0x4e, 0xa1, 0xc6, 0x3a, 0x0b, 0x69,
+ 0xd3, 0x7c, 0xc4, 0xb8, 0xe3, 0x70, 0x06, 0xb4, 0x88, 0xf0, 0x0d, 0xdb,
+ 0x35, 0xd2, 0x55, 0x89, 0xf9, 0x51, 0x58, 0x59, 0x24, 0x1b, 0x9e, 0x3e,
+ 0x98, 0xae, 0x0e, 0x4f, 0x93, 0x6c, 0x88, 0x75, 0xac, 0x68, 0xf5, 0x6f,
+ 0x32, 0x47, 0x00, 0x03, 0x49, 0x54, 0x01, 0x78, 0xad, 0x2c, 0xf3, 0x28,
+ 0xc0, 0xdc, 0x8b, 0x7c, 0x2e, 0xb8, 0x99, 0x78, 0x03, 0x74, 0xc7, 0xac,
+ 0x3b, 0x80, 0x42, 0x99, 0xf5, 0x04, 0x81, 0x22, 0xfe, 0x3e, 0x2e, 0x3f,
+ 0xaf, 0x48, 0x40, 0x6a, 0x0e, 0xaf, 0x43, 0x65, 0x3e, 0x90, 0xf7, 0x9a,
+ 0x00, 0xd1, 0x33, 0xc8, 0x86, 0xf9, 0x28, 0x27, 0xe9, 0x7c, 0x82, 0xa2,
+ 0xdf, 0xec, 0x61, 0x23, 0xb6, 0xd0, 0xc1, 0x2a, 0x2f, 0xb3, 0xc2, 0x8b,
+ 0x57, 0x77, 0xa3, 0x1d, 0xac, 0xaa, 0x87, 0xbd, 0x2e, 0xbb, 0x1a, 0x67,
+ 0xcf, 0x72, 0x2b, 0x5a, 0x00, 0x28, 0xa3, 0xa3, 0xb3, 0x7d, 0xb8, 0x70,
+ 0x1f, 0x94, 0xd3, 0x1d, 0x3e, 0xb5, 0x21, 0x6f, 0xa2, 0x52, 0x63, 0x87,
+ 0x4b, 0x9f, 0xc1, 0xe5, 0x21, 0xc4, 0xba, 0x8e, 0x19, 0x47, 0x00, 0xce,
+ 0x63, 0xb3, 0x91, 0xa0, 0x02, 0xd6, 0x6d, 0xa1, 0x36, 0x63, 0x3b, 0x32,
+ 0x0b, 0xdb, 0xc9, 0xb7, 0xdf, 0x9b, 0x73, 0x4f, 0x30, 0x2b, 0xbe, 0x5b,
+ 0xdb, 0x6e, 0x6f, 0xad, 0x7d, 0x6f, 0xee, 0xda, 0x49, 0xbe, 0xfd, 0xcb,
+ 0xf9, 0x9b, 0xee, 0xf5, 0x3f, 0xdf, 0xf6, 0x0c, 0x0d, 0x19, 0x41, 0xe7,
+ 0xd7, 0xd5, 0x95, 0x5d, 0x73, 0xad, 0xf7, 0xb2, 0xf7, 0xca, 0x30, 0x29,
+ 0xba, 0xb6, 0xfe, 0xd5, 0x5b, 0x6c, 0x66, 0x23, 0x31, 0x4f, 0xec, 0x25,
+ 0x96, 0x7d, 0xfd, 0x35, 0xf9, 0xf8, 0x31, 0x59, 0x33, 0x73, 0x76, 0x78,
+ 0xf2, 0xfb, 0xef, 0x27, 0x6b, 0xe6, 0xc7, 0x7d, 0xfd, 0xe3, 0xef, 0xbf,
+ 0xc3, 0x8f, 0x07, 0x5b, 0x27, 0x72, 0x09, 0x0e, 0xab, 0xf7, 0x4f, 0x49,
+ 0x03, 0x6b, 0x08, 0x42, 0xb1, 0xec, 0x71, 0x66, 0xd8, 0xd0, 0x1a, 0xb4,
+ 0x7a, 0x90, 0xfc, 0xf5, 0xe3, 0xc7, 0x93, 0xd5, 0x95, 0xc3, 0xe4, 0x37,
+ 0xf3, 0xed, 0x08, 0x40, 0x5d, 0x8d, 0xf8, 0x40, 0x85, 0xd1, 0x69, 0x36,
+ 0xcd, 0x71, 0xfa, 0x08, 0x32, 0xd4, 0xd7, 0xd4, 0xca, 0x49, 0x32, 0xca,
+ 0xcc, 0x71, 0x36, 0xc0, 0xe2, 0xa2, 0xe6, 0x56, 0x6f, 0x41, 0xf0, 0x39,
+ 0x82, 0x74, 0x65, 0x5e, 0x64, 0x27, 0xd4, 0x53, 0x2a, 0x13, 0x88, 0x94,
+ 0xcf, 0x21, 0x92, 0x17, 0x0f, 0xda, 0x3e, 0x59, 0x75, 0x44, 0x0e, 0x32,
+ 0x54, 0x8a, 0x13, 0xbe, 0xd7, 0xe4, 0x3c, 0x2e, 0x55, 0x4d, 0xd3, 0x31,
+ 0xc1, 0x5d, 0x14, 0xf2, 0x84, 0xca, 0x93, 0x7c, 0x84, 0x19, 0x34, 0x53,
+ 0xb3, 0x2c, 0x0c, 0x32, 0x84, 0xd2, 0x64, 0x58, 0x7a, 0xd3, 0xdb, 0xe9,
+ 0x1f, 0x3f, 0x06, 0xdb, 0x1b, 0x5a, 0x04, 0x8e, 0xe8, 0xe2, 0xdb, 0x09,
+ 0xfd, 0xdf, 0xe8, 0x0f, 0xa9, 0x05, 0x8f, 0x72, 0x1c, 0xd1, 0x6b, 0xec,
+ 0xaf, 0x66, 0x29, 0x82, 0xe6, 0xda, 0xc9, 0x55, 0x4e, 0xd0, 0xcc, 0xb1,
+ 0x32, 0x75, 0xb6, 0x00, 0xa8, 0xd9, 0x11, 0xe3, 0x31, 0x6c, 0xd4, 0xca,
+ 0x68, 0xe7, 0x77, 0xff, 0xf7, 0xdf, 0x2b, 0xdc, 0xc9, 0xb6, 0x29, 0xac,
+ 0xa0, 0x9d, 0xac, 0x77, 0xa0, 0x4c, 0x90, 0x42, 0xc6, 0x02, 0xd1, 0x1b,
+ 0x08, 0x01, 0xc0, 0xb7, 0xe0, 0xba, 0x79, 0x1d, 0x17, 0x20, 0x5d, 0xb6,
+ 0xf9, 0xa7, 0x6c, 0x6a, 0xab, 0xab, 0x01, 0xd6, 0x4e, 0x4c, 0x40, 0x96,
+ 0x45, 0xdc, 0x6f, 0xd6, 0x1d, 0x5e, 0x11, 0xae, 0x0b, 0x44, 0x1b, 0x7b,
+ 0x69, 0x6c, 0x95, 0x93, 0xe5, 0xd6, 0x38, 0x3e, 0x0a, 0x5e, 0x64, 0xbb,
+ 0x9e, 0x6a, 0x75, 0x88, 0xa5, 0xfb, 0x7d, 0x33, 0x7a, 0xeb, 0xbc, 0xbd,
+ 0x84, 0x65, 0x78, 0xbc, 0x97, 0x34, 0xf9, 0x00, 0xc0, 0xba, 0x58, 0x0a,
+ 0xf2, 0x39, 0x72, 0x36, 0xb7, 0xe7, 0xcf, 0xdf, 0x41, 0x84, 0x2c, 0x16,
+ 0x13, 0xb1, 0x23, 0x00, 0xb5, 0x19, 0x2a, 0x83, 0x04, 0x54, 0xf3, 0xf9,
+ 0x4d, 0xad, 0x83, 0xb6, 0x31, 0x7c, 0x5a, 0x48, 0xe9, 0x1b, 0x38, 0xab,
+ 0x74, 0xfe, 0x51, 0x3d, 0xad, 0xfa, 0x0e, 0x57, 0x56, 0xc4, 0xef, 0x30,
+ 0x96, 0xeb, 0x03, 0x6d, 0x6c, 0x3a, 0x9b, 0xb0, 0xe0, 0x02, 0xdf, 0x2a,
+ 0x9d, 0x5f, 0xff, 0x93, 0x4b, 0xb4, 0x91, 0x04, 0x3d, 0xf6, 0x8f, 0x1c,
+ 0xbf, 0xcf, 0xd4, 0x64, 0x85, 0x92, 0x00, 0x89, 0x7d, 0x5c, 0x3c, 0x9a,
+ 0x5d, 0x05, 0xa5, 0x16, 0x79, 0x47, 0x34, 0x97, 0x25, 0x2b, 0xd5, 0xbf,
+ 0x90, 0x71, 0xd4, 0xa9, 0x88, 0x42, 0x15, 0x47, 0x11, 0xaa, 0x98, 0x7e,
+ 0xda, 0x18, 0x7c, 0x6a, 0xe1, 0xf9, 0xd6, 0xac, 0xb5, 0x09, 0x4a, 0x38,
+ 0xf2, 0x72, 0x40, 0x5f, 0x12, 0xb1, 0x40, 0x09, 0x2f, 0x70, 0x0e, 0xa0,
+ 0x3c, 0xb1, 0xba, 0x22, 0x02, 0x45, 0x5e, 0xb2, 0x86, 0x30, 0xbc, 0x6d,
+ 0x71, 0xb9, 0x10, 0x38, 0x54, 0xd7, 0xa1, 0xf5, 0xd9, 0x98, 0x8a, 0x10,
+ 0x22, 0xfa, 0xfc, 0x86, 0xad, 0xed, 0xc2, 0x30, 0x88, 0xf6, 0xe0, 0x31,
+ 0x42, 0x28, 0x9f, 0x3c, 0x6a, 0x9e, 0xdc, 0xe1, 0x83, 0xb7, 0xd7, 0xea,
+ 0xbe, 0x0b, 0xd4, 0xa7, 0x81, 0xc5, 0xd3, 0x1a, 0x39, 0xe5, 0xc9, 0x07,
+ 0xd9, 0xea, 0xf2, 0x38, 0x09, 0x65, 0xed, 0xbf, 0x48, 0x1b, 0xde, 0xde,
+ 0x42, 0xa8, 0x30, 0xf3, 0x87, 0xf5, 0xe1, 0x0e, 0x15, 0xd5, 0xf4, 0xf5,
+ 0x22, 0xaa, 0x29, 0x8b, 0x2a, 0x20, 0x4d, 0x77, 0x8b, 0x17, 0xc5, 0xa8,
+ 0x48, 0x4d, 0x5e, 0x3c, 0x57, 0x14, 0x1e, 0xd4, 0x53, 0xfe, 0x7d, 0x75,
+ 0x65, 0x64, 0x31, 0xe3, 0x64, 0xa5, 0xa6, 0x4f, 0x0f, 0x41, 0xb1, 0x74,
+ 0xae, 0x0e, 0x6c, 0xa7, 0x82, 0x4b, 0x1e, 0x73, 0x8b, 0xb2, 0xbc, 0x55,
+ 0x94, 0x7b, 0xb2, 0x25, 0x62, 0x49, 0x5c, 0xdf, 0x1c, 0xa9, 0x70, 0xee,
+ 0x71, 0x67, 0xa0, 0x0e, 0xbe, 0x4e, 0x0c, 0x12, 0xe4, 0xbf, 0xd2, 0x7f,
+ 0x9f, 0x13, 0x3d, 0xb9, 0xb7, 0x4c, 0xc5, 0x33, 0x07, 0xed, 0x65, 0xf7,
+ 0xf0, 0x89, 0xd3, 0xe0, 0xfd, 0xca, 0x9d, 0xc9, 0xcd, 0x2c, 0x87, 0xf2,
+ 0xad, 0x54, 0x3b, 0x13, 0xdf, 0x58, 0x72, 0xf2, 0x32, 0x08, 0xa2, 0xb7,
+ 0xc3, 0xf4, 0x0e, 0x2b, 0x9d, 0x7a, 0x6f, 0x4e, 0x82, 0x17, 0xa7, 0x52,
+ 0x76, 0xd9, 0x29, 0x9e, 0x5e, 0x55, 0x5c, 0x2e, 0x85, 0xec, 0x1e, 0x91,
+ 0x3a, 0x0a, 0xeb, 0x37, 0xcd, 0xa4, 0x8f, 0xa5, 0x14, 0xcc, 0x87, 0xc1,
+ 0xc6, 0x86, 0xaa, 0xbb, 0x50, 0x79, 0x69, 0x13, 0x84, 0x77, 0x52, 0x28,
+ 0xa8, 0x5c, 0x91, 0x2a, 0x33, 0x09, 0xbb, 0xeb, 0x86, 0x44, 0x75, 0xdc,
+ 0x6c, 0xcb, 0x52, 0xde, 0xa7, 0xe4, 0x43, 0xee, 0x63, 0x3e, 0xe4, 0xbe,
+ 0x33, 0xc4, 0xb8, 0xd9, 0xd4, 0x8e, 0x03, 0x23, 0xaa, 0x18, 0x09, 0xe0,
+ 0x3d, 0x70, 0x3d, 0x5a, 0x41, 0xd5, 0x47, 0x96, 0x99, 0x68, 0x2a, 0x72,
+ 0xa0, 0x24, 0x98, 0x7c, 0x2a, 0xae, 0x31, 0x90, 0x9c, 0xb9, 0x64, 0x58,
+ 0x14, 0xef, 0x51, 0xc3, 0x48, 0x61, 0x4f, 0x01, 0xe7, 0x02, 0x7b, 0x08,
+ 0x35, 0x26, 0x54, 0xc9, 0x9e, 0x08, 0xcb, 0x62, 0xe8, 0x05, 0x90, 0x29,
+ 0xcb, 0xa9, 0x71, 0xa6, 0x37, 0x34, 0xff, 0x50, 0x85, 0xdb, 0x69, 0x43,
+ 0x54, 0xcc, 0xc2, 0xf5, 0x88, 0x1d, 0x30, 0x7d, 0xc8, 0xe6, 0x7c, 0xa0,
+ 0x92, 0x14, 0x58, 0x92, 0x9d, 0xeb, 0x40, 0xd9, 0x07, 0xa1, 0x36, 0xf6,
+ 0x7b, 0xd1, 0x83, 0xa9, 0xff, 0x58, 0xba, 0x97, 0xd7, 0xf3, 0xc6, 0x2c,
+ 0xd2, 0x7a, 0xdf, 0xac, 0xa7, 0x5b, 0xcb, 0x76, 0xd2, 0x89, 0xae, 0x13,
+ 0x4c, 0x4c, 0x7f, 0x98, 0xa5, 0x93, 0xe1, 0x53, 0xe2, 0xca, 0xb7, 0x80,
+ 0xb8, 0x22, 0x2f, 0x85, 0x23, 0x95, 0x2b, 0x27, 0x05, 0xe4, 0x43, 0xe7,
+ 0xd0, 0x97, 0xac, 0xc0, 0xe6, 0x2f, 0x72, 0x65, 0x81, 0xcd, 0x29, 0x89,
+ 0x85, 0x6d, 0xc6, 0x6b, 0x5c, 0x2f, 0xdd, 0x4c, 0x16, 0x2c, 0x57, 0x12,
+ 0x2c, 0x55, 0x6a, 0x57, 0xe8, 0x24, 0xc9, 0x72, 0xf4, 0xd2, 0xc0, 0x14,
+ 0xf4, 0x69, 0x0a, 0x0a, 0xfa, 0x36, 0xe0, 0x33, 0xc1, 0x09, 0x9e, 0xfd,
+ 0x7e, 0xf6, 0xe0, 0x95, 0x43, 0x7d, 0x05, 0xea, 0x1b, 0xd5, 0xc4, 0x1d,
+ 0x3e, 0xbd, 0x00, 0x77, 0x06, 0xcc, 0x28, 0xaa, 0xcb, 0xe6, 0xdf, 0x74,
+ 0x36, 0x2d, 0xcc, 0x14, 0x52, 0x85, 0x6b, 0x5a, 0x46, 0xa8, 0x3f, 0x31,
+ 0xc3, 0xba, 0xe5, 0xd6, 0x97, 0xe6, 0xf3, 0x36, 0x2e, 0x96, 0xcb, 0x3a,
+ 0x37, 0x61, 0x13, 0xa4, 0x43, 0xf0, 0x06, 0x4d, 0xef, 0x47, 0x65, 0x33,
+ 0xc9, 0xda, 0x77, 0x6d, 0x77, 0x21, 0xd9, 0x6d, 0xef, 0x03, 0xd5, 0x8a,
+ 0x4d, 0x7b, 0xb7, 0x7d, 0x8c, 0x5e, 0x24, 0xc4, 0x68, 0x55, 0x98, 0xac,
+ 0x84, 0xc3, 0x2a, 0x36, 0x3b, 0xe2, 0xbf, 0x80, 0xee, 0xba, 0x49, 0x24,
+ 0x39, 0xc2, 0xba, 0x41, 0x50, 0xeb, 0x58, 0xbf, 0x2a, 0xe5, 0x39, 0x02,
+ 0x93, 0x39, 0xb2, 0x4c, 0xaf, 0xfb, 0xc0, 0x47, 0xa0, 0x38, 0xaf, 0xf5,
+ 0xd2, 0x48, 0x81, 0x4a, 0xc6, 0x2c, 0x54, 0x35, 0x53, 0xd1, 0x7f, 0xd3,
+ 0xc4, 0xdb, 0x57, 0x57, 0x0c, 0x69, 0xdd, 0x1a, 0x22, 0x1b, 0x64, 0x4e,
+ 0x43, 0x01, 0x50, 0x20, 0xf0, 0x84, 0x68, 0x68, 0x91, 0xb0, 0x91, 0x8d,
+ 0x13, 0x10, 0xf7, 0xb1, 0xe8, 0x3d, 0xbf, 0x90, 0xa4, 0x17, 0xe9, 0x24,
+ 0x62, 0xef, 0x42, 0xd9, 0x79, 0xdc, 0x86, 0xa8, 0x56, 0xa3, 0xcb, 0x04,
+ 0xce, 0x5c, 0xa7, 0x14, 0xbb, 0xce, 0x96, 0x09, 0x56, 0x13, 0xe1, 0x6d,
+ 0x4d, 0x7e, 0xb7, 0x12, 0x2c, 0xd3, 0xde, 0xb9, 0x02, 0xa4, 0x8e, 0xdb,
+ 0x34, 0x42, 0xec, 0x54, 0x3b, 0x95, 0x55, 0x11, 0x57, 0x69, 0x0c, 0x8c,
+ 0x7e, 0x0f, 0xc5, 0x64, 0xea, 0xdc, 0x04, 0x70, 0x83, 0x23, 0x99, 0x8e,
+ 0x9d, 0xe1, 0x04, 0x6b, 0x71, 0x48, 0xc1, 0x67, 0x1c, 0x04, 0x2e, 0x84,
+ 0xd4, 0x88, 0x02, 0xbb, 0x45, 0x2d, 0x8b, 0xb7, 0x47, 0xa1, 0xd8, 0x6e,
+ 0x40, 0x65, 0x1d, 0x08, 0xc9, 0xb1, 0x59, 0xc2, 0xfc, 0xe6, 0x1c, 0x01,
+ 0xfe, 0x21, 0xc5, 0x47, 0x04, 0x82, 0xc9, 0xae, 0xae, 0x54, 0x40, 0x44,
+ 0x01, 0x40, 0x33, 0x20, 0x97, 0xb3, 0x7f, 0x7b, 0xa6, 0x7d, 0xf7, 0x6e,
+ 0x46, 0xb9, 0xfd, 0x4e, 0x42, 0xf9, 0x7c, 0x62, 0xc6, 0x3e, 0x89, 0x19,
+ 0xc2, 0x08, 0xbe, 0x14, 0xa8, 0x58, 0xc7, 0x4c, 0x27, 0x4c, 0x5b, 0xdf,
+ 0x16, 0xaf, 0x70, 0x96, 0xe8, 0x1e, 0xe3, 0x04, 0x95, 0x61, 0x8d, 0x6c,
+ 0x38, 0x7a, 0x04, 0x44, 0x48, 0x4b, 0x26, 0x46, 0xfe, 0x1c, 0x4b, 0x15,
+ 0xa1, 0x92, 0x4e, 0x49, 0xae, 0xe9, 0x8d, 0xa4, 0x08, 0x86, 0x77, 0xdc,
+ 0x51, 0x24, 0xfb, 0x36, 0x6d, 0x19, 0x4d, 0xf4, 0x43, 0x92, 0xb0, 0x51,
+ 0xa9, 0xa5, 0xcb, 0x44, 0x68, 0x0e, 0x5f, 0xc0, 0xd1, 0x42, 0x8b, 0x68,
+ 0x3a, 0x0e, 0x4c, 0xb1, 0xe6, 0x0c, 0x01, 0xa2, 0x4c, 0x49, 0x89, 0xf2,
+ 0x5f, 0xda, 0x4c, 0x8c, 0x8c, 0x0a, 0x3e, 0x08, 0x94, 0xbb, 0xd2, 0x07,
+ 0xa3, 0x4f, 0x10, 0x48, 0x35, 0xd6, 0x1a, 0x2e, 0xe4, 0x9c, 0x4c, 0x95,
+ 0xff, 0x07, 0x6a, 0xaa, 0x86, 0x2f, 0x67, 0xa4, 0x07, 0xab, 0x33, 0xe2,
+ 0x13, 0xd5, 0xb7, 0x51, 0x95, 0xbe, 0x27, 0x64, 0x70, 0x85, 0xad, 0x60,
+ 0xeb, 0xac, 0x57, 0x22, 0xfd, 0xcb, 0xe9, 0x08, 0xed, 0x63, 0x61, 0xe6,
+ 0xe2, 0x21, 0x43, 0x2f, 0xb4, 0xd9, 0xbd, 0x33, 0xae, 0x0c, 0x7e, 0x69,
+ 0x0d, 0x10, 0x30, 0x5f, 0x58, 0xcf, 0x5d, 0x6e, 0xc3, 0xc3, 0xe9, 0x1f,
+ 0xe0, 0xa8, 0xb0, 0x83, 0x13, 0x09, 0x05, 0x66, 0x06, 0x0d, 0x80, 0x65,
+ 0xe5, 0x85, 0xc8, 0x8f, 0xcc, 0x61, 0xfc, 0x98, 0x3e, 0x95, 0x2f, 0x68,
+ 0x25, 0xb0, 0x86, 0xe1, 0x48, 0x10, 0x78, 0x50, 0xd5, 0x48, 0xcb, 0x72,
+ 0x36, 0xa2, 0x83, 0xa5, 0x9c, 0x3d, 0xc0, 0x46, 0x97, 0xd3, 0x51, 0x58,
+ 0x3f, 0x79, 0x79, 0xaa, 0x4b, 0xc5, 0xe9, 0xf3, 0x6c, 0x2a, 0x57, 0xb3,
+ 0xa8, 0x49, 0x04, 0xe5, 0x54, 0x72, 0xce, 0x90, 0xcc, 0x6c, 0x39, 0x16,
+ 0xa5, 0xde, 0x13, 0xff, 0x81, 0x1a, 0x9c, 0x93, 0x01, 0x84, 0x16, 0x00,
+ 0x7e, 0xf9, 0x7b, 0x38, 0x8d, 0xcd, 0x81, 0x96, 0xa5, 0x25, 0x22, 0x84,
+ 0x83, 0x80, 0x60, 0xe9, 0xb6, 0xa6, 0x06, 0x33, 0xaf, 0x1b, 0x32, 0x30,
+ 0x47, 0x73, 0xa8, 0xba, 0x8e, 0x09, 0x9d, 0x19, 0xa6, 0x04, 0x0a, 0xde,
+ 0x0f, 0xcb, 0x02, 0xbd, 0x55, 0xc8, 0x9a, 0xf0, 0x22, 0x87, 0x35, 0x10,
+ 0x9a, 0x09, 0x26, 0xcc, 0xe7, 0x1a, 0x87, 0x16, 0x48, 0xf0, 0x43, 0x9a,
+ 0x0f, 0xc1, 0xe0, 0x84, 0x2b, 0x21, 0x9e, 0x27, 0xd1, 0xf1, 0xd0, 0xd9,
+ 0x65, 0x76, 0x1b, 0x68, 0x4e, 0x59, 0x3a, 0x02, 0xed, 0xd8, 0xa8, 0x59,
+ 0x46, 0x76, 0x30, 0x93, 0x4f, 0x2f, 0xe0, 0xe3, 0xd2, 0x4b, 0xab, 0x6f,
+ 0x82, 0xa0, 0x8e, 0x0e, 0x1e, 0x40, 0x5c, 0x00, 0x46, 0x9f, 0x71, 0x74,
+ 0x85, 0xec, 0x38, 0x1a, 0x01, 0xe2, 0xb8, 0x03, 0x6a, 0x12, 0x2d, 0x12,
+ 0xbb, 0x64, 0xad, 0x57, 0x02, 0x45, 0x38, 0xd3, 0x16, 0x7f, 0x69, 0xe2,
+ 0x91, 0x02, 0x4e, 0x6a, 0x23, 0xef, 0x8f, 0x91, 0x32, 0xd7, 0xc1, 0xaf,
+ 0x0b, 0x34, 0xbb, 0xa1, 0xc7, 0xd5, 0x4e, 0x7e, 0xa1, 0xf3, 0x3b, 0x1f,
+ 0xf0, 0x4b, 0x6f, 0x11, 0x02, 0xa8, 0x8f, 0x52, 0x07, 0x7e, 0x16, 0xde,
+ 0xe8, 0xd5, 0x5b, 0x12, 0x26, 0xd8, 0x1a, 0x17, 0x2d, 0xd3, 0x70, 0x0b,
+ 0x9a, 0xb4, 0x0c, 0x51, 0x63, 0x33, 0x9e, 0x0b, 0x9b, 0x49, 0x7e, 0x61,
+ 0x39, 0xb3, 0xc7, 0xfd, 0xb0, 0x9c, 0x46, 0xe3, 0xac, 0x68, 0xa6, 0x73,
+ 0xc6, 0xc4, 0x8d, 0x2b, 0xa9, 0xe6, 0x22, 0x82, 0x00, 0x89, 0xe7, 0x0a,
+ 0x8f, 0x36, 0xa7, 0xa0, 0x07, 0x19, 0xae, 0xde, 0xd7, 0x01, 0xae, 0xb0,
+ 0x95, 0x9f, 0xe1, 0x71, 0xc0, 0x98, 0x03, 0x4c, 0x4a, 0x10, 0x93, 0x08,
+ 0x36, 0x2d, 0x26, 0xf1, 0x49, 0x5b, 0x4e, 0xbf, 0x21, 0x05, 0x19, 0x22,
+ 0x5e, 0x58, 0xf9, 0x05, 0xbd, 0xe1, 0x0e, 0x8e, 0x6c, 0xae, 0x4d, 0x5f,
+ 0xc7, 0x37, 0x9b, 0xee, 0x5c, 0x57, 0xf3, 0xee, 0x07, 0xd1, 0xa0, 0x03,
+ 0x61, 0xcd, 0x99, 0x52, 0xc0, 0x68, 0xcd, 0x82, 0xee, 0x1a, 0xad, 0xb1,
+ 0xf2, 0xa1, 0x7a, 0xac, 0x31, 0xa1, 0x7d, 0x62, 0x6e, 0xba, 0x85, 0x0d,
+ 0x62, 0x38, 0x00, 0xca, 0xe0, 0xb7, 0x86, 0xba, 0x93, 0x02, 0x6a, 0x5a,
+ 0x30, 0x85, 0x3f, 0x18, 0xb2, 0xe1, 0x5e, 0xb0, 0xe9, 0x40, 0x05, 0x75,
+ 0x20, 0xd5, 0x1a, 0xee, 0x39, 0x7c, 0x42, 0x79, 0x6a, 0x42, 0x50, 0xf5,
+ 0xc8, 0xc1, 0x28, 0x0e, 0x00, 0xd9, 0x2b, 0x90, 0xf5, 0x7d, 0x36, 0x7c,
+ 0xb0, 0x8c, 0x15, 0x75, 0x5b, 0x98, 0x4f, 0xa8, 0x0d, 0xdf, 0x4c, 0xd6,
+ 0xa0, 0xe7, 0x6b, 0xa8, 0x9c, 0x6a, 0xbb, 0x07, 0x38, 0xf9, 0xe1, 0x7f,
+ 0xbb, 0xdd, 0x8a, 0xed, 0x03, 0x5d, 0xec, 0xdf, 0xcf, 0x79, 0xe4, 0xa2,
+ 0x62, 0xd7, 0x13, 0x1e, 0x74, 0xf6, 0x64, 0x98, 0xd5, 0x1b, 0xe4, 0x22,
+ 0x80, 0x77, 0x05, 0x27, 0x04, 0x6b, 0xdc, 0x66, 0x78, 0xbc, 0xae, 0x6a,
+ 0x97, 0x96, 0x91, 0x77, 0x5c, 0xf4, 0x2e, 0x2e, 0x2a, 0x16, 0xe3, 0x58,
+ 0x60, 0x07, 0xd6, 0xa7, 0xe7, 0xd2, 0x7a, 0xc9, 0xb7, 0x1f, 0xd2, 0xc9,
+ 0xe9, 0x57, 0x5f, 0x7d, 0xbb, 0x09, 0x7f, 0xa1, 0x55, 0x2c, 0xb5, 0x37,
+ 0x05, 0xd7, 0x0c, 0x58, 0x0a, 0x70, 0xb1, 0x6e, 0xa0, 0x73, 0x64, 0xa3,
+ 0xce, 0x3e, 0x82, 0xd0, 0x1d, 0x36, 0x8b, 0x34, 0x86, 0xd3, 0x07, 0x2c,
+ 0x1b, 0xf6, 0x65, 0xd6, 0x9f, 0x21, 0x46, 0xae, 0xd7, 0x3c, 0x86, 0x44,
+ 0x60, 0xbd, 0xcd, 0x0c, 0x4b, 0x6e, 0x26, 0x5b, 0x2e, 0x14, 0xa4, 0x52,
+ 0x1a, 0xf0, 0x41, 0x6f, 0x94, 0x5f, 0xc8, 0x8d, 0x13, 0xcc, 0x92, 0x38,
+ 0x01, 0xc8, 0x9a, 0xae, 0xe0, 0x83, 0x6e, 0x90, 0x1f, 0x7f, 0xd7, 0xd8,
+ 0x6e, 0x18, 0xc1, 0xde, 0x08, 0x8d, 0xdf, 0x35, 0xe8, 0x8a, 0x51, 0x7d,
+ 0xa6, 0x54, 0xe8, 0x6d, 0x3a, 0x31, 0xff, 0x0d, 0x78, 0xee, 0xb6, 0xb6,
+ 0x4c, 0x4f, 0x92, 0x8b, 0xde, 0xea, 0x8a, 0x9a, 0x41, 0xf8, 0xd5, 0xfc,
+ 0xc7, 0xc4, 0x70, 0x93, 0xdf, 0xb5, 0x80, 0xdb, 0xa5, 0xc0, 0x7a, 0xa1,
+ 0x3a, 0x70, 0x96, 0xac, 0x6f, 0xef, 0xec, 0xee, 0x11, 0xe7, 0xdf, 0xa0,
+ 0xdb, 0x37, 0xb1, 0x55, 0xdd, 0xf2, 0xc5, 0x85, 0x69, 0xb3, 0x97, 0xe0,
+ 0x0b, 0x6a, 0x5a, 0x1e, 0xe6, 0xd3, 0xe9, 0x30, 0xab, 0x34, 0xbe, 0xb7,
+ 0xbb, 0xb3, 0x5d, 0x69, 0x1c, 0xc6, 0x1a, 0xe9, 0xf8, 0x85, 0xe9, 0x7b,
+ 0x4d, 0xeb, 0xb3, 0xf1, 0xac, 0x84, 0xd2, 0x2d, 0xb8, 0x77, 0xf8, 0x98,
+ 0x5a, 0xdf, 0xd9, 0xde, 0xdb, 0xa5, 0x56, 0x41, 0x76, 0xac, 0x76, 0xba,
+ 0x07, 0x4d, 0xce, 0xeb, 0x73, 0xb4, 0xd5, 0xdd, 0xbd, 0xed, 0x9d, 0x85,
+ 0xad, 0x7e, 0xf5, 0x55, 0x02, 0xd4, 0x10, 0xb4, 0xca, 0x70, 0x8f, 0x6e,
+ 0x92, 0xeb, 0x87, 0x8c, 0x83, 0x9d, 0xdf, 0x8c, 0x37, 0xa3, 0xfe, 0xca,
+ 0x40, 0x6b, 0xd2, 0x52, 0xef, 0x22, 0x39, 0x3b, 0x4b, 0xce, 0x2e, 0x62,
+ 0xcd, 0x1c, 0xa9, 0xc7, 0x36, 0x99, 0x64, 0x36, 0x91, 0xcc, 0xa2, 0xa4,
+ 0x09, 0xe7, 0xc3, 0x17, 0xa4, 0x4e, 0x0a, 0x2d, 0x0d, 0xff, 0x2a, 0x06,
+ 0x44, 0x73, 0x3e, 0x1d, 0x18, 0x69, 0xfe, 0xb1, 0x34, 0x67, 0xc9, 0x77,
+ 0x8d, 0xbd, 0x06, 0xad, 0x15, 0x1c, 0x0b, 0x24, 0x20, 0x58, 0x5e, 0xce,
+ 0x2e, 0xd1, 0xdd, 0x9d, 0xd6, 0x4d, 0x3e, 0xa5, 0x60, 0x43, 0x5b, 0x9e,
+ 0xb9, 0x73, 0xd5, 0xbd, 0xbc, 0xf4, 0xc0, 0x91, 0xf0, 0x31, 0xd2, 0x9e,
+ 0xf0, 0x47, 0xae, 0x42, 0x8e, 0xa7, 0x80, 0x39, 0xd9, 0x1f, 0xe0, 0x94,
+ 0xfc, 0x00, 0xe2, 0x9e, 0xda, 0x21, 0xb8, 0x33, 0x36, 0x82, 0x85, 0x58,
+ 0x5d, 0x41, 0x9a, 0xde, 0x20, 0x96, 0x67, 0xd8, 0x84, 0x10, 0x11, 0x72,
+ 0x17, 0x9c, 0x80, 0x92, 0x48, 0x13, 0xef, 0x40, 0x6a, 0x22, 0x0b, 0x46,
+ 0xec, 0x14, 0x32, 0x0a, 0x17, 0x04, 0x6b, 0xa2, 0xae, 0x95, 0x32, 0xbf,
+ 0x22, 0x7d, 0x2a, 0x73, 0xc7, 0x42, 0x30, 0x03, 0x2c, 0x21, 0x9a, 0xc1,
+ 0xf0, 0xd8, 0xad, 0x2c, 0x68, 0x58, 0xb7, 0x39, 0x2d, 0x72, 0x02, 0xc8,
+ 0x8c, 0x6e, 0xe4, 0xdd, 0x2e, 0x6d, 0x88, 0x60, 0x4f, 0x50, 0x21, 0x9b,
+ 0xe7, 0xef, 0x66, 0x2a, 0x01, 0x53, 0x7d, 0x0d, 0xbd, 0x03, 0x5f, 0x36,
+ 0xf7, 0x35, 0x0b, 0xb6, 0xf5, 0x9c, 0xe6, 0x65, 0x20, 0xcf, 0x6f, 0xde,
+ 0xed, 0xef, 0x85, 0xcd, 0xef, 0x5e, 0xc4, 0xf7, 0xe6, 0x59, 0x0f, 0x56,
+ 0x43, 0x51, 0xca, 0xe5, 0xd5, 0x9b, 0x16, 0xd5, 0xba, 0x82, 0x37, 0xef,
+ 0xa0, 0x20, 0x18, 0x27, 0xd7, 0xed, 0x83, 0x80, 0x5c, 0x0d, 0xfd, 0xa9,
+ 0x86, 0xa8, 0x8f, 0x96, 0x84, 0x3d, 0xd8, 0xb0, 0x1a, 0x12, 0x4e, 0xd6,
+ 0xa7, 0x35, 0xc4, 0x95, 0xd4, 0xd2, 0x16, 0xd4, 0x5e, 0x37, 0xc4, 0xb5,
+ 0x31, 0x9f, 0x4c, 0x76, 0x2f, 0x62, 0xac, 0x13, 0x67, 0xe0, 0x25, 0xce,
+ 0x40, 0xb0, 0x31, 0x82, 0x59, 0x48, 0x9e, 0x35, 0x09, 0x41, 0x5b, 0xf5,
+ 0x13, 0x91, 0x3c, 0x7b, 0x1e, 0x16, 0x6e, 0xb2, 0x79, 0xf3, 0x60, 0x26,
+ 0xe1, 0xf0, 0x28, 0x39, 0x38, 0xaf, 0x30, 0xa9, 0x53, 0xc6, 0x50, 0x47,
+ 0x40, 0xdb, 0x3d, 0xc3, 0xaf, 0xb1, 0x33, 0x4d, 0x0a, 0x0f, 0x7b, 0x80,
+ 0xe0, 0x46, 0x46, 0xfa, 0x3d, 0x3a, 0x82, 0x08, 0xd8, 0xab, 0xfb, 0xfc,
+ 0x76, 0xda, 0xfa, 0xfb, 0xe5, 0x55, 0x33, 0xe9, 0xfd, 0xd4, 0xc5, 0x98,
+ 0x6b, 0x90, 0x49, 0x0a, 0x0a, 0xc4, 0x3d, 0x84, 0x09, 0x69, 0x26, 0x47,
+ 0xf4, 0x07, 0x62, 0x48, 0xf2, 0x8f, 0xd9, 0xa0, 0xf5, 0x98, 0x0f, 0xa6,
+ 0xf7, 0x6a, 0xfa, 0xc8, 0x1a, 0x3c, 0x2e, 0x67, 0x93, 0x8c, 0x43, 0xec,
+ 0x3c, 0x45, 0xac, 0x24, 0x33, 0x1d, 0x4e, 0x0a, 0x46, 0x42, 0x53, 0x54,
+ 0x07, 0xeb, 0x5e, 0xa2, 0xf4, 0x95, 0xe0, 0x8a, 0x1b, 0x90, 0x96, 0x32,
+ 0xe0, 0xc9, 0x3b, 0xa1, 0x68, 0xbe, 0x3e, 0xa0, 0xf1, 0x29, 0xac, 0xe2,
+ 0x45, 0xc4, 0xd4, 0x9f, 0x7a, 0xc2, 0x2b, 0xc4, 0xcb, 0x13, 0x03, 0xa2,
+ 0x3a, 0x56, 0xe4, 0x3e, 0x07, 0x8b, 0x13, 0x07, 0xa1, 0x97, 0x6e, 0x81,
+ 0x50, 0x42, 0x4b, 0xac, 0x81, 0x0c, 0xe8, 0xe1, 0x21, 0x05, 0x88, 0xb1,
+ 0xb1, 0xc6, 0xaa, 0x1d, 0x66, 0x1f, 0x52, 0xa3, 0x9a, 0x86, 0x34, 0xd0,
+ 0x24, 0xd3, 0x5a, 0x5c, 0xd9, 0x45, 0xc5, 0x4f, 0xb4, 0x3d, 0xec, 0xad,
+ 0x69, 0x27, 0x37, 0xa7, 0xd7, 0x53, 0xdd, 0x32, 0xef, 0x75, 0x57, 0x57,
+ 0x0e, 0x2e, 0x92, 0xce, 0x61, 0x72, 0xbc, 0x17, 0xd2, 0x7b, 0xef, 0xac,
+ 0x7b, 0x7e, 0xd9, 0xc5, 0xa8, 0x63, 0x5c, 0xd9, 0xdb, 0x61, 0xfa, 0xa1,
+ 0x98, 0x9c, 0x38, 0xd7, 0xdf, 0x72, 0x14, 0x37, 0xcd, 0xcc, 0xad, 0x6c,
+ 0x6f, 0x01, 0xb2, 0x7f, 0x00, 0xdc, 0x52, 0x6b, 0xe9, 0x88, 0x10, 0x20,
+ 0x96, 0xd4, 0x0a, 0xa9, 0xcd, 0x7a, 0x0b, 0x14, 0xa2, 0xb4, 0xaf, 0xd4,
+ 0x80, 0x01, 0x75, 0xc8, 0x13, 0xeb, 0xa9, 0xc3, 0x46, 0xa3, 0xc9, 0x4b,
+ 0xb6, 0x4e, 0x9a, 0x33, 0x6c, 0x98, 0xf6, 0xd1, 0xb2, 0x9f, 0x3a, 0x9f,
+ 0x58, 0xac, 0x41, 0x73, 0xfa, 0x41, 0xf5, 0xab, 0xd9, 0x83, 0xa1, 0x4a,
+ 0x73, 0xc8, 0xdf, 0xa1, 0xd9, 0x62, 0xf2, 0x44, 0xef, 0x19, 0xf7, 0x87,
+ 0x45, 0x09, 0xad, 0x61, 0x00, 0xd5, 0xe3, 0x04, 0x42, 0x25, 0x27, 0x40,
+ 0x0a, 0x38, 0x51, 0xa6, 0xf9, 0xc1, 0x5c, 0xf1, 0x03, 0xe5, 0x72, 0x25,
+ 0x81, 0x50, 0x08, 0xe3, 0x58, 0xf4, 0x9e, 0x9b, 0xe2, 0x83, 0x9c, 0x81,
+ 0x83, 0x82, 0xe3, 0x37, 0xb0, 0xa7, 0x4a, 0x11, 0xaa, 0x21, 0x81, 0x29,
+ 0xa0, 0xe7, 0xd9, 0x2d, 0xae, 0x6f, 0x6b, 0x5a, 0xa3, 0xf6, 0x5e, 0x7b,
+ 0xb7, 0xbd, 0x6b, 0x66, 0x87, 0x22, 0x0a, 0xb1, 0x61, 0xb5, 0xa5, 0xa2,
+ 0x93, 0x6b, 0x06, 0x7a, 0x2b, 0x76, 0x80, 0xa6, 0x5d, 0x5c, 0x52, 0x7d,
+ 0xc2, 0xe7, 0x30, 0x1e, 0x19, 0x8c, 0xf3, 0xf7, 0x59, 0xff, 0x3d, 0x69,
+ 0x22, 0x54, 0x13, 0xce, 0xed, 0x33, 0xa5, 0x1a, 0x7b, 0x41, 0x84, 0xd6,
+ 0x3c, 0x82, 0xb6, 0x28, 0xb3, 0x6b, 0xd9, 0x00, 0x03, 0xef, 0x18, 0x67,
+ 0x8f, 0x31, 0x23, 0x10, 0x07, 0xe0, 0xdd, 0x80, 0xe9, 0xe5, 0x03, 0x5b,
+ 0x29, 0xb0, 0xee, 0x1b, 0x5c, 0x05, 0x5b, 0x0e, 0x34, 0x36, 0xce, 0x40,
+ 0x3f, 0x85, 0x4a, 0x3d, 0xa6, 0x33, 0xb2, 0xf9, 0xe2, 0xd4, 0xeb, 0xb1,
+ 0x48, 0x7f, 0xfe, 0x72, 0x59, 0xa0, 0x47, 0xcc, 0xe5, 0x11, 0x73, 0x9a,
+ 0x5a, 0x9f, 0x01, 0x44, 0xfa, 0xf1, 0x34, 0x59, 0xcb, 0xee, 0x98, 0x54,
+ 0x4b, 0x89, 0x86, 0x1a, 0x42, 0x39, 0x3e, 0x18, 0x76, 0xaa, 0x6d, 0xa1,
+ 0xe8, 0x5f, 0x1f, 0x63, 0x9d, 0xcc, 0x69, 0x91, 0x58, 0xe3, 0x62, 0x9d,
+ 0x0a, 0x4f, 0x9a, 0x2a, 0x06, 0x2b, 0xf8, 0x7c, 0xb0, 0xe5, 0x6c, 0x0e,
+ 0xb6, 0x6e, 0x80, 0x8a, 0x3d, 0xa1, 0x45, 0xf7, 0xa6, 0x43, 0x19, 0x85,
+ 0x88, 0xb5, 0x80, 0x19, 0xf1, 0x43, 0x3e, 0x00, 0x76, 0x38, 0xca, 0x28,
+ 0xc2, 0x0d, 0xe2, 0x79, 0xc1, 0x16, 0x72, 0x9b, 0x8e, 0xf2, 0xe1, 0x13,
+ 0x85, 0xf7, 0x0a, 0x2f, 0x5b, 0x47, 0x0f, 0x8a, 0xec, 0x73, 0xda, 0xab,
+ 0xe0, 0x8b, 0x01, 0x64, 0x69, 0xe0, 0xfe, 0x2a, 0x2a, 0x87, 0x54, 0x7f,
+ 0xb8, 0x4c, 0xde, 0x1a, 0x6c, 0x13, 0x8f, 0x01, 0xdc, 0x55, 0x7e, 0x67,
+ 0x88, 0x41, 0x52, 0x18, 0x70, 0x7f, 0x75, 0x85, 0x99, 0x91, 0xe2, 0x20,
+ 0xc8, 0x3e, 0xa8, 0xfd, 0xb2, 0x48, 0x00, 0x55, 0xd7, 0xfa, 0x04, 0xce,
+ 0x54, 0xfe, 0x00, 0xdb, 0xf8, 0x4a, 0x47, 0x69, 0x91, 0x6d, 0x93, 0xe2,
+ 0xde, 0xb2, 0x76, 0x42, 0xf0, 0x19, 0x46, 0xf4, 0x63, 0x75, 0xda, 0x58,
+ 0x6f, 0x13, 0xf1, 0xe7, 0x49, 0x06, 0x39, 0x0a, 0x05, 0x6c, 0xd1, 0x75,
+ 0xb6, 0x91, 0xca, 0x61, 0xbd, 0xa1, 0x73, 0x25, 0xd2, 0xc0, 0x56, 0x22,
+ 0xec, 0xd9, 0xad, 0x38, 0x19, 0x5f, 0x6b, 0x7a, 0x09, 0x11, 0xd8, 0xf4,
+ 0x17, 0x22, 0x7c, 0xc1, 0xa4, 0x4c, 0x04, 0x04, 0x5e, 0x17, 0x5c, 0xe2,
+ 0xd8, 0x02, 0x29, 0x8b, 0x36, 0x45, 0x9f, 0x61, 0xed, 0x3b, 0x33, 0x8e,
+ 0x1c, 0xdc, 0x9c, 0x70, 0x44, 0x99, 0x33, 0xd1, 0xc8, 0xff, 0xe0, 0x1b,
+ 0xcf, 0x06, 0xb1, 0x3d, 0x66, 0x9a, 0x85, 0x00, 0x4a, 0xf0, 0x94, 0xc6,
+ 0x33, 0xba, 0x90, 0x63, 0x35, 0x2b, 0x14, 0xeb, 0x9f, 0xa2, 0x29, 0x79,
+ 0x70, 0xcd, 0x48, 0xcb, 0x62, 0xcc, 0x83, 0xc6, 0xd1, 0x43, 0x8f, 0x5a,
+ 0x37, 0x98, 0x19, 0x05, 0x4c, 0x9a, 0xb9, 0x42, 0xcc, 0xe0, 0x6b, 0xf8,
+ 0x06, 0x38, 0xc4, 0x31, 0xc6, 0x59, 0xcc, 0x6c, 0xb5, 0x76, 0x53, 0x62,
+ 0x4b, 0x90, 0x3c, 0x92, 0x52, 0x81, 0x76, 0x74, 0xf7, 0x23, 0xa1, 0x41,
+ 0xe5, 0x17, 0x50, 0x24, 0x20, 0x86, 0x64, 0x5a, 0xf4, 0x21, 0x9e, 0x8f,
+ 0xb6, 0x25, 0xd0, 0xc1, 0x6c, 0x2c, 0xfd, 0x6a, 0x27, 0x11, 0x48, 0x55,
+ 0xa8, 0x48, 0x46, 0x2c, 0x86, 0xce, 0x78, 0xdb, 0x0f, 0x0a, 0x1d, 0x22,
+ 0x4e, 0x86, 0x48, 0xd9, 0x6c, 0xd8, 0xdb, 0x3e, 0xe0, 0x13, 0x59, 0xd9,
+ 0xe6, 0x9e, 0x74, 0xf2, 0x09, 0x32, 0x12, 0x9f, 0x1b, 0x80, 0xcf, 0x95,
+ 0x7d, 0x56, 0x60, 0x3e, 0x07, 0x9f, 0x29, 0xd4, 0x0b, 0x23, 0xee, 0xe8,
+ 0xec, 0x2c, 0x55, 0x7b, 0x64, 0x37, 0xb2, 0x7a, 0xe4, 0x88, 0x2c, 0xb1,
+ 0x33, 0x87, 0x98, 0xf9, 0x34, 0x25, 0xce, 0x68, 0x16, 0x6d, 0x32, 0x2c,
+ 0x52, 0x90, 0x28, 0x67, 0x25, 0xec, 0x29, 0x33, 0x85, 0x48, 0xcf, 0x2d,
+ 0x14, 0x8d, 0x06, 0xa8, 0xd8, 0x71, 0x7c, 0x44, 0x9a, 0x0f, 0xad, 0x6b,
+ 0x8c, 0x69, 0x56, 0x68, 0xaf, 0x6a, 0xf8, 0x39, 0x7d, 0x23, 0x51, 0x8e,
+ 0x8e, 0xdc, 0x3d, 0x6a, 0x9d, 0x6b, 0x44, 0x47, 0xfe, 0x0f, 0xbb, 0xc3,
+ 0xfc, 0x8a, 0x7a, 0xdd, 0xa4, 0x78, 0x98, 0x70, 0x24, 0xa7, 0x35, 0x53,
+ 0xdf, 0x80, 0x71, 0xfd, 0x43, 0xc1, 0x27, 0x79, 0x09, 0xa1, 0xd6, 0xe0,
+ 0x22, 0x46, 0xbb, 0xa2, 0x51, 0xa2, 0x67, 0xd3, 0x7c, 0x9c, 0x39, 0xa7,
+ 0x2a, 0x3a, 0x40, 0x50, 0x37, 0xb9, 0x79, 0xc2, 0x10, 0x13, 0x39, 0x44,
+ 0x29, 0xbb, 0x08, 0x98, 0x84, 0x54, 0x91, 0x13, 0xa7, 0x92, 0x75, 0x1f,
+ 0xb9, 0x7e, 0x8a, 0xdd, 0xd2, 0x31, 0x9a, 0x97, 0xf9, 0x7b, 0x32, 0xb0,
+ 0x61, 0x60, 0x93, 0x25, 0x5f, 0x22, 0xb5, 0xe6, 0x5c, 0x16, 0x4e, 0x27,
+ 0x14, 0xac, 0x31, 0xac, 0x2d, 0x1e, 0xb0, 0xd8, 0x50, 0x71, 0x3b, 0x7d,
+ 0x44, 0x98, 0xe4, 0xfb, 0x74, 0x7c, 0xe7, 0x05, 0xf0, 0xaf, 0x95, 0xaa,
+ 0x2f, 0xe8, 0x16, 0x09, 0xf4, 0x0b, 0x10, 0x8f, 0xb0, 0x8e, 0x25, 0xee,
+ 0xbd, 0x3a, 0x66, 0xd7, 0x4e, 0x2e, 0xc5, 0x0d, 0x53, 0x10, 0x6f, 0x8f,
+ 0x9c, 0x1e, 0x3c, 0x83, 0x25, 0x27, 0xcf, 0xa0, 0x39, 0xb8, 0x6f, 0xba,
+ 0x65, 0xe4, 0x3e, 0xf4, 0x82, 0xa2, 0x20, 0xce, 0x27, 0x7a, 0x7f, 0x66,
+ 0x9e, 0x7e, 0x12, 0xb6, 0x60, 0x3d, 0x54, 0x02, 0xee, 0x8b, 0x5f, 0x72,
+ 0x5d, 0x00, 0x59, 0x0c, 0x94, 0xe4, 0xc3, 0x52, 0xc7, 0xbf, 0x1c, 0x99,
+ 0x95, 0xa2, 0xb3, 0x9e, 0xe5, 0x1f, 0x86, 0x3a, 0xdf, 0xf6, 0xff, 0x76,
+ 0x92, 0x83, 0x4f, 0x38, 0xcf, 0x6c, 0xe6, 0xe6, 0x5b, 0x3c, 0x94, 0x29,
+ 0x35, 0x65, 0x69, 0x3f, 0xc0, 0x35, 0x46, 0xac, 0xf5, 0x21, 0x61, 0xc7,
+ 0xca, 0x22, 0xe8, 0xd9, 0x2a, 0x60, 0xcc, 0x9c, 0x6b, 0x51, 0xf5, 0x97,
+ 0x84, 0xfe, 0x00, 0xcb, 0x0d, 0xd5, 0x24, 0x60, 0x92, 0x8b, 0x15, 0xac,
+ 0x21, 0xc1, 0x50, 0xa2, 0x91, 0xe8, 0x3c, 0x33, 0x57, 0xc7, 0xd9, 0x14,
+ 0x28, 0x23, 0x11, 0x1e, 0x55, 0x42, 0xc9, 0xa4, 0x0c, 0xb4, 0x11, 0xaa,
+ 0x10, 0xbd, 0xba, 0xb2, 0x8c, 0xc7, 0xa8, 0xc9, 0x9a, 0xd0, 0x44, 0x6a,
+ 0x9e, 0x3d, 0xd0, 0xdc, 0xa8, 0x70, 0x59, 0x0c, 0x7a, 0x99, 0x80, 0x34,
+ 0x4b, 0xc1, 0x74, 0xd0, 0x9e, 0x21, 0xbe, 0x01, 0x92, 0x32, 0x98, 0xf9,
+ 0x87, 0xe6, 0x54, 0x94, 0x2c, 0xaa, 0x9b, 0x4c, 0xe5, 0xe6, 0xa4, 0xa5,
+ 0x55, 0xf7, 0xa0, 0xa5, 0xfb, 0xfc, 0xce, 0x6c, 0xcd, 0x16, 0xb2, 0xd2,
+ 0xd5, 0x15, 0xe9, 0xb7, 0xb2, 0x47, 0x0f, 0xa1, 0x10, 0x25, 0x95, 0x37,
+ 0x8c, 0xb8, 0x38, 0x8c, 0x00, 0x0c, 0xad, 0xe5, 0x7d, 0x08, 0x55, 0x68,
+ 0x26, 0x66, 0x88, 0x70, 0x03, 0xf6, 0x8e, 0xc2, 0x78, 0xb4, 0xfb, 0x5c,
+ 0x2a, 0x69, 0x6d, 0x62, 0x78, 0x09, 0xf8, 0x1f, 0x0d, 0x9b, 0x23, 0x56,
+ 0x23, 0xf2, 0x0e, 0x65, 0x5e, 0x73, 0xcc, 0x10, 0x45, 0x3c, 0x1a, 0xaa,
+ 0xd9, 0x74, 0x9e, 0x0c, 0x92, 0xa2, 0xe8, 0x27, 0xd4, 0xde, 0xfa, 0x38,
+ 0x81, 0xea, 0x8e, 0xe4, 0xd5, 0xe5, 0xab, 0x1e, 0x86, 0x2e, 0xd0, 0xc2,
+ 0x98, 0x31, 0x19, 0xd1, 0x28, 0xe3, 0x4c, 0x28, 0x33, 0x30, 0xd8, 0x0f,
+ 0x46, 0x5c, 0xc1, 0x84, 0x4c, 0xe7, 0x77, 0xc5, 0x3d, 0x60, 0xc4, 0x09,
+ 0x5e, 0x1a, 0xf3, 0x05, 0x8f, 0x21, 0x8a, 0x7e, 0x53, 0x5e, 0x54, 0xdf,
+ 0xeb, 0x01, 0x29, 0x09, 0x12, 0xfa, 0x3a, 0x1a, 0x61, 0xe5, 0x85, 0x0a,
+ 0x6b, 0xad, 0xa4, 0x60, 0x5f, 0xde, 0x3a, 0x57, 0x8f, 0x10, 0x20, 0x2a,
+ 0x25, 0x40, 0x54, 0x4d, 0xeb, 0x99, 0x68, 0x39, 0xab, 0x26, 0x27, 0x9d,
+ 0x44, 0x38, 0x52, 0x20, 0xf3, 0xe0, 0x71, 0xf7, 0xf6, 0xd2, 0x9d, 0x37,
+ 0x78, 0x3a, 0x96, 0x98, 0x88, 0x6a, 0xb5, 0x81, 0x8d, 0xa4, 0x22, 0x31,
+ 0x57, 0x19, 0x7b, 0x3b, 0xd6, 0xf2, 0xe7, 0x0a, 0x5e, 0x38, 0x44, 0x2c,
+ 0xf6, 0xc3, 0x3d, 0x5b, 0x47, 0xa6, 0x03, 0x5a, 0x37, 0x1e, 0x12, 0xf7,
+ 0xd9, 0x4c, 0x60, 0xea, 0x69, 0x5b, 0xd5, 0xee, 0x17, 0x95, 0xbf, 0x41,
+ 0x01, 0x28, 0xb0, 0x08, 0x90, 0x4a, 0x58, 0x59, 0x81, 0x48, 0x74, 0x29,
+ 0xa5, 0x30, 0xa8, 0xa1, 0x2d, 0x58, 0x1f, 0xde, 0x08, 0x12, 0x6f, 0x9e,
+ 0x3a, 0x2a, 0xc3, 0x9d, 0xc4, 0x44, 0x4a, 0x71, 0x32, 0xc4, 0xc7, 0x89,
+ 0x46, 0x61, 0x62, 0x0d, 0xdf, 0x17, 0xda, 0x74, 0x71, 0xee, 0x05, 0x91,
+ 0x9d, 0x6b, 0xc6, 0x2e, 0x48, 0xe9, 0xaf, 0x88, 0x52, 0xbc, 0x68, 0xaf,
+ 0x9f, 0x90, 0x8d, 0xe2, 0x93, 0x66, 0x0b, 0x4b, 0xe6, 0x45, 0xa6, 0x2b,
+ 0x12, 0xbc, 0xfe, 0xfc, 0x59, 0x08, 0xf6, 0x23, 0x99, 0x3d, 0xc6, 0x0b,
+ 0xe9, 0xb9, 0xa5, 0xe9, 0xd9, 0xd0, 0x6e, 0x94, 0x64, 0x23, 0x5a, 0x5e,
+ 0x84, 0x66, 0x93, 0x67, 0xd2, 0x11, 0x55, 0x37, 0x98, 0x4b, 0x48, 0xd1,
+ 0xd8, 0xe4, 0x07, 0x4d, 0x39, 0xd7, 0x68, 0x29, 0xe2, 0xe4, 0x24, 0xf0,
+ 0x7f, 0x52, 0x34, 0x84, 0x94, 0x3f, 0xb8, 0xb1, 0x87, 0x98, 0x70, 0x57,
+ 0xe2, 0xb6, 0x36, 0x79, 0x0d, 0x7b, 0x72, 0x82, 0xb2, 0xa7, 0xe6, 0xa5,
+ 0xf6, 0xa4, 0x52, 0xfc, 0x4c, 0xe8, 0x0c, 0x87, 0x14, 0x4c, 0x37, 0xce,
+ 0x1b, 0x23, 0x57, 0xb0, 0xc5, 0xc9, 0x72, 0x25, 0x8e, 0x0a, 0x66, 0x9e,
+ 0x6f, 0x0d, 0x55, 0x50, 0xfb, 0x0b, 0x45, 0x9a, 0x72, 0x06, 0x59, 0x5e,
+ 0xd9, 0x20, 0x63, 0xbb, 0x18, 0x0e, 0xa6, 0x72, 0xb4, 0x2f, 0x13, 0xf0,
+ 0x04, 0xdb, 0xfd, 0x51, 0x85, 0x3b, 0xfd, 0xb2, 0xdb, 0x45, 0x1a, 0x82,
+ 0x0a, 0xde, 0x40, 0xc2, 0x3f, 0x00, 0x06, 0x47, 0x25, 0x6d, 0x55, 0x74,
+ 0x46, 0x96, 0xb2, 0x52, 0x0c, 0x60, 0x80, 0x38, 0x9c, 0x81, 0x8c, 0xd4,
+ 0x30, 0x71, 0x8e, 0xb8, 0x7b, 0x98, 0xdd, 0xc8, 0xb0, 0xe1, 0xa8, 0x86,
+ 0x01, 0x99, 0x97, 0xac, 0xae, 0x54, 0xde, 0x92, 0xac, 0xff, 0xf2, 0xc3,
+ 0x86, 0x39, 0x80, 0x7f, 0xe0, 0xe7, 0xd3, 0x21, 0x4d, 0x40, 0xe5, 0x7d,
+ 0x56, 0x72, 0x17, 0x25, 0x3b, 0x87, 0x8d, 0x02, 0x81, 0x2f, 0x4f, 0xa4,
+ 0x35, 0xc0, 0x7e, 0x33, 0xcd, 0x88, 0x6a, 0xfd, 0xa1, 0x90, 0xe8, 0x3f,
+ 0x2c, 0x88, 0xc0, 0x8d, 0x93, 0xdb, 0x84, 0x4b, 0xdc, 0x63, 0xb7, 0x31,
+ 0x5d, 0x64, 0x22, 0x8f, 0xd9, 0x5c, 0x41, 0xec, 0xe8, 0x0f, 0xb0, 0x5c,
+ 0xe2, 0xac, 0x32, 0xbc, 0x52, 0x28, 0x8b, 0x6e, 0x3e, 0xfd, 0x16, 0x2c,
+ 0x32, 0xa7, 0x7f, 0x37, 0x9d, 0x3b, 0x2b, 0xca, 0xf4, 0xfd, 0xb7, 0x9b,
+ 0xf8, 0xfd, 0xdb, 0xf4, 0xd6, 0x1c, 0x11, 0x39, 0xf6, 0xfa, 0xf4, 0x6a,
+ 0x66, 0x04, 0x1f, 0x7d, 0xe1, 0x5b, 0x60, 0xcc, 0xa0, 0x4d, 0xe4, 0x93,
+ 0x6f, 0x37, 0xf1, 0x33, 0xac, 0x19, 0x37, 0x58, 0x69, 0xda, 0xd5, 0x34,
+ 0x96, 0xc6, 0xf1, 0x11, 0x2a, 0x42, 0x0f, 0xe9, 0xf3, 0x2f, 0xcd, 0x12,
+ 0x71, 0x3b, 0xb5, 0xad, 0x48, 0xc5, 0x95, 0x58, 0xff, 0x5c, 0xb5, 0x14,
+ 0x9c, 0x8c, 0xd7, 0xd9, 0x14, 0xb3, 0x06, 0xfd, 0x3e, 0x9b, 0x06, 0xf1,
+ 0x0d, 0x30, 0x27, 0xdd, 0xa2, 0x45, 0x35, 0x59, 0x16, 0xbd, 0xf5, 0xef,
+ 0x99, 0x61, 0x4c, 0x6f, 0xd3, 0x62, 0x98, 0xc7, 0xde, 0x6b, 0x8b, 0xb0,
+ 0xc4, 0x66, 0x07, 0xa3, 0x8e, 0x96, 0x7e, 0x51, 0xb7, 0x0d, 0x65, 0x2e,
+ 0xaf, 0xcc, 0xde, 0x30, 0xd7, 0xee, 0x5a, 0xaf, 0xfa, 0xff, 0x63, 0x96,
+ 0x65, 0xe3, 0xd8, 0x4b, 0x7f, 0x6a, 0xa3, 0xfd, 0x7c, 0x08, 0xa8, 0x28,
+ 0x7f, 0x7a, 0x7c, 0xe7, 0x29, 0xd4, 0xce, 0x1e, 0x8f, 0x8d, 0x94, 0x11,
+ 0x9d, 0xd9, 0x5f, 0xc0, 0x09, 0x59, 0x1d, 0x1b, 0x6c, 0xb5, 0x97, 0x79,
+ 0x0a, 0x09, 0xef, 0x8b, 0xd7, 0xff, 0x6d, 0x6a, 0xb8, 0x4c, 0xd2, 0x81,
+ 0x72, 0xde, 0x46, 0x86, 0xcd, 0xc7, 0x35, 0x2b, 0xd8, 0xcf, 0x86, 0xc1,
+ 0xab, 0xea, 0x1a, 0xbc, 0x9a, 0x1a, 0xa6, 0x96, 0x9c, 0x67, 0xef, 0x8a,
+ 0x32, 0x8b, 0x35, 0x76, 0xf9, 0xfa, 0xea, 0xcd, 0x92, 0x4d, 0xf9, 0xc5,
+ 0x7b, 0x62, 0x8d, 0xfd, 0xf8, 0x76, 0xc9, 0xa6, 0x7a, 0xc3, 0xdc, 0xec,
+ 0xeb, 0x7f, 0xcb, 0xe1, 0x52, 0xb4, 0x57, 0x57, 0x6f, 0x7e, 0xe8, 0xbd,
+ 0x5e, 0xb6, 0x31, 0xd3, 0xad, 0x57, 0xe9, 0x30, 0xde, 0x52, 0x67, 0x72,
+ 0x53, 0x4c, 0x80, 0xe6, 0x97, 0x6c, 0xec, 0xba, 0x18, 0x99, 0xc6, 0xcc,
+ 0xbe, 0x37, 0xe7, 0x4c, 0xac, 0xbd, 0xd7, 0xdd, 0xab, 0xce, 0x92, 0x4d,
+ 0xbd, 0x32, 0x3c, 0xc7, 0xe8, 0xfb, 0xa6, 0x6b, 0xc5, 0x38, 0x8b, 0x35,
+ 0xa6, 0x25, 0xf6, 0x2b, 0xb3, 0x33, 0xfe, 0xc7, 0x0c, 0x2a, 0xb8, 0xfe,
+ 0x30, 0xc9, 0x6f, 0x57, 0x57, 0xae, 0x3a, 0xcd, 0xe4, 0xd5, 0xec, 0xf7,
+ 0x51, 0x81, 0xbb, 0xf4, 0xe7, 0xac, 0x90, 0x02, 0x71, 0xcb, 0xbd, 0x5c,
+ 0x37, 0xfd, 0xea, 0xa7, 0x77, 0x9d, 0xeb, 0x8e, 0xe9, 0xc7, 0x7b, 0x73,
+ 0xce, 0x25, 0xeb, 0x17, 0x9d, 0x57, 0x97, 0x2f, 0xff, 0x99, 0xfc, 0x00,
+ 0x09, 0x11, 0x1b, 0xb1, 0x21, 0x5e, 0xcc, 0xfe, 0x33, 0x37, 0x7c, 0xdb,
+ 0x48, 0xda, 0x1f, 0xbd, 0xf2, 0x59, 0xcf, 0xea, 0x80, 0x61, 0x92, 0xe6,
+ 0x2c, 0x7d, 0x6d, 0x94, 0xa7, 0xe8, 0xaa, 0x0c, 0x8a, 0x9b, 0x6c, 0xc9,
+ 0x86, 0xcc, 0x96, 0x1b, 0x1a, 0x01, 0x2b, 0x79, 0xb3, 0x06, 0x9b, 0x2f,
+ 0x1b, 0x0e, 0x63, 0x0d, 0xfe, 0x0c, 0x90, 0x16, 0xd3, 0x69, 0x95, 0x8d,
+ 0xd5, 0x6e, 0x34, 0x94, 0xf6, 0xae, 0xee, 0xa1, 0xe4, 0x68, 0x94, 0x8d,
+ 0xf3, 0x7a, 0x2c, 0x3d, 0xda, 0xfb, 0x71, 0x72, 0x9d, 0x1b, 0xc5, 0x3a,
+ 0xd6, 0xd8, 0xb9, 0x91, 0xae, 0xcd, 0x01, 0x00, 0xbd, 0xaf, 0x6f, 0x6f,
+ 0x53, 0x1d, 0x37, 0xcb, 0x1c, 0xe9, 0xfd, 0x62, 0x92, 0xc1, 0x99, 0x1e,
+ 0x78, 0x3f, 0xbc, 0xe3, 0xbd, 0x0b, 0x51, 0xb7, 0x91, 0xb3, 0xdd, 0x2a,
+ 0xe3, 0x52, 0x26, 0x30, 0x7e, 0x02, 0x7b, 0x27, 0xbe, 0x3b, 0xd4, 0x6d,
+ 0xd3, 0xab, 0x2b, 0xb1, 0x93, 0x1d, 0x9a, 0x57, 0xe6, 0x6e, 0x7c, 0xe8,
+ 0x07, 0x31, 0x22, 0x62, 0xda, 0x3e, 0x08, 0x5d, 0x4a, 0x5c, 0xe0, 0x97,
+ 0x43, 0x39, 0x63, 0xea, 0x0d, 0xe4, 0xcd, 0x2e, 0x3a, 0x84, 0x97, 0xe1,
+ 0x94, 0x71, 0xaa, 0x98, 0xc7, 0xe0, 0x73, 0x43, 0xb4, 0x9d, 0x19, 0x58,
+ 0xce, 0xa3, 0x64, 0x5b, 0xbe, 0x4f, 0xfe, 0x9e, 0x19, 0x86, 0xba, 0xec,
+ 0x26, 0xc0, 0x83, 0xb8, 0x00, 0x86, 0x29, 0xcd, 0xd5, 0xdd, 0x69, 0x24,
+ 0x64, 0x23, 0x57, 0x9e, 0x4d, 0x8a, 0xc7, 0xf1, 0x73, 0x4e, 0xcf, 0xcf,
+ 0x7c, 0x56, 0x5d, 0x4d, 0xcd, 0x35, 0x38, 0x89, 0x8d, 0xf8, 0xdb, 0x9f,
+ 0x2e, 0x3c, 0xf0, 0x81, 0xe8, 0xbb, 0xc5, 0x63, 0x1a, 0xed, 0xf2, 0xbb,
+ 0x6c, 0x86, 0xf6, 0xfd, 0x97, 0x08, 0x6a, 0x30, 0x58, 0x7a, 0x67, 0x62,
+ 0xab, 0xbd, 0x0f, 0x83, 0x6c, 0x54, 0x44, 0xdb, 0x35, 0xc4, 0x77, 0x55,
+ 0x0c, 0x67, 0x24, 0x3a, 0x1b, 0x2a, 0x7c, 0x28, 0x04, 0x94, 0x64, 0xd9,
+ 0xad, 0x6f, 0x28, 0x07, 0x08, 0xb6, 0x2c, 0x8b, 0xda, 0x13, 0x63, 0x5a,
+ 0x3d, 0x31, 0x48, 0x8c, 0x2b, 0x5a, 0x4b, 0x4a, 0x72, 0x9d, 0xc9, 0x38,
+ 0x9d, 0x0d, 0x8c, 0xb8, 0x66, 0x8e, 0x4c, 0xa8, 0x9e, 0x15, 0x39, 0xe4,
+ 0xce, 0x5e, 0xfd, 0xb9, 0x57, 0xcc, 0x3d, 0xf8, 0x8c, 0x1c, 0xca, 0x85,
+ 0xef, 0x62, 0x6c, 0x5b, 0x04, 0xa0, 0x2b, 0x62, 0x03, 0x3d, 0xde, 0x78,
+ 0xbd, 0xe5, 0x04, 0xbd, 0x62, 0x9c, 0x62, 0x06, 0x8b, 0xd1, 0x19, 0xcb,
+ 0xfb, 0xcf, 0x41, 0xae, 0xcf, 0x3d, 0xa2, 0x2a, 0x53, 0x37, 0x67, 0x96,
+ 0x50, 0xb1, 0x7d, 0x9d, 0x65, 0x83, 0x21, 0x64, 0x91, 0xd4, 0xb1, 0x67,
+ 0xa8, 0x12, 0x9e, 0xa5, 0x93, 0xfe, 0x7d, 0xd2, 0x31, 0x74, 0xd1, 0x07,
+ 0x1b, 0x79, 0xb9, 0xf4, 0x2b, 0x8c, 0x64, 0x94, 0x0f, 0x92, 0x37, 0x13,
+ 0x50, 0x7d, 0x07, 0xb1, 0x37, 0x18, 0xb1, 0xbe, 0x6f, 0x94, 0xe2, 0xf7,
+ 0xb0, 0x54, 0x4b, 0x4d, 0xc8, 0xcb, 0xec, 0x11, 0x0e, 0x27, 0xb3, 0x81,
+ 0xc7, 0x71, 0x29, 0xe4, 0xdd, 0x92, 0x0d, 0xbd, 0xcb, 0xb1, 0x53, 0xc9,
+ 0x75, 0x71, 0x13, 0xe7, 0x69, 0x3f, 0x8d, 0x73, 0xb4, 0xd7, 0x4f, 0xd1,
+ 0xec, 0x6c, 0x08, 0x60, 0x7c, 0x33, 0x9b, 0xdc, 0xdd, 0x3f, 0x63, 0xec,
+ 0xc8, 0x34, 0x7f, 0xce, 0x8c, 0xc2, 0x5a, 0x33, 0xfa, 0x2a, 0xb3, 0x99,
+ 0xc7, 0xb6, 0x7e, 0xce, 0xc7, 0xd3, 0x58, 0x2b, 0x2f, 0xb3, 0x8f, 0xe6,
+ 0xc0, 0x58, 0xb2, 0xa1, 0xd7, 0x20, 0xb5, 0x8c, 0x93, 0x5f, 0xd2, 0x61,
+ 0x9c, 0x40, 0x17, 0xee, 0x8e, 0xba, 0x86, 0x2f, 0x26, 0xe9, 0xf8, 0xff,
+ 0x5b, 0x98, 0x93, 0x92, 0x2b, 0x6b, 0x47, 0x39, 0x88, 0x39, 0xb0, 0x92,
+ 0x6b, 0x29, 0x36, 0x9a, 0x67, 0x35, 0x7b, 0xaf, 0x87, 0x56, 0x37, 0xc3,
+ 0x1f, 0xcb, 0xe9, 0x92, 0x1b, 0xef, 0xdf, 0x8a, 0xf1, 0xdd, 0x53, 0x9e,
+ 0xfc, 0xcf, 0xfb, 0x22, 0xfa, 0xde, 0x37, 0x86, 0xc4, 0x86, 0xd9, 0x9f,
+ 0x97, 0x30, 0x22, 0x02, 0xc5, 0x5b, 0x04, 0x1e, 0x41, 0x1e, 0x01, 0x5e,
+ 0xbb, 0x2a, 0xc2, 0x55, 0xc0, 0x48, 0x40, 0x72, 0x90, 0x10, 0x2b, 0xb6,
+ 0xb8, 0xa0, 0x91, 0x72, 0x9e, 0x49, 0x12, 0xcc, 0x91, 0x9b, 0x5b, 0x07,
+ 0x60, 0x34, 0x01, 0x31, 0xa4, 0xf5, 0x61, 0x67, 0xbb, 0x3d, 0x98, 0x9a,
+ 0x4e, 0x98, 0x1f, 0xe1, 0xc2, 0xea, 0xca, 0xf9, 0xf5, 0x39, 0x59, 0x26,
+ 0x25, 0xc5, 0x19, 0x3c, 0x61, 0xcf, 0x6e, 0x97, 0x92, 0xe0, 0xb0, 0x79,
+ 0xa8, 0x6e, 0x7b, 0xea, 0x19, 0x7c, 0xc4, 0xf2, 0x69, 0xad, 0xfe, 0x2c,
+ 0xd0, 0xfc, 0x78, 0x6d, 0x64, 0x1e, 0x76, 0x6c, 0x95, 0x28, 0xa0, 0x08,
+ 0x18, 0x8b, 0x35, 0xba, 0x51, 0xe1, 0x46, 0x25, 0xd2, 0xd0, 0x98, 0xe7,
+ 0x27, 0x0c, 0x07, 0x9d, 0x6b, 0x7f, 0x2c, 0x87, 0x8d, 0x53, 0xf5, 0x45,
+ 0xaa, 0x62, 0x2e, 0x3d, 0x4a, 0x58, 0x3c, 0xd7, 0x92, 0xfe, 0xc6, 0x4d,
+ 0xb1, 0xa9, 0x7e, 0xd9, 0xf6, 0xa4, 0x6a, 0xec, 0x4e, 0x46, 0x2d, 0xfa,
+ 0xdf, 0x65, 0xba, 0xfe, 0x71, 0xf5, 0xf2, 0x3a, 0x29, 0xa7, 0x4f, 0xc3,
+ 0xac, 0xbc, 0xcf, 0xb2, 0x69, 0xd9, 0x4e, 0x70, 0xd6, 0xde, 0x9e, 0x5f,
+ 0xc8, 0xa4, 0xb1, 0x30, 0xa9, 0xa7, 0xac, 0x9e, 0x2a, 0xa6, 0x83, 0x9b,
+ 0xf6, 0x6c, 0xd6, 0x2e, 0xb3, 0xcd, 0xff, 0xc7, 0x7f, 0xa6, 0xe3, 0x4d,
+ 0xb3, 0x4c, 0xc3, 0x9d, 0x87, 0x12, 0x96, 0xcb, 0xf4, 0x80, 0xbf, 0xc9,
+ 0xab, 0x6f, 0xa9, 0xa2, 0x32, 0x99, 0x33, 0x52, 0x8a, 0x7b, 0x30, 0xc2,
+ 0xd4, 0x04, 0x5e, 0x06, 0x68, 0x08, 0x75, 0x79, 0x81, 0x9b, 0x37, 0x86,
+ 0x21, 0x03, 0xec, 0xac, 0x99, 0x1e, 0xf3, 0xfd, 0xff, 0x07, 0x16, 0xc3,
+ 0xc4, 0x74, 0xbe, 0x14, 0x03, 0x00
+};
+unsigned int t2_gz_len = 53802;
+unsigned int t2_gz_header_len = 18;
+unsigned char t2[] = {
+ 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x3d, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x69, 0x73, 0x6f, 0x2d, 0x38, 0x38,
+ 0x35, 0x39, 0x2d, 0x31, 0x22, 0x3f, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x44,
+ 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x73, 0x70, 0x65, 0x63, 0x20,
+ 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57,
+ 0x33, 0x43, 0x2f, 0x2f, 0x44, 0x54, 0x44, 0x20, 0x53, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x32,
+ 0x2e, 0x31, 0x2f, 0x2f, 0x45, 0x4e, 0x22, 0x0d, 0x0a, 0x20, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x31, 0x39, 0x39,
+ 0x38, 0x2f, 0x30, 0x36, 0x2f, 0x78, 0x6d, 0x6c, 0x73, 0x70, 0x65, 0x63,
+ 0x2d, 0x76, 0x32, 0x31, 0x2e, 0x64, 0x74, 0x64, 0x22, 0x20, 0x5b, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x41, 0x72, 0x62, 0x6f, 0x72, 0x54, 0x65,
+ 0x78, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x2c, 0x20, 0x31, 0x39,
+ 0x38, 0x38, 0x2d, 0x32, 0x30, 0x30, 0x30, 0x2c, 0x20, 0x76, 0x2e, 0x34,
+ 0x30, 0x30, 0x32, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e,
+ 0x54, 0x49, 0x54, 0x59, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x69, 0x64,
+ 0x65, 0x6e, 0x74, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54,
+ 0x52, 0x2f, 0x32, 0x30, 0x30, 0x30, 0x2f, 0x52, 0x45, 0x43, 0x2d, 0x78,
+ 0x6d, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49,
+ 0x54, 0x59, 0x20, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2e, 0x6d, 0x6f, 0x6e,
+ 0x74, 0x68, 0x20, 0x22, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20,
+ 0x64, 0x72, 0x61, 0x66, 0x74, 0x2e, 0x64, 0x61, 0x79, 0x20, 0x22, 0x36,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59,
+ 0x20, 0x69, 0x73, 0x6f, 0x36, 0x2e, 0x64, 0x6f, 0x63, 0x2e, 0x64, 0x61,
+ 0x74, 0x65, 0x20, 0x22, 0x32, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59,
+ 0x20, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2e, 0x79, 0x65, 0x61, 0x72, 0x20,
+ 0x22, 0x32, 0x30, 0x30, 0x30, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45,
+ 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x4f, 0x66, 0x58, 0x4d, 0x4c, 0x20, 0x22, 0x31, 0x2e, 0x30, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20,
+ 0x70, 0x69, 0x6f, 0x20, 0x22, 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x3f, 0x78,
+ 0x6d, 0x6c, 0x27, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54,
+ 0x49, 0x54, 0x59, 0x20, 0x64, 0x6f, 0x63, 0x2e, 0x64, 0x61, 0x74, 0x65,
+ 0x20, 0x22, 0x31, 0x30, 0x20, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
+ 0x79, 0x20, 0x31, 0x39, 0x39, 0x38, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21,
+ 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x77, 0x33, 0x63, 0x2e, 0x64,
+ 0x6f, 0x63, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x20, 0x22, 0x30, 0x32, 0x2d,
+ 0x46, 0x65, 0x62, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x57, 0x65, 0x62,
+ 0x53, 0x47, 0x4d, 0x4c, 0x20, 0x22, 0x57, 0x65, 0x62, 0x53, 0x47, 0x4d,
+ 0x4c, 0x20, 0x41, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x41, 0x6e, 0x6e, 0x65, 0x78, 0x20, 0x74, 0x6f, 0x20, 0x49,
+ 0x53, 0x4f, 0x20, 0x38, 0x38, 0x37, 0x39, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x70, 0x69, 0x63, 0x20,
+ 0x22, 0x27, 0x3f, 0x3e, 0x27, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45,
+ 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x62, 0x72, 0x20, 0x22, 0x5c, 0x6e,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59,
+ 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x22, 0x23,
+ 0x63, 0x30, 0x64, 0x39, 0x63, 0x30, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21,
+ 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x6d, 0x64, 0x61, 0x73, 0x68,
+ 0x20, 0x22, 0x2d, 0x2d, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e,
+ 0x54, 0x49, 0x54, 0x59, 0x20, 0x63, 0x6f, 0x6d, 0x20, 0x22, 0x2d, 0x2d,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59,
+ 0x20, 0x63, 0x6f, 0x6d, 0x6f, 0x20, 0x22, 0x2d, 0x2d, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x63, 0x6f,
+ 0x6d, 0x63, 0x20, 0x22, 0x2d, 0x2d, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21,
+ 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x68, 0x63, 0x72, 0x6f, 0x20,
+ 0x22, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x78, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x6e, 0x62, 0x73,
+ 0x70, 0x20, 0x22, 0x26, 0x23, 0x31, 0x36, 0x30, 0x3b, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x6d, 0x61,
+ 0x67, 0x69, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x22, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x61, 0x6d, 0x70, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x2c, 0x0d, 0x0a, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x6c, 0x74,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x2c, 0x0d, 0x0a, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x61, 0x70,
+ 0x6f, 0x73, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2c, 0x0d, 0x0a,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x71, 0x75, 0x6f, 0x74, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45,
+ 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x64, 0x6f, 0x63, 0x2e, 0x61, 0x75,
+ 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x22, 0x70, 0x75, 0x62, 0x6c,
+ 0x69, 0x63, 0x20, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59,
+ 0x20, 0x64, 0x6f, 0x63, 0x2e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x22, 0x6d, 0x61, 0x79, 0x20, 0x62,
+ 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x64, 0x20, 0x66, 0x72, 0x65, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x61, 0x73,
+ 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x73, 0x0d, 0x0a, 0x61, 0x6c,
+ 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c,
+ 0x65, 0x67, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73,
+ 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x61,
+ 0x63, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x5d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73,
+ 0x70, 0x65, 0x63, 0x20, 0x77, 0x33, 0x63, 0x2d, 0x64, 0x6f, 0x63, 0x74,
+ 0x79, 0x70, 0x65, 0x3d, 0x22, 0x72, 0x65, 0x63, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x21, 0x2d, 0x2d, 0x0d, 0x0a, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x20,
+ 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65,
+ 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+ 0x3a, 0x0d, 0x0a, 0x0d, 0x0a, 0x2d, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x65,
+ 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x2e, 0x0d, 0x0a, 0x2d, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
+ 0x20, 0x44, 0x54, 0x44, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20,
+ 0x74, 0x6f, 0x20, 0x56, 0x32, 0x2e, 0x31, 0x20, 0x6f, 0x66, 0x20, 0x58,
+ 0x4d, 0x4c, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x0d, 0x0a, 0x2d, 0x20, 0x4d,
+ 0x6f, 0x76, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d,
+ 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x20, 0x74, 0x6f, 0x20,
+ 0x3c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x20,
+ 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x22, 0x73, 0x65, 0x63, 0x6f,
+ 0x6e, 0x64, 0x20, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20,
+ 0x77, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x20, 0x4d, 0x65,
+ 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x64, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74,
+ 0x61, 0x74, 0x75, 0x73, 0x2e, 0x0d, 0x0a, 0x2d, 0x20, 0x52, 0x65, 0x6d,
+ 0x6f, 0x76, 0x65, 0x64, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
+ 0x3d, 0x22, 0x26, 0x63, 0x65, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3b,
+ 0x22, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73,
+ 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x74,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e,
+ 0x0d, 0x0a, 0x2d, 0x20, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x64,
+ 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x2c, 0x20, 0x73, 0x6f,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61,
+ 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2c,
+ 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x0d, 0x0a,
+ 0x20, 0x20, 0x74, 0x6f, 0x20, 0x57, 0x33, 0x43, 0x20, 0x67, 0x75, 0x69,
+ 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x2d, 0x20,
+ 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x6d, 0x65,
+ 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x73, 0x20, 0x74, 0x6f, 0x20,
+ 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x73, 0x20,
+ 0x69, 0x6e, 0x20, 0x62, 0x69, 0x62, 0x6c, 0x69, 0x6f, 0x67, 0x72, 0x61,
+ 0x70, 0x68, 0x79, 0x2e, 0x0d, 0x0a, 0x2d, 0x20, 0x43, 0x68, 0x61, 0x6e,
+ 0x67, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x61, 0x74, 0x3e,
+ 0x20, 0x65, 0x74, 0x63, 0x2e, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67,
+ 0x68, 0x6f, 0x75, 0x74, 0x3b, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20,
+ 0x75, 0x73, 0x65, 0x64, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x76, 0x61, 0x6c,
+ 0x3e, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+ 0x64, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x3c,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x73, 0x20, 0x62, 0x65, 0x63, 0x61,
+ 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x79, 0x6c,
+ 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75,
+ 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x2e, 0x0d, 0x0a, 0x2d,
+ 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x6d,
+ 0x65, 0x20, 0x73, 0x70, 0x75, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x2d, 0x20, 0x41, 0x64,
+ 0x64, 0x65, 0x64, 0x20, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x74,
+ 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e,
+ 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6c, 0x69,
+ 0x73, 0x74, 0x2e, 0x0d, 0x0a, 0x2d, 0x20, 0x41, 0x64, 0x64, 0x65, 0x64,
+ 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x73, 0x20, 0x62, 0x65, 0x74, 0x77,
+ 0x65, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75,
+ 0x61, 0x6c, 0x20, 0x3c, 0x74, 0x68, 0x69, 0x73, 0x76, 0x65, 0x72, 0x3e,
+ 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x62,
+ 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x0d, 0x0a, 0x20, 0x20, 0x77, 0x68,
+ 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20,
+ 0x6e, 0x6f, 0x77, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63,
+ 0x61, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x0d, 0x0a,
+ 0x2d, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x3c, 0x65, 0x67, 0x3e,
+ 0x73, 0x2c, 0x20, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x73, 0x2c,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f,
+ 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x70,
+ 0x3e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e,
+ 0x65, 0x72, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x0d, 0x0a, 0x20, 0x20, 0x63,
+ 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0d, 0x0a,
+ 0x2d, 0x20, 0x52, 0x65, 0x76, 0x69, 0x73, 0x65, 0x64, 0x20, 0x53, 0x74,
+ 0x61, 0x74, 0x75, 0x73, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x20,
+ 0x6e, 0x65, 0x77, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x0d,
+ 0x0a, 0x2d, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x6c,
+ 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x73, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20,
+ 0x67, 0x65, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72,
+ 0x6d, 0x65, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x6c, 0x79,
+ 0x3b, 0x20, 0x61, 0x74, 0x0d, 0x0a, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74,
+ 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x74,
+ 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x72, 0x6f,
+ 0x62, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74,
+ 0x6f, 0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
+ 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x0d, 0x0a, 0x20, 0x20,
+ 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70,
+ 0x2e, 0x0d, 0x0a, 0x2d, 0x20, 0x49, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f,
+ 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x20, 0x28, 0x62, 0x61, 0x72, 0x72, 0x69, 0x6e,
+ 0x67, 0x20, 0x6f, 0x62, 0x73, 0x6f, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20,
+ 0x6f, 0x6e, 0x65, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x61, 0x64,
+ 0x64, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x20, 0x74, 0x6f,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x73, 0x3b, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x7b, 0x61, 0x64, 0x64, 0x7c, 0x63, 0x68, 0x67, 0x7c, 0x64,
+ 0x65, 0x6c, 0x7d, 0x22, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x65, 0x78,
+ 0x70, 0x65, 0x63, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x20,
+ 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20,
+ 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x20, 0x0d, 0x0a, 0x20,
+ 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x73, 0x75,
+ 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x0d, 0x0a, 0x2d,
+ 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x45, 0x78, 0x74,
+ 0x65, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x72, 0x6b,
+ 0x75, 0x70, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20,
+ 0x28, 0x58, 0x4d, 0x4c, 0x29, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3e,
+ 0x31, 0x2e, 0x30, 0x20, 0x28, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20,
+ 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3c, 0x2f, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x33, 0x63,
+ 0x2d, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x3e, 0x52, 0x45, 0x43, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x26, 0x69, 0x73,
+ 0x6f, 0x36, 0x2e, 0x64, 0x6f, 0x63, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x3b,
+ 0x3c, 0x2f, 0x77, 0x33, 0x63, 0x2d, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x33, 0x63,
+ 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x3e, 0x57, 0x33, 0x43,
+ 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x77, 0x33, 0x63, 0x2d, 0x64, 0x6f, 0x63,
+ 0x74, 0x79, 0x70, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x75, 0x62, 0x64,
+ 0x61, 0x74, 0x65, 0x3e, 0x3c, 0x64, 0x61, 0x79, 0x3e, 0x26, 0x64, 0x72,
+ 0x61, 0x66, 0x74, 0x2e, 0x64, 0x61, 0x79, 0x3b, 0x3c, 0x2f, 0x64, 0x61,
+ 0x79, 0x3e, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x26, 0x64, 0x72,
+ 0x61, 0x66, 0x74, 0x2e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3b, 0x3c, 0x2f,
+ 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x3c, 0x79, 0x65, 0x61, 0x72, 0x3e,
+ 0x26, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2e, 0x79, 0x65, 0x61, 0x72, 0x3b,
+ 0x3c, 0x2f, 0x79, 0x65, 0x61, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70,
+ 0x75, 0x62, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x75,
+ 0x62, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x26, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x69, 0x64,
+ 0x65, 0x6e, 0x74, 0x3b, 0x2d, 0x26, 0x69, 0x73, 0x6f, 0x36, 0x2e, 0x64,
+ 0x6f, 0x63, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x3b, 0x22, 0x3e, 0x26, 0x68,
+ 0x74, 0x74, 0x70, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x3b, 0x2d, 0x26,
+ 0x69, 0x73, 0x6f, 0x36, 0x2e, 0x64, 0x6f, 0x63, 0x2e, 0x64, 0x61, 0x74,
+ 0x65, 0x3b, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x28, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x26, 0x68,
+ 0x74, 0x74, 0x70, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x3b, 0x2d, 0x26,
+ 0x69, 0x73, 0x6f, 0x36, 0x2e, 0x64, 0x6f, 0x63, 0x2e, 0x64, 0x61, 0x74,
+ 0x65, 0x3b, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x58, 0x48, 0x54,
+ 0x4d, 0x4c, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2c, 0x20, 0x3c, 0x6c,
+ 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x26, 0x68, 0x74,
+ 0x74, 0x70, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x3b, 0x2d, 0x26, 0x69,
+ 0x73, 0x6f, 0x36, 0x2e, 0x64, 0x6f, 0x63, 0x2e, 0x64, 0x61, 0x74, 0x65,
+ 0x3b, 0x2e, 0x78, 0x6d, 0x6c, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x2c, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x26, 0x68, 0x74, 0x74, 0x70, 0x2d,
+ 0x69, 0x64, 0x65, 0x6e, 0x74, 0x3b, 0x2d, 0x26, 0x69, 0x73, 0x6f, 0x36,
+ 0x2e, 0x64, 0x6f, 0x63, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x3b, 0x2e, 0x70,
+ 0x64, 0x66, 0x22, 0x3e, 0x50, 0x44, 0x46, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x2c, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x26, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x69, 0x64, 0x65, 0x6e,
+ 0x74, 0x3b, 0x2d, 0x26, 0x69, 0x73, 0x6f, 0x36, 0x2e, 0x64, 0x6f, 0x63,
+ 0x2e, 0x64, 0x61, 0x74, 0x65, 0x3b, 0x2d, 0x72, 0x65, 0x76, 0x69, 0x65,
+ 0x77, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x58, 0x48, 0x54, 0x4d,
+ 0x4c, 0x0d, 0x0a, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2d, 0x63,
+ 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
+ 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x73,
+ 0x29, 0x3c, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x6c, 0x6f, 0x63, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x52, 0x45, 0x43, 0x2d, 0x78,
+ 0x6d, 0x6c, 0x22, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52,
+ 0x2f, 0x52, 0x45, 0x43, 0x2d, 0x78, 0x6d, 0x6c, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x65, 0x76, 0x6c, 0x6f, 0x63,
+ 0x73, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x32, 0x30,
+ 0x30, 0x30, 0x2f, 0x57, 0x44, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x32, 0x65,
+ 0x2d, 0x32, 0x30, 0x30, 0x30, 0x30, 0x38, 0x31, 0x34, 0x22, 0x3e, 0x20,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x32, 0x30, 0x30,
+ 0x30, 0x2f, 0x57, 0x44, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x32, 0x65, 0x2d,
+ 0x32, 0x30, 0x30, 0x30, 0x30, 0x38, 0x31, 0x34, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f,
+ 0x31, 0x39, 0x39, 0x38, 0x2f, 0x52, 0x45, 0x43, 0x2d, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x22, 0x3e, 0x20,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x31, 0x39, 0x39,
+ 0x38, 0x2f, 0x52, 0x45, 0x43, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x3c, 0x21, 0x2d, 0x2d, 0x0d, 0x0a, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54,
+ 0x52, 0x2f, 0x50, 0x52, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x39, 0x37, 0x31,
+ 0x32, 0x30, 0x38, 0x27, 0x3e, 0x0d, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x54, 0x52, 0x2f, 0x50, 0x52, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x39,
+ 0x37, 0x31, 0x32, 0x30, 0x38, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x57, 0x44, 0x2d,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x39, 0x36, 0x31, 0x31, 0x31, 0x34, 0x27, 0x3e,
+ 0x0d, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x57,
+ 0x44, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x39, 0x36, 0x31, 0x31, 0x31, 0x34,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x54, 0x52, 0x2f, 0x57, 0x44, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x6c,
+ 0x61, 0x6e, 0x67, 0x2d, 0x39, 0x37, 0x30, 0x33, 0x33, 0x31, 0x27, 0x3e,
+ 0x0d, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x57,
+ 0x44, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x6c, 0x61, 0x6e, 0x67, 0x2d, 0x39,
+ 0x37, 0x30, 0x33, 0x33, 0x31, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x57, 0x44, 0x2d,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x6c, 0x61, 0x6e, 0x67, 0x2d, 0x39, 0x37, 0x30,
+ 0x36, 0x33, 0x30, 0x27, 0x3e, 0x0d, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x54, 0x52, 0x2f, 0x57, 0x44, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x6c,
+ 0x61, 0x6e, 0x67, 0x2d, 0x39, 0x37, 0x30, 0x36, 0x33, 0x30, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54,
+ 0x52, 0x2f, 0x57, 0x44, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x39, 0x37, 0x30,
+ 0x38, 0x30, 0x37, 0x27, 0x3e, 0x0d, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x54, 0x52, 0x2f, 0x57, 0x44, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x39,
+ 0x37, 0x30, 0x38, 0x30, 0x37, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x57, 0x44, 0x2d,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x39, 0x37, 0x31, 0x31, 0x31, 0x37, 0x27, 0x3e,
+ 0x0d, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x57,
+ 0x44, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x39, 0x37, 0x31, 0x31, 0x31, 0x37,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2d, 0x2d, 0x3e, 0x20, 0x3c, 0x2f,
+ 0x70, 0x72, 0x65, 0x76, 0x6c, 0x6f, 0x63, 0x73, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x61, 0x75, 0x74, 0x68, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x31, 0x65, 0x22, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x54,
+ 0x69, 0x6d, 0x20, 0x42, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x54, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x74,
+ 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x4e, 0x65, 0x74, 0x73, 0x63, 0x61,
+ 0x70, 0x65, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6d, 0x61, 0x69, 0x6c, 0x74,
+ 0x6f, 0x3a, 0x74, 0x62, 0x72, 0x61, 0x79, 0x40, 0x74, 0x65, 0x78, 0x74,
+ 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0x3e,
+ 0x74, 0x62, 0x72, 0x61, 0x79, 0x40, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61,
+ 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x3c, 0x2f, 0x65, 0x6d,
+ 0x61, 0x69, 0x6c, 0x3e, 0x3c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x31, 0x65, 0x22, 0x3e, 0x3c, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3e, 0x4a, 0x65, 0x61, 0x6e, 0x20, 0x50, 0x61, 0x6f, 0x6c,
+ 0x69, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66,
+ 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x4d, 0x69, 0x63,
+ 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69,
+ 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x65,
+ 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6d,
+ 0x61, 0x69, 0x6c, 0x74, 0x6f, 0x3a, 0x6a, 0x65, 0x61, 0x6e, 0x70, 0x61,
+ 0x40, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63,
+ 0x6f, 0x6d, 0x22, 0x3e, 0x6a, 0x65, 0x61, 0x6e, 0x70, 0x61, 0x40, 0x6d,
+ 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x3c, 0x2f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x3e, 0x3c, 0x2f, 0x61, 0x75,
+ 0x74, 0x68, 0x6f, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x61, 0x75, 0x74, 0x68,
+ 0x6f, 0x72, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x31, 0x65, 0x22,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e,
+ 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x43, 0x2e, 0x20, 0x4d, 0x2e, 0x20,
+ 0x53, 0x70, 0x65, 0x72, 0x62, 0x65, 0x72, 0x67, 0x2d, 0x4d, 0x63, 0x51,
+ 0x75, 0x65, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c,
+ 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e,
+ 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x0d, 0x0a,
+ 0x6f, 0x66, 0x20, 0x49, 0x6c, 0x6c, 0x69, 0x6e, 0x6f, 0x69, 0x73, 0x20,
+ 0x61, 0x74, 0x20, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x54, 0x65, 0x78, 0x74, 0x20, 0x45, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74,
+ 0x69, 0x76, 0x65, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x6f,
+ 0x3a, 0x63, 0x6d, 0x73, 0x6d, 0x63, 0x71, 0x40, 0x75, 0x69, 0x63, 0x2e,
+ 0x65, 0x64, 0x75, 0x22, 0x3e, 0x63, 0x6d, 0x73, 0x6d, 0x63, 0x71, 0x40,
+ 0x75, 0x69, 0x63, 0x2e, 0x65, 0x64, 0x75, 0x3c, 0x2f, 0x65, 0x6d, 0x61,
+ 0x69, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f,
+ 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x32, 0x65, 0x22, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3e, 0x45, 0x76, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x65, 0x72,
+ 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69,
+ 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x53, 0x75, 0x6e, 0x20,
+ 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+ 0x2c, 0x0d, 0x0a, 0x49, 0x6e, 0x63, 0x2e, 0x3c, 0x2f, 0x61, 0x66, 0x66,
+ 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x65, 0x6d,
+ 0x61, 0x69, 0x6c, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6d, 0x61,
+ 0x69, 0x6c, 0x74, 0x6f, 0x3a, 0x65, 0x6c, 0x6d, 0x40, 0x65, 0x61, 0x73,
+ 0x74, 0x2e, 0x73, 0x75, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0x3e, 0x65,
+ 0x76, 0x65, 0x2e, 0x6d, 0x61, 0x6c, 0x65, 0x72, 0x40, 0x65, 0x61, 0x73,
+ 0x74, 0x2e, 0x73, 0x75, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x3c, 0x2f, 0x65,
+ 0x6d, 0x61, 0x69, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x61, 0x75, 0x74,
+ 0x68, 0x6f, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x61, 0x75, 0x74, 0x68,
+ 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x61, 0x62, 0x73, 0x74,
+ 0x72, 0x61, 0x63, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68,
+ 0x65, 0x20, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x4c, 0x61, 0x6e, 0x67,
+ 0x75, 0x61, 0x67, 0x65, 0x20, 0x28, 0x58, 0x4d, 0x4c, 0x29, 0x20, 0x69,
+ 0x73, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x6f,
+ 0x66, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x6c,
+ 0x79, 0x0d, 0x0a, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x49, 0x74, 0x73, 0x20, 0x67,
+ 0x6f, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e,
+ 0x61, 0x62, 0x6c, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63,
+ 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20,
+ 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2c, 0x0d, 0x0a, 0x72, 0x65, 0x63,
+ 0x65, 0x69, 0x76, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x57, 0x65, 0x62, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x77, 0x61, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x48, 0x54, 0x4d,
+ 0x4c, 0x2e, 0x0d, 0x0a, 0x58, 0x4d, 0x4c, 0x20, 0x68, 0x61, 0x73, 0x20,
+ 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65,
+ 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6f,
+ 0x66, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62,
+ 0x69, 0x6c, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x62, 0x6f, 0x74, 0x68, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65,
+ 0x6e, 0x20, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x64, 0x20, 0x62,
+ 0x79, 0x20, 0x57, 0x33, 0x43, 0x20, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+ 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70,
+ 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20,
+ 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x65, 0x6e, 0x64,
+ 0x6f, 0x72, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x73,
+ 0x20, 0x61, 0x20, 0x57, 0x33, 0x43, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49,
+ 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x0d, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75,
+ 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61,
+ 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x69, 0x74, 0x65, 0x64, 0x20, 0x61,
+ 0x73, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x76,
+ 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x0d,
+ 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65,
+ 0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20,
+ 0x57, 0x33, 0x43, 0x27, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x69,
+ 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x72,
+ 0x61, 0x77, 0x0d, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65,
+ 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
+ 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x77, 0x69, 0x64, 0x65, 0x73, 0x70,
+ 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d,
+ 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x0d, 0x0a, 0x65,
+ 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74,
+ 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x65, 0x62, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x70, 0x65,
+ 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x20, 0x73, 0x79, 0x6e,
+ 0x74, 0x61, 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20,
+ 0x62, 0x79, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e,
+ 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e,
+ 0x67, 0x2c, 0x20, 0x77, 0x69, 0x64, 0x65, 0x6c, 0x79, 0x0d, 0x0a, 0x75,
+ 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74,
+ 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x28, 0x53, 0x74, 0x61, 0x6e,
+ 0x64, 0x61, 0x72, 0x64, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
+ 0x69, 0x7a, 0x65, 0x64, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20,
+ 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2c, 0x0d, 0x0a, 0x49,
+ 0x53, 0x4f, 0x20, 0x38, 0x38, 0x37, 0x39, 0x3a, 0x31, 0x39, 0x38, 0x36,
+ 0x28, 0x45, 0x29, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6d, 0x65, 0x6e, 0x64,
+ 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65,
+ 0x63, 0x74, 0x65, 0x64, 0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73,
+ 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x6f, 0x72,
+ 0x6c, 0x64, 0x20, 0x57, 0x69, 0x64, 0x65, 0x20, 0x57, 0x65, 0x62, 0x2e,
+ 0x0d, 0x0a, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72,
+ 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x57, 0x33, 0x43, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x41, 0x63, 0x74,
+ 0x69, 0x76, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69,
+ 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20,
+ 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64,
+ 0x20, 0x61, 0x74, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x22, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2e, 0x20, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61,
+ 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x30, 0x22, 0x3e, 0x5b, 0x45,
+ 0x31, 0x30, 0x30, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a,
+ 0x54, 0x68, 0x65, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x20,
+ 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x69, 0x76, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e,
+ 0x20, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x0d, 0x0a, 0x66,
+ 0x6f, 0x72, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x65,
+ 0x65, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x23,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x22, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x23, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2e, 0x20, 0x3c, 0x2f, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x3e, 0x41, 0x0d, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x20,
+ 0x6f, 0x66, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x57,
+ 0x33, 0x43, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x63,
+ 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+ 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e,
+ 0x64, 0x0d, 0x0a, 0x61, 0x74, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54,
+ 0x52, 0x2f, 0x22, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65,
+ 0x6c, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x36, 0x36, 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x36, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x0d, 0x0a,
+ 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x75, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74,
+ 0x65, 0x72, 0x6d, 0x20, 0x55, 0x52, 0x49, 0x2c, 0x20, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65,
+ 0x64, 0x20, 0x62, 0x79, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66,
+ 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x42, 0x65, 0x72, 0x6e, 0x65, 0x72,
+ 0x73, 0x2d, 0x4c, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x2c, 0x0d, 0x0a, 0x61,
+ 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f,
+ 0x67, 0x72, 0x65, 0x73, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74,
+ 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x52, 0x46, 0x43, 0x31, 0x37, 0x33, 0x38, 0x22, 0x2f, 0x3e,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66,
+ 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x52, 0x46, 0x43, 0x31, 0x38,
+ 0x30, 0x38, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64,
+ 0x22, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e,
+ 0x64, 0x20, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73,
+ 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x6e, 0x6f, 0x74, 0x3c, 0x2f,
+ 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20,
+ 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x75,
+ 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x31, 0x30, 0x20, 0x46,
+ 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x79, 0x20, 0x31, 0x39, 0x39, 0x38,
+ 0x29, 0x3b, 0x0d, 0x0a, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x72, 0x65, 0x6c,
+ 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74,
+ 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x73, 0x20, 0x64, 0x69, 0x63, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20,
+ 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74,
+ 0x2d, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x20, 0x28, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62,
+ 0x6c, 0x65, 0x0d, 0x0a, 0x61, 0x74, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x22,
+ 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78,
+ 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x29, 0x0d, 0x0a, 0x61, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x76,
+ 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72,
+ 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x63,
+ 0x6f, 0x6e, 0x64, 0x20, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x69, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65,
+ 0x0d, 0x0a, 0x61, 0x74, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x56, 0x31, 0x30, 0x2d, 0x32, 0x65,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x56,
+ 0x31, 0x30, 0x2d, 0x32, 0x65, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x72,
+ 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6d, 0x61, 0x69, 0x6c,
+ 0x74, 0x6f, 0x3a, 0x78, 0x6d, 0x6c, 0x2d, 0x65, 0x64, 0x69, 0x74, 0x6f,
+ 0x72, 0x40, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x22, 0x3e, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x40, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x31, 0x22, 0x3e, 0x5b, 0x45,
+ 0x31, 0x30, 0x31, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3b, 0x20,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x73,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x41, 0x72, 0x63, 0x68,
+ 0x69, 0x76, 0x65, 0x73, 0x2f, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x22, 0x3e,
+ 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c,
+ 0x61, 0x62, 0x6c, 0x65, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x6e, 0x6f, 0x74,
+ 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x43, 0x2e, 0x20, 0x4d, 0x2e, 0x20,
+ 0x53, 0x70, 0x65, 0x72, 0x62, 0x65, 0x72, 0x67, 0x2d, 0x4d, 0x63, 0x51,
+ 0x75, 0x65, 0x65, 0x6e, 0x27, 0x73, 0x20, 0x61, 0x66, 0x66, 0x69, 0x6c,
+ 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x20, 0x63,
+ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x65, 0x64, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2e, 0x20, 0x48, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f,
+ 0x77, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x6f, 0x72,
+ 0x6c, 0x64, 0x20, 0x57, 0x69, 0x64, 0x65, 0x20, 0x57, 0x65, 0x62, 0x20,
+ 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x75, 0x6d, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x6e, 0x0d, 0x0a, 0x62, 0x65, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74,
+ 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x6f, 0x3a, 0x63, 0x6d, 0x73, 0x6d, 0x63,
+ 0x71, 0x40, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x22, 0x3e, 0x63, 0x6d,
+ 0x73, 0x6d, 0x63, 0x71, 0x40, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x75, 0x62,
+ 0x73, 0x74, 0x6d, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x43, 0x68,
+ 0x69, 0x63, 0x61, 0x67, 0x6f, 0x2c, 0x20, 0x56, 0x61, 0x6e, 0x63, 0x6f,
+ 0x75, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61,
+ 0x69, 0x6e, 0x20, 0x56, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x65, 0x74, 0x20,
+ 0x61, 0x6c, 0x2e, 0x3a, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x2d, 0x57,
+ 0x69, 0x64, 0x65, 0x20, 0x57, 0x65, 0x62, 0x20, 0x43, 0x6f, 0x6e, 0x73,
+ 0x6f, 0x72, 0x74, 0x69, 0x75, 0x6d, 0x2c, 0x20, 0x58, 0x4d, 0x4c, 0x0d,
+ 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x47, 0x72, 0x6f,
+ 0x75, 0x70, 0x2c, 0x20, 0x31, 0x39, 0x39, 0x36, 0x2c, 0x20, 0x31, 0x39,
+ 0x39, 0x37, 0x2c, 0x20, 0x32, 0x30, 0x30, 0x30, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x75, 0x62, 0x73, 0x74, 0x6d, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x64, 0x65,
+ 0x73, 0x63, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x43, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74,
+ 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x64, 0x65, 0x73, 0x63, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x61, 0x6e,
+ 0x67, 0x75, 0x73, 0x61, 0x67, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x61,
+ 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x45,
+ 0x4e, 0x22, 0x3e, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x3c, 0x2f,
+ 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x6e,
+ 0x64, 0x65, 0x64, 0x20, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x73, 0x2d, 0x4e,
+ 0x61, 0x75, 0x72, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x20, 0x28, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72,
+ 0x29, 0x3c, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x73, 0x61, 0x67,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
+ 0x6e, 0x64, 0x65, 0x73, 0x63, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x6c, 0x69,
+ 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x31, 0x39, 0x39, 0x37, 0x2d, 0x31, 0x32, 0x2d, 0x30, 0x33, 0x20, 0x3a,
+ 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x79, 0x65,
+ 0x74, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39,
+ 0x39, 0x37, 0x2d, 0x31, 0x32, 0x2d, 0x30, 0x32, 0x20, 0x3a, 0x20, 0x54,
+ 0x42, 0x20, 0x3a, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20,
+ 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x28, 0x73, 0x65, 0x65,
+ 0x20, 0x54, 0x42, 0x20, 0x74, 0x6f, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x57,
+ 0x47, 0x2c, 0x20, 0x32, 0x20, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65,
+ 0x72, 0x20, 0x31, 0x39, 0x39, 0x37, 0x29, 0x3c, 0x2f, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x31, 0x39, 0x39, 0x37, 0x2d, 0x31, 0x32, 0x2d, 0x30, 0x32, 0x20, 0x3a,
+ 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x64, 0x65,
+ 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x73, 0x20, 0x6d,
+ 0x61, 0x6e, 0x79, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x0d, 0x0a, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x72, 0x65, 0x61, 0x64,
+ 0x65, 0x72, 0x73, 0x20, 0x61, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x20,
+ 0x68, 0x61, 0x72, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x61, 0x74, 0x65,
+ 0x20, 0x69, 0x6e, 0x20, 0x70, 0x75, 0x62, 0x64, 0x61, 0x74, 0x65, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x0d, 0x0a, 0x63, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69,
+ 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x57, 0x65, 0x62, 0x53, 0x47, 0x4d, 0x4c, 0x2c, 0x20, 0x75, 0x70,
+ 0x64, 0x61, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20,
+ 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x44, 0x61, 0x6e, 0x20, 0x43,
+ 0x6f, 0x6e, 0x6e, 0x6f, 0x6c, 0x6c, 0x79, 0x0d, 0x0a, 0x28, 0x61, 0x6d,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x61, 0x62,
+ 0x6f, 0x75, 0x74, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x6e, 0x65, 0x63,
+ 0x65, 0x20, 0x74, 0x6f, 0x20, 0x42, 0x65, 0x72, 0x6e, 0x65, 0x72, 0x73,
+ 0x2d, 0x4c, 0x65, 0x65, 0x20, 0x65, 0x74, 0x20, 0x61, 0x6c, 0x2e, 0x29,
+ 0x2c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x27, 0x54, 0x68, 0x65, 0x27, 0x20,
+ 0x74, 0x6f, 0x20, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x0d,
+ 0x0a, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x57, 0x47, 0x20, 0x64,
+ 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x6f, 0x76,
+ 0x65, 0x20, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68,
+ 0x69, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69,
+ 0x6e, 0x67, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x73,
+ 0x20, 0x74, 0x6f, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x6d, 0x61, 0x74,
+ 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d,
+ 0x62, 0x69, 0x6e, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x52, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x72, 0x65,
+ 0x2d, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20,
+ 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x20, 0x73, 0x6f, 0x20, 0x6e, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x61, 0x70, 0x70, 0x65,
+ 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x0d, 0x0a, 0x63, 0x6f, 0x6d, 0x65,
+ 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x2d, 0x74,
+ 0x61, 0x67, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x6d, 0x61, 0x74, 0x74,
+ 0x65, 0x72, 0x20, 0x73, 0x6f, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64,
+ 0x69, 0x63, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x61, 0x67,
+ 0x67, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x64, 0x69,
+ 0x76, 0x31, 0x2c, 0x0d, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20,
+ 0x58, 0x58, 0x58, 0x20, 0x58, 0x58, 0x58, 0x20, 0x66, 0x72, 0x6f, 0x6d,
+ 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x27, 0x6e, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x69, 0x76, 0x65, 0x27, 0x20, 0x73, 0x70, 0x65,
+ 0x63, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x73, 0x65, 0x2c,
+ 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x0d, 0x0a, 0x66,
+ 0x72, 0x6f, 0x6d, 0x20, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x52, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20,
+ 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x52, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x64,
+ 0x64, 0x20, 0x52, 0x46, 0x43, 0x20, 0x31, 0x37, 0x33, 0x38, 0x2c, 0x20,
+ 0x31, 0x38, 0x30, 0x38, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x32, 0x31,
+ 0x34, 0x31, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x4f, 0x74, 0x68, 0x65, 0x72,
+ 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20,
+ 0x28, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20,
+ 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x65, 0x20, 0x64, 0x6f, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63,
+ 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20,
+ 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x6d, 0x29, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x46, 0x69,
+ 0x65, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x72, 0x61, 0x66, 0x74,
+ 0x27, 0x20, 0x28, 0x42, 0x65, 0x72, 0x6e, 0x65, 0x72, 0x73, 0x2d, 0x4c,
+ 0x65, 0x65, 0x0d, 0x0a, 0x65, 0x74, 0x20, 0x61, 0x6c, 0x2e, 0x29, 0x2c,
+ 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
+ 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6f, 0x64,
+ 0x79, 0x2c, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x55, 0x52, 0x49, 0x63,
+ 0x68, 0x61, 0x72, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x74, 0x65, 0x72, 0x6d,
+ 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x75, 0x73,
+ 0x65, 0x20, 0x53, 0x6b, 0x69, 0x70, 0x4c, 0x69, 0x74, 0x20, 0x69, 0x6e,
+ 0x73, 0x74, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6c, 0x6f, 0x73, 0x65, 0x20,
+ 0x73, 0x74, 0x72, 0x61, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x75, 0x6e,
+ 0x63, 0x74, 0x20, 0x6e, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+ 0x61, 0x6c, 0x20, 0x27, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x64, 0x65,
+ 0x63, 0x6c, 0x73, 0x27, 0x2c, 0x0d, 0x0a, 0x6d, 0x6f, 0x76, 0x65, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f,
+ 0x20, 0x41, 0x68, 0x6f, 0x20, 0x65, 0x74, 0x20, 0x61, 0x6c, 0x2e, 0x20,
+ 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x69,
+ 0x78, 0x20, 0x28, 0x54, 0x69, 0x6d, 0x27, 0x73, 0x20, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x29, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x70, 0x72, 0x6f,
+ 0x73, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x73, 0x61, 0x79, 0x69,
+ 0x6e, 0x67, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x73,
+ 0x68, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x65,
+ 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x52, 0x49, 0x20, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x6c, 0x6c, 0x79, 0x0d, 0x0a, 0x73, 0x70, 0x65, 0x61, 0x6b,
+ 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x69,
+ 0x6e, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x64, 0x65,
+ 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x28, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x27, 0x6d, 0x61, 0x79,
+ 0x27, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x61, 0x6e,
+ 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x2e, 0x20, 0x57, 0x6f, 0x72,
+ 0x6b, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x3a, 0x20, 0x54,
+ 0x69, 0x6d, 0x20, 0x42, 0x72, 0x61, 0x79, 0x20, 0x72, 0x65, 0x61, 0x63,
+ 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x4a, 0x61, 0x6d, 0x65,
+ 0x73, 0x20, 0x43, 0x6c, 0x61, 0x72, 0x6b, 0x2c, 0x20, 0x54, 0x69, 0x6d,
+ 0x20, 0x42, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x73,
+ 0x0d, 0x0a, 0x6f, 0x77, 0x6e, 0x2c, 0x20, 0x45, 0x76, 0x65, 0x20, 0x4d,
+ 0x61, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x44, 0x4f,
+ 0x4e, 0x45, 0x20, 0x59, 0x45, 0x54, 0x3a, 0x20, 0x63, 0x68, 0x61, 0x6e,
+ 0x67, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x2f, 0x20,
+ 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x70, 0x61,
+ 0x72, 0x73, 0x65, 0x64, 0x20, 0x2f, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65,
+ 0x64, 0x2e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x0d, 0x0a, 0x4a,
+ 0x61, 0x6d, 0x65, 0x73, 0x27, 0x73, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65,
+ 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20,
+ 0x26, 0x6c, 0x74, 0x3b, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x75, 0x62, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73,
+ 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x20, 0x68,
+ 0x65, 0x78, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x2c, 0x0d, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x72,
+ 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x3c, 0x2f, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x31, 0x39, 0x39, 0x37, 0x2d, 0x31, 0x32, 0x2d, 0x30, 0x31, 0x20, 0x3a,
+ 0x20, 0x4a, 0x42, 0x20, 0x3a, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x6f,
+ 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2d, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
+ 0x72, 0x73, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d,
+ 0x31, 0x32, 0x2d, 0x30, 0x31, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d,
+ 0x63, 0x51, 0x20, 0x3a, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x20, 0x72,
+ 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x6e,
+ 0x67, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72,
+ 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x57, 0x47, 0x20, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65,
+ 0x72, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x3a, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x28,
+ 0x32, 0x37, 0x20, 0x41, 0x75, 0x67, 0x20, 0x2f, 0x20, 0x33, 0x20, 0x53,
+ 0x65, 0x70, 0x74, 0x29, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63,
+ 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66,
+ 0x20, 0x46, 0x61, 0x75, 0x73, 0x74, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72,
+ 0x65, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x0d, 0x0a, 0x6c,
+ 0x69, 0x6e, 0x65, 0x29, 0x2c, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x53,
+ 0x44, 0x44, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x45, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x63, 0x6c, 0x2c, 0x20, 0x63, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x61, 0x74,
+ 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x75, 0x6d,
+ 0x62, 0x65, 0x72, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x64, 0x72, 0x6f,
+ 0x70, 0x0d, 0x0a, 0x6d, 0x69, 0x73, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e,
+ 0x67, 0x20, 0x28, 0x77, 0x72, 0x6f, 0x6e, 0x67, 0x21, 0x29, 0x20, 0x73,
+ 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x75,
+ 0x74, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65,
+ 0x72, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x64,
+ 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6f,
+ 0x66, 0x20, 0x50, 0x43, 0x44, 0x61, 0x74, 0x61, 0x20, 0x74, 0x6f, 0x20,
+ 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x62, 0x61, 0x72, 0x20, 0x6f, 0x6e, 0x20,
+ 0x6d, 0x73, 0x63, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69,
+ 0x63, 0x61, 0x6c, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20,
+ 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x27, 0x73, 0x20, 0x68, 0x61,
+ 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x73, 0x75, 0x62, 0x73,
+ 0x65, 0x74, 0x20, 0x28, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x6e, 0x6f, 0x6e,
+ 0x2d, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x64, 0x65, 0x63, 0x6c, 0x73, 0x29, 0x2c, 0x20,
+ 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x53, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x0d,
+ 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x67, 0x72, 0x61, 0x6c, 0x2d, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72,
+ 0x61, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74,
+ 0x2c, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x6d, 0x69, 0x73, 0x6c, 0x65,
+ 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x2f, 0x20, 0x64, 0x61, 0x6e, 0x67,
+ 0x65, 0x72, 0x6f, 0x75, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x6e,
+ 0x63, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x72, 0x65, 0x6c,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x0d, 0x0a, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x74, 0x61,
+ 0x67, 0x20, 0x74, 0x6f, 0x20, 0x68, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20,
+ 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x45, 0x4d, 0x20, 0x63, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x44, 0x54, 0x44,
+ 0x2c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x20, 0x61,
+ 0x62, 0x6f, 0x75, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6e,
+ 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x69, 0x6e, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x69,
+ 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2c, 0x20,
+ 0x61, 0x64, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20,
+ 0x74, 0x6f, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20,
+ 0x6f, 0x75, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f,
+ 0x6d, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61,
+ 0x62, 0x61, 0x73, 0x65, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x0d,
+ 0x0a, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x77, 0x6f, 0x72,
+ 0x6b, 0x21, 0x29, 0x2e, 0x20, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39,
+ 0x39, 0x37, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x38, 0x20, 0x3a, 0x20, 0x54,
+ 0x42, 0x20, 0x3a, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20,
+ 0x25, 0x2d, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73,
+ 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x50, 0x45,
+ 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x2e,
+ 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d, 0x31, 0x30,
+ 0x2d, 0x30, 0x31, 0x20, 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20, 0x43,
+ 0x61, 0x73, 0x65, 0x2d, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76,
+ 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x3b, 0x20, 0x63, 0x6c,
+ 0x65, 0x61, 0x6e, 0x65, 0x64, 0x20, 0x75, 0x70, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65,
+ 0x66, 0x73, 0x2c, 0x0d, 0x0a, 0x6c, 0x6f, 0x74, 0x73, 0x61, 0x20, 0x6c,
+ 0x69, 0x74, 0x74, 0x6c, 0x65, 0x20, 0x65, 0x64, 0x69, 0x74, 0x73, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3c, 0x2f, 0x73,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d, 0x30, 0x39, 0x2d, 0x32, 0x35,
+ 0x20, 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20, 0x43, 0x68, 0x61, 0x6e,
+ 0x67, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6c, 0x6d, 0x27, 0x73, 0x20,
+ 0x6e, 0x65, 0x77, 0x20, 0x44, 0x54, 0x44, 0x2c, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61,
+ 0x6c, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x0d, 0x0a, 0x63, 0x6c,
+ 0x65, 0x61, 0x6e, 0x75, 0x70, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x73,
+ 0x69, 0x64, 0x65, 0x2d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x3c, 0x2f,
+ 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d, 0x30, 0x37, 0x2d, 0x32,
+ 0x34, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a,
+ 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x20, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x6f, 0x73, 0x74, 0x20, 0x2a, 0x29, 0x20,
+ 0x69, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x53,
+ 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x0d,
+ 0x0a, 0x28, 0x74, 0x68, 0x61, 0x6e, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20,
+ 0x4d, 0x61, 0x6b, 0x6f, 0x74, 0x6f, 0x20, 0x4d, 0x75, 0x72, 0x61, 0x74,
+ 0x61, 0x29, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x41, 0x6c, 0x6c, 0x6f, 0x77,
+ 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x68,
+ 0x61, 0x76, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x73,
+ 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x20, 0x54,
+ 0x43, 0x0d, 0x0a, 0x28, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x4a,
+ 0x4a, 0x43, 0x29, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39,
+ 0x37, 0x2d, 0x30, 0x37, 0x2d, 0x32, 0x33, 0x20, 0x3a, 0x20, 0x43, 0x4d,
+ 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x65,
+ 0x6d, 0x70, 0x74, 0x69, 0x76, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6b,
+ 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67,
+ 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x0d,
+ 0x0a, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x20, 0x27, 0x65,
+ 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x74, 0x61, 0x67, 0x27, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x6d, 0x70,
+ 0x74, 0x79, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20,
+ 0x6d, 0x61, 0x79, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x74, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x73, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x45,
+ 0x4d, 0x50, 0x54, 0x59, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x75, 0x73,
+ 0x65, 0x20, 0x69, 0x74, 0x2e, 0x20, 0x41, 0x64, 0x64, 0x20, 0x57, 0x46,
+ 0x43, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x20,
+ 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x65, 0x0d, 0x0a, 0x66,
+ 0x69, 0x72, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x52, 0x65, 0x64, 0x65, 0x66,
+ 0x69, 0x6e, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x74,
+ 0x6f, 0x20, 0x50, 0x49, 0x73, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x6c,
+ 0x6c, 0x20, 0x61, 0x73, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x43,
+ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x64, 0x65,
+ 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e,
+ 0x67, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x33, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x34, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x65, 0x78, 0x61,
+ 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42,
+ 0x79, 0x74, 0x65, 0x0d, 0x0a, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x4d,
+ 0x61, 0x72, 0x6b, 0x2e, 0x20, 0x41, 0x64, 0x64, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x61,
+ 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x63, 0x6c, 0x61, 0x72, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x20, 0x69, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73,
+ 0x20, 0x74, 0x6f, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x0d, 0x0a, 0x6d, 0x69,
+ 0x78, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+ 0x20, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d, 0x30,
+ 0x36, 0x2d, 0x33, 0x30, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63,
+ 0x51, 0x20, 0x3a, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x64,
+ 0x61, 0x74, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x63, 0x6f,
+ 0x73, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20,
+ 0x74, 0x6f, 0x0d, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x6f, 0x69,
+ 0x63, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x71, 0x2c, 0x20, 0x4d, 0x69, 0x78,
+ 0x65, 0x64, 0x2c, 0x20, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x54, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x46, 0x6f, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x20, 0x4a, 0x61, 0x6d, 0x65, 0x73, 0x0d, 0x0a, 0x43, 0x6c, 0x61,
+ 0x72, 0x6b, 0x27, 0x73, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x68,
+ 0x69, 0x62, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x2e, 0x20, 0x54, 0x4f,
+ 0x0d, 0x0a, 0x44, 0x4f, 0x3a, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x69,
+ 0x66, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,
+ 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61,
+ 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20,
+ 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x65, 0x20, 0x64, 0x6f, 0x6e,
+ 0x27, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x6f, 0x20,
+ 0x77, 0x6f, 0x72, 0x72, 0x79, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20,
+ 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x65, 0x78, 0x70, 0x61,
+ 0x6e, 0x64, 0x20, 0x50, 0x45, 0x72, 0x65, 0x66, 0x73, 0x20, 0x66, 0x69,
+ 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39,
+ 0x37, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x39, 0x20, 0x3a, 0x20, 0x54, 0x42,
+ 0x20, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x65,
+ 0x64, 0x69, 0x74, 0x73, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39,
+ 0x37, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x39, 0x20, 0x3a, 0x20, 0x43, 0x4d,
+ 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3a, 0x20,
+ 0x53, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x6c, 0x64,
+ 0x20, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x20, 0x45, 0x44, 0x49, 0x54, 0x20,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0d, 0x0a, 0x61, 0x6e,
+ 0x64, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x61, 0x64, 0x20,
+ 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x20, 0x52, 0x65,
+ 0x76, 0x69, 0x73, 0x65, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x25, 0x20, 0x69, 0x6e,
+ 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20,
+ 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x20, 0x48, 0x65, 0x6e, 0x72,
+ 0x79, 0x0d, 0x0a, 0x54, 0x68, 0x6f, 0x6d, 0x70, 0x73, 0x6f, 0x6e, 0x27,
+ 0x73, 0x20, 0x70, 0x75, 0x6e, 0x2c, 0x20, 0x65, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70,
+ 0x64, 0x65, 0x63, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x74,
+ 0x64, 0x65, 0x66, 0x2e, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20,
+ 0x52, 0x4d, 0x44, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67,
+ 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x28, 0x3f, 0x29,
+ 0x2e, 0x20, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d,
+ 0x30, 0x36, 0x2d, 0x32, 0x38, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d,
+ 0x63, 0x51, 0x20, 0x3a, 0x20, 0x56, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73,
+ 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x31, 0x20, 0x4a, 0x75, 0x6c, 0x79, 0x20, 0x64, 0x72, 0x61, 0x66,
+ 0x74, 0x3a, 0x20, 0x41, 0x64, 0x64, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20,
+ 0x66, 0x6f, 0x72, 0x0d, 0x0a, 0x64, 0x72, 0x61, 0x63, 0x6f, 0x6e, 0x69,
+ 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x6e,
+ 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x72, 0x6f,
+ 0x64, 0x75, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72,
+ 0x6d, 0x20, 0x46, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f,
+ 0x72, 0x29, 0x2e, 0x20, 0x52, 0x45, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74,
+ 0x61, 0x20, 0x65, 0x73, 0x74, 0x20, 0x28, 0x63, 0x68, 0x61, 0x6e, 0x67,
+ 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x77, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67,
+ 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e,
+ 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72,
+ 0x69, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75,
+ 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x70,
+ 0x61, 0x72, 0x73, 0x65, 0x72, 0x73, 0x29, 0x2e, 0x20, 0x54, 0x61, 0x67,
+ 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e,
+ 0x67, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20,
+ 0x69, 0x74, 0x2e, 0x20, 0x41, 0x64, 0x64, 0x20, 0x63, 0x6f, 0x6c, 0x6f,
+ 0x6e, 0x0d, 0x0a, 0x61, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x43, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x20, 0x64, 0x65, 0x66, 0x20, 0x6f, 0x66, 0x20,
+ 0x25, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x20, 0x43,
+ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61,
+ 0x72, 0x64, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x6c, 0x74, 0x2c, 0x20, 0x67,
+ 0x74, 0x2c, 0x20, 0x61, 0x6d, 0x70, 0x2e, 0x20, 0x53, 0x74, 0x72, 0x69,
+ 0x70, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x7a, 0x65,
+ 0x72, 0x6f, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x23, 0x78, 0x30,
+ 0x30, 0x6e, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x3c, 0x2f,
+ 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d, 0x30, 0x34, 0x2d, 0x30,
+ 0x32, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a,
+ 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x64,
+ 0x69, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f,
+ 0x72, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x0d,
+ 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x27,
+ 0x73, 0x20, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x72, 0x65, 0x61, 0x64, 0x69,
+ 0x6e, 0x67, 0x2e, 0x20, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x20,
+ 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20,
+ 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x65, 0x6c, 0x6c,
+ 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x3a, 0x20, 0x57, 0x65, 0x62,
+ 0x73, 0x74, 0x65, 0x72, 0x27, 0x73, 0x0d, 0x0a, 0x53, 0x65, 0x63, 0x6f,
+ 0x6e, 0x64, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x61, 0x74, 0x65,
+ 0x73, 0x20, 0x69, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68,
+ 0x61, 0x74, 0x27, 0x73, 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x31, 0x39, 0x39, 0x37, 0x2d, 0x30, 0x34, 0x2d, 0x30, 0x31, 0x20, 0x3a,
+ 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x63, 0x6f,
+ 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x72,
+ 0x6f, 0x6d, 0x20, 0x4a, 0x4a, 0x43, 0x2c, 0x20, 0x45, 0x4d, 0x2c, 0x20,
+ 0x48, 0x54, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6c, 0x66,
+ 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d, 0x30, 0x33,
+ 0x2d, 0x33, 0x31, 0x20, 0x3a, 0x20, 0x54, 0x69, 0x6d, 0x20, 0x42, 0x72,
+ 0x61, 0x79, 0x20, 0x3a, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39,
+ 0x39, 0x37, 0x2d, 0x30, 0x33, 0x2d, 0x32, 0x39, 0x20, 0x3a, 0x20, 0x43,
+ 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x73, 0x6f, 0x6d, 0x65,
+ 0x20, 0x48, 0x65, 0x6e, 0x72, 0x79, 0x20, 0x54, 0x68, 0x6f, 0x6d, 0x70,
+ 0x73, 0x6f, 0x6e, 0x20, 0x28, 0x6f, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x29,
+ 0x2c, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x0d, 0x0a, 0x43, 0x68, 0x61, 0x72,
+ 0x6c, 0x65, 0x73, 0x20, 0x47, 0x6f, 0x6c, 0x64, 0x66, 0x61, 0x72, 0x62,
+ 0x2c, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x45, 0x52, 0x42, 0x20, 0x64,
+ 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x50, 0x45,
+ 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e,
+ 0x20, 0x6d, 0x69, 0x73, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x6e, 0x65, 0x6f,
+ 0x75, 0x73, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x2e, 0x0d, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+ 0x64, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x6e,
+ 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6f, 0x66, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x0d,
+ 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2e,
+ 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x64, 0x65, 0x66, 0x20, 0x6f, 0x66,
+ 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x6c, 0x69, 0x74, 0x65, 0x72,
+ 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72,
+ 0x61, 0x6c, 0x73, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39,
+ 0x37, 0x2d, 0x30, 0x33, 0x2d, 0x32, 0x38, 0x20, 0x3a, 0x20, 0x43, 0x4d,
+ 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20,
+ 0x61, 0x73, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x6f, 0x72, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x73, 0x20, 0x70,
+ 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x72, 0x6f,
+ 0x6d, 0x20, 0x54, 0x65, 0x72, 0x72, 0x79, 0x0d, 0x0a, 0x41, 0x6c, 0x6c,
+ 0x65, 0x6e, 0x2c, 0x20, 0x4e, 0x6f, 0x72, 0x62, 0x65, 0x72, 0x74, 0x20,
+ 0x4d, 0x69, 0x6b, 0x75, 0x6c, 0x61, 0x2c, 0x20, 0x4a, 0x61, 0x6d, 0x65,
+ 0x73, 0x20, 0x43, 0x6c, 0x61, 0x72, 0x6b, 0x2c, 0x20, 0x4a, 0x6f, 0x6e,
+ 0x20, 0x42, 0x6f, 0x73, 0x61, 0x6b, 0x2c, 0x20, 0x48, 0x65, 0x6e, 0x72,
+ 0x79, 0x20, 0x54, 0x68, 0x6f, 0x6d, 0x70, 0x73, 0x6f, 0x6e, 0x2c, 0x20,
+ 0x50, 0x61, 0x75, 0x6c, 0x20, 0x47, 0x72, 0x6f, 0x73, 0x73, 0x6f, 0x2c,
+ 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x20,
+ 0x41, 0x6d, 0x6f, 0x6e, 0x67, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x67, 0x69, 0x76, 0x65,
+ 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x22, 0x77, 0x65, 0x6c, 0x6c,
+ 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x20, 0x28, 0x54, 0x65,
+ 0x72, 0x72, 0x79, 0x20, 0x69, 0x73, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x29, 0x2c, 0x20, 0x74, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65,
+ 0x6c, 0x79, 0x0d, 0x0a, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x51,
+ 0x75, 0x6f, 0x74, 0x65, 0x64, 0x43, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61,
+ 0x73, 0x20, 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x61,
+ 0x73, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x6f, 0x72, 0x65,
+ 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x76, 0x65,
+ 0x2c, 0x0d, 0x0a, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x65,
+ 0x6d, 0x70, 0x68, 0x3e, 0x6f, 0x6e, 0x6c, 0x79, 0x3c, 0x2f, 0x65, 0x6d,
+ 0x70, 0x68, 0x3e, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x51, 0x75,
+ 0x6f, 0x74, 0x65, 0x64, 0x43, 0x44, 0x61, 0x74, 0x61, 0x20, 0x77, 0x61,
+ 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64,
+ 0x20, 0x76, 0x69, 0x63, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x61, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x74,
+ 0x65, 0x78, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x4c, 0x69, 0x74, 0x65,
+ 0x72, 0x61, 0x6c, 0x2e, 0x20, 0x28, 0x49, 0x27, 0x64, 0x20, 0x63, 0x61,
+ 0x6c, 0x6c, 0x20, 0x69, 0x74, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x54, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x0d, 0x0a,
+ 0x38, 0x38, 0x37, 0x39, 0x20, 0x75, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x62, 0x6f, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e,
+ 0x29, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d, 0x30,
+ 0x33, 0x2d, 0x32, 0x36, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63,
+ 0x51, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x6b,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x64, 0x72,
+ 0x61, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x70, 0x70, 0x6c, 0x79,
+ 0x0d, 0x0a, 0x6d, 0x79, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73,
+ 0x20, 0x64, 0x61, 0x74, 0x65, 0x64, 0x20, 0x30, 0x33, 0x2d, 0x32, 0x30,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x33, 0x2d, 0x32, 0x31, 0x2e, 0x20,
+ 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x6c,
+ 0x64, 0x20, 0x27, 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x27, 0x20,
+ 0x74, 0x6f, 0x20, 0x27, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74,
+ 0x27, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x0d, 0x0a, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x61, 0x73,
+ 0x65, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x6d,
+ 0x65, 0x61, 0x6e, 0x74, 0x20, 0x27, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x72,
+ 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x27, 0x2e, 0x3c, 0x2f,
+ 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d, 0x30, 0x33, 0x2d, 0x32,
+ 0x31, 0x20, 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20, 0x6d, 0x61, 0x73,
+ 0x73, 0x69, 0x76, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73,
+ 0x20, 0x6f, 0x6e, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x20, 0x66, 0x6c,
+ 0x69, 0x67, 0x68, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x43, 0x68,
+ 0x69, 0x63, 0x61, 0x67, 0x6f, 0x20, 0x74, 0x6f, 0x20, 0x56, 0x61, 0x6e,
+ 0x63, 0x6f, 0x75, 0x76, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31,
+ 0x39, 0x39, 0x37, 0x2d, 0x30, 0x33, 0x2d, 0x32, 0x31, 0x20, 0x3a, 0x20,
+ 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x63, 0x6f, 0x72,
+ 0x72, 0x65, 0x63, 0x74, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x6e, 0x79,
+ 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31,
+ 0x39, 0x39, 0x37, 0x2d, 0x30, 0x33, 0x2d, 0x32, 0x30, 0x20, 0x3a, 0x20,
+ 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x63, 0x6f, 0x72,
+ 0x72, 0x65, 0x63, 0x74, 0x20, 0x74, 0x79, 0x70, 0x6f, 0x73, 0x20, 0x6c,
+ 0x69, 0x73, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x43, 0x4d, 0x53,
+ 0x4d, 0x63, 0x51, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x70,
+ 0x79, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x3c, 0x2f,
+ 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x37, 0x2d, 0x30, 0x33, 0x2d, 0x32,
+ 0x30, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a,
+ 0x20, 0x63, 0x6f, 0x73, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x20, 0x63, 0x68,
+ 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72,
+ 0x61, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76,
+ 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x0d, 0x0a, 0x57,
+ 0x57, 0x57, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x20, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x20, 0x31, 0x39, 0x39, 0x37,
+ 0x3a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x73, 0x6f,
+ 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+ 0x0d, 0x0a, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x74, 0x6f, 0x20, 0x64,
+ 0x6f, 0x63, 0x64, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x2e,
+ 0x29, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x78, 0x41, 0x30, 0x20,
+ 0x74, 0x6f, 0x20, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65,
+ 0x20, 0x6e, 0x62, 0x73, 0x70, 0x0d, 0x0a, 0x61, 0x73, 0x20, 0x26, 0x61,
+ 0x6d, 0x70, 0x3b, 0x23, 0x31, 0x36, 0x30, 0x3b, 0x2c, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x20, 0x6c,
+ 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72,
+ 0x61, 0x70, 0x68, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x67,
+ 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x3c, 0x2f, 0x73, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31, 0x31, 0x2d, 0x31, 0x32, 0x20,
+ 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x72,
+ 0x65, 0x76, 0x69, 0x73, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20,
+ 0x54, 0x69, 0x6d, 0x27, 0x73, 0x20, 0x65, 0x64, 0x69, 0x74, 0x73, 0x3a,
+ 0x20, 0x41, 0x64, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52,
+ 0x45, 0x44, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61, 0x6e,
+ 0x67, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x73, 0x74,
+ 0x73, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20,
+ 0x42, 0x55, 0x4c, 0x4c, 0x45, 0x54, 0x53, 0x20, 0x6f, 0x72, 0x20, 0x74,
+ 0x6f, 0x20, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x45, 0x44, 0x2e, 0x20,
+ 0x53, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x51, 0x75, 0x6f,
+ 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x0d, 0x0a, 0x4e,
+ 0x61, 0x6d, 0x65, 0x73, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73,
+ 0x65, 0x64, 0x29, 0x2e, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74,
+ 0x20, 0x74, 0x72, 0x69, 0x76, 0x69, 0x61, 0x6c, 0x2d, 0x67, 0x72, 0x61,
+ 0x6d, 0x6d, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x63, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x2e, 0x20, 0x52, 0x65, 0x6e, 0x61,
+ 0x6d, 0x65, 0x20, 0x27, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x73,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x0d, 0x0a, 0x61, 0x73, 0x20,
+ 0x27, 0x43, 0x44, 0x41, 0x54, 0x41, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x27, 0x20, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6d, 0x2e, 0x20,
+ 0x41, 0x6c, 0x73, 0x6f, 0x20, 0x65, 0x64, 0x69, 0x74, 0x73, 0x20, 0x66,
+ 0x72, 0x6f, 0x6d, 0x20, 0x4a, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x43, 0x6c,
+ 0x61, 0x72, 0x6b, 0x3a, 0x20, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x0d, 0x0a,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x66,
+ 0x72, 0x6f, 0x6d, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x5b, 0x5e,
+ 0x61, 0x62, 0x63, 0x5d, 0x20, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63,
+ 0x74, 0x73, 0x2e, 0x20, 0x43, 0x68, 0x61, 0x72, 0x72, 0x65, 0x66, 0x20,
+ 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6a,
+ 0x75, 0x73, 0x74, 0x20, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x20, 0x6e, 0x6f,
+ 0x74, 0x0d, 0x0a, 0x44, 0x69, 0x67, 0x69, 0x74, 0x2e, 0x20, 0x4c, 0x6f,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20,
+ 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x65,
+ 0x72, 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x3a,
+ 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x3f, 0x20, 0x28, 0x45, 0x52,
+ 0x42, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e,
+ 0x20, 0x4f, 0x6e, 0x65, 0x0d, 0x0a, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x50, 0x49, 0x20, 0x68, 0x61,
+ 0x73, 0x20, 0x77, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x69, 0x63, 0x2e,
+ 0x20, 0x43, 0x6c, 0x61, 0x72, 0x69, 0x66, 0x79, 0x20, 0x64, 0x69, 0x73,
+ 0x63, 0x75, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x65,
+ 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x2e, 0x20, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x0d,
+ 0x0a, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x20, 0x73, 0x68, 0x6f,
+ 0x75, 0x6c, 0x64, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x75, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20,
+ 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3b, 0x20, 0x64, 0x6f, 0x6e,
+ 0x27, 0x74, 0x20, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+ 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x76,
+ 0x65, 0x72, 0x79, 0x2e, 0x0d, 0x0a, 0x44, 0x6f, 0x6e, 0x27, 0x74, 0x20,
+ 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6f,
+ 0x73, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x69, 0x65,
+ 0x73, 0x2e, 0x20, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x20, 0x77, 0x68,
+ 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x69, 0x6e,
+ 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72,
+ 0x76, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66,
+ 0x6f, 0x72, 0x6d, 0x20, 0x75, 0x2d, 0x4e, 0x4e, 0x4e, 0x4e, 0x2e, 0x20,
+ 0x43, 0x6c, 0x61, 0x72, 0x69, 0x66, 0x79, 0x20, 0x72, 0x65, 0x6c, 0x61,
+ 0x74, 0x69, 0x76, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x73, 0x2e, 0x20, 0x41,
+ 0x6e, 0x64, 0x0d, 0x0a, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20,
+ 0x6d, 0x79, 0x20, 0x6f, 0x77, 0x6e, 0x3a, 0x20, 0x43, 0x6f, 0x72, 0x72,
+ 0x65, 0x63, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x3a, 0x20, 0x6d,
+ 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20,
+ 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x0d, 0x0a, 0x6f, 0x66, 0x20,
+ 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x22,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3a, 0x3a, 0x3d,
+ 0x20, 0x63, 0x70, 0x22, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x67,
+ 0x6f, 0x6f, 0x64, 0x2e, 0x20, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39,
+ 0x39, 0x36, 0x2d, 0x31, 0x31, 0x2d, 0x31, 0x31, 0x20, 0x3a, 0x20, 0x43,
+ 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x76, 0x69,
+ 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65,
+ 0x2e, 0x20, 0x41, 0x64, 0x64, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x72, 0x68,
+ 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c,
+ 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65,
+ 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31,
+ 0x31, 0x2d, 0x31, 0x30, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63,
+ 0x51, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x65, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x69,
+ 0x78, 0x20, 0x2f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65,
+ 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x41, 0x64, 0x64, 0x20,
+ 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x6e, 0x20,
+ 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x53, 0x74, 0x69, 0x6c, 0x6c, 0x0d,
+ 0x0a, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x3a, 0x20, 0x41, 0x64, 0x64, 0x20,
+ 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74,
+ 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x64, 0x65,
+ 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65,
+ 0x6c, 0x73, 0x2e, 0x20, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x73,
+ 0x74, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x0d, 0x0a, 0x72, 0x65,
+ 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31, 0x30, 0x2d, 0x33, 0x31, 0x20, 0x3a,
+ 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20, 0x41, 0x64, 0x64, 0x20, 0x45, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e,
+ 0x67, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x73,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31, 0x30, 0x2d, 0x33, 0x30,
+ 0x20, 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20, 0x43, 0x6c, 0x65, 0x61,
+ 0x6e, 0x20, 0x75, 0x70, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x20, 0x26, 0x61,
+ 0x6d, 0x70, 0x3b, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x2e,
+ 0x20, 0x53, 0x6c, 0x69, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x45, 0x52, 0x42,
+ 0x20, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x72,
+ 0x65, 0x20, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x2e, 0x3c, 0x2f, 0x73, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31, 0x30, 0x2d, 0x32, 0x38, 0x20,
+ 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x20, 0x44, 0x54, 0x44, 0x2e, 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66,
+ 0x20, 0x4d, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6c, 0x27, 0x73, 0x20, 0x73,
+ 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0d,
+ 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x6f,
+ 0x20, 0x2f, 0x2f, 0x2e, 0x20, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75,
+ 0x63, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0d, 0x0a, 0x41, 0x64, 0x64, 0x20,
+ 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x77,
+ 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x68,
+ 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x4c, 0x6f, 0x74,
+ 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e,
+ 0x75, 0x70, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36,
+ 0x2d, 0x31, 0x30, 0x2d, 0x32, 0x34, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53,
+ 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20,
+ 0x74, 0x77, 0x65, 0x61, 0x6b, 0x73, 0x2c, 0x20, 0x69, 0x6d, 0x70, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x45,
+ 0x52, 0x42, 0x20, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+ 0x2e, 0x20, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73,
+ 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e,
+ 0x74, 0x65, 0x67, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x43, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x2f, 0x2a, 0x20,
+ 0x2a, 0x2f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x2f, 0x2f, 0x2e, 0x20, 0x41,
+ 0x64, 0x64, 0x20, 0x62, 0x69, 0x62, 0x6c, 0x69, 0x6f, 0x67, 0x72, 0x61,
+ 0x70, 0x68, 0x69, 0x63, 0x20, 0x72, 0x65, 0x66, 0x73, 0x20, 0x74, 0x6f,
+ 0x20, 0x31, 0x30, 0x36, 0x34, 0x36, 0x2c, 0x0d, 0x0a, 0x48, 0x79, 0x54,
+ 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65,
+ 0x2e, 0x20, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x6c, 0x64,
+ 0x20, 0x43, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x73, 0x20, 0x4d, 0x73,
+ 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x69,
+ 0x74, 0x27, 0x73, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x6f, 0x6e,
+ 0x6c, 0x79, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20, 0x73, 0x65,
+ 0x65, 0x6e, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65,
+ 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20,
+ 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x70,
+ 0x61, 0x69, 0x72, 0x73, 0x2c, 0x0d, 0x0a, 0x65, 0x78, 0x63, 0x65, 0x70,
+ 0x74, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x49, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20,
+ 0x69, 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2c,
+ 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x27, 0x3f, 0x27, 0x2e, 0x20,
+ 0x49, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c,
+ 0x64, 0x0d, 0x0a, 0x62, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c,
+ 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70,
+ 0x70, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6c,
+ 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39,
+ 0x39, 0x36, 0x2d, 0x31, 0x30, 0x2d, 0x31, 0x36, 0x20, 0x3a, 0x20, 0x54,
+ 0x42, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x64, 0x6f,
+ 0x77, 0x6e, 0x20, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x20, 0x65, 0x78, 0x63,
+ 0x69, 0x73, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x44, 0x53, 0x44, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3b, 0x20,
+ 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x0d, 0x0a, 0x73,
+ 0x6f, 0x6d, 0x65, 0x20, 0x45, 0x42, 0x4e, 0x46, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x3c, 0x2f, 0x73,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31, 0x30, 0x2d, 0x3f, 0x3f,
+ 0x20, 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20, 0x63, 0x6f, 0x6e, 0x73,
+ 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x20, 0x63, 0x68, 0x65, 0x63,
+ 0x6b, 0x2c, 0x20, 0x66, 0x69, 0x78, 0x20, 0x75, 0x70, 0x20, 0x73, 0x63,
+ 0x72, 0x61, 0x70, 0x73, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x79,
+ 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2c, 0x0d,
+ 0x0a, 0x67, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74,
+ 0x65, 0x72, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x2c, 0x20,
+ 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x20, 0x61, 0x20, 0x66, 0x65,
+ 0x77, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d,
+ 0x31, 0x30, 0x2d, 0x31, 0x30, 0x2f, 0x31, 0x31, 0x20, 0x3a, 0x20, 0x43,
+ 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x69,
+ 0x6f, 0x75, 0x73, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61,
+ 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x73, 0x74,
+ 0x69, 0x63, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x72, 0x67, 0x61,
+ 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x0d, 0x0a,
+ 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3a, 0x20, 0x52, 0x65, 0x70,
+ 0x6c, 0x61, 0x63, 0x65, 0x20, 0x61, 0x20, 0x66, 0x65, 0x77, 0x20, 0x6c,
+ 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68,
+ 0x20, 0x78, 0x6d, 0x6c, 0x70, 0x69, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x70, 0x69, 0x63, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68,
+ 0x65, 0x6d, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65,
+ 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72,
+ 0x65, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x63, 0x68, 0x61,
+ 0x6e, 0x67, 0x65, 0x20, 0x70, 0x69, 0x63, 0x20, 0x72, 0x65, 0x6c, 0x69,
+ 0x61, 0x62, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x45, 0x52, 0x42, 0x20, 0x76, 0x6f, 0x74, 0x65, 0x73, 0x2e,
+ 0x20, 0x44, 0x72, 0x6f, 0x70, 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x67,
+ 0x72, 0x61, 0x70, 0x68, 0x20, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x63, 0x6f,
+ 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d,
+ 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x41, 0x64, 0x64, 0x20, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x20,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x74, 0x65,
+ 0x72, 0x6d, 0x69, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2e, 0x20, 0x4d,
+ 0x6f, 0x76, 0x65, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x32, 0x2e, 0x32, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x70, 0x70, 0x73, 0x20,
+ 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x2e, 0x20,
+ 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x50, 0x49, 0x73, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x73,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64,
+ 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66,
+ 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x65,
+ 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x53, 0x74, 0x72,
+ 0x65, 0x61, 0x6d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63,
+ 0x75, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x64,
+ 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x20,
+ 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x20, 0x44, 0x72, 0x6f, 0x70,
+ 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6f, 0x66, 0x20, 0x27, 0x50, 0x49, 0x20, 0x73, 0x79, 0x6e, 0x74,
+ 0x61, 0x78, 0x27, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x6f, 0x63, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x2c, 0x0d, 0x0a, 0x61,
+ 0x6e, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61,
+ 0x6c, 0x2d, 0x44, 0x54, 0x44, 0x20, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72,
+ 0x79, 0x20, 0x50, 0x49, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x64,
+ 0x20, 0x6f, 0x66, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20,
+ 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x73,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0d, 0x0a, 0x52, 0x65, 0x76,
+ 0x69, 0x73, 0x65, 0x20, 0x44, 0x53, 0x44, 0x20, 0x73, 0x79, 0x6e, 0x74,
+ 0x61, 0x78, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
+ 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x54, 0x69, 0x6d, 0x27, 0x73, 0x20,
+ 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x2d, 0x69, 0x6e, 0x2d, 0x61, 0x2d,
+ 0x50, 0x49, 0x20, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d,
+ 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31,
+ 0x30, 0x2d, 0x31, 0x30, 0x20, 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20,
+ 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65,
+ 0x72, 0x73, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65,
+ 0x3f, 0x29, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d,
+ 0x31, 0x30, 0x2d, 0x30, 0x39, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d,
+ 0x63, 0x51, 0x20, 0x3a, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x65, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2c, 0x20, 0x63,
+ 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x20, 0x74,
+ 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x32, 0x2e, 0x33, 0x20, 0x28,
+ 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x29, 0x3c,
+ 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31, 0x30, 0x2d,
+ 0x30, 0x39, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20,
+ 0x3a, 0x20, 0x72, 0x65, 0x2d, 0x75, 0x6e, 0x69, 0x74, 0x65, 0x20, 0x65,
+ 0x76, 0x65, 0x72, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63,
+ 0x65, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x0d,
+ 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, 0x6c, 0x79,
+ 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x65,
+ 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x6c, 0x79, 0x3c, 0x2f, 0x73, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x38, 0x20,
+ 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74,
+ 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x20, 0x68, 0x6f, 0x6d, 0x6f, 0x67,
+ 0x65, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61,
+ 0x73, 0x73, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d,
+ 0x31, 0x30, 0x2d, 0x30, 0x38, 0x20, 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a,
+ 0x20, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65,
+ 0x6e, 0x74, 0x22, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x76, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x43, 0x44, 0x41, 0x54, 0x41,
+ 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x31, 0x30,
+ 0x2d, 0x30, 0x32, 0x20, 0x3a, 0x20, 0x54, 0x42, 0x20, 0x3a, 0x20, 0x72,
+ 0x65, 0x6d, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20,
+ 0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x20, 0x2b, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x31, 0x39, 0x39, 0x36, 0x2d, 0x30, 0x39, 0x2d, 0x33, 0x30, 0x20, 0x3a,
+ 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x61, 0x64,
+ 0x64, 0x20, 0x61, 0x20, 0x66, 0x65, 0x77, 0x20, 0x6d, 0x6f, 0x72, 0x65,
+ 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x70, 0x72,
+ 0x69, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61,
+ 0x6e, 0x67, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0d, 0x0a, 0x54, 0x69,
+ 0x6d, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d,
+ 0x30, 0x39, 0x2d, 0x32, 0x30, 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d,
+ 0x63, 0x51, 0x20, 0x3a, 0x20, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x20,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x62, 0x69, 0x6e, 0x67,
+ 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x73, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x31, 0x39, 0x39, 0x36, 0x2d, 0x30, 0x39, 0x2d, 0x31, 0x39, 0x20, 0x3a,
+ 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20, 0x62, 0x65,
+ 0x67, 0x69, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69,
+ 0x62, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x64, 0x72, 0x61, 0x66, 0x74, 0x2e, 0x3c, 0x2f, 0x73,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x31, 0x39, 0x39, 0x36, 0x2d, 0x30, 0x39, 0x2d, 0x31, 0x33,
+ 0x20, 0x3a, 0x20, 0x43, 0x4d, 0x53, 0x4d, 0x63, 0x51, 0x20, 0x3a, 0x20,
+ 0x6d, 0x61, 0x64, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x6e, 0x65,
+ 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x30, 0x39, 0x2d, 0x30, 0x36, 0x2c, 0x20, 0x64, 0x6f,
+ 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x6b,
+ 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x73, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
+ 0x64, 0x65, 0x73, 0x63, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x73, 0x65, 0x63, 0x2d, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x49, 0x6e, 0x74, 0x72, 0x6f,
+ 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x6e,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x75, 0x70,
+ 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x61,
+ 0x62, 0x62, 0x72, 0x65, 0x76, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x58,
+ 0x4d, 0x4c, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+ 0x73, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x64, 0x61, 0x74, 0x61, 0x0d, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x64, 0x6f, 0x63, 0x22, 0x3e,
+ 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c,
+ 0x79, 0x0d, 0x0a, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x73,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f,
+ 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65,
+ 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x65, 0x6d, 0x2e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x69,
+ 0x73, 0x20, 0x61, 0x6e, 0x0d, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+ 0x65, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63,
+ 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x20,
+ 0x53, 0x47, 0x4d, 0x4c, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x74,
+ 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x75,
+ 0x70, 0x0d, 0x0a, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20,
+ 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x49, 0x53, 0x4f, 0x38, 0x38, 0x37, 0x39, 0x22, 0x2f, 0x3e, 0x2e,
+ 0x20, 0x42, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20,
+ 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x0d, 0x0a,
+ 0x53, 0x47, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x75,
+ 0x70, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65,
+ 0x64, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x22, 0x3e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x0d, 0x0a,
+ 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x61, 0x72,
+ 0x73, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x72,
+ 0x73, 0x65, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x20, 0x50, 0x61,
+ 0x72, 0x73, 0x65, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x73,
+ 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x75, 0x70, 0x20, 0x6f, 0x66, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x2c, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22,
+ 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a,
+ 0x64, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x6d, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x66, 0x6f,
+ 0x72, 0x6d, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d, 0x61, 0x72, 0x6b,
+ 0x75, 0x70, 0x22, 0x3e, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x0d, 0x0a, 0x4d,
+ 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65,
+ 0x73, 0x20, 0x61, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x27, 0x73, 0x20, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c,
+ 0x0d, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e,
+ 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65,
+ 0x73, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73,
+ 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x20,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20,
+ 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x20, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x0d, 0x0a, 0x61,
+ 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x73,
+ 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x70, 0x72, 0x6f, 0x63, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d,
+ 0x3d, 0x22, 0x58, 0x4d, 0x4c, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x6f, 0x72, 0x22, 0x3e, 0x41, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77,
+ 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x63,
+ 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x0d, 0x0a, 0x61, 0x6e, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x72, 0x65, 0x61, 0x64, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70,
+ 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73,
+ 0x73, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x61, 0x70, 0x70, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22,
+ 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x3e, 0x49, 0x74, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x61, 0x73, 0x73, 0x75,
+ 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x20, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x69,
+ 0x74, 0x73, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6f, 0x6e, 0x20, 0x62,
+ 0x65, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x6f,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c,
+ 0x0d, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e,
+ 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63,
+ 0x72, 0x69, 0x62, 0x65, 0x73, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x72,
+ 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x62, 0x65, 0x68, 0x61,
+ 0x76, 0x69, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x68, 0x6f, 0x77, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x58, 0x4d, 0x4c, 0x0d, 0x0a, 0x64,
+ 0x61, 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x69, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76,
+ 0x69, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61,
+ 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x6f, 0x72, 0x69, 0x67, 0x69,
+ 0x6e, 0x2d, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x47, 0x6f, 0x61, 0x6c, 0x73, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x58, 0x4d, 0x4c,
+ 0x20, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70,
+ 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x47, 0x72, 0x6f,
+ 0x75, 0x70, 0x20, 0x28, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c,
+ 0x6c, 0x79, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x0d, 0x0a, 0x45, 0x64,
+ 0x69, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x52, 0x65, 0x76, 0x69,
+ 0x65, 0x77, 0x20, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x29, 0x20, 0x66, 0x6f,
+ 0x72, 0x6d, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x61, 0x75, 0x73, 0x70, 0x69, 0x63, 0x65, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64,
+ 0x20, 0x57, 0x69, 0x64, 0x65, 0x20, 0x57, 0x65, 0x62, 0x20, 0x43, 0x6f,
+ 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x75, 0x6d, 0x0d, 0x0a, 0x28, 0x57,
+ 0x33, 0x43, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x31, 0x39, 0x39, 0x36, 0x2e,
+ 0x20, 0x49, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x63, 0x68, 0x61, 0x69,
+ 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x4a, 0x6f, 0x6e, 0x20, 0x42,
+ 0x6f, 0x73, 0x61, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x75, 0x6e, 0x20,
+ 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63,
+ 0x74, 0x69, 0x76, 0x65, 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63,
+ 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61,
+ 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x61,
+ 0x6c, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x20, 0x47,
+ 0x72, 0x6f, 0x75, 0x70, 0x20, 0x28, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f,
+ 0x75, 0x73, 0x6c, 0x79, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61,
+ 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x0d, 0x0a,
+ 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x47, 0x72, 0x6f, 0x75,
+ 0x70, 0x29, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6f, 0x72, 0x67, 0x61,
+ 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x57, 0x33, 0x43, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x65,
+ 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x57, 0x6f, 0x72, 0x6b,
+ 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x69,
+ 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61,
+ 0x6e, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x78, 0x2e, 0x20,
+ 0x44, 0x61, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x6f, 0x6c, 0x6c, 0x79,
+ 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x57, 0x47, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x61, 0x63, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0d, 0x0a, 0x74, 0x68,
+ 0x65, 0x20, 0x57, 0x33, 0x43, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67,
+ 0x6e, 0x20, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x61, 0x72, 0x65, 0x3a, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x58, 0x4d, 0x4c, 0x20,
+ 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, 0x72,
+ 0x61, 0x69, 0x67, 0x68, 0x74, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64,
+ 0x6c, 0x79, 0x20, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x76,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72,
+ 0x6e, 0x65, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c,
+ 0x70, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20,
+ 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x61, 0x20, 0x77, 0x69,
+ 0x64, 0x65, 0x20, 0x76, 0x61, 0x72, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f,
+ 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70,
+ 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62,
+ 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x49, 0x74, 0x20,
+ 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x61, 0x73,
+ 0x79, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x70,
+ 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f,
+ 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x66,
+ 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20,
+ 0x6b, 0x65, 0x70, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x0d, 0x0a, 0x6d, 0x69,
+ 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x2c, 0x20, 0x69, 0x64, 0x65, 0x61, 0x6c,
+ 0x6c, 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75,
+ 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x2d,
+ 0x6c, 0x65, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x63,
+ 0x6c, 0x65, 0x61, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64,
+ 0x65, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64,
+ 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64,
+ 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x6c, 0x79, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x64,
+ 0x65, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e,
+ 0x63, 0x69, 0x73, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x70, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62,
+ 0x65, 0x20, 0x65, 0x61, 0x73, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x70, 0x3e, 0x54, 0x65, 0x72, 0x73, 0x65, 0x6e, 0x65, 0x73, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x6d, 0x61, 0x72, 0x6b,
+ 0x75, 0x70, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x6e,
+ 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61,
+ 0x6e, 0x63, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6f, 0x6c, 0x69, 0x73, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73,
+ 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2c, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74,
+ 0x65, 0x64, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x73,
+ 0x20, 0x28, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x0d, 0x0a, 0x31,
+ 0x30, 0x36, 0x34, 0x36, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x74,
+ 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x52, 0x46, 0x43, 0x20, 0x31, 0x37,
+ 0x36, 0x36, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75,
+ 0x61, 0x67, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x67, 0x73, 0x2c,
+ 0x0d, 0x0a, 0x49, 0x53, 0x4f, 0x20, 0x36, 0x33, 0x39, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2c, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x49, 0x53, 0x4f, 0x20, 0x33, 0x31, 0x36, 0x36, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x29, 0x2c,
+ 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x0d, 0x0a, 0x61,
+ 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73,
+ 0x73, 0x61, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x64, 0x65,
+ 0x72, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x56,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x26, 0x76, 0x65, 0x72, 0x73,
+ 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x58, 0x4d, 0x4c, 0x3b, 0x20, 0x61, 0x6e,
+ 0x64, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
+ 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x20, 0x70, 0x72,
+ 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x69, 0x74, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x76,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3c, 0x21, 0x2d, 0x2d,
+ 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x26, 0x64, 0x6f, 0x63,
+ 0x2e, 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x3b, 0x2e, 0x2d,
+ 0x2d, 0x3e, 0x20, 0x26, 0x64, 0x6f, 0x63, 0x2e, 0x64, 0x69, 0x73, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x2d, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x6f, 0x6c, 0x6f,
+ 0x67, 0x79, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54,
+ 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x6f, 0x6c, 0x6f,
+ 0x67, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64,
+ 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x73,
+ 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x0d,
+ 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x65,
+ 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e,
+ 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f,
+ 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x73, 0x74,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e,
+ 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x74,
+ 0x68, 0x6f, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x69, 0x6e, 0x67, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x3c, 0x67, 0x6c, 0x69,
+ 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x6d, 0x61, 0x79, 0x3c, 0x2f,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d, 0x61,
+ 0x79, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x4d, 0x61, 0x79,
+ 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x6f, 0x72, 0x73, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x70,
+ 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x62, 0x75, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x62, 0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x73, 0x20, 0x64,
+ 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x6d, 0x75, 0x73, 0x74, 0x3c,
+ 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65,
+ 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d,
+ 0x75, 0x73, 0x74, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x4d,
+ 0x75, 0x73, 0x74, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x69, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x0d, 0x0a, 0x61, 0x72,
+ 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74,
+ 0x6f, 0x20, 0x62, 0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x73, 0x20,
+ 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x3b, 0x20, 0x6f,
+ 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x2e, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x64, 0x6f, 0x20,
+ 0x4e, 0x4f, 0x54, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x21, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
+ 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65,
+ 0x73, 0x20, 0x61, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x61, 0x20, 0x27, 0x6d, 0x75, 0x73,
+ 0x74, 0x27, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x61, 0x73,
+ 0x20, 0x27, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x27, 0x2e,
+ 0x20, 0x2d, 0x4d, 0x53, 0x4d, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x65, 0x72, 0x72, 0x6f, 0x72,
+ 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d,
+ 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3e, 0x41, 0x20, 0x76, 0x69,
+ 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0d, 0x0a, 0x72, 0x65, 0x73,
+ 0x75, 0x6c, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x6e, 0x64,
+ 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x20, 0x43, 0x6f, 0x6e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77,
+ 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x64, 0x65, 0x74, 0x65,
+ 0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72,
+ 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0d, 0x0a,
+ 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x72, 0x65, 0x63, 0x6f,
+ 0x76, 0x65, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x69, 0x74, 0x2e,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f,
+ 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x66, 0x61,
+ 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3c, 0x2f, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65,
+ 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x66, 0x61, 0x74,
+ 0x61, 0x6c, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x46, 0x61,
+ 0x74, 0x61, 0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3e, 0x41,
+ 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x69,
+ 0x6e, 0x67, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d,
+ 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x70, 0x72, 0x6f, 0x63, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72,
+ 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x0d, 0x0a, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20,
+ 0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69,
+ 0x6e, 0x75, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69,
+ 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x64, 0x61, 0x74, 0x61,
+ 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61,
+ 0x79, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x75, 0x63,
+ 0x68, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x0d, 0x0a, 0x49, 0x6e, 0x20, 0x6f, 0x72, 0x64,
+ 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72,
+ 0x74, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6f, 0x66, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x75,
+ 0x6e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x0d, 0x0a,
+ 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x28,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x69,
+ 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x29, 0x20, 0x61, 0x76, 0x61,
+ 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2e, 0x20, 0x4f, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x20, 0x66,
+ 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69,
+ 0x73, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2c, 0x20,
+ 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x0d, 0x0a,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x69, 0x6e, 0x75, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c,
+ 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20,
+ 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69,
+ 0x6e, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x64,
+ 0x61, 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75,
+ 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x27, 0x73, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c,
+ 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x74,
+ 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x77, 0x61, 0x79,
+ 0x29, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e,
+ 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x61, 0x74, 0x75, 0x73, 0x65, 0x72, 0x6f, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x41, 0x74,
+ 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67,
+ 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0d, 0x0a, 0x6d,
+ 0x61, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x28,
+ 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x20, 0x76,
+ 0x65, 0x72, 0x62, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+ 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x62, 0x65, 0x68,
+ 0x61, 0x76, 0x65, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x62, 0x65, 0x64, 0x3b, 0x0d, 0x0a, 0x69, 0x66, 0x20, 0x69, 0x74,
+ 0x20, 0x64, 0x6f, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x75,
+ 0x73, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73,
+ 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f,
+ 0x72, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x0d, 0x0a,
+ 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x2e, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x69, 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61,
+ 0x69, 0x6e, 0x74, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x76, 0x63, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d,
+ 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, 0x63, 0x6f,
+ 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x22, 0x3e, 0x41, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61,
+ 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x61,
+ 0x6c, 0x6c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x22, 0x3e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x20, 0x56, 0x69,
+ 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x63, 0x6f,
+ 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3b, 0x20, 0x74, 0x68,
+ 0x65, 0x79, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x2c, 0x20, 0x61, 0x74, 0x20,
+ 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2c,
+ 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64,
+ 0x20, 0x62, 0x79, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x77, 0x65, 0x6c, 0x6c,
+ 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x20,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x3c, 0x2f,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x77, 0x66,
+ 0x63, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x57, 0x65, 0x6c,
+ 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73,
+ 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x22,
+ 0x3e, 0x41, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x0d, 0x0a, 0x74,
+ 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x77,
+ 0x65, 0x6c, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x3e, 0x77,
+ 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x20,
+ 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0d, 0x0a,
+ 0x6f, 0x66, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d,
+ 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+ 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x22, 0x3e, 0x66,
+ 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d,
+ 0x3d, 0x22, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3e, 0x28, 0x4f, 0x66,
+ 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x72, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x3a, 0x29, 0x20, 0x54, 0x77, 0x6f, 0x20,
+ 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x0d, 0x0a, 0x6f, 0x72, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20,
+ 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63,
+ 0x61, 0x6c, 0x2e, 0x20, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6d, 0x75, 0x6c, 0x74,
+ 0x69, 0x70, 0x6c, 0x65, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x0d, 0x0a, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x53,
+ 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x20, 0x31, 0x30, 0x36, 0x34, 0x36, 0x20,
+ 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x62, 0x6f,
+ 0x74, 0x68, 0x20, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73,
+ 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x62, 0x61, 0x73, 0x65,
+ 0x2b, 0x64, 0x69, 0x61, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x20, 0x66,
+ 0x6f, 0x72, 0x6d, 0x73, 0x29, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20,
+ 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79,
+ 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61,
+ 0x6d, 0x65, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x6f, 0x74,
+ 0x68, 0x0d, 0x0a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x20,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x38, 0x35, 0x22, 0x3e, 0x5b,
+ 0x45, 0x38, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x41, 0x74,
+ 0x0d, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72,
+ 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c,
+ 0x69, 0x7a, 0x65, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73,
+ 0x6f, 0x6d, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61,
+ 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x20, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x4e, 0x6f, 0x0d, 0x0a, 0x63, 0x61, 0x73,
+ 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73,
+ 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x2e, 0x20,
+ 0x28, 0x4f, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72,
+ 0x3a, 0x29, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0d,
+ 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x61, 0x20, 0x67,
+ 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x70,
+ 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x66,
+ 0x20, 0x69, 0x74, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x20,
+ 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75,
+ 0x61, 0x67, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
+ 0x64, 0x20, 0x62, 0x79, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70,
+ 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x28,
+ 0x4f, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d,
+ 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x3a, 0x29, 0x20, 0x41, 0x6e, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68,
+ 0x65, 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x77, 0x68, 0x65, 0x6e,
+ 0x20, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x73, 0x68,
+ 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+ 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x20, 0x3c, 0x73, 0x70, 0x65,
+ 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2f,
+ 0x3e, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e,
+ 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,
+ 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x22,
+ 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x46, 0x6f, 0x72, 0x20, 0x43,
+ 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,
+ 0x22, 0x3e, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x38, 0x37,
+ 0x22, 0x3e, 0x5b, 0x45, 0x38, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x4d, 0x61, 0x72, 0x6b, 0x73, 0x0d, 0x0a, 0x61, 0x20, 0x73, 0x65,
+ 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x62, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x3e, 0x20, 0x61, 0x20, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x69, 0x6e, 0x63, 0x6c,
+ 0x75, 0x64, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x6c, 0x65, 0x6c, 0x79, 0x20,
+ 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x0d, 0x0a, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x72, 0x65, 0x6d, 0x61,
+ 0x69, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,
+ 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x53, 0x47, 0x4d, 0x4c,
+ 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c,
+ 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x66,
+ 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72,
+ 0x6f, 0x70, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x46, 0x6f,
+ 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61,
+ 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x3e, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64,
+ 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c,
+ 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65,
+ 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x38, 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x38, 0x37,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x4d, 0x61, 0x72, 0x6b, 0x73,
+ 0x0d, 0x0a, 0x61, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65,
+ 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x69, 0x6e, 0x67, 0x3c,
+ 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x61, 0x20, 0x6e,
+ 0x6f, 0x6e, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72,
+ 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x74,
+ 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x0d, 0x0a,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62,
+ 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20,
+ 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74,
+ 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65,
+ 0x64, 0x0d, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x53,
+ 0x47, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x70, 0x72, 0x65,
+ 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x26, 0x57, 0x65,
+ 0x62, 0x53, 0x47, 0x4d, 0x4c, 0x3b, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x31, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x21, 0x2d, 0x2d, 0x20, 0x26, 0x44, 0x6f, 0x63, 0x73, 0x3b, 0x20, 0x2d,
+ 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x64, 0x6f, 0x63, 0x22, 0x20, 0x74,
+ 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x58, 0x4d, 0x4c, 0x20, 0x44, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x20, 0x41, 0x20, 0x64, 0x61,
+ 0x74, 0x61, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73,
+ 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x58, 0x4d,
+ 0x4c, 0x0d, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74,
+ 0x20, 0x69, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x77, 0x65, 0x6c,
+ 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x3e, 0x77, 0x65, 0x6c,
+ 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x0d, 0x0a, 0x61, 0x73, 0x20,
+ 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x41, 0x20, 0x77, 0x65, 0x6c,
+ 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61,
+ 0x79, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x0d, 0x0a, 0x62, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x69, 0x66,
+ 0x20, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x65, 0x74, 0x73, 0x20, 0x63, 0x65,
+ 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65,
+ 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74,
+ 0x73, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x61, 0x63,
+ 0x68, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20,
+ 0x61, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x61, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c,
+ 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x20,
+ 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x2c, 0x0d,
+ 0x0a, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65,
+ 0x64, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x63,
+ 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x3e, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x2e, 0x0d, 0x0a, 0x41, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x6e, 0x74, 0x72, 0x65, 0x66, 0x22, 0x3e, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x74,
+ 0x6f, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x69, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x63, 0x61, 0x75,
+ 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20,
+ 0x41, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x62,
+ 0x65, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x3c,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x72, 0x6f, 0x6f, 0x74, 0x3c, 0x2f,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x3e,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x2e, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79,
+ 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f,
+ 0x73, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72,
+ 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, 0x6c, 0x6c,
+ 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69,
+ 0x63, 0x69, 0x74, 0x0d, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x2e,
+ 0x20, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61,
+ 0x6c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x20, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x6c, 0x79, 0x2c, 0x20, 0x61, 0x73, 0x20,
+ 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x0d, 0x0a, 0x69,
+ 0x6e, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x77, 0x66, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x2d, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d,
+ 0x65, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x57, 0x65, 0x6c, 0x6c, 0x2d, 0x46, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x77, 0x65, 0x6c, 0x6c, 0x66, 0x6f, 0x72,
+ 0x6d, 0x65, 0x64, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x57,
+ 0x65, 0x6c, 0x6c, 0x2d, 0x46, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x3e,
+ 0x20, 0x41, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f,
+ 0x72, 0x6d, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x69, 0x66, 0x3a, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x6f, 0x6c,
+ 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x70, 0x3e, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x20,
+ 0x61, 0x20, 0x77, 0x68, 0x6f, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x49, 0x74, 0x20, 0x6d, 0x65,
+ 0x65, 0x74, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x6e,
+ 0x65, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69,
+ 0x6e, 0x74, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x45, 0x61, 0x63, 0x68,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x22, 0x3e,
+ 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x69,
+ 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x77, 0x65, 0x6c, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65,
+ 0x64, 0x22, 0x3e, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d,
+ 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x6c, 0x61, 0x6e,
+ 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x70,
+ 0x72, 0x6f, 0x6c, 0x6f, 0x67, 0x22, 0x3e, 0x70, 0x72, 0x6f, 0x6c, 0x6f,
+ 0x67, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x22, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4d, 0x69, 0x73, 0x63, 0x22, 0x3e,
+ 0x4d, 0x69, 0x73, 0x63, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2a, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x49, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x61, 0x69, 0x6e, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20,
+ 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x2a, 0x20, 0x4e,
+ 0x2e, 0x42, 0x2e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x61,
+ 0x64, 0x65, 0x72, 0x73, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c,
+ 0x79, 0x20, 0x4a, 0x43, 0x29, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67,
+ 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20,
+ 0x61, 0x77, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x72, 0x65, 0x64, 0x75, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x2e, 0x20, 0x49,
+ 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20,
+ 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65,
+ 0x64, 0x75, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x3a, 0x0d, 0x0a, 0x69, 0x74,
+ 0x20, 0x2a, 0x73, 0x61, 0x79, 0x73, 0x2a, 0x20, 0x69, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x69, 0x6e,
+ 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61,
+ 0x6c, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68,
+ 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6d,
+ 0x6d, 0x61, 0x72, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x62, 0x79, 0x20, 0x64,
+ 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x74,
+ 0x27, 0x73, 0x0d, 0x0a, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6c,
+ 0x79, 0x20, 0x72, 0x65, 0x64, 0x75, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x2e,
+ 0x20, 0x49, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x74, 0x68, 0x69,
+ 0x6e, 0x6b, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x72, 0x68, 0x65, 0x74,
+ 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x0d, 0x0a, 0x72, 0x65,
+ 0x64, 0x75, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x75,
+ 0x6e, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x2c, 0x20,
+ 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x49,
+ 0x27, 0x6d, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x69,
+ 0x74, 0x2e, 0x20, 0x49, 0x74, 0x0d, 0x0a, 0x63, 0x6f, 0x75, 0x6c, 0x64,
+ 0x20, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x20, 0x75, 0x73, 0x65,
+ 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74,
+ 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x66, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x73, 0x74,
+ 0x72, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x20, 0x2d, 0x4d, 0x53, 0x4d,
+ 0x20, 0x2a, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x72, 0x6f, 0x6f, 0x74,
+ 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x52, 0x6f, 0x6f, 0x74,
+ 0x20, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x54, 0x68,
+ 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74,
+ 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2c, 0x0d, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x72, 0x6f,
+ 0x6f, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x2c, 0x20, 0x6f,
+ 0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6e, 0x6f, 0x20, 0x70,
+ 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68,
+ 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x0d, 0x0a, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65,
+ 0x72, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x31,
+ 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x46, 0x6f, 0x72, 0x0d,
+ 0x0a, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x66, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x73, 0x74, 0x61,
+ 0x67, 0x22, 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x69,
+ 0x73, 0x20, 0x69, 0x6e, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x6f,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x74, 0x61, 0x67, 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a,
+ 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20,
+ 0x4d, 0x6f, 0x72, 0x65, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x79, 0x20,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x64,
+ 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65,
+ 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x6e, 0x65, 0x73,
+ 0x74, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x6c, 0x79, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6f,
+ 0x74, 0x68, 0x65, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6f, 0x6c, 0x69, 0x73,
+ 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x20,
+ 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74,
+ 0x2f, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3e, 0x41, 0x73, 0x20, 0x61,
+ 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x0d, 0x0a, 0x66,
+ 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6e, 0x6f, 0x6e, 0x2d,
+ 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x43, 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69,
+ 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3c, 0x65, 0x6c, 0x3e,
+ 0x50, 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x73, 0x75, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x3c, 0x65,
+ 0x6c, 0x3e, 0x43, 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x20, 0x69, 0x73, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x50, 0x3c,
+ 0x2f, 0x65, 0x6c, 0x3e, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x0d, 0x0a, 0x69,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20,
+ 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x65, 0x6c, 0x3e,
+ 0x50, 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x2e, 0x20, 0x3c, 0x65, 0x6c, 0x3e,
+ 0x50, 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61,
+ 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x43, 0x3c, 0x2f,
+ 0x65, 0x6c, 0x3e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x65, 0x6c,
+ 0x3e, 0x43, 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x20, 0x61, 0x73, 0x0d, 0x0a,
+ 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x6f, 0x66, 0x20,
+ 0x3c, 0x65, 0x6c, 0x3e, 0x50, 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x68,
+ 0x61, 0x72, 0x73, 0x65, 0x74, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20,
+ 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, 0x22, 0x3e,
+ 0x41, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x74, 0x65, 0x78, 0x74, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x2c, 0x0d, 0x0a, 0x61, 0x20, 0x73,
+ 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c,
+ 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x79, 0x0d, 0x0a,
+ 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x22,
+ 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x43, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x41, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x61,
+ 0x6e, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x69,
+ 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x61, 0x73,
+ 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62,
+ 0x79, 0x20, 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x20, 0x31, 0x30,
+ 0x36, 0x34, 0x36, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x31, 0x30, 0x36, 0x34,
+ 0x36, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x36, 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x37, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x28, 0x73, 0x65, 0x65, 0x0d, 0x0a, 0x61, 0x6c,
+ 0x73, 0x6f, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x31, 0x30, 0x36, 0x34, 0x36,
+ 0x2d, 0x32, 0x30, 0x30, 0x30, 0x22, 0x2f, 0x3e, 0x29, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x2e, 0x20, 0x4c, 0x65, 0x67, 0x61,
+ 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x61, 0x62, 0x2c, 0x20, 0x63, 0x61,
+ 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x0d, 0x0a, 0x72, 0x65, 0x74, 0x75,
+ 0x72, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x65, 0x65,
+ 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c,
+ 0x65, 0x67, 0x61, 0x6c, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x33, 0x35, 0x22, 0x3e, 0x5b, 0x45, 0x33, 0x35, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20,
+ 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x6f, 0x66, 0x20,
+ 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x20, 0x31, 0x30, 0x36, 0x34,
+ 0x36, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64,
+ 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c,
+ 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x39,
+ 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x54, 0x68, 0x65, 0x0d, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20,
+ 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x73, 0x20, 0x63, 0x69,
+ 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63,
+ 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x65, 0x63,
+ 0x2d, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74,
+ 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x20, 0x77, 0x65, 0x72, 0x65, 0x0d, 0x0a,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61,
+ 0x73, 0x20, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x2e, 0x20,
+ 0x4e, 0x65, 0x77, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64,
+ 0x64, 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x73,
+ 0x65, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x73, 0x20,
+ 0x62, 0x79, 0x20, 0x61, 0x6d, 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74,
+ 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x65, 0x64, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x65,
+ 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x2c, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x0d,
+ 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74,
+ 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x61,
+ 0x6e, 0x67, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65,
+ 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e,
+ 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x54, 0x68, 0x65,
+ 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x79, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x73, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c,
+ 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20,
+ 0x69, 0x6e, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a,
+ 0x36, 0x2e, 0x38, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72,
+ 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x55, 0x6e, 0x69, 0x63,
+ 0x6f, 0x64, 0x65, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x36, 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x37, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x28, 0x73, 0x65, 0x65, 0x0d, 0x0a, 0x61,
+ 0x6c, 0x73, 0x6f, 0x20, 0x44, 0x32, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x73,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x2e, 0x36, 0x20, 0x6f,
+ 0x66, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x33, 0x22,
+ 0x2f, 0x3e, 0x29, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e,
+ 0x2c, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x72,
+ 0x61, 0x67, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63,
+ 0x72, 0x61, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x68, 0x61, 0x72,
+ 0x33, 0x32, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62,
+ 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x52, 0x61,
+ 0x6e, 0x67, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70,
+ 0x63, 0x77, 0x32, 0x3d, 0x22, 0x34, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34,
+ 0x3d, 0x22, 0x31, 0x37, 0x2e, 0x35, 0x22, 0x20, 0x70, 0x63, 0x77, 0x35,
+ 0x3d, 0x22, 0x31, 0x31, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61,
+ 0x72, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x43, 0x68,
+ 0x61, 0x72, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x23, 0x78, 0x39, 0x20, 0x7c, 0x20, 0x23, 0x78, 0x41, 0x20, 0x7c,
+ 0x20, 0x23, 0x78, 0x44, 0x20, 0x7c, 0x20, 0x5b, 0x23, 0x78, 0x32, 0x30,
+ 0x2d, 0x23, 0x78, 0x44, 0x37, 0x46, 0x46, 0x5d, 0x20, 0x7c, 0x20, 0x5b,
+ 0x23, 0x78, 0x45, 0x30, 0x30, 0x30, 0x2d, 0x23, 0x78, 0x46, 0x46, 0x46,
+ 0x44, 0x5d, 0x20, 0x7c, 0x20, 0x5b, 0x23, 0x78, 0x31, 0x30, 0x30, 0x30,
+ 0x30, 0x2d, 0x23, 0x78, 0x31, 0x30, 0x46, 0x46, 0x46, 0x46, 0x5d, 0x3c,
+ 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x63, 0x6f, 0x6d, 0x3e,
+ 0x61, 0x6e, 0x79, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x65,
+ 0x78, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x73, 0x75, 0x72, 0x72, 0x6f, 0x67, 0x61, 0x74, 0x65, 0x20, 0x62,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2c, 0x20, 0x46, 0x46, 0x46, 0x45, 0x2c,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x46, 0x46, 0x46, 0x46, 0x2e, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f,
+ 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x63, 0x68,
+ 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f,
+ 0x69, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x62, 0x69,
+ 0x74, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x6d,
+ 0x61, 0x79, 0x0d, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x20, 0x66, 0x72, 0x6f,
+ 0x6d, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65,
+ 0x70, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x38,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36, 0x0d,
+ 0x0a, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x31, 0x30, 0x36, 0x34, 0x36, 0x3b, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x73, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x69, 0x6e,
+ 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e,
+ 0x20, 0x75, 0x73, 0x65, 0x2c, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x62, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
+ 0x67, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x70, 0x6c, 0x61, 0x79,
+ 0x2c, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73,
+ 0x73, 0x65, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x69,
+ 0x6e, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x0d, 0x0a,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x61, 0x72, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x52, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x63, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x75, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x0d, 0x0a,
+ 0x74, 0x68, 0x65, 0x20, 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x20,
+ 0x31, 0x30, 0x36, 0x34, 0x36, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20,
+ 0x62, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20,
+ 0x74, 0x6f, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65,
+ 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x68, 0x65,
+ 0x78, 0x61, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x65, 0x71,
+ 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20,
+ 0x69, 0x74, 0x73, 0x20, 0x55, 0x43, 0x53, 0x2d, 0x34, 0x20, 0x63, 0x6f,
+ 0x64, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69,
+ 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+ 0x6e, 0x2d, 0x73, 0x79, 0x6e, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x53, 0x79,
+ 0x6e, 0x74, 0x61, 0x63, 0x74, 0x69, 0x63, 0x20, 0x43, 0x6f, 0x6e, 0x73,
+ 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e,
+ 0x65, 0x73, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x73, 0x79, 0x6d, 0x62,
+ 0x6f, 0x6c, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x64,
+ 0x65, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67,
+ 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x28, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73,
+ 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d,
+ 0x6f, 0x72, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x28, 0x23,
+ 0x78, 0x32, 0x30, 0x29, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x61, 0x72, 0x72, 0x69, 0x61,
+ 0x67, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2c, 0x20,
+ 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x65, 0x65, 0x64, 0x73, 0x2c, 0x20,
+ 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67,
+ 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x20, 0x53, 0x70,
+ 0x61, 0x63, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70,
+ 0x63, 0x77, 0x32, 0x3d, 0x22, 0x34, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34,
+ 0x3d, 0x22, 0x31, 0x37, 0x2e, 0x35, 0x22, 0x20, 0x70, 0x63, 0x77, 0x35,
+ 0x3d, 0x22, 0x31, 0x31, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x53, 0x3c, 0x2f, 0x6c, 0x68,
+ 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x28, 0x23, 0x78, 0x32, 0x30,
+ 0x20, 0x7c, 0x20, 0x23, 0x78, 0x39, 0x20, 0x7c, 0x20, 0x23, 0x78, 0x44,
+ 0x20, 0x7c, 0x20, 0x23, 0x78, 0x41, 0x29, 0x2b, 0x3c, 0x2f, 0x72, 0x68,
+ 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70,
+ 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66,
+ 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x76,
+ 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x73, 0x20, 0x6c,
+ 0x65, 0x74, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x64, 0x69, 0x67, 0x69,
+ 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72,
+ 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73,
+ 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x33, 0x30, 0x22,
+ 0x3e, 0x5b, 0x45, 0x33, 0x30, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x41, 0x0d, 0x0a, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6f,
+ 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e,
+ 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x69, 0x63, 0x20,
+ 0x6f, 0x72, 0x20, 0x73, 0x79, 0x6c, 0x6c, 0x61, 0x62, 0x69, 0x63, 0x20,
+ 0x62, 0x61, 0x73, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x65,
+ 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x0d, 0x0a, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x46, 0x75, 0x6c, 0x6c, 0x20, 0x64,
+ 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x63, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x67, 0x69, 0x76,
+ 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72,
+ 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x43, 0x68, 0x61, 0x72,
+ 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22,
+ 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x41, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
+ 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x0d, 0x0a,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6c, 0x65, 0x74, 0x74, 0x65,
+ 0x72, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20,
+ 0x61, 0x20, 0x66, 0x65, 0x77, 0x20, 0x70, 0x75, 0x6e, 0x63, 0x74, 0x75,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x0d, 0x0a, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20,
+ 0x64, 0x69, 0x67, 0x69, 0x74, 0x73, 0x2c, 0x20, 0x68, 0x79, 0x70, 0x68,
+ 0x65, 0x6e, 0x73, 0x2c, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63,
+ 0x6f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x73,
+ 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x73, 0x74,
+ 0x6f, 0x70, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65,
+ 0x72, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x0d, 0x0a, 0x61, 0x73, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x73, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65,
+ 0x66, 0x3e, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x62, 0x65, 0x67,
+ 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3c,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x78, 0x6d, 0x6c, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x6f, 0x72, 0x20,
+ 0x61, 0x6e, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x28,
+ 0x28, 0x27, 0x58, 0x27, 0x7c, 0x27, 0x78, 0x27, 0x29, 0x20, 0x28, 0x27,
+ 0x4d, 0x27, 0x7c, 0x27, 0x6d, 0x27, 0x29, 0x20, 0x28, 0x27, 0x4c, 0x27,
+ 0x7c, 0x27, 0x6c, 0x27, 0x29, 0x29, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x2c, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65,
+ 0x72, 0x76, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61,
+ 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x72, 0x20,
+ 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x6e, 0x6f, 0x74,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x38, 0x22, 0x3e, 0x5b, 0x45,
+ 0x39, 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68, 0x65,
+ 0x0d, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x52, 0x65, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3c,
+ 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x2f, 0x3e,
+ 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6d,
+ 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+ 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x54, 0x68,
+ 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x75, 0x74,
+ 0x68, 0x6f, 0x72, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x0d,
+ 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x65, 0x78, 0x63, 0x65,
+ 0x70, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65,
+ 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x0d, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20,
+ 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41,
+ 0x6e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x4e, 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3e, 0x4e,
+ 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x29,
+ 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6d, 0x69, 0x78, 0x74,
+ 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0d,
+ 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70,
+ 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4e, 0x61, 0x6d,
+ 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
+ 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e,
+ 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x72,
+ 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4c,
+ 0x65, 0x74, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x4c, 0x65, 0x74, 0x74, 0x65,
+ 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x44, 0x69, 0x67,
+ 0x69, 0x74, 0x22, 0x3e, 0x44, 0x69, 0x67, 0x69, 0x74, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x0d, 0x0a, 0x7c, 0x20, 0x27, 0x2e, 0x27, 0x20, 0x7c, 0x20,
+ 0x27, 0x2d, 0x27, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x27, 0x20, 0x7c, 0x20,
+ 0x27, 0x3a, 0x27, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e,
+ 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x43, 0x6f, 0x6d,
+ 0x62, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x78, 0x74, 0x65, 0x6e,
+ 0x64, 0x65, 0x72, 0x22, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65,
+ 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73,
+ 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x22,
+ 0x3e, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x27, 0x20, 0x7c, 0x20, 0x27, 0x3a, 0x27,
+ 0x29, 0x20, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x72, 0x22,
+ 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x29, 0x2a, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72,
+ 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61,
+ 0x6d, 0x65, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e,
+ 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61,
+ 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e,
+ 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65,
+ 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29,
+ 0x2a, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x6d, 0x74, 0x6f, 0x6b,
+ 0x65, 0x6e, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x4e,
+ 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e,
+ 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68,
+ 0x61, 0x72, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x68, 0x61, 0x72,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2b, 0x3c, 0x2f, 0x72, 0x68, 0x73,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x4e, 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x4e, 0x6d, 0x74, 0x6f, 0x6b, 0x65,
+ 0x6e, 0x73, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x4e, 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3e, 0x4e, 0x6d,
+ 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x28,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e,
+ 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3e, 0x4e, 0x6d, 0x74, 0x6f,
+ 0x6b, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2a, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20,
+ 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+ 0x67, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x6f,
+ 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x20,
+ 0x75, 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x61, 0x73, 0x20, 0x61, 0x20, 0x64,
+ 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+ 0x2e, 0x20, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x0d, 0x0a,
+ 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x28, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x45,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x29, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x73, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x28, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2c, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x0d,
+ 0x0a, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x74, 0x65,
+ 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c,
+ 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29,
+ 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x61, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x74, 0x65,
+ 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c,
+ 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d,
+ 0x0a, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73,
+ 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x73,
+ 0x63, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67,
+ 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x73,
+ 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72,
+ 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x27, 0x22, 0x27, 0x20, 0x28, 0x5b, 0x5e, 0x25,
+ 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x22, 0x5d, 0x20, 0x7c, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x45,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x50,
+ 0x45, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x52, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2a, 0x20, 0x27,
+ 0x22, 0x27, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x20,
+ 0x22, 0x27, 0x22, 0x20, 0x28, 0x5b, 0x5e, 0x25, 0x26, 0x61, 0x6d, 0x70,
+ 0x3b, 0x27, 0x5d, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x45, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x50, 0x45, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x22, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2a, 0x20, 0x22, 0x27, 0x22, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x41, 0x74, 0x74,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x27, 0x22, 0x27, 0x20, 0x28, 0x5b, 0x5e, 0x26,
+ 0x6c, 0x74, 0x3b, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x22, 0x5d, 0x20, 0x7c,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3e,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x29, 0x2a, 0x0d, 0x0a, 0x27, 0x22, 0x27, 0x20, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x20, 0x22, 0x27, 0x22, 0x20, 0x28,
+ 0x5b, 0x5e, 0x26, 0x6c, 0x74, 0x3b, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x27,
+ 0x5d, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x22, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2a, 0x0d, 0x0a, 0x22, 0x27, 0x22,
+ 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
+ 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69,
+ 0x74, 0x65, 0x72, 0x61, 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x28, 0x27, 0x22, 0x27, 0x20, 0x5b, 0x5e, 0x22,
+ 0x5d, 0x2a, 0x20, 0x27, 0x22, 0x27, 0x29, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x28, 0x22, 0x27, 0x22, 0x20, 0x5b, 0x5e, 0x27, 0x5d,
+ 0x2a, 0x20, 0x22, 0x27, 0x22, 0x29, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x50, 0x75, 0x62, 0x69, 0x64, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x50, 0x75,
+ 0x62, 0x69, 0x64, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x22, 0x27,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x50, 0x75, 0x62, 0x69, 0x64, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e,
+ 0x50, 0x75, 0x62, 0x69, 0x64, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x2a, 0x20, 0x27, 0x22, 0x27, 0x0d, 0x0a, 0x7c, 0x20, 0x22,
+ 0x27, 0x22, 0x20, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x75, 0x62, 0x69, 0x64, 0x43, 0x68, 0x61,
+ 0x72, 0x22, 0x3e, 0x50, 0x75, 0x62, 0x69, 0x64, 0x43, 0x68, 0x61, 0x72,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x2d, 0x20, 0x22, 0x27, 0x22, 0x29,
+ 0x2a, 0x20, 0x22, 0x27, 0x22, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50,
+ 0x75, 0x62, 0x69, 0x64, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x50, 0x75, 0x62, 0x69, 0x64, 0x43, 0x68,
+ 0x61, 0x72, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x23, 0x78, 0x32, 0x30, 0x20, 0x7c, 0x20, 0x23, 0x78, 0x44, 0x20,
+ 0x7c, 0x20, 0x23, 0x78, 0x41, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x2d, 0x27, 0x28,
+ 0x29, 0x2b, 0x2c, 0x2e, 0x2f, 0x3a, 0x3d, 0x3f, 0x3b, 0x21, 0x2a, 0x23,
+ 0x40, 0x24, 0x5f, 0x25, 0x5d, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x6e, 0x6f, 0x74,
+ 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x37, 0x32, 0x22, 0x3e, 0x5b, 0x45,
+ 0x37, 0x32, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x41, 0x6c, 0x74,
+ 0x68, 0x6f, 0x75, 0x67, 0x68, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e,
+ 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x69,
+ 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67,
+ 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x0d, 0x0a, 0x28, 0x65,
+ 0x2e, 0x67, 0x2e, 0x2c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26,
+ 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x6d,
+ 0x79, 0x6c, 0x74, 0x20, 0x22, 0x26, 0x6c, 0x74, 0x3b, 0x22, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x29, 0x2c, 0x20, 0x69, 0x74, 0x20,
+ 0x69, 0x73, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x6c, 0x79, 0x20,
+ 0x61, 0x64, 0x76, 0x69, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61,
+ 0x76, 0x6f, 0x69, 0x64, 0x0d, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70,
+ 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x20, 0x73, 0x69, 0x6e, 0x63,
+ 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+ 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x61, 0x20, 0x77, 0x65, 0x6c, 0x6c,
+ 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x0d,
+ 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x43, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x54, 0x65, 0x78,
+ 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20,
+ 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x64,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x64,
+ 0x61, 0x74, 0x61, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x22, 0x0d, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x3d,
+ 0x22, 0x4d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x22, 0x3e, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x3e, 0x4d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x67, 0x22, 0x3e, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x65, 0x74, 0x61, 0x67, 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x2d,
+ 0x74, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6d, 0x70,
+ 0x74, 0x79, 0x22, 0x3e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x61, 0x67, 0x73, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x66, 0x22, 0x3e,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68,
+ 0x61, 0x72, 0x72, 0x65, 0x66, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x64, 0x73, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x43, 0x44, 0x41, 0x54, 0x41,
+ 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d,
+ 0x69, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x69, 0x22, 0x3e, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74,
+ 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61,
+ 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65,
+ 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x38, 0x39, 0x22, 0x3e, 0x5b, 0x45, 0x38, 0x39,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x6e, 0x74, 0x0d, 0x0a,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x58, 0x4d, 0x4c, 0x44,
+ 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x2c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6c,
+ 0x22, 0x3e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x77,
+ 0x68, 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x28,
+ 0x74, 0x68, 0x61, 0x74, 0x0d, 0x0a, 0x69, 0x73, 0x2c, 0x20, 0x6f, 0x75,
+ 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69,
+ 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x29, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72,
+ 0x64, 0x61, 0x74, 0x61, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22,
+ 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x44, 0x61,
+ 0x74, 0x61, 0x22, 0x3e, 0x41, 0x6c, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x0d, 0x0a, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x70, 0x65,
+ 0x72, 0x73, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x28, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x29, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74,
+ 0x20, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b,
+ 0x65, 0x74, 0x20, 0x28, 0x26, 0x6c, 0x74, 0x3b, 0x29, 0x20, 0x6d, 0x61,
+ 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x0d, 0x0a, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72,
+ 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3c, 0x65, 0x6d, 0x70,
+ 0x68, 0x3e, 0x6f, 0x6e, 0x6c, 0x79, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68,
+ 0x3e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20,
+ 0x61, 0x73, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65,
+ 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x72,
+ 0x0d, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22,
+ 0x3e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x61, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x70, 0x69, 0x22, 0x3e, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72,
+ 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x63, 0x64, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x22, 0x3e, 0x43, 0x44, 0x41, 0x54, 0x41, 0x20, 0x73, 0x65, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x2e, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31,
+ 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x54, 0x68, 0x65, 0x79, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20,
+ 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x6c, 0x69, 0x74, 0x65, 0x6e, 0x74, 0x76, 0x61, 0x6c,
+ 0x22, 0x3e, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x6f, 0x66,
+ 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x73, 0x65, 0x65,
+ 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x77, 0x66, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x46, 0x49, 0x4e,
+ 0x41, 0x4c, 0x20, 0x45, 0x44, 0x49, 0x54, 0x3a, 0x20, 0x72, 0x65, 0x73,
+ 0x74, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x20, 0x69,
+ 0x74, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a,
+ 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20,
+ 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x77,
+ 0x68, 0x65, 0x72, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x22, 0x3e, 0x65, 0x73, 0x63, 0x61,
+ 0x70, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x69, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61,
+ 0x72, 0x72, 0x65, 0x66, 0x22, 0x3e, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69,
+ 0x63, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x6f, 0x72,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73,
+ 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x61, 0x6d, 0x70, 0x3b, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70,
+ 0x3b, 0x6c, 0x74, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x72, 0x65, 0x73,
+ 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x2e, 0x20, 0x54,
+ 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x6e, 0x67,
+ 0x6c, 0x65, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x28,
+ 0x3e, 0x29, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65,
+ 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x75, 0x73,
+ 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69,
+ 0x6e, 0x67, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x67, 0x74, 0x3b,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6d,
+ 0x70, 0x61, 0x74, 0x22, 0x3e, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d,
+ 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x62, 0x65,
+ 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x0d, 0x0a, 0x75, 0x73,
+ 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x67, 0x74,
+ 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69,
+ 0x74, 0x0d, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+ 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20,
+ 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2c, 0x20,
+ 0x77, 0x68, 0x65, 0x6e, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73,
+ 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x63, 0x64, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x22, 0x3e, 0x43, 0x44, 0x41, 0x54, 0x41, 0x0d, 0x0a, 0x73, 0x65, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e,
+ 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a,
+ 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x64, 0x65, 0x6c,
+ 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e,
+ 0x79, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x2e, 0x20, 0x49, 0x6e,
+ 0x20, 0x61, 0x20, 0x43, 0x44, 0x41, 0x54, 0x41, 0x20, 0x73, 0x65, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x73,
+ 0x20, 0x61, 0x6e, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20,
+ 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x44, 0x41, 0x54,
+ 0x41, 0x2d, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x6c,
+ 0x6f, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74,
+ 0x65, 0x72, 0x2c, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x54, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+ 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x0d,
+ 0x0a, 0x61, 0x70, 0x6f, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x68, 0x65, 0x20,
+ 0x6f, 0x72, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x20, 0x28, 0x27, 0x29, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65,
+ 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64,
+ 0x20, 0x61, 0x73, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x61, 0x70,
+ 0x6f, 0x73, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2d,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x28, 0x22, 0x29, 0x20, 0x61, 0x73, 0x20, 0x3c,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72,
+ 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e,
+ 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x43,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x44, 0x61, 0x74,
+ 0x61, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43,
+ 0x68, 0x61, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x44, 0x61, 0x74, 0x61,
+ 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x5b,
+ 0x5e, 0x26, 0x6c, 0x74, 0x3b, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x5d, 0x2a,
+ 0x20, 0x2d, 0x20, 0x28, 0x5b, 0x5e, 0x26, 0x6c, 0x74, 0x3b, 0x26, 0x61,
+ 0x6d, 0x70, 0x3b, 0x5d, 0x2a, 0x20, 0x27, 0x5d, 0x5d, 0x26, 0x67, 0x74,
+ 0x3b, 0x27, 0x20, 0x5b, 0x5e, 0x26, 0x6c, 0x74, 0x3b, 0x26, 0x61, 0x6d,
+ 0x70, 0x3b, 0x5d, 0x2a, 0x29, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69,
+ 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22,
+ 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x43, 0x6f, 0x6d, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x6d,
+ 0x61, 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x0d, 0x0a, 0x61,
+ 0x6e, 0x79, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x75,
+ 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x22,
+ 0x3e, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x3b, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x61,
+ 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x65,
+ 0x79, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x61, 0x74, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x0d,
+ 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x2e,
+ 0x20, 0x54, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x27, 0x73,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x64, 0x61,
+ 0x74, 0x61, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x0d, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x3b, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20,
+ 0x6d, 0x61, 0x79, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x65, 0x65,
+ 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20,
+ 0x69, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x0d, 0x0a, 0x61, 0x70, 0x70, 0x6c,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72,
+ 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x74, 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63,
+ 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x0d, 0x0a,
+ 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74,
+ 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20,
+ 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x2d, 0x2d, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20, 0x28, 0x64, 0x6f, 0x75, 0x62,
+ 0x6c, 0x65, 0x2d, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x29, 0x0d, 0x0a,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x63, 0x63,
+ 0x75, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x0d,
+ 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x36, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x33, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
+ 0x65, 0x72, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e,
+ 0x69, 0x7a, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d,
+ 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x6f, 0x6d,
+ 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73,
+ 0x3e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6c, 0x68,
+ 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74, 0x3b,
+ 0x21, 0x2d, 0x2d, 0x27, 0x20, 0x28, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x22,
+ 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x2d,
+ 0x20, 0x27, 0x2d, 0x27, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x27, 0x2d, 0x27,
+ 0x0d, 0x0a, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61,
+ 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x2d, 0x20, 0x27, 0x2d, 0x27,
+ 0x29, 0x29, 0x29, 0x2a, 0x20, 0x27, 0x2d, 0x2d, 0x3e, 0x27, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65,
+ 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x26, 0x63, 0x6f, 0x6d, 0x6f,
+ 0x3b, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x26, 0x6c, 0x74, 0x3b, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x20, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x20, 0x26,
+ 0x6c, 0x74, 0x3b, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x20, 0x26, 0x63, 0x6f,
+ 0x6d, 0x63, 0x3b, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x32, 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x32, 0x37, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x4e, 0x6f, 0x74, 0x65, 0x0d, 0x0a, 0x74, 0x68,
+ 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d,
+ 0x61, 0x72, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+ 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69,
+ 0x6e, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2d, 0x2d, 0x2d, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2e, 0x20, 0x54, 0x68, 0x65,
+ 0x0d, 0x0a, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20,
+ 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x3c,
+ 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x6e, 0x6f, 0x74, 0x3c, 0x2f, 0x65, 0x6d,
+ 0x70, 0x68, 0x3e, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72,
+ 0x6d, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65,
+ 0x67, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x2d, 0x2d, 0x20, 0x42, 0x2b, 0x2c,
+ 0x20, 0x42, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x42, 0x2d, 0x2d, 0x2d, 0x3e,
+ 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76,
+ 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x70, 0x69, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65,
+ 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x69, 0x22,
+ 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20,
+ 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x28, 0x50, 0x49,
+ 0x73, 0x29, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61,
+ 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c,
+ 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x50, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x49, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c,
+ 0x68, 0x73, 0x3e, 0x50, 0x49, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x3f, 0x27, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x50, 0x49, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x3e, 0x50, 0x49,
+ 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x2a, 0x20, 0x2d, 0x20, 0x28, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61,
+ 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x2a, 0x20, 0x26, 0x70, 0x69, 0x63, 0x3b, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72,
+ 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2a,
+ 0x29, 0x29, 0x29, 0x3f, 0x20, 0x26, 0x70, 0x69, 0x63, 0x3b, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x49, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x50, 0x49, 0x54,
+ 0x61, 0x72, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61,
+ 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x2d, 0x20, 0x28, 0x28,
+ 0x27, 0x58, 0x27, 0x20, 0x7c, 0x20, 0x27, 0x78, 0x27, 0x29, 0x20, 0x28,
+ 0x27, 0x4d, 0x27, 0x20, 0x7c, 0x0d, 0x0a, 0x27, 0x6d, 0x27, 0x29, 0x20,
+ 0x28, 0x27, 0x4c, 0x27, 0x20, 0x7c, 0x20, 0x27, 0x6c, 0x27, 0x29, 0x29,
+ 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x50, 0x49, 0x73, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x27, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68,
+ 0x61, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x62,
+ 0x75, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70,
+ 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67,
+ 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70,
+ 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68,
+ 0x65, 0x20, 0x50, 0x49, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x73, 0x0d,
+ 0x0a, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67,
+ 0x65, 0x74, 0x20, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x49, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
+ 0x22, 0x3e, 0x50, 0x49, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x29, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f,
+ 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72,
+ 0x67, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3c, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x58,
+ 0x4d, 0x4c, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x78, 0x6d, 0x6c, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x20,
+ 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72,
+ 0x76, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61, 0x6e,
+ 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x66,
+ 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0d, 0x0a,
+ 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x22, 0x3e, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6d, 0x65, 0x63,
+ 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x0d, 0x0a, 0x6d, 0x61, 0x79, 0x20,
+ 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x50, 0x49,
+ 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x2e, 0x20, 0x3c, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x33, 0x22, 0x3e, 0x5b, 0x45,
+ 0x36, 0x33, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x50, 0x61, 0x72,
+ 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65,
+ 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69,
+ 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76,
+ 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x63, 0x64, 0x61, 0x74, 0x61, 0x2d,
+ 0x73, 0x65, 0x63, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x43, 0x44, 0x41, 0x54, 0x41, 0x20, 0x53, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x64, 0x73, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d,
+ 0x22, 0x43, 0x44, 0x41, 0x54, 0x41, 0x20, 0x53, 0x65, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x43, 0x44,
+ 0x41, 0x54, 0x41, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x6d, 0x61, 0x79,
+ 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x77, 0x68,
+ 0x65, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f,
+ 0x63, 0x63, 0x75, 0x72, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x65,
+ 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73,
+ 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65,
+ 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x63,
+ 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x6d,
+ 0x61, 0x72, 0x6b, 0x75, 0x70, 0x2e, 0x0d, 0x0a, 0x43, 0x44, 0x41, 0x54,
+ 0x41, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x62,
+ 0x65, 0x67, 0x69, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c,
+ 0x74, 0x3b, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69,
+ 0x6e, 0x67, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x3a, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70,
+ 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x43, 0x44, 0x41,
+ 0x54, 0x41, 0x20, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x44, 0x53,
+ 0x65, 0x63, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e,
+ 0x43, 0x44, 0x53, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e,
+ 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x44, 0x53, 0x74, 0x61, 0x72, 0x74,
+ 0x22, 0x3e, 0x43, 0x44, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x43, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x43, 0x44,
+ 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74,
+ 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x44,
+ 0x45, 0x6e, 0x64, 0x22, 0x3e, 0x43, 0x44, 0x45, 0x6e, 0x64, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x44, 0x53,
+ 0x74, 0x61, 0x72, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73,
+ 0x3e, 0x43, 0x44, 0x53, 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x6c, 0x68,
+ 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74, 0x3b,
+ 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x27, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x43, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x43, 0x44, 0x61, 0x74, 0x61, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x28, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68,
+ 0x61, 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x2a, 0x20, 0x2d, 0x20, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e,
+ 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2a, 0x0d, 0x0a,
+ 0x27, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x27, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61,
+ 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x2a, 0x29, 0x29, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72,
+ 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x44,
+ 0x45, 0x6e, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e,
+ 0x43, 0x44, 0x45, 0x6e, 0x64, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x27, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x27,
+ 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x57, 0x69, 0x74, 0x68, 0x69, 0x6e,
+ 0x20, 0x61, 0x20, 0x43, 0x44, 0x41, 0x54, 0x41, 0x20, 0x73, 0x65, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x43, 0x44, 0x45, 0x6e, 0x64, 0x22, 0x3e, 0x43, 0x44,
+ 0x45, 0x6e, 0x64, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x73, 0x74, 0x72,
+ 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x0d, 0x0a, 0x72, 0x65, 0x63, 0x6f,
+ 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x61, 0x6e, 0x67, 0x6c, 0x65,
+ 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x61, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6e, 0x64, 0x73,
+ 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x0d, 0x0a,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6c, 0x69, 0x74,
+ 0x65, 0x72, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x20, 0x74,
+ 0x68, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74,
+ 0x29, 0x20, 0x62, 0x65, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64,
+ 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70,
+ 0x3b, 0x6c, 0x74, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x61, 0x6e, 0x64,
+ 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x61, 0x6d, 0x70, 0x3b, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x2e, 0x20, 0x43, 0x44, 0x41, 0x54, 0x41, 0x20, 0x73, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f,
+ 0x74, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x43, 0x44, 0x41, 0x54,
+ 0x41, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x69,
+ 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74,
+ 0x3b, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74, 0x3b,
+ 0x2f, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e,
+ 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3e,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x64, 0x61,
+ 0x74, 0x61, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d,
+ 0x61, 0x72, 0x6b, 0x75, 0x70, 0x22, 0x3e, 0x6d, 0x61, 0x72, 0x6b, 0x75,
+ 0x70, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x3a,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c,
+ 0x74, 0x3b, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x26, 0x6c,
+ 0x74, 0x3b, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x3e, 0x48,
+ 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21,
+ 0x26, 0x6c, 0x74, 0x3b, 0x2f, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e,
+ 0x67, 0x3e, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x20, 0x3c, 0x2f, 0x65,
+ 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6c, 0x6f, 0x67, 0x2d, 0x64, 0x74,
+ 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x50,
+ 0x72, 0x6f, 0x6c, 0x6f, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x44, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20,
+ 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x20,
+ 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x58, 0x4d, 0x4c, 0x20, 0x44, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x58,
+ 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+ 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x37,
+ 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x30, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x62, 0x65, 0x67, 0x69, 0x6e,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x58, 0x4d,
+ 0x4c, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x64,
+ 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20,
+ 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69,
+ 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+ 0x6c, 0x65, 0x74, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x77, 0x65, 0x6c, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x22,
+ 0x3e, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x62,
+ 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x3a, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x3c, 0x21, 0x5b,
+ 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20,
+ 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31, 0x2e, 0x30,
+ 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e,
+ 0x67, 0x3e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72,
+ 0x6c, 0x64, 0x21, 0x3c, 0x2f, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e,
+ 0x67, 0x3e, 0x20, 0x5d, 0x5d, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x20, 0x69,
+ 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54,
+ 0x41, 0x5b, 0x3c, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x3e,
+ 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64,
+ 0x21, 0x3c, 0x2f, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x3e,
+ 0x5d, 0x5d, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x54, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x31, 0x2e, 0x30,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62,
+ 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e,
+ 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x69,
+ 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f,
+ 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3c,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x31, 0x2e, 0x30, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74,
+ 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f,
+ 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+ 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x74,
+ 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x67, 0x72,
+ 0x6f, 0x75, 0x70, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x67, 0x69, 0x76, 0x65,
+ 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x3c, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x31, 0x2e,
+ 0x30, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x62, 0x75, 0x74, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x64,
+ 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69,
+ 0x63, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69,
+ 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f,
+ 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x66, 0x75, 0x74,
+ 0x75, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+ 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x58, 0x4d, 0x4c, 0x2c, 0x20, 0x6e, 0x6f,
+ 0x72, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x2c, 0x20, 0x74,
+ 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x61,
+ 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x6e, 0x75, 0x6d,
+ 0x62, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d,
+ 0x65, 0x2e, 0x20, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x0d, 0x0a, 0x66, 0x75,
+ 0x74, 0x75, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20,
+ 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20,
+ 0x61, 0x73, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x74,
+ 0x6f, 0x0d, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,
+ 0x20, 0x6f, 0x66, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69,
+ 0x63, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65,
+ 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73,
+ 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x69, 0x74, 0x20, 0x62, 0x65, 0x63,
+ 0x6f, 0x6d, 0x65, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72,
+ 0x79, 0x2e, 0x0d, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61,
+ 0x6c, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69,
+ 0x76, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+ 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x0d, 0x0a,
+ 0x74, 0x68, 0x65, 0x79, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+ 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x66, 0x75, 0x6e,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x61,
+ 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x62, 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x6c,
+ 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63,
+ 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68,
+ 0x20, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c,
+ 0x0d, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73,
+ 0x2e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64,
+ 0x65, 0x73, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69,
+ 0x73, 0x6d, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20,
+ 0x74, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f,
+ 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c,
+ 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x0d, 0x0a,
+ 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f,
+ 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f,
+ 0x66, 0x20, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,
+ 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x75, 0x6e, 0x69,
+ 0x74, 0x73, 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x22, 0x0d, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x56, 0x61,
+ 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x22, 0x3e, 0x41, 0x6e, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x69, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x69, 0x66,
+ 0x20, 0x69, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61,
+ 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x0d, 0x0a, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6d,
+ 0x70, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e,
+ 0x74, 0x73, 0x0d, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65,
+ 0x64, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x74, 0x2e, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x62, 0x65, 0x66,
+ 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73,
+ 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x22, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63,
+ 0x72, 0x61, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x78, 0x6d, 0x6c, 0x64,
+ 0x6f, 0x63, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62,
+ 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x50, 0x72, 0x6f, 0x6c, 0x6f, 0x67, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75,
+ 0x70, 0x20, 0x70, 0x63, 0x77, 0x32, 0x3d, 0x22, 0x36, 0x22, 0x20, 0x70,
+ 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x37, 0x2e, 0x35, 0x22, 0x20, 0x70,
+ 0x63, 0x77, 0x35, 0x3d, 0x22, 0x39, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x70,
+ 0x72, 0x6f, 0x6c, 0x6f, 0x67, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68,
+ 0x73, 0x3e, 0x70, 0x72, 0x6f, 0x6c, 0x6f, 0x67, 0x3c, 0x2f, 0x6c, 0x68,
+ 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x58, 0x4d, 0x4c, 0x44, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x44, 0x65, 0x63, 0x6c, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4d, 0x69, 0x73, 0x63, 0x22, 0x3e,
+ 0x4d, 0x69, 0x73, 0x63, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2a, 0x0d, 0x0a,
+ 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x63, 0x6c,
+ 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x63,
+ 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4d, 0x69, 0x73, 0x63, 0x22,
+ 0x3e, 0x4d, 0x69, 0x73, 0x63, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2a, 0x29,
+ 0x3f, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x58, 0x4d, 0x4c, 0x44, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x58,
+ 0x4d, 0x4c, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e,
+ 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x26, 0x70, 0x69, 0x6f, 0x3b, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x56,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3e,
+ 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69,
+ 0x6e, 0x67, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x45, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x3f, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x44, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x53,
+ 0x44, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20,
+ 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20,
+ 0x26, 0x70, 0x69, 0x63, 0x3b, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x56,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x27, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x27, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x45, 0x71, 0x22, 0x3e, 0x45, 0x71, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d,
+ 0x0a, 0x28, 0x22, 0x27, 0x22, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x4e, 0x75, 0x6d, 0x22, 0x3e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x4e, 0x75, 0x6d, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x22, 0x27,
+ 0x22, 0x20, 0x7c, 0x20, 0x27, 0x22, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x56, 0x65, 0x72, 0x73,
+ 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x22, 0x3e, 0x56, 0x65, 0x72, 0x73,
+ 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d,
+ 0x0a, 0x27, 0x22, 0x27, 0x29, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x3c, 0x6c,
+ 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x35,
+ 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x45, 0x71, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e,
+ 0x45, 0x71, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20,
+ 0x27, 0x3d, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x3f, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x56, 0x65, 0x72, 0x73,
+ 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c,
+ 0x68, 0x73, 0x3e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75,
+ 0x6d, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e,
+ 0x28, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f,
+ 0x2e, 0x3a, 0x5d, 0x20, 0x7c, 0x20, 0x27, 0x2d, 0x27, 0x29, 0x2b, 0x3c,
+ 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4d, 0x69, 0x73, 0x63, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x4d, 0x69, 0x73, 0x63, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x6f, 0x6d,
+ 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e,
+ 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x49, 0x22,
+ 0x3e, 0x50, 0x49, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x7c, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75,
+ 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79,
+ 0x70, 0x65, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x44, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20,
+ 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x3e, 0x54, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x0d,
+ 0x0a, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x6f, 0x72,
+ 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x64, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x0d, 0x0a,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20,
+ 0x61, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x20,
+ 0x54, 0x68, 0x69, 0x73, 0x0d, 0x0a, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61,
+ 0x72, 0x20, 0x69, 0x73, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61,
+ 0x73, 0x20, 0x61, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x3e, 0x44, 0x54, 0x44, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61,
+ 0x6e, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61,
+ 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73,
+ 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x28, 0x61, 0x20, 0x73, 0x70, 0x65,
+ 0x63, 0x69, 0x61, 0x6c, 0x20, 0x6b, 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x66,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x78, 0x74, 0x65, 0x6e,
+ 0x74, 0x22, 0x3e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x2c, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74,
+ 0x2c, 0x20, 0x6f, 0x72, 0x0d, 0x0a, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f,
+ 0x20, 0x62, 0x6f, 0x74, 0x68, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x44,
+ 0x54, 0x44, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73,
+ 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x73,
+ 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e,
+ 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65,
+ 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d, 0x61, 0x72,
+ 0x6b, 0x75, 0x70, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x20, 0x74, 0x65, 0x72,
+ 0x6d, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x20,
+ 0x41, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x6d, 0x61, 0x72, 0x6b,
+ 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x69,
+ 0x73, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6c,
+ 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x61, 0x74, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x6c, 0x69,
+ 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e,
+ 0x74, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x0d, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x6e, 0x6f, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x6e, 0x6f, 0x74,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65,
+ 0x66, 0x3e, 0x0d, 0x0a, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d,
+ 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x6f, 0x6c, 0x65,
+ 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x50, 0x45, 0x22, 0x3e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
+ 0x72, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x61,
+ 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d,
+ 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x0d,
+ 0x0a, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x34, 0x22, 0x3e, 0x5b,
+ 0x45, 0x31, 0x34, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x66, 0x75,
+ 0x72, 0x74, 0x68, 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x3c, 0x73, 0x70,
+ 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x2d, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x2d,
+ 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x64, 0x74, 0x64, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67,
+ 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20,
+ 0x70, 0x63, 0x77, 0x32, 0x3d, 0x22, 0x36, 0x22, 0x20, 0x70, 0x63, 0x77,
+ 0x34, 0x3d, 0x22, 0x31, 0x37, 0x2e, 0x35, 0x22, 0x20, 0x70, 0x63, 0x77,
+ 0x35, 0x3d, 0x22, 0x39, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x64, 0x6f, 0x63,
+ 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x64,
+ 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68,
+ 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x44, 0x4f, 0x43, 0x54,
+ 0x59, 0x50, 0x45, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d,
+ 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x28, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e,
+ 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x22, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x3f,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x0d,
+ 0x0a, 0x28, 0x27, 0x5b, 0x27, 0x20, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x6d, 0x61, 0x72, 0x6b, 0x75,
+ 0x70, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x6d, 0x61, 0x72, 0x6b, 0x75,
+ 0x70, 0x64, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63,
+ 0x68, 0x67, 0x22, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x44, 0x65, 0x63, 0x6c, 0x53, 0x65, 0x70, 0x22, 0x3e, 0x44, 0x65, 0x63,
+ 0x6c, 0x53, 0x65, 0x70, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2a, 0x0d,
+ 0x0a, 0x27, 0x5d, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3f, 0x29, 0x3f, 0x20, 0x27, 0x3e, 0x27, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x76, 0x63, 0x2d, 0x72, 0x6f, 0x6f, 0x74, 0x74, 0x79, 0x70, 0x65, 0x22,
+ 0x2f, 0x3e, 0x3c, 0x77, 0x66, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x45, 0x78, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x22, 0x0d, 0x0a,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x39, 0x22, 0x3e, 0x5b, 0x45,
+ 0x31, 0x30, 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x44, 0x65, 0x63, 0x6c, 0x53, 0x65, 0x70, 0x22,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x44, 0x65, 0x63, 0x6c, 0x53,
+ 0x65, 0x70, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x50, 0x45, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x22, 0x3e, 0x50, 0x45, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e,
+ 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x77, 0x66, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x50, 0x45, 0x2d, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x2d, 0x44,
+ 0x65, 0x63, 0x6c, 0x73, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x61, 0x64, 0x64, 0x22, 0x2f, 0x3e, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31,
+ 0x30, 0x39, 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x30, 0x39, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72,
+ 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x64,
+ 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68,
+ 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63,
+ 0x6c, 0x22, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x65,
+ 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41,
+ 0x74, 0x74, 0x6c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e,
+ 0x41, 0x74, 0x74, 0x6c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x50, 0x49, 0x22, 0x3e, 0x50, 0x49, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e,
+ 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x50, 0x45, 0x69, 0x6e, 0x4d,
+ 0x61, 0x72, 0x6b, 0x75, 0x70, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x77, 0x66, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x77, 0x66,
+ 0x63, 0x2d, 0x50, 0x45, 0x69, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x22, 0x2f, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f,
+ 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20, 0x64,
+ 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c,
+ 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x38, 0x32,
+ 0x22, 0x3e, 0x5b, 0x45, 0x38, 0x32, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x4e, 0x6f, 0x74, 0x65, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72,
+ 0x75, 0x63, 0x74, 0x20, 0x61, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66,
+ 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e,
+ 0x67, 0x20, 0x61, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x64,
+ 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65,
+ 0x64, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x6e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20,
+ 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e,
+ 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75,
+ 0x62, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68,
+ 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61,
+ 0x79, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x75, 0x70,
+ 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x6f, 0x6c, 0x65, 0x20, 0x6f, 0x72,
+ 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x72, 0x65,
+ 0x70, 0x6c, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x72, 0x65, 0x70, 0x6c,
+ 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6f,
+ 0x66, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x50, 0x45, 0x22, 0x3e, 0x70,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x72,
+ 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6c, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69,
+ 0x64, 0x75, 0x61, 0x6c, 0x0d, 0x0a, 0x6e, 0x6f, 0x6e, 0x74, 0x65, 0x72,
+ 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x73, 0x20, 0x28, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x2c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x6c, 0x69, 0x73, 0x74, 0x44, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x6c, 0x69, 0x73, 0x74, 0x44,
+ 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x0d, 0x0a, 0x61,
+ 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x20, 0x6f, 0x6e, 0x29, 0x20, 0x64, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+ 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x61, 0x66, 0x74, 0x65, 0x72, 0x3c,
+ 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
+ 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x68,
+ 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0x3e, 0x69,
+ 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x37, 0x35, 0x22, 0x3e, 0x5b, 0x45, 0x37, 0x35, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
+ 0x65, 0x72, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64,
+ 0x20, 0x61, 0x6e, 0x79, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x54, 0x44, 0x20, 0x28, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65,
+ 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x73, 0x75, 0x62,
+ 0x73, 0x65, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65,
+ 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x29, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x69, 0x6e,
+ 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e,
+ 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x0d,
+ 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72,
+ 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+ 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+ 0x28, 0x73, 0x65, 0x65, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65,
+ 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x63,
+ 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x65, 0x63,
+ 0x74, 0x22, 0x2f, 0x3e, 0x29, 0x2e, 0x0d, 0x0a, 0x54, 0x68, 0x65, 0x79,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x72, 0x65,
+ 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x2e, 0x20, 0x54,
+ 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61,
+ 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x69, 0x65, 0x73, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75,
+ 0x62, 0x73, 0x65, 0x74, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x73, 0x74,
+ 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x20, 0x62, 0x65, 0x6c, 0x6f,
+ 0x77, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x72,
+ 0x6f, 0x6f, 0x74, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x45, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x54, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61,
+ 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x3e, 0x72,
+ 0x6f, 0x6f, 0x74, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x50, 0x45, 0x69, 0x6e, 0x4d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x20, 0x44,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x50,
+ 0x45, 0x20, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x50, 0x61, 0x72,
+ 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x74,
+ 0x65, 0x78, 0x74, 0x22, 0x3e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x6c,
+ 0x79, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x54,
+ 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x61,
+ 0x79, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72,
+ 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x72,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61,
+ 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x6d, 0x61, 0x72,
+ 0x6b, 0x75, 0x70, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x6d, 0x61, 0x72,
+ 0x6b, 0x75, 0x70, 0x64, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x0d, 0x0a, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x29, 0x20, 0x69, 0x73, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x50, 0x45, 0x52,
+ 0x65, 0x66, 0x22, 0x3e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
+ 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x77, 0x66, 0x63, 0x2d, 0x50, 0x45, 0x69,
+ 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x75, 0x62,
+ 0x73, 0x65, 0x74, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x50,
+ 0x45, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x49, 0x6e, 0x0d, 0x0a, 0x74,
+ 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x44, 0x54, 0x44, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x2c, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x50, 0x45, 0x52, 0x65, 0x66, 0x22, 0x3e,
+ 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72,
+ 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20,
+ 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20,
+ 0x6f, 0x63, 0x63, 0x75, 0x72, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x2e, 0x0d, 0x0a, 0x28, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f,
+ 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79,
+ 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6f, 0x63, 0x63, 0x75,
+ 0x72, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x0d, 0x0a, 0x6f, 0x72,
+ 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x2e,
+ 0x29, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x77, 0x66, 0x63,
+ 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x66, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x53,
+ 0x75, 0x62, 0x73, 0x65, 0x74, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58,
+ 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30,
+ 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45,
+ 0x31, 0x30, 0x39, 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x30, 0x39, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x0d, 0x0a, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x65,
+ 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73,
+ 0x65, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x2c, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x78, 0x74, 0x53, 0x75,
+ 0x62, 0x73, 0x65, 0x74, 0x22, 0x3e, 0x65, 0x78, 0x74, 0x53, 0x75, 0x62,
+ 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x77, 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x50, 0x45, 0x2d, 0x62, 0x65, 0x74, 0x77, 0x65,
+ 0x65, 0x6e, 0x2d, 0x44, 0x65, 0x63, 0x6c, 0x73, 0x22, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x31, 0x30, 0x39, 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x30,
+ 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x50, 0x45, 0x0d, 0x0a,
+ 0x42, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x44, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65,
+ 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65,
+ 0x78, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x61,
+ 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x0d, 0x0a,
+ 0x69, 0x6e, 0x20, 0x61, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x44, 0x65, 0x63, 0x6c, 0x53, 0x65, 0x70,
+ 0x22, 0x3e, 0x44, 0x65, 0x63, 0x6c, 0x53, 0x65, 0x70, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x78, 0x74, 0x53, 0x75, 0x62, 0x73,
+ 0x65, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x65, 0x78, 0x74, 0x53,
+ 0x75, 0x62, 0x73, 0x65, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x77,
+ 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74,
+ 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
+ 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x3c,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x39, 0x22, 0x3e, 0x5b,
+ 0x45, 0x31, 0x30, 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x0d, 0x0a, 0x69,
+ 0x6e, 0x20, 0x61, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x44, 0x65, 0x63, 0x6c, 0x53, 0x65, 0x70, 0x22,
+ 0x3e, 0x44, 0x65, 0x63, 0x6c, 0x53, 0x65, 0x70, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x20,
+ 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20,
+ 0x6f, 0x66, 0x0d, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65,
+ 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x61, 0x6c,
+ 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61,
+ 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x3c, 0x6e, 0x74,
+ 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x64, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x70, 0x65, 0x72,
+ 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x77, 0x68, 0x69,
+ 0x74, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x50, 0x45, 0x52, 0x65, 0x66, 0x22,
+ 0x3e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x2e, 0x20, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c,
+ 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66,
+ 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65,
+ 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64,
+ 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x39, 0x22, 0x3e, 0x5b, 0x45, 0x31,
+ 0x30, 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x74, 0x68, 0x65,
+ 0x73, 0x65, 0x20, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e,
+ 0x0d, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x70,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x6f,
+ 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20,
+ 0x62, 0x65, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x62,
+ 0x79, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x2d, 0x73,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x63, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x3b,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+ 0x0d, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x65, 0x78, 0x74, 0x2d, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x75, 0x62, 0x73, 0x65,
+ 0x74, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77,
+ 0x32, 0x3d, 0x22, 0x36, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22,
+ 0x31, 0x37, 0x2e, 0x35, 0x22, 0x20, 0x70, 0x63, 0x77, 0x35, 0x3d, 0x22,
+ 0x39, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x78, 0x74, 0x53, 0x75, 0x62,
+ 0x73, 0x65, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e,
+ 0x65, 0x78, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x6c,
+ 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x54, 0x65, 0x78, 0x74,
+ 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65,
+ 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x78, 0x74,
+ 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e,
+ 0x65, 0x78, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x44, 0x65, 0x63,
+ 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x65, 0x78, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x44, 0x65, 0x63,
+ 0x6c, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x65, 0x78, 0x74,
+ 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x28, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x6d,
+ 0x61, 0x72, 0x6b, 0x75, 0x70, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x6d,
+ 0x61, 0x72, 0x6b, 0x75, 0x70, 0x64, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x74, 0x22, 0x3e, 0x63,
+ 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x65,
+ 0x63, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x44, 0x65, 0x63,
+ 0x6c, 0x53, 0x65, 0x70, 0x22, 0x3e, 0x44, 0x65, 0x63, 0x6c, 0x53, 0x65,
+ 0x70, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2a, 0x3c, 0x2f, 0x72, 0x68,
+ 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x39,
+ 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x30, 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72,
+ 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20,
+ 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62,
+ 0x73, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
+ 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20,
+ 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x20,
+ 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65,
+ 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x6d, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x50, 0x45, 0x52, 0x65, 0x66, 0x22, 0x3e, 0x70, 0x61, 0x72, 0x61, 0x6d,
+ 0x65, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d,
+ 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20,
+ 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e,
+ 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20, 0x6d, 0x61, 0x72, 0x6b,
+ 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x2c, 0x0d, 0x0a, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x6e,
+ 0x6c, 0x79, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x62, 0x65, 0x74,
+ 0x77, 0x65, 0x65, 0x6e, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20,
+ 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41,
+ 0x54, 0x41, 0x5b, 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65, 0x72,
+ 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x3f, 0x3e,
+ 0x20, 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x67,
+ 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x59, 0x53, 0x54,
+ 0x45, 0x4d, 0x20, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x64, 0x74,
+ 0x64, 0x22, 0x3e, 0x20, 0x3c, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e,
+ 0x67, 0x3e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72,
+ 0x6c, 0x64, 0x21, 0x3c, 0x2f, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e,
+ 0x67, 0x3e, 0x20, 0x5d, 0x5d, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x73, 0x79, 0x73, 0x69, 0x64, 0x22, 0x3e, 0x73, 0x79, 0x73, 0x74,
+ 0x65, 0x6d, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65,
+ 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20,
+ 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x64, 0x74, 0x64, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x67, 0x69, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78,
+ 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x37, 0x38, 0x22, 0x3e,
+ 0x5b, 0x45, 0x37, 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x61,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x0d, 0x0a, 0x28, 0x61, 0x20, 0x55,
+ 0x52, 0x49, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x29, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x6f,
+ 0x66, 0x20, 0x61, 0x20, 0x44, 0x54, 0x44, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68,
+ 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x63,
+ 0x61, 0x6c, 0x6c, 0x79, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
+ 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x3c,
+ 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x3c, 0x3f, 0x78, 0x6d,
+ 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31,
+ 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x3d, 0x22, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x20, 0x3f, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x67,
+ 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x5b, 0x0d, 0x0a, 0x20,
+ 0x20, 0x3c, 0x21, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x67,
+ 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x23, 0x50, 0x43,
+ 0x44, 0x41, 0x54, 0x41, 0x29, 0x3e, 0x0d, 0x0a, 0x5d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x3e, 0x48, 0x65,
+ 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x3c,
+ 0x2f, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x3e, 0x5d, 0x5d,
+ 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x49,
+ 0x66, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+ 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62,
+ 0x73, 0x65, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, 0x65,
+ 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x0d, 0x0a,
+ 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65,
+ 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x20, 0x62,
+ 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65,
+ 0x74, 0x2e, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x27, 0x69, 0x73, 0x20,
+ 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74,
+ 0x6f, 0x27, 0x3f, 0x20, 0x62, 0x6f, 0x6f, 0x2e, 0x20, 0x77, 0x68, 0x61,
+ 0x7a, 0x7a, 0x61, 0x74, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x3f, 0x20, 0x2d,
+ 0x2d, 0x3e, 0x0d, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x68, 0x61, 0x73,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d,
+ 0x0a, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65,
+ 0x20, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20,
+ 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x2d, 0x72, 0x6d, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f,
+ 0x6e, 0x65, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x4d,
+ 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x61,
+ 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61,
+ 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f,
+ 0x6d, 0x0d, 0x0a, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x78,
+ 0x6d, 0x6c, 0x2d, 0x70, 0x72, 0x6f, 0x63, 0x22, 0x3e, 0x58, 0x4d, 0x4c,
+ 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x74, 0x6f, 0x20,
+ 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3b, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73,
+ 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61,
+ 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2c, 0x0d, 0x0a, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x61,
+ 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x61, 0x73, 0x20,
+ 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20,
+ 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x0d, 0x0a, 0x6e, 0x6f, 0x74, 0x20,
+ 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x75,
+ 0x63, 0x68, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x70,
+ 0x70, 0x65, 0x61, 0x72, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x34, 0x22, 0x3e, 0x5b,
+ 0x45, 0x36, 0x34, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a,
+ 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65,
+ 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x78, 0x74, 0x6d, 0x6b, 0x70,
+ 0x64, 0x65, 0x63, 0x6c, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22,
+ 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x4d, 0x61, 0x72,
+ 0x6b, 0x75, 0x70, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x41, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a,
+ 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,
+ 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69,
+ 0x6e, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x6f,
+ 0x72, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d,
+ 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x28, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x72,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x62,
+ 0x65, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+ 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6e, 0x6f,
+ 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67,
+ 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20,
+ 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75,
+ 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64,
+ 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x6d, 0x29, 0x2e, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63,
+ 0x72, 0x61, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x75, 0x6c, 0x6c,
+ 0x64, 0x74, 0x64, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65,
+ 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20,
+ 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72,
+ 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77, 0x32, 0x3d, 0x22, 0x34, 0x22,
+ 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x39, 0x2e, 0x35, 0x22,
+ 0x20, 0x70, 0x63, 0x77, 0x35, 0x3d, 0x22, 0x39, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x53, 0x44, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x53, 0x44, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x27, 0x73, 0x74, 0x61,
+ 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x27, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x71, 0x22,
+ 0x3e, 0x45, 0x71, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x28, 0x28,
+ 0x22, 0x27, 0x22, 0x20, 0x28, 0x27, 0x79, 0x65, 0x73, 0x27, 0x20, 0x7c,
+ 0x20, 0x27, 0x6e, 0x6f, 0x27, 0x29, 0x20, 0x22, 0x27, 0x22, 0x29, 0x20,
+ 0x7c, 0x20, 0x28, 0x27, 0x22, 0x27, 0x20, 0x28, 0x27, 0x79, 0x65, 0x73,
+ 0x27, 0x20, 0x7c, 0x20, 0x27, 0x6e, 0x6f, 0x27, 0x29, 0x20, 0x27, 0x22,
+ 0x27, 0x29, 0x29, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76,
+ 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x63, 0x68,
+ 0x65, 0x63, 0x6b, 0x2d, 0x72, 0x6d, 0x64, 0x22, 0x2f, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73,
+ 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x6e,
+ 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e,
+ 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3c, 0x61,
+ 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x79, 0x65, 0x73, 0x3c, 0x2f, 0x61,
+ 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
+ 0x61, 0x74, 0x65, 0x73, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74,
+ 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x34, 0x22, 0x3e, 0x5b,
+ 0x45, 0x36, 0x34, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x65, 0x78, 0x74, 0x6d, 0x6b, 0x70, 0x64, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x0d, 0x0a, 0x61,
+ 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61,
+ 0x73, 0x73, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61,
+ 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20,
+ 0x54, 0x68, 0x65, 0x0d, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3c,
+ 0x61, 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x6e, 0x6f, 0x3c, 0x2f, 0x61,
+ 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
+ 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68,
+ 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d,
+ 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x65,
+ 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x6d, 0x61, 0x72,
+ 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6e,
+ 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x6e,
+ 0x6f, 0x74, 0x65, 0x73, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72,
+ 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68,
+ 0x3e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x3b, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20,
+ 0x69, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x2c, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x65, 0x6d,
+ 0x70, 0x68, 0x3e, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68,
+ 0x6f, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x6c, 0x79, 0x0d, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65,
+ 0x64, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+ 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x73,
+ 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x74,
+ 0x61, 0x74, 0x75, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f,
+ 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d,
+ 0x0a, 0x68, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x65, 0x61, 0x6e,
+ 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72,
+ 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x62,
+ 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20,
+ 0x6e, 0x6f, 0x0d, 0x0a, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f,
+ 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3c,
+ 0x61, 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x6e, 0x6f, 0x3c, 0x2f, 0x61,
+ 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x73,
+ 0x73, 0x75, 0x6d, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x79, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x3d, 0x22,
+ 0x6e, 0x6f, 0x22, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x68,
+ 0x6f, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20,
+ 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x0d, 0x0a, 0x61,
+ 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x69, 0x63, 0x61, 0x6c,
+ 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x6e,
+ 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d,
+ 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x61,
+ 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6d, 0x65,
+ 0x0d, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x64, 0x65,
+ 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2d, 0x72,
+ 0x6d, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x53, 0x74,
+ 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x44, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x0d, 0x0a, 0x73, 0x74, 0x61, 0x6e,
+ 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76,
+ 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x3c, 0x61, 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x6e, 0x6f, 0x3c, 0x2f,
+ 0x61, 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x20, 0x69, 0x66, 0x0d, 0x0a,
+ 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x61, 0x69, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x3a, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
+ 0x74, 0x22, 0x3e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x73, 0x2c, 0x0d, 0x0a, 0x69, 0x66, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x61, 0x70, 0x70, 0x6c,
+ 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x0d, 0x0a, 0x73, 0x70,
+ 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x28, 0x6f, 0x74, 0x68, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x26, 0x6d, 0x61, 0x67, 0x69, 0x63,
+ 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x29, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x66, 0x22, 0x3e,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x74, 0x6f,
+ 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x72, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x70, 0x3e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x73, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74,
+ 0x6f, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x41, 0x56, 0x4e, 0x6f, 0x72,
+ 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x6e, 0x6f, 0x72, 0x6d,
+ 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x0d, 0x0a, 0x77,
+ 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61,
+ 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67,
+ 0x65, 0x0d, 0x0a, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75,
+ 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c,
+ 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6c, 0x65,
+ 0x6d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c,
+ 0x0d, 0x0a, 0x69, 0x66, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73, 0x20,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x69, 0x6e, 0x73, 0x74,
+ 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x6f, 0x73,
+ 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x75,
+ 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20,
+ 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64,
+ 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67,
+ 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x26, 0x76, 0x65, 0x72, 0x73,
+ 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x58, 0x4d, 0x4c, 0x3b, 0x22, 0x20, 0x73,
+ 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x3d, 0x27, 0x79,
+ 0x65, 0x73, 0x27, 0x3f, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69,
+ 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x77,
+ 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x57, 0x68, 0x69, 0x74,
+ 0x65, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x48, 0x61, 0x6e, 0x64,
+ 0x6c, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x6e, 0x20, 0x65, 0x64, 0x69, 0x74, 0x69,
+ 0x6e, 0x67, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20,
+ 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e,
+ 0x69, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20,
+ 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x77, 0x68, 0x69, 0x74, 0x65,
+ 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2c,
+ 0x20, 0x74, 0x61, 0x62, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62,
+ 0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3c, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x33, 0x39, 0x22, 0x3e, 0x5b, 0x45, 0x33,
+ 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2c, 0x0d, 0x0a, 0x64,
+ 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61,
+ 0x6c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x29, 0x0d, 0x0a, 0x74, 0x6f, 0x20,
+ 0x73, 0x65, 0x74, 0x20, 0x61, 0x70, 0x61, 0x72, 0x74, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61,
+ 0x64, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x53, 0x75,
+ 0x63, 0x68, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61,
+ 0x6c, 0x6c, 0x79, 0x0d, 0x0a, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e,
+ 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x65, 0x64,
+ 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x2e, 0x20, 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x6f, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x3c, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x6e, 0x74, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64,
+ 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65,
+ 0x64, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65,
+ 0x6c, 0x69, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73,
+ 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+ 0x6e, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x6f, 0x65, 0x74, 0x72, 0x79,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20,
+ 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x70, 0x72, 0x6f, 0x63, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x20,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73,
+ 0x0d, 0x0a, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x72, 0x6b,
+ 0x75, 0x70, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74,
+ 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0d, 0x0a, 0x41, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e,
+ 0x67, 0x22, 0x3e, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69,
+ 0x6e, 0x67, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x73, 0x6f,
+ 0x0d, 0x0a, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x73, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74,
+ 0x65, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63,
+ 0x65, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x0d,
+ 0x0a, 0x69, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6c, 0x65,
+ 0x6d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x20, 0x73,
+ 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x61, 0x74, 0x74, 0x72, 0x22, 0x3e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x3c, 0x61, 0x74, 0x74,
+ 0x3e, 0x78, 0x6d, 0x6c, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3c, 0x2f,
+ 0x61, 0x74, 0x74, 0x3e, 0x0d, 0x0a, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65,
+ 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f,
+ 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x74, 0x6f, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x6e,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x0d, 0x0a, 0x77, 0x68,
+ 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x73, 0x68,
+ 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x65, 0x73,
+ 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x70, 0x70,
+ 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x49,
+ 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x64, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0d,
+ 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20,
+ 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x74, 0x74, 0x64, 0x65, 0x63, 0x6c,
+ 0x22, 0x3e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x69, 0x66,
+ 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e,
+ 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x65, 0x64, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x20,
+ 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e, 0x75, 0x6d,
+ 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x22, 0x3e, 0x65, 0x6e, 0x75, 0x6d,
+ 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x77,
+ 0x68, 0x6f, 0x73, 0x65, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58,
+ 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30,
+ 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45,
+ 0x38, 0x31, 0x22, 0x3e, 0x5b, 0x45, 0x38, 0x31, 0x5d, 0x3c, 0x2f, 0x6c,
+ 0x6f, 0x63, 0x3e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x0d, 0x0a, 0x61,
+ 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x6f,
+ 0x74, 0x68, 0x20, 0x6f, 0x66, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x3e, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x64,
+ 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x76,
+ 0x61, 0x6c, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x61, 0x74, 0x74,
+ 0x76, 0x61, 0x6c, 0x3e, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65,
+ 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x2e, 0x0d, 0x0a,
+ 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x21, 0x5b,
+ 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x3c, 0x21, 0x41, 0x54, 0x54, 0x4c,
+ 0x49, 0x53, 0x54, 0x20, 0x70, 0x6f, 0x65, 0x6d, 0x20, 0x20, 0x78, 0x6d,
+ 0x6c, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x28, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x7c, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76,
+ 0x65, 0x29, 0x20, 0x27, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65,
+ 0x27, 0x3e, 0x5d, 0x5d, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x26, 0x6c, 0x74,
+ 0x3b, 0x21, 0x2d, 0x2d, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x38, 0x31, 0x22, 0x3e, 0x5b, 0x45, 0x38,
+ 0x31, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2d, 0x2d, 0x3e, 0x0d,
+ 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x41, 0x54, 0x54, 0x4c, 0x49, 0x53,
+ 0x54, 0x20, 0x70, 0x72, 0x65, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x73, 0x70,
+ 0x61, 0x63, 0x65, 0x20, 0x28, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76,
+ 0x65, 0x29, 0x20, 0x23, 0x46, 0x49, 0x58, 0x45, 0x44, 0x20, 0x27, 0x70,
+ 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x27, 0x3e, 0x3c, 0x2f, 0x65,
+ 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x76, 0x61, 0x6c,
+ 0x3e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3c, 0x2f, 0x61, 0x74,
+ 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x27, 0x20, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x0d, 0x0a, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x76, 0x61,
+ 0x6c, 0x3e, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x3c, 0x2f,
+ 0x61, 0x74, 0x74, 0x76, 0x61, 0x6c, 0x3e, 0x0d, 0x0a, 0x69, 0x6e, 0x64,
+ 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61,
+ 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+ 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x0d, 0x0a,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69,
+ 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x70, 0x70,
+ 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20,
+ 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x65, 0x64, 0x2c, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x6e, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69,
+ 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x0d, 0x0a, 0x6f, 0x66, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x3e, 0x78, 0x6d, 0x6c,
+ 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x3e,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x3e, 0x72,
+ 0x6f, 0x6f, 0x74, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6f, 0x66,
+ 0x20, 0x61, 0x6e, 0x79, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65,
+ 0x72, 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65,
+ 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x6e, 0x6f,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+ 0x61, 0x73, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x73, 0x20, 0x61,
+ 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e,
+ 0x67, 0x2c, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x0d, 0x0a, 0x69,
+ 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x61,
+ 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x61, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76,
+ 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x6c, 0x69,
+ 0x6e, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x64, 0x2d, 0x6f, 0x66, 0x2d,
+ 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e,
+ 0x67, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x61,
+ 0x72, 0x73, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x70, 0x61, 0x72,
+ 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f,
+ 0x72, 0x65, 0x64, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+ 0x75, 0x74, 0x65, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x64,
+ 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e,
+ 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f,
+ 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74,
+ 0x6f, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x54, 0x68,
+ 0x65, 0x73, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20,
+ 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79,
+ 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x0d,
+ 0x0a, 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x2d, 0x72, 0x65,
+ 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x23, 0x78, 0x44, 0x29, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x66, 0x65, 0x65, 0x64,
+ 0x20, 0x28, 0x23, 0x78, 0x41, 0x29, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65,
+ 0x6c, 0x22, 0x3e, 0x54, 0x6f, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x69,
+ 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73,
+ 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x70, 0x70,
+ 0x22, 0x3e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x0d, 0x0a, 0x77, 0x68, 0x65, 0x72, 0x65, 0x76, 0x65, 0x72, 0x20,
+ 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x74,
+ 0x65, 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x70, 0x61,
+ 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x65, 0x69, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65,
+ 0x72, 0x61, 0x6c, 0x20, 0x74, 0x77, 0x6f, 0x2d, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e,
+ 0x63, 0x65, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x23, 0x78,
+ 0x44, 0x23, 0x78, 0x41, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64,
+ 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x20, 0x23, 0x78, 0x44, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x70, 0x72, 0x6f, 0x63, 0x22,
+ 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20,
+ 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+ 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x23, 0x78, 0x41, 0x2e, 0x20, 0x28, 0x54, 0x68,
+ 0x69, 0x73, 0x20, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x20,
+ 0x63, 0x61, 0x6e, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x69,
+ 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f,
+ 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x6f, 0x72,
+ 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c,
+ 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x73,
+ 0x20, 0x74, 0x6f, 0x20, 0x23, 0x78, 0x41, 0x20, 0x6f, 0x6e, 0x20, 0x69,
+ 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65,
+ 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x29, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x34, 0x22, 0x3e,
+ 0x5b, 0x45, 0x31, 0x30, 0x34, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x54, 0x6f, 0x0d, 0x0a, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x66, 0x79,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x70, 0x70, 0x22, 0x3e,
+ 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x0d, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74,
+ 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x70, 0x72, 0x6f,
+ 0x63, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x61, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20,
+ 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61,
+ 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61,
+ 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x28, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x29, 0x20, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74,
+ 0x2c, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x70, 0x61, 0x72,
+ 0x73, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x62, 0x79, 0x20, 0x74, 0x72, 0x61,
+ 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x62, 0x6f,
+ 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x2d, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x71,
+ 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x23, 0x78, 0x44, 0x20, 0x23, 0x78,
+ 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x23, 0x78,
+ 0x44, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62,
+ 0x79, 0x0d, 0x0a, 0x23, 0x78, 0x41, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20,
+ 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x23, 0x78, 0x41, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65,
+ 0x63, 0x2d, 0x6c, 0x61, 0x6e, 0x67, 0x2d, 0x74, 0x61, 0x67, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4c, 0x61, 0x6e, 0x67,
+ 0x75, 0x61, 0x67, 0x65, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x6e, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73,
+ 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66,
+ 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61,
+ 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x0d,
+ 0x0a, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x69, 0x6e,
+ 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x77, 0x72,
+ 0x69, 0x74, 0x74, 0x65, 0x6e, 0x2e, 0x20, 0x41, 0x20, 0x73, 0x70, 0x65,
+ 0x63, 0x69, 0x61, 0x6c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x74,
+ 0x74, 0x72, 0x22, 0x3e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d,
+ 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x3e,
+ 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3c, 0x2f, 0x61, 0x74,
+ 0x74, 0x3e, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e,
+ 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73,
+ 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c,
+ 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x0d, 0x0a, 0x75, 0x73, 0x65,
+ 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x2e, 0x0d, 0x0a, 0x49, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20,
+ 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x74, 0x74, 0x64,
+ 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65,
+ 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d,
+ 0x0a, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73,
+ 0x65, 0x64, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x37,
+ 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x37, 0x33, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x54, 0x68, 0x65, 0x0d, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6c,
+ 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e,
+ 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x61, 0x73, 0x20, 0x64,
+ 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x3c, 0x62,
+ 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x52,
+ 0x46, 0x43, 0x31, 0x37, 0x36, 0x36, 0x22, 0x2f, 0x3e, 0x2c, 0x20, 0x3c,
+ 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x54, 0x61, 0x67,
+ 0x73, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49,
+ 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
+ 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x73, 0x20, 0x73, 0x75,
+ 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x49, 0x45, 0x54, 0x46, 0x0d, 0x0a, 0x53, 0x74, 0x61,
+ 0x6e, 0x64, 0x61, 0x72, 0x64, 0x73, 0x20, 0x54, 0x72, 0x61, 0x63, 0x6b,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x37, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x37, 0x33, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66,
+ 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x52, 0x46, 0x43, 0x31, 0x37,
+ 0x36, 0x36, 0x22, 0x2f, 0x3e, 0x20, 0x74, 0x61, 0x67, 0x73, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
+ 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x77, 0x6f, 0x2d,
+ 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75,
+ 0x61, 0x67, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x61, 0x73,
+ 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x0d, 0x0a, 0x62, 0x79,
+ 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x36, 0x33, 0x39, 0x22, 0x2f, 0x3e, 0x2c,
+ 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x77, 0x6f, 0x2d, 0x6c, 0x65,
+ 0x74, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,
+ 0x20, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65,
+ 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x3c, 0x62, 0x69,
+ 0x62, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x49,
+ 0x53, 0x4f, 0x33, 0x31, 0x36, 0x36, 0x22, 0x2f, 0x3e, 0x2c, 0x20, 0x6f,
+ 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75,
+ 0x61, 0x67, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
+ 0x65, 0x72, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
+ 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x0d, 0x0a, 0x41, 0x73,
+ 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65,
+ 0x72, 0x73, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,
+ 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78,
+ 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x35, 0x38, 0x22, 0x3e,
+ 0x5b, 0x45, 0x35, 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c,
+ 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x49, 0x41, 0x4e, 0x41, 0x2d, 0x4c, 0x41, 0x4e, 0x47, 0x43, 0x4f, 0x44,
+ 0x45, 0x53, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x3e, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78,
+ 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65,
+ 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x52, 0x46, 0x43, 0x31, 0x37,
+ 0x36, 0x36, 0x22, 0x2f, 0x3e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x69,
+ 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x74, 0x68, 0x72,
+ 0x65, 0x65, 0x2d, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x61,
+ 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x73,
+ 0x20, 0x66, 0x6f, 0x72, 0x0d, 0x0a, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
+ 0x67, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x65, 0x73,
+ 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65,
+ 0x64, 0x20, 0x62, 0x79, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66,
+ 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x36, 0x33, 0x39,
+ 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x37, 0x33, 0x22,
+ 0x3e, 0x5b, 0x45, 0x37, 0x33, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x28, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x0d, 0x0a, 0x33, 0x33, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68,
+ 0x20, 0x33, 0x38, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65,
+ 0x6e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x2e, 0x29, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x20, 0x6c,
+ 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4c, 0x61, 0x6e, 0x67, 0x75,
+ 0x61, 0x67, 0x65, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
+ 0x49, 0x44, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x4c,
+ 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x49, 0x44, 0x3c, 0x2f, 0x6c,
+ 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4c, 0x61, 0x6e, 0x67,
+ 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3e, 0x4c, 0x61, 0x6e, 0x67, 0x63, 0x6f,
+ 0x64, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x27, 0x2d, 0x27,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x53, 0x75, 0x62, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3e, 0x53, 0x75,
+ 0x62, 0x63, 0x6f, 0x64, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2a,
+ 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4c, 0x61, 0x6e, 0x67, 0x63, 0x6f,
+ 0x64, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x4c,
+ 0x61, 0x6e, 0x67, 0x63, 0x6f, 0x64, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73,
+ 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x49, 0x53, 0x4f, 0x36, 0x33, 0x39,
+ 0x43, 0x6f, 0x64, 0x65, 0x22, 0x3e, 0x49, 0x53, 0x4f, 0x36, 0x33, 0x39,
+ 0x43, 0x6f, 0x64, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x49, 0x61, 0x6e, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x3e, 0x49, 0x61,
+ 0x6e, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d,
+ 0x0a, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x22,
+ 0x3e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x49, 0x53, 0x4f, 0x36,
+ 0x33, 0x39, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c,
+ 0x68, 0x73, 0x3e, 0x49, 0x53, 0x4f, 0x36, 0x33, 0x39, 0x43, 0x6f, 0x64,
+ 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e,
+ 0x28, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x20, 0x7c, 0x20, 0x5b, 0x41, 0x2d,
+ 0x5a, 0x5d, 0x29, 0x20, 0x28, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x20, 0x7c,
+ 0x20, 0x5b, 0x41, 0x2d, 0x5a, 0x5d, 0x29, 0x3c, 0x2f, 0x72, 0x68, 0x73,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x49, 0x61, 0x6e, 0x61, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x49, 0x61, 0x6e, 0x61, 0x43, 0x6f,
+ 0x64, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x28, 0x27, 0x69, 0x27, 0x20, 0x7c, 0x20, 0x27, 0x49, 0x27, 0x29,
+ 0x20, 0x27, 0x2d, 0x27, 0x20, 0x28, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x20,
+ 0x7c, 0x20, 0x5b, 0x41, 0x2d, 0x5a, 0x5d, 0x29, 0x2b, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x55, 0x73, 0x65, 0x72,
+ 0x43, 0x6f, 0x64, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72,
+ 0x68, 0x73, 0x3e, 0x28, 0x27, 0x78, 0x27, 0x20, 0x7c, 0x20, 0x27, 0x58,
+ 0x27, 0x29, 0x20, 0x27, 0x2d, 0x27, 0x20, 0x28, 0x5b, 0x61, 0x2d, 0x7a,
+ 0x5d, 0x20, 0x7c, 0x20, 0x5b, 0x41, 0x2d, 0x5a, 0x5d, 0x29, 0x2b, 0x3c,
+ 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x75, 0x62, 0x63, 0x6f, 0x64, 0x65,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x53, 0x75, 0x62,
+ 0x63, 0x6f, 0x64, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72,
+ 0x68, 0x73, 0x3e, 0x28, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x20, 0x7c, 0x20,
+ 0x5b, 0x41, 0x2d, 0x5a, 0x5d, 0x29, 0x2b, 0x3c, 0x2f, 0x72, 0x68, 0x73,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e,
+ 0x54, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x4c, 0x61, 0x6e, 0x67, 0x63, 0x6f, 0x64, 0x65,
+ 0x22, 0x3e, 0x4c, 0x61, 0x6e, 0x67, 0x63, 0x6f, 0x64, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x61,
+ 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f,
+ 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x3a, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x61, 0x20, 0x74, 0x77, 0x6f,
+ 0x2d, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x61, 0x6e, 0x67,
+ 0x75, 0x61, 0x67, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x73,
+ 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
+ 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x49, 0x53, 0x4f, 0x36, 0x33, 0x39, 0x22, 0x2f, 0x3e, 0x2c, 0x20,
+ 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x43, 0x6f,
+ 0x64, 0x65, 0x73, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73,
+ 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
+ 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x61, 0x20,
+ 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x69, 0x64, 0x65,
+ 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69,
+ 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+ 0x20, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x4e, 0x75,
+ 0x6d, 0x62, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x6f,
+ 0x72, 0x69, 0x74, 0x79, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x20,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x49, 0x41, 0x4e, 0x41, 0x2d, 0x4c, 0x41,
+ 0x4e, 0x47, 0x43, 0x4f, 0x44, 0x45, 0x53, 0x22, 0x2f, 0x3e, 0x3b, 0x20,
+ 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x70, 0x72,
+ 0x65, 0x66, 0x69, 0x78, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x69, 0x2d, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20,
+ 0x28, 0x6f, 0x72, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x49, 0x2d, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x29, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x61,
+ 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x69, 0x64,
+ 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x61, 0x73, 0x73,
+ 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x67,
+ 0x72, 0x65, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x74, 0x77,
+ 0x65, 0x65, 0x6e, 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20,
+ 0x75, 0x73, 0x65, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69,
+ 0x78, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x78, 0x2d, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x6f, 0x72,
+ 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x58, 0x2d, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x73, 0x75,
+ 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x79,
+ 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66,
+ 0x6c, 0x69, 0x63, 0x74, 0x0d, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x73,
+ 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x65, 0x64, 0x20,
+ 0x6f, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65,
+ 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x49, 0x41, 0x4e, 0x41, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e,
+ 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65,
+ 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
+ 0x6f, 0x66, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x75, 0x62, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3e,
+ 0x53, 0x75, 0x62, 0x63, 0x6f, 0x64, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x0d, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x20,
+ 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74,
+ 0x20, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x73, 0x65, 0x67,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x75, 0x62, 0x63,
+ 0x6f, 0x64, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73,
+ 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x74, 0x77, 0x6f, 0x20, 0x6c, 0x65, 0x74,
+ 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x69,
+ 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x63, 0x6f, 0x64, 0x65,
+ 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65,
+ 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x33, 0x31,
+ 0x36, 0x36, 0x22, 0x2f, 0x3e, 0x2c, 0x0d, 0x0a, 0x22, 0x43, 0x6f, 0x64,
+ 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
+ 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x2e,
+ 0x22, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72,
+ 0x73, 0x74, 0x20, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x64, 0x65, 0x0d, 0x0a,
+ 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x77,
+ 0x6f, 0x20, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x69,
+ 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20,
+ 0x73, 0x75, 0x62, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
+ 0x20, 0x69, 0x6e, 0x0d, 0x0a, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x49, 0x41, 0x4e, 0x41, 0x2c, 0x20,
+ 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4c,
+ 0x61, 0x6e, 0x67, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3e, 0x4c, 0x61, 0x6e,
+ 0x67, 0x63, 0x6f, 0x64, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x62, 0x65, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x22,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x78, 0x2d, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x58, 0x2d, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x22, 0x2e, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x49,
+ 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x61,
+ 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x69, 0x76, 0x65, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20,
+ 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x6f, 0x77, 0x65,
+ 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x0d,
+ 0x0a, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,
+ 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x69, 0x66, 0x20, 0x61, 0x6e,
+ 0x79, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x20,
+ 0x63, 0x61, 0x73, 0x65, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x75, 0x6e, 0x6c, 0x69, 0x6b, 0x65,
+ 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x0d, 0x0a, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x20, 0x69, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x72, 0x65, 0x20,
+ 0x63, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x69,
+ 0x74, 0x69, 0x76, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e,
+ 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x3c, 0x70, 0x20,
+ 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x6e,
+ 0x22, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x20,
+ 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75,
+ 0x6d, 0x70, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c,
+ 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x6e, 0x2d, 0x47, 0x42, 0x22, 0x3e,
+ 0x57, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x75, 0x72, 0x20,
+ 0x69, 0x73, 0x20, 0x69, 0x74, 0x3f, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3d,
+ 0x22, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x22, 0x3e, 0x57, 0x68, 0x61, 0x74,
+ 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x69, 0x74,
+ 0x3f, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x70, 0x20, 0x77,
+ 0x68, 0x6f, 0x3d, 0x22, 0x46, 0x61, 0x75, 0x73, 0x74, 0x22, 0x20, 0x64,
+ 0x65, 0x73, 0x63, 0x3d, 0x27, 0x6c, 0x65, 0x69, 0x73, 0x65, 0x27, 0x20,
+ 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x64, 0x65,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x6c, 0x3e, 0x48, 0x61, 0x62,
+ 0x65, 0x20, 0x6e, 0x75, 0x6e, 0x2c, 0x20, 0x61, 0x63, 0x68, 0x21, 0x20,
+ 0x50, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70, 0x68, 0x69, 0x65, 0x2c,
+ 0x3c, 0x2f, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x6c, 0x3e, 0x4a,
+ 0x75, 0x72, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x69, 0x2c, 0x20, 0x75,
+ 0x6e, 0x64, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x7a, 0x69, 0x6e, 0x3c, 0x2f,
+ 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x6c, 0x3e, 0x75, 0x6e, 0x64,
+ 0x20, 0x6c, 0x65, 0x69, 0x64, 0x65, 0x72, 0x20, 0x61, 0x75, 0x63, 0x68,
+ 0x20, 0x54, 0x68, 0x65, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x3c, 0x2f,
+ 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x6c, 0x3e, 0x64, 0x75, 0x72,
+ 0x63, 0x68, 0x61, 0x75, 0x73, 0x20, 0x73, 0x74, 0x75, 0x64, 0x69, 0x65,
+ 0x72, 0x74, 0x20, 0x6d, 0x69, 0x74, 0x20, 0x68, 0x65, 0x69, 0xdf, 0x65,
+ 0x6d, 0x20, 0x42, 0x65, 0x6d, 0xfc, 0x68, 0x27, 0x6e, 0x2e, 0x3c, 0x2f,
+ 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x70, 0x3e, 0x5d, 0x5d, 0x3e,
+ 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x3c,
+ 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61,
+ 0x6e, 0x67, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20,
+ 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74,
+ 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x62, 0x6f, 0x74, 0x68,
+ 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x0d, 0x0a,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x0d,
+ 0x0a, 0x28, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x76, 0x69, 0x61, 0x20, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29,
+ 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f,
+ 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, 0x72,
+ 0x65, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x20, 0x28, 0x43, 0x44, 0x41,
+ 0x54, 0x41, 0x29, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x20,
+ 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x3c, 0x61, 0x74,
+ 0x74, 0x3e, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3c, 0x2f,
+ 0x61, 0x74, 0x74, 0x3e, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73,
+ 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x70,
+ 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x61, 0x6c, 0x6c, 0x20,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c,
+ 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72,
+ 0x72, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x0d, 0x0a, 0x77, 0x69, 0x74, 0x68,
+ 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x3e, 0x78, 0x6d, 0x6c,
+ 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x3e, 0x20,
+ 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d,
+ 0x2d, 0x0d, 0x0a, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x0d, 0x0a, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+ 0x66, 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x78, 0x6d, 0x6c,
+ 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x6e, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x74,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x54, 0x44, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x78, 0x6d,
+ 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x61, 0x6b,
+ 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x74, 0x20, 0x68, 0x61, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x65,
+ 0x6e, 0x74, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20,
+ 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20,
+ 0x74, 0x77, 0x6f, 0x0d, 0x0a, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x63,
+ 0x61, 0x6c, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e,
+ 0x67, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x62, 0x6f,
+ 0x74, 0x68, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x73, 0x61, 0x6d, 0x65, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69,
+ 0x76, 0x65, 0x0d, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3a, 0x0d,
+ 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x78, 0x6d, 0x6c, 0x3a,
+ 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x6e, 0x22, 0x3e, 0x48, 0x65,
+ 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f,
+ 0x72, 0x64, 0x73, 0x20, 0x61, 0x72, 0x65, 0x0d, 0x0a, 0x20, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e,
+ 0x67, 0x3d, 0x22, 0x65, 0x6e, 0x22, 0x3e, 0x73, 0x68, 0x69, 0x66, 0x74,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x0d,
+ 0x0a, 0x20, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x72, 0x65, 0x64,
+ 0x75, 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x2e, 0x20,
+ 0x2e, 0x2e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x54,
+ 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x2c, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x27, 0x0d, 0x0a, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69,
+ 0x74, 0x61, 0x6e, 0x63, 0x65, 0x27, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x41, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x3e, 0x78, 0x6d, 0x6c, 0x3a, 0x6c,
+ 0x61, 0x6e, 0x67, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x3e, 0x20, 0x6d, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x65, 0x67, 0x3e, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x20,
+ 0x4e, 0x4d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x20, 0x23, 0x49, 0x4d, 0x50,
+ 0x4c, 0x49, 0x45, 0x44, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x62, 0x75, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x63, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x6c,
+ 0x73, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c,
+ 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69,
+ 0x61, 0x74, 0x65, 0x2e, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6f,
+ 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x66,
+ 0x20, 0x46, 0x72, 0x65, 0x6e, 0x63, 0x68, 0x20, 0x70, 0x6f, 0x65, 0x6d,
+ 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73,
+ 0x68, 0x20, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x67, 0x6c, 0x6f, 0x73, 0x73, 0x65, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x2c, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x3e, 0x78, 0x6d, 0x6c, 0x3a,
+ 0x6c, 0x61, 0x6e, 0x67, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6d, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, 0x61, 0x79,
+ 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x3c,
+ 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x3c, 0x21, 0x41, 0x54,
+ 0x54, 0x4c, 0x49, 0x53, 0x54, 0x20, 0x70, 0x6f, 0x65, 0x6d, 0x20, 0x20,
+ 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x4e, 0x4d,
+ 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x20, 0x27, 0x66, 0x72, 0x27, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x41, 0x54, 0x54, 0x4c, 0x49, 0x53, 0x54, 0x20, 0x67,
+ 0x6c, 0x6f, 0x73, 0x73, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61,
+ 0x6e, 0x67, 0x20, 0x4e, 0x4d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x20, 0x27,
+ 0x65, 0x6e, 0x27, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x41, 0x54, 0x54, 0x4c,
+ 0x49, 0x53, 0x54, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x20, 0x20, 0x78,
+ 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x4e, 0x4d, 0x54, 0x4f,
+ 0x4b, 0x45, 0x4e, 0x20, 0x27, 0x65, 0x6e, 0x27, 0x3e, 0x5d, 0x5d, 0x3e,
+ 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76,
+ 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x31, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x26, 0x45, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x3b, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x69, 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d,
+ 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x73, 0x74, 0x72, 0x75,
+ 0x63, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x72, 0x75,
+ 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d,
+ 0x22, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x45, 0x61,
+ 0x63, 0x68, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x64, 0x6f, 0x63, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x0d, 0x0a, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+ 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72,
+ 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72,
+ 0x69, 0x65, 0x73, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72,
+ 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x62,
+ 0x79, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x67, 0x22,
+ 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67, 0x73, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x61,
+ 0x6e, 0x64, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x74, 0x61, 0x67,
+ 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x73, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x6f, 0x72,
+ 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x62, 0x79, 0x20,
+ 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x65, 0x74, 0x61,
+ 0x67, 0x22, 0x3e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x61, 0x67, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x20, 0x45, 0x61, 0x63, 0x68,
+ 0x0d, 0x0a, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61,
+ 0x73, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x69, 0x64,
+ 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x69,
+ 0x6d, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69,
+ 0x74, 0x73, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x69, 0x63, 0x0d, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x69, 0x66, 0x69, 0x65, 0x72, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x20, 0x28, 0x47, 0x49, 0x29, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x73,
+ 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x45, 0x61, 0x63, 0x68, 0x20,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x73, 0x70,
+ 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61,
+ 0x74, 0x74, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d,
+ 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x61, 0x74, 0x74, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x3e, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61,
+ 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x45, 0x6c, 0x65, 0x6d, 0x54, 0x61,
+ 0x67, 0x22, 0x3e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x45, 0x6c, 0x65, 0x6d,
+ 0x54, 0x61, 0x67, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68,
+ 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x7c, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53,
+ 0x54, 0x61, 0x67, 0x22, 0x3e, 0x53, 0x54, 0x61, 0x67, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x45, 0x54, 0x61, 0x67, 0x22, 0x3e, 0x45, 0x54, 0x61, 0x67, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x77, 0x66, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x47, 0x49,
+ 0x4d, 0x61, 0x74, 0x63, 0x68, 0x22, 0x2f, 0x3e, 0x3c, 0x76, 0x63, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72,
+ 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73,
+ 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x73, 0x2c,
+ 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x62, 0x65,
+ 0x79, 0x6f, 0x6e, 0x64, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x29,
+ 0x0d, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x63,
+ 0x65, 0x70, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x73, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x0d, 0x0a, 0x61, 0x20, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x28, 0x28, 0x27, 0x58, 0x27, 0x7c, 0x27, 0x78, 0x27, 0x29, 0x28, 0x27,
+ 0x4d, 0x27, 0x7c, 0x27, 0x6d, 0x27, 0x29, 0x28, 0x27, 0x4c, 0x27, 0x7c,
+ 0x27, 0x6c, 0x27, 0x29, 0x29, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65,
+ 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61,
+ 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75,
+ 0x74, 0x75, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70,
+ 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x66, 0x63, 0x6e, 0x6f,
+ 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x47, 0x49, 0x4d, 0x61, 0x74,
+ 0x63, 0x68, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, 0x4d,
+ 0x61, 0x74, 0x63, 0x68, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c,
+ 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e,
+ 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x69,
+ 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x27, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x77, 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x0d, 0x0a, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65,
+ 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x64, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61,
+ 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20,
+ 0x6f, 0x66, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c,
+ 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x3a,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x6f, 0x6c, 0x69, 0x73, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x54, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20,
+ 0x3c, 0x6b, 0x77, 0x3e, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x3c, 0x2f, 0x6b,
+ 0x77, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6e,
+ 0x6f, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x3e, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x72, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e,
+ 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3e,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x0d, 0x0a, 0x74, 0x6f,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
+ 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20,
+ 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x75, 0x6c,
+ 0x61, 0x72, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f,
+ 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2c, 0x0d,
+ 0x0a, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x20, 0x28, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x69,
+ 0x6e, 0x61, 0x6c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x29, 0x0d, 0x0a, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x35, 0x39, 0x22, 0x3e, 0x5b,
+ 0x45, 0x35, 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x74, 0x68,
+ 0x65, 0x0d, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72,
+ 0x73, 0x74, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65,
+ 0x6e, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x74,
+ 0x77, 0x65, 0x65, 0x6e, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61,
+ 0x73, 0x74, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x2e, 0x20, 0x4e, 0x6f,
+ 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x43, 0x44,
+ 0x41, 0x54, 0x41, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x0d, 0x0a,
+ 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x6e, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x61,
+ 0x6e, 0x64, 0x0d, 0x0a, 0x68, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x63, 0x61,
+ 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c,
+ 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65,
+ 0x73, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x22, 0x3e, 0x4d, 0x69, 0x78,
+ 0x65, 0x64, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x0d,
+ 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x64, 0x61,
+ 0x74, 0x61, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x22, 0x3e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x20, 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0d,
+ 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64,
+ 0x65, 0x6c, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70,
+ 0x3e, 0x54, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73,
+ 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x41, 0x4e, 0x59, 0x3c, 0x2f, 0x6b, 0x77,
+ 0x3e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3e, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x68, 0x61, 0x76, 0x65,
+ 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x74, 0x61, 0x67, 0x73,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x53, 0x74,
+ 0x61, 0x72, 0x74, 0x2d, 0x54, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x45, 0x6e,
+ 0x64, 0x2d, 0x54, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x45, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x54, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x73, 0x74,
+ 0x61, 0x67, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x53, 0x74,
+ 0x61, 0x72, 0x74, 0x2d, 0x54, 0x61, 0x67, 0x22, 0x3e, 0x54, 0x68, 0x65,
+ 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f,
+ 0x66, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x6e, 0x6f, 0x6e, 0x2d,
+ 0x65, 0x6d, 0x70, 0x74, 0x79, 0x0d, 0x0a, 0x58, 0x4d, 0x4c, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x61,
+ 0x72, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61,
+ 0x67, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x2e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67,
+ 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61,
+ 0x67, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77,
+ 0x32, 0x3d, 0x22, 0x36, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22,
+ 0x31, 0x35, 0x22, 0x20, 0x70, 0x63, 0x77, 0x35, 0x3d, 0x22, 0x31, 0x31,
+ 0x2e, 0x35, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x54, 0x61, 0x67, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x53, 0x54, 0x61, 0x67,
+ 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27,
+ 0x26, 0x6c, 0x74, 0x3b, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e,
+ 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53,
+ 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74,
+ 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x22, 0x3e, 0x41, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29,
+ 0x2a, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f,
+ 0x20, 0x27, 0x3e, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x77,
+ 0x66, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x75, 0x6e, 0x69, 0x71,
+ 0x61, 0x74, 0x74, 0x73, 0x70, 0x65, 0x63, 0x22, 0x2f, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72,
+ 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x71, 0x22, 0x3e, 0x45, 0x71, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76,
+ 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x54, 0x79, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x3c, 0x77, 0x66, 0x63, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x6f, 0x45, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x73, 0x22, 0x2f, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x77, 0x66, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x43, 0x6c,
+ 0x65, 0x61, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x73, 0x22,
+ 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70,
+ 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e,
+ 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x73,
+ 0x20, 0x67, 0x69, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x27, 0x73, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x3e, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x0d, 0x0a, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x74, 0x74,
+ 0x72, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x41, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x22, 0x3e, 0x20, 0x54, 0x68, 0x65,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x2d, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20,
+ 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64,
+ 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65,
+ 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x74, 0x74, 0x72,
+ 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22,
+ 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x4e, 0x61,
+ 0x6d, 0x65, 0x22, 0x3e, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x61, 0x63,
+ 0x68, 0x20, 0x70, 0x61, 0x69, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x61, 0x74, 0x74, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x3d, 0x22, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x74, 0x68, 0x65,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65,
+ 0x78, 0x74, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x27, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x22, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x0d,
+ 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, 0x29,
+ 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x34, 0x36, 0x22, 0x3e, 0x5b,
+ 0x45, 0x34, 0x36, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x4e, 0x6f,
+ 0x74, 0x65, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61,
+ 0x67, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x61, 0x67, 0x20,
+ 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69,
+ 0x66, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x77,
+ 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75,
+ 0x6e, 0x69, 0x71, 0x61, 0x74, 0x74, 0x73, 0x70, 0x65, 0x63, 0x22, 0x3e,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65,
+ 0x20, 0x41, 0x74, 0x74, 0x20, 0x53, 0x70, 0x65, 0x63, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x4e, 0x6f, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x0d, 0x0a, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72,
+ 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+ 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61,
+ 0x67, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x61, 0x67, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x77, 0x66, 0x63, 0x6e, 0x6f,
+ 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79,
+ 0x70, 0x65, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x0d, 0x0a,
+ 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x69, 0x74, 0x2e, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x20,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x0d, 0x0a, 0x74,
+ 0x79, 0x70, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x3c, 0x73,
+ 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x61, 0x74, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x73, 0x22, 0x2f, 0x3e, 0x2e,
+ 0x29, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x66, 0x63, 0x6e, 0x6f,
+ 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x6f, 0x45, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x73, 0x22, 0x3e, 0x3c,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4e, 0x6f, 0x20, 0x45, 0x78, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x41, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x0d, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x73, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x61, 0x69, 0x6e, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20,
+ 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x77,
+ 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x66,
+ 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x43, 0x6c,
+ 0x65, 0x61, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x73, 0x22,
+ 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4e, 0x6f, 0x20, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54,
+ 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x72, 0x65, 0x70, 0x6c,
+ 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6f, 0x66, 0x20,
+ 0x61, 0x6e, 0x79, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x20,
+ 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x69,
+ 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64,
+ 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x38, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x38,
+ 0x33, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x28, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x3c, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61,
+ 0x6d, 0x70, 0x3b, 0x6c, 0x74, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x29, 0x20, 0x3c,
+ 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+ 0x20, 0x61, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74,
+ 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x77, 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x65, 0x78, 0x61,
+ 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67, 0x3a, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x64, 0x6f, 0x67, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22,
+ 0x64, 0x6f, 0x67, 0x22, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x74, 0x61, 0x67, 0x22,
+ 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x45, 0x6e, 0x64, 0x20, 0x54,
+ 0x61, 0x67, 0x22, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20,
+ 0x6f, 0x66, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x65,
+ 0x67, 0x69, 0x6e, 0x73, 0x0d, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61,
+ 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65,
+ 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+ 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0d, 0x0a,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x73, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x27,
+ 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x73, 0x20, 0x67, 0x69,
+ 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+ 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67, 0x3a, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67,
+ 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77, 0x32, 0x3d,
+ 0x22, 0x36, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x35,
+ 0x22, 0x20, 0x70, 0x63, 0x77, 0x35, 0x3d, 0x22, 0x31, 0x31, 0x2e, 0x35,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x54, 0x61, 0x67, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45, 0x54, 0x61, 0x67, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c,
+ 0x74, 0x3b, 0x2f, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e,
+ 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e,
+ 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x0d, 0x0a, 0x27, 0x3e, 0x27,
+ 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67,
+ 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x65, 0x78, 0x61,
+ 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65,
+ 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x43,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x54, 0x68, 0x65, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x74,
+ 0x65, 0x78, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67,
+ 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x27, 0x73,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x3a, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e,
+ 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x20, 0x6f, 0x66, 0x20, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+ 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72,
+ 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77, 0x32,
+ 0x3d, 0x22, 0x36, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31,
+ 0x35, 0x22, 0x20, 0x70, 0x63, 0x77, 0x35, 0x3d, 0x22, 0x31, 0x31, 0x2e,
+ 0x35, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72,
+ 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22,
+ 0x3e, 0x43, 0x68, 0x61, 0x72, 0x44, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3f, 0x20, 0x28, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x22, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x52, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43,
+ 0x44, 0x53, 0x65, 0x63, 0x74, 0x22, 0x3e, 0x43, 0x44, 0x53, 0x65, 0x63,
+ 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x7c, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x49,
+ 0x22, 0x3e, 0x50, 0x49, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x43, 0x6f, 0x6d,
+ 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43,
+ 0x68, 0x61, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x43, 0x68, 0x61,
+ 0x72, 0x44, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x29,
+ 0x2a, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x63, 0x6f,
+ 0x6d, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x37, 0x31, 0x22, 0x3e, 0x5b, 0x45, 0x37, 0x31, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f,
+ 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6d,
+ 0x70, 0x74, 0x79, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x45,
+ 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x37, 0x22, 0x3e, 0x5b,
+ 0x45, 0x39, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x41, 0x6e,
+ 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x77, 0x69,
+ 0x74, 0x68, 0x20, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x61, 0x69, 0x64, 0x20, 0x74, 0x6f,
+ 0x20, 0x62, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x65, 0x6d,
+ 0x70, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x54, 0x68,
+ 0x65, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20,
+ 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20,
+ 0x61, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67, 0x20,
+ 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x20,
+ 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
+ 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x2c, 0x0d,
+ 0x0a, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79,
+ 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x61, 0x67,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x65, 0x65, 0x74, 0x61, 0x67, 0x22, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x3d, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x61, 0x67, 0x22, 0x3e, 0x41,
+ 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x65, 0x6d, 0x70, 0x74,
+ 0x79, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74,
+ 0x61, 0x67, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x74, 0x61,
+ 0x6b, 0x65, 0x73, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61,
+ 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22,
+ 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x54, 0x61, 0x67, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x45,
+ 0x6d, 0x70, 0x74, 0x79, 0x20, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77,
+ 0x32, 0x3d, 0x22, 0x36, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22,
+ 0x31, 0x35, 0x22, 0x20, 0x70, 0x63, 0x77, 0x35, 0x3d, 0x22, 0x31, 0x31,
+ 0x2e, 0x35, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6d, 0x70, 0x74, 0x79,
+ 0x45, 0x6c, 0x65, 0x6d, 0x54, 0x61, 0x67, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x45, 0x6c, 0x65,
+ 0x6d, 0x54, 0x61, 0x67, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72,
+ 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x27, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61,
+ 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x22,
+ 0x3e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x29, 0x2a, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x27, 0x2f, 0x3e, 0x27, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x3c, 0x77, 0x66, 0x63, 0x0d, 0x0a, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x75, 0x6e, 0x69, 0x71, 0x61, 0x74, 0x74, 0x73, 0x70, 0x65,
+ 0x63, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f,
+ 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x61, 0x67, 0x73, 0x20, 0x6d,
+ 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x73,
+ 0x20, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2c,
+ 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x0d, 0x0a, 0x6f, 0x72,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e,
+ 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72,
+ 0x64, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x3c,
+ 0x2f, 0x6b, 0x77, 0x3e, 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x0d,
+ 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62,
+ 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6d, 0x70,
+ 0x74, 0x79, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
+ 0x61, 0x67, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64,
+ 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c,
+ 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x34,
+ 0x35, 0x22, 0x3e, 0x5b, 0x45, 0x34, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x0d, 0x0a, 0x62, 0x65,
+ 0x20, 0x75, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73,
+ 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62,
+ 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2c, 0x3c, 0x2f, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x3e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20,
+ 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64,
+ 0x0d, 0x0a, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x49, 0x4d,
+ 0x47, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, 0x66,
+ 0x74, 0x22, 0x0d, 0x0a, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x49, 0x63, 0x6f, 0x6e, 0x73, 0x2f, 0x57, 0x57,
+ 0x57, 0x2f, 0x77, 0x33, 0x63, 0x5f, 0x68, 0x6f, 0x6d, 0x65, 0x22, 0x20,
+ 0x2f, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x62, 0x72, 0x3e, 0x26,
+ 0x6c, 0x74, 0x3b, 0x2f, 0x62, 0x72, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74,
+ 0x3b, 0x62, 0x72, 0x2f, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69,
+ 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x65, 0x6c, 0x65, 0x6d, 0x64,
+ 0x65, 0x63, 0x6c, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x79,
+ 0x70, 0x65, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x64, 0x6f, 0x63, 0x22, 0x3e, 0x58, 0x4d,
+ 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6d, 0x61, 0x79,
+ 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x0d, 0x0a, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73,
+ 0x2c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61,
+ 0x69, 0x6e, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0d, 0x0a, 0x41, 0x6e,
+ 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x73,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x27, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66,
+ 0x74, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69,
+ 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x63, 0x61,
+ 0x6e, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x0d, 0x0a, 0x61, 0x73,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3e, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x72, 0x65, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x41, 0x74, 0x20, 0x75, 0x73, 0x65,
+ 0x72, 0x0d, 0x0a, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61,
+ 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x69, 0x73, 0x73, 0x75,
+ 0x65, 0x20, 0x61, 0x20, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20,
+ 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x6e, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x0d, 0x0a, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6e, 0x6f, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73,
+ 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x62,
+ 0x75, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x65, 0x6c, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x20, 0x74, 0x65, 0x72,
+ 0x6d, 0x3d, 0x22, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54,
+ 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x41, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x74,
+ 0x61, 0x6b, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x72,
+ 0x6d, 0x3a, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70,
+ 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, 0x44, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67,
+ 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77, 0x32, 0x3d, 0x22, 0x35,
+ 0x2e, 0x35, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x38,
+ 0x22, 0x20, 0x70, 0x63, 0x77, 0x35, 0x3d, 0x22, 0x39, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63,
+ 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6c,
+ 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74,
+ 0x3b, 0x21, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x27, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53,
+ 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d,
+ 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x70, 0x65, 0x63, 0x22,
+ 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x70, 0x65, 0x63,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x3f, 0x0d, 0x0a, 0x27, 0x3e, 0x27, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x45, 0x44, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2f, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x70, 0x65, 0x63, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x73, 0x70, 0x65, 0x63, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e,
+ 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x27,
+ 0x20, 0x7c, 0x20, 0x27, 0x41, 0x4e, 0x59, 0x27, 0x20, 0x7c, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4d,
+ 0x69, 0x78, 0x65, 0x64, 0x22, 0x3e, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x72, 0x65, 0x6e, 0x22, 0x3e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72,
+ 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x68,
+ 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70,
+ 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x67, 0x69, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x45, 0x44, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x3e, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x45,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20,
+ 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x4e, 0x6f, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4c,
+ 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x62, 0x72, 0x20, 0x45, 0x4d, 0x50,
+ 0x54, 0x59, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4c,
+ 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x70, 0x20, 0x28, 0x23, 0x50, 0x43,
+ 0x44, 0x41, 0x54, 0x41, 0x7c, 0x65, 0x6d, 0x70, 0x68, 0x29, 0x2a, 0x20,
+ 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4c, 0x45, 0x4d,
+ 0x45, 0x4e, 0x54, 0x20, 0x25, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x70, 0x61,
+ 0x72, 0x61, 0x3b, 0x20, 0x25, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x2e, 0x70, 0x61, 0x72, 0x61, 0x3b, 0x20, 0x3e, 0x0d, 0x0a, 0x26, 0x6c,
+ 0x74, 0x3b, 0x21, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x41, 0x4e, 0x59,
+ 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76,
+ 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d,
+ 0x22, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x41, 0x6e, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x73,
+ 0x74, 0x61, 0x67, 0x22, 0x3e, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x68, 0x61, 0x73, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x6f, 0x6e,
+ 0x6c, 0x79, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x65,
+ 0x6e, 0x74, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3e, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x0d, 0x0a, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x28,
+ 0x6e, 0x6f, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x20, 0x64, 0x61, 0x74, 0x61, 0x29, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72,
+ 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x77, 0x68, 0x69, 0x74,
+ 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x28, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f,
+ 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
+ 0x22, 0x0d, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x43, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x3e,
+ 0x49, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x73, 0x65,
+ 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72,
+ 0x61, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+ 0x73, 0x20, 0x61, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58,
+ 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30,
+ 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45,
+ 0x35, 0x35, 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x35, 0x5d, 0x3c, 0x2f, 0x6c,
+ 0x6f, 0x63, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x2c, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c,
+ 0x65, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x20, 0x67, 0x6f,
+ 0x76, 0x65, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64,
+ 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20,
+ 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c,
+ 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x65,
+ 0x61, 0x72, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d,
+ 0x61, 0x72, 0x20, 0x69, 0x73, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x20,
+ 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x70,
+ 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x70,
+ 0x22, 0x3e, 0x63, 0x70, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x73, 0x29, 0x2c,
+ 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73,
+ 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73,
+ 0x2c, 0x20, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x20, 0x6c, 0x69, 0x73,
+ 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x2c,
+ 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65,
+ 0x20, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69,
+ 0x63, 0x6c, 0x65, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22,
+ 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73,
+ 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72,
+ 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77, 0x32,
+ 0x3d, 0x22, 0x35, 0x2e, 0x35, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d,
+ 0x22, 0x31, 0x36, 0x22, 0x20, 0x70, 0x63, 0x77, 0x35, 0x3d, 0x22, 0x31,
+ 0x31, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72,
+ 0x65, 0x6e, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x3c, 0x2f, 0x6c, 0x68, 0x73,
+ 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x68, 0x6f, 0x69, 0x63,
+ 0x65, 0x22, 0x3e, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x73, 0x65, 0x71, 0x22, 0x3e, 0x73, 0x65,
+ 0x71, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x0d, 0x0a, 0x28, 0x27, 0x3f,
+ 0x27, 0x20, 0x7c, 0x20, 0x27, 0x2a, 0x27, 0x20, 0x7c, 0x20, 0x27, 0x2b,
+ 0x27, 0x29, 0x3f, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x70, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x63, 0x70, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x28, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61,
+ 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0x3e,
+ 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d,
+ 0x0a, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x73, 0x65, 0x71, 0x22, 0x3e, 0x73, 0x65, 0x71, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x20, 0x28, 0x27, 0x3f, 0x27, 0x20, 0x7c,
+ 0x20, 0x27, 0x2a, 0x27, 0x20, 0x7c, 0x20, 0x27, 0x2b, 0x27, 0x29, 0x3f,
+ 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65,
+ 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x63, 0x68, 0x6f, 0x69,
+ 0x63, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x27, 0x28, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3f, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x70, 0x22, 0x3e, 0x63, 0x70, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x27, 0x7c, 0x27, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x70, 0x22,
+ 0x3e, 0x63, 0x70, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x29, 0x2b, 0x20,
+ 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20,
+ 0x27, 0x29, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x6d, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x35, 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x30, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x35, 0x32, 0x22, 0x3e, 0x5b, 0x45,
+ 0x35, 0x32, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x50, 0x45, 0x69, 0x6e, 0x47, 0x72, 0x6f,
+ 0x75, 0x70, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x73, 0x65, 0x71, 0x22, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x73, 0x65, 0x71, 0x3c, 0x2f, 0x6c, 0x68, 0x73,
+ 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x28, 0x27, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x70, 0x22,
+ 0x3e, 0x63, 0x70, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x20, 0x3c,
+ 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x27,
+ 0x2c, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x3f, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x63, 0x70, 0x22, 0x3e, 0x63, 0x70, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x29, 0x2a, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x27, 0x29, 0x27, 0x3c, 0x2f, 0x72, 0x68,
+ 0x73, 0x3e, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x35, 0x32, 0x22, 0x3e, 0x5b,
+ 0x45, 0x35, 0x32, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x50, 0x45, 0x69, 0x6e, 0x47, 0x72,
+ 0x6f, 0x75, 0x70, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67,
+ 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20,
+ 0x65, 0x61, 0x63, 0x68, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e,
+ 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x69, 0x73, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20,
+ 0x61, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x0d, 0x0a, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x70,
+ 0x70, 0x65, 0x61, 0x72, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x22, 0x3e, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x20, 0x41, 0x6e, 0x79,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x70, 0x61,
+ 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20,
+ 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20,
+ 0x6d, 0x61, 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x6c, 0x65, 0x6d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x20,
+ 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6d,
+ 0x6d, 0x61, 0x72, 0x3b, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x20,
+ 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e,
+ 0x20, 0x61, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20,
+ 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x61,
+ 0x63, 0x68, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x6c, 0x65, 0x6d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64,
+ 0x65, 0x72, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x0d, 0x0a, 0x54,
+ 0x68, 0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x66, 0x6f,
+ 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x67,
+ 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69,
+ 0x63, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x63, 0x63,
+ 0x75, 0x72, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f,
+ 0x72, 0x65, 0x20, 0x28, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2b, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x29, 0x2c, 0x0d, 0x0a, 0x7a, 0x65,
+ 0x72, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x28,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2a, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x29, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x7a, 0x65, 0x72, 0x6f,
+ 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65,
+ 0x73, 0x20, 0x28, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3f, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x29, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x0d,
+ 0x0a, 0x61, 0x62, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20,
+ 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72,
+ 0x61, 0x74, 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x0d, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72,
+ 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x63,
+ 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x79, 0x6e, 0x74,
+ 0x61, 0x78, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x69,
+ 0x6e, 0x67, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x69, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x6f, 0x73,
+ 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0d, 0x0a, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73,
+ 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68,
+ 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66,
+ 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20,
+ 0x69, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20,
+ 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x0d, 0x0a, 0x70, 0x6f,
+ 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72,
+ 0x61, 0x63, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x70, 0x61,
+ 0x74, 0x68, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d,
+ 0x6f, 0x64, 0x65, 0x6c, 0x2c, 0x20, 0x6f, 0x62, 0x65, 0x79, 0x69, 0x6e,
+ 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e,
+ 0x63, 0x65, 0x2c, 0x0d, 0x0a, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x2c,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x70, 0x65, 0x74, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,
+ 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69,
+ 0x6e, 0x67, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x61, 0x67, 0x61, 0x69,
+ 0x6e, 0x73, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d,
+ 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63,
+ 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x0d, 0x0a,
+ 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74,
+ 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c,
+ 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x61,
+ 0x6e, 0x0d, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6d, 0x6f, 0x72,
+ 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f,
+ 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66,
+ 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65,
+ 0x6c, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x0d, 0x0a, 0x6d, 0x6f, 0x72, 0x65,
+ 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72,
+ 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x74, 0x65,
+ 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x6d, 0x22, 0x2f, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x61, 0x70, 0x70,
+ 0x65, 0x6e, 0x64, 0x69, 0x78, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72,
+ 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x74, 0x65,
+ 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x6d, 0x22, 0x2f, 0x3e, 0x2e, 0x2d,
+ 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x61, 0x70, 0x70,
+ 0x65, 0x6e, 0x64, 0x69, 0x78, 0x20, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x74,
+ 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
+ 0x73, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x50,
+ 0x45, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3e, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x20, 0x47,
+ 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x50, 0x45, 0x20, 0x4e, 0x65, 0x73, 0x74,
+ 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70,
+ 0x3e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x72, 0x65, 0x70, 0x6c, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x72, 0x65,
+ 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65,
+ 0x78, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x6c, 0x79, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x31, 0x31, 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x31, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x68,
+ 0x65, 0x73, 0x69, 0x7a, 0x65, 0x64, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2e,
+ 0x20, 0x54, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20,
+ 0x73, 0x61, 0x79, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x65, 0x69, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70,
+ 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x6f,
+ 0x73, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x68,
+ 0x65, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x0d, 0x0a, 0x61, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63,
+ 0x68, 0x6f, 0x69, 0x63, 0x65, 0x22, 0x3e, 0x63, 0x68, 0x6f, 0x69, 0x63,
+ 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x73, 0x65, 0x71, 0x22,
+ 0x3e, 0x73, 0x65, 0x71, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x6f,
+ 0x72, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x22, 0x3e, 0x4d, 0x69, 0x78,
+ 0x65, 0x64, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x50, 0x45, 0x52, 0x65, 0x66,
+ 0x22, 0x3e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x0d,
+ 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x39, 0x22, 0x3e, 0x5b,
+ 0x45, 0x31, 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x22,
+ 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x69, 0x66, 0x20,
+ 0x61, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x0d, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72,
+ 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x68, 0x6f, 0x69, 0x63,
+ 0x65, 0x22, 0x3e, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x2c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x73, 0x65, 0x71, 0x22, 0x3e, 0x73, 0x65, 0x71,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x3c, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4d,
+ 0x69, 0x78, 0x65, 0x64, 0x22, 0x3e, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75,
+ 0x63, 0x74, 0x2c, 0x20, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x70, 0x6c,
+ 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74,
+ 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x61, 0x69, 0x6e, 0x20, 0x61, 0x74, 0x0d, 0x0a, 0x6c, 0x65, 0x61, 0x73,
+ 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x62, 0x6c,
+ 0x61, 0x6e, 0x6b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x65, 0x69, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74,
+ 0x20, 0x6e, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x6e, 0x6f,
+ 0x6e, 0x2d, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c,
+ 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
+ 0x63, 0x74, 0x6f, 0x72, 0x20, 0x28, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x7c, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x6f, 0x72, 0x20,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2c, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x29, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x3a, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c, 0x74,
+ 0x3b, 0x21, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x73, 0x70,
+ 0x65, 0x63, 0x20, 0x28, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x2c, 0x20, 0x62,
+ 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x3f, 0x29, 0x3e,
+ 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4c, 0x45, 0x4d, 0x45,
+ 0x4e, 0x54, 0x20, 0x64, 0x69, 0x76, 0x31, 0x20, 0x28, 0x68, 0x65, 0x61,
+ 0x64, 0x2c, 0x20, 0x28, 0x70, 0x20, 0x7c, 0x20, 0x6c, 0x69, 0x73, 0x74,
+ 0x20, 0x7c, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x29, 0x2a, 0x2c, 0x20, 0x64,
+ 0x69, 0x76, 0x32, 0x2a, 0x29, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b,
+ 0x21, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x64, 0x69, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x72, 0x79, 0x2d, 0x62, 0x6f, 0x64, 0x79,
+ 0x20, 0x28, 0x25, 0x64, 0x69, 0x76, 0x2e, 0x6d, 0x69, 0x78, 0x3b, 0x20,
+ 0x7c, 0x20, 0x25, 0x64, 0x69, 0x63, 0x74, 0x2e, 0x6d, 0x69, 0x78, 0x3b,
+ 0x29, 0x2a, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x6d, 0x69, 0x78,
+ 0x65, 0x64, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4d, 0x69, 0x78, 0x65,
+ 0x64, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d,
+ 0x3d, 0x22, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x20, 0x43, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x41, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x73, 0x74, 0x61,
+ 0x67, 0x22, 0x3e, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x68, 0x61, 0x73, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x0d, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x6f, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x73, 0x70, 0x65, 0x72, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x65,
+ 0x6e, 0x74, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3e, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x0d, 0x0a, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x49, 0x6e,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2c, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20,
+ 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e,
+ 0x65, 0x64, 0x2c, 0x0d, 0x0a, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72,
+ 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6e, 0x75,
+ 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x63, 0x63, 0x75,
+ 0x72, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e,
+ 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x2d, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75,
+ 0x70, 0x20, 0x70, 0x63, 0x77, 0x32, 0x3d, 0x22, 0x35, 0x2e, 0x35, 0x22,
+ 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x36, 0x22, 0x20, 0x70,
+ 0x63, 0x77, 0x35, 0x3d, 0x22, 0x31, 0x31, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4d, 0x69, 0x78, 0x65, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68,
+ 0x73, 0x3e, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x3c, 0x2f, 0x6c, 0x68, 0x73,
+ 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x28, 0x27, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x27, 0x23, 0x50,
+ 0x43, 0x44, 0x41, 0x54, 0x41, 0x27, 0x20, 0x28, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x0d, 0x0a, 0x27, 0x7c, 0x27, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e,
+ 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x29, 0x2a, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3f, 0x0d, 0x0a, 0x27, 0x29, 0x2a, 0x27, 0x20, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x7c,
+ 0x20, 0x27, 0x28, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3f, 0x20, 0x27, 0x23, 0x50, 0x43, 0x44, 0x41, 0x54, 0x41,
+ 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f,
+ 0x20, 0x27, 0x29, 0x27, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x76, 0x63,
+ 0x2d, 0x50, 0x45, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2f,
+ 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x76, 0x63,
+ 0x2d, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72,
+ 0x65, 0x6e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2f, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f,
+ 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x77,
+ 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d,
+ 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0d, 0x0a, 0x6d,
+ 0x61, 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x61, 0x73,
+ 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x2e, 0x20, 0x3c,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x22, 0x3e, 0x5b, 0x45,
+ 0x31, 0x30, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68, 0x65,
+ 0x0d, 0x0a, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x3c, 0x6b,
+ 0x77, 0x3e, 0x23, 0x50, 0x43, 0x44, 0x41, 0x54, 0x41, 0x3c, 0x2f, 0x6b,
+ 0x77, 0x3e, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x73, 0x20, 0x68,
+ 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20,
+ 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72,
+ 0x6d, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x70, 0x61, 0x72,
+ 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x3c, 0x2f, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f,
+ 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x4d, 0x69,
+ 0x78, 0x65, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x55,
+ 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x4e, 0x6f, 0x20, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+ 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x0d, 0x0a, 0x73, 0x61,
+ 0x6d, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20,
+ 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e,
+ 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67,
+ 0x6c, 0x65, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x2d, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65,
+ 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4c, 0x45, 0x4d, 0x45,
+ 0x4e, 0x54, 0x20, 0x70, 0x20, 0x28, 0x23, 0x50, 0x43, 0x44, 0x41, 0x54,
+ 0x41, 0x7c, 0x61, 0x7c, 0x75, 0x6c, 0x7c, 0x62, 0x7c, 0x69, 0x7c, 0x65,
+ 0x6d, 0x29, 0x2a, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45,
+ 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x70, 0x20, 0x28, 0x23, 0x50,
+ 0x43, 0x44, 0x41, 0x54, 0x41, 0x20, 0x7c, 0x20, 0x25, 0x66, 0x6f, 0x6e,
+ 0x74, 0x3b, 0x20, 0x7c, 0x20, 0x25, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x3b, 0x20, 0x7c, 0x20, 0x25, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c,
+ 0x3b, 0x20, 0x7c, 0x20, 0x25, 0x66, 0x6f, 0x72, 0x6d, 0x3b, 0x29, 0x2a,
+ 0x20, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4c, 0x45,
+ 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x62, 0x20, 0x28, 0x23, 0x50, 0x43, 0x44,
+ 0x41, 0x54, 0x41, 0x29, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x61, 0x74, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x73,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x4c, 0x69, 0x73, 0x74,
+ 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x74, 0x74, 0x72, 0x22, 0x3e,
+ 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73,
+ 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2d,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0d, 0x0a, 0x70, 0x61, 0x69, 0x72, 0x73,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x2e, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x0d, 0x0a, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x70,
+ 0x70, 0x65, 0x61, 0x72, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x69, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x73, 0x74,
+ 0x61, 0x67, 0x22, 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61,
+ 0x67, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x65, 0x74, 0x61, 0x67, 0x22, 0x3e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x61, 0x67, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x3b, 0x20,
+ 0x74, 0x68, 0x75, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72,
+ 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x75, 0x73,
+ 0x65, 0x64, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x72, 0x65, 0x63, 0x6f, 0x67,
+ 0x6e, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x61, 0x70,
+ 0x70, 0x65, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x73, 0x70, 0x65,
+ 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x65,
+ 0x63, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x74, 0x61, 0x67, 0x73, 0x22,
+ 0x2f, 0x3e, 0x2e, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0d, 0x0a, 0x6d, 0x61, 0x79,
+ 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x3a, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x6f, 0x20,
+ 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+ 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e,
+ 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76,
+ 0x65, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x6f, 0x20, 0x65, 0x73, 0x74, 0x61, 0x62,
+ 0x6c, 0x69, 0x73, 0x68, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f,
+ 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c,
+ 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76,
+ 0x69, 0x64, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
+ 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x66, 0x6f, 0x72, 0x0d, 0x0a,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x74, 0x74, 0x64, 0x65, 0x63, 0x6c,
+ 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x41, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x44,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x41, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x0d, 0x0a, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+ 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c,
+ 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x28, 0x69, 0x66, 0x20, 0x61, 0x6e,
+ 0x79, 0x29, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x61, 0x73,
+ 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x65, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61,
+ 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x44, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x6c, 0x69, 0x73,
+ 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68,
+ 0x73, 0x3e, 0x41, 0x74, 0x74, 0x6c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x63,
+ 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e,
+ 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x41, 0x54, 0x54, 0x4c, 0x49, 0x53,
+ 0x54, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x44, 0x65, 0x66,
+ 0x22, 0x3e, 0x41, 0x74, 0x74, 0x44, 0x65, 0x66, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x2a, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x3f, 0x20, 0x27, 0x3e, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41,
+ 0x74, 0x74, 0x44, 0x65, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68,
+ 0x73, 0x3e, 0x41, 0x74, 0x74, 0x44, 0x65, 0x66, 0x3c, 0x2f, 0x6c, 0x68,
+ 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e,
+ 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74,
+ 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x54,
+ 0x79, 0x70, 0x65, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x54, 0x79, 0x70, 0x65,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+ 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c,
+ 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65,
+ 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x6c, 0x69,
+ 0x73, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x6c,
+ 0x69, 0x73, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x0d, 0x0a, 0x72, 0x75, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e,
+ 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x41, 0x74,
+ 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x69,
+ 0x73, 0x73, 0x75, 0x65, 0x0d, 0x0a, 0x61, 0x20, 0x77, 0x61, 0x72, 0x6e,
+ 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61,
+ 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c,
+ 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x2c, 0x0d,
+ 0x0a, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f,
+ 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22,
+ 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x44, 0x65, 0x66,
+ 0x22, 0x3e, 0x41, 0x74, 0x74, 0x44, 0x65, 0x66, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x72, 0x75, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x57, 0x68,
+ 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x6c, 0x69, 0x73, 0x74,
+ 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x6c, 0x69, 0x73,
+ 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x69,
+ 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x0d, 0x0a,
+ 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68,
+ 0x6f, 0x73, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x2e,
+ 0x20, 0x57, 0x68, 0x65, 0x6e, 0x0d, 0x0a, 0x6d, 0x6f, 0x72, 0x65, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x64, 0x65, 0x66,
+ 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x70,
+ 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20,
+ 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x62, 0x69,
+ 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x67, 0x6e,
+ 0x6f, 0x72, 0x65, 0x64, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x39, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x5d, 0x3c, 0x2f, 0x6c,
+ 0x6f, 0x63, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d,
+ 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6f, 0x70, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69,
+ 0x74, 0x79, 0x2c, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x44, 0x54, 0x44, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x68,
+ 0x6f, 0x6f, 0x73, 0x65, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f,
+ 0x76, 0x69, 0x64, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x73, 0x74,
+ 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x0d, 0x0a, 0x61,
+ 0x74, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x64, 0x65, 0x66,
+ 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69,
+ 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f,
+ 0x6e, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x69, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x0d, 0x0a,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x46, 0x6f,
+ 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61,
+ 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72,
+ 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72,
+ 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x69, 0x73, 0x73,
+ 0x75, 0x65, 0x20, 0x61, 0x20, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67,
+ 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69,
+ 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x0d, 0x0a,
+ 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69,
+ 0x64, 0x65, 0x64, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67,
+ 0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x64, 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63,
+ 0x2d, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x74,
+ 0x79, 0x70, 0x65, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20,
+ 0x54, 0x79, 0x70, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65,
+ 0x65, 0x20, 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x3a, 0x20, 0x61, 0x20, 0x73,
+ 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20,
+ 0x61, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x6f, 0x6b,
+ 0x65, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65,
+ 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x65,
+ 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+ 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20,
+ 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x74, 0x61, 0x6b,
+ 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x73, 0x0d,
+ 0x0a, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20,
+ 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x76,
+ 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x65, 0x78, 0x69, 0x63,
+ 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6d, 0x61, 0x6e,
+ 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69,
+ 0x6e, 0x74, 0x73, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x38,
+ 0x22, 0x3e, 0x5b, 0x45, 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x2e, 0x0d, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x69, 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69,
+ 0x6e, 0x74, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64,
+ 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x0d, 0x0a, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e,
+ 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20,
+ 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64,
+ 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66,
+ 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x61, 0x74, 0x74, 0x64, 0x65, 0x63,
+ 0x6c, 0x73, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63,
+ 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62,
+ 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x54, 0x79,
+ 0x70, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70,
+ 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x34, 0x22, 0x20, 0x70, 0x63, 0x77,
+ 0x35, 0x3d, 0x22, 0x31, 0x31, 0x2e, 0x35, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x41, 0x74, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x41, 0x74, 0x74, 0x54, 0x79, 0x70, 0x65, 0x3c,
+ 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x53, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x69, 0x7a, 0x65,
+ 0x64, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
+ 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61,
+ 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x45, 0x6e, 0x75,
+ 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53,
+ 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+ 0x54, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72,
+ 0x68, 0x73, 0x3e, 0x27, 0x43, 0x44, 0x41, 0x54, 0x41, 0x27, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x69, 0x7a, 0x65,
+ 0x64, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68,
+ 0x73, 0x3e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x54,
+ 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68,
+ 0x73, 0x3e, 0x27, 0x49, 0x44, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e,
+ 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x64, 0x22,
+ 0x2f, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x6f,
+ 0x6e, 0x65, 0x2d, 0x69, 0x64, 0x2d, 0x70, 0x65, 0x72, 0x2d, 0x65, 0x6c,
+ 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x69, 0x64, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+ 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x7c, 0x20,
+ 0x27, 0x49, 0x44, 0x52, 0x45, 0x46, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73,
+ 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x64,
+ 0x72, 0x65, 0x66, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x7c, 0x20, 0x27, 0x49, 0x44, 0x52, 0x45, 0x46, 0x53, 0x27, 0x3c,
+ 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x69, 0x64, 0x72, 0x65, 0x66, 0x22, 0x2f, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x7c, 0x20, 0x27, 0x45, 0x4e, 0x54, 0x49,
+ 0x54, 0x59, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x65, 0x6e, 0x74, 0x6e, 0x61, 0x6d,
+ 0x65, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x7c,
+ 0x20, 0x27, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x49, 0x45, 0x53, 0x27, 0x3c,
+ 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x65, 0x6e, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x7c, 0x20, 0x27, 0x4e, 0x4d,
+ 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e,
+ 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x6e, 0x6d, 0x74,
+ 0x6f, 0x6b, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73, 0x3e,
+ 0x7c, 0x20, 0x27, 0x4e, 0x4d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x27,
+ 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x6e, 0x6d, 0x74, 0x6f, 0x6b, 0x22, 0x2f, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f,
+ 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x64, 0x22, 0x3e,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x49, 0x44, 0x3c, 0x2f, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3c, 0x6b, 0x77,
+ 0x3e, 0x49, 0x44, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x41, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70,
+ 0x65, 0x61, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x61,
+ 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x3b, 0x20, 0x69, 0x2e, 0x65, 0x2e, 0x2c, 0x20, 0x49, 0x44,
+ 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x79, 0x0d, 0x0a, 0x69,
+ 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x62, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6d,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74,
+ 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x6e, 0x65, 0x2d, 0x69, 0x64,
+ 0x2d, 0x70, 0x65, 0x72, 0x2d, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x4f, 0x6e, 0x65, 0x20, 0x49, 0x44, 0x20, 0x70, 0x65,
+ 0x72, 0x20, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x79,
+ 0x70, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x4e, 0x6f, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a,
+ 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76,
+ 0x65, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x6f, 0x6e, 0x65, 0x20, 0x49, 0x44, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,
+ 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76,
+ 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x64, 0x2d, 0x64,
+ 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x49, 0x44, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x49,
+ 0x44, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x0d,
+ 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x6b, 0x77,
+ 0x3e, 0x23, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x3c, 0x2f, 0x6b,
+ 0x77, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x23, 0x52,
+ 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x3c, 0x2f, 0x6b, 0x77, 0x3e,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74,
+ 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x64, 0x72, 0x65, 0x66, 0x22,
+ 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x49, 0x44, 0x52, 0x45, 0x46,
+ 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x49, 0x44, 0x52, 0x45, 0x46, 0x3c, 0x2f,
+ 0x6b, 0x77, 0x3e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x0d, 0x0a, 0x6d, 0x61,
+ 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65,
+ 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x49,
+ 0x44, 0x52, 0x45, 0x46, 0x53, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x0d, 0x0a,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e,
+ 0x61, 0x6d, 0x65, 0x73, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x3b, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e,
+ 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x49, 0x44, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x73,
+ 0x6f, 0x6d, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3b, 0x0d, 0x0a, 0x69, 0x2e,
+ 0x65, 0x2e, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x49, 0x44, 0x52, 0x45, 0x46,
+ 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66,
+ 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x49, 0x44, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x65, 0x6e, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x4e, 0x61,
+ 0x6d, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45, 0x4e, 0x54, 0x49, 0x54,
+ 0x59, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e,
+ 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45, 0x4e,
+ 0x54, 0x49, 0x54, 0x49, 0x45, 0x53, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x0d,
+ 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x73,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3b, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61,
+ 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x75, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x22, 0x3e, 0x75, 0x6e,
+ 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d,
+ 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f,
+ 0x63, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x44, 0x54, 0x44, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x6e, 0x6d, 0x74, 0x6f, 0x6b, 0x22, 0x3e, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x54, 0x6f, 0x6b, 0x65,
+ 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x56,
+ 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x4e, 0x4d, 0x54, 0x4f, 0x4b, 0x45,
+ 0x4e, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e,
+ 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3e, 0x4e, 0x6d, 0x74, 0x6f,
+ 0x6b, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x70, 0x72, 0x6f,
+ 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+ 0x3c, 0x6b, 0x77, 0x3e, 0x4e, 0x4d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53,
+ 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e,
+ 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3e, 0x4e, 0x6d, 0x74,
+ 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d,
+ 0x2d, 0x20, 0x77, 0x68, 0x79, 0x3f, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54,
+ 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x6f, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73,
+ 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x0d, 0x0a, 0x70, 0x61, 0x73,
+ 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x74, 0x6f,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0d, 0x0a, 0x3c,
+ 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x41, 0x56, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65,
+ 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x2d, 0x2d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e, 0x75, 0x6d,
+ 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d,
+ 0x3d, 0x22, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x0d, 0x0a,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x3e, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x74,
+ 0x61, 0x6b, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61,
+ 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x73, 0x0d, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65,
+ 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x72,
+ 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x6b, 0x69,
+ 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x65,
+ 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x3a,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70,
+ 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x75,
+ 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x41, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x75,
+ 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45, 0x6e, 0x75, 0x6d,
+ 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x6f, 0x74,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x4e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x75, 0x6d,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x45, 0x6e, 0x75,
+ 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x6f, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x54, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x27, 0x4e, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f,
+ 0x4e, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x27, 0x28, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3f, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e,
+ 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x27, 0x7c, 0x27,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20,
+ 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2a, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x27, 0x29, 0x27, 0x20, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x6e, 0x22, 0x2f, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4f, 0x6e, 0x65,
+ 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x22,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x2f,
+ 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x6f,
+ 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6d, 0x70, 0x74,
+ 0x79, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64,
+ 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45,
+ 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x28, 0x27,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3e, 0x4e, 0x6d, 0x74,
+ 0x6f, 0x6b, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a, 0x28,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x27,
+ 0x7c, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x3f, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x4e, 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3e, 0x4e,
+ 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29,
+ 0x2a, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x3f, 0x20, 0x27, 0x29, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c,
+ 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x65, 0x6e, 0x75, 0x6d,
+ 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x41, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x4e, 0x4f, 0x54,
+ 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x20, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x64, 0x65,
+ 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x3e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x0d, 0x0a, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x44, 0x54, 0x44, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61,
+ 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x73, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20,
+ 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x62,
+ 0x65, 0x0d, 0x0a, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69,
+ 0x73, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x6e, 0x22,
+ 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4e, 0x6f, 0x74, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0d, 0x0a, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6f, 0x6e, 0x65, 0x20,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23,
+ 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3e, 0x6e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73,
+ 0x0d, 0x0a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x0d, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76,
+ 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4f, 0x6e, 0x65, 0x4e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x22, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x37, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x4f, 0x6e, 0x65, 0x0d, 0x0a, 0x4e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x65, 0x72, 0x20,
+ 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x79, 0x70, 0x65,
+ 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x4e, 0x6f,
+ 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6d,
+ 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65,
+ 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x4e, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f,
+ 0x4e, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x0d, 0x0a, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63,
+ 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x6f, 0x4e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6d, 0x70, 0x74, 0x79,
+ 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x38, 0x22, 0x3e, 0x5b,
+ 0x45, 0x36, 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x4e, 0x6f,
+ 0x0d, 0x0a, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
+ 0x6e, 0x20, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x45, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70,
+ 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74,
+ 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74,
+ 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x20, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20,
+ 0x74, 0x79, 0x70, 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x4e, 0x4f, 0x54,
+ 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x61,
+ 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x3c, 0x6b, 0x77, 0x3e,
+ 0x45, 0x4d, 0x50, 0x54, 0x59, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3e, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70,
+ 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x0d, 0x0a, 0x6f, 0x6e, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x6d, 0x74, 0x6f,
+ 0x6b, 0x65, 0x6e, 0x22, 0x3e, 0x4e, 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6f, 0x70, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69,
+ 0x74, 0x79, 0x2c, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x3c,
+ 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x6d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3e, 0x4e, 0x6d, 0x74,
+ 0x6f, 0x6b, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x73, 0x68,
+ 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x63, 0x63,
+ 0x75, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x0d,
+ 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x69,
+ 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69,
+ 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x61,
+ 0x74, 0x74, 0x72, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x44, 0x65, 0x66, 0x61,
+ 0x75, 0x6c, 0x74, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x61, 0x74, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65,
+ 0x73, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x0d, 0x0a, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x27, 0x73, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e,
+ 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,
+ 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x66, 0x20, 0x6e,
+ 0x6f, 0x74, 0x2c, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x61, 0x6e, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72,
+ 0x0d, 0x0a, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x72, 0x65, 0x61,
+ 0x63, 0x74, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x65, 0x64, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x62, 0x73, 0x65, 0x6e, 0x74,
+ 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63,
+ 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62,
+ 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x44, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75,
+ 0x70, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x34, 0x22, 0x20,
+ 0x70, 0x63, 0x77, 0x35, 0x3d, 0x22, 0x31, 0x31, 0x2e, 0x35, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x44, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x44,
+ 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x23, 0x52,
+ 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x27, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x27, 0x23, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45,
+ 0x44, 0x27, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x7c, 0x20, 0x28, 0x28, 0x27, 0x23, 0x46, 0x49,
+ 0x58, 0x45, 0x44, 0x27, 0x20, 0x53, 0x29, 0x3f, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x41, 0x74, 0x74, 0x72,
+ 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x65, 0x66, 0x61, 0x74, 0x74, 0x72, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x22, 0x2f, 0x3e, 0x3c, 0x77, 0x66, 0x63, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x41, 0x74, 0x74, 0x72,
+ 0x56, 0x61, 0x6c, 0x73, 0x22, 0x2f, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x74,
+ 0x72, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f,
+ 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x3c, 0x6b, 0x77,
+ 0x3e, 0x23, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x3c, 0x2f,
+ 0x6b, 0x77, 0x3e, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x61,
+ 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f,
+ 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x23,
+ 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x3c, 0x2f, 0x6b, 0x77, 0x3e,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6e, 0x6f, 0x20, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69,
+ 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2e, 0x20,
+ 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6e, 0x79,
+ 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x21, 0x21, 0x0d, 0x0a, 0x3c, 0x6b, 0x77,
+ 0x3e, 0x23, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x3c, 0x2f, 0x6b,
+ 0x77, 0x3e, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x6d,
+ 0x69, 0x74, 0x74, 0x65, 0x64, 0x0d, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x20,
+ 0x61, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c,
+ 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d,
+ 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6e, 0x6f, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+ 0x66, 0x69, 0x65, 0x64, 0x3b, 0x20, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70,
+ 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x0d, 0x0a, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x20,
+ 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22,
+ 0x3e, 0x49, 0x66, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20,
+ 0x6e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x3c, 0x6b, 0x77, 0x3e,
+ 0x23, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x3c, 0x2f, 0x6b,
+ 0x77, 0x3e, 0x20, 0x6e, 0x6f, 0x72, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x23,
+ 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x3c, 0x2f, 0x6b, 0x77, 0x3e,
+ 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x41, 0x74,
+ 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x65, 0x64, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x23, 0x46, 0x49, 0x58, 0x45, 0x44, 0x3c,
+ 0x2f, 0x6b, 0x77, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64,
+ 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x77, 0x61,
+ 0x79, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x0d, 0x0a, 0x74, 0x68, 0x65,
+ 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x61, 0x20, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69,
+ 0x73, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x2c, 0x20,
+ 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x61, 0x6e,
+ 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x68, 0x61, 0x76, 0x65, 0x20,
+ 0x61, 0x73, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20,
+ 0x77, 0x65, 0x72, 0x65, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74,
+ 0x0d, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x64, 0x65, 0x66, 0x61,
+ 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x41, 0x74,
+ 0x74, 0x72, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x52, 0x65,
+ 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c,
+ 0x70, 0x3e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x3c, 0x6b, 0x77,
+ 0x3e, 0x23, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x3c, 0x2f,
+ 0x6b, 0x77, 0x3e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x0d, 0x0a, 0x73, 0x70, 0x65,
+ 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61,
+ 0x6c, 0x6c, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x64, 0x65, 0x66, 0x61, 0x74, 0x74, 0x72, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x41,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x44, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x20, 0x4c, 0x65, 0x67, 0x61, 0x6c, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x65, 0x65, 0x74, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f,
+ 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65,
+ 0x64, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x0d,
+ 0x0a, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x46,
+ 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x74, 0x72, 0x22, 0x3e, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x44, 0x65, 0x66, 0x61,
+ 0x75, 0x6c, 0x74, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70,
+ 0x3e, 0x49, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x0d, 0x0a, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20,
+ 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e,
+ 0x23, 0x46, 0x49, 0x58, 0x45, 0x44, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x20,
+ 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x73,
+ 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+ 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x41, 0x54,
+ 0x54, 0x4c, 0x49, 0x53, 0x54, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65,
+ 0x66, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x69, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x44, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52,
+ 0x45, 0x44, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x20, 0x43, 0x44,
+ 0x41, 0x54, 0x41, 0x20, 0x20, 0x20, 0x23, 0x49, 0x4d, 0x50, 0x4c, 0x49,
+ 0x45, 0x44, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x41, 0x54,
+ 0x54, 0x4c, 0x49, 0x53, 0x54, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x0d, 0x0a,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x20, 0x20, 0x20, 0x28, 0x62, 0x75, 0x6c, 0x6c, 0x65,
+ 0x74, 0x73, 0x7c, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x7c, 0x67,
+ 0x6c, 0x6f, 0x73, 0x73, 0x61, 0x72, 0x79, 0x29, 0x20, 0x20, 0x22, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x26, 0x6c,
+ 0x74, 0x3b, 0x21, 0x41, 0x54, 0x54, 0x4c, 0x49, 0x53, 0x54, 0x20, 0x66,
+ 0x6f, 0x72, 0x6d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x20, 0x43,
+ 0x44, 0x41, 0x54, 0x41, 0x20, 0x20, 0x20, 0x23, 0x46, 0x49, 0x58, 0x45,
+ 0x44, 0x20, 0x22, 0x50, 0x4f, 0x53, 0x54, 0x22, 0x3e, 0x3c, 0x2f, 0x65,
+ 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x41,
+ 0x56, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x22, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x37, 0x30, 0x22, 0x3e, 0x5b,
+ 0x45, 0x37, 0x30, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x0d, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20,
+ 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74,
+ 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x65,
+ 0x63, 0x6b, 0x65, 0x64, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61,
+ 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x62, 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67,
+ 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69,
+ 0x74, 0x68, 0x6d, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x6f,
+ 0x72, 0x20, 0x62, 0x79, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73,
+ 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6d, 0x65,
+ 0x74, 0x68, 0x6f, 0x64, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x74, 0x68,
+ 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x6f, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+ 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68,
+ 0x6d, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x6f, 0x6c, 0x69,
+ 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c,
+ 0x70, 0x3e, 0x41, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x62,
+ 0x72, 0x65, 0x61, 0x6b, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68,
+ 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6e, 0x6f, 0x72,
+ 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x69,
+ 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x23, 0x78, 0x41, 0x20,
+ 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64,
+ 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65,
+ 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x6c,
+ 0x69, 0x6e, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x2c,
+ 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x74,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x67,
+ 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61,
+ 0x74, 0x65, 0x73, 0x0d, 0x0a, 0x6f, 0x6e, 0x20, 0x74, 0x65, 0x78, 0x74,
+ 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, 0x61, 0x79, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x42, 0x65,
+ 0x67, 0x69, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e,
+ 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x69,
+ 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6d,
+ 0x70, 0x74, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x46,
+ 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2c,
+ 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x75, 0x6e, 0x6e, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x2c, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72,
+ 0x73, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69,
+ 0x6e, 0x75, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+ 0x0d, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67,
+ 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x75, 0x6c, 0x69, 0x73,
+ 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70,
+ 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x6e, 0x6f, 0x72, 0x6d,
+ 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x46,
+ 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20,
+ 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20,
+ 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x33,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x67,
+ 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x46, 0x6f, 0x72, 0x20,
+ 0x61, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63,
+ 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x28, 0x23, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x23, 0x78, 0x44, 0x2c, 0x20,
+ 0x23, 0x78, 0x41, 0x2c, 0x20, 0x23, 0x78, 0x39, 0x29, 0x2c, 0x20, 0x61,
+ 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x73, 0x70, 0x61, 0x63,
+ 0x65, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x20, 0x28, 0x23, 0x78, 0x32, 0x30, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65,
+ 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x6e,
+ 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72,
+ 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x75, 0x6c, 0x69, 0x73, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x43, 0x44, 0x41, 0x54, 0x41, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72,
+ 0x0d, 0x0a, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x62, 0x79, 0x20, 0x64, 0x69, 0x73, 0x63,
+ 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6c,
+ 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74,
+ 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x20, 0x28, 0x23, 0x78, 0x32, 0x30, 0x29, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x69,
+ 0x6e, 0x67, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73,
+ 0x20, 0x6f, 0x66, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x28, 0x23,
+ 0x78, 0x32, 0x30, 0x29, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x69,
+ 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x28,
+ 0x23, 0x78, 0x32, 0x30, 0x29, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x6e, 0x6f, 0x72, 0x6d,
+ 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x61, 0x20,
+ 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x20, 0x28, 0x23, 0x78, 0x32, 0x30, 0x29, 0x2c, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65,
+ 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x61, 0x69, 0x6e, 0x73, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c,
+ 0x66, 0x20, 0x28, 0x23, 0x78, 0x44, 0x2c, 0x20, 0x23, 0x78, 0x41, 0x20,
+ 0x6f, 0x72, 0x20, 0x23, 0x78, 0x39, 0x29, 0x2e, 0x20, 0x54, 0x68, 0x69,
+ 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x73, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x63, 0x61,
+ 0x73, 0x65, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x75, 0x6e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65,
+ 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65,
+ 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x0d,
+ 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x29, 0x2c,
+ 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65,
+ 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x61, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x28, 0x23, 0x78, 0x32, 0x30, 0x29,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d,
+ 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x0d, 0x0a, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x77,
+ 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x6e,
+ 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73,
+ 0x0d, 0x0a, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x68,
+ 0x6f, 0x73, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x77, 0x68, 0x69, 0x74,
+ 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x62, 0x65, 0x69, 0x6e,
+ 0x67, 0x20, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x6c,
+ 0x79, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
+ 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x0d, 0x0a, 0x73,
+ 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x28, 0x23, 0x78, 0x32, 0x30, 0x29, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69,
+ 0x7a, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6c, 0x6c, 0x20, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6e, 0x6f, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68,
+ 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64,
+ 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x74,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x0d, 0x0a, 0x62, 0x79, 0x20, 0x61,
+ 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,
+ 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39,
+ 0x35, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c,
+ 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x61, 0x73,
+ 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64,
+ 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x43, 0x44, 0x41, 0x54, 0x41, 0x3c, 0x2f,
+ 0x6b, 0x77, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2e, 0x20, 0x47, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x0d,
+ 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e,
+ 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20,
+ 0x64, 0x20, 0x22, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x78, 0x44, 0x3b,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e, 0x54,
+ 0x49, 0x54, 0x59, 0x20, 0x61, 0x20, 0x22, 0x26, 0x61, 0x6d, 0x70, 0x3b,
+ 0x23, 0x78, 0x41, 0x3b, 0x22, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b,
+ 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x64, 0x61, 0x20, 0x22,
+ 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x78, 0x44, 0x3b, 0x26, 0x61, 0x6d,
+ 0x70, 0x3b, 0x23, 0x78, 0x41, 0x3b, 0x22, 0x3e, 0x3c, 0x2f, 0x65, 0x67,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x63,
+ 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x20,
+ 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72,
+ 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x6f, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x64, 0x64, 0x6c,
+ 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x20, 0x69, 0x66, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x3c, 0x61, 0x74, 0x74, 0x3e, 0x61, 0x3c, 0x2f, 0x61, 0x74,
+ 0x74, 0x3e, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x65, 0x64, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x4e, 0x4d, 0x54, 0x4f,
+ 0x4b, 0x45, 0x4e, 0x53, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20,
+ 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x69, 0x66, 0x20, 0x3c,
+ 0x61, 0x74, 0x74, 0x3e, 0x61, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x3e, 0x0d,
+ 0x0a, 0x69, 0x73, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64,
+ 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x43, 0x44, 0x41, 0x54, 0x41, 0x3c, 0x2f,
+ 0x6b, 0x77, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d,
+ 0x22, 0x31, 0x22, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x62,
+ 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x74, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74,
+ 0x68, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x68, 0x3e, 0x61, 0x20, 0x69, 0x73,
+ 0x20, 0x4e, 0x4d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x3c, 0x2f, 0x74,
+ 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x61, 0x20, 0x69, 0x73, 0x20, 0x43,
+ 0x44, 0x41, 0x54, 0x41, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74,
+ 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64,
+ 0x3e, 0x3c, 0x65, 0x67, 0x3e, 0x61, 0x3d, 0x22, 0x0d, 0x0a, 0x0d, 0x0a,
+ 0x78, 0x79, 0x7a, 0x22, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x78, 0x20, 0x79, 0x20, 0x7a, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x23, 0x78, 0x32, 0x30, 0x20, 0x23, 0x78, 0x32, 0x30,
+ 0x20, 0x78, 0x20, 0x79, 0x20, 0x7a, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x74, 0x72,
+ 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x65, 0x67,
+ 0x3e, 0x61, 0x3d, 0x22, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x64, 0x3b, 0x26,
+ 0x61, 0x6d, 0x70, 0x3b, 0x64, 0x3b, 0x41, 0x26, 0x61, 0x6d, 0x70, 0x3b,
+ 0x61, 0x3b, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x61, 0x3b, 0x42, 0x26, 0x61,
+ 0x6d, 0x70, 0x3b, 0x64, 0x61, 0x3b, 0x22, 0x3c, 0x2f, 0x65, 0x67, 0x3e,
+ 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x41, 0x0d, 0x0a, 0x23, 0x78, 0x32, 0x30, 0x20, 0x42,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e,
+ 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x23, 0x78,
+ 0x32, 0x30, 0x20, 0x23, 0x78, 0x32, 0x30, 0x20, 0x41, 0x20, 0x23, 0x78,
+ 0x32, 0x30, 0x20, 0x23, 0x78, 0x32, 0x30, 0x20, 0x42, 0x20, 0x23, 0x78,
+ 0x32, 0x30, 0x20, 0x23, 0x78, 0x32, 0x30, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x74,
+ 0x72, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x65,
+ 0x67, 0x3e, 0x61, 0x3d, 0x0d, 0x0a, 0x22, 0x26, 0x61, 0x6d, 0x70, 0x3b,
+ 0x23, 0x78, 0x64, 0x3b, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x78, 0x64,
+ 0x3b, 0x41, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x78, 0x61, 0x3b, 0x26,
+ 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x78, 0x61, 0x3b, 0x42, 0x26, 0x61, 0x6d,
+ 0x70, 0x3b, 0x23, 0x78, 0x64, 0x3b, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23,
+ 0x78, 0x61, 0x3b, 0x22, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x23, 0x78, 0x44, 0x0d, 0x0a, 0x23, 0x78, 0x44, 0x20, 0x41, 0x20, 0x23,
+ 0x78, 0x41, 0x20, 0x23, 0x78, 0x41, 0x20, 0x42, 0x20, 0x23, 0x78, 0x44,
+ 0x20, 0x23, 0x78, 0x41, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x23, 0x78, 0x44, 0x20, 0x23, 0x78, 0x44, 0x20, 0x41, 0x20,
+ 0x23, 0x78, 0x41, 0x20, 0x23, 0x78, 0x41, 0x20, 0x42, 0x20, 0x23, 0x78,
+ 0x44, 0x20, 0x23, 0x78, 0x44, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x74, 0x72, 0x3e,
+ 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61,
+ 0x62, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x4e, 0x6f, 0x74,
+ 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c,
+ 0x61, 0x73, 0x74, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20,
+ 0x69, 0x73, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x28,
+ 0x62, 0x75, 0x74, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72,
+ 0x6d, 0x65, 0x64, 0x29, 0x20, 0x69, 0x66, 0x20, 0x3c, 0x61, 0x74, 0x74,
+ 0x3e, 0x61, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x3e, 0x0d, 0x0a, 0x69, 0x73,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f,
+ 0x20, 0x62, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+ 0x3c, 0x6b, 0x77, 0x3e, 0x4e, 0x4d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53,
+ 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x63, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x65, 0x63, 0x74, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x43, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x64,
+ 0x2d, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x3e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x43, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x73, 0x65, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x0d, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73,
+ 0x75, 0x62, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69,
+ 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x0d, 0x0a, 0x74, 0x68,
+ 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74,
+ 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x44, 0x54, 0x44, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64,
+ 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x77,
+ 0x6f, 0x72, 0x64, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x67, 0x6f,
+ 0x76, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61,
+ 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77,
+ 0x32, 0x3d, 0x22, 0x39, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22,
+ 0x31, 0x34, 0x2e, 0x35, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x6f, 0x6e,
+ 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x74,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x63, 0x6f, 0x6e,
+ 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x74,
+ 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x69,
+ 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x65, 0x63, 0x74, 0x22, 0x3e,
+ 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x65, 0x63, 0x74, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x69, 0x67, 0x6e, 0x6f,
+ 0x72, 0x65, 0x53, 0x65, 0x63, 0x74, 0x22, 0x3e, 0x69, 0x67, 0x6e, 0x6f,
+ 0x72, 0x65, 0x53, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x53, 0x65, 0x63, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68,
+ 0x73, 0x3e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x65, 0x63,
+ 0x74, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e,
+ 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x5b, 0x27, 0x20, 0x53, 0x3f, 0x20,
+ 0x27, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x27, 0x20, 0x53, 0x3f,
+ 0x20, 0x27, 0x5b, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x78, 0x74, 0x53, 0x75, 0x62, 0x73,
+ 0x65, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x65, 0x78, 0x74, 0x53,
+ 0x75, 0x62, 0x73, 0x65, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x0d, 0x0a, 0x27, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x27,
+ 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x63, 0x6f, 0x6d, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58,
+ 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30,
+ 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45,
+ 0x39, 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x30, 0x5d, 0x3c, 0x2f, 0x6c,
+ 0x6f, 0x63, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x64,
+ 0x73, 0x65, 0x63, 0x2d, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x2f,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x63, 0x74, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x69, 0x67, 0x6e, 0x6f,
+ 0x72, 0x65, 0x53, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e,
+ 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x5b,
+ 0x27, 0x20, 0x53, 0x3f, 0x20, 0x27, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45,
+ 0x27, 0x20, 0x53, 0x3f, 0x20, 0x27, 0x5b, 0x27, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x69, 0x67, 0x6e,
+ 0x6f, 0x72, 0x65, 0x53, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x73, 0x22, 0x3e, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x53,
+ 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x2a, 0x0d, 0x0a, 0x27, 0x5d, 0x5d, 0x26, 0x67,
+ 0x74, 0x3b, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x6d, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x39, 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x30, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x63, 0x6f,
+ 0x6e, 0x64, 0x73, 0x65, 0x63, 0x2d, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e,
+ 0x67, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64,
+ 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x63,
+ 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,
+ 0x53, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73,
+ 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x49,
+ 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x22, 0x3e, 0x49, 0x67, 0x6e, 0x6f, 0x72,
+ 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x27, 0x26, 0x6c, 0x74,
+ 0x3b, 0x21, 0x5b, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,
+ 0x53, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73,
+ 0x22, 0x3e, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x63, 0x74,
+ 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x27, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x27, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x49,
+ 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x22, 0x3e, 0x49, 0x67, 0x6e, 0x6f, 0x72,
+ 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x2a, 0x3c, 0x2f, 0x72, 0x68,
+ 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x3c,
+ 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68,
+ 0x61, 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x2a, 0x20, 0x2d, 0x20, 0x28, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e,
+ 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2a, 0x0d, 0x0a,
+ 0x28, 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x5b, 0x27, 0x20, 0x7c, 0x20,
+ 0x27, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x27, 0x29, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68,
+ 0x61, 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x2a, 0x29, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73,
+ 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f,
+ 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x64, 0x73,
+ 0x65, 0x63, 0x2d, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x39,
+ 0x30, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x50, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f,
+ 0x50, 0x45, 0x20, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x49, 0x66, 0x20, 0x61,
+ 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x22, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x5b, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x22, 0x2c, 0x0d, 0x0a, 0x22, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x5b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x22, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x22, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f,
+ 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x61, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x0d, 0x0a,
+ 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65,
+ 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x44, 0x54, 0x44,
+ 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x20,
+ 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20,
+ 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x79, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x0d, 0x0a, 0x6f, 0x6e, 0x65,
+ 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d,
+ 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x65,
+ 0x73, 0x74, 0x65, 0x64, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+ 0x67, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x77, 0x68,
+ 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x69, 0x73, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x49, 0x4e, 0x43, 0x4c,
+ 0x55, 0x44, 0x45, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x2c, 0x20, 0x74, 0x68,
+ 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20,
+ 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20,
+ 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x44, 0x54, 0x44, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x6f, 0x66, 0x0d, 0x0a,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x69, 0x73, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x49, 0x47, 0x4e, 0x4f, 0x52,
+ 0x45, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+ 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x73, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20,
+ 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x44, 0x54, 0x44, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x39, 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x30, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x69, 0x61,
+ 0x62, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x67,
+ 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x0d, 0x0a, 0x62, 0x65, 0x20,
+ 0x72, 0x65, 0x61, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65,
+ 0x72, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x20,
+ 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x73, 0x75,
+ 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x0d,
+ 0x0a, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x6f, 0x75, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x28, 0x69,
+ 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a,
+ 0x49, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6b, 0x65, 0x79, 0x77,
+ 0x6f, 0x72, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x49,
+ 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x20,
+ 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69,
+ 0x6e, 0x0d, 0x0a, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20,
+ 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20,
+ 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68,
+ 0x20, 0x61, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x6f,
+ 0x66, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45,
+ 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x61,
+ 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72,
+ 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
+ 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x2e, 0x3c, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x61, 0x64, 0x64, 0x22, 0x3e, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x30, 0x22, 0x3e, 0x5b,
+ 0x45, 0x39, 0x30, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68,
+ 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x0d, 0x0a,
+ 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,
+ 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+ 0x6c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
+ 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c,
+ 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20,
+ 0x61, 0x66, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x22,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x5b, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x22, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e,
+ 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72,
+ 0x64, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x63, 0x6f,
+ 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73,
+ 0x0d, 0x0a, 0x22, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74,
+ 0x3b, 0x21, 0x5b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x22, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x22, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x22, 0x2c, 0x20, 0x75, 0x6e, 0x74, 0x69,
+ 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69,
+ 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+ 0x61, 0x6c, 0x0d, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x65, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64,
+ 0x2e, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0d, 0x0a, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f,
+ 0x72, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f,
+ 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x70,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x2c, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61,
+ 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x70,
+ 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x69, 0x74, 0x73,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66,
+ 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x0d, 0x0a, 0x64, 0x65, 0x63, 0x69, 0x64,
+ 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74,
+ 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x6f, 0x72,
+ 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20,
+ 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65,
+ 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54,
+ 0x59, 0x20, 0x25, 0x20, 0x64, 0x72, 0x61, 0x66, 0x74, 0x20, 0x27, 0x49,
+ 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x27, 0x20, 0x3e, 0x0d, 0x0a, 0x26,
+ 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x25,
+ 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x27, 0x49, 0x47, 0x4e, 0x4f,
+ 0x52, 0x45, 0x27, 0x20, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x26, 0x6c, 0x74,
+ 0x3b, 0x21, 0x5b, 0x25, 0x64, 0x72, 0x61, 0x66, 0x74, 0x3b, 0x5b, 0x0d,
+ 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e,
+ 0x54, 0x20, 0x62, 0x6f, 0x6f, 0x6b, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x2a, 0x2c, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x73, 0x75, 0x70, 0x70,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3f, 0x29, 0x3e, 0x0d, 0x0a,
+ 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b,
+ 0x21, 0x5b, 0x25, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x3b, 0x5b, 0x0d, 0x0a,
+ 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54,
+ 0x20, 0x62, 0x6f, 0x6f, 0x6b, 0x20, 0x28, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x73, 0x75, 0x70, 0x70,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3f, 0x29, 0x3e, 0x0d, 0x0a,
+ 0x5d, 0x5d, 0x26, 0x67, 0x74, 0x3b, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x21,
+ 0x2d, 0x2d, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64,
+ 0x3d, 0x27, 0x73, 0x65, 0x63, 0x2d, 0x70, 0x61, 0x73, 0x73, 0x2d, 0x74,
+ 0x6f, 0x2d, 0x61, 0x70, 0x70, 0x27, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x6f, 0x72, 0x20, 0x54, 0x72, 0x65, 0x61, 0x74, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61,
+ 0x6c, 0x20, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x57,
+ 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67, 0x2c, 0x20, 0x69, 0x74, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x0d, 0x0a, 0x61,
+ 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76,
+ 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3a, 0x0d, 0x0a, 0x3c, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x74, 0x79, 0x70, 0x65, 0x27, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x69, 0x63, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x73, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x74, 0x6f,
+ 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x0d, 0x0a, 0x28, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x6f, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x6b,
+ 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x0d,
+ 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3b, 0x20, 0x6e, 0x6f, 0x6e, 0x2d,
+ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x0d, 0x0a, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x76, 0x61,
+ 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65,
+ 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x77, 0x68, 0x69, 0x63, 0x68, 0x0d, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+ 0x69, 0x65, 0x64, 0x2e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x75,
+ 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x2d, 0x2d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x31, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x26, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x3b, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69,
+ 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x70,
+ 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x73, 0x74, 0x72, 0x75,
+ 0x63, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x72,
+ 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d,
+ 0x22, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x3e, 0x41, 0x6e, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74,
+ 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x0d, 0x0a, 0x6f, 0x72, 0x20,
+ 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68,
+ 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x36, 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68, 0x65, 0x73, 0x65, 0x0d, 0x0a, 0x61,
+ 0x72, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x3e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x3b, 0x20, 0x74, 0x68, 0x65,
+ 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x61, 0x72, 0x65, 0x0d, 0x0a, 0x61, 0x6c, 0x6c, 0x20, 0x28, 0x65, 0x78,
+ 0x63, 0x65, 0x70, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x65, 0x6e, 0x74,
+ 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70,
+ 0x65, 0x22, 0x3e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x44, 0x54, 0x44, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x29, 0x20, 0x69, 0x64,
+ 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x0d,
+ 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x45, 0x61,
+ 0x63, 0x68, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x63, 0x61, 0x6c, 0x6c,
+ 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x64, 0x6f, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x0d,
+ 0x0a, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72,
+ 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x70, 0x72, 0x6f, 0x63, 0x22, 0x3e, 0x58, 0x4d,
+ 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x61,
+ 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x68, 0x6f, 0x6c, 0x65,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x65,
+ 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64,
+ 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64,
+ 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64,
+ 0x65, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x54,
+ 0x65, 0x78, 0x74, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x3e,
+ 0x41, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x70, 0x61, 0x72, 0x73,
+ 0x65, 0x64, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x27, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x20,
+ 0x69, 0x74, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x72, 0x65, 0x70,
+ 0x6c, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x72, 0x65, 0x70, 0x6c, 0x61,
+ 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x65, 0x78, 0x74,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x3b, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x74, 0x65,
+ 0x78, 0x74, 0x22, 0x3e, 0x74, 0x65, 0x78, 0x74, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f,
+ 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x0d,
+ 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x61,
+ 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x75, 0x6e, 0x70, 0x61, 0x72, 0x73,
+ 0x65, 0x64, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x55, 0x6e,
+ 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x22, 0x3e, 0x41, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x75, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x69, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x20, 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x72, 0x20,
+ 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x74, 0x65,
+ 0x78, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x66, 0x20, 0x74, 0x65,
+ 0x78, 0x74, 0x2c, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x32,
+ 0x35, 0x22, 0x3e, 0x5b, 0x45, 0x32, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x6d, 0x61, 0x79, 0x0d, 0x0a, 0x62, 0x65, 0x20, 0x6f, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x58, 0x4d, 0x4c, 0x2e, 0x20, 0x45,
+ 0x61, 0x63, 0x68, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x68, 0x61, 0x73, 0x20,
+ 0x61, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65,
+ 0x64, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6e, 0x6f, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64,
+ 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x20, 0x42, 0x65,
+ 0x79, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69,
+ 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x74,
+ 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65,
+ 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f,
+ 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c,
+ 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2c, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73,
+ 0x20, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69,
+ 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x75,
+ 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x69, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x76,
+ 0x6f, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+ 0x3b, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x0d, 0x0a, 0x62, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45, 0x4e, 0x54, 0x49,
+ 0x54, 0x59, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x3c,
+ 0x6b, 0x77, 0x3e, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x49, 0x45, 0x53, 0x3c,
+ 0x2f, 0x6b, 0x77, 0x3e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x67, 0x65, 0x6e, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x3e,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x75, 0x73, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x49, 0x6e, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x6c, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65,
+ 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x69,
+ 0x6d, 0x65, 0x73, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64,
+ 0x20, 0x74, 0x6f, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x75, 0x6e, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64,
+ 0x20, 0x74, 0x65, 0x72, 0x6d, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68,
+ 0x3e, 0x0d, 0x0a, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x6f,
+ 0x20, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x69, 0x74, 0x79, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x50, 0x45, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22,
+ 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x22, 0x3e, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x35, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x33, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x50,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75,
+ 0x73, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x44, 0x54, 0x44, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20,
+ 0x74, 0x77, 0x6f, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x75, 0x73,
+ 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20,
+ 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65,
+ 0x64, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73,
+ 0x2e, 0x20, 0x46, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x6f, 0x72,
+ 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x6f, 0x63, 0x63, 0x75,
+ 0x70, 0x79, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x3b,
+ 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
+ 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x61, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x64, 0x69, 0x73,
+ 0x74, 0x69, 0x6e, 0x63, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69,
+ 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x72, 0x65,
+ 0x66, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x43, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x20, 0x41, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+ 0x66, 0x69, 0x63, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x53, 0x4f,
+ 0x2f, 0x49, 0x45, 0x43, 0x20, 0x31, 0x30, 0x36, 0x34, 0x36, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x73, 0x65,
+ 0x74, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65,
+ 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20,
+ 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e,
+ 0x70, 0x75, 0x74, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c,
+ 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x43, 0x68, 0x61, 0x72, 0x52, 0x65, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x52, 0x65, 0x66, 0x3c,
+ 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26,
+ 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x27, 0x20, 0x5b, 0x30, 0x2d, 0x39, 0x5d,
+ 0x2b, 0x20, 0x27, 0x3b, 0x27, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x7c, 0x20, 0x27, 0x26, 0x68,
+ 0x63, 0x72, 0x6f, 0x3b, 0x27, 0x20, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d,
+ 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x2b, 0x20, 0x27, 0x3b, 0x27, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x77, 0x66, 0x63, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x77, 0x66, 0x2d, 0x4c, 0x65, 0x67, 0x61, 0x6c, 0x63, 0x68,
+ 0x61, 0x72, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x77, 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x77, 0x66, 0x2d, 0x4c, 0x65, 0x67, 0x61, 0x6c, 0x63,
+ 0x68, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4c,
+ 0x65, 0x67, 0x61, 0x6c, 0x20, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x6f, 0x20,
+ 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x77, 0x66, 0x63, 0x6e, 0x6f,
+ 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x62,
+ 0x65, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x3c,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x78, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x0d,
+ 0x0a, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x73, 0x20,
+ 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x61, 0x20, 0x68,
+ 0x65, 0x78, 0x61, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x0d, 0x0a,
+ 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x63, 0x6f,
+ 0x64, 0x65, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20,
+ 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x20, 0x31, 0x30, 0x36, 0x34,
+ 0x36, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x69, 0x74, 0x20, 0x62, 0x65, 0x67,
+ 0x69, 0x6e, 0x73, 0x0d, 0x0a, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74,
+ 0x73, 0x20, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20,
+ 0x61, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x72, 0x65,
+ 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x64, 0x65,
+ 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x45, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x22, 0x3e, 0x41, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20,
+ 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x64, 0x65, 0x66, 0x3e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65,
+ 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x47, 0x45, 0x52,
+ 0x65, 0x66, 0x22, 0x0d, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x47,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22,
+ 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20,
+ 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x20, 0x75, 0x73, 0x65, 0x0d, 0x0a, 0x61, 0x6d, 0x70, 0x65,
+ 0x72, 0x73, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6d, 0x69, 0x63,
+ 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x28, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x29, 0x20, 0x61, 0x73,
+ 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, 0x2e,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x0d, 0x0a, 0x69, 0x64, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x50, 0x45, 0x52, 0x65, 0x66, 0x22, 0x20, 0x74,
+ 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
+ 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x3e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
+ 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x0d, 0x0a, 0x75, 0x73, 0x65, 0x20, 0x70, 0x65, 0x72, 0x63,
+ 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x28, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x25, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6d, 0x69, 0x63, 0x6f,
+ 0x6c, 0x6f, 0x6e, 0x20, 0x28, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3b,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x29, 0x20, 0x61, 0x73, 0x20,
+ 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61,
+ 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68,
+ 0x73, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c,
+ 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x22, 0x3e, 0x45, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x52, 0x65, 0x66, 0x22, 0x3e, 0x43,
+ 0x68, 0x61, 0x72, 0x52, 0x65, 0x66, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c,
+ 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52,
+ 0x65, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x66, 0x3c, 0x2f, 0x6c, 0x68,
+ 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26, 0x61, 0x6d, 0x70,
+ 0x3b, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d,
+ 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x27, 0x3b, 0x27, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x77, 0x66, 0x63, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x77, 0x66, 0x2d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x3c, 0x76, 0x63, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x65, 0x6e, 0x74, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x3c, 0x77,
+ 0x66, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74,
+ 0x65, 0x6e, 0x74, 0x22, 0x2f, 0x3e, 0x3c, 0x77, 0x66, 0x63, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x6e, 0x6f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73,
+ 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x45, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68,
+ 0x73, 0x3e, 0x50, 0x45, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e,
+ 0x27, 0x25, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61,
+ 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x27, 0x3b, 0x27, 0x3c,
+ 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x76, 0x63, 0x2d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x66,
+ 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x6e, 0x6f, 0x72, 0x65, 0x63,
+ 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x3c, 0x77, 0x66,
+ 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x74, 0x64,
+ 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x77, 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x77, 0x66, 0x2d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x65, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x65, 0x64, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x49, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61,
+ 0x6e, 0x79, 0x20, 0x44, 0x54, 0x44, 0x2c, 0x20, 0x61, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x44, 0x54, 0x44, 0x20, 0x73, 0x75, 0x62,
+ 0x73, 0x65, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x0d, 0x0a, 0x6e, 0x6f, 0x20, 0x70,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x3c,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x3d, 0x27,
+ 0x79, 0x65, 0x73, 0x27, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x33, 0x34, 0x22, 0x3e, 0x5b, 0x45, 0x33,
+ 0x34, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x66, 0x6f, 0x72, 0x0d,
+ 0x0a, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f,
+ 0x63, 0x63, 0x75, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x61,
+ 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x0d, 0x0a,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d,
+ 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x22, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x74, 0x68, 0x61, 0x74,
+ 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23,
+ 0x73, 0x65, 0x63, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2d, 0x64,
+ 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d,
+ 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x6f,
+ 0x72, 0x20, 0x61, 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
+ 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65,
+ 0x70, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x65, 0x6c, 0x6c,
+ 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x64, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x0d, 0x0a,
+ 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66,
+ 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x20, 0x26, 0x6d, 0x61, 0x67, 0x69,
+ 0x63, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65,
+ 0x6c, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x32, 0x39, 0x22, 0x3e, 0x5b, 0x45, 0x32, 0x39,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a,
+ 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
+ 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x20, 0x61,
+ 0x6e, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x20, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x2e, 0x20, 0x53, 0x69, 0x6d, 0x69,
+ 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x2c, 0x20, 0x3c, 0x2f, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x3e, 0x54, 0x68, 0x65, 0x0d, 0x0a, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20,
+ 0x61, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x72,
+ 0x65, 0x63, 0x65, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x69,
+ 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x70, 0x70, 0x65,
+ 0x61, 0x72, 0x73, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x69, 0x66, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62,
+ 0x73, 0x65, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x61,
+ 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x2c, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2d, 0x69,
+ 0x66, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x6e, 0x6f, 0x74,
+ 0x0d, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x65, 0x64, 0x20,
+ 0x74, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x0d, 0x0a,
+ 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x65, 0x64, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x77, 0x65,
+ 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x6e, 0x65, 0x73,
+ 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74,
+ 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x0d, 0x0a, 0x69, 0x66, 0x20, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x23, 0x73, 0x65, 0x63, 0x2d, 0x72, 0x6d, 0x64, 0x22, 0x3e,
+ 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x3d, 0x27,
+ 0x79, 0x65, 0x73, 0x27, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72,
+ 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x77, 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x76,
+ 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x76, 0x63,
+ 0x2d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64,
+ 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x49, 0x6e, 0x20,
+ 0x61, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x0d, 0x0a, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x3d,
+ 0x27, 0x6e, 0x6f, 0x27, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x74, 0x68,
+ 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x22, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x74, 0x68,
+ 0x61, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x23, 0x73, 0x65, 0x63, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x2d, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x0d, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2c,
+ 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x0d, 0x0a, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x26, 0x6d,
+ 0x61, 0x67, 0x69, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x2c, 0x20, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73,
+ 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66,
+ 0x69, 0x6e, 0x65, 0x64, 0x2d, 0x65, 0x6e, 0x74, 0x22, 0x2f, 0x3e, 0x2e,
+ 0x0d, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x72, 0x65,
+ 0x63, 0x65, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x74,
+ 0x2e, 0x20, 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x2c,
+ 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x72, 0x65, 0x63, 0x65,
+ 0x64, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x39, 0x32, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x32, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x0d, 0x0a, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x64,
+ 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x46, 0x49, 0x4e, 0x41,
+ 0x4c, 0x20, 0x45, 0x44, 0x49, 0x54, 0x3a, 0x20, 0x69, 0x73, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x63, 0x6c, 0x75, 0x6d,
+ 0x73, 0x79, 0x3f, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x66,
+ 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x65,
+ 0x78, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x45, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x41, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x0d, 0x0a, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f,
+ 0x66, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x75, 0x6e,
+ 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x22, 0x3e, 0x75, 0x6e, 0x70, 0x61,
+ 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x0d, 0x0a,
+ 0x55, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f,
+ 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x61, 0x74, 0x74, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x3e, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x0d, 0x0a, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20,
+ 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59,
+ 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x3c, 0x6b, 0x77,
+ 0x3e, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x49, 0x45, 0x53, 0x3c, 0x2f, 0x6b,
+ 0x77, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x77,
+ 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x66,
+ 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6e, 0x6f,
+ 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x3c,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4e, 0x6f, 0x20, 0x52, 0x65, 0x63, 0x75,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x3c, 0x70, 0x3e, 0x41, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x0d,
+ 0x0a, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+ 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74,
+ 0x6f, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x65, 0x69,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c,
+ 0x79, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x6c, 0x79, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x77, 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x77,
+ 0x66, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69,
+ 0x6e, 0x64, 0x74, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x49, 0x6e, 0x20, 0x44, 0x54, 0x44, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x3c, 0x70, 0x3e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
+ 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x0d,
+ 0x0a, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x44, 0x54,
+ 0x44, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x77, 0x66, 0x63, 0x6e,
+ 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x61,
+ 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x65, 0x67, 0x3e, 0x54, 0x79, 0x70, 0x65, 0x20, 0x26, 0x6c, 0x74, 0x3b,
+ 0x6b, 0x65, 0x79, 0x3e, 0x6c, 0x65, 0x73, 0x73, 0x2d, 0x74, 0x68, 0x61,
+ 0x6e, 0x26, 0x6c, 0x74, 0x3b, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x20, 0x28,
+ 0x26, 0x68, 0x63, 0x72, 0x6f, 0x3b, 0x33, 0x43, 0x3b, 0x29, 0x20, 0x74,
+ 0x6f, 0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x2e, 0x0d, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x70,
+ 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x26,
+ 0x61, 0x6d, 0x70, 0x3b, 0x64, 0x6f, 0x63, 0x64, 0x61, 0x74, 0x65, 0x3b,
+ 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x26, 0x61, 0x6d, 0x70,
+ 0x3b, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x6c, 0x65,
+ 0x76, 0x65, 0x6c, 0x3b, 0x2e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x6f,
+ 0x66, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
+ 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54,
+ 0x41, 0x5b, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d,
+ 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x22, 0x49, 0x53, 0x4f, 0x4c, 0x61, 0x74, 0x32, 0x22, 0x2e, 0x2e, 0x2e,
+ 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49,
+ 0x54, 0x59, 0x20, 0x25, 0x20, 0x49, 0x53, 0x4f, 0x4c, 0x61, 0x74, 0x32,
+ 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53,
+ 0x59, 0x53, 0x54, 0x45, 0x4d, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x78, 0x6d, 0x6c, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x69, 0x73, 0x6f, 0x2f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74,
+ 0x32, 0x2d, 0x78, 0x6d, 0x6c, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x22, 0x20, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x20,
+ 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x74, 0x2e, 0x20, 0x2d, 0x2d,
+ 0x3e, 0x0d, 0x0a, 0x25, 0x49, 0x53, 0x4f, 0x4c, 0x61, 0x74, 0x32, 0x3b,
+ 0x5d, 0x5d, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x2d, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63, 0x6c,
+ 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65,
+ 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x68, 0x75, 0x73, 0x3a, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67,
+ 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x44,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64,
+ 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77, 0x32, 0x3d, 0x22,
+ 0x35, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x38, 0x2e,
+ 0x35, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73,
+ 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x44, 0x65, 0x63, 0x6c, 0x3c,
+ 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x47, 0x45,
+ 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x47, 0x45, 0x44, 0x65, 0x63, 0x6c,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x47, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x2d, 0x2d, 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x45, 0x44, 0x65, 0x63,
+ 0x6c, 0x22, 0x3e, 0x50, 0x45, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x21,
+ 0x2d, 0x2d, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x50, 0x61, 0x72, 0x61, 0x6d,
+ 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65,
+ 0x73, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72,
+ 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x47, 0x45,
+ 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73,
+ 0x3e, 0x47, 0x45, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73,
+ 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x21,
+ 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e,
+ 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53,
+ 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x44, 0x65, 0x66, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53,
+ 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x0d, 0x0a, 0x27,
+ 0x3e, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x45, 0x44, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x50,
+ 0x45, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e,
+ 0x54, 0x49, 0x54, 0x59, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x27, 0x25, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22,
+ 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53,
+ 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x45, 0x44,
+ 0x65, 0x66, 0x22, 0x3e, 0x50, 0x45, 0x44, 0x65, 0x66, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x3f, 0x20, 0x27, 0x3e, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x50,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x2d,
+ 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x44, 0x65, 0x66, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56,
+ 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x21,
+ 0x2d, 0x2d, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x72,
+ 0x68, 0x73, 0x3e, 0x2d, 0x2d, 0x3e, 0x7c, 0x20, 0x28, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x22, 0x3e, 0x45, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x4e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e,
+ 0x4e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3f, 0x29, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x27, 0x4e, 0x54, 0x2d, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x44, 0x65, 0x66, 0x27, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x44, 0x65, 0x66, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x20,
+ 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x20, 0x45, 0x44, 0x49, 0x54, 0x3a, 0x20,
+ 0x77, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65,
+ 0x64, 0x20, 0x74, 0x6f, 0x20, 0x57, 0x46, 0x73, 0x20, 0x68, 0x65, 0x72,
+ 0x65, 0x3f, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x45, 0x44,
+ 0x65, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x50,
+ 0x45, 0x44, 0x65, 0x66, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72,
+ 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c,
+ 0x75, 0x65, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x7c, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45,
+ 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x22, 0x3e, 0x45,
+ 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72,
+ 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
+ 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x66, 0x22, 0x3e, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x6f, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x75,
+ 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x61, 0x6e, 0x20,
+ 0x3c, 0x6b, 0x77, 0x3e, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x3c, 0x2f,
+ 0x6b, 0x77, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45,
+ 0x4e, 0x54, 0x49, 0x54, 0x49, 0x45, 0x53, 0x3c, 0x2f, 0x6b, 0x77, 0x3e,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2e, 0x20,
+ 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x0d, 0x0a, 0x6d, 0x6f, 0x72, 0x65,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x2c, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x69, 0x73,
+ 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3b, 0x20, 0x61, 0x74,
+ 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x79, 0x20,
+ 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, 0x61, 0x20, 0x77, 0x61, 0x72, 0x6e,
+ 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c,
+ 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x73, 0x65, 0x63, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x2d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x45,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x70, 0x6c,
+ 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x78, 0x74,
+ 0x22, 0x3e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x45,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66,
+ 0x69, 0x6e, 0x65, 0x64, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x61,
+ 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x69, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x72,
+ 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x73, 0x65, 0x70, 0x61,
+ 0x72, 0x61, 0x74, 0x65, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61,
+ 0x6c, 0x0d, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68,
+ 0x61, 0x74, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6c, 0x69, 0x74, 0x65, 0x6e,
+ 0x74, 0x76, 0x61, 0x6c, 0x22, 0x3e, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75,
+ 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x64,
+ 0x75, 0x63, 0x65, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x72,
+ 0x72, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x72, 0x65,
+ 0x70, 0x6c, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x72, 0x65, 0x70, 0x6c,
+ 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x3a, 0x20,
+ 0x73, 0x65, 0x65, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66,
+ 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x72,
+ 0x6e, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20,
+ 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x73, 0x65,
+ 0x64, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x6f,
+ 0x66, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21,
+ 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x50, 0x75, 0x62, 0x2d, 0x53,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x22, 0x54, 0x68, 0x69, 0x73, 0x20,
+ 0x69, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x72, 0x65, 0x6c,
+ 0x65, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0d,
+ 0x0a, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d,
+ 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x65, 0x6e, 0x74,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x45, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x78, 0x74, 0x65, 0x6e,
+ 0x74, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x45, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x22, 0x3e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2c, 0x0d, 0x0a, 0x69, 0x74,
+ 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x2c,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x61, 0x73,
+ 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x3a, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67,
+ 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x44, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x27, 0x4e, 0x54, 0x2d, 0x45,
+ 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x27, 0x3e,
+ 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x44, 0x65, 0x66, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68,
+ 0x73, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44,
+ 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27,
+ 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
+ 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x53, 0x79, 0x73,
+ 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x72, 0x68, 0x73, 0x3e, 0x7c, 0x20, 0x27, 0x50, 0x55, 0x42, 0x4c, 0x49,
+ 0x43, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x50, 0x75, 0x62, 0x69, 0x64, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x22, 0x3e, 0x50, 0x75, 0x62, 0x69, 0x64, 0x4c, 0x69, 0x74, 0x65,
+ 0x72, 0x61, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74,
+ 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6d, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x53,
+ 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x4e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x4e, 0x44, 0x61, 0x74, 0x61, 0x44,
+ 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68,
+ 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x27, 0x4e, 0x44, 0x41, 0x54, 0x41, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22,
+ 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x6e, 0x6f, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65,
+ 0x64, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e,
+ 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x4e, 0x44,
+ 0x61, 0x74, 0x61, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x75, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x22, 0x3e, 0x75,
+ 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x3b, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20,
+ 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x73,
+ 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x6e, 0x6f, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x65, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x65, 0x64, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22,
+ 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x3e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x73, 0x79, 0x73, 0x69, 0x64, 0x22, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x3d, 0x22, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x49,
+ 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x3e, 0x54,
+ 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69,
+ 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x53, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x27, 0x73,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x73, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x0d, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65,
+ 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x2e, 0x20, 0x49, 0x74,
+ 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x38, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x38, 0x38, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x55, 0x52, 0x49, 0x0d, 0x0a, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64,
+ 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c,
+ 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x36,
+ 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x36, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x0d, 0x0a, 0x28, 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e,
+ 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65,
+ 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x66, 0x63, 0x32, 0x33,
+ 0x39, 0x36, 0x22, 0x2f, 0x3e, 0x2c, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65,
+ 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x66, 0x63, 0x32, 0x37,
+ 0x33, 0x32, 0x22, 0x2f, 0x3e, 0x29, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x37, 0x36, 0x22, 0x3e, 0x5b, 0x45,
+ 0x37, 0x36, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x6d, 0x65, 0x61,
+ 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x74,
+ 0x6f, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x70,
+ 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72,
+ 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63,
+ 0x74, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x27, 0x73, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x49, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x61, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72,
+ 0x0d, 0x0a, 0x28, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x23, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x29, 0x20, 0x74, 0x6f,
+ 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20,
+ 0x61, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x64, 0x65,
+ 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x55, 0x6e, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20,
+ 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
+ 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x61,
+ 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79,
+ 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61,
+ 0x72, 0x20, 0x44, 0x54, 0x44, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x0d, 0x0a,
+ 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61,
+ 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20,
+ 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x29, 0x2c, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65,
+ 0x20, 0x55, 0x52, 0x49, 0x73, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x72,
+ 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73, 0x2e,
+ 0x20, 0x41, 0x20, 0x55, 0x52, 0x49, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x74, 0x68, 0x75, 0x73, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6c,
+ 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x65, 0x6e, 0x74,
+ 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x22,
+ 0x3e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x44,
+ 0x54, 0x44, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x6f, 0x72, 0x20,
+ 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65,
+ 0x72, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x78, 0x74, 0x65, 0x6e,
+ 0x74, 0x22, 0x3e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58,
+ 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30,
+ 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45,
+ 0x37, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x37, 0x38, 0x5d, 0x3c, 0x2f, 0x6c,
+ 0x6f, 0x63, 0x3e, 0x55, 0x52, 0x49, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69,
+ 0x72, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67,
+ 0x20, 0x6f, 0x66, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20,
+ 0x54, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
+ 0x65, 0x64, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61,
+ 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x41, 0x53, 0x43, 0x49, 0x49,
+ 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2c,
+ 0x20, 0x70, 0x6c, 0x75, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65,
+ 0x64, 0x20, 0x69, 0x6e, 0x20, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x32, 0x2e, 0x34, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x62, 0x69, 0x62,
+ 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x66, 0x63,
+ 0x32, 0x33, 0x39, 0x36, 0x22, 0x2f, 0x3e, 0x2c, 0x20, 0x65, 0x78, 0x63,
+ 0x65, 0x70, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x0d,
+ 0x0a, 0x28, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x23, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x65,
+ 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x28,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x25, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x29, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+ 0x71, 0x75, 0x61, 0x72, 0x65, 0x0d, 0x0a, 0x62, 0x72, 0x61, 0x63, 0x6b,
+ 0x65, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x20, 0x72, 0x65, 0x2d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64,
+ 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x66, 0x63, 0x32, 0x37, 0x33, 0x32,
+ 0x22, 0x2f, 0x3e, 0x2e, 0x20, 0x44, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x66,
+ 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x45, 0x61, 0x63, 0x68, 0x20, 0x64,
+ 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x63,
+ 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x55, 0x54, 0x46, 0x2d, 0x38, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65,
+ 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x66, 0x63, 0x32, 0x32,
+ 0x37, 0x39, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x61, 0x73, 0x20, 0x6f, 0x6e,
+ 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x62, 0x79,
+ 0x74, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c,
+ 0x70, 0x3e, 0x41, 0x6e, 0x79, 0x20, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73,
+ 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69,
+ 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x64, 0x69, 0x73, 0x61,
+ 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, 0x73, 0x63,
+ 0x61, 0x70, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0d, 0x0a, 0x74,
+ 0x68, 0x65, 0x20, 0x55, 0x52, 0x49, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70,
+ 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73,
+ 0x6d, 0x20, 0x28, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x2c, 0x20,
+ 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f,
+ 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x25, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x3c, 0x76, 0x61, 0x72, 0x3e, 0x48, 0x48, 0x3c, 0x2f,
+ 0x76, 0x61, 0x72, 0x3e, 0x2c, 0x0d, 0x0a, 0x77, 0x68, 0x65, 0x72, 0x65,
+ 0x20, 0x48, 0x48, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68,
+ 0x65, 0x78, 0x61, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x6e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x29, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70,
+ 0x3e, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61,
+ 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x69, 0x73, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20,
+ 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c,
+ 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x75, 0x62, 0x69,
+ 0x64, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x50, 0x75, 0x62,
+ 0x6c, 0x69, 0x63, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
+ 0x65, 0x72, 0x22, 0x3e, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x0d, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69,
+ 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69,
+ 0x66, 0x69, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x69, 0x64, 0x65, 0x6e,
+ 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e,
+ 0x0d, 0x0a, 0x41, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d,
+ 0x70, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74,
+ 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x0d, 0x0a, 0x69,
+ 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x6f,
+ 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68,
+ 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x38, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x38, 0x38,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x55, 0x52, 0x49, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x2e, 0x0d, 0x0a, 0x49, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72,
+ 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74,
+ 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, 0x20, 0x69, 0x74, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x38, 0x38, 0x22,
+ 0x3e, 0x5b, 0x45, 0x38, 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x55, 0x52, 0x49, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20,
+ 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20,
+ 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x2e, 0x20, 0x42, 0x65, 0x66,
+ 0x6f, 0x72, 0x65, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20,
+ 0x69, 0x73, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64,
+ 0x2c, 0x0d, 0x0a, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+ 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20,
+ 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x69, 0x64, 0x65, 0x6e,
+ 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65,
+ 0x64, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65,
+ 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x28, 0x23, 0x78, 0x32, 0x30, 0x29,
+ 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e,
+ 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69,
+ 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x20, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x0d, 0x0a, 0x62, 0x65, 0x20,
+ 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b,
+ 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x6f, 0x70, 0x65, 0x6e,
+ 0x2d, 0x68, 0x61, 0x74, 0x63, 0x68, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x20,
+ 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x63,
+ 0x6f, 0x6d, 0x2f, 0x62, 0x6f, 0x69, 0x6c, 0x65, 0x72, 0x70, 0x6c, 0x61,
+ 0x74, 0x65, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x48, 0x61, 0x74, 0x63, 0x68,
+ 0x2e, 0x78, 0x6d, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b,
+ 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x6f, 0x70, 0x65, 0x6e,
+ 0x2d, 0x68, 0x61, 0x74, 0x63, 0x68, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20,
+ 0x22, 0x2d, 0x2f, 0x2f, 0x54, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x69,
+ 0x74, 0x79, 0x2f, 0x2f, 0x54, 0x45, 0x58, 0x54, 0x20, 0x53, 0x74, 0x61,
+ 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2d, 0x68,
+ 0x61, 0x74, 0x63, 0x68, 0x20, 0x62, 0x6f, 0x69, 0x6c, 0x65, 0x72, 0x70,
+ 0x6c, 0x61, 0x74, 0x65, 0x2f, 0x2f, 0x45, 0x4e, 0x22, 0x0d, 0x0a, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x65, 0x78, 0x74,
+ 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62,
+ 0x6f, 0x69, 0x6c, 0x65, 0x72, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2f, 0x4f,
+ 0x70, 0x65, 0x6e, 0x48, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x78, 0x6d, 0x6c,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e, 0x54,
+ 0x49, 0x54, 0x59, 0x20, 0x68, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x69,
+ 0x63, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x20, 0x22, 0x2e, 0x2e, 0x2f, 0x67,
+ 0x72, 0x61, 0x66, 0x69, 0x78, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x48, 0x61,
+ 0x74, 0x63, 0x68, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x0d, 0x0a, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x44, 0x41, 0x54, 0x41,
+ 0x20, 0x67, 0x69, 0x66, 0x20, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x45, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x73, 0x65, 0x63, 0x2d, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63,
+ 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x54,
+ 0x68, 0x65, 0x20, 0x54, 0x65, 0x78, 0x74, 0x20, 0x44, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68,
+ 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x31, 0x30, 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x30,
+ 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x73, 0x68, 0x6f, 0x75,
+ 0x6c, 0x64, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a,
+ 0x3e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x3e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72,
+ 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e,
+ 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x54,
+ 0x65, 0x78, 0x74, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70,
+ 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x32, 0x2e, 0x35, 0x22, 0x20, 0x70,
+ 0x63, 0x77, 0x35, 0x3d, 0x22, 0x31, 0x33, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63,
+ 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e,
+ 0x26, 0x70, 0x69, 0x6f, 0x3b, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3e, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f,
+ 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x26, 0x70, 0x69,
+ 0x63, 0x3b, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72,
+ 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20,
+ 0x74, 0x65, 0x78, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x6c, 0x69,
+ 0x74, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x2c, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x73,
+ 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x4e,
+ 0x6f, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61,
+ 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x79,
+ 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x0d, 0x0a, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20,
+ 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x0d,
+ 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x39, 0x34, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x34, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x74, 0x65, 0x78,
+ 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65,
+ 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74,
+ 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x74,
+ 0x65, 0x78, 0x74, 0x22, 0x3e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69,
+ 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x77, 0x66, 0x2d, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x57, 0x65, 0x6c, 0x6c, 0x2d, 0x46, 0x6f, 0x72,
+ 0x6d, 0x65, 0x64, 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x45,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66,
+ 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x64, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x20, 0x41, 0x6e, 0x20,
+ 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x77, 0x65,
+ 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x0d, 0x0a, 0x69,
+ 0x66, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x65, 0x78, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x45, 0x6e, 0x74,
+ 0x22, 0x3e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x45,
+ 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x20, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x39, 0x22, 0x3e, 0x5b, 0x45,
+ 0x31, 0x30, 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x41, 0x6c,
+ 0x6c, 0x0d, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x77,
+ 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x62,
+ 0x79, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c,
+ 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x57, 0x65, 0x6c, 0x6c, 0x2d,
+ 0x46, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x45,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x65, 0x78, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64,
+ 0x45, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e,
+ 0x65, 0x78, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x45, 0x6e, 0x74,
+ 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x54,
+ 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x54, 0x65, 0x78,
+ 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x65, 0x78, 0x74, 0x50, 0x45, 0x22, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x65, 0x78, 0x74, 0x50, 0x45, 0x3c, 0x2f, 0x6c,
+ 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x54, 0x65, 0x78, 0x74,
+ 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65,
+ 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3f, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x65, 0x78, 0x74,
+ 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e,
+ 0x65, 0x78, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x44, 0x65, 0x63,
+ 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x39, 0x22, 0x3e,
+ 0x5b, 0x45, 0x31, 0x30, 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d,
+ 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74,
+ 0x73, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x0d, 0x0a, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64,
+ 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x65, 0x64, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
+ 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d,
+ 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x41, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65,
+ 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d,
+ 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x69,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c,
+ 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70,
+ 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x0d, 0x0a, 0x73, 0x74, 0x72,
+ 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61,
+ 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x6c, 0x79, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x3b, 0x20,
+ 0x6e, 0x6f, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x67,
+ 0x22, 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74, 0x61, 0x67, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x74, 0x61, 0x67, 0x22, 0x3e, 0x65,
+ 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65,
+ 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d,
+ 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x61, 0x67, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x22, 0x3e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x63,
+ 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x70, 0x69, 0x22, 0x3e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69,
+ 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x72,
+ 0x65, 0x66, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20,
+ 0x6f, 0x72, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x72,
+ 0x65, 0x66, 0x22, 0x3e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x63, 0x61, 0x6e, 0x20,
+ 0x62, 0x65, 0x67, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x6e, 0x65,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x65, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x63, 0x68, 0x61, 0x72, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20,
+ 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x61, 0x63, 0x68,
+ 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61,
+ 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x75,
+ 0x73, 0x65, 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x0d,
+ 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x41, 0x6c, 0x6c,
+ 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x6f, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6e,
+ 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x35, 0x36, 0x22,
+ 0x3e, 0x5b, 0x45, 0x35, 0x36, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x62, 0x6f, 0x74, 0x68, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x55, 0x54,
+ 0x46, 0x2d, 0x38, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x55, 0x54, 0x46, 0x2d,
+ 0x31, 0x36, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x3c,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x37, 0x37, 0x22, 0x3e, 0x5b,
+ 0x45, 0x37, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68,
+ 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x3c, 0x2f, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36, 0x3c,
+ 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69,
+ 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x79, 0x0d, 0x0a,
+ 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x55,
+ 0x54, 0x46, 0x2d, 0x38, 0x20, 0x6f, 0x72, 0x20, 0x55, 0x54, 0x46, 0x2d,
+ 0x31, 0x36, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x6e, 0x74,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65,
+ 0x64, 0x20, 0x69, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x79, 0x74, 0x65,
+ 0x20, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x20,
+ 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x0d, 0x0a, 0x62,
+ 0x79, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x37, 0x22,
+ 0x3e, 0x5b, 0x45, 0x36, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x41, 0x6e, 0x6e, 0x65, 0x78, 0x0d, 0x0a, 0x46, 0x20, 0x6f, 0x66, 0x20,
+ 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x49, 0x53, 0x4f, 0x31, 0x30, 0x36, 0x34, 0x36, 0x22, 0x2f, 0x3e,
+ 0x2c, 0x20, 0x41, 0x6e, 0x6e, 0x65, 0x78, 0x20, 0x48, 0x20, 0x6f, 0x66,
+ 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x31, 0x30, 0x36, 0x34, 0x36, 0x2d, 0x32,
+ 0x30, 0x30, 0x30, 0x22, 0x2f, 0x3e, 0x2c, 0x20, 0x73, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x32, 0x2e, 0x34, 0x20, 0x6f, 0x66, 0x20,
+ 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x2f, 0x3e, 0x2c,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x32, 0x2e, 0x37, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x62, 0x69, 0x62,
+ 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x55, 0x6e, 0x69,
+ 0x63, 0x6f, 0x64, 0x65, 0x33, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x28, 0x74, 0x68, 0x65, 0x20,
+ 0x5a, 0x45, 0x52, 0x4f, 0x20, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x4e,
+ 0x4f, 0x2d, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x20, 0x53, 0x50, 0x41, 0x43,
+ 0x45, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2c,
+ 0x20, 0x23, 0x78, 0x46, 0x45, 0x46, 0x46, 0x29, 0x2e, 0x20, 0x54, 0x68,
+ 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74,
+ 0x75, 0x72, 0x65, 0x2c, 0x0d, 0x0a, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61,
+ 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20,
+ 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63,
+ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x58, 0x4d, 0x4c, 0x0d, 0x0a,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20,
+ 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x74, 0x6f,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x69, 0x61,
+ 0x74, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x55,
+ 0x54, 0x46, 0x2d, 0x38, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x55, 0x54,
+ 0x46, 0x2d, 0x31, 0x36, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6c, 0x74, 0x68,
+ 0x6f, 0x75, 0x67, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x73,
+ 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f,
+ 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x0d, 0x0a, 0x61, 0x6e,
+ 0x64, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
+ 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e,
+ 0x64, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64,
+ 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x61, 0x79,
+ 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65,
+ 0x61, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x0d, 0x0a, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68,
+ 0x65, 0x6d, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x34,
+ 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x34, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x49, 0x6e, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x61, 0x62,
+ 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x28, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x4d, 0x49,
+ 0x4d, 0x45, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x29, 0x2c,
+ 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x70,
+ 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61,
+ 0x6e, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x55, 0x54,
+ 0x46, 0x2d, 0x38, 0x20, 0x6f, 0x72, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x31,
+ 0x36, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69,
+ 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x74, 0x65, 0x78,
+ 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x28, 0x73, 0x65,
+ 0x65, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x54, 0x65, 0x78, 0x74,
+ 0x44, 0x65, 0x63, 0x6c, 0x22, 0x2f, 0x3e, 0x29, 0x20, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d,
+ 0x22, 0x65, 0x62, 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f,
+ 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69,
+ 0x6e, 0x67, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e,
+ 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x20, 0x27, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x45, 0x71, 0x22, 0x3e, 0x45, 0x71, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x28, 0x27, 0x22, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x63, 0x4e,
+ 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x45, 0x6e, 0x63, 0x4e, 0x61, 0x6d, 0x65,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x27, 0x22, 0x27, 0x20, 0x7c, 0x20,
+ 0x22, 0x27, 0x22, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x22,
+ 0x3e, 0x45, 0x6e, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x22, 0x27, 0x22, 0x20, 0x29, 0x20, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45, 0x6e, 0x63, 0x4e, 0x61,
+ 0x6d, 0x65, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x5d, 0x20, 0x28, 0x5b,
+ 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2e, 0x5f, 0x5d,
+ 0x20, 0x7c, 0x20, 0x27, 0x2d, 0x27, 0x29, 0x2a, 0x3c, 0x2f, 0x72, 0x68,
+ 0x73, 0x3e, 0x3c, 0x63, 0x6f, 0x6d, 0x3e, 0x45, 0x6e, 0x63, 0x6f, 0x64,
+ 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20,
+ 0x4c, 0x61, 0x74, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x3c, 0x2f, 0x63, 0x6f, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x73,
+ 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f,
+ 0x63, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69,
+ 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x64, 0x65,
+ 0x63, 0x6c, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x0d, 0x0a, 0x54, 0x68, 0x65, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x45, 0x6e, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x45, 0x6e, 0x63,
+ 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x69, 0x73,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
+ 0x67, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x20,
+ 0x45, 0x44, 0x49, 0x54, 0x3a, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x49, 0x41, 0x4e, 0x41,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x49, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x55, 0x54, 0x46, 0x2d, 0x38,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x49, 0x53, 0x4f, 0x2d, 0x31, 0x30,
+ 0x36, 0x34, 0x36, 0x2d, 0x55, 0x43, 0x53, 0x2d, 0x32, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x64, 0x65, 0x0d, 0x0a, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x49, 0x53, 0x4f,
+ 0x2d, 0x31, 0x30, 0x36, 0x34, 0x36, 0x2d, 0x55, 0x43, 0x53, 0x2d, 0x34,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62,
+ 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20,
+ 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x55, 0x6e, 0x69,
+ 0x63, 0x6f, 0x64, 0x65, 0x20, 0x2f, 0x20, 0x49, 0x53, 0x4f, 0x2f, 0x49,
+ 0x45, 0x43, 0x20, 0x31, 0x30, 0x36, 0x34, 0x36, 0x2c, 0x0d, 0x0a, 0x74,
+ 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3c, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x49,
+ 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, 0x31, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x2c, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d,
+ 0x32, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x2e, 0x2e, 0x2e, 0x20, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31,
+ 0x30, 0x36, 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x30, 0x36, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d,
+ 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e,
+ 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x76, 0x61, 0x72, 0x3e, 0x6e, 0x3c,
+ 0x2f, 0x76, 0x61, 0x72, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x20, 0x28, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x3c, 0x76, 0x61,
+ 0x72, 0x3e, 0x6e, 0x3c, 0x2f, 0x76, 0x61, 0x72, 0x3e, 0x0d, 0x0a, 0x69,
+ 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6e,
+ 0x75, 0x6d, 0x62, 0x65, 0x72, 0x29, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62,
+ 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x49, 0x53, 0x4f, 0x20, 0x38, 0x38, 0x35, 0x39, 0x2c, 0x20, 0x61, 0x6e,
+ 0x64, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x73, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x49, 0x53, 0x4f, 0x2d, 0x32, 0x30, 0x32, 0x32, 0x2d,
+ 0x4a, 0x50, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x53, 0x68, 0x69, 0x66,
+ 0x74, 0x5f, 0x4a, 0x49, 0x53, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x61,
+ 0x6e, 0x64, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x45, 0x55, 0x43, 0x2d, 0x4a, 0x50, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20,
+ 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x65, 0x64, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x4a, 0x49, 0x53, 0x20, 0x58, 0x2d, 0x30, 0x32, 0x30,
+ 0x38, 0x2d, 0x31, 0x39, 0x39, 0x37, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68,
+ 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x35, 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x37, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x49, 0x74, 0x0d, 0x0a, 0x69, 0x73,
+ 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64,
+ 0x20, 0x28, 0x61, 0x73, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x63,
+ 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68,
+ 0x3e, 0x73, 0x29, 0x0d, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x41,
+ 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x4e, 0x75, 0x6d, 0x62,
+ 0x65, 0x72, 0x73, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,
+ 0x79, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x35, 0x38,
+ 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x49, 0x41, 0x4e, 0x41, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x6f, 0x73,
+ 0x65, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65,
+ 0x64, 0x2c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72,
+ 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20,
+ 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,
+ 0x65, 0x72, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x3b, 0x0d,
+ 0x0a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64,
+ 0x69, 0x6e, 0x67, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+ 0x75, 0x73, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x61, 0x6e, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x78, 0x2d,
+ 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20, 0x70, 0x72, 0x65,
+ 0x66, 0x69, 0x78, 0x2e, 0x0d, 0x0a, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x73, 0x68, 0x6f,
+ 0x75, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x61, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2d, 0x69, 0x6e, 0x73,
+ 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x0d, 0x0a, 0x77, 0x61,
+ 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64,
+ 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65,
+ 0x72, 0x70, 0x72, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x49, 0x41, 0x4e,
+ 0x41, 0x2d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65,
+ 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x0d, 0x0a, 0x61, 0x74,
+ 0x20, 0x49, 0x41, 0x4e, 0x41, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
+ 0x61, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x74,
+ 0x72, 0x65, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x61, 0x73, 0x20, 0x75,
+ 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x28, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x2c, 0x20,
+ 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x2c, 0x20, 0x6e,
+ 0x6f, 0x74, 0x0d, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+ 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20,
+ 0x61, 0x6c, 0x6c, 0x20, 0x49, 0x41, 0x4e, 0x41, 0x2d, 0x72, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x62, 0x73, 0x65,
+ 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69,
+ 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73,
+ 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+ 0x6c, 0x0d, 0x0a, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x48, 0x54, 0x54,
+ 0x50, 0x20, 0x6f, 0x72, 0x20, 0x4d, 0x49, 0x4d, 0x45, 0x29, 0x2c, 0x20,
+ 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3e, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x66, 0x6f, 0x72, 0x0d, 0x0a, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e,
+ 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
+ 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x65, 0x73,
+ 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x6f, 0x72, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c,
+ 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x35, 0x22, 0x3e,
+ 0x5b, 0x45, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x66, 0x6f,
+ 0x72, 0x0d, 0x0a, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69,
+ 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x20,
+ 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61,
+ 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e,
+ 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x2c, 0x20, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x3e, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20,
+ 0x62, 0x65, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x6e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x42, 0x79,
+ 0x74, 0x65, 0x20, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x72,
+ 0x6b, 0x0d, 0x0a, 0x6e, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73,
+ 0x65, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
+ 0x67, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x65,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x0d, 0x0a, 0x73, 0x69, 0x6e, 0x63, 0x65,
+ 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20,
+ 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x55, 0x54,
+ 0x46, 0x2d, 0x38, 0x2c, 0x20, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x72,
+ 0x79, 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x69, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+ 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x6c, 0x79, 0x0d, 0x0a, 0x6e, 0x65,
+ 0x65, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69,
+ 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x35,
+ 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x49, 0x74, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x33, 0x36, 0x22, 0x3e, 0x5b, 0x45, 0x33, 0x36, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x61, 0x0d, 0x0a, 0x66, 0x61, 0x74, 0x61,
+ 0x6c, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x3c,
+ 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x54,
+ 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x54, 0x65, 0x78,
+ 0x74, 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x74,
+ 0x6f, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65,
+ 0x72, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67,
+ 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x66, 0x61, 0x74,
+ 0x61, 0x6c, 0x22, 0x3e, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x0d,
+ 0x0a, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20,
+ 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69,
+ 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x20, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x37, 0x39, 0x22, 0x3e, 0x5b, 0x45, 0x37,
+ 0x39, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x49, 0x74, 0x0d, 0x0a,
+ 0x69, 0x73, 0x20, 0x61, 0x20, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65,
+ 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73,
+ 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x20,
+ 0x28, 0x76, 0x69, 0x61, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+ 0x2c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x0d,
+ 0x0a, 0x6f, 0x72, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x2d, 0x6c,
+ 0x65, 0x76, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+ 0x6c, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20,
+ 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x75, 0x74, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x6f, 0x63, 0x74, 0x65,
+ 0x74, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x0d,
+ 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f,
+ 0x20, 0x61, 0x20, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x63, 0x6f, 0x6e,
+ 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74,
+ 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x55,
+ 0x54, 0x46, 0x2d, 0x38, 0x20, 0x6f, 0x72, 0x20, 0x55, 0x54, 0x46, 0x2d,
+ 0x31, 0x36, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x45, 0x78, 0x61,
+ 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61,
+ 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65,
+ 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x32, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x32, 0x33,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x74, 0x65, 0x78, 0x74, 0x0d,
+ 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67,
+ 0x20, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x3f, 0x78,
+ 0x6d, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3d,
+ 0x27, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x27, 0x3f, 0x3e, 0x0d, 0x0a, 0x26,
+ 0x6c, 0x74, 0x3b, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x27, 0x45, 0x55, 0x43, 0x2d, 0x4a, 0x50,
+ 0x27, 0x3f, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76,
+ 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x65, 0x6e, 0x74, 0x70, 0x72, 0x6f, 0x63, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x50,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x54, 0x72, 0x65,
+ 0x61, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x52,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65,
+ 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77,
+ 0x20, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x73, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2c, 0x0d, 0x0a, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x76, 0x6f,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x75,
+ 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x69, 0x65, 0x73, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61,
+ 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68,
+ 0x65, 0x0d, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20,
+ 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x20,
+ 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x70, 0x72, 0x6f, 0x63, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x65, 0x61,
+ 0x63, 0x68, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65,
+ 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x6d, 0x6f, 0x73, 0x74, 0x20,
+ 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f,
+ 0x67, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x78, 0x74, 0x3a, 0x20, 0x3c, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x20, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x61, 0x73, 0x20, 0x61,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61,
+ 0x6e, 0x79, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x66, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x73,
+ 0x74, 0x61, 0x67, 0x22, 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x74,
+ 0x61, 0x67, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x74,
+ 0x61, 0x67, 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x61, 0x67, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6f, 0x66,
+ 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3b,
+ 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73,
+ 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x6e,
+ 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x41, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c,
+ 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65,
+ 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x61, 0x73, 0x20, 0x61, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x69, 0x6e, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66,
+ 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x73, 0x74, 0x61, 0x67, 0x22, 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d,
+ 0x74, 0x61, 0x67, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x2c, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69,
+ 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x74,
+ 0x74, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x3b, 0x0d, 0x0a, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x6e, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x41, 0x74,
+ 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e,
+ 0x4f, 0x63, 0x63, 0x75, 0x72, 0x73, 0x20, 0x61, 0x73, 0x20, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x61, 0x73, 0x20,
+ 0x61, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20,
+ 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x69,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x73, 0x0d, 0x0a, 0x74, 0x68, 0x65,
+ 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65,
+ 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x61,
+ 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45,
+ 0x4e, 0x54, 0x49, 0x54, 0x59, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x2c, 0x0d,
+ 0x0a, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f,
+ 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2d,
+ 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f,
+ 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x77, 0x68,
+ 0x69, 0x63, 0x68, 0x0d, 0x0a, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65,
+ 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x61,
+ 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45,
+ 0x4e, 0x54, 0x49, 0x54, 0x49, 0x45, 0x53, 0x3c, 0x2f, 0x6b, 0x77, 0x3e,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66,
+ 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69,
+ 0x6e, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x56, 0x61, 0x6c,
+ 0x75, 0x65, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x61, 0x73,
+ 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x61,
+ 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x27, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6c, 0x69,
+ 0x74, 0x65, 0x6e, 0x74, 0x76, 0x61, 0x6c, 0x22, 0x3e, 0x6c, 0x69, 0x74,
+ 0x65, 0x72, 0x61, 0x6c, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x27, 0x73, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x63, 0x6f,
+ 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x6d,
+ 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e,
+ 0x20, 0x44, 0x54, 0x44, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d,
+ 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32,
+ 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39,
+ 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x30, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x61, 0x73, 0x0d, 0x0a, 0x61, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e,
+ 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62,
+ 0x73, 0x65, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65,
+ 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70,
+ 0x65, 0x22, 0x3e, 0x44, 0x54, 0x44, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6f, 0x75,
+ 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22,
+ 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74, 0x56,
+ 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x56, 0x61, 0x6c,
+ 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x49, 0x22,
+ 0x3e, 0x50, 0x49, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x3c, 0x6e,
+ 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x6f,
+ 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x43, 0x6f, 0x6d, 0x6d, 0x65,
+ 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x3c, 0x6e, 0x74,
+ 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22,
+ 0x3e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x69, 0x74, 0x65, 0x72,
+ 0x61, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x75, 0x62,
+ 0x69, 0x64, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x50,
+ 0x75, 0x62, 0x69, 0x64, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x2c, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,
+ 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
+ 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x73, 0x65,
+ 0x65, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x63, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x65, 0x63, 0x74, 0x22, 0x2f,
+ 0x3e, 0x29, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66,
+ 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f, 0x72, 0x64,
+ 0x65, 0x72, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x20, 0x63, 0x65,
+ 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x37,
+ 0x22, 0x3e, 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e,
+ 0x3c, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x72, 0x6f,
+ 0x77, 0x73, 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x63, 0x6f,
+ 0x6c, 0x73, 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x31, 0x22, 0x3e, 0x3c, 0x2f,
+ 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x70,
+ 0x61, 0x6e, 0x3d, 0x22, 0x34, 0x22, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d,
+ 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x54, 0x79,
+ 0x70, 0x65, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x72,
+ 0x6f, 0x77, 0x73, 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72,
+ 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x3c,
+ 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x72,
+ 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x22, 0x0d, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d,
+ 0x22, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22, 0x3e, 0x3c, 0x74, 0x64,
+ 0x3e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x3c, 0x2f,
+ 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x49, 0x6e, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x3c,
+ 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x45, 0x78, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x0d,
+ 0x0a, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x64,
+ 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65,
+ 0x64, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c,
+ 0x74, 0x72, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65,
+ 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x3d, 0x22, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x74,
+ 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x23, 0x6e, 0x6f, 0x74, 0x2d, 0x72, 0x65, 0x63, 0x6f, 0x67,
+ 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x3e, 0x4e, 0x6f, 0x74, 0x20, 0x72,
+ 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x3c, 0x2f, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23,
+ 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x22, 0x3e, 0x49, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74,
+ 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75,
+ 0x64, 0x65, 0x2d, 0x69, 0x66, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22,
+ 0x3e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x0d, 0x0a, 0x69,
+ 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67,
+ 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c,
+ 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x23, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x3e,
+ 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3c, 0x2f, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23,
+ 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x22, 0x3e, 0x49, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f,
+ 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x72, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x0d, 0x0a, 0x76,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6d, 0x69, 0x64, 0x64, 0x6c,
+ 0x65, 0x22, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x41, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x23, 0x6e, 0x6f, 0x74, 0x2d, 0x72, 0x65, 0x63, 0x6f,
+ 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x3e, 0x4e, 0x6f, 0x74, 0x20,
+ 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x3c, 0x2f,
+ 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x69,
+ 0x6e, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x49, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x6c,
+ 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74,
+ 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x66, 0x6f, 0x72, 0x62, 0x69,
+ 0x64, 0x64, 0x65, 0x6e, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64,
+ 0x64, 0x65, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x35, 0x31, 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x31, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x66, 0x6f, 0x72,
+ 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x62,
+ 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64,
+ 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x64, 0x22, 0x3e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64,
+ 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c,
+ 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c,
+ 0x74, 0x72, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65,
+ 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x3d, 0x22, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x74,
+ 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x4f, 0x63, 0x63, 0x75, 0x72, 0x73, 0x20, 0x61,
+ 0x73, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x0d,
+ 0x0a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c,
+ 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x6e, 0x6f, 0x74, 0x2d,
+ 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x3e,
+ 0x4e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a,
+ 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x3e,
+ 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x23, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64,
+ 0x65, 0x6e, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65,
+ 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x35, 0x31,
+ 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x31, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x0d, 0x0a,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64,
+ 0x64, 0x65, 0x6e, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64,
+ 0x65, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x23, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x22, 0x3e, 0x4e,
+ 0x6f, 0x74, 0x69, 0x66, 0x79, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x74, 0x64, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x35, 0x31, 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x31, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63,
+ 0x68, 0x67, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x6e,
+ 0x6f, 0x74, 0x2d, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65,
+ 0x64, 0x22, 0x3e, 0x4e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67,
+ 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x72, 0x3e, 0x3c, 0x74, 0x72, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d,
+ 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x0d, 0x0a, 0x76, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65,
+ 0x22, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d,
+ 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x52, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x45, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x74, 0x64,
+ 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72,
+ 0x65, 0x66, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x69,
+ 0x6e, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x49, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69,
+ 0x74, 0x65, 0x72, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64,
+ 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x62, 0x79, 0x70, 0x61, 0x73, 0x73,
+ 0x22, 0x3e, 0x42, 0x79, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x3c, 0x2f,
+ 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x23, 0x62, 0x79, 0x70, 0x61, 0x73, 0x73, 0x22, 0x3e, 0x42, 0x79, 0x70,
+ 0x61, 0x73, 0x73, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64,
+ 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64,
+ 0x64, 0x65, 0x6e, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64,
+ 0x65, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x3e,
+ 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+ 0x64, 0x22, 0x3e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x3c,
+ 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f,
+ 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x72, 0x20,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65,
+ 0x72, 0x22, 0x0d, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22,
+ 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x74, 0x64, 0x20,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20,
+ 0x69, 0x6e, 0x20, 0x44, 0x54, 0x44, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c,
+ 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x61, 0x73, 0x2d, 0x50,
+ 0x45, 0x22, 0x3e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x0d,
+ 0x0a, 0x61, 0x73, 0x20, 0x50, 0x45, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74,
+ 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x66, 0x6f, 0x72, 0x62, 0x69,
+ 0x64, 0x64, 0x65, 0x6e, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64,
+ 0x64, 0x65, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64,
+ 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64,
+ 0x64, 0x65, 0x6e, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64,
+ 0x65, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x23, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e,
+ 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3c,
+ 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f,
+ 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x23, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22,
+ 0x3e, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3c, 0x2f,
+ 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x62, 0x6f,
+ 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6e,
+ 0x6f, 0x74, 0x2d, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65,
+ 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4e,
+ 0x6f, 0x74, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65,
+ 0x64, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x4f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x44, 0x54, 0x44, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x25, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x68,
+ 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61,
+ 0x6c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6e,
+ 0x63, 0x65, 0x3b, 0x0d, 0x0a, 0x74, 0x68, 0x75, 0x73, 0x2c, 0x20, 0x77,
+ 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65,
+ 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x44, 0x54, 0x44, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+ 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x0d, 0x0a,
+ 0x61, 0x73, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x69, 0x6e,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x20,
+ 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x2c, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x75, 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65,
+ 0x64, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x77, 0x68, 0x65,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61,
+ 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70,
+ 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x0d, 0x0a,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6e, 0x63, 0x6c,
+ 0x75, 0x64, 0x65, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0x20, 0x74,
+ 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+ 0x22, 0x3e, 0x41, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x69, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x73, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x74, 0x65, 0x78, 0x74,
+ 0x22, 0x3e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x3e, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x74, 0x72,
+ 0x69, 0x65, 0x76, 0x65, 0x64, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x6e,
+ 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20,
+ 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x74,
+ 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x69, 0x74, 0x20, 0x77, 0x65, 0x72,
+ 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x72, 0x65,
+ 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x54, 0x68, 0x65, 0x20,
+ 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d,
+ 0x0a, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x64, 0x61, 0x74, 0x61,
+ 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x64, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x65, 0x78, 0x63,
+ 0x65, 0x70, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x61,
+ 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x29, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6d, 0x61, 0x72,
+ 0x6b, 0x75, 0x70, 0x22, 0x3e, 0x6d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x0d, 0x0a,
+ 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x75, 0x61,
+ 0x6c, 0x20, 0x77, 0x61, 0x79, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x36, 0x35, 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x35, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x72,
+ 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
+ 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x75,
+ 0x70, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73,
+ 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x20, 0x26, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x65, 0x6e, 0x74,
+ 0x73, 0x3b, 0x29, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x77, 0x61,
+ 0x79, 0x73, 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61,
+ 0x73, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x2e, 0x20, 0x28, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x54, 0x26, 0x61, 0x6d, 0x70,
+ 0x3b, 0x61, 0x6d, 0x70, 0x3b, 0x54, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a,
+ 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x3c,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x41, 0x54, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x54, 0x3b, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6d,
+ 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6d, 0x70, 0x65, 0x72,
+ 0x73, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20,
+ 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x2d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x64,
+ 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x29, 0x20, 0x41,
+ 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x0d, 0x0a, 0x69, 0x73,
+ 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x69, 0x6e, 0x63, 0x6c, 0x75,
+ 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20, 0x77,
+ 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69,
+ 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x6c, 0x61, 0x63,
+ 0x65, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x74, 0x73, 0x65,
+ 0x6c, 0x66, 0x2e, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+ 0x2d, 0x69, 0x66, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x49, 0x6e, 0x63, 0x6c, 0x75,
+ 0x64, 0x65, 0x64, 0x20, 0x49, 0x66, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64,
+ 0x61, 0x74, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6e,
+ 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x6f, 0x72, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65,
+ 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65,
+ 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x69, 0x6e,
+ 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x0d, 0x0a, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x22, 0x3e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20,
+ 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x20, 0x49, 0x66,
+ 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6e,
+ 0x67, 0x20, 0x74, 0x6f, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,
+ 0x65, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x58, 0x4d, 0x4c, 0x20, 0x64,
+ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x6d, 0x61, 0x79, 0x22, 0x3e, 0x6d, 0x61, 0x79,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20,
+ 0x62, 0x75, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x0d, 0x0a, 0x6e, 0x6f,
+ 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x27, 0x73, 0x20,
+ 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x74, 0x65, 0x78, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x61, 0x20, 0x6e,
+ 0x6f, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e,
+ 0x67, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x35,
+ 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x64, 0x6f, 0x65,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x20,
+ 0x69, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0d,
+ 0x0a, 0x69, 0x74, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a,
+ 0x65, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x64, 0x69, 0x64, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64,
+ 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f,
+ 0x67, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74,
+ 0x69, 0x63, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e,
+ 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x0d, 0x0a, 0x62,
+ 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x2c,
+ 0x20, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x20, 0x64,
+ 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73,
+ 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c,
+ 0x61, 0x72, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x61, 0x75,
+ 0x74, 0x68, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x69, 0x73, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72,
+ 0x69, 0x6c, 0x79, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69,
+ 0x61, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65,
+ 0x72, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69,
+ 0x63, 0x75, 0x6c, 0x61, 0x72, 0x0d, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x69, 0x6e, 0x67,
+ 0x2e, 0x20, 0x42, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x73, 0x2c, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c,
+ 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65,
+ 0x64, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x6d, 0x69, 0x67,
+ 0x68, 0x74, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x6f,
+ 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x61, 0x20, 0x76,
+ 0x69, 0x73, 0x75, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x27, 0x73, 0x0d, 0x0a, 0x70, 0x72,
+ 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72,
+ 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x69, 0x74, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6f,
+ 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x6d, 0x61, 0x6e,
+ 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69,
+ 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x46, 0x6f,
+ 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x66,
+ 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75,
+ 0x74, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x66, 0x61, 0x74, 0x61,
+ 0x6c, 0x22, 0x3e, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x65, 0x72, 0x72, 0x6f,
+ 0x72, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x75, 0x6c,
+ 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x70, 0x3e, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61,
+ 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20,
+ 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x75, 0x6e, 0x70, 0x61,
+ 0x72, 0x73, 0x65, 0x64, 0x22, 0x3e, 0x75, 0x6e, 0x70, 0x61, 0x72, 0x73,
+ 0x65, 0x64, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x74, 0x68, 0x65, 0x20, 0x61,
+ 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66,
+ 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x6c, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x0d, 0x0a, 0x44, 0x54, 0x44, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70,
+ 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22,
+ 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x41, 0x74, 0x74,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x41, 0x74, 0x74, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x61, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20,
+ 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x75, 0x6c, 0x69, 0x73,
+ 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69,
+ 0x6e, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x66, 0x22, 0x3e, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x0d,
+ 0x0a, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20,
+ 0x61, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x73, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e,
+ 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x74, 0x65, 0x78, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x70, 0x6c, 0x61, 0x63,
+ 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c,
+ 0x66, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20,
+ 0x69, 0x74, 0x20, 0x77, 0x65, 0x72, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, 0x0d, 0x0a, 0x74, 0x68, 0x65,
+ 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20,
+ 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a,
+ 0x65, 0x64, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x74,
+ 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65,
+ 0x20, 0x6f, 0x72, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x0d, 0x0a,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
+ 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
+ 0x65, 0x78, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79,
+ 0x73, 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73,
+ 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x64, 0x61,
+ 0x74, 0x61, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c,
+ 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x77,
+ 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x3a, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x26, 0x6c, 0x74, 0x3b,
+ 0x21, 0x2d, 0x2d, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65,
+ 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x34, 0x22, 0x3e, 0x5b, 0x45, 0x34, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x3c, 0x21, 0x45, 0x4e,
+ 0x54, 0x49, 0x54, 0x59, 0x20, 0x25, 0x20, 0x59, 0x4e, 0x20, 0x27, 0x22,
+ 0x59, 0x65, 0x73, 0x22, 0x27, 0x20, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45,
+ 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x57, 0x68, 0x61, 0x74, 0x48, 0x65,
+ 0x53, 0x61, 0x69, 0x64, 0x20, 0x22, 0x48, 0x65, 0x20, 0x73, 0x61, 0x69,
+ 0x64, 0x20, 0x25, 0x59, 0x4e, 0x3b, 0x22, 0x20, 0x3e, 0x5d, 0x5d, 0x3e,
+ 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x77, 0x68,
+ 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
+ 0x6e, 0x6f, 0x74, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65,
+ 0x67, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54,
+ 0x59, 0x20, 0x45, 0x6e, 0x64, 0x41, 0x74, 0x74, 0x72, 0x20, 0x22, 0x32,
+ 0x37, 0x27, 0x22, 0x20, 0x3e, 0x0d, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x3d, 0x27, 0x61, 0x2d, 0x26, 0x61, 0x6d, 0x70,
+ 0x3b, 0x45, 0x6e, 0x64, 0x41, 0x74, 0x74, 0x72, 0x3b, 0x3e, 0x3c, 0x2f,
+ 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x57, 0x68,
+ 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20,
+ 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x75,
+ 0x6e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x22, 0x3e, 0x75, 0x6e, 0x70,
+ 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a,
+ 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61,
+ 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61,
+ 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20,
+ 0x6f, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20,
+ 0x74, 0x79, 0x70, 0x65, 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45, 0x4e, 0x54,
+ 0x49, 0x54, 0x59, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x0d, 0x0a, 0x6f, 0x72,
+ 0x20, 0x3c, 0x6b, 0x77, 0x3e, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x49, 0x45,
+ 0x53, 0x3c, 0x2f, 0x6b, 0x77, 0x3e, 0x2c, 0x20, 0x61, 0x20, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61,
+ 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
+ 0x66, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x73, 0x79, 0x73, 0x69, 0x64, 0x22, 0x3e, 0x73, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x70, 0x75, 0x62,
+ 0x69, 0x64, 0x22, 0x3e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x28, 0x69,
+ 0x66, 0x20, 0x61, 0x6e, 0x79, 0x29, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62,
+ 0x6f, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x20, 0x61,
+ 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x3e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x64, 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x79, 0x70,
+ 0x61, 0x73, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x42, 0x79, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x57, 0x68, 0x65,
+ 0x6e, 0x20, 0x61, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6e, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x45, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x62,
+ 0x79, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x6c, 0x65, 0x66, 0x74, 0x20, 0x61, 0x73, 0x20, 0x69, 0x73, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x33, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x61, 0x73, 0x2d, 0x50, 0x45, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20,
+ 0x61, 0x73, 0x20, 0x50, 0x45, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x4a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x73,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61,
+ 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
+ 0x20, 0x62, 0x65, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x69, 0x6e,
+ 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2d, 0x69, 0x66, 0x2d, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x22, 0x3e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64,
+ 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69,
+ 0x6e, 0x67, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x2e, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x61,
+ 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69,
+ 0x7a, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44,
+ 0x54, 0x44, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75,
+ 0x64, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x74, 0x73, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e,
+ 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d,
+ 0x0a, 0x74, 0x65, 0x78, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x6c, 0x61, 0x72,
+ 0x67, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66,
+ 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x66, 0x6f, 0x6c,
+ 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x73, 0x70, 0x61, 0x63,
+ 0x65, 0x20, 0x28, 0x23, 0x78, 0x32, 0x30, 0x29, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f,
+ 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x0d, 0x0a,
+ 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x67, 0x72, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+ 0x20, 0x6f, 0x66, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69,
+ 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x69,
+ 0x6e, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x44, 0x54, 0x44, 0x2e, 0x20,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x36, 0x22, 0x3e, 0x5b,
+ 0x45, 0x39, 0x36, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68,
+ 0x69, 0x73, 0x0d, 0x0a, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72,
+ 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70,
+ 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d,
+ 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3b, 0x0d, 0x0a, 0x74, 0x68,
+ 0x65, 0x73, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63,
+ 0x72, 0x69, 0x62, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x73, 0x70,
+ 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69,
+ 0x6e, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x2f, 0x3e, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x33, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69,
+ 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x72,
+ 0x6e, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x43,
+ 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x6f, 0x66, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x52, 0x65, 0x70, 0x6c, 0x61,
+ 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x78, 0x74, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x49,
+ 0x6e, 0x20, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x69, 0x6e, 0x67,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2c,
+ 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67,
+ 0x75, 0x69, 0x73, 0x68, 0x0d, 0x0a, 0x74, 0x77, 0x6f, 0x20, 0x66, 0x6f,
+ 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x27, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x6c, 0x69, 0x74, 0x65, 0x6e,
+ 0x74, 0x76, 0x61, 0x6c, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22,
+ 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x54, 0x68,
+ 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x6c, 0x69, 0x74, 0x65,
+ 0x72, 0x61, 0x6c, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x63,
+ 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65,
+ 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x0d, 0x0a, 0x63, 0x6f, 0x72, 0x72, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x74, 0x65, 0x72, 0x6d,
+ 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56,
+ 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x3c, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x0d, 0x0a, 0x69, 0x64, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x72, 0x65, 0x70, 0x6c, 0x74, 0x65, 0x78, 0x74, 0x22,
+ 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x52, 0x65, 0x70, 0x6c, 0x61,
+ 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x78, 0x74, 0x22,
+ 0x3e, 0x54, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x72,
+ 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
+ 0x65, 0x78, 0x74, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20,
+ 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
+ 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65,
+ 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65,
+ 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x28, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x56, 0x61, 0x6c,
+ 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x29, 0x20, 0x6d, 0x61, 0x79,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61,
+ 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x6c, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x53, 0x75,
+ 0x63, 0x68, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x72, 0x65, 0x6c, 0x79, 0x0d, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61,
+ 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x69, 0x73, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d,
+ 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x22, 0x3e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+ 0x64, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x72, 0x65, 0x70, 0x6c, 0x61,
+ 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x65, 0x78, 0x74,
+ 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20, 0x6f, 0x66, 0x20, 0x61,
+ 0x6e, 0x79, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x2c, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x70,
+ 0x6c, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x3b, 0x0d, 0x0a, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20,
+ 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65,
+ 0x66, 0x74, 0x20, 0x61, 0x73, 0x2d, 0x69, 0x73, 0x2c, 0x20, 0x75, 0x6e,
+ 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x2e, 0x20, 0x46, 0x6f,
+ 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0d, 0x0a,
+ 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f,
+ 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x3c, 0x21, 0x5b, 0x43, 0x44,
+ 0x41, 0x54, 0x41, 0x5b, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59,
+ 0x20, 0x25, 0x20, 0x70, 0x75, 0x62, 0x20, 0x20, 0x20, 0x20, 0x22, 0x26,
+ 0x23, 0x78, 0x63, 0x39, 0x3b, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x20, 0x47, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x72, 0x64, 0x22, 0x20,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20,
+ 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x22, 0x41, 0x6c,
+ 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73,
+ 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0x20, 0x3e, 0x0d, 0x0a, 0x3c, 0x21,
+ 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f,
+ 0x6b, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x20, 0x50, 0x65, 0x73, 0x74,
+ 0x65, 0x3a, 0x20, 0x41, 0x6c, 0x62, 0x65, 0x72, 0x74, 0x20, 0x43, 0x61,
+ 0x6d, 0x75, 0x73, 0x2c, 0x0d, 0x0a, 0x26, 0x23, 0x78, 0x41, 0x39, 0x3b,
+ 0x20, 0x31, 0x39, 0x34, 0x37, 0x20, 0x25, 0x70, 0x75, 0x62, 0x3b, 0x2e,
+ 0x20, 0x26, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x3b, 0x22, 0x20, 0x3e,
+ 0x5d, 0x5d, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+ 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65,
+ 0x78, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x62, 0x6f, 0x6f, 0x6b, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x69, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x4c, 0x61, 0x20, 0x50, 0x65, 0x73, 0x74,
+ 0x65, 0x3a, 0x20, 0x41, 0x6c, 0x62, 0x65, 0x72, 0x74, 0x20, 0x43, 0x61,
+ 0x6d, 0x75, 0x73, 0x2c, 0x0d, 0x0a, 0xa9, 0x20, 0x31, 0x39, 0x34, 0x37,
+ 0x20, 0xc9, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x47, 0x61,
+ 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x72, 0x64, 0x2e, 0x20, 0x26, 0x61, 0x6d,
+ 0x70, 0x3b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x3b, 0x3c, 0x2f, 0x65,
+ 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20,
+ 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73,
+ 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x0d, 0x0a,
+ 0x62, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20,
+ 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3c, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61,
+ 0x6d, 0x70, 0x3b, 0x62, 0x6f, 0x6f, 0x6b, 0x3b, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20,
+ 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x27,
+ 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72,
+ 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x73,
+ 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20,
+ 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x6d,
+ 0x70, 0x6c, 0x65, 0x78, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61,
+ 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x64, 0x69,
+ 0x73, 0x63, 0x75, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x66,
+ 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74,
+ 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x73, 0x65,
+ 0x65, 0x20, 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x65, 0x6e, 0x74, 0x65,
+ 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65,
+ 0x63, 0x2d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,
+ 0x2d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,
+ 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x22, 0x20, 0x74, 0x65, 0x72,
+ 0x6d, 0x3d, 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x22, 0x3e, 0x45,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x0d, 0x0a,
+ 0x62, 0x6f, 0x74, 0x68, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64,
+ 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x65, 0x73,
+ 0x63, 0x61, 0x70, 0x65, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x61, 0x6e, 0x67,
+ 0x6c, 0x65, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x20,
+ 0x61, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x61,
+ 0x6e, 0x64, 0x0d, 0x0a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x64, 0x65,
+ 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x41, 0x20,
+ 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20,
+ 0x28, 0x26, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x65, 0x6e, 0x74, 0x73, 0x3b,
+ 0x29, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,
+ 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x0d, 0x0a, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x2e, 0x20, 0x4e, 0x75,
+ 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20,
+ 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x3b, 0x20, 0x74, 0x68, 0x65,
+ 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64,
+ 0x65, 0x64, 0x0d, 0x0a, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74,
+ 0x65, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x63,
+ 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x73,
+ 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x6e, 0x75, 0x6d, 0x65, 0x72,
+ 0x69, 0x63, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20,
+ 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x36, 0x30, 0x3b, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b,
+ 0x23, 0x33, 0x38, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x6d, 0x61, 0x79,
+ 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26,
+ 0x61, 0x6d, 0x70, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20,
+ 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x6f, 0x63,
+ 0x63, 0x75, 0x72, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6c, 0x6c, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e,
+ 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x0d, 0x0a, 0x6f, 0x72,
+ 0x20, 0x6e, 0x6f, 0x74, 0x2e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x22, 0x3e, 0x46, 0x6f, 0x72, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x58, 0x4d,
+ 0x4c, 0x0d, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+ 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x64, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6b, 0x65,
+ 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x2c,
+ 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e,
+ 0x67, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63,
+ 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65,
+ 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x38, 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x38, 0x30,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x49, 0x66, 0x0d, 0x0a, 0x74,
+ 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x6c, 0x74, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x61, 0x6d, 0x70, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20,
+ 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64,
+ 0x2c, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x0d, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64,
+ 0x20, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x77, 0x68,
+ 0x6f, 0x73, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, 0x73, 0x20,
+ 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x0d, 0x0a, 0x74,
+ 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x31, 0x30, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x30, 0x33, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63,
+ 0x74, 0x69, 0x76, 0x65, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x73, 0x73, 0x2d, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x61,
+ 0x6d, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6e, 0x64, 0x29, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67,
+ 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x3b, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x65, 0x73,
+ 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65,
+ 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74,
+ 0x68, 0x65, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65,
+ 0x73, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20,
+ 0x74, 0x68, 0x65, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65,
+ 0x0d, 0x0a, 0x61, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72,
+ 0x6d, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x20,
+ 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x74,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x61, 0x70, 0x6f, 0x73, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x2c, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x71, 0x75, 0x6f, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65,
+ 0x64, 0x20, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x0d, 0x0a,
+ 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65,
+ 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x62,
+ 0x65, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64,
+ 0x20, 0x28, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x3b, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x73,
+ 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20,
+ 0x69, 0x73, 0x20, 0x75, 0x6e, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61,
+ 0x72, 0x79, 0x20, 0x62, 0x75, 0x74, 0x20, 0x68, 0x61, 0x72, 0x6d, 0x6c,
+ 0x65, 0x73, 0x73, 0x29, 0x2e, 0x0d, 0x0a, 0x46, 0x6f, 0x72, 0x20, 0x65,
+ 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x3c, 0x2f, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65,
+ 0x67, 0x3e, 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x3c,
+ 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x6c, 0x74, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x22, 0x26, 0x23, 0x33, 0x38, 0x3b, 0x23, 0x36, 0x30,
+ 0x3b, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54,
+ 0x59, 0x20, 0x67, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x26, 0x23,
+ 0x36, 0x32, 0x3b, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54,
+ 0x49, 0x54, 0x59, 0x20, 0x61, 0x6d, 0x70, 0x20, 0x20, 0x20, 0x20, 0x22,
+ 0x26, 0x23, 0x33, 0x38, 0x3b, 0x23, 0x33, 0x38, 0x3b, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x61, 0x70,
+ 0x6f, 0x73, 0x20, 0x20, 0x20, 0x22, 0x26, 0x23, 0x33, 0x39, 0x3b, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20,
+ 0x71, 0x75, 0x6f, 0x74, 0x20, 0x20, 0x20, 0x22, 0x26, 0x23, 0x33, 0x34,
+ 0x3b, 0x22, 0x3e, 0x5d, 0x5d, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65,
+ 0x6c, 0x22, 0x3e, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26,
+ 0x6c, 0x74, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61, 0x6d,
+ 0x70, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x6c, 0x74,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x61, 0x6d, 0x70,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x75,
+ 0x62, 0x6c, 0x79, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x20,
+ 0x74, 0x6f, 0x20, 0x6d, 0x65, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d,
+ 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x65, 0x63, 0x6c,
+ 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72,
+ 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x3d, 0x22, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x22, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x4e, 0x6f, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e,
+ 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x0d, 0x0a, 0x62,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x75, 0x6e,
+ 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x2c, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x62, 0x65, 0x61,
+ 0x72, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20,
+ 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x70, 0x69, 0x22, 0x3e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69,
+ 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65,
+ 0x64, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74,
+ 0x2d, 0x6e, 0x6f, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x22, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x3d, 0x22, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x22, 0x3e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x4e, 0x6f, 0x74,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x61,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d, 0x6c, 0x69, 0x73, 0x74,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
+ 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
+ 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x73,
+ 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c,
+ 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x68, 0x65, 0x6c, 0x70,
+ 0x65, 0x72, 0x0d, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x70, 0x61, 0x62, 0x6c, 0x65, 0x20,
+ 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e,
+ 0x67, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63,
+ 0x72, 0x61, 0x70, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62,
+ 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x6f, 0x74, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6c, 0x68, 0x73, 0x3e, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x44, 0x65, 0x63, 0x6c, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72,
+ 0x68, 0x73, 0x3e, 0x27, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x4e, 0x4f, 0x54,
+ 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c,
+ 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e,
+ 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x6e, 0x74,
+ 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22,
+ 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x28, 0x3c, 0x6e, 0x74,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x45, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x22, 0x3e, 0x45, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x44, 0x22,
+ 0x3e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x44, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x29, 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3f, 0x20, 0x27, 0x3e, 0x27, 0x3c, 0x2f, 0x72, 0x68, 0x73,
+ 0x3e, 0x3c, 0x76, 0x63, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x55, 0x6e,
+ 0x69, 0x71, 0x75, 0x65, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x61, 0x64, 0x64, 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63,
+ 0x49, 0x44, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x50,
+ 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x44, 0x3c, 0x2f, 0x6c, 0x68, 0x73,
+ 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x27, 0x50, 0x55, 0x42, 0x4c, 0x49,
+ 0x43, 0x27, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x53, 0x22, 0x3e, 0x53, 0x3c, 0x2f, 0x6e, 0x74, 0x3e,
+ 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x50, 0x75, 0x62, 0x69, 0x64, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x22, 0x3e, 0x50, 0x75, 0x62, 0x69, 0x64, 0x4c, 0x69, 0x74, 0x65,
+ 0x72, 0x61, 0x6c, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x68, 0x65, 0x61, 0x64,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x32, 0x32, 0x22, 0x3e, 0x5b, 0x45, 0x32, 0x32, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0d, 0x0a,
+ 0x4e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x61, 0x6d,
+ 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x70, 0x3e, 0x4f,
+ 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x65, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e,
+ 0x20, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x4e, 0x61, 0x6d, 0x65,
+ 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x76, 0x63, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x6f, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x72,
+ 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x64,
+ 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x28, 0x73, 0x29, 0x0d,
+ 0x0a, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65,
+ 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72,
+ 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x79, 0x20, 0x6d, 0x61, 0x79, 0x20,
+ 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79,
+ 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x69,
+ 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x69, 0x6e,
+ 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x73, 0x79, 0x73, 0x69, 0x64, 0x22, 0x3e, 0x73, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20,
+ 0x66, 0x69, 0x6c, 0x65, 0x0d, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20,
+ 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x65,
+ 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c,
+ 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72,
+ 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64,
+ 0x2e, 0x20, 0x28, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x68,
+ 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x58, 0x4d, 0x4c, 0x0d, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x20,
+ 0x74, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x63, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65,
+ 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74,
+ 0x65, 0x6d, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x0d, 0x0a, 0x72, 0x75,
+ 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x29, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d,
+ 0x64, 0x6f, 0x63, 0x2d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x44, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x74,
+ 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x3e, 0x54, 0x68,
+ 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x64, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c,
+ 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x73, 0x65, 0x72, 0x76,
+ 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f,
+ 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67,
+ 0x2d, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61,
+ 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a,
+ 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x70, 0x72, 0x6f, 0x63, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x64, 0x65, 0x66, 0x3e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70,
+ 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x64, 0x6f, 0x65, 0x73, 0x0d, 0x0a, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70,
+ 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20,
+ 0x62, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62,
+ 0x79, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x6c,
+ 0x69, 0x6b, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x69, 0x67, 0x68,
+ 0x74, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61,
+ 0x72, 0x0d, 0x0a, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20,
+ 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,
+ 0x75, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x74,
+ 0x20, 0x61, 0x6c, 0x6c, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69,
+ 0x76, 0x31, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x26, 0x43,
+ 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x3b, 0x20,
+ 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x43, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x72,
+ 0x6f, 0x63, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x4e, 0x6f, 0x6e,
+ 0x2d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20,
+ 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x43, 0x6f,
+ 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x70, 0x72, 0x6f, 0x63, 0x22, 0x3e,
+ 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0d, 0x0a,
+ 0x74, 0x77, 0x6f, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x3a,
+ 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69,
+ 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x6c, 0x69,
+ 0x6b, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x70, 0x6f,
+ 0x72, 0x74, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73,
+ 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x27, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d,
+ 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+ 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64,
+ 0x6f, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x65, 0x6e,
+ 0x74, 0x22, 0x3e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72,
+ 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74,
+ 0x68, 0x65, 0x79, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64,
+ 0x65, 0x66, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x65,
+ 0x72, 0x6d, 0x3d, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69,
+ 0x6e, 0x67, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72,
+ 0x22, 0x3e, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x56, 0x61, 0x6c, 0x69,
+ 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d,
+ 0x3e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x32, 0x31, 0x22, 0x3e, 0x5b, 0x45, 0x32, 0x31, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x2c, 0x0d, 0x0a, 0x61, 0x74, 0x20, 0x75, 0x73,
+ 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x3c, 0x2f,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x72, 0x65, 0x70, 0x6f,
+ 0x72, 0x74, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x78, 0x70,
+ 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x0d, 0x0a, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d,
+ 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x22,
+ 0x3e, 0x44, 0x54, 0x44, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x61, 0x69, 0x6c,
+ 0x75, 0x72, 0x65, 0x73, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x66, 0x75, 0x6c,
+ 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72,
+ 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x54, 0x6f,
+ 0x20, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x73, 0x68, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x69, 0x6e, 0x67, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x72, 0x65, 0x0d, 0x0a, 0x44, 0x54, 0x44, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x4e, 0x6f, 0x6e, 0x2d, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f,
+ 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x64, 0x6f, 0x63,
+ 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x44, 0x54, 0x44, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65,
+ 0x74, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d,
+ 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x2e, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x0d, 0x0a, 0x69, 0x64,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x6d, 0x64, 0x65,
+ 0x63, 0x6c, 0x22, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x3d, 0x22, 0x50, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3e, 0x20, 0x57, 0x68, 0x69,
+ 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+ 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79,
+ 0x2c, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72,
+ 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x3c,
+ 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x61, 0x6c, 0x6c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x72,
+ 0x65, 0x61, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x44, 0x54, 0x44, 0x20,
+ 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69,
+ 0x6e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65,
+ 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x72, 0x65,
+ 0x61, 0x64, 0x2c, 0x20, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x72, 0x65, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x70,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0d, 0x0a, 0x74, 0x68,
+ 0x65, 0x79, 0x20, 0x64, 0x6f, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e,
+ 0x6e, 0x6f, 0x74, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20, 0x72,
+ 0x65, 0x61, 0x64, 0x3b, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73,
+ 0x20, 0x74, 0x6f, 0x20, 0x73, 0x61, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65,
+ 0x79, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x73, 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72,
+ 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x41, 0x56,
+ 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x6e,
+ 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3c, 0x2f, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x73, 0x2c, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x69, 0x6e, 0x63, 0x6c,
+ 0x75, 0x64, 0x65, 0x64, 0x22, 0x3e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6f,
+ 0x66, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x3c, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x23, 0x73, 0x65, 0x63, 0x2d, 0x61, 0x74, 0x74, 0x72, 0x2d, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3e, 0x64, 0x65, 0x66, 0x61,
+ 0x75, 0x6c, 0x74, 0x0d, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3c, 0x2f, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x72, 0x6d, 0x64, 0x65, 0x66, 0x3e, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64,
+ 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x33, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x33, 0x33,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x45, 0x78, 0x63, 0x65, 0x70,
+ 0x74, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x3d,
+ 0x22, 0x79, 0x65, 0x73, 0x22, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x2c, 0x20, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x74,
+ 0x68, 0x65, 0x79, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x6d,
+ 0x64, 0x65, 0x63, 0x6c, 0x22, 0x3e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x63, 0x6c,
+ 0x22, 0x3e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f,
+ 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x6f, 0x72, 0x20,
+ 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x61, 0x74, 0x74, 0x64, 0x65, 0x63, 0x6c,
+ 0x22, 0x3e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2d,
+ 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+ 0x65, 0x72, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x61,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74,
+ 0x6f, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
+ 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61,
+ 0x64, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x0d, 0x0a, 0x74, 0x68,
+ 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x6d, 0x61, 0x79,
+ 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x69,
+ 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x61, 0x66, 0x65, 0x2d, 0x62, 0x65,
+ 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73,
+ 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x54, 0x68, 0x65, 0x20, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72,
+ 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x69, 0x6e, 0x67, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x68, 0x69,
+ 0x67, 0x68, 0x6c, 0x79, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x3b, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x0d, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x20, 0x65, 0x76, 0x65, 0x72,
+ 0x79, 0x20, 0x70, 0x69, 0x65, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x61, 0x6c, 0x6c,
+ 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64,
+ 0x6e, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x4c, 0x65, 0x73, 0x73, 0x20,
+ 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20,
+ 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3b, 0x20, 0x69, 0x74, 0x20, 0x6e, 0x65,
+ 0x65, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x0d,
+ 0x0a, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x54, 0x68,
+ 0x69, 0x73, 0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x65,
+ 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x74,
+ 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6f,
+ 0x72, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65,
+ 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x3a, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x43, 0x65, 0x72,
+ 0x74, 0x61, 0x69, 0x6e, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x66, 0x6f,
+ 0x72, 0x6d, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x20, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x65, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64,
+ 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x20, 0x45, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x73, 0x0d, 0x0a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
+ 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72,
+ 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x64, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x77, 0x66, 0x2d, 0x65,
+ 0x6e, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x22, 0x3e,
+ 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x3e, 0x2c, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x74, 0x65,
+ 0x78, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x50, 0x61, 0x72, 0x73, 0x65,
+ 0x64, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x6e, 0x6f, 0x72, 0x65, 0x63, 0x75,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x4e, 0x6f, 0x0d, 0x0a, 0x52,
+ 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x61, 0x73, 0x20,
+ 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x20, 0x73, 0x6f, 0x6d, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65,
+ 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x20,
+ 0x61, 0x73, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x66, 0x6f, 0x72,
+ 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x3e, 0x66, 0x6f, 0x72, 0x62,
+ 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x73, 0x70, 0x65,
+ 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x65, 0x6e,
+ 0x74, 0x70, 0x72, 0x6f, 0x63, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x69,
+ 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70,
+ 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72,
+ 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c,
+ 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x79, 0x0d,
+ 0x0a, 0x76, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e,
+ 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63,
+ 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20,
+ 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x46, 0x6f,
+ 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x61,
+ 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,
+ 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x23, 0x41, 0x56, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69,
+ 0x7a, 0x65, 0x22, 0x3e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a,
+ 0x65, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x0d, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x3c, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x22, 0x3e, 0x69,
+ 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+ 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74,
+ 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x20,
+ 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x20, 0x68, 0x72,
+ 0x65, 0x66, 0x3d, 0x22, 0x23, 0x73, 0x65, 0x63, 0x2d, 0x61, 0x74, 0x74,
+ 0x72, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3e,
+ 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x0d, 0x0a, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x69, 0x6e,
+ 0x67, 0x20, 0x73, 0x6f, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x73,
+ 0x20, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x72,
+ 0x65, 0x61, 0x64, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x65, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72,
+ 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x75, 0x6c, 0x69, 0x73, 0x74,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x6d, 0x61,
+ 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62,
+ 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20,
+ 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x2c, 0x0d, 0x0a, 0x61,
+ 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+ 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6e, 0x6f,
+ 0x6e, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67,
+ 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x20,
+ 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72,
+ 0x65, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x62,
+ 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x73, 0x0d, 0x0a, 0x6e, 0x6f,
+ 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x6f,
+ 0x66, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
+ 0x73, 0x73, 0x6f, 0x72, 0x73, 0x2e, 0x20, 0x41, 0x70, 0x70, 0x6c, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x66, 0x61,
+ 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x73, 0x75, 0x63,
+ 0x68, 0x0d, 0x0a, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73,
+ 0x65, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+ 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0d, 0x0a, 0x65, 0x78, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65,
+ 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x75, 0x73, 0x65,
+ 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x31,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x73, 0x65, 0x63, 0x2d, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4e,
+ 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61,
+ 0x72, 0x20, 0x6f, 0x66, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x69, 0x73, 0x20,
+ 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20,
+ 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x0d, 0x0a, 0x45, 0x78, 0x74, 0x65,
+ 0x6e, 0x64, 0x65, 0x64, 0x20, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x73, 0x2d,
+ 0x4e, 0x61, 0x75, 0x72, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x20, 0x28, 0x45,
+ 0x42, 0x4e, 0x46, 0x29, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2e, 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6d,
+ 0x6d, 0x61, 0x72, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x0d,
+ 0x0a, 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x73, 0x79,
+ 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x3a, 0x3a, 0x3d, 0x20, 0x65, 0x78, 0x70,
+ 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x65, 0x67, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73,
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x69,
+ 0x74, 0x69, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c,
+ 0x20, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63,
+ 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65,
+ 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x34, 0x32, 0x22, 0x3e, 0x5b, 0x45, 0x34, 0x32,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x74, 0x68, 0x65, 0x0d, 0x0a,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c,
+ 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61,
+ 0x72, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2c, 0x3c,
+ 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x6c,
+ 0x6f, 0x77, 0x65, 0x72, 0x0d, 0x0a, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6c,
+ 0x65, 0x74, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x4c, 0x69, 0x74, 0x65, 0x72,
+ 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x57, 0x69, 0x74, 0x68, 0x69,
+ 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73,
+ 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x72, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x73,
+ 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73,
+ 0x69, 0x6f, 0x6e, 0x73, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73,
+ 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20,
+ 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6f,
+ 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x3a, 0x20, 0x3c,
+ 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x23, 0x78, 0x4e, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x77, 0x68,
+ 0x65, 0x72, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x4e, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20,
+ 0x68, 0x65, 0x78, 0x61, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x0d,
+ 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x69,
+ 0x6e, 0x20, 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x20, 0x31, 0x30,
+ 0x36, 0x34, 0x36, 0x20, 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x63, 0x61,
+ 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x28, 0x55, 0x43, 0x53,
+ 0x2d, 0x34, 0x29, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x0d, 0x0a, 0x61, 0x73,
+ 0x20, 0x61, 0x6e, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64,
+ 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x6e, 0x75, 0x6d, 0x62,
+ 0x65, 0x72, 0x2c, 0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61,
+ 0x74, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d,
+ 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x69,
+ 0x6e, 0x67, 0x0d, 0x0a, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x23,
+ 0x78, 0x4e, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x6f,
+ 0x72, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x67, 0x6e,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x3b, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c,
+ 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x7a, 0x65, 0x72, 0x6f,
+ 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x72,
+ 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63,
+ 0x6f, 0x64, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73,
+ 0x20, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x0d,
+ 0x0a, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69,
+ 0x66, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x58,
+ 0x4d, 0x4c, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x5b, 0x61, 0x2d,
+ 0x7a, 0x41, 0x2d, 0x5a, 0x5d, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x2c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x5b, 0x23, 0x78, 0x4e,
+ 0x2d, 0x23, 0x78, 0x4e, 0x5d, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68,
+ 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x39, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x33, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x6e, 0x74, 0x0d, 0x0a, 0x64,
+ 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x22,
+ 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x77, 0x69, 0x74, 0x68,
+ 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x28, 0x73, 0x29,
+ 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28,
+ 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x29, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c,
+ 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69,
+ 0x74, 0x65, 0x6d, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64,
+ 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x6c,
+ 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x33, 0x22,
+ 0x3e, 0x5b, 0x45, 0x33, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x5b, 0x61, 0x62, 0x63, 0x5d, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x5b, 0x23, 0x78, 0x4e, 0x23, 0x78, 0x4e, 0x23, 0x78, 0x4e, 0x5d,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x0d, 0x0a, 0x3e, 0x3c, 0x2f, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73,
+ 0x20, 0x61, 0x6e, 0x79, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66,
+ 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x43,
+ 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x6d,
+ 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x65, 0x6e, 0x75, 0x6d,
+ 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x45, 0x6e, 0x75, 0x6d,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20,
+ 0x62, 0x65, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62,
+ 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x5b, 0x5e, 0x61, 0x2d, 0x7a, 0x5d, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x5b,
+ 0x5e, 0x23, 0x78, 0x4e, 0x2d, 0x23, 0x78, 0x4e, 0x5d, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75,
+ 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x33, 0x22, 0x3e, 0x5b,
+ 0x45, 0x39, 0x33, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43,
+ 0x68, 0x61, 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e,
+ 0x74, 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x6f, 0x75, 0x74, 0x73, 0x69,
+ 0x64, 0x65, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x0d, 0x0a, 0x69, 0x6e, 0x64,
+ 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x5b, 0x5e, 0x61, 0x62, 0x63, 0x5d, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x2c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x5b, 0x5e,
+ 0x23, 0x78, 0x4e, 0x23, 0x78, 0x4e, 0x23, 0x78, 0x4e, 0x5d, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x79,
+ 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78,
+ 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x33, 0x22, 0x3e,
+ 0x5b, 0x45, 0x39, 0x33, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3c,
+ 0x6e, 0x74, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f,
+ 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6d, 0x6f, 0x6e, 0x67, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2e, 0x20, 0x3c, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x33,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x45, 0x6e, 0x75, 0x6d, 0x65,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0d, 0x0a, 0x61, 0x6e, 0x64,
+ 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x66,
+ 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x6d,
+ 0x69, 0x78, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20,
+ 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b,
+ 0x65, 0x74, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66,
+ 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x22, 0x73, 0x74, 0x72, 0x69,
+ 0x6e, 0x67, 0x22, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65,
+ 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20,
+ 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68,
+ 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66,
+ 0x3e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0d, 0x0a, 0x67, 0x69, 0x76, 0x65,
+ 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x27, 0x73, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x27, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64,
+ 0x74, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3e, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72,
+ 0x65, 0x66, 0x3e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0d, 0x0a, 0x67, 0x69,
+ 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x20,
+ 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c,
+ 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6d,
+ 0x62, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+ 0x6c, 0x65, 0x78, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73,
+ 0x20, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x2c,
+ 0x0d, 0x0a, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x41, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x42, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73,
+ 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x65,
+ 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20,
+ 0x3c, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x28,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73,
+ 0x73, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x29,
+ 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x69, 0x73, 0x20, 0x74,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20,
+ 0x75, 0x6e, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x79,
+ 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64,
+ 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+ 0x64, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c,
+ 0x69, 0x73, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x3f,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67,
+ 0x3b, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65,
+ 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x20, 0x42, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79,
+ 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x42, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x32, 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x32, 0x30, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x0d, 0x0a, 0x6f, 0x70,
+ 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x68,
+ 0x69, 0x67, 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64,
+ 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x6c,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x74,
+ 0x68, 0x75, 0x73, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x20,
+ 0x42, 0x20, 0x7c, 0x20, 0x43, 0x20, 0x44, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x69, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x28, 0x41, 0x20, 0x42, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x43,
+ 0x20, 0x44, 0x29, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x41, 0x20, 0x7c, 0x20, 0x42, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x6d, 0x61,
+ 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x41, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x6f, 0x72, 0x20,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x42, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62,
+ 0x6f, 0x74, 0x68, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x20,
+ 0x2d, 0x20, 0x42, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65,
+ 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+ 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65,
+ 0x73, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x62, 0x75, 0x74, 0x20, 0x64, 0x6f, 0x65,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x42, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x2b, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x6e,
+ 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x63,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x2e, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58,
+ 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30,
+ 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45,
+ 0x32, 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x32, 0x30, 0x5d, 0x3c, 0x2f, 0x6c,
+ 0x6f, 0x63, 0x3e, 0x43, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x6e, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x68, 0x61, 0x73, 0x20, 0x68, 0x69,
+ 0x67, 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65,
+ 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x74, 0x68,
+ 0x75, 0x73, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x2b, 0x20,
+ 0x7c, 0x20, 0x42, 0x2b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20,
+ 0x69, 0x73, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x6c,
+ 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x28,
+ 0x41, 0x2b, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x42, 0x2b, 0x29, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x2a, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x7a, 0x65,
+ 0x72, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f,
+ 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x32, 0x30, 0x22, 0x3e, 0x5b, 0x45, 0x32, 0x30, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x43, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x65,
+ 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x68, 0x61, 0x73, 0x20,
+ 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x65, 0x63, 0x65,
+ 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61,
+ 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20,
+ 0x74, 0x68, 0x75, 0x73, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x41,
+ 0x2a, 0x20, 0x7c, 0x20, 0x42, 0x2a, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x20, 0x69, 0x73, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63,
+ 0x61, 0x6c, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x28, 0x41, 0x2a, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x42, 0x2a, 0x29,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x20,
+ 0x4f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x3a, 0x20, 0x3c, 0x67, 0x6c,
+ 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x2f, 0x2a, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x2a, 0x2f, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f,
+ 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x5b, 0x20, 0x77, 0x66, 0x63, 0x3a, 0x20, 0x2e,
+ 0x2e, 0x2e, 0x20, 0x5d, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65,
+ 0x66, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x77, 0x65, 0x6c, 0x6c, 0x2d,
+ 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x63,
+ 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x3b, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
+ 0x65, 0x73, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61,
+ 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x20,
+ 0x6f, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d,
+ 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d, 0x77, 0x65, 0x6c,
+ 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x3e, 0x77, 0x65, 0x6c,
+ 0x6c, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61,
+ 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x70,
+ 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x3e, 0x3c, 0x2f,
+ 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x67, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x5b, 0x20, 0x76, 0x63, 0x3a, 0x20, 0x2e, 0x2e,
+ 0x2e, 0x20, 0x5d, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x66,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69,
+ 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e,
+ 0x74, 0x3b, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x64, 0x65, 0x6e,
+ 0x74, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61,
+ 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x3c, 0x74, 0x65, 0x72, 0x6d,
+ 0x72, 0x65, 0x66, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x64, 0x74, 0x2d,
+ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a,
+ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x73,
+ 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64,
+ 0x65, 0x66, 0x3e, 0x3c, 0x2f, 0x67, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x31, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x62, 0x61, 0x63, 0x6b,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x26, 0x53, 0x47, 0x4d,
+ 0x4c, 0x3b, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d,
+ 0x20, 0x26, 0x42, 0x69, 0x62, 0x6c, 0x69, 0x6f, 0x3b, 0x20, 0x2d, 0x2d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x73, 0x65, 0x63, 0x2d, 0x62, 0x69, 0x62, 0x6c, 0x69, 0x6f, 0x67,
+ 0x72, 0x61, 0x70, 0x68, 0x79, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+ 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d,
+ 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x64,
+ 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x4e,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x52, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x49,
+ 0x41, 0x4e, 0x41, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63,
+ 0x68, 0x67, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x41, 0x4e,
+ 0x41, 0x2d, 0x43, 0x48, 0x41, 0x52, 0x53, 0x45, 0x54, 0x53, 0x22, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58,
+ 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30,
+ 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45,
+ 0x35, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x38, 0x5d, 0x3c, 0x2f, 0x6c,
+ 0x6f, 0x63, 0x3e, 0x28, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+ 0x0d, 0x0a, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x4e,
+ 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,
+ 0x72, 0x69, 0x74, 0x79, 0x29, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x4f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c,
+ 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x43,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x53, 0x65, 0x74,
+ 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x0d, 0x0a, 0x65, 0x64, 0x2e, 0x20, 0x4b, 0x65, 0x6c, 0x64, 0x20,
+ 0x53, 0x69, 0x6d, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x20, 0x65, 0x74, 0x20,
+ 0x61, 0x6c, 0x2e, 0x20, 0x53, 0x65, 0x65, 0x20, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x66, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x66, 0x74, 0x70, 0x2e, 0x69, 0x73, 0x69, 0x2e, 0x65, 0x64, 0x75,
+ 0x2f, 0x69, 0x6e, 0x2d, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2f, 0x69, 0x61,
+ 0x6e, 0x61, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x2f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x2d, 0x73, 0x65, 0x74, 0x73, 0x22, 0x3e, 0x66, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x66, 0x74, 0x70, 0x2e, 0x69, 0x73, 0x69, 0x2e, 0x65, 0x64, 0x75,
+ 0x2f, 0x69, 0x6e, 0x2d, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2f, 0x69, 0x61,
+ 0x6e, 0x61, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x2f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x2d, 0x73, 0x65, 0x74, 0x73, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x0d, 0x0a,
+ 0x3e, 0x2e, 0x20, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x52, 0x46,
+ 0x43, 0x31, 0x37, 0x36, 0x36, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63,
+ 0x2f, 0x72, 0x66, 0x63, 0x31, 0x37, 0x36, 0x36, 0x2e, 0x74, 0x78, 0x74,
+ 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x45, 0x54, 0x46, 0x20,
+ 0x52, 0x46, 0x43, 0x20, 0x31, 0x37, 0x36, 0x36, 0x22, 0x3e, 0x49, 0x45,
+ 0x54, 0x46, 0x0d, 0x0a, 0x28, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+ 0x74, 0x20, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e,
+ 0x67, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x46, 0x6f, 0x72, 0x63, 0x65,
+ 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x52, 0x46, 0x43, 0x20, 0x31, 0x37, 0x36, 0x36, 0x3a, 0x20, 0x54,
+ 0x61, 0x67, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75,
+ 0x61, 0x67, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72,
+ 0x65, 0x66, 0x3e, 0x2c, 0x20, 0x65, 0x64, 0x2e, 0x20, 0x48, 0x2e, 0x20,
+ 0x41, 0x6c, 0x76, 0x65, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x2e, 0x20,
+ 0x31, 0x39, 0x39, 0x35, 0x2e, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x49, 0x53, 0x4f, 0x36, 0x33, 0x39, 0x2d, 0x6f, 0x6c, 0x64, 0x22, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x20, 0x6b,
+ 0x65, 0x79, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x20, 0x36, 0x33, 0x39, 0x22,
+ 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x33, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x33, 0x38, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x28, 0x49, 0x6e, 0x74, 0x65, 0x72,
+ 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72, 0x67,
+ 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x49, 0x53, 0x4f, 0x20, 0x36, 0x33,
+ 0x39, 0x3a, 0x31, 0x39, 0x38, 0x38, 0x20, 0x28, 0x45, 0x29, 0x2e, 0x0d,
+ 0x0a, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
+ 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x3e, 0x20, 0x5b, 0x47, 0x65, 0x6e, 0x65, 0x76, 0x61, 0x5d, 0x3a,
+ 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x61, 0x6c, 0x0d, 0x0a, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x74, 0x61,
+ 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2c, 0x20, 0x31, 0x39, 0x38, 0x38, 0x2e, 0x3c, 0x2f, 0x62, 0x69, 0x62,
+ 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x33, 0x31, 0x36, 0x36, 0x2d, 0x6f, 0x6c,
+ 0x64, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c,
+ 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x20, 0x33,
+ 0x31, 0x36, 0x36, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x33, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x33,
+ 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x28, 0x49,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
+ 0x20, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
+ 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x20,
+ 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x49, 0x53,
+ 0x4f, 0x20, 0x33, 0x31, 0x36, 0x36, 0x2d, 0x31, 0x3a, 0x31, 0x39, 0x39,
+ 0x37, 0x0d, 0x0a, 0x28, 0x45, 0x29, 0x2e, 0x20, 0x43, 0x6f, 0x64, 0x65,
+ 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+ 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66,
+ 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x73, 0x75, 0x62,
+ 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x26, 0x6d,
+ 0x64, 0x61, 0x73, 0x68, 0x3b, 0x0d, 0x0a, 0x50, 0x61, 0x72, 0x74, 0x20,
+ 0x31, 0x3a, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x63,
+ 0x6f, 0x64, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72,
+ 0x65, 0x66, 0x3e, 0x20, 0x5b, 0x47, 0x65, 0x6e, 0x65, 0x76, 0x61, 0x5d,
+ 0x3a, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x0d, 0x0a, 0x53, 0x74,
+ 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2c, 0x20, 0x31, 0x39, 0x39, 0x37, 0x2e, 0x3c, 0x2f, 0x62, 0x69,
+ 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x31, 0x30, 0x36, 0x34, 0x36, 0x22,
+ 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45,
+ 0x43, 0x20, 0x31, 0x30, 0x36, 0x34, 0x36, 0x22, 0x3e, 0x49, 0x53, 0x4f,
+ 0x20, 0x28, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x0d, 0x0a, 0x53, 0x74,
+ 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x3e, 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x20, 0x31, 0x30,
+ 0x36, 0x34, 0x36, 0x2d, 0x31, 0x39, 0x39, 0x33, 0x20, 0x28, 0x45, 0x29,
+ 0x2e, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79,
+ 0x20, 0x26, 0x6d, 0x64, 0x61, 0x73, 0x68, 0x3b, 0x0d, 0x0a, 0x55, 0x6e,
+ 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x20, 0x4d, 0x75, 0x6c, 0x74,
+ 0x69, 0x70, 0x6c, 0x65, 0x2d, 0x4f, 0x63, 0x74, 0x65, 0x74, 0x20, 0x43,
+ 0x6f, 0x64, 0x65, 0x64, 0x20, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x53, 0x65, 0x74, 0x20, 0x28, 0x55, 0x43, 0x53, 0x29,
+ 0x20, 0x26, 0x6d, 0x64, 0x61, 0x73, 0x68, 0x3b, 0x20, 0x50, 0x61, 0x72,
+ 0x74, 0x20, 0x31, 0x3a, 0x20, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65,
+ 0x63, 0x74, 0x75, 0x72, 0x65, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x42,
+ 0x61, 0x73, 0x69, 0x63, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69,
+ 0x6e, 0x67, 0x75, 0x61, 0x6c, 0x20, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x2e,
+ 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x20,
+ 0x5b, 0x47, 0x65, 0x6e, 0x65, 0x76, 0x61, 0x5d, 0x3a, 0x20, 0x49, 0x6e,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20,
+ 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
+ 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31,
+ 0x39, 0x39, 0x33, 0x20, 0x28, 0x70, 0x6c, 0x75, 0x73, 0x20, 0x61, 0x6d,
+ 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x41, 0x4d, 0x20,
+ 0x31, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x41, 0x4d,
+ 0x20, 0x37, 0x29, 0x2e, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x49,
+ 0x53, 0x4f, 0x31, 0x30, 0x36, 0x34, 0x36, 0x2d, 0x32, 0x30, 0x30, 0x30,
+ 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22,
+ 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45,
+ 0x43, 0x20, 0x31, 0x30, 0x36, 0x34, 0x36, 0x2d, 0x32, 0x30, 0x30, 0x30,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x36, 0x37, 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x37, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x20, 0x49, 0x53, 0x4f, 0x20, 0x28,
+ 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+ 0x6c, 0x0d, 0x0a, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e,
+ 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29,
+ 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x20, 0x31, 0x30, 0x36, 0x34,
+ 0x36, 0x2d, 0x31, 0x3a, 0x32, 0x30, 0x30, 0x30, 0x2e, 0x20, 0x49, 0x6e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x74,
+ 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x20, 0x26, 0x6d,
+ 0x64, 0x61, 0x73, 0x68, 0x3b, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72,
+ 0x73, 0x61, 0x6c, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65,
+ 0x2d, 0x4f, 0x63, 0x74, 0x65, 0x74, 0x20, 0x43, 0x6f, 0x64, 0x65, 0x64,
+ 0x20, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x53,
+ 0x65, 0x74, 0x20, 0x28, 0x55, 0x43, 0x53, 0x29, 0x20, 0x26, 0x6d, 0x64,
+ 0x61, 0x73, 0x68, 0x3b, 0x0d, 0x0a, 0x50, 0x61, 0x72, 0x74, 0x20, 0x31,
+ 0x3a, 0x20, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75,
+ 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x61, 0x73, 0x69, 0x63,
+ 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x75, 0x61,
+ 0x6c, 0x20, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x3c, 0x2f, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x5b, 0x47, 0x65, 0x6e,
+ 0x65, 0x76, 0x61, 0x5d, 0x3a, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x4f, 0x72, 0x67,
+ 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x32, 0x30, 0x30, 0x30, 0x2e,
+ 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69,
+ 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x55, 0x6e, 0x69, 0x63, 0x6f,
+ 0x64, 0x65, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x55, 0x6e, 0x69,
+ 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x55, 0x6e,
+ 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x72,
+ 0x74, 0x69, 0x75, 0x6d, 0x2e, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e,
+ 0x54, 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x0d,
+ 0x0a, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x2c, 0x20, 0x56,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x30, 0x2e, 0x3c,
+ 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20, 0x52, 0x65, 0x61, 0x64, 0x69,
+ 0x6e, 0x67, 0x2c, 0x20, 0x4d, 0x61, 0x73, 0x73, 0x2e, 0x3a, 0x20, 0x41,
+ 0x64, 0x64, 0x69, 0x73, 0x6f, 0x6e, 0x2d, 0x57, 0x65, 0x73, 0x6c, 0x65,
+ 0x79, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73,
+ 0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x0d, 0x0a, 0x31, 0x39, 0x39,
+ 0x36, 0x2e, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x55, 0x6e, 0x69,
+ 0x63, 0x6f, 0x64, 0x65, 0x33, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x61, 0x64, 0x64, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x55,
+ 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x33, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x37, 0x22,
+ 0x3e, 0x5b, 0x45, 0x36, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x0d, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64,
+ 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x75, 0x6d,
+ 0x2e, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x54, 0x68, 0x65, 0x20,
+ 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e,
+ 0x64, 0x61, 0x72, 0x64, 0x2c, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x20, 0x33, 0x2e, 0x30, 0x2e, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68,
+ 0x3e, 0x20, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x0d, 0x0a,
+ 0x4d, 0x61, 0x73, 0x73, 0x2e, 0x3a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x73,
+ 0x6f, 0x6e, 0x2d, 0x57, 0x65, 0x73, 0x6c, 0x65, 0x79, 0x20, 0x44, 0x65,
+ 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x20, 0x50, 0x72, 0x65,
+ 0x73, 0x73, 0x2c, 0x20, 0x32, 0x30, 0x30, 0x30, 0x2e, 0x20, 0x49, 0x53,
+ 0x42, 0x4e, 0x20, 0x30, 0x2d, 0x32, 0x30, 0x31, 0x2d, 0x36, 0x31, 0x36,
+ 0x33, 0x33, 0x2d, 0x35, 0x2e, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x62, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x0d, 0x0a, 0x49, 0x44, 0x20, 0x6d, 0x61,
+ 0x64, 0x65, 0x20, 0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x74, 0x6f,
+ 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x69, 0x74, 0x73, 0x20, 0x70,
+ 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x69, 0x72,
+ 0x73, 0x74, 0x0d, 0x0a, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b,
+ 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x6f, 0x64, 0x64, 0x2c, 0x20, 0x62,
+ 0x75, 0x74, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x27,
+ 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x79, 0x6c,
+ 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x20, 0x0d, 0x0a, 0x63, 0x75, 0x72,
+ 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x64, 0x64, 0x20,
+ 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x62, 0x61, 0x63,
+ 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x0d, 0x0a, 0x69, 0x6e, 0x63, 0x6f,
+ 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20,
+ 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6d,
+ 0x61, 0x64, 0x65, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2e, 0x0d,
+ 0x0a, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x4f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x62, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x62,
+ 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x41, 0x68, 0x6f, 0x22,
+ 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x41, 0x68, 0x6f, 0x2f, 0x55, 0x6c,
+ 0x6c, 0x6d, 0x61, 0x6e, 0x22, 0x3e, 0x41, 0x68, 0x6f, 0x2c, 0x20, 0x41,
+ 0x6c, 0x66, 0x72, 0x65, 0x64, 0x20, 0x56, 0x2e, 0x2c, 0x20, 0x52, 0x61,
+ 0x76, 0x69, 0x20, 0x53, 0x65, 0x74, 0x68, 0x69, 0x2c, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x4a, 0x65, 0x66, 0x66, 0x72, 0x65, 0x79, 0x20, 0x44, 0x2e,
+ 0x0d, 0x0a, 0x55, 0x6c, 0x6c, 0x6d, 0x61, 0x6e, 0x2e, 0x20, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x43, 0x6f, 0x6d, 0x70,
+ 0x69, 0x6c, 0x65, 0x72, 0x73, 0x3a, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x63,
+ 0x69, 0x70, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e,
+ 0x69, 0x71, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54,
+ 0x6f, 0x6f, 0x6c, 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72,
+ 0x65, 0x66, 0x3e, 0x2e, 0x0d, 0x0a, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e,
+ 0x67, 0x3a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x73, 0x6f, 0x6e, 0x2d, 0x57,
+ 0x65, 0x73, 0x6c, 0x65, 0x79, 0x2c, 0x20, 0x31, 0x39, 0x38, 0x36, 0x2c,
+ 0x20, 0x72, 0x70, 0x74, 0x2e, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x2e, 0x20,
+ 0x31, 0x39, 0x38, 0x38, 0x2e, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x42, 0x65, 0x72, 0x6e, 0x65, 0x72, 0x73, 0x2d, 0x4c, 0x65, 0x65, 0x22,
+ 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x42, 0x65, 0x72, 0x6e, 0x65, 0x72,
+ 0x73, 0x2d, 0x4c, 0x65, 0x65, 0x20, 0x65, 0x74, 0x20, 0x61, 0x6c, 0x2e,
+ 0x22, 0x3e, 0x20, 0x42, 0x65, 0x72, 0x6e, 0x65, 0x72, 0x73, 0x2d, 0x4c,
+ 0x65, 0x65, 0x2c, 0x20, 0x54, 0x2e, 0x2c, 0x20, 0x52, 0x2e, 0x20, 0x46,
+ 0x69, 0x65, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x0d, 0x0a, 0x61, 0x6e,
+ 0x64, 0x20, 0x4c, 0x2e, 0x20, 0x4d, 0x61, 0x73, 0x69, 0x6e, 0x74, 0x65,
+ 0x72, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x52, 0x65, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69,
+ 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x28, 0x55, 0x52, 0x49, 0x29, 0x3a,
+ 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x20, 0x53, 0x79, 0x6e,
+ 0x74, 0x61, 0x78, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x6d,
+ 0x61, 0x6e, 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x20, 0x31, 0x39, 0x39, 0x37, 0x2e,
+ 0x20, 0x28, 0x57, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72,
+ 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x3b, 0x20, 0x73, 0x65, 0x65, 0x20,
+ 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x52,
+ 0x46, 0x43, 0x31, 0x37, 0x33, 0x38, 0x2e, 0x29, 0x3c, 0x2f, 0x62, 0x69,
+ 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x41, 0x42, 0x4b, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22,
+ 0x42, 0x72, 0xfc, 0x67, 0x67, 0x65, 0x6d, 0x61, 0x6e, 0x6e, 0x2d, 0x4b,
+ 0x6c, 0x65, 0x69, 0x6e, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x32, 0x22, 0x3e, 0x5b, 0x45, 0x32,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x42, 0x72, 0xfc, 0x67, 0x67,
+ 0x65, 0x6d, 0x61, 0x6e, 0x6e, 0x2d, 0x4b, 0x6c, 0x65, 0x69, 0x6e, 0x2c,
+ 0x0d, 0x0a, 0x41, 0x6e, 0x6e, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x6d,
+ 0x61, 0x6c, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x69, 0x6e,
+ 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72,
+ 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x48, 0x61,
+ 0x62, 0x69, 0x6c, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73,
+ 0x63, 0x68, 0x72, 0x69, 0x66, 0x74, 0x2e, 0x20, 0x46, 0x61, 0x63, 0x75,
+ 0x6c, 0x74, 0x79, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x4d, 0x61, 0x74, 0x68,
+ 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x73, 0x20, 0x61, 0x74, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74,
+ 0x79, 0x20, 0x6f, 0x66, 0x20, 0x46, 0x72, 0x65, 0x69, 0x62, 0x75, 0x72,
+ 0x67, 0x2c, 0x20, 0x31, 0x39, 0x39, 0x33, 0x2e, 0x20, 0x28, 0x53, 0x65,
+ 0x65, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x66, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x74, 0x70, 0x2e, 0x69,
+ 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6b, 0x2e, 0x75, 0x6e,
+ 0x69, 0x2d, 0x66, 0x72, 0x65, 0x69, 0x62, 0x75, 0x72, 0x67, 0x2e, 0x64,
+ 0x65, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f,
+ 0x70, 0x61, 0x70, 0x65, 0x72, 0x73, 0x2f, 0x62, 0x72, 0x75, 0x65, 0x67,
+ 0x67, 0x65, 0x6d, 0x2f, 0x68, 0x61, 0x62, 0x69, 0x6c, 0x2e, 0x70, 0x73,
+ 0x22, 0x3e, 0x66, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x74, 0x70, 0x2e,
+ 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6b, 0x2e, 0x75,
+ 0x6e, 0x69, 0x2d, 0x66, 0x72, 0x65, 0x69, 0x62, 0x75, 0x72, 0x67, 0x2e,
+ 0x64, 0x65, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+ 0x2f, 0x70, 0x61, 0x70, 0x65, 0x72, 0x73, 0x2f, 0x62, 0x72, 0x75, 0x65,
+ 0x67, 0x67, 0x65, 0x6d, 0x2f, 0x68, 0x61, 0x62, 0x69, 0x6c, 0x2e, 0x70,
+ 0x73, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x3e, 0x2e, 0x29, 0x3c,
+ 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62,
+ 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x41, 0x42, 0x4b, 0x44, 0x57, 0x22,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x20,
+ 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x42, 0x72, 0xfc, 0x67, 0x67, 0x65, 0x6d,
+ 0x61, 0x6e, 0x6e, 0x2d, 0x4b, 0x6c, 0x65, 0x69, 0x6e, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x57, 0x6f, 0x6f, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x32, 0x22, 0x3e,
+ 0x5b, 0x45, 0x32, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x42, 0x72,
+ 0xfc, 0x67, 0x67, 0x65, 0x6d, 0x61, 0x6e, 0x6e, 0x2d, 0x4b, 0x6c, 0x65,
+ 0x69, 0x6e, 0x2c, 0x0d, 0x0a, 0x41, 0x6e, 0x6e, 0x65, 0x2c, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x44, 0x65, 0x72, 0x69, 0x63, 0x6b, 0x20, 0x57, 0x6f,
+ 0x6f, 0x64, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x3e, 0x44, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73,
+ 0x74, 0x69, 0x63, 0x20, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20,
+ 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x3c, 0x2f, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x0d, 0x0a, 0x55,
+ 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0xe4, 0x74, 0x20, 0x46,
+ 0x72, 0x65, 0x69, 0x62, 0x75, 0x72, 0x67, 0x2c, 0x20, 0x49, 0x6e, 0x73,
+ 0x74, 0x69, 0x74, 0x75, 0x74, 0x20, 0x66, 0xfc, 0x72, 0x20, 0x49, 0x6e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6b, 0x2c, 0x20, 0x42, 0x65,
+ 0x72, 0x69, 0x63, 0x68, 0x74, 0x20, 0x33, 0x38, 0x2c, 0x20, 0x4f, 0x6b,
+ 0x74, 0x6f, 0x62, 0x65, 0x72, 0x20, 0x31, 0x39, 0x39, 0x31, 0x2e, 0x20,
+ 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x0d, 0x0a, 0x61, 0x62,
+ 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x41, 0x2e,
+ 0x20, 0x46, 0x69, 0x6e, 0x6b, 0x65, 0x6c, 0x2c, 0x20, 0x4d, 0x2e, 0x20,
+ 0x4a, 0x61, 0x6e, 0x74, 0x7a, 0x65, 0x6e, 0x2c, 0x20, 0x48, 0x72, 0x73,
+ 0x67, 0x2e, 0x2c, 0x20, 0x53, 0x54, 0x41, 0x43, 0x53, 0x20, 0x31, 0x39,
+ 0x39, 0x32, 0x2c, 0x20, 0x53, 0x2e, 0x20, 0x31, 0x37, 0x33, 0x2d, 0x31,
+ 0x38, 0x34, 0x2e, 0x20, 0x53, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x65, 0x72,
+ 0x2d, 0x56, 0x65, 0x72, 0x6c, 0x61, 0x67, 0x2c, 0x0d, 0x0a, 0x42, 0x65,
+ 0x72, 0x6c, 0x69, 0x6e, 0x20, 0x31, 0x39, 0x39, 0x32, 0x2e, 0x20, 0x4c,
+ 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72,
+ 0x20, 0x53, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x35, 0x37, 0x37,
+ 0x2e, 0x20, 0x46, 0x75, 0x6c, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x64, 0x20, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x4f, 0x6e, 0x65, 0x2d,
+ 0x55, 0x6e, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x6f, 0x75, 0x73, 0x0d,
+ 0x0a, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x4c, 0x61, 0x6e,
+ 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x6e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x31, 0x34, 0x30, 0x20, 0x28, 0x32, 0x29, 0x3a, 0x20, 0x32, 0x32,
+ 0x39, 0x2d, 0x32, 0x35, 0x33, 0x2c, 0x0d, 0x0a, 0x46, 0x65, 0x62, 0x72,
+ 0x75, 0x61, 0x72, 0x79, 0x20, 0x31, 0x39, 0x39, 0x38, 0x2e, 0x3c, 0x2f,
+ 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x43, 0x6c, 0x61, 0x72, 0x6b, 0x22, 0x20,
+ 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x43, 0x6c, 0x61, 0x72, 0x6b, 0x22, 0x3e,
+ 0x4a, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x43, 0x6c, 0x61, 0x72, 0x6b, 0x2e,
+ 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x20,
+ 0x6f, 0x66, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x58, 0x4d, 0x4c, 0x2e, 0x20, 0x53, 0x65, 0x65, 0x20, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x4e, 0x4f, 0x54, 0x45, 0x2d, 0x73,
+ 0x67, 0x6d, 0x6c, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x39, 0x37, 0x31, 0x32,
+ 0x31, 0x35, 0x22, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52,
+ 0x2f, 0x4e, 0x4f, 0x54, 0x45, 0x2d, 0x73, 0x67, 0x6d, 0x6c, 0x2d, 0x78,
+ 0x6d, 0x6c, 0x2d, 0x39, 0x37, 0x31, 0x32, 0x31, 0x35, 0x3c, 0x2f, 0x6c,
+ 0x6f, 0x63, 0x3e, 0x2e, 0x20, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x49, 0x41, 0x4e, 0x41, 0x2d, 0x4c, 0x41, 0x4e, 0x47, 0x43, 0x4f, 0x44,
+ 0x45, 0x53, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64,
+ 0x64, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x73, 0x69, 0x2e,
+ 0x65, 0x64, 0x75, 0x2f, 0x69, 0x6e, 0x2d, 0x6e, 0x6f, 0x74, 0x65, 0x73,
+ 0x2f, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e,
+ 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
+ 0x67, 0x65, 0x73, 0x2f, 0x22, 0x0d, 0x0a, 0x6b, 0x65, 0x79, 0x3d, 0x22,
+ 0x49, 0x41, 0x4e, 0x41, 0x2d, 0x4c, 0x41, 0x4e, 0x47, 0x43, 0x4f, 0x44,
+ 0x45, 0x53, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65,
+ 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x35, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x35, 0x38,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x28, 0x49, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x65, 0x74, 0x0d, 0x0a, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e,
+ 0x65, 0x64, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x41,
+ 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x29, 0x20, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x52, 0x65, 0x67, 0x69,
+ 0x73, 0x74, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0x61, 0x6e, 0x67,
+ 0x75, 0x61, 0x67, 0x65, 0x20, 0x54, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x0d, 0x0a, 0x65,
+ 0x64, 0x2e, 0x20, 0x4b, 0x65, 0x6c, 0x64, 0x20, 0x53, 0x69, 0x6d, 0x6f,
+ 0x6e, 0x73, 0x65, 0x6e, 0x20, 0x65, 0x74, 0x20, 0x61, 0x6c, 0x2e, 0x3c,
+ 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62,
+ 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x52, 0x46, 0x43, 0x31, 0x37, 0x33,
+ 0x38, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, 0x31,
+ 0x37, 0x33, 0x38, 0x2e, 0x74, 0x78, 0x74, 0x22, 0x20, 0x6b, 0x65, 0x79,
+ 0x3d, 0x22, 0x49, 0x45, 0x54, 0x46, 0x20, 0x52, 0x46, 0x43, 0x31, 0x37,
+ 0x33, 0x38, 0x22, 0x3e, 0x49, 0x45, 0x54, 0x46, 0x0d, 0x0a, 0x28, 0x49,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x45, 0x6e, 0x67, 0x69,
+ 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x54, 0x61, 0x73, 0x6b,
+ 0x20, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x52, 0x46, 0x43, 0x20, 0x31,
+ 0x37, 0x33, 0x38, 0x3a, 0x20, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d,
+ 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4c, 0x6f,
+ 0x63, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x0d, 0x0a, 0x28, 0x55, 0x52, 0x4c,
+ 0x29, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x20, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x2e, 0x20, 0x42, 0x65, 0x72,
+ 0x6e, 0x65, 0x72, 0x73, 0x2d, 0x4c, 0x65, 0x65, 0x2c, 0x20, 0x4c, 0x2e,
+ 0x20, 0x4d, 0x61, 0x73, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x4d,
+ 0x2e, 0x20, 0x4d, 0x63, 0x43, 0x61, 0x68, 0x69, 0x6c, 0x6c, 0x2e, 0x20,
+ 0x31, 0x39, 0x39, 0x34, 0x2e, 0x20, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x52, 0x46, 0x43, 0x31, 0x38, 0x30, 0x38, 0x22, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72,
+ 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, 0x31, 0x38, 0x30, 0x38, 0x2e, 0x74,
+ 0x78, 0x74, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x45, 0x54,
+ 0x46, 0x20, 0x52, 0x46, 0x43, 0x31, 0x38, 0x30, 0x38, 0x22, 0x3e, 0x49,
+ 0x45, 0x54, 0x46, 0x0d, 0x0a, 0x28, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x65, 0x74, 0x20, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69,
+ 0x6e, 0x67, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x46, 0x6f, 0x72, 0x63,
+ 0x65, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65,
+ 0x66, 0x3e, 0x52, 0x46, 0x43, 0x20, 0x31, 0x38, 0x30, 0x38, 0x3a, 0x20,
+ 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x55, 0x6e, 0x69,
+ 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x0d, 0x0a, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x3c,
+ 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x2c, 0x20,
+ 0x65, 0x64, 0x2e, 0x20, 0x52, 0x2e, 0x20, 0x46, 0x69, 0x65, 0x6c, 0x64,
+ 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x31, 0x39, 0x39, 0x35, 0x2e, 0x20, 0x3c,
+ 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62,
+ 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x52, 0x46, 0x43, 0x32, 0x31, 0x34,
+ 0x31, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63,
+ 0x32, 0x31, 0x34, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x22, 0x20, 0x6b, 0x65,
+ 0x79, 0x3d, 0x22, 0x49, 0x45, 0x54, 0x46, 0x20, 0x52, 0x46, 0x43, 0x32,
+ 0x31, 0x34, 0x31, 0x22, 0x3e, 0x49, 0x45, 0x54, 0x46, 0x0d, 0x0a, 0x28,
+ 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x45, 0x6e, 0x67,
+ 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x54, 0x61, 0x73,
+ 0x6b, 0x20, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x29, 0x2e, 0x20, 0x3c, 0x65,
+ 0x6d, 0x70, 0x68, 0x3e, 0x52, 0x46, 0x43, 0x20, 0x32, 0x31, 0x34, 0x31,
+ 0x3a, 0x20, 0x55, 0x52, 0x4e, 0x20, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78,
+ 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x2c, 0x20, 0x65, 0x64, 0x2e,
+ 0x0d, 0x0a, 0x52, 0x2e, 0x20, 0x4d, 0x6f, 0x61, 0x74, 0x73, 0x2e, 0x20,
+ 0x31, 0x39, 0x39, 0x37, 0x2e, 0x20, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x72, 0x66, 0x63, 0x32, 0x32, 0x37, 0x39, 0x22, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72,
+ 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, 0x32, 0x32, 0x37, 0x39, 0x2e, 0x74,
+ 0x78, 0x74, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x45, 0x54,
+ 0x46, 0x20, 0x52, 0x46, 0x43, 0x20, 0x32, 0x32, 0x37, 0x39, 0x22, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x37, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x37, 0x38, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x49, 0x45, 0x54, 0x46, 0x0d, 0x0a, 0x28, 0x49,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x45, 0x6e, 0x67, 0x69,
+ 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x54, 0x61, 0x73, 0x6b,
+ 0x20, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x52, 0x46, 0x43, 0x20, 0x32,
+ 0x32, 0x37, 0x39, 0x3a, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x2c, 0x20,
+ 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x20, 0x6f, 0x66, 0x20, 0x49, 0x53, 0x4f, 0x20, 0x31, 0x30, 0x36, 0x34,
+ 0x36, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x2c, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x65, 0x64, 0x2e,
+ 0x20, 0x46, 0x2e, 0x20, 0x59, 0x65, 0x72, 0x67, 0x65, 0x61, 0x75, 0x2c,
+ 0x20, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x31, 0x39,
+ 0x39, 0x38, 0x2e, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x72, 0x66,
+ 0x63, 0x32, 0x33, 0x37, 0x36, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x61, 0x64, 0x64, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69,
+ 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f,
+ 0x72, 0x66, 0x63, 0x32, 0x33, 0x37, 0x36, 0x2e, 0x74, 0x78, 0x74, 0x22,
+ 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x45, 0x54, 0x46, 0x20, 0x52,
+ 0x46, 0x43, 0x20, 0x32, 0x33, 0x37, 0x36, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x34, 0x38,
+ 0x22, 0x3e, 0x5b, 0x45, 0x34, 0x38, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x49, 0x45, 0x54, 0x46, 0x0d, 0x0a, 0x28, 0x49, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x65, 0x74, 0x20, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65,
+ 0x72, 0x69, 0x6e, 0x67, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x46, 0x6f,
+ 0x72, 0x63, 0x65, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x52, 0x46, 0x43, 0x20, 0x32, 0x33, 0x37, 0x36,
+ 0x3a, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x20,
+ 0x54, 0x79, 0x70, 0x65, 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x0d, 0x0a, 0x65, 0x64, 0x2e, 0x20, 0x45,
+ 0x2e, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0x68, 0x65, 0x61, 0x64, 0x2c,
+ 0x20, 0x4d, 0x2e, 0x20, 0x4d, 0x75, 0x72, 0x61, 0x74, 0x61, 0x2e, 0x20,
+ 0x31, 0x39, 0x39, 0x38, 0x2e, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x72, 0x66, 0x63, 0x32, 0x33, 0x39, 0x36, 0x22, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66,
+ 0x63, 0x2f, 0x72, 0x66, 0x63, 0x32, 0x33, 0x39, 0x36, 0x2e, 0x74, 0x78,
+ 0x74, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x45, 0x54, 0x46,
+ 0x20, 0x52, 0x46, 0x43, 0x20, 0x32, 0x33, 0x39, 0x36, 0x22, 0x3e, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58,
+ 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30,
+ 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45,
+ 0x36, 0x36, 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x36, 0x5d, 0x3c, 0x2f, 0x6c,
+ 0x6f, 0x63, 0x3e, 0x49, 0x45, 0x54, 0x46, 0x0d, 0x0a, 0x28, 0x49, 0x6e,
+ 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x45, 0x6e, 0x67, 0x69, 0x6e,
+ 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20,
+ 0x46, 0x6f, 0x72, 0x63, 0x65, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x52, 0x46, 0x43, 0x20, 0x32, 0x33,
+ 0x39, 0x36, 0x3a, 0x20, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20,
+ 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x49, 0x64, 0x65,
+ 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x28, 0x55,
+ 0x52, 0x49, 0x29, 0x3a, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63,
+ 0x20, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x3c, 0x2f, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x2e, 0x20, 0x54, 0x2e, 0x20, 0x42,
+ 0x65, 0x72, 0x6e, 0x65, 0x72, 0x73, 0x2d, 0x4c, 0x65, 0x65, 0x2c, 0x20,
+ 0x52, 0x2e, 0x20, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2c,
+ 0x20, 0x4c, 0x2e, 0x20, 0x4d, 0x61, 0x73, 0x69, 0x6e, 0x74, 0x65, 0x72,
+ 0x2e, 0x0d, 0x0a, 0x31, 0x39, 0x39, 0x38, 0x2e, 0x3c, 0x2f, 0x62, 0x69,
+ 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x72, 0x66, 0x63, 0x32, 0x37, 0x33, 0x32, 0x22, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x20, 0x68,
+ 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x72, 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, 0x32, 0x37, 0x33, 0x32,
+ 0x2e, 0x74, 0x78, 0x74, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49,
+ 0x45, 0x54, 0x46, 0x20, 0x52, 0x46, 0x43, 0x20, 0x32, 0x37, 0x33, 0x32,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x36, 0x36, 0x22, 0x3e, 0x5b, 0x45, 0x36, 0x36, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x49, 0x45, 0x54, 0x46, 0x0d, 0x0a,
+ 0x28, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x45, 0x6e,
+ 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x54, 0x61,
+ 0x73, 0x6b, 0x20, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x29, 0x2e, 0x20, 0x3c,
+ 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x52, 0x46, 0x43,
+ 0x20, 0x32, 0x37, 0x33, 0x32, 0x3a, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61,
+ 0x6c, 0x0d, 0x0a, 0x49, 0x50, 0x76, 0x36, 0x20, 0x41, 0x64, 0x64, 0x72,
+ 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x55, 0x52, 0x4c,
+ 0x27, 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x2e, 0x20, 0x52, 0x2e, 0x20, 0x48, 0x69, 0x6e, 0x64, 0x65, 0x6e,
+ 0x2c, 0x20, 0x42, 0x2e, 0x20, 0x43, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x2c, 0x20, 0x4c, 0x2e, 0x20, 0x4d, 0x61, 0x73, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x2e, 0x0d, 0x0a, 0x31, 0x39, 0x39, 0x39, 0x2e, 0x3c,
+ 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62,
+ 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x72, 0x66, 0x63, 0x32, 0x37, 0x38,
+ 0x31, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, 0x32,
+ 0x37, 0x38, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x22, 0x20, 0x6b, 0x65, 0x79,
+ 0x3d, 0x22, 0x49, 0x45, 0x54, 0x46, 0x20, 0x52, 0x46, 0x43, 0x20, 0x32,
+ 0x37, 0x38, 0x31, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x37, 0x37, 0x22, 0x3e, 0x5b, 0x45,
+ 0x37, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x49,
+ 0x45, 0x54, 0x46, 0x20, 0x28, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
+ 0x74, 0x20, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e,
+ 0x67, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x46, 0x6f, 0x72, 0x63, 0x65,
+ 0x29, 0x2e, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x52, 0x46, 0x43,
+ 0x20, 0x32, 0x37, 0x38, 0x31, 0x3a, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x31,
+ 0x36, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69,
+ 0x6e, 0x67, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x49, 0x53, 0x4f, 0x20, 0x31,
+ 0x30, 0x36, 0x34, 0x36, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x2c,
+ 0x20, 0x65, 0x64, 0x2e, 0x20, 0x50, 0x2e, 0x20, 0x48, 0x6f, 0x66, 0x66,
+ 0x6d, 0x61, 0x6e, 0x2c, 0x20, 0x46, 0x2e, 0x20, 0x59, 0x65, 0x72, 0x67,
+ 0x65, 0x61, 0x75, 0x2e, 0x20, 0x32, 0x30, 0x30, 0x30, 0x2e, 0x3c, 0x2f,
+ 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x36, 0x33, 0x39, 0x22,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x20,
+ 0x6b, 0x65, 0x79, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x20, 0x36, 0x33, 0x39,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x33, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x33, 0x38, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x28, 0x49, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72,
+ 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69,
+ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x49, 0x53, 0x4f, 0x20, 0x36,
+ 0x33, 0x39, 0x3a, 0x31, 0x39, 0x38, 0x38, 0x20, 0x28, 0x45, 0x29, 0x2e,
+ 0x0d, 0x0a, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
+ 0x67, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72,
+ 0x65, 0x66, 0x3e, 0x20, 0x5b, 0x47, 0x65, 0x6e, 0x65, 0x76, 0x61, 0x5d,
+ 0x3a, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x74,
+ 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2c, 0x20, 0x31, 0x39, 0x38, 0x38, 0x2e, 0x3c, 0x2f, 0x62, 0x69,
+ 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x33, 0x31, 0x36, 0x36, 0x22, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x20, 0x6b,
+ 0x65, 0x79, 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x20, 0x33, 0x31, 0x36, 0x36,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x33, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x33, 0x38, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x28, 0x49, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72,
+ 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69,
+ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69,
+ 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x49, 0x53, 0x4f, 0x20, 0x33,
+ 0x31, 0x36, 0x36, 0x2d, 0x31, 0x3a, 0x31, 0x39, 0x39, 0x37, 0x0d, 0x0a,
+ 0x28, 0x45, 0x29, 0x2e, 0x20, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65,
+ 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x73, 0x75, 0x62, 0x64, 0x69, 0x76,
+ 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x26, 0x6d, 0x64, 0x61, 0x73,
+ 0x68, 0x3b, 0x0d, 0x0a, 0x50, 0x61, 0x72, 0x74, 0x20, 0x31, 0x3a, 0x20,
+ 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x63, 0x6f, 0x64, 0x65,
+ 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e,
+ 0x20, 0x5b, 0x47, 0x65, 0x6e, 0x65, 0x76, 0x61, 0x5d, 0x3a, 0x20, 0x49,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
+ 0x20, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x0d, 0x0a, 0x53, 0x74, 0x61, 0x6e, 0x64,
+ 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20,
+ 0x31, 0x39, 0x39, 0x37, 0x2e, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x49, 0x53, 0x4f, 0x38, 0x38, 0x37, 0x39, 0x22, 0x20, 0x6b, 0x65, 0x79,
+ 0x3d, 0x22, 0x49, 0x53, 0x4f, 0x20, 0x38, 0x38, 0x37, 0x39, 0x22, 0x3e,
+ 0x49, 0x53, 0x4f, 0x20, 0x28, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72, 0x67, 0x61, 0x6e,
+ 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x72, 0x65, 0x66, 0x3e, 0x49, 0x53, 0x4f, 0x0d, 0x0a, 0x38, 0x38, 0x37,
+ 0x39, 0x3a, 0x31, 0x39, 0x38, 0x36, 0x28, 0x45, 0x29, 0x2e, 0x20, 0x49,
+ 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x26, 0x6d,
+ 0x64, 0x61, 0x73, 0x68, 0x3b, 0x20, 0x54, 0x65, 0x78, 0x74, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x4f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x20, 0x53, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x26, 0x6d, 0x64, 0x61, 0x73, 0x68,
+ 0x3b, 0x0d, 0x0a, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
+ 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20,
+ 0x4d, 0x61, 0x72, 0x6b, 0x75, 0x70, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75,
+ 0x61, 0x67, 0x65, 0x20, 0x28, 0x53, 0x47, 0x4d, 0x4c, 0x29, 0x2e, 0x3c,
+ 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x46,
+ 0x69, 0x72, 0x73, 0x74, 0x20, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x26, 0x6d, 0x64, 0x61, 0x73, 0x68, 0x3b, 0x0d, 0x0a, 0x31, 0x39,
+ 0x38, 0x36, 0x2d, 0x31, 0x30, 0x2d, 0x31, 0x35, 0x2e, 0x20, 0x5b, 0x47,
+ 0x65, 0x6e, 0x65, 0x76, 0x61, 0x5d, 0x3a, 0x20, 0x49, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72,
+ 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69,
+ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x39, 0x38, 0x36,
+ 0x2e, 0x20, 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x62, 0x69, 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x49, 0x53, 0x4f,
+ 0x31, 0x30, 0x37, 0x34, 0x34, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x22,
+ 0x49, 0x53, 0x4f, 0x2f, 0x49, 0x45, 0x43, 0x20, 0x31, 0x30, 0x37, 0x34,
+ 0x34, 0x22, 0x3e, 0x49, 0x53, 0x4f, 0x20, 0x28, 0x49, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72,
+ 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,
+ 0x6f, 0x72, 0x0d, 0x0a, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+ 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x20, 0x3c, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x49, 0x53, 0x4f, 0x2f,
+ 0x49, 0x45, 0x43, 0x20, 0x31, 0x30, 0x37, 0x34, 0x34, 0x2d, 0x31, 0x39,
+ 0x39, 0x32, 0x20, 0x28, 0x45, 0x29, 0x2e, 0x20, 0x49, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x65, 0x63, 0x68,
+ 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x20, 0x26, 0x6d, 0x64, 0x61, 0x73,
+ 0x68, 0x3b, 0x0d, 0x0a, 0x48, 0x79, 0x70, 0x65, 0x72, 0x6d, 0x65, 0x64,
+ 0x69, 0x61, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x2d, 0x62, 0x61, 0x73, 0x65,
+ 0x64, 0x20, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e,
+ 0x67, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x28,
+ 0x48, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x29, 0x2e, 0x20, 0x3c, 0x2f, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x20, 0x5b, 0x47, 0x65,
+ 0x6e, 0x65, 0x76, 0x61, 0x5d, 0x3a, 0x0d, 0x0a, 0x49, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72,
+ 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69,
+ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x39, 0x39, 0x32,
+ 0x2e, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x45, 0x78, 0x74, 0x65,
+ 0x6e, 0x64, 0x65, 0x64, 0x20, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x0d, 0x0a, 0x41, 0x6e, 0x6e, 0x65, 0x78, 0x65, 0x2e,
+ 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x20, 0x5b, 0x47, 0x65, 0x6e,
+ 0x65, 0x76, 0x61, 0x5d, 0x3a, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72, 0x67, 0x61,
+ 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x39, 0x39, 0x36, 0x2e, 0x20,
+ 0x3c, 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69,
+ 0x62, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x77, 0x65, 0x62, 0x73, 0x67,
+ 0x6d, 0x6c, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64,
+ 0x64, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x67, 0x6d, 0x6c,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x38,
+ 0x38, 0x37, 0x39, 0x72, 0x65, 0x76, 0x2f, 0x6e, 0x30, 0x30, 0x32, 0x39,
+ 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x0d, 0x0a, 0x6b, 0x65, 0x79, 0x3d, 0x22,
+ 0x57, 0x45, 0x42, 0x53, 0x47, 0x4d, 0x4c, 0x22, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x34, 0x33, 0x22,
+ 0x3e, 0x5b, 0x45, 0x34, 0x33, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e,
+ 0x49, 0x53, 0x4f, 0x0d, 0x0a, 0x28, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72, 0x67, 0x61,
+ 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2e, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x72, 0x65, 0x66, 0x3e, 0x49, 0x53, 0x4f, 0x20, 0x38, 0x38, 0x37,
+ 0x39, 0x3a, 0x31, 0x39, 0x38, 0x36, 0x0d, 0x0a, 0x54, 0x43, 0x32, 0x2e,
+ 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x20,
+ 0x26, 0x6d, 0x64, 0x61, 0x73, 0x68, 0x3b, 0x20, 0x44, 0x6f, 0x63, 0x75,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x50, 0x72, 0x6f,
+ 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x61, 0x6e, 0x67,
+ 0x75, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x20, 0x3c, 0x2f, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x0d, 0x0a, 0x5b, 0x47, 0x65, 0x6e,
+ 0x65, 0x76, 0x61, 0x5d, 0x3a, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x4f, 0x72, 0x67, 0x61,
+ 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72,
+ 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x39, 0x39, 0x38, 0x2e, 0x3c,
+ 0x2f, 0x62, 0x69, 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x69, 0x62,
+ 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x78, 0x6d, 0x6c, 0x2d, 0x6e, 0x61,
+ 0x6d, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61,
+ 0x64, 0x64, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6c,
+ 0x69, 0x6e, 0x6b, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54,
+ 0x52, 0x2f, 0x57, 0x44, 0x2d, 0x78, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x0d,
+ 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x54, 0x52, 0x2f, 0x52, 0x45, 0x43, 0x2d, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2f, 0x22, 0x20, 0x6b, 0x65, 0x79, 0x3d,
+ 0x22, 0x58, 0x4d, 0x4c, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x3e,
+ 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38,
+ 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23,
+ 0x45, 0x39, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x38, 0x5d, 0x3c, 0x2f,
+ 0x6c, 0x6f, 0x63, 0x3e, 0x54, 0x69, 0x6d, 0x20, 0x42, 0x72, 0x61, 0x79,
+ 0x2c, 0x0d, 0x0a, 0x44, 0x61, 0x76, 0x65, 0x20, 0x48, 0x6f, 0x6c, 0x6c,
+ 0x61, 0x6e, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x41,
+ 0x6e, 0x64, 0x72, 0x65, 0x77, 0x20, 0x4c, 0x61, 0x79, 0x6d, 0x61, 0x6e,
+ 0x2c, 0x20, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x20, 0x3c,
+ 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66, 0x3e, 0x4e, 0x61, 0x6d,
+ 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x58,
+ 0x4d, 0x4c, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x72, 0x65, 0x66,
+ 0x3e, 0x2e, 0x0d, 0x0a, 0x54, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x69,
+ 0x74, 0x79, 0x2c, 0x20, 0x48, 0x65, 0x77, 0x6c, 0x65, 0x74, 0x74, 0x2d,
+ 0x50, 0x61, 0x63, 0x6b, 0x61, 0x72, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x20,
+ 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x57, 0x69, 0x64, 0x65, 0x20, 0x57,
+ 0x65, 0x62, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x75,
+ 0x6d, 0x2c, 0x20, 0x31, 0x39, 0x39, 0x39, 0x2e, 0x3c, 0x2f, 0x62, 0x69,
+ 0x62, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x62, 0x6c, 0x69, 0x73, 0x74,
+ 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x31, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x31,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x43, 0x68, 0x61, 0x72, 0x43, 0x6c, 0x61,
+ 0x73, 0x73, 0x65, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73,
+ 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20,
+ 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x2c, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x61, 0x72,
+ 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73,
+ 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x20, 0x28, 0x61, 0x6d, 0x6f, 0x6e, 0x67, 0x20,
+ 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x73,
+ 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x69, 0x63,
+ 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x61, 0x74, 0x69,
+ 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x3c, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72,
+ 0x65, 0x66, 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x38, 0x34, 0x22, 0x3e, 0x5b, 0x45,
+ 0x38, 0x34, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2c, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x0d, 0x0a, 0x64, 0x69, 0x61, 0x63,
+ 0x72, 0x69, 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61,
+ 0x73, 0x65, 0x3e, 0x29, 0x2c, 0x20, 0x69, 0x64, 0x65, 0x6f, 0x67, 0x72,
+ 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f,
+ 0x6d, 0x62, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x28, 0x61, 0x6d, 0x6f, 0x6e,
+ 0x67, 0x0d, 0x0a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20,
+ 0x64, 0x69, 0x61, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x73, 0x29, 0x3c,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65,
+ 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x33, 0x30, 0x22, 0x3e, 0x5b,
+ 0x45, 0x33, 0x30, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x3b, 0x20,
+ 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65,
+ 0x73, 0x0d, 0x0a, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x20, 0x74,
+ 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x65, 0x74, 0x74,
+ 0x65, 0x72, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x3e, 0x20, 0x44, 0x69, 0x67, 0x69, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x0d, 0x0a, 0x64, 0x69, 0x73,
+ 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x65, 0x64, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x61, 0x70, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45,
+ 0x52, 0x53, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x62,
+ 0x6e, 0x66, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64,
+ 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x70, 0x63, 0x77, 0x33, 0x3d, 0x22,
+ 0x33, 0x22, 0x20, 0x70, 0x63, 0x77, 0x34, 0x3d, 0x22, 0x31, 0x35, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x4e, 0x54, 0x2d, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x4c, 0x65, 0x74, 0x74, 0x65,
+ 0x72, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e,
+ 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e, 0x54, 0x2d,
+ 0x42, 0x61, 0x73, 0x65, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x42, 0x61,
+ 0x73, 0x65, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x20,
+ 0x7c, 0x20, 0x3c, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x66, 0x3d, 0x22, 0x4e,
+ 0x54, 0x2d, 0x49, 0x64, 0x65, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69,
+ 0x63, 0x22, 0x3e, 0x49, 0x64, 0x65, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68,
+ 0x69, 0x63, 0x3c, 0x2f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x72, 0x68, 0x73,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x42, 0x61, 0x73, 0x65, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x42, 0x61, 0x73, 0x65, 0x43, 0x68,
+ 0x61, 0x72, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x5b, 0x23, 0x78, 0x30, 0x30, 0x34, 0x31, 0x2d, 0x23, 0x78, 0x30,
+ 0x30, 0x35, 0x41, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x30, 0x36, 0x31, 0x2d, 0x23, 0x78, 0x30, 0x30,
+ 0x37, 0x41, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x30, 0x43, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x30, 0x44,
+ 0x36, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x30, 0x44, 0x38, 0x2d, 0x23, 0x78, 0x30, 0x30, 0x46,
+ 0x36, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x30, 0x30, 0x46, 0x38, 0x2d, 0x23, 0x78, 0x30, 0x30, 0x46, 0x46,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x31, 0x30, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x31, 0x33, 0x31, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x31, 0x33, 0x34, 0x2d, 0x23, 0x78, 0x30, 0x31, 0x33, 0x45, 0x5d, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x31, 0x34, 0x31, 0x2d, 0x23, 0x78, 0x30, 0x31, 0x34, 0x38, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x31,
+ 0x34, 0x41, 0x2d, 0x23, 0x78, 0x30, 0x31, 0x37, 0x45, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x31, 0x38,
+ 0x30, 0x2d, 0x23, 0x78, 0x30, 0x31, 0x43, 0x33, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x31, 0x43, 0x44,
+ 0x2d, 0x23, 0x78, 0x30, 0x31, 0x46, 0x30, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x31, 0x46, 0x34,
+ 0x2d, 0x23, 0x78, 0x30, 0x31, 0x46, 0x35, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x31, 0x46, 0x41, 0x2d,
+ 0x23, 0x78, 0x30, 0x32, 0x31, 0x37, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x32, 0x35, 0x30, 0x2d, 0x23,
+ 0x78, 0x30, 0x32, 0x41, 0x38, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x32, 0x42, 0x42, 0x2d, 0x23, 0x78,
+ 0x30, 0x32, 0x43, 0x31, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x33, 0x38, 0x36, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x33, 0x38, 0x38, 0x2d,
+ 0x23, 0x78, 0x30, 0x33, 0x38, 0x41, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x33, 0x38, 0x43, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x33, 0x38, 0x45,
+ 0x2d, 0x23, 0x78, 0x30, 0x33, 0x41, 0x31, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x33, 0x41, 0x33,
+ 0x2d, 0x23, 0x78, 0x30, 0x33, 0x43, 0x45, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x33, 0x44, 0x30, 0x2d,
+ 0x23, 0x78, 0x30, 0x33, 0x44, 0x36, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x33, 0x44, 0x41, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x33, 0x44, 0x43, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x33,
+ 0x44, 0x45, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78,
+ 0x30, 0x33, 0x45, 0x30, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x33, 0x45, 0x32, 0x2d, 0x23, 0x78, 0x30, 0x33,
+ 0x46, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x34, 0x30, 0x31, 0x2d, 0x23, 0x78, 0x30, 0x34, 0x30,
+ 0x43, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x34, 0x30, 0x45, 0x2d, 0x23, 0x78, 0x30, 0x34, 0x34,
+ 0x46, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x30, 0x34, 0x35, 0x31, 0x2d, 0x23, 0x78, 0x30, 0x34, 0x35, 0x43,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x34, 0x35, 0x45, 0x2d, 0x23, 0x78, 0x30, 0x34, 0x38, 0x31, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x34, 0x39, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x34, 0x43, 0x34, 0x5d, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x34, 0x43, 0x37, 0x2d, 0x23, 0x78, 0x30, 0x34, 0x43, 0x38, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x34,
+ 0x43, 0x42, 0x2d, 0x23, 0x78, 0x30, 0x34, 0x43, 0x43, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x34, 0x44,
+ 0x30, 0x2d, 0x23, 0x78, 0x30, 0x34, 0x45, 0x42, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x34, 0x45, 0x45,
+ 0x2d, 0x23, 0x78, 0x30, 0x34, 0x46, 0x35, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x34, 0x46, 0x38,
+ 0x2d, 0x23, 0x78, 0x30, 0x34, 0x46, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x35, 0x33, 0x31, 0x2d,
+ 0x23, 0x78, 0x30, 0x35, 0x35, 0x36, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x35, 0x35, 0x39, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x35, 0x36, 0x31,
+ 0x2d, 0x23, 0x78, 0x30, 0x35, 0x38, 0x36, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x35, 0x44, 0x30,
+ 0x2d, 0x23, 0x78, 0x30, 0x35, 0x45, 0x41, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x35, 0x46, 0x30, 0x2d,
+ 0x23, 0x78, 0x30, 0x35, 0x46, 0x32, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x32, 0x31, 0x2d, 0x23,
+ 0x78, 0x30, 0x36, 0x33, 0x41, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x34, 0x31, 0x2d, 0x23, 0x78,
+ 0x30, 0x36, 0x34, 0x41, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x37, 0x31, 0x2d, 0x23, 0x78,
+ 0x30, 0x36, 0x42, 0x37, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x42, 0x41, 0x2d, 0x23, 0x78, 0x30,
+ 0x36, 0x42, 0x45, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x36, 0x43, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x36,
+ 0x43, 0x45, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x36, 0x44, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x36, 0x44,
+ 0x33, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23,
+ 0x78, 0x30, 0x36, 0x44, 0x35, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x45, 0x35, 0x2d, 0x23, 0x78, 0x30,
+ 0x36, 0x45, 0x36, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x39, 0x30, 0x35, 0x2d, 0x23, 0x78, 0x30, 0x39,
+ 0x33, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23,
+ 0x78, 0x30, 0x39, 0x33, 0x44, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x39, 0x35, 0x38, 0x2d, 0x23, 0x78,
+ 0x30, 0x39, 0x36, 0x31, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x39, 0x38, 0x35, 0x2d, 0x23, 0x78, 0x30,
+ 0x39, 0x38, 0x43, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x39, 0x38, 0x46, 0x2d, 0x23, 0x78, 0x30, 0x39,
+ 0x39, 0x30, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x39, 0x39, 0x33, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x41,
+ 0x38, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x39, 0x41, 0x41, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x42,
+ 0x30, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78,
+ 0x30, 0x39, 0x42, 0x32, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x39, 0x42, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x39,
+ 0x42, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x39, 0x44, 0x43, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x44,
+ 0x44, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x39, 0x44, 0x46, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x45,
+ 0x31, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x30, 0x39, 0x46, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x46, 0x31,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x41, 0x30, 0x35, 0x2d, 0x23, 0x78, 0x30, 0x41, 0x30, 0x41, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x41, 0x30, 0x46, 0x2d, 0x23, 0x78, 0x30, 0x41, 0x31, 0x30, 0x5d, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x41, 0x31, 0x33, 0x2d, 0x23, 0x78, 0x30, 0x41, 0x32, 0x38, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41,
+ 0x32, 0x41, 0x2d, 0x23, 0x78, 0x30, 0x41, 0x33, 0x30, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x33,
+ 0x32, 0x2d, 0x23, 0x78, 0x30, 0x41, 0x33, 0x33, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x33, 0x35,
+ 0x2d, 0x23, 0x78, 0x30, 0x41, 0x33, 0x36, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x33, 0x38,
+ 0x2d, 0x23, 0x78, 0x30, 0x41, 0x33, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x35, 0x39, 0x2d,
+ 0x23, 0x78, 0x30, 0x41, 0x35, 0x43, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x41, 0x35, 0x45, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x37, 0x32,
+ 0x2d, 0x23, 0x78, 0x30, 0x41, 0x37, 0x34, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x38, 0x35,
+ 0x2d, 0x23, 0x78, 0x30, 0x41, 0x38, 0x42, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x41, 0x38, 0x44, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x38,
+ 0x46, 0x2d, 0x23, 0x78, 0x30, 0x41, 0x39, 0x31, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x39, 0x33,
+ 0x2d, 0x23, 0x78, 0x30, 0x41, 0x41, 0x38, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x41, 0x41,
+ 0x2d, 0x23, 0x78, 0x30, 0x41, 0x42, 0x30, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x42, 0x32, 0x2d,
+ 0x23, 0x78, 0x30, 0x41, 0x42, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x42, 0x35, 0x2d, 0x23,
+ 0x78, 0x30, 0x41, 0x42, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x41, 0x42, 0x44, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x41, 0x45, 0x30, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42,
+ 0x30, 0x35, 0x2d, 0x23, 0x78, 0x30, 0x42, 0x30, 0x43, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x30,
+ 0x46, 0x2d, 0x23, 0x78, 0x30, 0x42, 0x31, 0x30, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x31, 0x33,
+ 0x2d, 0x23, 0x78, 0x30, 0x42, 0x32, 0x38, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x32, 0x41,
+ 0x2d, 0x23, 0x78, 0x30, 0x42, 0x33, 0x30, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x33, 0x32, 0x2d,
+ 0x23, 0x78, 0x30, 0x42, 0x33, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x33, 0x36, 0x2d, 0x23,
+ 0x78, 0x30, 0x42, 0x33, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x42, 0x33, 0x44, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x35, 0x43,
+ 0x2d, 0x23, 0x78, 0x30, 0x42, 0x35, 0x44, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x35, 0x46, 0x2d,
+ 0x23, 0x78, 0x30, 0x42, 0x36, 0x31, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x38, 0x35, 0x2d, 0x23,
+ 0x78, 0x30, 0x42, 0x38, 0x41, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x38, 0x45, 0x2d, 0x23, 0x78,
+ 0x30, 0x42, 0x39, 0x30, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x39, 0x32, 0x2d, 0x23, 0x78,
+ 0x30, 0x42, 0x39, 0x35, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x39, 0x39, 0x2d, 0x23, 0x78, 0x30,
+ 0x42, 0x39, 0x41, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x23, 0x78, 0x30, 0x42, 0x39, 0x43, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x39, 0x45, 0x2d, 0x23, 0x78,
+ 0x30, 0x42, 0x39, 0x46, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x41, 0x33, 0x2d, 0x23, 0x78,
+ 0x30, 0x42, 0x41, 0x34, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x41, 0x38, 0x2d, 0x23, 0x78, 0x30,
+ 0x42, 0x41, 0x41, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x42, 0x41, 0x45, 0x2d, 0x23, 0x78, 0x30, 0x42,
+ 0x42, 0x35, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x42, 0x42, 0x37, 0x2d, 0x23, 0x78, 0x30, 0x42, 0x42,
+ 0x39, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x43, 0x30, 0x35, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x30,
+ 0x43, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x30, 0x43, 0x30, 0x45, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x31, 0x30,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x43, 0x31, 0x32, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x32, 0x38, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x43, 0x32, 0x41, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x33, 0x33, 0x5d, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x43, 0x33, 0x35, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x33, 0x39, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43,
+ 0x36, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x36, 0x31, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43, 0x38,
+ 0x35, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x38, 0x43, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43, 0x38, 0x45,
+ 0x2d, 0x23, 0x78, 0x30, 0x43, 0x39, 0x30, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43, 0x39, 0x32,
+ 0x2d, 0x23, 0x78, 0x30, 0x43, 0x41, 0x38, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43, 0x41, 0x41, 0x2d,
+ 0x23, 0x78, 0x30, 0x43, 0x42, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43, 0x42, 0x35, 0x2d, 0x23,
+ 0x78, 0x30, 0x43, 0x42, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x43, 0x44, 0x45, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43, 0x45, 0x30,
+ 0x2d, 0x23, 0x78, 0x30, 0x43, 0x45, 0x31, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x30, 0x35, 0x2d,
+ 0x23, 0x78, 0x30, 0x44, 0x30, 0x43, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x30, 0x45, 0x2d, 0x23,
+ 0x78, 0x30, 0x44, 0x31, 0x30, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x31, 0x32, 0x2d, 0x23, 0x78,
+ 0x30, 0x44, 0x32, 0x38, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x32, 0x41, 0x2d, 0x23, 0x78,
+ 0x30, 0x44, 0x33, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x36, 0x30, 0x2d, 0x23, 0x78, 0x30,
+ 0x44, 0x36, 0x31, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x45, 0x30, 0x31, 0x2d, 0x23, 0x78, 0x30, 0x45,
+ 0x32, 0x45, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23,
+ 0x78, 0x30, 0x45, 0x33, 0x30, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x33, 0x32, 0x2d, 0x23, 0x78,
+ 0x30, 0x45, 0x33, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x34, 0x30, 0x2d, 0x23, 0x78, 0x30,
+ 0x45, 0x34, 0x35, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x45, 0x38, 0x31, 0x2d, 0x23, 0x78, 0x30, 0x45,
+ 0x38, 0x32, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23,
+ 0x78, 0x30, 0x45, 0x38, 0x34, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x38, 0x37, 0x2d, 0x23, 0x78,
+ 0x30, 0x45, 0x38, 0x38, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x23, 0x78, 0x30, 0x45, 0x38, 0x41, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x45, 0x38, 0x44, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x39, 0x34,
+ 0x2d, 0x23, 0x78, 0x30, 0x45, 0x39, 0x37, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x39, 0x39,
+ 0x2d, 0x23, 0x78, 0x30, 0x45, 0x39, 0x46, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x41, 0x31, 0x2d,
+ 0x23, 0x78, 0x30, 0x45, 0x41, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x45, 0x41, 0x35, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x45, 0x41, 0x37, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x45, 0x41, 0x41, 0x2d, 0x23, 0x78, 0x30, 0x45, 0x41, 0x42, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45,
+ 0x41, 0x44, 0x2d, 0x23, 0x78, 0x30, 0x45, 0x41, 0x45, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x45, 0x42, 0x30,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x45, 0x42, 0x32, 0x2d, 0x23, 0x78, 0x30, 0x45, 0x42, 0x33, 0x5d, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x45,
+ 0x42, 0x44, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x30, 0x45, 0x43, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x45, 0x43, 0x34,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x46, 0x34, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x46, 0x34, 0x37, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x46, 0x34, 0x39, 0x2d, 0x23, 0x78, 0x30, 0x46, 0x36, 0x39, 0x5d, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31,
+ 0x30, 0x41, 0x30, 0x2d, 0x23, 0x78, 0x31, 0x30, 0x43, 0x35, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x30,
+ 0x44, 0x30, 0x2d, 0x23, 0x78, 0x31, 0x30, 0x46, 0x36, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x30, 0x30,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31,
+ 0x31, 0x30, 0x32, 0x2d, 0x23, 0x78, 0x31, 0x31, 0x30, 0x33, 0x5d, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31,
+ 0x31, 0x30, 0x35, 0x2d, 0x23, 0x78, 0x31, 0x31, 0x30, 0x37, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x30,
+ 0x39, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x31, 0x31, 0x30, 0x42, 0x2d, 0x23, 0x78, 0x31, 0x31, 0x30, 0x43, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31,
+ 0x31, 0x30, 0x45, 0x2d, 0x23, 0x78, 0x31, 0x31, 0x31, 0x32, 0x5d, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31,
+ 0x33, 0x43, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78,
+ 0x31, 0x31, 0x33, 0x45, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x23, 0x78, 0x31, 0x31, 0x34, 0x30, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x34, 0x43, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x34, 0x45, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x35, 0x30,
+ 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x31, 0x31, 0x35, 0x34, 0x2d, 0x23, 0x78, 0x31, 0x31, 0x35, 0x35, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31,
+ 0x35, 0x39, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x31, 0x31, 0x35, 0x46, 0x2d, 0x23, 0x78, 0x31, 0x31, 0x36, 0x31,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31,
+ 0x31, 0x36, 0x33, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x23, 0x78, 0x31, 0x31, 0x36, 0x35, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x36, 0x37, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x36, 0x39, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x31, 0x36,
+ 0x44, 0x2d, 0x23, 0x78, 0x31, 0x31, 0x36, 0x45, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x31, 0x37, 0x32,
+ 0x2d, 0x23, 0x78, 0x31, 0x31, 0x37, 0x33, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x37, 0x35, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x39,
+ 0x45, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31,
+ 0x31, 0x41, 0x38, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23,
+ 0x78, 0x31, 0x31, 0x41, 0x42, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x31, 0x41, 0x45, 0x2d, 0x23, 0x78, 0x31,
+ 0x31, 0x41, 0x46, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x31, 0x42, 0x37, 0x2d, 0x23, 0x78, 0x31,
+ 0x31, 0x42, 0x38, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x23, 0x78, 0x31, 0x31, 0x42, 0x41, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x31, 0x42, 0x43, 0x2d, 0x23, 0x78,
+ 0x31, 0x31, 0x43, 0x32, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x23, 0x78, 0x31, 0x31, 0x45, 0x42, 0x0d, 0x0a, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x46, 0x30, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x31, 0x46, 0x39,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31,
+ 0x45, 0x30, 0x30, 0x2d, 0x23, 0x78, 0x31, 0x45, 0x39, 0x42, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x45,
+ 0x41, 0x30, 0x2d, 0x23, 0x78, 0x31, 0x45, 0x46, 0x39, 0x5d, 0x0d, 0x0a,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x46,
+ 0x30, 0x30, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x31, 0x35, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x46, 0x31,
+ 0x38, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x31, 0x44, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x46, 0x32, 0x30,
+ 0x2d, 0x23, 0x78, 0x31, 0x46, 0x34, 0x35, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x46, 0x34, 0x38, 0x2d,
+ 0x23, 0x78, 0x31, 0x46, 0x34, 0x44, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x46, 0x35, 0x30, 0x2d,
+ 0x23, 0x78, 0x31, 0x46, 0x35, 0x37, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x46, 0x35, 0x39, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x46, 0x35, 0x42, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x46, 0x35,
+ 0x44, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x31, 0x46, 0x35, 0x46, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x37, 0x44, 0x5d,
+ 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x31, 0x46, 0x38, 0x30, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x42, 0x34, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31,
+ 0x46, 0x42, 0x36, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x42, 0x43, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x31, 0x46, 0x42,
+ 0x45, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x31, 0x46, 0x43, 0x32, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x43, 0x34, 0x5d,
+ 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x31, 0x46, 0x43, 0x36, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x43, 0x43, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31,
+ 0x46, 0x44, 0x30, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x44, 0x33, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x46,
+ 0x44, 0x36, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x44, 0x42, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x46, 0x45,
+ 0x30, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x45, 0x43, 0x5d, 0x0d, 0x0a, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x46, 0x46,
+ 0x32, 0x2d, 0x23, 0x78, 0x31, 0x46, 0x46, 0x34, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x31, 0x46, 0x46, 0x36,
+ 0x2d, 0x23, 0x78, 0x31, 0x46, 0x46, 0x43, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x32, 0x31, 0x32, 0x36, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x32, 0x31, 0x32,
+ 0x41, 0x2d, 0x23, 0x78, 0x32, 0x31, 0x32, 0x42, 0x5d, 0x0d, 0x0a, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x32, 0x31, 0x32, 0x45,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x32,
+ 0x31, 0x38, 0x30, 0x2d, 0x23, 0x78, 0x32, 0x31, 0x38, 0x32, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x33, 0x30,
+ 0x34, 0x31, 0x2d, 0x23, 0x78, 0x33, 0x30, 0x39, 0x34, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x33, 0x30, 0x41,
+ 0x31, 0x2d, 0x23, 0x78, 0x33, 0x30, 0x46, 0x41, 0x5d, 0x0d, 0x0a, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x33, 0x31, 0x30,
+ 0x35, 0x2d, 0x23, 0x78, 0x33, 0x31, 0x32, 0x43, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x41, 0x43, 0x30, 0x30,
+ 0x2d, 0x23, 0x78, 0x44, 0x37, 0x41, 0x33, 0x5d, 0x20, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x4e, 0x54, 0x2d, 0x49, 0x64, 0x65, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68,
+ 0x69, 0x63, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x49,
+ 0x64, 0x65, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x3c, 0x2f,
+ 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x5b, 0x23, 0x78,
+ 0x34, 0x45, 0x30, 0x30, 0x2d, 0x23, 0x78, 0x39, 0x46, 0x41, 0x35, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x33, 0x30,
+ 0x30, 0x37, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x33, 0x30, 0x32, 0x31, 0x2d, 0x23, 0x78, 0x33, 0x30, 0x32, 0x39,
+ 0x5d, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x43, 0x6f, 0x6d, 0x62,
+ 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e,
+ 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, 0x3c, 0x2f, 0x6c, 0x68, 0x73,
+ 0x3e, 0x3c, 0x72, 0x68, 0x73, 0x3e, 0x5b, 0x23, 0x78, 0x30, 0x33, 0x30,
+ 0x30, 0x2d, 0x23, 0x78, 0x30, 0x33, 0x34, 0x35, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x33, 0x36, 0x30,
+ 0x2d, 0x23, 0x78, 0x30, 0x33, 0x36, 0x31, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x34, 0x38, 0x33, 0x2d,
+ 0x23, 0x78, 0x30, 0x34, 0x38, 0x36, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x35, 0x39, 0x31, 0x2d,
+ 0x23, 0x78, 0x30, 0x35, 0x41, 0x31, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x35, 0x41, 0x33, 0x2d, 0x23,
+ 0x78, 0x30, 0x35, 0x42, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x35, 0x42, 0x42, 0x2d, 0x23, 0x78,
+ 0x30, 0x35, 0x42, 0x44, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x23, 0x78, 0x30, 0x35, 0x42, 0x46, 0x0d, 0x0a, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x35, 0x43, 0x31, 0x2d,
+ 0x23, 0x78, 0x30, 0x35, 0x43, 0x32, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x35, 0x43, 0x34, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x34, 0x42,
+ 0x2d, 0x23, 0x78, 0x30, 0x36, 0x35, 0x32, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x36, 0x37, 0x30, 0x0d, 0x0a,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36,
+ 0x44, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x36, 0x44, 0x43, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x44,
+ 0x44, 0x2d, 0x23, 0x78, 0x30, 0x36, 0x44, 0x46, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x45, 0x30,
+ 0x2d, 0x23, 0x78, 0x30, 0x36, 0x45, 0x34, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x45, 0x37, 0x2d,
+ 0x23, 0x78, 0x30, 0x36, 0x45, 0x38, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x45, 0x41, 0x2d,
+ 0x23, 0x78, 0x30, 0x36, 0x45, 0x44, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x39, 0x30, 0x31, 0x2d, 0x23,
+ 0x78, 0x30, 0x39, 0x30, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x39, 0x33, 0x43, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x39, 0x33, 0x45, 0x2d,
+ 0x23, 0x78, 0x30, 0x39, 0x34, 0x43, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x39, 0x34, 0x44, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x39, 0x35,
+ 0x31, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x35, 0x34, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x39, 0x36, 0x32,
+ 0x2d, 0x23, 0x78, 0x30, 0x39, 0x36, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x39, 0x38, 0x31, 0x2d,
+ 0x23, 0x78, 0x30, 0x39, 0x38, 0x33, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x39, 0x42, 0x43, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x39, 0x42, 0x45,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x39,
+ 0x42, 0x46, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x30, 0x39, 0x43, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x43, 0x34,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x39, 0x43, 0x37, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x43, 0x38, 0x5d,
+ 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x39, 0x43, 0x42, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x43, 0x44, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x39,
+ 0x44, 0x37, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x30, 0x39, 0x45, 0x32, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x45, 0x33,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30,
+ 0x41, 0x30, 0x32, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x23, 0x78, 0x30, 0x41, 0x33, 0x43, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x41, 0x33, 0x45, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x41, 0x33, 0x46, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x34,
+ 0x30, 0x2d, 0x23, 0x78, 0x30, 0x41, 0x34, 0x32, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x34, 0x37,
+ 0x2d, 0x23, 0x78, 0x30, 0x41, 0x34, 0x38, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x34, 0x42,
+ 0x2d, 0x23, 0x78, 0x30, 0x41, 0x34, 0x44, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x37, 0x30, 0x2d,
+ 0x23, 0x78, 0x30, 0x41, 0x37, 0x31, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x38, 0x31, 0x2d, 0x23,
+ 0x78, 0x30, 0x41, 0x38, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x41, 0x42, 0x43, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x42, 0x45,
+ 0x2d, 0x23, 0x78, 0x30, 0x41, 0x43, 0x35, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x43, 0x37, 0x2d,
+ 0x23, 0x78, 0x30, 0x41, 0x43, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x41, 0x43, 0x42, 0x2d, 0x23,
+ 0x78, 0x30, 0x41, 0x43, 0x44, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x30, 0x31, 0x2d, 0x23, 0x78,
+ 0x30, 0x42, 0x30, 0x33, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x42, 0x33, 0x43, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x33, 0x45, 0x2d,
+ 0x23, 0x78, 0x30, 0x42, 0x34, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x34, 0x37, 0x2d, 0x23,
+ 0x78, 0x30, 0x42, 0x34, 0x38, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x34, 0x42, 0x2d, 0x23, 0x78,
+ 0x30, 0x42, 0x34, 0x44, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x35, 0x36, 0x2d, 0x23, 0x78,
+ 0x30, 0x42, 0x35, 0x37, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x42, 0x38, 0x32, 0x2d, 0x23, 0x78, 0x30,
+ 0x42, 0x38, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x42, 0x42, 0x45, 0x2d, 0x23, 0x78, 0x30, 0x42,
+ 0x43, 0x32, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x42, 0x43, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x42, 0x43,
+ 0x38, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x42, 0x43, 0x41, 0x2d, 0x23, 0x78, 0x30, 0x42, 0x43,
+ 0x44, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78,
+ 0x30, 0x42, 0x44, 0x37, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x43, 0x30, 0x31, 0x2d, 0x23, 0x78, 0x30, 0x43,
+ 0x30, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x43, 0x33, 0x45, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x34,
+ 0x34, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x43, 0x34, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x34,
+ 0x38, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x30, 0x43, 0x34, 0x41, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x34, 0x44,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x43, 0x35, 0x35, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x35, 0x36, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x43, 0x38, 0x32, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x38, 0x33, 0x5d, 0x0d,
+ 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x43, 0x42, 0x45, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x43, 0x34, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43,
+ 0x43, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x43, 0x38, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43, 0x43,
+ 0x41, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x43, 0x44, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43, 0x44, 0x35,
+ 0x2d, 0x23, 0x78, 0x30, 0x43, 0x44, 0x36, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x30, 0x32,
+ 0x2d, 0x23, 0x78, 0x30, 0x44, 0x30, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x33, 0x45, 0x2d,
+ 0x23, 0x78, 0x30, 0x44, 0x34, 0x33, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x34, 0x36, 0x2d, 0x23,
+ 0x78, 0x30, 0x44, 0x34, 0x38, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x34, 0x41, 0x2d, 0x23, 0x78,
+ 0x30, 0x44, 0x34, 0x44, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x44, 0x35, 0x37, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x45, 0x33, 0x31, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x33,
+ 0x34, 0x2d, 0x23, 0x78, 0x30, 0x45, 0x33, 0x41, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x34, 0x37,
+ 0x2d, 0x23, 0x78, 0x30, 0x45, 0x34, 0x45, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x45, 0x42, 0x31, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45,
+ 0x42, 0x34, 0x2d, 0x23, 0x78, 0x30, 0x45, 0x42, 0x39, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x42,
+ 0x42, 0x2d, 0x23, 0x78, 0x30, 0x45, 0x42, 0x43, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x43, 0x38,
+ 0x2d, 0x23, 0x78, 0x30, 0x45, 0x43, 0x44, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x46, 0x31, 0x38,
+ 0x2d, 0x23, 0x78, 0x30, 0x46, 0x31, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x46, 0x33, 0x35, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x46, 0x33, 0x37,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x46,
+ 0x33, 0x39, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78,
+ 0x30, 0x46, 0x33, 0x45, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x23, 0x78, 0x30, 0x46, 0x33, 0x46, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x46, 0x37, 0x31, 0x2d, 0x23,
+ 0x78, 0x30, 0x46, 0x38, 0x34, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x46, 0x38, 0x36, 0x2d, 0x23, 0x78,
+ 0x30, 0x46, 0x38, 0x42, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x46, 0x39, 0x30, 0x2d, 0x23, 0x78, 0x30,
+ 0x46, 0x39, 0x35, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x23, 0x78, 0x30, 0x46, 0x39, 0x37, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x46, 0x39, 0x39, 0x2d, 0x23,
+ 0x78, 0x30, 0x46, 0x41, 0x44, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x46, 0x42, 0x31, 0x2d, 0x23, 0x78,
+ 0x30, 0x46, 0x42, 0x37, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x23, 0x78, 0x30, 0x46, 0x42, 0x39, 0x0d, 0x0a, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x32, 0x30, 0x44, 0x30, 0x2d,
+ 0x23, 0x78, 0x32, 0x30, 0x44, 0x43, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x32, 0x30, 0x45, 0x31, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x33, 0x30, 0x32, 0x41,
+ 0x2d, 0x23, 0x78, 0x33, 0x30, 0x32, 0x46, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x33, 0x30, 0x39, 0x39, 0x0d, 0x0a,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x33, 0x30, 0x39,
+ 0x41, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x72, 0x6f, 0x64,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54, 0x2d, 0x44, 0x69, 0x67, 0x69,
+ 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x44, 0x69,
+ 0x67, 0x69, 0x74, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68,
+ 0x73, 0x3e, 0x5b, 0x23, 0x78, 0x30, 0x30, 0x33, 0x30, 0x2d, 0x23, 0x78,
+ 0x30, 0x30, 0x33, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70,
+ 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x36, 0x36, 0x30, 0x2d, 0x23, 0x78, 0x30,
+ 0x36, 0x36, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x36, 0x46, 0x30, 0x2d, 0x23, 0x78, 0x30, 0x36,
+ 0x46, 0x39, 0x5d, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x5b, 0x23, 0x78, 0x30, 0x39, 0x36, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x39,
+ 0x36, 0x46, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b,
+ 0x23, 0x78, 0x30, 0x39, 0x45, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x39, 0x45,
+ 0x46, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23,
+ 0x78, 0x30, 0x41, 0x36, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x41, 0x36, 0x46,
+ 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x41, 0x45, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x41, 0x45, 0x46, 0x5d,
+ 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78,
+ 0x30, 0x42, 0x36, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x42, 0x36, 0x46, 0x5d,
+ 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30,
+ 0x42, 0x45, 0x37, 0x2d, 0x23, 0x78, 0x30, 0x42, 0x45, 0x46, 0x5d, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43,
+ 0x36, 0x36, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x36, 0x46, 0x5d, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x43, 0x45,
+ 0x36, 0x2d, 0x23, 0x78, 0x30, 0x43, 0x45, 0x46, 0x5d, 0x0d, 0x0a, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x44, 0x36,
+ 0x36, 0x2d, 0x23, 0x78, 0x30, 0x44, 0x36, 0x46, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x35, 0x30,
+ 0x2d, 0x23, 0x78, 0x30, 0x45, 0x35, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x45, 0x44, 0x30, 0x2d,
+ 0x23, 0x78, 0x30, 0x45, 0x44, 0x39, 0x5d, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x30, 0x46, 0x32, 0x30, 0x2d, 0x23,
+ 0x78, 0x30, 0x46, 0x32, 0x39, 0x5d, 0x20, 0x3c, 0x2f, 0x72, 0x68, 0x73,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x72, 0x6f, 0x64, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x4e, 0x54,
+ 0x2d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6c, 0x68, 0x73, 0x3e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64,
+ 0x65, 0x72, 0x3c, 0x2f, 0x6c, 0x68, 0x73, 0x3e, 0x3c, 0x72, 0x68, 0x73,
+ 0x3e, 0x23, 0x78, 0x30, 0x30, 0x42, 0x37, 0x20, 0x7c, 0x26, 0x6e, 0x62,
+ 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x32, 0x44, 0x30, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x32, 0x44, 0x31, 0x20,
+ 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30, 0x33, 0x38,
+ 0x37, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x30,
+ 0x36, 0x34, 0x30, 0x0d, 0x0a, 0x7c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x23, 0x78, 0x30, 0x45, 0x34, 0x36, 0x20, 0x7c, 0x26, 0x6e, 0x62, 0x73,
+ 0x70, 0x3b, 0x23, 0x78, 0x30, 0x45, 0x43, 0x36, 0x20, 0x7c, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x23, 0x78, 0x33, 0x30, 0x30, 0x35, 0x20, 0x7c,
+ 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x33, 0x30, 0x33,
+ 0x31, 0x2d, 0x23, 0x78, 0x33, 0x30, 0x33, 0x35, 0x5d, 0x20, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x33, 0x30, 0x39, 0x44,
+ 0x2d, 0x23, 0x78, 0x33, 0x30, 0x39, 0x45, 0x5d, 0x0d, 0x0a, 0x7c, 0x26,
+ 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x5b, 0x23, 0x78, 0x33, 0x30, 0x46, 0x43,
+ 0x2d, 0x23, 0x78, 0x33, 0x30, 0x46, 0x45, 0x5d, 0x20, 0x3c, 0x2f, 0x72,
+ 0x68, 0x73, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x67, 0x72, 0x6f, 0x75,
+ 0x70, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x61, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73,
+ 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x68, 0x65, 0x72,
+ 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x72,
+ 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3c, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x37, 0x22, 0x3e, 0x5b, 0x45,
+ 0x36, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x32, 0x2e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74,
+ 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c,
+ 0x6c, 0x6f, 0x77, 0x73, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+ 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65,
+ 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x20, 0x4c,
+ 0x6c, 0x2c, 0x20, 0x4c, 0x75, 0x2c, 0x20, 0x4c, 0x6f, 0x2c, 0x0d, 0x0a,
+ 0x4c, 0x74, 0x2c, 0x20, 0x4e, 0x6c, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c,
+ 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x4e, 0x61, 0x6d, 0x65,
+ 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68,
+ 0x61, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x0d, 0x0a,
+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69,
+ 0x65, 0x73, 0x20, 0x4d, 0x63, 0x2c, 0x20, 0x4d, 0x65, 0x2c, 0x20, 0x4d,
+ 0x6e, 0x2c, 0x20, 0x4c, 0x6d, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x4e, 0x64,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x43,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69,
+ 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20,
+ 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x23, 0x78, 0x46, 0x39, 0x30, 0x30, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x23, 0x78, 0x46, 0x46, 0x46, 0x45, 0x29, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64,
+ 0x20, 0x69, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20,
+ 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+ 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x64, 0x65,
+ 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x0d, 0x0a, 0x74, 0x68, 0x6f, 0x73, 0x65,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74,
+ 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x67, 0x3c, 0x2f, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64,
+ 0x20, 0x35, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x64,
+ 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x2d, 0x2d, 0x20, 0x6d,
+ 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x66, 0x69, 0x65,
+ 0x6c, 0x64, 0x20, 0x35, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69,
+ 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x3c, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x3c, 0x2f, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x29, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e,
+ 0x6f, 0x74, 0x0d, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68,
+ 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61,
+ 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74,
+ 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20,
+ 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x0d, 0x0a, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73,
+ 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20,
+ 0x61, 0x73, 0x20, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x69,
+ 0x63, 0x3a, 0x0d, 0x0a, 0x5b, 0x23, 0x78, 0x30, 0x32, 0x42, 0x42, 0x2d,
+ 0x23, 0x78, 0x30, 0x32, 0x43, 0x31, 0x5d, 0x2c, 0x20, 0x23, 0x78, 0x30,
+ 0x35, 0x35, 0x39, 0x2c, 0x20, 0x23, 0x78, 0x30, 0x36, 0x45, 0x35, 0x2c,
+ 0x20, 0x23, 0x78, 0x30, 0x36, 0x45, 0x36, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x20, 0x23, 0x78, 0x32, 0x30, 0x44, 0x44, 0x2d,
+ 0x23, 0x78, 0x32, 0x30, 0x45, 0x30, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65,
+ 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x28, 0x69, 0x6e, 0x20,
+ 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x20,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63,
+ 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78,
+ 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d,
+ 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x36, 0x37, 0x22, 0x3e,
+ 0x5b, 0x45, 0x36, 0x37, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x32,
+ 0x2e, 0x30, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x2c,
+ 0x0d, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x35, 0x2e,
+ 0x31, 0x34, 0x29, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c,
+ 0x70, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x23, 0x78, 0x30, 0x30, 0x42, 0x37, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20,
+ 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x2c,
+ 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x0d, 0x0a, 0x6c,
+ 0x69, 0x73, 0x74, 0x20, 0x73, 0x6f, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x69, 0x74, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x43, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x23, 0x78, 0x30, 0x33, 0x38, 0x37, 0x20,
+ 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20,
+ 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73,
+ 0x65, 0x20, 0x23, 0x78, 0x30, 0x30, 0x42, 0x37, 0x20, 0x69, 0x73, 0x0d,
+ 0x0a, 0x69, 0x74, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63,
+ 0x61, 0x6c, 0x20, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e,
+ 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x27,
+ 0x3a, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x27, 0x5f, 0x27, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x61,
+ 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74,
+ 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e,
+ 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x27,
+ 0x2d, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x27, 0x2e, 0x27, 0x20, 0x61,
+ 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x61,
+ 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x75, 0x6c, 0x69,
+ 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x31, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x64, 0x69,
+ 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x78,
+ 0x6d, 0x6c, 0x2d, 0x61, 0x6e, 0x64, 0x2d, 0x73, 0x67, 0x6d, 0x6c, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x58, 0x4d, 0x4c,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x3c, 0x2f, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63,
+ 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65,
+ 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31,
+ 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x23, 0x45, 0x34, 0x33, 0x22, 0x3e, 0x5b, 0x45, 0x34, 0x33,
+ 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x58, 0x4d, 0x4c, 0x0d, 0x0a,
+ 0x69, 0x73, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20,
+ 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73,
+ 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x2c, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x76, 0x65, 0x72,
+ 0x79, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x61, 0x6c,
+ 0x73, 0x6f, 0x0d, 0x0a, 0x62, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x47, 0x4d, 0x4c,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x46, 0x6f, 0x72, 0x20,
+ 0x61, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x63,
+ 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x6e,
+ 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x62,
+ 0x65, 0x79, 0x6f, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20,
+ 0x6f, 0x66, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x2c, 0x20, 0x73, 0x65, 0x65,
+ 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x43, 0x6c, 0x61, 0x72, 0x6b, 0x22, 0x2f, 0x3e, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x2d, 0x64, 0x69, 0x76, 0x31, 0x3e, 0x0d, 0x0a, 0x3c, 0x69,
+ 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x65, 0x6e, 0x74, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20,
+ 0x6f, 0x66, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3c, 0x2f,
+ 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68,
+ 0x69, 0x73, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x78, 0x20,
+ 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x73, 0x6f, 0x6d,
+ 0x65, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x69,
+ 0x6c, 0x6c, 0x75, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2d, 0x0d,
+ 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x2d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+ 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69,
+ 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+ 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x73, 0x70, 0x65,
+ 0x63, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x65,
+ 0x6e, 0x74, 0x70, 0x72, 0x6f, 0x63, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x49, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x44, 0x54, 0x44, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x65, 0x67, 0x3e, 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41,
+ 0x5b, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x65, 0x78,
+ 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x22, 0x3c, 0x70, 0x3e, 0x41, 0x6e,
+ 0x20, 0x61, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6e, 0x64, 0x20, 0x28,
+ 0x26, 0x23, 0x33, 0x38, 0x3b, 0x23, 0x33, 0x38, 0x3b, 0x29, 0x20, 0x6d,
+ 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65,
+ 0x64, 0x0d, 0x0a, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c,
+ 0x6c, 0x79, 0x20, 0x28, 0x26, 0x23, 0x33, 0x38, 0x3b, 0x23, 0x33, 0x38,
+ 0x3b, 0x23, 0x33, 0x38, 0x3b, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x20, 0x61, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x28, 0x26, 0x61,
+ 0x6d, 0x70, 0x3b, 0x61, 0x6d, 0x70, 0x3b, 0x29, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x22, 0x20, 0x3e, 0x5d, 0x5d, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
+ 0x73, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x63,
+ 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e,
+ 0x20, 0x69, 0x74, 0x0d, 0x0a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x73, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x20,
+ 0x74, 0x68, 0x65, 0x6d, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20,
+ 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x73,
+ 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3c, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x65, 0x78,
+ 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3a, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x65, 0x67, 0x3e, 0x3c, 0x21, 0x5b, 0x43, 0x44,
+ 0x41, 0x54, 0x41, 0x5b, 0x3c, 0x70, 0x3e, 0x41, 0x6e, 0x20, 0x61, 0x6d,
+ 0x70, 0x65, 0x72, 0x73, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x26, 0x23, 0x33,
+ 0x38, 0x3b, 0x29, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x65,
+ 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x0d, 0x0a, 0x6e, 0x75, 0x6d, 0x65,
+ 0x72, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x28, 0x26, 0x23, 0x33,
+ 0x38, 0x3b, 0x23, 0x33, 0x38, 0x3b, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x28, 0x26,
+ 0x61, 0x6d, 0x70, 0x3b, 0x61, 0x6d, 0x70, 0x3b, 0x29, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x5d, 0x5d, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x70, 0x3e, 0x41, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+ 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f,
+ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26,
+ 0x61, 0x6d, 0x70, 0x3b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3b,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x61,
+ 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74,
+ 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x70, 0x61, 0x72,
+ 0x73, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+ 0x74, 0x61, 0x72, 0x74, 0x2d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e,
+ 0x64, 0x2d, 0x74, 0x61, 0x67, 0x73, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x70, 0x3c, 0x2f, 0x65, 0x6c,
+ 0x3e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69,
+ 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e,
+ 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x0d, 0x0a,
+ 0x62, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65,
+ 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64,
+ 0x65, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e,
+ 0x67, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x70,
+ 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66,
+ 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x28, 0x61, 0x6c, 0x6c, 0x20, 0x64,
+ 0x61, 0x74, 0x61, 0x2c, 0x20, 0x6e, 0x6f, 0x20, 0x64, 0x65, 0x6c, 0x69,
+ 0x6d, 0x69, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61,
+ 0x72, 0x6b, 0x75, 0x70, 0x29, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x65, 0x67, 0x3e, 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41,
+ 0x5b, 0x41, 0x6e, 0x20, 0x61, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6e,
+ 0x64, 0x20, 0x28, 0x26, 0x29, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65,
+ 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x0d, 0x0a, 0x6e, 0x75,
+ 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x28, 0x26,
+ 0x23, 0x33, 0x38, 0x3b, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x61, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x0d, 0x0a, 0x28, 0x26, 0x61, 0x6d,
+ 0x70, 0x3b, 0x29, 0x2e, 0x5d, 0x5d, 0x3e, 0x3c, 0x2f, 0x65, 0x67, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20,
+ 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x20, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x69, 0x6c, 0x6c,
+ 0x75, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68,
+ 0x65, 0x69, 0x72, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20,
+ 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x2e, 0x0d, 0x0a, 0x49, 0x6e, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67,
+ 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+ 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x65, 0x6c,
+ 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x65,
+ 0x67, 0x3e, 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x31,
+ 0x20, 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x3d, 0x27, 0x31, 0x2e, 0x30, 0x27, 0x3f, 0x3e, 0x0d, 0x0a,
+ 0x32, 0x20, 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20,
+ 0x74, 0x65, 0x73, 0x74, 0x20, 0x5b, 0x0d, 0x0a, 0x33, 0x20, 0x3c, 0x21,
+ 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x74, 0x65, 0x73, 0x74,
+ 0x20, 0x28, 0x23, 0x50, 0x43, 0x44, 0x41, 0x54, 0x41, 0x29, 0x20, 0x3e,
+ 0x0d, 0x0a, 0x34, 0x20, 0x3c, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59,
+ 0x20, 0x25, 0x20, 0x78, 0x78, 0x20, 0x27, 0x26, 0x23, 0x33, 0x37, 0x3b,
+ 0x7a, 0x7a, 0x3b, 0x27, 0x3e, 0x0d, 0x0a, 0x35, 0x20, 0x3c, 0x21, 0x45,
+ 0x4e, 0x54, 0x49, 0x54, 0x59, 0x20, 0x25, 0x20, 0x7a, 0x7a, 0x20, 0x27,
+ 0x26, 0x23, 0x36, 0x30, 0x3b, 0x21, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59,
+ 0x20, 0x74, 0x72, 0x69, 0x63, 0x6b, 0x79, 0x20, 0x22, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x2d, 0x70, 0x72, 0x6f, 0x6e, 0x65, 0x22, 0x20, 0x3e, 0x27,
+ 0x20, 0x3e, 0x0d, 0x0a, 0x36, 0x20, 0x25, 0x78, 0x78, 0x3b, 0x0d, 0x0a,
+ 0x37, 0x20, 0x5d, 0x3e, 0x0d, 0x0a, 0x38, 0x20, 0x3c, 0x74, 0x65, 0x73,
+ 0x74, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x73, 0x20, 0x61, 0x20, 0x26, 0x74,
+ 0x72, 0x69, 0x63, 0x6b, 0x79, 0x3b, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f,
+ 0x64, 0x2e, 0x3c, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x3e, 0x5d, 0x5d, 0x3e,
+ 0x3c, 0x2f, 0x65, 0x67, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68,
+ 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e,
+ 0x67, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x75, 0x6c, 0x69,
+ 0x73, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22,
+ 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x69, 0x6e, 0x20, 0x6c,
+ 0x69, 0x6e, 0x65, 0x20, 0x34, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x33, 0x37,
+ 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64,
+ 0x20, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79,
+ 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x78, 0x78, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20, 0x69,
+ 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x0d, 0x0a,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3c, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x25, 0x7a,
+ 0x7a, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2e, 0x20, 0x53, 0x69, 0x6e, 0x63, 0x65,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e,
+ 0x6e, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61,
+ 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x7a, 0x7a, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x69,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e,
+ 0x69, 0x7a, 0x65, 0x64, 0x2e, 0x20, 0x28, 0x41, 0x6e, 0x64, 0x20, 0x69,
+ 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61,
+ 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x69,
+ 0x74, 0x20, 0x77, 0x65, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x63,
+ 0x65, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x7a, 0x7a, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x69, 0x73,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x79, 0x65, 0x74, 0x20, 0x64, 0x65, 0x63,
+ 0x6c, 0x61, 0x72, 0x65, 0x64, 0x2e, 0x29, 0x3c, 0x2f, 0x70, 0x3e, 0x3c,
+ 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x65,
+ 0x20, 0x35, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
+ 0x6e, 0x63, 0x65, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x23, 0x36,
+ 0x30, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71,
+ 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6d, 0x6d, 0x65, 0x64,
+ 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x7a, 0x7a, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65,
+ 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
+ 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
+ 0x65, 0x78, 0x74, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e,
+ 0x54, 0x49, 0x54, 0x59, 0x20, 0x74, 0x72, 0x69, 0x63, 0x6b, 0x79, 0x20,
+ 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x70, 0x72, 0x6f, 0x6e, 0x65,
+ 0x22, 0x0d, 0x0a, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c, 0x20, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x77, 0x65, 0x6c, 0x6c,
+ 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65,
+ 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70,
+ 0x3e, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x36, 0x2c, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x78, 0x78, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20,
+ 0x69, 0x73, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65,
+ 0x64, 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+ 0x74, 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x78, 0x78, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74,
+ 0x65, 0x3e, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x6c, 0x79, 0x20, 0x3c,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x25, 0x7a, 0x7a, 0x3b, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x29, 0x0d, 0x0a, 0x69, 0x73,
+ 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74,
+ 0x6f, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x7a, 0x7a, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x20, 0x69, 0x73, 0x20,
+ 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x69,
+ 0x6e, 0x0d, 0x0a, 0x69, 0x74, 0x73, 0x20, 0x74, 0x75, 0x72, 0x6e, 0x2c,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x70,
+ 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78,
+ 0x74, 0x20, 0x28, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x45, 0x4e, 0x54,
+ 0x49, 0x54, 0x59, 0x20, 0x74, 0x72, 0x69, 0x63, 0x6b, 0x79, 0x20, 0x22,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x70, 0x72, 0x6f, 0x6e, 0x65, 0x22,
+ 0x0d, 0x0a, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x29, 0x20, 0x69, 0x73, 0x20, 0x70,
+ 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x74, 0x72, 0x69, 0x63, 0x6b, 0x79, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e,
+ 0x0d, 0x0a, 0x68, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x62, 0x65,
+ 0x65, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x2c,
+ 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+ 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65,
+ 0x78, 0x74, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x70, 0x72,
+ 0x6f, 0x6e, 0x65, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69,
+ 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x69, 0x6e, 0x20, 0x6c, 0x69,
+ 0x6e, 0x65, 0x20, 0x38, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x74, 0x72, 0x69, 0x63, 0x6b,
+ 0x79, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x72, 0x65, 0x63,
+ 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e,
+ 0x64, 0x65, 0x64, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x65, 0x6c, 0x3e,
+ 0x74, 0x65, 0x73, 0x74, 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x64, 0x65, 0x73, 0x63, 0x72,
+ 0x69, 0x62, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x75,
+ 0x6e, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c,
+ 0x29, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x65, 0x6d,
+ 0x70, 0x68, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x0d, 0x0a, 0x73, 0x68, 0x6f, 0x77, 0x73, 0x20, 0x61, 0x20,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x70, 0x72, 0x6f, 0x6e, 0x65, 0x20,
+ 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x3c, 0x2f, 0x65, 0x6d, 0x70,
+ 0x68, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x64, 0x69,
+ 0x76, 0x31, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x2d, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x65,
+ 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x6d, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x44, 0x65, 0x74, 0x65, 0x72,
+ 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63, 0x20, 0x43, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x3c,
+ 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d,
+ 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d,
+ 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c,
+ 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72,
+ 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x32, 0x22, 0x3e, 0x5b,
+ 0x45, 0x31, 0x30, 0x32, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x41,
+ 0x73, 0x0d, 0x0a, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x3c, 0x73, 0x70, 0x65, 0x63, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x2f, 0x3e,
+ 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75,
+ 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
+ 0x73, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65,
+ 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63, 0x2e,
+ 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x3c, 0x74, 0x65,
+ 0x72, 0x6d, 0x72, 0x65, 0x66, 0x0d, 0x0a, 0x64, 0x65, 0x66, 0x3d, 0x22,
+ 0x64, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x22, 0x3e, 0x66,
+ 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x72, 0x65,
+ 0x66, 0x3e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x53, 0x47, 0x4d, 0x4c,
+ 0x20, 0x28, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x61, 0x6c, 0x6c,
+ 0x73, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73,
+ 0x74, 0x69, 0x63, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x3c, 0x71, 0x75, 0x6f,
+ 0x74, 0x65, 0x3e, 0x75, 0x6e, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x6f,
+ 0x75, 0x73, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x29, 0x3b,
+ 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73,
+ 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x0d, 0x0a, 0x75, 0x73, 0x69, 0x6e,
+ 0x67, 0x20, 0x53, 0x47, 0x4d, 0x4c, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20,
+ 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+ 0x69, 0x73, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x61, 0x73, 0x20,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x3c,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x28, 0x28, 0x62, 0x2c, 0x20, 0x63, 0x29,
+ 0x20, 0x7c, 0x20, 0x28, 0x62, 0x2c, 0x20, 0x64, 0x29, 0x29, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x6e,
+ 0x2d, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74,
+ 0x69, 0x63, 0x2c, 0x0d, 0x0a, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65,
+ 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e,
+ 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x62, 0x3c,
+ 0x2f, 0x65, 0x6c, 0x3e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63,
+ 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c,
+ 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65,
+ 0x66, 0x22, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d,
+ 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x35, 0x22, 0x3e, 0x5b, 0x45, 0x39,
+ 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x58, 0x4d, 0x4c, 0x20,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x0d, 0x0a, 0x63, 0x61, 0x6e, 0x6e,
+ 0x6f, 0x74, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x62, 0x3c, 0x2f, 0x65, 0x6c, 0x3e,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65,
+ 0x6c, 0x20, 0x69, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,
+ 0x75, 0x74, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x0d, 0x0a,
+ 0x61, 0x68, 0x65, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65,
+ 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x62, 0x3c, 0x2f, 0x65, 0x6c,
+ 0x3e, 0x2e, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63,
+ 0x61, 0x73, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x77, 0x6f,
+ 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x0d,
+ 0x0a, 0x74, 0x6f, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x62, 0x3c, 0x2f, 0x65,
+ 0x6c, 0x3e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f,
+ 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f,
+ 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x72, 0x65,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x6d, 0x61, 0x6b,
+ 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65,
+ 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x28, 0x62, 0x2c, 0x0d, 0x0a, 0x28, 0x63, 0x20, 0x7c, 0x20, 0x64,
+ 0x29, 0x29, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x2e, 0x20, 0x41,
+ 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x3c, 0x65,
+ 0x6c, 0x3e, 0x62, 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x20, 0x6e, 0x6f, 0x77,
+ 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x20,
+ 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0d,
+ 0x0a, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+ 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x20, 0x54,
+ 0x68, 0x65, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64,
+ 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x3c, 0x6c,
+ 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72,
+ 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65,
+ 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c,
+ 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31,
+ 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x39, 0x35,
+ 0x22, 0x3e, 0x5b, 0x45, 0x39, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f, 0x63,
+ 0x3e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x2f,
+ 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x3e, 0x20, 0x64, 0x6f,
+ 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74,
+ 0x6f, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x61, 0x68, 0x65, 0x61, 0x64,
+ 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x68, 0x61, 0x74,
+ 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x3b, 0x20, 0x65, 0x69,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x63, 0x3c, 0x2f,
+ 0x65, 0x6c, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x3c, 0x65, 0x6c, 0x3e, 0x64,
+ 0x3c, 0x2f, 0x65, 0x6c, 0x3e, 0x0d, 0x0a, 0x77, 0x6f, 0x75, 0x6c, 0x64,
+ 0x20, 0x62, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x4d, 0x6f,
+ 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x6c, 0x79, 0x3a,
+ 0x20, 0x61, 0x20, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x20, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x6f,
+ 0x6e, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f,
+ 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x0d, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x75, 0x73, 0x69,
+ 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64,
+ 0x61, 0x72, 0x64, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68,
+ 0x6d, 0x73, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x61, 0x6c, 0x67,
+ 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x20, 0x33, 0x2e, 0x35, 0x20, 0x69,
+ 0x6e, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x2e,
+ 0x39, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x41, 0x68, 0x6f, 0x2c, 0x20, 0x53,
+ 0x65, 0x74, 0x68, 0x69, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x55, 0x6c,
+ 0x6c, 0x6d, 0x61, 0x6e, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66,
+ 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x41, 0x68, 0x6f, 0x22, 0x2f, 0x3e,
+ 0x2e, 0x20, 0x49, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x73, 0x75,
+ 0x63, 0x68, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d,
+ 0x73, 0x2c, 0x20, 0x61, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x0d,
+ 0x0a, 0x73, 0x65, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73,
+ 0x74, 0x72, 0x75, 0x63, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
+ 0x65, 0x61, 0x63, 0x68, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67,
+ 0x75, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73,
+ 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x2c, 0x20, 0x65,
+ 0x61, 0x63, 0x68, 0x0d, 0x0a, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x6e, 0x6f,
+ 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79,
+ 0x6e, 0x74, 0x61, 0x78, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61,
+ 0x72, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+ 0x29, 0x3b, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x6f,
+ 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x68, 0x61, 0x73, 0x20,
+ 0x61, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x73, 0x65, 0x74,
+ 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x6f,
+ 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20,
+ 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6f,
+ 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0d, 0x0a,
+ 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64,
+ 0x65, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62,
+ 0x65, 0x0d, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20,
+ 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x41, 0x6c, 0x67,
+ 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x73, 0x20, 0x65, 0x78, 0x69, 0x73,
+ 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64,
+ 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x0d, 0x0a, 0x6d, 0x6f,
+ 0x64, 0x65, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x72,
+ 0x65, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d,
+ 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20,
+ 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x64,
+ 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x69, 0x63,
+ 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x3b, 0x20, 0x73, 0x65, 0x65,
+ 0x0d, 0x0a, 0x42, 0x72, 0xfc, 0x67, 0x67, 0x65, 0x6d, 0x61, 0x6e, 0x6e,
+ 0x2d, 0x4b, 0x6c, 0x65, 0x69, 0x6e, 0x20, 0x31, 0x39, 0x39, 0x31, 0x20,
+ 0x3c, 0x62, 0x69, 0x62, 0x72, 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d,
+ 0x22, 0x41, 0x42, 0x4b, 0x22, 0x2f, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x64,
+ 0x69, 0x76, 0x31, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x6e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x2d, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x2d, 0x67, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61,
+ 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+ 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39, 0x38, 0x30, 0x32, 0x31, 0x30,
+ 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61, 0x23, 0x45, 0x31, 0x30, 0x35,
+ 0x22, 0x3e, 0x5b, 0x45, 0x31, 0x30, 0x35, 0x5d, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3d, 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66,
+ 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39,
+ 0x39, 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74,
+ 0x61, 0x23, 0x45, 0x34, 0x38, 0x22, 0x3e, 0x5b, 0x45, 0x34, 0x38, 0x5d,
+ 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x41, 0x75, 0x74, 0x6f, 0x64, 0x65,
+ 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x66, 0x20,
+ 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x45, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x73,
+ 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
+ 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61,
+ 0x63, 0x68, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2c, 0x0d, 0x0a,
+ 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x2e, 0x20, 0x42,
+ 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x63,
+ 0x61, 0x6e, 0x0d, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x2c, 0x20, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72,
+ 0x2c, 0x20, 0x69, 0x74, 0x20, 0x61, 0x70, 0x70, 0x61, 0x72, 0x65, 0x6e,
+ 0x74, 0x6c, 0x79, 0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6b,
+ 0x6e, 0x6f, 0x77, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x0d, 0x0a, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75,
+ 0x73, 0x65, 0x26, 0x6d, 0x64, 0x61, 0x73, 0x68, 0x3b, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x74, 0x72, 0x79,
+ 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63,
+ 0x61, 0x74, 0x65, 0x2e, 0x0d, 0x0a, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x73,
+ 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61,
+ 0x20, 0x68, 0x6f, 0x70, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x73, 0x69,
+ 0x74, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x74, 0x20,
+ 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72,
+ 0x65, 0x6c, 0x79, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x6c, 0x65, 0x73, 0x73,
+ 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x2c, 0x20, 0x68, 0x6f,
+ 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75,
+ 0x73, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74,
+ 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x6c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x77,
+ 0x6f, 0x20, 0x77, 0x61, 0x79, 0x73, 0x3a, 0x20, 0x65, 0x61, 0x63, 0x68,
+ 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x69, 0x73, 0x20, 0x61, 0x73, 0x73, 0x75,
+ 0x6d, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f,
+ 0x72, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x20, 0x66, 0x69,
+ 0x6e, 0x69, 0x74, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x0d, 0x0a, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65,
+ 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+ 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20,
+ 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6b,
+ 0x65, 0x0d, 0x0a, 0x69, 0x74, 0x20, 0x66, 0x65, 0x61, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x64, 0x65,
+ 0x74, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64,
+ 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69,
+ 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x20, 0x69, 0x6e, 0x0d, 0x0a, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c,
+ 0x20, 0x63, 0x61, 0x73, 0x65, 0x73, 0x2e, 0x20, 0x41, 0x6c, 0x73, 0x6f,
+ 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x61,
+ 0x73, 0x65, 0x73, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a,
+ 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x64,
+ 0x61, 0x74, 0x61, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x69,
+ 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x20, 0x54, 0x77, 0x6f, 0x20, 0x63,
+ 0x61, 0x73, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20,
+ 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x65,
+ 0x64, 0x2c, 0x0d, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e,
+ 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x65, 0x6e, 0x74,
+ 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65,
+ 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x6f, 0x75, 0x74, 0x2c, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x2c, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x63, 0x63,
+ 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x65,
+ 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x29, 0x20, 0x69, 0x6e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x57, 0x65,
+ 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x63, 0x61, 0x73, 0x65,
+ 0x0d, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x73, 0x65, 0x63, 0x2d, 0x67, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67,
+ 0x2d, 0x6e, 0x6f, 0x2d, 0x65, 0x78, 0x74, 0x2d, 0x69, 0x6e, 0x66, 0x6f,
+ 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x44, 0x65, 0x74,
+ 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x69, 0x74, 0x68, 0x6f,
+ 0x75, 0x74, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20,
+ 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x6e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65,
+ 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x42, 0x65, 0x63, 0x61,
+ 0x75, 0x73, 0x65, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3c, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64,
+ 0x64, 0x22, 0x3e, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x6d,
+ 0x70, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x65, 0x78,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x0d, 0x0a, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x2f, 0x70,
+ 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e,
+ 0x20, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x20, 0x6f, 0x72, 0x20, 0x55, 0x54,
+ 0x46, 0x2d, 0x31, 0x36, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e,
+ 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x20, 0x3c, 0x65, 0x6d, 0x70, 0x68, 0x3e,
+ 0x6d, 0x75, 0x73, 0x74, 0x3c, 0x2f, 0x65, 0x6d, 0x70, 0x68, 0x3e, 0x0d,
+ 0x0a, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64,
+ 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x0d, 0x0a, 0x62, 0x65, 0x20, 0x27, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x26, 0x6c, 0x74, 0x3b, 0x3f, 0x78, 0x6d, 0x6c, 0x3c,
+ 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x27, 0x2c, 0x20, 0x61, 0x6e, 0x79,
+ 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20,
+ 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x63, 0x61,
+ 0x6e, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x61, 0x66,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x77, 0x6f, 0x0d, 0x0a, 0x74, 0x6f, 0x20,
+ 0x66, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x77, 0x68,
+ 0x69, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66,
+ 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x73,
+ 0x65, 0x73, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x2e, 0x20, 0x49, 0x6e,
+ 0x20, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x0d, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x74, 0x20,
+ 0x6d, 0x61, 0x79, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x74, 0x6f, 0x20,
+ 0x6b, 0x6e, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x6e,
+ 0x20, 0x55, 0x43, 0x53, 0x2d, 0x34, 0x2c, 0x20, 0x27, 0x26, 0x6c, 0x74,
+ 0x3b, 0x27, 0x20, 0x69, 0x73, 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65,
+ 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x23, 0x78, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x33, 0x43, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x0d, 0x0a, 0x61, 0x6e,
+ 0x64, 0x20, 0x27, 0x3f, 0x27, 0x20, 0x69, 0x73, 0x20, 0x3c, 0x71, 0x75,
+ 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x23, 0x78,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x46, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2c,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x79, 0x74,
+ 0x65, 0x20, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x72, 0x6b,
+ 0x0d, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x6f,
+ 0x66, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36, 0x20, 0x64, 0x61, 0x74,
+ 0x61, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x20, 0x69, 0x73,
+ 0x20, 0x3c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x23, 0x78, 0x46, 0x45, 0x46, 0x46, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x3e, 0x2e,
+ 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x54, 0x68, 0x65,
+ 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3c, 0x76,
+ 0x61, 0x72, 0x3e, 0x23, 0x23, 0x3c, 0x2f, 0x76, 0x61, 0x72, 0x3e, 0x20,
+ 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64,
+ 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x62, 0x79,
+ 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63,
+ 0x65, 0x70, 0x74, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d,
+ 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e,
+ 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x63, 0x6f, 0x6e,
+ 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x20, 0x3c, 0x76, 0x61,
+ 0x72, 0x3e, 0x23, 0x23, 0x3c, 0x2f, 0x76, 0x61, 0x72, 0x3e, 0x73, 0x20,
+ 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x62, 0x6f,
+ 0x74, 0x68, 0x20, 0x30, 0x30, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x3e, 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x57, 0x69, 0x74, 0x68,
+ 0x20, 0x61, 0x20, 0x42, 0x79, 0x74, 0x65, 0x20, 0x4f, 0x72, 0x64, 0x65,
+ 0x72, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66,
+ 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65,
+ 0x72, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x74, 0x62,
+ 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e,
+ 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x30, 0x30, 0x20, 0x30, 0x30, 0x20,
+ 0x46, 0x45, 0x0d, 0x0a, 0x46, 0x46, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x43,
+ 0x53, 0x2d, 0x34, 0x2c, 0x20, 0x62, 0x69, 0x67, 0x2d, 0x65, 0x6e, 0x64,
+ 0x69, 0x61, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20,
+ 0x28, 0x31, 0x32, 0x33, 0x34, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x29,
+ 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x74,
+ 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e,
+ 0x46, 0x46, 0x0d, 0x0a, 0x46, 0x45, 0x20, 0x30, 0x30, 0x20, 0x30, 0x30,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e,
+ 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x43, 0x53, 0x2d, 0x34, 0x2c, 0x20, 0x6c,
+ 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e,
+ 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x28, 0x34, 0x33,
+ 0x32, 0x31, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x29, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x72,
+ 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x30,
+ 0x30, 0x20, 0x30, 0x30, 0x20, 0x46, 0x46, 0x20, 0x46, 0x45, 0x3c, 0x2f,
+ 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74,
+ 0x64, 0x3e, 0x55, 0x43, 0x53, 0x2d, 0x34, 0x2c, 0x20, 0x75, 0x6e, 0x75,
+ 0x73, 0x75, 0x61, 0x6c, 0x20, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x20, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x20, 0x28, 0x32, 0x31, 0x34, 0x33, 0x29, 0x3c,
+ 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c,
+ 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x46, 0x45, 0x20, 0x46, 0x46, 0x20, 0x30, 0x30, 0x20, 0x30, 0x30,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e,
+ 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x43, 0x53, 0x2d, 0x34, 0x2c, 0x20, 0x75,
+ 0x6e, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x20, 0x6f, 0x63, 0x74, 0x65, 0x74,
+ 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x28, 0x33, 0x34, 0x31, 0x32,
+ 0x29, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x74, 0x72,
+ 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x46, 0x45, 0x20, 0x46, 0x46, 0x20, 0x23, 0x23, 0x20,
+ 0x23, 0x23, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36,
+ 0x2c, 0x20, 0x62, 0x69, 0x67, 0x2d, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e,
+ 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x46, 0x46, 0x20, 0x46, 0x45, 0x20, 0x23, 0x23, 0x20, 0x23,
+ 0x23, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64,
+ 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36, 0x2c,
+ 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x69,
+ 0x61, 0x6e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e,
+ 0x3c, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x45, 0x46, 0x20, 0x42, 0x42, 0x20, 0x42, 0x46,
+ 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e,
+ 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x62, 0x6f,
+ 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64,
+ 0x64, 0x22, 0x3e, 0x57, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61,
+ 0x20, 0x42, 0x79, 0x74, 0x65, 0x20, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20,
+ 0x4d, 0x61, 0x72, 0x6b, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x61, 0x64, 0x64, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d,
+ 0x22, 0x31, 0x22, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x62,
+ 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x74, 0x62, 0x6f, 0x64,
+ 0x79, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x30, 0x30, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+ 0x30, 0x30, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x30, 0x30, 0x26, 0x6e,
+ 0x62, 0x73, 0x70, 0x3b, 0x33, 0x43, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x20,
+ 0x72, 0x6f, 0x77, 0x73, 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x34, 0x22, 0x3e,
+ 0x55, 0x43, 0x53, 0x2d, 0x34, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x33, 0x32, 0x2d, 0x62, 0x69,
+ 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x0d, 0x0a, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x41, 0x53, 0x43,
+ 0x49, 0x49, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x69,
+ 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,
+ 0x6c, 0x79, 0x20, 0x62, 0x69, 0x67, 0x2d, 0x65, 0x6e, 0x64, 0x69, 0x61,
+ 0x6e, 0x20, 0x28, 0x31, 0x32, 0x33, 0x34, 0x29, 0x2c, 0x20, 0x6c, 0x69,
+ 0x74, 0x74, 0x6c, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x0d,
+ 0x0a, 0x28, 0x34, 0x33, 0x32, 0x31, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x74, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x20,
+ 0x62, 0x79, 0x74, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x20,
+ 0x28, 0x32, 0x31, 0x34, 0x33, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x33, 0x34,
+ 0x31, 0x32, 0x29, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64,
+ 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x55, 0x43, 0x53, 0x2d, 0x34, 0x20,
+ 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x75, 0x70,
+ 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x33, 0x32, 0x2d, 0x62, 0x69,
+ 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0d,
+ 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x2e, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c,
+ 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x33, 0x43, 0x20,
+ 0x30, 0x30, 0x20, 0x30, 0x30, 0x20, 0x30, 0x30, 0x3c, 0x2f, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x21,
+ 0x2d, 0x2d, 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x43, 0x53, 0x2d, 0x34, 0x2c,
+ 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x69,
+ 0x61, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x28,
+ 0x34, 0x33, 0x32, 0x31, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x29, 0x3c,
+ 0x2f, 0x74, 0x64, 0x3e, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x74,
+ 0x72, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x30, 0x30, 0x20, 0x30, 0x30, 0x20, 0x33, 0x43,
+ 0x20, 0x30, 0x30, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x3c, 0x74, 0x64,
+ 0x3e, 0x55, 0x43, 0x53, 0x2d, 0x34, 0x2c, 0x20, 0x75, 0x6e, 0x75, 0x73,
+ 0x75, 0x61, 0x6c, 0x20, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x20, 0x6f, 0x72,
+ 0x64, 0x65, 0x72, 0x20, 0x28, 0x32, 0x31, 0x34, 0x33, 0x29, 0x3c, 0x2f,
+ 0x74, 0x64, 0x3e, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x74, 0x72,
+ 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x30, 0x30, 0x20, 0x33, 0x43, 0x20, 0x30, 0x30, 0x20,
+ 0x30, 0x30, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x3c, 0x74, 0x64, 0x3e,
+ 0x55, 0x43, 0x53, 0x2d, 0x34, 0x2c, 0x20, 0x75, 0x6e, 0x75, 0x73, 0x75,
+ 0x61, 0x6c, 0x20, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x20, 0x6f, 0x72, 0x64,
+ 0x65, 0x72, 0x20, 0x28, 0x33, 0x34, 0x31, 0x32, 0x29, 0x3c, 0x2f, 0x74,
+ 0x64, 0x3e, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x74, 0x72, 0x3e,
+ 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x30, 0x30, 0x20, 0x33, 0x43, 0x20, 0x30, 0x30, 0x20, 0x33,
+ 0x46, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64,
+ 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36, 0x42,
+ 0x45, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x67, 0x2d, 0x65, 0x6e, 0x64,
+ 0x69, 0x61, 0x6e, 0x20, 0x49, 0x53, 0x4f, 0x2d, 0x31, 0x30, 0x36, 0x34,
+ 0x36, 0x2d, 0x55, 0x43, 0x53, 0x2d, 0x32, 0x0d, 0x0a, 0x6f, 0x72, 0x20,
+ 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69,
+ 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x31, 0x36,
+ 0x2d, 0x62, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x75, 0x6e,
+ 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x69, 0x67, 0x2d, 0x65, 0x6e,
+ 0x64, 0x69, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x41, 0x53, 0x43, 0x49,
+ 0x49, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x28, 0x74, 0x68,
+ 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
+ 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65,
+ 0x0d, 0x0a, 0x77, 0x68, 0x69, 0x63, 0x68, 0x29, 0x3c, 0x2f, 0x74, 0x64,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74,
+ 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x33, 0x43, 0x20, 0x30,
+ 0x30, 0x20, 0x33, 0x46, 0x20, 0x30, 0x30, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x55,
+ 0x54, 0x46, 0x2d, 0x31, 0x36, 0x4c, 0x45, 0x20, 0x6f, 0x72, 0x20, 0x6c,
+ 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e,
+ 0x0d, 0x0a, 0x49, 0x53, 0x4f, 0x2d, 0x31, 0x30, 0x36, 0x34, 0x36, 0x2d,
+ 0x55, 0x43, 0x53, 0x2d, 0x32, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x31, 0x36, 0x2d, 0x62, 0x69,
+ 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x20,
+ 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2d, 0x65, 0x6e,
+ 0x64, 0x69, 0x61, 0x6e, 0x0d, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x41, 0x53, 0x43, 0x49,
+ 0x49, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x28, 0x74, 0x68,
+ 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64,
+ 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+ 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x29, 0x3c, 0x2f, 0x74, 0x64,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74,
+ 0x64, 0x3e, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x33, 0x43, 0x20, 0x33,
+ 0x46, 0x20, 0x37, 0x38, 0x20, 0x36, 0x44, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64,
+ 0x3e, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x2c, 0x20, 0x49, 0x53, 0x4f, 0x20,
+ 0x36, 0x34, 0x36, 0x2c, 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x2c, 0x20,
+ 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66,
+ 0x20, 0x49, 0x53, 0x4f, 0x20, 0x38, 0x38, 0x35, 0x39, 0x2c, 0x20, 0x53,
+ 0x68, 0x69, 0x66, 0x74, 0x2d, 0x4a, 0x49, 0x53, 0x2c, 0x20, 0x45, 0x55,
+ 0x43, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74,
+ 0x68, 0x65, 0x72, 0x0d, 0x0a, 0x37, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20,
+ 0x38, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x69,
+ 0x78, 0x65, 0x64, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68,
+ 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x41, 0x53, 0x43,
+ 0x49, 0x49, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x69,
+ 0x72, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x77, 0x69, 0x64, 0x74,
+ 0x68, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x73, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61,
+ 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x0d, 0x0a,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64,
+ 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73,
+ 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x62,
+ 0x75, 0x74, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6c, 0x6c,
+ 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x65,
+ 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x75, 0x73, 0x65,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x62, 0x69,
+ 0x74, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x66,
+ 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x76,
+ 0x61, 0x6e, 0x74, 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x0d, 0x0a, 0x74,
+ 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62,
+ 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x6c, 0x69, 0x61,
+ 0x62, 0x6c, 0x79, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72,
+ 0x3e, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x63, 0x6f,
+ 0x64, 0x65, 0x3e, 0x34, 0x43, 0x0d, 0x0a, 0x36, 0x46, 0x20, 0x41, 0x37,
+ 0x20, 0x39, 0x34, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x45, 0x42, 0x43, 0x44, 0x49,
+ 0x43, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x66,
+ 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66,
+ 0x75, 0x6c, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x0d, 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65,
+ 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x65, 0x6c, 0x6c, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x61,
+ 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65,
+ 0x29, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c,
+ 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x4f, 0x74, 0x68, 0x65, 0x72,
+ 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x64, 0x3e, 0x55,
+ 0x54, 0x46, 0x2d, 0x38, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74,
+ 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61,
+ 0x6d, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x69, 0x73, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x65, 0x64, 0x0d, 0x0a, 0x28, 0x6c, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+ 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65,
+ 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2c, 0x20,
+ 0x63, 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x61,
+ 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x6f, 0x72,
+ 0x20, 0x65, 0x6e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x0d, 0x0a, 0x69,
+ 0x6e, 0x20, 0x61, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x20,
+ 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6b, 0x69, 0x6e, 0x64,
+ 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f,
+ 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x49, 0x6e, 0x20, 0x63, 0x61, 0x73, 0x65, 0x73, 0x20, 0x61,
+ 0x62, 0x6f, 0x76, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x64,
+ 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,
+ 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64,
+ 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
+ 0x6f, 0x0d, 0x0a, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
+ 0x67, 0x2c, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x34,
+ 0x2e, 0x33, 0x2e, 0x33, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x72,
+ 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
+ 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2c, 0x0d, 0x0a, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65,
+ 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65,
+ 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x0d, 0x0a, 0x65,
+ 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x41,
+ 0x6c, 0x73, 0x6f, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70,
+ 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74,
+ 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73,
+ 0x0d, 0x0a, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e,
+ 0x76, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+ 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x69, 0x74,
+ 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x74,
+ 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x64,
+ 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x69,
+ 0x6e, 0x20, 0x63, 0x61, 0x73, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x72,
+ 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x61,
+ 0x74, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6e, 0x6f, 0x74, 0x65, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x65, 0x76,
+ 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x64, 0x65,
+ 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x65,
+ 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61,
+ 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20,
+ 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66,
+ 0x69, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69,
+ 0x73, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x65, 0x63, 0x65,
+ 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x73,
+ 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x0d, 0x0a, 0x74, 0x68,
+ 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c,
+ 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20,
+ 0x6f, 0x66, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73,
+ 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x65,
+ 0x6c, 0x6c, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x20, 0x66, 0x72, 0x6f,
+ 0x6d, 0x0d, 0x0a, 0x38, 0x38, 0x35, 0x39, 0x2c, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x6f,
+ 0x66, 0x20, 0x38, 0x38, 0x35, 0x39, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20,
+ 0x65, 0x61, 0x63, 0x68, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2c, 0x20,
+ 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e,
+ 0x67, 0x75, 0x69, 0x73, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70,
+ 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x0d, 0x0a, 0x45, 0x42, 0x43, 0x44,
+ 0x49, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65,
+ 0x20, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x73, 0x6f, 0x20, 0x6f, 0x6e, 0x29, 0x2e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x42, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65,
+ 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x72, 0x65,
+ 0x70, 0x65, 0x72, 0x74, 0x6f, 0x69, 0x72, 0x65, 0x20, 0x28, 0x68, 0x6f,
+ 0x77, 0x65, 0x76, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65,
+ 0x64, 0x29, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x2c,
+ 0x0d, 0x0a, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f,
+ 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62,
+ 0x6c, 0x79, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64,
+ 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x73, 0x6f, 0x6f, 0x6e, 0x20,
+ 0x61, 0x73, 0x20, 0x69, 0x74, 0x0d, 0x0a, 0x68, 0x61, 0x73, 0x20, 0x64,
+ 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, 0x6f, 0x66, 0x20,
+ 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x2e, 0x20, 0x53, 0x69, 0x6e,
+ 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69,
+ 0x63, 0x65, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x77, 0x69, 0x64, 0x65,
+ 0x6c, 0x79, 0x0d, 0x0a, 0x75, 0x73, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64,
+ 0x69, 0x6e, 0x67, 0x73, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x69, 0x6e,
+ 0x74, 0x6f, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73,
+ 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x0d, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x72, 0x65, 0x61,
+ 0x73, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x6c, 0x69,
+ 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x2d, 0x62, 0x61, 0x6e, 0x64,
+ 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66,
+ 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x65,
+ 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x0d, 0x0a, 0x65,
+ 0x76, 0x65, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x65, 0x78, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x72, 0x61, 0x6e,
+ 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+ 0x6f, 0x6c, 0x0d, 0x0a, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x61, 0x72,
+ 0x65, 0x20, 0x75, 0x6e, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65,
+ 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20, 0x64, 0x69,
+ 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x4e, 0x6f, 0x74,
+ 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65,
+ 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61,
+ 0x72, 0x73, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65,
+ 0x73, 0x0d, 0x0a, 0x69, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x31, 0x36,
+ 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x20, 0x77,
+ 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x61, 0x75, 0x74, 0x6f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61,
+ 0x6c, 0x77, 0x61, 0x79, 0x73, 0x0d, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x2e,
+ 0x20, 0x41, 0x6c, 0x73, 0x6f, 0x2c, 0x20, 0x3c, 0x2f, 0x70, 0x68, 0x72,
+ 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x43,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20,
+ 0x61, 0x73, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x37, 0x0d, 0x0a, 0x74, 0x68,
+ 0x61, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72,
+ 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x2d, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x6d,
+ 0x61, 0x79, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x62,
+ 0x65, 0x20, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x64,
+ 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x3c, 0x2f, 0x70, 0x68,
+ 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x70, 0x3e, 0x4f, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70,
+ 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x73,
+ 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20,
+ 0x75, 0x73, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20,
+ 0x61, 0x63, 0x74, 0x0d, 0x0a, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72,
+ 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x62, 0x79, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6b,
+ 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61,
+ 0x74, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x72, 0x6f, 0x75,
+ 0x74, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63,
+ 0x68, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2c, 0x0d, 0x0a, 0x6f, 0x72, 0x20,
+ 0x62, 0x79, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x20, 0x63, 0x6f,
+ 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x75, 0x6e,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63,
+ 0x68, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20,
+ 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x3c, 0x2f, 0x70,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x61,
+ 0x6e, 0x79, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x0d, 0x0a, 0x69, 0x66, 0x20,
+ 0x61, 0x6e, 0x79, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,
+ 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x27, 0x73, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x74, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x6d, 0x70, 0x6c,
+ 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x6e,
+ 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x6f, 0x75, 0x74, 0x69,
+ 0x6e, 0x65, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x0d, 0x0a,
+ 0x62, 0x65, 0x20, 0x63, 0x61, 0x72, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x61, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x20, 0x6f, 0x66,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e,
+ 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x0d, 0x0a, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x64, 0x69, 0x76, 0x32, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76,
+ 0x32, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63, 0x2d, 0x67, 0x75,
+ 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2d, 0x77, 0x69, 0x74, 0x68, 0x2d,
+ 0x65, 0x78, 0x74, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x68, 0x65, 0x61, 0x64, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x61, 0x64, 0x64, 0x22, 0x3e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50,
+ 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x45,
+ 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x45, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f,
+ 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20,
+ 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73, 0x20,
+ 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c,
+ 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x61,
+ 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x20, 0x62,
+ 0x79, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x0d, 0x0a,
+ 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c,
+ 0x20, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20,
+ 0x66, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6e, 0x65,
+ 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+ 0x6f, 0x6c, 0x73, 0x2e, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x6d, 0x75,
+ 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x0d, 0x0a, 0x73, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61,
+ 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68,
+ 0x65, 0x69, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65,
+ 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x72, 0x65, 0x64, 0x0d, 0x0a, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20,
+ 0x6f, 0x66, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x20,
+ 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x20, 0x73, 0x68, 0x6f,
+ 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+ 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68,
+ 0x65, 0x72, 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x0d, 0x0a, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20,
+ 0x74, 0x6f, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x20, 0x58,
+ 0x4d, 0x4c, 0x2e, 0x20, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e, 0x49,
+ 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72,
+ 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x72, 0x65, 0x66,
+ 0x65, 0x72, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x3c, 0x62, 0x69, 0x62, 0x72,
+ 0x65, 0x66, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x66, 0x63, 0x32,
+ 0x33, 0x37, 0x36, 0x22, 0x2f, 0x3e, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x74,
+ 0x73, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2c,
+ 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e,
+ 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65,
+ 0x3e, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x78, 0x6d, 0x6c, 0x3c, 0x2f, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63,
+ 0x6f, 0x64, 0x65, 0x3e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x6d, 0x6c, 0x3c, 0x2f, 0x63, 0x6f, 0x64,
+ 0x65, 0x3e, 0x20, 0x4d, 0x49, 0x4d, 0x45, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64,
+ 0x65, 0x73, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x75, 0x73, 0x65, 0x66,
+ 0x75, 0x6c, 0x20, 0x67, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e,
+ 0x0d, 0x0a, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x65, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69,
+ 0x74, 0x79, 0x2c, 0x20, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69,
+ 0x6e, 0x67, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x72,
+ 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x2e, 0x3c,
+ 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f, 0x70, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c, 0x70, 0x3e, 0x49, 0x66, 0x20, 0x61,
+ 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
+ 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c,
+ 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x79, 0x74, 0x65, 0x2d,
+ 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66,
+ 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x50, 0x49, 0x20, 0x3c,
+ 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x61, 0x72, 0x65, 0x20,
+ 0x75, 0x73, 0x65, 0x64, 0x20, 0x28, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65,
+ 0x73, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74,
+ 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63,
+ 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x3c, 0x70, 0x68, 0x72, 0x61, 0x73,
+ 0x65, 0x0d, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c,
+ 0x22, 0x3e, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d,
+ 0x22, 0x65, 0x72, 0x72, 0x61, 0x74, 0x75, 0x6d, 0x72, 0x65, 0x66, 0x22,
+ 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+ 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x78, 0x6d, 0x6c, 0x2d, 0x31, 0x39, 0x39,
+ 0x38, 0x30, 0x32, 0x31, 0x30, 0x2d, 0x65, 0x72, 0x72, 0x61, 0x74, 0x61,
+ 0x23, 0x45, 0x37, 0x34, 0x22, 0x3e, 0x5b, 0x45, 0x37, 0x34, 0x5d, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x41, 0x6c, 0x6c, 0x20, 0x6f,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x68, 0x65, 0x75, 0x72, 0x69, 0x73, 0x74,
+ 0x69, 0x63, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73,
+ 0x6f, 0x6c, 0x65, 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x2f, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x75, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d,
+ 0x3e, 0x3c, 0x70, 0x3e, 0x49, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d,
+ 0x4c, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20,
+ 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x20, 0x61, 0x20, 0x4d, 0x49, 0x4d, 0x45, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x78,
+ 0x6d, 0x6c, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0d, 0x0a, 0x74, 0x68,
+ 0x65, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x63, 0x68, 0x61, 0x72,
+ 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x70,
+ 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x6e, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x4d, 0x49, 0x4d, 0x45, 0x20, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x73,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x0d, 0x0a, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+ 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3b, 0x20, 0x61, 0x6c, 0x6c,
+ 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x68, 0x65, 0x75, 0x72, 0x69,
+ 0x73, 0x74, 0x69, 0x63, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x73, 0x6f, 0x6c, 0x65, 0x6c, 0x79, 0x0d, 0x0a, 0x66, 0x6f, 0x72,
+ 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x76,
+ 0x65, 0x72, 0x79, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74,
+ 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x3c,
+ 0x70, 0x3e, 0x49, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x58, 0x4d, 0x4c, 0x20,
+ 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65,
+ 0x6c, 0x69, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68,
+ 0x20, 0x61, 0x20, 0x4d, 0x49, 0x4d, 0x45, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x6d, 0x6c, 0x2c, 0x0d, 0x0a, 0x74, 0x68,
+ 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x79, 0x74, 0x65, 0x2d,
+ 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2d,
+ 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x50, 0x49, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20,
+ 0x28, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x29,
+ 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69,
+ 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
+ 0x67, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72,
+ 0x20, 0x68, 0x65, 0x75, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x0d, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x65,
+ 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72,
+ 0x20, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x2e, 0x3c, 0x2f,
+ 0x70, 0x3e, 0x3c, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x75, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x70, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x54,
+ 0x68, 0x65, 0x73, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x61,
+ 0x70, 0x70, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6e,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x62, 0x73, 0x65, 0x6e, 0x63, 0x65,
+ 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+ 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+ 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0d, 0x0a, 0x69,
+ 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72,
+ 0x2c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d,
+ 0x49, 0x4d, 0x45, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x74, 0x65,
+ 0x78, 0x74, 0x2f, 0x78, 0x6d, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61,
+ 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78,
+ 0x6d, 0x6c, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e,
+ 0x65, 0x64, 0x2c, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63,
+ 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x65,
+ 0x76, 0x61, 0x6e, 0x74, 0x20, 0x52, 0x46, 0x43, 0x20, 0x77, 0x69, 0x6c,
+ 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x64, 0x65, 0x20,
+ 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x32,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x2d,
+ 0x64, 0x69, 0x76, 0x31, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x6e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x2d, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x73, 0x65, 0x63, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x77, 0x67, 0x22, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x57, 0x33, 0x43, 0x20,
+ 0x58, 0x4d, 0x4c, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20,
+ 0x47, 0x72, 0x6f, 0x75, 0x70, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70,
+ 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x77, 0x61, 0x73, 0x20, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
+ 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x57, 0x33, 0x43, 0x0d, 0x0a, 0x58, 0x4d, 0x4c, 0x20, 0x57, 0x6f,
+ 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20,
+ 0x28, 0x57, 0x47, 0x29, 0x2e, 0x20, 0x57, 0x47, 0x20, 0x61, 0x70, 0x70,
+ 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x69, 0x6c, 0x79,
+ 0x0d, 0x0a, 0x69, 0x6d, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74,
+ 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x57, 0x47, 0x20, 0x6d, 0x65, 0x6d, 0x62,
+ 0x65, 0x72, 0x73, 0x20, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f,
+ 0x72, 0x20, 0x69, 0x74, 0x73, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76,
+ 0x61, 0x6c, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72,
+ 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d,
+ 0x65, 0x72, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x0d, 0x0a,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x57,
+ 0x47, 0x20, 0x61, 0x72, 0x65, 0x3a, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x6f, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3e, 0x4a, 0x6f, 0x6e, 0x20, 0x42, 0x6f, 0x73, 0x61, 0x6b, 0x3c, 0x2f,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x53, 0x75, 0x6e, 0x3c, 0x2f, 0x61,
+ 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x43, 0x68, 0x61, 0x69, 0x72, 0x3c, 0x2f,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6d, 0x65, 0x6d,
+ 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+ 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x4a, 0x61, 0x6d, 0x65,
+ 0x73, 0x20, 0x43, 0x6c, 0x61, 0x72, 0x6b, 0x3c, 0x2f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3e, 0x3c, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x54, 0x65, 0x63, 0x68,
+ 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x4c, 0x65, 0x61, 0x64, 0x3c, 0x2f,
+ 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+ 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x54, 0x69, 0x6d, 0x20, 0x42, 0x72,
+ 0x61, 0x79, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66,
+ 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x54, 0x65,
+ 0x78, 0x74, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x4e, 0x65, 0x74, 0x73, 0x63, 0x61, 0x70, 0x65, 0x3c, 0x2f, 0x61,
+ 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x43,
+ 0x6f, 0x2d, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3e, 0x4a, 0x65, 0x61, 0x6e, 0x20, 0x50, 0x61, 0x6f,
+ 0x6c, 0x69, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66,
+ 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x4d, 0x69,
+ 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x3c, 0x2f, 0x61, 0x66, 0x66,
+ 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3e, 0x58, 0x4d, 0x4c, 0x0d, 0x0a, 0x43, 0x6f, 0x2d, 0x65,
+ 0x64, 0x69, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3e, 0x43, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x53, 0x70, 0x65, 0x72, 0x62,
+ 0x65, 0x72, 0x67, 0x2d, 0x4d, 0x63, 0x51, 0x75, 0x65, 0x65, 0x6e, 0x3c,
+ 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c,
+ 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x55, 0x2e, 0x20, 0x6f, 0x66,
+ 0x20, 0x49, 0x6c, 0x6c, 0x2e, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c,
+ 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3e, 0x58, 0x4d, 0x4c, 0x20, 0x43, 0x6f, 0x2d, 0x65, 0x64,
+ 0x69, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d,
+ 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e,
+ 0x44, 0x61, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x6f, 0x6c, 0x6c, 0x79,
+ 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69,
+ 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x57, 0x33, 0x43, 0x3c,
+ 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x3e, 0x3c, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x57, 0x33, 0x43, 0x20, 0x4c,
+ 0x69, 0x61, 0x69, 0x73, 0x6f, 0x6e, 0x3c, 0x2f, 0x72, 0x6f, 0x6c, 0x65,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3e, 0x50, 0x61, 0x75, 0x6c, 0x61, 0x20, 0x41, 0x6e,
+ 0x67, 0x65, 0x72, 0x73, 0x74, 0x65, 0x69, 0x6e, 0x3c, 0x2f, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3e, 0x54, 0x65, 0x78, 0x63, 0x65, 0x6c, 0x3c, 0x2f,
+ 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e,
+ 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3e, 0x53, 0x74, 0x65, 0x76, 0x65, 0x20, 0x44, 0x65, 0x52, 0x6f, 0x73,
+ 0x65, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66,
+ 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x49, 0x4e, 0x53,
+ 0x4f, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3e, 0x44, 0x61, 0x76, 0x65, 0x20, 0x48, 0x6f, 0x6c,
+ 0x6c, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x3e, 0x48, 0x50, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62,
+ 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+ 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x45, 0x6c, 0x69, 0x6f, 0x74,
+ 0x20, 0x4b, 0x69, 0x6d, 0x62, 0x65, 0x72, 0x3c, 0x2f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x49, 0x53, 0x4f, 0x47, 0x45, 0x4e, 0x3c, 0x2f, 0x61,
+ 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c,
+ 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d,
+ 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e,
+ 0x45, 0x76, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x65, 0x72, 0x3c, 0x2f, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x41, 0x72, 0x62, 0x6f, 0x72, 0x54, 0x65,
+ 0x78, 0x74, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x54, 0x6f, 0x6d, 0x20, 0x4d, 0x61, 0x67,
+ 0x6c, 0x69, 0x65, 0x72, 0x79, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e,
+ 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x3e, 0x4e, 0x43, 0x53, 0x41, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c,
+ 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d,
+ 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+ 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x4d, 0x75, 0x72, 0x72,
+ 0x61, 0x79, 0x20, 0x4d, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x79, 0x3c, 0x2f,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22,
+ 0x63, 0x68, 0x67, 0x22, 0x3e, 0x53, 0x6f, 0x66, 0x74, 0x51, 0x75, 0x61,
+ 0x64, 0x2c, 0x20, 0x47, 0x72, 0x69, 0x66, 0x0d, 0x0a, 0x53, 0x41, 0x2c,
+ 0x20, 0x4d, 0x75, 0x7a, 0x6d, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x56,
+ 0x65, 0x6f, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x3c, 0x2f,
+ 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e,
+ 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65,
+ 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x63, 0x68, 0x67, 0x22, 0x3e,
+ 0x4d, 0x55, 0x52, 0x41, 0x54, 0x41, 0x20, 0x4d, 0x61, 0x6b, 0x6f, 0x74,
+ 0x6f, 0x20, 0x28, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x20, 0x47, 0x69,
+ 0x76, 0x65, 0x6e, 0x29, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c,
+ 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e,
+ 0x46, 0x75, 0x6a, 0x69, 0x0d, 0x0a, 0x58, 0x65, 0x72, 0x6f, 0x78, 0x20,
+ 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x3c, 0x2f, 0x61, 0x66, 0x66,
+ 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d,
+ 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d,
+ 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x4a, 0x6f,
+ 0x65, 0x6c, 0x20, 0x4e, 0x61, 0x76, 0x61, 0x3c, 0x2f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x3c, 0x2f, 0x61, 0x66,
+ 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f,
+ 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65,
+ 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x43,
+ 0x6f, 0x6e, 0x6c, 0x65, 0x74, 0x68, 0x20, 0x4f, 0x27, 0x43, 0x6f, 0x6e,
+ 0x6e, 0x65, 0x6c, 0x6c, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c,
+ 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e,
+ 0x56, 0x69, 0x67, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x3c, 0x2f, 0x61, 0x66,
+ 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3e, 0x50, 0x65, 0x74, 0x65, 0x72, 0x20, 0x53, 0x68, 0x61, 0x72, 0x70,
+ 0x65, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66,
+ 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x53, 0x6f, 0x66,
+ 0x74, 0x51, 0x75, 0x61, 0x64, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c,
+ 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d,
+ 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+ 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x4a, 0x6f, 0x68, 0x6e,
+ 0x20, 0x54, 0x69, 0x67, 0x75, 0x65, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+ 0x6c, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x6f, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x64,
+ 0x69, 0x76, 0x31, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x6e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x2d, 0x64, 0x69, 0x76, 0x31, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2d, 0x77, 0x67, 0x22, 0x20,
+ 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61, 0x64, 0x64, 0x22, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x57, 0x33, 0x43, 0x20, 0x58,
+ 0x4d, 0x4c, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75,
+ 0x70, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x70,
+ 0x3e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20,
+ 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x73, 0x20, 0x70, 0x72,
+ 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x57, 0x33, 0x43, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x43, 0x6f,
+ 0x72, 0x65, 0x0d, 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20,
+ 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x28, 0x57, 0x47, 0x29, 0x2e, 0x20,
+ 0x54, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x47, 0x20, 0x61, 0x74,
+ 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x66,
+ 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0d, 0x0a, 0x65, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x65, 0x72, 0x65, 0x3a, 0x3c,
+ 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x6f, 0x72, 0x67, 0x6c, 0x69, 0x73,
+ 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x50, 0x61, 0x75, 0x6c, 0x61, 0x20,
+ 0x41, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x74, 0x65, 0x69, 0x6e, 0x3c, 0x2f,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x56, 0x69, 0x67, 0x6e, 0x65, 0x74,
+ 0x74, 0x65, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x44, 0x61, 0x6e, 0x69, 0x65, 0x6c, 0x20,
+ 0x41, 0x75, 0x73, 0x74, 0x69, 0x6e, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x3e, 0x41, 0x73, 0x6b, 0x20, 0x4a, 0x65, 0x65, 0x76, 0x65, 0x73,
+ 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3e, 0x54, 0x69, 0x6d, 0x20, 0x42, 0x6f, 0x6c, 0x61, 0x6e,
+ 0x64, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x2f, 0x6d, 0x65,
+ 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62,
+ 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x41, 0x6c, 0x6c,
+ 0x65, 0x6e, 0x20, 0x42, 0x72, 0x6f, 0x77, 0x6e, 0x3c, 0x2f, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66,
+ 0x74, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3e, 0x44, 0x61, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x6e,
+ 0x6f, 0x6c, 0x6c, 0x79, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c,
+ 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e,
+ 0x57, 0x33, 0x43, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x53,
+ 0x74, 0x61, 0x66, 0x66, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63,
+ 0x74, 0x3c, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x6d, 0x65,
+ 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62,
+ 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x4a, 0x6f, 0x68,
+ 0x6e, 0x20, 0x43, 0x6f, 0x77, 0x61, 0x6e, 0x3c, 0x2f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x52, 0x65, 0x75, 0x74, 0x65, 0x72, 0x73, 0x20, 0x4c,
+ 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69,
+ 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65,
+ 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x4a,
+ 0x6f, 0x68, 0x6e, 0x20, 0x45, 0x76, 0x64, 0x65, 0x6d, 0x6f, 0x6e, 0x3c,
+ 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c,
+ 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x58, 0x4d, 0x4c, 0x53, 0x6f,
+ 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x6f, 0x72, 0x70,
+ 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x61, 0x66, 0x66,
+ 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c,
+ 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d,
+ 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e,
+ 0x50, 0x61, 0x75, 0x6c, 0x20, 0x47, 0x72, 0x6f, 0x73, 0x73, 0x6f, 0x3c,
+ 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c,
+ 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x41, 0x72, 0x62, 0x6f, 0x72,
+ 0x74, 0x65, 0x78, 0x74, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x72, 0x6f, 0x6c, 0x65, 0x3e,
+ 0x43, 0x6f, 0x2d, 0x43, 0x68, 0x61, 0x69, 0x72, 0x3c, 0x2f, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+ 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x41, 0x72, 0x6e, 0x61, 0x75, 0x64,
+ 0x20, 0x4c, 0x65, 0x20, 0x48, 0x6f, 0x72, 0x73, 0x3c, 0x2f, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3e, 0x49, 0x42, 0x4d, 0x3c, 0x2f, 0x61, 0x66, 0x66,
+ 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x72, 0x6f,
+ 0x6c, 0x65, 0x3e, 0x43, 0x6f, 0x2d, 0x43, 0x68, 0x61, 0x69, 0x72, 0x3c,
+ 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6d, 0x65,
+ 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62,
+ 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x45, 0x76, 0x65,
+ 0x20, 0x4d, 0x61, 0x6c, 0x65, 0x72, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x3e, 0x53, 0x75, 0x6e, 0x20, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73,
+ 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69,
+ 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x72,
+ 0x6f, 0x6c, 0x65, 0x3e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x45,
+ 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x64, 0x69, 0x74, 0x6f,
+ 0x72, 0x3c, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x6d, 0x65,
+ 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62,
+ 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x4a, 0x6f, 0x6e,
+ 0x61, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x3c,
+ 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c,
+ 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x4d, 0x69, 0x63, 0x72, 0x6f,
+ 0x73, 0x6f, 0x66, 0x74, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62,
+ 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+ 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x4d, 0x55, 0x52, 0x41, 0x54,
+ 0x41, 0x20, 0x4d, 0x61, 0x6b, 0x6f, 0x74, 0x6f, 0x20, 0x28, 0x46, 0x41,
+ 0x4d, 0x49, 0x4c, 0x59, 0x20, 0x47, 0x69, 0x76, 0x65, 0x6e, 0x29, 0x3c,
+ 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c,
+ 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x49, 0x42, 0x4d, 0x3c, 0x2f,
+ 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3e, 0x4d, 0x61, 0x72, 0x6b, 0x20, 0x4e, 0x65, 0x65, 0x64,
+ 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e,
+ 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x3e, 0x44, 0x61, 0x74, 0x61, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72,
+ 0x63, 0x68, 0x20, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65,
+ 0x73, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+ 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x44, 0x61, 0x76, 0x69, 0x64, 0x20,
+ 0x4f, 0x72, 0x63, 0x68, 0x61, 0x72, 0x64, 0x3c, 0x2f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x4a, 0x61, 0x6d, 0x63, 0x72, 0x61, 0x63, 0x6b, 0x65,
+ 0x72, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3e, 0x4c, 0x65, 0x77, 0x20, 0x53, 0x68, 0x61, 0x6e,
+ 0x6e, 0x6f, 0x6e, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61,
+ 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x4e,
+ 0x43, 0x52, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x52, 0x69, 0x63, 0x68, 0x61, 0x72, 0x64,
+ 0x20, 0x54, 0x6f, 0x62, 0x69, 0x6e, 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x3e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79,
+ 0x20, 0x6f, 0x66, 0x20, 0x45, 0x64, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67,
+ 0x68, 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+ 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e,
+ 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x44, 0x61, 0x6e, 0x69, 0x65, 0x6c,
+ 0x20, 0x56, 0x65, 0x69, 0x6c, 0x6c, 0x61, 0x72, 0x64, 0x3c, 0x2f, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x57, 0x33, 0x43, 0x3c, 0x2f, 0x61, 0x66,
+ 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x2f,
+ 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65,
+ 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x44,
+ 0x61, 0x6e, 0x20, 0x56, 0x69, 0x6e, 0x74, 0x3c, 0x2f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x3e, 0x4c, 0x65, 0x78, 0x69, 0x63, 0x61, 0x3c, 0x2f, 0x61,
+ 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x3c,
+ 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d,
+ 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e,
+ 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x20, 0x57, 0x61, 0x6c, 0x73, 0x68,
+ 0x3c, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69,
+ 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x53, 0x75, 0x6e, 0x20,
+ 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+ 0x3c, 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+ 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3c,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x46, 0x72, 0x61, 0x6e, 0xe7, 0x6f, 0x69,
+ 0x73, 0x20, 0x59, 0x65, 0x72, 0x67, 0x65, 0x61, 0x75, 0x3c, 0x2f, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x41, 0x6c, 0x69, 0x73, 0x20, 0x54, 0x65,
+ 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x3c, 0x2f,
+ 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x45, 0x72, 0x72, 0x61,
+ 0x74, 0x61, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x45, 0x64, 0x69, 0x74,
+ 0x6f, 0x72, 0x3c, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x6d,
+ 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x6d,
+ 0x62, 0x65, 0x72, 0x3e, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x4b, 0x6f,
+ 0x6e, 0x67, 0x79, 0x69, 0x20, 0x5a, 0x68, 0x6f, 0x75, 0x3c, 0x2f, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3e, 0x3c, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x3c,
+ 0x2f, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x3e, 0x3c, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x6f, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0d, 0x0a,
+ 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x64, 0x69, 0x76,
+ 0x31, 0x3e, 0x0d, 0x0a, 0x3c, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x2d,
+ 0x64, 0x69, 0x76, 0x31, 0x20, 0x64, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x61,
+ 0x64, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+ 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e,
+ 0x6f, 0x74, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d,
+ 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x53, 0x65, 0x63,
+ 0x6f, 0x6e, 0x64, 0x20, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+ 0x77, 0x61, 0x73, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20,
+ 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20,
+ 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
+ 0x58, 0x4d, 0x4c, 0x2f, 0x31, 0x39, 0x39, 0x38, 0x2f, 0x30, 0x36, 0x2f,
+ 0x78, 0x6d, 0x6c, 0x73, 0x70, 0x65, 0x63, 0x2d, 0x76, 0x32, 0x31, 0x2e,
+ 0x64, 0x74, 0x64, 0x22, 0x3e, 0x58, 0x4d, 0x4c, 0x73, 0x70, 0x65, 0x63,
+ 0x0d, 0x0a, 0x44, 0x54, 0x44, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x20,
+ 0x28, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x73, 0x20, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x31, 0x39, 0x39, 0x38,
+ 0x2f, 0x30, 0x36, 0x2f, 0x78, 0x6d, 0x6c, 0x73, 0x70, 0x65, 0x63, 0x2d,
+ 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x76, 0x32, 0x31, 0x2e, 0x68,
+ 0x74, 0x6d, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d,
+ 0x0a, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x2e,
+ 0x20, 0x54, 0x68, 0x65, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x65, 0x72, 0x65, 0x20,
+ 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74,
+ 0x68, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+ 0x6c, 0x6f, 0x63, 0x0d, 0x0a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x31, 0x39, 0x39,
+ 0x38, 0x2f, 0x30, 0x36, 0x2f, 0x78, 0x6d, 0x6c, 0x73, 0x70, 0x65, 0x63,
+ 0x2e, 0x78, 0x73, 0x6c, 0x22, 0x3e, 0x78, 0x6d, 0x6c, 0x73, 0x70, 0x65,
+ 0x63, 0x2e, 0x78, 0x73, 0x6c, 0x3c, 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x2c,
+ 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77,
+ 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x31, 0x39,
+ 0x39, 0x38, 0x2f, 0x30, 0x36, 0x2f, 0x64, 0x69, 0x66, 0x66, 0x73, 0x70,
+ 0x65, 0x63, 0x2e, 0x78, 0x73, 0x6c, 0x22, 0x3e, 0x64, 0x69, 0x66, 0x66,
+ 0x73, 0x70, 0x65, 0x63, 0x2e, 0x78, 0x73, 0x6c, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x6c, 0x6f,
+ 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x58, 0x4d, 0x4c, 0x2f, 0x31, 0x39, 0x39, 0x38, 0x2f, 0x30,
+ 0x36, 0x2f, 0x52, 0x45, 0x43, 0x2d, 0x78, 0x6d, 0x6c, 0x2d, 0x32, 0x65,
+ 0x2e, 0x78, 0x73, 0x6c, 0x22, 0x3e, 0x52, 0x45, 0x43, 0x2d, 0x78, 0x6d,
+ 0x6c, 0x2d, 0x32, 0x65, 0x2e, 0x78, 0x73, 0x6c, 0x3c, 0x2f, 0x6c, 0x6f,
+ 0x63, 0x3e, 0x0d, 0x0a, 0x58, 0x53, 0x4c, 0x54, 0x20, 0x73, 0x74, 0x79,
+ 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x73, 0x2e, 0x20, 0x20, 0x54,
+ 0x68, 0x65, 0x20, 0x50, 0x44, 0x46, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75,
+ 0x63, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74,
+ 0x64, 0x62, 0x2e, 0x75, 0x75, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x6a, 0x61,
+ 0x6e, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x32, 0x70, 0x73, 0x2e, 0x68, 0x74,
+ 0x6d, 0x6c, 0x22, 0x3e, 0x68, 0x74, 0x6d, 0x6c, 0x32, 0x70, 0x73, 0x3c,
+ 0x2f, 0x6c, 0x6f, 0x63, 0x3e, 0x0d, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c,
+ 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x64, 0x69,
+ 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67,
+ 0x72, 0x61, 0x6d, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+ 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x64, 0x69, 0x76, 0x31, 0x3e,
+ 0x0d, 0x0a, 0x3c, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x3e, 0x3c, 0x2f, 0x73,
+ 0x70, 0x65, 0x63, 0x3e, 0x0d, 0x0a
+};
+unsigned int t2_len = 201918;
diff --git a/lib/libUPnP/Neptune/Source/Tests/Zip2/ZipTest2.cpp b/lib/libUPnP/Neptune/Source/Tests/Zip2/ZipTest2.cpp
new file mode 100644
index 0000000..c7d862c
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Tests/Zip2/ZipTest2.cpp
@@ -0,0 +1,92 @@
+/*****************************************************************
+|
+| Zip Test Program 2
+|
+| (c) 2001-2006 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "NptDebug.h"
+
+#if defined(WIN32) && defined(_DEBUG)
+#include <crtdbg.h>
+#endif
+
+#define CHECK(x) \
+ do { \
+ if (!(x)) { \
+ fprintf(stderr, "ERROR line %d \n", __LINE__); \
+ error_hook(); \
+ return -1; \
+ } \
+ } while(0)
+
+
+/*----------------------------------------------------------------------
+| error_hook
++---------------------------------------------------------------------*/
+static void
+error_hook()
+{
+ fprintf(stderr, "STOPPING\n");
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // usage: ZipTest2 zipfile [extract_source extract_dest]
+ if (argc < 2) {
+ fprintf(stderr, "ERROR: filename argument expected\n");
+ return 1;
+ }
+
+ NPT_File file(argv[1]);
+
+ const char* extract_source = NULL;
+ const char* extract_dest = NULL;
+ if (argc > 2) {
+ if (argc != 4) {
+ fprintf(stderr, "ERROR: extract_source and extract_dest arguments expected\n");
+ return 1;
+ }
+ extract_source = argv[2];
+ extract_dest = argv[3];
+ }
+
+ NPT_Result result = file.Open(NPT_FILE_OPEN_MODE_READ);
+ CHECK(NPT_SUCCEEDED(result));
+
+ NPT_InputStreamReference input;
+ file.GetInputStream(input);
+
+ NPT_ZipFile* zipfile = NULL;
+ result = NPT_ZipFile::Parse(*input.AsPointer(), zipfile);
+ CHECK(NPT_SUCCEEDED(result));
+
+ for (unsigned int i=0; i<zipfile->GetEntries().GetItemCount(); i++) {
+ NPT_ZipFile::Entry& entry = zipfile->GetEntries()[i];
+ printf("[%d] - size=%lld bytes, name=%s, compression=%d\n", i, (long long)entry.m_CompressedSize, entry.m_Name.GetChars(), entry.m_CompressionMethod);
+
+ if (extract_source && entry.m_Name == extract_source) {
+ NPT_File output(extract_dest);
+ output.Open(NPT_FILE_OPEN_MODE_CREATE | NPT_FILE_OPEN_MODE_WRITE);
+ NPT_OutputStreamReference out_stream;
+ output.GetOutputStream(out_stream);
+ NPT_InputStream* in_stream_p = NULL;
+ NPT_ZipFile::GetInputStream(entry, input, in_stream_p);
+ NPT_InputStreamReference in_stream(in_stream_p);
+ NPT_StreamToStreamCopy(*in_stream, *out_stream);
+ output.Close();
+ }
+ }
+
+ return 0;
+}
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/config/Generic/config.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/config/Generic/config.h
new file mode 100644
index 0000000..2cff41c
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/config/Generic/config.h
@@ -0,0 +1,126 @@
+/*
+ * Automatically generated header file: don't edit
+ */
+
+#define HAVE_DOT_CONFIG 1
+#undef CONFIG_PLATFORM_LINUX
+#undef CONFIG_PLATFORM_CYGWIN
+#undef CONFIG_PLATFORM_WIN32
+
+/*
+ * General Configuration
+ */
+#define PREFIX "/usr/local"
+#undef CONFIG_DEBUG
+#define CONFIG_STRIP_UNWANTED_SECTIONS 1
+#undef CONFIG_VISUAL_STUDIO_7_0
+#undef CONFIG_VISUAL_STUDIO_8_0
+#define CONFIG_VISUAL_STUDIO_7_0_BASE ""
+#define CONFIG_VISUAL_STUDIO_8_0_BASE ""
+#define CONFIG_EXTRA_CFLAGS_OPTIONS ""
+#define CONFIG_EXTRA_LDFLAGS_OPTIONS ""
+
+/*
+ * SSL Library
+ */
+#undef CONFIG_SSL_SERVER_ONLY
+#define CONFIG_SSL_CERT_VERIFICATION
+#define CONFIG_SSL_ENABLE_CLIENT 1
+#undef CONFIG_SSL_FULL_MODE
+#undef CONFIG_SSL_SKELETON_MODE
+#undef CONFIG_SSL_PROT_LOW
+#define CONFIG_SSL_PROT_MEDIUM 1
+#undef CONFIG_SSL_PROT_HIGH
+#undef CONFIG_SSL_USE_DEFAULT_KEY
+#define CONFIG_SSL_PRIVATE_KEY_LOCATION ""
+#define CONFIG_SSL_PRIVATE_KEY_PASSWORD ""
+#define CONFIG_SSL_X509_CERT_LOCATION ""
+#define CONFIG_SSL_GENERATE_X509_CERT
+#define CONFIG_SSL_X509_COMMON_NAME ""
+#define CONFIG_SSL_X509_ORGANIZATION_NAME ""
+#define CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME ""
+#define CONFIG_SSL_ENABLE_V23_HANDSHAKE 1
+#define CONFIG_SSL_HAS_PEM 1
+#define CONFIG_SSL_USE_PKCS12 1
+#define CONFIG_SSL_EXPIRY_TIME 24
+/* GBG: removed #define CONFIG_X509_MAX_CA_CERTS 256 */
+/* GBG: removed #define CONFIG_SSL_MAX_CERTS 8 */
+#define CONFIG_SSL_CTX_MUTEXING
+#undef CONFIG_USE_DEV_URANDOM
+#undef CONFIG_WIN32_USE_CRYPTO_LIB
+#define CONFIG_OPENSSL_COMPATIBLE 1
+#define CONFIG_PERFORMANCE_TESTING 1
+#define CONFIG_SSL_TEST 1
+#define CONFIG_AXHTTPD 1
+
+/*
+ * Axhttpd Configuration
+ */
+#undef CONFIG_HTTP_STATIC_BUILD
+#define CONFIG_HTTP_PORT 80
+#define CONFIG_HTTP_HTTPS_PORT 443
+#define CONFIG_HTTP_SESSION_CACHE_SIZE 5
+#define CONFIG_HTTP_WEBROOT "../www"
+#define CONFIG_HTTP_TIMEOUT 300
+
+/*
+ * CGI
+ */
+#define CONFIG_HTTP_HAS_CGI 1
+#define CONFIG_HTTP_CGI_EXTENSIONS ".lua,.lp"
+#define CONFIG_HTTP_ENABLE_LUA 1
+#define CONFIG_HTTP_LUA_PREFIX "/usr/local"
+#define CONFIG_HTTP_LUA_CGI_LAUNCHER "/bin/cgi"
+#undef CONFIG_HTTP_BUILD_LUA
+#define CONFIG_HTTP_DIRECTORIES 1
+#define CONFIG_HTTP_HAS_AUTHORIZATION 1
+#undef CONFIG_HTTP_HAS_IPV6
+#undef CONFIG_HTTP_ENABLE_DIFFERENT_USER
+#define CONFIG_HTTP_USER ""
+#define CONFIG_HTTP_VERBOSE 1
+#undef CONFIG_HTTP_IS_DAEMON
+
+/*
+ * Language Bindings
+ */
+#undef CONFIG_BINDINGS
+#undef CONFIG_CSHARP_BINDINGS
+#undef CONFIG_VBNET_BINDINGS
+#define CONFIG_DOT_NET_FRAMEWORK_BASE ""
+#undef CONFIG_JAVA_BINDINGS
+#define CONFIG_JAVA_HOME ""
+#undef CONFIG_PERL_BINDINGS
+#define CONFIG_PERL_CORE ""
+#define CONFIG_PERL_LIB ""
+#undef CONFIG_LUA_BINDINGS
+#define CONFIG_LUA_CORE ""
+
+/*
+ * Samples
+ */
+#define CONFIG_SAMPLES 1
+#define CONFIG_C_SAMPLES 1
+#undef CONFIG_CSHARP_SAMPLES
+#undef CONFIG_VBNET_SAMPLES
+#undef CONFIG_JAVA_SAMPLES
+#undef CONFIG_PERL_SAMPLES
+#undef CONFIG_LUA_SAMPLES
+
+/*
+ * BigInt Options
+ */
+#undef CONFIG_BIGINT_CLASSICAL
+#undef CONFIG_BIGINT_MONTGOMERY
+#define CONFIG_BIGINT_BARRETT 1
+#define CONFIG_BIGINT_CRT 1
+#undef CONFIG_BIGINT_KARATSUBA
+#define MUL_KARATSUBA_THRESH
+#define SQU_KARATSUBA_THRESH
+#define CONFIG_BIGINT_SLIDING_WINDOW 1
+#define CONFIG_BIGINT_SQUARE 1
+#undef CONFIG_BIGINT_CHECK_ON
+#define CONFIG_INTEGER_32BIT 1
+#undef CONFIG_INTEGER_16BIT
+#undef CONFIG_INTEGER_8BIT
+
+
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/config/Win32/config.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/config/Win32/config.h
new file mode 100644
index 0000000..d1c0dc3
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/config/Win32/config.h
@@ -0,0 +1,124 @@
+/*
+ * Automatically generated header file: don't edit
+ */
+
+#undef HAVE_DOT_CONFIG
+#undef CONFIG_PLATFORM_LINUX
+#undef CONFIG_PLATFORM_CYGWIN
+#define CONFIG_PLATFORM_WIN32
+
+/*
+ * General Configuration
+ */
+#define PREFIX "/usr/local"
+#undef CONFIG_DEBUG
+#define CONFIG_STRIP_UNWANTED_SECTIONS 1
+#undef CONFIG_VISUAL_STUDIO_7_0
+#undef CONFIG_VISUAL_STUDIO_8_0
+#define CONFIG_VISUAL_STUDIO_7_0_BASE ""
+#define CONFIG_VISUAL_STUDIO_8_0_BASE ""
+#define CONFIG_EXTRA_CFLAGS_OPTIONS ""
+#define CONFIG_EXTRA_LDFLAGS_OPTIONS ""
+
+/*
+ * SSL Library
+ */
+#undef CONFIG_SSL_SERVER_ONLY
+#define CONFIG_SSL_CERT_VERIFICATION
+#define CONFIG_SSL_ENABLE_CLIENT 1
+#undef CONFIG_SSL_FULL_MODE
+#undef CONFIG_SSL_SKELETON_MODE
+#undef CONFIG_SSL_PROT_LOW
+#define CONFIG_SSL_PROT_MEDIUM 1
+#undef CONFIG_SSL_PROT_HIGH
+#undef CONFIG_SSL_USE_DEFAULT_KEY
+#define CONFIG_SSL_PRIVATE_KEY_LOCATION ""
+#define CONFIG_SSL_PRIVATE_KEY_PASSWORD ""
+#define CONFIG_SSL_X509_CERT_LOCATION ""
+#define CONFIG_SSL_GENERATE_X509_CERT
+#define CONFIG_SSL_X509_COMMON_NAME ""
+#define CONFIG_SSL_X509_ORGANIZATION_NAME ""
+#define CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME ""
+#define CONFIG_SSL_ENABLE_V23_HANDSHAKE 1
+#define CONFIG_SSL_HAS_PEM 1
+#define CONFIG_SSL_USE_PKCS12 1
+#define CONFIG_SSL_EXPIRY_TIME 24
+/* GBG: removed #define CONFIG_X509_MAX_CA_CERTS 256 */
+/* #define CONFIG_SSL_MAX_CERTS 8 */
+#define CONFIG_SSL_CTX_MUTEXING
+#undef CONFIG_USE_DEV_URANDOM
+#undef CONFIG_WIN32_USE_CRYPTO_LIB /* GBG: removed temporarily */
+#define CONFIG_OPENSSL_COMPATIBLE 1
+#define CONFIG_PERFORMANCE_TESTING 1
+#define CONFIG_SSL_TEST 1
+#define CONFIG_AXHTTPD 1
+
+/*
+ * Axhttpd Configuration
+ */
+#undef CONFIG_HTTP_STATIC_BUILD
+#define CONFIG_HTTP_PORT 80
+#define CONFIG_HTTP_HTTPS_PORT 443
+#define CONFIG_HTTP_SESSION_CACHE_SIZE 5
+#define CONFIG_HTTP_WEBROOT "../www"
+#define CONFIG_HTTP_TIMEOUT 300
+
+/*
+ * CGI
+ */
+#define CONFIG_HTTP_HAS_CGI 1
+#define CONFIG_HTTP_CGI_EXTENSIONS ".lua,.lp"
+#define CONFIG_HTTP_ENABLE_LUA 1
+#define CONFIG_HTTP_LUA_PREFIX "/usr/local"
+#define CONFIG_HTTP_LUA_CGI_LAUNCHER "/bin/cgi"
+#undef CONFIG_HTTP_BUILD_LUA
+#define CONFIG_HTTP_DIRECTORIES 1
+#define CONFIG_HTTP_HAS_AUTHORIZATION 1
+#undef CONFIG_HTTP_HAS_IPV6
+#undef CONFIG_HTTP_ENABLE_DIFFERENT_USER
+#define CONFIG_HTTP_USER ""
+#define CONFIG_HTTP_VERBOSE 1
+#undef CONFIG_HTTP_IS_DAEMON
+
+/*
+ * Language Bindings
+ */
+#undef CONFIG_BINDINGS
+#undef CONFIG_CSHARP_BINDINGS
+#undef CONFIG_VBNET_BINDINGS
+#define CONFIG_DOT_NET_FRAMEWORK_BASE ""
+#undef CONFIG_JAVA_BINDINGS
+#define CONFIG_JAVA_HOME ""
+#undef CONFIG_PERL_BINDINGS
+#define CONFIG_PERL_CORE ""
+#define CONFIG_PERL_LIB ""
+#undef CONFIG_LUA_BINDINGS
+#define CONFIG_LUA_CORE ""
+
+/*
+ * Samples
+ */
+#define CONFIG_SAMPLES 1
+#define CONFIG_C_SAMPLES 1
+#undef CONFIG_CSHARP_SAMPLES
+#undef CONFIG_VBNET_SAMPLES
+#undef CONFIG_JAVA_SAMPLES
+#undef CONFIG_PERL_SAMPLES
+#undef CONFIG_LUA_SAMPLES
+
+/*
+ * BigInt Options
+ */
+#undef CONFIG_BIGINT_CLASSICAL
+#undef CONFIG_BIGINT_MONTGOMERY
+#define CONFIG_BIGINT_BARRETT 1
+#define CONFIG_BIGINT_CRT 1
+#undef CONFIG_BIGINT_KARATSUBA
+#define MUL_KARATSUBA_THRESH
+#define SQU_KARATSUBA_THRESH
+#define CONFIG_BIGINT_SLIDING_WINDOW 1
+#define CONFIG_BIGINT_SQUARE 1
+#undef CONFIG_BIGINT_CHECK_ON
+#define CONFIG_INTEGER_32BIT 1
+#undef CONFIG_INTEGER_16BIT
+#undef CONFIG_INTEGER_8BIT
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/aes.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/aes.c
new file mode 100644
index 0000000..2f35a5a
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/aes.c
@@ -0,0 +1,469 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * AES implementation - this is a small code version. There are much faster
+ * versions around but they are much larger in size (i.e. they use large
+ * submix tables).
+ */
+
+#include <string.h>
+#include "os_port.h"
+#include "crypto.h"
+
+/* GBG: don't depend on ntoh */
+#if defined(__ppc__)
+#define NPT_CONFIG_BYTE_ORDER_BIG_ENDIAN 1
+#endif
+#if defined(NPT_CONFIG_BYTE_ORDER_BIG_ENDIAN)
+#define AES_ntohl(x) (x)
+#define AES_htonl(x) (x)
+#else
+#define AES_ntohl(x) ( ((x)>>24) | (((x)>>8)&0x0000FF00) | (((x)<<8)&0x00FF0000) | ((x)<<24) )
+#define AES_htonl(x) AES_ntohl(x)
+#endif
+
+/* all commented out in skeleton mode */
+#ifndef CONFIG_SSL_SKELETON_MODE
+
+#define rot1(x) (((x) << 24) | ((x) >> 8))
+#define rot2(x) (((x) << 16) | ((x) >> 16))
+#define rot3(x) (((x) << 8) | ((x) >> 24))
+
+/*
+ * This cute trick does 4 'mul by two' at once. Stolen from
+ * Dr B. R. Gladman <brg@gladman.uk.net> but I'm sure the u-(u>>7) is
+ * a standard graphics trick
+ * The key to this is that we need to xor with 0x1b if the top bit is set.
+ * a 1xxx xxxx 0xxx 0xxx First we mask the 7bit,
+ * b 1000 0000 0000 0000 then we shift right by 7 putting the 7bit in 0bit,
+ * c 0000 0001 0000 0000 we then subtract (c) from (b)
+ * d 0111 1111 0000 0000 and now we and with our mask
+ * e 0001 1011 0000 0000
+ */
+#define mt 0x80808080
+#define ml 0x7f7f7f7f
+#define mh 0xfefefefe
+#define mm 0x1b1b1b1b
+#define mul2(x,t) ((t)=((x)&mt), \
+ ((((x)+(x))&mh)^(((t)-((t)>>7))&mm)))
+
+#define inv_mix_col(x,f2,f4,f8,f9) (\
+ (f2)=mul2(x,f2), \
+ (f4)=mul2(f2,f4), \
+ (f8)=mul2(f4,f8), \
+ (f9)=(x)^(f8), \
+ (f8)=((f2)^(f4)^(f8)), \
+ (f2)^=(f9), \
+ (f4)^=(f9), \
+ (f8)^=rot3(f2), \
+ (f8)^=rot2(f4), \
+ (f8)^rot1(f9))
+
+/*
+ * AES S-box
+ */
+static const uint8_t aes_sbox[256] =
+{
+ 0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,
+ 0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,
+ 0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,
+ 0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0,
+ 0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,
+ 0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15,
+ 0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,
+ 0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75,
+ 0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,
+ 0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84,
+ 0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,
+ 0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF,
+ 0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,
+ 0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8,
+ 0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,
+ 0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2,
+ 0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,
+ 0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73,
+ 0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,
+ 0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB,
+ 0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,
+ 0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79,
+ 0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,
+ 0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08,
+ 0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,
+ 0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A,
+ 0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,
+ 0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E,
+ 0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,
+ 0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF,
+ 0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,
+ 0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16,
+};
+
+/*
+ * AES is-box
+ */
+static const uint8_t aes_isbox[256] =
+{
+ 0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,
+ 0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,
+ 0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,
+ 0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,
+ 0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,
+ 0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,
+ 0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,
+ 0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,
+ 0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,
+ 0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,
+ 0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,
+ 0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,
+ 0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,
+ 0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,
+ 0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,
+ 0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,
+ 0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,
+ 0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,
+ 0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,
+ 0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,
+ 0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,
+ 0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,
+ 0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,
+ 0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,
+ 0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,
+ 0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,
+ 0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,
+ 0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,
+ 0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,
+ 0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,
+ 0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,
+ 0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d
+};
+
+static const unsigned char Rcon[30]=
+{
+ 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
+ 0x1b,0x36,0x6c,0xd8,0xab,0x4d,0x9a,0x2f,
+ 0x5e,0xbc,0x63,0xc6,0x97,0x35,0x6a,0xd4,
+ 0xb3,0x7d,0xfa,0xef,0xc5,0x91,
+};
+
+/* ----- static functions ----- */
+static void AES_encrypt(const AES_CTX *ctx, uint32_t *data);
+static void AES_decrypt(const AES_CTX *ctx, uint32_t *data);
+
+/* Perform doubling in Galois Field GF(2^8) using the irreducible polynomial
+ x^8+x^4+x^3+x+1 */
+static unsigned char AES_xtime(uint32_t x)
+{
+ return (x&0x80) ? (x<<1)^0x1b : x<<1;
+}
+
+/**
+ * Set up AES with the key/iv and cipher size.
+ */
+void AES_set_key(AES_CTX *ctx, const uint8_t *key,
+ const uint8_t *iv, AES_MODE mode)
+{
+ int i, ii;
+ uint32_t *W, tmp, tmp2;
+ const unsigned char *ip;
+ int words;
+
+ switch (mode)
+ {
+ case AES_MODE_128:
+ i = 10;
+ words = 4;
+ break;
+
+ case AES_MODE_256:
+ i = 14;
+ words = 8;
+ break;
+
+ default: /* fail silently */
+ return;
+ }
+
+ ctx->rounds = i;
+ ctx->key_size = words;
+ W = ctx->ks;
+ for (i = 0; i < words; i+=2)
+ {
+ W[i+0]= ((uint32_t)key[ 0]<<24)|
+ ((uint32_t)key[ 1]<<16)|
+ ((uint32_t)key[ 2]<< 8)|
+ ((uint32_t)key[ 3] );
+ W[i+1]= ((uint32_t)key[ 4]<<24)|
+ ((uint32_t)key[ 5]<<16)|
+ ((uint32_t)key[ 6]<< 8)|
+ ((uint32_t)key[ 7] );
+ key += 8;
+ }
+
+ ip = Rcon;
+ ii = 4 * (ctx->rounds+1);
+ for (i = words; i<ii; i++)
+ {
+ tmp = W[i-1];
+
+ if ((i % words) == 0)
+ {
+ tmp2 =(uint32_t)aes_sbox[(tmp )&0xff]<< 8;
+ tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<<16;
+ tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<24;
+ tmp2|=(uint32_t)aes_sbox[(tmp>>24) ];
+ tmp=tmp2^(((unsigned int)*ip)<<24);
+ ip++;
+ }
+
+ if ((words == 8) && ((i % words) == 4))
+ {
+ tmp2 =(uint32_t)aes_sbox[(tmp )&0xff] ;
+ tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<< 8;
+ tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<16;
+ tmp2|=(uint32_t)aes_sbox[(tmp>>24)&0xff]<<24; /* GBG: added &0xFF to avoid warnings in coverity */
+ tmp=tmp2;
+ }
+
+ W[i]=W[i-words]^tmp;
+ }
+
+ /* copy the iv across */
+ memcpy(ctx->iv, iv, 16);
+}
+
+/**
+ * Change a key for decryption.
+ */
+void AES_convert_key(AES_CTX *ctx)
+{
+ int i;
+ uint32_t *k,w,t1,t2,t3,t4;
+
+ k = ctx->ks;
+ k += 4;
+
+ for (i= ctx->rounds*4; i > 4; i--)
+ {
+ w= *k;
+ w = inv_mix_col(w,t1,t2,t3,t4);
+ *k++ =w;
+ }
+}
+
+/**
+ * Encrypt a byte sequence (with a block size 16) using the AES cipher.
+ */
+void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length)
+{
+ int i;
+ uint32_t tin[4], tout[4], iv[4];
+
+ memcpy(iv, ctx->iv, AES_IV_SIZE);
+ for (i = 0; i < 4; i++)
+ tout[i] = AES_ntohl(iv[i]);
+
+ for (length -= AES_BLOCKSIZE; length >= 0; length -= AES_BLOCKSIZE)
+ {
+ uint32_t msg_32[4];
+ uint32_t out_32[4];
+ memcpy(msg_32, msg, AES_BLOCKSIZE);
+ msg += AES_BLOCKSIZE;
+
+ for (i = 0; i < 4; i++)
+ tin[i] = AES_ntohl(msg_32[i])^tout[i];
+
+ AES_encrypt(ctx, tin);
+
+ for (i = 0; i < 4; i++)
+ {
+ tout[i] = tin[i];
+ out_32[i] = AES_ntohl(tout[i]);
+ }
+
+ memcpy(out, out_32, AES_BLOCKSIZE);
+ out += AES_BLOCKSIZE;
+ }
+
+ for (i = 0; i < 4; i++)
+ iv[i] = AES_htonl(tout[i]);
+ memcpy(ctx->iv, iv, AES_IV_SIZE);
+}
+
+/**
+ * Decrypt a byte sequence (with a block size 16) using the AES cipher.
+ */
+void AES_cbc_decrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length)
+{
+ int i;
+ uint32_t tin[4], xor[4], tout[4], data[4], iv[4];
+
+ memcpy(iv, ctx->iv, AES_IV_SIZE);
+ for (i = 0; i < 4; i++)
+ xor[i] = AES_ntohl(iv[i]);
+
+ for (length -= 16; length >= 0; length -= 16)
+ {
+ uint32_t msg_32[4];
+ uint32_t out_32[4];
+ memcpy(msg_32, msg, AES_BLOCKSIZE);
+ msg += AES_BLOCKSIZE;
+
+ for (i = 0; i < 4; i++)
+ {
+ tin[i] = AES_ntohl(msg_32[i]);
+ data[i] = tin[i];
+ }
+
+ AES_decrypt(ctx, data);
+
+ for (i = 0; i < 4; i++)
+ {
+ tout[i] = data[i]^xor[i];
+ xor[i] = tin[i];
+ out_32[i] = AES_htonl(tout[i]);
+ }
+
+ memcpy(out, out_32, AES_BLOCKSIZE);
+ out += AES_BLOCKSIZE;
+ }
+
+ for (i = 0; i < 4; i++)
+ iv[i] = AES_htonl(xor[i]);
+ memcpy(ctx->iv, iv, AES_IV_SIZE);
+}
+
+/**
+ * Encrypt a single block (16 bytes) of data
+ */
+static void AES_encrypt(const AES_CTX *ctx, uint32_t *data)
+{
+ /* To make this code smaller, generate the sbox entries on the fly.
+ * This will have a really heavy effect upon performance.
+ */
+ uint32_t tmp[4];
+ uint32_t tmp1, old_a0, a0, a1, a2, a3, row;
+ int curr_rnd;
+ int rounds = ctx->rounds;
+ const uint32_t *k = ctx->ks;
+
+ /* Pre-round key addition */
+ for (row = 0; row < 4; row++)
+ data[row] ^= *(k++);
+
+ /* Encrypt one block. */
+ for (curr_rnd = 0; curr_rnd < rounds; curr_rnd++)
+ {
+ /* Perform ByteSub and ShiftRow operations together */
+ for (row = 0; row < 4; row++)
+ {
+ a0 = (uint32_t)aes_sbox[(data[row%4]>>24)&0xFF];
+ a1 = (uint32_t)aes_sbox[(data[(row+1)%4]>>16)&0xFF];
+ a2 = (uint32_t)aes_sbox[(data[(row+2)%4]>>8)&0xFF];
+ a3 = (uint32_t)aes_sbox[(data[(row+3)%4])&0xFF];
+
+ /* Perform MixColumn iff not last round */
+ if (curr_rnd < (rounds - 1))
+ {
+ tmp1 = a0 ^ a1 ^ a2 ^ a3;
+ old_a0 = a0;
+ a0 ^= tmp1 ^ AES_xtime(a0 ^ a1);
+ a1 ^= tmp1 ^ AES_xtime(a1 ^ a2);
+ a2 ^= tmp1 ^ AES_xtime(a2 ^ a3);
+ a3 ^= tmp1 ^ AES_xtime(a3 ^ old_a0);
+ }
+
+ tmp[row] = ((a0 << 24) | (a1 << 16) | (a2 << 8) | a3);
+ }
+
+ /* KeyAddition - note that it is vital that this loop is separate from
+ the MixColumn operation, which must be atomic...*/
+ for (row = 0; row < 4; row++)
+ data[row] = tmp[row] ^ *(k++);
+ }
+}
+
+/**
+ * Decrypt a single block (16 bytes) of data
+ */
+static void AES_decrypt(const AES_CTX *ctx, uint32_t *data)
+{
+ uint32_t tmp[4];
+ uint32_t xt0,xt1,xt2,xt3,xt4,xt5,xt6;
+ uint32_t a0, a1, a2, a3, row;
+ int curr_rnd;
+ int rounds = ctx->rounds;
+ const uint32_t *k = ctx->ks + ((rounds+1)*4);
+
+ /* pre-round key addition */
+ for (row=4; row > 0;row--)
+ data[row-1] ^= *(--k);
+
+ /* Decrypt one block */
+ for (curr_rnd = 0; curr_rnd < rounds; curr_rnd++)
+ {
+ /* Perform ByteSub and ShiftRow operations together */
+ for (row = 4; row > 0; row--)
+ {
+ a0 = aes_isbox[(data[(row+3)%4]>>24)&0xFF];
+ a1 = aes_isbox[(data[(row+2)%4]>>16)&0xFF];
+ a2 = aes_isbox[(data[(row+1)%4]>>8)&0xFF];
+ a3 = aes_isbox[(data[row%4])&0xFF];
+
+ /* Perform MixColumn iff not last round */
+ if (curr_rnd<(rounds-1))
+ {
+ /* The MDS cofefficients (0x09, 0x0B, 0x0D, 0x0E)
+ are quite large compared to encryption; this
+ operation slows decryption down noticeably. */
+ xt0 = AES_xtime(a0^a1);
+ xt1 = AES_xtime(a1^a2);
+ xt2 = AES_xtime(a2^a3);
+ xt3 = AES_xtime(a3^a0);
+ xt4 = AES_xtime(xt0^xt1);
+ xt5 = AES_xtime(xt1^xt2);
+ xt6 = AES_xtime(xt4^xt5);
+
+ xt0 ^= a1^a2^a3^xt4^xt6;
+ xt1 ^= a0^a2^a3^xt5^xt6;
+ xt2 ^= a0^a1^a3^xt4^xt6;
+ xt3 ^= a0^a1^a2^xt5^xt6;
+ tmp[row-1] = ((xt0<<24)|(xt1<<16)|(xt2<<8)|xt3);
+ }
+ else
+ tmp[row-1] = ((a0<<24)|(a1<<16)|(a2<<8)|a3);
+ }
+
+ for (row = 4; row > 0; row--)
+ data[row-1] = tmp[row-1] ^ *(--k);
+ }
+}
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint.c
new file mode 100644
index 0000000..18578ba
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint.c
@@ -0,0 +1,1513 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @defgroup bigint_api Big Integer API
+ * @brief The bigint implementation as used by the axTLS project.
+ *
+ * The bigint library is for RSA encryption/decryption as well as signing.
+ * This code tries to minimise use of malloc/free by maintaining a small
+ * cache. A bigint context may maintain state by being made "permanent".
+ * It be be later released with a bi_depermanent() and bi_free() call.
+ *
+ * It supports the following reduction techniques:
+ * - Classical
+ * - Barrett
+ * - Montgomery
+ *
+ * It also implements the following:
+ * - Karatsuba multiplication
+ * - Squaring
+ * - Sliding window exponentiation
+ * - Chinese Remainder Theorem (implemented in rsa.c).
+ *
+ * All the algorithms used are pretty standard, and designed for different
+ * data bus sizes. Negative numbers are not dealt with at all, so a subtraction
+ * may need to be tested for negativity.
+ *
+ * This library steals some ideas from Jef Poskanzer
+ * <http://cs.marlboro.edu/term/cs-fall02/algorithms/crypto/RSA/bigint>
+ * and GMP <http://www.swox.com/gmp>. It gets most of its implementation
+ * detail from "The Handbook of Applied Cryptography"
+ * <http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf>
+ * @{
+ */
+
+#include <stdlib.h>
+#include <limits.h>
+#include <string.h>
+#include <stdio.h>
+#include <time.h>
+#include "os_port.h"
+#include "bigint.h"
+
+#define V1 v->comps[v->size-1] /**< v1 for division */
+#define V2 v->comps[v->size-2] /**< v2 for division */
+#define U(j) tmp_u->comps[tmp_u->size-j-1] /**< uj for division */
+#define Q(j) quotient->comps[quotient->size-j-1] /**< qj for division */
+
+static bigint *bi_int_multiply(BI_CTX *ctx, bigint *bi, comp i);
+static bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom);
+static bigint *alloc(BI_CTX *ctx, int size);
+static bigint *trim(bigint *bi);
+static void more_comps(bigint *bi, int n);
+#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \
+ defined(CONFIG_BIGINT_MONTGOMERY)
+static bigint *comp_right_shift(bigint *biR, int num_shifts);
+static bigint *comp_left_shift(bigint *biR, int num_shifts);
+#endif
+
+#ifdef CONFIG_BIGINT_CHECK_ON
+static void check(const bigint *bi);
+#else
+#define check(A) /**< disappears in normal production mode */
+#endif
+
+
+/**
+ * @brief Start a new bigint context.
+ * @return A bigint context.
+ */
+BI_CTX *bi_initialize(void)
+{
+ /* calloc() sets everything to zero */
+ BI_CTX *ctx = (BI_CTX *)calloc(1, sizeof(BI_CTX));
+
+ /* the radix */
+ ctx->bi_radix = alloc(ctx, 2);
+ ctx->bi_radix->comps[0] = 0;
+ ctx->bi_radix->comps[1] = 1;
+ bi_permanent(ctx->bi_radix);
+ return ctx;
+}
+
+/**
+ * @brief Close the bigint context and free any resources.
+ *
+ * Free up any used memory - a check is done if all objects were not
+ * properly freed.
+ * @param ctx [in] The bigint session context.
+ */
+void bi_terminate(BI_CTX *ctx)
+{
+ bi_depermanent(ctx->bi_radix);
+ bi_free(ctx, ctx->bi_radix);
+
+ if (ctx->active_count != 0)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("bi_terminate: there were %d un-freed bigints\n",
+ ctx->active_count);
+#endif
+ /*abort();*/ /* GBG */
+ }
+
+ bi_clear_cache(ctx);
+ free(ctx);
+}
+
+/**
+ *@brief Clear the memory cache.
+ */
+void bi_clear_cache(BI_CTX *ctx)
+{
+ bigint *p, *pn;
+
+ if (ctx->free_list == NULL)
+ return;
+
+ for (p = ctx->free_list; p != NULL; p = pn)
+ {
+ pn = p->next;
+ free(p->comps);
+ free(p);
+ }
+
+ ctx->free_count = 0;
+ ctx->free_list = NULL;
+}
+
+/**
+ * @brief Increment the number of references to this object.
+ * It does not do a full copy.
+ * @param bi [in] The bigint to copy.
+ * @return A reference to the same bigint.
+ */
+bigint *bi_copy(bigint *bi)
+{
+ check(bi);
+ if (bi->refs != PERMANENT)
+ bi->refs++;
+ return bi;
+}
+
+/**
+ * @brief Simply make a bigint object "unfreeable" if bi_free() is called on it.
+ *
+ * For this object to be freed, bi_depermanent() must be called.
+ * @param bi [in] The bigint to be made permanent.
+ */
+void bi_permanent(bigint *bi)
+{
+ check(bi);
+ if (bi->refs != 1)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("bi_permanent: refs was not 1\n");
+#endif
+ abort();
+ }
+
+ bi->refs = PERMANENT;
+}
+
+/**
+ * @brief Take a permanent object and make it eligible for freedom.
+ * @param bi [in] The bigint to be made back to temporary.
+ */
+void bi_depermanent(bigint *bi)
+{
+ check(bi);
+ if (bi->refs != PERMANENT)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("bi_depermanent: bigint was not permanent\n");
+#endif
+ abort();
+ }
+
+ bi->refs = 1;
+}
+
+/**
+ * @brief Free a bigint object so it can be used again.
+ *
+ * The memory itself it not actually freed, just tagged as being available
+ * @param ctx [in] The bigint session context.
+ * @param bi [in] The bigint to be freed.
+ */
+void bi_free(BI_CTX *ctx, bigint *bi)
+{
+ check(bi);
+ if (bi->refs == PERMANENT)
+ {
+ return;
+ }
+
+ if (--bi->refs > 0)
+ {
+ return;
+ }
+
+ bi->next = ctx->free_list;
+ ctx->free_list = bi;
+ ctx->free_count++;
+
+ if (--ctx->active_count < 0)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("bi_free: active_count went negative "
+ "- double-freed bigint?\n");
+#endif
+ abort();
+ }
+}
+
+/**
+ * @brief Convert an (unsigned) integer into a bigint.
+ * @param ctx [in] The bigint session context.
+ * @param i [in] The (unsigned) integer to be converted.
+ *
+ */
+bigint *int_to_bi(BI_CTX *ctx, comp i)
+{
+ bigint *biR = alloc(ctx, 1);
+ biR->comps[0] = i;
+ return biR;
+}
+
+/**
+ * @brief Do a full copy of the bigint object.
+ * @param ctx [in] The bigint session context.
+ * @param bi [in] The bigint object to be copied.
+ */
+bigint *bi_clone(BI_CTX *ctx, const bigint *bi)
+{
+ bigint *biR = alloc(ctx, bi->size);
+ check(bi);
+ memcpy(biR->comps, bi->comps, bi->size*COMP_BYTE_SIZE);
+ return biR;
+}
+
+/**
+ * @brief Perform an addition operation between two bigints.
+ * @param ctx [in] The bigint session context.
+ * @param bia [in] A bigint.
+ * @param bib [in] Another bigint.
+ * @return The result of the addition.
+ */
+bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib)
+{
+ int n;
+ comp carry = 0;
+ comp *pa, *pb;
+
+ check(bia);
+ check(bib);
+
+ n = max(bia->size, bib->size);
+ more_comps(bia, n+1);
+ more_comps(bib, n);
+ pa = bia->comps;
+ pb = bib->comps;
+
+ do
+ {
+ comp sl, rl, cy1;
+ sl = *pa + *pb++;
+ rl = sl + carry;
+ cy1 = sl < *pa;
+ carry = cy1 | (rl < sl);
+ *pa++ = rl;
+ } while (--n != 0);
+
+ *pa = carry; /* do overflow */
+ bi_free(ctx, bib);
+ return trim(bia);
+}
+
+/**
+ * @brief Perform a subtraction operation between two bigints.
+ * @param ctx [in] The bigint session context.
+ * @param bia [in] A bigint.
+ * @param bib [in] Another bigint.
+ * @param is_negative [out] If defined, indicates that the result was negative.
+ * is_negative may be null.
+ * @return The result of the subtraction. The result is always positive.
+ */
+bigint *bi_subtract(BI_CTX *ctx,
+ bigint *bia, bigint *bib, int *is_negative)
+{
+ int n = bia->size;
+ comp *pa, *pb, carry = 0;
+
+ check(bia);
+ check(bib);
+
+ more_comps(bib, n);
+ pa = bia->comps;
+ pb = bib->comps;
+
+ do
+ {
+ comp sl, rl, cy1;
+ sl = *pa - *pb++;
+ rl = sl - carry;
+ cy1 = sl > *pa;
+ carry = cy1 | (rl > sl);
+ *pa++ = rl;
+ } while (--n != 0);
+
+ if (is_negative) /* indicate a negative result */
+ {
+ *is_negative = carry;
+ }
+
+ bi_free(ctx, trim(bib)); /* put bib back to the way it was */
+ return trim(bia);
+}
+
+/**
+ * Perform a multiply between a bigint an an (unsigned) integer
+ */
+static bigint *bi_int_multiply(BI_CTX *ctx, bigint *bia, comp b)
+{
+ int j = 0, n = bia->size;
+ bigint *biR = alloc(ctx, n + 1);
+ comp carry = 0;
+ comp *r = biR->comps;
+ comp *a = bia->comps;
+
+ check(bia);
+
+ /* clear things to start with */
+ memset(r, 0, ((n+1)*COMP_BYTE_SIZE));
+
+ do
+ {
+ long_comp tmp = *r + (long_comp)a[j]*b + carry;
+ *r++ = (comp)tmp; /* downsize */
+ carry = (comp)(tmp >> COMP_BIT_SIZE);
+ } while (++j < n);
+
+ *r = carry;
+ bi_free(ctx, bia);
+ return trim(biR);
+}
+
+/**
+ * @brief Does both division and modulo calculations.
+ *
+ * Used extensively when doing classical reduction.
+ * @param ctx [in] The bigint session context.
+ * @param u [in] A bigint which is the numerator.
+ * @param v [in] Either the denominator or the modulus depending on the mode.
+ * @param is_mod [n] Determines if this is a normal division (0) or a reduction
+ * (1).
+ * @return The result of the division/reduction.
+ */
+bigint *bi_divide(BI_CTX *ctx, bigint *u, bigint *v, int is_mod)
+{
+ int n = v->size, m = u->size-n;
+ int j = 0, orig_u_size = u->size;
+ uint8_t mod_offset = ctx->mod_offset;
+ comp d;
+ bigint *quotient, *tmp_u;
+ comp q_dash;
+
+ check(u);
+ check(v);
+
+ /* if doing reduction and we are < mod, then return mod */
+ if (is_mod && bi_compare(v, u) > 0)
+ {
+ bi_free(ctx, v);
+ return u;
+ }
+
+ quotient = alloc(ctx, m+1);
+ tmp_u = alloc(ctx, n+1);
+ v = trim(v); /* make sure we have no leading 0's */
+ d = (comp)((long_comp)COMP_RADIX/(V1+1));
+
+ /* clear things to start with */
+ memset(quotient->comps, 0, ((quotient->size)*COMP_BYTE_SIZE));
+
+ /* normalise */
+ if (d > 1)
+ {
+ u = bi_int_multiply(ctx, u, d);
+
+ if (is_mod)
+ {
+ v = ctx->bi_normalised_mod[mod_offset];
+ }
+ else
+ {
+ v = bi_int_multiply(ctx, v, d);
+ }
+ }
+
+ if (orig_u_size == u->size) /* new digit position u0 */
+ {
+ more_comps(u, orig_u_size + 1);
+ }
+
+ do
+ {
+ /* get a temporary short version of u */
+ memcpy(tmp_u->comps, &u->comps[u->size-n-1-j], (n+1)*COMP_BYTE_SIZE);
+
+ /* calculate q' */
+ if (U(0) == V1)
+ {
+ q_dash = COMP_RADIX-1;
+ }
+ else
+ {
+ q_dash = (comp)(((long_comp)U(0)*COMP_RADIX + U(1))/V1);
+
+ if (v->size > 1 && V2)
+ {
+ /* we are implementing the following:
+ if (V2*q_dash > (((U(0)*COMP_RADIX + U(1) -
+ q_dash*V1)*COMP_RADIX) + U(2))) ... */
+ comp inner = (comp)((long_comp)COMP_RADIX*U(0) + U(1) -
+ (long_comp)q_dash*V1);
+ if ((long_comp)V2*q_dash > (long_comp)inner*COMP_RADIX + U(2))
+ {
+ q_dash--;
+ }
+ }
+ }
+
+ /* multiply and subtract */
+ if (q_dash)
+ {
+ int is_negative;
+ tmp_u = bi_subtract(ctx, tmp_u,
+ bi_int_multiply(ctx, bi_copy(v), q_dash), &is_negative);
+ more_comps(tmp_u, n+1);
+
+ Q(j) = q_dash;
+
+ /* add back */
+ if (is_negative)
+ {
+ Q(j)--;
+ tmp_u = bi_add(ctx, tmp_u, bi_copy(v));
+
+ /* lop off the carry */
+ tmp_u->size--;
+ v->size--;
+ }
+ }
+ else
+ {
+ Q(j) = 0;
+ }
+
+ /* copy back to u */
+ memcpy(&u->comps[u->size-n-1-j], tmp_u->comps, (n+1)*COMP_BYTE_SIZE);
+ } while (++j <= m);
+
+ bi_free(ctx, tmp_u);
+ bi_free(ctx, v);
+
+ if (is_mod) /* get the remainder */
+ {
+ bi_free(ctx, quotient);
+ return bi_int_divide(ctx, trim(u), d);
+ }
+ else /* get the quotient */
+ {
+ bi_free(ctx, u);
+ return trim(quotient);
+ }
+}
+
+/*
+ * Perform an integer divide on a bigint.
+ */
+static bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom)
+{
+ int i = biR->size - 1;
+ long_comp r = 0;
+ (void)ctx; /* GBG: unused */
+
+ check(biR);
+
+ do
+ {
+ r = (r<<COMP_BIT_SIZE) + biR->comps[i];
+ biR->comps[i] = (comp)(r / denom);
+ r %= denom;
+ } while (--i >= 0);
+
+ return trim(biR);
+}
+
+#ifdef CONFIG_BIGINT_MONTGOMERY
+/**
+ * There is a need for the value of integer N' such that B^-1(B-1)-N^-1N'=1,
+ * where B^-1(B-1) mod N=1. Actually, only the least significant part of
+ * N' is needed, hence the definition N0'=N' mod b. We reproduce below the
+ * simple algorithm from an article by Dusse and Kaliski to efficiently
+ * find N0' from N0 and b */
+static comp modular_inverse(bigint *bim)
+{
+ int i;
+ comp t = 1;
+ comp two_2_i_minus_1 = 2; /* 2^(i-1) */
+ long_comp two_2_i = 4; /* 2^i */
+ comp N = bim->comps[0];
+
+ for (i = 2; i <= COMP_BIT_SIZE; i++)
+ {
+ if ((long_comp)N*t%two_2_i >= two_2_i_minus_1)
+ {
+ t += two_2_i_minus_1;
+ }
+
+ two_2_i_minus_1 <<= 1;
+ two_2_i <<= 1;
+ }
+
+ return (comp)(COMP_RADIX-t);
+}
+#endif
+
+#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \
+ defined(CONFIG_BIGINT_MONTGOMERY)
+/**
+ * Take each component and shift down (in terms of components)
+ */
+static bigint *comp_right_shift(bigint *biR, int num_shifts)
+{
+ int i = biR->size-num_shifts;
+ comp *x = biR->comps;
+ comp *y = &biR->comps[num_shifts];
+
+ check(biR);
+
+ if (i <= 0) /* have we completely right shifted? */
+ {
+ biR->comps[0] = 0; /* return 0 */
+ biR->size = 1;
+ return biR;
+ }
+
+ do
+ {
+ *x++ = *y++;
+ } while (--i > 0);
+
+ biR->size -= num_shifts;
+ return biR;
+}
+
+/**
+ * Take each component and shift it up (in terms of components)
+ */
+static bigint *comp_left_shift(bigint *biR, int num_shifts)
+{
+ int i = biR->size-1;
+ comp *x, *y;
+
+ check(biR);
+
+ if (num_shifts <= 0)
+ {
+ return biR;
+ }
+
+ more_comps(biR, biR->size + num_shifts);
+
+ x = &biR->comps[i+num_shifts];
+ y = &biR->comps[i];
+
+ do
+ {
+ *x-- = *y--;
+ } while (i--);
+
+ memset(biR->comps, 0, num_shifts*COMP_BYTE_SIZE); /* zero LS comps */
+ return biR;
+}
+#endif
+
+/**
+ * @brief Allow a binary sequence to be imported as a bigint.
+ * @param ctx [in] The bigint session context.
+ * @param data [in] The data to be converted.
+ * @param size [in] The number of bytes of data.
+ * @return A bigint representing this data.
+ */
+bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int size)
+{
+ bigint *biR = alloc(ctx, (size+COMP_BYTE_SIZE-1)/COMP_BYTE_SIZE);
+ int i, j = 0, offset = 0;
+
+ memset(biR->comps, 0, biR->size*COMP_BYTE_SIZE);
+
+ for (i = size-1; i >= 0; i--)
+ {
+ biR->comps[offset] += data[i] << (j*8);
+
+ if (++j == COMP_BYTE_SIZE)
+ {
+ j = 0;
+ offset ++;
+ }
+ }
+
+ return trim(biR);
+}
+
+#ifdef CONFIG_SSL_FULL_MODE
+/**
+ * @brief The testharness uses this code to import text hex-streams and
+ * convert them into bigints.
+ * @param ctx [in] The bigint session context.
+ * @param data [in] A string consisting of hex characters. The characters must
+ * be in upper case.
+ * @return A bigint representing this data.
+ */
+bigint *bi_str_import(BI_CTX *ctx, const char *data)
+{
+ int size = strlen(data);
+ bigint *biR = alloc(ctx, (size+COMP_NUM_NIBBLES-1)/COMP_NUM_NIBBLES);
+ int i, j = 0, offset = 0;
+ memset(biR->comps, 0, biR->size*COMP_BYTE_SIZE);
+
+ for (i = size-1; i >= 0; i--)
+ {
+ int num = (data[i] <= '9') ? (data[i] - '0') : (data[i] - 'A' + 10);
+ biR->comps[offset] += num << (j*4);
+
+ if (++j == COMP_NUM_NIBBLES)
+ {
+ j = 0;
+ offset ++;
+ }
+ }
+
+ return biR;
+}
+
+void bi_print(const char *label, bigint *x)
+{
+ int i, j;
+
+ if (x == NULL)
+ {
+ printf("%s: (null)\n", label);
+ return;
+ }
+
+ printf("%s: (size %d)\n", label, x->size);
+ for (i = x->size-1; i >= 0; i--)
+ {
+ for (j = COMP_NUM_NIBBLES-1; j >= 0; j--)
+ {
+ comp mask = 0x0f << (j*4);
+ comp num = (x->comps[i] & mask) >> (j*4);
+ putc((num <= 9) ? (num + '0') : (num + 'A' - 10), stdout);
+ }
+ }
+
+ printf("\n");
+}
+#endif
+
+/**
+ * @brief Take a bigint and convert it into a byte sequence.
+ *
+ * This is useful after a decrypt operation.
+ * @param ctx [in] The bigint session context.
+ * @param x [in] The bigint to be converted.
+ * @param data [out] The converted data as a byte stream.
+ * @param size [in] The maximum size of the byte stream. Unused bytes will be
+ * zeroed.
+ */
+void bi_export(BI_CTX *ctx, bigint *x, uint8_t *data, int size)
+{
+ int i, j, k = size-1;
+
+ check(x);
+ memset(data, 0, size); /* ensure all leading 0's are cleared */
+
+ for (i = 0; i < x->size; i++)
+ {
+ for (j = 0; j < COMP_BYTE_SIZE; j++)
+ {
+ comp mask = 0xff << (j*8);
+ int num = (x->comps[i] & mask) >> (j*8);
+ data[k--] = num;
+
+ if (k < 0)
+ {
+ goto buf_done;
+ }
+ }
+ }
+buf_done:
+
+ bi_free(ctx, x);
+}
+
+/**
+ * @brief Pre-calculate some of the expensive steps in reduction.
+ *
+ * This function should only be called once (normally when a session starts).
+ * When the session is over, bi_free_mod() should be called. bi_mod_power()
+ * relies on this function being called.
+ * @param ctx [in] The bigint session context.
+ * @param bim [in] The bigint modulus that will be used.
+ * @param mod_offset [in] There are three moduluii that can be stored - the
+ * standard modulus, and its two primes p and q. This offset refers to which
+ * modulus we are referring to.
+ * @see bi_free_mod(), bi_mod_power().
+ */
+void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset)
+{
+ int k = bim->size;
+ comp d = (comp)((long_comp)COMP_RADIX/(bim->comps[k-1]+1));
+#ifdef CONFIG_BIGINT_MONTGOMERY
+ bigint *R, *R2;
+#endif
+
+ ctx->bi_mod[mod_offset] = bim;
+ bi_permanent(ctx->bi_mod[mod_offset]);
+ ctx->bi_normalised_mod[mod_offset] = bi_int_multiply(ctx, bim, d);
+ bi_permanent(ctx->bi_normalised_mod[mod_offset]);
+
+#if defined(CONFIG_BIGINT_MONTGOMERY)
+ /* set montgomery variables */
+ R = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k-1); /* R */
+ R2 = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k*2-1); /* R^2 */
+ ctx->bi_RR_mod_m[mod_offset] = bi_mod(ctx, R2); /* R^2 mod m */
+ ctx->bi_R_mod_m[mod_offset] = bi_mod(ctx, R); /* R mod m */
+
+ bi_permanent(ctx->bi_RR_mod_m[mod_offset]);
+ bi_permanent(ctx->bi_R_mod_m[mod_offset]);
+
+ ctx->N0_dash[mod_offset] = modular_inverse(ctx->bi_mod[mod_offset]);
+
+#elif defined (CONFIG_BIGINT_BARRETT)
+ ctx->bi_mu[mod_offset] =
+ bi_divide(ctx, comp_left_shift(
+ bi_clone(ctx, ctx->bi_radix), k*2-1), ctx->bi_mod[mod_offset], 0);
+ bi_permanent(ctx->bi_mu[mod_offset]);
+#endif
+}
+
+/**
+ * @brief Used when cleaning various bigints at the end of a session.
+ * @param ctx [in] The bigint session context.
+ * @param mod_offset [in] The offset to use.
+ * @see bi_set_mod().
+ */
+void bi_free_mod(BI_CTX *ctx, int mod_offset)
+{
+ bi_depermanent(ctx->bi_mod[mod_offset]);
+ bi_free(ctx, ctx->bi_mod[mod_offset]);
+#if defined (CONFIG_BIGINT_MONTGOMERY)
+ bi_depermanent(ctx->bi_RR_mod_m[mod_offset]);
+ bi_depermanent(ctx->bi_R_mod_m[mod_offset]);
+ bi_free(ctx, ctx->bi_RR_mod_m[mod_offset]);
+ bi_free(ctx, ctx->bi_R_mod_m[mod_offset]);
+#elif defined(CONFIG_BIGINT_BARRETT)
+ bi_depermanent(ctx->bi_mu[mod_offset]);
+ bi_free(ctx, ctx->bi_mu[mod_offset]);
+#endif
+ bi_depermanent(ctx->bi_normalised_mod[mod_offset]);
+ bi_free(ctx, ctx->bi_normalised_mod[mod_offset]);
+}
+
+/**
+ * Perform a standard multiplication between two bigints.
+ *
+ * Barrett reduction has no need for some parts of the product, so ignore bits
+ * of the multiply. This routine gives Barrett its big performance
+ * improvements over Classical/Montgomery reduction methods.
+ */
+static bigint *regular_multiply(BI_CTX *ctx, bigint *bia, bigint *bib,
+ int inner_partial, int outer_partial)
+{
+ int i = 0, j;
+ int n = bia->size;
+ int t = bib->size;
+ bigint *biR = alloc(ctx, n + t);
+ comp *sr = biR->comps;
+ comp *sa = bia->comps;
+ comp *sb = bib->comps;
+
+ check(bia);
+ check(bib);
+
+ /* clear things to start with */
+ memset(biR->comps, 0, ((n+t)*COMP_BYTE_SIZE));
+
+ do
+ {
+ long_comp tmp;
+ comp carry = 0;
+ int r_index = i;
+ j = 0;
+
+ if (outer_partial && outer_partial-i > 0 && outer_partial < n)
+ {
+ r_index = outer_partial-1;
+ j = outer_partial-i-1;
+ }
+
+ do
+ {
+ if (inner_partial && r_index >= inner_partial)
+ {
+ break;
+ }
+
+ tmp = sr[r_index] + ((long_comp)sa[j])*sb[i] + carry;
+ sr[r_index++] = (comp)tmp; /* downsize */
+ carry = tmp >> COMP_BIT_SIZE;
+ } while (++j < n);
+
+ sr[r_index] = carry;
+ } while (++i < t);
+
+ bi_free(ctx, bia);
+ bi_free(ctx, bib);
+ return trim(biR);
+}
+
+#ifdef CONFIG_BIGINT_KARATSUBA
+/*
+ * Karatsuba improves on regular multiplication due to only 3 multiplications
+ * being done instead of 4. The additional additions/subtractions are O(N)
+ * rather than O(N^2) and so for big numbers it saves on a few operations
+ */
+static bigint *karatsuba(BI_CTX *ctx, bigint *bia, bigint *bib, int is_square)
+{
+ bigint *x0, *x1;
+ bigint *p0, *p1, *p2;
+ int m;
+
+ if (is_square)
+ {
+ m = (bia->size + 1)/2;
+ }
+ else
+ {
+ m = (max(bia->size, bib->size) + 1)/2;
+ }
+
+ x0 = bi_clone(ctx, bia);
+ x0->size = m;
+ x1 = bi_clone(ctx, bia);
+ comp_right_shift(x1, m);
+ bi_free(ctx, bia);
+
+ /* work out the 3 partial products */
+ if (is_square)
+ {
+ p0 = bi_square(ctx, bi_copy(x0));
+ p2 = bi_square(ctx, bi_copy(x1));
+ p1 = bi_square(ctx, bi_add(ctx, x0, x1));
+ }
+ else /* normal multiply */
+ {
+ bigint *y0, *y1;
+ y0 = bi_clone(ctx, bib);
+ y0->size = m;
+ y1 = bi_clone(ctx, bib);
+ comp_right_shift(y1, m);
+ bi_free(ctx, bib);
+
+ p0 = bi_multiply(ctx, bi_copy(x0), bi_copy(y0));
+ p2 = bi_multiply(ctx, bi_copy(x1), bi_copy(y1));
+ p1 = bi_multiply(ctx, bi_add(ctx, x0, x1), bi_add(ctx, y0, y1));
+ }
+
+ p1 = bi_subtract(ctx,
+ bi_subtract(ctx, p1, bi_copy(p2), NULL), bi_copy(p0), NULL);
+
+ comp_left_shift(p1, m);
+ comp_left_shift(p2, 2*m);
+ return bi_add(ctx, p1, bi_add(ctx, p0, p2));
+}
+#endif
+
+/**
+ * @brief Perform a multiplication operation between two bigints.
+ * @param ctx [in] The bigint session context.
+ * @param bia [in] A bigint.
+ * @param bib [in] Another bigint.
+ * @return The result of the multiplication.
+ */
+bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib)
+{
+ check(bia);
+ check(bib);
+
+#ifdef CONFIG_BIGINT_KARATSUBA
+ if (min(bia->size, bib->size) < MUL_KARATSUBA_THRESH)
+ {
+ return regular_multiply(ctx, bia, bib, 0, 0);
+ }
+
+ return karatsuba(ctx, bia, bib, 0);
+#else
+ return regular_multiply(ctx, bia, bib, 0, 0);
+#endif
+}
+
+#ifdef CONFIG_BIGINT_SQUARE
+/*
+ * Perform the actual square operion. It takes into account overflow.
+ */
+static bigint *regular_square(BI_CTX *ctx, bigint *bi)
+{
+ int t = bi->size;
+ int i = 0, j;
+ bigint *biR = alloc(ctx, t*2+1);
+ comp *w = biR->comps;
+ comp *x = bi->comps;
+ long_comp carry;
+ memset(w, 0, biR->size*COMP_BYTE_SIZE);
+
+ do
+ {
+ long_comp tmp = w[2*i] + (long_comp)x[i]*x[i];
+ w[2*i] = (comp)tmp;
+ carry = tmp >> COMP_BIT_SIZE;
+
+ for (j = i+1; j < t; j++)
+ {
+ uint8_t c = 0;
+ long_comp xx = (long_comp)x[i]*x[j];
+ if ((COMP_MAX-xx) < xx)
+ c = 1;
+
+ tmp = (xx<<1);
+
+ if ((COMP_MAX-tmp) < w[i+j])
+ c = 1;
+
+ tmp += w[i+j];
+
+ if ((COMP_MAX-tmp) < carry)
+ c = 1;
+
+ tmp += carry;
+ w[i+j] = (comp)tmp;
+ carry = tmp >> COMP_BIT_SIZE;
+
+ if (c)
+ carry += COMP_RADIX;
+ }
+
+ tmp = w[i+t] + carry;
+ w[i+t] = (comp)tmp;
+ w[i+t+1] = tmp >> COMP_BIT_SIZE;
+ } while (++i < t);
+
+ bi_free(ctx, bi);
+ return trim(biR);
+}
+
+/**
+ * @brief Perform a square operation on a bigint.
+ * @param ctx [in] The bigint session context.
+ * @param bia [in] A bigint.
+ * @return The result of the multiplication.
+ */
+bigint *bi_square(BI_CTX *ctx, bigint *bia)
+{
+ check(bia);
+
+#ifdef CONFIG_BIGINT_KARATSUBA
+ if (bia->size < SQU_KARATSUBA_THRESH)
+ {
+ return regular_square(ctx, bia);
+ }
+
+ return karatsuba(ctx, bia, NULL, 1);
+#else
+ return regular_square(ctx, bia);
+#endif
+}
+#endif
+
+/**
+ * @brief Compare two bigints.
+ * @param bia [in] A bigint.
+ * @param bib [in] Another bigint.
+ * @return -1 if smaller, 1 if larger and 0 if equal.
+ */
+int bi_compare(bigint *bia, bigint *bib)
+{
+ int r, i;
+
+ check(bia);
+ check(bib);
+
+ if (bia->size > bib->size)
+ r = 1;
+ else if (bia->size < bib->size)
+ r = -1;
+ else
+ {
+ comp *a = bia->comps;
+ comp *b = bib->comps;
+
+ /* Same number of components. Compare starting from the high end
+ * and working down. */
+ r = 0;
+ i = bia->size - 1;
+
+ do
+ {
+ if (a[i] > b[i])
+ {
+ r = 1;
+ break;
+ }
+ else if (a[i] < b[i])
+ {
+ r = -1;
+ break;
+ }
+ } while (--i >= 0);
+ }
+
+ return r;
+}
+
+/*
+ * Allocate and zero more components. Does not consume bi.
+ */
+static void more_comps(bigint *bi, int n)
+{
+ if (n > bi->max_comps)
+ {
+ bi->max_comps = max(bi->max_comps * 2, n);
+ bi->comps = (comp*)realloc(bi->comps, bi->max_comps * COMP_BYTE_SIZE);
+ }
+
+ if (n > bi->size)
+ {
+ memset(&bi->comps[bi->size], 0, (n-bi->size)*COMP_BYTE_SIZE);
+ }
+
+ bi->size = n;
+}
+
+/*
+ * Make a new empty bigint. It may just use an old one if one is available.
+ * Otherwise get one off the heap.
+ */
+static bigint *alloc(BI_CTX *ctx, int size)
+{
+ bigint *biR;
+
+ /* Can we recycle an old bigint? */
+ if (ctx->free_list != NULL)
+ {
+ biR = ctx->free_list;
+ ctx->free_list = biR->next;
+ ctx->free_count--;
+
+ if (biR->refs != 0)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("alloc: refs was not 0\n");
+#endif
+ abort(); /* create a stack trace from a core dump */
+ }
+
+ more_comps(biR, size);
+ }
+ else
+ {
+ /* No free bigints available - create a new one. */
+ biR = (bigint *)malloc(sizeof(bigint));
+ biR->comps = (comp*)malloc(size * COMP_BYTE_SIZE);
+ biR->max_comps = size; /* give some space to spare */
+ }
+
+ biR->size = size;
+ biR->refs = 1;
+ biR->next = NULL;
+ ctx->active_count++;
+ return biR;
+}
+
+/*
+ * Work out the highest '1' bit in an exponent. Used when doing sliding-window
+ * exponentiation.
+ */
+static int find_max_exp_index(bigint *biexp)
+{
+ int i = COMP_BIT_SIZE-1;
+ comp shift = COMP_RADIX/2;
+ comp test = biexp->comps[biexp->size-1]; /* assume no leading zeroes */
+
+ check(biexp);
+
+ do
+ {
+ if (test & shift)
+ {
+ return i+(biexp->size-1)*COMP_BIT_SIZE;
+ }
+
+ shift >>= 1;
+ } while (i-- != 0);
+
+ return -1; /* error - must have been a leading 0 */
+}
+
+/*
+ * Is a particular bit is an exponent 1 or 0? Used when doing sliding-window
+ * exponentiation.
+ */
+static int exp_bit_is_one(bigint *biexp, int offset)
+{
+ comp test = biexp->comps[offset / COMP_BIT_SIZE];
+ int num_shifts = offset % COMP_BIT_SIZE;
+ comp shift = 1;
+ int i;
+
+ check(biexp);
+
+ for (i = 0; i < num_shifts; i++)
+ {
+ shift <<= 1;
+ }
+
+ return (test & shift) != 0;
+}
+
+#ifdef CONFIG_BIGINT_CHECK_ON
+/*
+ * Perform a sanity check on bi.
+ */
+static void check(const bigint *bi)
+{
+ if (bi->refs <= 0)
+ {
+ printf("check: zero or negative refs in bigint\n");
+ abort();
+ }
+
+ if (bi->next != NULL)
+ {
+ printf("check: attempt to use a bigint from "
+ "the free list\n");
+ abort();
+ }
+}
+#endif
+
+/*
+ * Delete any leading 0's (and allow for 0).
+ */
+static bigint *trim(bigint *bi)
+{
+ check(bi);
+
+ while (bi->comps[bi->size-1] == 0 && bi->size > 1)
+ {
+ bi->size--;
+ }
+
+ return bi;
+}
+
+#if defined(CONFIG_BIGINT_MONTGOMERY)
+/**
+ * @brief Perform a single montgomery reduction.
+ * @param ctx [in] The bigint session context.
+ * @param bixy [in] A bigint.
+ * @return The result of the montgomery reduction.
+ */
+bigint *bi_mont(BI_CTX *ctx, bigint *bixy)
+{
+ int i = 0, n;
+ uint8_t mod_offset = ctx->mod_offset;
+ bigint *bim = ctx->bi_mod[mod_offset];
+ comp mod_inv = ctx->N0_dash[mod_offset];
+
+ check(bixy);
+
+ if (ctx->use_classical) /* just use classical instead */
+ {
+ return bi_mod(ctx, bixy);
+ }
+
+ n = bim->size;
+
+ do
+ {
+ bixy = bi_add(ctx, bixy, comp_left_shift(
+ bi_int_multiply(ctx, bim, bixy->comps[i]*mod_inv), i));
+ } while (++i < n);
+
+ comp_right_shift(bixy, n);
+
+ if (bi_compare(bixy, bim) >= 0)
+ {
+ bixy = bi_subtract(ctx, bixy, bim, NULL);
+ }
+
+ return bixy;
+}
+
+#elif defined(CONFIG_BIGINT_BARRETT)
+/*
+ * Stomp on the most significant components to give the illusion of a "mod base
+ * radix" operation
+ */
+static bigint *comp_mod(bigint *bi, int mod)
+{
+ check(bi);
+
+ if (bi->size > mod)
+ {
+ bi->size = mod;
+ }
+
+ return bi;
+}
+
+/**
+ * @brief Perform a single Barrett reduction.
+ * @param ctx [in] The bigint session context.
+ * @param bi [in] A bigint.
+ * @return The result of the Barrett reduction.
+ */
+bigint *bi_barrett(BI_CTX *ctx, bigint *bi)
+{
+ bigint *q1, *q2, *q3, *r1, *r2, *r;
+ uint8_t mod_offset = ctx->mod_offset;
+ bigint *bim = ctx->bi_mod[mod_offset];
+ int k = bim->size;
+
+ check(bi);
+ check(bim);
+
+ /* use Classical method instead - Barrett cannot help here */
+ if (bi->size > k*2)
+ {
+ return bi_mod(ctx, bi);
+ }
+
+ q1 = comp_right_shift(bi_clone(ctx, bi), k-1);
+
+ /* do outer partial multiply */
+ q2 = regular_multiply(ctx, q1, ctx->bi_mu[mod_offset], 0, k-1);
+ q3 = comp_right_shift(q2, k+1);
+ r1 = comp_mod(bi, k+1);
+
+ /* do inner partial multiply */
+ r2 = comp_mod(regular_multiply(ctx, q3, bim, k+1, 0), k+1);
+ r = bi_subtract(ctx, r1, r2, NULL);
+
+ /* if (r >= m) r = r - m; */
+ if (bi_compare(r, bim) >= 0)
+ {
+ r = bi_subtract(ctx, r, bim, NULL);
+ }
+
+ return r;
+}
+#endif /* CONFIG_BIGINT_BARRETT */
+
+#ifdef CONFIG_BIGINT_SLIDING_WINDOW
+/*
+ * Work out g1, g3, g5, g7... etc for the sliding-window algorithm
+ */
+static void precompute_slide_window(BI_CTX *ctx, int window, bigint *g1)
+{
+ int k = 1, i;
+ bigint *g2;
+
+ for (i = 0; i < window-1; i++) /* compute 2^(window-1) */
+ {
+ k <<= 1;
+ }
+
+ ctx->g = (bigint **)malloc(k*sizeof(bigint *));
+ ctx->g[0] = bi_clone(ctx, g1);
+ bi_permanent(ctx->g[0]);
+ g2 = bi_residue(ctx, bi_square(ctx, ctx->g[0])); /* g^2 */
+
+ for (i = 1; i < k; i++)
+ {
+ ctx->g[i] = bi_residue(ctx, bi_multiply(ctx, ctx->g[i-1], bi_copy(g2)));
+ bi_permanent(ctx->g[i]);
+ }
+
+ bi_free(ctx, g2);
+ ctx->window = k;
+}
+#endif
+
+/**
+ * @brief Perform a modular exponentiation.
+ *
+ * This function requires bi_set_mod() to have been called previously. This is
+ * one of the optimisations used for performance.
+ * @param ctx [in] The bigint session context.
+ * @param bi [in] The bigint on which to perform the mod power operation.
+ * @param biexp [in] The bigint exponent.
+ * @return The result of the mod exponentiation operation
+ * @see bi_set_mod().
+ */
+bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp)
+{
+ int i = find_max_exp_index(biexp), j, window_size = 1;
+ bigint *biR = int_to_bi(ctx, 1);
+
+#if defined(CONFIG_BIGINT_MONTGOMERY)
+ uint8_t mod_offset = ctx->mod_offset;
+ if (!ctx->use_classical)
+ {
+ /* preconvert */
+ bi = bi_mont(ctx,
+ bi_multiply(ctx, bi, ctx->bi_RR_mod_m[mod_offset])); /* x' */
+ bi_free(ctx, biR);
+ biR = ctx->bi_R_mod_m[mod_offset]; /* A */
+ }
+#endif
+
+ check(bi);
+ check(biexp);
+
+#ifdef CONFIG_BIGINT_SLIDING_WINDOW
+ for (j = i; j > 32; j /= 5) /* work out an optimum size */
+ window_size++;
+
+ /* work out the slide constants */
+ precompute_slide_window(ctx, window_size, bi);
+#else /* just one constant */
+ ctx->g = (bigint **)malloc(sizeof(bigint *));
+ ctx->g[0] = bi_clone(ctx, bi);
+ ctx->window = 1;
+ bi_permanent(ctx->g[0]);
+#endif
+
+ /* if sliding-window is off, then only one bit will be done at a time and
+ * will reduce to standard left-to-right exponentiation */
+ do
+ {
+ if (exp_bit_is_one(biexp, i))
+ {
+ int l = i-window_size+1;
+ int part_exp = 0;
+
+ if (l < 0) /* LSB of exponent will always be 1 */
+ l = 0;
+ else
+ {
+ while (exp_bit_is_one(biexp, l) == 0)
+ l++; /* go back up */
+ }
+
+ /* build up the section of the exponent */
+ for (j = i; j >= l; j--)
+ {
+ biR = bi_residue(ctx, bi_square(ctx, biR));
+ if (exp_bit_is_one(biexp, j))
+ part_exp++;
+
+ if (j != l)
+ part_exp <<= 1;
+ }
+
+ part_exp = (part_exp-1)/2; /* adjust for array */
+ biR = bi_residue(ctx, bi_multiply(ctx, biR, ctx->g[part_exp]));
+ i = l-1;
+ }
+ else /* square it */
+ {
+ biR = bi_residue(ctx, bi_square(ctx, biR));
+ i--;
+ }
+ } while (i >= 0);
+
+ /* cleanup */
+ for (i = 0; i < ctx->window; i++)
+ {
+ bi_depermanent(ctx->g[i]);
+ bi_free(ctx, ctx->g[i]);
+ }
+
+ free(ctx->g);
+ bi_free(ctx, bi);
+ bi_free(ctx, biexp);
+#if defined CONFIG_BIGINT_MONTGOMERY
+ return ctx->use_classical ? biR : bi_mont(ctx, biR); /* convert back */
+#else /* CONFIG_BIGINT_CLASSICAL or CONFIG_BIGINT_BARRETT */
+ return biR;
+#endif
+}
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+/**
+ * @brief Perform a modular exponentiation using a temporary modulus.
+ *
+ * We need this function to check the signatures of certificates. The modulus
+ * of this function is temporary as it's just used for authentication.
+ * @param ctx [in] The bigint session context.
+ * @param bi [in] The bigint to perform the exp/mod.
+ * @param bim [in] The temporary modulus.
+ * @param biexp [in] The bigint exponent.
+ * @return The result of the mod exponentiation operation
+ * @see bi_set_mod().
+ */
+bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi, bigint *bim, bigint *biexp)
+{
+ bigint *biR, *tmp_biR;
+
+ /* Set up a temporary bigint context and transfer what we need between
+ * them. We need to do this since we want to keep the original modulus
+ * which is already in this context. This operation is only called when
+ * doing peer verification, and so is not expensive :-) */
+ BI_CTX *tmp_ctx = bi_initialize();
+ bi_set_mod(tmp_ctx, bi_clone(tmp_ctx, bim), BIGINT_M_OFFSET);
+ tmp_biR = bi_mod_power(tmp_ctx,
+ bi_clone(tmp_ctx, bi),
+ bi_clone(tmp_ctx, biexp));
+ biR = bi_clone(ctx, tmp_biR);
+ bi_free(tmp_ctx, tmp_biR);
+ bi_free_mod(tmp_ctx, BIGINT_M_OFFSET);
+ bi_terminate(tmp_ctx);
+
+ bi_free(ctx, bi);
+ bi_free(ctx, bim);
+ bi_free(ctx, biexp);
+ return biR;
+}
+#endif
+
+#ifdef CONFIG_BIGINT_CRT
+/**
+ * @brief Use the Chinese Remainder Theorem to quickly perform RSA decrypts.
+ *
+ * @param ctx [in] The bigint session context.
+ * @param bi [in] The bigint to perform the exp/mod.
+ * @param dP [in] CRT's dP bigint
+ * @param dQ [in] CRT's dQ bigint
+ * @param p [in] CRT's p bigint
+ * @param q [in] CRT's q bigint
+ * @param qInv [in] CRT's qInv bigint
+ * @return The result of the CRT operation
+ */
+bigint *bi_crt(BI_CTX *ctx, bigint *bi,
+ bigint *dP, bigint *dQ,
+ bigint *p, bigint *q, bigint *qInv)
+{
+ bigint *m1, *m2, *h;
+
+ /* Montgomery has a condition the 0 < x, y < m and these products violate
+ * that condition. So disable Montgomery when using CRT */
+#if defined(CONFIG_BIGINT_MONTGOMERY)
+ ctx->use_classical = 1;
+#endif
+ ctx->mod_offset = BIGINT_P_OFFSET;
+ m1 = bi_mod_power(ctx, bi_copy(bi), dP);
+
+ ctx->mod_offset = BIGINT_Q_OFFSET;
+ m2 = bi_mod_power(ctx, bi, dQ);
+
+ h = bi_subtract(ctx, bi_add(ctx, m1, p), bi_copy(m2), NULL);
+ h = bi_multiply(ctx, h, qInv);
+ ctx->mod_offset = BIGINT_P_OFFSET;
+ h = bi_residue(ctx, h);
+#if defined(CONFIG_BIGINT_MONTGOMERY)
+ ctx->use_classical = 0; /* reset for any further operation */
+#endif
+ return bi_add(ctx, m2, bi_multiply(ctx, q, h));
+}
+#endif
+/** @} */
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint.h
new file mode 100644
index 0000000..2966a3e
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef BIGINT_HEADER
+#define BIGINT_HEADER
+
+#include "crypto.h"
+
+BI_CTX *bi_initialize(void);
+void bi_terminate(BI_CTX *ctx);
+void bi_permanent(bigint *bi);
+void bi_depermanent(bigint *bi);
+void bi_clear_cache(BI_CTX *ctx);
+void bi_free(BI_CTX *ctx, bigint *bi);
+bigint *bi_copy(bigint *bi);
+bigint *bi_clone(BI_CTX *ctx, const bigint *bi);
+void bi_export(BI_CTX *ctx, bigint *bi, uint8_t *data, int size);
+bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int len);
+bigint *int_to_bi(BI_CTX *ctx, comp i);
+
+/* the functions that actually do something interesting */
+bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib);
+bigint *bi_subtract(BI_CTX *ctx, bigint *bia,
+ bigint *bib, int *is_negative);
+bigint *bi_divide(BI_CTX *ctx, bigint *bia, bigint *bim, int is_mod);
+bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib);
+bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp);
+bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi, bigint *bim, bigint *biexp);
+int bi_compare(bigint *bia, bigint *bib);
+void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset);
+void bi_free_mod(BI_CTX *ctx, int mod_offset);
+
+#ifdef CONFIG_SSL_FULL_MODE
+void bi_print(const char *label, bigint *bi);
+bigint *bi_str_import(BI_CTX *ctx, const char *data);
+#endif
+
+/**
+ * @def bi_mod
+ * Find the residue of B. bi_set_mod() must be called before hand.
+ */
+#define bi_mod(A, B) bi_divide(A, B, ctx->bi_mod[ctx->mod_offset], 1)
+
+/**
+ * bi_residue() is technically the same as bi_mod(), but it uses the
+ * appropriate reduction technique (which is bi_mod() when doing classical
+ * reduction).
+ */
+#if defined(CONFIG_BIGINT_MONTGOMERY)
+#define bi_residue(A, B) bi_mont(A, B)
+bigint *bi_mont(BI_CTX *ctx, bigint *bixy);
+#elif defined(CONFIG_BIGINT_BARRETT)
+#define bi_residue(A, B) bi_barrett(A, B)
+bigint *bi_barrett(BI_CTX *ctx, bigint *bi);
+#else /* if defined(CONFIG_BIGINT_CLASSICAL) */
+#define bi_residue(A, B) bi_mod(A, B)
+#endif
+
+#ifdef CONFIG_BIGINT_SQUARE
+bigint *bi_square(BI_CTX *ctx, bigint *bi);
+#else
+#define bi_square(A, B) bi_multiply(A, bi_copy(B), B)
+#endif
+
+#ifdef CONFIG_BIGINT_CRT
+bigint *bi_crt(BI_CTX *ctx, bigint *bi,
+ bigint *dP, bigint *dQ,
+ bigint *p, bigint *q,
+ bigint *qInv);
+#endif
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint_impl.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint_impl.h
new file mode 100644
index 0000000..fef6e03
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/bigint_impl.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef BIGINT_IMPL_HEADER
+#define BIGINT_IMPL_HEADER
+
+/* Maintain a number of precomputed variables when doing reduction */
+#define BIGINT_M_OFFSET 0 /**< Normal modulo offset. */
+#ifdef CONFIG_BIGINT_CRT
+#define BIGINT_P_OFFSET 1 /**< p modulo offset. */
+#define BIGINT_Q_OFFSET 2 /**< q module offset. */
+#define BIGINT_NUM_MODS 3 /**< The number of modulus constants used. */
+#else
+#define BIGINT_NUM_MODS 1
+#endif
+
+/* Architecture specific functions for big ints */
+#if defined(CONFIG_INTEGER_8BIT)
+#define COMP_RADIX 256U /**< Max component + 1 */
+#define COMP_MAX 0xFFFFU/**< (Max dbl comp -1) */
+#define COMP_BIT_SIZE 8 /**< Number of bits in a component. */
+#define COMP_BYTE_SIZE 1 /**< Number of bytes in a component. */
+#define COMP_NUM_NIBBLES 2 /**< Used For diagnostics only. */
+typedef uint8_t comp; /**< A single precision component. */
+typedef uint16_t long_comp; /**< A double precision component. */
+typedef int16_t slong_comp; /**< A signed double precision component. */
+#elif defined(CONFIG_INTEGER_16BIT)
+#define COMP_RADIX 65536U /**< Max component + 1 */
+#define COMP_MAX 0xFFFFFFFFU/**< (Max dbl comp -1) */
+#define COMP_BIT_SIZE 16 /**< Number of bits in a component. */
+#define COMP_BYTE_SIZE 2 /**< Number of bytes in a component. */
+#define COMP_NUM_NIBBLES 4 /**< Used For diagnostics only. */
+typedef uint16_t comp; /**< A single precision component. */
+typedef uint32_t long_comp; /**< A double precision component. */
+typedef int32_t slong_comp; /**< A signed double precision component. */
+#else /* regular 32 bit */
+#ifdef WIN32
+#define COMP_RADIX 4294967296i64
+#define COMP_MAX 0xFFFFFFFFFFFFFFFFui64
+#else
+#define COMP_RADIX 4294967296ULL /**< Max component + 1 */
+#define COMP_MAX 0xFFFFFFFFFFFFFFFFULL/**< (Max dbl comp -1) */
+#endif
+#define COMP_BIT_SIZE 32 /**< Number of bits in a component. */
+#define COMP_BYTE_SIZE 4 /**< Number of bytes in a component. */
+#define COMP_NUM_NIBBLES 8 /**< Used For diagnostics only. */
+typedef uint32_t comp; /**< A single precision component. */
+typedef uint64_t long_comp; /**< A double precision component. */
+typedef int64_t slong_comp; /**< A signed double precision component. */
+#endif
+
+/**
+ * @struct _bigint
+ * @brief A big integer basic object
+ */
+struct _bigint
+{
+ struct _bigint* next; /**< The next bigint in the cache. */
+ short size; /**< The number of components in this bigint. */
+ short max_comps; /**< The heapsize allocated for this bigint */
+ int refs; /**< An internal reference count. */
+ comp* comps; /**< A ptr to the actual component data */
+};
+
+typedef struct _bigint bigint; /**< An alias for _bigint */
+
+/**
+ * Maintains the state of the cache, and a number of variables used in
+ * reduction.
+ */
+typedef struct /**< A big integer "session" context. */
+{
+ bigint *active_list; /**< Bigints currently used. */
+ bigint *free_list; /**< Bigints not used. */
+ bigint *bi_radix; /**< The radix used. */
+ bigint *bi_mod[BIGINT_NUM_MODS]; /**< modulus */
+
+#if defined(CONFIG_BIGINT_MONTGOMERY)
+ bigint *bi_RR_mod_m[BIGINT_NUM_MODS]; /**< R^2 mod m */
+ bigint *bi_R_mod_m[BIGINT_NUM_MODS]; /**< R mod m */
+ comp N0_dash[BIGINT_NUM_MODS];
+#elif defined(CONFIG_BIGINT_BARRETT)
+ bigint *bi_mu[BIGINT_NUM_MODS]; /**< Storage for mu */
+#endif
+ bigint *bi_normalised_mod[BIGINT_NUM_MODS]; /**< Normalised mod storage. */
+ bigint **g; /**< Used by sliding-window. */
+ int window; /**< The size of the sliding window */
+ int active_count; /**< Number of active bigints. */
+ int free_count; /**< Number of free bigints. */
+
+#ifdef CONFIG_BIGINT_MONTGOMERY
+ uint8_t use_classical; /**< Use classical reduction. */
+#endif
+ uint8_t mod_offset; /**< The mod offset we are using */
+} BI_CTX;
+
+#ifndef WIN32
+#define max(a,b) ((a)>(b)?(a):(b)) /**< Find the maximum of 2 numbers. */
+#define min(a,b) ((a)<(b)?(a):(b)) /**< Find the minimum of 2 numbers. */
+#endif
+
+#define PERMANENT 0x7FFF55AA /**< A magic number for permanents. */
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/crypto.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/crypto.h
new file mode 100644
index 0000000..dbd2223
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/crypto.h
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file crypto.h
+ */
+
+#ifndef HEADER_CRYPTO_H
+#define HEADER_CRYPTO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "config.h"
+#include "bigint_impl.h"
+#include "bigint.h"
+
+/* enable features based on a 'super-set' capbaility. */
+#if defined(CONFIG_SSL_FULL_MODE)
+#define CONFIG_SSL_ENABLE_CLIENT
+#define CONFIG_SSL_CERT_VERIFICATION
+#elif defined(CONFIG_SSL_ENABLE_CLIENT)
+#define CONFIG_SSL_CERT_VERIFICATION
+#endif
+
+/**************************************************************************
+ * AES declarations
+ **************************************************************************/
+
+#define AES_MAXROUNDS 14
+#define AES_BLOCKSIZE 16
+#define AES_IV_SIZE 16
+
+typedef struct aes_key_st
+{
+ uint16_t rounds;
+ uint16_t key_size;
+ uint32_t ks[(AES_MAXROUNDS+1)*8];
+ uint8_t iv[AES_IV_SIZE];
+} AES_CTX;
+
+typedef enum
+{
+ AES_MODE_128,
+ AES_MODE_256
+} AES_MODE;
+
+void AES_set_key(AES_CTX *ctx, const uint8_t *key,
+ const uint8_t *iv, AES_MODE mode);
+void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg,
+ uint8_t *out, int length);
+void AES_cbc_decrypt(AES_CTX *ks, const uint8_t *in, uint8_t *out, int length);
+void AES_convert_key(AES_CTX *ctx);
+
+/**************************************************************************
+ * RC4 declarations
+ **************************************************************************/
+
+typedef struct
+{
+ uint8_t x, y, m[256];
+} RC4_CTX;
+
+void RC4_setup(RC4_CTX *s, const uint8_t *key, int length);
+void RC4_crypt(RC4_CTX *s, const uint8_t *msg, uint8_t *data, int length);
+
+/**************************************************************************
+ * SHA256 declarations
+ **************************************************************************/
+#define SHA256_SIZE 32
+
+/**************************************************************************
+ * SHA1 declarations
+ **************************************************************************/
+
+#define SHA1_SIZE 20
+
+/*
+ * This structure will hold context information for the SHA-1
+ * hashing operation
+ */
+typedef struct
+{
+ uint32_t Intermediate_Hash[SHA1_SIZE/4]; /* Message Digest */
+ uint32_t Length_Low; /* Message length in bits */
+ uint32_t Length_High; /* Message length in bits */
+ uint16_t Message_Block_Index; /* Index into message block array */
+ uint8_t Message_Block[64]; /* 512-bit message blocks */
+} SHA1_CTX;
+
+void SHA1_Init(SHA1_CTX *);
+void SHA1_Update(SHA1_CTX *, const uint8_t * msg, int len);
+void SHA1_Final(uint8_t *digest, SHA1_CTX *);
+
+/**************************************************************************
+ * MD2 declarations
+ **************************************************************************/
+
+#define MD2_SIZE 16
+
+typedef struct
+{
+ unsigned char cksum[16]; /* checksum of the data block */
+ unsigned char state[48]; /* intermediate digest state */
+ unsigned char buffer[16]; /* data block being processed */
+ int left; /* amount of data in buffer */
+} MD2_CTX;
+
+EXP_FUNC void STDCALL MD2_Init(MD2_CTX *ctx);
+EXP_FUNC void STDCALL MD2_Update(MD2_CTX *ctx, const uint8_t *input, int ilen);
+EXP_FUNC void STDCALL MD2_Final(uint8_t *digest, MD2_CTX *ctx);
+
+/**************************************************************************
+ * MD5 declarations
+ **************************************************************************/
+
+#define MD5_SIZE 16
+
+typedef struct
+{
+ uint32_t state[4]; /* state (ABCD) */
+ uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ uint8_t buffer[64]; /* input buffer */
+} MD5_CTX;
+
+EXP_FUNC void STDCALL MD5_Init(MD5_CTX *);
+EXP_FUNC void STDCALL MD5_Update(MD5_CTX *, const uint8_t *msg, int len);
+EXP_FUNC void STDCALL MD5_Final(uint8_t *digest, MD5_CTX *);
+
+/**************************************************************************
+ * HMAC declarations
+ **************************************************************************/
+void hmac_md5(const uint8_t *msg, int length, const uint8_t *key,
+ int key_len, uint8_t *digest);
+void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key,
+ int key_len, uint8_t *digest);
+
+/**************************************************************************
+ * RSA declarations
+ **************************************************************************/
+
+typedef struct
+{
+ bigint *m; /* modulus */
+ bigint *e; /* public exponent */
+ bigint *d; /* private exponent */
+#ifdef CONFIG_BIGINT_CRT
+ bigint *p; /* p as in m = pq */
+ bigint *q; /* q as in m = pq */
+ bigint *dP; /* d mod (p-1) */
+ bigint *dQ; /* d mod (q-1) */
+ bigint *qInv; /* q^-1 mod p */
+#endif
+ int num_octets;
+ BI_CTX *bi_ctx;
+} RSA_CTX;
+
+void RSA_priv_key_new(RSA_CTX **rsa_ctx,
+ const uint8_t *modulus, int mod_len,
+ const uint8_t *pub_exp, int pub_len,
+ const uint8_t *priv_exp, int priv_len
+#ifdef CONFIG_BIGINT_CRT
+ , const uint8_t *p, int p_len,
+ const uint8_t *q, int q_len,
+ const uint8_t *dP, int dP_len,
+ const uint8_t *dQ, int dQ_len,
+ const uint8_t *qInv, int qInv_len
+#endif
+ );
+void RSA_pub_key_new(RSA_CTX **rsa_ctx,
+ const uint8_t *modulus, int mod_len,
+ const uint8_t *pub_exp, int pub_len);
+void RSA_free(RSA_CTX *ctx);
+int RSA_decrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint8_t *out_data,
+ int is_decryption);
+bigint *RSA_private(const RSA_CTX *c, bigint *bi_msg);
+#if defined(CONFIG_SSL_CERT_VERIFICATION) || defined(CONFIG_SSL_GENERATE_X509_CERT)
+bigint *RSA_sign_verify(BI_CTX *ctx, const uint8_t *sig, int sig_len,
+ bigint *modulus, bigint *pub_exp);
+bigint *RSA_public(const RSA_CTX * c, bigint *bi_msg);
+int RSA_encrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint16_t in_len,
+ uint8_t *out_data, int is_signing);
+void RSA_print(const RSA_CTX *ctx);
+#endif
+
+/**************************************************************************
+ * RNG declarations
+ **************************************************************************/
+EXP_FUNC void STDCALL RNG_initialize(void);
+EXP_FUNC void STDCALL RNG_custom_init(const uint8_t *seed_buf, int size);
+EXP_FUNC void STDCALL RNG_terminate(void);
+EXP_FUNC void STDCALL get_random(int num_rand_bytes, uint8_t *rand_data);
+void get_random_NZ(int num_rand_bytes, uint8_t *rand_data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/crypto_misc.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/crypto_misc.c
new file mode 100644
index 0000000..c376335
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/crypto_misc.c
@@ -0,0 +1,400 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * Some misc. routines to help things out
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include "os_port.h"
+#include "crypto_misc.h"
+#ifdef CONFIG_WIN32_USE_CRYPTO_LIB
+#include "wincrypt.h"
+#endif
+
+#if !defined(WIN32) && defined(CONFIG_USE_DEV_URANDOM) /* GBG modified */
+static int rng_fd = -1;
+#elif defined(CONFIG_WIN32_USE_CRYPTO_LIB)
+static HCRYPTPROV gCryptProv;
+#endif
+
+#if !defined(CONFIG_USE_DEV_URANDOM) && !defined(CONFIG_WIN32_USE_CRYPTO_LIB) && !defined(WIN32)
+#include <sys/time.h> /* GBG */
+#endif
+
+#if !defined(CONFIG_USE_DEV_URANDOM) && !defined(CONFIG_WIN32_USE_CRYPTO_LIB)
+/* change to processor registers as appropriate */
+#define ENTROPY_POOL_SIZE 32
+#define ENTROPY_COUNTER1 ((((uint64_t)tv.tv_sec)<<32) | tv.tv_usec)
+#define ENTROPY_COUNTER2 rand()
+static uint8_t entropy_pool[ENTROPY_POOL_SIZE];
+#endif
+
+const char * const unsupported_str = "Error: Feature not supported\n";
+
+/* GBG: compatibility layer */
+#if defined(WIN32) && !defined(CONFIG_WIN32_USE_CRYPTO_LIB)
+static int _gettimeofday(struct timeval *tv)
+{
+ if (tv) {
+ FILETIME ft;
+ unsigned __int64 tmpres = 0;
+
+ GetSystemTimeAsFileTime(&ft);
+
+ tmpres |= ft.dwHighDateTime;
+ tmpres <<= 32;
+ tmpres |= ft.dwLowDateTime;
+
+ tmpres /= 10;
+ tv->tv_sec = (long)(tmpres / 1000000UL);
+ tv->tv_usec = (long)(tmpres % 1000000UL);
+ }
+
+ return 0;
+}
+#define gettimeofday(x,y) _gettimeofday(x)
+#endif
+
+#if 0 /* GBG */
+#ifndef CONFIG_SSL_SKELETON_MODE
+/**
+ * Retrieve a file and put it into memory
+ * @return The size of the file, or -1 on failure.
+ */
+int get_file(const char *filename, uint8_t **buf)
+{
+ int total_bytes = 0;
+ int bytes_read = 0;
+ int filesize;
+ FILE *stream = fopen(filename, "rb");
+
+ if (stream == NULL)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("file '%s' does not exist\n", filename); TTY_FLUSH();
+#endif
+ return -1;
+ }
+
+ /* Win CE doesn't support stat() */
+ fseek(stream, 0, SEEK_END);
+ filesize = ftell(stream);
+ *buf = (uint8_t *)malloc(filesize);
+ fseek(stream, 0, SEEK_SET);
+
+ do
+ {
+ bytes_read = fread(*buf+total_bytes, 1, filesize-total_bytes, stream);
+ total_bytes += bytes_read;
+ } while (total_bytes < filesize && bytes_read > 0);
+
+ fclose(stream);
+ return filesize;
+}
+#endif
+#endif
+
+/**
+ * Initialise the Random Number Generator engine.
+ * - On Win32 use the platform SDK's crypto engine.
+ * - On Linux use /dev/urandom
+ * - If none of these work then use a custom RNG.
+ */
+EXP_FUNC void STDCALL RNG_initialize()
+{
+#if !defined(WIN32) && defined(CONFIG_USE_DEV_URANDOM)
+ rng_fd = ax_open("/dev/urandom", O_RDONLY);
+#elif defined(WIN32) && defined(CONFIG_WIN32_USE_CRYPTO_LIB)
+ if (!CryptAcquireContext(&gCryptProv,
+ NULL, NULL, PROV_RSA_FULL, 0))
+ {
+ if (GetLastError() == NTE_BAD_KEYSET &&
+ !CryptAcquireContext(&gCryptProv,
+ NULL,
+ NULL,
+ PROV_RSA_FULL,
+ CRYPT_NEWKEYSET))
+ {
+ printf("CryptoLib: %x\n", unsupported_str, GetLastError());
+ exit(1);
+ }
+ }
+#else
+ /* start of with a stack to copy across */
+ int i = 0; /* GBG */
+ memcpy(entropy_pool, &i, ENTROPY_POOL_SIZE);
+ srand((unsigned int)&i);
+#endif
+}
+
+/**
+ * If no /dev/urandom, then initialise the RNG with something interesting.
+ */
+EXP_FUNC void STDCALL RNG_custom_init(const uint8_t *seed_buf, int size)
+{
+#if defined(WIN32) || defined(CONFIG_WIN32_USE_CRYPTO_LIB)
+ int i;
+
+ for (i = 0; i < ENTROPY_POOL_SIZE && i < size; i++)
+ entropy_pool[i] ^= seed_buf[i];
+#else /* GBG */
+ (void)seed_buf;
+ (void)size;
+#endif
+}
+
+/**
+ * Terminate the RNG engine.
+ */
+EXP_FUNC void STDCALL RNG_terminate(void)
+{
+#if !defined(WIN32) && defined(CONFIG_USE_DEV_URANDOM)
+ close(rng_fd);
+#elif defined(CONFIG_WIN32_USE_CRYPTO_LIB)
+ CryptReleaseContext(gCryptProv, 0);
+#endif
+}
+
+/**
+ * Set a series of bytes with a random number. Individual bytes can be 0
+ */
+EXP_FUNC void STDCALL get_random(int num_rand_bytes, uint8_t *rand_data)
+{
+#if !defined(WIN32) && defined(CONFIG_USE_DEV_URANDOM)
+ /* use the Linux default */
+ read(rng_fd, rand_data, num_rand_bytes); /* read from /dev/urandom */
+#elif defined(WIN32) && defined(CONFIG_WIN32_USE_CRYPTO_LIB)
+ /* use Microsoft Crypto Libraries */
+ CryptGenRandom(gCryptProv, num_rand_bytes, rand_data);
+#else /* nothing else to use, so use a custom RNG */
+ /* The method we use when we've got nothing better. Use RC4, time
+ and a couple of random seeds to generate a random sequence */
+ RC4_CTX rng_ctx;
+ struct timeval tv;
+ MD5_CTX rng_digest_ctx;
+ uint8_t digest[MD5_SIZE];
+ uint64_t *ep;
+ int i;
+
+ /* A proper implementation would use counters etc for entropy */
+ gettimeofday(&tv, NULL);
+ ep = (uint64_t *)entropy_pool;
+ ep[0] ^= ENTROPY_COUNTER1;
+ ep[1] ^= ENTROPY_COUNTER2;
+
+ /* use a digested version of the entropy pool as a key */
+ MD5_Init(&rng_digest_ctx);
+ MD5_Update(&rng_digest_ctx, entropy_pool, ENTROPY_POOL_SIZE);
+ MD5_Final(digest, &rng_digest_ctx);
+
+ /* come up with the random sequence */
+ RC4_setup(&rng_ctx, digest, MD5_SIZE); /* use as a key */
+ memcpy(rand_data, entropy_pool, num_rand_bytes < ENTROPY_POOL_SIZE ?
+ num_rand_bytes : ENTROPY_POOL_SIZE);
+ RC4_crypt(&rng_ctx, rand_data, rand_data, num_rand_bytes);
+
+ /* move things along */
+ for (i = ENTROPY_POOL_SIZE-1; i >= MD5_SIZE ; i--)
+ entropy_pool[i] = entropy_pool[i-MD5_SIZE];
+
+ /* insert the digest at the start of the entropy pool */
+ memcpy(entropy_pool, digest, MD5_SIZE);
+#endif
+}
+
+/**
+ * Set a series of bytes with a random number. Individual bytes are not zero.
+ */
+void get_random_NZ(int num_rand_bytes, uint8_t *rand_data)
+{
+ int i;
+ get_random(num_rand_bytes, rand_data);
+
+ for (i = 0; i < num_rand_bytes; i++)
+ {
+ while (rand_data[i] == 0) /* can't be 0 */
+ rand_data[i] = (uint8_t)(rand());
+ }
+}
+
+/**
+ * Some useful diagnostic routines
+ */
+#if defined(CONFIG_SSL_FULL_MODE) || defined(CONFIG_DEBUG)
+int hex_finish;
+int hex_index;
+
+static void print_hex_init(int finish)
+{
+ hex_finish = finish;
+ hex_index = 0;
+}
+
+static void print_hex(uint8_t hex)
+{
+ static int column;
+
+ if (hex_index == 0)
+ {
+ column = 0;
+ }
+
+ printf("%02x ", hex);
+ if (++column == 8)
+ {
+ printf(": ");
+ }
+ else if (column >= 16)
+ {
+ printf("\n");
+ column = 0;
+ }
+
+ if (++hex_index >= hex_finish && column > 0)
+ {
+ printf("\n");
+ }
+}
+
+/**
+ * Spit out a blob of data for diagnostics. The data is is a nice column format
+ * for easy reading.
+ *
+ * @param format [in] The string (with possible embedded format characters)
+ * @param size [in] The number of numbers to print
+ * @param data [in] The start of data to use
+ * @param ... [in] Any additional arguments
+ */
+EXP_FUNC void STDCALL print_blob(const char *format,
+ const uint8_t *data, int size, ...)
+{
+ int i;
+ char tmp[80];
+ va_list(ap);
+
+ va_start(ap, size);
+ sprintf(tmp, "%s\n", format);
+ vprintf(tmp, ap);
+ print_hex_init(size);
+ for (i = 0; i < size; i++)
+ {
+ print_hex(data[i]);
+ }
+
+ va_end(ap);
+ TTY_FLUSH();
+}
+#elif defined(WIN32)
+/* VC6.0 doesn't handle variadic macros */
+EXP_FUNC void STDCALL print_blob(const char *format, const unsigned char *data,
+ int size, ...) {}
+#endif
+
+#if defined(CONFIG_SSL_HAS_PEM) || defined(CONFIG_HTTP_HAS_AUTHORIZATION)
+/* base64 to binary lookup table */
+static const uint8_t map[128] =
+{
+ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
+ 255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
+ 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, 255, 255, 255, 255, 255
+};
+
+EXP_FUNC int STDCALL base64_decode(const char *in, int len,
+ uint8_t *out, int *outlen)
+{
+ int g, t, x, y, z;
+ uint8_t c;
+ int ret = -1;
+
+ g = 3;
+ for (x = y = z = t = 0; x < len; x++)
+ {
+ if ((c = map[in[x]&0x7F]) == 0xff)
+ continue;
+
+ if (c == 254) /* this is the end... */
+ {
+ c = 0;
+
+ if (--g < 0)
+ goto error;
+ }
+ else if (g != 3) /* only allow = at end */
+ goto error;
+
+ t = (t<<6) | c;
+
+ if (++y == 4)
+ {
+ out[z++] = (uint8_t)((t>>16)&255);
+
+ if (g > 1)
+ out[z++] = (uint8_t)((t>>8)&255);
+
+ if (g > 2)
+ out[z++] = (uint8_t)(t&255);
+
+ y = t = 0;
+ }
+
+ /* check that we don't go past the output buffer */
+ if (z > *outlen)
+ goto error;
+ }
+
+ if (y != 0)
+ goto error;
+
+ *outlen = z;
+ ret = 0;
+
+error:
+#ifdef CONFIG_SSL_FULL_MODE
+ if (ret < 0)
+ printf("Error: Invalid base64\n"); TTY_FLUSH();
+#endif
+ TTY_FLUSH();
+ return ret;
+
+}
+#endif
+
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/hmac.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/hmac.c
new file mode 100644
index 0000000..24a04d7
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/hmac.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * HMAC implementation - This code was originally taken from RFC2104
+ * See http://www.ietf.org/rfc/rfc2104.txt and
+ * http://www.faqs.org/rfcs/rfc2202.html
+ */
+
+#include <string.h>
+#include "os_port.h"
+#include "crypto.h"
+
+/**
+ * Perform HMAC-MD5
+ * NOTE: does not handle keys larger than the block size.
+ */
+void hmac_md5(const uint8_t *msg, int length, const uint8_t *key,
+ int key_len, uint8_t *digest)
+{
+ MD5_CTX context;
+ uint8_t k_ipad[64];
+ uint8_t k_opad[64];
+ int i;
+
+ memset(k_ipad, 0, sizeof k_ipad);
+ memset(k_opad, 0, sizeof k_opad);
+ memcpy(k_ipad, key, key_len);
+ memcpy(k_opad, key, key_len);
+
+ for (i = 0; i < 64; i++)
+ {
+ k_ipad[i] ^= 0x36;
+ k_opad[i] ^= 0x5c;
+ }
+
+ MD5_Init(&context);
+ MD5_Update(&context, k_ipad, 64);
+ MD5_Update(&context, msg, length);
+ MD5_Final(digest, &context);
+ MD5_Init(&context);
+ MD5_Update(&context, k_opad, 64);
+ MD5_Update(&context, digest, MD5_SIZE);
+ MD5_Final(digest, &context);
+}
+
+/**
+ * Perform HMAC-SHA1
+ * NOTE: does not handle keys larger than the block size.
+ */
+void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key,
+ int key_len, uint8_t *digest)
+{
+ SHA1_CTX context;
+ uint8_t k_ipad[64];
+ uint8_t k_opad[64];
+ int i;
+
+ memset(k_ipad, 0, sizeof k_ipad);
+ memset(k_opad, 0, sizeof k_opad);
+ memcpy(k_ipad, key, key_len);
+ memcpy(k_opad, key, key_len);
+
+ for (i = 0; i < 64; i++)
+ {
+ k_ipad[i] ^= 0x36;
+ k_opad[i] ^= 0x5c;
+ }
+
+ SHA1_Init(&context);
+ SHA1_Update(&context, k_ipad, 64);
+ SHA1_Update(&context, msg, length);
+ SHA1_Final(digest, &context);
+ SHA1_Init(&context);
+ SHA1_Update(&context, k_opad, 64);
+ SHA1_Update(&context, digest, SHA1_SIZE);
+ SHA1_Final(digest, &context);
+}
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/md2.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/md2.c
new file mode 100644
index 0000000..dee909a
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/md2.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * RFC 1115/1319 compliant MD2 implementation
+ * The MD2 algorithm was designed by Ron Rivest in 1989.
+ *
+ * http://www.ietf.org/rfc/rfc1115.txt
+ * http://www.ietf.org/rfc/rfc1319.txt
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include "os_port.h"
+#include "crypto.h"
+
+/**
+ * This code is only here to enable the verification of Verisign root
+ * certificates. So only enable it for verification mode.
+ */
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+
+static const uint8_t PI_SUBST[256] =
+{
+ 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36,
+ 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3,
+ 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C,
+ 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
+ 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E,
+ 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,
+ 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2,
+ 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
+ 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E,
+ 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3,
+ 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56,
+ 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
+ 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D,
+ 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65,
+ 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0,
+ 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
+ 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C,
+ 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,
+ 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81,
+ 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
+ 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88,
+ 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE,
+ 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58,
+ 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
+ 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99,
+ 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14
+};
+
+/*
+ * MD2 context setup
+ */
+EXP_FUNC void STDCALL MD2_Init(MD2_CTX *ctx)
+{
+ memset(ctx, 0, sizeof *ctx);
+}
+
+static void md2_process(MD2_CTX *ctx)
+{
+ int i, j;
+ uint8_t t = 0;
+
+ for (i = 0; i < 16; i++)
+ {
+ ctx->state[i + 16] = ctx->buffer[i];
+ ctx->state[i + 32] = ctx->buffer[i] ^ ctx->state[i];
+ }
+
+ for (i = 0; i < 18; i++)
+ {
+ for (j = 0; j < 48; j++)
+ t = (ctx->state[j] ^= PI_SUBST[t]);
+
+ t = (t + i) & 0xFF;
+ }
+
+ t = ctx->cksum[15];
+
+ for (i = 0; i < 16; i++)
+ t = (ctx->cksum[i] ^= PI_SUBST[ctx->buffer[i] ^ t]);
+}
+
+/*
+ * MD2 process buffer
+ */
+EXP_FUNC void STDCALL MD2_Update(MD2_CTX *ctx, const uint8_t *input, int ilen)
+{
+ int fill;
+
+ while (ilen > 0)
+ {
+ if (ctx->left + ilen > 16)
+ fill = 16 - ctx->left;
+ else
+ fill = ilen;
+
+ memcpy(ctx->buffer + ctx->left, input, fill);
+
+ ctx->left += fill;
+ input += fill;
+ ilen -= fill;
+
+ if (ctx->left == 16)
+ {
+ ctx->left = 0;
+ md2_process(ctx);
+ }
+ }
+}
+
+/*
+ * MD2 final digest
+ */
+EXP_FUNC void STDCALL MD2_Final(uint8_t *output, MD2_CTX *ctx)
+{
+ int i;
+ uint8_t x;
+
+ x = (uint8_t)(16 - ctx->left);
+
+ for (i = ctx->left; i < 16; i++)
+ ctx->buffer[i] = x;
+
+ md2_process(ctx);
+
+ memcpy(ctx->buffer, ctx->cksum, 16);
+ md2_process(ctx);
+
+ memcpy(output, ctx->state, 16);
+}
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/md5.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/md5.c
new file mode 100644
index 0000000..7f50713
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/md5.c
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * This file implements the MD5 algorithm as defined in RFC1321
+ */
+
+#include <string.h>
+#include "os_port.h"
+#include "crypto.h"
+
+/* Constants for MD5Transform routine.
+ */
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+/* ----- static functions ----- */
+static void MD5Transform(uint32_t state[4], const uint8_t block[64]);
+static void Encode(uint8_t *output, uint32_t *input, uint32_t len);
+static void Decode(uint32_t *output, const uint8_t *input, uint32_t len);
+
+static const uint8_t PADDING[64] =
+{
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits. */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ Rotation is separate from addition to prevent recomputation. */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+
+/**
+ * MD5 initialization - begins an MD5 operation, writing a new ctx.
+ */
+EXP_FUNC void STDCALL MD5_Init(MD5_CTX *ctx)
+{
+ ctx->count[0] = ctx->count[1] = 0;
+
+ /* Load magic initialization constants.
+ */
+ ctx->state[0] = 0x67452301;
+ ctx->state[1] = 0xefcdab89;
+ ctx->state[2] = 0x98badcfe;
+ ctx->state[3] = 0x10325476;
+}
+
+/**
+ * Accepts an array of octets as the next portion of the message.
+ */
+EXP_FUNC void STDCALL MD5_Update(MD5_CTX *ctx, const uint8_t * msg, int len)
+{
+ uint32_t x;
+ int i, partLen;
+
+ /* Compute number of bytes mod 64 */
+ x = (uint32_t)((ctx->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((ctx->count[0] += ((uint32_t)len << 3)) < ((uint32_t)len << 3))
+ ctx->count[1]++;
+ ctx->count[1] += ((uint32_t)len >> 29);
+
+ partLen = 64 - x;
+
+ /* Transform as many times as possible. */
+ if (len >= partLen)
+ {
+ memcpy(&ctx->buffer[x], msg, partLen);
+ MD5Transform(ctx->state, ctx->buffer);
+
+ for (i = partLen; i + 63 < len; i += 64)
+ MD5Transform(ctx->state, &msg[i]);
+
+ x = 0;
+ }
+ else
+ i = 0;
+
+ /* Buffer remaining input */
+ memcpy(&ctx->buffer[x], &msg[i], len-i);
+}
+
+/**
+ * Return the 128-bit message digest into the user's array
+ */
+EXP_FUNC void STDCALL MD5_Final(uint8_t *digest, MD5_CTX *ctx)
+{
+ uint8_t bits[8];
+ uint32_t x, padLen;
+
+ /* Save number of bits */
+ Encode(bits, ctx->count, 8);
+
+ /* Pad out to 56 mod 64.
+ */
+ x = (uint32_t)((ctx->count[0] >> 3) & 0x3f);
+ padLen = (x < 56) ? (56 - x) : (120 - x);
+ MD5_Update(ctx, PADDING, padLen);
+
+ /* Append length (before padding) */
+ MD5_Update(ctx, bits, 8);
+
+ /* Store state in digest */
+ Encode(digest, ctx->state, MD5_SIZE);
+}
+
+/**
+ * MD5 basic transformation. Transforms state based on block.
+ */
+static void MD5Transform(uint32_t state[4], const uint8_t block[64])
+{
+ uint32_t a = state[0], b = state[1], c = state[2],
+ d = state[3], x[MD5_SIZE];
+
+ Decode(x, block, 64);
+
+ /* Round 1 */
+ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
+ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
+ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
+ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
+ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
+ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
+ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
+ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
+ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
+ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
+ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
+ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
+ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
+ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
+ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
+ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
+ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
+ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
+ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
+ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
+ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
+ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
+ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
+ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
+ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
+ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
+ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
+ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
+ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
+ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
+ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
+ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
+ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
+ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
+ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
+ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
+ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
+ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
+ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
+ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+}
+
+/**
+ * Encodes input (uint32_t) into output (uint8_t). Assumes len is
+ * a multiple of 4.
+ */
+static void Encode(uint8_t *output, uint32_t *input, uint32_t len)
+{
+ uint32_t i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ {
+ output[j] = (uint8_t)(input[i] & 0xff);
+ output[j+1] = (uint8_t)((input[i] >> 8) & 0xff);
+ output[j+2] = (uint8_t)((input[i] >> 16) & 0xff);
+ output[j+3] = (uint8_t)((input[i] >> 24) & 0xff);
+ }
+}
+
+/**
+ * Decodes input (uint8_t) into output (uint32_t). Assumes len is
+ * a multiple of 4.
+ */
+static void Decode(uint32_t *output, const uint8_t *input, uint32_t len)
+{
+ uint32_t i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) |
+ (((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) << 24);
+}
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/rc4.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/rc4.c
new file mode 100644
index 0000000..b9f7a82
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/rc4.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * An implementation of the RC4/ARC4 algorithm.
+ * Originally written by Christophe Devine.
+ */
+
+#include <string.h>
+#include "os_port.h"
+#include "crypto.h"
+
+/**
+ * Get ready for an encrypt/decrypt operation
+ */
+void RC4_setup(RC4_CTX *ctx, const uint8_t *key, int length)
+{
+ int i, j = 0, k = 0, a;
+ uint8_t *m;
+
+ ctx->x = 0;
+ ctx->y = 0;
+ m = ctx->m;
+
+ for (i = 0; i < 256; i++)
+ m[i] = i;
+
+ for (i = 0; i < 256; i++)
+ {
+ a = m[i];
+ j = (uint8_t)(j + a + key[k]);
+ m[i] = m[j];
+ m[j] = a;
+
+ if (++k >= length)
+ k = 0;
+ }
+}
+
+/**
+ * Perform the encrypt/decrypt operation (can use it for either since
+ * this is a stream cipher).
+ * NOTE: *msg and *out must be the same pointer (performance tweak)
+ */
+void RC4_crypt(RC4_CTX *ctx, const uint8_t *msg, uint8_t *out, int length)
+{
+ int i;
+ uint8_t *m, x, y, a, b;
+ (void)msg; /* GBG: unused */
+
+ x = ctx->x;
+ y = ctx->y;
+ m = ctx->m;
+
+ for (i = 0; i < length; i++)
+ {
+ a = m[++x];
+ y += a;
+ m[x] = b = m[y];
+ m[y] = a;
+ out[i] ^= m[(uint8_t)(a + b)];
+ }
+
+ ctx->x = x;
+ ctx->y = y;
+}
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/rsa.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/rsa.c
new file mode 100644
index 0000000..143e66a
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/rsa.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * Implements the RSA public encryption algorithm. Uses the bigint library to
+ * perform its calculations.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <stdlib.h>
+#include "os_port.h"
+#include "crypto.h"
+
+void RSA_priv_key_new(RSA_CTX **ctx,
+ const uint8_t *modulus, int mod_len,
+ const uint8_t *pub_exp, int pub_len,
+ const uint8_t *priv_exp, int priv_len
+#if CONFIG_BIGINT_CRT
+ , const uint8_t *p, int p_len,
+ const uint8_t *q, int q_len,
+ const uint8_t *dP, int dP_len,
+ const uint8_t *dQ, int dQ_len,
+ const uint8_t *qInv, int qInv_len
+#endif
+ )
+{
+ RSA_CTX *rsa_ctx;
+ BI_CTX *bi_ctx;
+ RSA_pub_key_new(ctx, modulus, mod_len, pub_exp, pub_len);
+ rsa_ctx = *ctx;
+ bi_ctx = rsa_ctx->bi_ctx;
+ rsa_ctx->d = bi_import(bi_ctx, priv_exp, priv_len);
+ bi_permanent(rsa_ctx->d);
+
+#ifdef CONFIG_BIGINT_CRT
+ rsa_ctx->p = bi_import(bi_ctx, p, p_len);
+ rsa_ctx->q = bi_import(bi_ctx, q, q_len);
+ rsa_ctx->dP = bi_import(bi_ctx, dP, dP_len);
+ rsa_ctx->dQ = bi_import(bi_ctx, dQ, dQ_len);
+ rsa_ctx->qInv = bi_import(bi_ctx, qInv, qInv_len);
+ bi_permanent(rsa_ctx->dP);
+ bi_permanent(rsa_ctx->dQ);
+ bi_permanent(rsa_ctx->qInv);
+ bi_set_mod(bi_ctx, rsa_ctx->p, BIGINT_P_OFFSET);
+ bi_set_mod(bi_ctx, rsa_ctx->q, BIGINT_Q_OFFSET);
+#endif
+}
+
+void RSA_pub_key_new(RSA_CTX **ctx,
+ const uint8_t *modulus, int mod_len,
+ const uint8_t *pub_exp, int pub_len)
+{
+ RSA_CTX *rsa_ctx;
+ BI_CTX *bi_ctx;
+
+ if (*ctx) /* if we load multiple certs, dump the old one */
+ RSA_free(*ctx);
+
+ bi_ctx = bi_initialize();
+ *ctx = (RSA_CTX *)calloc(1, sizeof(RSA_CTX));
+ rsa_ctx = *ctx;
+ rsa_ctx->bi_ctx = bi_ctx;
+ rsa_ctx->num_octets = mod_len;
+ rsa_ctx->m = bi_import(bi_ctx, modulus, mod_len);
+ bi_set_mod(bi_ctx, rsa_ctx->m, BIGINT_M_OFFSET);
+ rsa_ctx->e = bi_import(bi_ctx, pub_exp, pub_len);
+ bi_permanent(rsa_ctx->e);
+}
+
+/**
+ * Free up any RSA context resources.
+ */
+void RSA_free(RSA_CTX *rsa_ctx)
+{
+ BI_CTX *bi_ctx;
+ if (rsa_ctx == NULL) /* deal with ptrs that are null */
+ return;
+
+ bi_ctx = rsa_ctx->bi_ctx;
+
+ bi_depermanent(rsa_ctx->e);
+ bi_free(bi_ctx, rsa_ctx->e);
+ bi_free_mod(rsa_ctx->bi_ctx, BIGINT_M_OFFSET);
+
+ if (rsa_ctx->d)
+ {
+ bi_depermanent(rsa_ctx->d);
+ bi_free(bi_ctx, rsa_ctx->d);
+#ifdef CONFIG_BIGINT_CRT
+ bi_depermanent(rsa_ctx->dP);
+ bi_depermanent(rsa_ctx->dQ);
+ bi_depermanent(rsa_ctx->qInv);
+ bi_free(bi_ctx, rsa_ctx->dP);
+ bi_free(bi_ctx, rsa_ctx->dQ);
+ bi_free(bi_ctx, rsa_ctx->qInv);
+ bi_free_mod(rsa_ctx->bi_ctx, BIGINT_P_OFFSET);
+ bi_free_mod(rsa_ctx->bi_ctx, BIGINT_Q_OFFSET);
+#endif
+ }
+
+ bi_terminate(bi_ctx);
+ free(rsa_ctx);
+}
+
+/**
+ * @brief Use PKCS1.5 for decryption/verification.
+ * @param ctx [in] The context
+ * @param in_data [in] The data to encrypt (must be < modulus size-11)
+ * @param out_data [out] The encrypted data.
+ * @param is_decryption [in] Decryption or verify operation.
+ * @return The number of bytes that were originally encrypted. -1 on error.
+ * @see http://www.rsasecurity.com/rsalabs/node.asp?id=2125
+ */
+int RSA_decrypt(const RSA_CTX *ctx, const uint8_t *in_data,
+ uint8_t *out_data, int is_decryption)
+{
+ const int byte_size = ctx->num_octets;
+ int i, size;
+ bigint *decrypted_bi, *dat_bi;
+ uint8_t *block = (uint8_t *)alloca(byte_size);
+
+ memset(out_data, 0, byte_size); /* initialise */
+
+ /* decrypt */
+ dat_bi = bi_import(ctx->bi_ctx, in_data, byte_size);
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ decrypted_bi = is_decryption ? /* decrypt or verify? */
+ RSA_private(ctx, dat_bi) : RSA_public(ctx, dat_bi);
+#else /* always a decryption */
+ decrypted_bi = RSA_private(ctx, dat_bi);
+#endif
+
+ /* convert to a normal block */
+ bi_export(ctx->bi_ctx, decrypted_bi, block, byte_size);
+
+ i = 10; /* start at the first possible non-padded byte */
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ if (is_decryption == 0) /* PKCS1.5 signing pads with "0xff"s */
+ {
+ while (block[i++] == 0xff && i < byte_size);
+
+ if (block[i-2] != 0xff)
+ i = byte_size; /*ensure size is 0 */
+ }
+ else /* PKCS1.5 encryption padding is random */
+#endif
+ {
+ while (block[i++] && i < byte_size);
+ }
+ size = byte_size - i;
+
+ /* get only the bit we want */
+ if (size > 0)
+ memcpy(out_data, &block[i], size);
+
+ return size ? size : -1;
+}
+
+/**
+ * Performs m = c^d mod n
+ */
+bigint *RSA_private(const RSA_CTX *c, bigint *bi_msg)
+{
+#ifdef CONFIG_BIGINT_CRT
+ return bi_crt(c->bi_ctx, bi_msg, c->dP, c->dQ, c->p, c->q, c->qInv);
+#else
+ BI_CTX *ctx = c->bi_ctx;
+ ctx->mod_offset = BIGINT_M_OFFSET;
+ return bi_mod_power(ctx, bi_msg, c->d);
+#endif
+}
+
+#ifdef CONFIG_SSL_FULL_MODE
+/**
+ * Used for diagnostics.
+ */
+void RSA_print(const RSA_CTX *rsa_ctx)
+{
+ if (rsa_ctx == NULL)
+ return;
+
+ printf("----------------- RSA DEBUG ----------------\n");
+ printf("Size:\t%d\n", rsa_ctx->num_octets);
+ bi_print("Modulus", rsa_ctx->m);
+ bi_print("Public Key", rsa_ctx->e);
+ bi_print("Private Key", rsa_ctx->d);
+}
+#endif
+
+#if defined(CONFIG_SSL_CERT_VERIFICATION) || defined(CONFIG_SSL_GENERATE_X509_CERT)
+/**
+ * Performs c = m^e mod n
+ */
+bigint *RSA_public(const RSA_CTX * c, bigint *bi_msg)
+{
+ c->bi_ctx->mod_offset = BIGINT_M_OFFSET;
+ return bi_mod_power(c->bi_ctx, bi_msg, c->e);
+}
+
+/**
+ * Use PKCS1.5 for encryption/signing.
+ * see http://www.rsasecurity.com/rsalabs/node.asp?id=2125
+ */
+int RSA_encrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint16_t in_len,
+ uint8_t *out_data, int is_signing)
+{
+ int byte_size = ctx->num_octets;
+ int num_pads_needed = byte_size-in_len-3;
+ bigint *dat_bi, *encrypt_bi;
+
+ /* note: in_len+11 must be > byte_size */
+ out_data[0] = 0; /* ensure encryption block is < modulus */
+
+ if (is_signing)
+ {
+ out_data[1] = 1; /* PKCS1.5 signing pads with "0xff"'s */
+ memset(&out_data[2], 0xff, num_pads_needed);
+ }
+ else /* randomize the encryption padding with non-zero bytes */
+ {
+ out_data[1] = 2;
+ get_random_NZ(num_pads_needed, &out_data[2]);
+ }
+
+ out_data[2+num_pads_needed] = 0;
+ memcpy(&out_data[3+num_pads_needed], in_data, in_len);
+
+ /* now encrypt it */
+ dat_bi = bi_import(ctx->bi_ctx, out_data, byte_size);
+ encrypt_bi = is_signing ? RSA_private(ctx, dat_bi) :
+ RSA_public(ctx, dat_bi);
+ bi_export(ctx->bi_ctx, encrypt_bi, out_data, byte_size);
+
+ /* save a few bytes of memory */
+ bi_clear_cache(ctx->bi_ctx);
+ return byte_size;
+}
+
+#endif /* CONFIG_SSL_CERT_VERIFICATION */
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/sha1.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/sha1.c
new file mode 100644
index 0000000..1082733
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/crypto/sha1.c
@@ -0,0 +1,249 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * SHA1 implementation - as defined in FIPS PUB 180-1 published April 17, 1995.
+ * This code was originally taken from RFC3174
+ */
+
+#include <string.h>
+#include "os_port.h"
+#include "crypto.h"
+
+/*
+ * Define the SHA1 circular left shift macro
+ */
+#define SHA1CircularShift(bits,word) \
+ (((word) << (bits)) | ((word) >> (32-(bits))))
+
+/* ----- static functions ----- */
+static void SHA1PadMessage(SHA1_CTX *ctx);
+static void SHA1ProcessMessageBlock(SHA1_CTX *ctx);
+
+/**
+ * Initialize the SHA1 context
+ */
+void SHA1_Init(SHA1_CTX *ctx)
+{
+ ctx->Length_Low = 0;
+ ctx->Length_High = 0;
+ ctx->Message_Block_Index = 0;
+ ctx->Intermediate_Hash[0] = 0x67452301;
+ ctx->Intermediate_Hash[1] = 0xEFCDAB89;
+ ctx->Intermediate_Hash[2] = 0x98BADCFE;
+ ctx->Intermediate_Hash[3] = 0x10325476;
+ ctx->Intermediate_Hash[4] = 0xC3D2E1F0;
+}
+
+/**
+ * Accepts an array of octets as the next portion of the message.
+ */
+void SHA1_Update(SHA1_CTX *ctx, const uint8_t *msg, int len)
+{
+ while (len--)
+ {
+ ctx->Message_Block[ctx->Message_Block_Index++] = (*msg & 0xFF);
+ ctx->Length_Low += 8;
+
+ if (ctx->Length_Low == 0)
+ ctx->Length_High++;
+
+ if (ctx->Message_Block_Index == 64)
+ SHA1ProcessMessageBlock(ctx);
+
+ msg++;
+ }
+}
+
+/**
+ * Return the 160-bit message digest into the user's array
+ */
+void SHA1_Final(uint8_t *digest, SHA1_CTX *ctx)
+{
+ int i;
+
+ SHA1PadMessage(ctx);
+ memset(ctx->Message_Block, 0, 64);
+ ctx->Length_Low = 0; /* and clear length */
+ ctx->Length_High = 0;
+
+ for (i = 0; i < SHA1_SIZE; i++)
+ {
+ digest[i] = ctx->Intermediate_Hash[i>>2] >> 8 * ( 3 - ( i & 0x03 ) );
+ }
+}
+
+/**
+ * Process the next 512 bits of the message stored in the array.
+ */
+static void SHA1ProcessMessageBlock(SHA1_CTX *ctx)
+{
+ const uint32_t K[] = { /* Constants defined in SHA-1 */
+ 0x5A827999,
+ 0x6ED9EBA1,
+ 0x8F1BBCDC,
+ 0xCA62C1D6
+ };
+ int t; /* Loop counter */
+ uint32_t temp; /* Temporary word value */
+ uint32_t W[80]; /* Word sequence */
+ uint32_t A, B, C, D, E; /* Word buffers */
+
+ /*
+ * Initialize the first 16 words in the array W
+ */
+ for (t = 0; t < 16; t++)
+ {
+ W[t] = ctx->Message_Block[t * 4] << 24;
+ W[t] |= ctx->Message_Block[t * 4 + 1] << 16;
+ W[t] |= ctx->Message_Block[t * 4 + 2] << 8;
+ W[t] |= ctx->Message_Block[t * 4 + 3];
+ }
+
+ for (t = 16; t < 80; t++)
+ {
+ W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
+ }
+
+ A = ctx->Intermediate_Hash[0];
+ B = ctx->Intermediate_Hash[1];
+ C = ctx->Intermediate_Hash[2];
+ D = ctx->Intermediate_Hash[3];
+ E = ctx->Intermediate_Hash[4];
+
+ for (t = 0; t < 20; t++)
+ {
+ temp = SHA1CircularShift(5,A) +
+ ((B & C) | ((~B) & D)) + E + W[t] + K[0];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+
+ B = A;
+ A = temp;
+ }
+
+ for (t = 20; t < 40; t++)
+ {
+ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+
+ for (t = 40; t < 60; t++)
+ {
+ temp = SHA1CircularShift(5,A) +
+ ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+
+ for (t = 60; t < 80; t++)
+ {
+ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+
+ ctx->Intermediate_Hash[0] += A;
+ ctx->Intermediate_Hash[1] += B;
+ ctx->Intermediate_Hash[2] += C;
+ ctx->Intermediate_Hash[3] += D;
+ ctx->Intermediate_Hash[4] += E;
+ ctx->Message_Block_Index = 0;
+}
+
+/*
+ * According to the standard, the message must be padded to an even
+ * 512 bits. The first padding bit must be a '1'. The last 64
+ * bits represent the length of the original message. All bits in
+ * between should be 0. This function will pad the message
+ * according to those rules by filling the Message_Block array
+ * accordingly. It will also call the ProcessMessageBlock function
+ * provided appropriately. When it returns, it can be assumed that
+ * the message digest has been computed.
+ *
+ * @param ctx [in, out] The SHA1 context
+ */
+static void SHA1PadMessage(SHA1_CTX *ctx)
+{
+ /*
+ * Check to see if the current message block is too small to hold
+ * the initial padding bits and length. If so, we will pad the
+ * block, process it, and then continue padding into a second
+ * block.
+ */
+ if (ctx->Message_Block_Index > 55)
+ {
+ ctx->Message_Block[ctx->Message_Block_Index++] = 0x80;
+ while(ctx->Message_Block_Index < 64)
+ {
+ ctx->Message_Block[ctx->Message_Block_Index++] = 0;
+ }
+
+ SHA1ProcessMessageBlock(ctx);
+
+ while (ctx->Message_Block_Index < 56)
+ {
+ ctx->Message_Block[ctx->Message_Block_Index++] = 0;
+ }
+ }
+ else
+ {
+ ctx->Message_Block[ctx->Message_Block_Index++] = 0x80;
+ while(ctx->Message_Block_Index < 56)
+ {
+
+ ctx->Message_Block[ctx->Message_Block_Index++] = 0;
+ }
+ }
+
+ /*
+ * Store the message length as the last 8 octets
+ */
+ ctx->Message_Block[56] = ctx->Length_High >> 24;
+ ctx->Message_Block[57] = ctx->Length_High >> 16;
+ ctx->Message_Block[58] = ctx->Length_High >> 8;
+ ctx->Message_Block[59] = ctx->Length_High;
+ ctx->Message_Block[60] = ctx->Length_Low >> 24;
+ ctx->Message_Block[61] = ctx->Length_Low >> 16;
+ ctx->Message_Block[62] = ctx->Length_Low >> 8;
+ ctx->Message_Block[63] = ctx->Length_Low;
+ SHA1ProcessMessageBlock(ctx);
+}
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/asn1.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/asn1.c
new file mode 100644
index 0000000..2ec99d5
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/asn1.c
@@ -0,0 +1,677 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * Some primitive asn methods for extraction ASN.1 data.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "os_port.h"
+#include "crypto.h"
+#include "crypto_misc.h"
+#include "ssl.h"
+#include "tls1.h"
+
+#define SIG_OID_PREFIX_SIZE 8
+#define SIG_IIS6_OID_SIZE 5
+#define SIG_SUBJECT_ALT_NAME_SIZE 3
+
+/* Must be an RSA algorithm with either SHA1 or MD5 for verifying to work */
+static const uint8_t sig_oid_prefix[SIG_OID_PREFIX_SIZE] =
+{
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01
+};
+
+static const uint8_t sig_sha1WithRSAEncrypt[SIG_IIS6_OID_SIZE] =
+{
+ 0x2b, 0x0e, 0x03, 0x02, 0x1d
+};
+
+static const uint8_t sig_subject_alt_name[SIG_SUBJECT_ALT_NAME_SIZE] =
+{
+ 0x55, 0x1d, 0x11
+};
+
+/* CN, O, OU */
+static const uint8_t g_dn_types[] = { 3, 10, 11, 0 };
+
+int get_asn1_length(const uint8_t *buf, int *offset)
+{
+ int len, i;
+
+ if (!(buf[*offset] & 0x80)) /* short form */
+ {
+ len = buf[(*offset)++];
+ }
+ else /* long form */
+ {
+ int length_bytes = buf[(*offset)++]&0x7f;
+ len = 0;
+ for (i = 0; i < length_bytes; i++)
+ {
+ len <<= 8;
+ len += buf[(*offset)++];
+ }
+ }
+
+ return len;
+}
+
+/**
+ * Skip the ASN1.1 object type and its length. Get ready to read the object's
+ * data.
+ */
+int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type)
+{
+ if (buf[*offset] != obj_type)
+ return X509_NOT_OK;
+ (*offset)++;
+ return get_asn1_length(buf, offset);
+}
+
+/**
+ * Skip over an ASN.1 object type completely. Get ready to read the next
+ * object.
+ */
+int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type)
+{
+ int len;
+
+ if (buf[*offset] != obj_type)
+ return X509_NOT_OK;
+ (*offset)++;
+ len = get_asn1_length(buf, offset);
+ *offset += len;
+ return 0;
+}
+
+/**
+ * Read an integer value for ASN.1 data
+ * Note: This function allocates memory which must be freed by the user.
+ */
+int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object)
+{
+ int len;
+
+ if ((len = asn1_next_obj(buf, offset, ASN1_INTEGER)) < 0)
+ goto end_int_array;
+
+ if (len > 1 && buf[*offset] == 0x00) /* ignore the negative byte */
+ {
+ len--;
+ (*offset)++;
+ }
+
+ *object = (uint8_t *)malloc(len);
+ memcpy(*object, &buf[*offset], len);
+ *offset += len;
+
+end_int_array:
+ return len;
+}
+
+/**
+ * Get all the RSA private key specifics from an ASN.1 encoded file
+ */
+int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx)
+{
+ int offset = 7;
+ uint8_t *modulus = NULL, *priv_exp = NULL, *pub_exp = NULL;
+ int mod_len, priv_len, pub_len;
+#ifdef CONFIG_BIGINT_CRT
+ uint8_t *p = NULL, *q = NULL, *dP = NULL, *dQ = NULL, *qInv = NULL;
+ int p_len, q_len, dP_len, dQ_len, qInv_len;
+#endif
+
+ /* not in der format */
+ if (buf[0] != ASN1_SEQUENCE) /* basic sanity check */
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("Error: This is not a valid ASN.1 file\n");
+#endif
+ return X509_INVALID_PRIV_KEY;
+ }
+
+ /* Use the private key to mix up the RNG if possible. */
+ RNG_custom_init(buf, len);
+
+ mod_len = asn1_get_int(buf, &offset, &modulus);
+ pub_len = asn1_get_int(buf, &offset, &pub_exp);
+ priv_len = asn1_get_int(buf, &offset, &priv_exp);
+
+ if (mod_len <= 0 || pub_len <= 0 || priv_len <= 0)
+ return X509_INVALID_PRIV_KEY;
+
+#ifdef CONFIG_BIGINT_CRT
+ p_len = asn1_get_int(buf, &offset, &p);
+ q_len = asn1_get_int(buf, &offset, &q);
+ dP_len = asn1_get_int(buf, &offset, &dP);
+ dQ_len = asn1_get_int(buf, &offset, &dQ);
+ qInv_len = asn1_get_int(buf, &offset, &qInv);
+
+ if (p_len <= 0 || q_len <= 0 || dP_len <= 0 || dQ_len <= 0 || qInv_len <= 0)
+ return X509_INVALID_PRIV_KEY;
+
+ RSA_priv_key_new(rsa_ctx,
+ modulus, mod_len, pub_exp, pub_len, priv_exp, priv_len,
+ p, p_len, q, p_len, dP, dP_len, dQ, dQ_len, qInv, qInv_len);
+
+ free(p);
+ free(q);
+ free(dP);
+ free(dQ);
+ free(qInv);
+#else
+ RSA_priv_key_new(rsa_ctx,
+ modulus, mod_len, pub_exp, pub_len, priv_exp, priv_len);
+#endif
+
+ free(modulus);
+ free(priv_exp);
+ free(pub_exp);
+ return X509_OK;
+}
+
+/**
+ * Get the time of a certificate. Ignore hours/minutes/seconds.
+ */
+static int asn1_get_utc_time(const uint8_t *buf, int *offset, SSL_DateTime *t)
+{
+ int ret = X509_NOT_OK, len, t_offset;
+ uint8_t time_encoding;
+
+ memset(t, 0, sizeof(*t));
+ time_encoding = buf[(*offset)++];
+ if (time_encoding != ASN1_UTC_TIME && time_encoding != ASN1_GENERALIZED_TIME) /* GBG */
+ goto end_utc_time;
+ len = get_asn1_length(buf, offset);
+ t_offset = *offset;
+
+ if (time_encoding == ASN1_UTC_TIME) {
+ t->year = (buf[t_offset] - '0')*10 + (buf[t_offset+1] - '0');
+
+ if (t->year <= 50) /* 1951-2050 thing */
+ {
+ t->year += 100;
+ }
+ t->year += 1900;
+ t_offset += 2;
+ } else {
+ t->year = (buf[t_offset ] - '0')*1000 +
+ (buf[t_offset+1] - '0')*100 +
+ (buf[t_offset+2] - '0')*10 +
+ (buf[t_offset+3] - '0');
+ t_offset += 4;
+ }
+
+ t->month = (buf[t_offset ] - '0')*10 + (buf[t_offset+1] - '0');
+ t->day = (buf[t_offset+2] - '0')*10 + (buf[t_offset+3] - '0');
+ *offset += len;
+ ret = X509_OK;
+
+end_utc_time:
+ return ret;
+}
+
+/**
+ * Get the version type of a certificate (which we don't actually care about)
+ */
+int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
+{
+ int ret = X509_NOT_OK;
+ (void)x509_ctx; /* GBG: unused */
+
+ (*offset) += 2; /* get past explicit tag */
+ if (asn1_skip_obj(cert, offset, ASN1_INTEGER))
+ goto end_version;
+
+ ret = X509_OK;
+end_version:
+ return ret;
+}
+
+/**
+ * Retrieve the notbefore and notafter certificate times.
+ */
+int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
+{
+ return (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0 ||
+ asn1_get_utc_time(cert, offset, &x509_ctx->not_before) ||
+ asn1_get_utc_time(cert, offset, &x509_ctx->not_after));
+}
+
+#if 0 /* GBG */
+/**
+ * Get the components of a distinguished name
+ */
+static int asn1_get_oid_x520(const uint8_t *buf, int *offset)
+{
+ int dn_type = 0;
+ int len;
+
+ if ((len = asn1_next_obj(buf, offset, ASN1_OID)) < 0)
+ goto end_oid;
+
+ /* expect a sequence of 2.5.4.[x] where x is a one of distinguished name
+ components we are interested in. */
+ if (len == 3 && buf[*offset] == 0x55 && buf[*offset+1] == 0x04) { /* GBG */
+ dn_type = buf[*offset+2];
+ }
+ *offset += len; /* skip over it */
+
+end_oid:
+ return dn_type;
+}
+#endif
+
+/**
+ * Obtain an ASN.1 printable string type.
+ */
+static int asn1_get_printable_str(const uint8_t *buf, int *offset, char **str)
+{
+ int len = X509_NOT_OK;
+ int asn1_type = buf[*offset];
+
+ /* some certs have this awful crud in them for some reason */
+ if (asn1_type != ASN1_PRINTABLE_STR &&
+ asn1_type != ASN1_PRINTABLE_STR2 &&
+ asn1_type != ASN1_TELETEX_STR &&
+ asn1_type != ASN1_IA5_STR &&
+ asn1_type != ASN1_UNICODE_STR &&
+ asn1_type != ASN1_UNIVERSAL_STR)
+ goto end_pnt_str;
+
+ (*offset)++;
+ len = get_asn1_length(buf, offset);
+
+ if (asn1_type == ASN1_UNICODE_STR)
+ {
+ int i;
+ *str = (char *)malloc(len/2+1); /* allow for null */
+
+ for (i = 0; i < len; i += 2)
+ (*str)[i/2] = buf[*offset + i + 1];
+
+ (*str)[len/2] = 0; /* null terminate */
+ }
+ else
+ {
+ *str = (char *)malloc(len+1); /* allow for null */
+ memcpy(*str, &buf[*offset], len);
+ (*str)[len] = 0; /* null terminate */
+ }
+
+ *offset += len;
+
+end_pnt_str:
+ return len;
+}
+
+/**
+ * Add an integer value at the end of a string
+ */
+static char*
+asn1_append_int_value(char* str, unsigned int value)
+{
+ char workspace[32];
+ char* c = &workspace[31];
+ int digit_count = 0;
+
+ /* process the digits */
+ do {
+ unsigned int digit = value%10;
+ *c-- = '0'+digit;
+ value /= 10;
+ ++digit_count;
+ } while(value);
+
+ /* copy the string */
+ memcpy(str, &workspace[32-digit_count], digit_count);
+
+ return str+digit_count;
+}
+
+/**
+ * Convert an ASN.1 OID to a string. (GBG)
+ */
+static char*
+asn1_oid_to_string(const uint8_t *oid, int len)
+{
+ char* str = NULL;
+ char* result = NULL;
+ int i;
+
+ /* sanity check */
+ if (len < 2) return NULL;
+ if (len >= 3 && (oid[len-1] & 0x80)) return NULL; /* last byte should not have the high bit set */
+
+ /* allocate space with an upper bound size estimate */
+ str = malloc(len*4+len+3);
+ result = str;
+
+ /* first two values */
+ {
+ int value1 = oid[0]/40;
+ int value2 = oid[0]-(40*value1);
+ str = asn1_append_int_value(str, value1);
+ *str++ = '.';
+ str = asn1_append_int_value(str, value2);
+ }
+
+ /* other values */
+ {
+ unsigned int /* GBG long */ value = 0;
+ for (i=1; i<len; i++) {
+ value = (value<<7) + (oid[i]&0x7F);
+ if ((oid[i]&0x80) == 0) {
+ /* termination of value */
+ *str++ = '.';
+ str = asn1_append_int_value(str, value);
+ value = 0;
+ }
+ }
+ }
+ *str++ = '\0';
+ return result;
+}
+
+
+/**
+ * Get the subject name (or the issuer) of a certificate.
+ */
+int asn1_name(const uint8_t *cert, int *offset, char *dn[])
+{
+ int ret = X509_NOT_OK;
+ int dn_type = 0;
+ char *name = NULL;
+ char* name_prefix = NULL; /* GBG */
+
+ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0)
+ goto end_name;
+
+ while (asn1_next_obj(cert, offset, ASN1_SET) >= 0)
+ {
+ int i, found = 0;
+
+ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0) { /* GBG */
+ goto end_name;
+ }
+ /* get the oid */
+ {
+ int len = asn1_next_obj(cert, offset, ASN1_OID);
+ int oid_offset = *offset;
+
+ if (len < 0) goto end_name;
+ if (len == 3 && cert[oid_offset] == 0x55 && cert[oid_offset+1] == 0x04) {
+ dn_type = cert[oid_offset+2];
+ } else {
+ /* convert the OID to a string */
+ name_prefix = asn1_oid_to_string(cert+oid_offset, len);
+ if (name_prefix == NULL) goto end_name;
+ }
+ *offset += len;
+ }
+ name = NULL;
+ if (asn1_get_printable_str(cert, offset, &name) < 0) {
+ free(name);
+ if (name_prefix) free(name_prefix);
+ goto end_name;
+ }
+ /* add the prefix if there is one */
+ if (name_prefix) {
+ int name_prefix_len = (int)strlen(name_prefix);
+ int name_len = (int)strlen(name);
+ char* compound = malloc(name_prefix_len+name_len+2);
+ memcpy(compound, name_prefix, name_prefix_len);
+ compound[name_prefix_len] = '=';
+ memcpy(compound+name_prefix_len+1, name, name_len+1);
+ free(name);
+ free(name_prefix);
+ name = compound;
+ name_prefix = NULL;
+ }
+
+ /* find the distinguished named type */
+ for (i = 0; i < X509_NUM_DN_TYPES; i++)
+ {
+ if (dn_type == g_dn_types[i])
+ {
+ if (dn[i] == NULL)
+ {
+ dn[i] = name;
+ found = 1;
+ break;
+ }
+ }
+ }
+
+ if (found == 0) /* not found so get rid of it */
+ {
+ free(name);
+ }
+ }
+
+ ret = X509_OK;
+end_name:
+ return ret;
+}
+
+/**
+ * Read the modulus and public exponent of a certificate.
+ */
+int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
+{
+ int ret = X509_NOT_OK, mod_len, pub_len;
+ uint8_t *modulus = NULL, *pub_exp = NULL;
+
+ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0 ||
+ asn1_skip_obj(cert, offset, ASN1_SEQUENCE) ||
+ asn1_next_obj(cert, offset, ASN1_BIT_STRING) < 0)
+ goto end_pub_key;
+
+ (*offset)++; /* ignore the padding bit field */
+
+ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0)
+ goto end_pub_key;
+
+ mod_len = asn1_get_int(cert, offset, &modulus);
+ pub_len = asn1_get_int(cert, offset, &pub_exp);
+
+ RSA_pub_key_new(&x509_ctx->rsa_ctx, modulus, mod_len, pub_exp, pub_len);
+
+ free(modulus);
+ free(pub_exp);
+ ret = X509_OK;
+
+end_pub_key:
+ return ret;
+}
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+/**
+ * Read the signature of the certificate.
+ */
+int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
+{
+ int ret = X509_NOT_OK;
+
+ if (cert[(*offset)++] != ASN1_BIT_STRING)
+ goto end_sig;
+
+ x509_ctx->sig_len = get_asn1_length(cert, offset)-1;
+ (*offset)++; /* ignore bit string padding bits */
+ x509_ctx->signature = (uint8_t *)malloc(x509_ctx->sig_len);
+ memcpy(x509_ctx->signature, &cert[*offset], x509_ctx->sig_len);
+ *offset += x509_ctx->sig_len;
+ ret = X509_OK;
+
+end_sig:
+ return ret;
+}
+
+/*
+ * Compare 2 distinguished name components for equality
+ * @return 0 if a match
+ */
+static int asn1_compare_dn_comp(const char *dn1, const char *dn2)
+{
+ int ret;
+
+ if (dn1 == NULL && dn2 == NULL)
+ ret = 0;
+ else
+ ret = (dn1 && dn2) ? strcmp(dn1, dn2) : -1;
+
+ return ret;
+}
+
+#if 0 /* GBG */
+/**
+ * Clean up all of the CA certificates.
+ */
+void remove_ca_certs(CA_CERT_CTX *ca_cert_ctx)
+{
+ int i = 0;
+
+ if (ca_cert_ctx == NULL)
+ return;
+
+ while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i])
+ {
+ x509_free(ca_cert_ctx->cert[i]);
+ ca_cert_ctx->cert[i++] = NULL;
+ }
+
+ free(ca_cert_ctx);
+}
+#endif /* GBG */
+
+/*
+ * Compare 2 distinguished names for equality
+ * @return 0 if a match
+ */
+int asn1_compare_dn(char * const dn1[], char * const dn2[])
+{
+ int i;
+
+ for (i = 0; i < X509_NUM_DN_TYPES; i++)
+ {
+ if (asn1_compare_dn_comp(dn1[i], dn2[i]))
+ return 1;
+ }
+
+ return 0; /* all good */
+}
+
+static int asn1_find_oid(const uint8_t* cert, int* offset,
+ const uint8_t* oid, int oid_length)
+{
+ int seqlen;
+ if ((seqlen = asn1_next_obj(cert, offset, ASN1_SEQUENCE))> 0)
+ {
+ int end = *offset + seqlen;
+
+ while (*offset < end)
+ {
+ int type = cert[(*offset)++];
+ int length = get_asn1_length(cert, offset);
+ int noffset = *offset + length;
+
+ if (type == ASN1_SEQUENCE)
+ {
+ type = cert[(*offset)++];
+ length = get_asn1_length(cert, offset);
+
+ if (type == ASN1_OID && length == oid_length &&
+ memcmp(cert + *offset, oid, oid_length) == 0)
+ {
+ *offset += oid_length;
+ return 1;
+ }
+ }
+
+ *offset = noffset;
+ }
+ }
+
+ return 0;
+}
+
+int asn1_find_subjectaltname(const uint8_t* cert, int offset)
+{
+ if (asn1_find_oid(cert, &offset, sig_subject_alt_name,
+ SIG_SUBJECT_ALT_NAME_SIZE))
+ {
+ return offset;
+ }
+
+ return 0;
+}
+
+#endif /* CONFIG_SSL_CERT_VERIFICATION */
+
+/**
+ * Read the signature type of the certificate. We only support RSA-MD5 and
+ * RSA-SHA1 signature types.
+ */
+int asn1_signature_type(const uint8_t *cert,
+ int *offset, X509_CTX *x509_ctx)
+{
+ int ret = X509_NOT_OK, len;
+
+ if (cert[(*offset)++] != ASN1_OID)
+ goto end_check_sig;
+
+ len = get_asn1_length(cert, offset);
+
+ if (len == 5 && memcmp(sig_sha1WithRSAEncrypt, &cert[*offset],
+ SIG_IIS6_OID_SIZE) == 0)
+ {
+ x509_ctx->sig_type = SIG_TYPE_SHA1;
+ }
+ else
+ {
+ if (memcmp(sig_oid_prefix, &cert[*offset], SIG_OID_PREFIX_SIZE))
+ goto end_check_sig; /* unrecognised cert type */
+
+ x509_ctx->sig_type = cert[*offset + SIG_OID_PREFIX_SIZE];
+ }
+
+ *offset += len;
+ asn1_skip_obj(cert, offset, ASN1_NULL); /* if it's there */
+ ret = X509_OK;
+
+end_check_sig:
+ return ret;
+}
+
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/cert.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/cert.h
new file mode 100644
index 0000000..7a85d2d
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/cert.h
@@ -0,0 +1,43 @@
+unsigned char default_certificate[] = {
+ 0x30, 0x82, 0x01, 0xd7, 0x30, 0x82, 0x01, 0x40, 0x02, 0x09, 0x00, 0xf1,
+ 0xc3, 0x87, 0xc0, 0xd4, 0xf4, 0x57, 0xc3, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x34,
+ 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x29, 0x61,
+ 0x78, 0x54, 0x4c, 0x53, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x44, 0x6f, 0x64, 0x67, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,
+ 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,
+ 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x36,
+ 0x30, 0x37, 0x31, 0x31, 0x34, 0x34, 0x33, 0x32, 0x5a, 0x17, 0x0d, 0x33,
+ 0x33, 0x31, 0x30, 0x32, 0x33, 0x31, 0x31, 0x34, 0x34, 0x33, 0x32, 0x5a,
+ 0x30, 0x2c, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,
+ 0x0d, 0x61, 0x78, 0x54, 0x4c, 0x53, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65,
+ 0x63, 0x74, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
+ 0x09, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x81,
+ 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
+ 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02,
+ 0x81, 0x81, 0x00, 0xd8, 0xe0, 0xbf, 0x15, 0xde, 0xea, 0xaf, 0xe8, 0xd5,
+ 0xfd, 0x0b, 0xa8, 0xa8, 0xb3, 0xd7, 0x46, 0x5d, 0xa7, 0x26, 0x6c, 0x0c,
+ 0xb5, 0xd9, 0xbc, 0xc6, 0xf8, 0xc0, 0x78, 0xd0, 0xf6, 0x56, 0x65, 0xf8,
+ 0x29, 0x48, 0x0e, 0x7b, 0x0b, 0xa6, 0x25, 0x7e, 0xe8, 0x7b, 0x79, 0x6f,
+ 0x38, 0xe5, 0xb5, 0xb7, 0xf4, 0xe0, 0x9c, 0x91, 0x60, 0xf4, 0x06, 0xf3,
+ 0x40, 0x1e, 0xf9, 0x91, 0x19, 0xa9, 0x2f, 0x47, 0x43, 0xb5, 0x9b, 0x1e,
+ 0xdc, 0xf6, 0xaa, 0x1c, 0x49, 0x79, 0x21, 0x28, 0xcb, 0xaa, 0x49, 0x73,
+ 0xd9, 0x09, 0x05, 0x4c, 0x02, 0xf2, 0x4c, 0x4d, 0x6c, 0x1c, 0x80, 0xa7,
+ 0x14, 0x91, 0x44, 0xfc, 0x12, 0xb3, 0xe1, 0xe7, 0xe3, 0x4f, 0x44, 0xba,
+ 0x8c, 0xc3, 0x74, 0x39, 0xe8, 0x4c, 0xd0, 0xd4, 0x4c, 0x24, 0x61, 0xb4,
+ 0x40, 0x95, 0x8c, 0xc0, 0x0a, 0xb7, 0x02, 0x39, 0x31, 0x85, 0x93, 0x02,
+ 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x0b,
+ 0x47, 0x24, 0x52, 0x7d, 0xb6, 0x63, 0x78, 0xbc, 0x80, 0xdd, 0x87, 0x6c,
+ 0x90, 0x4c, 0x33, 0xc3, 0x5c, 0xa7, 0x97, 0x09, 0x1c, 0x09, 0x4f, 0x9b,
+ 0x6e, 0xb3, 0x5a, 0x3e, 0x46, 0x92, 0x1a, 0xc7, 0x87, 0x15, 0x59, 0xe1,
+ 0x88, 0x5c, 0xce, 0x6a, 0xe2, 0x96, 0xaa, 0x32, 0xec, 0xc2, 0xed, 0x78,
+ 0x8b, 0xe0, 0x90, 0x66, 0x93, 0x14, 0xc3, 0x98, 0xab, 0x33, 0x35, 0xd3,
+ 0x7d, 0x5d, 0x51, 0x0a, 0x9c, 0xb9, 0x10, 0x58, 0x47, 0x7a, 0x98, 0x95,
+ 0x64, 0xff, 0x4c, 0x5d, 0x82, 0x19, 0xf9, 0xea, 0x0f, 0x5e, 0x9a, 0xcb,
+ 0x32, 0x27, 0x64, 0xca, 0x6f, 0x58, 0x8a, 0xd0, 0xc0, 0x36, 0xf4, 0xb9,
+ 0x63, 0x34, 0xa5, 0xda, 0x36, 0x50, 0x36, 0x49, 0xd2, 0xb7, 0x3a, 0x21,
+ 0x33, 0x5b, 0x3e, 0xd6, 0x5f, 0x0c, 0x99, 0x83, 0xb7, 0xb2, 0xf7, 0x8b,
+ 0x44, 0xc4, 0x5e, 0x73, 0x41, 0xa9, 0x02
+};
+unsigned int default_certificate_len = 475;
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/crypto_misc.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/crypto_misc.h
new file mode 100644
index 0000000..f868252
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/crypto_misc.h
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/**
+ * @file crypto_misc.h
+ */
+
+#ifndef HEADER_CRYPTO_MISC_H
+#define HEADER_CRYPTO_MISC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "crypto.h"
+#include "bigint.h"
+
+/**************************************************************************
+ * X509 declarations
+ **************************************************************************/
+#define X509_OK 0
+#define X509_NOT_OK -1
+#define X509_VFY_ERROR_NO_TRUSTED_CERT -2
+#define X509_VFY_ERROR_BAD_SIGNATURE -3
+#define X509_VFY_ERROR_NOT_YET_VALID -4
+#define X509_VFY_ERROR_EXPIRED -5
+#define X509_VFY_ERROR_SELF_SIGNED -6
+#define X509_VFY_ERROR_INVALID_CHAIN -7
+#define X509_VFY_ERROR_UNSUPPORTED_DIGEST -8
+#define X509_INVALID_PRIV_KEY -9
+
+/*
+ * The Distinguished Name
+ */
+#define X509_NUM_DN_TYPES 4
+#define X509_COMMON_NAME 0
+#define X509_ORGANIZATION 1
+#define X509_ORGANIZATIONAL_UNIT 2
+#define X509_GENERIC 3
+
+struct _x509_ctx
+{
+ char *ca_cert_dn[X509_NUM_DN_TYPES];
+ char *cert_dn[X509_NUM_DN_TYPES];
+ char **subject_alt_dnsnames;
+ SSL_DateTime not_before;
+ SSL_DateTime not_after;
+ uint8_t *signature;
+ uint16_t sig_len;
+ uint8_t sig_type;
+ RSA_CTX *rsa_ctx;
+ bigint *digest;
+ struct {
+ unsigned char md5[MD5_SIZE];
+ unsigned char sha1[SHA1_SIZE];
+ } fingerprint;
+ struct _x509_ctx *next;
+};
+
+typedef struct _x509_ctx X509_CTX;
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+#if 0 /* GBG: removed */
+typedef struct
+{
+ X509_CTX *cert[CONFIG_X509_MAX_CA_CERTS];
+} CA_CERT_CTX;
+#endif /* GBG */
+#endif
+
+int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx);
+void x509_free(X509_CTX *x509_ctx);
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+int x509_verify(X509_CTX* ca_certs /* GBG: changed */, const X509_CTX *cert, const SSL_DateTime* now);
+#endif
+#ifdef CONFIG_SSL_FULL_MODE
+void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx);
+const char * x509_display_error(int error);
+#endif
+
+/**************************************************************************
+ * ASN1 declarations
+ **************************************************************************/
+#define ASN1_INTEGER 0x02
+#define ASN1_BIT_STRING 0x03
+#define ASN1_OCTET_STRING 0x04
+#define ASN1_NULL 0x05
+#define ASN1_PRINTABLE_STR2 0x0C
+#define ASN1_OID 0x06
+#define ASN1_UNIVERSAL_STR 0x1C /* GBG */
+#define ASN1_PRINTABLE_STR 0x13
+#define ASN1_TELETEX_STR 0x14
+#define ASN1_IA5_STR 0x16
+#define ASN1_UTC_TIME 0x17
+#define ASN1_GENERALIZED_TIME 0x18 /* GBG */
+#define ASN1_UNICODE_STR 0x1e
+#define ASN1_SEQUENCE 0x30
+#define ASN1_CONTEXT_DNSNAME 0x82
+#define ASN1_SET 0x31
+#define ASN1_V3_DATA 0xa3
+#define ASN1_IMPLICIT_TAG 0x80
+#define ASN1_CONTEXT_DNSNAME 0x82
+#define ASN1_EXPLICIT_TAG 0xa0
+#define ASN1_V3_DATA 0xa3
+
+#define SIG_TYPE_MD2 0x02
+#define SIG_TYPE_MD5 0x04
+#define SIG_TYPE_SHA1 0x05
+#define SIG_TYPE_SHA256 0x0B /* GBG */
+
+int get_asn1_length(const uint8_t *buf, int *offset);
+int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx);
+int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type);
+int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type);
+int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object);
+int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
+int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
+int asn1_name(const uint8_t *cert, int *offset, char *dn[]);
+int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
+int asn1_find_subjectaltname(const uint8_t* cert, int offset);
+int asn1_compare_dn(char * const dn1[], char * const dn2[]);
+#endif /* CONFIG_SSL_CERT_VERIFICATION */
+int asn1_signature_type(const uint8_t *cert,
+ int *offset, X509_CTX *x509_ctx);
+
+/**************************************************************************
+ * MISC declarations
+ **************************************************************************/
+#define SALT_SIZE 8
+
+extern const char * const unsupported_str;
+
+typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int);
+typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key,
+ int key_len, uint8_t *digest);
+
+int get_file(const char *filename, uint8_t **buf);
+
+#if defined(CONFIG_SSL_FULL_MODE) || defined(WIN32) || defined(CONFIG_DEBUG)
+EXP_FUNC void STDCALL print_blob(const char *format, const uint8_t *data, int size, ...);
+#else
+/*#define print_blob(...)*/
+EXP_FUNC void STDCALL print_blob(const char *format, const uint8_t *data, int size, ...);
+#endif
+
+EXP_FUNC int STDCALL base64_decode(const char *in, int len,
+ uint8_t *out, int *outlen);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/gen_cert.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/gen_cert.c
new file mode 100644
index 0000000..9ef00e2
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/gen_cert.c
@@ -0,0 +1,367 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#ifdef CONFIG_SSL_GENERATE_X509_CERT
+#include <string.h>
+#include <stdlib.h>
+#include "os_port.h"
+#include "ssl.h"
+
+/**
+ * Generate a basic X.509 certificate
+ */
+
+static uint8_t set_gen_length(int len, uint8_t *buf, int *offset)
+{
+ if (len < 0x80) /* short form */
+ {
+ buf[(*offset)++] = len;
+ return 1;
+ }
+ else /* long form */
+ {
+ int i, length_bytes = 0;
+
+ if (len & 0x00FF0000)
+ length_bytes = 3;
+ else if (len & 0x0000FF00)
+ length_bytes = 2;
+ else if (len & 0x000000FF)
+ length_bytes = 1;
+
+ buf[(*offset)++] = 0x80 + length_bytes;
+
+ for (i = length_bytes-1; i >= 0; i--)
+ {
+ buf[*offset+i] = len & 0xFF;
+ len >>= 8;
+ }
+
+ *offset += length_bytes;
+ return length_bytes+1;
+ }
+}
+
+static int pre_adjust_with_size(uint8_t type,
+ int *seq_offset, uint8_t *buf, int *offset)
+{
+ buf[(*offset)++] = type;
+ *seq_offset = *offset;
+ *offset += 4; /* fill in later */
+ return *offset;
+}
+
+static void adjust_with_size(int seq_size, int seq_start,
+ uint8_t *buf, int *offset)
+{
+ uint8_t seq_byte_size;
+ int orig_seq_size = seq_size;
+ int orig_seq_start = seq_start;
+
+ seq_size = *offset-seq_size;
+ seq_byte_size = set_gen_length(seq_size, buf, &seq_start);
+
+ if (seq_byte_size != 4)
+ {
+ memmove(&buf[orig_seq_start+seq_byte_size],
+ &buf[orig_seq_size], seq_size);
+ *offset -= 4-seq_byte_size;
+ }
+}
+
+static void gen_serial_number(uint8_t *buf, int *offset)
+{
+ static const uint8_t ser_oid[] = { ASN1_INTEGER, 1, 0x7F };
+ memcpy(&buf[*offset], ser_oid , sizeof(ser_oid));
+ *offset += sizeof(ser_oid);
+}
+
+static void gen_signature_alg(uint8_t *buf, int *offset)
+{
+ /* OBJECT IDENTIFIER sha1withRSAEncryption (1 2 840 113549 1 1 5) */
+ static const uint8_t sig_oid[] =
+ {
+ ASN1_SEQUENCE, 0x0d, ASN1_OID, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
+ ASN1_NULL, 0x00
+ };
+
+ memcpy(&buf[*offset], sig_oid, sizeof(sig_oid));
+ *offset += sizeof(sig_oid);
+}
+
+static int gen_dn(const char *name, uint8_t dn_type,
+ uint8_t *buf, int *offset)
+{
+ int ret = X509_OK;
+ int name_size = (int)strlen(name);
+
+ if (name_size > 0x70) /* just too big */
+ {
+ ret = X509_NOT_OK;
+ goto error;
+ }
+
+ buf[(*offset)++] = ASN1_SET;
+ set_gen_length(9+name_size, buf, offset);
+ buf[(*offset)++] = ASN1_SEQUENCE;
+ set_gen_length(7+name_size, buf, offset);
+ buf[(*offset)++] = ASN1_OID;
+ buf[(*offset)++] = 3;
+ buf[(*offset)++] = 0x55;
+ buf[(*offset)++] = 0x04;
+ buf[(*offset)++] = dn_type;
+ buf[(*offset)++] = ASN1_PRINTABLE_STR;
+ buf[(*offset)++] = name_size;
+ memcpy((char*)&buf[*offset], name, name_size);
+ *offset += name_size;
+
+error:
+ return ret;
+}
+
+static int gen_issuer(const char * dn[], uint8_t *buf, int *offset)
+{
+ int ret = X509_OK;
+ int seq_offset;
+ int seq_size = pre_adjust_with_size(
+ ASN1_SEQUENCE, &seq_offset, buf, offset);
+#if 0 /* GBG */
+ char fqdn[128];
+
+ /* we need the common name, so if not configured, work out the fully
+ * qualified domain name */
+ if (dn[X509_COMMON_NAME] == NULL || strlen(dn[X509_COMMON_NAME]) == 0)
+ {
+ int fqdn_len;
+ gethostname(fqdn, sizeof(fqdn));
+ fqdn_len = strlen(fqdn);
+ fqdn[fqdn_len++] = '.';
+ getdomainname(&fqdn[fqdn_len], sizeof(fqdn)-fqdn_len);
+ fqdn_len = strlen(fqdn);
+
+ if (fqdn[fqdn_len-1] == '.') /* ensure '.' is not last char */
+ fqdn[fqdn_len-1] = 0;
+
+ dn[X509_COMMON_NAME] = fqdn;
+ }
+#endif /* GBG */
+
+ if ((ret = gen_dn(dn[X509_COMMON_NAME], 3, buf, offset)))
+ goto error;
+
+ if (dn[X509_ORGANIZATION] != NULL && strlen(dn[X509_ORGANIZATION]) > 0)
+ {
+ if ((ret = gen_dn(dn[X509_ORGANIZATION], 10, buf, offset)))
+ goto error;
+ }
+
+ if (dn[X509_ORGANIZATIONAL_UNIT] != NULL &&
+ strlen(dn[X509_ORGANIZATIONAL_UNIT]) > 0)
+ {
+ if ((ret = gen_dn(dn[X509_ORGANIZATIONAL_UNIT], 11, buf, offset)))
+ goto error;
+ }
+
+ adjust_with_size(seq_size, seq_offset, buf, offset);
+
+error:
+ return ret;
+}
+
+static void gen_utc_time(uint8_t *buf, int *offset)
+{
+ static const uint8_t time_seq[] =
+ {
+ ASN1_SEQUENCE, 30,
+ ASN1_UTC_TIME, 13,
+ '0', '7', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', 'Z',
+ ASN1_UTC_TIME, 13, /* make it good for 30 or so years */
+ '3', '8', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', 'Z'
+ };
+
+ /* fixed time */
+ memcpy(&buf[*offset], time_seq, sizeof(time_seq));
+ *offset += sizeof(time_seq);
+}
+
+static void gen_pub_key2(const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset)
+{
+ static const uint8_t pub_key_seq[] =
+ {
+ ASN1_INTEGER, 0x03, 0x01, 0x00, 0x01 /* INTEGER 65537 */
+ };
+
+ int seq_offset;
+ int pub_key_size = rsa_ctx->num_octets;
+ uint8_t *block = (uint8_t *)alloca(pub_key_size);
+ int seq_size = pre_adjust_with_size(
+ ASN1_SEQUENCE, &seq_offset, buf, offset);
+ buf[(*offset)++] = ASN1_INTEGER;
+ bi_export(rsa_ctx->bi_ctx, rsa_ctx->m, block, pub_key_size);
+
+ if (*block & 0x80) /* make integer positive */
+ {
+ set_gen_length(pub_key_size+1, buf, offset);
+ buf[(*offset)++] = 0;
+ }
+ else
+ set_gen_length(pub_key_size, buf, offset);
+
+ memcpy(&buf[*offset], block, pub_key_size);
+ *offset += pub_key_size;
+ memcpy(&buf[*offset], pub_key_seq, sizeof(pub_key_seq));
+ *offset += sizeof(pub_key_seq);
+ adjust_with_size(seq_size, seq_offset, buf, offset);
+}
+
+static void gen_pub_key1(const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset)
+{
+ int seq_offset;
+ int seq_size = pre_adjust_with_size(
+ ASN1_BIT_STRING, &seq_offset, buf, offset);
+ buf[(*offset)++] = 0; /* bit string is multiple of 8 */
+ gen_pub_key2(rsa_ctx, buf, offset);
+ adjust_with_size(seq_size, seq_offset, buf, offset);
+}
+
+static void gen_pub_key(const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset)
+{
+ /* OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1) */
+ static const uint8_t rsa_enc_oid[] =
+ {
+ ASN1_SEQUENCE, 0x0d, ASN1_OID, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
+ ASN1_NULL, 0x00
+ };
+
+ int seq_offset;
+ int seq_size = pre_adjust_with_size(
+ ASN1_SEQUENCE, &seq_offset, buf, offset);
+
+ memcpy(&buf[*offset], rsa_enc_oid, sizeof(rsa_enc_oid));
+ *offset += sizeof(rsa_enc_oid);
+ gen_pub_key1(rsa_ctx, buf, offset);
+ adjust_with_size(seq_size, seq_offset, buf, offset);
+}
+
+static void gen_signature(const RSA_CTX *rsa_ctx, const uint8_t *sha_dgst,
+ uint8_t *buf, int *offset)
+{
+ static const uint8_t asn1_sig[] =
+ {
+ ASN1_SEQUENCE, 0x21, ASN1_SEQUENCE, 0x09, ASN1_OID, 0x05,
+ 0x2b, 0x0e, 0x03, 0x02, 0x1a, /* sha1 (1 3 14 3 2 26) */
+ ASN1_NULL, 0x00, ASN1_OCTET_STRING, 0x14
+ };
+
+ uint8_t *enc_block = (uint8_t *)alloca(rsa_ctx->num_octets);
+ uint8_t *block = (uint8_t *)alloca(sizeof(asn1_sig) + SHA1_SIZE);
+ int sig_size;
+
+ /* add the digest as an embedded asn.1 sequence */
+ memcpy(block, asn1_sig, sizeof(asn1_sig));
+ memcpy(&block[sizeof(asn1_sig)], sha_dgst, SHA1_SIZE);
+
+ sig_size = RSA_encrypt(rsa_ctx, block,
+ sizeof(asn1_sig) + SHA1_SIZE, enc_block, 1);
+
+ buf[(*offset)++] = ASN1_BIT_STRING;
+ set_gen_length(sig_size+1, buf, offset);
+ buf[(*offset)++] = 0; /* bit string is multiple of 8 */
+ memcpy(&buf[*offset], enc_block, sig_size);
+ *offset += sig_size;
+}
+
+static int gen_tbs_cert(const char * dn[],
+ const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset,
+ uint8_t *sha_dgst)
+{
+ int ret = X509_OK;
+ SHA1_CTX sha_ctx;
+ int seq_offset;
+ int begin_tbs = *offset;
+ int seq_size = pre_adjust_with_size(
+ ASN1_SEQUENCE, &seq_offset, buf, offset);
+
+ gen_serial_number(buf, offset);
+ gen_signature_alg(buf, offset);
+
+ /* CA certicate issuer */
+ if ((ret = gen_issuer(dn, buf, offset)))
+ goto error;
+
+ gen_utc_time(buf, offset);
+
+ /* certificate issuer */
+ if ((ret = gen_issuer(dn, buf, offset)))
+ goto error;
+
+ gen_pub_key(rsa_ctx, buf, offset);
+ adjust_with_size(seq_size, seq_offset, buf, offset);
+
+ SHA1_Init(&sha_ctx);
+ SHA1_Update(&sha_ctx, &buf[begin_tbs], *offset-begin_tbs);
+ SHA1_Final(sha_dgst, &sha_ctx);
+
+error:
+ return ret;
+}
+
+/**
+ * Create a new certificate.
+ */
+EXP_FUNC int STDCALL ssl_x509_create(SSL_CTX *ssl_ctx, uint32_t options, const char * dn[], uint8_t **cert_data)
+{
+ int ret = X509_OK, offset = 0, seq_offset;
+ /* allocate enough space to load a new certificate */
+ uint8_t *buf = (uint8_t *)alloca(ssl_ctx->rsa_ctx->num_octets*2 + 512);
+ uint8_t sha_dgst[SHA1_SIZE];
+ int seq_size = pre_adjust_with_size(ASN1_SEQUENCE,
+ &seq_offset, buf, &offset);
+
+ if ((ret = gen_tbs_cert(dn, ssl_ctx->rsa_ctx, buf, &offset, sha_dgst)) < 0)
+ goto error;
+
+ (void)options; /* GBG */
+ gen_signature_alg(buf, &offset);
+ gen_signature(ssl_ctx->rsa_ctx, sha_dgst, buf, &offset);
+ adjust_with_size(seq_size, seq_offset, buf, &offset);
+ *cert_data = (uint8_t *)malloc(offset); /* create the exact memory for it */
+ memcpy(*cert_data, buf, offset);
+
+error:
+ return ret < 0 ? ret : offset;
+}
+
+#endif
+
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/loader.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/loader.c
new file mode 100644
index 0000000..eb6ec09
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/loader.c
@@ -0,0 +1,491 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * Load certificates/keys into memory. These can be in many different formats.
+ * PEM support and other formats can be processed here.
+ *
+ * The PEM private keys may be optionally encrypted with AES128 or AES256.
+ * The encrypted PEM keys were generated with something like:
+ *
+ * openssl genrsa -aes128 -passout pass:abcd -out axTLS.key_aes128.pem 512
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "os_port.h"
+#include "ssl.h"
+
+static int do_obj(SSL_CTX *ssl_ctx, int obj_type,
+ SSLObjLoader *ssl_obj, const char *password);
+#ifdef CONFIG_SSL_HAS_PEM
+#if 0 /* GBG */
+static int ssl_obj_PEM_load(SSL_CTX *ssl_ctx, int obj_type,
+ SSLObjLoader *ssl_obj, const char *password);
+#endif /* GBG */
+#endif
+
+#if 0 /* GBG */
+/*
+ * Load a file into memory that is in binary DER (or ascii PEM) format.
+ */
+EXP_FUNC int STDCALL ssl_obj_load(SSL_CTX *ssl_ctx, int obj_type,
+ const char *filename, const char *password)
+{
+#ifndef CONFIG_SSL_SKELETON_MODE
+ static const char * const begin = "-----BEGIN";
+ int ret = SSL_OK;
+ SSLObjLoader *ssl_obj = NULL;
+
+ if (filename == NULL)
+ {
+ ret = SSL_ERROR_INVALID_KEY;
+ goto error;
+ }
+
+ ssl_obj = (SSLObjLoader *)calloc(1, sizeof(SSLObjLoader));
+ ssl_obj->len = get_file(filename, &ssl_obj->buf);
+ if (ssl_obj->len <= 0)
+ {
+ ret = SSL_ERROR_INVALID_KEY;
+ goto error;
+ }
+
+ /* is the file a PEM file? */
+ if (strstr((char *)ssl_obj->buf, begin) != NULL)
+ {
+#ifdef CONFIG_SSL_HAS_PEM
+ ret = ssl_obj_PEM_load(ssl_ctx, obj_type, ssl_obj, password);
+#else
+ printf(unsupported_str);
+ ret = SSL_ERROR_NOT_SUPPORTED;
+#endif
+ }
+ else
+ ret = do_obj(ssl_ctx, obj_type, ssl_obj, password);
+
+error:
+ ssl_obj_free(ssl_obj);
+ return ret;
+#else
+ printf(unsupported_str);
+ return SSL_ERROR_NOT_SUPPORTED;
+#endif /* CONFIG_SSL_SKELETON_MODE */
+}
+#endif
+
+/*
+ * Transfer binary data into the object loader.
+ */
+EXP_FUNC int STDCALL ssl_obj_memory_load(SSL_CTX *ssl_ctx, int mem_type,
+ const uint8_t *data, int len, const char *password)
+{
+ int ret;
+ SSLObjLoader *ssl_obj;
+
+ ssl_obj = (SSLObjLoader *)calloc(1, sizeof(SSLObjLoader));
+ ssl_obj->buf = (uint8_t *)malloc(len);
+ memcpy(ssl_obj->buf, data, len);
+ ssl_obj->len = len;
+ ret = do_obj(ssl_ctx, mem_type, ssl_obj, password);
+ ssl_obj_free(ssl_obj);
+ return ret;
+}
+
+/*
+ * Actually work out what we are doing
+ */
+static int do_obj(SSL_CTX *ssl_ctx, int obj_type,
+ SSLObjLoader *ssl_obj, const char *password)
+{
+ int ret = SSL_OK;
+
+ switch (obj_type)
+ {
+ case SSL_OBJ_RSA_KEY:
+ ret = add_private_key(ssl_ctx, ssl_obj);
+ break;
+
+ case SSL_OBJ_X509_CERT:
+ ret = add_cert(ssl_ctx, ssl_obj->buf, ssl_obj->len);
+ break;
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ case SSL_OBJ_X509_CACERT:
+ ret = add_cert_auth(ssl_ctx, ssl_obj->buf, ssl_obj->len);
+ break;
+#endif
+
+#ifdef CONFIG_SSL_USE_PKCS12
+ case SSL_OBJ_PKCS8:
+ ret = pkcs8_decode(ssl_ctx, ssl_obj, password);
+ break;
+
+ case SSL_OBJ_PKCS12:
+ ret = pkcs12_decode(ssl_ctx, ssl_obj, password);
+ break;
+#endif
+ default:
+ /*printf("%s", unsupported_str);*/
+ ret = SSL_ERROR_NOT_SUPPORTED;
+ break;
+ }
+
+ return ret;
+}
+
+/*
+ * Clean up our mess.
+ */
+void ssl_obj_free(SSLObjLoader *ssl_obj)
+{
+ if (ssl_obj)
+ {
+ free(ssl_obj->buf);
+ free(ssl_obj);
+ }
+}
+
+/*
+ * Support for PEM encoded keys/certificates.
+ */
+#ifdef CONFIG_SSL_HAS_PEM
+
+#define NUM_PEM_TYPES 4
+#define IV_SIZE 16
+#define IS_RSA_PRIVATE_KEY 0
+#define IS_ENCRYPTED_PRIVATE_KEY 1
+#define IS_PRIVATE_KEY 2
+#define IS_CERTIFICATE 3
+
+static const char * const begins[NUM_PEM_TYPES] =
+{
+ "-----BEGIN RSA PRIVATE KEY-----",
+ "-----BEGIN ENCRYPTED PRIVATE KEY-----",
+ "-----BEGIN PRIVATE KEY-----",
+ "-----BEGIN CERTIFICATE-----",
+};
+
+static const char * const ends[NUM_PEM_TYPES] =
+{
+ "-----END RSA PRIVATE KEY-----",
+ "-----END ENCRYPTED PRIVATE KEY-----",
+ "-----END PRIVATE KEY-----",
+ "-----END CERTIFICATE-----",
+};
+
+static const char * const aes_str[2] =
+{
+ "DEK-Info: AES-128-CBC,",
+ "DEK-Info: AES-256-CBC,"
+};
+
+#if 0 /* GBG */
+/**
+ * Take a base64 blob of data and decrypt it (using AES) into its
+ * proper ASN.1 form.
+ */
+static int pem_decrypt(const char *where, const char *end,
+ const char *password, SSLObjLoader *ssl_obj)
+{
+ int ret = -1;
+ int is_aes_256 = 0;
+ char *start = NULL;
+ uint8_t iv[IV_SIZE];
+ int i, pem_size;
+ MD5_CTX md5_ctx;
+ AES_CTX aes_ctx;
+ uint8_t key[32]; /* AES256 size */
+
+ if (password == NULL || strlen(password) == 0)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("Error: Need a password for this PEM file\n"); TTY_FLUSH();
+#endif
+ goto error;
+ }
+
+ if ((start = strstr((const char *)where, aes_str[0]))) /* AES128? */
+ {
+ start += strlen(aes_str[0]);
+ }
+ else if ((start = strstr((const char *)where, aes_str[1]))) /* AES256? */
+ {
+ is_aes_256 = 1;
+ start += strlen(aes_str[1]);
+ }
+ else
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("Error: Unsupported password cipher\n"); TTY_FLUSH();
+#endif
+ goto error;
+ }
+
+ /* convert from hex to binary - assumes uppercase hex */
+ for (i = 0; i < IV_SIZE; i++)
+ {
+ char c = *start++ - '0';
+ iv[i] = (c > 9 ? c + '0' - 'A' + 10 : c) << 4;
+ c = *start++ - '0';
+ iv[i] += (c > 9 ? c + '0' - 'A' + 10 : c);
+ }
+
+ while (*start == '\r' || *start == '\n')
+ start++;
+
+ /* turn base64 into binary */
+ pem_size = (int)(end-start);
+ if (base64_decode(start, pem_size, ssl_obj->buf, &ssl_obj->len) != 0)
+ goto error;
+
+ /* work out the key */
+ MD5_Init(&md5_ctx);
+ MD5_Update(&md5_ctx, (const uint8_t *)password, (int)strlen(password)); /* GBG */
+ MD5_Update(&md5_ctx, iv, SALT_SIZE);
+ MD5_Final(key, &md5_ctx);
+
+ if (is_aes_256)
+ {
+ MD5_Init(&md5_ctx);
+ MD5_Update(&md5_ctx, key, MD5_SIZE);
+ MD5_Update(&md5_ctx, (const uint8_t *)password, (int)strlen(password)); /* GBG */
+ MD5_Update(&md5_ctx, iv, SALT_SIZE);
+ MD5_Final(&key[MD5_SIZE], &md5_ctx);
+ }
+
+ /* decrypt using the key/iv */
+ AES_set_key(&aes_ctx, key, iv, is_aes_256 ? AES_MODE_256 : AES_MODE_128);
+ AES_convert_key(&aes_ctx);
+ AES_cbc_decrypt(&aes_ctx, ssl_obj->buf, ssl_obj->buf, ssl_obj->len);
+ ret = 0;
+
+error:
+ return ret;
+}
+
+/**
+ * Take a base64 blob of data and turn it into its proper ASN.1 form.
+ */
+static int new_pem_obj(SSL_CTX *ssl_ctx, int is_cacert, char *where,
+ int remain, const char *password)
+{
+ int ret = SSL_ERROR_BAD_CERTIFICATE;
+ SSLObjLoader *ssl_obj = NULL;
+
+ while (remain > 0)
+ {
+ int i, pem_size, obj_type;
+ char *start = NULL, *end = NULL;
+
+ for (i = 0; i < NUM_PEM_TYPES; i++)
+ {
+ if ((start = strstr(where, begins[i])) &&
+ (end = strstr(where, ends[i])))
+ {
+ remain -= (int)(end-where);
+ start += strlen(begins[i]);
+ pem_size = (int)(end-start);
+
+ ssl_obj = (SSLObjLoader *)calloc(1, sizeof(SSLObjLoader));
+
+ /* 4/3 bigger than what we need but so what */
+ ssl_obj->buf = (uint8_t *)calloc(1, pem_size);
+ ssl_obj->len = pem_size;
+
+ if (i == IS_RSA_PRIVATE_KEY &&
+ strstr(start, "Proc-Type:") &&
+ strstr(start, "4,ENCRYPTED"))
+ {
+ /* check for encrypted PEM file */
+ if (pem_decrypt(start, end, password, ssl_obj) < 0)
+ {
+ ret = SSL_ERROR_BAD_CERTIFICATE;
+ goto error;
+ }
+ }
+ else
+ {
+ ssl_obj->len = pem_size;
+ if (base64_decode(start, pem_size,
+ ssl_obj->buf, &ssl_obj->len) != 0)
+ {
+ ret = SSL_ERROR_BAD_CERTIFICATE;
+ goto error;
+ }
+ }
+
+ switch (i)
+ {
+ case IS_RSA_PRIVATE_KEY:
+ obj_type = SSL_OBJ_RSA_KEY;
+ break;
+
+ case IS_ENCRYPTED_PRIVATE_KEY:
+ case IS_PRIVATE_KEY:
+ obj_type = SSL_OBJ_PKCS8;
+ break;
+
+ case IS_CERTIFICATE:
+ obj_type = is_cacert ?
+ SSL_OBJ_X509_CACERT : SSL_OBJ_X509_CERT;
+ break;
+
+ default:
+ ret = SSL_ERROR_BAD_CERTIFICATE;
+ goto error;
+ }
+
+ /* In a format we can now understand - so process it */
+ if ((ret = do_obj(ssl_ctx, obj_type, ssl_obj, password)))
+ goto error;
+
+ end += strlen(ends[i]);
+ remain -= strlen(ends[i]);
+ while (remain > 0 && (*end == '\r' || *end == '\n'))
+ {
+ end++;
+ remain--;
+ }
+
+ where = end;
+ break;
+ }
+ }
+
+ ssl_obj_free(ssl_obj);
+ ssl_obj = NULL;
+ if (start == NULL)
+ break;
+ }
+error:
+ ssl_obj_free(ssl_obj);
+ return ret;
+}
+
+/*
+ * Load a file into memory that is in ASCII PEM format.
+ */
+static int ssl_obj_PEM_load(SSL_CTX *ssl_ctx, int obj_type,
+ SSLObjLoader *ssl_obj, const char *password)
+{
+ char *start;
+
+ /* add a null terminator */
+ ssl_obj->len++;
+ ssl_obj->buf = (uint8_t *)realloc(ssl_obj->buf, ssl_obj->len);
+ ssl_obj->buf[ssl_obj->len-1] = 0;
+ start = (char *)ssl_obj->buf;
+ return new_pem_obj(ssl_ctx, obj_type == SSL_OBJ_X509_CACERT,
+ start, ssl_obj->len, password);
+}
+#endif /* GBG */
+#endif /* CONFIG_SSL_HAS_PEM */
+
+#if 0 /* GBG */
+/**
+ * Load the key/certificates in memory depending on compile-time and user
+ * options.
+ */
+int load_key_certs(SSL_CTX *ssl_ctx)
+{
+ int ret = SSL_OK;
+ uint32_t options = ssl_ctx->options;
+#ifdef CONFIG_SSL_GENERATE_X509_CERT
+ uint8_t *cert_data = NULL;
+ int cert_size;
+ static const char *dn[] =
+ {
+ CONFIG_SSL_X509_COMMON_NAME,
+ CONFIG_SSL_X509_ORGANIZATION_NAME,
+ CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME
+ };
+#endif
+
+ /* do the private key first */
+ if (strlen(CONFIG_SSL_PRIVATE_KEY_LOCATION) > 0)
+ {
+ if ((ret = ssl_obj_load(ssl_ctx, SSL_OBJ_RSA_KEY,
+ CONFIG_SSL_PRIVATE_KEY_LOCATION,
+ CONFIG_SSL_PRIVATE_KEY_PASSWORD)) < 0)
+ goto error;
+ }
+ else if (!(options & SSL_NO_DEFAULT_KEY))
+ {
+#if defined(CONFIG_SSL_USE_DEFAULT_KEY) || defined(CONFIG_SSL_SKELETON_MODE)
+ static const /* saves a few more bytes */
+#include "private_key.h"
+
+ ssl_obj_memory_load(ssl_ctx, SSL_OBJ_RSA_KEY, default_private_key,
+ default_private_key_len, NULL);
+#endif
+ }
+
+ /* now load the certificate */
+#ifdef CONFIG_SSL_GENERATE_X509_CERT
+ if ((cert_size = ssl_x509_create(ssl_ctx, 0, dn, &cert_data)) < 0)
+ {
+ ret = cert_size;
+ goto error;
+ }
+
+ ssl_obj_memory_load(ssl_ctx, SSL_OBJ_X509_CERT, cert_data, cert_size, NULL);
+ free(cert_data);
+#else
+ if (strlen(CONFIG_SSL_X509_CERT_LOCATION))
+ {
+ if ((ret = ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT,
+ CONFIG_SSL_X509_CERT_LOCATION, NULL)) < 0)
+ goto error;
+ }
+ else if (!(options & SSL_NO_DEFAULT_KEY))
+ {
+#if defined(CONFIG_SSL_USE_DEFAULT_KEY) || defined(CONFIG_SSL_SKELETON_MODE)
+ static const /* saves a few bytes and RAM */
+#include "cert.h"
+ ssl_obj_memory_load(ssl_ctx, SSL_OBJ_X509_CERT,
+ default_certificate, default_certificate_len, NULL);
+#endif
+ }
+#endif
+
+error:
+#ifdef CONFIG_SSL_FULL_MODE
+ if (ret)
+ {
+ printf("Error: Certificate or key not loaded\n"); TTY_FLUSH();
+ }
+#endif
+
+ return ret;
+
+}
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/os_port.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/os_port.h
new file mode 100644
index 0000000..7d7ae02
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/os_port.h
@@ -0,0 +1,99 @@
+/*****************************************************************
+|
+| abstraction layer for axTLS
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _OS_PORT_H_
+#define _OS_PORT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#if defined(WIN32)
+#include <windows.h>
+#include <malloc.h>
+typedef UINT8 uint8_t;
+typedef INT8 int8_t;
+typedef UINT16 uint16_t;
+typedef INT16 int16_t;
+typedef UINT32 uint32_t;
+typedef INT32 int32_t;
+typedef UINT64 uint64_t;
+typedef INT64 int64_t;
+#else
+#include <stdint.h>
+#endif
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef struct SSL_SOCKET SSL_SOCKET;
+
+struct SSL_SOCKET {
+ int (*Read)(SSL_SOCKET* self, void* buffer, unsigned int size);
+ int (*Write)(SSL_SOCKET* self, const void* buffer, unsigned int size);
+};
+
+typedef struct {
+ uint32_t year; /* year */
+ uint32_t month; /* month of the year (1-12) */
+ uint32_t day; /* day of the month (1-31) */
+ uint32_t hours; /* hours (0-23) */
+ uint32_t minutes; /* minutes (0-59) */
+ uint32_t seconds; /* seconds (0-59) */
+} SSL_DateTime;
+int SSL_DateTime_Before(const SSL_DateTime* t1, const SSL_DateTime* t2);
+void SSL_DateTime_Now(SSL_DateTime* now);
+uint64_t SSL_GetRandomSeed();
+
+#define STDCALL
+#define EXP_FUNC
+
+#if defined(__cplusplus)
+typedef class NPT_Mutex* SSL_CTX_MUTEX_TYPE;
+#else
+typedef void* SSL_CTX_MUTEX_TYPE;
+#endif
+void SSL_Mutex_Create(SSL_CTX_MUTEX_TYPE* mutex);
+void SSL_Mutex_Destroy(SSL_CTX_MUTEX_TYPE mutex);
+void SSL_Mutex_Lock(SSL_CTX_MUTEX_TYPE mutex);
+void SSL_Mutex_Unlock(SSL_CTX_MUTEX_TYPE mutex);
+#define SSL_CTX_MUTEX_INIT(_mutex) SSL_Mutex_Create(&_mutex)
+#define SSL_CTX_MUTEX_DESTROY(_mutex) do {SSL_Mutex_Destroy(_mutex); _mutex = NULL; } while(0)
+#define SSL_CTX_LOCK(_mutex) SSL_Mutex_Lock(_mutex)
+#define SSL_CTX_UNLOCK(_mutex) SSL_Mutex_Unlock(_mutex)
+
+#define TTY_FLUSH()
+#define SOCKET_BLOCK(X)
+#define SOCKET_READ(s,b,z) (s)->Read((s), (b), (z))
+#define SOCKET_WRITE(s,b,z) (s)->Write((s), (b), (z))
+
+void SSL_Sha256_ComputeDigest(const unsigned char* buffer, unsigned int buffer_length, unsigned char* digest);
+
+#endif /* _OS_PORT_H_ */
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/p12.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/p12.c
new file mode 100644
index 0000000..2bafaf7
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/p12.c
@@ -0,0 +1,483 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * Process PKCS#8/PKCS#12 keys.
+ *
+ * The decoding of a PKCS#12 key is fairly specific - this code was tested on a
+ * key generated with:
+ *
+ * openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem
+ * -keypbe PBE-SHA1-RC4-128 -certpbe PBE-SHA1-RC4-128
+ * -name "p12_withoutCA" -out axTLS.withoutCA.p12 -password pass:abcd
+ *
+ * or with a certificate chain:
+ *
+ * openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem
+ * -certfile axTLS.ca_x509.pem -keypbe PBE-SHA1-RC4-128 -certpbe
+ * PBE-SHA1-RC4-128 -name "p12_withCA" -out axTLS.withCA.p12 -password pass:abcd
+ *
+ * Note that the PBE has to be specified with PBE-SHA1-RC4-128. The
+ * private/public keys/certs have to use RSA encryption. Both the integrity
+ * and privacy passwords are the same.
+ *
+ * The PKCS#8 files were generated with something like:
+ *
+ * PEM format:
+ * openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -v1
+ * PBE-SHA1-RC4-128 -out axTLS.encrypted_pem.p8
+ *
+ * DER format:
+ * openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -outform DER
+ * -v1 PBE-SHA1-RC4-128 -out axTLS.encrypted.p8
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "os_port.h"
+#include "ssl.h"
+
+/* all commented out if not used */
+#ifdef CONFIG_SSL_USE_PKCS12
+
+#define BLOCK_SIZE 64
+#define PKCS12_KEY_ID 1
+#define PKCS12_IV_ID 2
+#define PKCS12_MAC_ID 3
+
+static char *make_uni_pass(const char *password, int *uni_pass_len);
+static int p8_decrypt(const char *uni_pass, int uni_pass_len,
+ const uint8_t *salt, int iter,
+ uint8_t *priv_key, int priv_key_len, int id);
+static int p8_add_key(SSL_CTX *ssl_ctx, uint8_t *priv_key);
+static int get_pbe_params(uint8_t *buf, int *offset,
+ const uint8_t **salt, int *iterations);
+
+/*
+ * Take a raw pkcs8 block and then decrypt it and turn it into a normal key.
+ */
+int pkcs8_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password)
+{
+ uint8_t *buf = ssl_obj->buf;
+ int len, offset = 0;
+ int iterations;
+ int ret = SSL_NOT_OK;
+ uint8_t *version = NULL;
+ const uint8_t *salt;
+ uint8_t *priv_key;
+ int uni_pass_len;
+ char *uni_pass = make_uni_pass(password, &uni_pass_len);
+
+ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("Error: Invalid p8 ASN.1 file\n");
+#endif
+ goto error;
+ }
+
+ /* unencrypted key? */
+ if (asn1_get_int(buf, &offset, &version) > 0 && *version == 0)
+ {
+ ret = p8_add_key(ssl_ctx, buf);
+ goto error;
+ }
+
+ if (get_pbe_params(buf, &offset, &salt, &iterations) < 0)
+ goto error;
+
+ if ((len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0)
+ goto error;
+
+ priv_key = &buf[offset];
+
+ p8_decrypt(uni_pass, uni_pass_len, salt,
+ iterations, priv_key, len, PKCS12_KEY_ID);
+ ret = p8_add_key(ssl_ctx, priv_key);
+
+error:
+ free(version);
+ free(uni_pass);
+ return ret;
+}
+
+/*
+ * Take the unencrypted pkcs8 and turn it into a private key
+ */
+static int p8_add_key(SSL_CTX *ssl_ctx, uint8_t *priv_key)
+{
+ uint8_t *buf = priv_key;
+ int len, offset = 0;
+ int ret = SSL_NOT_OK;
+
+ /* Skip the preamble and go straight to the private key.
+ We only support rsaEncryption (1.2.840.113549.1.1.1) */
+ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ asn1_skip_obj(buf, &offset, ASN1_INTEGER) < 0 ||
+ asn1_skip_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ (len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0)
+ goto error;
+
+ ret = asn1_get_private_key(&buf[offset], len, &ssl_ctx->rsa_ctx);
+
+error:
+ return ret;
+}
+
+/*
+ * Create the unicode password
+ */
+static char *make_uni_pass(const char *password, int *uni_pass_len)
+{
+ int pass_len = 0, i;
+ char *uni_pass;
+
+ if (password == NULL)
+ {
+ password = "";
+ }
+
+ uni_pass = (char *)malloc((strlen(password)+1)*2);
+
+ /* modify the password into a unicode version */
+ for (i = 0; i < (int)strlen(password); i++)
+ {
+ uni_pass[pass_len++] = 0;
+ uni_pass[pass_len++] = password[i];
+ }
+
+ uni_pass[pass_len++] = 0; /* null terminate */
+ uni_pass[pass_len++] = 0;
+ *uni_pass_len = pass_len;
+ return uni_pass;
+}
+
+/*
+ * Decrypt a pkcs8 block.
+ */
+static int p8_decrypt(const char *uni_pass, int uni_pass_len,
+ const uint8_t *salt, int iter,
+ uint8_t *priv_key, int priv_key_len, int id)
+{
+ uint8_t p[BLOCK_SIZE*2];
+ uint8_t d[BLOCK_SIZE];
+ uint8_t Ai[SHA1_SIZE];
+ SHA1_CTX sha_ctx;
+ RC4_CTX rc4_ctx;
+ int i;
+
+ for (i = 0; i < BLOCK_SIZE; i++)
+ {
+ p[i] = salt[i % SALT_SIZE];
+ p[BLOCK_SIZE+i] = uni_pass[i % uni_pass_len];
+ d[i] = id;
+ }
+
+ /* get the key - no IV since we are using RC4 */
+ SHA1_Init(&sha_ctx);
+ SHA1_Update(&sha_ctx, d, sizeof(d));
+ SHA1_Update(&sha_ctx, p, sizeof(p));
+ SHA1_Final(Ai, &sha_ctx);
+
+ for (i = 1; i < iter; i++)
+ {
+ SHA1_Init(&sha_ctx);
+ SHA1_Update(&sha_ctx, Ai, SHA1_SIZE);
+ SHA1_Final(Ai, &sha_ctx);
+ }
+
+ /* do the decryption */
+ if (id == PKCS12_KEY_ID)
+ {
+ RC4_setup(&rc4_ctx, Ai, 16);
+ RC4_crypt(&rc4_ctx, priv_key, priv_key, priv_key_len);
+ }
+ else /* MAC */
+ memcpy(priv_key, Ai, SHA1_SIZE);
+
+ return 0;
+}
+
+/*
+ * Take a raw pkcs12 block and the decrypt it and turn it into a certificate(s)
+ * and keys.
+ */
+int pkcs12_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password)
+{
+ uint8_t *buf = ssl_obj->buf;
+ int len, iterations, auth_safes_start,
+ auth_safes_end, auth_safes_len, key_offset, offset = 0;
+ int all_certs = 0;
+ uint8_t *version = NULL, *auth_safes = NULL, *cert, *orig_mac;
+ uint8_t key[SHA1_SIZE];
+ uint8_t mac[SHA1_SIZE];
+ const uint8_t *salt;
+ int uni_pass_len, ret = SSL_OK;
+ char *uni_pass = make_uni_pass(password, &uni_pass_len);
+ static const uint8_t pkcs_data[] = /* pkc7 data */
+ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01 };
+ static const uint8_t pkcs_encrypted[] = /* pkc7 encrypted */
+ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x06 };
+ static const uint8_t pkcs8_key_bag[] = /* 1.2.840.113549.1.12.10.1.2 */
+ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x02 };
+
+ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("Error: Invalid p12 ASN.1 file\n");
+#endif
+ goto error;
+ }
+
+ if (asn1_get_int(buf, &offset, &version) < 0 || *version != 3)
+ {
+ ret = SSL_ERROR_INVALID_VERSION;
+ goto error;
+ }
+
+ /* remove all the boring pcks7 bits */
+ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
+ len != sizeof(pkcs_data) ||
+ memcmp(&buf[offset], pkcs_data, sizeof(pkcs_data)))
+ goto error;
+
+ offset += len;
+
+ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 ||
+ asn1_next_obj(buf, &offset, ASN1_OCTET_STRING) < 0)
+ goto error;
+
+ /* work out the MAC start/end points (done on AuthSafes) */
+ auth_safes_start = offset;
+ auth_safes_end = offset;
+ if (asn1_skip_obj(buf, &auth_safes_end, ASN1_SEQUENCE) < 0)
+ goto error;
+
+ auth_safes_len = auth_safes_end - auth_safes_start;
+ auth_safes = malloc(auth_safes_len);
+
+ memcpy(auth_safes, &buf[auth_safes_start], auth_safes_len);
+
+ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
+ (len != sizeof(pkcs_encrypted) ||
+ memcmp(&buf[offset], pkcs_encrypted, sizeof(pkcs_encrypted))))
+ goto error;
+
+ offset += len;
+
+ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 ||
+ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ asn1_skip_obj(buf, &offset, ASN1_INTEGER) < 0 ||
+ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
+ len != sizeof(pkcs_data) ||
+ memcmp(&buf[offset], pkcs_data, sizeof(pkcs_data)))
+ goto error;
+
+ offset += len;
+
+ /* work out the salt for the certificate */
+ if (get_pbe_params(buf, &offset, &salt, &iterations) < 0 ||
+ (len = asn1_next_obj(buf, &offset, ASN1_IMPLICIT_TAG)) < 0)
+ goto error;
+
+ /* decrypt the certificate */
+ cert = &buf[offset];
+ if ((ret = p8_decrypt(uni_pass, uni_pass_len, salt, iterations, cert,
+ len, PKCS12_KEY_ID)) < 0)
+ goto error;
+
+ offset += len;
+
+ /* load the certificate */
+ key_offset = 0;
+ all_certs = asn1_next_obj(cert, &key_offset, ASN1_SEQUENCE);
+
+ /* keep going until all certs are loaded */
+ while (key_offset < all_certs)
+ {
+ int cert_offset = key_offset;
+
+ if (asn1_skip_obj(cert, &cert_offset, ASN1_SEQUENCE) < 0 ||
+ asn1_next_obj(cert, &key_offset, ASN1_SEQUENCE) < 0 ||
+ asn1_skip_obj(cert, &key_offset, ASN1_OID) < 0 ||
+ asn1_next_obj(cert, &key_offset, ASN1_EXPLICIT_TAG) < 0 ||
+ asn1_next_obj(cert, &key_offset, ASN1_SEQUENCE) < 0 ||
+ asn1_skip_obj(cert, &key_offset, ASN1_OID) < 0 ||
+ asn1_next_obj(cert, &key_offset, ASN1_EXPLICIT_TAG) < 0 ||
+ (len = asn1_next_obj(cert, &key_offset, ASN1_OCTET_STRING)) < 0)
+ goto error;
+
+ if ((ret = add_cert(ssl_ctx, &cert[key_offset], len)) < 0)
+ goto error;
+
+ key_offset = cert_offset;
+ }
+
+ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
+ len != sizeof(pkcs_data) ||
+ memcmp(&buf[offset], pkcs_data, sizeof(pkcs_data)))
+ goto error;
+
+ offset += len;
+
+ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 ||
+ asn1_next_obj(buf, &offset, ASN1_OCTET_STRING) < 0 ||
+ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
+ (len != sizeof(pkcs8_key_bag)) ||
+ memcmp(&buf[offset], pkcs8_key_bag, sizeof(pkcs8_key_bag)))
+ goto error;
+
+ offset += len;
+
+ /* work out the salt for the private key */
+ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 ||
+ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ get_pbe_params(buf, &offset, &salt, &iterations) < 0 ||
+ (len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0)
+ goto error;
+
+ /* decrypt the private key */
+ cert = &buf[offset];
+ if ((ret = p8_decrypt(uni_pass, uni_pass_len, salt, iterations, cert,
+ len, PKCS12_KEY_ID)) < 0)
+ goto error;
+
+ offset += len;
+
+ /* load the private key */
+ if ((ret = p8_add_key(ssl_ctx, cert)) < 0)
+ goto error;
+
+ /* miss out on friendly name, local key id etc */
+ if (asn1_skip_obj(buf, &offset, ASN1_SET) < 0)
+ goto error;
+
+ /* work out the MAC */
+ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ asn1_skip_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
+ (len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0 ||
+ len != SHA1_SIZE)
+ goto error;
+
+ orig_mac = &buf[offset];
+ offset += len;
+
+ /* get the salt */
+ if ((len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0 || len != 8)
+ goto error;
+
+ salt = &buf[offset];
+
+ /* work out what the mac should be */
+ if ((ret = p8_decrypt(uni_pass, uni_pass_len, salt, iterations,
+ key, SHA1_SIZE, PKCS12_MAC_ID)) < 0)
+ goto error;
+
+ hmac_sha1(auth_safes, auth_safes_len, key, SHA1_SIZE, mac);
+
+ if (memcmp(mac, orig_mac, SHA1_SIZE))
+ {
+ ret = SSL_ERROR_INVALID_HMAC;
+ goto error;
+ }
+
+error:
+ free(version);
+ free(uni_pass);
+ free(auth_safes);
+ return ret;
+}
+
+/*
+ * Retrieve the salt/iteration details from a PBE block.
+ */
+static int get_pbe_params(uint8_t *buf, int *offset,
+ const uint8_t **salt, int *iterations)
+{
+ static const uint8_t pbeSH1RC4[] = /* pbeWithSHAAnd128BitRC4 */
+ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x01 };
+
+ int i, len;
+ uint8_t *iter = NULL;
+ int error_code = SSL_ERROR_NOT_SUPPORTED;
+
+ /* Get the PBE type */
+ if (asn1_next_obj(buf, offset, ASN1_SEQUENCE) < 0 ||
+ (len = asn1_next_obj(buf, offset, ASN1_OID)) < 0)
+ goto error;
+
+ /* we expect pbeWithSHAAnd128BitRC4 (1.2.840.113549.1.12.1.1)
+ which is the only algorithm we support */
+ if (len != sizeof(pbeSH1RC4) ||
+ memcmp(&buf[*offset], pbeSH1RC4, sizeof(pbeSH1RC4)))
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("Error: pkcs8/pkcs12 must use \"PBE-SHA1-RC4-128\"\n");
+#endif
+ goto error;
+ }
+
+ *offset += len;
+
+ if (asn1_next_obj(buf, offset, ASN1_SEQUENCE) < 0 ||
+ (len = asn1_next_obj(buf, offset, ASN1_OCTET_STRING)) < 0 ||
+ len != 8)
+ goto error;
+
+ *salt = &buf[*offset];
+ *offset += len;
+
+ if ((len = asn1_get_int(buf, offset, &iter)) < 0)
+ goto error;
+
+ *iterations = 0;
+ for (i = 0; i < len; i++)
+ {
+ (*iterations) <<= 8;
+ (*iterations) += iter[i];
+ }
+
+ free(iter);
+ error_code = SSL_OK; /* got here - we are ok */
+
+error:
+ return error_code;
+}
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/ssl.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/ssl.h
new file mode 100644
index 0000000..41a7486
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/ssl.h
@@ -0,0 +1,511 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @mainpage axTLS API
+ *
+ * @image html axolotl.jpg
+ *
+ * The axTLS library has features such as:
+ * - The TLSv1 SSL client/server protocol
+ * - No requirement to use any openssl libraries.
+ * - A choice between AES block (128/256 bit) and RC4 (128 bit) stream ciphers.
+ * - RSA encryption/decryption with variable sized keys (up to 4096 bits).
+ * - Certificate chaining and peer authentication.
+ * - Session resumption, session renegotiation.
+ * - ASN.1, X.509, PKCS#8, PKCS#12 keys/certificates with DER/PEM encoding.
+ * - Highly configurable compile time options.
+ * - Portable across many platforms (written in ANSI C), and has language
+ * bindings in C, C#, VB.NET, Java, Perl and Lua.
+ * - Partial openssl API compatibility (via a wrapper).
+ * - A very small footprint (around 50-60kB for the library in 'server-only'
+ * mode).
+ * - No dependencies on sockets - can use serial connections for example.
+ * - A very simple API - ~ 20 functions/methods.
+ *
+ * A list of these functions/methods are described below.
+ *
+ * @ref c_api
+ *
+ * @ref bigint_api
+ *
+ * @ref csharp_api
+ *
+ * @ref java_api
+ */
+#ifndef HEADER_SSL_H
+#define HEADER_SSL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <time.h>
+#include "os_port.h"
+
+/* need to predefine before ssl_lib.h gets to it */
+#define SSL_SESSION_ID_SIZE 32
+
+#include "tls1.h"
+
+/* The optional parameters that can be given to the client/server SSL engine */
+#define SSL_CLIENT_AUTHENTICATION 0x00010000
+#define SSL_SERVER_VERIFY_LATER 0x00020000
+#define SSL_NO_DEFAULT_KEY 0x00040000
+#define SSL_DISPLAY_STATES 0x00080000
+#define SSL_DISPLAY_BYTES 0x00100000
+#define SSL_DISPLAY_CERTS 0x00200000
+#define SSL_DISPLAY_RSA 0x00400000
+#define SSL_CONNECT_IN_PARTS 0x00800000
+
+/* errors that can be generated */
+#define SSL_OK 0
+#define SSL_NOT_OK -1
+#define SSL_ERROR_DEAD -2
+#define SSL_CLOSE_NOTIFY -3
+#define SSL_ERROR_CONN_LOST -256
+#define SSL_ERROR_SOCK_SETUP_FAILURE -258
+#define SSL_ERROR_INVALID_HANDSHAKE -260
+#define SSL_ERROR_INVALID_PROT_MSG -261
+#define SSL_ERROR_INVALID_HMAC -262
+#define SSL_ERROR_INVALID_VERSION -263
+#define SSL_ERROR_INVALID_SESSION -265
+#define SSL_ERROR_NO_CIPHER -266
+#define SSL_ERROR_BAD_CERTIFICATE -268
+#define SSL_ERROR_INVALID_KEY -269
+#define SSL_ERROR_FINISHED_INVALID -271
+#define SSL_ERROR_NO_CERT_DEFINED -272
+#define SSL_ERROR_NO_CLIENT_RENOG -273
+#define SSL_ERROR_NOT_SUPPORTED -274
+#define SSL_ERROR_TIMEOUT -275 /* GBG */
+#define SSL_ERROR_EOS -276 /* GBG */
+#define SSL_X509_OFFSET -512
+#define SSL_X509_ERROR(A) (SSL_X509_OFFSET+A)
+
+/* alert types that are recognized */
+#define SSL_ALERT_TYPE_WARNING 1
+#define SLL_ALERT_TYPE_FATAL 2
+
+/* these are all the alerts that are recognized */
+#define SSL_ALERT_CLOSE_NOTIFY 0
+#define SSL_ALERT_UNEXPECTED_MESSAGE 10
+#define SSL_ALERT_BAD_RECORD_MAC 20
+#define SSL_ALERT_HANDSHAKE_FAILURE 40
+#define SSL_ALERT_BAD_CERTIFICATE 42
+#define SSL_ALERT_ILLEGAL_PARAMETER 47
+#define SSL_ALERT_DECODE_ERROR 50
+#define SSL_ALERT_DECRYPT_ERROR 51
+#define SSL_ALERT_INVALID_VERSION 70
+#define SSL_ALERT_NO_RENEGOTIATION 100
+
+/* The ciphers that are supported */
+#define SSL_AES128_SHA 0x2f
+#define SSL_AES256_SHA 0x35
+#define SSL_RC4_128_SHA 0x05
+#define SSL_RC4_128_MD5 0x04
+
+/* build mode ids' */
+#define SSL_BUILD_SKELETON_MODE 0x01
+#define SSL_BUILD_SERVER_ONLY 0x02
+#define SSL_BUILD_ENABLE_VERIFICATION 0x03
+#define SSL_BUILD_ENABLE_CLIENT 0x04
+#define SSL_BUILD_FULL_MODE 0x05
+
+/* offsets to retrieve configuration information */
+#define SSL_BUILD_MODE 0
+#define SSL_MAX_CERT_CFG_OFFSET 1
+#define SSL_MAX_CA_CERT_CFG_OFFSET 2
+#define SSL_HAS_PEM 3
+
+/* default session sizes */
+#define SSL_DEFAULT_SVR_SESS 5
+#define SSL_DEFAULT_CLNT_SESS 1
+
+/* X.509/X.520 distinguished name types */
+#define SSL_X509_CERT_COMMON_NAME 0
+#define SSL_X509_CERT_ORGANIZATION 1
+#define SSL_X509_CERT_ORGANIZATIONAL_NAME 2
+#define SSL_X509_CA_CERT_COMMON_NAME 3
+#define SSL_X509_CA_CERT_ORGANIZATION 4
+#define SSL_X509_CA_CERT_ORGANIZATIONAL_NAME 5
+
+/* SSL object loader types */
+#define SSL_OBJ_X509_CERT 1
+#define SSL_OBJ_X509_CACERT 2
+#define SSL_OBJ_RSA_KEY 3
+#define SSL_OBJ_PKCS8 4
+#define SSL_OBJ_PKCS12 5
+
+/**
+ * @defgroup c_api Standard C API
+ * @brief The standard interface in C.
+ * @{
+ */
+
+/**
+ * @brief Establish a new client/server context.
+ *
+ * This function is called before any client/server SSL connections are made.
+ *
+ * Each new connection will use the this context's private key and
+ * certificate chain. If a different certificate chain is required, then a
+ * different context needs to be be used.
+ *
+ * There are two threading models supported - a single thread with one
+ * SSL_CTX can support any number of SSL connections - and multiple threads can
+ * support one SSL_CTX object each (the default). But if a single SSL_CTX
+ * object uses many SSL objects in individual threads, then the
+ * CONFIG_SSL_CTX_MUTEXING option needs to be configured.
+ *
+ * @param options [in] Any particular options. At present the options
+ * supported are:
+ * - SSL_SERVER_VERIFY_LATER (client only): Don't stop a handshake if the server
+ * authentication fails. The certificate can be authenticated later with a
+ * call to ssl_verify_cert().
+ * - SSL_CLIENT_AUTHENTICATION (server only): Enforce client authentication
+ * i.e. each handshake will include a "certificate request" message from the
+ * server. Only available if verification has been enabled.
+ * - SSL_DISPLAY_BYTES (full mode build only): Display the byte sequences
+ * during the handshake.
+ * - SSL_DISPLAY_STATES (full mode build only): Display the state changes
+ * during the handshake.
+ * - SSL_DISPLAY_CERTS (full mode build only): Display the certificates that
+ * are passed during a handshake.
+ * - SSL_DISPLAY_RSA (full mode build only): Display the RSA key details that
+ * are passed during a handshake.
+ * - SSL_CONNECT_IN_PARTS (client only): To use a non-blocking version of
+ * ssl_client_new().
+ * @param num_sessions [in] The number of sessions to be used for session
+ * caching. If this value is 0, then there is no session caching. This option
+ * is not used in skeleton mode.
+ * @return A client/server context.
+ */
+EXP_FUNC SSL_CTX * STDCALL ssl_ctx_new(uint32_t options, int num_sessions);
+
+/**
+ * @brief Remove a client/server context.
+ *
+ * Frees any used resources used by this context. Each connection will be
+ * sent a "Close Notify" alert (if possible).
+ * @param ssl_ctx [in] The client/server context.
+ */
+EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx);
+
+/**
+ * @brief (server only) Establish a new SSL connection to an SSL client.
+ *
+ * It is up to the application to establish the logical connection (whether it
+ * is a socket, serial connection etc).
+ * @param ssl_ctx [in] The server context.
+ * @param client_fd [in] The client's file descriptor.
+ * @return An SSL object reference.
+ */
+EXP_FUNC SSL * STDCALL ssl_server_new(SSL_CTX *ssl_ctx, SSL_SOCKET* client_fd);
+
+/**
+ * @brief (client only) Establish a new SSL connection to an SSL server.
+ *
+ * It is up to the application to establish the initial logical connection
+ * (whether it is a socket, serial connection etc).
+ *
+ * This is a normally a blocking call - it will finish when the handshake is
+ * complete (or has failed). To use in non-blocking mode, set
+ * SSL_CONNECT_IN_PARTS in ssl_ctx_new().
+ * @param ssl_ctx [in] The client context.
+ * @param client_fd [in] The client's file descriptor.
+ * @param session_id [in] A 32 byte session id for session resumption. This
+ * can be null if no session resumption is being used or required. This option
+ * is not used in skeleton mode.
+ * @param sess_id_size The size of the session id (max 32)
+ * @return An SSL object reference. Use ssl_handshake_status() to check
+ * if a handshake succeeded.
+ */
+EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, SSL_SOCKET* client_fd, const uint8_t *session_id, uint8_t sess_id_size);
+
+/**
+ * @brief Free any used resources on this connection.
+
+ * A "Close Notify" message is sent on this connection (if possible). It is up
+ * to the application to close the socket or file descriptor.
+ * @param ssl [in] The ssl object reference.
+ */
+EXP_FUNC void STDCALL ssl_free(SSL *ssl);
+
+/**
+ * @brief Read the SSL data stream.
+ * If the socket is non-blocking and data is blocked then SSO_OK will be
+ * returned.
+ * @param ssl [in] An SSL object reference.
+ * @param in_data [out] If the read was successful, a pointer to the read
+ * buffer will be here. Do NOT ever free this memory as this buffer is used in
+ * sucessive calls. If the call was unsuccessful, this value will be null.
+ * @return The number of decrypted bytes:
+ * - if > 0, then the handshaking is complete and we are returning the number
+ * of decrypted bytes.
+ * - SSL_OK if the handshaking stage is successful (but not yet complete).
+ * - < 0 if an error.
+ * @see ssl.h for the error code list.
+ * @note Use in_data before doing any successive ssl calls.
+ */
+EXP_FUNC int STDCALL ssl_read(SSL *ssl, uint8_t **in_data);
+
+/**
+ * @brief Write to the SSL data stream.
+ * if the socket is non-blocking and data is blocked then a check is made
+ * to ensure that all data is sent (i.e. blocked mode is forced).
+ * @param ssl [in] An SSL obect reference.
+ * @param out_data [in] The data to be written
+ * @param out_len [in] The number of bytes to be written.
+ * @return The number of bytes sent, or if < 0 if an error.
+ * @see ssl.h for the error code list.
+ */
+EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len);
+
+/**
+ * @brief Find an ssl object based on a file descriptor.
+ *
+ * Goes through the list of SSL objects maintained in a client/server context
+ * to look for a file descriptor match.
+ * @param ssl_ctx [in] The client/server context.
+ * @param client_fd [in] The file descriptor.
+ * @return A reference to the SSL object. Returns null if the object could not
+ * be found.
+ */
+EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, SSL_SOCKET* client_fd);
+
+/**
+ * @brief Get the session id for a handshake.
+ *
+ * This will be a 32 byte sequence and is available after the first
+ * handshaking messages are sent.
+ * @param ssl [in] An SSL object reference.
+ * @return The session id as a 32 byte sequence.
+ * @note A SSLv23 handshake may have only 16 valid bytes.
+ */
+EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl);
+
+/**
+ * @brief Get the session id size for a handshake.
+ *
+ * This will normally be 32 but could be 0 (no session id) or something else.
+ * @param ssl [in] An SSL object reference.
+ * @return The size of the session id.
+ */
+EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl);
+
+/**
+ * @brief Return the cipher id (in the SSL form).
+ * @param ssl [in] An SSL object reference.
+ * @return The cipher id. This will be one of the following:
+ * - SSL_AES128_SHA (0x2f)
+ * - SSL_AES256_SHA (0x35)
+ * - SSL_RC4_128_SHA (0x05)
+ * - SSL_RC4_128_MD5 (0x04)
+ */
+EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl);
+
+/**
+ * @brief Return the status of the handshake.
+ * @param ssl [in] An SSL object reference.
+ * @return SSL_OK if the handshake is complete and ok.
+ * @see ssl.h for the error code list.
+ */
+EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl);
+
+/**
+ * @brief Retrieve various parameters about the axTLS engine.
+ * @param offset [in] The configuration offset. It will be one of the following:
+ * - SSL_BUILD_MODE The build mode. This will be one of the following:
+ * - SSL_BUILD_SERVER_ONLY (basic server mode)
+ * - SSL_BUILD_ENABLE_VERIFICATION (server can do client authentication)
+ * - SSL_BUILD_ENABLE_CLIENT (client/server capabilties)
+ * - SSL_BUILD_FULL_MODE (client/server with diagnostics)
+ * - SSL_BUILD_SKELETON_MODE (skeleton mode)
+ * - SSL_MAX_CERT_CFG_OFFSET The maximum number of certificates allowed.
+ * - SSL_MAX_CA_CERT_CFG_OFFSET The maximum number of CA certificates allowed.
+ * - SSL_HAS_PEM 1 if supported
+ * @return The value of the requested parameter.
+ */
+EXP_FUNC int STDCALL ssl_get_config(int offset);
+
+/**
+ * @brief Display why the handshake failed.
+ *
+ * This call is only useful in a 'full mode' build. The output is to stdout.
+ * @param error_code [in] An error code.
+ * @see ssl.h for the error code list.
+ */
+EXP_FUNC void STDCALL ssl_display_error(int error_code);
+
+/**
+ * @brief Authenticate a received certificate.
+ *
+ * This call is usually made by a client after a handshake is complete and the
+ * context is in SSL_SERVER_VERIFY_LATER mode.
+ * @param ssl [in] An SSL object reference.
+ * @return SSL_OK if the certificate is verified.
+ */
+EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl);
+
+/**
+ * @brief Retrieve an X.509 distinguished name component.
+ *
+ * When a handshake is complete and a certificate has been exchanged, then the
+ * details of the remote certificate can be retrieved.
+ *
+ * This will usually be used by a client to check that the server's common
+ * name matches the URL.
+ *
+ * @param ssl [in] An SSL_X509_CERT object reference. [GBG: modified]
+ * @param component [in] one of:
+ * - SSL_X509_CERT_COMMON_NAME
+ * - SSL_X509_CERT_ORGANIZATION
+ * - SSL_X509_CERT_ORGANIZATIONAL_NAME
+ * - SSL_X509_CA_CERT_COMMON_NAME
+ * - SSL_X509_CA_CERT_ORGANIZATION
+ * - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME
+ * @return The appropriate string (or null if not defined)
+ * @note Verification build mode must be enabled.
+ */
+/* GBG: modified */
+EXP_FUNC const char * STDCALL ssl_cert_get_dn(const SSL_X509_CERT *cert, int component);
+
+/**
+ * @brief Retrieve a Subject Alternative DNSName
+ *
+ * When a handshake is complete and a certificate has been exchanged, then the
+ * details of the remote certificate can be retrieved.
+ *
+ * This will usually be used by a client to check that the server's DNS
+ * name matches the URL.
+ *
+ * @param ssl [in] An SSL_X509_CERT object reference. [GBG: modified]
+ * @param dnsindex [in] The index of the DNS name to retrieve.
+ * @return The appropriate string (or null if not defined)
+ * @note Verification build mode must be enabled.
+ */
+/* GBG: modified */
+EXP_FUNC const char * STDCALL ssl_cert_get_subject_alt_dnsname(const SSL_X509_CERT *cert, int dnsindex);
+
+/* GBG added */
+EXP_FUNC const SSL_X509_CERT* ssl_get_peer_cert(const SSL* ssl, unsigned int position);
+EXP_FUNC void ssl_cert_get_fingerprints(const SSL_X509_CERT *cert, unsigned char* md5, unsigned char* sha1);
+EXP_FUNC void ssl_cert_get_validity_dates(const SSL_X509_CERT *cert, SSL_DateTime* not_before, SSL_DateTime* not_after);
+
+/**
+ * @brief Force the client to perform its handshake again.
+ *
+ * For a client this involves sending another "client hello" message.
+ * For the server is means sending a "hello request" message.
+ *
+ * This is a blocking call on the client (until the handshake completes).
+ *
+ * @param ssl [in] An SSL object reference.
+ * @return SSL_OK if renegotiation instantiation was ok
+ */
+EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl);
+
+/**
+ * @brief Process a file that is in binary DER or ASCII PEM format.
+ *
+ * These are temporary objects that are used to load private keys,
+ * certificates etc into memory.
+ * @param ssl_ctx [in] The client/server context.
+ * @param obj_type [in] The format of the file. Can be one of:
+ * - SSL_OBJ_X509_CERT (no password required)
+ * - SSL_OBJ_X509_CACERT (no password required)
+ * - SSL_OBJ_RSA_KEY (AES128/AES256 PEM encryption supported)
+ * - SSL_OBJ_PKCS8 (RC4-128 encrypted data supported)
+ * - SSL_OBJ_PKCS12 (RC4-128 encrypted data supported)
+ *
+ * PEM files are automatically detected (if supported). The object type is
+ * also detected, and so is not relevant for these types of files.
+ * @param filename [in] The location of a file in DER/PEM format.
+ * @param password [in] The password used. Can be null if not required.
+ * @return SSL_OK if all ok
+ * @note Not available in skeleton build mode.
+ */
+EXP_FUNC int STDCALL ssl_obj_load(SSL_CTX *ssl_ctx, int obj_type, const char *filename, const char *password);
+
+/**
+ * @brief Process binary data.
+ *
+ * These are temporary objects that are used to load private keys,
+ * certificates etc into memory.
+ * @param ssl_ctx [in] The client/server context.
+ * @param obj_type [in] The format of the memory data.
+ * @param data [in] The binary data to be loaded.
+ * @param len [in] The amount of data to be loaded.
+ * @param password [in] The password used. Can be null if not required.
+ * @return SSL_OK if all ok
+ * @see ssl_obj_load for more details on obj_type.
+ */
+EXP_FUNC int STDCALL ssl_obj_memory_load(SSL_CTX *ssl_ctx, int obj_type, const uint8_t *data, int len, const char *password);
+
+#ifdef CONFIG_SSL_GENERATE_X509_CERT
+/**
+ * @brief Create an X.509 certificate.
+ *
+ * This certificate is a self-signed v1 cert with a fixed start/stop validity
+ * times. It is signed with an internal private key in ssl_ctx.
+ *
+ * @param ssl_ctx [in] The client/server context.
+ * @param options [in] Not used yet.
+ * @param dn [in] An array of distinguished name strings. The array is defined
+ * by:
+ * - SSL_X509_CERT_COMMON_NAME (0)
+ * - If SSL_X509_CERT_COMMON_NAME is empty or not defined, then the
+ * hostname will be used.
+ * - SSL_X509_CERT_ORGANIZATION (1)
+ * - If SSL_X509_CERT_ORGANIZATION is empty or not defined, then $USERNAME
+ * will be used.
+ * - SSL_X509_CERT_ORGANIZATIONAL_NAME (2)
+ * - SSL_X509_CERT_ORGANIZATIONAL_NAME is optional.
+ * @param cert_data [out] The certificate as a sequence of bytes.
+ * @return < 0 if an error, or the size of the certificate in bytes.
+ * @note cert_data must be freed when there is no more need for it.
+ */
+EXP_FUNC int STDCALL ssl_x509_create(SSL_CTX *ssl_ctx, uint32_t options, const char * dn[], uint8_t **cert_data);
+#endif
+
+/**
+ * @brief Return the axTLS library version as a string.
+ */
+EXP_FUNC const char * STDCALL ssl_version(void);
+
+EXP_FUNC void ssl_mem_free(void* mem); /* GBG */
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1.c
new file mode 100755
index 0000000..d8eaf94
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1.c
@@ -0,0 +1,2271 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * Common ssl/tlsv1 code to both the client and server implementations.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include "os_port.h"
+#include "ssl.h"
+
+/* The session expiry time */
+#define SSL_EXPIRY_TIME (CONFIG_SSL_EXPIRY_TIME*3600)
+
+static const uint8_t g_hello_request[] = { HS_HELLO_REQUEST, 0, 0, 0 };
+static const uint8_t g_chg_cipher_spec_pkt[] = { 1 };
+static const char * server_finished = "server finished";
+static const char * client_finished = "client finished";
+
+static int do_handshake(SSL *ssl, uint8_t *buf, int read_len);
+static int set_key_block(SSL *ssl, int is_write);
+static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len);
+static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt);
+static int send_raw_packet(SSL *ssl, uint8_t protocol);
+
+/**
+ * The server will pick the cipher based on the order that the order that the
+ * ciphers are listed. This order is defined at compile time.
+ */
+#ifdef CONFIG_SSL_SKELETON_MODE
+const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] =
+{ SSL_RC4_128_SHA };
+#else
+static void session_free(SSL_SESSION *ssl_sessions[], int sess_index);
+
+const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] =
+#ifdef CONFIG_SSL_PROT_LOW /* low security, fast speed */
+{ SSL_RC4_128_SHA, SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_MD5 };
+#elif CONFIG_SSL_PROT_MEDIUM /* medium security, medium speed */
+{ SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 };
+#else /* CONFIG_SSL_PROT_HIGH */ /* high security, low speed */
+{ SSL_AES256_SHA, SSL_AES128_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 };
+#endif
+#endif /* CONFIG_SSL_SKELETON_MODE */
+
+/**
+ * The cipher map containing all the essentials for each cipher.
+ */
+#ifdef CONFIG_SSL_SKELETON_MODE
+static const cipher_info_t cipher_info[NUM_PROTOCOLS] =
+{
+ { /* RC4-SHA */
+ SSL_RC4_128_SHA, /* RC4-SHA */
+ 16, /* key size */
+ 0, /* iv size */
+ 2*(SHA1_SIZE+16), /* key block size */
+ 0, /* no padding */
+ SHA1_SIZE, /* digest size */
+ hmac_sha1, /* hmac algorithm */
+ (crypt_func)RC4_crypt, /* encrypt */
+ (crypt_func)RC4_crypt /* decrypt */
+ },
+};
+#else
+static const cipher_info_t cipher_info[NUM_PROTOCOLS] =
+{
+ { /* AES128-SHA */
+ SSL_AES128_SHA, /* AES128-SHA */
+ 16, /* key size */
+ 16, /* iv size */
+ 2*(SHA1_SIZE+16+16), /* key block size */
+ 16, /* block padding size */
+ SHA1_SIZE, /* digest size */
+ hmac_sha1, /* hmac algorithm */
+ (crypt_func)AES_cbc_encrypt, /* encrypt */
+ (crypt_func)AES_cbc_decrypt /* decrypt */
+ },
+ { /* AES256-SHA */
+ SSL_AES256_SHA, /* AES256-SHA */
+ 32, /* key size */
+ 16, /* iv size */
+ 2*(SHA1_SIZE+32+16), /* key block size */
+ 16, /* block padding size */
+ SHA1_SIZE, /* digest size */
+ hmac_sha1, /* hmac algorithm */
+ (crypt_func)AES_cbc_encrypt, /* encrypt */
+ (crypt_func)AES_cbc_decrypt /* decrypt */
+ },
+ { /* RC4-SHA */
+ SSL_RC4_128_SHA, /* RC4-SHA */
+ 16, /* key size */
+ 0, /* iv size */
+ 2*(SHA1_SIZE+16), /* key block size */
+ 0, /* no padding */
+ SHA1_SIZE, /* digest size */
+ hmac_sha1, /* hmac algorithm */
+ (crypt_func)RC4_crypt, /* encrypt */
+ (crypt_func)RC4_crypt /* decrypt */
+ },
+ /*
+ * This protocol is from SSLv2 days and is unlikely to be used - but was
+ * useful for testing different possible digest algorithms.
+ */
+ { /* RC4-MD5 */
+ SSL_RC4_128_MD5, /* RC4-MD5 */
+ 16, /* key size */
+ 0, /* iv size */
+ 2*(MD5_SIZE+16), /* key block size */
+ 0, /* no padding */
+ MD5_SIZE, /* digest size */
+ hmac_md5, /* hmac algorithm */
+ (crypt_func)RC4_crypt, /* encrypt */
+ (crypt_func)RC4_crypt /* decrypt */
+ },
+};
+#endif
+
+static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len,
+ uint8_t *out, int olen);
+static const cipher_info_t *get_cipher_info(uint8_t cipher);
+static void increment_read_sequence(SSL *ssl);
+static void increment_write_sequence(SSL *ssl);
+static void add_hmac_digest(SSL *ssl, int snd, uint8_t *hmac_header,
+ const uint8_t *buf, int buf_len, uint8_t *hmac_buf);
+
+/* win32 VC6.0 doesn't have variadic macros */
+/* GBG added
+//#if defined(WIN32) && !defined(CONFIG_SSL_FULL_MODE)
+//void DISPLAY_BYTES(SSL *ssl, const char *format,
+// const uint8_t *data, int size, ...) {}
+//#endif */
+void DISPLAY_BYTES(SSL *ssl, const char *format,
+ const uint8_t *data, int size, ...) {
+ (void)ssl;
+ (void)format;
+ (void)data;
+ (void)size;
+}
+/* /GBG */
+
+/**
+ * Establish a new client/server context.
+ */
+EXP_FUNC SSL_CTX *STDCALL ssl_ctx_new(uint32_t options, int num_sessions)
+{
+ SSL_CTX *ssl_ctx = (SSL_CTX *)calloc(1, sizeof (SSL_CTX));
+ ssl_ctx->options = options;
+ RNG_initialize();
+
+#if 0 /* GBG: no automatic cert loading */
+ if (load_key_certs(ssl_ctx) < 0)
+ {
+ free(ssl_ctx); /* can't load our key/certificate pair, so die */
+ return NULL;
+ }
+#endif
+
+#ifndef CONFIG_SSL_SKELETON_MODE
+ ssl_ctx->num_sessions = num_sessions;
+#endif
+
+ SSL_CTX_MUTEX_INIT(ssl_ctx->mutex);
+
+#ifndef CONFIG_SSL_SKELETON_MODE
+ if (num_sessions)
+ {
+ ssl_ctx->ssl_sessions = (SSL_SESSION **)
+ calloc(1, num_sessions*sizeof(SSL_SESSION *));
+ }
+#endif
+
+ return ssl_ctx;
+}
+
+/*
+ * Remove a client/server context.
+ */
+EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx)
+{
+ SSL *ssl;
+ int i;
+
+ if (ssl_ctx == NULL)
+ return;
+
+ ssl = ssl_ctx->head;
+
+ /* clear out all the ssl entries */
+ while (ssl)
+ {
+ SSL *next = ssl->next;
+ ssl_free(ssl);
+ ssl = next;
+ }
+
+#ifndef CONFIG_SSL_SKELETON_MODE
+ /* clear out all the sessions */
+ for (i = 0; i < ssl_ctx->num_sessions; i++)
+ session_free(ssl_ctx->ssl_sessions, i);
+
+ free(ssl_ctx->ssl_sessions);
+#endif
+
+ /* GBG: changed */
+ {
+ SSL_CERT* cert = ssl_ctx->certs;
+ while (cert) {
+ SSL_CERT* next = cert->next;
+ free(cert->buf);
+ free(cert);
+ cert = next;
+ }
+ }
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ /* GBG: remove - remove_ca_certs(ssl_ctx->ca_cert_ctx); */
+ /* GBG: added */
+ if (ssl_ctx->ca_certs) x509_free(ssl_ctx->ca_certs);
+ /* GBG */
+#endif
+ /* GBG: removed - ssl_ctx->chain_length = 0; */
+ SSL_CTX_MUTEX_DESTROY(ssl_ctx->mutex);
+ RSA_free(ssl_ctx->rsa_ctx);
+ RNG_terminate();
+ free(ssl_ctx);
+}
+
+/*
+ * Free any used resources used by this connection.
+ */
+EXP_FUNC void STDCALL ssl_free(SSL *ssl)
+{
+ SSL_CTX *ssl_ctx;
+
+ if (ssl == NULL) /* just ignore null pointers */
+ return;
+
+ /* only notify if we weren't notified first */
+ /* spec says we must notify when we are dying */
+ if (!IS_SET_SSL_FLAG(SSL_SENT_CLOSE_NOTIFY))
+ send_alert(ssl, SSL_ALERT_CLOSE_NOTIFY);
+
+ ssl_ctx = ssl->ssl_ctx;
+
+ SSL_CTX_LOCK(ssl_ctx->mutex);
+
+ /* adjust the server SSL list */
+ if (ssl->prev)
+ ssl->prev->next = ssl->next;
+ else
+ ssl_ctx->head = ssl->next;
+
+ if (ssl->next)
+ ssl->next->prev = ssl->prev;
+ else
+ ssl_ctx->tail = ssl->prev;
+
+ SSL_CTX_UNLOCK(ssl_ctx->mutex);
+
+ /* may already be free - but be sure */
+ free(ssl->encrypt_ctx);
+ free(ssl->decrypt_ctx);
+ disposable_free(ssl);
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ x509_free(ssl->x509_ctx);
+#endif
+
+ free(ssl);
+}
+
+/*
+ * Read the SSL connection and send any alerts for various errors.
+ */
+EXP_FUNC int STDCALL ssl_read(SSL *ssl, uint8_t **in_data)
+{
+ int ret = basic_read(ssl, in_data);
+
+ /* check for return code so we can send an alert */
+ if (ret < SSL_OK && ret != SSL_CLOSE_NOTIFY)
+ {
+ if (ret != SSL_ERROR_CONN_LOST &&
+ ret != SSL_ERROR_TIMEOUT && /* GBG */
+ ret != SSL_ERROR_EOS /* GBG */ )
+ {
+ send_alert(ssl, ret);
+#ifndef CONFIG_SSL_SKELETON_MODE
+ /* something nasty happened, so get rid of this session */
+ kill_ssl_session(ssl->ssl_ctx->ssl_sessions, ssl);
+#endif
+ }
+ }
+
+ return ret;
+}
+
+/*
+ * Write application data to the client
+ */
+EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len)
+{
+ int n = out_len, nw, i, tot = 0;
+
+ /* maximum size of a TLS packet is around 16kB, so fragment */
+ do
+ {
+ nw = n;
+
+ if (nw > RT_MAX_PLAIN_LENGTH) /* fragment if necessary */
+ nw = RT_MAX_PLAIN_LENGTH;
+
+ if ((i = send_packet(ssl, PT_APP_PROTOCOL_DATA,
+ &out_data[tot], nw)) <= 0)
+ {
+ out_len = i; /* an error */
+ break;
+ }
+
+ tot += i;
+ n -= i;
+ } while (n > 0);
+
+ return out_len;
+}
+
+/**
+ * Add a certificate to the certificate chain.
+ */
+int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len)
+{
+ int ret = SSL_ERROR_NO_CERT_DEFINED;
+ SSL_CERT *ssl_cert;
+ SSL_CERT *ssl_cert_tail;
+ X509_CTX *cert = NULL;
+ int offset;
+ if ((ret = x509_new(buf, &offset, &cert)))
+ goto error;
+
+#if defined (CONFIG_SSL_FULL_MODE)
+ if (ssl_ctx->options & SSL_DISPLAY_CERTS)
+ x509_print(cert, NULL);
+#endif
+
+ /* GBG: modified */
+ ssl_cert = (SSL_CERT*)malloc(sizeof(SSL_CERT));
+ if (ssl_cert == NULL) {
+ ret = SSL_NOT_OK;
+ goto error;
+ }
+ ssl_cert_tail = ssl_ctx->certs;
+ while (ssl_cert_tail && ssl_cert_tail->next) {
+ ssl_cert_tail = ssl_cert_tail->next;
+ }
+ if (ssl_cert_tail == NULL) {
+ ssl_ctx->certs = ssl_cert;
+ } else {
+ ssl_cert_tail->next = ssl_cert;
+ }
+ ssl_cert->next = NULL;
+ ssl_cert->size = len;
+ ssl_cert->buf = (uint8_t *)malloc(len);
+ memcpy(ssl_cert->buf, buf, len);
+ /* GBG: removed - ssl_ctx->chain_length++; */
+ len -= offset;
+ ret = SSL_OK; /* ok so far */
+
+ /* recurse? */
+ if (len > 0)
+ {
+ ret = add_cert(ssl_ctx, &buf[offset], len);
+ }
+
+error:
+ if (cert) x509_free(cert); /* don't need anymore */
+ return ret;
+}
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+#if 0 /* GBG: removed */
+/**
+ * Add a certificate authority.
+ */
+int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *buf, int len)
+{
+ int ret = SSL_OK; /* ignore errors for now */
+ int i = 0;
+ CA_CERT_CTX *ca_cert_ctx;
+
+ if (ssl_ctx->ca_cert_ctx == NULL)
+ ssl_ctx->ca_cert_ctx = (CA_CERT_CTX *)calloc(1, sizeof(CA_CERT_CTX));
+
+ ca_cert_ctx = ssl_ctx->ca_cert_ctx;
+
+ while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i])
+ i++;
+
+ while (len > 0)
+ {
+ int offset;
+ if (i >= CONFIG_X509_MAX_CA_CERTS)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("Error: maximum number of CA certs added (%d) - change of "
+ "compile-time configuration required\n",
+ CONFIG_X509_MAX_CA_CERTS);
+#endif
+ break;
+ }
+
+
+ /* ignore the return code */
+ if (x509_new(buf, &offset, &ca_cert_ctx->cert[i]) == X509_OK)
+ {
+#if defined (CONFIG_SSL_FULL_MODE)
+ if (ssl_ctx->options & SSL_DISPLAY_CERTS)
+ x509_print(ca_cert_ctx->cert[i], NULL);
+#endif
+ }
+
+ i++;
+ len -= offset;
+ }
+
+ return ret;
+}
+#else /* GBG */
+/* GBG: added */
+int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *cert_data, int cert_data_size)
+{
+ X509_CTX* ca_cert = NULL;
+ int x509_size = cert_data_size;
+ int result;
+
+ result = x509_new(cert_data, &x509_size, &ca_cert);
+ if (result != SSL_OK) return SSL_X509_ERROR(result);
+ ca_cert->next = ssl_ctx->ca_certs;
+ ssl_ctx->ca_certs = ca_cert;
+
+ return SSL_OK;
+}
+#endif /* GBG */
+
+/* GBG added */
+EXP_FUNC const X509_CTX* ssl_get_peer_cert(const SSL* ssl, unsigned int position)
+{
+ X509_CTX* cert = ssl->x509_ctx;
+
+ /* look for the cert at the requested position */
+ while (position && cert) {
+ cert = cert->next;
+ --position;
+ }
+ if (position) return NULL;
+
+ /* past the last cert, check for a cert in the list of trust anchors */
+ if (cert == NULL && ssl->x509_ctx && ssl->ssl_ctx) {
+ X509_CTX* ca_cert = ssl->ssl_ctx->ca_certs;
+ cert = ssl->x509_ctx;
+ while (cert->next) cert = cert->next;
+ while (ca_cert) {
+ if (asn1_compare_dn(cert->ca_cert_dn, ca_cert->cert_dn) == 0) {
+ return ca_cert;
+ }
+ ca_cert = ca_cert->next;
+ }
+ }
+
+ return cert;
+}
+
+/*
+ * Retrieve an X.509 distinguished name component
+ */
+EXP_FUNC const char * STDCALL ssl_cert_get_dn(const X509_CTX* cert, int component)
+{
+ if (cert == NULL) return NULL;
+ switch (component)
+ {
+ case SSL_X509_CERT_COMMON_NAME:
+ return cert->cert_dn[X509_COMMON_NAME];
+
+ case SSL_X509_CERT_ORGANIZATION:
+ return cert->cert_dn[X509_ORGANIZATION];
+
+ case SSL_X509_CERT_ORGANIZATIONAL_NAME:
+ return cert->cert_dn[X509_ORGANIZATIONAL_UNIT];
+
+ case SSL_X509_CA_CERT_COMMON_NAME:
+ return cert->ca_cert_dn[X509_COMMON_NAME];
+
+ case SSL_X509_CA_CERT_ORGANIZATION:
+ return cert->ca_cert_dn[X509_ORGANIZATION];
+
+ case SSL_X509_CA_CERT_ORGANIZATIONAL_NAME:
+ return cert->ca_cert_dn[X509_ORGANIZATIONAL_UNIT];
+
+ default:
+ return NULL;
+ }
+}
+
+/*
+ * Retrieve a "Subject Alternative Name" from a v3 certificate
+ */
+EXP_FUNC const char * STDCALL ssl_cert_get_subject_alt_dnsname(const X509_CTX* cert,
+ int dnsindex)
+{
+ int i;
+
+ if (cert == NULL || cert->subject_alt_dnsnames == NULL)
+ return NULL;
+
+ for (i = 0; i < dnsindex; ++i)
+ {
+ if (cert->subject_alt_dnsnames[i] == NULL)
+ return NULL;
+ }
+
+ return cert->subject_alt_dnsnames[dnsindex];
+}
+
+/* GBG added */
+EXP_FUNC void ssl_cert_get_fingerprints(const X509_CTX* cert, unsigned char* md5, unsigned char* sha1)
+{
+ if (cert == NULL) {
+ memset(md5, 0, MD5_SIZE);
+ memset(sha1, 0, SHA1_SIZE);
+ return;
+ }
+ memcpy(md5, cert->fingerprint.md5, MD5_SIZE);
+ memcpy(sha1, cert->fingerprint.sha1, SHA1_SIZE);
+}
+
+EXP_FUNC void ssl_cert_get_validity_dates(const X509_CTX* cert, SSL_DateTime* not_before, SSL_DateTime* not_after)
+{
+ if (cert == NULL) {
+ memset(not_before, 0, sizeof(SSL_DateTime));
+ memset(not_after, 0, sizeof(SSL_DateTime));
+ return;
+ }
+ *not_before = cert->not_before;
+ *not_after = cert->not_after;
+}
+/* /GBG added */
+
+#endif /* CONFIG_SSL_CERT_VERIFICATION */
+
+/*
+ * Find an ssl object based on the client's file descriptor.
+ */
+EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, SSL_SOCKET* client_fd)
+{
+ SSL *ssl;
+
+ SSL_CTX_LOCK(ssl_ctx->mutex);
+ ssl = ssl_ctx->head;
+
+ /* search through all the ssl entries */
+ while (ssl)
+ {
+ if (ssl->client_fd == client_fd)
+ {
+ SSL_CTX_UNLOCK(ssl_ctx->mutex);
+ return ssl;
+ }
+
+ ssl = ssl->next;
+ }
+
+ SSL_CTX_UNLOCK(ssl_ctx->mutex);
+ return NULL;
+}
+
+/*
+ * Force the client to perform its handshake again.
+ */
+EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl)
+{
+ int ret = SSL_OK;
+
+ disposable_new(ssl);
+#ifdef CONFIG_SSL_ENABLE_CLIENT
+ if (IS_SET_SSL_FLAG(SSL_IS_CLIENT))
+ {
+ ret = do_client_connect(ssl);
+ }
+ else
+#endif
+ {
+ send_packet(ssl, PT_HANDSHAKE_PROTOCOL,
+ g_hello_request, sizeof(g_hello_request));
+ SET_SSL_FLAG(SSL_NEED_RECORD);
+ }
+
+ return ret;
+}
+
+/**
+ * @brief Get what we need for key info.
+ * @param cipher [in] The cipher information we are after
+ * @param key_size [out] The key size for the cipher
+ * @param iv_size [out] The iv size for the cipher
+ * @return The amount of key information we need.
+ */
+static const cipher_info_t *get_cipher_info(uint8_t cipher)
+{
+ int i;
+
+ for (i = 0; i < NUM_PROTOCOLS; i++)
+ {
+ if (cipher_info[i].cipher == cipher)
+ {
+ return &cipher_info[i];
+ }
+ }
+
+ return NULL; /* error */
+}
+
+/*
+ * Get a new ssl context for a new connection.
+ */
+SSL *ssl_new(SSL_CTX *ssl_ctx, void* client_fd)
+{
+ SSL *ssl = (SSL *)calloc(1, sizeof(SSL));
+ ssl->ssl_ctx = ssl_ctx;
+ ssl->need_bytes = SSL_RECORD_SIZE; /* need a record */
+ ssl->client_fd = client_fd;
+ ssl->flag = SSL_NEED_RECORD;
+ ssl->bm_data = ssl->bm_all_data+BM_RECORD_OFFSET; /* space at the start */
+ ssl->hs_status = SSL_NOT_OK; /* not connected */
+#ifdef CONFIG_ENABLE_VERIFICATION
+ ssl->ca_cert_ctx = ssl_ctx->ca_cert_ctx;
+#endif
+ disposable_new(ssl);
+
+ /* a bit hacky but saves a few bytes of memory */
+ ssl->flag |= ssl_ctx->options;
+ SSL_CTX_LOCK(ssl_ctx->mutex);
+
+ if (ssl_ctx->head == NULL)
+ {
+ ssl_ctx->head = ssl;
+ ssl_ctx->tail = ssl;
+ }
+ else
+ {
+ ssl->prev = ssl_ctx->tail;
+ ssl_ctx->tail->next = ssl;
+ ssl_ctx->tail = ssl;
+ }
+
+ SSL_CTX_UNLOCK(ssl_ctx->mutex);
+ return ssl;
+}
+
+/*
+ * Add a private key to a context.
+ */
+int add_private_key(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj)
+{
+ int ret = SSL_OK;
+
+ /* get the private key details */
+ if (asn1_get_private_key(ssl_obj->buf, ssl_obj->len, &ssl_ctx->rsa_ctx))
+ {
+ ret = SSL_ERROR_INVALID_KEY;
+ goto error;
+ }
+
+error:
+ return ret;
+}
+
+/**
+ * Increment the read sequence number (as a 64 bit endian indepenent #)
+ */
+static void increment_read_sequence(SSL *ssl)
+{
+ int i;
+
+ for (i = 7; i >= 0; i--)
+ {
+ if (++ssl->read_sequence[i])
+ break;
+ }
+}
+
+/**
+ * Increment the read sequence number (as a 64 bit endian indepenent #)
+ */
+static void increment_write_sequence(SSL *ssl)
+{
+ int i;
+
+ for (i = 7; i >= 0; i--)
+ {
+ if (++ssl->write_sequence[i])
+ break;
+ }
+}
+
+/**
+ * Work out the HMAC digest in a packet.
+ */
+static void add_hmac_digest(SSL *ssl, int mode, uint8_t *hmac_header,
+ const uint8_t *buf, int buf_len, uint8_t *hmac_buf)
+{
+ int hmac_len = buf_len + 8 + SSL_RECORD_SIZE;
+ uint8_t *t_buf = (uint8_t *)alloca(hmac_len+10);
+
+ memcpy(t_buf, (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE) ?
+ ssl->write_sequence : ssl->read_sequence, 8);
+ memcpy(&t_buf[8], hmac_header, SSL_RECORD_SIZE);
+ memcpy(&t_buf[8+SSL_RECORD_SIZE], buf, buf_len);
+
+ ssl->cipher_info->hmac(t_buf, hmac_len,
+ (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ) ?
+ ssl->server_mac : ssl->client_mac,
+ ssl->cipher_info->digest_size, hmac_buf);
+
+#if 0
+ print_blob("record", hmac_header, SSL_RECORD_SIZE);
+ print_blob("buf", buf, buf_len);
+ if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE)
+ {
+ print_blob("write seq", ssl->write_sequence, 8);
+ }
+ else
+ {
+ print_blob("read seq", ssl->read_sequence, 8);
+ }
+
+ if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ)
+ {
+ print_blob("server mac",
+ ssl->server_mac, ssl->cipher_info->digest_size);
+ }
+ else
+ {
+ print_blob("client mac",
+ ssl->client_mac, ssl->cipher_info->digest_size);
+ }
+ print_blob("hmac", hmac_buf, SHA1_SIZE);
+#endif
+}
+
+/**
+ * Verify that the digest of a packet is correct.
+ */
+static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len)
+{
+ uint8_t hmac_buf[SHA1_SIZE];
+ int hmac_offset;
+
+ if (ssl->cipher_info->padding_size)
+ {
+ int last_blk_size = buf[read_len-1], i;
+ hmac_offset = read_len-last_blk_size-ssl->cipher_info->digest_size-1;
+
+ /* guard against a timing attack - make sure we do the digest */
+ if (hmac_offset < 0)
+ {
+ hmac_offset = 0;
+ }
+ else
+ {
+ /* already looked at last byte */
+ for (i = 1; i < last_blk_size; i++)
+ {
+ if (buf[read_len-i] != last_blk_size)
+ {
+ hmac_offset = 0;
+ break;
+ }
+ }
+ }
+ }
+ else /* stream cipher */
+ {
+ hmac_offset = read_len - ssl->cipher_info->digest_size;
+
+ if (hmac_offset < 0)
+ {
+ hmac_offset = 0;
+ }
+ }
+
+ /* sanity check the offset */
+ ssl->hmac_header[3] = hmac_offset >> 8; /* insert size */
+ ssl->hmac_header[4] = hmac_offset & 0xff;
+ add_hmac_digest(ssl, mode, ssl->hmac_header, buf, hmac_offset, hmac_buf);
+
+ if (memcmp(hmac_buf, &buf[hmac_offset], ssl->cipher_info->digest_size))
+ {
+ return SSL_ERROR_INVALID_HMAC;
+ }
+
+ return hmac_offset;
+}
+
+/**
+ * Add a packet to the end of our sent and received packets, so that we may use
+ * it to calculate the hash at the end.
+ */
+void add_packet(SSL *ssl, const uint8_t *pkt, int len)
+{
+ MD5_Update(&ssl->dc->md5_ctx, pkt, len);
+ SHA1_Update(&ssl->dc->sha1_ctx, pkt, len);
+}
+
+/**
+ * Work out the MD5 PRF.
+ */
+static void p_hash_md5(const uint8_t *sec, int sec_len,
+ uint8_t *seed, int seed_len, uint8_t *out, int olen)
+{
+ uint8_t a1[128];
+
+ /* A(1) */
+ hmac_md5(seed, seed_len, sec, sec_len, a1);
+ memcpy(&a1[MD5_SIZE], seed, seed_len);
+ hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out);
+
+ while (olen > MD5_SIZE)
+ {
+ uint8_t a2[MD5_SIZE];
+ out += MD5_SIZE;
+ olen -= MD5_SIZE;
+
+ /* A(N) */
+ hmac_md5(a1, MD5_SIZE, sec, sec_len, a2);
+ memcpy(a1, a2, MD5_SIZE);
+
+ /* work out the actual hash */
+ hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out);
+ }
+}
+
+/**
+ * Work out the SHA1 PRF.
+ */
+static void p_hash_sha1(const uint8_t *sec, int sec_len,
+ uint8_t *seed, int seed_len, uint8_t *out, int olen)
+{
+ uint8_t a1[128];
+
+ /* A(1) */
+ hmac_sha1(seed, seed_len, sec, sec_len, a1);
+ memcpy(&a1[SHA1_SIZE], seed, seed_len);
+ hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out);
+
+ while (olen > SHA1_SIZE)
+ {
+ uint8_t a2[SHA1_SIZE];
+ out += SHA1_SIZE;
+ olen -= SHA1_SIZE;
+
+ /* A(N) */
+ hmac_sha1(a1, SHA1_SIZE, sec, sec_len, a2);
+ memcpy(a1, a2, SHA1_SIZE);
+
+ /* work out the actual hash */
+ hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out);
+ }
+}
+
+/**
+ * Work out the PRF.
+ */
+static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len,
+ uint8_t *out, int olen)
+{
+ int len, i;
+ const uint8_t *S1, *S2;
+ uint8_t xbuf[256]; /* needs to be > the amount of key data */
+ uint8_t ybuf[256]; /* needs to be > the amount of key data */
+
+ len = sec_len/2;
+ S1 = sec;
+ S2 = &sec[len];
+ len += (sec_len & 1); /* add for odd, make longer */
+
+ p_hash_md5(S1, len, seed, seed_len, xbuf, olen);
+ p_hash_sha1(S2, len, seed, seed_len, ybuf, olen);
+
+ for (i = 0; i < olen; i++)
+ out[i] = xbuf[i] ^ ybuf[i];
+}
+
+/**
+ * Generate a master secret based on the client/server random data and the
+ * premaster secret.
+ */
+void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret)
+{
+ uint8_t buf[128]; /* needs to be > 13+32+32 in size */
+ memcpy(buf, "master secret", 13);
+ memcpy(&buf[13], ssl->dc->client_random, SSL_RANDOM_SIZE);
+ memcpy(&buf[45], ssl->dc->server_random, SSL_RANDOM_SIZE);
+ prf(premaster_secret, SSL_SECRET_SIZE, buf, 77, ssl->dc->master_secret,
+ SSL_SECRET_SIZE);
+}
+
+/**
+ * Generate a 'random' blob of data used for the generation of keys.
+ */
+static void generate_key_block(uint8_t *client_random, uint8_t *server_random,
+ uint8_t *master_secret, uint8_t *key_block, int key_block_size)
+{
+ uint8_t buf[128];
+ memcpy(buf, "key expansion", 13);
+ memcpy(&buf[13], server_random, SSL_RANDOM_SIZE);
+ memcpy(&buf[45], client_random, SSL_RANDOM_SIZE);
+ prf(master_secret, SSL_SECRET_SIZE, buf, 77, key_block, key_block_size);
+}
+
+/**
+ * Calculate the digest used in the finished message. This function also
+ * doubles up as a certificate verify function.
+ */
+void finished_digest(SSL *ssl, const char *label, uint8_t *digest)
+{
+ uint8_t mac_buf[128];
+ uint8_t *q = mac_buf;
+ MD5_CTX md5_ctx = ssl->dc->md5_ctx;
+ SHA1_CTX sha1_ctx = ssl->dc->sha1_ctx;
+
+ if (label)
+ {
+ memcpy(q, label, (int)strlen(label));
+ q += strlen(label);
+ }
+
+ MD5_Final(q, &md5_ctx);
+ q += MD5_SIZE;
+
+ SHA1_Final(q, &sha1_ctx);
+ q += SHA1_SIZE;
+
+ if (label)
+ {
+ prf(ssl->dc->master_secret, SSL_SECRET_SIZE, mac_buf, (int)(q-mac_buf),
+ digest, SSL_FINISHED_HASH_SIZE);
+ }
+ else /* for use in a certificate verify */
+ {
+ memcpy(digest, mac_buf, MD5_SIZE + SHA1_SIZE);
+ }
+
+#if 0
+ printf("label: %s\n", label);
+ print_blob("master secret", ssl->dc->master_secret, 48);
+ print_blob("mac_buf", mac_buf, q-mac_buf);
+ print_blob("finished digest", digest, SSL_FINISHED_HASH_SIZE);
+#endif
+}
+
+/**
+ * Retrieve (and initialise) the context of a cipher.
+ */
+static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt)
+{
+ switch (ssl->cipher)
+ {
+#ifndef CONFIG_SSL_SKELETON_MODE
+ case SSL_AES128_SHA:
+ {
+ AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX));
+ AES_set_key(aes_ctx, key, iv, AES_MODE_128);
+
+ if (is_decrypt)
+ {
+ AES_convert_key(aes_ctx);
+ }
+
+ return (void *)aes_ctx;
+ }
+
+ case SSL_AES256_SHA:
+ {
+ AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX));
+ AES_set_key(aes_ctx, key, iv, AES_MODE_256);
+
+ if (is_decrypt)
+ {
+ AES_convert_key(aes_ctx);
+ }
+
+ return (void *)aes_ctx;
+ }
+
+ case SSL_RC4_128_MD5:
+#endif
+ case SSL_RC4_128_SHA:
+ {
+ RC4_CTX *rc4_ctx = (RC4_CTX *)malloc(sizeof(RC4_CTX));
+ RC4_setup(rc4_ctx, key, 16);
+ return (void *)rc4_ctx;
+ }
+ }
+
+ return NULL; /* its all gone wrong */
+}
+
+/**
+ * Send a packet over the socket.
+ */
+static int send_raw_packet(SSL *ssl, uint8_t protocol)
+{
+ uint8_t *rec_buf = ssl->bm_all_data;
+ int pkt_size = SSL_RECORD_SIZE+ssl->bm_index;
+ int sent = 0;
+ int ret = SSL_OK;
+
+ rec_buf[0] = protocol;
+ rec_buf[1] = 0x03; /* version = 3.1 or higher */
+ rec_buf[2] = ssl->version & 0x0f;
+ rec_buf[3] = ssl->bm_index >> 8;
+ rec_buf[4] = ssl->bm_index & 0xff;
+
+ DISPLAY_BYTES(ssl, "sending %d bytes", ssl->bm_all_data,
+ pkt_size, pkt_size);
+
+ while (sent < pkt_size)
+ {
+ ret = SOCKET_WRITE(ssl->client_fd,
+ &ssl->bm_all_data[sent], pkt_size-sent);
+
+ if (ret >= 0)
+ sent += ret;
+ else
+ {
+ /*ret = SSL_ERROR_CONN_LOST*/;
+ break;
+ }
+
+ }
+
+ SET_SSL_FLAG(SSL_NEED_RECORD); /* reset for next time */
+ ssl->bm_index = 0;
+
+ if (protocol != PT_APP_PROTOCOL_DATA)
+ {
+ /* always return SSL_OK during handshake */
+ ret = SSL_OK;
+ }
+
+ return ret;
+}
+
+/**
+ * Send an encrypted packet with padding bytes if necessary.
+ */
+int send_packet(SSL *ssl, uint8_t protocol, const uint8_t *in, int length)
+{
+ int ret, msg_length = 0;
+
+ /* if our state is bad, don't bother */
+ if (ssl->hs_status == SSL_ERROR_DEAD)
+ return SSL_ERROR_CONN_LOST;
+
+ if (in) /* has the buffer already been initialised? */
+ {
+ memcpy(ssl->bm_data, in, length);
+ }
+
+ msg_length += length;
+
+ if (IS_SET_SSL_FLAG(SSL_TX_ENCRYPTED))
+ {
+ int mode = IS_SET_SSL_FLAG(SSL_IS_CLIENT) ?
+ SSL_CLIENT_WRITE : SSL_SERVER_WRITE;
+ uint8_t hmac_header[SSL_RECORD_SIZE]; /* GBG: modified intializer */
+ hmac_header[0] = protocol;
+ hmac_header[1] = 0x03; /* version = 3.1 or higher */
+ hmac_header[2] = ssl->version & 0x0f;
+ hmac_header[3] = msg_length >> 8;
+ hmac_header[4] = msg_length & 0xff;
+
+ if (protocol == PT_HANDSHAKE_PROTOCOL)
+ {
+ DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0);
+
+ if (ssl->bm_data[0] != HS_HELLO_REQUEST)
+ {
+ add_packet(ssl, ssl->bm_data, msg_length);
+ }
+ }
+
+ /* add the packet digest */
+ add_hmac_digest(ssl, mode, hmac_header, ssl->bm_data, msg_length,
+ &ssl->bm_data[msg_length]);
+ msg_length += ssl->cipher_info->digest_size;
+
+ /* add padding? */
+ if (ssl->cipher_info->padding_size)
+ {
+ int last_blk_size = msg_length%ssl->cipher_info->padding_size;
+ int pad_bytes = ssl->cipher_info->padding_size - last_blk_size;
+
+ /* ensure we always have at least 1 padding byte */
+ if (pad_bytes == 0)
+ pad_bytes += ssl->cipher_info->padding_size;
+
+ memset(&ssl->bm_data[msg_length], pad_bytes-1, pad_bytes);
+ msg_length += pad_bytes;
+ }
+
+ DISPLAY_BYTES(ssl, "unencrypted write", ssl->bm_data, msg_length);
+ increment_write_sequence(ssl);
+
+ /* add the explicit IV for TLS1.1 */
+ if (ssl->version >= SSL_PROTOCOL_VERSION1_1 &&
+ ssl->cipher_info->iv_size)
+ {
+ uint8_t iv_size = ssl->cipher_info->iv_size;
+ uint8_t *t_buf = alloca(msg_length + iv_size);
+ memcpy(t_buf + iv_size, ssl->bm_data, msg_length);
+ get_random(iv_size, t_buf);
+ msg_length += iv_size;
+ memcpy(ssl->bm_data, t_buf, msg_length);
+ }
+
+ /* now encrypt the packet */
+ ssl->cipher_info->encrypt(ssl->encrypt_ctx, ssl->bm_data,
+ ssl->bm_data, msg_length);
+ }
+ else if (protocol == PT_HANDSHAKE_PROTOCOL)
+ {
+ DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0);
+
+ if (ssl->bm_data[0] != HS_HELLO_REQUEST)
+ {
+ add_packet(ssl, ssl->bm_data, length);
+ }
+ }
+
+ ssl->bm_index = msg_length;
+ if ((ret = send_raw_packet(ssl, protocol)) <= 0)
+ return ret;
+
+ return length; /* just return what we wanted to send */
+}
+
+/**
+ * Work out the cipher keys we are going to use for this session based on the
+ * master secret.
+ */
+static int set_key_block(SSL *ssl, int is_write)
+{
+ const cipher_info_t *ciph_info = get_cipher_info(ssl->cipher);
+ uint8_t *q;
+ uint8_t client_key[32], server_key[32]; /* big enough for AES256 */
+ uint8_t client_iv[16], server_iv[16]; /* big enough for AES128/256 */
+ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
+
+ if (ciph_info == NULL)
+ return -1;
+
+ /* only do once in a handshake */
+ if (ssl->dc->key_block == NULL)
+ {
+ ssl->dc->key_block = (uint8_t *)malloc(ciph_info->key_block_size);
+
+#if 0
+ print_blob("client", ssl->dc->client_random, 32);
+ print_blob("server", ssl->dc->server_random, 32);
+ print_blob("master", ssl->dc->master_secret, SSL_SECRET_SIZE);
+#endif
+ generate_key_block(ssl->dc->client_random, ssl->dc->server_random,
+ ssl->dc->master_secret, ssl->dc->key_block,
+ ciph_info->key_block_size);
+#if 0
+ print_blob("keyblock", ssl->dc->key_block, ciph_info->key_block_size);
+#endif
+ }
+
+ q = ssl->dc->key_block;
+
+ if ((is_client && is_write) || (!is_client && !is_write))
+ {
+ memcpy(ssl->client_mac, q, ciph_info->digest_size);
+ }
+
+ q += ciph_info->digest_size;
+
+ if ((!is_client && is_write) || (is_client && !is_write))
+ {
+ memcpy(ssl->server_mac, q, ciph_info->digest_size);
+ }
+
+ q += ciph_info->digest_size;
+ memcpy(client_key, q, ciph_info->key_size);
+ q += ciph_info->key_size;
+ memcpy(server_key, q, ciph_info->key_size);
+ q += ciph_info->key_size;
+
+#ifndef CONFIG_SSL_SKELETON_MODE
+ if (ciph_info->iv_size) /* RC4 has no IV, AES does */
+ {
+ memcpy(client_iv, q, ciph_info->iv_size);
+ q += ciph_info->iv_size;
+ memcpy(server_iv, q, ciph_info->iv_size);
+ q += ciph_info->iv_size;
+ }
+#endif
+
+ free(is_write ? ssl->encrypt_ctx : ssl->decrypt_ctx);
+
+ /* now initialise the ciphers */
+ if (is_client)
+ {
+ finished_digest(ssl, server_finished, ssl->dc->final_finish_mac);
+
+ if (is_write)
+ ssl->encrypt_ctx = crypt_new(ssl, client_key, client_iv, 0);
+ else
+ ssl->decrypt_ctx = crypt_new(ssl, server_key, server_iv, 1);
+ }
+ else
+ {
+ finished_digest(ssl, client_finished, ssl->dc->final_finish_mac);
+
+ if (is_write)
+ ssl->encrypt_ctx = crypt_new(ssl, server_key, server_iv, 0);
+ else
+ ssl->decrypt_ctx = crypt_new(ssl, client_key, client_iv, 1);
+ }
+
+ ssl->cipher_info = ciph_info;
+ return 0;
+}
+
+/**
+ * Read the SSL connection.
+ */
+int basic_read(SSL *ssl, uint8_t **in_data)
+{
+ int ret = SSL_OK;
+ int read_len, is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
+ uint8_t *buf = ssl->bm_data;
+
+ read_len = SOCKET_READ(ssl->client_fd, &buf[ssl->bm_read_index],
+ ssl->need_bytes-ssl->got_bytes);
+
+ /* connection has gone, so die */
+ if (read_len <= 0)
+ {
+ ret = read_len;
+ ssl->hs_status = SSL_ERROR_DEAD; /* make sure it stays dead */
+ goto error;
+ }
+
+ DISPLAY_BYTES(ssl, "received %d bytes",
+ &ssl->bm_data[ssl->bm_read_index], read_len, read_len);
+
+ ssl->got_bytes += read_len;
+ ssl->bm_read_index += read_len;
+
+ /* haven't quite got what we want, so try again later */
+ if (ssl->got_bytes < ssl->need_bytes)
+ return SSL_OK;
+
+ read_len = ssl->got_bytes;
+ ssl->got_bytes = 0;
+
+ if (IS_SET_SSL_FLAG(SSL_NEED_RECORD))
+ {
+ /* check for sslv2 "client hello" */
+ if (buf[0] & 0x80 && buf[2] == 1)
+ {
+#ifdef CONFIG_SSL_ENABLE_V23_HANDSHAKE
+ uint8_t version = (buf[3] << 4) + buf[4];
+ DISPLAY_BYTES(ssl, "ssl2 record", buf, 5);
+
+ /* should be v3.1 (TLSv1) or better */
+ ssl->version = ssl->client_version = version;
+
+ if (version > SSL_PROTOCOL_VERSION_MAX)
+ {
+ /* use client's version */
+ ssl->version = SSL_PROTOCOL_VERSION_MAX;
+ }
+ else if (version < SSL_PROTOCOL_MIN_VERSION)
+ {
+ ret = SSL_ERROR_INVALID_VERSION;
+ ssl_display_error(ret);
+ return ret;
+ }
+
+ add_packet(ssl, &buf[2], 3);
+ ret = process_sslv23_client_hello(ssl);
+#else
+ printf("Error: no SSLv23 handshaking allowed\n"); TTY_FLUSH();
+ ret = SSL_ERROR_NOT_SUPPORTED;
+#endif
+ goto error; /* not an error - just get out of here */
+ }
+
+ /* GBG: check the header values */
+ if ((buf[0] != PT_HANDSHAKE_PROTOCOL &&
+ buf[0] != PT_CHANGE_CIPHER_SPEC &&
+ buf[0] != PT_APP_PROTOCOL_DATA &&
+ buf[0] != PT_ALERT_PROTOCOL) ||
+ (buf[1] != 3 /* version major */)) {
+ ret = SSL_ERROR_INVALID_PROT_MSG;
+ goto error;
+ }
+
+ ssl->need_bytes = (buf[3] << 8) + buf[4];
+
+ /* do we violate the spec with the message size? */
+ if (ssl->need_bytes > RT_MAX_PLAIN_LENGTH+RT_EXTRA-BM_RECORD_OFFSET)
+ {
+ ret = SSL_ERROR_INVALID_PROT_MSG;
+ goto error;
+ }
+
+ CLR_SSL_FLAG(SSL_NEED_RECORD);
+ memcpy(ssl->hmac_header, buf, 3); /* store for hmac */
+ ssl->record_type = buf[0];
+ goto error; /* no error, we're done */
+ }
+
+ /* for next time - just do it now in case of an error */
+ SET_SSL_FLAG(SSL_NEED_RECORD);
+ ssl->need_bytes = SSL_RECORD_SIZE;
+
+ /* decrypt if we need to */
+ if (IS_SET_SSL_FLAG(SSL_RX_ENCRYPTED))
+ {
+ ssl->cipher_info->decrypt(ssl->decrypt_ctx, buf, buf, read_len);
+
+ if (ssl->version >= SSL_PROTOCOL_VERSION1_1 &&
+ ssl->cipher_info->iv_size)
+ {
+ buf += ssl->cipher_info->iv_size;
+ read_len -= ssl->cipher_info->iv_size;
+ }
+
+ read_len = verify_digest(ssl,
+ is_client ? SSL_CLIENT_READ : SSL_SERVER_READ, buf, read_len);
+
+ /* does the hmac work? */
+ if (read_len < 0)
+ {
+ ret = read_len;
+ goto error;
+ }
+
+ DISPLAY_BYTES(ssl, "decrypted", buf, read_len);
+ increment_read_sequence(ssl);
+ }
+
+ /* The main part of the SSL packet */
+ switch (ssl->record_type)
+ {
+ case PT_HANDSHAKE_PROTOCOL:
+ if (ssl->dc != NULL)
+ {
+ ssl->dc->bm_proc_index = 0;
+ ret = do_handshake(ssl, buf, read_len);
+ }
+ else /* no client renegotiation allowed */
+ {
+ ret = SSL_ERROR_NO_CLIENT_RENOG;
+ goto error;
+ }
+ break;
+
+ case PT_CHANGE_CIPHER_SPEC:
+ if (ssl->next_state != HS_FINISHED)
+ {
+ ret = SSL_ERROR_INVALID_HANDSHAKE;
+ goto error;
+ }
+
+ /* all encrypted from now on */
+ SET_SSL_FLAG(SSL_RX_ENCRYPTED);
+ if (set_key_block(ssl, 0) < 0)
+ {
+ ret = SSL_ERROR_INVALID_HANDSHAKE;
+ goto error;
+ }
+
+ memset(ssl->read_sequence, 0, 8);
+ break;
+
+ case PT_APP_PROTOCOL_DATA:
+ if (in_data)
+ {
+ *in_data = buf; /* point to the work buffer */
+ (*in_data)[read_len] = 0; /* null terminate just in case */
+ }
+
+ ret = read_len;
+ break;
+
+ case PT_ALERT_PROTOCOL:
+ /* return the alert # with alert bit set */
+ if(buf[0] == SSL_ALERT_TYPE_WARNING &&
+ buf[1] == SSL_ALERT_CLOSE_NOTIFY)
+ {
+ ret = SSL_CLOSE_NOTIFY;
+ send_alert(ssl, SSL_ALERT_CLOSE_NOTIFY);
+ SET_SSL_FLAG(SSL_SENT_CLOSE_NOTIFY);
+ }
+ else
+ {
+ ret = -buf[1];
+ DISPLAY_ALERT(ssl, buf[1]);
+ }
+
+ break;
+
+ default:
+ ret = SSL_ERROR_INVALID_PROT_MSG;
+ break;
+ }
+
+error:
+ ssl->bm_read_index = 0; /* reset to go again */
+
+ if (ret < SSL_OK && in_data)/* if all wrong, then clear this buffer ptr */
+ *in_data = NULL;
+
+ return ret;
+}
+
+/**
+ * Do some basic checking of data and then perform the appropriate handshaking.
+ */
+static int do_handshake(SSL *ssl, uint8_t *buf, int read_len)
+{
+ int hs_len = (buf[2]<<8) + buf[3];
+ uint8_t handshake_type = buf[0];
+ int ret = SSL_OK;
+ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
+
+ /* some integrity checking on the handshake */
+ PARANOIA_CHECK(read_len-SSL_HS_HDR_SIZE, hs_len);
+
+ if (handshake_type != ssl->next_state)
+ {
+ /* handle a special case on the client */
+ if (!is_client || handshake_type != HS_CERT_REQ ||
+ ssl->next_state != HS_SERVER_HELLO_DONE)
+ {
+ ret = SSL_ERROR_INVALID_HANDSHAKE;
+ goto error;
+ }
+ }
+
+ hs_len += SSL_HS_HDR_SIZE; /* adjust for when adding packets */
+ ssl->bm_index = hs_len; /* store the size and check later */
+ DISPLAY_STATE(ssl, 0, handshake_type, 0);
+
+ if (handshake_type != HS_CERT_VERIFY && handshake_type != HS_HELLO_REQUEST)
+ add_packet(ssl, buf, hs_len);
+
+#if defined(CONFIG_SSL_ENABLE_CLIENT)
+ ret = is_client ?
+ do_clnt_handshake(ssl, handshake_type, buf, hs_len) :
+ do_svr_handshake(ssl, handshake_type, buf, hs_len);
+#else
+ ret = do_svr_handshake(ssl, handshake_type, buf, hs_len);
+#endif
+
+ /* just use recursion to get the rest */
+ if (hs_len < read_len && ret == SSL_OK)
+ ret = do_handshake(ssl, &buf[hs_len], read_len-hs_len);
+
+error:
+ return ret;
+}
+
+/**
+ * Sends the change cipher spec message. We have just read a finished message
+ * from the client.
+ */
+int send_change_cipher_spec(SSL *ssl)
+{
+ int ret = send_packet(ssl, PT_CHANGE_CIPHER_SPEC,
+ g_chg_cipher_spec_pkt, sizeof(g_chg_cipher_spec_pkt));
+ SET_SSL_FLAG(SSL_TX_ENCRYPTED);
+
+ if (ret >= 0 && set_key_block(ssl, 1) < 0)
+ ret = SSL_ERROR_INVALID_HANDSHAKE;
+
+ memset(ssl->write_sequence, 0, 8);
+ return ret;
+}
+
+/**
+ * Send a "finished" message
+ */
+int send_finished(SSL *ssl)
+{
+ uint8_t buf[SSL_FINISHED_HASH_SIZE+4] = {
+ HS_FINISHED, 0, 0, SSL_FINISHED_HASH_SIZE };
+
+ /* now add the finished digest mac (12 bytes) */
+ finished_digest(ssl,
+ IS_SET_SSL_FLAG(SSL_IS_CLIENT) ?
+ client_finished : server_finished, &buf[4]);
+
+#ifndef CONFIG_SSL_SKELETON_MODE
+ /* store in the session cache */
+ if (!IS_SET_SSL_FLAG(SSL_SESSION_RESUME) && ssl->ssl_ctx->num_sessions)
+ {
+ memcpy(ssl->session->master_secret,
+ ssl->dc->master_secret, SSL_SECRET_SIZE);
+ }
+#endif
+
+ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL,
+ buf, SSL_FINISHED_HASH_SIZE+4);
+}
+
+/**
+ * Send an alert message.
+ * Return 1 if the alert was an "error".
+ */
+int send_alert(SSL *ssl, int error_code)
+{
+ int alert_num = 0;
+ int is_warning = 0;
+ uint8_t buf[2];
+
+ /* Don't bother we're already dead */
+ if (ssl->hs_status == SSL_ERROR_DEAD)
+ {
+ return SSL_ERROR_CONN_LOST;
+ }
+
+#ifdef CONFIG_SSL_FULL_MODE
+ if (IS_SET_SSL_FLAG(SSL_DISPLAY_STATES))
+ ssl_display_error(error_code);
+#endif
+
+ switch (error_code)
+ {
+ case SSL_ALERT_CLOSE_NOTIFY:
+ is_warning = 1;
+ alert_num = SSL_ALERT_CLOSE_NOTIFY;
+ break;
+
+ case SSL_ERROR_CONN_LOST: /* don't send alert just yet */
+ is_warning = 1;
+ break;
+
+ case SSL_ERROR_INVALID_HANDSHAKE:
+ case SSL_ERROR_INVALID_PROT_MSG:
+ alert_num = SSL_ALERT_HANDSHAKE_FAILURE;
+ break;
+
+ case SSL_ERROR_INVALID_HMAC:
+ case SSL_ERROR_FINISHED_INVALID:
+ alert_num = SSL_ALERT_BAD_RECORD_MAC;
+ break;
+
+ case SSL_ERROR_INVALID_VERSION:
+ alert_num = SSL_ALERT_INVALID_VERSION;
+ break;
+
+ case SSL_ERROR_INVALID_SESSION:
+ case SSL_ERROR_NO_CIPHER:
+ case SSL_ERROR_INVALID_KEY:
+ alert_num = SSL_ALERT_ILLEGAL_PARAMETER;
+ break;
+
+ case SSL_ERROR_BAD_CERTIFICATE:
+ alert_num = SSL_ALERT_BAD_CERTIFICATE;
+ break;
+
+ case SSL_ERROR_NO_CLIENT_RENOG:
+ alert_num = SSL_ALERT_NO_RENEGOTIATION;
+ break;
+
+ default:
+ /* a catch-all for any badly verified certificates */
+ alert_num = (error_code <= SSL_X509_OFFSET) ?
+ SSL_ALERT_BAD_CERTIFICATE : SSL_ALERT_UNEXPECTED_MESSAGE;
+ break;
+ }
+
+ buf[0] = is_warning ? 1 : 2;
+ buf[1] = alert_num;
+ send_packet(ssl, PT_ALERT_PROTOCOL, buf, sizeof(buf));
+ DISPLAY_ALERT(ssl, alert_num);
+ return is_warning ? 0 : 1;
+}
+
+/**
+ * Process a client finished message.
+ */
+int process_finished(SSL *ssl, uint8_t *buf, int hs_len)
+{
+ int ret = SSL_OK;
+ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
+ int resume = IS_SET_SSL_FLAG(SSL_SESSION_RESUME);
+ (void)hs_len; /* GBG: unused */
+
+ PARANOIA_CHECK(ssl->bm_index, SSL_FINISHED_HASH_SIZE+4);
+
+ /* check that we all work before we continue */
+ if (memcmp(ssl->dc->final_finish_mac, &buf[4], SSL_FINISHED_HASH_SIZE))
+ return SSL_ERROR_FINISHED_INVALID;
+
+ if ((!is_client && !resume) || (is_client && resume))
+ {
+ if ((ret = send_change_cipher_spec(ssl)) == SSL_OK)
+ ret = send_finished(ssl);
+ }
+
+ /* if we ever renegotiate */
+ ssl->next_state = is_client ? HS_HELLO_REQUEST : HS_CLIENT_HELLO;
+ ssl->hs_status = ret; /* set the final handshake status */
+
+error:
+ return ret;
+}
+
+/**
+ * Send a certificate.
+ */
+int send_certificate(SSL *ssl)
+{
+ uint8_t *buf = ssl->bm_data;
+ int offset = 7;
+ int chain_length;
+ SSL_CERT* cert = ssl->ssl_ctx->certs; /* GBG: added */
+
+ buf[0] = HS_CERTIFICATE;
+ buf[1] = 0;
+ buf[4] = 0;
+
+ while (cert)
+ {
+ buf[offset++] = 0;
+ buf[offset++] = cert->size >> 8; /* cert 1 length */
+ buf[offset++] = cert->size & 0xff;
+ memcpy(&buf[offset], cert->buf, cert->size);
+ offset += cert->size;
+ cert = cert->next;
+ }
+
+ chain_length = offset - 7;
+ buf[5] = chain_length >> 8; /* cert chain length */
+ buf[6] = chain_length & 0xff;
+ chain_length += 3;
+ buf[2] = chain_length >> 8; /* handshake length */
+ buf[3] = chain_length & 0xff;
+ ssl->bm_index = offset;
+ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
+}
+
+/**
+ * Create a blob of memory that we'll get rid of once the handshake is
+ * complete.
+ */
+void disposable_new(SSL *ssl)
+{
+ if (ssl->dc == NULL)
+ {
+ ssl->dc = (DISPOSABLE_CTX *)calloc(1, sizeof(DISPOSABLE_CTX));
+ MD5_Init(&ssl->dc->md5_ctx);
+ SHA1_Init(&ssl->dc->sha1_ctx);
+ }
+}
+
+/**
+ * Remove the temporary blob of memory.
+ */
+void disposable_free(SSL *ssl)
+{
+ if (ssl->dc)
+ {
+ free(ssl->dc->key_block);
+ memset(ssl->dc, 0, sizeof(DISPOSABLE_CTX));
+ free(ssl->dc);
+ ssl->dc = NULL;
+ }
+
+}
+
+#ifndef CONFIG_SSL_SKELETON_MODE /* no session resumption in this mode */
+/**
+ * Find if an existing session has the same session id. If so, use the
+ * master secret from this session for session resumption.
+ */
+SSL_SESSION *ssl_session_update(int max_sessions, SSL_SESSION *ssl_sessions[],
+ SSL *ssl, const uint8_t *session_id)
+{
+ time_t tm = time(NULL);
+ time_t oldest_sess_time = tm;
+ SSL_SESSION *oldest_sess = NULL;
+ int i;
+
+ /* no sessions? Then bail */
+ if (max_sessions == 0)
+ return NULL;
+
+ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
+ if (session_id)
+ {
+ for (i = 0; i < max_sessions; i++)
+ {
+ if (ssl_sessions[i])
+ {
+ /* kill off any expired sessions (including those in
+ the future) */
+ if ((tm > ssl_sessions[i]->conn_time + SSL_EXPIRY_TIME) ||
+ (tm < ssl_sessions[i]->conn_time))
+ {
+ session_free(ssl_sessions, i);
+ continue;
+ }
+
+ /* if the session id matches, it must still be less than
+ the expiry time */
+ if (memcmp(ssl_sessions[i]->session_id, session_id,
+ SSL_SESSION_ID_SIZE) == 0)
+ {
+ ssl->session_index = i;
+ memcpy(ssl->dc->master_secret,
+ ssl_sessions[i]->master_secret, SSL_SECRET_SIZE);
+ SET_SSL_FLAG(SSL_SESSION_RESUME);
+ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
+ return ssl_sessions[i]; /* a session was found */
+ }
+ }
+ }
+ }
+
+ /* If we've got here, no matching session was found - so create one */
+ for (i = 0; i < max_sessions; i++)
+ {
+ if (ssl_sessions[i] == NULL)
+ {
+ /* perfect, this will do */
+ ssl_sessions[i] = (SSL_SESSION *)calloc(1, sizeof(SSL_SESSION));
+ ssl_sessions[i]->conn_time = tm;
+ ssl->session_index = i;
+ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
+ return ssl_sessions[i]; /* return the session object */
+ }
+ else if (ssl_sessions[i]->conn_time <= oldest_sess_time)
+ {
+ /* find the oldest session */
+ oldest_sess_time = ssl_sessions[i]->conn_time;
+ oldest_sess = ssl_sessions[i];
+ ssl->session_index = i;
+ }
+ }
+
+ /* ok, we've used up all of our sessions. So blow the oldest session away */
+ oldest_sess->conn_time = tm;
+ memset(oldest_sess->session_id, 0, sizeof(SSL_SESSION_ID_SIZE));
+ memset(oldest_sess->master_secret, 0, sizeof(SSL_SECRET_SIZE));
+ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
+ return oldest_sess;
+}
+
+/**
+ * Free an existing session.
+ */
+static void session_free(SSL_SESSION *ssl_sessions[], int sess_index)
+{
+ if (ssl_sessions[sess_index])
+ {
+ free(ssl_sessions[sess_index]);
+ ssl_sessions[sess_index] = NULL;
+ }
+}
+
+/**
+ * This ssl object doesn't want this session anymore.
+ */
+void kill_ssl_session(SSL_SESSION **ssl_sessions, SSL *ssl)
+{
+ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
+
+ if (ssl->ssl_ctx->num_sessions)
+ {
+ session_free(ssl_sessions, ssl->session_index);
+ ssl->session = NULL;
+ }
+
+ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
+}
+#endif /* CONFIG_SSL_SKELETON_MODE */
+
+/*
+ * Get the session id for a handshake. This will be a 32 byte sequence.
+ */
+EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl)
+{
+ return ssl->session_id;
+}
+
+/*
+ * Get the session id size for a handshake.
+ */
+EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl)
+{
+ return ssl->sess_id_size;
+}
+
+/*
+ * Return the cipher id (in the SSL form).
+ */
+EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl)
+{
+ return ssl->cipher;
+}
+
+/*
+ * Return the status of the handshake.
+ */
+EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl)
+{
+ return ssl->hs_status;
+}
+
+#if 0 /* GBG: removed */
+/*
+ * Retrieve various parameters about the SSL engine.
+ */
+EXP_FUNC int STDCALL ssl_get_config(int offset)
+{
+ switch (offset)
+ {
+ /* return the appropriate build mode */
+ case SSL_BUILD_MODE:
+#if defined(CONFIG_SSL_FULL_MODE)
+ return SSL_BUILD_FULL_MODE;
+#elif defined(CONFIG_SSL_ENABLE_CLIENT)
+ return SSL_BUILD_ENABLE_CLIENT;
+#elif defined(CONFIG_ENABLE_VERIFICATION)
+ return SSL_BUILD_ENABLE_VERIFICATION;
+#elif defined(CONFIG_SSL_SERVER_ONLY )
+ return SSL_BUILD_SERVER_ONLY;
+#else
+ return SSL_BUILD_SKELETON_MODE;
+#endif
+
+#if 0 /* GBG: removed */
+ case SSL_MAX_CERT_CFG_OFFSET:
+ return CONFIG_SSL_MAX_CERTS;
+#endif
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ case SSL_MAX_CA_CERT_CFG_OFFSET:
+ return CONFIG_X509_MAX_CA_CERTS;
+#endif
+#ifdef CONFIG_SSL_HAS_PEM
+ case SSL_HAS_PEM:
+ return 1;
+#endif
+ default:
+ return 0;
+ }
+}
+#endif /* GBG */
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+/**
+ * Authenticate a received certificate.
+ */
+EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl)
+{
+ int ret;
+ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
+ ret = x509_verify(ssl->ssl_ctx->ca_certs /* GBG: modified */, ssl->x509_ctx, NULL);
+ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
+
+ if (ret) /* modify into an SSL error type */
+ {
+ ret = SSL_X509_ERROR(ret);
+ }
+
+ return ret;
+}
+
+/**
+ * Process a certificate message.
+ */
+int process_certificate(SSL *ssl, X509_CTX **x509_ctx)
+{
+ int ret = SSL_OK;
+ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
+ int pkt_size = ssl->bm_index;
+ int cert_size, offset = 5;
+ int total_cert_size = (buf[offset]<<8) + buf[offset+1];
+ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
+ X509_CTX **chain = x509_ctx;
+ offset += 2;
+
+ PARANOIA_CHECK(total_cert_size, offset);
+
+ while (offset < total_cert_size)
+ {
+ offset++; /* skip empty char */
+ cert_size = (buf[offset]<<8) + buf[offset+1];
+ offset += 2;
+
+ if (x509_new(&buf[offset], NULL, chain))
+ {
+ ret = SSL_ERROR_BAD_CERTIFICATE;
+ goto error;
+ }
+
+ chain = &((*chain)->next);
+ offset += cert_size;
+ }
+
+ PARANOIA_CHECK(pkt_size, offset);
+
+ /* GBG: modif: verify for server and client (was: if we are client we can do the verify now or later) */
+ if (!IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER))
+ {
+ ret = ssl_verify_cert(ssl);
+ }
+
+ ssl->next_state = is_client ? HS_SERVER_HELLO_DONE : HS_CLIENT_KEY_XCHG;
+ ssl->dc->bm_proc_index += offset;
+error:
+ return ret;
+}
+
+#endif /* CONFIG_SSL_CERT_VERIFICATION */
+
+/**
+ * Debugging routine to display SSL handshaking stuff.
+ */
+#ifdef CONFIG_SSL_FULL_MODE
+/**
+ * Debugging routine to display SSL states.
+ */
+void DISPLAY_STATE(SSL *ssl, int is_send, uint8_t state, int not_ok)
+{
+ const char *str;
+
+ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES))
+ return;
+
+ printf(not_ok ? "Error - invalid State:\t" : "State:\t");
+ printf(is_send ? "sending " : "receiving ");
+
+ switch (state)
+ {
+ case HS_HELLO_REQUEST:
+ str = "Hello Request (0)";
+ break;
+
+ case HS_CLIENT_HELLO:
+ str = "Client Hello (1)";
+ break;
+
+ case HS_SERVER_HELLO:
+ str = "Server Hello (2)";
+ break;
+
+ case HS_CERTIFICATE:
+ str = "Certificate (11)";
+ break;
+
+ case HS_SERVER_KEY_XCHG:
+ str = "Certificate Request (12)";
+ break;
+
+ case HS_CERT_REQ:
+ str = "Certificate Request (13)";
+ break;
+
+ case HS_SERVER_HELLO_DONE:
+ str = "Server Hello Done (14)";
+ break;
+
+ case HS_CERT_VERIFY:
+ str = "Certificate Verify (15)";
+ break;
+
+ case HS_CLIENT_KEY_XCHG:
+ str = "Client Key Exchange (16)";
+ break;
+
+ case HS_FINISHED:
+ str = "Finished (16)";
+ break;
+
+ default:
+ str = "Error (Unknown)";
+
+ break;
+ }
+
+ printf("%s\n", str);
+ TTY_FLUSH();
+}
+
+/**
+ * Debugging routine to display RSA objects
+ */
+void DISPLAY_RSA(SSL *ssl, const RSA_CTX *rsa_ctx)
+{
+ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_RSA))
+ return;
+
+ RSA_print(rsa_ctx);
+ TTY_FLUSH();
+}
+
+/**
+ * Debugging routine to display SSL handshaking bytes.
+ */
+void DISPLAY_BYTES(SSL *ssl, const char *format,
+ const uint8_t *data, int size, ...)
+{
+ va_list(ap);
+
+ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_BYTES))
+ return;
+
+ va_start(ap, size);
+ print_blob(format, data, size, va_arg(ap, char *));
+ va_end(ap);
+ TTY_FLUSH();
+}
+
+/**
+ * Debugging routine to display SSL handshaking errors.
+ */
+EXP_FUNC void STDCALL ssl_display_error(int error_code)
+{
+ if (error_code == SSL_OK)
+ return;
+
+ printf("Error: ");
+
+ /* X509 error? */
+ if (error_code < SSL_X509_OFFSET)
+ {
+ printf("%s\n", x509_display_error(error_code - SSL_X509_OFFSET));
+ return;
+ }
+
+ /* SSL alert error code */
+ if (error_code > SSL_ERROR_CONN_LOST)
+ {
+ printf("SSL error %d\n", -error_code);
+ return;
+ }
+
+ switch (error_code)
+ {
+ case SSL_ERROR_DEAD:
+ printf("connection dead");
+ break;
+
+ case SSL_ERROR_INVALID_HANDSHAKE:
+ printf("invalid handshake");
+ break;
+
+ case SSL_ERROR_INVALID_PROT_MSG:
+ printf("invalid protocol message");
+ break;
+
+ case SSL_ERROR_INVALID_HMAC:
+ printf("invalid mac");
+ break;
+
+ case SSL_ERROR_INVALID_VERSION:
+ printf("invalid version");
+ break;
+
+ case SSL_ERROR_INVALID_SESSION:
+ printf("invalid session");
+ break;
+
+ case SSL_ERROR_NO_CIPHER:
+ printf("no cipher");
+ break;
+
+ case SSL_ERROR_CONN_LOST:
+ printf("connection lost");
+ break;
+
+ case SSL_ERROR_BAD_CERTIFICATE:
+ printf("bad certificate");
+ break;
+
+ case SSL_ERROR_INVALID_KEY:
+ printf("invalid key");
+ break;
+
+ case SSL_ERROR_FINISHED_INVALID:
+ printf("finished invalid");
+ break;
+
+ case SSL_ERROR_NO_CERT_DEFINED:
+ printf("no certificate defined");
+ break;
+
+ case SSL_ERROR_NO_CLIENT_RENOG:
+ printf("client renegotiation not supported");
+ break;
+
+ case SSL_ERROR_NOT_SUPPORTED:
+ printf("Option not supported");
+ break;
+
+ default:
+ printf("undefined as yet - %d", error_code);
+ break;
+ }
+
+ printf("\n");
+ TTY_FLUSH();
+}
+
+/**
+ * Debugging routine to display alerts.
+ */
+void DISPLAY_ALERT(SSL *ssl, int alert)
+{
+ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES))
+ return;
+
+ printf("Alert: ");
+
+ switch (alert)
+ {
+ case SSL_ALERT_CLOSE_NOTIFY:
+ printf("close notify");
+ break;
+
+ case SSL_ALERT_INVALID_VERSION:
+ printf("invalid version");
+ break;
+
+ case SSL_ALERT_BAD_CERTIFICATE:
+ printf("bad certificate");
+ break;
+
+ case SSL_ALERT_UNEXPECTED_MESSAGE:
+ printf("unexpected message");
+ break;
+
+ case SSL_ALERT_BAD_RECORD_MAC:
+ printf("bad record mac");
+ break;
+
+ case SSL_ALERT_HANDSHAKE_FAILURE:
+ printf("handshake failure");
+ break;
+
+ case SSL_ALERT_ILLEGAL_PARAMETER:
+ printf("illegal parameter");
+ break;
+
+ case SSL_ALERT_DECODE_ERROR:
+ printf("decode error");
+ break;
+
+ case SSL_ALERT_DECRYPT_ERROR:
+ printf("decrypt error");
+ break;
+
+ case SSL_ALERT_NO_RENEGOTIATION:
+ printf("no renegotiation");
+ break;
+
+ default:
+ printf("alert - (unknown %d)", alert);
+ break;
+ }
+
+ printf("\n");
+ TTY_FLUSH();
+}
+
+#endif /* CONFIG_SSL_FULL_MODE */
+
+/**
+ * Return the version of this library.
+ */
+EXP_FUNC const char * STDCALL ssl_version()
+{
+ static const char * axtls_version = AXTLS_VERSION;
+ return axtls_version;
+}
+
+EXP_FUNC void ssl_mem_free(void* mem) /* GBG */
+{
+ if (mem) free(mem);
+}
+
+/**
+ * Enable the various language bindings to work regardless of the
+ * configuration - they just return an error statement and a bad return code.
+ */
+#if !defined(CONFIG_SSL_FULL_MODE)
+EXP_FUNC void STDCALL ssl_display_error(int error_code) { (void)error_code; }
+#endif
+
+#ifdef CONFIG_BINDINGS
+#if !defined(CONFIG_SSL_ENABLE_CLIENT)
+EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const
+ uint8_t *session_id, uint8_t sess_id_size)
+{
+ printf(unsupported_str);
+ return NULL;
+}
+#endif
+
+#if !defined(CONFIG_SSL_CERT_VERIFICATION)
+EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl)
+{
+ printf(unsupported_str);
+ return -1;
+}
+
+
+EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component)
+{
+ printf(unsupported_str);
+ return NULL;
+}
+
+EXP_FUNC const char * STDCALL ssl_get_cert_subject_alt_dnsname(const SSL *ssl, int index)
+{
+ printf(unsupported_str);
+ return NULL;
+}
+
+#endif /* CONFIG_SSL_CERT_VERIFICATION */
+
+#endif /* CONFIG_BINDINGS */
+
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1.h
new file mode 100644
index 0000000..0d5ee80
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1.h
@@ -0,0 +1,300 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file tls1.h
+ *
+ * @brief The definitions for the TLS library.
+ */
+#ifndef HEADER_SSL_LIB_H
+#define HEADER_SSL_LIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "version.h"
+#include "crypto.h"
+#include "crypto_misc.h"
+
+#define SSL_PROTOCOL_MIN_VERSION 0x31 /* TLS v1.0 */
+#define SSL_PROTOCOL_MINOR_VERSION 0x02 /* TLS v1.1 */
+#define SSL_PROTOCOL_VERSION_MAX 0x32 /* TLS v1.1 */
+#define SSL_PROTOCOL_VERSION1_1 0x32 /* TLS v1.1 */
+#define SSL_RANDOM_SIZE 32
+#define SSL_SECRET_SIZE 48
+#define SSL_FINISHED_HASH_SIZE 12
+#define SSL_RECORD_SIZE 5
+#define SSL_SERVER_READ 0
+#define SSL_SERVER_WRITE 1
+#define SSL_CLIENT_READ 2
+#define SSL_CLIENT_WRITE 3
+#define SSL_HS_HDR_SIZE 4
+
+/* the flags we use while establishing a connection */
+#define SSL_NEED_RECORD 0x0001
+#define SSL_TX_ENCRYPTED 0x0002
+#define SSL_RX_ENCRYPTED 0x0004
+#define SSL_SESSION_RESUME 0x0008
+#define SSL_IS_CLIENT 0x0010
+#define SSL_HAS_CERT_REQ 0x0020
+#define SSL_SENT_CLOSE_NOTIFY 0x0040
+
+/* some macros to muck around with flag bits */
+#define SET_SSL_FLAG(A) (ssl->flag |= A)
+#define CLR_SSL_FLAG(A) (ssl->flag &= ~A)
+#define IS_SET_SSL_FLAG(A) (ssl->flag & A)
+
+#define MAX_KEY_BYTE_SIZE 512 /* for a 4096 bit key */
+#define RT_MAX_PLAIN_LENGTH 16384
+#define RT_EXTRA 1024
+#define BM_RECORD_OFFSET 5
+
+#ifdef CONFIG_SSL_SKELETON_MODE
+#define NUM_PROTOCOLS 1
+#else
+#define NUM_PROTOCOLS 4
+#endif
+
+#define PARANOIA_CHECK(A, B) if (A < B) { \
+ ret = SSL_ERROR_INVALID_HANDSHAKE; goto error; }
+
+/* protocol types */
+enum
+{
+ PT_CHANGE_CIPHER_SPEC = 20,
+ PT_ALERT_PROTOCOL,
+ PT_HANDSHAKE_PROTOCOL,
+ PT_APP_PROTOCOL_DATA
+};
+
+/* handshaking types */
+enum
+{
+ HS_HELLO_REQUEST,
+ HS_CLIENT_HELLO,
+ HS_SERVER_HELLO,
+ HS_CERTIFICATE = 11,
+ HS_SERVER_KEY_XCHG,
+ HS_CERT_REQ,
+ HS_SERVER_HELLO_DONE,
+ HS_CERT_VERIFY,
+ HS_CLIENT_KEY_XCHG,
+ HS_FINISHED = 20
+};
+
+typedef struct
+{
+ uint8_t cipher;
+ uint8_t key_size;
+ uint8_t iv_size;
+ uint8_t key_block_size;
+ uint8_t padding_size;
+ uint8_t digest_size;
+ hmac_func hmac;
+ crypt_func encrypt;
+ crypt_func decrypt;
+} cipher_info_t;
+
+struct _SSLObjLoader
+{
+ uint8_t *buf;
+ int len;
+};
+
+typedef struct _SSLObjLoader SSLObjLoader;
+
+typedef struct
+{
+ time_t conn_time;
+ uint8_t session_id[SSL_SESSION_ID_SIZE];
+ uint8_t master_secret[SSL_SECRET_SIZE];
+} SSL_SESSION;
+
+typedef struct _SSL_CERT /* GBG: added */
+{
+ uint8_t *buf;
+ int size;
+ struct _SSL_CERT* next; /* GBG: added */
+} SSL_CERT;
+
+typedef X509_CTX SSL_X509_CERT;
+
+typedef struct
+{
+ MD5_CTX md5_ctx;
+ SHA1_CTX sha1_ctx;
+ uint8_t final_finish_mac[SSL_FINISHED_HASH_SIZE];
+ uint8_t *key_block;
+ uint8_t master_secret[SSL_SECRET_SIZE];
+ uint8_t client_random[SSL_RANDOM_SIZE]; /* client's random sequence */
+ uint8_t server_random[SSL_RANDOM_SIZE]; /* server's random sequence */
+ uint16_t bm_proc_index;
+} DISPOSABLE_CTX;
+
+struct _SSL
+{
+ uint32_t flag;
+ uint16_t need_bytes;
+ uint16_t got_bytes;
+ uint8_t record_type;
+ uint8_t cipher;
+ uint8_t sess_id_size;
+ uint8_t version;
+ uint8_t client_version;
+ int16_t next_state;
+ int16_t hs_status;
+ DISPOSABLE_CTX *dc; /* temporary data which we'll get rid of soon */
+ SSL_SOCKET* client_fd;
+ const cipher_info_t *cipher_info;
+ void *encrypt_ctx;
+ void *decrypt_ctx;
+ uint8_t bm_all_data[RT_MAX_PLAIN_LENGTH+RT_EXTRA];
+ uint8_t *bm_data;
+ uint16_t bm_index;
+ uint16_t bm_read_index;
+ struct _SSL *next; /* doubly linked list */
+ struct _SSL *prev;
+ struct _SSL_CTX *ssl_ctx; /* back reference to a clnt/svr ctx */
+#ifndef CONFIG_SSL_SKELETON_MODE
+ uint16_t session_index;
+ SSL_SESSION *session;
+#endif
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ X509_CTX *x509_ctx;
+#endif
+
+ uint8_t session_id[SSL_SESSION_ID_SIZE];
+ uint8_t client_mac[SHA1_SIZE]; /* for HMAC verification */
+ uint8_t server_mac[SHA1_SIZE]; /* for HMAC verification */
+ uint8_t read_sequence[8]; /* 64 bit sequence number */
+ uint8_t write_sequence[8]; /* 64 bit sequence number */
+ uint8_t hmac_header[SSL_RECORD_SIZE]; /* rx hmac */
+};
+
+typedef struct _SSL SSL;
+
+struct _SSL_CTX
+{
+ uint32_t options;
+ /* GBG: removed - uint8_t chain_length; */
+ RSA_CTX *rsa_ctx;
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ /* GBG: removed CA_CERT_CTX *ca_cert_ctx; */
+ X509_CTX* ca_certs; /* GBG: added */
+#endif
+ SSL *head;
+ SSL *tail;
+ SSL_CERT* certs; /* GBG: modified */
+#ifndef CONFIG_SSL_SKELETON_MODE
+ uint16_t num_sessions;
+ SSL_SESSION **ssl_sessions;
+#endif
+#ifdef CONFIG_SSL_CTX_MUTEXING
+ SSL_CTX_MUTEX_TYPE mutex;
+#endif
+#ifdef CONFIG_OPENSSL_COMPATIBLE
+ void *bonus_attr;
+#endif
+};
+
+typedef struct _SSL_CTX SSL_CTX;
+
+/* backwards compatibility */
+typedef struct _SSL_CTX SSLCTX;
+
+extern const uint8_t ssl_prot_prefs[NUM_PROTOCOLS];
+
+SSL *ssl_new(SSL_CTX *ssl_ctx, void* client_fd);
+void disposable_new(SSL *ssl);
+void disposable_free(SSL *ssl);
+int send_packet(SSL *ssl, uint8_t protocol,
+ const uint8_t *in, int length);
+int do_svr_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len);
+int do_clnt_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len);
+int process_finished(SSL *ssl, uint8_t *buf, int hs_len);
+int process_sslv23_client_hello(SSL *ssl);
+int send_alert(SSL *ssl, int error_code);
+int send_finished(SSL *ssl);
+int send_certificate(SSL *ssl);
+int basic_read(SSL *ssl, uint8_t **in_data);
+int send_change_cipher_spec(SSL *ssl);
+void finished_digest(SSL *ssl, const char *label, uint8_t *digest);
+void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret);
+void add_packet(SSL *ssl, const uint8_t *pkt, int len);
+int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len);
+int add_private_key(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj);
+void ssl_obj_free(SSLObjLoader *ssl_obj);
+int pkcs8_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password);
+int pkcs12_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password);
+int load_key_certs(SSL_CTX *ssl_ctx);
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *buf, int len);
+/* GBG: removed - void remove_ca_certs(CA_CERT_CTX *ca_cert_ctx); */
+#endif
+#ifdef CONFIG_SSL_ENABLE_CLIENT
+int do_client_connect(SSL *ssl);
+#endif
+
+#ifdef CONFIG_SSL_FULL_MODE
+void DISPLAY_STATE(SSL *ssl, int is_send, uint8_t state, int not_ok);
+void DISPLAY_BYTES(SSL *ssl, const char *format,
+ const uint8_t *data, int size, ...);
+void DISPLAY_CERT(SSL *ssl, const X509_CTX *x509_ctx);
+void DISPLAY_RSA(SSL *ssl, const RSA_CTX *rsa_ctx);
+void DISPLAY_ALERT(SSL *ssl, int alert);
+#else
+#define DISPLAY_STATE(A,B,C,D)
+#define DISPLAY_CERT(A,B)
+#define DISPLAY_RSA(A,B)
+#define DISPLAY_ALERT(A, B)
+#ifdef WIN32
+void DISPLAY_BYTES(SSL *ssl, const char *format,/* win32 has no variadic macros */
+ const uint8_t *data, int size, ...);
+#else
+void DISPLAY_BYTES(SSL *ssl, const char *format,/* win32 has no variadic macros */
+ const uint8_t *data, int size, ...);
+#endif
+#endif
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+int process_certificate(SSL *ssl, X509_CTX **x509_ctx);
+#endif
+
+SSL_SESSION *ssl_session_update(int max_sessions,
+ SSL_SESSION *ssl_sessions[], SSL *ssl,
+ const uint8_t *session_id);
+void kill_ssl_session(SSL_SESSION **ssl_sessions, SSL *ssl);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1_clnt.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1_clnt.c
new file mode 100644
index 0000000..9b3f605
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1_clnt.c
@@ -0,0 +1,396 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <stdio.h>
+#include "os_port.h"
+#include "ssl.h"
+
+#ifdef CONFIG_SSL_ENABLE_CLIENT /* all commented out if no client */
+
+static int send_client_hello(SSL *ssl);
+static int process_server_hello(SSL *ssl);
+static int process_server_hello_done(SSL *ssl);
+static int send_client_key_xchg(SSL *ssl);
+static int process_cert_req(SSL *ssl);
+static int send_cert_verify(SSL *ssl);
+
+/*
+ * Establish a new SSL connection to an SSL server.
+ */
+EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, SSL_SOCKET* client_fd, const
+ uint8_t *session_id, uint8_t sess_id_size)
+{
+ SSL *ssl = ssl_new(ssl_ctx, client_fd);
+ ssl->version = SSL_PROTOCOL_VERSION_MAX; /* try top version first */
+
+ if (session_id && ssl_ctx->num_sessions)
+ {
+ if (sess_id_size > SSL_SESSION_ID_SIZE) /* validity check */
+ {
+ ssl_free(ssl);
+ return NULL;
+ }
+
+ memcpy(ssl->session_id, session_id, sess_id_size);
+ ssl->sess_id_size = sess_id_size;
+ SET_SSL_FLAG(SSL_SESSION_RESUME); /* just flag for later */
+ }
+
+ SET_SSL_FLAG(SSL_IS_CLIENT);
+ do_client_connect(ssl);
+ return ssl;
+}
+
+/*
+ * Process the handshake record.
+ */
+int do_clnt_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len)
+{
+ int ret = SSL_OK;
+ (void)buf; /* GBG: unused */
+
+ /* To get here the state must be valid */
+ switch (handshake_type)
+ {
+ case HS_SERVER_HELLO:
+ ret = process_server_hello(ssl);
+ break;
+
+ case HS_CERTIFICATE:
+ ret = process_certificate(ssl, &ssl->x509_ctx);
+ break;
+
+ case HS_SERVER_HELLO_DONE:
+ if ((ret = process_server_hello_done(ssl)) == SSL_OK)
+ {
+ if (IS_SET_SSL_FLAG(SSL_HAS_CERT_REQ))
+ {
+ if ((ret = send_certificate(ssl)) == SSL_OK &&
+ (ret = send_client_key_xchg(ssl)) == SSL_OK)
+ {
+ send_cert_verify(ssl);
+ }
+ }
+ else
+ {
+ ret = send_client_key_xchg(ssl);
+ }
+
+ if (ret == SSL_OK &&
+ (ret = send_change_cipher_spec(ssl)) == SSL_OK)
+ {
+ ret = send_finished(ssl);
+ }
+ }
+ break;
+
+ case HS_CERT_REQ:
+ ret = process_cert_req(ssl);
+ break;
+
+ case HS_FINISHED:
+ ret = process_finished(ssl, buf, hs_len);
+ disposable_free(ssl); /* free up some memory */
+ /* note: client renegotiation is not allowed after this */
+ break;
+
+ case HS_HELLO_REQUEST:
+ disposable_new(ssl);
+ ret = do_client_connect(ssl);
+ break;
+
+ default:
+ ret = SSL_ERROR_INVALID_HANDSHAKE;
+ break;
+ }
+
+ return ret;
+}
+
+/*
+ * Do the handshaking from the beginning.
+ */
+int do_client_connect(SSL *ssl)
+{
+ int ret = SSL_OK;
+
+ send_client_hello(ssl); /* send the client hello */
+ ssl->bm_read_index = 0;
+ ssl->next_state = HS_SERVER_HELLO;
+ ssl->hs_status = SSL_NOT_OK; /* not connected */
+
+ /* sit in a loop until it all looks good */
+ if (!IS_SET_SSL_FLAG(SSL_CONNECT_IN_PARTS))
+ {
+ while (ssl->hs_status != SSL_OK)
+ {
+ ret = ssl_read(ssl, NULL);
+
+ if (ret < SSL_OK)
+ break;
+ }
+
+ ssl->hs_status = ret; /* connected? */
+ }
+
+ return ret;
+}
+
+/*
+ * Send the initial client hello.
+ */
+static int send_client_hello(SSL *ssl)
+{
+ uint8_t *buf = ssl->bm_data;
+ time_t tm = time(NULL);
+ uint8_t *tm_ptr = &buf[6]; /* time will go here */
+ int i, offset;
+
+ buf[0] = HS_CLIENT_HELLO;
+ buf[1] = 0;
+ buf[2] = 0;
+ /* byte 3 is calculated later */
+ buf[4] = 0x03;
+ buf[5] = ssl->version & 0x0f;
+
+ /* client random value - spec says that 1st 4 bytes are big endian time */
+ *tm_ptr++ = (uint8_t)(((long)tm & 0xff000000) >> 24);
+ *tm_ptr++ = (uint8_t)(((long)tm & 0x00ff0000) >> 16);
+ *tm_ptr++ = (uint8_t)(((long)tm & 0x0000ff00) >> 8);
+ *tm_ptr++ = (uint8_t)(((long)tm & 0x000000ff));
+ get_random(SSL_RANDOM_SIZE-4, &buf[10]);
+ memcpy(ssl->dc->client_random, &buf[6], SSL_RANDOM_SIZE);
+ offset = 6 + SSL_RANDOM_SIZE;
+
+ /* give session resumption a go */
+ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME)) /* set initially by user */
+ {
+ buf[offset++] = ssl->sess_id_size;
+ memcpy(&buf[offset], ssl->session_id, ssl->sess_id_size);
+ offset += ssl->sess_id_size;
+ CLR_SSL_FLAG(SSL_SESSION_RESUME); /* clear so we can set later */
+ }
+ else
+ {
+ /* no session id - because no session resumption just yet */
+ buf[offset++] = 0;
+ }
+
+ buf[offset++] = 0; /* number of ciphers */
+ buf[offset++] = NUM_PROTOCOLS*2;/* number of ciphers */
+
+ /* put all our supported protocols in our request */
+ for (i = 0; i < NUM_PROTOCOLS; i++)
+ {
+ buf[offset++] = 0; /* cipher we are using */
+ buf[offset++] = ssl_prot_prefs[i];
+ }
+
+ buf[offset++] = 1; /* no compression */
+ buf[offset++] = 0;
+ buf[3] = offset - 4; /* handshake size */
+
+ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
+}
+
+/*
+ * Process the server hello.
+ */
+static int process_server_hello(SSL *ssl)
+{
+ uint8_t *buf = ssl->bm_data;
+ int pkt_size = ssl->bm_index;
+ int num_sessions = ssl->ssl_ctx->num_sessions;
+ uint8_t sess_id_size;
+ int offset, ret = SSL_OK;
+
+ /* check that we are talking to a TLSv1 server */
+ uint8_t version = (buf[4] << 4) + buf[5];
+ if (version > SSL_PROTOCOL_VERSION_MAX)
+ {
+ version = SSL_PROTOCOL_VERSION_MAX;
+ }
+ else if (ssl->version < SSL_PROTOCOL_MIN_VERSION)
+ {
+ ret = SSL_ERROR_INVALID_VERSION;
+ ssl_display_error(ret);
+ goto error;
+ }
+
+ ssl->version = version;
+
+ /* get the server random value */
+ memcpy(ssl->dc->server_random, &buf[6], SSL_RANDOM_SIZE);
+ offset = 6 + SSL_RANDOM_SIZE; /* skip of session id size */
+ sess_id_size = buf[offset++];
+
+ if (sess_id_size > SSL_SESSION_ID_SIZE)
+ {
+ ret = SSL_ERROR_INVALID_SESSION;
+ goto error;
+ }
+
+ if (num_sessions)
+ {
+ ssl->session = ssl_session_update(num_sessions,
+ ssl->ssl_ctx->ssl_sessions, ssl, &buf[offset]);
+ memcpy(ssl->session->session_id, &buf[offset], sess_id_size);
+
+ /* pad the rest with 0's */
+ if (sess_id_size < SSL_SESSION_ID_SIZE)
+ {
+ memset(&ssl->session->session_id[sess_id_size], 0,
+ SSL_SESSION_ID_SIZE-sess_id_size);
+ }
+ }
+
+ memcpy(ssl->session_id, &buf[offset], sess_id_size);
+ ssl->sess_id_size = sess_id_size;
+ offset += sess_id_size;
+
+ /* get the real cipher we are using */
+ ssl->cipher = buf[++offset];
+ ssl->next_state = IS_SET_SSL_FLAG(SSL_SESSION_RESUME) ?
+ HS_FINISHED : HS_CERTIFICATE;
+
+ offset++; /* skip the compr */
+ PARANOIA_CHECK(pkt_size, offset);
+ ssl->dc->bm_proc_index = offset+1;
+
+error:
+ return ret;
+}
+
+/**
+ * Process the server hello done message.
+ */
+static int process_server_hello_done(SSL *ssl)
+{
+ ssl->next_state = HS_FINISHED;
+ return SSL_OK;
+}
+
+/*
+ * Send a client key exchange message.
+ */
+static int send_client_key_xchg(SSL *ssl)
+{
+ uint8_t *buf = ssl->bm_data;
+ uint8_t premaster_secret[SSL_SECRET_SIZE];
+ int enc_secret_size = -1;
+
+ buf[0] = HS_CLIENT_KEY_XCHG;
+ buf[1] = 0;
+
+ premaster_secret[0] = 0x03; /* encode the version number */
+ premaster_secret[1] = SSL_PROTOCOL_MINOR_VERSION; /* must be TLS 1.1 */
+ get_random(SSL_SECRET_SIZE-2, &premaster_secret[2]);
+ DISPLAY_RSA(ssl, ssl->x509_ctx->rsa_ctx);
+
+ /* rsa_ctx->bi_ctx is not thread-safe */
+ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
+ enc_secret_size = RSA_encrypt(ssl->x509_ctx->rsa_ctx, premaster_secret,
+ SSL_SECRET_SIZE, &buf[6], 0);
+ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
+
+ buf[2] = (enc_secret_size + 2) >> 8;
+ buf[3] = (enc_secret_size + 2) & 0xff;
+ buf[4] = enc_secret_size >> 8;
+ buf[5] = enc_secret_size & 0xff;
+
+ generate_master_secret(ssl, premaster_secret);
+ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, enc_secret_size+6);
+}
+
+/*
+ * Process the certificate request.
+ */
+static int process_cert_req(SSL *ssl)
+{
+ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
+ int ret = SSL_OK;
+ int offset = (buf[2] << 4) + buf[3];
+ int pkt_size = ssl->bm_index;
+
+ /* don't do any processing - we will send back an RSA certificate anyway */
+ ssl->next_state = HS_SERVER_HELLO_DONE;
+ SET_SSL_FLAG(SSL_HAS_CERT_REQ);
+ ssl->dc->bm_proc_index += offset;
+ PARANOIA_CHECK(pkt_size, offset);
+error:
+ return ret;
+}
+
+/*
+ * Send a certificate verify message.
+ */
+static int send_cert_verify(SSL *ssl)
+{
+ uint8_t *buf = ssl->bm_data;
+ uint8_t dgst[MD5_SIZE+SHA1_SIZE];
+ RSA_CTX *rsa_ctx = ssl->ssl_ctx->rsa_ctx;
+ int n = 0, ret;
+
+ DISPLAY_RSA(ssl, rsa_ctx);
+
+ buf[0] = HS_CERT_VERIFY;
+ buf[1] = 0;
+
+ finished_digest(ssl, NULL, dgst); /* calculate the digest */
+
+ /* rsa_ctx->bi_ctx is not thread-safe */
+ if (rsa_ctx)
+ {
+ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
+ n = RSA_encrypt(rsa_ctx, dgst, sizeof(dgst), &buf[6], 1);
+ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
+
+ if (n == 0)
+ {
+ ret = SSL_ERROR_INVALID_KEY;
+ goto error;
+ }
+ }
+
+ buf[4] = n >> 8; /* add the RSA size (not officially documented) */
+ buf[5] = n & 0xff;
+ n += 2;
+ buf[2] = n >> 8;
+ buf[3] = n & 0xff;
+ ret = send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, n+4);
+
+error:
+ return ret;
+}
+
+#endif /* CONFIG_SSL_ENABLE_CLIENT */
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1_svr.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1_svr.c
new file mode 100644
index 0000000..b252311
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/tls1_svr.c
@@ -0,0 +1,479 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "os_port.h"
+#include "ssl.h"
+
+static const uint8_t g_hello_done[] = { HS_SERVER_HELLO_DONE, 0, 0, 0 };
+
+static int process_client_hello(SSL *ssl);
+static int send_server_hello_sequence(SSL *ssl);
+static int send_server_hello(SSL *ssl);
+static int send_server_hello_done(SSL *ssl);
+static int process_client_key_xchg(SSL *ssl);
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+static int send_certificate_request(SSL *ssl);
+static int process_cert_verify(SSL *ssl);
+#endif
+
+/*
+ * Establish a new SSL connection to an SSL client.
+ */
+EXP_FUNC SSL * STDCALL ssl_server_new(SSL_CTX *ssl_ctx, SSL_SOCKET* client_fd)
+{
+ SSL *ssl;
+
+ ssl = ssl_new(ssl_ctx, client_fd);
+ ssl->next_state = HS_CLIENT_HELLO;
+
+#ifdef CONFIG_SSL_FULL_MODE
+ if (ssl_ctx->chain_length == 0)
+ printf("Warning - no server certificate defined\n"); TTY_FLUSH();
+#endif
+
+ return ssl;
+}
+
+/*
+ * Process the handshake record.
+ */
+int do_svr_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len)
+{
+ int ret = SSL_OK;
+ ssl->hs_status = SSL_NOT_OK; /* not connected */
+
+ /* To get here the state must be valid */
+ switch (handshake_type)
+ {
+ case HS_CLIENT_HELLO:
+ if ((ret = process_client_hello(ssl)) == SSL_OK)
+ ret = send_server_hello_sequence(ssl);
+ break;
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ case HS_CERTIFICATE:/* the client sends its cert */
+ ret = process_certificate(ssl, &ssl->x509_ctx);
+
+ /* GBG: removed (modified process_certificate to do the cert verification for both client and server
+ if (ret == SSL_OK)
+ {
+ int cert_res;
+ cert_res = x509_verify(
+ ssl->ssl_ctx->ca_cert_ctx, ssl->x509_ctx, NULL);
+ ret = (cert_res == 0) ? SSL_OK : SSL_X509_ERROR(cert_res);
+ }*/
+ break;
+
+ case HS_CERT_VERIFY:
+ ret = process_cert_verify(ssl);
+ add_packet(ssl, buf, hs_len); /* needs to be done after */
+ break;
+#endif
+ case HS_CLIENT_KEY_XCHG:
+ ret = process_client_key_xchg(ssl);
+ break;
+
+ case HS_FINISHED:
+ ret = process_finished(ssl, buf, hs_len);
+ disposable_free(ssl); /* free up some memory */
+ break;
+ }
+
+ return ret;
+}
+
+/*
+ * Process a client hello message.
+ */
+static int process_client_hello(SSL *ssl)
+{
+ uint8_t *buf = ssl->bm_data;
+ /* GBG: removed - uint8_t *record_buf = ssl->hmac_header; */
+ int pkt_size = ssl->bm_index;
+ int i, j, cs_len, id_len, offset = 6 + SSL_RANDOM_SIZE;
+ int ret = SSL_OK;
+
+ uint8_t version = (buf[4] << 4) + buf[5];
+ ssl->version = ssl->client_version = version;
+
+ if (version > SSL_PROTOCOL_VERSION_MAX)
+ {
+ /* use client's version instead */
+ ssl->version = SSL_PROTOCOL_VERSION_MAX;
+ }
+ else if (version < SSL_PROTOCOL_MIN_VERSION) /* old version supported? */
+ {
+ ret = SSL_ERROR_INVALID_VERSION;
+ ssl_display_error(ret);
+ goto error;
+ }
+
+ memcpy(ssl->dc->client_random, &buf[6], SSL_RANDOM_SIZE);
+
+ /* process the session id */
+ id_len = buf[offset++];
+ if (id_len > SSL_SESSION_ID_SIZE)
+ {
+ return SSL_ERROR_INVALID_SESSION;
+ }
+
+#ifndef CONFIG_SSL_SKELETON_MODE
+ ssl->session = ssl_session_update(ssl->ssl_ctx->num_sessions,
+ ssl->ssl_ctx->ssl_sessions, ssl, id_len ? &buf[offset] : NULL);
+#endif
+
+ offset += id_len;
+ cs_len = (buf[offset]<<8) + buf[offset+1];
+ offset += 3; /* add 1 due to all cipher suites being 8 bit */
+
+ PARANOIA_CHECK(pkt_size, offset);
+
+ /* work out what cipher suite we are going to use - client defines
+ the preference */
+ for (i = 0; i < cs_len; i += 2)
+ {
+ for (j = 0; j < NUM_PROTOCOLS; j++)
+ {
+ if (ssl_prot_prefs[j] == buf[offset+i]) /* got a match? */
+ {
+ ssl->cipher = ssl_prot_prefs[j];
+ goto do_state;
+ }
+ }
+ }
+
+ /* ouch! protocol is not supported */
+ ret = SSL_ERROR_NO_CIPHER;
+
+do_state:
+error:
+ return ret;
+}
+
+#ifdef CONFIG_SSL_ENABLE_V23_HANDSHAKE
+/*
+ * Some browsers use a hybrid SSLv2 "client hello"
+ */
+int process_sslv23_client_hello(SSL *ssl)
+{
+ uint8_t *buf = ssl->bm_data;
+ int bytes_needed = ((buf[0] & 0x7f) << 8) + buf[1];
+ int ret = SSL_OK;
+
+ /* we have already read 3 extra bytes so far */
+ int read_len = SOCKET_READ(ssl->client_fd, buf, bytes_needed-3);
+ int cs_len = buf[1];
+ int id_len = buf[3];
+ int ch_len = buf[5];
+ int i, j, offset = 8; /* start at first cipher */
+ int random_offset = 0;
+
+ DISPLAY_BYTES(ssl, "received %d bytes", buf, read_len, read_len);
+
+ add_packet(ssl, buf, read_len);
+
+ /* connection has gone, so die */
+ if (bytes_needed < 0)
+ {
+ return SSL_ERROR_CONN_LOST;
+ }
+
+ /* now work out what cipher suite we are going to use */
+ for (j = 0; j < NUM_PROTOCOLS; j++)
+ {
+ for (i = 0; i < cs_len; i += 3)
+ {
+ if (ssl_prot_prefs[j] == buf[offset+i])
+ {
+ ssl->cipher = ssl_prot_prefs[j];
+ goto server_hello;
+ }
+ }
+ }
+
+ /* ouch! protocol is not supported */
+ ret = SSL_ERROR_NO_CIPHER;
+ goto error;
+
+server_hello:
+ /* get the session id */
+ offset += cs_len - 2; /* we've gone 2 bytes past the end */
+#ifndef CONFIG_SSL_SKELETON_MODE
+ ssl->session = ssl_session_update(ssl->ssl_ctx->num_sessions,
+ ssl->ssl_ctx->ssl_sessions, ssl, id_len ? &buf[offset] : NULL);
+#endif
+
+ /* get the client random data */
+ offset += id_len;
+
+ /* random can be anywhere between 16 and 32 bytes long - so it is padded
+ * with 0's to the left */
+ if (ch_len == 0x10)
+ {
+ random_offset += 0x10;
+ }
+
+ memcpy(&ssl->dc->client_random[random_offset], &buf[offset], ch_len);
+ ret = send_server_hello_sequence(ssl);
+
+error:
+ return ret;
+}
+#endif
+
+/*
+ * Send the entire server hello sequence
+ */
+static int send_server_hello_sequence(SSL *ssl)
+{
+ int ret;
+
+ if ((ret = send_server_hello(ssl)) == SSL_OK)
+ {
+#ifndef CONFIG_SSL_SKELETON_MODE
+ /* resume handshake? */
+ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME))
+ {
+ if ((ret = send_change_cipher_spec(ssl)) == SSL_OK)
+ {
+ ret = send_finished(ssl);
+ ssl->next_state = HS_FINISHED;
+ }
+ }
+ else
+#endif
+ if ((ret = send_certificate(ssl)) == SSL_OK)
+ {
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ /* ask the client for its certificate */
+ if (IS_SET_SSL_FLAG(SSL_CLIENT_AUTHENTICATION))
+ {
+ if ((ret = send_certificate_request(ssl)) == SSL_OK)
+ {
+ ret = send_server_hello_done(ssl);
+ ssl->next_state = HS_CERTIFICATE;
+ }
+ }
+ else
+#endif
+ {
+ ret = send_server_hello_done(ssl);
+ ssl->next_state = HS_CLIENT_KEY_XCHG;
+ }
+ }
+ }
+
+ return ret;
+}
+
+/*
+ * Send a server hello message.
+ */
+static int send_server_hello(SSL *ssl)
+{
+ uint8_t *buf = ssl->bm_data;
+ int offset = 0;
+
+ buf[0] = HS_SERVER_HELLO;
+ buf[1] = 0;
+ buf[2] = 0;
+ /* byte 3 is calculated later */
+ buf[4] = 0x03;
+ buf[5] = ssl->version & 0x0f;
+
+ /* server random value */
+ get_random(SSL_RANDOM_SIZE, &buf[6]);
+ memcpy(ssl->dc->server_random, &buf[6], SSL_RANDOM_SIZE);
+ offset = 6 + SSL_RANDOM_SIZE;
+
+#ifndef CONFIG_SSL_SKELETON_MODE
+ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME))
+ {
+ /* retrieve id from session cache */
+ buf[offset++] = SSL_SESSION_ID_SIZE;
+ memcpy(&buf[offset], ssl->session->session_id, SSL_SESSION_ID_SIZE);
+ memcpy(ssl->session_id, ssl->session->session_id, SSL_SESSION_ID_SIZE);
+ ssl->sess_id_size = SSL_SESSION_ID_SIZE;
+ offset += SSL_SESSION_ID_SIZE;
+ }
+ else /* generate our own session id */
+#endif
+ {
+#ifndef CONFIG_SSL_SKELETON_MODE
+ buf[offset++] = SSL_SESSION_ID_SIZE;
+ get_random(SSL_SESSION_ID_SIZE, &buf[offset]);
+ memcpy(ssl->session_id, &buf[offset], SSL_SESSION_ID_SIZE);
+ ssl->sess_id_size = SSL_SESSION_ID_SIZE;
+
+ /* store id in session cache */
+ if (ssl->ssl_ctx->num_sessions)
+ {
+ memcpy(ssl->session->session_id,
+ ssl->session_id, SSL_SESSION_ID_SIZE);
+ }
+
+ offset += SSL_SESSION_ID_SIZE;
+#else
+ buf[offset++] = 0; /* don't bother with session id in skelton mode */
+#endif
+ }
+
+ buf[offset++] = 0; /* cipher we are using */
+ buf[offset++] = ssl->cipher;
+ buf[offset++] = 0; /* no compression */
+ buf[3] = offset - 4; /* handshake size */
+ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
+}
+
+/*
+ * Send the server hello done message.
+ */
+static int send_server_hello_done(SSL *ssl)
+{
+ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL,
+ g_hello_done, sizeof(g_hello_done));
+}
+
+/*
+ * Pull apart a client key exchange message. Decrypt the pre-master key (using
+ * our RSA private key) and then work out the master key. Initialise the
+ * ciphers.
+ */
+static int process_client_key_xchg(SSL *ssl)
+{
+ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
+ int pkt_size = ssl->bm_index;
+ int premaster_size, secret_length = (buf[2] << 8) + buf[3];
+ uint8_t premaster_secret[MAX_KEY_BYTE_SIZE];
+ RSA_CTX *rsa_ctx = ssl->ssl_ctx->rsa_ctx;
+ int offset = 4;
+ int ret = SSL_OK;
+
+ if (rsa_ctx == NULL)
+ {
+ ret = SSL_ERROR_NO_CERT_DEFINED;
+ goto error;
+ }
+
+ /* is there an extra size field? */
+ if ((secret_length - 2) == rsa_ctx->num_octets)
+ offset += 2;
+
+ PARANOIA_CHECK(pkt_size, rsa_ctx->num_octets+offset);
+
+ /* rsa_ctx->bi_ctx is not thread-safe */
+ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
+ premaster_size = RSA_decrypt(rsa_ctx, &buf[offset], premaster_secret, 1);
+ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
+
+ if (premaster_size != SSL_SECRET_SIZE ||
+ premaster_secret[0] != 0x03 || /* must be the same as client
+ offered version */
+ premaster_secret[1] != (ssl->client_version & 0x0f))
+ {
+ /* guard against a Bleichenbacher attack */
+ get_random(SSL_SECRET_SIZE, premaster_secret);
+ /* and continue - will die eventually when checking the mac */
+ }
+
+#if 0
+ print_blob("pre-master", premaster_secret, SSL_SECRET_SIZE);
+#endif
+
+ generate_master_secret(ssl, premaster_secret);
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ ssl->next_state = IS_SET_SSL_FLAG(SSL_CLIENT_AUTHENTICATION) ?
+ HS_CERT_VERIFY : HS_FINISHED;
+#else
+ ssl->next_state = HS_FINISHED;
+#endif
+
+ ssl->dc->bm_proc_index += rsa_ctx->num_octets+offset;
+error:
+ return ret;
+}
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+static const uint8_t g_cert_request[] = { HS_CERT_REQ, 0, 0, 4, 1, /* GBG: changed from 0 to 1 */ 1, 0, 0 };
+
+/*
+ * Send the certificate request message.
+ */
+static int send_certificate_request(SSL *ssl)
+{
+ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL,
+ g_cert_request, sizeof(g_cert_request));
+}
+
+/*
+ * Ensure the client has the private key by first decrypting the packet and
+ * then checking the packet digests.
+ */
+static int process_cert_verify(SSL *ssl)
+{
+ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
+ int pkt_size = ssl->bm_index;
+ uint8_t dgst_buf[MAX_KEY_BYTE_SIZE];
+ uint8_t dgst[MD5_SIZE+SHA1_SIZE];
+ X509_CTX *x509_ctx = ssl->x509_ctx;
+ int ret = SSL_OK;
+ int n;
+
+ PARANOIA_CHECK(pkt_size, x509_ctx->rsa_ctx->num_octets+6);
+ DISPLAY_RSA(ssl, x509_ctx->rsa_ctx);
+
+ /* rsa_ctx->bi_ctx is not thread-safe */
+ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
+ n = RSA_decrypt(x509_ctx->rsa_ctx, &buf[6], dgst_buf, 0);
+ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
+
+ if (n != SHA1_SIZE + MD5_SIZE)
+ {
+ ret = SSL_ERROR_INVALID_KEY;
+ goto end_cert_vfy;
+ }
+
+ finished_digest(ssl, NULL, dgst); /* calculate the digest */
+ if (memcmp(dgst_buf, dgst, MD5_SIZE + SHA1_SIZE))
+ {
+ ret = SSL_ERROR_INVALID_KEY;
+ }
+
+end_cert_vfy:
+ ssl->next_state = HS_FINISHED;
+error:
+ return ret;
+}
+
+#endif
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/version.h b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/version.h
new file mode 100644
index 0000000..e8158cc
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/version.h
@@ -0,0 +1 @@
+#define AXTLS_VERSION "1.4.9"
diff --git a/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/x509.c b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/x509.c
new file mode 100644
index 0000000..f32c158
--- /dev/null
+++ b/lib/libUPnP/Neptune/ThirdParty/axTLS/ssl/x509.c
@@ -0,0 +1,578 @@
+/*
+ * Copyright (c) 2007, Cameron Rich
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the axTLS project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file x509.c
+ *
+ * Certificate processing.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "os_port.h"
+#include "crypto_misc.h"
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+/**
+ * Retrieve the signature from a certificate.
+ */
+static const uint8_t *get_signature(const uint8_t *asn1_sig, int *len)
+{
+ int offset = 0;
+ const uint8_t *ptr = NULL;
+
+ if (asn1_next_obj(asn1_sig, &offset, ASN1_SEQUENCE) < 0 ||
+ asn1_skip_obj(asn1_sig, &offset, ASN1_SEQUENCE))
+ goto end_get_sig;
+
+ if (asn1_sig[offset++] != ASN1_OCTET_STRING)
+ goto end_get_sig;
+ *len = get_asn1_length(asn1_sig, &offset);
+ ptr = &asn1_sig[offset]; /* all ok */
+
+end_get_sig:
+ return ptr;
+}
+
+#endif
+
+/**
+ * Construct a new x509 object.
+ * @return 0 if ok. < 0 if there was a problem.
+ */
+int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx)
+{
+ int begin_tbs, end_tbs;
+ int ret = X509_NOT_OK, offset = 0, cert_size = 0;
+ X509_CTX *x509_ctx;
+ BI_CTX *bi_ctx;
+
+ *ctx = (X509_CTX *)calloc(1, sizeof(X509_CTX));
+ x509_ctx = *ctx;
+
+ /* get the certificate size */
+ asn1_skip_obj(cert, &cert_size, ASN1_SEQUENCE);
+
+ if (asn1_next_obj(cert, &offset, ASN1_SEQUENCE) < 0)
+ goto end_cert;
+
+ begin_tbs = offset; /* start of the tbs */
+ end_tbs = begin_tbs; /* work out the end of the tbs */
+ asn1_skip_obj(cert, &end_tbs, ASN1_SEQUENCE);
+
+ if (asn1_next_obj(cert, &offset, ASN1_SEQUENCE) < 0)
+ goto end_cert;
+
+ if (cert[offset] == ASN1_EXPLICIT_TAG) /* optional version */
+ {
+ if (asn1_version(cert, &offset, x509_ctx))
+ goto end_cert;
+ }
+
+ if (asn1_skip_obj(cert, &offset, ASN1_INTEGER) || /* serial number */
+ asn1_next_obj(cert, &offset, ASN1_SEQUENCE) < 0)
+ goto end_cert;
+
+ /* make sure the signature is ok */
+ if (asn1_signature_type(cert, &offset, x509_ctx))
+ {
+ ret = X509_VFY_ERROR_UNSUPPORTED_DIGEST;
+ goto end_cert;
+ }
+
+ if (asn1_name(cert, &offset, x509_ctx->ca_cert_dn) ||
+ asn1_validity(cert, &offset, x509_ctx) ||
+ asn1_name(cert, &offset, x509_ctx->cert_dn) ||
+ asn1_public_key(cert, &offset, x509_ctx))
+ {
+ goto end_cert;
+ }
+
+ bi_ctx = x509_ctx->rsa_ctx->bi_ctx;
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION /* only care if doing verification */
+ /* use the appropriate signature algorithm (SHA1/MD5/MD2) */
+ if (x509_ctx->sig_type == SIG_TYPE_MD5)
+ {
+ MD5_CTX md5_ctx;
+ uint8_t md5_dgst[MD5_SIZE];
+ MD5_Init(&md5_ctx);
+ MD5_Update(&md5_ctx, &cert[begin_tbs], end_tbs-begin_tbs);
+ MD5_Final(md5_dgst, &md5_ctx);
+ x509_ctx->digest = bi_import(bi_ctx, md5_dgst, MD5_SIZE);
+ }
+ else if (x509_ctx->sig_type == SIG_TYPE_SHA1)
+ {
+ SHA1_CTX sha_ctx;
+ uint8_t sha_dgst[SHA1_SIZE];
+ SHA1_Init(&sha_ctx);
+ SHA1_Update(&sha_ctx, &cert[begin_tbs], end_tbs-begin_tbs);
+ SHA1_Final(sha_dgst, &sha_ctx);
+ x509_ctx->digest = bi_import(bi_ctx, sha_dgst, SHA1_SIZE);
+ }
+ else if (x509_ctx->sig_type == SIG_TYPE_SHA256)
+ {
+ uint8_t sha_dgst[SHA256_SIZE];
+ SSL_Sha256_ComputeDigest(&cert[begin_tbs], end_tbs-begin_tbs, sha_dgst);
+ x509_ctx->digest = bi_import(bi_ctx, sha_dgst, SHA256_SIZE);
+ }
+ else if (x509_ctx->sig_type == SIG_TYPE_MD2)
+ {
+ MD2_CTX md2_ctx;
+ uint8_t md2_dgst[MD2_SIZE];
+ MD2_Init(&md2_ctx);
+ MD2_Update(&md2_ctx, &cert[begin_tbs], end_tbs-begin_tbs);
+ MD2_Final(md2_dgst, &md2_ctx);
+ x509_ctx->digest = bi_import(bi_ctx, md2_dgst, MD2_SIZE);
+ }
+
+ if (cert[offset] == ASN1_V3_DATA)
+ {
+ int suboffset;
+
+ ++offset;
+ get_asn1_length(cert, &offset);
+
+ if ((suboffset = asn1_find_subjectaltname(cert, offset)) > 0)
+ {
+ if (asn1_next_obj(cert, &suboffset, ASN1_OCTET_STRING) > 0)
+ {
+ int altlen;
+
+ if ((altlen = asn1_next_obj(cert,
+ &suboffset, ASN1_SEQUENCE)) > 0)
+ {
+ int endalt = suboffset + altlen;
+ int totalnames = 0;
+
+ while (suboffset < endalt)
+ {
+ int type = cert[suboffset++];
+ int dnslen = get_asn1_length(cert, &suboffset);
+
+ if (type == ASN1_CONTEXT_DNSNAME)
+ {
+ x509_ctx->subject_alt_dnsnames = (char**)
+ realloc(x509_ctx->subject_alt_dnsnames,
+ (totalnames + 2) * sizeof(char*));
+ x509_ctx->subject_alt_dnsnames[totalnames] =
+ (char*)malloc(dnslen + 1);
+ x509_ctx->subject_alt_dnsnames[totalnames+1] = NULL;
+ memcpy(x509_ctx->subject_alt_dnsnames[totalnames],
+ cert + suboffset, dnslen);
+ x509_ctx->subject_alt_dnsnames[
+ totalnames][dnslen] = 0;
+ ++totalnames;
+ }
+
+ suboffset += dnslen;
+ }
+ }
+ }
+ }
+ }
+
+ offset = end_tbs; /* skip the rest of v3 data */
+ if (asn1_skip_obj(cert, &offset, ASN1_SEQUENCE) ||
+ asn1_signature(cert, &offset, x509_ctx))
+ goto end_cert;
+
+ /* GBG: compute the fingerprints */
+ {
+ MD5_CTX md5_ctx;
+ MD5_Init(&md5_ctx);
+ MD5_Update(&md5_ctx, cert, cert_size);
+ MD5_Final(x509_ctx->fingerprint.md5, &md5_ctx);
+ }
+ {
+ SHA1_CTX sha1_ctx;
+ SHA1_Init(&sha1_ctx);
+ SHA1_Update(&sha1_ctx, cert, cert_size);
+ SHA1_Final(x509_ctx->fingerprint.sha1, &sha1_ctx);
+ }
+ /* /GBG: compute the fingerprints */
+
+#endif
+ ret = X509_OK;
+end_cert:
+ if (len)
+ {
+ *len = cert_size;
+ }
+
+ if (ret)
+ {
+#ifdef CONFIG_SSL_FULL_MODE
+ printf("Error: Invalid X509 ASN.1 file (%s)\n",
+ x509_display_error(ret));
+#endif
+ x509_free(x509_ctx);
+ *ctx = NULL;
+ }
+
+ return ret;
+}
+
+/**
+ * Free an X.509 object's resources.
+ */
+void x509_free(X509_CTX *x509_ctx)
+{
+ X509_CTX *next;
+ int i;
+
+ if (x509_ctx == NULL) /* if already null, then don't bother */
+ return;
+
+ for (i = 0; i < X509_NUM_DN_TYPES; i++)
+ {
+ free(x509_ctx->ca_cert_dn[i]);
+ free(x509_ctx->cert_dn[i]);
+ }
+
+ free(x509_ctx->signature);
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+ if (x509_ctx->digest)
+ {
+ bi_free(x509_ctx->rsa_ctx->bi_ctx, x509_ctx->digest);
+ }
+
+ if (x509_ctx->subject_alt_dnsnames)
+ {
+ for (i = 0; x509_ctx->subject_alt_dnsnames[i]; ++i)
+ free(x509_ctx->subject_alt_dnsnames[i]);
+
+ free(x509_ctx->subject_alt_dnsnames);
+ }
+#endif
+
+ RSA_free(x509_ctx->rsa_ctx);
+ next = x509_ctx->next;
+ free(x509_ctx);
+ x509_free(next); /* clear the chain */
+}
+
+#ifdef CONFIG_SSL_CERT_VERIFICATION
+/**
+ * Take a signature and decrypt it.
+ */
+static bigint *sig_verify(BI_CTX *ctx, const uint8_t *sig, int sig_len,
+ bigint *modulus, bigint *pub_exp)
+{
+ int i, size;
+ bigint *decrypted_bi, *dat_bi;
+ bigint *bir = NULL;
+ uint8_t *block = (uint8_t *)alloca(sig_len);
+
+ /* decrypt */
+ dat_bi = bi_import(ctx, sig, sig_len);
+ ctx->mod_offset = BIGINT_M_OFFSET;
+
+ /* convert to a normal block */
+ decrypted_bi = bi_mod_power2(ctx, dat_bi, modulus, pub_exp);
+
+ bi_export(ctx, decrypted_bi, block, sig_len);
+ ctx->mod_offset = BIGINT_M_OFFSET;
+
+ i = 10; /* start at the first possible non-padded byte */
+ while (block[i++] && i < sig_len);
+ size = sig_len - i;
+
+ /* get only the bit we want */
+ if (size > 0)
+ {
+ int len;
+ const uint8_t *sig_ptr = get_signature(&block[i], &len);
+
+ if (sig_ptr)
+ {
+ bir = bi_import(ctx, sig_ptr, len);
+ }
+ }
+
+ /* save a few bytes of memory */
+ bi_clear_cache(ctx);
+ return bir;
+}
+
+/**
+ * Do some basic checks on the certificate chain.
+ *
+ * Certificate verification consists of a number of checks:
+ * - The date of the certificate is after the start date.
+ * - The date of the certificate is before the finish date.
+ * - A root certificate exists in the certificate store.
+ * - That the certificate(s) are not self-signed.
+ * - The certificate chain is valid.
+ * - The signature of the certificate is valid.
+ */
+int x509_verify(X509_CTX* ca_certs /* GBG: changed */, const X509_CTX *cert, const SSL_DateTime* now)
+{
+ int ret = X509_OK;
+ bigint *cert_sig;
+ X509_CTX *next_cert = NULL;
+ BI_CTX *ctx = NULL;
+ bigint *mod = NULL, *expn = NULL;
+ int match_ca_cert = 0;
+ uint8_t is_self_signed = 0;
+ SSL_DateTime now_dt;
+
+ if (cert == NULL)
+ {
+ ret = X509_VFY_ERROR_NO_TRUSTED_CERT;
+ goto end_verify;
+ }
+
+ /* a self-signed certificate that is not in the CA store - use this
+ to check the signature */
+ if (asn1_compare_dn(cert->ca_cert_dn, cert->cert_dn) == 0)
+ {
+ is_self_signed = 1;
+ ctx = cert->rsa_ctx->bi_ctx;
+ mod = cert->rsa_ctx->m;
+ expn = cert->rsa_ctx->e;
+ }
+
+ /* if the time was not passed in, get it now */
+ if (now == NULL) {
+ SSL_DateTime_Now(&now_dt);
+ now = &now_dt;
+ }
+
+ /* check the not before date */
+ if (SSL_DateTime_Before(now, &cert->not_before))
+ {
+ ret = X509_VFY_ERROR_NOT_YET_VALID;
+ goto end_verify;
+ }
+
+ /* check the not after date */
+ if (SSL_DateTime_Before(&cert->not_after, now))
+ {
+ ret = X509_VFY_ERROR_EXPIRED;
+ goto end_verify;
+ }
+
+ next_cert = cert->next;
+
+ /* last cert in the chain - look for a trusted cert */
+ if (next_cert == NULL)
+ {
+ /* GBG: modified */
+ X509_CTX* ca_cert = ca_certs;
+ while (ca_cert) {
+ if (asn1_compare_dn(cert->ca_cert_dn, ca_cert->cert_dn) == 0) {
+ /* use this CA certificate for signature verification */
+ match_ca_cert = 1;
+ ctx = ca_cert->rsa_ctx->bi_ctx;
+ mod = ca_cert->rsa_ctx->m;
+ expn = ca_cert->rsa_ctx->e;
+ break;
+ }
+ ca_cert = ca_cert->next;
+ }
+
+ /* couldn't find a trusted cert (& let self-signed errors be returned) */
+ if (!match_ca_cert && !is_self_signed)
+ {
+ ret = X509_VFY_ERROR_NO_TRUSTED_CERT;
+ goto end_verify;
+ }
+ }
+ else if (asn1_compare_dn(cert->ca_cert_dn, next_cert->cert_dn) != 0)
+ {
+ /* check the chain */
+ ret = X509_VFY_ERROR_INVALID_CHAIN;
+ goto end_verify;
+ }
+ else /* use the next certificate in the chain for signature verify */
+ {
+ ctx = next_cert->rsa_ctx->bi_ctx;
+ mod = next_cert->rsa_ctx->m;
+ expn = next_cert->rsa_ctx->e;
+ }
+
+ /* cert is self signed */
+ if (!match_ca_cert && is_self_signed)
+ {
+ ret = X509_VFY_ERROR_SELF_SIGNED;
+ goto end_verify;
+ }
+
+ /* check the signature */
+ cert_sig = sig_verify(ctx, cert->signature, cert->sig_len,
+ bi_clone(ctx, mod), bi_clone(ctx, expn));
+
+ if (cert_sig && cert->digest)
+ {
+ if (bi_compare(cert_sig, cert->digest) != 0)
+ ret = X509_VFY_ERROR_BAD_SIGNATURE;
+
+
+ bi_free(ctx, cert_sig);
+ }
+ else
+ {
+ ret = X509_VFY_ERROR_BAD_SIGNATURE;
+ }
+
+ if (ret)
+ goto end_verify;
+
+ /* go down the certificate chain using recursion. */
+ if (next_cert != NULL)
+ {
+ ret = x509_verify(ca_certs, next_cert, now);
+ }
+
+end_verify:
+ return ret;
+}
+#endif
+
+#if defined (CONFIG_SSL_FULL_MODE)
+/**
+ * Used for diagnostics.
+ */
+static const char *not_part_of_cert = "<Not Part Of Certificate>";
+void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx)
+{
+ if (cert == NULL)
+ return;
+
+ printf("=== CERTIFICATE ISSUED TO ===\n");
+ printf("Common Name (CN):\t\t");
+ printf("%s\n", cert->cert_dn[X509_COMMON_NAME] ?
+ cert->cert_dn[X509_COMMON_NAME] : not_part_of_cert);
+
+ printf("Organization (O):\t\t");
+ printf("%s\n", cert->cert_dn[X509_ORGANIZATION] ?
+ cert->cert_dn[X509_ORGANIZATION] : not_part_of_cert);
+
+ printf("Organizational Unit (OU):\t");
+ printf("%s\n", cert->cert_dn[X509_ORGANIZATIONAL_UNIT] ?
+ cert->cert_dn[X509_ORGANIZATIONAL_UNIT] : not_part_of_cert);
+
+ printf("=== CERTIFICATE ISSUED BY ===\n");
+ printf("Common Name (CN):\t\t");
+ printf("%s\n", cert->ca_cert_dn[X509_COMMON_NAME] ?
+ cert->ca_cert_dn[X509_COMMON_NAME] : not_part_of_cert);
+
+ printf("Organization (O):\t\t");
+ printf("%s\n", cert->ca_cert_dn[X509_ORGANIZATION] ?
+ cert->ca_cert_dn[X509_ORGANIZATION] : not_part_of_cert);
+
+ printf("Organizational Unit (OU):\t");
+ printf("%s\n", cert->ca_cert_dn[X509_ORGANIZATIONAL_UNIT] ?
+ cert->ca_cert_dn[X509_ORGANIZATIONAL_UNIT] : not_part_of_cert);
+
+ printf("Not Before:\t\t\t%s", ctime(&cert->not_before));
+ printf("Not After:\t\t\t%s", ctime(&cert->not_after));
+ printf("RSA bitsize:\t\t\t%d\n", cert->rsa_ctx->num_octets*8);
+ printf("Sig Type:\t\t\t");
+ switch (cert->sig_type)
+ {
+ case SIG_TYPE_MD5:
+ printf("MD5\n");
+ break;
+ case SIG_TYPE_SHA1:
+ printf("SHA1\n");
+ break;
+ case SIG_TYPE_MD2:
+ printf("MD2\n");
+ break;
+ default:
+ printf("Unrecognized: %d\n", cert->sig_type);
+ break;
+ }
+
+ if (ca_cert_ctx)
+ {
+ printf("Verify:\t\t\t\t%s\n",
+ x509_display_error(x509_verify(ca_cert_ctx, cert)));
+ }
+
+#if 0
+ print_blob("Signature", cert->signature, cert->sig_len);
+ bi_print("Modulus", cert->rsa_ctx->m);
+ bi_print("Pub Exp", cert->rsa_ctx->e);
+#endif
+
+ if (ca_cert_ctx)
+ {
+ x509_print(cert->next, ca_cert_ctx);
+ }
+
+ TTY_FLUSH();
+}
+
+const char * x509_display_error(int error)
+{
+ switch (error)
+ {
+ case X509_OK:
+ return "Certificate verify successful";
+
+ case X509_NOT_OK:
+ return "X509 not ok";
+
+ case X509_VFY_ERROR_NO_TRUSTED_CERT:
+ return "No trusted cert is available";
+
+ case X509_VFY_ERROR_BAD_SIGNATURE:
+ return "Bad signature";
+
+ case X509_VFY_ERROR_NOT_YET_VALID:
+ return "Cert is not yet valid";
+
+ case X509_VFY_ERROR_EXPIRED:
+ return "Cert has expired";
+
+ case X509_VFY_ERROR_SELF_SIGNED:
+ return "Cert is self-signed";
+
+ case X509_VFY_ERROR_INVALID_CHAIN:
+ return "Chain is invalid (check order of certs)";
+
+ case X509_VFY_ERROR_UNSUPPORTED_DIGEST:
+ return "Unsupported digest";
+
+ case X509_INVALID_PRIV_KEY:
+ return "Invalid private key";
+
+ default:
+ return "Unknown";
+ }
+}
+#endif /* CONFIG_SSL_FULL_MODE */
+
diff --git a/lib/libUPnP/Platinum/Build/Boot.scons b/lib/libUPnP/Platinum/Build/Boot.scons
new file mode 100644
index 0000000..9b15737
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Boot.scons
@@ -0,0 +1,71 @@
+import sys
+import os
+import platform
+
+EnsureSConsVersion(0,98,1)
+
+#######################################################
+# reusable functions and data structures
+#######################################################
+
+# Platform to Target Map (specifies which default target to build on a platform)
+PLATFORM_TO_TARGET_MAP = {
+ 'linux-i386' : 'x86-unknown-linux',
+ 'linux-x86_64': 'x86_64-unknown-linux',
+ 'linux-arm' : 'arm-unknown-linux',
+ 'linux2' : 'x86-unknown-linux',
+ 'win32' : 'x86-microsoft-win32',
+ 'cygwin' : 'x86-unknown-cygwin',
+ 'darwin' : 'universal-apple-macosx'
+}
+
+# list all target dirs
+scons_root = Environment().GetBuildPath('#')
+targets_dir = scons_root+'/Build/Targets'
+targets_dirs = os.listdir(targets_dir)
+TARGET_PLATFORMS = [x for x in targets_dirs if os.path.exists(targets_dir +'/'+x+'/Config.scons')]
+
+def DefaultTarget():
+ platform_id = sys.platform
+ if platform.system() == 'Linux':
+ if (platform.machine() == 'i386' or
+ platform.machine() == 'i486' or
+ platform.machine() == 'i586'or
+ platform.machine() == 'i686'):
+ platform_id = 'linux-i386'
+ if (platform.machine() == 'x86_64'):
+ platform_id = 'linux-x86_64'
+ if (platform.machine().startswith('arm')):
+ platform_id = 'linux-arm'
+
+ if PLATFORM_TO_TARGET_MAP.has_key(platform_id):
+ return PLATFORM_TO_TARGET_MAP[platform_id]
+ else:
+ return None
+
+#######################################################
+# Main Build
+#######################################################
+options = Variables()
+options.AddVariables(
+ EnumVariable('target', 'Build Target', DefaultTarget(), allowed_values=TARGET_PLATFORMS),
+ BoolVariable('stop_on_warning', 'Stop the build on warnings', False),
+ ListVariable('build_config', 'build configurations', 'Debug', names=['Debug', 'Release'])
+)
+
+env = Environment(variables=options)
+Help(options.GenerateHelpText(env))
+
+if 'NPT_CONFIG_NO_SSL' in os.environ:
+ env['NPT_CONFIG_NO_SSL'] = os.environ['NPT_CONFIG_NO_SSL']
+if 'NPT_CONFIG_NO_ZIP' in os.environ:
+ env['NPT_CONFIG_NO_ZIP'] = os.environ['NPT_CONFIG_NO_ZIP']
+if 'NPT_CONFIG_NO_CRYPTO' in os.environ:
+ env['NPT_CONFIG_NO_CRYPTO'] = os.environ['NPT_CONFIG_NO_CRYPTO']
+
+base_env = env
+for build_config in env['build_config']:
+ env = base_env.Clone()
+ env['build_config'] = build_config
+ print '********** Configuring Build Target =', env['target'], '/', build_config, '********'
+ SConscript('Build.scons', variant_dir='Targets/'+env['target']+'/'+build_config, exports='env', duplicate=0)
diff --git a/lib/libUPnP/Platinum/Build/Build.scons b/lib/libUPnP/Platinum/Build/Build.scons
new file mode 100644
index 0000000..ab9a95d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Build.scons
@@ -0,0 +1,275 @@
+import sys
+import os
+import imp
+from glob import glob
+
+#######################################################
+# reusable functions and data structures
+#######################################################
+def LoadTool(name, env, **kw):
+ config_path = GetBuildPath('#/Build/Tools/SCons')
+ file, path, desc = imp.find_module(name, [config_path])
+ module = imp.load_module(name, file, path, desc)
+ module.generate(env, **kw)
+
+def MergeListUnique(item_list, items):
+ for item in items:
+ if not item in item_list: item_list.append(item)
+
+def MergeItemUnique(item_list, item):
+ if not item in item_list: item_list.append(item)
+
+def GlobSources(drct, patterns, excluded_files=[]):
+ root = GetBuildPath('#'+drct)
+ files = []
+ for pattern in Split(patterns):
+ files += glob(root+'/'+pattern)
+ return [drct+'/'+os.path.basename(x) for x in files if os.path.basename(x) not in excluded_files]
+
+def GetDirPath(dir):
+ return '#/'+dir
+
+def DeclareBuildDir(dir):
+ env.VariantDir(dir, GetDirPath(dir), duplicate=0)
+
+def GetIncludeDirs(modules, exclude=None):
+ dirs = []
+ for module in Split(modules):
+ if Modules.has_key(module) and not module == exclude:
+ dirs += Modules[module].GetIncludeDirs()
+ else:
+ dirs += [GetDirPath(module)]
+ return dirs
+
+def GetLibraries(modules):
+ libs = []
+ for module in Split(modules):
+ if Modules.has_key(module):
+ libs += Modules[module].GetLibraries()
+ else:
+ libs += [module]
+ return libs
+
+Modules = {}
+class Module:
+ def __init__(self, name, included_modules = [], linked_modules = []):
+ self.name = name
+ self.included_modules = included_modules
+ self.linked_modules = linked_modules
+ self.product = []
+
+ def GetLibraries(self):
+ return self.product+GetLibraries(self.linked_modules)
+
+ def GetIncludeDirs(self):
+ return GetIncludeDirs(self.included_modules+self.build_include_dirs, self.name)
+
+class LibraryModule(Module):
+ def __init__(self, name,
+ build_source_dirs = ['.'],
+ build_source_files = {},
+ source_root = 'Source',
+ build_source_pattern = ['*.c', '*.cpp'],
+ build_include_dirs = [],
+ included_modules = [],
+ included_only_modules = [],
+ linked_modules = [],
+ environment = None,
+ excluded_files = [],
+ extra_cpp_defines = [],
+ shared = False,
+ install = False) :
+ build_source_dirs = [source_root+'/'+drct for drct in build_source_dirs]
+ Module.__init__(self,
+ name,
+ Split(included_modules)+Split(included_only_modules)+Split(build_source_dirs),
+ Split(linked_modules)+Split(included_modules))
+ self.build_include_dirs = build_include_dirs
+ if environment is None:
+ self.env = env.Clone()
+ else:
+ self.env = environment.Clone()
+ self.env.AppendUnique(CPPDEFINES = extra_cpp_defines)
+
+ # store this new object in the module dictionary
+ Modules[name] = self
+
+ # for each source drct to build, create a VariantDir
+ # to say where we want the object files to be built,
+ # and compute the list of source files to build
+ sources = []
+ for drct in Split(build_source_dirs):
+ DeclareBuildDir(drct)
+ sources += GlobSources(drct, build_source_pattern, excluded_files)
+
+ # add cherry-picked files
+ for drct in build_source_files.keys():
+ pattern = build_source_files[drct]
+ drct_path = source_root+'/'+drct
+ DeclareBuildDir(drct_path)
+ sources += GlobSources(drct_path, pattern)
+
+ # calculate our build include path
+ cpp_path = GetIncludeDirs(Split(self.build_include_dirs) + Split(build_source_dirs) + self.included_modules + self.linked_modules)
+
+ # the product is a library
+ self.env.AppendUnique(CPPPATH=cpp_path)
+ if shared is False:
+ self.product = self.env.Library(target=name, source=sources)
+ else:
+ libs = GetLibraries(Split(linked_modules))
+ self.product = self.env.SharedLibrary(target=name, LIBS=libs, source=sources)
+ self.env.Alias(name, self.product)
+
+ # copy to Targets folder
+ if install is True:
+ inst = env.Install(dir=env.GetBuildPath('#/Targets/'+env['target']+'/'+env['build_config']), source=self.product)
+ if env['build_config'] == 'Release' and env.has_key('STRIP'):
+ env.AddPostAction(inst, env['STRIP']+' $TARGETS');
+
+def Application(name, dir, deps, install = False):
+ DeclareBuildDir(dir)
+ libs = GetLibraries(deps)
+ cpp_path = GetIncludeDirs(deps)
+
+ prog = env.Program(name,
+ GlobSources(dir, ['*.c', '*.cpp']) + env['NPT_EXTRA_EXECUTABLE_OBJECTS'],
+ LIBS=libs, CPPPATH=cpp_path)
+ #env.Alias(name, prog)
+ if env.has_key('NPT_EXECUTABLE_POST_PROCESSOR'):
+ env.AddPostAction(prog, env['NPT_EXECUTABLE_POST_PROCESSOR'])
+
+ # copy to Targets folder
+ if install is True:
+ inst = env.Install(dir=env.GetBuildPath('#/Targets/'+env['target']+'/'+env['build_config']), source=prog)
+ if env['build_config'] == 'Release' and env.has_key('STRIP'):
+ env.AddPostAction(inst, env['STRIP']+' $TARGETS');
+
+#######################################################
+# Main Build
+#######################################################
+Import("env")
+
+### defaults
+env['NPT_EXTRA_LIBS'] = []
+env['NPT_EXTRA_EXECUTABLE_OBJECTS'] = []
+
+if (env['build_config'] == 'Debug'):
+ env.AppendUnique(CPPDEFINES=['NPT_DEBUG', 'NPT_CONFIG_ENABLE_LOGGING', 'PLATINUM_UPNP_SPECS_STRICT'])
+else:
+ env.AppendUnique(CPPDEFINES=['NDEBUG', 'NPT_CONFIG_ENABLE_LOGGING', 'PLATINUM_UPNP_SPECS_STRICT'])
+
+### try to read in any target specific configuration
+target_config_file = env.GetBuildPath('#/Build/Targets/'+env['target']+'/Config.scons')
+if os.path.exists(target_config_file):
+ # Load the target-specific config file
+ execfile(target_config_file)
+
+#######################################################
+# modules
+#
+# Usage:
+#
+# The LibraryModule() function declares a code module
+# The included_modules parameter is a list of all the modules and/or directories
+# that will be added to the include path when building this module AND to
+# the include path of any other module that depends on this one.
+# The linked_modules parameter is a list of all the modules and/or directories
+# that are necessary to build this module. These modules will be added to
+# the include path of this module, but not to that of the modules that depend
+# on this module. The modules that depend on this module, however, will
+# automatically link with the linked_modules.
+# Note that the included_modules list is automatically added to the
+# linked_modules list, so that you do not need to list in linked_modules
+# the modules that are already listed in included_modules.
+# If a module needs to export an include path to its dependents that
+# is not a module that the dependent can link with (ex: an include dir),
+# list it in the included_only_modules.
+# To summarize: included_modules should list all the modules that users
+# of the public interface should depend on; linked_modules should list
+# all the modules not listed in included_modules that are used by the
+# module's implementation only.
+#######################################################
+# Neptune
+NPT_SOURCE_ROOT = 'ThirdParty/Neptune'
+
+extra_cpp_flags = []
+neptune_extra_linked_modules = []
+if not env.has_key('NPT_CONFIG_NO_ZIP'):
+ extra_cpp_flags = ['NPT_CONFIG_ENABLE_ZIP']
+ neptune_extra_linked_modules += ['Zlib']
+
+ LibraryModule(name = 'Zlib',
+ source_root = NPT_SOURCE_ROOT,
+ build_source_dirs = ['ThirdParty/zlib-1.2.3'])
+
+if not env.has_key('NPT_CONFIG_NO_SSL'):
+ extra_cpp_flags += ['NPT_CONFIG_ENABLE_TLS']
+ tls_data_dirs = ['Data/TLS']
+ tls_tests = ['Tls1']
+ neptune_extra_linked_modules += ['axTLS']
+
+ LibraryModule(name = 'axTLS',
+ source_root = NPT_SOURCE_ROOT,
+ build_source_dirs = ['ThirdParty/axTLS/crypto', 'ThirdParty/axTLS/ssl', 'ThirdParty/axTLS/config/Generic'])
+else:
+ tls_data_dirs = []
+ tls_tests = []
+
+if not env.has_key('NPT_CONFIG_NO_CRYPTO'):
+ extra_cpp_flags += ['NPT_CONFIG_ENABLE_CRYPTO']
+ neptune_excluded_files = []
+else:
+ neptune_excluded_files = ['NptCrypto.cpp', 'NptDigest.cpp']
+
+LibraryModule(name = 'Neptune',
+ build_source_dirs = ['Core']+tls_data_dirs,
+ build_source_files = env['NPT_SYSTEM_SOURCES'],
+ excluded_files = neptune_excluded_files,
+ extra_cpp_defines = extra_cpp_flags,
+ linked_modules = env['NPT_EXTRA_LIBS']+neptune_extra_linked_modules,
+ source_root = NPT_SOURCE_ROOT + '/Source')
+
+# Platinum
+LibraryModule(name = 'Platinum',
+ build_source_dirs = ['Core', 'Extras'],
+ build_include_dirs = ['Source/Platinum'],
+ extra_cpp_defines = extra_cpp_flags,
+ included_modules = ['Neptune'])
+
+# Platinum MediaServer
+LibraryModule(name = 'PltMediaServer',
+ build_source_dirs = ['MediaServer'],
+ included_modules = ['Platinum'],
+ source_root = 'Source/Devices')
+
+# Platinum MediaRenderer
+LibraryModule(name = 'PltMediaRenderer',
+ build_source_dirs = ['MediaRenderer'],
+ included_modules = ['Platinum', 'PltMediaServer'],
+ source_root = 'Source/Devices')
+
+# Platinum MediaConnect
+LibraryModule(name = 'PltMediaConnect',
+ build_source_dirs = ['MediaConnect'],
+ included_modules = ['Platinum', 'PltMediaServer', 'PltMediaRenderer'],
+ excluded_files = ['MACFromIP.cpp'],
+ source_root = 'Source/Devices')
+
+for app in ['MicroMediaController', 'MediaCrawler', 'MediaConnect', 'FrameStreamer']:
+ Application(name = app,
+ dir = 'Source/Apps/' + app,
+ deps = ['Platinum', 'PltMediaServer', 'PltMediaRenderer', 'PltMediaConnect'],
+ install = True)
+
+for test in ['FileMediaServer', 'MediaRenderer', 'LightSample', 'Http', 'Time']:
+ Application(name = test+'Test',
+ dir = 'Source/Tests/' + test,
+ deps = ['Platinum', 'PltMediaServer', 'PltMediaRenderer', 'PltMediaConnect'],
+ install = True)
+
+for tool in ['TextToHeader']:
+ Application(name = tool,
+ dir = 'Source/Tools/' + tool,
+ deps = ['Platinum'],
+ install = True)
diff --git a/lib/libUPnP/Platinum/Build/Targets/arm-android-linux/Config.scons b/lib/libUPnP/Platinum/Build/Targets/arm-android-linux/Config.scons
new file mode 100644
index 0000000..bdbf08d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/arm-android-linux/Config.scons
@@ -0,0 +1,107 @@
+#################################################################
+# Important: this build file has been tested with Android NDK r6, r7 and r8
+# It may or may not work with other releases of the NDK. Please notify
+# us if you find a newer NDK for which this does not work.
+#################################################################
+
+import os
+import re
+import sys
+import platform
+
+# we need to know when the NDK is
+ANDROID_NDK_ROOT=os.getenv('ANDROID_NDK_ROOT')
+if not ANDROID_NDK_ROOT:
+ raise Exception('ANDROID_NDK_ROOT environment variable not set')
+
+# detect the host system on which we're running
+if env.has_key('android_host_system') and env['android_host_system']:
+ ANDROID_HOST_SYSTEM = env['android_host_system']
+else:
+ PLATFORM_TO_TARGET_MAP = {
+ 'linux-i386' : 'linux-x86',
+ 'linux2' : 'linux-x86',
+ 'win32' : 'windows',
+ 'cygwin' : 'windows',
+ 'darwin' : 'darwin-x86'
+ }
+ if sys.platform in PLATFORM_TO_TARGET_MAP:
+ ANDROID_HOST_SYSTEM = PLATFORM_TO_TARGET_MAP[sys.platform]
+ else:
+ raise Exception('Android Host Platform cannot be determined')
+
+# set defaults
+ANDROID_ARCH = 'arm'
+ANDROID_PLATFORM = 'android-9'
+ANDROID_TOOLCHAIN = 'arm-linux-androideabi-4.4.3'
+ANDROID_CROSS_PREFIX = 'arm-linux-androideabi'
+
+if not os.path.exists(os.path.join(ANDROID_NDK_ROOT, 'toolchains', ANDROID_TOOLCHAIN)):
+ toolchain_dirs = os.listdir(ANDROID_NDK_ROOT+'/toolchains')
+ for toolchain_dir in toolchain_dirs:
+ if os.path.exists(os.path.join(ANDROID_NDK_ROOT, 'toolchains', toolchain_dir, 'prebuilt', ANDROID_HOST_SYSTEM)):
+ ANDROID_TOOLCHAIN=toolchain_dir
+ suffix_pos = toolchain_dir.rfind('-')
+ if (suffix_pos >= 0):
+ ANDROID_CROSS_PREFIX = ANDROID_TOOLCHAIN[:suffix_pos]
+ print "Auto-selecting toolchain:", ANDROID_TOOLCHAIN
+ break
+
+# override defaults from command line args
+if ARGUMENTS.get('android_toolchain'):
+ ANDROID_TOOLCHAIN=ARGUMENTS.get('android_toolchain')
+
+if ARGUMENTS.get('android_cross_prefix'):
+ ANDROID_CROSS_PREFIX=ARGUMENTS.get('android_cross_prefix')
+
+if ARGUMENTS.get('android_platform'):
+ ANDROID_PLATFORM=ARGUMENTS.get('android_platform')
+
+if ARGUMENTS.get('android_arch'):
+ ANDROID_ARCH=ARGUMENTS.get('android_arch')
+
+print 'Building for Android: '
+print 'ANDROID_HOST_SYSTEM =', ANDROID_HOST_SYSTEM
+print 'ANDROID_TOOLCHAIN =', ANDROID_TOOLCHAIN
+print 'ANDROID_PLATFORM =', ANDROID_PLATFORM
+print 'ANDROID_ARCH =', ANDROID_ARCH
+
+ANDROID_TOOLCHAIN_BIN = ANDROID_NDK_ROOT+'/toolchains/'+ANDROID_TOOLCHAIN+'/prebuilt/'+ANDROID_HOST_SYSTEM+'/bin'
+ANDROID_SYSROOT = ANDROID_NDK_ROOT+'/platforms/'+ANDROID_PLATFORM+'/arch-'+ANDROID_ARCH
+
+### add the tools to the path
+env.PrependENVPath('PATH', ANDROID_TOOLCHAIN_BIN)
+
+### special C Runtime startup for executables
+env['NPT_EXTRA_EXECUTABLE_OBJECTS'] = []
+env['NPT_EXTRA_LIBS'] = ['gcc']
+
+### Load the tools
+LoadTool('gcc-generic', env, gcc_cross_prefix=ANDROID_CROSS_PREFIX, gcc_strict=False)
+env.AppendUnique(CCFLAGS = ['-I'+ANDROID_NDK_ROOT+'/sources/cxx-stl/system/include' ,
+ '--sysroot', ANDROID_SYSROOT,
+ '-msoft-float',
+ '-fpic',
+ '-mthumb-interwork',
+ '-ffunction-sections',
+ '-funwind-tables',
+ '-fstack-protector',
+ '-fno-short-enums'])
+env.AppendUnique(CXXFLAGS = ['-fno-exceptions', '-fno-rtti'])
+env.AppendUnique(CPPDEFINES = ['ANDROID', 'NPT_CONFIG_HAVE_SYSTEM_LOG_CONFIG'])
+env.AppendUnique(LINKFLAGS = ['--sysroot', ANDROID_SYSROOT,
+ '-Wl,--no-undefined',
+ '-Wl,-z,noexecstack',
+ '-L'+ANDROID_SYSROOT+'/usr/lib',
+ '-lc',
+ '-lstdc++',
+ '-lm',
+ '-llog',
+ '-ldl'])
+
+### Specific System choices
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'NptStdc[!D]*.cpp',
+ 'System/Bsd':'*.cpp',
+ 'System/Posix':'*.cpp',
+ 'System/Null':['NptNullSerialPort.cpp', 'NptNullAutoreleasePool.cpp'],
+ 'System/Android':'*.cpp'}
diff --git a/lib/libUPnP/Platinum/Build/Targets/arm-gp2x-linux/Config.scons b/lib/libUPnP/Platinum/Build/Targets/arm-gp2x-linux/Config.scons
new file mode 100644
index 0000000..0d6a316
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/arm-gp2x-linux/Config.scons
@@ -0,0 +1,9 @@
+LoadTool('gcc-generic', env, gcc_cross_prefix='arm-linux')
+
+## change exec suffix
+env['PROGSUFFIX'] = '.gpe'
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Bsd':'*.cpp', 'System/Posix':'*.cpp', 'System/Null':'NptNullAutoreleasePool.cpp'}
+env['NPT_EXTRA_LIBS']=['pthread']
+
diff --git a/lib/libUPnP/Platinum/Build/Targets/arm-unknown-linux/Config.scons b/lib/libUPnP/Platinum/Build/Targets/arm-unknown-linux/Config.scons
new file mode 100644
index 0000000..8e9c4f1
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/arm-unknown-linux/Config.scons
@@ -0,0 +1,7 @@
+LoadTool('gcc-generic', env, gcc_cross_prefix='arm-linux')
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Bsd':'*.cpp', 'System/Posix':'*.cpp', 'System/Null':'NptNullAutoreleasePool.cpp'}
+env['NPT_EXTRA_LIBS']=['pthread']
+
+env['STRIP'] = ''
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser-Info.plist b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser-Info.plist
new file mode 100755
index 0000000..491ea7a
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser-Info.plist
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.plutinosoft.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>NSMainNibFile</key>
+ <string>MainWindow</string>
+</dict>
+</plist>
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser.xcodeproj/project.pbxproj b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser.xcodeproj/project.pbxproj
new file mode 100755
index 0000000..91299b9
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser.xcodeproj/project.pbxproj
@@ -0,0 +1,316 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; };
+ E445E63C144997E800F221B3 /* README in Resources */ = {isa = PBXBuildFile; fileRef = E445E63B144997E800F221B3 /* README */; };
+ E4A7DC061085A49400E6ADE2 /* CocoaTouchBrowserAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DC021085A49400E6ADE2 /* CocoaTouchBrowserAppDelegate.m */; };
+ E4A7DC071085A49400E6ADE2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DC031085A49400E6ADE2 /* main.m */; };
+ E4A7DC081085A49400E6ADE2 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DC051085A49400E6ADE2 /* RootViewController.m */; };
+ E4A7DC0B1085A4B300E6ADE2 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = E4A7DC091085A4B300E6ADE2 /* MainWindow.xib */; };
+ E4A7DC0C1085A4B300E6ADE2 /* RootViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E4A7DC0A1085A4B300E6ADE2 /* RootViewController.xib */; };
+ E4A7DCF31085AC7000E6ADE2 /* MediaBrowserWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DCF21085AC7000E6ADE2 /* MediaBrowserWrapper.mm */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 1D6058910D05DD3D006BFB54 /* CocoaTouchBrowser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CocoaTouchBrowser.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 28A0AAE50D9B0CCF005BE974 /* CocoaTouchBrowser_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoaTouchBrowser_Prefix.pch; sourceTree = "<group>"; };
+ 8D1107310486CEB800E47090 /* CocoaTouchBrowser-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CocoaTouchBrowser-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
+ E445E63B144997E800F221B3 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
+ E4A7DC011085A49400E6ADE2 /* CocoaTouchBrowserAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CocoaTouchBrowserAppDelegate.h; path = ../../../../Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.h; sourceTree = SOURCE_ROOT; };
+ E4A7DC021085A49400E6ADE2 /* CocoaTouchBrowserAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CocoaTouchBrowserAppDelegate.m; path = ../../../../Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.m; sourceTree = SOURCE_ROOT; };
+ E4A7DC031085A49400E6ADE2 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ../../../../Source/Apps/CocoaTouchBrowser/main.m; sourceTree = SOURCE_ROOT; };
+ E4A7DC041085A49400E6ADE2 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RootViewController.h; path = ../../../../Source/Apps/CocoaTouchBrowser/RootViewController.h; sourceTree = SOURCE_ROOT; };
+ E4A7DC051085A49400E6ADE2 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RootViewController.m; path = ../../../../Source/Apps/CocoaTouchBrowser/RootViewController.m; sourceTree = SOURCE_ROOT; };
+ E4A7DC091085A4B300E6ADE2 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainWindow.xib; path = ../../../../Source/Apps/CocoaTouchBrowser/MainWindow.xib; sourceTree = SOURCE_ROOT; };
+ E4A7DC0A1085A4B300E6ADE2 /* RootViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = RootViewController.xib; path = ../../../../Source/Apps/CocoaTouchBrowser/RootViewController.xib; sourceTree = SOURCE_ROOT; };
+ E4A7DCF11085AC7000E6ADE2 /* MediaBrowserWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediaBrowserWrapper.h; path = ../../../../Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.h; sourceTree = SOURCE_ROOT; };
+ E4A7DCF21085AC7000E6ADE2 /* MediaBrowserWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MediaBrowserWrapper.mm; path = ../../../../Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.mm; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
+ 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 1D6058910D05DD3D006BFB54 /* CocoaTouchBrowser.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
+ isa = PBXGroup;
+ children = (
+ E4A7DC131085A4DB00E6ADE2 /* Classes */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = CustomTemplate;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ E4A7DC031085A49400E6ADE2 /* main.m */,
+ 28A0AAE50D9B0CCF005BE974 /* CocoaTouchBrowser_Prefix.pch */,
+ E445E63B144997E800F221B3 /* README */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ E4A7DC091085A4B300E6ADE2 /* MainWindow.xib */,
+ E4A7DC0A1085A4B300E6ADE2 /* RootViewController.xib */,
+ 8D1107310486CEB800E47090 /* CocoaTouchBrowser-Info.plist */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
+ 1D30AB110D05D00D00671497 /* Foundation.framework */,
+ 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ E4A7DC131085A4DB00E6ADE2 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ E4A7DCF11085AC7000E6ADE2 /* MediaBrowserWrapper.h */,
+ E4A7DCF21085AC7000E6ADE2 /* MediaBrowserWrapper.mm */,
+ E4A7DC011085A49400E6ADE2 /* CocoaTouchBrowserAppDelegate.h */,
+ E4A7DC021085A49400E6ADE2 /* CocoaTouchBrowserAppDelegate.m */,
+ E4A7DC041085A49400E6ADE2 /* RootViewController.h */,
+ E4A7DC051085A49400E6ADE2 /* RootViewController.m */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 1D6058900D05DD3D006BFB54 /* CocoaTouchBrowser */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CocoaTouchBrowser" */;
+ buildPhases = (
+ 1D60588D0D05DD3D006BFB54 /* Resources */,
+ 1D60588E0D05DD3D006BFB54 /* Sources */,
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = CocoaTouchBrowser;
+ productName = CocoaTouchBrowser;
+ productReference = 1D6058910D05DD3D006BFB54 /* CocoaTouchBrowser.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaTouchBrowser" */;
+ compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ en,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 1D6058900D05DD3D006BFB54 /* CocoaTouchBrowser */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 1D60588D0D05DD3D006BFB54 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E4A7DC0B1085A4B300E6ADE2 /* MainWindow.xib in Resources */,
+ E4A7DC0C1085A4B300E6ADE2 /* RootViewController.xib in Resources */,
+ E445E63C144997E800F221B3 /* README in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 1D60588E0D05DD3D006BFB54 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E4A7DC061085A49400E6ADE2 /* CocoaTouchBrowserAppDelegate.m in Sources */,
+ E4A7DC071085A49400E6ADE2 /* main.m in Sources */,
+ E4A7DC081085A49400E6ADE2 /* RootViewController.m in Sources */,
+ E4A7DCF31085AC7000E6ADE2 /* MediaBrowserWrapper.mm in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 1D6058940D05DD3E006BFB54 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = (
+ armv6,
+ armv7,
+ );
+ "ARCHS[sdk=iphonesimulator*]" = i386;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../Targets/universal-apple-ios/Debug\"",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = CocoaTouchBrowser_Prefix.pch;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvmgcc42;
+ INFOPLIST_FILE = "CocoaTouchBrowser-Info.plist";
+ OTHER_LDFLAGS = (
+ "-all_load",
+ "-ObjC",
+ "-framework",
+ Platinum,
+ );
+ PREBINDING = "";
+ PRODUCT_NAME = CocoaTouchBrowser;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALID_ARCHS = "i386 armv6 armv7";
+ };
+ name = Debug;
+ };
+ 1D6058950D05DD3E006BFB54 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = (
+ armv6,
+ armv7,
+ );
+ "ARCHS[sdk=iphonesimulator*]" = i386;
+ COPY_PHASE_STRIP = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../Targets/universal-apple-ios/Release\"",
+ );
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = CocoaTouchBrowser_Prefix.pch;
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_VERSION = com.apple.compilers.llvmgcc42;
+ INFOPLIST_FILE = "CocoaTouchBrowser-Info.plist";
+ OTHER_LDFLAGS = (
+ "-all_load",
+ "-ObjC",
+ "-framework",
+ Platinum,
+ );
+ PREBINDING = "";
+ PRODUCT_NAME = CocoaTouchBrowser;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ VALID_ARCHS = "i386 armv6 armv7";
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CODE_SIGN_IDENTITY = "Don't Code Sign";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Sylvain Rebaud (932JA7U7P9)";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_VERSION = 4.2;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ PROVISIONING_PROFILE = "";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "5C4C1752-A4F3-4DEF-9250-B6A4DBB099B5";
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CODE_SIGN_IDENTITY = "Don't Code Sign";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Sylvain Rebaud (932JA7U7P9)";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_VERSION = 4.2;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ PROVISIONING_PROFILE = "";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "5C4C1752-A4F3-4DEF-9250-B6A4DBB099B5";
+ SDKROOT = iphoneos;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CocoaTouchBrowser" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1D6058940D05DD3E006BFB54 /* Debug */,
+ 1D6058950D05DD3E006BFB54 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CocoaTouchBrowser" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser_Prefix.pch b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser_Prefix.pch
new file mode 100755
index 0000000..d59fade
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/CocoaTouchBrowser_Prefix.pch
@@ -0,0 +1,9 @@
+//
+// Prefix header for all source files of the 'CocoaTouchBrowser' target in the 'CocoaTouchBrowser' project
+//
+#import <Availability.h>
+
+#ifdef __OBJC__
+ #import <Foundation/Foundation.h>
+ #import <UIKit/UIKit.h>
+#endif
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/README b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/README
new file mode 100644
index 0000000..1da55e2
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/CocoaTouchBrowser/README
@@ -0,0 +1,5 @@
+Run the target Platinum-iPhone-Framework-Universal of Platinum.xcodeproj project to build the Platinum framework which this sample needs.
+The framework will end up in Targets/universal-apple-iphoneos/Debug (or Release)
+
+Alternatively you can use scons :
+> scons build_config=Debug target=universal-apple-macosx-xcode \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/MobileMediaServer-Info.plist b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/MobileMediaServer-Info.plist
new file mode 100644
index 0000000..b0de486
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/MobileMediaServer-Info.plist
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.plutinosoft.$(PRODUCT_NAME:rfc1034identifier)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+ <key>UIMainStoryboardFile</key>
+ <string>Main</string>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/project.pbxproj b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..bebf72e
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/project.pbxproj
@@ -0,0 +1,3653 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ E42D3B040FDC890A0045379C /* Apps */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = E42D3B170FDC894C0045379C /* Build configuration list for PBXAggregateTarget "Apps" */;
+ buildPhases = (
+ );
+ dependencies = (
+ E42D3B080FDC890F0045379C /* PBXTargetDependency */,
+ E42D3B0A0FDC890F0045379C /* PBXTargetDependency */,
+ E42D3B0C0FDC890F0045379C /* PBXTargetDependency */,
+ E42D3B0E0FDC890F0045379C /* PBXTargetDependency */,
+ );
+ name = Apps;
+ productName = Apps;
+ };
+ E42D3B640FDC8A120045379C /* Tests */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = E42D3B910FDC8AC10045379C /* Build configuration list for PBXAggregateTarget "Tests" */;
+ buildPhases = (
+ );
+ dependencies = (
+ E42D3B680FDC8A180045379C /* PBXTargetDependency */,
+ E44470C112C31C1100E01480 /* PBXTargetDependency */,
+ E42D3B6A0FDC8A180045379C /* PBXTargetDependency */,
+ E42D3B6C0FDC8A180045379C /* PBXTargetDependency */,
+ E42D3B6E0FDC8A180045379C /* PBXTargetDependency */,
+ E42D3B700FDC8A180045379C /* PBXTargetDependency */,
+ );
+ name = Tests;
+ productName = Tests;
+ };
+ E42D3B730FDC8A210045379C /* All */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = E42D3B920FDC8AC10045379C /* Build configuration list for PBXAggregateTarget "All" */;
+ buildPhases = (
+ );
+ dependencies = (
+ E44E2BD91AE775600092347B /* PBXTargetDependency */,
+ E42D3B770FDC8A290045379C /* PBXTargetDependency */,
+ E42D3B790FDC8A290045379C /* PBXTargetDependency */,
+ E459CC2811F82C7F00621896 /* PBXTargetDependency */,
+ );
+ name = All;
+ productName = All;
+ };
+ E44E2BD01AE775510092347B /* Frameworks */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = E44E2BD11AE775510092347B /* Build configuration list for PBXAggregateTarget "Frameworks" */;
+ buildPhases = (
+ );
+ dependencies = (
+ E44E2BD51AE7755C0092347B /* PBXTargetDependency */,
+ E44E2BD71AE7755C0092347B /* PBXTargetDependency */,
+ );
+ name = Frameworks;
+ productName = Frameworks;
+ };
+ E459CC2111F82C3F00621896 /* Help */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = E459CC2411F82C5E00621896 /* Build configuration list for PBXAggregateTarget "Help" */;
+ buildPhases = (
+ E459CC2011F82C3F00621896 /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = Help;
+ productName = Help;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ E410161A1ACFA761000E994F /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = E41016181ACFA761000E994F /* LaunchScreen.xib */; };
+ E410161B1ACFA761000E994F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E41016191ACFA761000E994F /* Main.storyboard */; };
+ E41016261ACFA826000E994F /* Platinum.h in Headers */ = {isa = PBXBuildFile; fileRef = E41016251ACFA826000E994F /* Platinum.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016381ACFA826000E994F /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41016211ACFA826000E994F /* Platinum.framework */; };
+ E41016391ACFA826000E994F /* Platinum.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E41016211ACFA826000E994F /* Platinum.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ E41016411ACFA858000E994F /* PltAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43154FE0D6FFDEB00899579 /* PltAction.cpp */; };
+ E41016421ACFA858000E994F /* PltAction.h in Headers */ = {isa = PBXBuildFile; fileRef = E43154FF0D6FFDEB00899579 /* PltAction.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016431ACFA858000E994F /* PltArgument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155000D6FFDEB00899579 /* PltArgument.cpp */; };
+ E41016441ACFA858000E994F /* PltArgument.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155010D6FFDEB00899579 /* PltArgument.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016451ACFA858000E994F /* PltConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4BA7CBC0FE2200700A4D16B /* PltConstants.cpp */; };
+ E41016461ACFA858000E994F /* PltConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = E4BA7CBB0FE2200700A4D16B /* PltConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016471ACFA858000E994F /* PltCtrlPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155020D6FFDEB00899579 /* PltCtrlPoint.cpp */; };
+ E41016481ACFA858000E994F /* PltCtrlPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155030D6FFDEB00899579 /* PltCtrlPoint.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016491ACFA858000E994F /* PltCtrlPointTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155040D6FFDEB00899579 /* PltCtrlPointTask.cpp */; };
+ E410164A1ACFA858000E994F /* PltCtrlPointTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155050D6FFDEB00899579 /* PltCtrlPointTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410164B1ACFA858000E994F /* PltDatagramStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155060D6FFDEB00899579 /* PltDatagramStream.cpp */; };
+ E410164C1ACFA858000E994F /* PltDatagramStream.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155070D6FFDEB00899579 /* PltDatagramStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410164D1ACFA858000E994F /* PltDeviceData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155080D6FFDEB00899579 /* PltDeviceData.cpp */; };
+ E410164E1ACFA858000E994F /* PltDeviceData.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155090D6FFDEB00899579 /* PltDeviceData.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410164F1ACFA858000E994F /* PltDeviceHost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431550A0D6FFDEB00899579 /* PltDeviceHost.cpp */; };
+ E41016501ACFA858000E994F /* PltDeviceHost.h in Headers */ = {isa = PBXBuildFile; fileRef = E431550B0D6FFDEB00899579 /* PltDeviceHost.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016511ACFA858000E994F /* PltEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431550E0D6FFDEB00899579 /* PltEvent.cpp */; };
+ E41016521ACFA858000E994F /* PltEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = E431550F0D6FFDEB00899579 /* PltEvent.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016531ACFA858000E994F /* PltHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155100D6FFDEB00899579 /* PltHttp.cpp */; };
+ E41016541ACFA858000E994F /* PltHttp.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155110D6FFDEB00899579 /* PltHttp.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016551ACFA858000E994F /* PltHttpClientTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155120D6FFDEB00899579 /* PltHttpClientTask.cpp */; };
+ E41016561ACFA858000E994F /* PltHttpClientTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155130D6FFDEB00899579 /* PltHttpClientTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016571ACFA858000E994F /* PltHttpServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155140D6FFDEB00899579 /* PltHttpServer.cpp */; };
+ E41016581ACFA858000E994F /* PltHttpServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155150D6FFDEB00899579 /* PltHttpServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016591ACFA858000E994F /* PltHttpServerTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155170D6FFDEB00899579 /* PltHttpServerTask.cpp */; };
+ E410165A1ACFA858000E994F /* PltHttpServerTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155180D6FFDEB00899579 /* PltHttpServerTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410165B1ACFA858000E994F /* PltIconsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4F7E9060FE4B12A00BEDFA6 /* PltIconsData.cpp */; };
+ E410165C1ACFA858000E994F /* PltMimeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E48D4DA613B51CB600359E06 /* PltMimeType.cpp */; };
+ E410165D1ACFA858000E994F /* PltMimeType.h in Headers */ = {isa = PBXBuildFile; fileRef = E48D4DA713B51CB600359E06 /* PltMimeType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410165E1ACFA858000E994F /* PltProtocolInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E48D4D8F13B51BAC00359E06 /* PltProtocolInfo.cpp */; };
+ E410165F1ACFA858000E994F /* PltProtocolInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E48D4D9013B51BAC00359E06 /* PltProtocolInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016601ACFA858000E994F /* PltService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155210D6FFDEB00899579 /* PltService.cpp */; };
+ E41016611ACFA858000E994F /* PltService.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155220D6FFDEB00899579 /* PltService.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016621ACFA858000E994F /* PltSsdp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155230D6FFDEB00899579 /* PltSsdp.cpp */; };
+ E41016631ACFA858000E994F /* PltSsdp.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155240D6FFDEB00899579 /* PltSsdp.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016641ACFA858000E994F /* PltStateVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155260D6FFDEB00899579 /* PltStateVariable.cpp */; };
+ E41016651ACFA858000E994F /* PltStateVariable.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155270D6FFDEB00899579 /* PltStateVariable.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016661ACFA858000E994F /* PltTaskManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431552A0D6FFDEB00899579 /* PltTaskManager.cpp */; };
+ E41016671ACFA858000E994F /* PltTaskManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E431552B0D6FFDEB00899579 /* PltTaskManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016681ACFA858000E994F /* PltThreadTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431552C0D6FFDEB00899579 /* PltThreadTask.cpp */; };
+ E41016691ACFA858000E994F /* PltThreadTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E431552D0D6FFDEB00899579 /* PltThreadTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410166A1ACFA858000E994F /* PltUPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431552E0D6FFDEB00899579 /* PltUPnP.cpp */; };
+ E410166B1ACFA858000E994F /* PltUPnP.h in Headers */ = {isa = PBXBuildFile; fileRef = E431552F0D6FFDEB00899579 /* PltUPnP.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410166C1ACFA858000E994F /* PltUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155320D6FFDEB00899579 /* PltUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410166D1ACFA887000E994F /* PltXbox360.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E426B3271130DF9500C58542 /* PltXbox360.cpp */; };
+ E410166E1ACFA887000E994F /* PltXbox360.h in Headers */ = {isa = PBXBuildFile; fileRef = E426B3281130DF9500C58542 /* PltXbox360.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410166F1ACFA887000E994F /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB7F108596C800E6ADE2 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; };
+ E41016701ACFA887000E994F /* PltMediaConnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155960D6FFE4C00899579 /* PltMediaConnect.cpp */; };
+ E41016711ACFA887000E994F /* PltMediaConnect.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155970D6FFE4C00899579 /* PltMediaConnect.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016721ACFA893000E994F /* AVTransportSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB76108596B900E6ADE2 /* AVTransportSCPD.cpp */; };
+ E41016731ACFA893000E994F /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB77108596B900E6ADE2 /* RdrConnectionManagerSCPD.cpp */; };
+ E41016741ACFA893000E994F /* RenderingControlSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB78108596B900E6ADE2 /* RenderingControlSCPD.cpp */; };
+ E41016751ACFA893000E994F /* PltMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431559D0D6FFE4C00899579 /* PltMediaController.cpp */; };
+ E41016761ACFA893000E994F /* PltMediaController.h in Headers */ = {isa = PBXBuildFile; fileRef = E431559E0D6FFE4C00899579 /* PltMediaController.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016771ACFA893000E994F /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155A00D6FFE4C00899579 /* PltMediaRenderer.cpp */; };
+ E41016781ACFA893000E994F /* PltMediaRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155A10D6FFE4C00899579 /* PltMediaRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016791ACFA8A1000E994F /* ContentDirectorySCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E402C7541297CECB00565B76 /* ContentDirectorySCPD.cpp */; };
+ E410167A1ACFA8A1000E994F /* ConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB82108596E400E6ADE2 /* ConnectionManagerSCPD.cpp */; };
+ E410167B1ACFA8A1000E994F /* ContentDirectorywSearchSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB83108596E400E6ADE2 /* ContentDirectorywSearchSCPD.cpp */; };
+ E410167C1ACFA8A1000E994F /* PltDidl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155A80D6FFE4C00899579 /* PltDidl.cpp */; };
+ E410167D1ACFA8A1000E994F /* PltDidl.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155A90D6FFE4C00899579 /* PltDidl.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410167E1ACFA8A1000E994F /* PltFileMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155AA0D6FFE4C00899579 /* PltFileMediaServer.cpp */; };
+ E410167F1ACFA8A1000E994F /* PltFileMediaServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155AB0D6FFE4C00899579 /* PltFileMediaServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016801ACFA8A1000E994F /* PltMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155AC0D6FFE4C00899579 /* PltMediaBrowser.cpp */; };
+ E41016811ACFA8A1000E994F /* PltMediaBrowser.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155AD0D6FFE4C00899579 /* PltMediaBrowser.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016821ACFA8A1000E994F /* PltMediaCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155AF0D6FFE4C00899579 /* PltMediaCache.cpp */; };
+ E41016831ACFA8A1000E994F /* PltMediaCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155B00D6FFE4C00899579 /* PltMediaCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016841ACFA8A1000E994F /* PltMediaItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155B10D6FFE4C00899579 /* PltMediaItem.cpp */; };
+ E41016851ACFA8A1000E994F /* PltMediaItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155B20D6FFE4C00899579 /* PltMediaItem.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016861ACFA8A1000E994F /* PltMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155B50D6FFE4C00899579 /* PltMediaServer.cpp */; };
+ E41016871ACFA8A1000E994F /* PltMediaServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155B60D6FFE4C00899579 /* PltMediaServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016881ACFA8A1000E994F /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155B80D6FFE4C00899579 /* PltSyncMediaBrowser.cpp */; };
+ E41016891ACFA8A1000E994F /* PltSyncMediaBrowser.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155B90D6FFE4C00899579 /* PltSyncMediaBrowser.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410168A1ACFA8B9000E994F /* PltMediaServerObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E4374C1512417AA800000109 /* PltMediaServerObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410168B1ACFA8B9000E994F /* PltMediaServerObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4374C1612417AA800000109 /* PltMediaServerObject.mm */; };
+ E410168C1ACFA8B9000E994F /* PltUPnPObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E4374C1712417AA800000109 /* PltUPnPObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410168D1ACFA8B9000E994F /* PltUPnPObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4374C1812417AA800000109 /* PltUPnPObject.mm */; };
+ E410168E1ACFA8B9000E994F /* PltDownloader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69E211E6F0D90024CAD4 /* PltDownloader.cpp */; };
+ E410168F1ACFA8B9000E994F /* PltDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69E311E6F0D90024CAD4 /* PltDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016901ACFA8B9000E994F /* PltStreamPump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69E411E6F0D90024CAD4 /* PltStreamPump.cpp */; };
+ E41016911ACFA8B9000E994F /* PltStreamPump.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69E511E6F0D90024CAD4 /* PltStreamPump.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016921ACFA8B9000E994F /* PltFrameBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C699E11E6ED710024CAD4 /* PltFrameBuffer.cpp */; };
+ E41016931ACFA8B9000E994F /* PltFrameBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C699F11E6ED710024CAD4 /* PltFrameBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016941ACFA8B9000E994F /* PltFrameServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A011E6ED710024CAD4 /* PltFrameServer.cpp */; };
+ E41016951ACFA8B9000E994F /* PltFrameServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A111E6ED710024CAD4 /* PltFrameServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016961ACFA8B9000E994F /* PltFrameStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A211E6ED710024CAD4 /* PltFrameStream.cpp */; };
+ E41016971ACFA8B9000E994F /* PltFrameStream.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A311E6ED710024CAD4 /* PltFrameStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E41016981ACFA8B9000E994F /* PltLeaks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A411E6ED710024CAD4 /* PltLeaks.cpp */; };
+ E41016991ACFA8B9000E994F /* PltLeaks.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A511E6ED710024CAD4 /* PltLeaks.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410169A1ACFA8B9000E994F /* PltMetadataHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A611E6ED710024CAD4 /* PltMetadataHandler.cpp */; };
+ E410169B1ACFA8B9000E994F /* PltMetadataHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A711E6ED710024CAD4 /* PltMetadataHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410169C1ACFA8B9000E994F /* PltRingBufferStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A811E6ED710024CAD4 /* PltRingBufferStream.cpp */; };
+ E410169D1ACFA8B9000E994F /* PltRingBufferStream.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A911E6ED710024CAD4 /* PltRingBufferStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E410169F1ACFA8CC000E994F /* PltVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = E43EEEFF101E1AEF007A9CE7 /* PltVersion.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E423F36918415DF900E24E39 /* SsdpTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E423F35A18415DA800E24E39 /* SsdpTest1.cpp */; };
+ E42D3AC40FDC87300045379C /* MediaCrawler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3A980FDC85E70045379C /* MediaCrawler.cpp */; };
+ E42D3AC50FDC87310045379C /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3A970FDC85E70045379C /* main.cpp */; };
+ E42D3B110FDC89200045379C /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3A950FDC85E70045379C /* main.cpp */; };
+ E42D3B120FDC89260045379C /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3A9C0FDC85E70045379C /* main.cpp */; };
+ E42D3B130FDC89270045379C /* PltMicroMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3A9D0FDC85E70045379C /* PltMicroMediaController.cpp */; };
+ E42D3B150FDC892B0045379C /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3A930FDC85E70045379C /* main.cpp */; };
+ E42D3B220FDC89690045379C /* FileMediaServerTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3AAB0FDC86A60045379C /* FileMediaServerTest.cpp */; };
+ E42D3B330FDC89990045379C /* HttpTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3AAD0FDC86A60045379C /* HttpTest.cpp */; };
+ E42D3B400FDC89C40045379C /* LightSampleTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3AB00FDC86A60045379C /* LightSampleTest.cpp */; };
+ E42D3B410FDC89C40045379C /* PltLightSample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3AB10FDC86A60045379C /* PltLightSample.cpp */; };
+ E42D3B4C0FDC89D90045379C /* MediaRendererTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3AB30FDC86A60045379C /* MediaRendererTest.cpp */; };
+ E42D3B570FDC89ED0045379C /* SimpleTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3AB70FDC86A60045379C /* SimpleTest.cpp */; };
+ E42D3B580FDC89ED0045379C /* PltSimple.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42D3AB60FDC86A60045379C /* PltSimple.cpp */; };
+ E437424C123FFE9100000109 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E4374242123FFE9100000109 /* InfoPlist.strings */; };
+ E437424D123FFE9100000109 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = E4374244123FFE9100000109 /* MainMenu.xib */; };
+ E437424E123FFE9100000109 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4374246123FFE9100000109 /* main.mm */; };
+ E4374250123FFE9100000109 /* MediaServerCocoaTest_AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4374249123FFE9100000109 /* MediaServerCocoaTest_AppDelegate.mm */; };
+ E4374251123FFE9100000109 /* MediaServerCocoaTest_DataModel.xcdatamodel in Sources */ = {isa = PBXBuildFile; fileRef = E437424A123FFE9100000109 /* MediaServerCocoaTest_DataModel.xcdatamodel */; };
+ E43F6BC910F1B78400C97612 /* TimeTest1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43F6BC810F1B78400C97612 /* TimeTest1.cpp */; };
+ E4446FAB12C3168900E01480 /* MediaServerCocoaTestController.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4446FAA12C3168900E01480 /* MediaServerCocoaTestController.mm */; };
+ E44E2B251AE761220092347B /* PltMediaServerObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4374C1612417AA800000109 /* PltMediaServerObject.mm */; };
+ E44E2B261AE761220092347B /* PltFrameServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A011E6ED710024CAD4 /* PltFrameServer.cpp */; };
+ E44E2B271AE761220092347B /* PltRingBufferStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A811E6ED710024CAD4 /* PltRingBufferStream.cpp */; };
+ E44E2B281AE761220092347B /* PltHttp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155100D6FFDEB00899579 /* PltHttp.cpp */; };
+ E44E2B291AE761220092347B /* PltDeviceHost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431550A0D6FFDEB00899579 /* PltDeviceHost.cpp */; };
+ E44E2B2A1AE761220092347B /* PltMediaController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431559D0D6FFE4C00899579 /* PltMediaController.cpp */; };
+ E44E2B2B1AE761220092347B /* PltProtocolInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E48D4D8F13B51BAC00359E06 /* PltProtocolInfo.cpp */; };
+ E44E2B2C1AE761220092347B /* PltCtrlPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155020D6FFDEB00899579 /* PltCtrlPoint.cpp */; };
+ E44E2B2D1AE761220092347B /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB7F108596C800E6ADE2 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; };
+ E44E2B2E1AE761220092347B /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB77108596B900E6ADE2 /* RdrConnectionManagerSCPD.cpp */; };
+ E44E2B2F1AE761220092347B /* PltStreamPump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69E411E6F0D90024CAD4 /* PltStreamPump.cpp */; };
+ E44E2B301AE761220092347B /* RenderingControlSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB78108596B900E6ADE2 /* RenderingControlSCPD.cpp */; };
+ E44E2B311AE761220092347B /* PltMediaItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155B10D6FFE4C00899579 /* PltMediaItem.cpp */; };
+ E44E2B321AE761220092347B /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155A00D6FFE4C00899579 /* PltMediaRenderer.cpp */; };
+ E44E2B331AE761220092347B /* PltFileMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155AA0D6FFE4C00899579 /* PltFileMediaServer.cpp */; };
+ E44E2B341AE761220092347B /* PltDidl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155A80D6FFE4C00899579 /* PltDidl.cpp */; };
+ E44E2B351AE761220092347B /* PltDatagramStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155060D6FFDEB00899579 /* PltDatagramStream.cpp */; };
+ E44E2B361AE761220092347B /* PltThreadTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431552C0D6FFDEB00899579 /* PltThreadTask.cpp */; };
+ E44E2B371AE761220092347B /* PltCtrlPointTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155040D6FFDEB00899579 /* PltCtrlPointTask.cpp */; };
+ E44E2B381AE761220092347B /* PltFrameStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A211E6ED710024CAD4 /* PltFrameStream.cpp */; };
+ E44E2B391AE761220092347B /* ContentDirectorywSearchSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB83108596E400E6ADE2 /* ContentDirectorywSearchSCPD.cpp */; };
+ E44E2B3A1AE761220092347B /* PltMetadataHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A611E6ED710024CAD4 /* PltMetadataHandler.cpp */; };
+ E44E2B3B1AE761220092347B /* PltUPnP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431552E0D6FFDEB00899579 /* PltUPnP.cpp */; };
+ E44E2B3C1AE761220092347B /* PltEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431550E0D6FFDEB00899579 /* PltEvent.cpp */; };
+ E44E2B3D1AE761220092347B /* PltHttpServerTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155170D6FFDEB00899579 /* PltHttpServerTask.cpp */; };
+ E44E2B3E1AE761220092347B /* PltDownloader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69E211E6F0D90024CAD4 /* PltDownloader.cpp */; };
+ E44E2B3F1AE761220092347B /* PltHttpClientTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155120D6FFDEB00899579 /* PltHttpClientTask.cpp */; };
+ E44E2B401AE761220092347B /* PltMediaConnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155960D6FFE4C00899579 /* PltMediaConnect.cpp */; };
+ E44E2B411AE761220092347B /* PltMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155AC0D6FFE4C00899579 /* PltMediaBrowser.cpp */; };
+ E44E2B421AE761220092347B /* PltXbox360.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E426B3271130DF9500C58542 /* PltXbox360.cpp */; };
+ E44E2B431AE761220092347B /* AVTransportSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB76108596B900E6ADE2 /* AVTransportSCPD.cpp */; };
+ E44E2B441AE761220092347B /* PltLeaks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C69A411E6ED710024CAD4 /* PltLeaks.cpp */; };
+ E44E2B451AE761220092347B /* PltTaskManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E431552A0D6FFDEB00899579 /* PltTaskManager.cpp */; };
+ E44E2B461AE761220092347B /* PltMediaCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155AF0D6FFE4C00899579 /* PltMediaCache.cpp */; };
+ E44E2B471AE761220092347B /* PltAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43154FE0D6FFDEB00899579 /* PltAction.cpp */; };
+ E44E2B481AE761220092347B /* PltSsdp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155230D6FFDEB00899579 /* PltSsdp.cpp */; };
+ E44E2B491AE761220092347B /* PltIconsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4F7E9060FE4B12A00BEDFA6 /* PltIconsData.cpp */; };
+ E44E2B4A1AE761220092347B /* PltArgument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155000D6FFDEB00899579 /* PltArgument.cpp */; };
+ E44E2B4B1AE761220092347B /* PltFrameBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E40C699E11E6ED710024CAD4 /* PltFrameBuffer.cpp */; };
+ E44E2B4C1AE761220092347B /* PltHttpServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155140D6FFDEB00899579 /* PltHttpServer.cpp */; };
+ E44E2B4D1AE761220092347B /* PltStateVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155260D6FFDEB00899579 /* PltStateVariable.cpp */; };
+ E44E2B4E1AE761220092347B /* PltMediaServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155B50D6FFE4C00899579 /* PltMediaServer.cpp */; };
+ E44E2B4F1AE761220092347B /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155B80D6FFE4C00899579 /* PltSyncMediaBrowser.cpp */; };
+ E44E2B501AE761220092347B /* PltDeviceData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155080D6FFDEB00899579 /* PltDeviceData.cpp */; };
+ E44E2B511AE761220092347B /* PltConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4BA7CBC0FE2200700A4D16B /* PltConstants.cpp */; };
+ E44E2B521AE761220092347B /* ContentDirectorySCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E402C7541297CECB00565B76 /* ContentDirectorySCPD.cpp */; };
+ E44E2B531AE761220092347B /* PltUPnPObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4374C1812417AA800000109 /* PltUPnPObject.mm */; };
+ E44E2B541AE761220092347B /* PltService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43155210D6FFDEB00899579 /* PltService.cpp */; };
+ E44E2B551AE761220092347B /* PltMimeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E48D4DA613B51CB600359E06 /* PltMimeType.cpp */; };
+ E44E2B561AE761220092347B /* ConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A7DB82108596E400E6ADE2 /* ConnectionManagerSCPD.cpp */; };
+ E44E2B5A1AE761220092347B /* PltTaskManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E431552B0D6FFDEB00899579 /* PltTaskManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B5B1AE761220092347B /* PltDeviceHost.h in Headers */ = {isa = PBXBuildFile; fileRef = E431550B0D6FFDEB00899579 /* PltDeviceHost.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B5C1AE761220092347B /* PltLeaks.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A511E6ED710024CAD4 /* PltLeaks.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B5D1AE761220092347B /* PltHttpServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155150D6FFDEB00899579 /* PltHttpServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B5E1AE761220092347B /* PltMediaItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155B20D6FFE4C00899579 /* PltMediaItem.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B5F1AE761220092347B /* PltFrameBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C699F11E6ED710024CAD4 /* PltFrameBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B601AE761220092347B /* PltMediaBrowser.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155AD0D6FFE4C00899579 /* PltMediaBrowser.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B611AE761220092347B /* PltDatagramStream.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155070D6FFDEB00899579 /* PltDatagramStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B621AE761220092347B /* PltUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155320D6FFDEB00899579 /* PltUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B631AE761220092347B /* PltRingBufferStream.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A911E6ED710024CAD4 /* PltRingBufferStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B641AE761220092347B /* PltSsdp.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155240D6FFDEB00899579 /* PltSsdp.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B651AE761220092347B /* Platinum.h in Headers */ = {isa = PBXBuildFile; fileRef = E41016251ACFA826000E994F /* Platinum.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B661AE761220092347B /* PltConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = E4BA7CBB0FE2200700A4D16B /* PltConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B671AE761220092347B /* PltThreadTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E431552D0D6FFDEB00899579 /* PltThreadTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B681AE761220092347B /* PltUPnPObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E4374C1712417AA800000109 /* PltUPnPObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B691AE761220092347B /* PltProtocolInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E48D4D9013B51BAC00359E06 /* PltProtocolInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B6A1AE761220092347B /* PltCtrlPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155030D6FFDEB00899579 /* PltCtrlPoint.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B6B1AE761220092347B /* PltService.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155220D6FFDEB00899579 /* PltService.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B6C1AE761220092347B /* PltXbox360.h in Headers */ = {isa = PBXBuildFile; fileRef = E426B3281130DF9500C58542 /* PltXbox360.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B6D1AE761220092347B /* PltHttp.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155110D6FFDEB00899579 /* PltHttp.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B6E1AE761220092347B /* PltVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = E43EEEFF101E1AEF007A9CE7 /* PltVersion.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B6F1AE761220092347B /* PltMediaConnect.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155970D6FFE4C00899579 /* PltMediaConnect.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B701AE761220092347B /* PltHttpServerTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155180D6FFDEB00899579 /* PltHttpServerTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B711AE761220092347B /* PltMediaServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155B60D6FFE4C00899579 /* PltMediaServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B721AE761220092347B /* PltFileMediaServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155AB0D6FFE4C00899579 /* PltFileMediaServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B731AE761220092347B /* PltStreamPump.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69E511E6F0D90024CAD4 /* PltStreamPump.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B741AE761220092347B /* PltMediaCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155B00D6FFE4C00899579 /* PltMediaCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B751AE761220092347B /* PltFrameServer.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A111E6ED710024CAD4 /* PltFrameServer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B761AE761220092347B /* PltMediaRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155A10D6FFE4C00899579 /* PltMediaRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B771AE761220092347B /* PltArgument.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155010D6FFDEB00899579 /* PltArgument.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B781AE761220092347B /* PltHttpClientTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155130D6FFDEB00899579 /* PltHttpClientTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B791AE761220092347B /* PltSyncMediaBrowser.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155B90D6FFE4C00899579 /* PltSyncMediaBrowser.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B7A1AE761220092347B /* PltStateVariable.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155270D6FFDEB00899579 /* PltStateVariable.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B7B1AE761220092347B /* PltDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69E311E6F0D90024CAD4 /* PltDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B7C1AE761220092347B /* PltDidl.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155A90D6FFE4C00899579 /* PltDidl.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B7D1AE761220092347B /* PltUPnP.h in Headers */ = {isa = PBXBuildFile; fileRef = E431552F0D6FFDEB00899579 /* PltUPnP.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B7E1AE761220092347B /* PltCtrlPointTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155050D6FFDEB00899579 /* PltCtrlPointTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B7F1AE761220092347B /* PltMetadataHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A711E6ED710024CAD4 /* PltMetadataHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B801AE761220092347B /* PltAction.h in Headers */ = {isa = PBXBuildFile; fileRef = E43154FF0D6FFDEB00899579 /* PltAction.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B811AE761220092347B /* PltEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = E431550F0D6FFDEB00899579 /* PltEvent.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B821AE761220092347B /* PltMimeType.h in Headers */ = {isa = PBXBuildFile; fileRef = E48D4DA713B51CB600359E06 /* PltMimeType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B831AE761220092347B /* PltMediaServerObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E4374C1512417AA800000109 /* PltMediaServerObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B841AE761220092347B /* PltFrameStream.h in Headers */ = {isa = PBXBuildFile; fileRef = E40C69A311E6ED710024CAD4 /* PltFrameStream.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B851AE761220092347B /* PltMediaController.h in Headers */ = {isa = PBXBuildFile; fileRef = E431559E0D6FFE4C00899579 /* PltMediaController.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2B861AE761220092347B /* PltDeviceData.h in Headers */ = {isa = PBXBuildFile; fileRef = E43155090D6FFDEB00899579 /* PltDeviceData.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E44E2BC41AE76E0F0092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2BC51AE76E330092347B /* Platinum.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ E44E2BCB1AE76FF90092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BCC1AE770150092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E40616C01ADE5C9A008BDAEB /* Neptune.framework */; };
+ E44E2BCD1AE7701D0092347B /* Neptune.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E40616C01ADE5C9A008BDAEB /* Neptune.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ E44E2BCE1AE7702D0092347B /* Neptune.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ E44E2BCF1AE770500092347B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4374268123FFF5B00000109 /* Cocoa.framework */; };
+ E44E2BDE1AE776DD0092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BDF1AE776E80092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2BF41AE779880092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BF51AE779890092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BF61AE7798A0092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BF71AE7798A0092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BF81AE7798B0092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BF91AE7798B0092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BFA1AE7798C0092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BFB1AE7798C0092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BFC1AE7798D0092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BFD1AE7798D0092347B /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+ E44E2BFE1AE779950092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2BFF1AE779960092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2C001AE779960092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2C011AE779970092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2C021AE779970092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2C031AE779970092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2C041AE779980092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2C051AE779980092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2C061AE779990092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E44E2C071AE779990092347B /* Platinum.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8B1AE761220092347B /* Platinum.framework */; };
+ E45332B21AAED318004A52FD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E45332B11AAED318004A52FD /* main.m */; };
+ E45332B51AAED318004A52FD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E45332B41AAED318004A52FD /* AppDelegate.m */; };
+ E45332B81AAED318004A52FD /* ViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = E45332B71AAED318004A52FD /* ViewController.mm */; };
+ E45BD1F71FC95BFC00F1D812 /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E40616C01ADE5C9A008BDAEB /* Neptune.framework */; };
+ E48EAA811AF1EDD800D9EDC0 /* Neptune.h in Headers */ = {isa = PBXBuildFile; fileRef = E48EAA801AF1EDD800D9EDC0 /* Neptune.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E48EAA821AF1EDD800D9EDC0 /* Neptune.h in Headers */ = {isa = PBXBuildFile; fileRef = E48EAA801AF1EDD800D9EDC0 /* Neptune.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ E4B2A5A71FC90AE500C891D7 /* Neptune.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E44E2B8D1AE7622F0092347B /* Neptune.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ E41016361ACFA826000E994F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E41016201ACFA826000E994F;
+ remoteInfo = Platinum;
+ };
+ E42D3B070FDC890F0045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3ABC0FDC87130045379C;
+ remoteInfo = MediaCrawler;
+ };
+ E42D3B090FDC890F0045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3AD20FDC87DB0045379C;
+ remoteInfo = MediaConnect;
+ };
+ E42D3B0B0FDC890F0045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3ADC0FDC87F50045379C;
+ remoteInfo = MicroMediaController;
+ };
+ E42D3B0D0FDC890F0045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3AE60FDC880D0045379C;
+ remoteInfo = FrameStreamer;
+ };
+ E42D3B670FDC8A180045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3B1A0FDC895A0045379C;
+ remoteInfo = FileMediaServerTest;
+ };
+ E42D3B690FDC8A180045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3B250FDC89720045379C;
+ remoteInfo = HttpTest;
+ };
+ E42D3B6B0FDC8A180045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3B380FDC89B70045379C;
+ remoteInfo = LightSampleTest;
+ };
+ E42D3B6D0FDC8A180045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3B440FDC89CD0045379C;
+ remoteInfo = MediaRendererTest;
+ };
+ E42D3B6F0FDC8A180045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3B4F0FDC89E10045379C;
+ remoteInfo = SimpleTest;
+ };
+ E42D3B760FDC8A290045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3B040FDC890A0045379C;
+ remoteInfo = Apps;
+ };
+ E42D3B780FDC8A290045379C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E42D3B640FDC8A120045379C;
+ remoteInfo = Tests;
+ };
+ E44470C012C31C1100E01480 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E43741FB123FFB9800000109;
+ remoteInfo = MediaServerCocoaTest;
+ };
+ E44E2BC21AE76D7B0092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BD41AE7755C0092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E41016201ACFA826000E994F;
+ remoteInfo = "Platinum-iOS";
+ };
+ E44E2BD61AE7755C0092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BD81AE775600092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2BD01AE775510092347B;
+ remoteInfo = Frameworks;
+ };
+ E44E2BDA1AE776060092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BE01AE779130092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BE21AE7794D0092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BE41AE779520092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BE61AE779580092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BE81AE7795C0092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BEA1AE779600092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BEC1AE779640092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BEE1AE779680092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BF01AE7796C0092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E44E2BF21AE779700092347B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E44E2B231AE761220092347B;
+ remoteInfo = "Platinum-Mac";
+ };
+ E459CC2711F82C7F00621896 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E459CC2111F82C3F00621896;
+ remoteInfo = Help;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ E410163D1ACFA826000E994F /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ E44E2BCD1AE7701D0092347B /* Neptune.framework in Embed Frameworks */,
+ E41016391ACFA826000E994F /* Platinum.framework in Embed Frameworks */,
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E4516B8E1446C3F600EC613B /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ E44E2BCE1AE7702D0092347B /* Neptune.framework in CopyFiles */,
+ E44E2BC51AE76E330092347B /* Platinum.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ E402C7541297CECB00565B76 /* ContentDirectorySCPD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentDirectorySCPD.cpp; sourceTree = "<group>"; };
+ E40616C01ADE5C9A008BDAEB /* Neptune.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Neptune.framework; path = ../../../Carthage/Build/iOS/Neptune.framework; sourceTree = "<group>"; };
+ E40C699E11E6ED710024CAD4 /* PltFrameBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltFrameBuffer.cpp; sourceTree = "<group>"; };
+ E40C699F11E6ED710024CAD4 /* PltFrameBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltFrameBuffer.h; sourceTree = "<group>"; };
+ E40C69A011E6ED710024CAD4 /* PltFrameServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltFrameServer.cpp; sourceTree = "<group>"; };
+ E40C69A111E6ED710024CAD4 /* PltFrameServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltFrameServer.h; sourceTree = "<group>"; };
+ E40C69A211E6ED710024CAD4 /* PltFrameStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltFrameStream.cpp; sourceTree = "<group>"; };
+ E40C69A311E6ED710024CAD4 /* PltFrameStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltFrameStream.h; sourceTree = "<group>"; };
+ E40C69A411E6ED710024CAD4 /* PltLeaks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltLeaks.cpp; sourceTree = "<group>"; };
+ E40C69A511E6ED710024CAD4 /* PltLeaks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltLeaks.h; sourceTree = "<group>"; };
+ E40C69A611E6ED710024CAD4 /* PltMetadataHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltMetadataHandler.cpp; sourceTree = "<group>"; };
+ E40C69A711E6ED710024CAD4 /* PltMetadataHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltMetadataHandler.h; sourceTree = "<group>"; };
+ E40C69A811E6ED710024CAD4 /* PltRingBufferStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltRingBufferStream.cpp; sourceTree = "<group>"; };
+ E40C69A911E6ED710024CAD4 /* PltRingBufferStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltRingBufferStream.h; sourceTree = "<group>"; };
+ E40C69E211E6F0D90024CAD4 /* PltDownloader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltDownloader.cpp; sourceTree = "<group>"; };
+ E40C69E311E6F0D90024CAD4 /* PltDownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltDownloader.h; sourceTree = "<group>"; };
+ E40C69E411E6F0D90024CAD4 /* PltStreamPump.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltStreamPump.cpp; sourceTree = "<group>"; };
+ E40C69E511E6F0D90024CAD4 /* PltStreamPump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltStreamPump.h; sourceTree = "<group>"; };
+ E41016161ACFA70C000E994F /* MobileMediaServer-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "MobileMediaServer-Info.plist"; sourceTree = "<group>"; };
+ E41016181ACFA761000E994F /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LaunchScreen.xib; path = ../../../Source/Apps/MobileMediaServer/LaunchScreen.xib; sourceTree = "<group>"; };
+ E41016191ACFA761000E994F /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = ../../../Source/Apps/MobileMediaServer/Main.storyboard; sourceTree = "<group>"; };
+ E41016211ACFA826000E994F /* Platinum.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Platinum.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ E41016241ACFA826000E994F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ E41016251ACFA826000E994F /* Platinum.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Platinum.h; sourceTree = "<group>"; };
+ E423F35A18415DA800E24E39 /* SsdpTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SsdpTest1.cpp; path = ../../../Source/Tests/Ssdp/SsdpTest1.cpp; sourceTree = "<group>"; };
+ E423F36818415DC500E24E39 /* SsdpTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SsdpTest; sourceTree = BUILT_PRODUCTS_DIR; };
+ E426B3271130DF9500C58542 /* PltXbox360.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltXbox360.cpp; sourceTree = "<group>"; };
+ E426B3281130DF9500C58542 /* PltXbox360.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltXbox360.h; sourceTree = "<group>"; };
+ E4294C6014319C9400B6FDED /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
+ E42D3A930FDC85E70045379C /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../../../Source/Apps/FrameStreamer/main.cpp; sourceTree = SOURCE_ROOT; };
+ E42D3A950FDC85E70045379C /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
+ E42D3A970FDC85E70045379C /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
+ E42D3A980FDC85E70045379C /* MediaCrawler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaCrawler.cpp; sourceTree = "<group>"; };
+ E42D3A990FDC85E70045379C /* MediaCrawler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaCrawler.h; sourceTree = "<group>"; };
+ E42D3A9A0FDC85E70045379C /* StreamHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamHandler.h; sourceTree = "<group>"; };
+ E42D3A9C0FDC85E70045379C /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
+ E42D3A9D0FDC85E70045379C /* PltMicroMediaController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltMicroMediaController.cpp; sourceTree = "<group>"; };
+ E42D3A9E0FDC85E70045379C /* PltMicroMediaController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltMicroMediaController.h; sourceTree = "<group>"; };
+ E42D3AAB0FDC86A60045379C /* FileMediaServerTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileMediaServerTest.cpp; sourceTree = "<group>"; usesTabs = 0; };
+ E42D3AAD0FDC86A60045379C /* HttpTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HttpTest.cpp; sourceTree = "<group>"; };
+ E42D3AAF0FDC86A60045379C /* PltLightSample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltLightSample.h; sourceTree = "<group>"; };
+ E42D3AB00FDC86A60045379C /* LightSampleTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LightSampleTest.cpp; sourceTree = "<group>"; };
+ E42D3AB10FDC86A60045379C /* PltLightSample.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltLightSample.cpp; sourceTree = "<group>"; };
+ E42D3AB30FDC86A60045379C /* MediaRendererTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaRendererTest.cpp; sourceTree = "<group>"; };
+ E42D3AB50FDC86A60045379C /* PltSimple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltSimple.h; sourceTree = "<group>"; };
+ E42D3AB60FDC86A60045379C /* PltSimple.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PltSimple.cpp; sourceTree = "<group>"; };
+ E42D3AB70FDC86A60045379C /* SimpleTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleTest.cpp; sourceTree = "<group>"; };
+ E42D3ABD0FDC87130045379C /* MediaCrawler */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MediaCrawler; sourceTree = BUILT_PRODUCTS_DIR; };
+ E42D3AD30FDC87DB0045379C /* MediaConnect */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MediaConnect; sourceTree = BUILT_PRODUCTS_DIR; };
+ E42D3ADD0FDC87F50045379C /* MicroMediaController */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MicroMediaController; sourceTree = BUILT_PRODUCTS_DIR; };
+ E42D3AE70FDC880D0045379C /* FrameStreamer */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = FrameStreamer; sourceTree = BUILT_PRODUCTS_DIR; };
+ E42D3B1B0FDC895A0045379C /* FileMediaServerTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = FileMediaServerTest; sourceTree = BUILT_PRODUCTS_DIR; };
+ E42D3B260FDC89720045379C /* HttpTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = HttpTest; sourceTree = BUILT_PRODUCTS_DIR; };
+ E42D3B390FDC89B70045379C /* LightSampleTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = LightSampleTest; sourceTree = BUILT_PRODUCTS_DIR; };
+ E42D3B450FDC89CD0045379C /* MediaRendererTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MediaRendererTest; sourceTree = BUILT_PRODUCTS_DIR; };
+ E42D3B500FDC89E10045379C /* SimpleTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SimpleTest; sourceTree = BUILT_PRODUCTS_DIR; };
+ E43154FE0D6FFDEB00899579 /* PltAction.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltAction.cpp; path = ../../../Source/Core/PltAction.cpp; sourceTree = SOURCE_ROOT; };
+ E43154FF0D6FFDEB00899579 /* PltAction.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltAction.h; path = ../../../Source/Core/PltAction.h; sourceTree = SOURCE_ROOT; };
+ E43155000D6FFDEB00899579 /* PltArgument.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltArgument.cpp; path = ../../../Source/Core/PltArgument.cpp; sourceTree = SOURCE_ROOT; };
+ E43155010D6FFDEB00899579 /* PltArgument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltArgument.h; path = ../../../Source/Core/PltArgument.h; sourceTree = SOURCE_ROOT; };
+ E43155020D6FFDEB00899579 /* PltCtrlPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltCtrlPoint.cpp; path = ../../../Source/Core/PltCtrlPoint.cpp; sourceTree = SOURCE_ROOT; };
+ E43155030D6FFDEB00899579 /* PltCtrlPoint.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltCtrlPoint.h; path = ../../../Source/Core/PltCtrlPoint.h; sourceTree = SOURCE_ROOT; };
+ E43155040D6FFDEB00899579 /* PltCtrlPointTask.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltCtrlPointTask.cpp; path = ../../../Source/Core/PltCtrlPointTask.cpp; sourceTree = SOURCE_ROOT; };
+ E43155050D6FFDEB00899579 /* PltCtrlPointTask.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltCtrlPointTask.h; path = ../../../Source/Core/PltCtrlPointTask.h; sourceTree = SOURCE_ROOT; };
+ E43155060D6FFDEB00899579 /* PltDatagramStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltDatagramStream.cpp; path = ../../../Source/Core/PltDatagramStream.cpp; sourceTree = SOURCE_ROOT; };
+ E43155070D6FFDEB00899579 /* PltDatagramStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltDatagramStream.h; path = ../../../Source/Core/PltDatagramStream.h; sourceTree = SOURCE_ROOT; };
+ E43155080D6FFDEB00899579 /* PltDeviceData.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltDeviceData.cpp; path = ../../../Source/Core/PltDeviceData.cpp; sourceTree = SOURCE_ROOT; };
+ E43155090D6FFDEB00899579 /* PltDeviceData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltDeviceData.h; path = ../../../Source/Core/PltDeviceData.h; sourceTree = SOURCE_ROOT; };
+ E431550A0D6FFDEB00899579 /* PltDeviceHost.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltDeviceHost.cpp; path = ../../../Source/Core/PltDeviceHost.cpp; sourceTree = SOURCE_ROOT; };
+ E431550B0D6FFDEB00899579 /* PltDeviceHost.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltDeviceHost.h; path = ../../../Source/Core/PltDeviceHost.h; sourceTree = SOURCE_ROOT; };
+ E431550E0D6FFDEB00899579 /* PltEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltEvent.cpp; path = ../../../Source/Core/PltEvent.cpp; sourceTree = SOURCE_ROOT; };
+ E431550F0D6FFDEB00899579 /* PltEvent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltEvent.h; path = ../../../Source/Core/PltEvent.h; sourceTree = SOURCE_ROOT; };
+ E43155100D6FFDEB00899579 /* PltHttp.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltHttp.cpp; path = ../../../Source/Core/PltHttp.cpp; sourceTree = SOURCE_ROOT; };
+ E43155110D6FFDEB00899579 /* PltHttp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltHttp.h; path = ../../../Source/Core/PltHttp.h; sourceTree = SOURCE_ROOT; };
+ E43155120D6FFDEB00899579 /* PltHttpClientTask.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltHttpClientTask.cpp; path = ../../../Source/Core/PltHttpClientTask.cpp; sourceTree = SOURCE_ROOT; };
+ E43155130D6FFDEB00899579 /* PltHttpClientTask.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltHttpClientTask.h; path = ../../../Source/Core/PltHttpClientTask.h; sourceTree = SOURCE_ROOT; };
+ E43155140D6FFDEB00899579 /* PltHttpServer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltHttpServer.cpp; path = ../../../Source/Core/PltHttpServer.cpp; sourceTree = SOURCE_ROOT; };
+ E43155150D6FFDEB00899579 /* PltHttpServer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltHttpServer.h; path = ../../../Source/Core/PltHttpServer.h; sourceTree = SOURCE_ROOT; };
+ E43155170D6FFDEB00899579 /* PltHttpServerTask.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltHttpServerTask.cpp; path = ../../../Source/Core/PltHttpServerTask.cpp; sourceTree = SOURCE_ROOT; };
+ E43155180D6FFDEB00899579 /* PltHttpServerTask.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltHttpServerTask.h; path = ../../../Source/Core/PltHttpServerTask.h; sourceTree = SOURCE_ROOT; };
+ E43155210D6FFDEB00899579 /* PltService.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltService.cpp; path = ../../../Source/Core/PltService.cpp; sourceTree = SOURCE_ROOT; };
+ E43155220D6FFDEB00899579 /* PltService.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltService.h; path = ../../../Source/Core/PltService.h; sourceTree = SOURCE_ROOT; };
+ E43155230D6FFDEB00899579 /* PltSsdp.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltSsdp.cpp; path = ../../../Source/Core/PltSsdp.cpp; sourceTree = SOURCE_ROOT; };
+ E43155240D6FFDEB00899579 /* PltSsdp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltSsdp.h; path = ../../../Source/Core/PltSsdp.h; sourceTree = SOURCE_ROOT; };
+ E43155260D6FFDEB00899579 /* PltStateVariable.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltStateVariable.cpp; path = ../../../Source/Core/PltStateVariable.cpp; sourceTree = SOURCE_ROOT; };
+ E43155270D6FFDEB00899579 /* PltStateVariable.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltStateVariable.h; path = ../../../Source/Core/PltStateVariable.h; sourceTree = SOURCE_ROOT; };
+ E431552A0D6FFDEB00899579 /* PltTaskManager.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltTaskManager.cpp; path = ../../../Source/Core/PltTaskManager.cpp; sourceTree = SOURCE_ROOT; };
+ E431552B0D6FFDEB00899579 /* PltTaskManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltTaskManager.h; path = ../../../Source/Core/PltTaskManager.h; sourceTree = SOURCE_ROOT; };
+ E431552C0D6FFDEB00899579 /* PltThreadTask.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltThreadTask.cpp; path = ../../../Source/Core/PltThreadTask.cpp; sourceTree = SOURCE_ROOT; };
+ E431552D0D6FFDEB00899579 /* PltThreadTask.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltThreadTask.h; path = ../../../Source/Core/PltThreadTask.h; sourceTree = SOURCE_ROOT; };
+ E431552E0D6FFDEB00899579 /* PltUPnP.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PltUPnP.cpp; path = ../../../Source/Core/PltUPnP.cpp; sourceTree = SOURCE_ROOT; };
+ E431552F0D6FFDEB00899579 /* PltUPnP.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltUPnP.h; path = ../../../Source/Core/PltUPnP.h; sourceTree = SOURCE_ROOT; };
+ E43155320D6FFDEB00899579 /* PltUtilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PltUtilities.h; path = ../../../Source/Core/PltUtilities.h; sourceTree = SOURCE_ROOT; };
+ E43155960D6FFE4C00899579 /* PltMediaConnect.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltMediaConnect.cpp; sourceTree = "<group>"; };
+ E43155970D6FFE4C00899579 /* PltMediaConnect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltMediaConnect.h; sourceTree = "<group>"; };
+ E431559D0D6FFE4C00899579 /* PltMediaController.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltMediaController.cpp; sourceTree = "<group>"; };
+ E431559E0D6FFE4C00899579 /* PltMediaController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltMediaController.h; sourceTree = "<group>"; };
+ E43155A00D6FFE4C00899579 /* PltMediaRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltMediaRenderer.cpp; sourceTree = "<group>"; };
+ E43155A10D6FFE4C00899579 /* PltMediaRenderer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltMediaRenderer.h; sourceTree = "<group>"; };
+ E43155A80D6FFE4C00899579 /* PltDidl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltDidl.cpp; sourceTree = "<group>"; };
+ E43155A90D6FFE4C00899579 /* PltDidl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltDidl.h; sourceTree = "<group>"; };
+ E43155AA0D6FFE4C00899579 /* PltFileMediaServer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltFileMediaServer.cpp; sourceTree = "<group>"; };
+ E43155AB0D6FFE4C00899579 /* PltFileMediaServer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltFileMediaServer.h; sourceTree = "<group>"; };
+ E43155AC0D6FFE4C00899579 /* PltMediaBrowser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltMediaBrowser.cpp; sourceTree = "<group>"; };
+ E43155AD0D6FFE4C00899579 /* PltMediaBrowser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltMediaBrowser.h; sourceTree = "<group>"; };
+ E43155AF0D6FFE4C00899579 /* PltMediaCache.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltMediaCache.cpp; sourceTree = "<group>"; };
+ E43155B00D6FFE4C00899579 /* PltMediaCache.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltMediaCache.h; sourceTree = "<group>"; };
+ E43155B10D6FFE4C00899579 /* PltMediaItem.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltMediaItem.cpp; sourceTree = "<group>"; };
+ E43155B20D6FFE4C00899579 /* PltMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltMediaItem.h; sourceTree = "<group>"; };
+ E43155B50D6FFE4C00899579 /* PltMediaServer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltMediaServer.cpp; sourceTree = "<group>"; };
+ E43155B60D6FFE4C00899579 /* PltMediaServer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltMediaServer.h; sourceTree = "<group>"; };
+ E43155B80D6FFE4C00899579 /* PltSyncMediaBrowser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PltSyncMediaBrowser.cpp; sourceTree = "<group>"; };
+ E43155B90D6FFE4C00899579 /* PltSyncMediaBrowser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PltSyncMediaBrowser.h; sourceTree = "<group>"; };
+ E43741FC123FFB9800000109 /* MediaServerCocoaTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MediaServerCocoaTest.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ E4374243123FFE9100000109 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ E4374245123FFE9100000109 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = "<group>"; };
+ E4374246123FFE9100000109 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
+ E4374247123FFE9100000109 /* MediaServerCocoaTest-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "MediaServerCocoaTest-Info.plist"; sourceTree = "<group>"; };
+ E4374248123FFE9100000109 /* MediaServerCocoaTest_AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaServerCocoaTest_AppDelegate.h; sourceTree = "<group>"; };
+ E4374249123FFE9100000109 /* MediaServerCocoaTest_AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaServerCocoaTest_AppDelegate.mm; sourceTree = "<group>"; };
+ E437424A123FFE9100000109 /* MediaServerCocoaTest_DataModel.xcdatamodel */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wrapper.xcdatamodel; path = MediaServerCocoaTest_DataModel.xcdatamodel; sourceTree = "<group>"; };
+ E437424B123FFE9100000109 /* MediaServerCocoaTest_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaServerCocoaTest_Prefix.pch; sourceTree = "<group>"; };
+ E4374268123FFF5B00000109 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ E43744C8124014D500000109 /* MediaServerCocoaTestController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaServerCocoaTestController.h; sourceTree = "<group>"; };
+ E4374C1512417AA800000109 /* PltMediaServerObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltMediaServerObject.h; sourceTree = "<group>"; };
+ E4374C1612417AA800000109 /* PltMediaServerObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PltMediaServerObject.mm; sourceTree = "<group>"; };
+ E4374C1712417AA800000109 /* PltUPnPObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltUPnPObject.h; sourceTree = "<group>"; };
+ E4374C1812417AA800000109 /* PltUPnPObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PltUPnPObject.mm; sourceTree = "<group>"; };
+ E43EEEFD101E1AEF007A9CE7 /* Platinum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Platinum.h; sourceTree = "<group>"; };
+ E43EEEFF101E1AEF007A9CE7 /* PltVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PltVersion.h; sourceTree = "<group>"; };
+ E43F6BC510F1B74E00C97612 /* TimeTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = TimeTest; sourceTree = BUILT_PRODUCTS_DIR; };
+ E43F6BC810F1B78400C97612 /* TimeTest1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TimeTest1.cpp; sourceTree = "<group>"; };
+ E4446FAA12C3168900E01480 /* MediaServerCocoaTestController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaServerCocoaTestController.mm; sourceTree = "<group>"; };
+ E44E2B8B1AE761220092347B /* Platinum.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Platinum.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ E44E2B8D1AE7622F0092347B /* Neptune.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Neptune.framework; path = ../../../Carthage/Build/Mac/Neptune.framework; sourceTree = "<group>"; };
+ E4516A331446A54400EC613B /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; };
+ E45332AD1AAED318004A52FD /* MobileMediaServer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MobileMediaServer.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ E45332B11AAED318004A52FD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ E45332B31AAED318004A52FD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ E45332B41AAED318004A52FD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ E45332B61AAED318004A52FD /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+ E45332B71AAED318004A52FD /* ViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ViewController.mm; sourceTree = "<group>"; };
+ E467AC771447747D00CEAACA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+ E467AC791447747D00CEAACA /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+ E477694512A9C00E0011EEE4 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
+ E48D4D8F13B51BAC00359E06 /* PltProtocolInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PltProtocolInfo.cpp; path = ../../../Source/Core/PltProtocolInfo.cpp; sourceTree = SOURCE_ROOT; };
+ E48D4D9013B51BAC00359E06 /* PltProtocolInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PltProtocolInfo.h; path = ../../../Source/Core/PltProtocolInfo.h; sourceTree = SOURCE_ROOT; };
+ E48D4DA613B51CB600359E06 /* PltMimeType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PltMimeType.cpp; path = ../../../Source/Core/PltMimeType.cpp; sourceTree = SOURCE_ROOT; };
+ E48D4DA713B51CB600359E06 /* PltMimeType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PltMimeType.h; path = ../../../Source/Core/PltMimeType.h; sourceTree = SOURCE_ROOT; };
+ E48EAA801AF1EDD800D9EDC0 /* Neptune.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Neptune.h; sourceTree = "<group>"; };
+ E48F8A9E1632026F009E46A5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ E4A7DB76108596B900E6ADE2 /* AVTransportSCPD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AVTransportSCPD.cpp; sourceTree = "<group>"; };
+ E4A7DB77108596B900E6ADE2 /* RdrConnectionManagerSCPD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RdrConnectionManagerSCPD.cpp; sourceTree = "<group>"; };
+ E4A7DB78108596B900E6ADE2 /* RenderingControlSCPD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderingControlSCPD.cpp; sourceTree = "<group>"; };
+ E4A7DB7F108596C800E6ADE2 /* X_MS_MediaReceiverRegistrarSCPD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = X_MS_MediaReceiverRegistrarSCPD.cpp; sourceTree = "<group>"; };
+ E4A7DB82108596E400E6ADE2 /* ConnectionManagerSCPD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConnectionManagerSCPD.cpp; sourceTree = "<group>"; };
+ E4A7DB83108596E400E6ADE2 /* ContentDirectorywSearchSCPD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentDirectorywSearchSCPD.cpp; sourceTree = "<group>"; };
+ E4B95ECF1446575700DBBF49 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+ E4B95ED01446575700DBBF49 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
+ E4BA7CBB0FE2200700A4D16B /* PltConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PltConstants.h; path = ../../../Source/Core/PltConstants.h; sourceTree = SOURCE_ROOT; };
+ E4BA7CBC0FE2200700A4D16B /* PltConstants.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PltConstants.cpp; path = ../../../Source/Core/PltConstants.cpp; sourceTree = SOURCE_ROOT; };
+ E4CB6A441640354E002478B0 /* CHANGELOG.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = CHANGELOG.txt; path = ../../../CHANGELOG.txt; sourceTree = "<group>"; };
+ E4CB6A451640354E002478B0 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = LICENSE.txt; path = ../../../LICENSE.txt; sourceTree = "<group>"; };
+ E4CB6A461640354E002478B0 /* README.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = README.txt; path = ../../../README.txt; sourceTree = "<group>"; };
+ E4F7E9060FE4B12A00BEDFA6 /* PltIconsData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PltIconsData.cpp; path = ../../../Source/Core/PltIconsData.cpp; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ E410161D1ACFA826000E994F /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E45BD1F71FC95BFC00F1D812 /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E423F36018415DC500E24E39 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2C071AE779990092347B /* Platinum.framework in Frameworks */,
+ E44E2BFD1AE7798D0092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3ABB0FDC87130045379C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2BDF1AE776E80092347B /* Platinum.framework in Frameworks */,
+ E44E2BDE1AE776DD0092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3AD10FDC87DB0045379C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2BFE1AE779950092347B /* Platinum.framework in Frameworks */,
+ E44E2BF41AE779880092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3ADB0FDC87F50045379C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2BFF1AE779960092347B /* Platinum.framework in Frameworks */,
+ E44E2BF51AE779890092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3AE50FDC880D0045379C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2C001AE779960092347B /* Platinum.framework in Frameworks */,
+ E44E2BF61AE7798A0092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B190FDC895A0045379C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2C011AE779970092347B /* Platinum.framework in Frameworks */,
+ E44E2BF71AE7798A0092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B240FDC89720045379C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2C021AE779970092347B /* Platinum.framework in Frameworks */,
+ E44E2BF81AE7798B0092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B370FDC89B70045379C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2C031AE779970092347B /* Platinum.framework in Frameworks */,
+ E44E2BF91AE7798B0092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B430FDC89CD0045379C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2C041AE779980092347B /* Platinum.framework in Frameworks */,
+ E44E2BFA1AE7798C0092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B4E0FDC89E10045379C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2C051AE779980092347B /* Platinum.framework in Frameworks */,
+ E44E2BFB1AE7798C0092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E43741FA123FFB9800000109 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2BCF1AE770500092347B /* Cocoa.framework in Frameworks */,
+ E44E2BCB1AE76FF90092347B /* Neptune.framework in Frameworks */,
+ E44E2BC41AE76E0F0092347B /* Platinum.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E43F6BC010F1B74E00C97612 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2C061AE779990092347B /* Platinum.framework in Frameworks */,
+ E44E2BFC1AE7798D0092347B /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E44E2B571AE761220092347B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E4B2A5A71FC90AE500C891D7 /* Neptune.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E45332AA1AAED318004A52FD /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2BCC1AE770150092347B /* Neptune.framework in Frameworks */,
+ E41016381ACFA826000E994F /* Platinum.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 08FB7794FE84155DC02AAC07 /* Platinum */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB7795FE84155DC02AAC07 /* Source */,
+ E44470B312C31B5900E01480 /* Resources */,
+ C6A0FF2B0290797F04C91782 /* Documentation */,
+ E41016221ACFA826000E994F /* Platinum */,
+ E4294C5F14319C9400B6FDED /* Frameworks */,
+ 1AB674ADFE9D54B511CA2CBB /* Products */,
+ );
+ name = Platinum;
+ sourceTree = "<group>";
+ };
+ 08FB7795FE84155DC02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3A910FDC85E70045379C /* Apps */,
+ E4096BAD0AF34CE2000AB1CD /* Core */,
+ E4096C180AF34D3A000AB1CD /* Devices */,
+ E40C699D11E6ED710024CAD4 /* Extras */,
+ E43EEEFC101E1AEF007A9CE7 /* Platinum */,
+ E42D3AA90FDC86730045379C /* Tests */,
+ );
+ name = Source;
+ sourceTree = "<group>";
+ };
+ 1AB674ADFE9D54B511CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3ABD0FDC87130045379C /* MediaCrawler */,
+ E42D3AD30FDC87DB0045379C /* MediaConnect */,
+ E42D3ADD0FDC87F50045379C /* MicroMediaController */,
+ E42D3AE70FDC880D0045379C /* FrameStreamer */,
+ E42D3B1B0FDC895A0045379C /* FileMediaServerTest */,
+ E42D3B260FDC89720045379C /* HttpTest */,
+ E42D3B390FDC89B70045379C /* LightSampleTest */,
+ E42D3B450FDC89CD0045379C /* MediaRendererTest */,
+ E42D3B500FDC89E10045379C /* SimpleTest */,
+ E43F6BC510F1B74E00C97612 /* TimeTest */,
+ E43741FC123FFB9800000109 /* MediaServerCocoaTest.app */,
+ E423F36818415DC500E24E39 /* SsdpTest */,
+ E45332AD1AAED318004A52FD /* MobileMediaServer.app */,
+ E41016211ACFA826000E994F /* Platinum.framework */,
+ E44E2B8B1AE761220092347B /* Platinum.framework */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ C6A0FF2B0290797F04C91782 /* Documentation */ = {
+ isa = PBXGroup;
+ children = (
+ E4CB6A441640354E002478B0 /* CHANGELOG.txt */,
+ E4CB6A451640354E002478B0 /* LICENSE.txt */,
+ E4CB6A461640354E002478B0 /* README.txt */,
+ );
+ name = Documentation;
+ sourceTree = "<group>";
+ };
+ E4096BAD0AF34CE2000AB1CD /* Core */ = {
+ isa = PBXGroup;
+ children = (
+ E43154FE0D6FFDEB00899579 /* PltAction.cpp */,
+ E43154FF0D6FFDEB00899579 /* PltAction.h */,
+ E43155000D6FFDEB00899579 /* PltArgument.cpp */,
+ E43155010D6FFDEB00899579 /* PltArgument.h */,
+ E4BA7CBC0FE2200700A4D16B /* PltConstants.cpp */,
+ E4BA7CBB0FE2200700A4D16B /* PltConstants.h */,
+ E43155020D6FFDEB00899579 /* PltCtrlPoint.cpp */,
+ E43155030D6FFDEB00899579 /* PltCtrlPoint.h */,
+ E43155040D6FFDEB00899579 /* PltCtrlPointTask.cpp */,
+ E43155050D6FFDEB00899579 /* PltCtrlPointTask.h */,
+ E43155060D6FFDEB00899579 /* PltDatagramStream.cpp */,
+ E43155070D6FFDEB00899579 /* PltDatagramStream.h */,
+ E43155080D6FFDEB00899579 /* PltDeviceData.cpp */,
+ E43155090D6FFDEB00899579 /* PltDeviceData.h */,
+ E431550A0D6FFDEB00899579 /* PltDeviceHost.cpp */,
+ E431550B0D6FFDEB00899579 /* PltDeviceHost.h */,
+ E431550E0D6FFDEB00899579 /* PltEvent.cpp */,
+ E431550F0D6FFDEB00899579 /* PltEvent.h */,
+ E43155100D6FFDEB00899579 /* PltHttp.cpp */,
+ E43155110D6FFDEB00899579 /* PltHttp.h */,
+ E43155120D6FFDEB00899579 /* PltHttpClientTask.cpp */,
+ E43155130D6FFDEB00899579 /* PltHttpClientTask.h */,
+ E43155140D6FFDEB00899579 /* PltHttpServer.cpp */,
+ E43155150D6FFDEB00899579 /* PltHttpServer.h */,
+ E43155170D6FFDEB00899579 /* PltHttpServerTask.cpp */,
+ E43155180D6FFDEB00899579 /* PltHttpServerTask.h */,
+ E4F7E9060FE4B12A00BEDFA6 /* PltIconsData.cpp */,
+ E48D4DA613B51CB600359E06 /* PltMimeType.cpp */,
+ E48D4DA713B51CB600359E06 /* PltMimeType.h */,
+ E48D4D8F13B51BAC00359E06 /* PltProtocolInfo.cpp */,
+ E48D4D9013B51BAC00359E06 /* PltProtocolInfo.h */,
+ E43155210D6FFDEB00899579 /* PltService.cpp */,
+ E43155220D6FFDEB00899579 /* PltService.h */,
+ E43155230D6FFDEB00899579 /* PltSsdp.cpp */,
+ E43155240D6FFDEB00899579 /* PltSsdp.h */,
+ E43155260D6FFDEB00899579 /* PltStateVariable.cpp */,
+ E43155270D6FFDEB00899579 /* PltStateVariable.h */,
+ E431552A0D6FFDEB00899579 /* PltTaskManager.cpp */,
+ E431552B0D6FFDEB00899579 /* PltTaskManager.h */,
+ E431552C0D6FFDEB00899579 /* PltThreadTask.cpp */,
+ E431552D0D6FFDEB00899579 /* PltThreadTask.h */,
+ E431552E0D6FFDEB00899579 /* PltUPnP.cpp */,
+ E431552F0D6FFDEB00899579 /* PltUPnP.h */,
+ E43155320D6FFDEB00899579 /* PltUtilities.h */,
+ );
+ name = Core;
+ sourceTree = "<group>";
+ };
+ E4096C180AF34D3A000AB1CD /* Devices */ = {
+ isa = PBXGroup;
+ children = (
+ E43155930D6FFE4C00899579 /* MediaConnect */,
+ E431559A0D6FFE4C00899579 /* MediaRenderer */,
+ E43155A40D6FFE4C00899579 /* MediaServer */,
+ );
+ name = Devices;
+ sourceTree = "<group>";
+ };
+ E40C699D11E6ED710024CAD4 /* Extras */ = {
+ isa = PBXGroup;
+ children = (
+ E4374C1412417AA800000109 /* ObjectiveC */,
+ E40C69E211E6F0D90024CAD4 /* PltDownloader.cpp */,
+ E40C69E311E6F0D90024CAD4 /* PltDownloader.h */,
+ E40C69E411E6F0D90024CAD4 /* PltStreamPump.cpp */,
+ E40C69E511E6F0D90024CAD4 /* PltStreamPump.h */,
+ E40C699E11E6ED710024CAD4 /* PltFrameBuffer.cpp */,
+ E40C699F11E6ED710024CAD4 /* PltFrameBuffer.h */,
+ E40C69A011E6ED710024CAD4 /* PltFrameServer.cpp */,
+ E40C69A111E6ED710024CAD4 /* PltFrameServer.h */,
+ E40C69A211E6ED710024CAD4 /* PltFrameStream.cpp */,
+ E40C69A311E6ED710024CAD4 /* PltFrameStream.h */,
+ E40C69A411E6ED710024CAD4 /* PltLeaks.cpp */,
+ E40C69A511E6ED710024CAD4 /* PltLeaks.h */,
+ E40C69A611E6ED710024CAD4 /* PltMetadataHandler.cpp */,
+ E40C69A711E6ED710024CAD4 /* PltMetadataHandler.h */,
+ E40C69A811E6ED710024CAD4 /* PltRingBufferStream.cpp */,
+ E40C69A911E6ED710024CAD4 /* PltRingBufferStream.h */,
+ );
+ name = Extras;
+ path = ../../../Source/Extras;
+ sourceTree = SOURCE_ROOT;
+ };
+ E41016151ACFA4E0000E994F /* MobileMediaServer */ = {
+ isa = PBXGroup;
+ children = (
+ E41016181ACFA761000E994F /* LaunchScreen.xib */,
+ E41016191ACFA761000E994F /* Main.storyboard */,
+ E41016161ACFA70C000E994F /* MobileMediaServer-Info.plist */,
+ );
+ name = MobileMediaServer;
+ sourceTree = "<group>";
+ };
+ E41016221ACFA826000E994F /* Platinum */ = {
+ isa = PBXGroup;
+ children = (
+ E48EAA801AF1EDD800D9EDC0 /* Neptune.h */,
+ E41016251ACFA826000E994F /* Platinum.h */,
+ E41016231ACFA826000E994F /* Supporting Files */,
+ );
+ path = Platinum;
+ sourceTree = "<group>";
+ };
+ E41016231ACFA826000E994F /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ E41016241ACFA826000E994F /* Info.plist */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ E423F35918415D8E00E24E39 /* SsdpTest */ = {
+ isa = PBXGroup;
+ children = (
+ E423F35A18415DA800E24E39 /* SsdpTest1.cpp */,
+ );
+ name = SsdpTest;
+ sourceTree = "<group>";
+ };
+ E4294C5F14319C9400B6FDED /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ E44E2B8D1AE7622F0092347B /* Neptune.framework */,
+ E40616C01ADE5C9A008BDAEB /* Neptune.framework */,
+ E48F8A9E1632026F009E46A5 /* Foundation.framework */,
+ E467AC771447747D00CEAACA /* Foundation.framework */,
+ E467AC791447747D00CEAACA /* UIKit.framework */,
+ E4516A331446A54400EC613B /* CoreServices.framework */,
+ E4374268123FFF5B00000109 /* Cocoa.framework */,
+ E477694512A9C00E0011EEE4 /* SystemConfiguration.framework */,
+ E4294C6014319C9400B6FDED /* CoreFoundation.framework */,
+ E4B95ECE1446575700DBBF49 /* Other Frameworks */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ E42D3A910FDC85E70045379C /* Apps */ = {
+ isa = PBXGroup;
+ children = (
+ E45332AE1AAED318004A52FD /* MobileMediaServer */,
+ E45332A81AAED263004A52FD /* MediaServer */,
+ E42D3A940FDC85E70045379C /* MediaConnect */,
+ E42D3A960FDC85E70045379C /* MediaCrawler */,
+ E42D3A9B0FDC85E70045379C /* MicroMediaController */,
+ E42D3A920FDC85E70045379C /* FrameStreamer */,
+ );
+ name = Apps;
+ sourceTree = "<group>";
+ };
+ E42D3A920FDC85E70045379C /* FrameStreamer */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3A930FDC85E70045379C /* main.cpp */,
+ );
+ name = FrameStreamer;
+ sourceTree = "<group>";
+ };
+ E42D3A940FDC85E70045379C /* MediaConnect */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3A950FDC85E70045379C /* main.cpp */,
+ );
+ name = MediaConnect;
+ path = ../../../Source/Apps/MediaConnect;
+ sourceTree = SOURCE_ROOT;
+ };
+ E42D3A960FDC85E70045379C /* MediaCrawler */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3A970FDC85E70045379C /* main.cpp */,
+ E42D3A980FDC85E70045379C /* MediaCrawler.cpp */,
+ E42D3A990FDC85E70045379C /* MediaCrawler.h */,
+ E42D3A9A0FDC85E70045379C /* StreamHandler.h */,
+ );
+ name = MediaCrawler;
+ path = ../../../Source/Apps/MediaCrawler;
+ sourceTree = SOURCE_ROOT;
+ };
+ E42D3A9B0FDC85E70045379C /* MicroMediaController */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3A9C0FDC85E70045379C /* main.cpp */,
+ E42D3A9D0FDC85E70045379C /* PltMicroMediaController.cpp */,
+ E42D3A9E0FDC85E70045379C /* PltMicroMediaController.h */,
+ );
+ name = MicroMediaController;
+ path = ../../../Source/Apps/MicroMediaController;
+ sourceTree = SOURCE_ROOT;
+ };
+ E42D3AA90FDC86730045379C /* Tests */ = {
+ isa = PBXGroup;
+ children = (
+ E423F35918415D8E00E24E39 /* SsdpTest */,
+ E4374241123FFE9100000109 /* MediaServerCocoaTest */,
+ E43F6BC710F1B78400C97612 /* Time */,
+ E42D3AAA0FDC86A60045379C /* FileMediaServer */,
+ E42D3AAC0FDC86A60045379C /* Http */,
+ E42D3AAE0FDC86A60045379C /* LightSample */,
+ E42D3AB20FDC86A60045379C /* MediaRenderer */,
+ E42D3AB40FDC86A60045379C /* Simple */,
+ );
+ name = Tests;
+ sourceTree = "<group>";
+ };
+ E42D3AAA0FDC86A60045379C /* FileMediaServer */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3AAB0FDC86A60045379C /* FileMediaServerTest.cpp */,
+ );
+ name = FileMediaServer;
+ path = ../../../Source/Tests/FileMediaServer;
+ sourceTree = SOURCE_ROOT;
+ };
+ E42D3AAC0FDC86A60045379C /* Http */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3AAD0FDC86A60045379C /* HttpTest.cpp */,
+ );
+ name = Http;
+ path = ../../../Source/Tests/Http;
+ sourceTree = SOURCE_ROOT;
+ };
+ E42D3AAE0FDC86A60045379C /* LightSample */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3AAF0FDC86A60045379C /* PltLightSample.h */,
+ E42D3AB00FDC86A60045379C /* LightSampleTest.cpp */,
+ E42D3AB10FDC86A60045379C /* PltLightSample.cpp */,
+ );
+ name = LightSample;
+ path = ../../../Source/Tests/LightSample;
+ sourceTree = SOURCE_ROOT;
+ };
+ E42D3AB20FDC86A60045379C /* MediaRenderer */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3AB30FDC86A60045379C /* MediaRendererTest.cpp */,
+ );
+ name = MediaRenderer;
+ path = ../../../Source/Tests/MediaRenderer;
+ sourceTree = SOURCE_ROOT;
+ };
+ E42D3AB40FDC86A60045379C /* Simple */ = {
+ isa = PBXGroup;
+ children = (
+ E42D3AB50FDC86A60045379C /* PltSimple.h */,
+ E42D3AB60FDC86A60045379C /* PltSimple.cpp */,
+ E42D3AB70FDC86A60045379C /* SimpleTest.cpp */,
+ );
+ name = Simple;
+ path = ../../../Source/Tests/Simple;
+ sourceTree = SOURCE_ROOT;
+ };
+ E43155930D6FFE4C00899579 /* MediaConnect */ = {
+ isa = PBXGroup;
+ children = (
+ E426B3271130DF9500C58542 /* PltXbox360.cpp */,
+ E426B3281130DF9500C58542 /* PltXbox360.h */,
+ E4A7DB7F108596C800E6ADE2 /* X_MS_MediaReceiverRegistrarSCPD.cpp */,
+ E43155960D6FFE4C00899579 /* PltMediaConnect.cpp */,
+ E43155970D6FFE4C00899579 /* PltMediaConnect.h */,
+ );
+ name = MediaConnect;
+ path = ../../../Source/Devices/MediaConnect;
+ sourceTree = SOURCE_ROOT;
+ };
+ E431559A0D6FFE4C00899579 /* MediaRenderer */ = {
+ isa = PBXGroup;
+ children = (
+ E4A7DB76108596B900E6ADE2 /* AVTransportSCPD.cpp */,
+ E4A7DB77108596B900E6ADE2 /* RdrConnectionManagerSCPD.cpp */,
+ E4A7DB78108596B900E6ADE2 /* RenderingControlSCPD.cpp */,
+ E431559D0D6FFE4C00899579 /* PltMediaController.cpp */,
+ E431559E0D6FFE4C00899579 /* PltMediaController.h */,
+ E43155A00D6FFE4C00899579 /* PltMediaRenderer.cpp */,
+ E43155A10D6FFE4C00899579 /* PltMediaRenderer.h */,
+ );
+ name = MediaRenderer;
+ path = ../../../Source/Devices/MediaRenderer;
+ sourceTree = SOURCE_ROOT;
+ };
+ E43155A40D6FFE4C00899579 /* MediaServer */ = {
+ isa = PBXGroup;
+ children = (
+ E402C7541297CECB00565B76 /* ContentDirectorySCPD.cpp */,
+ E4A7DB82108596E400E6ADE2 /* ConnectionManagerSCPD.cpp */,
+ E4A7DB83108596E400E6ADE2 /* ContentDirectorywSearchSCPD.cpp */,
+ E43155A80D6FFE4C00899579 /* PltDidl.cpp */,
+ E43155A90D6FFE4C00899579 /* PltDidl.h */,
+ E43155AA0D6FFE4C00899579 /* PltFileMediaServer.cpp */,
+ E43155AB0D6FFE4C00899579 /* PltFileMediaServer.h */,
+ E43155AC0D6FFE4C00899579 /* PltMediaBrowser.cpp */,
+ E43155AD0D6FFE4C00899579 /* PltMediaBrowser.h */,
+ E43155AF0D6FFE4C00899579 /* PltMediaCache.cpp */,
+ E43155B00D6FFE4C00899579 /* PltMediaCache.h */,
+ E43155B10D6FFE4C00899579 /* PltMediaItem.cpp */,
+ E43155B20D6FFE4C00899579 /* PltMediaItem.h */,
+ E43155B50D6FFE4C00899579 /* PltMediaServer.cpp */,
+ E43155B60D6FFE4C00899579 /* PltMediaServer.h */,
+ E43155B80D6FFE4C00899579 /* PltSyncMediaBrowser.cpp */,
+ E43155B90D6FFE4C00899579 /* PltSyncMediaBrowser.h */,
+ );
+ name = MediaServer;
+ path = ../../../Source/Devices/MediaServer;
+ sourceTree = SOURCE_ROOT;
+ };
+ E4374241123FFE9100000109 /* MediaServerCocoaTest */ = {
+ isa = PBXGroup;
+ children = (
+ E4446FAA12C3168900E01480 /* MediaServerCocoaTestController.mm */,
+ E4374265123FFECE00000109 /* Models */,
+ E4374264123FFEC200000109 /* Other Sources */,
+ E4374252123FFEAE00000109 /* Resources */,
+ E4374248123FFE9100000109 /* MediaServerCocoaTest_AppDelegate.h */,
+ E4374249123FFE9100000109 /* MediaServerCocoaTest_AppDelegate.mm */,
+ E43744C8124014D500000109 /* MediaServerCocoaTestController.h */,
+ );
+ name = MediaServerCocoaTest;
+ path = ../../../Source/Tests/MediaServerCocoaTest;
+ sourceTree = SOURCE_ROOT;
+ };
+ E4374252123FFEAE00000109 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ E4374242123FFE9100000109 /* InfoPlist.strings */,
+ E4374244123FFE9100000109 /* MainMenu.xib */,
+ E4374247123FFE9100000109 /* MediaServerCocoaTest-Info.plist */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ E4374264123FFEC200000109 /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ E4374246123FFE9100000109 /* main.mm */,
+ E437424B123FFE9100000109 /* MediaServerCocoaTest_Prefix.pch */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ E4374265123FFECE00000109 /* Models */ = {
+ isa = PBXGroup;
+ children = (
+ E437424A123FFE9100000109 /* MediaServerCocoaTest_DataModel.xcdatamodel */,
+ );
+ name = Models;
+ sourceTree = "<group>";
+ };
+ E4374C1412417AA800000109 /* ObjectiveC */ = {
+ isa = PBXGroup;
+ children = (
+ E4374C1512417AA800000109 /* PltMediaServerObject.h */,
+ E4374C1612417AA800000109 /* PltMediaServerObject.mm */,
+ E4374C1712417AA800000109 /* PltUPnPObject.h */,
+ E4374C1812417AA800000109 /* PltUPnPObject.mm */,
+ );
+ path = ObjectiveC;
+ sourceTree = "<group>";
+ };
+ E43EEEFC101E1AEF007A9CE7 /* Platinum */ = {
+ isa = PBXGroup;
+ children = (
+ E43EEEFD101E1AEF007A9CE7 /* Platinum.h */,
+ E43EEEFF101E1AEF007A9CE7 /* PltVersion.h */,
+ );
+ name = Platinum;
+ path = ../../../Source/Platinum;
+ sourceTree = SOURCE_ROOT;
+ };
+ E43F6BC710F1B78400C97612 /* Time */ = {
+ isa = PBXGroup;
+ children = (
+ E43F6BC810F1B78400C97612 /* TimeTest1.cpp */,
+ );
+ name = Time;
+ path = ../../../Source/Tests/Time;
+ sourceTree = SOURCE_ROOT;
+ };
+ E44470B312C31B5900E01480 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ E41016151ACFA4E0000E994F /* MobileMediaServer */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ E45332A81AAED263004A52FD /* MediaServer */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = MediaServer;
+ sourceTree = "<group>";
+ };
+ E45332AE1AAED318004A52FD /* MobileMediaServer */ = {
+ isa = PBXGroup;
+ children = (
+ E45332B11AAED318004A52FD /* main.m */,
+ E45332B31AAED318004A52FD /* AppDelegate.h */,
+ E45332B41AAED318004A52FD /* AppDelegate.m */,
+ E45332B61AAED318004A52FD /* ViewController.h */,
+ E45332B71AAED318004A52FD /* ViewController.mm */,
+ );
+ name = MobileMediaServer;
+ path = ../../../Source/Apps/MobileMediaServer;
+ sourceTree = "<group>";
+ };
+ E4B95ECE1446575700DBBF49 /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ E4B95ECF1446575700DBBF49 /* AppKit.framework */,
+ E4B95ED01446575700DBBF49 /* CoreData.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ E410161E1ACFA826000E994F /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E41016671ACFA858000E994F /* PltTaskManager.h in Headers */,
+ E41016501ACFA858000E994F /* PltDeviceHost.h in Headers */,
+ E41016991ACFA8B9000E994F /* PltLeaks.h in Headers */,
+ E41016581ACFA858000E994F /* PltHttpServer.h in Headers */,
+ E41016851ACFA8A1000E994F /* PltMediaItem.h in Headers */,
+ E41016931ACFA8B9000E994F /* PltFrameBuffer.h in Headers */,
+ E41016811ACFA8A1000E994F /* PltMediaBrowser.h in Headers */,
+ E410164C1ACFA858000E994F /* PltDatagramStream.h in Headers */,
+ E410166C1ACFA858000E994F /* PltUtilities.h in Headers */,
+ E410169D1ACFA8B9000E994F /* PltRingBufferStream.h in Headers */,
+ E41016631ACFA858000E994F /* PltSsdp.h in Headers */,
+ E41016261ACFA826000E994F /* Platinum.h in Headers */,
+ E41016461ACFA858000E994F /* PltConstants.h in Headers */,
+ E41016691ACFA858000E994F /* PltThreadTask.h in Headers */,
+ E410168C1ACFA8B9000E994F /* PltUPnPObject.h in Headers */,
+ E410165F1ACFA858000E994F /* PltProtocolInfo.h in Headers */,
+ E41016481ACFA858000E994F /* PltCtrlPoint.h in Headers */,
+ E41016611ACFA858000E994F /* PltService.h in Headers */,
+ E410166E1ACFA887000E994F /* PltXbox360.h in Headers */,
+ E41016541ACFA858000E994F /* PltHttp.h in Headers */,
+ E410169F1ACFA8CC000E994F /* PltVersion.h in Headers */,
+ E41016711ACFA887000E994F /* PltMediaConnect.h in Headers */,
+ E410165A1ACFA858000E994F /* PltHttpServerTask.h in Headers */,
+ E41016871ACFA8A1000E994F /* PltMediaServer.h in Headers */,
+ E410167F1ACFA8A1000E994F /* PltFileMediaServer.h in Headers */,
+ E41016911ACFA8B9000E994F /* PltStreamPump.h in Headers */,
+ E41016831ACFA8A1000E994F /* PltMediaCache.h in Headers */,
+ E41016951ACFA8B9000E994F /* PltFrameServer.h in Headers */,
+ E41016781ACFA893000E994F /* PltMediaRenderer.h in Headers */,
+ E41016441ACFA858000E994F /* PltArgument.h in Headers */,
+ E41016561ACFA858000E994F /* PltHttpClientTask.h in Headers */,
+ E41016891ACFA8A1000E994F /* PltSyncMediaBrowser.h in Headers */,
+ E41016651ACFA858000E994F /* PltStateVariable.h in Headers */,
+ E410168F1ACFA8B9000E994F /* PltDownloader.h in Headers */,
+ E410167D1ACFA8A1000E994F /* PltDidl.h in Headers */,
+ E410166B1ACFA858000E994F /* PltUPnP.h in Headers */,
+ E410164A1ACFA858000E994F /* PltCtrlPointTask.h in Headers */,
+ E410169B1ACFA8B9000E994F /* PltMetadataHandler.h in Headers */,
+ E41016421ACFA858000E994F /* PltAction.h in Headers */,
+ E41016521ACFA858000E994F /* PltEvent.h in Headers */,
+ E410165D1ACFA858000E994F /* PltMimeType.h in Headers */,
+ E410168A1ACFA8B9000E994F /* PltMediaServerObject.h in Headers */,
+ E41016971ACFA8B9000E994F /* PltFrameStream.h in Headers */,
+ E41016761ACFA893000E994F /* PltMediaController.h in Headers */,
+ E48EAA811AF1EDD800D9EDC0 /* Neptune.h in Headers */,
+ E410164E1ACFA858000E994F /* PltDeviceData.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E44E2B591AE761220092347B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2B5A1AE761220092347B /* PltTaskManager.h in Headers */,
+ E44E2B5B1AE761220092347B /* PltDeviceHost.h in Headers */,
+ E44E2B5C1AE761220092347B /* PltLeaks.h in Headers */,
+ E44E2B5D1AE761220092347B /* PltHttpServer.h in Headers */,
+ E44E2B5E1AE761220092347B /* PltMediaItem.h in Headers */,
+ E44E2B5F1AE761220092347B /* PltFrameBuffer.h in Headers */,
+ E44E2B601AE761220092347B /* PltMediaBrowser.h in Headers */,
+ E44E2B611AE761220092347B /* PltDatagramStream.h in Headers */,
+ E44E2B621AE761220092347B /* PltUtilities.h in Headers */,
+ E44E2B631AE761220092347B /* PltRingBufferStream.h in Headers */,
+ E44E2B641AE761220092347B /* PltSsdp.h in Headers */,
+ E44E2B651AE761220092347B /* Platinum.h in Headers */,
+ E44E2B661AE761220092347B /* PltConstants.h in Headers */,
+ E44E2B671AE761220092347B /* PltThreadTask.h in Headers */,
+ E44E2B681AE761220092347B /* PltUPnPObject.h in Headers */,
+ E44E2B691AE761220092347B /* PltProtocolInfo.h in Headers */,
+ E44E2B6A1AE761220092347B /* PltCtrlPoint.h in Headers */,
+ E44E2B6B1AE761220092347B /* PltService.h in Headers */,
+ E44E2B6C1AE761220092347B /* PltXbox360.h in Headers */,
+ E44E2B6D1AE761220092347B /* PltHttp.h in Headers */,
+ E44E2B6E1AE761220092347B /* PltVersion.h in Headers */,
+ E44E2B6F1AE761220092347B /* PltMediaConnect.h in Headers */,
+ E44E2B701AE761220092347B /* PltHttpServerTask.h in Headers */,
+ E44E2B711AE761220092347B /* PltMediaServer.h in Headers */,
+ E44E2B721AE761220092347B /* PltFileMediaServer.h in Headers */,
+ E44E2B731AE761220092347B /* PltStreamPump.h in Headers */,
+ E44E2B741AE761220092347B /* PltMediaCache.h in Headers */,
+ E44E2B751AE761220092347B /* PltFrameServer.h in Headers */,
+ E44E2B761AE761220092347B /* PltMediaRenderer.h in Headers */,
+ E44E2B771AE761220092347B /* PltArgument.h in Headers */,
+ E44E2B781AE761220092347B /* PltHttpClientTask.h in Headers */,
+ E44E2B791AE761220092347B /* PltSyncMediaBrowser.h in Headers */,
+ E44E2B7A1AE761220092347B /* PltStateVariable.h in Headers */,
+ E44E2B7B1AE761220092347B /* PltDownloader.h in Headers */,
+ E44E2B7C1AE761220092347B /* PltDidl.h in Headers */,
+ E44E2B7D1AE761220092347B /* PltUPnP.h in Headers */,
+ E44E2B7E1AE761220092347B /* PltCtrlPointTask.h in Headers */,
+ E44E2B7F1AE761220092347B /* PltMetadataHandler.h in Headers */,
+ E44E2B801AE761220092347B /* PltAction.h in Headers */,
+ E44E2B811AE761220092347B /* PltEvent.h in Headers */,
+ E44E2B821AE761220092347B /* PltMimeType.h in Headers */,
+ E44E2B831AE761220092347B /* PltMediaServerObject.h in Headers */,
+ E44E2B841AE761220092347B /* PltFrameStream.h in Headers */,
+ E48EAA821AF1EDD800D9EDC0 /* Neptune.h in Headers */,
+ E44E2B851AE761220092347B /* PltMediaController.h in Headers */,
+ E44E2B861AE761220092347B /* PltDeviceData.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ E41016201ACFA826000E994F /* Platinum-iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E410163A1ACFA826000E994F /* Build configuration list for PBXNativeTarget "Platinum-iOS" */;
+ buildPhases = (
+ E410161C1ACFA826000E994F /* Sources */,
+ E410161D1ACFA826000E994F /* Frameworks */,
+ E410161E1ACFA826000E994F /* Headers */,
+ E410161F1ACFA826000E994F /* Resources */,
+ E4B2A5A41FC8F8EB00C891D7 /* Copy Products to Carthage/Build/iOS */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Platinum-iOS";
+ productName = Platinum;
+ productReference = E41016211ACFA826000E994F /* Platinum.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ E423F35B18415DC500E24E39 /* SsdpTest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E423F36518415DC500E24E39 /* Build configuration list for PBXNativeTarget "SsdpTest" */;
+ buildPhases = (
+ E423F35E18415DC500E24E39 /* Sources */,
+ E423F36018415DC500E24E39 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BF31AE779700092347B /* PBXTargetDependency */,
+ );
+ name = SsdpTest;
+ productName = HttpTest;
+ productReference = E423F36818415DC500E24E39 /* SsdpTest */;
+ productType = "com.apple.product-type.tool";
+ };
+ E42D3ABC0FDC87130045379C /* MediaCrawler */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E42D3AC30FDC87290045379C /* Build configuration list for PBXNativeTarget "MediaCrawler" */;
+ buildPhases = (
+ E42D3ABA0FDC87130045379C /* Sources */,
+ E42D3ABB0FDC87130045379C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BDB1AE776060092347B /* PBXTargetDependency */,
+ );
+ name = MediaCrawler;
+ productName = MediaCrawler;
+ productReference = E42D3ABD0FDC87130045379C /* MediaCrawler */;
+ productType = "com.apple.product-type.tool";
+ };
+ E42D3AD20FDC87DB0045379C /* MediaConnect */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E42D3AF30FDC88180045379C /* Build configuration list for PBXNativeTarget "MediaConnect" */;
+ buildPhases = (
+ E42D3AD00FDC87DB0045379C /* Sources */,
+ E42D3AD10FDC87DB0045379C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BE11AE779130092347B /* PBXTargetDependency */,
+ );
+ name = MediaConnect;
+ productName = MediaConnect;
+ productReference = E42D3AD30FDC87DB0045379C /* MediaConnect */;
+ productType = "com.apple.product-type.tool";
+ };
+ E42D3ADC0FDC87F50045379C /* MicroMediaController */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E42D3AF40FDC88180045379C /* Build configuration list for PBXNativeTarget "MicroMediaController" */;
+ buildPhases = (
+ E42D3ADA0FDC87F50045379C /* Sources */,
+ E42D3ADB0FDC87F50045379C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BE31AE7794D0092347B /* PBXTargetDependency */,
+ );
+ name = MicroMediaController;
+ productName = MicroMediaController;
+ productReference = E42D3ADD0FDC87F50045379C /* MicroMediaController */;
+ productType = "com.apple.product-type.tool";
+ };
+ E42D3AE60FDC880D0045379C /* FrameStreamer */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E42D3AF50FDC88180045379C /* Build configuration list for PBXNativeTarget "FrameStreamer" */;
+ buildPhases = (
+ E42D3AE40FDC880D0045379C /* Sources */,
+ E42D3AE50FDC880D0045379C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BE51AE779520092347B /* PBXTargetDependency */,
+ );
+ name = FrameStreamer;
+ productName = FrameStreamer;
+ productReference = E42D3AE70FDC880D0045379C /* FrameStreamer */;
+ productType = "com.apple.product-type.tool";
+ };
+ E42D3B1A0FDC895A0045379C /* FileMediaServerTest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E42D3B340FDC89B70045379C /* Build configuration list for PBXNativeTarget "FileMediaServerTest" */;
+ buildPhases = (
+ E42D3B180FDC895A0045379C /* Sources */,
+ E42D3B190FDC895A0045379C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BE71AE779580092347B /* PBXTargetDependency */,
+ );
+ name = FileMediaServerTest;
+ productName = FileMediaServerTest;
+ productReference = E42D3B1B0FDC895A0045379C /* FileMediaServerTest */;
+ productType = "com.apple.product-type.tool";
+ };
+ E42D3B250FDC89720045379C /* HttpTest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E42D3B350FDC89B70045379C /* Build configuration list for PBXNativeTarget "HttpTest" */;
+ buildPhases = (
+ E42D3B230FDC89720045379C /* Sources */,
+ E42D3B240FDC89720045379C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BE91AE7795C0092347B /* PBXTargetDependency */,
+ );
+ name = HttpTest;
+ productName = HttpTest;
+ productReference = E42D3B260FDC89720045379C /* HttpTest */;
+ productType = "com.apple.product-type.tool";
+ };
+ E42D3B380FDC89B70045379C /* LightSampleTest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E42D3B8D0FDC8AC10045379C /* Build configuration list for PBXNativeTarget "LightSampleTest" */;
+ buildPhases = (
+ E42D3B360FDC89B70045379C /* Sources */,
+ E42D3B370FDC89B70045379C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BEB1AE779600092347B /* PBXTargetDependency */,
+ );
+ name = LightSampleTest;
+ productName = LightSampleTest;
+ productReference = E42D3B390FDC89B70045379C /* LightSampleTest */;
+ productType = "com.apple.product-type.tool";
+ };
+ E42D3B440FDC89CD0045379C /* MediaRendererTest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E42D3B8E0FDC8AC10045379C /* Build configuration list for PBXNativeTarget "MediaRendererTest" */;
+ buildPhases = (
+ E42D3B420FDC89CD0045379C /* Sources */,
+ E42D3B430FDC89CD0045379C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BED1AE779640092347B /* PBXTargetDependency */,
+ );
+ name = MediaRendererTest;
+ productName = MediaRendererTest;
+ productReference = E42D3B450FDC89CD0045379C /* MediaRendererTest */;
+ productType = "com.apple.product-type.tool";
+ };
+ E42D3B4F0FDC89E10045379C /* SimpleTest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E42D3B8F0FDC8AC10045379C /* Build configuration list for PBXNativeTarget "SimpleTest" */;
+ buildPhases = (
+ E42D3B4D0FDC89E10045379C /* Sources */,
+ E42D3B4E0FDC89E10045379C /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BEF1AE779680092347B /* PBXTargetDependency */,
+ );
+ name = SimpleTest;
+ productName = SimpleTest;
+ productReference = E42D3B500FDC89E10045379C /* SimpleTest */;
+ productType = "com.apple.product-type.tool";
+ };
+ E43741FB123FFB9800000109 /* MediaServerCocoaTest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E4374201123FFB9800000109 /* Build configuration list for PBXNativeTarget "MediaServerCocoaTest" */;
+ buildPhases = (
+ E43741F8123FFB9800000109 /* Resources */,
+ E43741F9123FFB9800000109 /* Sources */,
+ E43741FA123FFB9800000109 /* Frameworks */,
+ E4516B8E1446C3F600EC613B /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BC31AE76D7B0092347B /* PBXTargetDependency */,
+ );
+ name = MediaServerCocoaTest;
+ productName = MediaServerCocoaTest;
+ productReference = E43741FC123FFB9800000109 /* MediaServerCocoaTest.app */;
+ productType = "com.apple.product-type.application";
+ };
+ E43F6BBB10F1B74E00C97612 /* TimeTest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E43F6BC210F1B74E00C97612 /* Build configuration list for PBXNativeTarget "TimeTest" */;
+ buildPhases = (
+ E43F6BBE10F1B74E00C97612 /* Sources */,
+ E43F6BC010F1B74E00C97612 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E44E2BF11AE7796C0092347B /* PBXTargetDependency */,
+ );
+ name = TimeTest;
+ productName = SsdpTest;
+ productReference = E43F6BC510F1B74E00C97612 /* TimeTest */;
+ productType = "com.apple.product-type.tool";
+ };
+ E44E2B231AE761220092347B /* Platinum-Mac */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E44E2B881AE761220092347B /* Build configuration list for PBXNativeTarget "Platinum-Mac" */;
+ buildPhases = (
+ E44E2B241AE761220092347B /* Sources */,
+ E44E2B571AE761220092347B /* Frameworks */,
+ E44E2B591AE761220092347B /* Headers */,
+ E44E2B871AE761220092347B /* Resources */,
+ E4B2A5A51FC8F8F100C891D7 /* Copy Products to Carthage/Build/iOS */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Platinum-Mac";
+ productName = Platinum;
+ productReference = E44E2B8B1AE761220092347B /* Platinum.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ E45332AC1AAED318004A52FD /* MobileMediaServer */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = E45332CD1AAED318004A52FD /* Build configuration list for PBXNativeTarget "MobileMediaServer" */;
+ buildPhases = (
+ E45332A91AAED318004A52FD /* Sources */,
+ E45332AA1AAED318004A52FD /* Frameworks */,
+ E45332AB1AAED318004A52FD /* Resources */,
+ E410163D1ACFA826000E994F /* Embed Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E41016371ACFA826000E994F /* PBXTargetDependency */,
+ );
+ name = MobileMediaServer;
+ productName = MobileMediaServer;
+ productReference = E45332AD1AAED318004A52FD /* MobileMediaServer.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0620;
+ TargetAttributes = {
+ E41016201ACFA826000E994F = {
+ CreatedOnToolsVersion = 6.2;
+ };
+ E44E2BD01AE775510092347B = {
+ CreatedOnToolsVersion = 6.3;
+ };
+ E45332AC1AAED318004A52FD = {
+ CreatedOnToolsVersion = 6.2;
+ };
+ };
+ };
+ buildConfigurationList = 1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "Platinum" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ en,
+ Base,
+ );
+ mainGroup = 08FB7794FE84155DC02AAC07 /* Platinum */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ E42D3B040FDC890A0045379C /* Apps */,
+ E42D3B640FDC8A120045379C /* Tests */,
+ E42D3B730FDC8A210045379C /* All */,
+ E459CC2111F82C3F00621896 /* Help */,
+ E44E2BD01AE775510092347B /* Frameworks */,
+ E42D3ABC0FDC87130045379C /* MediaCrawler */,
+ E42D3AD20FDC87DB0045379C /* MediaConnect */,
+ E42D3ADC0FDC87F50045379C /* MicroMediaController */,
+ E42D3AE60FDC880D0045379C /* FrameStreamer */,
+ E42D3B1A0FDC895A0045379C /* FileMediaServerTest */,
+ E42D3B250FDC89720045379C /* HttpTest */,
+ E42D3B380FDC89B70045379C /* LightSampleTest */,
+ E42D3B440FDC89CD0045379C /* MediaRendererTest */,
+ E42D3B4F0FDC89E10045379C /* SimpleTest */,
+ E43F6BBB10F1B74E00C97612 /* TimeTest */,
+ E423F35B18415DC500E24E39 /* SsdpTest */,
+ E43741FB123FFB9800000109 /* MediaServerCocoaTest */,
+ E45332AC1AAED318004A52FD /* MobileMediaServer */,
+ E41016201ACFA826000E994F /* Platinum-iOS */,
+ E44E2B231AE761220092347B /* Platinum-Mac */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ E410161F1ACFA826000E994F /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E43741F8123FFB9800000109 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E437424C123FFE9100000109 /* InfoPlist.strings in Resources */,
+ E437424D123FFE9100000109 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E44E2B871AE761220092347B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E45332AB1AAED318004A52FD /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E410161B1ACFA761000E994F /* Main.storyboard in Resources */,
+ E410161A1ACFA761000E994F /* LaunchScreen.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ E459CC2011F82C3F00621896 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "# shell script goes here\n# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n\ncd \"$SOURCE_ROOT/../../../Docs/Doxygen\"\nDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\necho $(pwd)\n\nif ! [ -f Doxyfile ] \nthen \n echo doxygen config file does not exist\nfi\n\nVERSION=$(python ../../Scripts/version.py)\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n\n( cat Doxyfile ; echo \"PROJECT_NUMBER=$VERSION\" ) | /usr/local/bin/doxygen -\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\n\nmake -C Platinum-HTML install\n\n# Construct a temporary applescript file to tell Xcode to load a docset.\n\nrm -f \"$TEMP_DIR/loadDocSet.scpt\"\n\necho \"tell application \\\"Xcode\\\"\" >> \"$TEMP_DIR/loadDocSet.scpt\"\necho \"load documentation set with path \\\"/Users/$USER/Library/Developer/Shared/Documentation/DocSets/\\\"\" \n >> $TEMP_DIR/loadDocSet.scpt\necho \"end tell\" >> \"$TEMP_DIR/loadDocSet.scpt\"\n\n# Run the load-docset applescript command.\n\nosascript \"$TEMP_DIR/loadDocSet.scpt\"\n\nexit 0";
+ };
+ E4B2A5A41FC8F8EB00C891D7 /* Copy Products to Carthage/Build/iOS */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Copy Products to Carthage/Build/iOS";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "build_dir=\"$SRCROOT/../../../Carthage/Build\"\n\n# Only copy when the Carthage/Build directory is a symlink\nif ! [ -L \"$build_dir\" ]; then exit 0; fi\n\nrsync --delete -av \"$BUILT_PRODUCTS_DIR/$PRODUCT_NAME\"* \"$build_dir/iOS\"";
+ };
+ E4B2A5A51FC8F8F100C891D7 /* Copy Products to Carthage/Build/iOS */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Copy Products to Carthage/Build/iOS";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "build_dir=\"$SRCROOT/../../../Carthage/Build\"\n\n# Only copy when the Carthage/Build directory is a symlink\nif ! [ -L \"$build_dir\" ]; then exit 0; fi\n\nrsync --delete -av \"$BUILT_PRODUCTS_DIR/$PRODUCT_NAME\"* \"$build_dir/Mac\"";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ E410161C1ACFA826000E994F /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E410168B1ACFA8B9000E994F /* PltMediaServerObject.mm in Sources */,
+ E41016941ACFA8B9000E994F /* PltFrameServer.cpp in Sources */,
+ E410169C1ACFA8B9000E994F /* PltRingBufferStream.cpp in Sources */,
+ E41016531ACFA858000E994F /* PltHttp.cpp in Sources */,
+ E410164F1ACFA858000E994F /* PltDeviceHost.cpp in Sources */,
+ E41016751ACFA893000E994F /* PltMediaController.cpp in Sources */,
+ E410165E1ACFA858000E994F /* PltProtocolInfo.cpp in Sources */,
+ E41016471ACFA858000E994F /* PltCtrlPoint.cpp in Sources */,
+ E410166F1ACFA887000E994F /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */,
+ E41016731ACFA893000E994F /* RdrConnectionManagerSCPD.cpp in Sources */,
+ E41016901ACFA8B9000E994F /* PltStreamPump.cpp in Sources */,
+ E41016741ACFA893000E994F /* RenderingControlSCPD.cpp in Sources */,
+ E41016841ACFA8A1000E994F /* PltMediaItem.cpp in Sources */,
+ E41016771ACFA893000E994F /* PltMediaRenderer.cpp in Sources */,
+ E410167E1ACFA8A1000E994F /* PltFileMediaServer.cpp in Sources */,
+ E410167C1ACFA8A1000E994F /* PltDidl.cpp in Sources */,
+ E410164B1ACFA858000E994F /* PltDatagramStream.cpp in Sources */,
+ E41016681ACFA858000E994F /* PltThreadTask.cpp in Sources */,
+ E41016491ACFA858000E994F /* PltCtrlPointTask.cpp in Sources */,
+ E41016961ACFA8B9000E994F /* PltFrameStream.cpp in Sources */,
+ E410167B1ACFA8A1000E994F /* ContentDirectorywSearchSCPD.cpp in Sources */,
+ E410169A1ACFA8B9000E994F /* PltMetadataHandler.cpp in Sources */,
+ E410166A1ACFA858000E994F /* PltUPnP.cpp in Sources */,
+ E41016511ACFA858000E994F /* PltEvent.cpp in Sources */,
+ E41016591ACFA858000E994F /* PltHttpServerTask.cpp in Sources */,
+ E410168E1ACFA8B9000E994F /* PltDownloader.cpp in Sources */,
+ E41016551ACFA858000E994F /* PltHttpClientTask.cpp in Sources */,
+ E41016701ACFA887000E994F /* PltMediaConnect.cpp in Sources */,
+ E41016801ACFA8A1000E994F /* PltMediaBrowser.cpp in Sources */,
+ E410166D1ACFA887000E994F /* PltXbox360.cpp in Sources */,
+ E41016721ACFA893000E994F /* AVTransportSCPD.cpp in Sources */,
+ E41016981ACFA8B9000E994F /* PltLeaks.cpp in Sources */,
+ E41016661ACFA858000E994F /* PltTaskManager.cpp in Sources */,
+ E41016821ACFA8A1000E994F /* PltMediaCache.cpp in Sources */,
+ E41016411ACFA858000E994F /* PltAction.cpp in Sources */,
+ E41016621ACFA858000E994F /* PltSsdp.cpp in Sources */,
+ E410165B1ACFA858000E994F /* PltIconsData.cpp in Sources */,
+ E41016431ACFA858000E994F /* PltArgument.cpp in Sources */,
+ E41016921ACFA8B9000E994F /* PltFrameBuffer.cpp in Sources */,
+ E41016571ACFA858000E994F /* PltHttpServer.cpp in Sources */,
+ E41016641ACFA858000E994F /* PltStateVariable.cpp in Sources */,
+ E41016861ACFA8A1000E994F /* PltMediaServer.cpp in Sources */,
+ E41016881ACFA8A1000E994F /* PltSyncMediaBrowser.cpp in Sources */,
+ E410164D1ACFA858000E994F /* PltDeviceData.cpp in Sources */,
+ E41016451ACFA858000E994F /* PltConstants.cpp in Sources */,
+ E41016791ACFA8A1000E994F /* ContentDirectorySCPD.cpp in Sources */,
+ E410168D1ACFA8B9000E994F /* PltUPnPObject.mm in Sources */,
+ E41016601ACFA858000E994F /* PltService.cpp in Sources */,
+ E410165C1ACFA858000E994F /* PltMimeType.cpp in Sources */,
+ E410167A1ACFA8A1000E994F /* ConnectionManagerSCPD.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E423F35E18415DC500E24E39 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E423F36918415DF900E24E39 /* SsdpTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3ABA0FDC87130045379C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E42D3AC40FDC87300045379C /* MediaCrawler.cpp in Sources */,
+ E42D3AC50FDC87310045379C /* main.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3AD00FDC87DB0045379C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E42D3B110FDC89200045379C /* main.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3ADA0FDC87F50045379C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E42D3B120FDC89260045379C /* main.cpp in Sources */,
+ E42D3B130FDC89270045379C /* PltMicroMediaController.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3AE40FDC880D0045379C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E42D3B150FDC892B0045379C /* main.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B180FDC895A0045379C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E42D3B220FDC89690045379C /* FileMediaServerTest.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B230FDC89720045379C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E42D3B330FDC89990045379C /* HttpTest.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B360FDC89B70045379C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E42D3B400FDC89C40045379C /* LightSampleTest.cpp in Sources */,
+ E42D3B410FDC89C40045379C /* PltLightSample.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B420FDC89CD0045379C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E42D3B4C0FDC89D90045379C /* MediaRendererTest.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E42D3B4D0FDC89E10045379C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E42D3B570FDC89ED0045379C /* SimpleTest.cpp in Sources */,
+ E42D3B580FDC89ED0045379C /* PltSimple.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E43741F9123FFB9800000109 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E437424E123FFE9100000109 /* main.mm in Sources */,
+ E4374250123FFE9100000109 /* MediaServerCocoaTest_AppDelegate.mm in Sources */,
+ E4374251123FFE9100000109 /* MediaServerCocoaTest_DataModel.xcdatamodel in Sources */,
+ E4446FAB12C3168900E01480 /* MediaServerCocoaTestController.mm in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E43F6BBE10F1B74E00C97612 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E43F6BC910F1B78400C97612 /* TimeTest1.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E44E2B241AE761220092347B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E44E2B251AE761220092347B /* PltMediaServerObject.mm in Sources */,
+ E44E2B261AE761220092347B /* PltFrameServer.cpp in Sources */,
+ E44E2B271AE761220092347B /* PltRingBufferStream.cpp in Sources */,
+ E44E2B281AE761220092347B /* PltHttp.cpp in Sources */,
+ E44E2B291AE761220092347B /* PltDeviceHost.cpp in Sources */,
+ E44E2B2A1AE761220092347B /* PltMediaController.cpp in Sources */,
+ E44E2B2B1AE761220092347B /* PltProtocolInfo.cpp in Sources */,
+ E44E2B2C1AE761220092347B /* PltCtrlPoint.cpp in Sources */,
+ E44E2B2D1AE761220092347B /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */,
+ E44E2B2E1AE761220092347B /* RdrConnectionManagerSCPD.cpp in Sources */,
+ E44E2B2F1AE761220092347B /* PltStreamPump.cpp in Sources */,
+ E44E2B301AE761220092347B /* RenderingControlSCPD.cpp in Sources */,
+ E44E2B311AE761220092347B /* PltMediaItem.cpp in Sources */,
+ E44E2B321AE761220092347B /* PltMediaRenderer.cpp in Sources */,
+ E44E2B331AE761220092347B /* PltFileMediaServer.cpp in Sources */,
+ E44E2B341AE761220092347B /* PltDidl.cpp in Sources */,
+ E44E2B351AE761220092347B /* PltDatagramStream.cpp in Sources */,
+ E44E2B361AE761220092347B /* PltThreadTask.cpp in Sources */,
+ E44E2B371AE761220092347B /* PltCtrlPointTask.cpp in Sources */,
+ E44E2B381AE761220092347B /* PltFrameStream.cpp in Sources */,
+ E44E2B391AE761220092347B /* ContentDirectorywSearchSCPD.cpp in Sources */,
+ E44E2B3A1AE761220092347B /* PltMetadataHandler.cpp in Sources */,
+ E44E2B3B1AE761220092347B /* PltUPnP.cpp in Sources */,
+ E44E2B3C1AE761220092347B /* PltEvent.cpp in Sources */,
+ E44E2B3D1AE761220092347B /* PltHttpServerTask.cpp in Sources */,
+ E44E2B3E1AE761220092347B /* PltDownloader.cpp in Sources */,
+ E44E2B3F1AE761220092347B /* PltHttpClientTask.cpp in Sources */,
+ E44E2B401AE761220092347B /* PltMediaConnect.cpp in Sources */,
+ E44E2B411AE761220092347B /* PltMediaBrowser.cpp in Sources */,
+ E44E2B421AE761220092347B /* PltXbox360.cpp in Sources */,
+ E44E2B431AE761220092347B /* AVTransportSCPD.cpp in Sources */,
+ E44E2B441AE761220092347B /* PltLeaks.cpp in Sources */,
+ E44E2B451AE761220092347B /* PltTaskManager.cpp in Sources */,
+ E44E2B461AE761220092347B /* PltMediaCache.cpp in Sources */,
+ E44E2B471AE761220092347B /* PltAction.cpp in Sources */,
+ E44E2B481AE761220092347B /* PltSsdp.cpp in Sources */,
+ E44E2B491AE761220092347B /* PltIconsData.cpp in Sources */,
+ E44E2B4A1AE761220092347B /* PltArgument.cpp in Sources */,
+ E44E2B4B1AE761220092347B /* PltFrameBuffer.cpp in Sources */,
+ E44E2B4C1AE761220092347B /* PltHttpServer.cpp in Sources */,
+ E44E2B4D1AE761220092347B /* PltStateVariable.cpp in Sources */,
+ E44E2B4E1AE761220092347B /* PltMediaServer.cpp in Sources */,
+ E44E2B4F1AE761220092347B /* PltSyncMediaBrowser.cpp in Sources */,
+ E44E2B501AE761220092347B /* PltDeviceData.cpp in Sources */,
+ E44E2B511AE761220092347B /* PltConstants.cpp in Sources */,
+ E44E2B521AE761220092347B /* ContentDirectorySCPD.cpp in Sources */,
+ E44E2B531AE761220092347B /* PltUPnPObject.mm in Sources */,
+ E44E2B541AE761220092347B /* PltService.cpp in Sources */,
+ E44E2B551AE761220092347B /* PltMimeType.cpp in Sources */,
+ E44E2B561AE761220092347B /* ConnectionManagerSCPD.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E45332A91AAED318004A52FD /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E45332B81AAED318004A52FD /* ViewController.mm in Sources */,
+ E45332B51AAED318004A52FD /* AppDelegate.m in Sources */,
+ E45332B21AAED318004A52FD /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ E41016371ACFA826000E994F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E41016201ACFA826000E994F /* Platinum-iOS */;
+ targetProxy = E41016361ACFA826000E994F /* PBXContainerItemProxy */;
+ };
+ E42D3B080FDC890F0045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3ABC0FDC87130045379C /* MediaCrawler */;
+ targetProxy = E42D3B070FDC890F0045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B0A0FDC890F0045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3AD20FDC87DB0045379C /* MediaConnect */;
+ targetProxy = E42D3B090FDC890F0045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B0C0FDC890F0045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3ADC0FDC87F50045379C /* MicroMediaController */;
+ targetProxy = E42D3B0B0FDC890F0045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B0E0FDC890F0045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3AE60FDC880D0045379C /* FrameStreamer */;
+ targetProxy = E42D3B0D0FDC890F0045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B680FDC8A180045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3B1A0FDC895A0045379C /* FileMediaServerTest */;
+ targetProxy = E42D3B670FDC8A180045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B6A0FDC8A180045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3B250FDC89720045379C /* HttpTest */;
+ targetProxy = E42D3B690FDC8A180045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B6C0FDC8A180045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3B380FDC89B70045379C /* LightSampleTest */;
+ targetProxy = E42D3B6B0FDC8A180045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B6E0FDC8A180045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3B440FDC89CD0045379C /* MediaRendererTest */;
+ targetProxy = E42D3B6D0FDC8A180045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B700FDC8A180045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3B4F0FDC89E10045379C /* SimpleTest */;
+ targetProxy = E42D3B6F0FDC8A180045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B770FDC8A290045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3B040FDC890A0045379C /* Apps */;
+ targetProxy = E42D3B760FDC8A290045379C /* PBXContainerItemProxy */;
+ };
+ E42D3B790FDC8A290045379C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E42D3B640FDC8A120045379C /* Tests */;
+ targetProxy = E42D3B780FDC8A290045379C /* PBXContainerItemProxy */;
+ };
+ E44470C112C31C1100E01480 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E43741FB123FFB9800000109 /* MediaServerCocoaTest */;
+ targetProxy = E44470C012C31C1100E01480 /* PBXContainerItemProxy */;
+ };
+ E44E2BC31AE76D7B0092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BC21AE76D7B0092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BD51AE7755C0092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E41016201ACFA826000E994F /* Platinum-iOS */;
+ targetProxy = E44E2BD41AE7755C0092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BD71AE7755C0092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BD61AE7755C0092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BD91AE775600092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2BD01AE775510092347B /* Frameworks */;
+ targetProxy = E44E2BD81AE775600092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BDB1AE776060092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BDA1AE776060092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BE11AE779130092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BE01AE779130092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BE31AE7794D0092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BE21AE7794D0092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BE51AE779520092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BE41AE779520092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BE71AE779580092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BE61AE779580092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BE91AE7795C0092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BE81AE7795C0092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BEB1AE779600092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BEA1AE779600092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BED1AE779640092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BEC1AE779640092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BEF1AE779680092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BEE1AE779680092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BF11AE7796C0092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BF01AE7796C0092347B /* PBXContainerItemProxy */;
+ };
+ E44E2BF31AE779700092347B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E44E2B231AE761220092347B /* Platinum-Mac */;
+ targetProxy = E44E2BF21AE779700092347B /* PBXContainerItemProxy */;
+ };
+ E459CC2811F82C7F00621896 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = E459CC2111F82C3F00621896 /* Help */;
+ targetProxy = E459CC2711F82C7F00621896 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ E4374242123FFE9100000109 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ E4374243123FFE9100000109 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ E4374244123FFE9100000109 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ E4374245123FFE9100000109 /* English */,
+ );
+ name = MainMenu.xib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB91F108733DB70010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1.0;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ DYLIB_CURRENT_VERSION = 1.0.1.0;
+ GCC_GENERATE_TEST_COVERAGE_FILES = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ NPT_CONFIG_ENABLE_LOGGING,
+ PLATINUM_UPNP_SPECS_STRICT,
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = NO;
+ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ GCC_VERSION = "";
+ GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+ GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
+ GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_PEDANTIC = YES;
+ GCC_WARN_SHADOW = YES;
+ GCC_WARN_SIGN_COMPARE = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNKNOWN_PRAGMAS = YES;
+ GCC_WARN_UNUSED_FUNCTION = NO;
+ GCC_WARN_UNUSED_LABEL = YES;
+ GCC_WARN_UNUSED_PARAMETER = YES;
+ GCC_WARN_UNUSED_VALUE = YES;
+ GCC_WARN_UNUSED_VARIABLE = NO;
+ MACOSX_DEPLOYMENT_TARGET = 10.10;
+ ONLY_ACTIVE_ARCH = NO;
+ WARNING_CFLAGS = (
+ "-Wextra",
+ "-Wno-long-long",
+ );
+ };
+ name = Release;
+ };
+ E410163B1ACFA826000E994F /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/iOS",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/iOS/Neptune.framework/Headers",
+ );
+ INFOPLIST_FILE = Platinum/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 8.2;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ MACOSX_DEPLOYMENT_TARGET = "";
+ MTL_ENABLE_DEBUG_INFO = YES;
+ PRODUCT_NAME = Platinum;
+ SDKROOT = iphoneos;
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ E410163C1ACFA826000E994F /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/iOS",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/iOS/Neptune.framework/Headers",
+ );
+ INFOPLIST_FILE = Platinum/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 8.2;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ MACOSX_DEPLOYMENT_TARGET = "";
+ MTL_ENABLE_DEBUG_INFO = NO;
+ PRODUCT_NAME = Platinum;
+ SDKROOT = iphoneos;
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ E423F36618415DC500E24E39 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = SsdpTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E423F36718415DC500E24E39 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = SsdpTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3ABF0FDC87140045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = MediaCrawler;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E42D3AC00FDC87140045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = MediaCrawler;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3AD50FDC87DC0045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = MediaConnect;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E42D3AD60FDC87DC0045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = MediaConnect;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3ADF0FDC87F60045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = MicroMediaController;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E42D3AE00FDC87F60045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = MicroMediaController;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3AE90FDC880D0045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = FrameStreamer;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E42D3AEA0FDC880D0045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = FrameStreamer;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3B050FDC890A0045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ PRODUCT_NAME = Apps;
+ };
+ name = Debug;
+ };
+ E42D3B060FDC890A0045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ PRODUCT_NAME = Apps;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3B1D0FDC895B0045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = FileMediaServerTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E42D3B1E0FDC895B0045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = FileMediaServerTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3B280FDC89720045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = HttpTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E42D3B290FDC89720045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = HttpTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3B3B0FDC89B80045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = LightSampleTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E42D3B3C0FDC89B80045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = LightSampleTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3B470FDC89CE0045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = MediaRendererTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E42D3B480FDC89CE0045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = MediaRendererTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3B520FDC89E20045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = SimpleTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E42D3B530FDC89E20045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = SimpleTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3B650FDC8A120045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ PRODUCT_NAME = Tests;
+ };
+ name = Debug;
+ };
+ E42D3B660FDC8A120045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ PRODUCT_NAME = Tests;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E42D3B740FDC8A210045379C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ PRODUCT_NAME = All;
+ };
+ name = Debug;
+ };
+ E42D3B750FDC8A210045379C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ PRODUCT_NAME = All;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E43741FF123FFB9800000109 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = YES;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = ../../../Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_Prefix.pch;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = NO;
+ GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+ GCC_VERSION = "";
+ GCC_WARN_ABOUT_MISSING_NEWLINE = NO;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+ GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
+ GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = NO;
+ GCC_WARN_MISSING_PARENTHESES = NO;
+ GCC_WARN_PEDANTIC = NO;
+ GCC_WARN_SHADOW = NO;
+ GCC_WARN_SIGN_COMPARE = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = NO;
+ GCC_WARN_UNUSED_PARAMETER = NO;
+ GCC_WARN_UNUSED_VALUE = NO;
+ INFOPLIST_FILE = "../../../Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest-Info.plist";
+ INSTALL_PATH = "$(HOME)/Applications";
+ LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = MediaServerCocoaTest;
+ SDKROOT = macosx;
+ STRIP_INSTALLED_PRODUCT = NO;
+ SUPPORTED_PLATFORMS = macosx;
+ WARNING_CFLAGS = "";
+ };
+ name = Debug;
+ };
+ E4374200123FFB9800000109 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = ../../../Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_Prefix.pch;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+ GCC_VERSION = "";
+ GCC_WARN_UNUSED_PARAMETER = NO;
+ GCC_WARN_UNUSED_VALUE = NO;
+ INFOPLIST_FILE = "../../../Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest-Info.plist";
+ INSTALL_PATH = "$(HOME)/Applications";
+ LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
+ PRODUCT_NAME = MediaServerCocoaTest;
+ SDKROOT = macosx;
+ STRIP_INSTALLED_PRODUCT = YES;
+ SUPPORTED_PLATFORMS = macosx;
+ WARNING_CFLAGS = "";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E43F6BC310F1B74E00C97612 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = TimeTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Debug;
+ };
+ E43F6BC410F1B74E00C97612 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INSTALL_PATH = /usr/local/bin;
+ LD_RUNPATH_SEARCH_PATHS = "$(SRCROOT)/../../../Carthage/Build/Mac";
+ PRODUCT_NAME = TimeTest;
+ SUPPORTED_PLATFORMS = macosx;
+ VALID_ARCHS = "i386 x86_64";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E44E2B891AE761220092347B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ /Users/sylvain/dev/Plutinosoft/Platinum/Carthage/Build/Mac,
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INFOPLIST_FILE = Platinum/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ MTL_ENABLE_DEBUG_INFO = YES;
+ PRODUCT_NAME = Platinum;
+ SDKROOT = macosx;
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = macosx;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ E44E2B8A1AE761220092347B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/Mac",
+ /Users/sylvain/dev/Plutinosoft/Platinum/Carthage/Build/Mac,
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../../../Carthage/Build/Mac/Neptune.framework/Headers",
+ );
+ INFOPLIST_FILE = Platinum/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ MTL_ENABLE_DEBUG_INFO = NO;
+ PRODUCT_NAME = Platinum;
+ SDKROOT = macosx;
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = macosx;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ E44E2BD21AE775510092347B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ E44E2BD31AE775510092347B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ E45332CE1AAED318004A52FD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/iOS",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_PARAMETER = NO;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ INFOPLIST_FILE = "MobileMediaServer-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 8.2;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ E45332CF1AAED318004A52FD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../../../Carthage/Build/iOS",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_PARAMETER = NO;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ INFOPLIST_FILE = "MobileMediaServer-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 8.2;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ MTL_ENABLE_DEBUG_INFO = NO;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ E459CC2211F82C4000621896 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ PRODUCT_NAME = Help;
+ };
+ name = Debug;
+ };
+ E459CC2311F82C4000621896 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ PRODUCT_NAME = Help;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ E46270E90F81F4F8007FE869 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1.0;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ DYLIB_CURRENT_VERSION = 1.0.1.0;
+ GCC_GENERATE_TEST_COVERAGE_FILES = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ NPT_DEBUG,
+ _PLATINUM_UPNP_SPECS_STRICT,
+ NPT_CONFIG_ENABLE_LOGGING,
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = NO;
+ GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+ GCC_VERSION = "";
+ GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+ GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
+ GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_PEDANTIC = YES;
+ GCC_WARN_SHADOW = YES;
+ GCC_WARN_SIGN_COMPARE = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNKNOWN_PRAGMAS = YES;
+ GCC_WARN_UNUSED_FUNCTION = NO;
+ GCC_WARN_UNUSED_LABEL = YES;
+ GCC_WARN_UNUSED_PARAMETER = YES;
+ GCC_WARN_UNUSED_VALUE = YES;
+ GCC_WARN_UNUSED_VARIABLE = NO;
+ MACOSX_DEPLOYMENT_TARGET = 10.10;
+ ONLY_ACTIVE_ARCH = YES;
+ WARNING_CFLAGS = (
+ "-Wextra",
+ "-Wno-long-long",
+ );
+ };
+ name = Debug;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "Platinum" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E46270E90F81F4F8007FE869 /* Debug */,
+ 1DEB91F108733DB70010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E410163A1ACFA826000E994F /* Build configuration list for PBXNativeTarget "Platinum-iOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E410163B1ACFA826000E994F /* Debug */,
+ E410163C1ACFA826000E994F /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E423F36518415DC500E24E39 /* Build configuration list for PBXNativeTarget "SsdpTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E423F36618415DC500E24E39 /* Debug */,
+ E423F36718415DC500E24E39 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3AC30FDC87290045379C /* Build configuration list for PBXNativeTarget "MediaCrawler" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3ABF0FDC87140045379C /* Debug */,
+ E42D3AC00FDC87140045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3AF30FDC88180045379C /* Build configuration list for PBXNativeTarget "MediaConnect" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3AD50FDC87DC0045379C /* Debug */,
+ E42D3AD60FDC87DC0045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3AF40FDC88180045379C /* Build configuration list for PBXNativeTarget "MicroMediaController" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3ADF0FDC87F60045379C /* Debug */,
+ E42D3AE00FDC87F60045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3AF50FDC88180045379C /* Build configuration list for PBXNativeTarget "FrameStreamer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3AE90FDC880D0045379C /* Debug */,
+ E42D3AEA0FDC880D0045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3B170FDC894C0045379C /* Build configuration list for PBXAggregateTarget "Apps" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3B050FDC890A0045379C /* Debug */,
+ E42D3B060FDC890A0045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3B340FDC89B70045379C /* Build configuration list for PBXNativeTarget "FileMediaServerTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3B1D0FDC895B0045379C /* Debug */,
+ E42D3B1E0FDC895B0045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3B350FDC89B70045379C /* Build configuration list for PBXNativeTarget "HttpTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3B280FDC89720045379C /* Debug */,
+ E42D3B290FDC89720045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3B8D0FDC8AC10045379C /* Build configuration list for PBXNativeTarget "LightSampleTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3B3B0FDC89B80045379C /* Debug */,
+ E42D3B3C0FDC89B80045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3B8E0FDC8AC10045379C /* Build configuration list for PBXNativeTarget "MediaRendererTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3B470FDC89CE0045379C /* Debug */,
+ E42D3B480FDC89CE0045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3B8F0FDC8AC10045379C /* Build configuration list for PBXNativeTarget "SimpleTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3B520FDC89E20045379C /* Debug */,
+ E42D3B530FDC89E20045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3B910FDC8AC10045379C /* Build configuration list for PBXAggregateTarget "Tests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3B650FDC8A120045379C /* Debug */,
+ E42D3B660FDC8A120045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E42D3B920FDC8AC10045379C /* Build configuration list for PBXAggregateTarget "All" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E42D3B740FDC8A210045379C /* Debug */,
+ E42D3B750FDC8A210045379C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E4374201123FFB9800000109 /* Build configuration list for PBXNativeTarget "MediaServerCocoaTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E43741FF123FFB9800000109 /* Debug */,
+ E4374200123FFB9800000109 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E43F6BC210F1B74E00C97612 /* Build configuration list for PBXNativeTarget "TimeTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E43F6BC310F1B74E00C97612 /* Debug */,
+ E43F6BC410F1B74E00C97612 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E44E2B881AE761220092347B /* Build configuration list for PBXNativeTarget "Platinum-Mac" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E44E2B891AE761220092347B /* Debug */,
+ E44E2B8A1AE761220092347B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E44E2BD11AE775510092347B /* Build configuration list for PBXAggregateTarget "Frameworks" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E44E2BD21AE775510092347B /* Debug */,
+ E44E2BD31AE775510092347B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E45332CD1AAED318004A52FD /* Build configuration list for PBXNativeTarget "MobileMediaServer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E45332CE1AAED318004A52FD /* Debug */,
+ E45332CF1AAED318004A52FD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ E459CC2411F82C5E00621896 /* Build configuration list for PBXAggregateTarget "Help" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ E459CC2211F82C4000621896 /* Debug */,
+ E459CC2311F82C4000621896 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/xcshareddata/xcschemes/Platinum-Mac.xcscheme b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/xcshareddata/xcschemes/Platinum-Mac.xcscheme
new file mode 100644
index 0000000..0aacf19
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/xcshareddata/xcschemes/Platinum-Mac.xcscheme
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0630"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "E44E2B231AE761220092347B"
+ BuildableName = "Platinum.framework"
+ BlueprintName = "Platinum-Mac"
+ ReferencedContainer = "container:Platinum.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "E44E2B231AE761220092347B"
+ BuildableName = "Platinum.framework"
+ BlueprintName = "Platinum-Mac"
+ ReferencedContainer = "container:Platinum.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "E44E2B231AE761220092347B"
+ BuildableName = "Platinum.framework"
+ BlueprintName = "Platinum-Mac"
+ ReferencedContainer = "container:Platinum.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/xcshareddata/xcschemes/Platinum-iOS.xcscheme b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/xcshareddata/xcschemes/Platinum-iOS.xcscheme
new file mode 100644
index 0000000..33a6099
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj/xcshareddata/xcschemes/Platinum-iOS.xcscheme
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0620"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "E41016201ACFA826000E994F"
+ BuildableName = "Platinum.framework"
+ BlueprintName = "Platinum-iOS"
+ ReferencedContainer = "container:Platinum.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "E41016201ACFA826000E994F"
+ BuildableName = "Platinum.framework"
+ BlueprintName = "Platinum-iOS"
+ ReferencedContainer = "container:Platinum.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "E41016201ACFA826000E994F"
+ BuildableName = "Platinum.framework"
+ BlueprintName = "Platinum-iOS"
+ ReferencedContainer = "container:Platinum.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Info.plist b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Info.plist
new file mode 100644
index 0000000..d7da8c8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Info.plist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.plutinosoft.$(PRODUCT_NAME:rfc1034identifier)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>$(CURRENT_PROJECT_VERSION)</string>
+ <key>NSPrincipalClass</key>
+ <string></string>
+</dict>
+</plist>
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Neptune.h b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Neptune.h
new file mode 100644
index 0000000..4baae68
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Neptune.h
@@ -0,0 +1,2 @@
+// Neptune Framework path
+#include <Neptune/Neptune.h>
diff --git a/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Platinum.h b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Platinum.h
new file mode 100644
index 0000000..d8a4ac2
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/universal-apple-macosx/Platinum/Platinum.h
@@ -0,0 +1,66 @@
+//
+// Platinum.h
+// Platinum
+//
+// Created by Sylvain Rebaud on 4/3/15.
+//
+//
+
+//#include <UIKit/UIKit.h>
+//
+////! Project version number for Platinum.
+//FOUNDATION_EXPORT double PlatinumVersionNumber;
+//
+////! Project version string for Platinum.
+//FOUNDATION_EXPORT const unsigned char PlatinumVersionString[];
+
+#ifndef _PLATINUM_H_
+#define _PLATINUM_H_
+
+#include <Platinum/PltUPnP.h>
+#include <Platinum/PltCtrlPoint.h>
+#include <Platinum/PltDeviceData.h>
+#include <Platinum/PltHttpServer.h>
+#include <Platinum/PltVersion.h>
+
+#include <Platinum/PltMimeType.h>
+#include <Platinum/PltProtocolInfo.h>
+#include <Platinum/PltAction.h>
+#include <Platinum/PltArgument.h>
+#include <Platinum/PltConstants.h>
+#include <Platinum/PltCtrlPointTask.h>
+#include <Platinum/PltDatagramStream.h>
+#include <Platinum/PltDeviceHost.h>
+#include <Platinum/PltEvent.h>
+#include <Platinum/PltHttp.h>
+#include <Platinum/PltHttpClientTask.h>
+#include <Platinum/PltHttpServer.h>
+#include <Platinum/PltHttpServerTask.h>
+#include <Platinum/PltService.h>
+#include <Platinum/PltSsdp.h>
+#include <Platinum/PltStateVariable.h>
+#include <Platinum/PltTaskManager.h>
+#include <Platinum/PltThreadTask.h>
+#include <Platinum/PltUtilities.h>
+
+#include <Platinum/PltMediaServer.h>
+#include <Platinum/PltMediaBrowser.h>
+#include <Platinum/PltMediaRenderer.h>
+#include <Platinum/PltMediaController.h>
+#include <Platinum/PltDidl.h>
+#include <Platinum/PltFileMediaServer.h>
+#include <Platinum/PltMediaCache.h>
+#include <Platinum/PltMediaItem.h>
+#include <Platinum/PltSyncMediaBrowser.h>
+
+#include <Platinum/PltXbox360.h>
+#include <Platinum/PltMediaConnect.h>
+
+#include <Platinum/PltDownloader.h>
+#include <Platinum/PltStreamPump.h>
+#include <Platinum/PltFrameBuffer.h>
+#include <Platinum/PltFrameServer.h>
+#include <Platinum/PltFrameStream.h>
+#include <Platinum/PltRingBufferStream.h>
+
+#endif // _PLATINUM_H_
diff --git a/lib/libUPnP/Platinum/Build/Targets/x86-unknown-cygwin/Config.scons b/lib/libUPnP/Platinum/Build/Targets/x86-unknown-cygwin/Config.scons
new file mode 100644
index 0000000..9f2c801
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/x86-unknown-cygwin/Config.scons
@@ -0,0 +1,4 @@
+LoadTool('gcc-generic', env)
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Bsd':'*.cpp', 'System/Posix':'*.cpp', 'System/Null':'NptNullAutoreleasePool.cpp'} \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Build/Targets/x86-unknown-linux/Config.scons b/lib/libUPnP/Platinum/Build/Targets/x86-unknown-linux/Config.scons
new file mode 100644
index 0000000..a8824bc
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Targets/x86-unknown-linux/Config.scons
@@ -0,0 +1,5 @@
+LoadTool('gcc-generic', env)
+
+### Neptune System Files
+env['NPT_SYSTEM_SOURCES']={'System/StdC':'*.cpp', 'System/Bsd':'*.cpp', 'System/Posix':'*.cpp', 'System/Null':'NptNullAutoreleasePool.cpp NptNullSerialPort.cpp'}
+env['NPT_EXTRA_LIBS']=['pthread']
diff --git a/lib/libUPnP/Platinum/Build/Tools/SCons/gcc-generic.py b/lib/libUPnP/Platinum/Build/Tools/SCons/gcc-generic.py
new file mode 100644
index 0000000..a3e3a1b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Tools/SCons/gcc-generic.py
@@ -0,0 +1,36 @@
+import os
+
+def generate(env, gcc_cross_prefix=None, gcc_strict=True, gcc_stop_on_warning=None, gcc_extra_options=''):
+ if gcc_stop_on_warning == None: gcc_stop_on_warning = env['stop_on_warning']
+
+ ### compiler flags
+ if gcc_strict:
+ env.AppendUnique(CCFLAGS = ['-pedantic', '-Wall', '-W', '-Wundef', '-Wno-long-long'])
+ env.AppendUnique(CFLAGS = ['-Wmissing-prototypes', '-Wmissing-declarations'])
+ else:
+ env.AppendUnique(CCFLAGS = ['-Wall'])
+
+ compiler_defines = ['-D_REENTRANT']
+ env.AppendUnique(CCFLAGS = compiler_defines)
+ env.AppendUnique(CPPFLAGS = compiler_defines)
+
+ if env['build_config'] == 'Debug':
+ env.AppendUnique(CCFLAGS = '-g')
+ else:
+ env.AppendUnique(CCFLAGS = '-O3')
+
+ if gcc_stop_on_warning:
+ env.AppendUnique(CCFLAGS = ['-Werror'])
+
+ env['STRIP'] = 'strip'
+
+ if gcc_cross_prefix:
+ env['ENV']['PATH'] += os.environ['PATH']
+ env['AR'] = gcc_cross_prefix+'-ar'
+ env['RANLIB'] = gcc_cross_prefix+'-ranlib'
+ env['CC'] = gcc_cross_prefix+'-gcc ' + gcc_extra_options
+ env['CXX'] = gcc_cross_prefix+'-g++ ' + gcc_extra_options
+ env['LINK'] = gcc_cross_prefix+'-g++ ' + gcc_extra_options
+ env['STRIP'] = gcc_cross_prefix+'-strip'
+
+ \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Build/Tools/Scripts/GenDocumentation.py b/lib/libUPnP/Platinum/Build/Tools/Scripts/GenDocumentation.py
new file mode 100755
index 0000000..72320a0
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Tools/Scripts/GenDocumentation.py
@@ -0,0 +1,77 @@
+#! /usr/bin/python
+
+#############################################################
+# This tool is used to generate the Platinum documentation #
+#############################################################
+
+import os
+import sys
+import subprocess
+import shutil
+import zipfile
+import tarfile
+
+#############################################################
+# ZIP support
+#############################################################
+def ZipDir(top, archive, dir) :
+ entries = os.listdir(top)
+ for entry in entries:
+ path = os.path.join(top, entry)
+ if os.path.isdir(path):
+ ZipDir(path, archive, os.path.join(dir, entry))
+ else:
+ zip_name = os.path.join(dir, entry)
+ archive.write(path, zip_name)
+
+def ZipIt(root, dir) :
+ zip_filename = root+'/'+dir+'.zip'
+
+ if os.path.exists(zip_filename):
+ os.remove(zip_filename)
+
+ archive = zipfile.ZipFile(zip_filename, "w", zipfile.ZIP_DEFLATED)
+ ZipDir(root+'/'+dir, archive, dir)
+ archive.close()
+
+def TarIt(root, dir) :
+ tar_filename = root+'/'+dir+'.tgz'
+
+ if os.path.exists(tar_filename):
+ os.remove(tar_filename)
+
+ archive = tarfile.TarFileCompat(tar_filename, "w", tarfile.TAR_GZIPPED)
+ ZipDir(root+'/'+dir, archive, dir)
+ archive.close()
+
+#############################################################
+# Main
+#############################################################
+# ensure that PLATINUM_KIT_HOME has been set and exists
+if not os.environ.has_key('PLATINUM_KIT_HOME'):
+ print 'ERROR: PLATINUM_KIT_HOME not set'
+ sys.exit(1)
+PLATINUM_KIT_HOME = os.environ['PLATINUM_KIT_HOME']
+
+if not os.path.exists(PLATINUM_KIT_HOME) :
+ print 'ERROR: PLATINUM_KIT_HOME ('+PLATINUM_KIT_HOME+') does not exist'
+ sys.exit(1)
+else :
+ print 'PLATINUM_KIT_HOME = ' + PLATINUM_KIT_HOME
+
+# compute paths
+SDK_DOC_NAME='Platinum-HTML'
+SDK_DOC_ROOT=PLATINUM_KIT_HOME+'/Platinum/Docs/Doxygen'
+
+# start doxygen
+retcode = subprocess.call(['doxygen'], cwd=SDK_DOC_ROOT)
+
+if retcode != 0:
+ print 'ERROR: doxygen failed'
+ sys.exit(1)
+
+# zip documentation
+ZipIt(SDK_DOC_ROOT, SDK_DOC_NAME)
+
+# cleanup
+shutil.rmtree(SDK_DOC_ROOT+'/'+SDK_DOC_NAME)
diff --git a/lib/libUPnP/Platinum/Build/Tools/Scripts/GenSvnVersionHeader.py b/lib/libUPnP/Platinum/Build/Tools/Scripts/GenSvnVersionHeader.py
new file mode 100644
index 0000000..9820b6d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Tools/Scripts/GenSvnVersionHeader.py
@@ -0,0 +1,41 @@
+#! /usr/bin/python
+
+#############################################################
+# This tool is used to generate the version info file #
+#############################################################
+import sys
+import os
+
+# ensure that PLATINUM_HOME has been set and exists
+if not os.environ.has_key('PLATINUM_KIT_HOME'):
+ print 'ERROR: PLATINUM_KIT_HOME not set'
+ sys.exit(1)
+PLATINUM_KIT_HOME = os.environ['PLATINUM_KIT_HOME']
+
+# ensure that PLATINUM_KIT_HOME has been set and exists
+if not os.path.exists(PLATINUM_KIT_HOME) :
+ print 'ERROR: PLATINUM_KIT_HOME ('+PLATINUM_KIT_HOME+') does not exist'
+ sys.exit(1)
+else :
+ print 'PLATINUM_KIT_HOME = ' + PLATINUM_KIT_HOME
+
+# get the SVN repo version
+version = os.popen('svnversion -n').readlines()[0]
+print 'current VERSION =',version
+if version.endswith('P'):
+ version = version[0:-1]
+if version.endswith('MP'):
+ version = version[0:-2]
+try:
+ version_int = int(version)+1 ## add one, because when we check it in, the rev will be incremented by one
+except:
+ print 'ERROR: you cannot run this on a modified working copy'
+ sys.exit(1)
+
+
+output = open(PLATINUM_KIT_HOME+'/Platinum/Source/Platinum/PltSvnVersion.h', 'w+')
+output.write('/* DO NOT EDIT. This file was automatically generated by GenSvnVersionHeader.py */\n')
+output.write('#define PLT_SVN_VERSION '+str(version_int)+'\n')
+output.write('#define PLT_SVN_VERSION_STRING "'+str(version_int)+'"\n')
+output.close()
+print 'upon check-in, version will be', str(version_int)
diff --git a/lib/libUPnP/Platinum/Build/Tools/Scripts/MakeAllVs.py b/lib/libUPnP/Platinum/Build/Tools/Scripts/MakeAllVs.py
new file mode 100644
index 0000000..32f1bd0
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Tools/Scripts/MakeAllVs.py
@@ -0,0 +1,37 @@
+#! /usr/bin/env python
+
+import os
+import sys
+import getopt
+import subprocess
+
+
+configs = ['Debug', 'Release']
+solutions = ['../../../Build/Targets/x86-microsoft-win32-vs2008/Platinum.sln']
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "b:rc")
+except getopt.GetoptError, (msg, opt):
+ print 'No build_config, defaulting to build all'
+
+for opt, arg in opts:
+ if opt == '-b':
+ config = arg
+
+
+def CallVsMake(sln, cfg):
+ cmd = 'python VsMake.py -s %s -b %s' % (sln, cfg)
+ print cmd
+ retVal = subprocess.call(cmd.split())
+ if retVal != 0:
+ sys.exit(retVal)
+
+for sln in solutions:
+ if 'config' not in locals() and 'config' not in globals():
+ print '************ Building all configurations **************'
+ for cfg in configs:
+ CallVsMake(sln, cfg)
+ else:
+ print '************ Building configuration=' + config + ' ****************'
+ CallVsMake(sln, config)
+ \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Build/Tools/Scripts/VsMake.py b/lib/libUPnP/Platinum/Build/Tools/Scripts/VsMake.py
new file mode 100644
index 0000000..07e0c33
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Tools/Scripts/VsMake.py
@@ -0,0 +1,97 @@
+#! /usr/bin/env python
+"""
+
+Visual Studio 2005 Build Script
+
+$Id: VsMake.py 655 2010-09-29 22:40:22Z soothe $
+
+"""
+
+import os
+import sys
+import getopt
+import subprocess
+
+# Setup some path stuff
+try:
+ if environ['VISUALSTUDIO_BIN']:
+ VSBINDIR = environ['VISUALSTUDIO_BIN']
+except NameError:
+ # Use default value for visual studio.
+ VSBINDIR = 'C:/Program Files/Microsoft Visual Studio 8/Common7/IDE'
+ print 'VISUALSTUDIO_BIN not set. Trying default value:'
+ print ' ' + VSBINDIR
+ print ''
+
+
+# ------------------------------------------------------------
+# usage
+# ------------------------------------------------------------
+def usage(errMsg):
+ try:
+ print 'Error: %s' % (errMsg)
+ except NameError:
+ pass
+
+ print 'Usage: '
+ print ' %s -s <path to solution> -b [Release|Debug|etc.]' % (sys.argv[0])
+ print ''
+ print ' REQUIRED OPTIONS'
+ print '\t-s <solution>'
+ print '\t-b <configuration>'
+ print ''
+ print ' BUILD OPTIONS'
+ print '\t-c\tMake clean'
+ print '\t-r\tRe-build all'
+
+
+# ------------------------------------------------------------
+# main
+# ------------------------------------------------------------
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "s:b:rc")
+except getopt.GetoptError, (msg, opt):
+# print 'Error: invalid argument, %s: %s' % (opt, msg)
+ usage('invalid argument, %s: %s' % (opt, msg))
+ sys.exit(2)
+
+# Build options
+doingBuild = False
+rebuildAll = False
+makeClean = False
+
+for opt, arg in opts:
+ if opt == '-s':
+ solutionFile = arg
+ doingBuild = True
+ elif opt == '-b':
+ buildName = arg
+ doingBuild = True
+ elif opt == '-r':
+ rebuildAll = True
+ doingBuild = True
+ elif opt == '-c':
+ makeClean = True
+
+if rebuildAll and makeClean:
+ usage('Error cannot specify -c and -r together')
+ sys.exit(2)
+
+try:
+ buildSwitch = 'build'
+ if rebuildAll: buildSwitch = 'rebuild'
+ elif makeClean: buildSwitch = 'clean'
+
+ cmd_list = ['%s/devenv.com' % VSBINDIR, '/%s' % buildSwitch, buildName, solutionFile]
+ cmd = " ".join(cmd_list)
+ print 'Executing:'
+ print cmd
+ retVal = subprocess.call(cmd_list)
+ # only the least sig 8 bits are the real return value
+ if retVal != 0:
+ print cmd
+ print '** BUILD FAILURE **'
+ sys.exit(retVal)
+except NameError, (name):
+ usage('missing argument %s' % (name))
+ sys.exit(2)
diff --git a/lib/libUPnP/Platinum/Build/Tools/Scripts/XCodeMake.py b/lib/libUPnP/Platinum/Build/Tools/Scripts/XCodeMake.py
new file mode 100755
index 0000000..15bce59
--- /dev/null
+++ b/lib/libUPnP/Platinum/Build/Tools/Scripts/XCodeMake.py
@@ -0,0 +1,83 @@
+#! /usr/bin/env python
+"""
+
+XCode Build Script
+
+$Id: XCodeMake.py 655 2010-09-29 22:40:22Z soothe $
+
+"""
+
+import os
+import sys
+import getopt
+import subprocess
+
+
+# ------------------------------------------------------------
+# usage
+# ------------------------------------------------------------
+def usage(errMsg):
+ try:
+ print 'Error: %s' % (errMsg)
+ except NameError:
+ pass
+
+ print 'Usage: '
+ print ' %s -p <path to project> -b [Release|Debug|etc.] -t [All|Platinum|PlatinumFramework|etc.] -s [macosx|iphoneos]' % (sys.argv[0])
+ print ''
+ print ' REQUIRED OPTIONS'
+ print '\t-p <project>'
+ print '\t-b <configuration>'
+ print '\t-t <target>'
+ print '\t-s <sdk>'
+ print ''
+ print ' BUILD OPTIONS'
+ print '\t-c\tMake clean'
+
+
+# ------------------------------------------------------------
+# main
+# ------------------------------------------------------------
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "p:b:t:s:c")
+except getopt.GetoptError, (msg, opt):
+# print 'Error: invalid argument, %s: %s' % (opt, msg)
+ usage('invalid argument, %s: %s' % (opt, msg))
+ sys.exit(2)
+
+# Build options
+doingBuild = False
+rebuildAll = False
+makeClean = False
+
+for opt, arg in opts:
+ if opt == '-p':
+ projectFile = arg
+ doingBuild = True
+ elif opt == '-b':
+ buildName = arg
+ doingBuild = True
+ elif opt == '-t':
+ targetName = arg
+ elif opt == '-s':
+ sdk = arg
+ elif opt == '-c':
+ makeClean = True
+
+try:
+ buildSwitch = 'build'
+ if makeClean: buildSwitch = 'clean'
+
+ cmd_list = ['xcodebuild', '-project', '%s' % projectFile, '-target', '%s' % targetName, '-sdk', '%s' % sdk, '-configuration', '%s' % buildName, '%s' % buildSwitch]
+ cmd = " ".join(cmd_list)
+ print 'Executing:'
+ print cmd
+ retVal = subprocess.call(cmd_list)
+ # only the least sig 8 bits are the real return value
+ if retVal != 0:
+ print cmd
+ print '** BUILD FAILURE **'
+ sys.exit(retVal)
+except NameError, (name):
+ usage('missing argument %s' % (name))
+ sys.exit(2)
diff --git a/lib/libUPnP/Platinum/CHANGELOG.txt b/lib/libUPnP/Platinum/CHANGELOG.txt
new file mode 100644
index 0000000..130566b
--- /dev/null
+++ b/lib/libUPnP/Platinum/CHANGELOG.txt
@@ -0,0 +1,730 @@
+Platinum 1.0.5.13
+-----------------
+- fixed: didl used "actors" instead of "actor"
+- changed: moved modelURL after serialNumber to please UCTT
+- added: relax exception to identify DIAL devices which are not UPnP compliant since they don't expose valid services.
+- changed: no more sscanf dependency
+- added: Android NDK r9b support
+- added: UDA 1.1 initial support
+- fixed: Crash fix when stopping device while a subscription request is received. The HttpServer uses its own task manager which could end up queuing a new task into the DeviceHost task manager after it had been stopped and this task would never be stopped. The ServiceEvent task would then try to access a service that had then be destroyed when DeviceHost:Stop returned. A TaskManager cannot be restarted now once Abort has been called.
+- fixed: memory leaks
+
+Platinum 1.0.4.11
+-----------------
+- fixed: crash when stopping UPnP while scheduling for scpd retrieval
+- fixed: rare crash when stopping UPnP while connections are opened.
+
+Platinum 1.0.4.10
+-----------------
+- fixed: simplified connection management fixing a potential crash on shutdown
+- fixed: Platinum.framework now contains fat library instead of Mach-o objects.
+- added: HTML help is now part of SDK (instead of zip)
+- fixed: android build was looking for axTls instead axTLS library.
+
+Platinum 1.0.4.9
+----------------
+- fixed: crash due to uninitialized variables
+
+Platinum 1.0.4.8
+----------------
+- fixed: leaks during exit by reworking the sequence of singletons automatic destruction.
+- added: now extracts presentationURL from device description.
+- added: can now opt in to use media cache in FileMediaServerTest.
+- fixed: 2008 VS project
+- added: 'down' command to MicroMediaController to download a media locally
+- fixed: interruption during download could happen if non blocking socket was full and returned NPT_ERROR_WOULD_BLOCK. Now retries.
+
+Platinum 1.0.4.3
+----------------
+- fixed: leaks during event processing.
+
+Platinum 1.0.4.2
+----------------
+- fixed: Potential leaks and crash when tasks failed to start due to UPnP entire stack shutting down.
+
+Platinum 1.0.4.1
+----------------
+- fixed: Slow shutting down.
+
+Platinum 1.0.4.0
+----------------
+- changed: Windows sockets are now fully cancellable.
+- fixed: crash when closing due to static cleanup orders when using TLS, possible leak instead. Proper fix in the works
+- fixed: potential cause for crash during socket cancellation due to references not carrying over thread safety
+
+Platinum 1.0.3.1
+----------------
+- changed: increased timeout for write io http server tasks to prevent PS3 from disconnecting too early (60 secs is not enough apparently)
+- changed: put back announcing bye-bye first.
+- fixed: http logger defines when not using logging
+- fixed: scons build for macosx
+- fixed: locking for 30 secs when stopping UPnP if sockets are in the middle of a connection than hangs.
+
+Platinum 1.0.3.0
+----------------
+- fixed: potential deadlock when subscribing to a service from the delegate upon being notified a device is ready
+- fixed: crash when device disappears while processing an event notification
+- changed: made posix mutexes recursive to simplify PLT_CtrlPoint implementation
+- changed: don't update device base url when receiving a SSDP Notify with a different IP as it could be unreachable.
+
+Platinum 1.0.2.1
+----------------
+- fixed: fault XML for DLNA compliance
+
+Platinum 1.0.2.0
+----------------
+- fixed: deadlock in PLT_CtrlPoint
+
+Platinum 1.0.1.0
+----------------
+- added: GetPort method to PLT_CtrlPoint in case one wants to attach to the event http server for serving static content
+- fixed: deadlocks with new PLT_CtrlPoint pending notifications
+- changed: increased subscriber notification renewal to 90 secs before end of subscription
+- fixed: PLT_CtrlPoint log formatting error
+- fixed: memory leaks in PLT_CtrlPoint
+- fixed: PLT_HttpServer now properly supports chunked-encoding responses.
+
+Platinum 1.0.9.3
+----------------
+changed: reworked event notifications to be reprocessed if subscriber is not known yet immediately after a subscription.
+fixed: some deadlocks due limiting number of tasks in task manager by default now.
+added: now keep track of pending inspections so that a bunch of SSDP notifications don't all trigger a bunch description requests.
+added: support for armv7s, Xcode 4.5
+added: added support for changing default TTL values
+changed: made DecomposeVar protected virtual
+
+Platinum 0.6.9.3
+----------------
+fixed: passing 0 for frequency to Search/Discover now disables repeat
+added: support for Scons 2.1
+changed: improved UPnP stopping process
+changed: limit max number of tasks per task manager to 50 by default
+changed: limit max number of HTTP clients handled by HTTP server to 50 by default
+changed: made PltCtrlPoint AddDevice & RemoveDevice protected so they can be called by custom implementations to manually remove expired devices
+
+Platinum 0.6.9.2
+----------------
+changed: less strict about invalid protocol info extra params parsing
+fixed: fixed embedded test
+added: android jni module and sample
+fixed: subscription notification events wouldn't be received after upnp got restarted
+fixed: task manager stop could be hanging while waiting for tasks to finish if a task was started during cancellation
+
+Platinum 0.6.9.1
+----------------
+added: support to bridge Neptune Logging to other loggers such as Cocoa Lumberjack
+fixed: better support for embedded devices detection
+added: GetVolumeState to PltMediaController
+fixed: crash in NPT_Socket::Cancel when stopping HTTP clients
+
+Platinum 0.6.9
+--------------
+changed: reverted trying to bind to source port 1900, it would fail eventually
+added: added back support for sending SSDP messages over broadcast in case multicast is blocked by routers or firewalls
+fixed: MediaRenderer channel attribute for volume was wrong
+changed: MediaBrowser caches only metadata now
+fixed: Scons XCode 4.3.1 support
+added: workaround for servers that start to return bogus total matches on the last page
+updated: Neptune 1.1.3
+added: some CTT 2.0 compliance re SSDP
+added: Date HTTP header to requests
+fixed: crash on exit due to static finalizers being called in random order
+fixed: Host HTTP header wasn't being reset properly on redirects
+removed: OSX Platinum frameworks depending on SystemConfiguration and Foundation frameworks
+
+Platinum 0.6.8
+--------------
+changed: try to bind source port to 1900 for ssdp notify and search responses
+added: capability to change user agent on the fly
+added: didl parsing and formatting of dc:description & upnp:icon
+added: user agent header to SSDP packets
+fixed: Windows build
+added: UPnP AV Renderer functions
+changed: verify we can seek the body of the response before returning Accept-Range: bytes
+fixed: don't use localhost address for SSDP announcements
+changed: short connection time out for subscribers since they may not exist and this would block when exiting
+fixed: bug when parsing W3C date time
+fixed: compiling issues when removing TLS support
+fixed: recursion that prevented some logs to be written
+fixed: potential issue with thread safe references
+added: support for removing HTTP header in a request or response before sending it
+changed: support bytes:0- range request for non seekable streams and avoid returning 416.
+changed: return 416 instead of 500 in case we can't stream the body and a range request was made (this makes XBox and PS3 happier)
+changed: make all references thread safe by default
+
+Platinum 0.6.7
+--------------
+fixed: request would fail when retrying on a new connection after the previous one failed because server closed it without using a Connection:close header. Only happens with requests containing a body.
+fixed: always adding Connection:close in HTTP 1.1 responses due to checking content-length prior to setting it.
+changed: allow DLNA interactive request.
+changed: Don't override accept-range header if already set.
+changed: more DLNA compliance for DMC
+changed: better handling of path extraction. Now url encodes url root as well
+changed: better support for persistent connections with http 1.0
+changed: eturn HTTP 416 if Accept-Range header is not bytes in the request and the server makes a range request
+
+Platinum 0.6.6
+--------------
+fixed: mime type detection was not properly handled
+fixed: bad parsing of file path from url when MediaServer url root was just '/'
+fixed: now builds universal framework for iOS and OSX properly
+added: missing files
+
+Platinum 0.6.5
+--------------
+added: Platinum.xcodeproj now builds Platinum.Framework for both iOS and OSX to make it easier to integrate as a 3rd party.
+changed: Better chunked-encoding support (don't write Content-Length)
+changed: Add Accept-Range header when returning HTTP 416 as per spec
+updated: based on Neptune 1.1.2 now
+fixed: potential crash due to using non thread safe references
+fixed: FindDevice could return invalid root device, now keep a reference of root device when fetching all SCPDs of root device and embedded devices just in case root device goes away
+fixed: crashes in MediaCrawler sample code
+changed: simplified getting default mime type
+changed: only allow keep-alive in response if it contains a ContentLength header or a Chunked transfer encoding
+changed: handlers can now be owned by NPT_HttpServer
+changed: simplified HttpClientTask by using new NPT_HttpClient pipelining feature
+fixed: now detects devices with SCPD urls containing query param or hash tags
+fixed: C++/CLR Managed Binding enumeration of embedded devices not using reference
+changed: removed VS2005 support
+changed: removing broadcast support (only needed for obsolete XBox v1)
+fixed: potential case where a task can be added as we're stopping
+changed: don't add Accept-Range bytes header if chunked encoding is used
+changed: when enumerating interfaces for SSDP, only returned MULTICAST enabled Interfaces and removed Point-To-Point ones
+changed: Forces port 1900 for SSDP now and don't depend on default Multicast interface and instead join on all valid interfaces
+changed: don't advertise resources on all interfaces unless ALLIP is found in filter (DLNA)
+fixed: localinterface not being set for embedded devices resulting in event subscription failing because the subscription IP was 0.0.0.0 rather than the IP of the control point.
+added: Sonos support back using Rhapsody (only visible in Desktop Controller though)
+fixed: @refID mask detection and use cases insensitive compare for tags now
+added: support to serve byte range requests for a stream, not just a file
+added: More DLNA compliance with certain DLNA HTTP headers
+changed: simplified XBox & WMP support to fix "Not Authorized" seen for Denon DLNA devices.
+fixed: mask overlapping with another, added more masks support for DLNA compliance
+fixed: more dlna compliance, let serveFile add Accept-Range header
+fixed: DLNA test failing due to sending refId when not requested
+fixed: DLNA protocol info parsing error due to trailing semi-colon
+fixed: ring buffer stream to only return prematurely on abort and not on eos
+added: .wavm for mono wave extension
+changed: stopped sending byebye first to stop confusing slow devices
+fixed: Windows Media Player 12 not being happy with wav protocol info
+fixed: deadlock when receiving a description response for an invalid device while doing house keeping on subscribers. Now uses only one lock.
+fixed: better handling of stopping UPnP immediately after starting it
+changed: don't bind hard for SSDP multicast listen
+changed: updated Server and UA HTTP header (does not include OS anymore)
+added: basic support for WMP11
+changed: lowered SSDP response time to 5 secs
+changed: no more accept-ranges on any file requests, only on serveFile
+fixed: DLNA profile didl attribute was not being written for albumArtURI
+added: lpcm working for both XBox 360 and PS3
+changed: asks for searchable and childCount didl attributes by default
+removed: extra logging when not finding didl attribute
+fixed: mimetype parsing
+added: support for audio/L16;44100...
+fixed: fails if can't get file length only if a range request is passed
+changed: returns 404 instead of 500 when file is missing
+added: didl support for multiple album arts
+improved: string serialization, reduces too many string copies during didl creation
+added: audio/L16 support to XBox
+fixed: dlna serialization, added audio/L16
+
+Platinum 0.6.4
+--------------
+fixed: android compilation
+fixed: crash when running FileMediaServerTest on a directory with Chinese characters
+fixed: now use real Computer Name or User Name next to Server name
+
+Platinum 0.6.3
+--------------
+fixed: 2005 and 2010 solutions
+added: 2010 Platinum.Managed strong-name signed assembly
+
+Platinum 0.6.2
+--------------
+improved: DLNA flags masks
+fixed: Managed wrapper now keeping the pointer to the native member when passed so we can modify members in place. But we have to be careful to not pass local stack objects that will be deallocated which will cause crashes
+added: Managed now can pass uuid to MediaServer
+fixed: Managed not running on x64 machines
+fixed: new XBox Dashboard support
+fixed: UTF-8 was not properly handled through Managed Interface
+changed: put back default byebye first otherwise xbox doesn't detect when same device arrives after a crash
+added: device signature detection (PS3, XBOX, WMP)
+changed: addIcon is now public
+changed: forced to bind on every interface on port 1900 otherwise we don't receive SSDP search requests sometimes
+changed: MediaConnect only advertise ContentDirectory with Search action to WMP and XBox now
+fixed: returning all resource metadata when receiving only "res" filter
+added: support for @duration metadata filter
+changed: don't prevent serializing resource in didl if it's invalid
+changed: allow ProtocolInfo without PN
+added: DeviceIcon .Net mapping
+added: now can pass byte[] through .Net interface when responding to HTTP request (thumbnails)
+changed: Managed don't throw exception when stopping UPnP if it hasn't been started
+added: signature to Platinum.Managed
+fixed: crash when stopping an already disposed Managed instance (?)
+changed: now exports to Targets root subfolder
+fixed: missing log4net bundle
+
+Platinum 0.6.1
+--------------
+fixed: potential vulnerability when receiving SSDP messages or SOAP requests
+added: now compiles for Android NDK
+added: PLT_UPnP::IsRunning method
+changed: moved LastChange variable parsing into controlpoint
+changed: pass sort criteria entire string to delegate instead of parsed split list
+added: Cocoa layer for Mac
+added: Managed C++ layer for .Net
+added: new Managed MediaServer Test
+changed: improved MimeType and ProtocolInfo support
+changed: being more strict on MX to pass UPnP certification
+fixed: dc:title is required
+added: serialization and parsing of upnp:searchClass and upnp:objectClass name attribute
+changed: searchable attribute is false by default
+changed: Can now pass uuid to Managed MediaServer
+changed: Can change lease time from Managed MediaServer
+changed: Don't adverstise bye-bye SSDP messages by default on startup anymore to pass DLNA compliance
+
+Platinum 0.6.0
+--------------
+added: Documentation Platinum-HTML.zip in Platinum/Docs/Doxygen subfolder
+added: fix for detecting requests with url decoded paths (for example from Windows Media Player)
+changed: PLT_SsdpListenTask timeout to 1 sec only for iPhone
+changed: Removed some PLT_HttpHelper functions that were problematic
+changed: No need to force contentlength to 0, task should set it automatically if no entity
+fixed: Socket leak in PLT_UPnP
+changed: completely reworked HTTP response handling
+changed: osx default target is leopard now
+fixed: osx i386 build issue
+changed: revamped & simplified media server delegate
+changed: updated latest Neptune and now use new time/date support
+changed: PLT_HttpRequestHandler not a template anymore
+updated: normalized use of timeout
+added: basic HTTP caching headers support to HTTP file server
+added: made PLT_MediaCache generic, MediaServer now sorts by date and caches directory listing
+added: axTls to build system for ssl connections (HTTPS)
+added: MicroMediaController can be specified a folder directly using the "cd" command
+fixed: Renderer Channel environment variable attribute name (must be "channel")
+fixed: crashes when enumerating net interfaces on iPhone
+added: more log to MicroMediaController
+added: XmlHelper Serialize function
+
+
+Platinum 0.5.4
+--------------
+updated: msdev 2008 output
+fixed: incorrect local filepath extraction from url
+fixed: xcode project
+fixed: gcc warnings
+added: CocoaTouchBrowser sample iphone app started (not finished)
+added: Platinum xcode proj for iphone into arm-apple-darwin
+changed: handling of http requests when device host server is being used for serving content from derived device (like FileMediaServer Device)
+added: more log to MicroMediaController
+added: XmlHelper Serialize function
+fixed: WMP wouldn't return resource url if the browse filter didn't contain 'res'
+changed: be more relaxed about invalid or missing resource uri and invalid protocolinfo, maybe the filter didn't request it afterall
+
+Platinum 0.5.3
+--------------
+fixed: MediaCrawler app updated
+fixed: crash on exit while Browse action is requested
+fixed: bug in ChunkDecoder
+changed: better support for HTTP 100 continue
+changed: DLNA compliance (handle 1xx responses, shutdown sockets better)
+added: code to check if ip or interface is within same network
+changed: increased stream copy buffer to 16k for better streaming performance
+fixed: crash on exit due to logging in PosixThread wait function
+changed: FileMediaServer now serves files at the root url and not "/content" anymore so that it can serve "/crossdomain.xml" url for Flash if needed.
+changed: putting back GetVolumeDBRange & GetVolumeDB since it seems to be required by DLNA
+fixed: GetTransportAction not returning current protocol info
+changed: remove argument from argument list if value was not allowed
+changed: now returns NPT_ERROR_INVALID_PARAMETERS when validating state variable value if failed
+changed: dont' fail if action contains unknown argument names, simply return NPT_ERROR_NO_SUCH_NAME
+changed: now uses individual scpd cpp files for each scpd
+updated: now uses a batch file and header tool to convert scpd xml file to cpp for inclusion
+added: PlayTo functionality by supporting advertising and responding on localhost
+changed: more DLNA compliance
+added: time class
+
+Platinum 0.5.2
+--------------
+fixed: recursive posix deadlock when notifying new devices are ready and delegates try to subscribe to services
+added: seek command to MicroMediaController
+changed: lowered log levels
+changed: removed SsdpProxy from Build.scons
+updated: scpd for MediaRenderer now has GetVolumeDB, SetVolumeDB, GetVolumeDBRange
+changed: now attach root device to action instead of device (in case of embedded) since embedded devices are not referenced, they're children of main root device
+changed: better embedded devices support in ctrl point, now keeps only root devices in list
+fixed: crashes when device goes away while an action is performed on service or waiting for responses
+fixed: scpd retrieval for embedded devices with same service (Sonos with onnectionManager service for example in both DMS and DMR)
+fixed: action arguments are serialized in same order as defined as scpd (to make WMP12 happy)
+changed: Search sockets are bound on port > 1024 and different than 1900 according to DLNA
+added: When looking for device, can return root if device is known to be embedded
+fixed: root device reference is attached to task that need to access service or action in response to prevent release if device goes away while waiting
+fixed: don't check if subscriber sid start with 'uuid:' even though it's the spec
+added: more WMP12 support parsing xml responses (uses UPnPError instead of upnp_error and any namespace)
+fixed: random crashes
+fixed: PS3 DLNA errors
+changed: Advertise on localhost now and respond properly if search was receiving on localhost
+changed: Now can ignore all local UUIDs when multiple devices are attached
+fixed: MediaController made AVTransport optional and RenderingControl required service
+added: MediaController added SetVolume, GetVolume
+fixed: MediaController better handling of invalid timestamp or duration
+added: MediaRenderer GetVolumeDBRange and SetVolumeDB
+added: Didl support for bitspersample, nraudiochannels and samplefrequency
+changed: Didl adding .000 for frame in timestamp otherwise 360 won't play tracks
+improved: Didl parsing if invalid xml node found
+fixed: Filter criteria was missing in Search function prototype
+added: Can now decide if protocol info should contain DLNA info or not
+added: MediaBrowser added search
+fixed: When receiving didl for item, don't try to validate resource url protocol and ip as it could be rtsp:// or FQDN addresses
+fixed: SetVariableValue can pass csvs and each value will be indepedently validated
+added: Can now set extra attributes to a state variables (for Volume that has a Channel)
+changed: The state variable now serializes itself into an xml node instead of the service doing it. That way we can add extra parameters if needed
+added: helper GetIPAddresses can be passed a flag to add localhost to list if needed
+fixed: vs2005 projects with new Neptune path
+changed: simplified AVTransport scpd for renderer
+added: Renderer now supports Windows 7 WMP PlayTo feature!
+added: now can choose to add xml header or not (some implementations like WMP needs it)
+fixed: bug where it would never keep a connection alive on the server side
+added: more DLNA improvements
+removed: Neptune from ThirdParty, now same level as Platinum in PlatinumKit
+fixed: 360 can play mov files now
+added: mimetype by extension
+fixed: WMP can see Platinum again (needs <?xml ?>
+changed: change mediatype after calling ServeFile instead of before, or it may get changed
+
+Platinum 0.5.1
+--------------
+removed: DMS 1.5 for 360, no need for it
+changed: more DLNA support, fixed deadlock when removing devices
+changed: moved back apps to Platinum proj on OSX
+fixed: ctrl point now renews subscribers in time
+added: mute/unmute function to micromediacontroller to pass DLNA tests
+fixed: fixed subscriber renewal, now wait 10 secs before doing first house keeping of old devices not renewed
+fixed: scons 1.2 support
+fixed: osx config for scons 1.2
+added: MediaServer Device Discovery & Control DLNA compliance
+changed: uses built-in Platinum icons instead of file based
+fixed: iPhone build
+fixed: xbox 360 was not playing divx anymore
+
+Platinum 0.5.0
+--------------
+added: better dlna support for embedded devices
+changed: now wait a bit before fetching device description after receiving first ssdp message just in case we have more ssdp byebye messages we have not received yet which could cause the device to be removed after we've just added it
+added: full support for HTTP/1.1 and persistent connections in compliance with dlna 1.5
+fixed: fixed rare deadlock
+changed: now uses http 1.1 for DLNA compliance
+changed: queues scpd requests instead of using one thread per scpd
+added: near DLNA compliance for device host and control point
+fixed: http server returning more than requested during HTTP byte range requests (fixed iphone playback)
+change: now DMS 1.5 for 360
+fixed: browse issue with syncbrowser
+added: SetDelegate functions to PLT_MediaBrowser and PLT_MediaController in case it is subclassed and this cannot be passed to ctor
+
+Platinum 0.4.9
+--------------
+added: PlatinumiPhone target to Platinum.xcodeproj
+changed: PlatinumApps.xcodeproj now depends on Platinum.xcodeproj
+changed: PLT_MediaBrowser and PLT_MediaController now asks delegate before subscribing to events to let a chance to decide if device is worth listening to events
+changed: renamed PLT_MediaBrowserListener to PLT_MediaBrowserDelegate and PLT_MediaControllerListener to PLT_MediaControllerDelegate
+changed: check for new event to notify every 100ms instead of 10ms, also reduce link list modifications to reduce allocatio/free
+added: can now specify custom user-agent and server http header
+fixed: missing didl resource if no protection attribute was set
+fixed: can now stop/restart devices without restarting entire upnp stack
+changed: honor Connection header from response if keep-alive is true
+fixed: more PS3 support
+added: now can specify initial port can be ignored if failed and try again with a random port
+added: support for resolution in didl, can now prevent certain files from being advertised in didl, better mimetype support in FileServer
+fixed: now aborts properly client socket tasks
+removed: null/null in array, uses NPT_ARRAY_SIZE instead
+removed: NPT_ERROR_INTERNAL result when closing a socket while still reading on it, now returns NPT_ERROR_EOS
+added: support for icons (MediaConnect sample for PS3)
+added: PLT_HttpRequestContext can hold a request and a context now
+changed: better dlna support, can now use request information to decide what to return (important to support xbox 360, ps3, etc..)
+fixed: XBox 360 not finding us anymore, don't hardcode same guid! and fix mp4 playback on 360
+
+Platinum 0.4.8
+--------------
+fixed: XBox 360 and PS3 video playback
+added: removed some FATAL logs, can pass path to MediaConnect cmd line
+changed: changes to http server to support path without a query
+added: frame streamer example (mjpeg live stream advertised via upnp)
+changed: verified that content-length was indeed set on the entity before writing it, to avoid writing 0 when the length wasn't known (multipart)
+
+Platinum 0.4.7
+--------------
+fixed: listener being called multiple times with same device when appearing or disapearing
+added: dc:date support in didl
+added: better dlna support for videos
+changed: don't cache empty results in media cache
+fixed: WMP 11 crash when unsubscribing
+fixed: crash after 15 min due to not cleaning up properly interface list before reusing it
+changed: allow for services with no actions (although not upnp compliant)
+fixed: lock media cache before access
+changed: switching to native eol
+changed: fixed xcode proj, add delay to get description/scpd for Rhapsody to be happy
+changed: uses HTTP 1.1 in server with keep-alive. Greatly improves performance
+updated: license is now GPLv2 or later
+changed: do not search, announce or respond on localhost anymore
+
+Platinum 0.4.6
+--------------
+changed: upnp server now uses same port for upnp and serving files (helps with firewall)
+added: upnp support for embedded devices
+changed: upnp device description can now be modified according to request (user agent header)
+fixed: better upnp eventing mechanism, can now pause eventing to set multiple state variables, and send update in a batch
+changed: detect xbox and change description to pretend to be WMP
+fixed: artist role attribute is not supposed to be in upnp namespace
+updated: Neptune to support Unicode filenames
+added: Sonos support! XBMC server can now be browsed by Sonos Desktop Controller and music can be played on multiple Sonos ZonePlayers all synchronously and streamed from XBMC. Sweeeeeeeeeeet!
+fixed: deadlock on subscribe
+fixed: crach on subscription cancellation
+fixed: first event notification was sent to early and could be missed
+fixed: UPnP Renderer Intel Validity Tool tests
+
+Platinum 0.4.5
+--------------
+fixed: better embedded devices support
+fixed: Unicode support on Win32 platforms
+changed: now can pause eventing to set multiple state variables and resume eventing then
+
+Platinum 0.4.3
+--------------
+fixed: vs2008 solution
+fixed: mp3 invalid protocol
+
+Platinum 0.4.2
+--------------
+changed: don't set an entity on request if no body is expected
+added: support for PS3 (basic dlna support)
+changed: MediaCrawler now derives from MediaConnect so that it's seen by XBox 360
+fixed: now passes the proper reachable interface when subscribing to events by keeping track of which interface was used when retrieving a device description
+fixed: gcc 4.2.3 errors (Ubuntu 8.04)
+changed: removed all NPT_Integer references
+fixed: didl parsing of resource with size > 2GB
+changed: didl resource duration is now unsigned
+added: support for SCons 1.0 (0.98.5)
+fixed: support for files > 4GB
+fixed: SIGPIPE errors on both Ubuntu and MacOSX
+fixed: potential memory leaks reported by valgrind
+changed: updated to use Neptune 1.0.1
+
+Platinum 0.4.1
+--------------
+fixed: crash caused by typo when fixing gcc warnings, was adding the wrong http handler
+changed: don't use an outside lock for requests in PltHttpClientTask which can cause delay and hang out when queuing requests in a row like when updating state (Thanks Andy B.!)
+added: copyright 2008
+
+Platinum 0.4.0
+--------------
+added: new PlatinumApps project for XCode
+added: apple iphone target
+fixed: fixing scons build, automatic stripping in release mode now
+fixed: potential crash due to trying to use connector of a client that didn't exist anymore
+added: support for Vs2008
+fixed: leopard support with both 10.4 and 10.5 sdk installed
+fixed: gcc 4 warnings
+changed: renamed fopen_s to fopen_wrapper
+fixed: Fix for unbuffered file streams on OSX (was callign setvbuf after seek)
+added: Support for SO_REUSEPORT on OSX
+added: Set NOSIGPIPE flag
+
+Platinum 0.3.9
+--------------
+added: Xbox360 support!
+fixed: warning appearing with gcc4 on macosx
+fixed: leaks when getting ip addresses
+added: new ring buffer stream and tests
+changed: Browse to pass a flag instead of UPnP browse text flag
+changed: Browse prototype
+changed: switched to static crt
+added: can now pass http port to FileMediaServerTest
+added: more mediatypes (avi, divx) support
+fixed: content-type not being set properly if file extension was uppercase
+fixed: MediaCrawler prototypes due to changes to Browse signature
+added: MediaConnect project
+added: arm-unknown-linux config (iphone support)
+added: RingBufferStream class
+fixed: NPT_Xml now writes the xml header
+changed: listen task now passed to Start/Stop function to have ctrlpoint, device remove themselves from it
+changed: working on better subscriber support in ctrlpoints (switching to references)
+removed: embedded devices support until we have a better idea on how to support it (is it DLNA compliant anyway?)
+added: a PresentationUrl element to description only if present otherwise Intel UPnP DeviceSpy is confused!
+added: avi & divx extension support to content-type
+added: custom http chunk decoder even though we don't support HTTP 1.1 yet
+fixed: server not reading socket info properly when receiving datagrams which would cause a device to respond to M-SEARCH requests on the wrong udp port (and Xbox360s to not discover our server!)
+fixed: Http Server handlers seem to trigger only on the path of a url NOT including the query which means that SCPD Urls with queries currently don't work! For now we switch to not use queries in SCPD urls
+changed: now announce and respond to search requests on loopback adapter
+fixed: Task manager thread was not sleeping enough! now 100ms
+added: ContentDirectorywSearchSCPD.xml SCPD (Xbox 360 needs Search !)
+updated: latest Neptune
+added: jpg content-type
+fixed: now don't allow to start if specified port for server is in use already
+added: more mimetype to class support
+added: can now pass a port for the file server of PLT_FileMediaServer
+changed: Device host and ctrl points now get their own task manager so that when they stop, all tasks stop so there's no need to keep track of running tasks
+changed: ctrl point now issue a search at least on localhost if no interfaces were found
+fixed: UPnP devices and ctrl points are now freed when stopped (removed)
+fixed: UPnP devices and ctrl points can be restarted (reused) now
+added: better support for icons
+fixed: EventSubscribers now have their own task and try to reuse the socket (Connection Keep-Alive) when possible
+changed: Service uses NPT_List instead of NPT_Arrays to improve manipulation of state vars
+added: Can now use Connection keep-alive with HTTP/1.0 clients
+added: State variables can now be moderated. Service has a task that monitors if vars have changed and send updates if it's time (according to moderation)
+added: Service now supports the "LastChange" state variable
+changed: PLT_SsdpInitMulticastIterator joins group on any interface
+fixed: possible lock when stopping all tasks (lock, notify tasks to stop, unlock then wait for list to be empty)
+added: some dlna support
+changed: moved File Media server from PLT_MediaServer to PLT_FileMediaServer
+added: placeholder for Search in PLT_MediaServer
+changed: removed MediaRenderer and MediaServer projects, now all is in Platinum project
+changed: moved MediaConnect source in Source/Devices
+fixed: build to not include ../ in path.. hopefully fixing gcc 3.3.5 errors
+added: MediaServer now sets variable rate
+fixed: bug where subscribers were deleted all the time after first notification
+fixed: eventing of moderated state variable changes
+fixed: temporary hack for XBMC support of Xbox360, we urlencoded the ? to that the 360 doesn't strip out the query and then the query ends being parsed as part of the path
+changed: didl now forces an empty upnp:artist
+added: Search action to look for ContainerID instead of ObjectId in xml since that's what the xbox 360 sends!
+changed: refactored to use NPT_HttpRequestContext instead of NPT_SocketInfo
+added: new macosx target (universal)
+fixed: use of NPT_CONFIG_THREAD_STACK_SIZE for xbox
+added: can now reset the connector of a NPT_HttpClient
+changed: Updates missing headers only if they're really missing (user_agent, connection, ..)
+changed: Updated NPT_MessageQueue to reflect new blocking way
+changed: Neptune Http server now uses reuse_address when binding
+fixed: single quote in urls
+changed: now can abort NPT_HttpServer
+fixed: If a request is forwarded, don't try to send the body if there's no content length...
+fixed: UPnP Renderer now receives moderated events properly
+fixed: Platinum scons Build, added MediaConnect target
+improved: HttpClientSocketTask now uses keep-alive so if the server is 1.1 or 1.0 with Connection: Keep-alive, it reuses the socket, useful for eventing
+added: Split up MediaConnect support and services into separate class, now CUPnPServer derives from PLT_MediaConnect.
+refactored: move httpserver in start/stop so that it actually stops and cleans up when the device is stopped
+fixed: now starts a thread only when there's a need to event state variable changes to subscribers instead of in the ctor. Useful since the class is also used by ctrl points and they don't need to notify.
+fixed: check that the body stream of a request is rewindable before trying to send a request on a keep-alive socket. If it fails, we wouldn't be able to resend it, so instead, we close the socket and reopen a new one.
+added: new downloader class
+fixed: potential deadlock when stopping upnp while devices are running
+changed: made file server port public in PLT_FileMediaServer so that we can update/query it without recreating a new class (no need for setter/getter)
+
+Platinum 0.3.8
+---------------
+
+fixed: crash in MicroMediaController (ctrlpoint really) when devices go away and a new one reappear. The control point was not removing subscribers from its list for the removed device.
+added: Visual Studio 2005 project files
+changed: switched to using new Neptune Logging system
+changed: PLT_DeviceHost now appends the ip address to friendly name if asked
+
+Platinum 0.3.7
+---------------
+changed: removed projects in the works from solution
+changed: dont restrict an interface to have the MULTICAST flag to send multicast data. If it's not multicast, it just won't send it. Cygwin doesn't report MULTICAST flag properly on interfaces that are multicast so that's why.
+fixed: clear SyncMediaBrowser cache for a device when it disappears
+changed: put back interface matching in proxy using netmask
+fixed: linux build
+fixed: workaround Windows Media Player bug that replaces back slashes to forward slashes in a url query !
+fixed: duplicate headers in crawler response
+changed: fileserver now defaults to serving root "/" with all children so that crawler can use /foo.wma
+changed: made ProcessFileRequest overridable for Crawler
+changed: Mega update:
+ - revamped to use http handlers from Neptune
+ - extensive switch to using address instead of pointers for NPT_HttpRequest & NPT_HttpResponse
+ - using eventhandlers now in devicehost (static for desc & scpds + dynamic for control/event) and controlpoint (event notifications)
+ - fixed host advertising twice byebye on exit
+ - Moved DeviceHost and Ctrlpoint Start/Stop into protected. It's PLT_UPnP now that starts and stop a device (via Add/Remove..)
+ - Created templated PLT_HttpRequestHandler
+fixed: 10 secs to get a M-SEARCH response is fine
+fixed: make it possible to pass an address to send the response back from a search, this is necessary when the udp.connect didn't actually find out which local interface to use
+fixed: now advertises on all interfaces even in broadcast
+fixed: setting MX to 1 in proxy, setting extra header to make sure we don't loop more
+changed: new ssdp proxy using broadcast instead of unicast, no need to keep track of unicasters anymore
+changed: when using broadcast mode, try to use interface broadcast address instead of 255.255.255.255
+changed: made presentation url public (so it can be overridden from the outside)
+hacked: device icons
+changed: better advertising in broadcast mode (less verbose)
+fixed: crash when a device disappears while trying to unsubscribe
+fixed: subscribers being added twice
+fixed: no need to set random seed in task, must be done in threads instead (using thread id)
+changed: added a media cache to cache data responses from servers to speed up
+fixed: better event support (fixed a couple of bugs), unsubscribe on device remove, still need to implement subscription renewal
+changed: improved NPT_Directory to read size & type with 1 call
+fixed: assuming forward unix style delimiters in resource urls was wrong, we want to keep whatever we're passed, it may matter
+changed: now can specify to keep file extension in item title
+changed: can now put a list of UUIDs to ignore in a ctrl point
+changed: now sends a search on localhost if no valid interfaces were found
+changed: now supports broadcast announcements for devices (mainly used by XBOX)
+fixed: changed callbackurls list to be NPT_List<NPT_String> instead of NPT_List<NPT_String*> for event subscribers to fix a weird crash
+fixed: SsdpListenTask takes a true UdpSocket if broadcast mode set
+changed: adding support of NPT_StringFinder for NPT_List<NPT_String> containers
+changed: using a HttpUrl for base urls instead of string
+changed: StreamHandler interface, now passing socket info to ModifyResource
+
+Platinum 0.3.6
+---------------
+- fixed list of devices not being cleared when ctrl point is stopped
+- fixed setting bad content length when serving a file with a byte-range request causing
+- filemediaserver now exposes one resource per network interface and put the proper one first (one the browse request was received on)
+- start listening for ssdp when upnp starts and stops when it stops
+- reversing back adding the Search method to ContentDirectory service
+- rewrite of action processing after finding a major flaw due to parallel processing of multiple calls to the same action. Now each invocation of an action gets its own sets of arguments (in and out).
+
+Platinum 0.3.5
+---------------
+Fixes/Changes:
+- updated directory structure so that everything falls under Build/Targets (even scons based stuff)
+- Fixing ip address being 0.0.0.0 in media resources under cygwin in some cases
+- switching to using HTTP/1.0 for http responses
+- scons build output to Targets top level folder now
+- fixed bug where files with no extensions were not advertised (linux)
+- now strips the executables in Targets folder only in release build
+- Fixed cygwin bug where devices wouldn't be detected when started after a Control Point. Was advertising on disconnected interfaces.
+- Fixed logging wrong ip address, now defaults to 127.0.0.1 if no valid one found
+- fixed bug in server socket task
+- added back HttpClientTests to solution
+- fixed bug in client socket task
+- switch to using NPT_StringOutputStream instead of PLT_OutputStringStream
+- improved PLT_Downloader
+- started working on a SQLite abstraction layer for a better Media Server (work in progress)
+
+Platinum 0.3.2
+---------------
+Fixes/Changes:
+- Tasks and TaskManager rewrote. No more housekeeping thread to cleanup tasks. Tasks are automatically cleaned up when done.
+- Stopping a ControlPoint will also stop the SSDP search tasks.
+- HttpServer can limit the number of connections (threads) it can handle at once.
+- Didl processing rewrote. Didl objects are more C++ oriented now.
+- Some progress in regards to DLNA validation. HTTP Server is 1.0 only (connections are closed immediately once all data has been sent. No more keep-alive support).
+- Started working on Ozone (Sqlite3 abstraction layer)
+
+Platinum 0.3.1
+---------------
+Fixes/Changes:
+- Fixed LightSample Test
+- Fixed MediaRenderer Test
+- Removed old source and project files to avoid confusion
+
+Platinum 0.3.00
+---------------
+Fixes/Changes:
+- Added MacOSX support.
+- Fixed socket abortion problem on Linux (using a pipe).
+- Complete rewrite to use threads instead of interrupt driven round-robin. The benefit is that throughput is now greatly improved (for streaming especially).
+- Addded a new App: MediaCrawler
+- Split up AV MediaServer code. Now the FileMediaServer is one implementation of the AV MediaServer. More to follow.
+- Added README, CHANGELOG, LICENSE files
+
+Known issues:
+- AV MediaServer Search not implemented yet.
+- Http server does not use a thread pool. This can be a problem with hungry ControlPoints like the Intel Tools AV MediaController.
+
+Platinum 0.2.00
+---------------
+Fixes/Changes:
+- Added support for Linux, Xbox, cygwin platforms (using Scons http://scons.org)
+- Now using timeouts on sockets. Fixed search not being repeatly sent.
+- Moved Neptune under ThirdParty folder
+
+Known issues:
+- Aborting on some platforms (linux/xbox) is not immediate. Sockets cannot be easily aborted by simply calling closesocket.
+
+Platinum 0.1.00
+---------------
+Initial Release
diff --git a/lib/libUPnP/Platinum/Extras/neptune-logging.properties b/lib/libUPnP/Platinum/Extras/neptune-logging.properties
new file mode 100644
index 0000000..e630440
--- /dev/null
+++ b/lib/libUPnP/Platinum/Extras/neptune-logging.properties
@@ -0,0 +1,13 @@
+### configure the root logger
+.level = FINE
+.handlers = ConsoleHandler,UdpHandler,FileHandler
+.ConsoleHandler.colors = off
+.ConsoleHandler.filter = 14
+.UdpHandler.hostname=239.255.255.100
+.FileHandler.filename = platinum.log
+
+### configure the platinum logger
+#platinum.level = FINE
+#platinum.handlers = FileHandler
+#platinum.FileHandler.filename = platinum.log
+#platinum.FileHandler.filter = 28 \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Extras/platinum-120x120.jpg b/lib/libUPnP/Platinum/Extras/platinum-120x120.jpg
new file mode 100644
index 0000000..06c0e03
--- /dev/null
+++ b/lib/libUPnP/Platinum/Extras/platinum-120x120.jpg
Binary files differ
diff --git a/lib/libUPnP/Platinum/Extras/platinum-120x120.png b/lib/libUPnP/Platinum/Extras/platinum-120x120.png
new file mode 100644
index 0000000..7f81ea8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Extras/platinum-120x120.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/Extras/platinum-48x48.jpg b/lib/libUPnP/Platinum/Extras/platinum-48x48.jpg
new file mode 100644
index 0000000..b92b439
--- /dev/null
+++ b/lib/libUPnP/Platinum/Extras/platinum-48x48.jpg
Binary files differ
diff --git a/lib/libUPnP/Platinum/Extras/platinum-48x48.png b/lib/libUPnP/Platinum/Extras/platinum-48x48.png
new file mode 100644
index 0000000..1a6086f
--- /dev/null
+++ b/lib/libUPnP/Platinum/Extras/platinum-48x48.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/LICENSE.txt b/lib/libUPnP/Platinum/LICENSE.txt
new file mode 100644
index 0000000..979ed5c
--- /dev/null
+++ b/lib/libUPnP/Platinum/LICENSE.txt
@@ -0,0 +1,375 @@
+Platinum UPnP SDK
+-----------------
+This software is provided under the following license:
+
+Plutinosoft, LLC provides its Platinum UPnP SDK under a dual
+license model designed to meet the development and distribution
+needs of both commercial distributors (such as OEMs, ISVs and VARs)
+and open source projects.
+
+For OEMs, ISVs, VARs and Other Distributors of Commercial Applications:
+OEMs, ISVs, VARs and other distributors that combine and distribute
+commercially licensed software with Platinum software and do not wish
+to distribute the source code for the commercially licensed software
+under version 2, or (at your option) any later version, of the GNU
+General Public License (the "GPL") must enter into a commercial
+license agreement with Plutinosoft, LLC.
+
+For developers of Free Open Source Software ("FOSS") applications
+under the GPL that want to combine and distribute those FOSS
+applications with Platinum software, Plutinosoft's Platinum
+open source software licensed under the GPL version 2, or (at your option)
+any later version, is the best option.
+
+Note that Platinum SDK links with Neptune C++ Runtime
+(http://sourceforge.net/projects/neptune), which is licensed under the
+terms of the BSD license. This license is compatible with the GNU GPL.
+
+Platinum is copyrighted by Plutinosoft, LLC.
+http://www.plutinosoft.com
+
+For all commercial license inquiries, please contact us at
+licensing@plutinosoft.com
+
+-------------------------------------------------------------------------
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, 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 or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+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 give any other recipients of the Program a copy of this License
+along with the Program.
+
+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 Program or any portion
+of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+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 Program, 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 Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) 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; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, 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 executable. However, as a
+special exception, the source code 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.
+
+If distribution of executable or 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 counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+ 5. 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 Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program 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 to
+this License.
+
+ 7. 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 Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program 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 Program.
+
+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.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program 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.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 Program
+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 Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, 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
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), 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 Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. 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 program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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 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.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+-------------------------------------------------------------------------
diff --git a/lib/libUPnP/Platinum/README.md b/lib/libUPnP/Platinum/README.md
new file mode 100644
index 0000000..6a1c11f
--- /dev/null
+++ b/lib/libUPnP/Platinum/README.md
@@ -0,0 +1,131 @@
+#PLATINUM UPNP SDK [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Build Status](https://travis-ci.org/plutinosoft/Platinum.svg?branch=master)](https://travis-ci.org/plutinosoft/Platinum)
+
+This toolkit consists of 2 modules:
+* Neptune : a C++ Runtime Library
+* Platinum: a modular UPnP Framework [Platinum depends on Neptune]
+
+Unless you intend to use Neptune independently from Platinum, it is recommended that you build binaries directly from the Platinum root directory. All the dependent binaries will be rebuilt automatically (including Neptune).
+
+#Building SDK and Sample Applications
+
+## Windows:
+Open the Visual Studio 2010 solution located @ Build\Targets\x86-microsoft-win32-vs2010\Platinum.sln
+
+## Mac, iOS:
+First install carthage (https://github.com/Carthage/Carthage)
+```
+> brew update || brew install carthage
+```
+Build Neptune & Platinum frameworks
+```
+> carthage bootstrap
+> carthage build --no-skip-current
+```
+
+Both Neptune and Platinum frameworks binaries can be found under Carthage/Build folders which you can link with your applications.
+Follow the instructions on the [carthage page](https://github.com/Carthage/Carthage).
+If you are building for iOS, special [instructions here](https://github.com/Carthage/Carthage#if-youre-building-for-ios).
+
+If you are interested in building sample apps or tests, you can also open the XCode project file located @ Build/Targets/universal-apple-macosx/Platinum.xcodeproj.
+
+## Linux, Cygwin, etc ...
+Open a shell, go to the Platinum root directory and type 'scons' (http://scons.org).
+```
+> brew update || brew install scons
+> git submodule update --init
+> scons target={TARGET} build_config={Debug|Release}
+```
+The output of the scons build will be found under Build/Targets/{TARGET}/{Debug|Release}.
+Additionally, the output is copied under Targets/{TARGET}/{Debug|Release} for convenience when applicable.
+
+#Running Sample Applications
+
+## FileMediaServerTest
+This is an example of a UPnP MediaServer. Given a path, it allows a UPnP ControlPoint to browse the content of the directory and its sub-directories. Additionally, files can be streamed (Note that only files with known mimetypes are advertised).
+
+```
+FileMediaServerTest [-f <friendly_name>] <path>
+ -f : optional upnp server friendly name
+ <path> : local path to serve
+```
+
+Once started, type 'q' to quit.
+
+## MediaRendererTest
+This is an example shell of a UPnP MediaRenderer. It is to be contolled by a UPnP ControlPoint. This is just a SHELL, this won't play anything yet. You need to hook up the playback functionality yourself.
+
+```
+MediaRendererTest [-f <friendly_name>]
+ -f : optional upnp server friendly name
+```
+
+Once started, type 'q' to quit.
+
+## MediaCrawler
+This is a combo UPnP MediaServer + ControlPoint. It browses content from other MediaServers it finds on the network and present them under one single aggregated view. This is useful for some devices that need to select one single MediaServer at boot time (i.e. Roku).
+
+Once started, type 'q' to quit.
+
+## MicroMediaController
+This is a ControlPoint (synchronous) that lets you browse any MediaServer using a shell-like interface. Once started, a command prompt lets you enter commands such as:
+```
+ quit - shutdown
+ exit - same as quit
+ setms - select a media server to become the active media server
+ getms - print the friendly name of the active media server
+ ls - list the contents of the current directory on the active
+ media server
+ cd - traverse down one level in the content tree on the active
+ media server
+ cd .. - traverse up one level in the content tree on the active
+ media server
+ pwd - print the path from the root to your current position in the
+ content tree on the active media server
+```
+
+Experimental MediaRenderer commands (not yet full implemented):
+```
+ setmr - select a media renderer to become the active media renderer
+ getmr - print the friendly name of the active media renderer
+ open - set the uri on the active media renderer
+ play - play the active uri on the active media renderer
+ stop - stop the active uri on the active media renderer
+```
+
+## MediaConnect
+This is a derived implementation of the FileMediaServerTest with the only difference that it makes it visible to a XBox 360.
+
+## MediaServerCocoaTest
+A basic cocoa test server app showing how to use the Platinum framework on Mac OSX.
+
+#Language Bindings
+
+## Objective-C
+Under Source/Extras/ObjectiveC
+
+## C++/CLR
+Under Source/Extras/Managed
+
+## Android Java/JNI
+To build the JNI shared library, you will need to install the Android NDK and set up the proper environment variables such as ANDROID_NDK_ROOT.
+```
+> scons target=arm-android-linux build_config=Release
+> cd Source/Platform/Android/module/platinum
+> ndk-build NDK_DEBUG=0
+```
+
+This will create the libplatinum-jni.so files under the Source/Platform/Android/module/platinum/libs folder.
+You can then import eclipse Android .project located @ Source/Platform/Android/modules/platinum to create the jar file @ Source/Platform/Android/modules/platinum/bin/platinum.jar
+
+To Test the Platinum jni layer, import into eclipse both Android projects located @ Source/Platform/Android/samples/sample-upnp & Source/Platform/Android/modules/platinum.
+
+#Contributing
+
+We're glad you're interested in Platinum, and we'd love to see where you take it.
+
+Any contributors to the master Platinum repository must sign the [Individual Contributor License Agreement (CLA)](https://docs.google.com/forms/d/1-SuyEu0LfYuhY3kKDDdfdYn5cmTU2lrQRSQSDHau4PI/viewform).
+It's a short form that covers our bases and makes sure you're eligible to contribute.
+
+When you have a change you'd like to see in the master repository, [send a pull request](https://github.com/plutinosoft/Platinum/pulls). Before we merge your request, we'll make sure you're in the list of people who have signed a CLA.
+
+Thanks!
diff --git a/lib/libUPnP/Platinum/SConstruct b/lib/libUPnP/Platinum/SConstruct
new file mode 100644
index 0000000..373e606
--- /dev/null
+++ b/lib/libUPnP/Platinum/SConstruct
@@ -0,0 +1 @@
+SConscript('Build/Boot.scons')
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowser-Info.plist b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowser-Info.plist
new file mode 100644
index 0000000..789bf78
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowser-Info.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.yourcompany.${PRODUCT_NAME:identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>NSMainNibFile</key>
+ <string>MainWindow</string>
+</dict>
+</plist>
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.h b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.h
new file mode 100755
index 0000000..d22cff1
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.h
@@ -0,0 +1,44 @@
+/*****************************************************************
+|
+| Platinum - Cocoa Touch Browser App
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+@interface CocoaTouchBrowserAppDelegate : NSObject <UIApplicationDelegate> {
+
+ UIWindow *window;
+ UINavigationController *navigationController;
+}
+
+@property (nonatomic, retain) IBOutlet UIWindow *window;
+@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
+
+@end
+
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.m b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.m
new file mode 100755
index 0000000..b7fb853
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/CocoaTouchBrowserAppDelegate.m
@@ -0,0 +1,73 @@
+/*****************************************************************
+|
+| Platinum - Cocoa Touch Browser
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#import "CocoaTouchBrowserAppDelegate.h"
+#import "RootViewController.h"
+
+
+@implementation CocoaTouchBrowserAppDelegate
+
+@synthesize window;
+@synthesize navigationController;
+
+
+#pragma mark -
+#pragma mark Application lifecycle
+
+- (void)applicationDidFinishLaunching:(UIApplication *)application {
+
+ // Override point for customization after app launch
+
+ [window addSubview:[navigationController view]];
+ [window makeKeyAndVisible];
+}
+
+
+- (void)applicationWillTerminate:(UIApplication *)application {
+ // Save data if appropriate
+}
+
+
+#pragma mark -
+#pragma mark Memory management
+
+- (void)dealloc {
+ [navigationController release];
+ [window release];
+ [super dealloc];
+}
+
+
+@end
+
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MainWindow.xib b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MainWindow.xib
new file mode 100755
index 0000000..41eefd3
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MainWindow.xib
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">768</int>
+ <string key="IBDocument.SystemVersion">10A288</string>
+ <string key="IBDocument.InterfaceBuilderVersion">715</string>
+ <string key="IBDocument.AppKitVersion">1010</string>
+ <string key="IBDocument.HIToolboxVersion">411.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">46</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="13"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBProxyObject" id="841351856">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ </object>
+ <object class="IBProxyObject" id="302016328">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ </object>
+ <object class="IBUICustomObject" id="664661524"/>
+ <object class="IBUIWindow" id="380026005">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">1316</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrameSize">{320, 480}</string>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAxIDEAA</bytes>
+ </object>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ </object>
+ <object class="IBUINavigationController" id="701001926">
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ <object class="IBUINavigationBar" key="IBUINavigationBar" id="207850653">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{0, 0}</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <bool key="IBUIMultipleTouchEnabled">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="IBUIViewControllers">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBUIViewController" id="619226028">
+ <object class="IBUINavigationItem" key="IBUINavigationItem" id="394667715">
+ <reference key="IBUINavigationBar"/>
+ </object>
+ <reference key="IBUIParentViewController" ref="701001926"/>
+ <string key="IBUINibName">RootViewController</string>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="664661524"/>
+ </object>
+ <int key="connectionID">4</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="664661524"/>
+ <reference key="destination" ref="380026005"/>
+ </object>
+ <int key="connectionID">5</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">navigationController</string>
+ <reference key="source" ref="664661524"/>
+ <reference key="destination" ref="701001926"/>
+ </object>
+ <int key="connectionID">15</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="380026005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="841351856"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">3</int>
+ <reference key="object" ref="664661524"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="302016328"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">9</int>
+ <reference key="object" ref="701001926"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="207850653"/>
+ <reference ref="619226028"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">11</int>
+ <reference key="object" ref="207850653"/>
+ <reference key="parent" ref="701001926"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">13</int>
+ <reference key="object" ref="619226028"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="394667715"/>
+ </object>
+ <reference key="parent" ref="701001926"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">14</int>
+ <reference key="object" ref="394667715"/>
+ <reference key="parent" ref="619226028"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.CustomClassName</string>
+ <string>-2.CustomClassName</string>
+ <string>11.IBPluginDependency</string>
+ <string>13.CustomClassName</string>
+ <string>13.IBPluginDependency</string>
+ <string>2.IBAttributePlaceholdersKey</string>
+ <string>2.IBEditorWindowLastContentRect</string>
+ <string>2.IBPluginDependency</string>
+ <string>3.CustomClassName</string>
+ <string>3.IBPluginDependency</string>
+ <string>9.IBEditorWindowLastContentRect</string>
+ <string>9.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>UIApplication</string>
+ <string>UIResponder</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>RootViewController</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <object class="NSMutableDictionary">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <string>{{673, 376}, {320, 480}}</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>CocoaTouchBrowserAppDelegate</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>{{500, 343}, {320, 480}}</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">15</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">RootViewController</string>
+ <string key="superclassName">UITableViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/RootViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">CocoaTouchBrowserAppDelegate</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>navigationController</string>
+ <string>window</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>UINavigationController</string>
+ <string>UIWindow</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/CocoaTouchBrowserAppDelegate.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
+ <integer value="3100" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">CocoaTouchBrowser.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.h b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.h
new file mode 100644
index 0000000..ee9f42d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.h
@@ -0,0 +1,101 @@
+/*****************************************************************
+|
+| Platinum - Media Browser Wrapper
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#import <Platinum/Platinum.h>
+
+/*----------------------------------------------------------------------
+| DiscoveryWrapper
++---------------------------------------------------------------------*/
+@interface DiscoveryWrapper : NSObject
+{
+ @public
+ PLT_DeviceDataReference device;
+ bool added;
+}
+@end
+
+/*----------------------------------------------------------------------
+| BrowseResponseWrapper
++---------------------------------------------------------------------*/
+@interface BrowseResponseWrapper : NSObject
+{
+ @public
+ NPT_Result res;
+ PLT_DeviceDataReference device;
+ PLT_BrowseInfo *info;
+ void *userdata;
+}
+@end
+
+/*----------------------------------------------------------------------
+| MediaBrowserDelegate interface
++---------------------------------------------------------------------*/
+@protocol MediaBrowserDelegate
+
+-(void) handleDiscovery: (DiscoveryWrapper*) wrapper;
+-(void) handleBrowseResponse: (BrowseResponseWrapper*) wrapper;
+
+@end
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowserWrapper class
++---------------------------------------------------------------------*/
+class PLT_MediaBrowserWrapper : public PLT_MediaBrowser,
+ public PLT_MediaBrowserDelegate
+{
+public:
+ PLT_MediaBrowserWrapper(PLT_CtrlPointReference& control_point);
+ virtual ~PLT_MediaBrowserWrapper();
+
+ // public methods
+ virtual void SetWrapperDelegate(id delegate) { m_WrapperDelegate = delegate; }
+
+ // PLT_MediaBrowserDelegate methods
+ bool OnMSAdded(PLT_DeviceDataReference& device);
+ void OnMSRemoved(PLT_DeviceDataReference& device);
+ void OnBrowseResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata);
+
+private:
+ void NotifyAddedRemoved(PLT_DeviceDataReference& device,
+ bool added);
+
+private:
+ id m_WrapperDelegate;
+};
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.mm b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.mm
new file mode 100644
index 0000000..c853994
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/MediaBrowserWrapper.mm
@@ -0,0 +1,130 @@
+/*****************************************************************
+|
+| Platinum - Media Browser Wrapper
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#import "MediaBrowserWrapper.h"
+
+/*----------------------------------------------------------------------
+| DiscoveryWrapper implementation
++---------------------------------------------------------------------*/
+@implementation DiscoveryWrapper
+@end
+
+/*----------------------------------------------------------------------
+| BrowseResponseWrapper implementation
++---------------------------------------------------------------------*/
+@implementation BrowseResponseWrapper
+@end
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowserWrapper::PLT_MediaBrowserWrapper
++---------------------------------------------------------------------*/
+PLT_MediaBrowserWrapper::PLT_MediaBrowserWrapper(PLT_CtrlPointReference& control_point) :
+ PLT_MediaBrowser(control_point)
+{
+ PLT_MediaBrowser::SetDelegate(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowserWrapper::~PLT_MediaBrowserWrapper
++---------------------------------------------------------------------*/
+PLT_MediaBrowserWrapper::~PLT_MediaBrowserWrapper()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowserWrapper::OnMSAdded
++---------------------------------------------------------------------*/
+bool
+PLT_MediaBrowserWrapper::OnMSAdded(PLT_DeviceDataReference& device)
+{
+ NotifyAddedRemoved(device, true);
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowserWrapper::OnMSRemoved
++---------------------------------------------------------------------*/
+void
+PLT_MediaBrowserWrapper::OnMSRemoved(PLT_DeviceDataReference& device)
+{
+ NotifyAddedRemoved(device, false);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowserWrapper::NotifyAddedRemoved
++---------------------------------------------------------------------*/
+void
+PLT_MediaBrowserWrapper::NotifyAddedRemoved(PLT_DeviceDataReference& device,
+ bool added)
+{
+ if ([m_WrapperDelegate respondsToSelector:@selector(handleDiscovery:)]) {
+ DiscoveryWrapper* wrapper = [[DiscoveryWrapper alloc] init];
+ wrapper->device = device;
+ wrapper->added = added;
+
+ // trigger the handling of the message on the main thread
+ [m_WrapperDelegate performSelectorOnMainThread: @selector(handleDiscovery:)
+ withObject: wrapper
+ waitUntilDone: YES];
+ [wrapper release];
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowserWrapper::OnBrowseResult
++---------------------------------------------------------------------*/
+void
+PLT_MediaBrowserWrapper::OnBrowseResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata)
+{
+ if ([m_WrapperDelegate respondsToSelector:@selector(handleBrowseResponse:)]) {
+ BrowseResponseWrapper* wrapper = [[BrowseResponseWrapper alloc] init];
+ wrapper->res = res;
+ wrapper->device = device;
+ wrapper->info = info;
+ wrapper->userdata = userdata;
+
+ // trigger the handling of the message on the main thread
+ [m_WrapperDelegate performSelectorOnMainThread: @selector(handleBrowseResponse:)
+ withObject: wrapper
+ waitUntilDone: YES];
+ [wrapper release];
+ }
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.h b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.h
new file mode 100755
index 0000000..e2f6a8d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.h
@@ -0,0 +1,38 @@
+/*****************************************************************
+|
+| Platinum - Cocoa Touch Browser App
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+@interface RootViewController : UITableViewController {
+}
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.m b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.m
new file mode 100755
index 0000000..b75870a
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.m
@@ -0,0 +1,179 @@
+/*****************************************************************
+|
+| Platinum - Cocoa Touch Browser App
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#import "RootViewController.h"
+
+
+@implementation RootViewController
+
+/*
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
+ // self.navigationItem.rightBarButtonItem = self.editButtonItem;
+}
+*/
+
+/*
+- (void)viewWillAppear:(BOOL)animated {
+ [super viewWillAppear:animated];
+}
+*/
+/*
+- (void)viewDidAppear:(BOOL)animated {
+ [super viewDidAppear:animated];
+}
+*/
+/*
+- (void)viewWillDisappear:(BOOL)animated {
+ [super viewWillDisappear:animated];
+}
+*/
+/*
+- (void)viewDidDisappear:(BOOL)animated {
+ [super viewDidDisappear:animated];
+}
+*/
+
+/*
+ // Override to allow orientations other than the default portrait orientation.
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ // Return YES for supported orientations.
+ return (interfaceOrientation == UIInterfaceOrientationPortrait);
+}
+ */
+
+- (void)didReceiveMemoryWarning {
+ // Releases the view if it doesn't have a superview.
+ [super didReceiveMemoryWarning];
+
+ // Release any cached data, images, etc that aren't in use.
+}
+
+- (void)viewDidUnload {
+ // Release anything that can be recreated in viewDidLoad or on demand.
+ // e.g. self.myOutlet = nil;
+}
+
+
+#pragma mark Table view methods
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+
+// Customize the number of rows in the table view.
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return 0;
+}
+
+
+// Customize the appearance of table view cells.
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+
+ static NSString *CellIdentifier = @"Cell";
+
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+ if (cell == nil) {
+ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
+ }
+
+ // Configure the cell.
+
+ return cell;
+}
+
+
+
+/*
+// Override to support row selection in the table view.
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+
+ // Navigation logic may go here -- for example, create and push another view controller.
+ // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
+ // [self.navigationController pushViewController:anotherViewController animated:YES];
+ // [anotherViewController release];
+}
+*/
+
+
+/*
+// Override to support conditional editing of the table view.
+- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
+ // Return NO if you do not want the specified item to be editable.
+ return YES;
+}
+*/
+
+
+/*
+// Override to support editing the table view.
+- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
+
+ if (editingStyle == UITableViewCellEditingStyleDelete) {
+ // Delete the row from the data source.
+ [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
+ }
+ else if (editingStyle == UITableViewCellEditingStyleInsert) {
+ // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
+ }
+}
+*/
+
+
+/*
+// Override to support rearranging the table view.
+- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
+}
+*/
+
+
+/*
+// Override to support conditional rearranging of the table view.
+- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
+ // Return NO if you do not want the item to be re-orderable.
+ return YES;
+}
+*/
+
+
+- (void)dealloc {
+ [super dealloc];
+}
+
+
+@end
+
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.xib b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.xib
new file mode 100755
index 0000000..98c7f8c
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/RootViewController.xib
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.03">
+ <data>
+ <int key="IBDocument.SystemTarget">768</int>
+ <string key="IBDocument.SystemVersion">9G55</string>
+ <string key="IBDocument.InterfaceBuilderVersion">677</string>
+ <string key="IBDocument.AppKitVersion">949.43</string>
+ <string key="IBDocument.HIToolboxVersion">353.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="9"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBProxyObject" id="372490531">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ </object>
+ <object class="IBProxyObject" id="500153577">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ </object>
+ <object class="IBUITableView" id="747164330">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrameSize">{320, 416}</string>
+ <reference key="NSSuperview"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ <object class="IBUISimulatedNavigationBarMetrics" key="IBUISimulatedTopBarMetrics">
+ <bool key="IBUIPrompted">NO</bool>
+ </object>
+ <bool key="IBUIBouncesZoom">NO</bool>
+ <int key="IBUISeparatorStyle">1</int>
+ <int key="IBUISectionIndexMinimumDisplayRowCount">0</int>
+ <bool key="IBUIShowsSelectionImmediatelyOnTouchBegin">YES</bool>
+ <float key="IBUIRowHeight">4.400000e+01</float>
+ <float key="IBUISectionHeaderHeight">2.200000e+01</float>
+ <float key="IBUISectionFooterHeight">2.200000e+01</float>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">tableView</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="747164330"/>
+ </object>
+ <int key="connectionID">10</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="747164330"/>
+ </object>
+ <int key="connectionID">11</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">dataSource</string>
+ <reference key="source" ref="747164330"/>
+ <reference key="destination" ref="372490531"/>
+ </object>
+ <int key="connectionID">12</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="747164330"/>
+ <reference key="destination" ref="372490531"/>
+ </object>
+ <int key="connectionID">13</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <object class="NSArray" key="object" id="231031770">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="372490531"/>
+ <reference key="parent" ref="231031770"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="500153577"/>
+ <reference key="parent" ref="231031770"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">9</int>
+ <reference key="object" ref="747164330"/>
+ <reference key="parent" ref="231031770"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.CustomClassName</string>
+ <string>-2.CustomClassName</string>
+ <string>9.IBEditorWindowLastContentRect</string>
+ <string>9.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>RootViewController</string>
+ <string>UIResponder</string>
+ <string>{{236, 337}, {320, 480}}</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">13</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">RootViewController</string>
+ <string key="superclassName">UITableViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/RootViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">RootViewController</string>
+ <string key="superclassName">UITableViewController</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">tableView</string>
+ <string key="NS.object.0">UITableView</string>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">CocoaTouchBrowser.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/main.m b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/main.m
new file mode 100755
index 0000000..02e3ea8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/CocoaTouchBrowser/main.m
@@ -0,0 +1,43 @@
+/*****************************************************************
+|
+| Platinum - Cocoa Touch Browser
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#import <UIKit/UIKit.h>
+
+int main(int argc, char *argv[]) {
+
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ int retVal = UIApplicationMain(argc, argv, nil, @"CocoaTouchBrowserAppDelegate");
+ [pool release];
+ return retVal;
+}
diff --git a/lib/libUPnP/Platinum/Source/Apps/FrameStreamer/main.cpp b/lib/libUPnP/Platinum/Source/Apps/FrameStreamer/main.cpp
new file mode 100644
index 0000000..fba4986
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/FrameStreamer/main.cpp
@@ -0,0 +1,249 @@
+/*****************************************************************
+|
+| Platinum - Frame Streamer
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Platinum.h"
+#include "PltFrameBuffer.h"
+#include "PltFrameStream.h"
+#include "PltFrameServer.h"
+
+#include <stdlib.h>
+
+NPT_SET_LOCAL_LOGGER("platinum.core.framestreamer")
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+struct Options {
+ const char* path;
+} Options;
+
+/*----------------------------------------------------------------------
+| StreamValidator:
++---------------------------------------------------------------------*/
+class StreamValidator : public PLT_StreamValidator
+{
+public:
+ StreamValidator(NPT_Reference<PLT_FrameBuffer>& buffer) : m_Buffer(buffer) {}
+ virtual ~StreamValidator() {}
+
+ // PLT_StreamValidator methods
+ bool OnNewRequestAccept(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ NPT_Reference<PLT_FrameBuffer>& buffer) {
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(response);
+ NPT_COMPILER_UNUSED(context);
+ // TODO: should compare HTTP Header Accept and buffer mimetype
+ buffer = m_Buffer;
+ return true;
+ }
+
+ NPT_Reference<PLT_FrameBuffer> m_Buffer;
+};
+
+/*----------------------------------------------------------------------
+| FrameWriter
++---------------------------------------------------------------------*/
+class FrameWriter : public NPT_Thread
+{
+public:
+ FrameWriter(NPT_Reference<PLT_FrameBuffer>& frame_buffer,
+ const char* frame_folder) :
+ m_FrameBuffer(frame_buffer),
+ m_Aborted(false),
+ m_Folder(frame_folder)
+ {}
+
+ const char* GetPath(NPT_List<NPT_String>::Iterator& entry) {
+ if (!entry) return NULL;
+
+ if (!entry->EndsWith(".jpg", true)) {
+ return GetPath(++entry);
+ }
+
+ return *entry;
+ }
+
+ void Run() {
+ NPT_List<NPT_String> entries;
+ const char* frame_path = NULL;
+ NPT_DataBuffer frame;
+ NPT_List<NPT_String>::Iterator entry;
+
+ while (!m_Aborted) {
+ // has number of images changed since last time?
+ NPT_LargeSize count;
+ NPT_File::GetSize(m_Folder, count);
+
+ if (entries.GetItemCount() == 0 || entries.GetItemCount() != count) {
+ NPT_File::ListDir(m_Folder, entries);
+ entry = entries.GetFirstItem();
+ if (!entry) {
+ // Wait a bit before continuing
+ NPT_System::Sleep(NPT_TimeInterval(0.2f));
+ continue;
+ }
+
+ // set delay based on number of files if necessary
+ m_Delay = NPT_TimeInterval((float)1.f/entries.GetItemCount());
+ }
+
+ // look for path to next image
+ if (!(frame_path = GetPath(entry))) {
+ // loop back if necessary
+ entry = entries.GetFirstItem();
+ continue;
+ }
+
+ if (NPT_FAILED(NPT_File::Load(NPT_FilePath::Create(m_Folder, frame_path), frame))) {
+ NPT_LOG_SEVERE_1("Image \"%s\" not found!", frame_path?frame_path:"none");
+ // clear previously loaded names so we reload entire set
+ entries.Clear();
+ continue;
+ }
+
+ if (NPT_FAILED(m_FrameBuffer->SetNextFrame(frame.GetData(),
+ frame.GetDataSize()))) {
+ NPT_LOG_SEVERE_1("Failed to set next frame %s", frame_path);
+ goto failure;
+ }
+
+ // Wait before loading next frame
+ NPT_System::Sleep(m_Delay);
+
+ // look for next entry
+ ++entry;
+ }
+
+failure:
+ // one more time to unblock any pending readers
+ m_FrameBuffer->Abort();
+ }
+
+ NPT_Reference<PLT_FrameBuffer> m_FrameBuffer;
+ bool m_Aborted;
+ NPT_String m_Folder;
+ NPT_TimeInterval m_Delay;
+};
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(char** args)
+{
+ fprintf(stderr, "usage: %s <images path>\n", args[0]);
+ fprintf(stderr, "<path> : local path to serve images from\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| ParseCommandLine
++---------------------------------------------------------------------*/
+static void
+ParseCommandLine(char** args)
+{
+ char** _args = args++;
+ const char* arg;
+
+ /* default values */
+ Options.path = NULL;
+
+ while ((arg = *args++)) {
+ if (Options.path == NULL) {
+ Options.path = arg;
+ } else {
+ fprintf(stderr, "ERROR: too many arguments\n");
+ PrintUsageAndExit(_args);
+ }
+ }
+
+ /* check args */
+ if (Options.path == NULL) {
+ fprintf(stderr, "ERROR: path missing\n");
+ PrintUsageAndExit(_args);
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ NPT_COMPILER_UNUSED(argc);
+
+ /* parse command line */
+ ParseCommandLine(argv);
+
+ // frame buffer
+ NPT_Reference<PLT_FrameBuffer> frame_buffer(new PLT_FrameBuffer("image/jpeg"));
+
+ // A Framewriter reading images from a folder and writing them
+ // into frame buffer in a loop
+ FrameWriter writer(frame_buffer, Options.path);
+ writer.Start();
+
+ // stream request validation
+ StreamValidator validator(frame_buffer);
+
+ // frame server receiving requests and serving frames
+ // read from frame buffer
+ NPT_Reference<PLT_FrameServer> device(
+ new PLT_FrameServer(
+ "frame",
+ validator,
+ NPT_IpAddress::Any,
+ 8099));
+
+ if (NPT_FAILED(device->Start()))
+ return 1;
+
+ char buf[256];
+ while (gets(buf))
+ {
+ if (*buf == 'q')
+ {
+ break;
+ }
+ }
+
+ writer.m_Aborted = true;
+
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Apps/MediaConnect/main.cpp b/lib/libUPnP/Platinum/Source/Apps/MediaConnect/main.cpp
new file mode 100644
index 0000000..993005f
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MediaConnect/main.cpp
@@ -0,0 +1,131 @@
+/*****************************************************************
+|
+| Platinum - Test UPnP A/V Media Connect
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltMediaConnect.h"
+#include "PltVersion.h"
+
+#include <stdlib.h>
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+struct Options {
+ const char* path;
+} Options;
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(char** args)
+{
+ fprintf(stderr, "usage: %s <path>\n", args[0]);
+ fprintf(stderr, "<path> : local path to serve\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| ParseCommandLine
++---------------------------------------------------------------------*/
+static void
+ParseCommandLine(char** args)
+{
+ char** _args = args++;
+ const char* arg;
+
+ /* default values */
+ Options.path = NULL;
+
+ while ((arg = *args++)) {
+ if (Options.path == NULL) {
+ Options.path = arg;
+ } else {
+ fprintf(stderr, "ERROR: too many arguments\n");
+ PrintUsageAndExit(_args);
+ }
+ }
+
+ /* check args */
+ if (Options.path == NULL) {
+ fprintf(stderr, "ERROR: path missing\n");
+ PrintUsageAndExit(_args);
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // setup Neptune logging
+ NPT_LogManager::GetDefault().Configure("plist:.level=FINE;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=63");
+
+ NPT_COMPILER_UNUSED(argc);
+
+ // parse command line
+ ParseCommandLine(argv);
+
+ // setup device
+ PLT_MediaConnect* connect(
+ new PLT_MediaConnect("Platinum"));
+ connect->SetByeByeFirst(false);
+
+ // setup delegate
+ NPT_Reference<PLT_FileMediaConnectDelegate> delegate(
+ new PLT_FileMediaConnectDelegate("/", Options.path));
+ connect->SetDelegate((PLT_MediaServerDelegate*)delegate.AsPointer());
+
+ PLT_UPnP upnp;
+ PLT_DeviceHostReference device(connect);
+ upnp.AddDevice(device);
+ if (NPT_FAILED(upnp.Start()))
+ return 1;
+
+ char buf[256];
+ while (gets(buf))
+ {
+ if (*buf == 'q')
+ {
+ break;
+ }
+ }
+
+ upnp.Stop();
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/MediaCrawler.cpp b/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/MediaCrawler.cpp
new file mode 100644
index 0000000..ed0c726
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/MediaCrawler.cpp
@@ -0,0 +1,566 @@
+/*****************************************************************
+|
+| Platinum - Media Crawler
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltVersion.h"
+#include "MediaCrawler.h"
+#include "PltLeaks.h"
+#include "PltMediaServer.h"
+#include "PltHttpServer.h"
+#include "PltDidl.h"
+#include "PltUtilities.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.apps.crawler")
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::CMediaCrawler
++---------------------------------------------------------------------*/
+CMediaCrawler::CMediaCrawler(PLT_CtrlPointReference& ctrlPoint,
+ const char* friendly_name,
+ bool show_ip,
+ const char* udn /* = NULL */,
+ unsigned int port /* = 0 */) :
+ PLT_MediaBrowser(ctrlPoint, NULL),
+ PLT_MediaServer(friendly_name, show_ip, udn, port)
+{
+}
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::~CMediaCrawler
++---------------------------------------------------------------------*/
+CMediaCrawler::~CMediaCrawler()
+{
+}
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::SplitObjectId
++---------------------------------------------------------------------*/
+NPT_Result
+CMediaCrawler::SplitObjectId(const NPT_String& object_id, NPT_String& server_uuid, NPT_String& server_object_id)
+{
+ // reset output params
+ server_uuid = "";
+ server_object_id = "";
+
+ if (object_id.GetLength() == 0 || object_id[0] != '0')
+ return NPT_ERROR_INVALID_FORMAT;
+
+ if (object_id.GetLength() > 1) {
+ if (object_id[1] != '/') return NPT_ERROR_INVALID_FORMAT;
+
+ server_uuid = object_id.SubString(2);
+
+ // look for next delimiter
+ int index = server_uuid.Find('/');
+ if (index >= 0) {
+ server_object_id = server_uuid.SubString(index+1);
+ server_uuid.SetLength(index);
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::FormatObjectId
++---------------------------------------------------------------------*/
+NPT_String
+CMediaCrawler::FormatObjectId(const NPT_String& server_uuid, const NPT_String& server_object_id)
+{
+ NPT_String object_id = NPT_String("0/") + server_uuid;
+ if (server_object_id.GetLength())
+ object_id += NPT_String("/") + server_object_id;
+
+ return object_id;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnBrowse
++---------------------------------------------------------------------*/
+NPT_Result
+CMediaCrawler::OnBrowse(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_Result res;
+
+ NPT_String object_id;
+ if (NPT_FAILED(action->GetArgumentValue("ObjectId", object_id))) {
+ NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowse - invalid arguments.");
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE_1("PLT_FileMediaServer::OnOnBrowse - id = %s\r\n", (const char*)object_id);
+
+ // extract server uuid and server object id from our object id
+ NPT_String server_uuid;
+ NPT_String server_object_id;
+ if (NPT_FAILED(SplitObjectId(object_id, server_uuid, server_object_id))) {
+ /* error */
+ NPT_LOG_WARNING("CMediaCrawler::OnBrowse - ObjectID not found.");
+ action->SetError(701, "No Such Object.");
+ return NPT_FAILURE;
+ }
+
+ // root ?
+ if (server_uuid.GetLength() == 0) {
+ res = OnBrowseRoot(action);
+ } else {
+ // we have a device to browse
+ // is it device root?
+ if (server_object_id.GetLength() == 0) {
+ server_object_id = "0";
+ }
+ res = OnBrowseDevice(action, server_uuid, server_object_id, context);
+ }
+
+ if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) {
+ action->SetError(800, "Internal error");
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::OnBrowseRoot
++---------------------------------------------------------------------*/
+NPT_Result
+CMediaCrawler::OnBrowseRoot(PLT_ActionReference& action)
+{
+ NPT_String browseFlagValue;
+ if (NPT_FAILED(action->GetArgumentValue("BrowseFlag", browseFlagValue))) {
+ NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowse - invalid arguments.");
+ return NPT_FAILURE;
+ }
+
+ /* extract browseFlag */
+ BrowseFlags browseFlag;
+ if (NPT_FAILED(ParseBrowseFlag(browseFlagValue, browseFlag))) {
+ /* error */
+ NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowseRoot - BrowseFlag value not allowed.");
+ action->SetError(402,"Invalid BrowseFlag arg.");
+ return NPT_FAILURE;
+ }
+
+ if (browseFlag == BROWSEMETADATA) {
+ PLT_MediaContainer item;
+ item.m_Title = "Root";
+ item.m_ParentID = "-1";
+ item.m_ObjectID = "0";
+ item.m_ChildrenCount = GetMediaServers().GetItemCount();
+ item.m_ObjectClass.type = "object.container";
+
+ /* convert item to didl */
+ NPT_String filter;
+ action->GetArgumentValue("Filter", filter);
+ NPT_String tmp;
+ NPT_CHECK_SEVERE(PLT_Didl::ToDidl(item, filter, tmp));
+
+ /* add didl header and footer */
+ NPT_String didl = didl_header + tmp + didl_footer;
+
+ action->SetArgumentValue("Result", didl);
+ action->SetArgumentValue("NumberReturned", "1");
+ action->SetArgumentValue("TotalMatches", "1");
+
+ // update ID may be wrong here, it should be the one of the container?
+ action->SetArgumentValue("UpdateId", "1");
+ // TODO: We need to keep track of the overall updateID of the CDS
+ } else {
+ NPT_String startingInd;
+ NPT_String reqCount;
+ NPT_String filter;
+
+ NPT_CHECK_SEVERE(action->GetArgumentValue("StartingIndex", startingInd));
+ NPT_CHECK_SEVERE(action->GetArgumentValue("RequestedCount", reqCount));
+ NPT_CHECK_SEVERE(action->GetArgumentValue("Filter", filter));
+
+ NPT_Int32 start_index, req_count;
+ if (NPT_FAILED(startingInd.ToInteger(start_index)) ||
+ NPT_FAILED(reqCount.ToInteger(req_count))) {
+ return NPT_FAILURE;
+ }
+
+ NPT_Int32 cur_index = 0;
+ NPT_Int32 num_returned = 0;
+ NPT_Int32 total_matches = 0;
+ //unsigned long update_id = 0;
+ PLT_MediaContainer item;
+ NPT_String item_didl;
+ NPT_String didl = didl_header;
+
+ {
+ // populate a list of containers (one container per known servers)
+ const NPT_Lock<PLT_DeviceDataReferenceList>& devices = GetMediaServers();
+ NPT_AutoLock lock((NPT_Mutex&)devices);
+
+ NPT_Lock<PLT_DeviceDataReferenceList>::Iterator entry = devices.GetFirstItem();
+ while (entry) {
+ PLT_DeviceDataReference device = (*entry);
+ item.m_Title = device->GetFriendlyName();
+ item.m_ObjectID = FormatObjectId(device->GetUUID(), "0");
+ item.m_ParentID = "0";
+ item.m_ObjectClass.type = "object.container";
+
+ // reset tmp didl
+ item_didl = "";
+ if ((cur_index >= start_index) && ((num_returned < req_count) || (req_count == 0))) {
+ NPT_CHECK_SEVERE(PLT_Didl::ToDidl(item, filter, item_didl));
+
+ didl += item_didl;
+ num_returned++;
+ }
+ cur_index++;
+ total_matches++;
+
+ ++entry;
+ }
+ }
+
+ didl += didl_footer;
+
+ action->SetArgumentValue("Result", didl);
+ action->SetArgumentValue("NumberReturned", NPT_String::FromInteger(num_returned));
+ action->SetArgumentValue("TotalMatches", NPT_String::FromInteger(total_matches));
+ action->SetArgumentValue("UpdateId", "1");
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::OnBrowseDevice
++---------------------------------------------------------------------*/
+NPT_Result
+CMediaCrawler::OnBrowseDevice(PLT_ActionReference& action,
+ const char* server_uuid,
+ const char* server_object_id,
+ const NPT_HttpRequestContext& context)
+{
+ NPT_Result res;
+ PLT_DeviceDataReference device;
+
+ if (NPT_FAILED(FindServer(server_uuid, device))) {
+ /* error */
+ NPT_LOG_WARNING("CMediaCrawler::OnBrowseDevice - device not found.");
+ action->SetError(701, "No Such Object.");
+ return NPT_FAILURE;
+ }
+
+ // look for args and convert them
+ NPT_String browseFlagValue;
+ NPT_String startingInd;
+ NPT_String reqCount;
+ NPT_String filter;
+ NPT_String sort;
+
+ NPT_CHECK_SEVERE(action->GetArgumentValue("BrowseFlag", browseFlagValue));
+ NPT_CHECK_SEVERE(action->GetArgumentValue("StartingIndex", startingInd));
+ NPT_CHECK_SEVERE(action->GetArgumentValue("RequestedCount", reqCount));
+ NPT_CHECK_SEVERE(action->GetArgumentValue("Filter", filter));
+ NPT_CHECK_SEVERE(action->GetArgumentValue("SortCriteria", sort));
+
+ NPT_Int32 start_index, req_count;
+ if (NPT_FAILED(startingInd.ToInteger(start_index)) ||
+ NPT_FAILED(reqCount.ToInteger(req_count))) {
+ return NPT_FAILURE;
+ }
+
+ // create a container for our result
+ // this will be filled in by OnBrowseResponse
+ CMediaCrawlerBrowseInfoReference browse_info(new CMediaCrawlerBrowseInfo());
+ browse_info->shared_var.SetValue(0);
+
+ // send off the browse packet. Note that this will
+ // not block. The shared variable is used to block
+ // until the response has been received.
+ res = Browse(device,
+ server_object_id,
+ start_index,
+ req_count,
+ (browseFlagValue == "BrowseMetadata")?1:0,
+ filter,
+ sort,
+ new CMediaCrawlerBrowseInfoReference(browse_info));
+ NPT_CHECK_SEVERE(res);
+
+ // wait 10 secs for response
+ res = browse_info->shared_var.WaitUntilEquals(1, 10000);
+ NPT_CHECK_SEVERE(res);
+
+ // did the browse fail?
+ if (NPT_FAILED(browse_info->res)) {
+ action->SetError(browse_info->code, "");
+ return NPT_FAILURE;
+ }
+
+ action->SetArgumentValue("Result", UpdateDidl(server_uuid, browse_info->didl, &context.GetLocalAddress()));
+ action->SetArgumentValue("NumberReturned", browse_info->nr);
+ action->SetArgumentValue("TotalMatches", browse_info->tm);
+ action->SetArgumentValue("UpdateId", browse_info->uid);
+ action->SetArgumentValue("ObjectID", FormatObjectId(server_uuid, browse_info->object_id));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::OnBrowseResponse
++---------------------------------------------------------------------*/
+NPT_Result
+CMediaCrawler::OnBrowseResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_COMPILER_UNUSED(device);
+
+ if (!userdata) return NPT_FAILURE;
+
+ CMediaCrawlerBrowseInfoReference* info = (CMediaCrawlerBrowseInfoReference*) userdata;
+ (*info)->res = res;
+ (*info)->code = action->GetErrorCode();
+
+ if (NPT_FAILED(action->GetArgumentValue("ObjectID", (*info)->object_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("UpdateID", (*info)->uid))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("NumberReturned", (*info)->nr))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("TotalMatches", (*info)->tm))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("Result", (*info)->didl))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED((*info)->res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ goto done;
+
+bad_action:
+ if (NPT_SUCCEEDED((*info)->res)) (*info)->res = NPT_FAILURE;
+
+done:
+ (*info)->shared_var.SetValue(1);
+ delete info;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::UpdateDidl
++---------------------------------------------------------------------*/
+NPT_String
+CMediaCrawler::UpdateDidl(const char* server_uuid,
+ const NPT_String& didl,
+ const NPT_SocketAddress* req_local_address /* = NULL */)
+{
+ NPT_String new_didl;
+ NPT_String str;
+ NPT_XmlNode* node = NULL;
+ NPT_XmlWriter writer;
+ NPT_OutputStreamReference stream(new NPT_StringOutputStream(&new_didl));
+
+ NPT_LOG_FINE("Parsing Didl...");
+
+ NPT_XmlElementNode* tree = NULL;
+ NPT_XmlParser parser;
+ if (NPT_FAILED(parser.Parse(didl, node)) || !node || !node->AsElementNode()) {
+ goto cleanup;
+ }
+
+ tree = node->AsElementNode();
+
+ NPT_LOG_FINE("Processing Didl xml...");
+ if (tree->GetTag().Compare("DIDL-Lite", true)) {
+ goto cleanup;
+ }
+
+ // iterate through children
+ NPT_Result res;
+ for (NPT_List<NPT_XmlNode*>::Iterator children = tree->GetChildren().GetFirstItem(); children; children++) {
+ NPT_XmlElementNode* child = (*children)->AsElementNode();
+ if (!child) continue;
+
+ // object id remapping
+ NPT_XmlAttribute* attribute_id;
+ res = PLT_XmlHelper::GetAttribute(child, "id", attribute_id);
+ if (NPT_SUCCEEDED(res) && attribute_id) {
+ attribute_id->SetValue(FormatObjectId(server_uuid, attribute_id->GetValue()));
+ }
+
+ // parent ID remapping
+ NPT_XmlAttribute* attribute_parent_id;
+ res = PLT_XmlHelper::GetAttribute(child, "parentID", attribute_parent_id);
+ if (NPT_SUCCEEDED(res)) {
+ attribute_parent_id->SetValue(attribute_parent_id->GetValue().Compare("-1")?FormatObjectId(server_uuid, attribute_parent_id->GetValue()):"0");
+ }
+
+ // resources remapping
+ NPT_Array<NPT_XmlElementNode*> resources;
+ PLT_XmlHelper::GetChildren(child, resources, "res");
+ if (resources.GetItemCount() > 0) {
+ for (unsigned int i=0; i<resources.GetItemCount(); i++) {
+ NPT_XmlElementNode* resource = resources[i];
+ NPT_XmlAttribute* attribute_prot;
+ const NPT_String* url;
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(resource, "protocolInfo", attribute_prot)) && (url = resource->GetText())) {
+ // special case for Windows Media Connect
+ // When a browse is done on the same machine, WMC uses localhost
+ // instead of the IP for all resources urls which means we cannot advertise that
+ // since it would be useless for a remote device
+ // so we try to replace it with the right IP address by looking at which interface we received the
+ // initial browse request on to make sure the remote device will be able to access the modified resource
+ // urls (in case the local PC has more than 1 NICs)
+
+ // replace the url
+ NPT_List<NPT_XmlNode*>& nodes = resource->GetChildren();
+ NPT_HttpUrl http_url(NPT_Uri::PercentDecode(*url));
+ if ((http_url.GetHost() == "localhost" || http_url.GetHost() == "127.0.0.1") && req_local_address) {
+ if (req_local_address->GetIpAddress().AsLong()) {
+ http_url.SetHost(req_local_address->GetIpAddress().ToString());
+
+ // replace text
+ nodes.Apply(NPT_ObjectDeleter<NPT_XmlNode>());
+ nodes.Clear();
+ resource->AddText(http_url.ToString());
+ url = resource->GetText();
+ }
+ }
+
+ CStreamHandler* handler = NULL;
+ res = NPT_ContainerFind(m_StreamHandlers, CStreamHandlerFinder(attribute_prot->GetValue(), *url), handler);
+ if (NPT_SUCCEEDED(res)) {
+ handler->ModifyResource(resource);
+ }
+ }
+ }
+ }
+ }
+
+ // serialize modified node into new didl
+ writer.Serialize(*node, *stream);
+ delete node;
+ return new_didl;
+
+cleanup:
+ delete node;
+ return didl;
+}
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::ProcessFileRequest
++---------------------------------------------------------------------*/
+NPT_Result
+CMediaCrawler::ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINE, "CMediaCrawler::ProcessFileRequest:", &request);
+
+ if (request.GetMethod().Compare("GET", true) && request.GetMethod().Compare("HEAD", true)) {
+ response.SetStatus(500, "Internal Server Error");
+ return NPT_SUCCESS;
+ }
+
+ // add the user agent header, some stupid media servers like YME needs it
+ if (!request.GetHeaders().GetHeader(NPT_HTTP_HEADER_USER_AGENT)) {
+ request.GetHeaders().SetHeader(NPT_HTTP_HEADER_USER_AGENT,
+ "Platinum/" PLT_PLATINUM_SDK_VERSION_STRING);
+ }
+
+ // File requested
+ NPT_HttpResponse* out_response = NULL;
+ NPT_HttpUrlQuery query(request.GetUrl().GetQuery());
+ const char* url = query.GetField("url");
+ if (url) {
+ // look for handler
+ CStreamHandler* handler = NULL;
+ NPT_ContainerFind(m_StreamHandlers, CStreamHandlerFinder(NULL, url), handler);
+ if (handler && NPT_SUCCEEDED(handler->ProcessFileRequest(request, out_response)) && out_response) {
+ // copy response code and reason
+ response.SetStatus(out_response->GetStatusCode(), out_response->GetReasonPhrase());
+
+ // copy headers
+ NPT_List<NPT_HttpHeader*>::Iterator headers = out_response->GetHeaders().GetHeaders().GetFirstItem();
+ while (headers) {
+ response.GetHeaders().SetHeader((*headers)->GetName(), (*headers)->GetValue());
+ ++headers;
+ }
+ response.SetEntity(new NPT_HttpEntity(response.GetHeaders()));
+
+ // update inputstream
+ NPT_HttpEntity* out_entity;
+ if ((out_entity = out_response->GetEntity()) != NULL) {
+ NPT_InputStreamReference inputstream;
+ out_entity->GetInputStream(inputstream);
+ if (!inputstream.IsNull()) {
+ // set the stream but do not update the content length
+ response.GetEntity()->SetInputStream(inputstream, false);
+ }
+ }
+
+ delete out_response;
+ return NPT_SUCCESS;
+ }
+ }
+
+ response.SetStatus(404, "File Not Found");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| CMediaCrawler::AddStreamHandler
++---------------------------------------------------------------------*/
+NPT_Result
+CMediaCrawler::AddStreamHandler(CStreamHandler* handler)
+{
+ // make sure we don't have a metadatahandler registered for the same extension
+ // PLT_StreamHandler* prev_handler;
+ // NPT_Result ret = NPT_ContainerFind(m_StreamHandlers, PLT_StreamHandlerFinder(handler->GetExtension()), prev_handler);
+ // if (NPT_SUCCEEDED(ret)) {
+ // return NPT_ERROR_INVALID_PARAMETERS;
+ // }
+
+ m_StreamHandlers.Add(handler);
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/MediaCrawler.h b/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/MediaCrawler.h
new file mode 100644
index 0000000..5aba341
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/MediaCrawler.h
@@ -0,0 +1,118 @@
+/*****************************************************************
+|
+| Platinum - Media Crawler
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _CRAWLER_H_
+#define _CRAWLER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Platinum.h"
+#include "PltMediaConnect.h"
+#include "PltSyncMediaBrowser.h"
+#include "StreamHandler.h"
+
+/*----------------------------------------------------------------------
+| CMediaCrawler
++---------------------------------------------------------------------*/
+class CMediaCrawler : public PLT_MediaBrowser,
+ public PLT_MediaServer
+
+{
+public:
+ CMediaCrawler(PLT_CtrlPointReference& ctrlPoint,
+ const char* friendly_name = "Platinum Crawler",
+ bool show_ip = false,
+ const char* udn = NULL,
+ unsigned int port = 0);
+ virtual ~CMediaCrawler();
+
+ NPT_Result AddStreamHandler(CStreamHandler* handler);
+
+protected:
+ // PLT_MediaServer methods
+ NPT_Result OnBrowse(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+
+ // PLT_MediaBrowser methods
+ NPT_Result OnBrowseResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata);
+
+ // File Server Listener methods
+ NPT_Result ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+private:
+ // methods
+ NPT_Result OnBrowseRoot(PLT_ActionReference& action);
+ NPT_Result OnBrowseDevice(PLT_ActionReference& action,
+ const char* server_uuid,
+ const char* server_object_id,
+ const NPT_HttpRequestContext& context);
+
+ NPT_Result SplitObjectId(const NPT_String& object_id,
+ NPT_String& server_uuid,
+ NPT_String& server_object_id);
+ NPT_String FormatObjectId(const NPT_String& server_uuid,
+ const NPT_String& server_object_id);
+
+ NPT_String UpdateDidl(const char* server_uuid,
+ const NPT_String& didl,
+ const NPT_SocketAddress* req_local_address = NULL);
+
+ // members
+ NPT_List<CStreamHandler*> m_StreamHandlers;
+};
+
+/*----------------------------------------------------------------------
+| CMediaCrawlerBrowseInfo
++---------------------------------------------------------------------*/
+struct CMediaCrawlerBrowseInfo {
+ NPT_SharedVariable shared_var;
+ NPT_Result res;
+ int code;
+ NPT_String object_id;
+ NPT_String didl;
+ NPT_String nr;
+ NPT_String tm;
+ NPT_String uid;
+};
+
+typedef NPT_Reference<CMediaCrawlerBrowseInfo> CMediaCrawlerBrowseInfoReference;
+
+#endif /* _CRAWLER_H_ */
+
diff --git a/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/StreamHandler.h b/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/StreamHandler.h
new file mode 100644
index 0000000..1f03fde
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/StreamHandler.h
@@ -0,0 +1,113 @@
+/*****************************************************************
+|
+| Platinum - Stream Handler
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_STREAM_HANDLER_H_
+#define _PLT_STREAM_HANDLER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class CMediaCrawler;
+
+/*----------------------------------------------------------------------
+| CStreamHandler
++---------------------------------------------------------------------*/
+class CStreamHandler
+{
+public:
+ CStreamHandler(CMediaCrawler* crawler) : m_MediaCrawler(crawler) {}
+ virtual ~CStreamHandler() {}
+
+ // overridables
+ virtual bool HandleResource(const char* prot_info, const char* url) = 0;
+ virtual NPT_Result ModifyResource(NPT_XmlElementNode* resource, NPT_SocketInfo* info = NULL) = 0;
+ virtual NPT_Result ProcessFileRequest(NPT_HttpRequest& request, NPT_HttpResponse*& response) = 0;
+
+protected:
+ CMediaCrawler* m_MediaCrawler;
+};
+
+/*----------------------------------------------------------------------
+| CStreamHandlerFinder
++---------------------------------------------------------------------*/
+class CStreamHandlerFinder
+{
+public:
+ // methods
+ CStreamHandlerFinder(const char* prot_info, const char* url) : m_ProtInfo(prot_info), m_Url(url) {}
+ bool operator()(CStreamHandler* const & handler) const {
+ return handler->HandleResource(m_ProtInfo, m_Url);
+ }
+
+private:
+ // members
+ NPT_String m_ProtInfo;
+ NPT_String m_Url;
+};
+
+/*----------------------------------------------------------------------
+| CPassThroughStreamHandler
++---------------------------------------------------------------------*/
+class CPassThroughStreamHandler : public CStreamHandler
+{
+public:
+ CPassThroughStreamHandler(CMediaCrawler* crawler) : CStreamHandler(crawler) {}
+ virtual ~CPassThroughStreamHandler() {}
+
+ // overridables
+ virtual bool HandleResource(const char* /*prot_info*/, const char* /*url*/) {
+ return true;
+ }
+
+ virtual NPT_Result ModifyResource(NPT_XmlElementNode* resource,
+ NPT_SocketInfo* info = NULL) {
+ NPT_COMPILER_UNUSED(resource);
+ NPT_COMPILER_UNUSED(info);
+ return NPT_SUCCESS;
+ }
+
+ virtual NPT_Result ProcessFileRequest(NPT_HttpRequest& request,
+ NPT_HttpResponse*& response) {
+ NPT_HttpClient client;
+ return client.SendRequest(request, response);
+ }
+
+};
+
+#endif /* _PLT_STREAM_HANDLER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/main.cpp b/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/main.cpp
new file mode 100644
index 0000000..80a1a23
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MediaCrawler/main.cpp
@@ -0,0 +1,83 @@
+/*****************************************************************
+|
+| Platinum - main
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "MediaCrawler.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int main(void)
+{
+ // setup Neptune logging
+ NPT_LogManager::GetDefault().Configure("plist:.level=INFO;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=58");
+
+ PLT_UPnP upnp;
+ PLT_CtrlPointReference ctrlPoint(new PLT_CtrlPoint());
+ upnp.AddCtrlPoint(ctrlPoint);
+
+ CMediaCrawler* crawler =
+ new CMediaCrawler(ctrlPoint,
+ "Sylvain: Platinum: Crawler");
+ CPassThroughStreamHandler* handler =
+ new CPassThroughStreamHandler(crawler);
+ crawler->AddStreamHandler(handler);
+ PLT_DeviceHostReference device(crawler);
+ upnp.AddDevice(device);
+
+ // make sure we ignore ourselves
+ ctrlPoint->IgnoreUUID(device->GetUUID());
+
+ upnp.Start();
+
+ // extra broadcast discover
+ ctrlPoint->Discover(NPT_HttpUrl("255.255.255.255", 1900, "*"), "upnp:rootdevice", 1);
+
+ char buf[256];
+ while (gets(buf)) {
+ if (*buf == 'q')
+ break;
+ }
+
+ upnp.Stop();
+
+ delete handler;
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Apps/MicroMediaController/PltMicroMediaController.cpp b/lib/libUPnP/Platinum/Source/Apps/MicroMediaController/PltMicroMediaController.cpp
new file mode 100644
index 0000000..5c2e7fb
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MicroMediaController/PltMicroMediaController.cpp
@@ -0,0 +1,869 @@
+/*****************************************************************
+|
+| Platinum - Miccro Media Controller
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMicroMediaController.h"
+#include "PltLeaks.h"
+#include "PltDownloader.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+//NPT_SET_LOCAL_LOGGER("platinum.tests.micromediacontroller")
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::PLT_MicroMediaController
++---------------------------------------------------------------------*/
+PLT_MicroMediaController::PLT_MicroMediaController(PLT_CtrlPointReference& ctrlPoint) :
+ PLT_SyncMediaBrowser(ctrlPoint),
+ PLT_MediaController(ctrlPoint)
+{
+ // create the stack that will be the directory where the
+ // user is currently browsing.
+ // push the root directory onto the directory stack.
+ m_CurBrowseDirectoryStack.Push("0");
+
+ PLT_MediaController::SetDelegate(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::PLT_MicroMediaController
++---------------------------------------------------------------------*/
+PLT_MicroMediaController::~PLT_MicroMediaController()
+{
+}
+
+/*
+* Remove trailing white space from a string
+*/
+static void strchomp(char* str)
+{
+ if (!str) return;
+ char* e = str+NPT_StringLength(str)-1;
+
+ while (e >= str && *e) {
+ if ((*e != ' ') &&
+ (*e != '\t') &&
+ (*e != '\r') &&
+ (*e != '\n'))
+ {
+ *(e+1) = '\0';
+ break;
+ }
+ --e;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::ChooseIDFromTable
++---------------------------------------------------------------------*/
+/*
+ * Presents a list to the user, allows the user to choose one item.
+ *
+ * Parameters:
+ * PLT_StringMap: A map that contains the set of items from
+ * which the user should choose. The key should be a unique ID,
+ * and the value should be a string describing the item.
+ * returns a NPT_String with the unique ID.
+ */
+const char*
+PLT_MicroMediaController::ChooseIDFromTable(PLT_StringMap& table)
+{
+ printf("Select one of the following:\n");
+
+ NPT_List<PLT_StringMapEntry*> entries = table.GetEntries();
+ if (entries.GetItemCount() == 0) {
+ printf("None available\n");
+ } else {
+ // display the list of entries
+ NPT_List<PLT_StringMapEntry*>::Iterator entry = entries.GetFirstItem();
+ int count = 0;
+ while (entry) {
+ printf("%d)\t%s (%s)\n", ++count, (const char*)(*entry)->GetValue(), (const char*)(*entry)->GetKey());
+ ++entry;
+ }
+
+ int index, watchdog = 3;
+ char buffer[1024];
+
+ // wait for input
+ while (watchdog > 0) {
+ fgets(buffer, 1024, stdin);
+ strchomp(buffer);
+
+ if (1 != sscanf(buffer, "%d", &index)) {
+ printf("Please enter a number\n");
+ } else if (index < 0 || index > count) {
+ printf("Please choose one of the above, or 0 for none\n");
+ watchdog--;
+ index = 0;
+ } else {
+ watchdog = 0;
+ }
+ }
+
+ // find the entry back
+ if (index != 0) {
+ entry = entries.GetFirstItem();
+ while (entry && --index) {
+ ++entry;
+ }
+ if (entry) {
+ return (*entry)->GetKey();
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::PopDirectoryStackToRoot
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::PopDirectoryStackToRoot(void)
+{
+ NPT_String val;
+ while (NPT_SUCCEEDED(m_CurBrowseDirectoryStack.Peek(val)) && val.Compare("0")) {
+ m_CurBrowseDirectoryStack.Pop(val);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::OnMSAdded
++---------------------------------------------------------------------*/
+bool
+PLT_MicroMediaController::OnMSAdded(PLT_DeviceDataReference& device)
+{
+ // Issue special action upon discovering MediaConnect server
+ PLT_Service* service;
+ if (NPT_SUCCEEDED(device->FindServiceByType("urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:*", service))) {
+ PLT_ActionReference action;
+ PLT_SyncMediaBrowser::m_CtrlPoint->CreateAction(
+ device,
+ "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1",
+ "IsAuthorized",
+ action);
+ if (!action.IsNull()) {
+ action->SetArgumentValue("DeviceID", "");
+ PLT_SyncMediaBrowser::m_CtrlPoint->InvokeAction(action, 0);
+ }
+
+ PLT_SyncMediaBrowser::m_CtrlPoint->CreateAction(
+ device,
+ "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1",
+ "IsValidated",
+ action);
+ if (!action.IsNull()) {
+ action->SetArgumentValue("DeviceID", "");
+ PLT_SyncMediaBrowser::m_CtrlPoint->InvokeAction(action, 0);
+ }
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::OnMRAdded
++---------------------------------------------------------------------*/
+bool
+PLT_MicroMediaController::OnMRAdded(PLT_DeviceDataReference& device)
+{
+ NPT_String uuid = device->GetUUID();
+
+ // test if it's a media renderer
+ PLT_Service* service;
+ if (NPT_SUCCEEDED(device->FindServiceByType("urn:schemas-upnp-org:service:AVTransport:*", service))) {
+ NPT_AutoLock lock(m_MediaRenderers);
+ m_MediaRenderers.Put(uuid, device);
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::OnMRRemoved
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::OnMRRemoved(PLT_DeviceDataReference& device)
+{
+ NPT_String uuid = device->GetUUID();
+
+ {
+ NPT_AutoLock lock(m_MediaRenderers);
+ m_MediaRenderers.Erase(uuid);
+ }
+
+ {
+ NPT_AutoLock lock(m_CurMediaRendererLock);
+
+ // if it's the currently selected one, we have to get rid of it
+ if (!m_CurMediaRenderer.IsNull() && m_CurMediaRenderer == device) {
+ m_CurMediaRenderer = NULL;
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::OnMRStateVariablesChanged
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::OnMRStateVariablesChanged(PLT_Service* service,
+ NPT_List<PLT_StateVariable*>* vars)
+{
+ NPT_String uuid = service->GetDevice()->GetUUID();
+ NPT_List<PLT_StateVariable*>::Iterator var = vars->GetFirstItem();
+ while (var) {
+ printf("Received state var \"%s:%s:%s\" changes: \"%s\"\n",
+ (const char*)uuid,
+ (const char*)service->GetServiceID(),
+ (const char*)(*var)->GetName(),
+ (const char*)(*var)->GetValue());
+ ++var;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::ChooseIDGetCurMediaServerFromTable
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::GetCurMediaServer(PLT_DeviceDataReference& server)
+{
+ NPT_AutoLock lock(m_CurMediaServerLock);
+
+ if (m_CurMediaServer.IsNull()) {
+ printf("No server selected, select one with setms\n");
+ } else {
+ server = m_CurMediaServer;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::GetCurMediaRenderer
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::GetCurMediaRenderer(PLT_DeviceDataReference& renderer)
+{
+ NPT_AutoLock lock(m_CurMediaRendererLock);
+
+ if (m_CurMediaRenderer.IsNull()) {
+ printf("No renderer selected, select one with setmr\n");
+ } else {
+ renderer = m_CurMediaRenderer;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::DoBrowse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MicroMediaController::DoBrowse(const char* object_id, /* = NULL */
+ bool metadata /* = false */)
+{
+ NPT_Result res = NPT_FAILURE;
+ PLT_DeviceDataReference device;
+
+ GetCurMediaServer(device);
+ if (!device.IsNull()) {
+ NPT_String cur_object_id;
+ m_CurBrowseDirectoryStack.Peek(cur_object_id);
+
+ // send off the browse packet and block
+ res = BrowseSync(
+ device,
+ object_id?object_id:(const char*)cur_object_id,
+ m_MostRecentBrowseResults,
+ metadata);
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_getms
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_getms()
+{
+ PLT_DeviceDataReference device;
+ GetCurMediaServer(device);
+ if (!device.IsNull()) {
+ printf("Current media server: %s\n", (const char*)device->GetFriendlyName());
+ } else {
+ // this output is taken care of by the GetCurMediaServer call
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_getmr
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_getmr()
+{
+ PLT_DeviceDataReference device;
+ GetCurMediaRenderer(device);
+ if (!device.IsNull()) {
+ printf("Current media renderer: %s\n", (const char*)device->GetFriendlyName());
+ } else {
+ // this output is taken care of by the GetCurMediaRenderer call
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::ChooseDevice
++---------------------------------------------------------------------*/
+PLT_DeviceDataReference
+PLT_MicroMediaController::ChooseDevice(const NPT_Lock<PLT_DeviceMap>& deviceList)
+{
+ PLT_StringMap namesTable;
+ PLT_DeviceDataReference* result = NULL;
+ NPT_String chosenUUID;
+ NPT_AutoLock lock(m_MediaServers);
+
+ // create a map with the device UDN -> device Name
+ const NPT_List<PLT_DeviceMapEntry*>& entries = deviceList.GetEntries();
+ NPT_List<PLT_DeviceMapEntry*>::Iterator entry = entries.GetFirstItem();
+ while (entry) {
+ PLT_DeviceDataReference device = (*entry)->GetValue();
+ NPT_String name = device->GetFriendlyName();
+ namesTable.Put((*entry)->GetKey(), name);
+
+ ++entry;
+ }
+
+ // ask user to choose
+ chosenUUID = ChooseIDFromTable(namesTable);
+ if (chosenUUID.GetLength()) {
+ deviceList.Get(chosenUUID, result);
+ }
+
+ return result?*result:PLT_DeviceDataReference(); // return empty reference if not device was selected
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_setms
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_setms()
+{
+ NPT_AutoLock lock(m_CurMediaServerLock);
+
+ PopDirectoryStackToRoot();
+ m_CurMediaServer = ChooseDevice(GetMediaServersMap());
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_setmr
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_setmr()
+{
+ NPT_AutoLock lock(m_CurMediaRendererLock);
+
+ m_CurMediaRenderer = ChooseDevice(m_MediaRenderers);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_ls
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_ls()
+{
+ DoBrowse();
+
+ if (!m_MostRecentBrowseResults.IsNull()) {
+ printf("There were %d results\n", m_MostRecentBrowseResults->GetItemCount());
+
+ NPT_List<PLT_MediaObject*>::Iterator item = m_MostRecentBrowseResults->GetFirstItem();
+ while (item) {
+ if ((*item)->IsContainer()) {
+ printf("Container: %s (%s)\n", (*item)->m_Title.GetChars(), (*item)->m_ObjectID.GetChars());
+ } else {
+ printf("Item: %s (%s)\n", (*item)->m_Title.GetChars(), (*item)->m_ObjectID.GetChars());
+ }
+ ++item;
+ }
+
+ m_MostRecentBrowseResults = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_info
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_info()
+{
+ NPT_String object_id;
+ PLT_StringMap tracks;
+ PLT_DeviceDataReference device;
+
+ // issue a browse
+ DoBrowse();
+
+ if (!m_MostRecentBrowseResults.IsNull()) {
+ // create a map item id -> item title
+ NPT_List<PLT_MediaObject*>::Iterator item = m_MostRecentBrowseResults->GetFirstItem();
+ while (item) {
+ if (!(*item)->IsContainer()) {
+ tracks.Put((*item)->m_ObjectID, (*item)->m_Title);
+ }
+ ++item;
+ }
+
+ // let the user choose which one
+ object_id = ChooseIDFromTable(tracks);
+
+ if (object_id.GetLength()) {
+ // issue a browse with metadata
+ DoBrowse(object_id, true);
+
+ // look back for the PLT_MediaItem in the results
+ PLT_MediaObject* track = NULL;
+ if (!m_MostRecentBrowseResults.IsNull() &&
+ NPT_SUCCEEDED(NPT_ContainerFind(*m_MostRecentBrowseResults, PLT_MediaItemIDFinder(object_id), track))) {
+
+ // display info
+ printf("Title: %s \n", track->m_Title.GetChars());
+ printf("OjbectID: %s\n", track->m_ObjectID.GetChars());
+ printf("Class: %s\n", track->m_ObjectClass.type.GetChars());
+ printf("Creator: %s\n", track->m_Creator.GetChars());
+ printf("Date: %s\n", track->m_Date.GetChars());
+ for (NPT_List<PLT_AlbumArtInfo>::Iterator iter = track->m_ExtraInfo.album_arts.GetFirstItem();
+ iter;
+ iter++) {
+ printf("Art Uri: %s\n", (*iter).uri.GetChars());
+ printf("Art Uri DLNA Profile: %s\n", (*iter).dlna_profile.GetChars());
+ }
+ for (NPT_Cardinal i=0;i<track->m_Resources.GetItemCount(); i++) {
+ printf("\tResource[%d].uri: %s\n", i, track->m_Resources[i].m_Uri.GetChars());
+ printf("\tResource[%d].profile: %s\n", i, track->m_Resources[i].m_ProtocolInfo.ToString().GetChars());
+ printf("\tResource[%d].duration: %d\n", i, track->m_Resources[i].m_Duration);
+ printf("\tResource[%d].size: %d\n", i, (int)track->m_Resources[i].m_Size);
+ printf("\n");
+ }
+ printf("Didl: %s\n", (const char*)track->m_Didl);
+ } else {
+ printf("Couldn't find the track\n");
+ }
+ }
+
+ m_MostRecentBrowseResults = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_download
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_download()
+{
+ NPT_String object_id;
+ PLT_StringMap tracks;
+ PLT_DeviceDataReference device;
+
+ // issue a browse
+ DoBrowse();
+
+ if (!m_MostRecentBrowseResults.IsNull()) {
+ // create a map item id -> item title
+ NPT_List<PLT_MediaObject*>::Iterator item = m_MostRecentBrowseResults->GetFirstItem();
+ while (item) {
+ if (!(*item)->IsContainer()) {
+ tracks.Put((*item)->m_ObjectID, (*item)->m_Title);
+ }
+ ++item;
+ }
+
+ // let the user choose which one
+ object_id = ChooseIDFromTable(tracks);
+
+ if (object_id.GetLength()) {
+ // issue a browse with metadata
+ DoBrowse(object_id, true);
+
+ // look back for the PLT_MediaItem in the results
+ PLT_MediaObject* track = NULL;
+ if (!m_MostRecentBrowseResults.IsNull() &&
+ NPT_SUCCEEDED(NPT_ContainerFind(*m_MostRecentBrowseResults, PLT_MediaItemIDFinder(object_id), track))) {
+
+ if (track->m_Resources.GetItemCount() > 0) {
+ printf("\tResource[0].uri: %s\n", track->m_Resources[0].m_Uri.GetChars());
+ printf("\n");
+ NPT_HttpUrl url(track->m_Resources[0].m_Uri.GetChars());
+ if (url.IsValid()) {
+ // Extract filename from URL
+ NPT_String filename = NPT_FilePath::BaseName(url.GetPath(true).GetChars(), false);
+ NPT_String extension = NPT_FilePath::FileExtension(url.GetPath(true).GetChars());
+ printf("Downloading %s%s\n", filename.GetChars(), extension.GetChars());
+
+ for (int i=0; i<3; i++) {
+ NPT_String filepath = NPT_String::Format("%s_%d%s", filename.GetChars(), i, extension.GetChars());
+
+ // Open file for writing
+ NPT_File file(filepath);
+ file.Open(NPT_FILE_OPEN_MODE_WRITE | NPT_FILE_OPEN_MODE_CREATE | NPT_FILE_OPEN_MODE_TRUNCATE);
+ NPT_OutputStreamReference output;
+ file.GetOutputStream(output);
+
+ // trigger 3 download
+ PLT_Downloader* downloader = new PLT_Downloader(url, output);
+ NPT_TimeInterval delay(5.);
+ m_DownloadTaskManager.StartTask(downloader, &delay);
+ }
+ }
+ } else {
+ printf("No resources found");
+ }
+ } else {
+ printf("Couldn't find the track\n");
+ }
+ }
+
+ m_MostRecentBrowseResults = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_cd
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_cd(const char* command)
+{
+ NPT_String newobject_id;
+ PLT_StringMap containers;
+
+ // if command has parameter, push it to stack and return
+ NPT_String id = command;
+ NPT_List<NPT_String> args = id.Split(" ");
+ if (args.GetItemCount() >= 2) {
+ args.Erase(args.GetFirstItem());
+ id = NPT_String::Join(args, " ");
+ m_CurBrowseDirectoryStack.Push(id);
+ return;
+ }
+
+ // list current directory to let user choose
+ DoBrowse();
+
+ if (!m_MostRecentBrowseResults.IsNull()) {
+ NPT_List<PLT_MediaObject*>::Iterator item = m_MostRecentBrowseResults->GetFirstItem();
+ while (item) {
+ if ((*item)->IsContainer()) {
+ containers.Put((*item)->m_ObjectID, (*item)->m_Title);
+ }
+ ++item;
+ }
+
+ newobject_id = ChooseIDFromTable(containers);
+ if (newobject_id.GetLength()) {
+ m_CurBrowseDirectoryStack.Push(newobject_id);
+ }
+
+ m_MostRecentBrowseResults = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_cdup
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_cdup()
+{
+ // we don't want to pop the root off now....
+ NPT_String val;
+ m_CurBrowseDirectoryStack.Peek(val);
+ if (val.Compare("0")) {
+ m_CurBrowseDirectoryStack.Pop(val);
+ } else {
+ printf("Already at root\n");
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_pwd
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_pwd()
+{
+ NPT_Stack<NPT_String> tempStack;
+ NPT_String val;
+
+ while (NPT_SUCCEEDED(m_CurBrowseDirectoryStack.Peek(val))) {
+ m_CurBrowseDirectoryStack.Pop(val);
+ tempStack.Push(val);
+ }
+
+ while (NPT_SUCCEEDED(tempStack.Peek(val))) {
+ tempStack.Pop(val);
+ printf("%s/", (const char*)val);
+ m_CurBrowseDirectoryStack.Push(val);
+ }
+ printf("\n");
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_open
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_open()
+{
+ NPT_String object_id;
+ PLT_StringMap tracks;
+ PLT_DeviceDataReference device;
+
+ GetCurMediaRenderer(device);
+ if (!device.IsNull()) {
+ // get the protocol info to try to see in advance if a track would play on the device
+
+ // issue a browse
+ DoBrowse();
+
+ if (!m_MostRecentBrowseResults.IsNull()) {
+ // create a map item id -> item title
+ NPT_List<PLT_MediaObject*>::Iterator item = m_MostRecentBrowseResults->GetFirstItem();
+ while (item) {
+ if (!(*item)->IsContainer()) {
+ tracks.Put((*item)->m_ObjectID, (*item)->m_Title);
+ }
+ ++item;
+ }
+
+ // let the user choose which one
+ object_id = ChooseIDFromTable(tracks);
+ if (object_id.GetLength()) {
+ // look back for the PLT_MediaItem in the results
+ PLT_MediaObject* track = NULL;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(*m_MostRecentBrowseResults, PLT_MediaItemIDFinder(object_id), track))) {
+ if (track->m_Resources.GetItemCount() > 0) {
+ // look for best resource to use by matching each resource to a sink advertised by renderer
+ NPT_Cardinal resource_index = 0;
+ if (NPT_FAILED(FindBestResource(device, *track, resource_index))) {
+ printf("No matching resource\n");
+ return;
+ }
+
+ // invoke the setUri
+ printf("Issuing SetAVTransportURI with url=%s & didl=%s",
+ (const char*)track->m_Resources[resource_index].m_Uri,
+ (const char*)track->m_Didl);
+ SetAVTransportURI(device, 0, track->m_Resources[resource_index].m_Uri, track->m_Didl, NULL);
+ } else {
+ printf("Couldn't find the proper resource\n");
+ }
+
+ } else {
+ printf("Couldn't find the track\n");
+ }
+ }
+
+ m_MostRecentBrowseResults = NULL;
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_play
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_play()
+{
+ PLT_DeviceDataReference device;
+ GetCurMediaRenderer(device);
+ if (!device.IsNull()) {
+ Play(device, 0, "1", NULL);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_seek
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_seek(const char* command)
+{
+ PLT_DeviceDataReference device;
+ GetCurMediaRenderer(device);
+ if (!device.IsNull()) {
+ // remove first part of command ("seek")
+ NPT_String target = command;
+ NPT_List<NPT_String> args = target.Split(" ");
+ if (args.GetItemCount() < 2) return;
+
+ args.Erase(args.GetFirstItem());
+ target = NPT_String::Join(args, " ");
+
+ Seek(device, 0, (target.Find(":")!=-1)?"REL_TIME":"X_DLNA_REL_BYTE", target, NULL);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_stop
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_stop()
+{
+ PLT_DeviceDataReference device;
+ GetCurMediaRenderer(device);
+ if (!device.IsNull()) {
+ Stop(device, 0, NULL);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_mute
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_mute()
+{
+ PLT_DeviceDataReference device;
+ GetCurMediaRenderer(device);
+ if (!device.IsNull()) {
+ SetMute(device, 0, "Master", true, NULL);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_unmute
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_unmute()
+{
+ PLT_DeviceDataReference device;
+ GetCurMediaRenderer(device);
+ if (!device.IsNull()) {
+ SetMute(device, 0, "Master", false, NULL);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::HandleCmd_help
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::HandleCmd_help()
+{
+ printf("\n\nNone of the commands take arguments. The commands with a * \n");
+ printf("signify ones that will prompt the user for more information once\n");
+ printf("the command is called\n\n");
+ printf("The available commands are:\n\n");
+ printf(" quit - shutdown the Control Point\n");
+ printf(" exit - same as quit\n");
+
+ printf(" setms - * select a media server to become the active media server\n");
+ printf(" getms - print the friendly name of the active media server\n");
+ printf(" ls - list the contents of the current directory on the active \n");
+ printf(" media server\n");
+ printf(" info - display media info\n");
+ printf(" down - download media to current directory\n");
+ printf(" cd - * traverse down one level in the content tree on the active\n");
+ printf(" media server\n");
+ printf(" cd .. - traverse up one level in the content tree on the active\n");
+ printf(" media server\n");
+ printf(" pwd - print the path from the root to your current position in the \n");
+ printf(" content tree on the active media server\n");
+ printf(" setmr - * select a media renderer to become the active media renderer\n");
+ printf(" getmr - print the friendly name of the active media renderer\n");
+ printf(" open - set the uri on the active media renderer\n");
+ printf(" play - play the active uri on the active media renderer\n");
+ printf(" stop - stop the active uri on the active media renderer\n");
+ printf(" seek - issue a seek command\n");
+ printf(" mute - mute the active media renderer\n");
+ printf(" unmute - unmute the active media renderer\n");
+
+ printf(" help - print this help message\n\n");
+}
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController::ProcessCommandLoop
++---------------------------------------------------------------------*/
+void
+PLT_MicroMediaController::ProcessCommandLoop()
+{
+ char command[2048];
+ bool abort = false;
+
+ command[0] = '\0';
+ while (!abort) {
+ printf("command> ");
+ fflush(stdout);
+ fgets(command, 2048, stdin);
+ strchomp(command);
+
+ if (0 == strcmp(command, "quit") || 0 == strcmp(command, "exit")) {
+ abort = true;
+ } else if (0 == strcmp(command, "setms")) {
+ HandleCmd_setms();
+ } else if (0 == strcmp(command, "getms")) {
+ HandleCmd_getms();
+ } else if (0 == strncmp(command, "ls", 2)) {
+ HandleCmd_ls();
+ } else if (0 == strcmp(command, "info")) {
+ HandleCmd_info();
+ } else if (0 == strcmp(command, "down")) {
+ HandleCmd_download();
+ } else if (0 == strcmp(command, "cd")) {
+ HandleCmd_cd(command);
+ } else if (0 == strcmp(command, "cd ..")) {
+ HandleCmd_cdup();
+ } else if (0 == strcmp(command, "pwd")) {
+ HandleCmd_pwd();
+ } else if (0 == strcmp(command, "setmr")) {
+ HandleCmd_setmr();
+ } else if (0 == strcmp(command, "getmr")) {
+ HandleCmd_getmr();
+ } else if (0 == strcmp(command, "open")) {
+ HandleCmd_open();
+ } else if (0 == strcmp(command, "play")) {
+ HandleCmd_play();
+ } else if (0 == strcmp(command, "stop")) {
+ HandleCmd_stop();
+ } else if (0 == strncmp(command, "seek", 4)) {
+ HandleCmd_seek(command);
+ } else if (0 == strcmp(command, "mute")) {
+ HandleCmd_mute();
+ } else if (0 == strcmp(command, "unmute")) {
+ HandleCmd_mute();
+ } else if (0 == strcmp(command, "help")) {
+ HandleCmd_help();
+ } else if (0 == strcmp(command, "")) {
+ // just prompt again
+ } else {
+ printf("Unrecognized command: %s\n", command);
+ HandleCmd_help();
+ }
+ }
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Apps/MicroMediaController/PltMicroMediaController.h b/lib/libUPnP/Platinum/Source/Apps/MicroMediaController/PltMicroMediaController.h
new file mode 100644
index 0000000..c5b17bf
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MicroMediaController/PltMicroMediaController.h
@@ -0,0 +1,176 @@
+/*****************************************************************
+|
+| Platinum - Micro Media Controller
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _MICRO_MEDIA_CONTROLLER_H_
+#define _MICRO_MEDIA_CONTROLLER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Platinum.h"
+#include "PltMediaServer.h"
+#include "PltSyncMediaBrowser.h"
+#include "PltMediaController.h"
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| definitions
++---------------------------------------------------------------------*/
+typedef NPT_Map<NPT_String, NPT_String> PLT_StringMap;
+typedef NPT_Lock<PLT_StringMap> PLT_LockStringMap;
+typedef NPT_Map<NPT_String, NPT_String>::Entry PLT_StringMapEntry;
+
+/*----------------------------------------------------------------------
+| PLT_MediaItemIDFinder
++---------------------------------------------------------------------*/
+class PLT_MediaItemIDFinder
+{
+public:
+ // methods
+ PLT_MediaItemIDFinder(const char* object_id) : m_ObjectID(object_id) {}
+
+ bool operator()(const PLT_MediaObject* const & item) const {
+ return item->m_ObjectID.Compare(m_ObjectID, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_ObjectID;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MicroMediaController
++---------------------------------------------------------------------*/
+class PLT_MicroMediaController : public PLT_SyncMediaBrowser,
+ public PLT_MediaController,
+ public PLT_MediaControllerDelegate
+{
+public:
+ PLT_MicroMediaController(PLT_CtrlPointReference& ctrlPoint);
+ virtual ~PLT_MicroMediaController();
+
+ void ProcessCommandLoop();
+
+ // PLT_MediaBrowserDelegate methods
+ bool OnMSAdded(PLT_DeviceDataReference& device);
+
+ // PLT_MediaControllerDelegate methods
+ bool OnMRAdded(PLT_DeviceDataReference& device);
+ void OnMRRemoved(PLT_DeviceDataReference& device);
+ void OnMRStateVariablesChanged(PLT_Service* /* service */,
+ NPT_List<PLT_StateVariable*>* /* vars */);
+
+ // PLT_HttpClientTask method
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+private:
+ const char* ChooseIDFromTable(PLT_StringMap& table);
+ void PopDirectoryStackToRoot(void);
+ NPT_Result DoBrowse(const char* object_id = NULL, bool metdata = false);
+
+ void GetCurMediaServer(PLT_DeviceDataReference& server);
+ void GetCurMediaRenderer(PLT_DeviceDataReference& renderer);
+
+ PLT_DeviceDataReference ChooseDevice(const NPT_Lock<PLT_DeviceMap>& deviceList);
+
+ // Command Handlers
+ void HandleCmd_scan(const char* ip);
+ void HandleCmd_getms();
+ void HandleCmd_setms();
+ void HandleCmd_ls();
+ void HandleCmd_info();
+ void HandleCmd_cd(const char* command);
+ void HandleCmd_cdup();
+ void HandleCmd_pwd();
+ void HandleCmd_help();
+ void HandleCmd_getmr();
+ void HandleCmd_setmr();
+ void HandleCmd_download();
+ void HandleCmd_open();
+ void HandleCmd_play();
+ void HandleCmd_seek(const char* command);
+ void HandleCmd_stop();
+ void HandleCmd_mute();
+ void HandleCmd_unmute();
+
+private:
+ /* Tables of known devices on the network. These are updated via the
+ * OnMSAddedRemoved and OnMRAddedRemoved callbacks. Note that you should first lock
+ * before accessing them using the NPT_Map::Lock function.
+ */
+ NPT_Lock<PLT_DeviceMap> m_MediaServers;
+ NPT_Lock<PLT_DeviceMap> m_MediaRenderers;
+
+ /* Currently selected media server as well as
+ * a lock. If you ever want to hold both the m_CurMediaRendererLock lock and the
+ * m_CurMediaServerLock lock, make sure you grab the server lock first.
+ */
+ PLT_DeviceDataReference m_CurMediaServer;
+ NPT_Mutex m_CurMediaServerLock;
+
+ /* Currently selected media renderer as well as
+ * a lock. If you ever want to hold both the m_CurMediaRendererLock lock and the
+ * m_CurMediaServerLock lock, make sure you grab the server lock first.
+ */
+ PLT_DeviceDataReference m_CurMediaRenderer;
+ NPT_Mutex m_CurMediaRendererLock;
+
+ /* Most recent results from a browse request. The results come back in a
+ * callback instead of being returned to the calling function, so this
+ * variable is necessary in order to give the results back to the calling
+ * function.
+ */
+ PLT_MediaObjectListReference m_MostRecentBrowseResults;
+
+ /* When browsing through the tree on a media server, this is the stack
+ * symbolizing the current position in the tree. The contents of the
+ * stack are the object ID's of the nodes. Note that the object id: "0" should
+ * always be at the bottom of the stack.
+ */
+ NPT_Stack<NPT_String> m_CurBrowseDirectoryStack;
+
+ /* Semaphore on which to block when waiting for a response from over
+ * the network
+ */
+ NPT_SharedVariable m_CallbackResponseSemaphore;
+
+ /* Task Manager managing download tasks */
+ PLT_TaskManager m_DownloadTaskManager;
+};
+
+#endif /* _MICRO_MEDIA_CONTROLLER_H_ */
+
diff --git a/lib/libUPnP/Platinum/Source/Apps/MicroMediaController/main.cpp b/lib/libUPnP/Platinum/Source/Apps/MicroMediaController/main.cpp
new file mode 100644
index 0000000..4813db0
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MicroMediaController/main.cpp
@@ -0,0 +1,136 @@
+/*****************************************************************
+|
+| Platinum - main
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMicroMediaController.h"
+#include "PltFileMediaServer.h"
+#include "PltMediaRenderer.h"
+#include "PltXbox360.h"
+#include "PltVersion.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+//#define HAS_RENDERER 1
+//#define HAS_SERVER 1
+//#define SIMULATE_XBOX_360 1
+//#define SIMULATE_PS3 1
+//#define BROADCAST_EXTRA 1
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int main(void)
+{
+ // setup Neptune logging
+ NPT_LogManager::GetDefault().Configure("plist:.level=INFO;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=24");
+
+ // Create upnp engine
+ PLT_UPnP upnp;
+
+ // Create control point
+ PLT_CtrlPointReference ctrlPoint(new PLT_CtrlPoint());
+
+ // Create controller
+ PLT_MicroMediaController controller(ctrlPoint);
+
+#ifdef HAS_SERVER
+ // create device
+ PLT_DeviceHostReference server(
+ new PLT_FileMediaServer("/Users/sylvain/Documents/AudioFileTests",
+ "Platinum UPnP Media Server"));
+
+ server->m_ModelDescription = "Platinum File Media Server";
+ server->m_ModelURL = "http://www.plutinosoft.com/";
+ server->m_ModelNumber = "1.0";
+ server->m_ModelName = "Platinum File Media Server";
+ server->m_Manufacturer = "Plutinosoft";
+ server->m_ManufacturerURL = "http://www.plutinosoft.com/";
+
+ // add device
+ upnp.AddDevice(server);
+
+ // remove device uuid from ctrlpoint
+ ctrlPoint->IgnoreUUID(server->GetUUID());
+#endif
+
+ // add control point to upnp engine and start it
+ upnp.AddCtrlPoint(ctrlPoint);
+ upnp.Start();
+
+#ifdef BROADCAST_EXTRA
+ // tell control point to perform extra broadcast discover every 6 secs
+ // in case our device doesn't support multicast
+ ctrlPoint->Discover(NPT_HttpUrl("255.255.255.255", 1900, "*"), "upnp:rootdevice", 1, 6000);
+ ctrlPoint->Discover(NPT_HttpUrl("239.255.255.250", 1900, "*"), "upnp:rootdevice", 1, 6000);
+#endif
+
+#ifdef SIMULATE_XBOX_360
+ // override default headers
+ PLT_Constants::GetInstance().SetDefaultUserAgent("Xbox/2.0.8955.0 UPnP/1.0 Xbox/2.0.8955.0");
+// NPT_HttpServer::m_ServerHeader = "Xbox/2.0.8955.0 UPnP/1.0 Xbox/2.0.8955.0";
+
+ // create device
+ PLT_DeviceHostReference xbox(new PLT_Xbox360("30848576-1775-2000-0000-00125a8fefad"));
+ xbox->SetByeByeFirst(false);
+ xbox->m_SerialNumber = "308485761776";
+
+ // add device
+ upnp.AddDevice(xbox);
+ ctrlPoint->IgnoreUUID(xbox->GetUUID());
+
+ // xbox issues a search for the content directory service
+ // 10 secs after announcing itself to make sure
+ // it got detected and inspected first
+
+ ctrlPoint->Search(
+ NPT_HttpUrl("239.255.255.250", 1900, "*"),
+ "urn:schemas-microsoft-com:service:MSContentDirectory:1", 2, NPT_TimeInterval(10.), NPT_TimeInterval(10.));
+ ctrlPoint->Search(
+ NPT_HttpUrl("239.255.255.250", 1900, "*"),
+ "urn:schemas-upnp-org:service:ContentDirectory:1", 2, NPT_TimeInterval(10.), NPT_TimeInterval(10.));
+
+#endif
+
+ // start to process commands
+ controller.ProcessCommandLoop();
+
+ // stop everything
+ upnp.Stop();
+
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/AppDelegate.h b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/AppDelegate.h
new file mode 100644
index 0000000..4c061b4
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/AppDelegate.h
@@ -0,0 +1,17 @@
+//
+// AppDelegate.h
+// MobileMediaServer
+//
+// Created by Sylvain Rebaud on 3/10/15.
+//
+//
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+
+@end
+
diff --git a/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/AppDelegate.m b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/AppDelegate.m
new file mode 100644
index 0000000..49e7db5
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/AppDelegate.m
@@ -0,0 +1,45 @@
+//
+// AppDelegate.m
+// MobileMediaServer
+//
+// Created by Sylvain Rebaud on 3/10/15.
+//
+//
+
+#import "AppDelegate.h"
+
+@interface AppDelegate ()
+
+@end
+
+@implementation AppDelegate
+
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ // Override point for customization after application launch.
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application {
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application {
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application {
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application {
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application {
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+}
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/LaunchScreen.xib b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/LaunchScreen.xib
new file mode 100644
index 0000000..92aedf8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/LaunchScreen.xib
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6751" systemVersion="14D127a" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6736"/>
+ <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="iN0-l3-epB">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
+ <rect key="frame" x="20" y="439" width="441" height="21"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="MobileMediaServer" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
+ <rect key="frame" x="20" y="140" width="441" height="43"/>
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
+ <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
+ <constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
+ <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
+ <constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
+ <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
+ </constraints>
+ <nil key="simulatedStatusBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <point key="canvasLocation" x="548" y="455"/>
+ </view>
+ </objects>
+</document>
diff --git a/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/Main.storyboard b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/Main.storyboard
new file mode 100644
index 0000000..f56d2f3
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/Main.storyboard
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="tne-QT-ifu">
+ <objects>
+ <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController">
+ <layoutGuides>
+ <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
+ <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
+ </layoutGuides>
+ <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
+ <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ </view>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+ </objects>
+ </scene>
+ </scenes>
+</document>
diff --git a/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/ViewController.h b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/ViewController.h
new file mode 100644
index 0000000..9f253ab
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/ViewController.h
@@ -0,0 +1,14 @@
+//
+// ViewController.h
+// MobileMediaServer
+//
+// Created by Sylvain Rebaud on 3/10/15.
+//
+//
+
+#import <UIKit/UIKit.h>
+
+@interface ViewController : UIViewController
+
+@end
+
diff --git a/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/ViewController.mm b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/ViewController.mm
new file mode 100644
index 0000000..33d715c
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/ViewController.mm
@@ -0,0 +1,70 @@
+//
+// ViewController.m
+// MobileMediaServer
+//
+// Created by Sylvain Rebaud on 3/10/15.
+//
+//
+
+#import "ViewController.h"
+#import <Neptune/Neptune.h>
+#import <Platinum/PltUPnPObject.h>
+#import <Platinum/PltMediaServerObject.h>
+
+@interface ViewController () <PLT_MediaServerDelegateObject>
+
+@property (nonatomic) PLT_UPnPObject* upnp;
+
+@end
+
+@implementation ViewController
+
++ (void)initialize {
+ NPT_LogManager::GetDefault().Configure("plist:.level=INFO;.handlers=ConsoleHandler;.ConsoleHandler.outputs=1;.ConsoleHandler.filter=61");
+}
+
+- (void)awakeFromNib {
+ self.upnp = [[PLT_UPnPObject alloc] init];
+
+ // create server and add ourselves as the delegate
+ PLT_MediaServerObject* server = [[PLT_MediaServerObject alloc] init];
+ server.delegate = self;
+
+ [self.upnp addDevice:server];
+}
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ // Do any additional setup after loading the view, typically from a nib.
+ [self.upnp start];
+}
+
+- (void)didReceiveMemoryWarning {
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+#pragma mark - PLT_MediaServerDelegateObject
+
+- (NPT_Result)onBrowseMetadata:(PLT_MediaServerBrowseCapsule*)info
+{
+ return NPT_FAILURE;
+}
+
+- (NPT_Result)onBrowseDirectChildren:(PLT_MediaServerBrowseCapsule*)info
+{
+ return NPT_FAILURE;
+}
+
+- (NPT_Result)onSearchContainer:(PLT_MediaServerSearchCapsule*)info
+{
+ return NPT_FAILURE;
+}
+
+- (NPT_Result)onFileRequest:(PLT_MediaServerFileRequestCapsule*)info
+{
+ return NPT_FAILURE;
+}
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/main.m b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/main.m
new file mode 100644
index 0000000..31847c9
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Apps/MobileMediaServer/main.m
@@ -0,0 +1,16 @@
+//
+// main.m
+// MobileMediaServer
+//
+// Created by Sylvain Rebaud on 3/10/15.
+//
+//
+
+#import <UIKit/UIKit.h>
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+ @autoreleasepool {
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltAction.cpp b/lib/libUPnP/Platinum/Source/Core/PltAction.cpp
new file mode 100644
index 0000000..78ff4b2
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltAction.cpp
@@ -0,0 +1,505 @@
+/*****************************************************************
+|
+| Platinum - Service Action
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltAction.h"
+#include "PltService.h"
+#include "PltUtilities.h"
+
+#define REMOVE_WMP_DATATYPE_EXTENSION
+
+NPT_SET_LOCAL_LOGGER("platinum.core.action")
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::PLT_ActionDesc
++---------------------------------------------------------------------*/
+PLT_ActionDesc::PLT_ActionDesc(const char* name, PLT_Service* service) :
+ m_Name(name),
+ m_Service(service)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::~PLT_ActionDesc
++---------------------------------------------------------------------*/
+PLT_ActionDesc::~PLT_ActionDesc()
+{
+ m_ArgumentDescs.Apply(NPT_ObjectDeleter<PLT_ArgumentDesc>());
+}
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::GetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ActionDesc::GetSCPDXML(NPT_XmlElementNode* node)
+{
+ NPT_XmlElementNode* action = new NPT_XmlElementNode("action");
+ NPT_CHECK_SEVERE(node->AddChild(action));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(action, "name", m_Name));
+
+ NPT_XmlElementNode* argumentList = new NPT_XmlElementNode("argumentList");
+ NPT_CHECK_SEVERE(action->AddChild(argumentList));
+
+ // no arguments is ok
+ if (!m_ArgumentDescs.GetItemCount()) return NPT_SUCCESS;
+
+ return m_ArgumentDescs.ApplyUntil(
+ PLT_GetSCPDXMLIterator<PLT_ArgumentDesc>(argumentList),
+ NPT_UntilResultNotEquals(NPT_SUCCESS));
+}
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::GetService
++---------------------------------------------------------------------*/
+PLT_Service*
+PLT_ActionDesc::GetService()
+{
+ return m_Service;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::GetArgumentDesc
++---------------------------------------------------------------------*/
+PLT_ArgumentDesc*
+PLT_ActionDesc::GetArgumentDesc(const char* name)
+{
+ PLT_ArgumentDesc* arg_desc = NULL;
+ NPT_ContainerFind(m_ArgumentDescs, PLT_ArgumentDescNameFinder(name), arg_desc);
+ return arg_desc;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::PLT_Action
++---------------------------------------------------------------------*/
+PLT_Action::PLT_Action(PLT_ActionDesc& action_desc) :
+ m_ActionDesc(action_desc),
+ m_ErrorCode(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::PLT_Action
++---------------------------------------------------------------------*/
+PLT_Action::PLT_Action(PLT_ActionDesc& action_desc,
+ PLT_DeviceDataReference& root_device) :
+ m_ActionDesc(action_desc),
+ m_ErrorCode(0),
+ m_RootDevice(root_device)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::~PLT_Action
++---------------------------------------------------------------------*/
+PLT_Action::~PLT_Action()
+{
+ m_Arguments.Apply(NPT_ObjectDeleter<PLT_Argument>());
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::GetArgumentValue(const char* name, NPT_String& value)
+{
+ PLT_Argument* arg = GetArgument(name);
+ if (arg == NULL) {
+ return NPT_FAILURE;
+ }
+ value = arg->GetValue();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::GetArgumentValue(const char* name, NPT_UInt32& value)
+{
+ NPT_String tmp_value;
+ NPT_CHECK_WARNING(GetArgumentValue(name, tmp_value));
+ return tmp_value.ToInteger(value);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::GetArgumentValue(const char* name, NPT_Int32& value)
+{
+ NPT_String tmp_value;
+ NPT_CHECK_WARNING(GetArgumentValue(name, tmp_value));
+ return tmp_value.ToInteger(value);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::GetArgumentValue(const char* name, bool& value)
+{
+ NPT_String tmp_value;
+ NPT_CHECK_WARNING(GetArgumentValue(name, tmp_value));
+ if (tmp_value == "1" ||
+ !tmp_value.Compare("TRUE", true) ||
+ !tmp_value.Compare("YES", true)) {
+ value = true;
+ } else if (tmp_value == "0" ||
+ !tmp_value.Compare("FALSE", true) ||
+ !tmp_value.Compare("NO", true)) {
+ value = false;
+ } else {
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetArgument
++---------------------------------------------------------------------*/
+PLT_Argument*
+PLT_Action::GetArgument(const char* name)
+{
+ PLT_Argument* argument = NULL;
+ NPT_ContainerFind(m_Arguments, PLT_ArgumentNameFinder(name), argument);
+ return argument;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetArgumentValue(const char* name,
+ const char* value)
+{
+ // look for this argument in our argument list
+ // and replace the value if we found it
+ PLT_Arguments::Iterator iter = NULL;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Arguments, PLT_ArgumentNameFinder(name), iter))) {
+ NPT_Result res = (*iter)->SetValue(value);
+
+ // remove argument from list if failed
+ // so that when we verify arguments later,
+ // we don't use a previously set value
+ if (NPT_FAILED(res)) m_Arguments.Erase(iter);
+ return res;
+ }
+
+ // since we didn't find it, create a clone
+ PLT_Argument* arg;
+ NPT_CHECK_SEVERE(PLT_Argument::CreateArgument(m_ActionDesc, name, value, arg));
+
+ // insert it at the right position
+ for (NPT_Cardinal i=0;
+ i<m_Arguments.GetItemCount();
+ i++) {
+ iter = m_Arguments.GetItem(i);
+ if ((*iter)->GetPosition() > arg->GetPosition()) {
+ return m_Arguments.Insert(iter, arg);
+ }
+ }
+
+ return m_Arguments.Add(arg);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::VerifyArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::VerifyArgumentValue(const char* name, const char* value)
+{
+ NPT_String str;
+ NPT_CHECK_SEVERE(GetArgumentValue(name, str));
+
+ return str.Compare(value, true)?NPT_FAILURE:NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::VerifyArguments
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::VerifyArguments(bool input)
+{
+ NPT_Cardinal count = 0;
+
+ // Check we have all the required parameters (in or out)
+ for(unsigned int i=0; i<m_ActionDesc.GetArgumentDescs().GetItemCount(); i++) {
+ PLT_ArgumentDesc* arg_desc = m_ActionDesc.GetArgumentDescs()[i];
+
+ // only input arguments are needed
+ if (arg_desc->GetDirection().Compare(input?"in":"out", true))
+ continue;
+
+ // look for this argument in the list we received
+ PLT_Argument* arg = NULL;
+ if (NPT_FAILED(NPT_ContainerFind(m_Arguments, PLT_ArgumentNameFinder(arg_desc->GetName()), arg))) {
+ NPT_LOG_WARNING_2("Argument %s for action %s not found",
+ (const char*) arg_desc->GetName(),
+ (const char*) m_ActionDesc.GetName());
+ return NPT_FAILURE;
+ }
+ ++count;
+ }
+
+ SetError(0, "");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetArgumentOutFromStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetArgumentOutFromStateVariable(PLT_ArgumentDesc* arg_desc)
+{
+ // only output arguments can use a state variable
+ if (arg_desc->GetDirection().Compare("out", true)) {
+ return NPT_FAILURE;
+ }
+
+ PLT_StateVariable* variable = arg_desc->GetRelatedStateVariable();
+ if (!variable) return NPT_FAILURE;
+
+ // assign the value to an argument
+ NPT_CHECK_SEVERE(SetArgumentValue(arg_desc->GetName(), variable->GetValue()));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetArgumentOutFromStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetArgumentOutFromStateVariable(const char* name)
+{
+ // look for this argument in the action list of arguments
+ PLT_ArgumentDesc* arg_desc = NULL;
+ NPT_CHECK_SEVERE(NPT_ContainerFind(m_ActionDesc.GetArgumentDescs(),
+ PLT_ArgumentDescNameFinder(name), arg_desc));
+
+ return SetArgumentOutFromStateVariable(arg_desc);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetArgumentsOutFromStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetArgumentsOutFromStateVariable()
+{
+ // go through the list of the action output arguments
+ for(unsigned int i=0; i<m_ActionDesc.GetArgumentDescs().GetItemCount(); i++) {
+ PLT_ArgumentDesc* arg_desc = m_ActionDesc.GetArgumentDescs()[i];
+
+ // only output arguments are needed
+ if (arg_desc->GetDirection().Compare("out", true))
+ continue;
+
+ NPT_CHECK_SEVERE(SetArgumentOutFromStateVariable(arg_desc));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetError
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetError(unsigned int code, const char* description)
+{
+ m_ErrorCode = code;
+ m_ErrorDescription = description;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetError
++---------------------------------------------------------------------*/
+const char*
+PLT_Action::GetError(unsigned int* code /* = NULL */)
+{
+ if (code) *code = m_ErrorCode;
+ return m_ErrorDescription;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetErrorCode
++---------------------------------------------------------------------*/
+unsigned int
+PLT_Action::GetErrorCode()
+{
+ return m_ErrorCode;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::FormatSoapRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::FormatSoapRequest(NPT_OutputStream& stream)
+{
+ NPT_String str;
+ NPT_Result res;
+ NPT_XmlElementNode* body = NULL;
+ NPT_XmlElementNode* request = NULL;
+ NPT_XmlElementNode* envelope = new NPT_XmlElementNode("s", "Envelope");
+
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetNamespaceUri("s", "http://schemas.xmlsoap.org/soap/envelope/"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetAttribute("s", "encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/"), cleanup);
+
+ body = new NPT_XmlElementNode("s", "Body");
+ NPT_CHECK_LABEL_SEVERE(res = envelope->AddChild(body), cleanup);
+
+ request = new NPT_XmlElementNode("u", m_ActionDesc.GetName());
+ NPT_CHECK_LABEL_SEVERE(res = request->SetNamespaceUri("u", m_ActionDesc.GetService()->GetServiceType()), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = body->AddChild(request), cleanup);
+
+ for(unsigned int i=0; i<m_Arguments.GetItemCount(); i++) {
+ PLT_Argument* argument = m_Arguments[i];
+ if (argument->GetDesc().GetDirection().Compare("in", true) == 0) {
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(
+ request,
+ argument->GetDesc().GetName(),
+ argument->GetValue()), cleanup);
+ }
+ }
+
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::Serialize(*envelope, str), cleanup);
+ delete envelope;
+
+ return stream.Write((const char*)str, str.GetLength());
+
+cleanup:
+ delete envelope;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::FormatSoapResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::FormatSoapResponse(NPT_OutputStream& stream)
+{
+ if (m_ErrorCode) {
+ return FormatSoapError(m_ErrorCode, m_ErrorDescription, stream);
+ }
+
+ NPT_String str;
+ NPT_Result res;
+ NPT_XmlElementNode* body = NULL;
+ NPT_XmlElementNode* response = NULL;
+ NPT_XmlElementNode* node = NULL;
+ NPT_XmlElementNode* envelope = new NPT_XmlElementNode("s", "Envelope");
+
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetNamespaceUri("s", "http://schemas.xmlsoap.org/soap/envelope/"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetAttribute("s", "encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/"), cleanup);
+
+ body = new NPT_XmlElementNode("s", "Body");
+ NPT_CHECK_LABEL_SEVERE(res = envelope->AddChild(body), cleanup);
+
+ response = new NPT_XmlElementNode("u", m_ActionDesc.GetName() + "Response");
+ NPT_CHECK_LABEL_SEVERE(response->SetNamespaceUri("u", m_ActionDesc.GetService()->GetServiceType()), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = body->AddChild(response), cleanup);
+
+ for(unsigned int i=0; i<m_Arguments.GetItemCount(); i++) {
+ PLT_Argument* argument = m_Arguments[i];
+ if (argument->GetDesc().GetDirection().Compare("out", true) == 0) {
+ node = new NPT_XmlElementNode(argument->GetDesc().GetName());
+ NPT_CHECK_LABEL_SEVERE(res = node->AddText(argument->GetValue()), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = response->AddChild(node), cleanup);
+
+#ifndef REMOVE_WMP_DATATYPE_EXTENSION
+ PLT_StateVariable* var = argument->GetDesc().GetRelatedStateVariable();
+ if (var) {
+ node->SetNamespaceUri("dt", "urn:schemas-microsoft-com:datatypes");
+ node->SetAttribute("dt", "dt", var->GetDataType());
+ }
+#endif
+ }
+ }
+
+ // this will xmlescape any values that contain xml characters
+ NPT_CHECK_LABEL_SEVERE(PLT_XmlHelper::Serialize(*envelope, str), cleanup);
+ delete envelope;
+
+ return stream.Write((const char*)str, str.GetLength());
+
+cleanup:
+ delete envelope;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::FormatSoapError
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::FormatSoapError(unsigned int code, NPT_String desc, NPT_OutputStream& stream)
+{
+ NPT_String str;
+ NPT_Result res;
+ NPT_XmlElementNode* body = NULL;
+ NPT_XmlElementNode* fault = NULL;
+ NPT_XmlElementNode* detail = NULL;
+ NPT_XmlElementNode* UPnPError = NULL;
+ NPT_XmlElementNode* envelope = new NPT_XmlElementNode("s", "Envelope");
+
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetNamespaceUri("s", "http://schemas.xmlsoap.org/soap/envelope/"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetAttribute("s", "encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/"), cleanup);
+
+ body = new NPT_XmlElementNode("s", "Body");
+ NPT_CHECK_LABEL_SEVERE(res = envelope->AddChild(body), cleanup);
+
+ fault = new NPT_XmlElementNode("s", "Fault");
+ NPT_CHECK_LABEL_SEVERE(res = body->AddChild(fault), cleanup);
+
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(fault, "faultcode", "s:Client"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(fault, "faultstring", "UPnPError"), cleanup);
+
+ detail = new NPT_XmlElementNode("detail");
+ NPT_CHECK_LABEL_SEVERE(res = fault->AddChild(detail), cleanup);
+
+ UPnPError = new NPT_XmlElementNode("UPnPError");
+ NPT_CHECK_LABEL_SEVERE(res = UPnPError->SetNamespaceUri("", "urn:schemas-upnp-org:control-1-0"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = detail->AddChild(UPnPError), cleanup);
+
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(UPnPError, "errorCode", NPT_String::FromInteger(code)), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(UPnPError, "errorDescription", desc), cleanup);
+
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::Serialize(*envelope, str), cleanup);
+ delete envelope;
+
+ return stream.Write((const char*)str, str.GetLength());
+
+cleanup:
+ delete envelope;
+ return res;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltAction.h b/lib/libUPnP/Platinum/Source/Core/PltAction.h
new file mode 100644
index 0000000..f457f3d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltAction.h
@@ -0,0 +1,321 @@
+/*****************************************************************
+|
+| Platinum - Service Action
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP Service Action
+ */
+
+#ifndef _PLT_ACTION_H_
+#define _PLT_ACTION_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltArgument.h"
+#include "PltDeviceData.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Service;
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc
++---------------------------------------------------------------------*/
+/**
+ The PLT_ActionDesc class provides information about a UPnP Service given action.
+ This description has a name, a set of arguments and is associated to a service.
+ */
+class PLT_ActionDesc
+{
+public:
+ /**
+ Constructor
+ @param name the action name
+ @param service the UPnP service the action is associated with
+ */
+ PLT_ActionDesc(const char* name, PLT_Service* service);
+ ~PLT_ActionDesc();
+
+ /**
+ Return an array of arguments
+ @return array of arguments
+ */
+ NPT_Array<PLT_ArgumentDesc*>& GetArgumentDescs() {
+ return m_ArgumentDescs;
+ }
+
+ /**
+ Return the action name.
+ @return action name.
+ */
+ const NPT_String& GetName() const { return m_Name;}
+
+ /**
+ Look for an argument given a name.
+ @param name argument name
+ @return PLT_ArgumentDesc pointer
+ */
+ PLT_ArgumentDesc* GetArgumentDesc(const char* name);
+
+ /**
+ Serialize action information to xml into an existing xml tree
+ @param node the xml Element to serialize action information
+ */
+ NPT_Result GetSCPDXML(NPT_XmlElementNode* node);
+
+ /**
+ Return the service the action is associated with
+ */
+ PLT_Service* GetService();
+
+protected:
+ //members
+ NPT_String m_Name;
+ PLT_Service* m_Service;
+ NPT_Array<PLT_ArgumentDesc*> m_ArgumentDescs;
+};
+
+/*----------------------------------------------------------------------
+| PLT_Action
++---------------------------------------------------------------------*/
+/**
+ The PLT_Action class provides a mechanism to call or verify the validity of a
+ specific UPNP service action.
+ Given a service, a UPnP Control Point would use this class to serialize a soap
+ request. On the other side, a UPnP Device would use this class to verify
+ a soap request and the validity of the action arguments.
+ */
+class PLT_Action
+{
+public:
+ /**
+ Constructor
+ @param action_desc the action description
+ If you intend to send an action, you need to use the second constructor
+ and pass the root device of the device you wish to control.
+ */
+ PLT_Action(PLT_ActionDesc& action_desc);
+
+ /**
+ Constructor
+ @param action_desc the action description
+ @param root_device a reference to the root device of the service the action
+ is associated with. This insures that the device won't be deleted if it goes
+ away while we're waiting for a response for this action. This is important because
+ we only keep a reference to the PLT_ActionDesc which is own by the service operated
+ by the device (or embedded device).
+ */
+ PLT_Action(PLT_ActionDesc& action_desc, PLT_DeviceDataReference& root_device);
+ ~PLT_Action();
+
+ /**
+ Return the action description
+ @return the action description
+ */
+ PLT_ActionDesc& GetActionDesc() { return m_ActionDesc; }
+
+ /**
+ Retrieve the string value of an argument given an argument name.
+ @param name the argument name
+ @param value the string value to retrieve
+ @return error if the argument is not found or if the type does not correspond.
+ */
+ NPT_Result GetArgumentValue(const char* name, NPT_String& value);
+
+ /**
+ Retrieve the value of an argument given an argument name.
+ @param name the argument name
+ @param value the unsigned int value to retrieve
+ @return error if the argument is not found or if the type does not correspond.
+ */
+ NPT_Result GetArgumentValue(const char* name, NPT_UInt32& value);
+
+ /**
+ Retrieve the value of an argument given an argument name.
+ @param name the argument name
+ @param value the int value to retrieve
+ @return error if the argument is not found or if the type does not correspond.
+ */
+ NPT_Result GetArgumentValue(const char* name, NPT_Int32& value);
+
+ /**
+ Retrieve the value of an argument given an argument name.
+ @param name the argument name
+ @param value the bool value to retrieve
+ @return error if the argument is not found or if the type does not correspond.
+ */
+ NPT_Result GetArgumentValue(const char* name, bool& value);
+
+ /**
+ Verify a value is valid for a given argument.
+ @param name the argument name
+ @param value the value to verify
+ */
+ NPT_Result VerifyArgumentValue(const char* name, const char* value);
+
+ /**
+ Verify that all required arguments are set.
+ @param input boolean indicating whether input or output parameters
+ should be verified
+ */
+ NPT_Result VerifyArguments(bool input);
+
+ /**
+ Set the output argument value from the associated current state variable value.
+ @param name the state variable name
+ */
+ NPT_Result SetArgumentOutFromStateVariable(const char* name);
+
+ /**
+ Set all the output argument values associated with state variables.
+ */
+ NPT_Result SetArgumentsOutFromStateVariable();
+
+ /**
+ Set an argument value
+ @param name the argument name
+ @param value the argument value
+ */
+ NPT_Result SetArgumentValue(const char* name, const char* value);
+
+ /**
+ Set the error code and description in case of failure.
+ @param code the code for the error
+ @param description a short description
+ */
+ NPT_Result SetError(unsigned int code, const char* description);
+
+ /**
+ Return the error description and code for the failed action.
+ @param code optional pointer to receive the code
+ @return the error short description
+ */
+ const char* GetError(unsigned int* code = NULL);
+
+ /**
+ Return the error code for the failed action.
+ @return the error code.
+ */
+ unsigned int GetErrorCode();
+
+ /**
+ Called by a control point when serializing an action.
+ @param stream the stream to serialize the action to
+ */
+ NPT_Result FormatSoapRequest(NPT_OutputStream& stream);
+
+ /**
+ Called by a device when serializing a response to an action.
+ @param stream the stream to serialize the action to
+ */
+ NPT_Result FormatSoapResponse(NPT_OutputStream& stream);
+
+ /**
+ Helper method for a device to serialize an action invocation error.
+ @param code optional pointer to receive the code
+ @param desc the error short description
+ @param stream the stream to serialize to
+ */
+ static NPT_Result FormatSoapError(unsigned int code,
+ NPT_String desc,
+ NPT_OutputStream& stream);
+
+private:
+ // methods
+ NPT_Result SetArgumentOutFromStateVariable(PLT_ArgumentDesc* arg_desc);
+ PLT_Argument* GetArgument(const char* name);
+
+protected:
+ // members
+ PLT_ActionDesc& m_ActionDesc;
+ PLT_Arguments m_Arguments;
+ unsigned int m_ErrorCode;
+ NPT_String m_ErrorDescription;
+
+ // keep reference of service root device to prevent it
+ // from being released during action lifetime
+ PLT_DeviceDataReference m_RootDevice;
+};
+
+typedef NPT_Reference<PLT_Action> PLT_ActionReference;
+
+/*----------------------------------------------------------------------
+| PLT_GetSCPDXMLIterator
++---------------------------------------------------------------------*/
+/**
+ The PLT_GetSCPDXMLIterator class provides a recursive way to serialize
+ an SCPD into an xml tree.
+ */
+template <class T>
+class PLT_GetSCPDXMLIterator
+{
+public:
+ PLT_GetSCPDXMLIterator<T>(NPT_XmlElementNode* node) :
+ m_Node(node) {}
+
+ NPT_Result operator()(T* const & data) const {
+ return data->GetSCPDXML(m_Node);
+ }
+
+private:
+ NPT_XmlElementNode* m_Node;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ActionDescNameFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_ActionDescNameFinder class provides a mechanism to find a PLT_ActionDesc
+ given an action name.
+ */
+class PLT_ActionDescNameFinder
+{
+public:
+ // methods
+ PLT_ActionDescNameFinder(const char* name) :
+ m_Name(name) {}
+ virtual ~PLT_ActionDescNameFinder() {}
+
+ bool operator()(const PLT_ActionDesc* const & action_desc) const {
+ return action_desc->GetName().Compare(m_Name, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Name;
+};
+
+#endif /* _PLT_ACTION_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltArgument.cpp b/lib/libUPnP/Platinum/Source/Core/PltArgument.cpp
new file mode 100644
index 0000000..be35821
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltArgument.cpp
@@ -0,0 +1,156 @@
+/*****************************************************************
+|
+| Platinum - Action Argument
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltArgument.h"
+#include "PltStateVariable.h"
+#include "PltUtilities.h"
+#include "PltAction.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.argument")
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentDesc::PLT_ArgumentDesc
++---------------------------------------------------------------------*/
+PLT_ArgumentDesc::PLT_ArgumentDesc(const char* name,
+ NPT_Ordinal position,
+ const char* direction,
+ PLT_StateVariable* variable,
+ bool has_ret) :
+ m_Name(name),
+ m_Position(position),
+ m_Direction(direction),
+ m_RelatedStateVariable(variable),
+ m_HasReturnValue(has_ret)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentDesc::GetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ArgumentDesc::GetSCPDXML(NPT_XmlElementNode* node)
+{
+ NPT_XmlElementNode* argument = new NPT_XmlElementNode("argument");
+ NPT_CHECK_SEVERE(node->AddChild(argument));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(argument, "name", m_Name));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(argument, "direction", m_Direction));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(argument, "relatedStateVariable", m_RelatedStateVariable->GetName()));
+
+ if (m_HasReturnValue) {
+ NPT_CHECK_SEVERE(argument->AddChild(new NPT_XmlElementNode("retval")));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::CreateArgument
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Argument::CreateArgument(PLT_ActionDesc& action_desc,
+ const char* name,
+ const char* value,
+ PLT_Argument*& arg)
+{
+ // reset output params first
+ arg = NULL;
+
+ PLT_ArgumentDesc* arg_desc = action_desc.GetArgumentDesc(name);
+ if (!arg_desc) {
+ NPT_LOG_WARNING_2("Invalid argument %s for action %s",
+ name,
+ (const char*)action_desc.GetName());
+ return NPT_ERROR_NO_SUCH_NAME;
+ }
+
+ NPT_Result res;
+ PLT_Argument* new_arg = new PLT_Argument(*arg_desc);
+ if (NPT_FAILED(res = new_arg->SetValue(value))) {
+ delete new_arg;
+
+ NPT_LOG_WARNING_3("Invalid value of %s for argument %s of action %s",
+ value,
+ name,
+ (const char*)action_desc.GetName());
+ return res;
+ }
+
+ arg = new_arg;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::PLT_Argument
++---------------------------------------------------------------------*/
+PLT_Argument::PLT_Argument(PLT_ArgumentDesc& arg_desc) :
+ m_ArgDesc(arg_desc)
+{
+
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::SetValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Argument::SetValue(const char* value)
+{
+ NPT_CHECK_SEVERE(ValidateValue(value));
+
+ m_Value = value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::GetValue
++---------------------------------------------------------------------*/
+const NPT_String&
+PLT_Argument::GetValue()
+{
+ return m_Value;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::ValidateValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Argument::ValidateValue(const char* value)
+{
+ if (m_ArgDesc.GetRelatedStateVariable()) {
+ return m_ArgDesc.GetRelatedStateVariable()->ValidateValue(value);
+ }
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltArgument.h b/lib/libUPnP/Platinum/Source/Core/PltArgument.h
new file mode 100644
index 0000000..4730e28
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltArgument.h
@@ -0,0 +1,168 @@
+/*****************************************************************
+|
+| Platinum - Action Argument
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP Service Action Argument
+ */
+
+#ifndef _PLT_ARGUMENT_H_
+#define _PLT_ARGUMENT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_StateVariable;
+class PLT_Argument;
+class PLT_ActionDesc;
+typedef NPT_Array<PLT_Argument*> PLT_Arguments;
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentDesc
++---------------------------------------------------------------------*/
+/**
+ The PLT_ArgumentDesc class provides information about a given argument of a
+ UPnP Service given action.
+ It has a name, a position, a direction (in/out), a PLT_StateVariable state
+ variable association and whether it is the return value of the action or not.
+ */
+class PLT_ArgumentDesc
+{
+public:
+ PLT_ArgumentDesc(const char* name,
+ NPT_Ordinal position,
+ const char* direction = "in",
+ PLT_StateVariable* variable = NULL,
+ bool has_ret = false);
+
+ // accessor methods
+ NPT_Result GetSCPDXML(NPT_XmlElementNode* node);
+ const NPT_String& GetName() const { return m_Name; }
+ const NPT_String& GetDirection() const { return m_Direction; }
+ NPT_Ordinal GetPosition() { return m_Position; }
+ PLT_StateVariable* GetRelatedStateVariable() { return m_RelatedStateVariable; }
+ bool HasReturnValue() { return m_HasReturnValue; }
+
+protected:
+ NPT_String m_Name;
+ NPT_Ordinal m_Position;
+ NPT_String m_Direction;
+ PLT_StateVariable* m_RelatedStateVariable;
+ bool m_HasReturnValue;
+};
+
+/*----------------------------------------------------------------------
+| PLT_Argument
++---------------------------------------------------------------------*/
+/**
+ The PLT_Argument class provides a mechanism to set or verify the validity of a
+ specific UPNP service action argument.
+ Typically, only a PLT_Action uses this class. Since an argument can be
+ associated to a state variable, the argument is automatically updated when
+ the associated state variable is changed
+ */
+class PLT_Argument
+{
+public:
+ PLT_Argument(PLT_ArgumentDesc& arg_desc);
+
+ // class methods
+ static NPT_Result CreateArgument(PLT_ActionDesc& action_desc,
+ const char* arg_name,
+ const char* arg_value,
+ PLT_Argument*& arg);
+
+ // accessor methods
+ PLT_ArgumentDesc& GetDesc() { return m_ArgDesc; }
+ NPT_Ordinal GetPosition() { return m_ArgDesc.GetPosition(); }
+ NPT_Result SetValue(const char* value);
+ const NPT_String& GetValue();
+
+private:
+ NPT_Result ValidateValue(const char* value);
+
+protected:
+ PLT_ArgumentDesc& m_ArgDesc;
+ NPT_String m_Value;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentNameFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_ArgumentNameFinder class provides a mechanism to find a PLT_Argument given
+ an argument name.
+ */
+class PLT_ArgumentNameFinder
+{
+public:
+ // methods
+ PLT_ArgumentNameFinder(const char* name) : m_Name(name) {}
+
+ bool operator()(PLT_Argument* const & argument) const {
+ return argument->GetDesc().GetName().Compare(m_Name, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Name;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentDescNameFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_ArgumentDescNameFinder class provides a mechanism to find a PLT_ArgumentDesc given
+ an argument name.
+ */
+class PLT_ArgumentDescNameFinder
+{
+public:
+ // methods
+ PLT_ArgumentDescNameFinder(const char* name) : m_Name(name) {}
+
+ bool operator()(PLT_ArgumentDesc* const & arg_desc) const {
+ return arg_desc->GetName().Compare(m_Name, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Name;
+};
+
+#endif /* _PLT_ARGUMENT_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltConstants.cpp b/lib/libUPnP/Platinum/Source/Core/PltConstants.cpp
new file mode 100755
index 0000000..8da87d0
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltConstants.cpp
@@ -0,0 +1,62 @@
+/*****************************************************************
+|
+| Platinum - UPnP Constants
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltConstants.h"
+#include "PltHttp.h"
+
+static PLT_Constants Constants;
+
+/*----------------------------------------------------------------------
+| PLT_Constants::PLT_Constant
++---------------------------------------------------------------------*/
+PLT_Constants::PLT_Constants()
+{
+ SetDefaultUserAgent(PLT_HTTP_DEFAULT_USER_AGENT);
+ SetDefaultDeviceLease(NPT_TimeInterval(1800.));
+ SetDefaultSubscribeLease(NPT_TimeInterval(1800.));
+ SetAnnounceMulticastTimeToLive(2);
+ SetSearchMulticastTimeToLive(2);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Constants::GetInstance
++---------------------------------------------------------------------*/
+PLT_Constants&
+PLT_Constants::GetInstance()
+{
+ return Constants;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltConstants.h b/lib/libUPnP/Platinum/Source/Core/PltConstants.h
new file mode 100755
index 0000000..d674ea8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltConstants.h
@@ -0,0 +1,87 @@
+/*****************************************************************
+|
+| Platinum - UPnP Constants
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP Constants
+ */
+
+#ifndef _PLT_UPNP_CONSTANTS_H_
+#define _PLT_UPNP_CONSTANTS_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_Constants
++---------------------------------------------------------------------*/
+/**
+ The PLT_Constants class provides a way to globally set or get certain
+ UPnP constants.
+ */
+class PLT_Constants
+{
+public:
+ // class methods
+ static PLT_Constants& GetInstance();
+
+ PLT_Constants();
+ ~PLT_Constants() {};
+
+ void SetDefaultDeviceLease(NPT_TimeInterval lease) { m_DefaultDeviceLease = new NPT_TimeInterval(lease); }
+ NPT_Reference<NPT_TimeInterval> GetDefaultDeviceLease() { return m_DefaultDeviceLease; }
+
+ void SetDefaultSubscribeLease(NPT_TimeInterval lease) { m_DefaultSubscribeLease = new NPT_TimeInterval(lease); }
+ NPT_Reference<NPT_TimeInterval> GetDefaultSubscribeLease() { return m_DefaultSubscribeLease; }
+
+ void SetDefaultUserAgent(const char* agent) { m_DefaultUserAgent = new NPT_String(agent); }
+ NPT_Reference<NPT_String> GetDefaultUserAgent() { return m_DefaultUserAgent; }
+
+ void SetSearchMulticastTimeToLive(NPT_UInt32 ttl) { m_SearchMulticastTimeToLive = ttl; }
+ NPT_UInt32 GetSearchMulticastTimeToLive() { return m_SearchMulticastTimeToLive; }
+
+ void SetAnnounceMulticastTimeToLive(NPT_UInt32 ttl) { m_AnnounceMulticastTimeToLive = ttl; }
+ NPT_UInt32 GetAnnounceMulticastTimeToLive() { return m_AnnounceMulticastTimeToLive; }
+
+private:
+ // members
+ NPT_Reference<NPT_TimeInterval> m_DefaultDeviceLease;
+ NPT_Reference<NPT_TimeInterval> m_DefaultSubscribeLease;
+ NPT_Reference<NPT_String> m_DefaultUserAgent;
+ NPT_UInt32 m_SearchMulticastTimeToLive;
+ NPT_UInt32 m_AnnounceMulticastTimeToLive;
+};
+
+#endif /* _PLT_UPNP_CONSTANTS_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.cpp b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.cpp
new file mode 100644
index 0000000..7d476d1
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.cpp
@@ -0,0 +1,1875 @@
+/*****************************************************************
+|
+| Platinum - Control Point
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltCtrlPoint.h"
+#include "PltUPnP.h"
+#include "PltDeviceData.h"
+#include "PltUtilities.h"
+#include "PltCtrlPointTask.h"
+#include "PltSsdp.h"
+#include "PltHttpServer.h"
+#include "PltConstants.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.ctrlpoint")
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListenerOnDeviceAddedIterator class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointListenerOnDeviceAddedIterator
+{
+public:
+ PLT_CtrlPointListenerOnDeviceAddedIterator(PLT_DeviceDataReference& device) :
+ m_Device(device) {}
+
+ NPT_Result operator()(PLT_CtrlPointListener*& listener) const {
+ return listener->OnDeviceAdded(m_Device);
+ }
+
+private:
+ PLT_DeviceDataReference& m_Device;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListenerOnDeviceRemovedIterator class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointListenerOnDeviceRemovedIterator
+{
+public:
+ PLT_CtrlPointListenerOnDeviceRemovedIterator(PLT_DeviceDataReference& device) :
+ m_Device(device) {}
+
+ NPT_Result operator()(PLT_CtrlPointListener*& listener) const {
+ return listener->OnDeviceRemoved(m_Device);
+ }
+
+private:
+ PLT_DeviceDataReference& m_Device;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListenerOnActionResponseIterator class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointListenerOnActionResponseIterator
+{
+public:
+ PLT_CtrlPointListenerOnActionResponseIterator(NPT_Result res,
+ PLT_ActionReference& action,
+ void* userdata) :
+ m_Res(res), m_Action(action), m_Userdata(userdata) {}
+
+ NPT_Result operator()(PLT_CtrlPointListener*& listener) const {
+ return listener->OnActionResponse(m_Res, m_Action, m_Userdata);
+ }
+
+private:
+ NPT_Result m_Res;
+ PLT_ActionReference& m_Action;
+ void* m_Userdata;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListenerOnEventNotifyIterator class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointListenerOnEventNotifyIterator
+{
+public:
+ PLT_CtrlPointListenerOnEventNotifyIterator(PLT_Service* service,
+ NPT_List<PLT_StateVariable*>* vars) :
+ m_Service(service), m_Vars(vars) {}
+
+ NPT_Result operator()(PLT_CtrlPointListener*& listener) const {
+ return listener->OnEventNotify(m_Service, m_Vars);
+ }
+
+private:
+ PLT_Service* m_Service;
+ NPT_List<PLT_StateVariable*>* m_Vars;
+};
+
+/*----------------------------------------------------------------------
+| PLT_AddGetSCPDRequestIterator class
++---------------------------------------------------------------------*/
+class PLT_AddGetSCPDRequestIterator
+{
+public:
+ PLT_AddGetSCPDRequestIterator(PLT_CtrlPointGetSCPDsTask& task,
+ PLT_DeviceDataReference& device) :
+ m_Task(task), m_Device(device) {}
+
+ NPT_Result operator()(PLT_Service*& service) const {
+ // look for the host and port of the device
+ NPT_String scpd_url = service->GetSCPDURL(true);
+
+ NPT_LOG_FINER_3("Queueing SCPD request for service \"%s\" of device \"%s\" @ %s",
+ (const char*)service->GetServiceID(),
+ (const char*)service->GetDevice()->GetFriendlyName(),
+ (const char*)scpd_url);
+
+ // verify url before queuing just in case
+ NPT_HttpUrl url(scpd_url);
+ if (!url.IsValid()) {
+ NPT_LOG_SEVERE_3("Invalid SCPD url \"%s\" for service \"%s\" of device \"%s\"!",
+ (const char*)scpd_url,
+ (const char*)service->GetServiceID(),
+ (const char*)service->GetDevice()->GetFriendlyName());
+ return NPT_ERROR_INVALID_SYNTAX;
+ }
+
+ // Create request and attach service to it
+ PLT_CtrlPointGetSCPDRequest* request =
+ new PLT_CtrlPointGetSCPDRequest((PLT_DeviceDataReference&)m_Device, scpd_url, "GET", NPT_HTTP_PROTOCOL_1_1);
+ return m_Task.AddSCPDRequest(request);
+ }
+
+private:
+ PLT_CtrlPointGetSCPDsTask& m_Task;
+ PLT_DeviceDataReference m_Device;
+};
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberRemoverIterator class
++---------------------------------------------------------------------*/
+// Note: The PLT_CtrlPoint::m_Lock must be acquired prior to using any
+// function such as Apply on this iterator
+class PLT_EventSubscriberRemoverIterator
+{
+public:
+ PLT_EventSubscriberRemoverIterator(PLT_CtrlPoint* ctrl_point) :
+ m_CtrlPoint(ctrl_point) {}
+ ~PLT_EventSubscriberRemoverIterator() {}
+
+ NPT_Result operator()(PLT_Service*& service) const {
+ PLT_EventSubscriberReference sub;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_CtrlPoint->m_Subscribers,
+ PLT_EventSubscriberFinderByService(service), sub))) {
+ NPT_LOG_INFO_1("Removed subscriber \"%s\"", (const char*)sub->GetSID());
+ m_CtrlPoint->m_Subscribers.Remove(sub);
+ }
+
+ return NPT_SUCCESS;
+ }
+
+private:
+ PLT_CtrlPoint* m_CtrlPoint;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceReadyIterator class
++---------------------------------------------------------------------*/
+class PLT_ServiceReadyIterator
+{
+public:
+ PLT_ServiceReadyIterator() {}
+
+ NPT_Result operator()(PLT_Service*& service) const {
+ return service->IsValid()?NPT_SUCCESS:NPT_FAILURE;
+ }
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceReadyIterator class
++---------------------------------------------------------------------*/
+class PLT_DeviceReadyIterator
+{
+public:
+ PLT_DeviceReadyIterator() {}
+ NPT_Result operator()(PLT_DeviceDataReference& device) const {
+ NPT_Result res = device->m_Services.ApplyUntil(
+ PLT_ServiceReadyIterator(),
+ NPT_UntilResultNotEquals(NPT_SUCCESS));
+ if (NPT_FAILED(res)) return res;
+
+ res = device->m_EmbeddedDevices.ApplyUntil(
+ PLT_DeviceReadyIterator(),
+ NPT_UntilResultNotEquals(NPT_SUCCESS));
+ if (NPT_FAILED(res)) return res;
+
+ // a device must have at least one service or embedded device
+ // otherwise it's not ready
+ if (device->m_Services.GetItemCount() == 0 &&
+ device->m_EmbeddedDevices.GetItemCount() == 0) {
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+ }
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::PLT_CtrlPoint
++---------------------------------------------------------------------*/
+PLT_CtrlPoint::PLT_CtrlPoint(const char* search_criteria /* = "upnp:rootdevice" */) :
+ m_EventHttpServer(NULL),
+ m_TaskManager(NULL),
+ m_Lock(true),
+ m_SearchCriteria(search_criteria),
+ m_Started(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::~PLT_CtrlPoint
++---------------------------------------------------------------------*/
+PLT_CtrlPoint::~PLT_CtrlPoint()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::IgnoreUUID
++---------------------------------------------------------------------*/
+void
+PLT_CtrlPoint::IgnoreUUID(const char* uuid)
+{
+ if (!m_UUIDsToIgnore.Find(NPT_StringFinder(uuid))) {
+ m_UUIDsToIgnore.Add(uuid);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Start(PLT_SsdpListenTask* task)
+{
+ if (m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ m_TaskManager = new PLT_TaskManager();
+
+ m_EventHttpServer = new PLT_HttpServer();
+ m_EventHttpServer->AddRequestHandler(new PLT_HttpRequestHandler(this), "/", true, true);
+ m_EventHttpServer->Start();
+
+ // house keeping task
+ m_TaskManager->StartTask(new PLT_CtrlPointHouseKeepingTask(this));
+
+ // add ourselves as an listener to SSDP multicast advertisements
+ task->AddListener(this);
+
+ //
+ // use next line instead for DLNA testing, faster frequency for M-SEARCH
+ //return m_SearchCriteria.GetLength()?Search(NPT_HttpUrl("239.255.255.250", 1900, "*"), m_SearchCriteria, 1, 5000):NPT_SUCCESS;
+ //
+
+ m_Started = true;
+
+ return m_SearchCriteria.GetLength()?Search(NPT_HttpUrl("239.255.255.250", 1900, "*"), m_SearchCriteria):NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::GetPort
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::GetPort(NPT_UInt16& port)
+{
+ if (!m_Started) return NPT_ERROR_INVALID_STATE;
+
+ port = m_EventHttpServer->GetPort();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Stop(PLT_SsdpListenTask* task)
+{
+ if (!m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ m_Started = false;
+
+ task->RemoveListener(this);
+
+ m_EventHttpServer->Stop();
+ m_TaskManager->Abort();
+
+ // force remove all devices
+ NPT_List<PLT_DeviceDataReference>::Iterator iter = m_RootDevices.GetFirstItem();
+ while (iter) {
+ NotifyDeviceRemoved(*iter);
+ ++iter;
+ }
+
+ // we can safely clear everything without a lock
+ // as there are no more tasks pending
+ m_RootDevices.Clear();
+ m_Subscribers.Clear();
+
+ m_EventHttpServer = NULL;
+ m_TaskManager = NULL;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::AddListener
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::AddListener(PLT_CtrlPointListener* listener)
+{
+ NPT_AutoLock lock(m_Lock);
+ if (!m_ListenerList.Contains(listener)) {
+ m_ListenerList.Add(listener);
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::RemoveListener
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::RemoveListener(PLT_CtrlPointListener* listener)
+{
+ NPT_AutoLock lock(m_Lock);
+ m_ListenerList.Remove(listener);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::CreateSearchTask
++---------------------------------------------------------------------*/
+PLT_SsdpSearchTask*
+PLT_CtrlPoint::CreateSearchTask(const NPT_HttpUrl& url,
+ const char* target,
+ NPT_Cardinal mx,
+ NPT_TimeInterval frequency,
+ const NPT_IpAddress& address)
+{
+ // make sure mx is at least 1
+ if (mx<1) mx=1;
+
+ // create socket
+ NPT_Reference<NPT_UdpMulticastSocket> socket(new NPT_UdpMulticastSocket(NPT_SOCKET_FLAG_CANCELLABLE));
+ socket->SetInterface(address);
+ socket->SetTimeToLive(PLT_Constants::GetInstance().GetSearchMulticastTimeToLive());
+
+ // bind to something > 1024 and different than 1900
+ int retries = 20;
+ do {
+ int random = NPT_System::GetRandomInteger();
+ int port = (unsigned short)(1024 + (random % 15000));
+ if (port == 1900) continue;
+
+ if (NPT_SUCCEEDED(socket->Bind(
+ NPT_SocketAddress(NPT_IpAddress::Any, port),
+ false)))
+ break;
+
+ } while (--retries);
+
+ if (retries == 0) {
+ NPT_LOG_SEVERE("Couldn't bind socket for Search Task");
+ return NULL;
+ }
+
+ // create request
+ NPT_HttpRequest* request = new NPT_HttpRequest(url, "M-SEARCH", NPT_HTTP_PROTOCOL_1_1);
+ PLT_UPnPMessageHelper::SetMX(*request, mx);
+ PLT_UPnPMessageHelper::SetST(*request, target);
+ PLT_UPnPMessageHelper::SetMAN(*request, "\"ssdp:discover\"");
+ request->GetHeaders().SetHeader(NPT_HTTP_HEADER_USER_AGENT, *PLT_Constants::GetInstance().GetDefaultUserAgent());
+
+ // create task
+ PLT_SsdpSearchTask* task = new PLT_SsdpSearchTask(
+ socket.AsPointer(),
+ this,
+ request,
+ (frequency.ToMillis()>0 && frequency.ToMillis()<5000)?NPT_TimeInterval(5.):frequency); /* repeat no less than every 5 secs */
+ socket.Detach();
+
+ return task;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Search
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Search(const NPT_HttpUrl& url,
+ const char* target,
+ NPT_Cardinal mx /* = 5 */,
+ NPT_TimeInterval frequency /* = NPT_TimeInterval(50.) */,
+ NPT_TimeInterval initial_delay /* = NPT_TimeInterval(0.) */)
+{
+ if (!m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ NPT_List<NPT_NetworkInterface*> if_list;
+ NPT_List<NPT_NetworkInterface*>::Iterator net_if;
+ NPT_List<NPT_NetworkInterfaceAddress>::Iterator net_if_addr;
+
+ NPT_CHECK_SEVERE(PLT_UPnPMessageHelper::GetNetworkInterfaces(if_list, true));
+
+ for (net_if = if_list.GetFirstItem();
+ net_if;
+ net_if++) {
+ // make sure the interface is at least broadcast or multicast
+ if (!((*net_if)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_MULTICAST) &&
+ !((*net_if)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_BROADCAST)) {
+ continue;
+ }
+
+ for (net_if_addr = (*net_if)->GetAddresses().GetFirstItem();
+ net_if_addr;
+ net_if_addr++) {
+ // create task
+ PLT_SsdpSearchTask* task = CreateSearchTask(url,
+ target,
+ mx,
+ frequency,
+ (*net_if_addr).GetPrimaryAddress());
+ m_TaskManager->StartTask(task, &initial_delay);
+ }
+ }
+
+ if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Discover
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Discover(const NPT_HttpUrl& url,
+ const char* target,
+ NPT_Cardinal mx, /* = 5 */
+ NPT_TimeInterval frequency /* = NPT_TimeInterval(50.) */,
+ NPT_TimeInterval initial_delay /* = NPT_TimeInterval(0.) */)
+{
+ if (!m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ // make sure mx is at least 1
+ if (mx<1) mx = 1;
+
+ // create socket
+ NPT_UdpSocket* socket = new NPT_UdpSocket(NPT_SOCKET_FLAG_CANCELLABLE);
+
+ // create request
+ NPT_HttpRequest* request = new NPT_HttpRequest(url, "M-SEARCH", NPT_HTTP_PROTOCOL_1_1);
+ PLT_UPnPMessageHelper::SetMX(*request, mx);
+ PLT_UPnPMessageHelper::SetST(*request, target);
+ PLT_UPnPMessageHelper::SetMAN(*request, "\"ssdp:discover\"");
+ request->GetHeaders().SetHeader(NPT_HTTP_HEADER_USER_AGENT, *PLT_Constants::GetInstance().GetDefaultUserAgent());
+
+ // force HOST to be the regular multicast address:port
+ // Some servers do care (like WMC) otherwise they won't respond to us
+ request->GetHeaders().SetHeader(NPT_HTTP_HEADER_HOST, "239.255.255.250:1900");
+
+ // create task
+ PLT_ThreadTask* task = new PLT_SsdpSearchTask(
+ socket,
+ this,
+ request,
+ (frequency.ToMillis()>0 && frequency.ToMillis()<5000)?NPT_TimeInterval(5.):frequency); /* repeat no less than every 5 secs */
+ return m_TaskManager->StartTask(task, &initial_delay);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::DoHouseKeeping
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::DoHouseKeeping()
+{
+ NPT_List<PLT_DeviceDataReference> devices_to_remove;
+
+ // remove expired devices
+ {
+ NPT_AutoLock lock(m_Lock);
+
+ PLT_DeviceDataReference head, device;
+ while (NPT_SUCCEEDED(m_RootDevices.PopHead(device))) {
+ NPT_TimeStamp last_update = device->GetLeaseTimeLastUpdate();
+ NPT_TimeInterval lease_time = device->GetLeaseTime();
+
+ // check if device lease time has expired or if failed to renew subscribers
+ // TODO: UDA 1.1 says that root device and all embedded devices must have expired
+ // before we can assume they're all no longer unavailable (we may have missed the root device renew)
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ if (now > last_update + NPT_TimeInterval((double)lease_time*2)) {
+ devices_to_remove.Add(device);
+ } else {
+ // add the device back to our list since it is still alive
+ m_RootDevices.Add(device);
+
+ // keep track of first device added back to list
+ // to know we checked all devices in initial list
+ if (head.IsNull()) head = device;
+ }
+
+ // have we exhausted initial list?
+ if (!head.IsNull() && head == *m_RootDevices.GetFirstItem())
+ break;
+ };
+ }
+
+ // remove old devices
+ {
+ NPT_AutoLock lock(m_Lock);
+
+ for (NPT_List<PLT_DeviceDataReference>::Iterator device =
+ devices_to_remove.GetFirstItem();
+ device;
+ device++) {
+ RemoveDevice(*device);
+ }
+ }
+
+ // renew subscribers of subscribed device services
+ NPT_List<PLT_ThreadTask*> tasks;
+ {
+ NPT_AutoLock lock(m_Lock);
+
+ NPT_List<PLT_EventSubscriberReference>::Iterator sub = m_Subscribers.GetFirstItem();
+ while (sub) {
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+
+ // time to renew if within 90 secs of expiration
+ if (now > (*sub)->GetExpirationTime() - NPT_TimeStamp(90.)) {
+ PLT_ThreadTask* task = RenewSubscriber(*sub);
+ if (task) tasks.Add(task);
+ }
+ sub++;
+ }
+ }
+
+ // Queue up all tasks now outside of lock, in case they
+ // block because the task manager has maxed out number of running tasks
+ // and to avoid a deadlock with tasks trying to acquire the lock in the response
+ NPT_List<PLT_ThreadTask*>::Iterator task = tasks.GetFirstItem();
+ while (task) {
+ PLT_ThreadTask* _task = *task++;
+ m_TaskManager->StartTask(_task);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::FindDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::FindDevice(const char* uuid,
+ PLT_DeviceDataReference& device,
+ bool return_root /* = false */)
+{
+ NPT_List<PLT_DeviceDataReference>::Iterator iter = m_RootDevices.GetFirstItem();
+ while (iter) {
+ // device uuid found immediately as root device
+ if ((*iter)->GetUUID().Compare(uuid) == 0) {
+ device = *iter;
+ return NPT_SUCCESS;
+ } else if (NPT_SUCCEEDED((*iter)->FindEmbeddedDevice(uuid, device))) {
+ // we found the uuid as an embedded device of this root
+ // return root if told, otherwise return found embedded device
+ if (return_root) device = (*iter);
+ return NPT_SUCCESS;
+ }
+ ++iter;
+ }
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::FindActionDesc
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::FindActionDesc(PLT_DeviceDataReference& device,
+ const char* service_type,
+ const char* action_name,
+ PLT_ActionDesc*& action_desc)
+{
+ if (device.IsNull()) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // look for the service
+ PLT_Service* service;
+ if (NPT_FAILED(device->FindServiceByType(service_type, service))) {
+ NPT_LOG_FINE_1("Service %s not found", (const char*)service_type);
+ return NPT_FAILURE;
+ }
+
+ action_desc = service->FindActionDesc(action_name);
+ if (action_desc == NULL) {
+ NPT_LOG_FINE_1("Action %s not found in service", action_name);
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::CreateAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::CreateAction(PLT_DeviceDataReference& device,
+ const char* service_type,
+ const char* action_name,
+ PLT_ActionReference& action)
+{
+ if (device.IsNull()) return NPT_ERROR_INVALID_PARAMETERS;
+
+ NPT_AutoLock lock(m_Lock);
+
+ PLT_ActionDesc* action_desc;
+ NPT_CHECK_SEVERE(FindActionDesc(device,
+ service_type,
+ action_name,
+ action_desc));
+
+ PLT_DeviceDataReference root_device;
+ NPT_CHECK_SEVERE(FindDevice(device->GetUUID(), root_device, true));
+
+ action = new PLT_Action(*action_desc, root_device);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::SetupResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ if (request.GetMethod().Compare("NOTIFY") == 0) {
+ return ProcessHttpNotify(request, context, response);
+ }
+
+ NPT_LOG_SEVERE("CtrlPoint received bad http request\r\n");
+ response.SetStatus(412, "Precondition Failed");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::DecomposeLastChangeVar
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::DecomposeLastChangeVar(NPT_List<PLT_StateVariable*>& vars)
+{
+ // parse LastChange var into smaller vars
+ PLT_StateVariable* lastChangeVar = NULL;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(vars,
+ PLT_StateVariableNameFinder("LastChange"),
+ lastChangeVar))) {
+ vars.Remove(lastChangeVar);
+ PLT_Service* var_service = lastChangeVar->GetService();
+ NPT_String text = lastChangeVar->GetValue();
+
+ NPT_XmlNode* xml = NULL;
+ NPT_XmlParser parser;
+ if (NPT_FAILED(parser.Parse(text, xml)) || !xml || !xml->AsElementNode()) {
+ delete xml;
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+
+ NPT_XmlElementNode* node = xml->AsElementNode();
+ if (!node->GetTag().Compare("Event", true)) {
+ // look for the instance with attribute id = 0
+ NPT_XmlElementNode* instance = NULL;
+ for (NPT_Cardinal i=0; i<node->GetChildren().GetItemCount(); i++) {
+ NPT_XmlElementNode* child;
+ if (NPT_FAILED(PLT_XmlHelper::GetChild(node, child, i)))
+ continue;
+
+ if (!child->GetTag().Compare("InstanceID", true)) {
+ // extract the "val" attribute value
+ NPT_String value;
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(child, "val", value)) &&
+ !value.Compare("0")) {
+ instance = child;
+ break;
+ }
+ }
+ }
+
+ // did we find an instance with id = 0 ?
+ if (instance != NULL) {
+ // all the children of the Instance node are state variables
+ for (NPT_Cardinal j=0; j<instance->GetChildren().GetItemCount(); j++) {
+ NPT_XmlElementNode* var_node;
+ if (NPT_FAILED(PLT_XmlHelper::GetChild(instance, var_node, j)))
+ continue;
+
+ // look for the state variable in this service
+ const NPT_String* value = var_node->GetAttribute("val");
+ PLT_StateVariable* var = var_service->FindStateVariable(var_node->GetTag());
+ if (value != NULL && var != NULL) {
+ // get the value and set the state variable
+ // if it succeeded, add it to the list of vars we'll event
+ if (NPT_SUCCEEDED(var->SetValue(*value))) {
+ vars.Add(var);
+ NPT_LOG_FINE_2("LastChange var change for (%s): %s",
+ (const char*)var->GetName(),
+ (const char*)var->GetValue());
+ }
+ }
+ }
+ }
+ }
+ delete xml;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessEventNotification
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessEventNotification(PLT_EventSubscriberReference subscriber,
+ PLT_EventNotification* notification,
+ NPT_List<PLT_StateVariable*> &vars)
+{
+ NPT_XmlElementNode* xml = NULL;
+ PLT_Service* service = subscriber->GetService();
+ PLT_DeviceData* device = service->GetDevice();
+
+ NPT_String uuid = device->GetUUID();
+ NPT_String service_id = service->GetServiceID();
+
+ // callback uri for this sub
+ NPT_String callback_uri = "/" + uuid + "/" + service_id;
+
+ if (notification->m_RequestUrl.GetPath().Compare(callback_uri, true)) {
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, failure);
+ }
+
+ // if the sequence number is less than our current one, we got it out of order
+ // so we disregard it
+ if (subscriber->GetEventKey() && notification->m_EventKey < subscriber->GetEventKey()) {
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, failure);
+ }
+
+ // parse body
+ if (NPT_FAILED(PLT_XmlHelper::Parse(notification->m_XmlBody, xml))) {
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, failure);
+ }
+
+ // check envelope
+ if (xml->GetTag().Compare("propertyset", true)) {
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, failure);
+ }
+
+ // check property set
+ // keep a vector of the state variables that changed
+ NPT_XmlElementNode* property;
+ PLT_StateVariable* var;
+ for (NPT_List<NPT_XmlNode*>::Iterator children = xml->GetChildren().GetFirstItem();
+ children;
+ children++) {
+ NPT_XmlElementNode* child = (*children)->AsElementNode();
+ if (!child) continue;
+
+ // check property
+ if (child->GetTag().Compare("property", true)) continue;
+
+ if (NPT_FAILED(PLT_XmlHelper::GetChild(child, property))) {
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, failure);
+ }
+
+ var = service->FindStateVariable(property->GetTag());
+ if (var == NULL) continue;
+
+ if (NPT_FAILED(var->SetValue(property->GetText() ? property->GetText()->GetChars() : "")))
+ {
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, failure);
+ }
+
+ vars.Add(var);
+ }
+
+ // update sequence
+ subscriber->SetEventKey(notification->m_EventKey);
+
+ // Look if a state variable LastChange was received and decompose it into
+ // independent state variable updates
+ DecomposeLastChangeVar(vars);
+
+ delete xml;
+ return NPT_SUCCESS;
+
+failure:
+ NPT_LOG_SEVERE("CtrlPoint failed to process event notification");
+ delete xml;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::AddPendingEventNotification
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::AddPendingEventNotification(PLT_EventNotification *notification)
+{
+ // Only keep a maximum of 20 pending notifications
+ while (m_PendingNotifications.GetItemCount() > 20) {
+ PLT_EventNotification *garbage = NULL;
+ m_PendingNotifications.PopHead(garbage);
+ delete garbage;
+ }
+
+ m_PendingNotifications.Add(notification);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessPendingEventNotifications
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessPendingEventNotifications()
+{
+ NPT_Cardinal count = m_PendingNotifications.GetItemCount();
+ while (count--) {
+ NPT_List<PLT_StateVariable*> vars;
+ PLT_Service *service = NULL;
+ PLT_EventNotification *notification;
+
+ if (NPT_SUCCEEDED(m_PendingNotifications.PopHead(notification))) {
+ PLT_EventSubscriberReference sub;
+
+ // look for the subscriber with that sid
+ if (NPT_FAILED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderBySID(notification->m_SID),
+ sub))) {
+ m_PendingNotifications.Add(notification);
+ continue;
+ }
+
+ // keep track of service for listeners later
+ service = sub->GetService();
+
+ // Reprocess notification
+ NPT_LOG_WARNING_1("Reprocessing delayed notification for subscriber %s", (const char*)notification->m_SID);
+ NPT_Result result = ProcessEventNotification(sub, notification, vars);
+ delete notification;
+
+ if (NPT_FAILED(result)) continue;
+ }
+
+ // notify listeners
+ if (service && vars.GetItemCount()) {
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnEventNotifyIterator(service, &vars));
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessHttpNotify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessHttpNotify(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_AutoLock lock(m_Lock);
+
+ NPT_List<PLT_StateVariable*> vars;
+ PLT_Service* service = NULL;
+ PLT_EventSubscriberReference sub;
+ NPT_Result result;
+
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINER, "PLT_CtrlPoint::ProcessHttpNotify:", &request);
+
+ // Create notification from request
+ PLT_EventNotification* notification = PLT_EventNotification::Parse(request, context, response);
+ NPT_CHECK_POINTER_LABEL_WARNING(notification, bad_request);
+
+ // Give a last change to process pending notifications before throwing them out
+ // by AddPendingNotification
+ ProcessPendingEventNotifications();
+
+ // look for the subscriber with that sid
+ if (NPT_FAILED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderBySID(notification->m_SID),
+ sub))) {
+ NPT_LOG_WARNING_1("Subscriber %s not found, delaying notification process.\n", (const char*)notification->m_SID);
+ AddPendingEventNotification(notification);
+ return NPT_SUCCESS;
+ }
+
+ // Process notification for subscriber
+ service = sub->GetService();
+ result = ProcessEventNotification(sub, notification, vars);
+ delete notification;
+
+ NPT_CHECK_LABEL_WARNING(result, bad_request);
+
+ // Notify listeners
+ if (vars.GetItemCount()) {
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnEventNotifyIterator(service, &vars));
+ }
+
+ return NPT_SUCCESS;
+
+bad_request:
+ NPT_LOG_SEVERE("CtrlPoint received bad event notify request\r\n");
+ if (response.GetStatusCode() == 200) {
+ response.SetStatus(412, "Precondition Failed");
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessSsdpSearchResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessSsdpSearchResponse(NPT_Result res,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_CHECK_SEVERE(res);
+ NPT_CHECK_POINTER_SEVERE(response);
+
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String protocol = response->GetProtocol();
+
+ NPT_String prefix = NPT_String::Format("PLT_CtrlPoint::ProcessSsdpSearchResponse from %s:%d",
+ (const char*)context.GetRemoteAddress().GetIpAddress().ToString() ,
+ context.GetRemoteAddress().GetPort());
+ PLT_LOG_HTTP_RESPONSE(NPT_LOG_LEVEL_FINER, prefix, response);
+
+ // any 2xx responses are ok
+ if (response->GetStatusCode()/100 == 2) {
+ const NPT_String* st = response->GetHeaders().GetHeaderValue("st");
+ const NPT_String* usn = response->GetHeaders().GetHeaderValue("usn");
+ const NPT_String* ext = response->GetHeaders().GetHeaderValue("ext");
+ NPT_CHECK_POINTER_SEVERE(st);
+ NPT_CHECK_POINTER_SEVERE(usn);
+ NPT_CHECK_POINTER_SEVERE(ext);
+
+ NPT_String uuid;
+
+ // if we get an advertisement other than uuid
+ // verify it's formatted properly
+ if (usn != st) {
+ NPT_List<NPT_String> components = usn->Split("::");
+ if (components.GetItemCount() != 2)
+ return NPT_FAILURE;
+
+ if (st->Compare(*components.GetItem(1), true))
+ return NPT_FAILURE;
+
+ uuid = components.GetItem(0)->SubString(5);
+ } else {
+ uuid = usn->SubString(5);
+ }
+
+ if (m_UUIDsToIgnore.Find(NPT_StringFinder(uuid))) {
+ NPT_LOG_FINE_1("CtrlPoint received a search response from ourselves (%s)\n", (const char*)uuid);
+ return NPT_SUCCESS;
+ }
+
+ return ProcessSsdpMessage(*response, context, uuid);
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::OnSsdpPacket
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::OnSsdpPacket(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ return ProcessSsdpNotify(request, context);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessSsdpNotify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessSsdpNotify(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ // get the address of who sent us some data back
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String uri = request.GetUrl().GetPath(true);
+ NPT_String protocol = request.GetProtocol();
+
+ if (method.Compare("NOTIFY") == 0) {
+ const NPT_String* nts = PLT_UPnPMessageHelper::GetNTS(request);
+ const NPT_String* nt = PLT_UPnPMessageHelper::GetNT(request);
+ const NPT_String* usn = PLT_UPnPMessageHelper::GetUSN(request);
+
+ NPT_String prefix = NPT_String::Format("PLT_CtrlPoint::ProcessSsdpNotify from %s:%d (%s)",
+ context.GetRemoteAddress().GetIpAddress().ToString().GetChars(),
+ context.GetRemoteAddress().GetPort(),
+ usn?usn->GetChars():"unknown");
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINER, prefix, &request);
+
+ if ((uri.Compare("*") != 0) || (protocol.Compare("HTTP/1.1") != 0))
+ return NPT_FAILURE;
+
+ NPT_CHECK_POINTER_SEVERE(nts);
+ NPT_CHECK_POINTER_SEVERE(nt);
+ NPT_CHECK_POINTER_SEVERE(usn);
+
+ NPT_String uuid;
+
+ // if we get an advertisement other than uuid
+ // verify it's formatted properly
+ if (*usn != *nt) {
+ NPT_List<NPT_String> components = usn->Split("::");
+ if (components.GetItemCount() != 2)
+ return NPT_FAILURE;
+
+ if (nt->Compare(*components.GetItem(1), true))
+ return NPT_FAILURE;
+
+ uuid = components.GetItem(0)->SubString(5);
+ } else {
+ uuid = usn->SubString(5);
+ }
+
+ if (m_UUIDsToIgnore.Find(NPT_StringFinder(uuid))) {
+ NPT_LOG_FINE_1("Received a NOTIFY request from ourselves (%s)\n", (const char*)uuid);
+ return NPT_SUCCESS;
+ }
+
+ // if it's a byebye, remove the device and return right away
+ if (nts->Compare("ssdp:byebye", true) == 0) {
+ NPT_LOG_INFO_1("Received a byebye NOTIFY request from %s\n", (const char*)uuid);
+
+ NPT_AutoLock lock(m_Lock);
+
+ // look for root device
+ PLT_DeviceDataReference root_device;
+ FindDevice(uuid, root_device, true);
+
+ if (!root_device.IsNull()) RemoveDevice(root_device);
+ return NPT_SUCCESS;
+ }
+
+ return ProcessSsdpMessage(request, context, uuid);
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::AddDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::AddDevice(PLT_DeviceDataReference& data)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ return NotifyDeviceReady(data);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::NotifyDeviceReady
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::NotifyDeviceReady(PLT_DeviceDataReference& data)
+{
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnDeviceAddedIterator(data));
+
+ /* recursively add embedded devices */
+ NPT_Array<PLT_DeviceDataReference> embedded_devices =
+ data->GetEmbeddedDevices();
+ for (NPT_Cardinal i=0;i<embedded_devices.GetItemCount();i++) {
+ NotifyDeviceReady(embedded_devices[i]);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::RemoveDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::RemoveDevice(PLT_DeviceDataReference& data)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ NotifyDeviceRemoved(data);
+ CleanupDevice(data);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::NotifyDeviceRemoved
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::NotifyDeviceRemoved(PLT_DeviceDataReference& data)
+{
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnDeviceRemovedIterator(data));
+
+ /* recursively add embedded devices */
+ NPT_Array<PLT_DeviceDataReference> embedded_devices =
+ data->GetEmbeddedDevices();
+ for (NPT_Cardinal i=0;i<embedded_devices.GetItemCount();i++) {
+ NotifyDeviceRemoved(embedded_devices[i]);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::CleanupDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::CleanupDevice(PLT_DeviceDataReference& data)
+{
+ if (data.IsNull()) return NPT_ERROR_INVALID_PARAMETERS;
+
+ NPT_LOG_INFO_1("Removing %s from device list\n", (const char*)data->GetUUID());
+
+ // Note: This must take the lock prior to being called
+ // we can't take the lock here because this function
+ // will be recursively called if device contains embedded devices
+
+ /* recursively remove embedded devices */
+ NPT_Array<PLT_DeviceDataReference> embedded_devices = data->GetEmbeddedDevices();
+ for (NPT_Cardinal i=0;i<embedded_devices.GetItemCount();i++) {
+ CleanupDevice(embedded_devices[i]);
+ }
+
+ /* remove from list */
+ m_RootDevices.Remove(data);
+
+ /* unsubscribe from services */
+ data->m_Services.Apply(PLT_EventSubscriberRemoverIterator(this));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessSsdpMessage
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessSsdpMessage(const NPT_HttpMessage& message,
+ const NPT_HttpRequestContext& context,
+ NPT_String& uuid)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_AutoLock lock(m_Lock);
+
+ // check if we should ignore our own UUID
+ if (m_UUIDsToIgnore.Find(NPT_StringFinder(uuid))) return NPT_SUCCESS;
+
+ const NPT_String* url = PLT_UPnPMessageHelper::GetLocation(message);
+ NPT_CHECK_POINTER_SEVERE(url);
+
+ // Fix for Connect360 which uses localhost in device description url
+ NPT_HttpUrl location(*url);
+ if (location.GetHost().ToLowercase() == "localhost" ||
+ location.GetHost().ToLowercase() == "127.0.0.1") {
+ location.SetHost(context.GetRemoteAddress().GetIpAddress().ToString());
+ }
+
+ // be nice and assume a default lease time if not found even though it's required
+ NPT_TimeInterval leasetime;
+ if (NPT_FAILED(PLT_UPnPMessageHelper::GetLeaseTime(message, leasetime))) {
+ leasetime = *PLT_Constants::GetInstance().GetDefaultSubscribeLease();
+ }
+
+ // check if device (or embedded device) is already known
+ PLT_DeviceDataReference data;
+ if (NPT_SUCCEEDED(FindDevice(uuid, data))) {
+
+// // in case we missed the byebye and the device description has changed (ip or port)
+// // reset base and assumes device is the same (same number of services and embedded devices)
+// // FIXME: The right way is to remove the device and rescan it though but how do we know it changed?
+// PLT_DeviceReadyIterator device_tester;
+// if (NPT_SUCCEEDED(device_tester(data)) && data->GetDescriptionUrl().Compare(location.ToString(), true)) {
+// NPT_LOG_INFO_2("Old device \"%s\" detected @ new location %s",
+// (const char*)data->GetFriendlyName(),
+// (const char*)location.ToString());
+// data->SetURLBase(location);
+// }
+
+ // renew expiration time
+ data->SetLeaseTime(leasetime);
+ NPT_LOG_FINE_1("Device \"%s\" expiration time renewed..",
+ (const char*)data->GetFriendlyName());
+
+ return NPT_SUCCESS;
+ }
+
+ // start inspection
+ return InspectDevice(location, uuid, leasetime);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::InspectDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::InspectDevice(const NPT_HttpUrl& location,
+ const char* uuid,
+ NPT_TimeInterval leasetime)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ // check if already inspecting device
+ NPT_String pending_uuid;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_PendingInspections,
+ NPT_StringFinder(uuid),
+ pending_uuid))) {
+ return NPT_SUCCESS;
+ }
+
+ NPT_LOG_INFO_2("Inspecting device \"%s\" detected @ %s",
+ uuid,
+ (const char*)location.ToString());
+
+ if (!location.IsValid()) {
+ NPT_LOG_INFO_1("Invalid device description url: %s",
+ (const char*) location.ToString());
+ return NPT_FAILURE;
+ }
+
+ // remember that we're now inspecting the device
+ m_PendingInspections.Add(uuid);
+
+ // Start a task to retrieve the description
+ PLT_CtrlPointGetDescriptionTask* task = new PLT_CtrlPointGetDescriptionTask(
+ location,
+ this,
+ leasetime,
+ uuid);
+
+ // Add a delay to make sure that we received late NOTIFY bye-bye
+ NPT_TimeInterval delay(.5f);
+ m_TaskManager->StartTask(task, &delay);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::FetchDeviceSCPDs
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::FetchDeviceSCPDs(PLT_CtrlPointGetSCPDsTask* task,
+ PLT_DeviceDataReference& device,
+ NPT_Cardinal level)
+{
+ if (level == 5 && device->m_EmbeddedDevices.GetItemCount()) {
+ NPT_LOG_FATAL("Too many embedded devices depth! ");
+ return NPT_FAILURE;
+ }
+
+ ++level;
+
+ // fetch embedded devices services scpds first
+ for (NPT_Cardinal i = 0;
+ i<device->m_EmbeddedDevices.GetItemCount();
+ i++) {
+ NPT_CHECK_SEVERE(FetchDeviceSCPDs(task, device->m_EmbeddedDevices[i], level));
+ }
+
+ // Get SCPD of device services now and bail right away if one fails
+ return device->m_Services.ApplyUntil(
+ PLT_AddGetSCPDRequestIterator(*task, device),
+ NPT_UntilResultNotEquals(NPT_SUCCESS));
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessGetDescriptionResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessGetDescriptionResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response,
+ NPT_TimeInterval leasetime,
+ NPT_String uuid)
+{
+ NPT_COMPILER_UNUSED(request);
+
+ NPT_AutoLock lock(m_Lock);
+
+ PLT_CtrlPointGetSCPDsTask* task = NULL;
+ NPT_String desc;
+ PLT_DeviceDataReference root_device;
+ PLT_DeviceDataReference device;
+
+ // Add a delay, some devices need it (aka Rhapsody)
+ NPT_TimeInterval delay(0.1f);
+
+ NPT_String prefix = NPT_String::Format("PLT_CtrlPoint::ProcessGetDescriptionResponse @ %s (result = %d, status = %d)",
+ (const char*)request.GetUrl().ToString(),
+ res,
+ response?response->GetStatusCode():0);
+
+ // Remove pending inspection
+ m_PendingInspections.Remove(uuid);
+
+ // verify response was ok
+ NPT_CHECK_LABEL_FATAL(res, bad_response);
+ NPT_CHECK_POINTER_LABEL_FATAL(response, bad_response);
+
+ // log response
+ PLT_LOG_HTTP_RESPONSE(NPT_LOG_LEVEL_FINER, prefix, response);
+
+ // get response body
+ res = PLT_HttpHelper::GetBody(*response, desc);
+ NPT_CHECK_SEVERE(res);
+
+ // create new root device
+ NPT_CHECK_SEVERE(PLT_DeviceData::SetDescription(root_device, leasetime, request.GetUrl(), desc, context));
+
+ // make sure root device was not previously queried
+ if (NPT_FAILED(FindDevice(root_device->GetUUID(), device))) {
+ m_RootDevices.Add(root_device);
+
+ NPT_LOG_INFO_3("Device \"%s\" is now known as \"%s\" (%s)",
+ (const char*)root_device->GetUUID(),
+ (const char*)root_device->GetFriendlyName(),
+ (const char*)root_device->GetDescriptionUrl(NULL));
+
+ // create one single task to fetch all scpds one after the other
+ task = new PLT_CtrlPointGetSCPDsTask(this, root_device);
+ NPT_CHECK_LABEL_SEVERE(res = FetchDeviceSCPDs(task, root_device, 0),
+ cleanup);
+
+ // if device has embedded devices, we want to delay fetching scpds
+ // just in case there's a chance all the initial NOTIFY bye-bye have
+ // not all been received yet which would cause to remove the devices
+ // as we're adding them
+ if (root_device->m_EmbeddedDevices.GetItemCount() > 0) {
+ delay = 1.f;
+ }
+ NPT_CHECK_LABEL_SEVERE(res = m_TaskManager->StartTask(task, &delay),
+ failure);
+ }
+
+ return NPT_SUCCESS;
+
+bad_response:
+ NPT_LOG_SEVERE_2("Bad Description response @ %s: %s",
+ (const char*)request.GetUrl().ToString(),
+ (const char*)desc);
+
+cleanup:
+ if (task) delete task;
+
+failure:
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessGetSCPDResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessGetSCPDResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response,
+ PLT_DeviceDataReference& device)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_AutoLock lock(m_Lock);
+
+ PLT_DeviceReadyIterator device_tester;
+ NPT_String scpd;
+ PLT_DeviceDataReference root_device;
+ PLT_Service* service;
+
+ NPT_String prefix = NPT_String::Format("PLT_CtrlPoint::ProcessGetSCPDResponse for a service of device \"%s\" @ %s (result = %d, status = %d)",
+ (const char*)device->GetFriendlyName(),
+ (const char*)request.GetUrl().ToString(),
+ res,
+ response?response->GetStatusCode():0);
+
+ // verify response was ok
+ NPT_CHECK_LABEL_FATAL(res, bad_response);
+ NPT_CHECK_POINTER_LABEL_FATAL(response, bad_response);
+
+ PLT_LOG_HTTP_RESPONSE(NPT_LOG_LEVEL_FINER, prefix, response);
+
+ // make sure root device hasn't disappeared
+ NPT_CHECK_LABEL_WARNING(FindDevice(device->GetUUID(), root_device, true),
+ bad_response);
+
+ res = device->FindServiceBySCPDURL(request.GetUrl().ToRequestString(), service);
+ NPT_CHECK_LABEL_SEVERE(res, bad_response);
+
+ // get response body
+ res = PLT_HttpHelper::GetBody(*response, scpd);
+ NPT_CHECK_LABEL_FATAL(res, bad_response);
+
+ // DIAL support
+ if (root_device->GetType().Compare("urn:dial-multiscreen-org:device:dial:1") == 0) {
+ AddDevice(root_device);
+ return NPT_SUCCESS;
+ }
+
+ // set the service scpd
+ res = service->SetSCPDXML(scpd);
+ NPT_CHECK_LABEL_SEVERE(res, bad_response);
+
+ // if root device is ready, notify listeners about it and embedded devices
+ if (NPT_SUCCEEDED(device_tester(root_device))) {
+ AddDevice(root_device);
+ }
+
+ return NPT_SUCCESS;
+
+bad_response:
+ NPT_LOG_SEVERE_2("Bad SCPD response for device \"%s\":%s",
+ (const char*)device->GetFriendlyName(),
+ (const char*)scpd);
+
+ if (!root_device.IsNull()) RemoveDevice(root_device);
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::RenewSubscriber
++---------------------------------------------------------------------*/
+PLT_ThreadTask*
+PLT_CtrlPoint::RenewSubscriber(PLT_EventSubscriberReference subscriber)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ PLT_DeviceDataReference root_device;
+ if (NPT_FAILED(FindDevice(subscriber->GetService()->GetDevice()->GetUUID(),
+ root_device,
+ true))) {
+ return NULL;
+ }
+
+ NPT_LOG_FINE_3("Renewing subscriber \"%s\" for service \"%s\" of device \"%s\"",
+ (const char*)subscriber->GetSID(),
+ (const char*)subscriber->GetService()->GetServiceID(),
+ (const char*)subscriber->GetService()->GetDevice()->GetFriendlyName());
+
+ // create the request
+ NPT_HttpRequest* request = new NPT_HttpRequest(
+ subscriber->GetService()->GetEventSubURL(true),
+ "SUBSCRIBE",
+ NPT_HTTP_PROTOCOL_1_1);
+
+ PLT_UPnPMessageHelper::SetSID(*request, subscriber->GetSID());
+ PLT_UPnPMessageHelper::SetTimeOut(*request,
+ (NPT_Int32)PLT_Constants::GetInstance().GetDefaultSubscribeLease()->ToSeconds());
+
+ // Prepare the request
+ // create a task to post the request
+ return new PLT_CtrlPointSubscribeEventTask(
+ request,
+ this,
+ root_device,
+ subscriber->GetService());
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Subscribe
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Subscribe(PLT_Service* service,
+ bool cancel,
+ void* userdata)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (!m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ NPT_HttpRequest* request = NULL;
+
+ // make sure service is subscribable
+ if (!service->IsSubscribable()) return NPT_FAILURE;
+
+ // event url
+ NPT_HttpUrl url(service->GetEventSubURL(true));
+
+ // look for the corresponding root device & sub
+ PLT_DeviceDataReference root_device;
+ PLT_EventSubscriberReference sub;
+ NPT_CHECK_WARNING(FindDevice(service->GetDevice()->GetUUID(),
+ root_device,
+ true));
+
+ // look for the subscriber with that service to decide if it's a renewal or not
+ NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderByService(service),
+ sub);
+
+ if (cancel == false) {
+ // renewal?
+ if (!sub.IsNull()) {
+ PLT_ThreadTask* task = RenewSubscriber(sub);
+ return m_TaskManager->StartTask(task);
+ }
+
+ NPT_LOG_INFO_2("Subscribing to service \"%s\" of device \"%s\"",
+ (const char*)service->GetServiceID(),
+ (const char*)service->GetDevice()->GetFriendlyName());
+
+ // prepare the callback url
+ NPT_String uuid = service->GetDevice()->GetUUID();
+ NPT_String service_id = service->GetServiceID();
+ NPT_String callback_uri = "/" + uuid + "/" + service_id;
+
+ // create the request
+ request = new NPT_HttpRequest(url, "SUBSCRIBE", NPT_HTTP_PROTOCOL_1_1);
+ // specify callback url using ip of interface used when
+ // retrieving device description
+ NPT_HttpUrl callbackUrl(
+ service->GetDevice()->m_LocalIfaceIp.ToString(),
+ m_EventHttpServer->GetPort(),
+ callback_uri);
+
+ // set the required headers for a new subscription
+ PLT_UPnPMessageHelper::SetNT(*request, "upnp:event");
+ PLT_UPnPMessageHelper::SetCallbacks(*request,
+ "<" + callbackUrl.ToString() + ">");
+ PLT_UPnPMessageHelper::SetTimeOut(*request,
+ (NPT_Int32)PLT_Constants::GetInstance().GetDefaultSubscribeLease()->ToSeconds());
+ } else {
+ NPT_LOG_INFO_3("Unsubscribing subscriber \"%s\" for service \"%s\" of device \"%s\"",
+ (const char*)(!sub.IsNull()?sub->GetSID().GetChars():"unknown"),
+ (const char*)service->GetServiceID(),
+ (const char*)service->GetDevice()->GetFriendlyName());
+
+ // cancellation
+ if (sub.IsNull()) return NPT_FAILURE;
+
+ // create the request
+ request = new NPT_HttpRequest(url, "UNSUBSCRIBE", NPT_HTTP_PROTOCOL_1_1);
+ PLT_UPnPMessageHelper::SetSID(*request, sub->GetSID());
+
+ // remove from list now
+ m_Subscribers.Remove(sub, true);
+ }
+
+ // verify we have request to send just in case
+ NPT_CHECK_POINTER_FATAL(request);
+
+ // Prepare the request
+ // create a task to post the request
+ PLT_ThreadTask* task = new PLT_CtrlPointSubscribeEventTask(
+ request,
+ this,
+ root_device,
+ service,
+ userdata);
+ m_TaskManager->StartTask(task);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessSubscribeResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessSubscribeResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response,
+ PLT_Service* service,
+ void* /* userdata */)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_AutoLock lock(m_Lock);
+
+ const NPT_String* sid = NULL;
+ NPT_Int32 seconds = -1;
+ PLT_EventSubscriberReference sub;
+ bool subscription = (request.GetMethod().ToUppercase() == "SUBSCRIBE");
+
+ NPT_String prefix = NPT_String::Format("PLT_CtrlPoint::ProcessSubscribeResponse %ubscribe for service \"%s\" (result = %d, status code = %d)",
+ (const char*)subscription?"S":"Uns",
+ (const char*)service->GetServiceID(),
+ res,
+ response?response->GetStatusCode():0);
+ PLT_LOG_HTTP_RESPONSE(NPT_LOG_LEVEL_FINER, prefix, response);
+
+ // if there's a failure or it's a response to a cancellation
+ // we get out (any 2xx status code ok)
+ if (NPT_FAILED(res) || response == NULL || response->GetStatusCode()/100 != 2) {
+ goto failure;
+ }
+
+ if (subscription) {
+ if (!(sid = PLT_UPnPMessageHelper::GetSID(*response)) ||
+ NPT_FAILED(PLT_UPnPMessageHelper::GetTimeOut(*response, seconds))) {
+ NPT_CHECK_LABEL_SEVERE(res = NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // Look for subscriber
+ NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderBySID(*sid),
+ sub);
+
+ NPT_LOG_INFO_5("%s subscriber \"%s\" for service \"%s\" of device \"%s\" (timeout = %d)",
+ !sub.IsNull()?"Updating timeout for":"Creating new",
+ (const char*)*sid,
+ (const char*)service->GetServiceID(),
+ (const char*)service->GetDevice()->GetFriendlyName(),
+ seconds);
+
+ // create new subscriber if sid never seen before
+ // or update subscriber expiration otherwise
+ if (sub.IsNull()) {
+ sub = new PLT_EventSubscriber(m_TaskManager, service, *sid, seconds);
+ m_Subscribers.Add(sub);
+ } else {
+ sub->SetTimeout(seconds);
+ }
+
+ // Process any pending notifcations for that subscriber we got a bit too early
+ ProcessPendingEventNotifications();
+
+ return NPT_SUCCESS;
+ }
+
+ goto remove_sub;
+
+failure:
+ NPT_LOG_SEVERE_4(
+ "%subscription failed of sub \"%s\" for service \"%s\" of device \"%s\"",
+ (const char*)subscription ? "S" : "Uns", (const char*)(sid ? sid->GetChars() : "Unknown"),
+ (const char*)service->GetServiceID(), (const char*)service->GetDevice()->GetFriendlyName());
+ res = NPT_FAILED(res) ? res : NPT_FAILURE;
+
+remove_sub:
+ // in case it was a renewal look for the subscriber with that service and remove it from the list
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderByService(service),
+ sub))) {
+ m_Subscribers.Remove(sub);
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::InvokeAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::InvokeAction(PLT_ActionReference& action,
+ void* userdata)
+{
+ if (!m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ PLT_Service* service = action->GetActionDesc().GetService();
+
+ // create the request
+ NPT_HttpUrl url(service->GetControlURL(true));
+ NPT_HttpRequest* request = new NPT_HttpRequest(url, "POST", NPT_HTTP_PROTOCOL_1_1);
+
+ // create a memory stream for our request body
+ NPT_MemoryStreamReference stream(new NPT_MemoryStream);
+ action->FormatSoapRequest(*stream);
+
+ // set the request body
+ NPT_HttpEntity* entity = NULL;
+ PLT_HttpHelper::SetBody(*request, (NPT_InputStreamReference)stream, &entity);
+
+ entity->SetContentType("text/xml; charset=\"utf-8\"");
+ NPT_String service_type = service->GetServiceType();
+ NPT_String action_name = action->GetActionDesc().GetName();
+ request->GetHeaders().SetHeader("SOAPAction", "\"" + service_type + "#" + action_name + "\"");
+
+ // create a task to post the request
+ PLT_CtrlPointInvokeActionTask* task = new PLT_CtrlPointInvokeActionTask(
+ request,
+ this,
+ action,
+ userdata);
+
+ // queue the request
+ m_TaskManager->StartTask(task);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessActionResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessActionResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse* response,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_COMPILER_UNUSED(request);
+
+ NPT_String service_type;
+ NPT_String str;
+ NPT_XmlElementNode* xml = NULL;
+ NPT_String name;
+ NPT_String soap_action_name;
+ NPT_XmlElementNode* soap_action_response;
+ NPT_XmlElementNode* soap_body;
+ NPT_XmlElementNode* fault;
+ const NPT_String* attr = NULL;
+ PLT_ActionDesc& action_desc = action->GetActionDesc();
+
+ // reset the error code and desc
+ action->SetError(0, "");
+
+ // check context validity
+ if (NPT_FAILED(res) || response == NULL) {
+ PLT_Service* service = action_desc.GetService();
+ NPT_COMPILER_UNUSED(service);
+ NPT_LOG_WARNING_4("Failed to reach %s for %s.%s (%d)",
+ request.GetUrl().ToString().GetChars(),
+ service->GetDevice()->GetUUID().GetChars(),
+ service->GetServiceName().GetChars(),
+ res);
+ goto failure;
+ }
+
+ PLT_LOG_HTTP_RESPONSE(NPT_LOG_LEVEL_FINER, "PLT_CtrlPoint::ProcessActionResponse:", response);
+
+ NPT_LOG_FINER("Reading/Parsing Action Response Body...");
+ if (NPT_FAILED(PLT_HttpHelper::ParseBody(*response, xml))) {
+ goto failure;
+ }
+
+ NPT_LOG_FINER("Analyzing Action Response Body...");
+
+ // read envelope
+ if (xml->GetTag().Compare("Envelope", true))
+ goto failure;
+
+ // check namespace
+ if (!xml->GetNamespace() || xml->GetNamespace()->Compare("http://schemas.xmlsoap.org/soap/envelope/"))
+ goto failure;
+
+ // check encoding
+ attr = xml->GetAttribute("encodingStyle", "http://schemas.xmlsoap.org/soap/envelope/");
+ if (!attr || attr->Compare("http://schemas.xmlsoap.org/soap/encoding/"))
+ goto failure;
+
+ // read action
+ soap_body = PLT_XmlHelper::GetChild(xml, "Body");
+ if (soap_body == NULL)
+ goto failure;
+
+ // check if an error occurred
+ fault = PLT_XmlHelper::GetChild(soap_body, "Fault");
+ if (fault != NULL) {
+ // we have an error
+ ParseFault(action, fault);
+ goto failure;
+ }
+
+ if (NPT_FAILED(PLT_XmlHelper::GetChild(soap_body, soap_action_response)))
+ goto failure;
+
+ // verify action name is identical to SOAPACTION header
+ if (soap_action_response->GetTag().Compare(action_desc.GetName() + "Response", true))
+ goto failure;
+
+ // verify namespace
+ if (!soap_action_response->GetNamespace() ||
+ soap_action_response->GetNamespace()->Compare(action_desc.GetService()->GetServiceType()))
+ goto failure;
+
+ // read all the arguments if any
+ for (NPT_List<NPT_XmlNode*>::Iterator args = soap_action_response->GetChildren().GetFirstItem();
+ args;
+ args++) {
+ NPT_XmlElementNode* child = (*args)->AsElementNode();
+ if (!child) continue;
+
+ action->SetArgumentValue(child->GetTag(),
+ child->GetText() ? child->GetText()->GetChars() : "");
+ if (NPT_FAILED(res)) goto failure;
+ }
+
+ // create a buffer for our response body and call the service
+ res = action->VerifyArguments(false);
+ if (NPT_FAILED(res)) goto failure;
+
+ goto cleanup;
+
+failure:
+ // override res with failure if necessary
+ if (NPT_SUCCEEDED(res)) res = NPT_FAILURE;
+ // fallthrough
+
+cleanup:
+ {
+ NPT_AutoLock lock(m_Lock);
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnActionResponseIterator(res, action, userdata));
+ }
+
+ delete xml;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ParseFault
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ParseFault(PLT_ActionReference& action,
+ NPT_XmlElementNode* fault)
+{
+ NPT_XmlElementNode* detail = fault->GetChild("detail");
+ if (detail == NULL) return NPT_FAILURE;
+
+ NPT_XmlElementNode *upnp_error, *error_code, *error_desc;
+ upnp_error = detail->GetChild("upnp_error");
+
+ // WMP12 Hack
+ if (upnp_error == NULL) {
+ upnp_error = detail->GetChild("UPnPError", NPT_XML_ANY_NAMESPACE);
+ if (upnp_error == NULL) return NPT_FAILURE;
+ }
+
+ error_code = upnp_error->GetChild("errorCode", NPT_XML_ANY_NAMESPACE);
+ error_desc = upnp_error->GetChild("errorDescription", NPT_XML_ANY_NAMESPACE);
+ NPT_Int32 code = 501;
+ NPT_String desc;
+ if (error_code && error_code->GetText()) {
+ NPT_String value = *error_code->GetText();
+ value.ToInteger(code);
+ }
+ if (error_desc && error_desc->GetText()) {
+ desc = *error_desc->GetText();
+ }
+ action->SetError(code, desc);
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h
new file mode 100644
index 0000000..401c863
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h
@@ -0,0 +1,254 @@
+/*****************************************************************
+|
+| Platinum - Control Point
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP ControlPoint
+ */
+
+#ifndef _PLT_CONTROL_POINT_H_
+#define _PLT_CONTROL_POINT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltService.h"
+#include "PltSsdp.h"
+#include "PltDeviceData.h"
+#include "PltHttpServer.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_CtrlPointHouseKeepingTask;
+class PLT_SsdpSearchTask;
+class PLT_SsdpListenTask;
+class PLT_CtrlPointGetSCPDsTask;
+class PLT_CtrlPointGetSCPDRequest;
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListener class
++---------------------------------------------------------------------*/
+/**
+ The PLT_CtrlPointListener class is an interface used to receive notifications when
+ devices are found or removed from the network, actions responses and events
+ are being received.
+ */
+class PLT_CtrlPointListener
+{
+public:
+ virtual ~PLT_CtrlPointListener() {}
+
+ virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device) = 0;
+ virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device) = 0;
+ virtual NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata) = 0;
+ virtual NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars) = 0;
+};
+
+typedef NPT_List<PLT_CtrlPointListener*> PLT_CtrlPointListenerList;
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint class
++---------------------------------------------------------------------*/
+/**
+ The PLT_CtrlPoint class implements the base functionality of a UPnP ControlPoint.
+ It searches and inpects devices, invoke actions on services and subscribes to
+ events.
+ */
+class PLT_CtrlPoint : public PLT_SsdpPacketListener,
+ public PLT_SsdpSearchResponseListener,
+ public NPT_HttpRequestHandler
+{
+public:
+ PLT_CtrlPoint(const char* search_criteria = "upnp:rootdevice"); // pass NULL to prevent repeated automatic search
+ ~PLT_CtrlPoint() override;
+
+ /**
+ Returns the port used by the internal HTTP server for all incoming event notifications.
+ @return port
+ */
+ virtual NPT_Result GetPort(NPT_UInt16& port);
+
+ // delegation
+ virtual NPT_Result AddListener(PLT_CtrlPointListener* listener);
+ virtual NPT_Result RemoveListener(PLT_CtrlPointListener* listener);
+
+ // discovery
+ virtual void IgnoreUUID(const char* uuid);
+ virtual NPT_Result Search(const NPT_HttpUrl& url = NPT_HttpUrl("239.255.255.250", 1900, "*"),
+ const char* target = "upnp:rootdevice",
+ NPT_Cardinal mx = 5,
+ NPT_TimeInterval frequency = NPT_TimeInterval(50.), // pass NPT_TimeInterval(0.) for one time only
+ NPT_TimeInterval initial_delay = NPT_TimeInterval(0.));
+ virtual NPT_Result Discover(const NPT_HttpUrl& url = NPT_HttpUrl("239.255.255.250", 1900, "*"),
+ const char* target = "ssdp:all",
+ NPT_Cardinal mx = 5,
+ NPT_TimeInterval frequency = NPT_TimeInterval(50.), // pass NPT_TimeInterval(0.) for one time only
+ NPT_TimeInterval initial_delay = NPT_TimeInterval(0.));
+ virtual NPT_Result InspectDevice(const NPT_HttpUrl& location,
+ const char* uuid,
+ NPT_TimeInterval leasetime = *PLT_Constants::GetInstance().GetDefaultDeviceLease());
+
+ // actions
+ virtual NPT_Result FindActionDesc(PLT_DeviceDataReference& device,
+ const char* service_type,
+ const char* action_name,
+ PLT_ActionDesc*& action_desc);
+ virtual NPT_Result CreateAction(PLT_DeviceDataReference& device,
+ const char* service_type,
+ const char* action_name,
+ PLT_ActionReference& action);
+ virtual NPT_Result InvokeAction(PLT_ActionReference& action,
+ void* userdata = NULL);
+
+ // events
+ virtual NPT_Result Subscribe(PLT_Service* service,
+ bool cancel = false,
+ void* userdata = NULL);
+
+ // NPT_HttpRequestHandler methods
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+ // PLT_SsdpSearchResponseListener methods
+ NPT_Result ProcessSsdpSearchResponse(NPT_Result res,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) override;
+ // PLT_SsdpPacketListener method
+ NPT_Result OnSsdpPacket(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context) override;
+
+protected:
+
+ // State Variable Handling
+ virtual NPT_Result DecomposeLastChangeVar(NPT_List<PLT_StateVariable*>& vars);
+
+ // methods
+ virtual NPT_Result Start(PLT_SsdpListenTask* task);
+ virtual NPT_Result Stop(PLT_SsdpListenTask* task);
+
+ // SSDP & HTTP Notifications handling
+ virtual NPT_Result ProcessSsdpNotify(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context);
+ virtual NPT_Result ProcessSsdpMessage(const NPT_HttpMessage& message,
+ const NPT_HttpRequestContext& context,
+ NPT_String& uuid);
+ virtual NPT_Result ProcessGetDescriptionResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response,
+ NPT_TimeInterval leasetime,
+ NPT_String uuid);
+ virtual NPT_Result ProcessGetSCPDResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response,
+ PLT_DeviceDataReference& device);
+ virtual NPT_Result ProcessActionResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response,
+ PLT_ActionReference& action,
+ void* userdata);
+ virtual NPT_Result ProcessSubscribeResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response,
+ PLT_Service* service,
+ void* userdata);
+ virtual NPT_Result ProcessHttpNotify(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+ // Device management
+ virtual NPT_Result AddDevice(PLT_DeviceDataReference& data);
+ virtual NPT_Result RemoveDevice(PLT_DeviceDataReference& data);
+
+private:
+ // methods
+ PLT_ThreadTask* RenewSubscriber(PLT_EventSubscriberReference subscriber);
+
+ NPT_Result AddPendingEventNotification(PLT_EventNotification *notification);
+ NPT_Result ProcessPendingEventNotifications();
+ NPT_Result ProcessEventNotification(PLT_EventSubscriberReference subscriber,
+ PLT_EventNotification* notification,
+ NPT_List<PLT_StateVariable*> &vars);
+
+ NPT_Result DoHouseKeeping();
+ NPT_Result FetchDeviceSCPDs(PLT_CtrlPointGetSCPDsTask* task,
+ PLT_DeviceDataReference& device,
+ NPT_Cardinal level);
+
+ // Device management
+ NPT_Result FindDevice(const char* uuid, PLT_DeviceDataReference& device, bool return_root = false);
+ NPT_Result NotifyDeviceReady(PLT_DeviceDataReference& data);
+ NPT_Result NotifyDeviceRemoved(PLT_DeviceDataReference& data);
+ NPT_Result CleanupDevice(PLT_DeviceDataReference& data);
+
+ NPT_Result ParseFault(PLT_ActionReference& action, NPT_XmlElementNode* fault);
+ PLT_SsdpSearchTask* CreateSearchTask(const NPT_HttpUrl& url,
+ const char* target,
+ NPT_Cardinal mx,
+ NPT_TimeInterval frequency,
+ const NPT_IpAddress& address);
+
+private:
+ friend class NPT_Reference<PLT_CtrlPoint>;
+ friend class PLT_UPnP;
+ friend class PLT_UPnP_CtrlPointStartIterator;
+ friend class PLT_UPnP_CtrlPointStopIterator;
+ friend class PLT_EventSubscriberRemoverIterator;
+ friend class PLT_CtrlPointGetDescriptionTask;
+ friend class PLT_CtrlPointGetSCPDsTask;
+ friend class PLT_CtrlPointInvokeActionTask;
+ friend class PLT_CtrlPointHouseKeepingTask;
+ friend class PLT_CtrlPointSubscribeEventTask;
+
+ NPT_List<NPT_String> m_UUIDsToIgnore;
+ PLT_CtrlPointListenerList m_ListenerList;
+ PLT_HttpServerReference m_EventHttpServer;
+ PLT_TaskManagerReference m_TaskManager;
+ NPT_Mutex m_Lock;
+ NPT_List<PLT_DeviceDataReference> m_RootDevices;
+ NPT_List<PLT_EventSubscriberReference> m_Subscribers;
+ NPT_String m_SearchCriteria;
+ bool m_Started;
+ NPT_List<PLT_EventNotification *> m_PendingNotifications;
+ NPT_List<NPT_String> m_PendingInspections;
+};
+
+typedef NPT_Reference<PLT_CtrlPoint> PLT_CtrlPointReference;
+
+#endif /* _PLT_CONTROL_POINT_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.cpp b/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.cpp
new file mode 100644
index 0000000..7d2e5ba
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.cpp
@@ -0,0 +1,213 @@
+/*****************************************************************
+|
+| Platinum - Control Point Tasks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDeviceHost.h"
+#include "PltCtrlPointTask.h"
+#include "PltCtrlPoint.h"
+#include "PltDatagramStream.h"
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask::PLT_CtrlPointGetDescriptionTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointGetDescriptionTask::PLT_CtrlPointGetDescriptionTask(const NPT_HttpUrl& url,
+ PLT_CtrlPoint* ctrl_point,
+ NPT_TimeInterval leasetime,
+ NPT_String uuid) :
+ PLT_HttpClientSocketTask(new NPT_HttpRequest(url, "GET", NPT_HTTP_PROTOCOL_1_1)),
+ m_CtrlPoint(ctrl_point),
+ m_LeaseTime(leasetime),
+ m_UUID(uuid)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask::~PLT_CtrlPointGetDescriptionTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointGetDescriptionTask::~PLT_CtrlPointGetDescriptionTask()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPointGetDescriptionTask::ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ return m_CtrlPoint->ProcessGetDescriptionResponse(
+ res,
+ request,
+ context,
+ response,
+ m_LeaseTime,
+ m_UUID);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetSCPDsTask::PLT_CtrlPointGetSCPDsTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointGetSCPDsTask::PLT_CtrlPointGetSCPDsTask(PLT_CtrlPoint* ctrl_point,
+ PLT_DeviceDataReference& root_device) :
+ PLT_HttpClientSocketTask(),
+ m_CtrlPoint(ctrl_point),
+ m_RootDevice(root_device)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetSCPDsTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPointGetSCPDsTask::ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(context);
+ return m_CtrlPoint->ProcessGetSCPDResponse(
+ res,
+ request,
+ context,
+ response,
+ ((PLT_CtrlPointGetSCPDRequest&)request).m_Device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointInvokeActionTask::PLT_CtrlPointInvokeActionTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointInvokeActionTask::PLT_CtrlPointInvokeActionTask(NPT_HttpRequest* request,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_ActionReference& action,
+ void* userdata) :
+ PLT_HttpClientSocketTask(request),
+ m_CtrlPoint(ctrl_point),
+ m_Action(action),
+ m_Userdata(userdata)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointInvokeActionTask::~PLT_CtrlPointInvokeActionTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointInvokeActionTask::~PLT_CtrlPointInvokeActionTask()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointInvokeActionTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPointInvokeActionTask::ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+
+ return m_CtrlPoint->ProcessActionResponse(res, request, context, response, m_Action, m_Userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointHouseKeepingTask::PLT_CtrlPointHouseKeepingTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointHouseKeepingTask::PLT_CtrlPointHouseKeepingTask(PLT_CtrlPoint* ctrl_point,
+ NPT_TimeInterval timer) :
+ m_CtrlPoint(ctrl_point),
+ m_Timer(timer)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointHouseKeepingTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_CtrlPointHouseKeepingTask::DoRun()
+{
+ while (!IsAborting((NPT_Timeout)m_Timer.ToSeconds()*1000)) {
+ if (m_CtrlPoint) {
+ m_CtrlPoint->DoHouseKeeping();
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointSubscribeEventTask::PLT_CtrlPointSubscribeEventTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointSubscribeEventTask::PLT_CtrlPointSubscribeEventTask(NPT_HttpRequest* request,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_DeviceDataReference &device,
+ PLT_Service* service,
+ void* userdata) :
+ PLT_HttpClientSocketTask(request),
+ m_CtrlPoint(ctrl_point),
+ m_Service(service),
+ m_Device(device),
+ m_Userdata(userdata)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointSubscribeEventTask::~PLT_CtrlPointSubscribeEventTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointSubscribeEventTask::~PLT_CtrlPointSubscribeEventTask()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointSubscribeEventTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPointSubscribeEventTask::ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+
+ return m_CtrlPoint->ProcessSubscribeResponse(
+ res,
+ request,
+ context,
+ response,
+ m_Service,
+ m_Userdata);
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.h b/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.h
new file mode 100644
index 0000000..15ac887
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.h
@@ -0,0 +1,225 @@
+/*****************************************************************
+|
+| Platinum - Control Point Tasks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP ControlPoint Tasks
+ */
+
+#ifndef _PLT_CONTROL_POINT_TASK_H_
+#define _PLT_CONTROL_POINT_TASK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttpClientTask.h"
+#include "PltDatagramStream.h"
+#include "PltDeviceData.h"
+#include "PltCtrlPoint.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Action;
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_CtrlPointGetDescriptionTask class fetches the description xml document
+ from a UPnP device
+ */
+class PLT_CtrlPointGetDescriptionTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_CtrlPointGetDescriptionTask(const NPT_HttpUrl& url,
+ PLT_CtrlPoint* ctrl_point,
+ NPT_TimeInterval leasetime,
+ NPT_String uuid);
+ ~PLT_CtrlPointGetDescriptionTask() override;
+
+protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) override;
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ NPT_TimeInterval m_LeaseTime;
+ NPT_String m_UUID;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetSCPDRequest class
++---------------------------------------------------------------------*/
+/**
+ The PLT_CtrlPointGetSCPDRequest class is used by a PLT_CtrlPointGetSCPDsTask task
+ to fetch a specific SCPD xml document for a given service of a given device.
+ */
+class PLT_CtrlPointGetSCPDRequest : public NPT_HttpRequest
+{
+public:
+ PLT_CtrlPointGetSCPDRequest(PLT_DeviceDataReference& device,
+ const char* url,
+ const char* method = "GET",
+ const char* protocol = NPT_HTTP_PROTOCOL_1_1) : // 1.1 for pipelining
+ NPT_HttpRequest(url, method, protocol), m_Device(device) {}
+ ~PLT_CtrlPointGetSCPDRequest() override {}
+
+ // members
+ PLT_DeviceDataReference m_Device;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetSCPDsTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_CtrlPointGetSCPDsTask class fetches the SCPD xml document of one or more
+ services for a given device.
+ */
+class PLT_CtrlPointGetSCPDsTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_CtrlPointGetSCPDsTask(PLT_CtrlPoint* ctrl_point, PLT_DeviceDataReference& root_device);
+ ~PLT_CtrlPointGetSCPDsTask() override {}
+
+ NPT_Result AddSCPDRequest(PLT_CtrlPointGetSCPDRequest* request) {
+ return PLT_HttpClientSocketTask::AddRequest((NPT_HttpRequest*)request);
+ }
+
+ // override to prevent calling this directly
+ NPT_Result AddRequest(NPT_HttpRequest*) override {
+ // only queuing PLT_CtrlPointGetSCPDRequest allowed
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+
+protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) override;
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ PLT_DeviceDataReference m_RootDevice;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointInvokeActionTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_CtrlPointInvokeActionTask class is used by a PLT_CtrlPoint to invoke
+ a specific action of a given service for a given device.
+ */
+class PLT_CtrlPointInvokeActionTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_CtrlPointInvokeActionTask(NPT_HttpRequest* request,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_ActionReference& action,
+ void* userdata);
+ ~PLT_CtrlPointInvokeActionTask() override;
+
+protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) override;
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ PLT_ActionReference m_Action;
+ void* m_Userdata;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointHouseKeepingTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_CtrlPointHouseKeepingTask class is used by a PLT_CtrlPoint to keep
+ track of expired devices and autmatically renew event subscribers.
+ */
+class PLT_CtrlPointHouseKeepingTask : public PLT_ThreadTask
+{
+public:
+ PLT_CtrlPointHouseKeepingTask(PLT_CtrlPoint* ctrl_point,
+ NPT_TimeInterval timer = NPT_TimeInterval(5.));
+
+protected:
+ ~PLT_CtrlPointHouseKeepingTask() override {}
+
+ // PLT_ThreadTask methods
+ void DoRun() override;
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ NPT_TimeInterval m_Timer;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointSubscribeEventTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_CtrlPointSubscribeEventTask class is used to subscribe, renew or cancel
+ a subscription for a given service of a given device.
+ */
+class PLT_CtrlPointSubscribeEventTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_CtrlPointSubscribeEventTask(NPT_HttpRequest* request,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_DeviceDataReference& device,
+ PLT_Service* service,
+ void* userdata = NULL);
+ ~PLT_CtrlPointSubscribeEventTask() override;
+
+protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) override;
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ PLT_Service* m_Service;
+ PLT_DeviceDataReference m_Device; // force to keep a reference to device owning m_Service
+ void* m_Userdata;
+};
+
+#endif /* _PLT_CONTROL_POINT_TASK_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.cpp b/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.cpp
new file mode 100644
index 0000000..6138007
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.cpp
@@ -0,0 +1,169 @@
+/*****************************************************************
+|
+| Platinum - Datagram Stream
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDatagramStream.h"
+#include "NptLogging.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.inputdatagramstream")
+
+/*----------------------------------------------------------------------
+| PLT_InputDatagramStream::PLT_InputDatagramStream
++---------------------------------------------------------------------*/
+PLT_InputDatagramStream::PLT_InputDatagramStream(NPT_UdpSocket* socket,
+ NPT_Size buffer_size) :
+ m_Socket(socket),
+ m_BufferOffset(0)
+{
+ m_Buffer.SetBufferSize(buffer_size);
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputDatagramStream::~PLT_InputDatagramStream
++---------------------------------------------------------------------*/
+PLT_InputDatagramStream::~PLT_InputDatagramStream()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputDatagramStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputDatagramStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read /*= 0*/)
+{
+ NPT_Result res = NPT_SUCCESS;
+
+ if (bytes_read) *bytes_read = 0;
+
+ // always try to read from socket if needed even if bytes_to_read is 0
+ if (m_Buffer.GetDataSize() == 0) {
+ // read data into it now
+ NPT_SocketAddress addr;
+ res = m_Socket->Receive(m_Buffer, &addr);
+
+ // update info
+ m_Socket->GetInfo(m_Info);
+ m_Info.remote_address = addr;
+
+ NPT_LOG_FINE_1("PLT_InputDatagramStream received %d", m_Buffer.GetDataSize());
+ }
+
+ if (bytes_to_read == 0) return res;
+
+ if (NPT_SUCCEEDED(res)) {
+ NPT_Size available = m_Buffer.GetDataSize()-(NPT_Size)m_BufferOffset;
+ NPT_Size _bytes_to_read = bytes_to_read<available?bytes_to_read:available;
+ NPT_CopyMemory(buffer, m_Buffer.UseData()+m_BufferOffset, _bytes_to_read);
+ m_BufferOffset += _bytes_to_read;
+
+ if (bytes_read) *bytes_read = _bytes_to_read;
+
+ // read buffer entirety, reset for next time
+ if (m_BufferOffset == m_Buffer.GetDataSize()) {
+ m_BufferOffset = 0;
+ m_Buffer.SetDataSize(0);
+ }
+
+ NPT_LOG_FINE_3("PLT_InputDatagramStream requested %d, consumed %d, left %d", bytes_to_read, _bytes_to_read, m_Buffer.GetDataSize());
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputDatagramStream::GetInfo(NPT_SocketInfo& info)
+{
+ info = m_Info;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::PLT_OutputDatagramStream
++---------------------------------------------------------------------*/
+PLT_OutputDatagramStream::PLT_OutputDatagramStream(NPT_UdpSocket* socket,
+ NPT_Size size,
+ const NPT_SocketAddress* address) :
+ m_Socket(socket),
+ m_Address(address?new NPT_SocketAddress(address->GetIpAddress(), address->GetPort()):NULL)
+{
+ m_Buffer.SetBufferSize(size);
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::~PLT_OutputDatagramStream
++---------------------------------------------------------------------*/
+PLT_OutputDatagramStream::~PLT_OutputDatagramStream()
+{
+ delete m_Address;
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_OutputDatagramStream::Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written /* = NULL */)
+{
+ // calculate if we need to increase the buffer
+ NPT_Int32 overflow = bytes_to_write - m_Buffer.GetBufferSize() + m_Buffer.GetDataSize();
+ if (overflow > 0) {
+ m_Buffer.Reserve(m_Buffer.GetBufferSize() + overflow);
+ }
+ // copy data in place at the end of what we have there already
+ NPT_CopyMemory(m_Buffer.UseData() + m_Buffer.GetDataSize(), buffer, bytes_to_write);
+ m_Buffer.SetDataSize(m_Buffer.GetDataSize() + bytes_to_write);
+
+ if (bytes_written) *bytes_written = bytes_to_write;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::Flush
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_OutputDatagramStream::Flush()
+{
+ // send buffer now
+ m_Socket->Send(m_Buffer, m_Address);
+
+ // reset buffer
+ m_Buffer.SetDataSize(0);
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.h b/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.h
new file mode 100644
index 0000000..86ba105
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.h
@@ -0,0 +1,117 @@
+/*****************************************************************
+|
+| Platinum - Datagram Stream
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ Datagram Input/Output Neptune streams
+ */
+
+#ifndef _PLT_DATAGRAM_H_
+#define _PLT_DATAGRAM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_InputDatagramStream
++---------------------------------------------------------------------*/
+/**
+ The PLT_InputDatagramStream class is a simple buffered input stream
+ used when reading SSDP packets on a UDP socket. It allows to use Neptune
+ HTTP parsing as if reading on a TCP socket.
+ */
+class PLT_InputDatagramStream : public NPT_InputStream
+{
+public:
+ // methods
+ PLT_InputDatagramStream(NPT_UdpSocket* socket,
+ NPT_Size buffer_size = 2000);
+ ~PLT_InputDatagramStream() override;
+
+ NPT_Result GetInfo(NPT_SocketInfo& info);
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = 0) override;
+
+ NPT_Result Seek(NPT_Position offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Skip(NPT_Size offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Tell(NPT_Position& offset) override{ NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result GetSize(NPT_LargeSize& size) override { NPT_COMPILER_UNUSED(size); return NPT_FAILURE; }
+ NPT_Result GetAvailable(NPT_LargeSize& available) override { NPT_COMPILER_UNUSED(available); return NPT_FAILURE; }
+
+protected:
+ NPT_UdpSocket* m_Socket;
+ NPT_SocketInfo m_Info;
+ NPT_DataBuffer m_Buffer;
+ NPT_Position m_BufferOffset;
+};
+
+typedef NPT_Reference<PLT_InputDatagramStream> PLT_InputDatagramStreamReference;
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream
++---------------------------------------------------------------------*/
+/**
+ The PLT_OutputDatagramStream class is a simple buffered output stream
+ used when writing SSDP packets on a UDP socket. It allows to use Neptune
+ HTTP client as if writing on a TCP socket.
+ */
+class PLT_OutputDatagramStream : public NPT_OutputStream
+{
+public:
+ // methods
+ PLT_OutputDatagramStream(NPT_UdpSocket* socket,
+ NPT_Size size = 4096,
+ const NPT_SocketAddress* address = NULL);
+ ~PLT_OutputDatagramStream() override;
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL) override;
+ NPT_Result Flush() override;
+
+ NPT_Result Seek(NPT_Position offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Tell(NPT_Position& offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+
+protected:
+ NPT_UdpSocket* m_Socket;
+ NPT_DataBuffer m_Buffer;
+ NPT_SocketAddress* m_Address;
+};
+
+typedef NPT_Reference<PLT_OutputDatagramStream> PLT_OutputDatagramStreamReference;
+
+#endif /* _PLT_DATAGRAM_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltDeviceData.cpp b/lib/libUPnP/Platinum/Source/Core/PltDeviceData.cpp
new file mode 100644
index 0000000..a092b77
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltDeviceData.cpp
@@ -0,0 +1,830 @@
+/*****************************************************************
+|
+| Platinum - Device Data
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDeviceData.h"
+#include "PltService.h"
+#include "PltUPnP.h"
+#include "PltUtilities.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.devicedata")
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::PLT_DeviceData
++---------------------------------------------------------------------*/
+PLT_DeviceData::PLT_DeviceData(NPT_HttpUrl description_url,
+ const char* uuid,
+ NPT_TimeInterval lease_time,
+ const char* device_type,
+ const char* friendly_name) :
+ m_Manufacturer("Plutinosoft LLC"),
+ m_ManufacturerURL("http://www.plutinosoft.com"),
+ m_UUID(uuid),
+ m_URLDescription(description_url),
+ m_DeviceType(device_type),
+ m_FriendlyName(friendly_name),
+ m_BootId(0),
+ m_NextBootId(0)
+{
+ if (uuid == NULL || strlen(uuid) == 0) {
+ PLT_UPnPMessageHelper::GenerateGUID(m_UUID);
+ }
+
+ SetLeaseTime(lease_time);
+ SetURLBase(m_URLDescription);
+ UpdateConfigId();
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::~PLT_DeviceData
++---------------------------------------------------------------------*/
+PLT_DeviceData::~PLT_DeviceData()
+{
+ Cleanup();
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::Cleanup
++---------------------------------------------------------------------*/
+void
+PLT_DeviceData::Cleanup()
+{
+ m_Services.Apply(NPT_ObjectDeleter<PLT_Service>());
+ m_Services.Clear();
+ m_EmbeddedDevices.Clear();
+ m_Icons.Clear();
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetDescriptionUrl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::SetDescriptionUrl(NPT_HttpUrl& url)
+{
+ NPT_CHECK_FATAL(SetURLBase(url));
+ m_URLDescription = url;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetDescriptionUrl
++---------------------------------------------------------------------*/
+NPT_String
+PLT_DeviceData::GetDescriptionUrl(const char* ip_address)
+{
+ NPT_HttpUrl url = m_URLDescription;
+
+ // replace host with ip address specified
+ if (ip_address) url.SetHost(ip_address);
+ return url.ToString();
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetURLBase
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::SetURLBase(NPT_HttpUrl& url)
+{
+ // only http scheme supported
+ m_URLBase.SetScheme(url.GetScheme());
+
+ // update port if any
+ if (url.GetPort() != NPT_URL_INVALID_PORT) m_URLBase.SetPort(url.GetPort());
+
+ // update host if any
+ if (!url.GetHost().IsEmpty()) m_URLBase.SetHost(url.GetHost());
+
+ // update path
+ NPT_String path = url.GetPath();
+
+ // remove trailing file according to RFC 2396
+ if (!path.EndsWith("/")) {
+ int index = path.ReverseFind('/');
+ if (index < 0) return NPT_FAILURE;
+ path.SetLength(index+1);
+ }
+ m_URLBase.SetPath(path, true);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetURLBase
++---------------------------------------------------------------------*/
+NPT_HttpUrl
+PLT_DeviceData::GetURLBase()
+{
+ return m_URLBase;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::NormalizeURL
++---------------------------------------------------------------------*/
+NPT_HttpUrl
+PLT_DeviceData::NormalizeURL(const NPT_String& url)
+{
+ if (url.StartsWith("http://")) return NPT_HttpUrl(url);
+
+ NPT_HttpUrl norm_url = m_URLBase;
+ if (url.StartsWith("/")) {
+ norm_url.ParsePathPlus(url);
+ } else {
+ norm_url.ParsePathPlus(norm_url.GetPath() + url);
+ }
+
+ return norm_url;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetIconUrl
++---------------------------------------------------------------------*/
+NPT_String
+PLT_DeviceData::GetIconUrl(const char* mimetype,
+ NPT_Int32 maxsize,
+ NPT_Int32 maxdepth)
+{
+ PLT_DeviceIcon icon;
+
+ for (NPT_Cardinal i=0; i<m_Icons.GetItemCount(); i++) {
+ if ((mimetype && m_Icons[i].m_MimeType != mimetype) ||
+ (maxsize && m_Icons[i].m_Width > maxsize) ||
+ (maxsize && m_Icons[i].m_Height > maxsize) ||
+ (maxdepth && m_Icons[i].m_Depth > maxdepth))
+ continue;
+
+ // pick the biggest and better resolution we can
+ if (icon.m_Width >= m_Icons[i].m_Width ||
+ icon.m_Height >= m_Icons[i].m_Height ||
+ icon.m_Depth >= m_Icons[i].m_Depth ||
+ m_Icons[i].m_UrlPath.IsEmpty())
+ continue;
+
+ icon = m_Icons[i];
+ }
+
+ if (icon.m_UrlPath == "") return "";
+
+ return NormalizeURL(icon.m_UrlPath).ToString();
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::UpdateConfigId
++---------------------------------------------------------------------*/
+void
+PLT_DeviceData::UpdateConfigId()
+{
+ NPT_UInt32 nextConfigId = NPT_System::GetRandomInteger() & 0xFFFFFF;
+ if (m_ConfigId == nextConfigId) {
+ // prevent value to underflow
+ nextConfigId>0?--nextConfigId:++nextConfigId;
+ }
+
+ m_ConfigId = nextConfigId;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetBootId
++---------------------------------------------------------------------*/
+void
+PLT_DeviceData::SetBootId(NPT_UInt32 bootId)
+{
+ m_BootId = bootId;
+}
+
+/*----------------------------------------------------------------------
+ | PLT_DeviceData::SetNextBootId
+ +---------------------------------------------------------------------*/
+void
+PLT_DeviceData::SetNextBootId(NPT_UInt32 nextBootId)
+{
+ m_NextBootId = nextBootId;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GenerateNextBootId
++---------------------------------------------------------------------*/
+NPT_UInt32
+PLT_DeviceData::GenerateNextBootId()
+{
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ NPT_UInt32 value = (NPT_UInt32)now.ToSeconds();
+ if (value == m_BootId) ++value;
+ return value;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetLeaseTime
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::SetLeaseTime(NPT_TimeInterval lease_time, NPT_TimeStamp lease_time_last_update /* = 0 */)
+{
+ // Enforce 10 seconds min lease time
+ m_LeaseTime = (lease_time.ToSeconds()>=10)?lease_time:*PLT_Constants::GetInstance().GetDefaultDeviceLease();
+
+ // get current time as last update time if none passed
+ if ((double)lease_time_last_update == 0.) {
+ NPT_System::GetCurrentTimeStamp(lease_time_last_update);
+ }
+ m_LeaseTimeLastUpdate = lease_time_last_update;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetLeaseTimeLastUpdate
++---------------------------------------------------------------------*/
+NPT_TimeStamp
+PLT_DeviceData::GetLeaseTimeLastUpdate()
+{
+ return m_LeaseTimeLastUpdate;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::operator const char*()
++---------------------------------------------------------------------*/
+PLT_DeviceData::operator const char*()
+{
+ NPT_StringOutputStreamReference stream(new NPT_StringOutputStream);
+ stream->WriteString("Device GUID: ");
+ stream->WriteString((const char*)m_UUID);
+
+ stream->WriteString("Device Type: ");
+ stream->WriteString((const char*)m_DeviceType);
+
+ stream->WriteString("Device Base Url: ");
+ stream->WriteString((const char*)GetURLBase().ToString());
+
+ stream->WriteString("Device Friendly Name: ");
+ stream->WriteString((const char*)m_FriendlyName);
+
+ m_Representation = stream->GetString();
+ return m_Representation;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::AddEmbeddedDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::AddEmbeddedDevice(PLT_DeviceDataReference& device)
+{
+ UpdateConfigId();
+
+ device->m_ParentUUID = m_UUID;
+ return m_EmbeddedDevices.Add(device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::RemoveEmbeddedDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::RemoveEmbeddedDevice(PLT_DeviceDataReference& device)
+{
+ for (NPT_Cardinal i=0;
+ i<m_EmbeddedDevices.GetItemCount();
+ i++) {
+ if (m_EmbeddedDevices[i] == device) {
+ UpdateConfigId();
+ return m_EmbeddedDevices.Erase(i);
+ }
+ }
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::AddService
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::AddService(PLT_Service* service)
+{
+ if (service->GetServiceType() == "" ||
+ service->GetServiceID() == "" ||
+ service->GetSCPDURL() == "" ||
+ service->GetControlURL() == "" ||
+ service->GetEventSubURL() == "") {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ UpdateConfigId();
+ return m_Services.Add(service);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::RemoveService
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::RemoveService(PLT_Service* service)
+{
+ for (NPT_Cardinal i=0;
+ i<m_Services.GetItemCount();
+ i++) {
+ if (m_Services[i] == service) {
+ UpdateConfigId();
+ return m_Services.Erase(i);
+ }
+ }
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| PLT_GetDescriptionIterator class
++---------------------------------------------------------------------*/
+template <class T>
+class PLT_GetDescriptionIterator
+{
+public:
+ PLT_GetDescriptionIterator<T>(NPT_XmlElementNode* parent) :
+ m_Parent(parent) {}
+
+ NPT_Result operator()(T& data) const {
+ return data->GetDescription(m_Parent);
+ }
+
+private:
+ NPT_XmlElementNode* m_Parent;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::GetDescription(NPT_XmlElementNode* root, NPT_XmlElementNode** device_out)
+{
+ NPT_XmlElementNode* device = new NPT_XmlElementNode("device");
+ if (device_out) *device_out = device;
+
+ NPT_CHECK_SEVERE(root->AddChild(device));
+
+ // device properties
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "deviceType", m_DeviceType));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "friendlyName", m_FriendlyName));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "manufacturer", m_Manufacturer));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "manufacturerURL", m_ManufacturerURL));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "modelDescription", m_ModelDescription));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "modelName", m_ModelName));
+ if (!m_ModelNumber.IsEmpty()) NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "modelNumber", m_ModelNumber));
+ if (!m_SerialNumber.IsEmpty()) NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "serialNumber", m_SerialNumber));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "modelURL", m_ModelURL)); // moved after modelNumber to go around a bug in UCTT
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "UDN", "uuid:" + m_UUID));
+
+ if (!m_PresentationURL.IsEmpty()) {
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "presentationURL", m_PresentationURL));
+ }
+
+ // Extra info not in UPnP specs
+ NPT_CHECK(OnAddExtraInfo(device));
+
+ // DLNA support
+ if (!m_DlnaDoc.IsEmpty()) {
+ NPT_XmlElementNode* dlnadoc = new NPT_XmlElementNode("dlna", "X_DLNADOC");
+ NPT_CHECK_SEVERE(dlnadoc->SetNamespaceUri("dlna", "urn:schemas-dlna-org:device-1-0"));
+ dlnadoc->AddText(m_DlnaDoc);
+ device->AddChild(dlnadoc);
+ }
+ if (!m_DlnaCap.IsEmpty()) {
+ NPT_XmlElementNode* dlnacap = new NPT_XmlElementNode("dlna", "X_DLNACAP");
+ NPT_CHECK_SEVERE(dlnacap->SetNamespaceUri("dlna", "urn:schemas-dlna-org:device-1-0"));
+ dlnacap->AddText(m_DlnaCap);
+ device->AddChild(dlnacap);
+ }
+
+ // icons
+ if (m_Icons.GetItemCount()) {
+ NPT_XmlElementNode* icons = new NPT_XmlElementNode("iconList");
+ NPT_CHECK_SEVERE(device->AddChild(icons));
+ for (NPT_Cardinal i=0; i<m_Icons.GetItemCount(); i++) {
+ NPT_XmlElementNode* icon = new NPT_XmlElementNode("icon");
+ NPT_CHECK_SEVERE(icons->AddChild(icon));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "mimetype", m_Icons[i].m_MimeType));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "width", NPT_String::FromInteger(m_Icons[i].m_Width)));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "height", NPT_String::FromInteger(m_Icons[i].m_Height)));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "depth", NPT_String::FromInteger(m_Icons[i].m_Depth)));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "url", m_Icons[i].m_UrlPath));
+ }
+ }
+
+ // services
+ NPT_XmlElementNode* services = new NPT_XmlElementNode("serviceList");
+ NPT_CHECK_SEVERE(device->AddChild(services));
+ NPT_CHECK_SEVERE(m_Services.ApplyUntil(PLT_GetDescriptionIterator<PLT_Service*>(services),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)));
+
+ // PS3 support
+ if (!m_AggregationFlags.IsEmpty()) {
+ NPT_XmlElementNode* aggr = new NPT_XmlElementNode("av", "aggregationFlags");
+ NPT_CHECK_SEVERE(aggr->SetNamespaceUri("av", "urn:schemas-sonycom:av"));
+ aggr->AddText(m_AggregationFlags);
+ device->AddChild(aggr);
+ }
+
+ // embedded devices
+ if (m_EmbeddedDevices.GetItemCount()) {
+ NPT_XmlElementNode* deviceList = new NPT_XmlElementNode("deviceList");
+ NPT_CHECK_SEVERE(device->AddChild(deviceList));
+
+ NPT_CHECK_SEVERE(m_EmbeddedDevices.ApplyUntil(
+ PLT_GetDescriptionIterator<PLT_DeviceDataReference>(deviceList),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::GetDescription(NPT_String& desc)
+{
+ NPT_Result res;
+ NPT_XmlElementNode* spec = NULL;
+ NPT_XmlElementNode* root = new NPT_XmlElementNode("root");
+
+ NPT_CHECK_LABEL_SEVERE(res = root->SetNamespaceUri("", "urn:schemas-upnp-org:device-1-0"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = root->SetNamespaceUri("dlna", "urn:schemas-dlna-org:device-1-0"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = root->SetAttribute("", "configId", NPT_String::FromInteger(m_ConfigId)), cleanup);
+
+ // add spec version
+ spec = new NPT_XmlElementNode("specVersion");
+ NPT_CHECK_LABEL_SEVERE(res = root->AddChild(spec), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(spec, "major", "1"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(spec, "minor", "1"), cleanup);
+
+ // get device xml
+ NPT_CHECK_LABEL_SEVERE(res = GetDescription(root), cleanup);
+
+ // serialize node
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::Serialize(*root, desc, true, 2), cleanup);
+
+cleanup:
+ delete root;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::SetDescription(PLT_DeviceDataReference& root_device,
+ NPT_TimeInterval leasetime,
+ NPT_HttpUrl description_url,
+ const char* description,
+ const NPT_HttpRequestContext& context)
+{
+ NPT_XmlParser parser;
+ NPT_XmlNode* tree = NULL;
+ NPT_Result res;
+ NPT_XmlElementNode* root = NULL;
+ NPT_String URLBase;
+ NPT_String configId;
+
+ // create new device if none passed
+ if (root_device.IsNull()) {
+ root_device = new PLT_DeviceData(description_url, "", leasetime);
+ }
+
+ res = parser.Parse(description, tree);
+ NPT_CHECK_LABEL_SEVERE(res, cleanup);
+
+ root = tree->AsElementNode();
+ if (!root ||
+ root->GetTag() != "root" ||
+ !root->GetNamespace() ||
+ *root->GetNamespace() != "urn:schemas-upnp-org:device-1-0") {
+ NPT_LOG_INFO_1("root namespace is invalid: %s",
+ (root&&root->GetNamespace())?root->GetNamespace()->GetChars():"null");
+ NPT_CHECK_LABEL_SEVERE(NPT_FAILURE, cleanup);
+ }
+
+ // look for optional URLBase element
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetChildText(root, "URLBase", URLBase))) {
+ NPT_HttpUrl url(URLBase);
+ // Some devices like Connect360 try to be funny - not so
+ if (url.GetHost().ToLowercase() == "localhost" ||
+ url.GetHost().ToLowercase() == "127.0.0.1") {
+ url.SetHost(context.GetRemoteAddress().GetIpAddress().ToString());
+ }
+ root_device->SetURLBase(url);
+ } else {
+ // No URLBase, derive from description url
+ root_device->SetURLBase(description_url);
+ }
+
+ // at least one root device child element is required
+ NPT_XmlElementNode* device;
+ if (!(device = PLT_XmlHelper::GetChild(root, "device"))) {
+ NPT_CHECK_LABEL_SEVERE(NPT_FAILURE, cleanup);
+ }
+
+ res = SetDescriptionDevice(root_device, device, context);
+
+ // reset configId if and set it back from root attribute
+ root_device->m_ConfigId = 0;
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(root, "configId", configId))) {
+ NPT_UInt32 value;
+ if (NPT_SUCCEEDED(configId.ToInteger32(value))) {
+ root_device->m_ConfigId = value;
+ }
+ }
+
+cleanup:
+ // delete the tree
+ delete tree;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetDescriptionDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::SetDescriptionDevice(PLT_DeviceDataReference& device,
+ NPT_XmlElementNode* device_node,
+ const NPT_HttpRequestContext& context)
+{
+ NPT_Result res;
+
+ device->m_LocalIfaceIp = context.GetLocalAddress().GetIpAddress();
+
+ NPT_CHECK_SEVERE(PLT_XmlHelper::GetChildText(device_node, "deviceType", device->m_DeviceType));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::GetChildText(device_node, "UDN", device->m_UUID));
+
+ // remove uuid: prefix
+ if (device->m_UUID.StartsWith("uuid:")) {
+ device->m_UUID = ((const char*)device->m_UUID)+5;
+ }
+
+ // optional attributes
+ PLT_XmlHelper::GetChildText(device_node, "friendlyName", device->m_FriendlyName);
+ PLT_XmlHelper::GetChildText(device_node, "manufacturer", device->m_Manufacturer);
+ PLT_XmlHelper::GetChildText(device_node, "manufacturerURL", device->m_ManufacturerURL);
+ PLT_XmlHelper::GetChildText(device_node, "modelDescription", device->m_ModelDescription);
+ PLT_XmlHelper::GetChildText(device_node, "modelName", device->m_ModelName);
+ PLT_XmlHelper::GetChildText(device_node, "modelURL", device->m_ModelURL);
+ PLT_XmlHelper::GetChildText(device_node, "modelNumber", device->m_ModelNumber);
+ PLT_XmlHelper::GetChildText(device_node, "serialNumber", device->m_SerialNumber);
+ PLT_XmlHelper::GetChildText(device_node, "presentationURL", device->m_PresentationURL);
+
+ // enumerate icons
+ NPT_XmlElementNode* iconList = PLT_XmlHelper::GetChild(device_node, "iconList");
+ if (iconList) {
+ NPT_Array<NPT_XmlElementNode*> icons;
+ PLT_XmlHelper::GetChildren(iconList, icons, "icon");
+
+ for (NPT_Cardinal k=0 ; k<icons.GetItemCount(); k++) {
+ PLT_DeviceIcon icon;
+ NPT_String integer, height, depth;
+
+ PLT_XmlHelper::GetChildText(icons[k], "mimetype", icon.m_MimeType);
+ PLT_XmlHelper::GetChildText(icons[k], "url", icon.m_UrlPath);
+
+ if(NPT_SUCCEEDED(PLT_XmlHelper::GetChildText(icons[k], "width", integer)))
+ NPT_ParseInteger32(integer, icon.m_Width);
+ if(NPT_SUCCEEDED(PLT_XmlHelper::GetChildText(icons[k], "height", integer)))
+ NPT_ParseInteger32(integer, icon.m_Height);
+ if(NPT_SUCCEEDED(PLT_XmlHelper::GetChildText(icons[k], "depth", integer)))
+ NPT_ParseInteger32(integer, icon.m_Depth);
+
+ device->m_Icons.Add(icon);
+ }
+ }
+
+ // enumerate device services
+ NPT_XmlElementNode* serviceList = PLT_XmlHelper::GetChild(device_node, "serviceList");
+ if (serviceList) {
+ NPT_Array<NPT_XmlElementNode*> services;
+ PLT_XmlHelper::GetChildren(serviceList, services, "service");
+ for( int k = 0 ; k < (int)services.GetItemCount(); k++) {
+ NPT_String type, id, url;
+ PLT_XmlHelper::GetChildText(services[k], "serviceType", type);
+ PLT_XmlHelper::GetChildText(services[k], "serviceId", id);
+ PLT_Service* service = new PLT_Service(device.AsPointer(), type, id, NULL);
+
+ PLT_XmlHelper::GetChildText(services[k], "SCPDURL", url);
+ service->SetSCPDURL(url);
+
+ PLT_XmlHelper::GetChildText(services[k], "controlURL", url);
+ service->SetControlURL(url);
+
+ PLT_XmlHelper::GetChildText(services[k], "eventSubURL", url);
+ service->SetEventSubURL(url);
+
+ if (NPT_FAILED(res = device->AddService(service))) {
+ delete service;
+ return res;
+ }
+ }
+ }
+
+ // enumerate embedded devices
+ NPT_XmlElementNode* deviceList = PLT_XmlHelper::GetChild(device_node, "deviceList");
+ if (deviceList) {
+ NPT_Array<NPT_XmlElementNode*> devices;
+ PLT_XmlHelper::GetChildren(deviceList, devices, "device");
+ for (int k = 0; k<(int)devices.GetItemCount(); k++) {
+ // create an embedded device with same url base and leasetime as parent
+ PLT_DeviceDataReference embedded_device(new PLT_DeviceData(device->m_URLDescription, "", device->m_LeaseTime));
+ NPT_CHECK_SEVERE(PLT_DeviceData::SetDescriptionDevice(embedded_device, devices[k], context));
+ device->AddEmbeddedDevice(embedded_device);
+ }
+ }
+
+ // TODO: Parse extra DLNA stuff
+
+ return NPT_SUCCESS;
+}
+
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindEmbeddedDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindEmbeddedDevice(const char* uuid,
+ PLT_DeviceDataReference& device)
+{
+ NPT_Result res = NPT_ContainerFind(m_EmbeddedDevices,
+ PLT_DeviceDataFinder(uuid),
+ device);
+ if (NPT_SUCCEEDED(res)) return res;
+
+ for (int i=0; i<(int)m_EmbeddedDevices.GetItemCount(); i++) {
+ res = m_EmbeddedDevices[i]->FindEmbeddedDevice(
+ uuid,
+ device);
+ if (NPT_SUCCEEDED(res)) return res;
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindEmbeddedDeviceByType
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindEmbeddedDeviceByType(const char* type,
+ PLT_DeviceDataReference& device)
+{
+ NPT_Result res = NPT_ContainerFind(m_EmbeddedDevices,
+ PLT_DeviceDataFinderByType(type),
+ device);
+ if (NPT_SUCCEEDED(res)) return res;
+
+ for (int i=0; i<(int)m_EmbeddedDevices.GetItemCount(); i++) {
+ res = m_EmbeddedDevices[i]->FindEmbeddedDeviceByType(
+ type,
+ device);
+ if (NPT_SUCCEEDED(res)) return res;
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceById
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceById(const char* id, PLT_Service*& service)
+{
+ // do not try to find it within embedded devices, since different
+ // embedded devices could have an identical service
+ return NPT_ContainerFind(m_Services,
+ PLT_ServiceIDFinder(id),
+ service);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceByType
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceByType(const char* type, PLT_Service*& service)
+{
+ // do not try to find it within embedded devices, since different
+ // embedded devices could have an identical service
+ return NPT_ContainerFind(m_Services,
+ PLT_ServiceTypeFinder(type),
+ service);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceByName
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceByName(const char* name, PLT_Service*& service)
+{
+ // do not try to find it within embedded devices, since different
+ // embedded devices could have an identical service
+ return NPT_ContainerFind(m_Services,
+ PLT_ServiceNameFinder(name),
+ service);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceBySCPDURL
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceBySCPDURL(const char* url,
+ PLT_Service*& service,
+ bool recursive /* = false */)
+{
+ NPT_Result res = NPT_ContainerFind(
+ m_Services,
+ PLT_ServiceSCPDURLFinder(url),
+ service);
+ if (NPT_SUCCEEDED(res)) return res;
+
+ if (recursive) {
+ for (int i=0; i<(int)m_EmbeddedDevices.GetItemCount(); i++) {
+ res = m_EmbeddedDevices[i]->FindServiceBySCPDURL(
+ url,
+ service,
+ recursive);
+ if (NPT_SUCCEEDED(res)) return res;
+ }
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceByControlURL
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceByControlURL(const char* url,
+ PLT_Service*& service,
+ bool recursive /* = false */)
+{
+ NPT_Result res = NPT_ContainerFind(m_Services,
+ PLT_ServiceControlURLFinder(url),
+ service);
+ if (NPT_SUCCEEDED(res)) return res;
+
+ if (recursive) {
+ for (int i=0; i<(int)m_EmbeddedDevices.GetItemCount(); i++) {
+ res = m_EmbeddedDevices[i]->FindServiceByControlURL(
+ url,
+ service,
+ recursive);
+ if (NPT_SUCCEEDED(res)) return res;
+ }
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceByEventSubURL
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceByEventSubURL(const char* url,
+ PLT_Service*& service,
+ bool recursive /* = false */)
+{
+ NPT_Result res = NPT_ContainerFind(m_Services,
+ PLT_ServiceEventSubURLFinder(url),
+ service);
+ if (NPT_SUCCEEDED(res)) return res;
+
+ if (recursive) {
+ for (int i=0; i<(int)m_EmbeddedDevices.GetItemCount(); i++) {
+ res = m_EmbeddedDevices[i]->FindServiceByEventSubURL(
+ url,
+ service,
+ recursive);
+ if (NPT_SUCCEEDED(res)) return res;
+ }
+ }
+
+ return NPT_FAILURE;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltDeviceData.h b/lib/libUPnP/Platinum/Source/Core/PltDeviceData.h
new file mode 100644
index 0000000..364ede7
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltDeviceData.h
@@ -0,0 +1,260 @@
+/*****************************************************************
+|
+| Platinum - Device Data
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP Device information
+ */
+
+#ifndef _PLT_DEVICE_DATA_H_
+#define _PLT_DEVICE_DATA_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltConstants.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Service;
+class PLT_DeviceData;
+
+typedef NPT_Reference<PLT_DeviceData> PLT_DeviceDataReference;
+typedef NPT_List<PLT_DeviceDataReference> PLT_DeviceDataReferenceList;
+
+/*----------------------------------------------------------------------
+| PLT_DeviceIcon class
++---------------------------------------------------------------------*/
+/**
+ The PLT_DeviceIcon class represents a given instance of a UPnP device icon.
+ */
+class PLT_DeviceIcon
+{
+public:
+ PLT_DeviceIcon(const char* mimetype = "",
+ NPT_Int32 width = 0,
+ NPT_Int32 height = 0,
+ NPT_Int32 depth = 0,
+ const char* urlpath = "") :
+ m_MimeType(mimetype),
+ m_Width(width),
+ m_Height(height),
+ m_Depth(depth),
+ m_UrlPath(urlpath) {}
+ virtual ~PLT_DeviceIcon() {}
+
+ NPT_String m_MimeType;
+ NPT_Int32 m_Width;
+ NPT_Int32 m_Height;
+ NPT_Int32 m_Depth;
+ NPT_String m_UrlPath;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData class
++---------------------------------------------------------------------*/
+/**
+ The PLT_DeviceData class holds information about a device being advertised or
+ found by a control point. It maintains a list of services and
+ embedded devices if any.
+ */
+class PLT_DeviceData
+{
+public:
+ PLT_DeviceData(
+ NPT_HttpUrl description_url = NPT_HttpUrl(NULL, 0, "/description.xml"),
+ const char* uuid = "",
+ NPT_TimeInterval lease_time = *PLT_Constants::GetInstance().GetDefaultDeviceLease(),
+ const char* device_type = "",
+ const char* friendly_name = "");
+
+ /* methods */
+ virtual NPT_Result GetDescription(NPT_String& desc);
+ virtual NPT_String GetDescriptionUrl(const char* ip_address = NULL);
+ virtual NPT_HttpUrl GetURLBase();
+ virtual NPT_HttpUrl NormalizeURL(const NPT_String& url);
+ virtual NPT_Result GetDescription(NPT_XmlElementNode* parent, NPT_XmlElementNode** device = NULL);
+ virtual NPT_String GetIconUrl(const char* mimetype = NULL, NPT_Int32 maxsize = 0, NPT_Int32 maxdepth = 0);
+
+ bool IsRoot() { return m_ParentUUID.IsEmpty(); }
+ const NPT_TimeInterval& GetLeaseTime() const { return m_LeaseTime; }
+ const NPT_String& GetUUID() const { return m_UUID; }
+ const NPT_String& GetFriendlyName() const { return m_FriendlyName; }
+ const NPT_String& GetType() const { return m_DeviceType; }
+ const NPT_String& GetModelDescription() const { return m_ModelDescription; }
+ const NPT_String& GetParentUUID() const { return m_ParentUUID; }
+ const NPT_IpAddress& GetLocalIP() const { return m_LocalIfaceIp; }
+
+ const NPT_Array<PLT_Service*>& GetServices() const { return m_Services; }
+ const NPT_Array<PLT_DeviceDataReference>& GetEmbeddedDevices() const { return m_EmbeddedDevices; }
+
+ NPT_Result FindEmbeddedDevice(const char* uuid, PLT_DeviceDataReference& device);
+ NPT_Result FindEmbeddedDeviceByType(const char* type, PLT_DeviceDataReference& device);
+ NPT_Result FindServiceById(const char* id, PLT_Service*& service);
+ NPT_Result FindServiceByType(const char* type, PLT_Service*& service);
+ NPT_Result FindServiceByName(const char* name, PLT_Service*& service);
+ NPT_Result FindServiceBySCPDURL(const char* url, PLT_Service*& service, bool recursive = false);
+ NPT_Result FindServiceByControlURL(const char* url, PLT_Service*& service, bool recursive = false);
+ NPT_Result FindServiceByEventSubURL(const char* url, PLT_Service*& service, bool recursive = false);
+
+ /* called by PLT_Device subclasses */
+ NPT_Result AddEmbeddedDevice(PLT_DeviceDataReference& device);
+ NPT_Result RemoveEmbeddedDevice(PLT_DeviceDataReference& device);
+ NPT_Result AddService(PLT_Service* service);
+ NPT_Result RemoveService(PLT_Service* service);
+
+ /* BOOTID UPnP 1/1 */
+ void SetBootId(NPT_UInt32 bootId);
+ void SetNextBootId(NPT_UInt32 nextBootId);
+ NPT_UInt32 GenerateNextBootId();
+
+ operator const char* ();
+
+protected:
+ virtual ~PLT_DeviceData();
+
+ virtual void Cleanup();
+ virtual NPT_Result OnAddExtraInfo(NPT_XmlElementNode* /*device_node*/) { return NPT_SUCCESS; }
+
+
+private:
+ /* called by PLT_CtrlPoint when an existing device location is updated */
+ NPT_Result SetDescriptionUrl(NPT_HttpUrl& url);
+ NPT_Result SetLeaseTime(NPT_TimeInterval lease_time, NPT_TimeStamp lease_time_last_update = 0.);
+ NPT_Result SetURLBase(NPT_HttpUrl& url_base);
+ NPT_TimeStamp GetLeaseTimeLastUpdate();
+ void UpdateConfigId();
+
+ /* class methods */
+ static NPT_Result SetDescription(PLT_DeviceDataReference& root_device,
+ NPT_TimeInterval leasetime,
+ NPT_HttpUrl description_url,
+ const char* description,
+ const NPT_HttpRequestContext& context);
+ static NPT_Result SetDescriptionDevice(PLT_DeviceDataReference& device,
+ NPT_XmlElementNode* device_node,
+ const NPT_HttpRequestContext& context);
+
+public:
+ NPT_String m_Manufacturer;
+ NPT_String m_ManufacturerURL;
+ NPT_String m_ModelDescription;
+ NPT_String m_ModelName;
+ NPT_String m_ModelNumber;
+ NPT_String m_ModelURL;
+ NPT_String m_SerialNumber;
+ NPT_String m_UPC;
+ NPT_String m_PresentationURL;
+ NPT_String m_DlnaDoc;
+ NPT_String m_DlnaCap;
+ NPT_String m_AggregationFlags;
+
+protected:
+ friend class NPT_Reference<PLT_DeviceData>;
+ friend class PLT_CtrlPoint;
+ friend class PLT_DeviceReadyIterator;
+ friend class PLT_DeviceHost;
+
+ //members
+ NPT_String m_ParentUUID;
+ NPT_String m_UUID;
+ NPT_HttpUrl m_URLDescription;
+ NPT_HttpUrl m_URLBase;
+ NPT_String m_DeviceType;
+ NPT_String m_FriendlyName;
+ NPT_TimeInterval m_LeaseTime;
+ NPT_TimeStamp m_LeaseTimeLastUpdate;
+ NPT_Array<PLT_Service*> m_Services;
+ NPT_Array<PLT_DeviceDataReference> m_EmbeddedDevices;
+ NPT_Array<PLT_DeviceIcon> m_Icons;
+
+ /* IP address of interface used when retrieving device description.
+ We need the info for the control point subscription callback */
+ NPT_IpAddress m_LocalIfaceIp;
+ NPT_String m_Representation;
+
+private:
+ NPT_UInt32 m_BootId;
+ NPT_UInt32 m_NextBootId;
+ NPT_UInt32 m_ConfigId;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceDataFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_DeviceDataFinder class returns a PLT_DeviceData instance given
+ a device UUID.
+ */
+class PLT_DeviceDataFinder
+{
+public:
+ // methods
+ PLT_DeviceDataFinder(const char* uuid) : m_UUID(uuid) {}
+ virtual ~PLT_DeviceDataFinder() {}
+
+ bool operator()(const PLT_DeviceDataReference& data) const {
+ return data->GetUUID().Compare(m_UUID, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_UUID;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceDataFinderByType
++---------------------------------------------------------------------*/
+/**
+ The PLT_DeviceDataFinderByType class returns a PLT_DeviceData instance
+ given a device type.
+ */
+class PLT_DeviceDataFinderByType
+{
+public:
+ // methods
+ PLT_DeviceDataFinderByType(const char* type) : m_Type(type) {}
+ virtual ~PLT_DeviceDataFinderByType() {}
+
+ bool operator()(const PLT_DeviceDataReference& data) const {
+ return data->GetType().Compare(m_Type, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Type;
+};
+
+#endif /* _PLT_DEVICE_DATA_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp
new file mode 100644
index 0000000..6f5f09f
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp
@@ -0,0 +1,953 @@
+/*****************************************************************
+|
+| Platinum - Device Host
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltService.h"
+#include "PltDeviceHost.h"
+#include "PltUPnP.h"
+#include "PltUtilities.h"
+#include "PltSsdp.h"
+#include "PltHttpServer.h"
+#include "PltVersion.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.devicehost")
+
+/*----------------------------------------------------------------------
+| externals
++---------------------------------------------------------------------*/
+extern NPT_UInt8 Platinum_120x120_jpg[16096];
+extern NPT_UInt8 Platinum_120x120_png[26577];
+extern NPT_UInt8 Platinum_48x48_jpg[3041];
+extern NPT_UInt8 Platinum_48x48_png[4681];
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::PLT_DeviceHost
++---------------------------------------------------------------------*/
+PLT_DeviceHost::PLT_DeviceHost(const char* description_path /* = "/" */,
+ const char* uuid /* = "" */,
+ const char* device_type /* = "" */,
+ const char* friendly_name /* = "" */,
+ bool show_ip /* = false */,
+ NPT_UInt16 port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_DeviceData(NPT_HttpUrl(NULL, 0, description_path),
+ uuid,
+ *PLT_Constants::GetInstance().GetDefaultDeviceLease(),
+ device_type,
+ friendly_name),
+ m_TaskManager(NULL),
+ m_HttpServer(NULL),
+ m_ExtraBroascast(false),
+ m_Port(port),
+ m_PortRebind(port_rebind),
+ m_ByeByeFirst(true),
+ m_Started(false)
+{
+ if (show_ip) {
+ NPT_List<NPT_IpAddress> ips;
+ PLT_UPnPMessageHelper::GetIPAddresses(ips);
+ if (ips.GetItemCount()) {
+ m_FriendlyName += " (" + ips.GetFirstItem()->ToString() + ")";
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::~PLT_DeviceHost
++---------------------------------------------------------------------*/
+PLT_DeviceHost::~PLT_DeviceHost()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::AddIcon
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::AddIcon(const PLT_DeviceIcon& icon,
+ const char* fileroot,
+ const char* urlroot /* = "/" */)
+{
+ // verify the url of the icon starts with the url root
+ if (!icon.m_UrlPath.StartsWith(urlroot)) return NPT_ERROR_INVALID_PARAMETERS;
+
+ NPT_HttpFileRequestHandler* icon_handler = new NPT_HttpFileRequestHandler(urlroot, fileroot);
+ m_HttpServer->AddRequestHandler(icon_handler, icon.m_UrlPath, false, true);
+ return m_Icons.Add(icon);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::AddIcon
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::AddIcon(const PLT_DeviceIcon& icon,
+ const void* data,
+ NPT_Size size,
+ bool copy /* = true */)
+{
+ NPT_HttpStaticRequestHandler* icon_handler =
+ new NPT_HttpStaticRequestHandler(
+ data,
+ size,
+ icon.m_MimeType,
+ copy);
+ m_HttpServer->AddRequestHandler(icon_handler, icon.m_UrlPath, false, true);
+ return m_Icons.Add(icon);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::SetupIcons
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::SetupIcons()
+{
+ /*if (m_Icons.GetItemCount() == 0) {
+ AddIcon(
+ PLT_DeviceIcon("image/jpeg", 120, 120, 24, "/images/platinum-120x120.jpg"),
+ Platinum_120x120_jpg, sizeof(Platinum_120x120_jpg), false);
+ AddIcon(
+ PLT_DeviceIcon("image/jpeg", 48, 48, 24, "/images/platinum-48x48.jpg"),
+ Platinum_48x48_jpg, sizeof(Platinum_48x48_jpg), false);
+ AddIcon(
+ PLT_DeviceIcon("image/png", 120, 120, 24, "/images/platinum-120x120.png"),
+ Platinum_120x120_png, sizeof(Platinum_120x120_png), false);
+ AddIcon(
+ PLT_DeviceIcon("image/png", 48, 48, 24, "/images/platinum-48x48.png"),
+ Platinum_48x48_png, sizeof(Platinum_48x48_png), false);
+ }*/
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::SetupDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::SetupDevice()
+{
+ NPT_CHECK_FATAL(SetupServices());
+ NPT_CHECK_WARNING(SetupIcons());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::Start(PLT_SsdpListenTask* task)
+{
+ NPT_Result result;
+
+ if (m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ // setup
+ m_TaskManager = new PLT_TaskManager();
+ m_HttpServer = new PLT_HttpServer(NPT_IpAddress::Any, m_Port, m_PortRebind, 100); // limit to 100 clients max
+ if (NPT_FAILED(result = m_HttpServer->Start())) {
+ m_TaskManager = NULL;
+ m_HttpServer = NULL;
+ NPT_CHECK_FATAL(result);
+ }
+
+ // read back assigned port in case we passed 0 to randomly select one
+ m_Port = m_HttpServer->GetPort();
+ m_URLDescription.SetPort(m_Port);
+
+ // callback to initialize the device
+ if (NPT_FAILED(result = SetupDevice())) {
+ m_TaskManager = NULL;
+ m_HttpServer = NULL;
+ NPT_CHECK_FATAL(result);
+ }
+
+ // all other requests including description document
+ // and service control are dynamically handled
+ m_HttpServer->AddRequestHandler(new PLT_HttpRequestHandler(this), "/", true, true);
+
+ // we should not advertise right away
+ // spec says randomly less than 100ms
+ NPT_TimeInterval delay(((NPT_Int64)NPT_System::GetRandomInteger()%100)*1000000);
+
+ // calculate when we should send another announcement
+ // we announce a bit before half way through leasetime to make sure
+ // clients don't expire us.
+ NPT_Size leaseTime = (NPT_Size)GetLeaseTime().ToSeconds();
+ NPT_TimeInterval repeat;
+ repeat.SetSeconds(leaseTime?(int)((leaseTime >> 1) - 10):30);
+
+ PLT_ThreadTask* announce_task = new PLT_SsdpDeviceAnnounceTask(
+ this,
+ repeat,
+ m_ByeByeFirst,
+ m_ExtraBroascast);
+ m_TaskManager->StartTask(announce_task, &delay);
+
+ // register ourselves as a listener for SSDP search requests
+ task->AddListener(this);
+
+ m_Started = true;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::Stop(PLT_SsdpListenTask* task)
+{
+ if (!m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ // mark immediately we're stopping
+ m_Started = false;
+
+ // unregister ourselves as a listener for ssdp requests
+ task->RemoveListener(this);
+
+ // remove all our running tasks
+ m_TaskManager->Abort();
+
+ // stop our internal http server
+ m_HttpServer->Stop();
+
+ // announce we're leaving
+ NPT_List<NPT_NetworkInterface*> if_list;
+ PLT_UPnPMessageHelper::GetNetworkInterfaces(if_list, true);
+ if_list.Apply(PLT_SsdpAnnounceInterfaceIterator(this, PLT_ANNOUNCETYPE_BYEBYE, m_ExtraBroascast));
+ if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+
+ // Cleanup all services and embedded devices
+ PLT_DeviceData::Cleanup();
+
+ m_HttpServer = NULL;
+ m_TaskManager = NULL;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::Announce
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::Announce(PLT_DeviceData* device,
+ NPT_HttpRequest& req,
+ NPT_UdpSocket& socket,
+ PLT_SsdpAnnounceType type)
+{
+ NPT_Result res = NPT_SUCCESS;
+
+ // target address
+ NPT_IpAddress ip;
+ NPT_CHECK_FATAL(ip.ResolveName(req.GetUrl().GetHost()));
+ NPT_SocketAddress addr(ip, req.GetUrl().GetPort());
+
+// // UPnP 1.1 BOOTID.UPNP.ORG header
+// PLT_UPnPMessageHelper::SetBootId(req, device->m_BootId);
+//
+// // UPnP 1.1 CONFIGID.UPNP.ORG header
+// if (device->m_ConfigId > 0) {
+// PLT_UPnPMessageHelper::SetConfigId(req, device->m_ConfigId);
+// }
+
+ // NTS header
+ NPT_String nts;
+ switch (type) {
+ case PLT_ANNOUNCETYPE_ALIVE:
+ nts = "ssdp:alive";
+ PLT_UPnPMessageHelper::SetLeaseTime(req, device->GetLeaseTime());
+ PLT_UPnPMessageHelper::SetServer(req, PLT_HTTP_DEFAULT_SERVER, false);
+ break;
+
+ case PLT_ANNOUNCETYPE_BYEBYE:
+ nts = "ssdp:byebye";
+ break;
+
+ case PLT_ANNOUNCETYPE_UPDATE:
+ nts = "ssdp:update";
+ // update requires valid UPNP 1.1 NEXTBOOTID.UPNP.ORG Header
+ if (device->m_NextBootId == 0) {
+ NPT_CHECK_FATAL(NPT_ERROR_INTERNAL);
+ }
+ PLT_UPnPMessageHelper::SetNextBootId(req, device->m_NextBootId);
+ break;
+
+ default:
+ break;
+ }
+ PLT_UPnPMessageHelper::SetNTS(req, nts);
+
+ NPT_LOG_FINER_3("Sending SSDP NOTIFY (%s) Request to %s (%s)", nts.GetChars(),
+ (const char*)req.GetUrl().ToString(),
+ (const char*)(PLT_UPnPMessageHelper::GetLocation(req)
+ ? PLT_UPnPMessageHelper::GetLocation(req)->GetChars()
+ : ""));
+
+ // upnp:rootdevice
+ if (device->m_ParentUUID.IsEmpty()) {
+ PLT_SsdpSender::SendSsdp(req,
+ NPT_String("uuid:" + device->m_UUID + "::upnp:rootdevice"),
+ "upnp:rootdevice",
+ socket,
+ true,
+ &addr);
+ }
+
+ // on byebye, don't sleep otherwise it hangs when we stop upnp
+ if (type != PLT_ANNOUNCETYPE_BYEBYE) {
+ NPT_System::Sleep(NPT_TimeInterval(PLT_DLNA_SSDP_DELAY));
+ }
+
+ // uuid:device-UUID
+ PLT_SsdpSender::SendSsdp(req,
+ "uuid:" + device->m_UUID,
+ "uuid:" + device->m_UUID,
+ socket,
+ true,
+ &addr);
+
+ // on byebye, don't sleep otherwise it hangs when we stop upnp
+ if (type != PLT_ANNOUNCETYPE_BYEBYE) {
+ NPT_System::Sleep(NPT_TimeInterval(PLT_DLNA_SSDP_DELAY));
+ }
+
+ // uuid:device-UUID::urn:schemas-upnp-org:device:deviceType:ver
+ PLT_SsdpSender::SendSsdp(req,
+ NPT_String("uuid:" + device->m_UUID + "::" + device->m_DeviceType),
+ device->m_DeviceType,
+ socket,
+ true,
+ &addr);
+
+ // on byebye, don't sleep otherwise it hangs when we stop upnp
+ if (type != PLT_ANNOUNCETYPE_BYEBYE) {
+ NPT_System::Sleep(NPT_TimeInterval(PLT_DLNA_SSDP_DELAY));
+ }
+
+ // services
+ for (int i=0; i < (int)device->m_Services.GetItemCount(); i++) {
+ // uuid:device-UUID::urn:schemas-upnp-org:service:serviceType:ver
+ PLT_SsdpSender::SendSsdp(req,
+ NPT_String("uuid:" + device->m_UUID + "::" + device->m_Services[i]->GetServiceType()),
+ device->m_Services[i]->GetServiceType(),
+ socket,
+ true,
+ &addr);
+
+ // on byebye, don't sleep otherwise it hangs when we stop upnp
+ if (type != PLT_ANNOUNCETYPE_BYEBYE) {
+ NPT_System::Sleep(NPT_TimeInterval(PLT_DLNA_SSDP_DELAY));
+ }
+ }
+
+ // embedded devices
+ for (int j=0; j < (int)device->m_EmbeddedDevices.GetItemCount(); j++) {
+ Announce(device->m_EmbeddedDevices[j].AsPointer(),
+ req,
+ socket,
+ type);
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::SetupResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ // get the address of who sent us some data back*/
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String protocol = request.GetProtocol();
+
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINER, "PLT_DeviceHost::SetupResponse:", &request);
+
+ if (method.Compare("POST") == 0) {
+ return ProcessHttpPostRequest(request, context, response);
+ } else if (method.Compare("SUBSCRIBE") == 0 || method.Compare("UNSUBSCRIBE") == 0) {
+ return ProcessHttpSubscriberRequest(request, context, response);
+ } else if (method.Compare("GET") == 0 || method.Compare("HEAD") == 0) {
+ // process SCPD requests
+ PLT_Service* service;
+ if (NPT_SUCCEEDED(FindServiceBySCPDURL(request.GetUrl().ToRequestString(), service, true))) {
+ return ProcessGetSCPD(service, request, context, response);
+ }
+
+ // process Description document requests
+ if (request.GetUrl().GetPath() == m_URLDescription.GetPath()) {
+ return ProcessGetDescription(request, context, response);
+ }
+
+ // process other requests
+ return ProcessHttpGetRequest(request, context, response);
+ }
+
+ response.SetStatus(405, "Bad Request");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessHttpGetRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessHttpGetRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+ NPT_COMPILER_UNUSED(response);
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessGetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessGetDescription(NPT_HttpRequest& /*request*/,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_String doc;
+ NPT_CHECK_FATAL(GetDescription(doc));
+ NPT_LOG_FINEST_2("Returning description to %s: %s",
+ (const char*)context.GetRemoteAddress().GetIpAddress().ToString(),
+ (const char*)doc);
+
+ NPT_HttpEntity* entity;
+ PLT_HttpHelper::SetBody(response, doc, &entity);
+ entity->SetContentType("text/xml; charset=\"utf-8\"");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessGetSCPD
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessGetSCPD(PLT_Service* service,
+ NPT_HttpRequest& /*request*/,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(context);
+ NPT_CHECK_POINTER_FATAL(service);
+
+ NPT_String doc;
+ NPT_CHECK_FATAL(service->GetSCPDXML(doc));
+ NPT_LOG_FINEST_2("Returning SCPD to %s: %s",
+ (const char*)context.GetRemoteAddress().GetIpAddress().ToString(),
+ (const char*)doc);
+
+ NPT_HttpEntity* entity;
+ PLT_HttpHelper::SetBody(response, doc, &entity);
+ entity->SetContentType("text/xml; charset=\"utf-8\"");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessPostRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessHttpPostRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_Result res;
+ NPT_String service_type;
+ NPT_String str;
+ NPT_XmlElementNode* xml = NULL;
+ NPT_String soap_action_header;
+ PLT_Service* service;
+ NPT_XmlElementNode* soap_body;
+ NPT_XmlElementNode* soap_action;
+ PLT_ActionDesc* action_desc;
+ PLT_ActionReference action;
+ NPT_MemoryStreamReference resp(new NPT_MemoryStream);
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String url = request.GetUrl().ToRequestString();
+ NPT_String protocol = request.GetProtocol();
+ NPT_List<NPT_String> components;
+ NPT_String soap_action_name;
+
+#if defined(PLATINUM_UPNP_SPECS_STRICT)
+ const NPT_String* attr;
+#endif
+
+ if (NPT_FAILED(FindServiceByControlURL(url, service, true)))
+ goto bad_request_find_service;
+
+ if (!request.GetHeaders().GetHeaderValue("SOAPAction"))
+ goto bad_request_soap_header_value;
+
+ // extract the soap action name from the header
+ soap_action_header = *request.GetHeaders().GetHeaderValue("SOAPAction");
+ soap_action_header.TrimLeft('"');
+ soap_action_header.TrimRight('"');
+
+ components = soap_action_header.Split("#");
+ if (components.GetItemCount() != 2)
+ goto bad_request_soap_action_header;
+
+ soap_action_name = *components.GetItem(1);
+
+ // read the xml body and parse it
+ if (NPT_FAILED(PLT_HttpHelper::ParseBody(request, xml)))
+ goto bad_request_body_parse_error;
+
+ // check envelope
+ if (xml->GetTag().Compare("Envelope", true))
+ goto bad_request_no_envelope;
+
+#if defined(PLATINUM_UPNP_SPECS_STRICT)
+ // check namespace
+ if (!xml->GetNamespace() || xml->GetNamespace()->Compare("http://schemas.xmlsoap.org/soap/envelope/"))
+ goto bad_request_upnp_not_strict;
+
+ // check encoding
+ attr = xml->GetAttribute("encodingStyle", "http://schemas.xmlsoap.org/soap/envelope/");
+ if (!attr || attr->Compare("http://schemas.xmlsoap.org/soap/encoding/"))
+ goto bad_request_bad_encoding;
+#endif
+
+ // read action
+ soap_body = PLT_XmlHelper::GetChild(xml, "Body");
+ if (soap_body == NULL)
+ goto bad_request_soap_body;
+
+ PLT_XmlHelper::GetChild(soap_body, soap_action);
+ if (soap_action == NULL)
+ goto bad_request_soap_action_body;
+
+ // verify action name is identical to SOAPACTION header*/
+ if (soap_action->GetTag().Compare(soap_action_name, true))
+ goto bad_request_action_mismatch;
+
+ // verify namespace
+ if (!soap_action->GetNamespace() || soap_action->GetNamespace()->Compare(service->GetServiceType()))
+ goto bad_request_bad_namespace;
+
+ // create a buffer for our response body and call the service
+ if ((action_desc = service->FindActionDesc(soap_action_name)) == NULL) {
+ // create a bastard soap response
+ PLT_Action::FormatSoapError(401, "Invalid Action", *resp);
+ goto error;
+ }
+
+ // create a new action object
+ action = new PLT_Action(*action_desc);
+
+ // read all the arguments if any
+ for (NPT_List<NPT_XmlNode*>::Iterator args = soap_action->GetChildren().GetFirstItem();
+ args;
+ args++) {
+ NPT_XmlElementNode* child = (*args)->AsElementNode();
+ if (!child) continue;
+
+ // Total HACK for xbox360 upnp uncompliance!
+ NPT_String name = child->GetTag();
+ if (action_desc->GetName() == "Browse" && name == "ContainerID") {
+ name = "ObjectID";
+ }
+
+ res = action->SetArgumentValue(name, child->GetText() ? child->GetText()->GetChars() : "");
+
+ // test if value was correct
+ if (res == NPT_ERROR_INVALID_PARAMETERS)
+ {
+ action->SetError(701, "Invalid Name");
+ goto error;
+ }
+ }
+
+ // verify all required arguments were passed
+ if (NPT_FAILED(action->VerifyArguments(true))) {
+ action->SetError(402, "Invalid or Missing Args");
+ goto error;
+ }
+
+ NPT_LOG_FINE_2("Processing action \"%s\" from %s",
+ (const char*)action->GetActionDesc().GetName(),
+ (const char*)context.GetRemoteAddress().GetIpAddress().ToString());
+
+ // call the virtual function, it's all good
+ if (NPT_FAILED(OnAction(action, PLT_HttpRequestContext(request, context)))) {
+ goto error;
+ }
+
+ // create the soap response now
+ action->FormatSoapResponse(*resp);
+ goto done;
+
+error:
+ if (!action.IsNull()) {
+ // set the error in case it wasn't done already
+ if (action->GetErrorCode() == 0) {
+ action->SetError(501, "Action Failed");
+ }
+ NPT_LOG_WARNING_3("Error while processing action %s: %d %s",
+ (const char*)action->GetActionDesc().GetName(),
+ action->GetErrorCode(),
+ action->GetError());
+
+ action->FormatSoapResponse(*resp);
+ }
+
+ response.SetStatus(500, "Internal Server Error");
+
+done:
+ NPT_LargeSize resp_body_size;
+ if (NPT_SUCCEEDED(resp->GetAvailable(resp_body_size))) {
+ NPT_HttpEntity* entity;
+ PLT_HttpHelper::SetBody(response,
+ (NPT_InputStreamReference)resp,
+ &entity);
+ entity->SetContentType("text/xml; charset=\"utf-8\"");
+ response.GetHeaders().SetHeader("Ext", ""); // should only be for M-POST but oh well
+ }
+
+ delete xml;
+ return NPT_SUCCESS;
+
+bad_request:
+ // generic 500 now unused
+ response.SetStatus(500, "Bad Request");
+ goto bad_request_end;
+
+bad_request_find_service:
+ response.SetStatus(500, "Bad Request: Service by URL");
+ goto bad_request_end;
+
+bad_request_soap_header_value:
+ response.SetStatus(500, "Bad Request: SOAP Header");
+ goto bad_request_end;
+
+bad_request_soap_action_header:
+ response.SetStatus(500, "Bad Request: SOAP Action in Header");
+ goto bad_request_end;
+
+bad_request_body_parse_error:
+ response.SetStatus(500, "Bad Request: Error Parsing XML Body");
+ goto bad_request_end;
+
+bad_request_no_envelope:
+ response.SetStatus(500, "Bad Request: SOAP Envelope");
+ goto bad_request_end;
+
+#if defined(PLATINUM_UPNP_SPECS_STRICT)
+bad_request_upnp_not_strict:
+ response.SetStatus(500, "Bad Request: SOAP not Strict");
+ goto bad_request_end;
+
+bad_request_bad_encoding:
+ response.SetStatus(500, "Bad Request: SOAP Encoding");
+ goto bad_request_end;
+#endif
+
+bad_request_soap_body:
+ response.SetStatus(500, "Bad Request: SOAP Body");
+ goto bad_request_end;
+
+bad_request_soap_action_body:
+ response.SetStatus(500, "Bad Request: SOAP Action in Body");
+ goto bad_request_end;
+
+bad_request_action_mismatch:
+ response.SetStatus(500, "Bad Request: SOAP Action Mismatch");
+ goto bad_request_end;
+
+bad_request_bad_namespace:
+ response.SetStatus(500, "Bad Request: Bad Namespace");
+ goto bad_request_end;
+
+bad_request_end:
+ delete xml;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessHttpSubscriberRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessHttpSubscriberRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String url = request.GetUrl().ToRequestString();
+ NPT_String protocol = request.GetProtocol();
+
+ const NPT_String* nt = PLT_UPnPMessageHelper::GetNT(request);
+ const NPT_String* callback_urls = PLT_UPnPMessageHelper::GetCallbacks(request);
+ const NPT_String* sid = PLT_UPnPMessageHelper::GetSID(request);
+
+ PLT_Service* service;
+ NPT_CHECK_LABEL_WARNING(FindServiceByEventSubURL(url, service, true), cleanup);
+
+ if (method.Compare("SUBSCRIBE") == 0) {
+ // Do we have a sid ?
+ if (sid) {
+ // make sure we don't have a callback nor a nt
+ if (nt || callback_urls) {
+ goto cleanup;
+ }
+
+ // default lease
+ NPT_Int32 timeout = *PLT_Constants::GetInstance().GetDefaultSubscribeLease().AsPointer();
+
+ // subscription renewed
+ // send the info to the service
+ service->ProcessRenewSubscription(context.GetLocalAddress(),
+ *sid,
+ timeout,
+ response);
+ return NPT_SUCCESS;
+ } else {
+ // new subscription ?
+ // verify nt is present and valid
+ if (!nt || nt->Compare("upnp:event", true)) {
+ response.SetStatus(412, "Precondition failed");
+ return NPT_SUCCESS;
+ }
+ // verify callback is present
+ if (!callback_urls) {
+ response.SetStatus(412, "Precondition failed");
+ return NPT_SUCCESS;
+ }
+
+ // default lease time
+ NPT_Int32 timeout = *PLT_Constants::GetInstance().GetDefaultSubscribeLease().AsPointer();
+
+ // send the info to the service
+ service->ProcessNewSubscription(m_TaskManager,
+ context.GetLocalAddress(),
+ *callback_urls,
+ timeout,
+ response);
+ return NPT_SUCCESS;
+ }
+ } else if (method.Compare("UNSUBSCRIBE") == 0) {
+ // Do we have a sid ?
+ if (sid && sid->GetLength() > 0) {
+ // make sure we don't have a callback nor a nt
+ if (nt || callback_urls) {
+ goto cleanup;
+ }
+
+ // subscription cancelled
+ // send the info to the service
+ service->ProcessCancelSubscription(context.GetLocalAddress(),
+ *sid,
+ response);
+ return NPT_SUCCESS;
+ }
+
+ response.SetStatus(412, "Precondition failed");
+ return NPT_SUCCESS;
+ }
+
+cleanup:
+ response.SetStatus(400, "Bad Request");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::OnSsdpPacket
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::OnSsdpPacket(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ // get the address of who sent us some data back*/
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String url = request.GetUrl().ToRequestString(true);
+ NPT_String protocol = request.GetProtocol();
+ NPT_IpPort remote_port = context.GetRemoteAddress().GetPort();
+ const NPT_String* st = PLT_UPnPMessageHelper::GetST(request);
+
+ if (method.Compare("M-SEARCH") == 0) {
+ NPT_String prefix = NPT_String::Format("PLT_DeviceHost::OnSsdpPacket M-SEARCH for %s from %s:%d",
+ st?st->GetChars():"Unknown",
+ (const char*) ip_address, remote_port);
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINE, prefix, &request);
+
+ /*
+ // DLNA 7.2.3.5 support
+ if (remote_port < 1024 || remote_port == 1900) {
+ NPT_LOG_INFO_2("Ignoring M-SEARCH from %s:%d (invalid source port)",
+ (const char*) ip_address,
+ remote_port);
+ return NPT_FAILURE;
+ }
+ */
+
+ NPT_CHECK_POINTER_SEVERE(st);
+
+ if (url.Compare("*") || protocol.Compare("HTTP/1.1"))
+ return NPT_FAILURE;
+
+ const NPT_String* man = PLT_UPnPMessageHelper::GetMAN(request);
+ if (!man || man->Compare("\"ssdp:discover\"", true))
+ return NPT_FAILURE;
+
+ NPT_UInt32 mx;
+ NPT_CHECK_SEVERE(PLT_UPnPMessageHelper::GetMX(request, mx));
+
+ // create a task to respond to the request
+ NPT_TimeInterval timer((mx==0)?0.:(double)(NPT_System::GetRandomInteger()%(mx>5?5:mx)));
+ PLT_SsdpDeviceSearchResponseTask* task = new PLT_SsdpDeviceSearchResponseTask(this, context.GetRemoteAddress(), *st);
+ m_TaskManager->StartTask(task, &timer);
+ return NPT_SUCCESS;
+ } else {
+ NPT_String prefix = NPT_String::Format("Ignoring %s request from %s:%d",
+ method.GetChars(),
+ (const char*) ip_address, remote_port);
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINE, prefix, &request);
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::SendSsdpSearchResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::SendSsdpSearchResponse(PLT_DeviceData* device,
+ NPT_HttpResponse& response,
+ NPT_UdpSocket& socket,
+ const char* st,
+ const NPT_SocketAddress* addr /* = NULL */)
+{
+ // UPnP 1.1 BOOTID.UPNP.ORG header
+ PLT_UPnPMessageHelper::SetBootId(response, device->m_BootId);
+
+ // UPnP 1.1 CONFIGID.UPNP.ORG header
+ if (device->m_ConfigId > 0) {
+ PLT_UPnPMessageHelper::SetConfigId(response, device->m_ConfigId);
+ }
+
+ // ssdp:all or upnp:rootdevice
+ if (NPT_String::Compare(st, "ssdp:all") == 0 ||
+ NPT_String::Compare(st, "upnp:rootdevice") == 0) {
+
+ if (device->m_ParentUUID.IsEmpty()) {
+ NPT_LOG_FINE_1("Responding to a M-SEARCH request for %s", st);
+
+ // upnp:rootdevice
+ PLT_SsdpSender::SendSsdp(response,
+ NPT_String("uuid:" + device->m_UUID + "::upnp:rootdevice"),
+ "upnp:rootdevice",
+ socket,
+ false,
+ addr);
+ }
+ }
+
+ // uuid:device-UUID
+ if (NPT_String::Compare(st, "ssdp:all") == 0 ||
+ NPT_String::Compare(st, (const char*)("uuid:" + device->m_UUID)) == 0) {
+
+ NPT_LOG_FINE_1("Responding to a M-SEARCH request for %s", st);
+
+ // uuid:device-UUID
+ PLT_SsdpSender::SendSsdp(response,
+ "uuid:" + device->m_UUID,
+ "uuid:" + device->m_UUID,
+ socket,
+ false,
+ addr);
+ }
+
+ // urn:schemas-upnp-org:device:deviceType:ver
+ if (NPT_String::Compare(st, "ssdp:all") == 0 ||
+ NPT_String::Compare(st, (const char*)(device->m_DeviceType)) == 0) {
+
+ NPT_LOG_FINE_1("Responding to a M-SEARCH request for %s", st);
+
+ // uuid:device-UUID::urn:schemas-upnp-org:device:deviceType:ver
+ PLT_SsdpSender::SendSsdp(response,
+ NPT_String("uuid:" + device->m_UUID + "::" + device->m_DeviceType),
+ device->m_DeviceType,
+ socket,
+ false,
+ addr);
+ }
+
+ // services
+ for (int i=0; i < (int)device->m_Services.GetItemCount(); i++) {
+ if (NPT_String::Compare(st, "ssdp:all") == 0 ||
+ NPT_String::Compare(st, (const char*)(device->m_Services[i]->GetServiceType())) == 0) {
+
+ NPT_LOG_FINE_1("Responding to a M-SEARCH request for %s", st);
+
+ // uuid:device-UUID::urn:schemas-upnp-org:service:serviceType:ver
+ PLT_SsdpSender::SendSsdp(response,
+ NPT_String("uuid:" + device->m_UUID + "::" + device->m_Services[i]->GetServiceType()),
+ device->m_Services[i]->GetServiceType(),
+ socket,
+ false,
+ addr);
+ }
+ }
+
+ // embedded devices
+ for (int j=0; j < (int)device->m_EmbeddedDevices.GetItemCount(); j++) {
+ SendSsdpSearchResponse(device->m_EmbeddedDevices[j].AsPointer(),
+ response,
+ socket,
+ st,
+ addr);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::OnAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+ action->SetError(401, "Invalid Action");
+ return NPT_FAILURE;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.h b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.h
new file mode 100644
index 0000000..8cf6118
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.h
@@ -0,0 +1,341 @@
+/*****************************************************************
+|
+| Platinum - Device Host
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP Device
+ */
+
+#ifndef _PLT_DEVICE_HOST_H_
+#define _PLT_DEVICE_HOST_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltDeviceData.h"
+#include "PltSsdp.h"
+#include "PltTaskManager.h"
+#include "PltAction.h"
+#include "PltHttp.h"
+#include "PltHttpServer.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_SsdpDeviceAnnounceTask;
+class PLT_SsdpListenTask;
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost class
++---------------------------------------------------------------------*/
+/**
+ UPnP Device Host.
+ The PLT_DeviceHost class is a base class for implementing a UPnP Device. It handles
+ network announcements and responses to searches from ControlPoints. ControlPoint
+ action invocations are also received and delegated to derived classes. A
+ PLT_DeviceHost also takes care of eventing when services state variables change.
+ */
+class PLT_DeviceHost : public PLT_DeviceData,
+ public PLT_SsdpPacketListener,
+ public NPT_HttpRequestHandler
+{
+public:
+ /**
+ Creates a new instance of UPnP Device Host.
+ @param description_path Relative path for description url
+ @param uuid UPnP device unique id
+ @param device_type UPnP device type
+ @param friendly_name Name advertised for UPnP device
+ @param show_ip Flag to indicate if device IP should be appended to friendly name
+ @param port local port for the device host internal HTTP server, 0 for randomly
+ selected.
+ @param port_rebind Flag to indicate if device host should automatically try to look
+ for another port if failing to choose the one passed.
+ */
+ PLT_DeviceHost(const char* description_path = "/",
+ const char* uuid = "",
+ const char* device_type = "",
+ const char* friendly_name = "",
+ bool show_ip = false,
+ NPT_UInt16 port = 0,
+ bool port_rebind = false);
+ ~PLT_DeviceHost() override;
+
+ virtual void SetExtraBroadcast(bool broadcast) { m_ExtraBroascast = broadcast; }
+
+ /**
+ When a UPnP device comes up, the specifications require that a SSDP bye-bye
+ sequence is sent to force the removal of the device in case it wasn't sent
+ properly during the last shutdown.
+ @param bye_bye_first Boolean to indicate that SSDP bye-bye sequence should
+ be sent first or not.
+ */
+ virtual void SetByeByeFirst(bool bye_bye_first) { m_ByeByeFirst = bye_bye_first; }
+
+ /**
+ Returns the port used by the internal HTTP server for all incoming requests.
+ @return port
+ */
+ virtual NPT_UInt16 GetPort() { return m_Port; };
+
+ /**
+ Sets the lease time.
+ @param lease_time Lease Time
+ */
+ NPT_Result SetLeaseTime(NPT_TimeInterval lease_time) { return PLT_DeviceData::SetLeaseTime(lease_time); }
+
+protected:
+ /**
+ NPT_HttpRequestHandler method for setting up the response of an incoming
+ HTTP request.
+ @param request the request received
+ @param context the context of the request
+ @param response the response to set up
+ */
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+ /**
+ Static method similar to Announce.
+ @param device the device to announce
+ @param request the SSDP pre formatted request
+ @param socket the network socket to use to send the request
+ @param type PLT_SsdpAnnounceType enum if the announce is a SSDP bye-bye, update or alive.
+ */
+ static NPT_Result Announce(PLT_DeviceData* device,
+ NPT_HttpRequest& request,
+ NPT_UdpSocket& socket,
+ PLT_SsdpAnnounceType type);
+ /**
+ Called during SSDP announce. The HTTP request is already configured with
+ the right method and host.
+ @param request the SSDP pre formatted request
+ @param socket the network socket to use to send the request
+ @param type PLT_SsdpAnnounceType enum if the announce is a SSDP bye-bye, update or alive.
+ */
+ NPT_Result Announce(NPT_HttpRequest& request,
+ NPT_UdpSocket& socket,
+ PLT_SsdpAnnounceType type) {
+ return Announce(this, request, socket, type);
+ }
+
+ /**
+ PLT_SsdpPacketListener method called when a M-SEARCH SSDP packet is received.
+ @param request SSDP packet
+ @param context the context of the request
+ */
+ NPT_Result OnSsdpPacket(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context) override;
+
+ /**
+ Static method similar to SendSsdpSearchResponse.
+ @param device the device to announce
+ @param response the SSDP pre formatted response
+ @param socket the network socket to use to send the request
+ @param st the original request search target
+ @param addr the remote address to send the response back to in case the socket
+ is not already connected.
+ */
+ static NPT_Result SendSsdpSearchResponse(PLT_DeviceData* device,
+ NPT_HttpResponse& response,
+ NPT_UdpSocket& socket,
+ const char* st,
+ const NPT_SocketAddress* addr = NULL);
+ /**
+ Called by PLT_SsdpDeviceSearchResponseTask when responding to a M-SEARCH
+ SSDP request.
+ @param response the SSDP pre formatted response
+ @param socket the network socket to use to send the request
+ @param st the original request search target
+ @param addr the remote address to send the response back to in case the socket
+ is not already connected.
+ */
+ virtual NPT_Result SendSsdpSearchResponse(NPT_HttpResponse& response,
+ NPT_UdpSocket& socket,
+ const char* st,
+ const NPT_SocketAddress* addr = NULL) {
+ return SendSsdpSearchResponse(this, response, socket, st, addr);
+ }
+
+public:
+ /**
+ Add UPnP icon information to serve from file system.
+ @param icon the icon information including url path
+ @param fileroot the file system root path
+ @param urlroot the url root path of the icon url to match to fileroot
+ Note: As an exemple, if the icon url path is "/images/icon1.jpg", the fileroot
+ is "/Users/joe/www" and the urlroot is "/", when a request is made for
+ "/images/icon1.jpg", the file is expected to be found at
+ "/Users/joe/www/images/icon1.jpg". If the urlroot were "/images", the file
+ would be expected to be found at "/Users/joe/www/icon1.jpg".
+ */
+ virtual NPT_Result AddIcon(const PLT_DeviceIcon& icon,
+ const char* fileroot,
+ const char* urlroot = "/");
+
+ /**
+ Add UPnP icon information to serve using static image.
+ @param icon the icon information including url path
+ @param data the image data
+ @param size the image data size
+ @param copy boolean to indicate the data should be copied internally
+ */
+ virtual NPT_Result AddIcon(const PLT_DeviceIcon& icon,
+ const void* data,
+ NPT_Size size,
+ bool copy = true);
+
+protected:
+ /**
+ Required method for setting up UPnP services of device host
+ (and any embedded). Called when device starts.
+ */
+ virtual NPT_Result SetupServices() = 0;
+
+ /**
+ Default implementation for registering device icon resources. Override to
+ use different ones. Called when device starts.
+ */
+ virtual NPT_Result SetupIcons();
+
+ /**
+ Default implementation for setting up device host. This calls SetupServices
+ and SetupIcons when device starts.
+ */
+ virtual NPT_Result SetupDevice();
+
+ /**
+ Called by PLT_TaskManager when the device is started.
+ @param task the SSDP listening task to attach to for receiving
+ SSDP M-SEARCH messages.
+ */
+ virtual NPT_Result Start(PLT_SsdpListenTask* task);
+
+ /**
+ Called by PLT_TaskManager when the device is stoped.
+ @param task the SSDP listening task to detach from to stop receiving
+ SSDP M-SEARCH messages.
+ */
+ virtual NPT_Result Stop(PLT_SsdpListenTask* task);
+
+ /**
+ This mehod is called when an action performed by a control point has been
+ received and needs to be answered.
+ @param action the action information to answer
+ @param context the context information including the HTTP request and
+ local and remote socket information (IP & port).
+ */
+ virtual NPT_Result OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+
+ /**
+ This method is called when a control point is requesting the device
+ description.
+ @param request the HTTP request
+ @param context the context information including local and remote socket information.
+ @param response the response to setup.
+ */
+ virtual NPT_Result ProcessGetDescription(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+ /**
+ This method is called when a control point is requesting a service SCPD.
+ @param service the service
+ @param request the HTTP request
+ @param context the context information including local and remote socket information.
+ @param response the response to setup.
+ */
+ virtual NPT_Result ProcessGetSCPD(PLT_Service* service,
+ NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+ /**
+ This method is called when a "GET" request for a resource other than the device
+ description, SCPD, or icons has been received.
+ @param request the HTTP request
+ @param context the context information including local and remote socket information.
+ @param response the response to setup.
+ */
+ virtual NPT_Result ProcessHttpGetRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+ /**
+ This method is called when a "POST" request has been received. This is usually
+ an UPnP service action invocation. This will deserialize the request and call
+ the OnAction method.
+ @param request the HTTP request
+ @param context the context information including local and remote socket information.
+ @param response the response to setup.
+ */
+ virtual NPT_Result ProcessHttpPostRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+ /**
+ This method is called when a request from a subscriber has been received. This is
+ for any new subscritions, existing subscrition renewal or cancellation.
+ @param request the HTTP request
+ @param context the context information including local and remote socket information.
+ @param response the response to setup.
+ */
+ virtual NPT_Result ProcessHttpSubscriberRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+protected:
+ friend class PLT_UPnP;
+ friend class PLT_UPnP_DeviceStartIterator;
+ friend class PLT_UPnP_DeviceStopIterator;
+ friend class PLT_Service;
+ friend class NPT_Reference<PLT_DeviceHost>;
+ friend class PLT_SsdpDeviceSearchResponseInterfaceIterator;
+ friend class PLT_SsdpDeviceSearchResponseTask;
+ friend class PLT_SsdpAnnounceInterfaceIterator;
+
+ PLT_TaskManagerReference m_TaskManager;
+ PLT_HttpServerReference m_HttpServer;
+ bool m_ExtraBroascast;
+ NPT_UInt16 m_Port;
+ bool m_PortRebind;
+ bool m_ByeByeFirst;
+ bool m_Started;
+};
+
+typedef NPT_Reference<PLT_DeviceHost> PLT_DeviceHostReference;
+
+#endif /* _PLT_DEVICE_HOST_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltEvent.cpp b/lib/libUPnP/Platinum/Source/Core/PltEvent.cpp
new file mode 100644
index 0000000..7bc699b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltEvent.cpp
@@ -0,0 +1,328 @@
+/*****************************************************************
+|
+| Platinum - Control/Event
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltTaskManager.h"
+#include "PltEvent.h"
+#include "PltService.h"
+#include "PltUPnP.h"
+#include "PltDeviceData.h"
+#include "PltUtilities.h"
+#include "PltCtrlPointTask.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.event")
+
+/*----------------------------------------------------------------------
+| PLT_EventNotification::PLT_EventNotification
++---------------------------------------------------------------------*/
+PLT_EventNotification*
+PLT_EventNotification::Parse(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINER, "PLT_CtrlPoint::ProcessHttpNotify:", &request);
+
+ PLT_EventNotification *notification = new PLT_EventNotification();
+ notification->m_RequestUrl = request.GetUrl();
+
+ const NPT_String* sid = PLT_UPnPMessageHelper::GetSID(request);
+ const NPT_String* nt = PLT_UPnPMessageHelper::GetNT(request);
+ const NPT_String* nts = PLT_UPnPMessageHelper::GetNTS(request);
+
+ if (!sid || sid->GetLength() == 0) {
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, bad_request);
+ }
+ notification->m_SID = *sid;
+
+ if (!nt || nt->GetLength() == 0 || !nts || nts->GetLength() == 0) {
+ response.SetStatus(400, "Bad request");
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, bad_request);
+ }
+
+ if (nt->Compare("upnp:event", true) || nts->Compare("upnp:propchange", true)) {
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, bad_request);
+ }
+
+ // if the sequence number is less than our current one, we got it out of order
+ // so we disregard it
+ PLT_UPnPMessageHelper::GetSeq(request, notification->m_EventKey);
+
+ // parse body
+ if (NPT_FAILED(PLT_HttpHelper::GetBody(request, notification->m_XmlBody))) {
+ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, bad_request);
+ }
+
+ return notification;
+
+bad_request:
+ NPT_LOG_SEVERE("CtrlPoint received bad event notify request\r\n");
+ if (response.GetStatusCode() == 200) {
+ response.SetStatus(412, "Precondition Failed");
+ }
+ delete notification;
+ return NULL;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::PLT_EventSubscriber
++---------------------------------------------------------------------*/
+PLT_EventSubscriber::PLT_EventSubscriber(PLT_TaskManagerReference task_manager,
+ PLT_Service* service,
+ const char* sid,
+ NPT_Timeout timeout_secs /* = -1 */) :
+ m_TaskManager(task_manager),
+ m_Service(service),
+ m_EventKey(0),
+ m_SubscriberTask(NULL),
+ m_SID(sid)
+{
+ NPT_LOG_FINE_1("Creating new subscriber (%s)", m_SID.GetChars());
+ SetTimeout(timeout_secs);
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::~PLT_EventSubscriber
++---------------------------------------------------------------------*/
+PLT_EventSubscriber::~PLT_EventSubscriber()
+{
+ NPT_LOG_FINE_1("Deleting subscriber (%s)", m_SID.GetChars());
+ if (m_SubscriberTask) {
+ m_SubscriberTask->Kill();
+ m_SubscriberTask = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::GetService
++---------------------------------------------------------------------*/
+PLT_Service*
+PLT_EventSubscriber::GetService()
+{
+ return m_Service;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::GetEventKey
++---------------------------------------------------------------------*/
+NPT_Ordinal
+PLT_EventSubscriber::GetEventKey()
+{
+ return m_EventKey;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::SetEventKey
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::SetEventKey(NPT_Ordinal value)
+{
+ m_EventKey = value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::GetLocalIf
++---------------------------------------------------------------------*/
+NPT_SocketAddress
+PLT_EventSubscriber::GetLocalIf()
+{
+ return m_LocalIf;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::SetLocalIf
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::SetLocalIf(NPT_SocketAddress value)
+{
+ m_LocalIf = value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::GetExpirationTime
++---------------------------------------------------------------------*/
+// a TimeStamp of 0 means no expiration
+NPT_TimeStamp
+PLT_EventSubscriber::GetExpirationTime()
+{
+ return m_ExpirationTime;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::SetExpirationTime
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::SetTimeout(NPT_Timeout seconds)
+{
+ NPT_LOG_FINE_2("subscriber (%s) expiring in %d seconds",
+ m_SID.GetChars(),
+ seconds);
+
+ // -1 means infinite but we default to 300 secs
+ if (seconds == -1) seconds = 300;
+
+ NPT_System::GetCurrentTimeStamp(m_ExpirationTime);
+ m_ExpirationTime += NPT_TimeInterval((double)seconds);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::FindCallbackURL
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::FindCallbackURL(const char* callback_url)
+{
+ NPT_String res;
+ return NPT_ContainerFind(m_CallbackURLs,
+ NPT_StringFinder(callback_url),
+ res);
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::AddCallbackURL
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::AddCallbackURL(const char* callback_url)
+{
+ NPT_CHECK_POINTER_FATAL(callback_url);
+
+ NPT_LOG_FINE_2("Adding callback \"%s\" to subscriber %s",
+ callback_url,
+ m_SID.GetChars());
+ return m_CallbackURLs.Add(callback_url);
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::Notify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::Notify(NPT_List<PLT_StateVariable*>& vars)
+{
+ // verify we have eventable variables
+ bool foundVars = false;
+ NPT_Reference<NPT_XmlElementNode> propertyset(new NPT_XmlElementNode("e", "propertyset"));
+ NPT_CHECK_SEVERE(propertyset->SetNamespaceUri(
+ "e",
+ "urn:schemas-upnp-org:event-1-0"));
+
+ NPT_List<PLT_StateVariable*>::Iterator var = vars.GetFirstItem();
+ while (var) {
+ if ((*var)->IsSendingEvents()) {
+ NPT_XmlElementNode* property = new NPT_XmlElementNode("e", "property");
+ NPT_CHECK_FATAL(propertyset->AddChild(property));
+ NPT_CHECK_FATAL(PLT_XmlHelper::AddChildText(property,
+ (*var)->GetName(),
+ (*var)->GetValue()));
+ foundVars = true;
+ }
+ ++var;
+ }
+
+ // no eventable state variables found!
+ if (foundVars == false) {
+ return NPT_FAILURE;
+ }
+
+ // format the body with the xml
+ NPT_String xml;
+ if (NPT_FAILED(PLT_XmlHelper::Serialize(*propertyset, xml))) {
+ NPT_CHECK_FATAL(NPT_FAILURE);
+ }
+ propertyset = NULL;
+
+ // parse the callback url
+ NPT_HttpUrl url(m_CallbackURLs[0]);
+ if (!url.IsValid()) {
+ NPT_CHECK_FATAL(NPT_FAILURE);
+ }
+ // format request
+ NPT_HttpRequest* request =
+ new NPT_HttpRequest(url,
+ "NOTIFY",
+ NPT_HTTP_PROTOCOL_1_1);
+ NPT_HttpEntity* entity;
+ PLT_HttpHelper::SetBody(*request, xml, &entity);
+
+ // add the extra headers
+ entity->SetContentType("text/xml; charset=\"utf-8\"");
+ PLT_UPnPMessageHelper::SetNT(*request, "upnp:event");
+ PLT_UPnPMessageHelper::SetNTS(*request, "upnp:propchange");
+ PLT_UPnPMessageHelper::SetSID(*request, m_SID);
+ PLT_UPnPMessageHelper::SetSeq(*request, m_EventKey);
+
+ // wrap around sequence to 1
+ if (++m_EventKey == 0) m_EventKey = 1;
+
+ // start the task now if not started already
+ if (!m_SubscriberTask) {
+ // TODO: the subscriber task should inform subscriber if
+ // a notification failed to be received so it can be removed
+ // from the list of subscribers inside the device host
+ NPT_Reference<PLT_HttpClientSocketTask> task(new PLT_HttpClientSocketTask(request, true));
+
+ // short connection time out in case subscriber is not alive
+ NPT_HttpClient::Config config;
+ config.m_ConnectionTimeout = 2000;
+ task->SetHttpClientConfig(config);
+
+ // add initial delay to make sure ctrlpoint receives response to subscription
+ // before our first NOTIFY. Also make sure task is not auto-destroy
+ // since we want to destroy it manually when the subscriber goes away.
+ NPT_TimeInterval delay(0.05f);
+ NPT_CHECK_FATAL(m_TaskManager->StartTask(task.AsPointer(), NULL /*&delay*/, false));
+
+ // Task successfully started, keep around for future notifications
+ m_SubscriberTask = task.AsPointer();
+ task.Detach();
+ } else {
+ m_SubscriberTask->AddRequest(request);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberFinderByService::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_EventSubscriberFinderByService::operator()(PLT_EventSubscriberReference const & eventSub) const
+{
+ return (m_Service == eventSub->GetService());
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltEvent.h b/lib/libUPnP/Platinum/Source/Core/PltEvent.h
new file mode 100644
index 0000000..de754bb
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltEvent.h
@@ -0,0 +1,191 @@
+/*****************************************************************
+|
+| Platinum - Event
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP Eventing
+ */
+
+#ifndef _PLT_EVENT_H_
+#define _PLT_EVENT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttpClientTask.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_StateVariable;
+class PLT_DeviceData;
+class PLT_Service;
+class PLT_TaskManager;
+class PLT_CtrlPoint;
+
+/*----------------------------------------------------------------------
+| PLT_EventNotification class
++---------------------------------------------------------------------*/
+/**
+ The PLT_EventNotification class represents an event notification for a given
+ service to a given subscriber
+ */
+class PLT_EventNotification
+{
+public:
+ ~PLT_EventNotification() {}
+
+ static PLT_EventNotification* Parse(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+
+ NPT_TimeStamp m_ReceptionTime;
+ NPT_HttpUrl m_RequestUrl;
+ NPT_String m_SID;
+ NPT_Ordinal m_EventKey;
+ NPT_String m_XmlBody;
+
+protected:
+ PLT_EventNotification() : m_EventKey(0) {}
+};
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber class
++---------------------------------------------------------------------*/
+/**
+ The PLT_EventSubscriber class represents an event subscription for a given service
+ from a UPnP ControlPoint.
+ */
+class PLT_EventSubscriber
+{
+public:
+ PLT_EventSubscriber(PLT_TaskManagerReference task_manager,
+ PLT_Service* service,
+ const char* sid,
+ NPT_Timeout timeout_secs = -1);
+ ~PLT_EventSubscriber();
+
+ PLT_Service* GetService();
+ NPT_Ordinal GetEventKey();
+ NPT_Result SetEventKey(NPT_Ordinal value);
+ NPT_SocketAddress GetLocalIf();
+ NPT_Result SetLocalIf(NPT_SocketAddress value);
+ NPT_TimeStamp GetExpirationTime();
+ NPT_Result SetTimeout(NPT_Timeout seconds = -1);
+ const NPT_String& GetSID() const { return m_SID; }
+ NPT_Result FindCallbackURL(const char* callback_url);
+ NPT_Result AddCallbackURL(const char* callback_url);
+ NPT_Result Notify(NPT_List<PLT_StateVariable*>& vars);
+
+protected:
+ //members
+ PLT_TaskManagerReference m_TaskManager;
+ PLT_Service* m_Service;
+ NPT_Ordinal m_EventKey;
+ PLT_HttpClientSocketTask* m_SubscriberTask;
+ NPT_String m_SID;
+ NPT_SocketAddress m_LocalIf;
+ NPT_Array<NPT_String> m_CallbackURLs;
+ NPT_TimeStamp m_ExpirationTime;
+};
+
+typedef NPT_Reference<PLT_EventSubscriber> PLT_EventSubscriberReference;
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberFinderBySID
++---------------------------------------------------------------------*/
+/**
+ The PLT_EventSubscriberFinderBySID class returns an instance of a PLT_EventSubscriber
+ given its subscriber ID.
+ */
+class PLT_EventSubscriberFinderBySID
+{
+public:
+ // methods
+ PLT_EventSubscriberFinderBySID(const char* sid) : m_SID(sid) {}
+
+ bool operator()(PLT_EventSubscriberReference const & sub) const {
+ return m_SID.Compare(sub->GetSID(), true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_SID;
+};
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberFinderByCallbackURL
++---------------------------------------------------------------------*/
+/**
+ The PLT_EventSubscriberFinderByCallbackURL class returns an instance of a
+ PLT_EventSubscriber given its subscriber callback url.
+ */
+class PLT_EventSubscriberFinderByCallbackURL
+{
+public:
+ // methods
+ PLT_EventSubscriberFinderByCallbackURL(const char* callback_url) :
+ m_CallbackURL(callback_url) {}
+
+ bool operator()(PLT_EventSubscriberReference const & sub) const {
+ return NPT_SUCCEEDED(sub->FindCallbackURL(m_CallbackURL));
+ }
+
+private:
+ // members
+ NPT_String m_CallbackURL;
+};
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberFinderByService
++---------------------------------------------------------------------*/
+/**
+ The PLT_EventSubscriberFinderByService class returns an instance of a
+ PLT_EventSubscriber given a UPnP service.
+ */
+class PLT_EventSubscriberFinderByService
+{
+public:
+ // methods
+ PLT_EventSubscriberFinderByService(PLT_Service* service) : m_Service(service) {}
+ virtual ~PLT_EventSubscriberFinderByService() {}
+ bool operator()(PLT_EventSubscriberReference const & eventSub) const;
+
+private:
+ // members
+ PLT_Service* m_Service;
+};
+
+#endif /* _PLT_EVENT_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttp.cpp b/lib/libUPnP/Platinum/Source/Core/PltHttp.cpp
new file mode 100644
index 0000000..41159be
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltHttp.cpp
@@ -0,0 +1,352 @@
+/*****************************************************************
+|
+| Platinum - HTTP Protocol Helper
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltHttp.h"
+#include "PltDatagramStream.h"
+#include "PltVersion.h"
+#include "PltUtilities.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.http")
+
+/*----------------------------------------------------------------------
+| external references
++---------------------------------------------------------------------*/
+extern NPT_String HttpServerHeader;
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaderFinder
++---------------------------------------------------------------------*/
+class NPT_HttpHeaderFinder
+{
+ public:
+ // methods
+ NPT_HttpHeaderFinder(const char* name) : m_Name(name) {}
+ bool operator()(const NPT_HttpHeader* const & header) const {
+ if (header->GetName().Compare(m_Name, true)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private:
+ // members
+ NPT_String m_Name;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaderLogger
++---------------------------------------------------------------------*/
+class NPT_HttpHeaderLogger
+{
+public:
+ // methods
+ NPT_HttpHeaderLogger(NPT_LoggerReference& logger, int level) :
+ m_Logger(logger), m_Level(level) {}
+ NPT_Result operator()(NPT_HttpHeader*& header) const {
+ NPT_COMPILER_UNUSED(header);
+
+ NPT_LOG_L2(m_Logger, m_Level, "%s: %s",
+ (const char*)header->GetName(),
+ (const char*)header->GetValue());
+ return NPT_SUCCESS;
+ }
+
+ NPT_LoggerReference& m_Logger;
+ int m_Level;
+};
+
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetContentType
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetContentType(const NPT_HttpMessage& message,
+ NPT_String& type)
+{
+ type = "";
+
+ const NPT_String* val =
+ message.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_CONTENT_TYPE);
+ NPT_CHECK_POINTER(val);
+
+ type = *val;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetContentLength
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetContentLength(const NPT_HttpMessage& message,
+ NPT_LargeSize& len)
+{
+ len = 0;
+
+ const NPT_String* val =
+ message.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_CONTENT_LENGTH);
+ NPT_CHECK_POINTER(val);
+
+ return val->ToInteger64(len);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::SetBody(NPT_HttpMessage& message,
+ NPT_String& text,
+ NPT_HttpEntity** entity /* = NULL */)
+{
+ return SetBody(message, (const char*)text, text.GetLength(), entity);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::SetBody(NPT_HttpMessage& message,
+ const char* text,
+ NPT_HttpEntity** entity /* = NULL */)
+{
+ return SetBody(message, (const char*)text, NPT_StringLength(text), entity);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpMessage::SetBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::SetBody(NPT_HttpMessage& message,
+ const void* body,
+ NPT_LargeSize len,
+ NPT_HttpEntity** entity /* = NULL */)
+{
+ if (len == 0) return NPT_SUCCESS;
+
+ // dump the body in a memory stream
+ NPT_MemoryStreamReference stream(new NPT_MemoryStream);
+ stream->Write(body, (NPT_Size)len);
+
+ // set content length
+ return SetBody(message, (NPT_InputStreamReference)stream, entity);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpMessage::SetBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::SetBody(NPT_HttpMessage& message,
+ NPT_InputStreamReference stream,
+ NPT_HttpEntity** entity /* = NULL */)
+{
+ // get the entity
+ NPT_HttpEntity* _entity = message.GetEntity();
+ if (_entity == NULL) {
+ // no entity yet, create one
+ message.SetEntity(_entity = new NPT_HttpEntity());
+ }
+
+ if (entity) *entity =_entity;
+
+ // set the entity body
+ return _entity->SetInputStream(stream, true);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetBody(const NPT_HttpMessage& message, NPT_String& body)
+{
+ NPT_Result res;
+ NPT_InputStreamReference stream;
+
+ // get stream
+ NPT_HttpEntity* entity = message.GetEntity();
+ if (!entity ||
+ NPT_FAILED(entity->GetInputStream(stream)) ||
+ stream.IsNull()) {
+ return NPT_FAILURE;
+ }
+
+ // extract body
+ NPT_StringOutputStream* output_stream = new NPT_StringOutputStream(&body);
+ res = NPT_StreamToStreamCopy(*stream,
+ *output_stream,
+ 0,
+ entity->GetContentLength());
+ delete output_stream;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::ParseBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::ParseBody(const NPT_HttpMessage& message,
+ NPT_XmlElementNode*& tree)
+{
+ // reset tree
+ tree = NULL;
+
+ // read body
+ NPT_String body;
+ NPT_CHECK_WARNING(GetBody(message, body));
+
+ return PLT_XmlHelper::Parse(body, tree);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::IsConnectionKeepAlive
++---------------------------------------------------------------------*/
+bool
+PLT_HttpHelper::IsConnectionKeepAlive(NPT_HttpMessage& message)
+{
+ const NPT_String* connection =
+ message.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_CONNECTION);
+
+ // the DLNA says that all HTTP 1.0 requests should be closed immediately by the server
+ NPT_String protocol = message.GetProtocol();
+ if (protocol.Compare(NPT_HTTP_PROTOCOL_1_0, true) == 0) return false;
+
+ // all HTTP 1.1 requests without a Connection header
+ // or with a keep-alive Connection header should be kept alive if possible
+ return (!connection || connection->Compare("keep-alive", true) == 0);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::IsBodyStreamSeekable
++---------------------------------------------------------------------*/
+bool
+PLT_HttpHelper::IsBodyStreamSeekable(NPT_HttpMessage& message)
+{
+ NPT_HttpEntity* entity = message.GetEntity();
+ NPT_InputStreamReference stream;
+
+ if (!entity ||
+ NPT_FAILED(entity->GetInputStream(stream)) ||
+ stream.IsNull()) {
+ return true;
+ }
+
+ // try to get current position and seek there
+ NPT_Position position;
+ if (NPT_FAILED(stream->Tell(position)) ||
+ NPT_FAILED(stream->Seek(position))) {
+ return false;
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetHost
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetHost(const NPT_HttpRequest& request, NPT_String& value)
+{
+ value = "";
+
+ const NPT_String* val =
+ request.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_HOST);
+ NPT_CHECK_POINTER(val);
+
+ value = *val;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetHost
++---------------------------------------------------------------------*/
+void
+PLT_HttpHelper::SetHost(NPT_HttpRequest& request, const char* host)
+{
+ request.GetHeaders().SetHeader(NPT_HTTP_HEADER_HOST, host);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetDeviceSignature
++---------------------------------------------------------------------*/
+PLT_DeviceSignature
+PLT_HttpHelper::GetDeviceSignature(const NPT_HttpRequest& request)
+{
+ const NPT_String* agent = request.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_USER_AGENT);
+ const NPT_String* hdr = request.GetHeaders().GetHeaderValue("X-AV-Client-Info");
+ const NPT_String* server = request.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_SERVER);
+ const NPT_String* dlna_friendly_name = request.GetHeaders().GetHeaderValue("FriendlyName.DLNA.ORG");
+ NPT_LOG_FINEST_2("agent: %s, server: %s", agent?agent->GetChars():"none", server?server->GetChars():"none");
+
+ if ((agent && (agent->Find("XBox", 0, true) >= 0 || agent->Find("Xenon", 0, true) >= 0)) ||
+ (server && server->Find("Xbox", 0, true) >= 0)) {
+ return PLT_DEVICE_XBOX_360;
+ } else if(dlna_friendly_name && (dlna_friendly_name->Find("XBOX-ONE", 0, true) >= 0)) {
+ return PLT_DEVICE_XBOX_ONE;
+ } else if (agent && (agent->Find("Windows Media Player", 0, true) >= 0 || agent->Find("Windows-Media-Player", 0, true) >= 0 || agent->Find("Mozilla/4.0", 0, true) >= 0 || agent->Find("WMFSDK", 0, true) >= 0)) {
+ return PLT_DEVICE_WMP;
+ } else if (agent && (agent->Find("Sonos", 0, true) >= 0)) {
+ return PLT_DEVICE_SONOS;
+ } else if ((agent && agent->Find("PLAYSTATION 3", 0, true) >= 0) ||
+ (hdr && hdr->Find("PLAYSTATION 3", 0, true) >= 0)) {
+ return PLT_DEVICE_PS3;
+ } else if (agent && agent->Find("Windows", 0, true) >= 0) {
+ return PLT_DEVICE_WINDOWS;
+ } else if (agent && (agent->Find("Mac", 0, true) >= 0 || agent->Find("OS X", 0, true) >= 0 || agent->Find("OSX", 0, true) >= 0)) {
+ return PLT_DEVICE_MAC;
+ } else if (agent && (agent->Find("VLC", 0, true) >= 0 || agent->Find("VideoLan", 0, true) >= 0)) {
+ return PLT_DEVICE_VLC;
+ } else {
+ NPT_LOG_FINER_2("Unknown device signature (ua=%s, server=%s)", agent?agent->GetChars():"none", server?server->GetChars():"none");
+ }
+
+ return PLT_DEVICE_UNKNOWN;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetBasicAuthorization
++---------------------------------------------------------------------*/
+void
+PLT_HttpHelper::SetBasicAuthorization(NPT_HttpRequest& request,
+ const char* username,
+ const char* password)
+{
+ NPT_String encoded;
+ NPT_String cred = NPT_String(username) + ":" + password;
+
+ NPT_Base64::Encode((const NPT_Byte *)cred.GetChars(), cred.GetLength(), encoded);
+ request.GetHeaders().SetHeader(NPT_HTTP_HEADER_AUTHORIZATION, NPT_String("Basic " + encoded));
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttp.h b/lib/libUPnP/Platinum/Source/Core/PltHttp.h
new file mode 100644
index 0000000..7c03c28
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltHttp.h
@@ -0,0 +1,214 @@
+/*****************************************************************
+|
+| Platinum - HTTP Helper
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ HTTP utilities
+ */
+
+#ifndef _PLT_HTTP_H_
+#define _PLT_HTTP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltVersion.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#if !defined(PLT_HTTP_DEFAULT_USER_AGENT)
+#define PLT_HTTP_DEFAULT_USER_AGENT "UPnP/1.0 DLNADOC/1.50 Platinum/" PLT_PLATINUM_SDK_VERSION_STRING
+#endif
+
+#if !defined(PLT_HTTP_DEFAULT_SERVER)
+#define PLT_HTTP_DEFAULT_SERVER "UPnP/1.0 DLNADOC/1.50 Platinum/" PLT_PLATINUM_SDK_VERSION_STRING
+#endif
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef enum {
+ PLT_DEVICE_UNKNOWN,
+ PLT_DEVICE_XBOX_360,
+ PLT_DEVICE_XBOX_ONE,
+ PLT_DEVICE_PS3,
+ PLT_DEVICE_WMP,
+ PLT_DEVICE_SONOS,
+ PLT_DEVICE_MAC,
+ PLT_DEVICE_WINDOWS,
+ PLT_DEVICE_VLC
+} PLT_DeviceSignature;
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper
++---------------------------------------------------------------------*/
+/**
+ The PLT_HttpHelper class is a set of utility functions for manipulating
+ HTTP headers, entities and messages.
+ */
+class PLT_HttpHelper {
+public:
+ static bool IsConnectionKeepAlive(NPT_HttpMessage& message);
+ static bool IsBodyStreamSeekable(NPT_HttpMessage& message);
+
+ static NPT_Result GetContentType(const NPT_HttpMessage& message, NPT_String& type);
+ static NPT_Result GetContentLength(const NPT_HttpMessage& message, NPT_LargeSize& len);
+
+ static NPT_Result GetHost(const NPT_HttpRequest& request, NPT_String& value);
+ static void SetHost(NPT_HttpRequest& request, const char* host);
+ static PLT_DeviceSignature GetDeviceSignature(const NPT_HttpRequest& request);
+
+ static NPT_Result SetBody(NPT_HttpMessage& message, NPT_String& text, NPT_HttpEntity** entity = NULL);
+ static NPT_Result SetBody(NPT_HttpMessage& message, const char* text, NPT_HttpEntity** entity = NULL);
+ static NPT_Result SetBody(NPT_HttpMessage& message, const void* body, NPT_LargeSize len, NPT_HttpEntity** entity = NULL);
+ static NPT_Result SetBody(NPT_HttpMessage& message, NPT_InputStreamReference stream, NPT_HttpEntity** entity = NULL);
+ static NPT_Result GetBody(const NPT_HttpMessage& message, NPT_String& body);
+ static NPT_Result ParseBody(const NPT_HttpMessage& message, NPT_XmlElementNode*& xml);
+
+ static void SetBasicAuthorization(NPT_HttpRequest& request, const char* username, const char* password);
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpRequestContext
++---------------------------------------------------------------------*/
+/**
+ The PLT_HttpRequestContext class holds information about the request sent, the
+ local & remote ip addresses and ports associated with a connection. It is used
+ mostly when processing a HTTP response.
+ */
+class PLT_HttpRequestContext : public NPT_HttpRequestContext {
+public:
+ // constructors and destructor
+ PLT_HttpRequestContext(const NPT_HttpRequest& request) :
+ m_Request(request) {}
+ PLT_HttpRequestContext(const NPT_HttpRequest& request, const NPT_HttpRequestContext& context) :
+ NPT_HttpRequestContext(&context.GetLocalAddress(), &context.GetRemoteAddress()),
+ m_Request(request) {}
+ virtual ~PLT_HttpRequestContext() {}
+
+ const NPT_HttpRequest& GetRequest() const { return m_Request; }
+ PLT_DeviceSignature GetDeviceSignature() { return PLT_HttpHelper::GetDeviceSignature(m_Request); }
+
+private:
+ const NPT_HttpRequest& m_Request;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaderPrinter
++---------------------------------------------------------------------*/
+class NPT_HttpHeaderPrinter
+{
+public:
+ // methods
+ NPT_HttpHeaderPrinter(NPT_OutputStreamReference& stream) :
+ m_Stream(stream) {}
+ NPT_Result operator()(NPT_HttpHeader*& header) const {
+ m_Stream->WriteString(header->GetName());
+ m_Stream->Write(": ", 2);
+ m_Stream->WriteString(header->GetValue());
+ m_Stream->Write("\r\n", 2, NULL);
+ return NPT_SUCCESS;
+ }
+
+private:
+ // members
+ NPT_OutputStreamReference& m_Stream;
+};
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_ENABLE_LOGGING)
+#define PLT_LOG_HTTP_REQUEST_L(_logger, _level, _prefix, _request) \
+do { \
+ if (!_request) break; \
+ NPT_LOG_GET_LOGGER((_logger)) \
+ if ((_logger).logger && (_level) >= (_logger).logger->GetLevel()) { \
+ NPT_StringOutputStreamReference stream(new NPT_StringOutputStream); \
+ NPT_OutputStreamReference output = stream; \
+ _request->GetHeaders().GetHeaders().Apply(NPT_HttpHeaderPrinter(output)); \
+ NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),"%s\n%s %s %s\n%s", (const char*)_prefix, (const char*)_request->GetMethod(), (const char*)_request->GetUrl().ToRequestString(true), (const char*)_request->GetProtocol(), (const char*)stream->GetString())); \
+ } \
+} while (0)
+
+#define PLT_LOG_HTTP_RESPONSE_L(_logger, _level, _prefix, _response) \
+do { \
+ if (!_response) break; \
+ NPT_LOG_GET_LOGGER((_logger)) \
+ if ((_logger).logger && (_level) >= (_logger).logger->GetLevel()) { \
+ NPT_StringOutputStreamReference stream(new NPT_StringOutputStream); \
+ NPT_OutputStreamReference output = stream; \
+ _response->GetHeaders().GetHeaders().Apply(NPT_HttpHeaderPrinter(output)); \
+ NPT_LOG_X((_logger),(_level),((_level),__FILE__,__LINE__,(NPT_LocalFunctionName),"%s\n%s %d %s\n%s", (const char*)_prefix, (const char*)_response->GetProtocol(), _response->GetStatusCode(), (const char*)_response->GetReasonPhrase(), (const char*)stream->GetString())); \
+ } \
+} while (0)
+
+#define PLT_LOG_HTTP_REQUEST(_level,_prefix,_request) PLT_LOG_HTTP_REQUEST_L(_NPT_LocalLogger,(_level),(_prefix),(_request))
+
+#define PLT_LOG_HTTP_RESPONSE(_level,_prefix,_response) PLT_LOG_HTTP_RESPONSE_L(_NPT_LocalLogger,(_level),(_prefix),(_response))
+
+#else /* NPT_CONFIG_ENABLE_LOGGING */
+#define PLT_LOG_HTTP_REQUEST_L(_logger, _level, _prefix, _request)
+#define PLT_LOG_HTTP_RESPONSE_L(_logger, _level, _prefix, _response)
+#define PLT_LOG_HTTP_REQUEST(_level,_prefix,_request)
+#define PLT_LOG_HTTP_RESPONSE(_level,_prefix,_response)
+#endif /* NPT_CONFIG_ENABLE_LOGGING */
+
+/*----------------------------------------------------------------------
+| PLT_HttpRequestHandler
++---------------------------------------------------------------------*/
+/**
+ The PLT_HttpRequestHandler class delegates the handling of the response of a
+ received HTTP request by a HTTP Server.
+ */
+class PLT_HttpRequestHandler : public NPT_HttpRequestHandler
+{
+public:
+ PLT_HttpRequestHandler(NPT_HttpRequestHandler* delegate) :
+ m_Delegate(delegate) {}
+ ~PLT_HttpRequestHandler() override {}
+
+ // NPT_HttpRequestHandler methods
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override {
+ return m_Delegate->SetupResponse(request, context, response);
+ }
+
+private:
+ NPT_HttpRequestHandler* m_Delegate;
+};
+
+#endif /* _PLT_HTTP_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.cpp b/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.cpp
new file mode 100644
index 0000000..82c4acd
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.cpp
@@ -0,0 +1,190 @@
+/*****************************************************************
+|
+| Platinum - HTTP Client Tasks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltHttpClientTask.h"
+#include "PltConstants.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.http.clienttask")
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::PLT_HttpClientSocketTask
++---------------------------------------------------------------------*/
+PLT_HttpClientSocketTask::PLT_HttpClientSocketTask(NPT_HttpRequest* request /* = NULL */,
+ bool wait_forever /* = false */) :
+ m_WaitForever(wait_forever)
+{
+ m_Client.SetUserAgent(*PLT_Constants::GetInstance().GetDefaultUserAgent());
+ m_Client.SetTimeouts(60000, 60000, 60000);
+ if (request) m_Requests.Push(request);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::~PLT_HttpClientSocketTask
++---------------------------------------------------------------------*/
+PLT_HttpClientSocketTask::~PLT_HttpClientSocketTask()
+{
+ // delete any outstanding requests
+ NPT_HttpRequest* request;
+ while (NPT_SUCCEEDED(m_Requests.Pop(request, false))) {
+ delete request;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::SetHttpClientConfig
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClientSocketTask::SetHttpClientConfig(const NPT_HttpClient::Config& config)
+{
+ return m_Client.SetConfig(config);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::AddRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClientSocketTask::AddRequest(NPT_HttpRequest* request)
+{
+ return m_Requests.Push(request);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::GetNextRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClientSocketTask::GetNextRequest(NPT_HttpRequest*& request, NPT_Timeout timeout_ms)
+{
+ return m_Requests.Pop(request, timeout_ms);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::DoAbort
++---------------------------------------------------------------------*/
+void
+PLT_HttpClientSocketTask::DoAbort()
+{
+ m_Client.Abort();
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_HttpClientSocketTask::DoRun()
+{
+ NPT_HttpRequest* request = NULL;
+ NPT_HttpResponse* response = NULL;
+ NPT_HttpRequestContext context;
+ NPT_Result res;
+ NPT_TimeStamp watchdog;
+
+ NPT_System::GetCurrentTimeStamp(watchdog);
+
+ do {
+ // pop next request or wait for one for 100ms
+ while (NPT_SUCCEEDED(GetNextRequest(request, 100))) {
+ response = NULL;
+
+ if (IsAborting(0)) goto abort;
+
+ // send request
+ res = m_Client.SendRequest(*request, response, &context);
+
+ NPT_String prefix = NPT_String::Format("PLT_HttpClientSocketTask::DoRun (res = %d):", res);
+ PLT_LOG_HTTP_RESPONSE(NPT_LOG_LEVEL_FINER, prefix, response);
+
+ // process response
+ ProcessResponse(res, *request, context, response);
+
+ // cleanup
+ delete response;
+ response = NULL;
+ delete request;
+ request = NULL;
+ }
+
+ // DLNA requires that we abort unanswered/unused sockets after 60 secs
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ if (now > watchdog + NPT_TimeInterval(60.)) {
+ NPT_HttpConnectionManager::GetInstance()->Recycle(NULL);
+ watchdog = now;
+ }
+
+ } while (m_WaitForever && !IsAborting(0));
+
+abort:
+ if (request) delete request;
+ if (response) delete response;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClientSocketTask::ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_LOG_FINE_1("PLT_HttpClientSocketTask::ProcessResponse (result=%d)", res);
+ NPT_CHECK_WARNING(res);
+
+ NPT_CHECK_POINTER_WARNING(response);
+
+ // check if there's a body to read
+ NPT_HttpEntity* entity;
+ NPT_InputStreamReference body;
+ if (!(entity = response->GetEntity()) ||
+ NPT_FAILED(entity->GetInputStream(body)) ||
+ body.IsNull()) {
+ return NPT_SUCCESS;
+ }
+
+ // dump body into ether
+ // (if no content-length specified, read until disconnected)
+ NPT_NullOutputStream output;
+ NPT_CHECK_SEVERE(NPT_StreamToStreamCopy(*body,
+ output,
+ 0,
+ entity->GetContentLength()));
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.h b/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.h
new file mode 100644
index 0000000..62ac723
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.h
@@ -0,0 +1,121 @@
+/*****************************************************************
+|
+| Platinum - HTTP Client Tasks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ HTTP Client tasks
+ */
+
+#ifndef _PLT_HTTP_CLIENT_TASK_H_
+#define _PLT_HTTP_CLIENT_TASK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttp.h"
+#include "PltThreadTask.h"
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_HttpClientSocketTask class is the base class used to send a HTTP request
+ asynchronously using a task (thread). It supports persistent connections
+ and HTTP pipelining with automatic fallback and reconnection when HTTP 1.0
+ is used.
+ */
+class PLT_HttpClientSocketTask : public PLT_ThreadTask
+{
+friend class PLT_ThreadTask;
+
+public:
+ PLT_HttpClientSocketTask(NPT_HttpRequest* request = NULL,
+ bool wait_forever = false);
+ ~PLT_HttpClientSocketTask() override;
+
+ virtual NPT_Result AddRequest(NPT_HttpRequest* request);
+ virtual NPT_Result SetHttpClientConfig(const NPT_HttpClient::Config& config);
+
+protected:
+ // PLT_ThreadTask methods
+ void DoAbort() override;
+ void DoRun() override;
+
+ virtual NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+private:
+ NPT_Result GetNextRequest(NPT_HttpRequest*& request, NPT_Timeout timeout_ms);
+
+protected:
+ NPT_HttpClient m_Client;
+ bool m_WaitForever;
+ NPT_Queue<NPT_HttpRequest> m_Requests;
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_HttpClientTask class is a templatized version of PLT_HttpClientSocketTask
+ to support arbitrary delegation of HTTP response handling.
+ */
+template <class T>
+class PLT_HttpClientTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_HttpClientTask<T>(const NPT_HttpUrl& url, T* data) :
+ PLT_HttpClientSocketTask(new NPT_HttpRequest(url,
+ "GET",
+ NPT_HTTP_PROTOCOL_1_1)),
+ m_Data(data) {}
+ protected:
+ ~PLT_HttpClientTask<T>() override {}
+
+protected:
+ // PLT_HttpClientSocketTask method
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) override {
+ return m_Data->ProcessResponse(res, request, context, response);
+ }
+
+protected:
+ T* m_Data;
+};
+
+#endif /* _PLT_HTTP_CLIENT_TASK_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpServer.cpp b/lib/libUPnP/Platinum/Source/Core/PltHttpServer.cpp
new file mode 100644
index 0000000..2557f62
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltHttpServer.cpp
@@ -0,0 +1,310 @@
+/*****************************************************************
+|
+| Platinum - HTTP Server
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltTaskManager.h"
+#include "PltHttpServer.h"
+#include "PltHttp.h"
+#include "PltVersion.h"
+#include "PltUtilities.h"
+#include "PltProtocolInfo.h"
+#include "PltMimeType.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.http.server")
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::PLT_HttpServer
++---------------------------------------------------------------------*/
+PLT_HttpServer::PLT_HttpServer(NPT_IpAddress address,
+ NPT_IpPort port,
+ bool allow_random_port_on_bind_failure, /* = false */
+ NPT_Cardinal max_clients, /* = 50 */
+ bool reuse_address) : /* = false */
+ NPT_HttpServer(address, port, true),
+ m_TaskManager(new PLT_TaskManager(max_clients)),
+ m_Address(address),
+ m_Port(port),
+ m_AllowRandomPortOnBindFailure(allow_random_port_on_bind_failure),
+ m_ReuseAddress(reuse_address),
+ m_Running(false),
+ m_Aborted(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::~PLT_HttpServer
++---------------------------------------------------------------------*/
+PLT_HttpServer::~PLT_HttpServer()
+{
+ Stop();
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServer::Start()
+{
+ NPT_Result res = NPT_FAILURE;
+
+ // we can't start an already running server or restart an aborted server
+ // because the socket is shared create a new instance
+ if (m_Running || m_Aborted) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ // if we're given a port for our http server, try it
+ if (m_Port) {
+ res = SetListenPort(m_Port, m_ReuseAddress);
+ // return right away if failed and not allowed to try again randomly
+ if (NPT_FAILED(res) && !m_AllowRandomPortOnBindFailure) {
+ NPT_CHECK_SEVERE(res);
+ }
+ }
+
+ // try random port now
+ if (!m_Port || NPT_FAILED(res)) {
+ int retries = 100;
+ do {
+ int random = NPT_System::GetRandomInteger();
+ int port = (unsigned short)(1024 + (random % 1024));
+ if (NPT_SUCCEEDED(SetListenPort(port, m_ReuseAddress))) {
+ break;
+ }
+ } while (--retries > 0);
+
+ if (retries == 0) NPT_CHECK_SEVERE(NPT_FAILURE);
+ }
+
+ // keep track of port server has successfully bound
+ m_Port = m_BoundPort;
+
+ // Tell server to try to listen to more incoming sockets
+ // (this could fail silently)
+ if (m_TaskManager->GetMaxTasks() > 20) {
+ m_Socket.Listen(m_TaskManager->GetMaxTasks());
+ }
+
+ // start a task to listen for incoming connections
+ PLT_HttpListenTask *task = new PLT_HttpListenTask(this, &m_Socket, false);
+ NPT_CHECK_SEVERE(m_TaskManager->StartTask(task));
+
+ NPT_SocketInfo info;
+ m_Socket.GetInfo(info);
+ NPT_LOG_INFO_2("HttpServer listening on %s:%d",
+ (const char*)info.local_address.GetIpAddress().ToString(),
+ m_Port);
+
+ m_Running = true;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServer::Stop()
+{
+ // we can't restart an aborted server
+ if (m_Aborted || !m_Running) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ // stop all other pending tasks
+ m_TaskManager->Abort();
+
+ m_Running = false;
+ m_Aborted = true;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::SetupResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServer::SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_String prefix = NPT_String::Format("PLT_HttpServer::SetupResponse %s request from %s for \"%s\"",
+ (const char*) request.GetMethod(),
+ (const char*) context.GetRemoteAddress().ToString(),
+ (const char*) request.GetUrl().ToString());
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINE, prefix, &request);
+
+ NPT_List<NPT_HttpRequestHandler*> handlers = FindRequestHandlers(request);
+ if (handlers.GetItemCount() == 0) return NPT_ERROR_NO_SUCH_ITEM;
+
+ // ask the handler to setup the response
+ NPT_Result result = (*handlers.GetFirstItem())->SetupResponse(request, context, response);
+
+ // DLNA compliance
+ PLT_UPnPMessageHelper::SetDate(response);
+ if (request.GetHeaders().GetHeader("Accept-Language")) {
+ response.GetHeaders().SetHeader("Content-Language", "en");
+ }
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::ServeFile
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServer::ServeFile(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ NPT_String file_path)
+{
+ NPT_InputStreamReference stream;
+ NPT_File file(file_path);
+ NPT_FileInfo file_info;
+
+ // prevent hackers from accessing files outside of our root
+ if ((file_path.Find("/..") >= 0) || (file_path.Find("\\..") >= 0)) {
+ return NPT_ERROR_NO_SUCH_ITEM;
+ }
+
+ // check for range requests
+ const NPT_String* range_spec = request.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_RANGE);
+
+ // handle potential 304 only if range header not set
+ NPT_DateTime date;
+ NPT_TimeStamp timestamp;
+ if (NPT_SUCCEEDED(NPT_File::GetInfo(file_path, &file_info)) &&
+ NPT_SUCCEEDED(PLT_UPnPMessageHelper::GetIfModifiedSince((NPT_HttpMessage&)request, date)) &&
+ !range_spec) {
+ date.ToTimeStamp(timestamp);
+
+ NPT_LOG_INFO_5("File %s timestamps: request=%d (%s) vs file=%d (%s)",
+ (const char*)request.GetUrl().GetPath(),
+ (NPT_UInt32)timestamp.ToSeconds(),
+ (const char*)date.ToString(),
+ (NPT_UInt32)file_info.m_ModificationTime,
+ (const char*)NPT_DateTime(file_info.m_ModificationTime).ToString());
+
+ if (timestamp >= file_info.m_ModificationTime) {
+ // it's a match
+ NPT_LOG_FINE_1("Returning 304 for %s", request.GetUrl().GetPath().GetChars());
+ response.SetStatus(304, "Not Modified", NPT_HTTP_PROTOCOL_1_1);
+ return NPT_SUCCESS;
+ }
+ }
+
+ // open file
+ if (NPT_FAILED(file.Open(NPT_FILE_OPEN_MODE_READ)) ||
+ NPT_FAILED(file.GetInputStream(stream)) ||
+ stream.IsNull()) {
+ return NPT_ERROR_NO_SUCH_ITEM;
+ }
+
+ // set Last-Modified and Cache-Control headers
+ if (file_info.m_ModificationTime) {
+ NPT_DateTime last_modified = NPT_DateTime(file_info.m_ModificationTime);
+ response.GetHeaders().SetHeader("Last-Modified", last_modified.ToString(NPT_DateTime::FORMAT_RFC_1123), true);
+ response.GetHeaders().SetHeader("Cache-Control", "max-age=0,must-revalidate", true);
+ //response.GetHeaders().SetHeader("Cache-Control", "max-age=1800", true);
+ }
+
+ PLT_HttpRequestContext tmp_context(request, context);
+ return ServeStream(request, context, response, stream, PLT_MimeType::GetMimeType(file_path, &tmp_context));
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::ServeStream
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServer::ServeStream(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ NPT_InputStreamReference& body,
+ const char* content_type)
+{
+ if (body.IsNull()) return NPT_FAILURE;
+
+ // set date
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ response.GetHeaders().SetHeader("Date", NPT_DateTime(now).ToString(NPT_DateTime::FORMAT_RFC_1123), true);
+
+ // get entity
+ NPT_HttpEntity* entity = response.GetEntity();
+ NPT_CHECK_POINTER_FATAL(entity);
+
+ // set the content type
+ entity->SetContentType(content_type);
+
+ // check for range requests
+ const NPT_String* range_spec = request.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_RANGE);
+
+ // setup entity body
+ NPT_CHECK(NPT_HttpFileRequestHandler::SetupResponseBody(response, body, range_spec));
+
+ // set some default headers
+ if (response.GetEntity()->GetTransferEncoding() != NPT_HTTP_TRANSFER_ENCODING_CHUNKED) {
+ // set but don't replace Accept-Range header only if body is seekable
+ NPT_Position offset;
+ if (NPT_SUCCEEDED(body->Tell(offset)) && NPT_SUCCEEDED(body->Seek(offset))) {
+ response.GetHeaders().SetHeader(NPT_HTTP_HEADER_ACCEPT_RANGES, "bytes", false);
+ }
+ }
+
+ // set getcontentFeatures.dlna.org
+ const NPT_String* value = request.GetHeaders().GetHeaderValue("getcontentFeatures.dlna.org");
+ if (value) {
+ PLT_HttpRequestContext tmp_context(request, context);
+ const char* dlna = PLT_ProtocolInfo::GetDlnaExtension(entity->GetContentType(),
+ &tmp_context);
+ if (dlna) response.GetHeaders().SetHeader("ContentFeatures.DLNA.ORG", dlna, false);
+ }
+
+ // transferMode.dlna.org
+ value = request.GetHeaders().GetHeaderValue("transferMode.dlna.org");
+ if (value) {
+ // Interactive mode not supported?
+ /*if (value->Compare("Interactive", true) == 0) {
+ response.SetStatus(406, "Not Acceptable");
+ return NPT_SUCCESS;
+ }*/
+
+ response.GetHeaders().SetHeader("TransferMode.DLNA.ORG", value->GetChars(), false);
+ } else {
+ response.GetHeaders().SetHeader("TransferMode.DLNA.ORG", "Streaming", false);
+ }
+
+ if (request.GetHeaders().GetHeaderValue("TimeSeekRange.dlna.org")) {
+ response.SetStatus(406, "Not Acceptable");
+ return NPT_SUCCESS;
+ }
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpServer.h b/lib/libUPnP/Platinum/Source/Core/PltHttpServer.h
new file mode 100644
index 0000000..04c47fc
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltHttpServer.h
@@ -0,0 +1,100 @@
+/*****************************************************************
+|
+| Platinum - HTTP Server
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ HTTP Server
+ */
+
+#ifndef _PLT_HTTP_SERVER_H_
+#define _PLT_HTTP_SERVER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttpServerTask.h"
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer class
++---------------------------------------------------------------------*/
+/**
+ The PLT_HttpServer class provides an asynchronous way to handle multiple HTTP requests
+ concurrently. Pipelining requests and keep-alive connections are supported.
+ */
+class PLT_HttpServer : public NPT_HttpRequestHandler,
+ public NPT_HttpServer
+{
+public:
+ PLT_HttpServer(NPT_IpAddress address = NPT_IpAddress::Any,
+ NPT_IpPort port = 0,
+ bool allow_random_port_on_bind_failure = false,
+ NPT_Cardinal max_clients = 50,
+ bool reuse_address = false);
+ ~PLT_HttpServer() override;
+
+ // class methods
+ static NPT_Result ServeFile(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ NPT_String file_path);
+ static NPT_Result ServeStream(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ NPT_InputStreamReference& stream,
+ const char* content_type);
+
+ // NPT_HttpRequestHandler methods
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+ // methods
+ virtual NPT_Result Start();
+ virtual NPT_Result Stop();
+ virtual unsigned int GetPort() { return m_Port; }
+
+private:
+ PLT_TaskManagerReference m_TaskManager;
+ NPT_Reference<NPT_HttpServer> m_Server;
+ NPT_IpAddress m_Address;
+ NPT_IpPort m_Port;
+ bool m_AllowRandomPortOnBindFailure;
+ bool m_ReuseAddress;
+ bool m_Running;
+ bool m_Aborted;
+};
+
+typedef NPT_Reference<PLT_HttpServer> PLT_HttpServerReference;
+
+#endif /* _PLT_HTTP_SERVER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.cpp b/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.cpp
new file mode 100644
index 0000000..ed23d47
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.cpp
@@ -0,0 +1,443 @@
+/*****************************************************************
+|
+| Platinum - HTTP Server Tasks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltHttpServerTask.h"
+#include "PltHttp.h"
+#include "PltVersion.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.http.servertask")
+
+/*----------------------------------------------------------------------
+| external references
++---------------------------------------------------------------------*/
+extern NPT_String HttpServerHeader;
+const char* const PLT_HTTP_DEFAULT_403_HTML = "<html><head><title>403 Forbidden</title></head><body><h1>Forbidden</h1><p>Access to this URL is forbidden.</p></html>";
+const char* const PLT_HTTP_DEFAULT_404_HTML = "<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></html>";
+const char* const PLT_HTTP_DEFAULT_500_HTML = "<html><head><title>500 Internal Error</title></head><body><h1>Internal Error</h1><p>The server encountered an unexpected condition which prevented it from fulfilling the request.</p></html>";
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::PLT_HttpServerSocketTask
++---------------------------------------------------------------------*/
+PLT_HttpServerSocketTask::PLT_HttpServerSocketTask(NPT_Socket* socket,
+ bool stay_alive_forever) :
+ m_Socket(socket),
+ m_StayAliveForever(stay_alive_forever)
+{
+ // needed for PS3 that is some case will request data every 35 secs and
+ // won't like it if server disconnected too early
+ m_Socket->SetReadTimeout(60000);
+ m_Socket->SetWriteTimeout(600000);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::~PLT_HttpServerSocketTask
++---------------------------------------------------------------------*/
+PLT_HttpServerSocketTask::~PLT_HttpServerSocketTask()
+{
+ if (m_Socket) {
+ m_Socket->Cancel();
+ delete m_Socket;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_HttpServerSocketTask::DoRun()
+{
+ NPT_BufferedInputStreamReference buffered_input_stream;
+ NPT_HttpRequestContext context;
+ NPT_Result res = NPT_SUCCESS;
+ bool headers_only;
+ bool keep_alive = false;
+
+ // create a buffered input stream to parse HTTP request
+ NPT_InputStreamReference input_stream;
+ NPT_CHECK_LABEL_SEVERE(GetInputStream(input_stream), done);
+ NPT_CHECK_POINTER_LABEL_FATAL(input_stream.AsPointer(), done);
+ buffered_input_stream = new NPT_BufferedInputStream(input_stream);
+
+ while (!IsAborting(0)) {
+ NPT_HttpRequest* request = NULL;
+ NPT_HttpResponse* response = NULL;
+
+ // reset keep-alive to exit task on read failure
+ keep_alive = false;
+
+ // wait for a request
+ res = Read(buffered_input_stream, request, &context);
+ if (NPT_FAILED(res) || (request == NULL))
+ goto cleanup;
+
+ // process request and setup response
+ res = RespondToClient(*request, context, response);
+ if (NPT_FAILED(res) || (response == NULL))
+ goto cleanup;
+
+ // check if client requested keep-alive
+ keep_alive = PLT_HttpHelper::IsConnectionKeepAlive(*request);
+ headers_only = request->GetMethod() == NPT_HTTP_METHOD_HEAD;
+
+ // send response, pass keep-alive request from client
+ // (it can be overridden if response handler did not allow it)
+ res = Write(response, keep_alive, headers_only);
+
+ // on write error, reset keep_alive so we can close this connection
+ if (NPT_FAILED(res)) keep_alive = false;
+
+cleanup:
+ // cleanup
+ delete request;
+ delete response;
+
+ if (!keep_alive && !m_StayAliveForever) {
+ return;
+ }
+ }
+done:
+ return;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::GetInputStream(NPT_InputStreamReference& stream)
+{
+ return m_Socket->GetInputStream(stream);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::GetInfo(NPT_SocketInfo& info)
+{
+ return m_Socket->GetInfo(info);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::Read
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::Read(NPT_BufferedInputStreamReference& buffered_input_stream,
+ NPT_HttpRequest*& request,
+ NPT_HttpRequestContext* context)
+{
+ NPT_SocketInfo info;
+ GetInfo(info);
+
+ // update context with socket info if needed
+ if (context) {
+ context->SetLocalAddress(info.local_address);
+ context->SetRemoteAddress(info.remote_address);
+ }
+
+ // put back in buffered mode to be able to parse HTTP request properly
+ buffered_input_stream->SetBufferSize(NPT_BUFFERED_BYTE_STREAM_DEFAULT_SIZE);
+
+ // parse request
+ NPT_Result res = NPT_HttpRequest::Parse(*buffered_input_stream, &info.local_address, request);
+ if (NPT_FAILED(res) || !request) {
+ // only log if not timeout
+ res = NPT_FAILED(res)?res:NPT_FAILURE;
+ if (res != NPT_ERROR_TIMEOUT && res != NPT_ERROR_EOS) NPT_CHECK_WARNING(res);
+ return res;
+ }
+
+ // update context with socket info again
+ // to refresh the remote address in case it was a non connected udp socket
+ GetInfo(info);
+ if (context) {
+ context->SetLocalAddress(info.local_address);
+ context->SetRemoteAddress(info.remote_address);
+ }
+
+ // return right away if no body is expected
+ if (request->GetMethod() == NPT_HTTP_METHOD_GET ||
+ request->GetMethod() == NPT_HTTP_METHOD_HEAD) {
+ return NPT_SUCCESS;
+ }
+
+ // create an entity
+ NPT_HttpEntity* request_entity = new NPT_HttpEntity(request->GetHeaders());
+ request->SetEntity(request_entity);
+
+ NPT_MemoryStream* body_stream = new NPT_MemoryStream();
+ request_entity->SetInputStream((NPT_InputStreamReference)body_stream);
+
+ // unbuffer the stream to read body fast
+ buffered_input_stream->SetBufferSize(0);
+
+ // check for chunked Transfer-Encoding
+ if (request_entity->GetTransferEncoding() == "chunked") {
+ NPT_CHECK_SEVERE(NPT_StreamToStreamCopy(
+ *NPT_InputStreamReference(new NPT_HttpChunkedInputStream(buffered_input_stream)).AsPointer(),
+ *body_stream));
+
+ request_entity->SetTransferEncoding(NULL);
+ } else if (request_entity->GetContentLength()) {
+ // a request with a body must always have a content length if not chunked
+ NPT_CHECK_SEVERE(NPT_StreamToStreamCopy(
+ *buffered_input_stream.AsPointer(),
+ *body_stream,
+ 0,
+ request_entity->GetContentLength()));
+ } else {
+ request->SetEntity(NULL);
+ }
+
+ // rebuffer the stream
+ buffered_input_stream->SetBufferSize(NPT_BUFFERED_BYTE_STREAM_DEFAULT_SIZE);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::RespondToClient
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::RespondToClient(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response)
+{
+ NPT_Result result = NPT_ERROR_NO_SUCH_ITEM;
+
+ // reset output params first
+ response = NULL;
+
+ // prepare the response body
+ NPT_HttpEntity* body = new NPT_HttpEntity();
+ response = new NPT_HttpResponse(200, "OK", NPT_HTTP_PROTOCOL_1_1);
+ response->SetEntity(body);
+
+ // ask to setup the response
+ result = SetupResponse(request, context, *response);
+
+ // handle result
+ if (result == NPT_ERROR_NO_SUCH_ITEM) {
+ body->SetInputStream(PLT_HTTP_DEFAULT_404_HTML);
+ body->SetContentType("text/html");
+ response->SetStatus(404, "Not Found");
+ } else if (result == NPT_ERROR_PERMISSION_DENIED) {
+ body->SetInputStream(PLT_HTTP_DEFAULT_403_HTML);
+ body->SetContentType("text/html");
+ response->SetStatus(403, "Forbidden");
+ } else if (result == NPT_ERROR_TERMINATED) {
+ // mark that we want to exit
+ delete response;
+ response = NULL;
+ } else if (NPT_FAILED(result)) {
+ body->SetInputStream(PLT_HTTP_DEFAULT_500_HTML);
+ body->SetContentType("text/html");
+ response->SetStatus(500, "Internal Error");
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::SendResponseHeaders
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::SendResponseHeaders(NPT_HttpResponse* response,
+ NPT_OutputStream& output_stream,
+ bool& keep_alive)
+{
+ // add any headers that may be missing
+ NPT_HttpHeaders& headers = response->GetHeaders();
+
+ // get the request entity to set additional headers
+ NPT_InputStreamReference body_stream;
+ NPT_HttpEntity* entity = response->GetEntity();
+ if (entity && NPT_SUCCEEDED(entity->GetInputStream(body_stream))) {
+ // set the content length if known
+ if (entity->ContentLengthIsKnown()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH,
+ NPT_String::FromIntegerU(entity->GetContentLength()));
+ }
+
+ // content type
+ NPT_String content_type = entity->GetContentType();
+ if (!content_type.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_TYPE, content_type);
+ }
+
+ // content encoding
+ NPT_String content_encoding = entity->GetContentEncoding();
+ if (!content_encoding.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_ENCODING, content_encoding);
+ }
+
+ // transfer encoding
+ const NPT_String& transfer_encoding = entity->GetTransferEncoding();
+ if (!transfer_encoding.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_TRANSFER_ENCODING, transfer_encoding);
+ }
+
+ } else if (!headers.GetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH)) {
+ // force content length to 0 if there is no message body
+ // (necessary for 1.1 or 1.0 with keep-alive connections)
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH, "0");
+ }
+
+ const NPT_String* content_length = headers.GetHeaderValue(NPT_HTTP_HEADER_CONTENT_LENGTH);
+ const NPT_String* transfer_encoding = headers.GetHeaderValue(NPT_HTTP_HEADER_TRANSFER_ENCODING);
+ const NPT_String* connection_header = headers.GetHeaderValue(NPT_HTTP_HEADER_CONNECTION);
+ if (keep_alive) {
+ if (connection_header && connection_header->Compare("close") == 0) {
+ keep_alive = false;
+ } else {
+ // the request says client supports keep-alive
+ // but override if response has content-length header or
+ // transfer chunked encoding
+ keep_alive = content_length ||
+ (transfer_encoding && transfer_encoding->Compare(NPT_HTTP_TRANSFER_ENCODING_CHUNKED) == 0);
+ }
+ }
+
+ // only write keep-alive header for 1.1 if it's close
+ NPT_String protocol = response->GetProtocol();
+ if (protocol.Compare(NPT_HTTP_PROTOCOL_1_0, true) == 0 || !keep_alive) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONNECTION, keep_alive?"keep-alive":"close", true);
+ }
+ headers.SetHeader(NPT_HTTP_HEADER_SERVER, PLT_HTTP_DEFAULT_SERVER, false); // set but don't replace
+
+ PLT_LOG_HTTP_RESPONSE(NPT_LOG_LEVEL_FINE, "PLT_HttpServerSocketTask::Write", response);
+
+ // create a memory stream to buffer the headers
+ NPT_MemoryStream header_stream;
+ response->Emit(header_stream);
+
+ // send the headers
+ NPT_CHECK_WARNING(output_stream.WriteFully(header_stream.GetData(), header_stream.GetDataSize()));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::SendResponseBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::SendResponseBody(NPT_HttpResponse* response,
+ NPT_OutputStream& output_stream)
+{
+ NPT_HttpEntity* entity = response->GetEntity();
+ if (!entity) return NPT_SUCCESS;
+
+ NPT_InputStreamReference body_stream;
+ entity->GetInputStream(body_stream);
+ if (body_stream.IsNull()) return NPT_SUCCESS;
+
+ // check for chunked transfer encoding
+ NPT_OutputStream* dest = &output_stream;
+ if (entity->GetTransferEncoding() == NPT_HTTP_TRANSFER_ENCODING_CHUNKED) {
+ dest = new NPT_HttpChunkedOutputStream(output_stream);
+ }
+
+ // send body
+ NPT_LOG_FINE_1("sending body stream, %lld bytes", entity->GetContentLength());
+ NPT_LargeSize bytes_written = 0;
+ NPT_Result result = NPT_StreamToStreamCopy(*body_stream, *dest, 0, entity->GetContentLength(), &bytes_written); /* passing 0 if content length is unknown will read until nothing is left */
+ if (NPT_FAILED(result)) {
+ NPT_LOG_FINE_3("body stream only partially sent, %lld bytes (%d:%s)",
+ bytes_written,
+ result,
+ NPT_ResultText(result));
+ }
+
+ // flush to write out any buffered data left in chunked output if used
+ dest->Flush();
+
+ // cleanup (this will send zero size chunk followed by CRLF)
+ if (dest != &output_stream) delete dest;
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::Write
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::Write(NPT_HttpResponse* response,
+ bool& keep_alive,
+ bool headers_only /* = false */)
+{
+ // get the socket output stream
+ NPT_OutputStreamReference output_stream;
+ NPT_CHECK_WARNING(m_Socket->GetOutputStream(output_stream));
+
+ // send headers
+ NPT_CHECK_WARNING(SendResponseHeaders(response, *output_stream, keep_alive));
+
+ // send the body
+ if (!headers_only) {
+ NPT_CHECK_WARNING(SendResponseBody(response, *output_stream));
+ }
+
+ // flush
+ output_stream->Flush();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpListenTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_HttpListenTask::DoRun()
+{
+ while (!IsAborting(0)) {
+ NPT_Socket* client = NULL;
+ NPT_Result result = m_Socket->WaitForNewClient(client, 5000, NPT_SOCKET_FLAG_CANCELLABLE);
+ if (NPT_FAILED(result)) {
+ // cleanup just in case
+ if (client) delete client;
+
+ // normal error
+ if (result == NPT_ERROR_TIMEOUT) continue;
+
+ // exit on other errors ?
+ NPT_LOG_WARNING_2("PLT_HttpListenTask exiting with %d (%s)", result, NPT_ResultText(result));
+ break;
+ } else {
+ PLT_ThreadTask* task = new PLT_HttpServerTask(m_Handler, client);
+ m_TaskManager->StartTask(task);
+ }
+ }
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h b/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h
new file mode 100644
index 0000000..dc5cbd3
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h
@@ -0,0 +1,163 @@
+/*****************************************************************
+|
+| Platinum - HTTP Server Tasks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ HTTP Server Tasks
+ */
+
+#ifndef _PLT_HTTP_SERVER_TASK_H_
+#define _PLT_HTTP_SERVER_TASK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttp.h"
+#include "PltDatagramStream.h"
+#include "PltThreadTask.h"
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_HttpServerSocketTask class is a task used for handling one or more HTTP
+ requests from a client. It is created by a PLT_HttpListenTask instance upon
+ receiving a connection request. A PLT_HttpServer will handle the delegation for
+ setting up the HTTP response.
+ */
+class PLT_HttpServerSocketTask : public PLT_ThreadTask
+{
+ friend class PLT_ThreadTask;
+
+public:
+ PLT_HttpServerSocketTask(NPT_Socket* socket, bool stay_alive_forever = false);
+
+protected:
+ ~PLT_HttpServerSocketTask() override;
+
+protected:
+ // Request callback handler
+ virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) = 0;
+
+ // overridables
+ virtual NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ virtual NPT_Result GetInfo(NPT_SocketInfo& info);
+
+ // PLT_ThreadTask methods
+ void DoAbort() override { if (m_Socket) m_Socket->Cancel(); }
+ void DoRun() override;
+
+private:
+ virtual NPT_Result Read(NPT_BufferedInputStreamReference& buffered_input_stream,
+ NPT_HttpRequest*& request,
+ NPT_HttpRequestContext* context = NULL);
+ virtual NPT_Result Write(NPT_HttpResponse* response,
+ bool& keep_alive,
+ bool headers_only = false);
+ virtual NPT_Result RespondToClient(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response);
+ virtual NPT_Result SendResponseHeaders(NPT_HttpResponse* response,
+ NPT_OutputStream& output_stream,
+ bool& keep_alive);
+ virtual NPT_Result SendResponseBody(NPT_HttpResponse* response,
+ NPT_OutputStream& output_stream);
+
+protected:
+ NPT_Socket* m_Socket;
+ bool m_StayAliveForever;
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_HttpServerTask class is a version of PLT_HttpServerSocketTask that supports
+ delegation of HTTP request handling.
+ */
+class PLT_HttpServerTask : public PLT_HttpServerSocketTask
+{
+public:
+ PLT_HttpServerTask(NPT_HttpRequestHandler* handler,
+ NPT_Socket* socket,
+ bool keep_alive = false) :
+ PLT_HttpServerSocketTask(socket, keep_alive), m_Handler(handler) {}
+
+protected:
+ ~PLT_HttpServerTask() override {}
+
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override {
+ return m_Handler->SetupResponse(request, context, response);
+ }
+
+protected:
+ NPT_HttpRequestHandler* m_Handler;
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpListenTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_HttpListenTask class is used by a PLT_HttpServer to listen for incoming
+ connections and spawn a new task for handling each request.
+ */
+class PLT_HttpListenTask : public PLT_ThreadTask
+{
+public:
+ PLT_HttpListenTask(NPT_HttpRequestHandler* handler,
+ NPT_TcpServerSocket* socket,
+ bool owns_socket = true) :
+ m_Handler(handler), m_Socket(socket), m_OwnsSocket(owns_socket) {}
+
+protected:
+ ~PLT_HttpListenTask() override {
+ if (m_OwnsSocket && m_Socket) delete m_Socket;
+ }
+
+protected:
+ // PLT_ThreadTask methods
+ void DoAbort() override { if (m_Socket) m_Socket->Cancel(); }
+ void DoRun() override;
+
+protected:
+ NPT_HttpRequestHandler* m_Handler;
+ NPT_TcpServerSocket* m_Socket;
+ bool m_OwnsSocket;
+};
+
+#endif /* _PLT_HTTP_SERVER_TASK_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltIconsData.cpp b/lib/libUPnP/Platinum/Source/Core/PltIconsData.cpp
new file mode 100644
index 0000000..56b60b5
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltIconsData.cpp
@@ -0,0 +1,2580 @@
+/*****************************************************************
+|
+| Platinum - AV Media Server Device SCPDs
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 Platinum_120x120_jpg[16096] =
+{
+ 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00,
+ 0xFF, 0xDB, 0x00, 0x43, 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, 0xFF, 0xDB, 0x00, 0x43, 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, 0xFF, 0xC0,
+ 0x00, 0x11, 0x08, 0x00, 0x81, 0x00, 0x81, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00,
+ 0x1F, 0x00, 0x00, 0x01, 0x04, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03,
+ 0x06, 0x07, 0x08, 0x02, 0x05, 0x09, 0x0A, 0x01, 0x00, 0x0B, 0xFF, 0xC4, 0x00, 0x49, 0x10, 0x00, 0x01, 0x03, 0x03, 0x02,
+ 0x04, 0x03, 0x04, 0x07, 0x04, 0x04, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x11, 0x07, 0x21,
+ 0x00, 0x12, 0x31, 0x41, 0x08, 0x13, 0x51, 0x14, 0x61, 0x71, 0x81, 0x09, 0x15, 0x22, 0x32, 0x91, 0xA1, 0xB1, 0x23, 0x52,
+ 0xC1, 0xD1, 0x42, 0x72, 0xB2, 0xE1, 0x0A, 0x16, 0x17, 0x24, 0x34, 0x35, 0x62, 0x92, 0xB3, 0xD2, 0xF0, 0xF1, 0x25, 0x33,
+ 0x37, 0x45, 0x73, 0x74, 0x75, 0xFF, 0xC4, 0x00, 0x1A, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xFF, 0xC4, 0x00, 0x3B, 0x11, 0x01, 0x00,
+ 0x01, 0x03, 0x03, 0x03, 0x01, 0x06, 0x05, 0x03, 0x02, 0x06, 0x01, 0x05, 0x00, 0x00, 0x01, 0x11, 0x02, 0x21, 0x31, 0x00,
+ 0x03, 0x41, 0x12, 0x51, 0x61, 0x71, 0x22, 0x32, 0x81, 0x91, 0xB1, 0xF0, 0x04, 0x13, 0xA1, 0xC1, 0xD1, 0x42, 0xE1, 0xF1,
+ 0x52, 0x72, 0x05, 0x23, 0x62, 0x92, 0xB2, 0xD2, 0xA2, 0x14, 0x33, 0x34, 0x53, 0x83, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01,
+ 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xA3, 0xEA, 0x9A, 0x46, 0x7E, 0xD1, 0x3F, 0x2D, 0xBA, 0xFA, 0x9D, 0xBE,
+ 0x7F, 0x87, 0x1F, 0x5B, 0x22, 0x90, 0xFD, 0xC3, 0x30, 0xE7, 0xE5, 0xEA, 0x61, 0xD7, 0xB1, 0xA4, 0x15, 0x37, 0xD5, 0x5B,
+ 0x1C, 0xF7, 0x07, 0xF0, 0xC6, 0x00, 0xE0, 0x99, 0x40, 0xF0, 0x91, 0x78, 0xEF, 0x2F, 0x57, 0x6B, 0x73, 0x9F, 0x99, 0xA1,
+ 0x97, 0x37, 0x03, 0xAE, 0x76, 0xF8, 0x9E, 0xFB, 0x8C, 0x6D, 0x9F, 0x97, 0x4C, 0x9E, 0x19, 0x32, 0xCB, 0xCF, 0xBA, 0x5A,
+ 0x42, 0x3C, 0xCD, 0xFD, 0x6C, 0x97, 0xD1, 0xA1, 0xD5, 0x3B, 0xB7, 0x37, 0xC7, 0x7F, 0xE4, 0x7A, 0x1F, 0x99, 0xFC, 0xF8,
+ 0x86, 0xA6, 0xF2, 0x0C, 0x31, 0x8B, 0x19, 0xF9, 0xCF, 0xED, 0xA2, 0x13, 0x26, 0x6E, 0x79, 0x3B, 0xE8, 0x45, 0xCD, 0x38,
+ 0xFB, 0xDB, 0x9E, 0x9F, 0x0F, 0xC7, 0x3E, 0xBD, 0x8E, 0xDB, 0xF0, 0x99, 0x8B, 0x4F, 0x4A, 0x5B, 0xB0, 0x4F, 0x3C, 0x4C,
+ 0xFC, 0x7B, 0xF6, 0xD1, 0x6E, 0x71, 0xF2, 0xD0, 0x6B, 0x9F, 0x83, 0xF7, 0xBD, 0x49, 0xDF, 0xD7, 0xB8, 0xCF, 0x5F, 0x87,
+ 0xBB, 0x6E, 0x15, 0xCB, 0x4F, 0x9B, 0x7A, 0x7F, 0x19, 0xD3, 0x33, 0x89, 0xF0, 0xFF, 0x00, 0x67, 0xE5, 0xF4, 0x9D, 0x0F,
+ 0xF5, 0xA0, 0x49, 0x19, 0x39, 0x00, 0x6D, 0xBE, 0xE3, 0x3D, 0x32, 0x36, 0xDB, 0x61, 0x9F, 0x81, 0x07, 0xAF, 0x0B, 0xEE,
+ 0xD9, 0xF8, 0x6A, 0x8A, 0x2A, 0x49, 0x88, 0x26, 0x26, 0x4F, 0xA4, 0xCE, 0xAD, 0x5F, 0x85, 0x0D, 0x3A, 0x4E, 0xBC, 0x6B,
+ 0x56, 0x9A, 0x69, 0x04, 0x7A, 0xEC, 0x2B, 0x71, 0xFD, 0x40, 0xBB, 0xA8, 0x76, 0xD3, 0xF7, 0x14, 0xE6, 0x84, 0x98, 0xD4,
+ 0x36, 0x6A, 0xF2, 0x1D, 0x41, 0x99, 0xEC, 0x85, 0xD6, 0x13, 0x32, 0x51, 0x8D, 0x16, 0x69, 0x81, 0x09, 0x4F, 0xB0, 0x89,
+ 0x72, 0x9B, 0x44, 0x75, 0xBC, 0xD2, 0x56, 0x5C, 0x47, 0x2E, 0xEE, 0xF3, 0x49, 0x5C, 0x13, 0xD2, 0x32, 0x77, 0x01, 0x98,
+ 0xF3, 0x24, 0x46, 0x42, 0xF7, 0xD4, 0xEE, 0x46, 0xD6, 0xDD, 0x55, 0xB7, 0x42, 0xA8, 0xB5, 0x96, 0x60, 0x8E, 0x50, 0xB7,
+ 0xAE, 0x6D, 0x31, 0xAF, 0x43, 0x9E, 0x27, 0xBE, 0x86, 0x3B, 0x52, 0xC6, 0xD1, 0x9B, 0x8A, 0xF6, 0xD1, 0x6B, 0xD6, 0xF6,
+ 0xAF, 0xDD, 0x56, 0x45, 0xBF, 0x3A, 0xE0, 0xAB, 0x5B, 0x37, 0xCA, 0x2D, 0xF9, 0x6C, 0x5D, 0x94, 0xCA, 0x44, 0x57, 0x27,
+ 0x56, 0x53, 0x45, 0x95, 0x43, 0xA5, 0xD1, 0xDE, 0xA0, 0xD7, 0x9A, 0x84, 0xC4, 0xA9, 0x90, 0x21, 0x3C, 0x9A, 0x9D, 0x3A,
+ 0x72, 0xD8, 0xFA, 0xB4, 0xB9, 0x19, 0xE7, 0x5A, 0x97, 0xC7, 0x9F, 0xB7, 0xF8, 0xCA, 0xBA, 0x82, 0xB2, 0x05, 0xB4, 0x4C,
+ 0x4B, 0x7C, 0x3D, 0xCC, 0xB2, 0x45, 0xE3, 0x9D, 0x70, 0xD1, 0xF8, 0x95, 0xA8, 0x2A, 0x08, 0x58, 0xB5, 0xA2, 0x70, 0xDF,
+ 0x31, 0xCD, 0xCB, 0x73, 0xAF, 0x2C, 0xFA, 0x80, 0x88, 0xF0, 0x64, 0xAD, 0x4C, 0x6E, 0xD2, 0xC1, 0x29, 0x3B, 0x0E, 0x60,
+ 0x49, 0xC1, 0x29, 0x23, 0x9B, 0x9B, 0x19, 0x4A, 0x87, 0xAF, 0x50, 0x9D, 0xC8, 0xF5, 0x76, 0xF7, 0x1A, 0x80, 0x42, 0xEE,
+ 0x66, 0xE6, 0x6C, 0xC0, 0x52, 0x71, 0xF0, 0x73, 0x3A, 0xF5, 0x28, 0x07, 0xA5, 0x48, 0xF6, 0x7A, 0x5E, 0xAB, 0x65, 0x95,
+ 0x2E, 0x79, 0x27, 0x99, 0x49, 0xBC, 0x6A, 0x18, 0x91, 0x51, 0x1C, 0xEA, 0x3C, 0xD8, 0x03, 0xA1, 0xC8, 0xC0, 0x18, 0x39,
+ 0xCE, 0x46, 0xFB, 0x11, 0xE9, 0xD7, 0xAF, 0x6E, 0x35, 0xD5, 0xDC, 0x83, 0xB4, 0x94, 0xD8, 0xC0, 0x81, 0x49, 0x1D, 0xA1,
+ 0xEE, 0xF9, 0x67, 0x4E, 0x7B, 0x2A, 0x8B, 0x5E, 0xBF, 0xAE, 0xDB, 0x4A, 0xC0, 0xB3, 0x28, 0xD3, 0x6E, 0x8B, 0xDA, 0xFA,
+ 0xB8, 0xA9, 0x56, 0xA5, 0xA1, 0x6C, 0xD3, 0x7C, 0x91, 0x3A, 0xB5, 0x70, 0xD6, 0xA5, 0x37, 0x12, 0x9F, 0x4F, 0x60, 0xC9,
+ 0x71, 0x88, 0xED, 0x79, 0x8F, 0x38, 0x14, 0xF4, 0x99, 0x2F, 0x35, 0x16, 0x24, 0x74, 0xBB, 0x26, 0x4B, 0xCD, 0x30, 0xD3,
+ 0x8E, 0x27, 0x1D, 0xCD, 0xCE, 0x96, 0x1F, 0x64, 0x89, 0x96, 0xD3, 0x69, 0xFA, 0x71, 0x9C, 0x5B, 0xB4, 0xD4, 0x94, 0x8D,
+ 0x4B, 0x14, 0xD2, 0x2B, 0x52, 0x58, 0x82, 0x6E, 0x5F, 0xD2, 0x09, 0x56, 0x20, 0x67, 0x5B, 0xCD, 0x6F, 0xD3, 0x1B, 0xFB,
+ 0x40, 0xF5, 0x2E, 0xE9, 0xD1, 0xDD, 0x59, 0xB7, 0x45, 0xA3, 0xA8, 0xB6, 0x7A, 0xE9, 0xAA, 0xAC, 0xD1, 0x51, 0x54, 0xA5,
+ 0xD6, 0xE2, 0x2A, 0x2D, 0x66, 0x9B, 0x16, 0xAF, 0x48, 0xA8, 0xD3, 0x2B, 0x34, 0x79, 0x12, 0xE9, 0xB5, 0x5A, 0x5D, 0x4A,
+ 0x99, 0x36, 0x34, 0xC8, 0x73, 0xA1, 0xBE, 0xB6, 0xDC, 0x6D, 0xD2, 0x16, 0x1B, 0x79, 0x2E, 0x34, 0x99, 0xDB, 0xDE, 0xA6,
+ 0xA2, 0x69, 0xAB, 0xAA, 0x94, 0x91, 0xCC, 0xDE, 0xF1, 0x37, 0xE1, 0x02, 0xD7, 0x83, 0x0E, 0x9E, 0xDD, 0x54, 0xD7, 0x4D,
+ 0x35, 0xD3, 0x7A, 0x5B, 0x8B, 0x24, 0x5D, 0xA5, 0x22, 0x24, 0x7A, 0x88, 0xB9, 0xC6, 0x0D, 0x42, 0x8E, 0xCC, 0xCA, 0xB3,
+ 0xCF, 0x8D, 0xF7, 0xC7, 0x4E, 0xDE, 0x83, 0x07, 0x3E, 0x83, 0x60, 0x77, 0xEF, 0xC6, 0x8E, 0xE4, 0x60, 0x7F, 0xF8, 0xFE,
+ 0xF2, 0x7E, 0xFA, 0x26, 0xCC, 0x07, 0xCB, 0x17, 0xEF, 0x76, 0xF3, 0x0F, 0xC3, 0x41, 0xB9, 0x28, 0x0C, 0x1E, 0x6E, 0xA0,
+ 0x8E, 0xBB, 0xE0, 0x7C, 0x89, 0xCE, 0x3A, 0x0E, 0xFD, 0x08, 0xDF, 0x69, 0xEA, 0xA9, 0x11, 0x88, 0x99, 0x2C, 0x3F, 0xDE,
+ 0x33, 0x67, 0xE9, 0x6D, 0x13, 0x09, 0xDD, 0x78, 0x1C, 0x47, 0x08, 0x21, 0x98, 0x7B, 0x6B, 0x5E, 0xE4, 0xCC, 0x64, 0x76,
+ 0xDC, 0x6F, 0xD8, 0x80, 0x4F, 0x41, 0x8E, 0xA3, 0x71, 0xF2, 0xDB, 0x89, 0xBF, 0xDE, 0x0F, 0xE0, 0xFD, 0x25, 0xF3, 0xA9,
+ 0xEA, 0x2F, 0xD8, 0x3D, 0x6D, 0x3C, 0x44, 0xC5, 0xFB, 0xC7, 0x37, 0xEE, 0x2F, 0xB4, 0x9F, 0x51, 0xFE, 0xE9, 0xE1, 0x49,
+ 0xDC, 0xF9, 0x9A, 0x99, 0x7B, 0xD1, 0xF3, 0x75, 0x63, 0x97, 0x3B, 0x6F, 0xBD, 0x83, 0xE8, 0x08, 0x39, 0xF5, 0xD8, 0x93,
+ 0xF2, 0xCF, 0xA6, 0xDB, 0xEF, 0xC7, 0x62, 0x12, 0x5F, 0x30, 0x37, 0x2D, 0x01, 0xCD, 0xBD, 0x27, 0xEB, 0x31, 0xAC, 0xB1,
+ 0xDE, 0xFF, 0x00, 0x27, 0xF9, 0x8F, 0xD3, 0x43, 0xAA, 0x76, 0xD8, 0xCF, 0x7C, 0x1C, 0x91, 0xD3, 0xD7, 0x19, 0xED, 0xB7,
+ 0xA7, 0xAF, 0x71, 0xC2, 0xEA, 0x66, 0x66, 0xF8, 0xC4, 0x31, 0xF2, 0x8F, 0xAE, 0xA8, 0xA1, 0x89, 0x7D, 0x41, 0x21, 0x38,
+ 0xE7, 0x1C, 0xBF, 0x1D, 0x0E, 0xA9, 0xDE, 0xFD, 0xFA, 0x9C, 0x9D, 0xBA, 0x0F, 0x71, 0x39, 0xDF, 0xB9, 0xEE, 0x07, 0x0B,
+ 0xE2, 0xCF, 0x1F, 0x73, 0x6F, 0x1A, 0x3A, 0x19, 0x99, 0x31, 0x39, 0xB5, 0xEF, 0x0C, 0x5A, 0x43, 0xCE, 0x19, 0xBE, 0x74,
+ 0x32, 0xA6, 0xEE, 0x72, 0xAD, 0xB7, 0x03, 0xFB, 0x8E, 0x73, 0xE9, 0xBF, 0x0A, 0x7F, 0x9F, 0x5D, 0x5B, 0xB6, 0xF4, 0x89,
+ 0xD5, 0x3D, 0xD8, 0x0B, 0xBF, 0xD2, 0x37, 0xB5, 0xDB, 0x97, 0xED, 0x0E, 0x85, 0x72, 0x6F, 0xA9, 0x3B, 0xE4, 0x01, 0x9C,
+ 0x0F, 0x78, 0xDC, 0xE3, 0xA6, 0x77, 0xCE, 0x3F, 0x11, 0x87, 0x2F, 0x7E, 0xC7, 0xCB, 0x1A, 0xAA, 0x68, 0xA4, 0x60, 0x25,
+ 0x61, 0x7A, 0x81, 0x98, 0x23, 0x36, 0x3C, 0xC4, 0x62, 0x74, 0x0B, 0xB3, 0x39, 0x72, 0x79, 0x8F, 0x43, 0xD4, 0xEF, 0xF3,
+ 0x38, 0xEB, 0x80, 0x3B, 0x7B, 0xC6, 0xF8, 0xE1, 0x6A, 0xA0, 0x38, 0x26, 0xE4, 0x90, 0x5A, 0xE6, 0x0E, 0x7E, 0x30, 0xF6,
+ 0xBE, 0x9B, 0xF5, 0x0A, 0xA1, 0x6D, 0xB2, 0xA2, 0xA3, 0x80, 0x36, 0x19, 0xC6, 0x48, 0x19, 0x1D, 0x09, 0xE8, 0x08, 0x03,
+ 0xAF, 0x50, 0x73, 0xC4, 0x57, 0x54, 0x16, 0x61, 0xCE, 0x26, 0xDC, 0xDB, 0xFB, 0xE9, 0x2F, 0x49, 0x3F, 0x29, 0x39, 0xE2,
+ 0x1E, 0x7E, 0x87, 0x6D, 0x3F, 0xBC, 0x31, 0xEA, 0x24, 0xC4, 0x6B, 0x25, 0x56, 0xD4, 0xA7, 0x55, 0x57, 0x47, 0xBC, 0x9C,
+ 0xB6, 0xA9, 0x97, 0xF6, 0x9B, 0x54, 0x10, 0xF2, 0xDA, 0x78, 0xDD, 0x5A, 0x63, 0x5B, 0x35, 0x19, 0xD4, 0xF8, 0xCA, 0x42,
+ 0x92, 0xB3, 0x25, 0xFA, 0x15, 0x72, 0x54, 0xC6, 0x9B, 0x4A, 0xB9, 0xD6, 0x8A, 0x73, 0xC0, 0x0C, 0x24, 0x94, 0xF3, 0x52,
+ 0x1B, 0x8D, 0x74, 0x0B, 0x35, 0x52, 0x24, 0xDD, 0xEA, 0xA5, 0x6E, 0xF8, 0xA8, 0x59, 0x7B, 0xF7, 0x35, 0x8E, 0xF5, 0x43,
+ 0x45, 0x15, 0xE6, 0x92, 0xB6, 0x8D, 0xCA, 0x5C, 0x94, 0xEE, 0x10, 0x3C, 0x91, 0x34, 0x87, 0xC7, 0x8B, 0x1A, 0xF6, 0xA7,
+ 0xE1, 0xF3, 0xE9, 0x5F, 0xD3, 0xDD, 0x5A, 0xF0, 0xD3, 0x72, 0x3D, 0xA9, 0x0E, 0x33, 0x4D, 0xD5, 0x0B, 0x6E, 0xCE, 0xAB,
+ 0xD2, 0x2E, 0x18, 0xAB, 0x71, 0xA6, 0xD8, 0xAC, 0x4F, 0x6E, 0x93, 0x2A, 0x1B, 0x95, 0x03, 0x1D, 0xDE, 0x55, 0xB4, 0x97,
+ 0xC9, 0xE7, 0x7D, 0x00, 0x2D, 0xB7, 0x1C, 0x56, 0x42, 0x80, 0x5E, 0xFC, 0x55, 0x7E, 0x0E, 0xA3, 0x76, 0x98, 0xB0, 0x54,
+ 0x49, 0x0C, 0xC9, 0x0C, 0x52, 0xF9, 0xC9, 0xDA, 0x39, 0xD7, 0x99, 0x5E, 0xCB, 0x4D, 0x47, 0x48, 0xD5, 0x4B, 0x0D, 0x29,
+ 0xCC, 0xFF, 0x00, 0x49, 0x7C, 0xF6, 0x96, 0x53, 0x5E, 0x20, 0x2F, 0xAD, 0x44, 0x87, 0x5A, 0xAF, 0xD4, 0x5A, 0x88, 0xE2,
+ 0x56, 0xC2, 0xD1, 0x4E, 0xA9, 0xC6, 0xF2, 0xD5, 0x90, 0x63, 0xD5, 0x69, 0xEC, 0x49, 0x40, 0x46, 0x4E, 0x0A, 0x4B, 0xDE,
+ 0xD0, 0x12, 0x53, 0xB6, 0x47, 0x41, 0x93, 0xC7, 0x65, 0x29, 0x4A, 0x2C, 0x0A, 0x72, 0x48, 0x29, 0xDB, 0x98, 0x26, 0xE4,
+ 0xDF, 0x18, 0x75, 0xED, 0xAF, 0x45, 0x03, 0x52, 0xC8, 0xD5, 0x49, 0x1C, 0x34, 0xA8, 0xF8, 0xF2, 0xA6, 0x64, 0x88, 0xBC,
+ 0x30, 0x5F, 0xA9, 0xE5, 0xA5, 0x10, 0xA2, 0x0F, 0xEE, 0x93, 0x90, 0x3B, 0xF6, 0xEF, 0xD8, 0xFA, 0x1D, 0xFB, 0xF1, 0x6D,
+ 0x7C, 0xB5, 0x2D, 0xE4, 0x25, 0x3B, 0x98, 0xB6, 0x1C, 0x29, 0xAC, 0xFA, 0xCE, 0x95, 0xBC, 0xCD, 0xB1, 0x72, 0xF2, 0xA6,
+ 0x48, 0x4F, 0x8D, 0xBE, 0x0D, 0xFB, 0x67, 0x57, 0x35, 0x1B, 0x4A, 0xF5, 0x46, 0xCE, 0xD4, 0x2D, 0x2C, 0xAA, 0x2E, 0x97,
+ 0xA8, 0xDA, 0x7E, 0xB9, 0x57, 0xC5, 0x87, 0x35, 0x08, 0x0E, 0xA9, 0xBB, 0x96, 0xD3, 0x93, 0x4E, 0xAD, 0x84, 0x25, 0xA5,
+ 0xA5, 0x69, 0x79, 0x4F, 0xD1, 0x21, 0xD6, 0xDB, 0x53, 0x45, 0x0A, 0x0E, 0xB3, 0xE7, 0x20, 0x82, 0x09, 0xC6, 0x2D, 0x4D,
+ 0x4B, 0x4A, 0x53, 0x54, 0xD3, 0x54, 0x09, 0x94, 0x27, 0xA7, 0xCC, 0x9C, 0x4C, 0xD4, 0x76, 0xD2, 0xFC, 0xCA, 0x5A, 0x2A,
+ 0xA3, 0x70, 0x2A, 0xA6, 0xA5, 0x2A, 0x9B, 0x59, 0x13, 0x27, 0x25, 0x50, 0xCE, 0x6D, 0x6D, 0x11, 0xA8, 0xFA, 0xD7, 0xAA,
+ 0x9A, 0xCD, 0xAB, 0xF7, 0x4D, 0xFF, 0x00, 0xAC, 0x97, 0x3C, 0x9B, 0xBB, 0x54, 0x2B, 0xB1, 0xE1, 0x4E, 0xBF, 0xEB, 0x4F,
+ 0xA9, 0x20, 0x37, 0x71, 0xD4, 0x98, 0x6A, 0x4B, 0x16, 0xEC, 0x56, 0x50, 0x12, 0xD4, 0x78, 0x76, 0x85, 0xB0, 0xDD, 0xB9,
+ 0x42, 0x6E, 0x23, 0x69, 0xF2, 0xE2, 0xC9, 0x62, 0x73, 0x21, 0x21, 0x68, 0x58, 0x08, 0x4F, 0x70, 0xA4, 0xA7, 0xA0, 0xA7,
+ 0xA8, 0x31, 0x2C, 0x55, 0xD2, 0x3C, 0x01, 0x02, 0x77, 0x52, 0x64, 0x75, 0x25, 0x61, 0x47, 0x46, 0xD5, 0x26, 0xDD, 0x33,
+ 0x3C, 0xAA, 0x79, 0x9B, 0xCD, 0x4B, 0x54, 0xC6, 0x24, 0xF5, 0xD2, 0x0D, 0xCB, 0x52, 0x92, 0x30, 0xA2, 0x7A, 0x83, 0xB9,
+ 0x00, 0xEC, 0x37, 0x27, 0x23, 0x3B, 0xEC, 0x7E, 0x3B, 0x8E, 0x35, 0x2B, 0xEF, 0xF7, 0xF7, 0x7F, 0x97, 0x2E, 0xA6, 0x5E,
+ 0xEF, 0x7F, 0xBB, 0xFD, 0xA5, 0xB9, 0xD6, 0x4A, 0x92, 0x7D, 0x73, 0xB1, 0xD8, 0x91, 0xCA, 0x77, 0xDF, 0xB1, 0xE9, 0xDB,
+ 0xAE, 0x4F, 0xB8, 0x6C, 0x35, 0xE2, 0xC6, 0x49, 0xCC, 0xC4, 0xF6, 0x88, 0xED, 0xCD, 0xB3, 0x6D, 0x3E, 0xA6, 0xC5, 0xA0,
+ 0xE3, 0xED, 0x99, 0xF8, 0xE6, 0xFA, 0x19, 0x6F, 0x9E, 0x84, 0xFB, 0x86, 0xF8, 0xC0, 0xDF, 0x7C, 0x8D, 0xFD, 0x01, 0xCE,
+ 0x07, 0x5E, 0x9B, 0x01, 0x2D, 0x4B, 0xF2, 0x8C, 0xB3, 0xF0, 0xB8, 0x03, 0xDA, 0x3F, 0x9D, 0x4E, 0x92, 0xF3, 0x8F, 0xA0,
+ 0xFC, 0x47, 0xFC, 0xDC, 0x4C, 0xD5, 0xDE, 0x9F, 0xFB, 0x0F, 0xE7, 0x46, 0xA7, 0x95, 0xCC, 0x3D, 0xCF, 0xBF, 0x07, 0x6C,
+ 0x7B, 0x8F, 0x40, 0x32, 0x7A, 0x7B, 0xBA, 0xF5, 0xE3, 0xD1, 0xB5, 0xA2, 0x7C, 0xFF, 0x00, 0x6D, 0x74, 0xC1, 0x25, 0xC0,
+ 0xA5, 0x60, 0xA7, 0xA8, 0xE3, 0x29, 0x24, 0xF1, 0xC9, 0x7B, 0xB3, 0xA4, 0x15, 0x33, 0x24, 0x9C, 0xEC, 0x7D, 0x0F, 0x4E,
+ 0xA3, 0x61, 0xDB, 0x39, 0xDF, 0xAF, 0xC7, 0x85, 0xA2, 0xDE, 0xB3, 0xC5, 0xED, 0xF2, 0x8F, 0xD3, 0x48, 0x2A, 0x6E, 0x4E,
+ 0xCB, 0xC0, 0xDB, 0xA1, 0xC1, 0xEF, 0xD3, 0xE3, 0xEE, 0x19, 0xF4, 0xDF, 0x27, 0x83, 0xEF, 0xEF, 0xFB, 0xE8, 0x98, 0x33,
+ 0x7E, 0xD1, 0x8F, 0x23, 0xDE, 0xC7, 0x9D, 0x0E, 0xA9, 0x80, 0x83, 0xB8, 0xC1, 0xDC, 0x9C, 0xE0, 0x9C, 0x76, 0xC7, 0x51,
+ 0xF9, 0x74, 0x19, 0xCF, 0x06, 0x89, 0x7B, 0xBF, 0xE7, 0x43, 0xAE, 0x67, 0x30, 0xC0, 0x3B, 0x01, 0x9D, 0xCE, 0xF8, 0xE9,
+ 0xD7, 0x38, 0xEB, 0xD3, 0x04, 0x91, 0xB6, 0x31, 0x8E, 0x06, 0xD9, 0xE6, 0x39, 0xEF, 0x89, 0xED, 0x3C, 0x4E, 0x96, 0x65,
+ 0xF8, 0xE8, 0x67, 0x64, 0x13, 0xFD, 0x2D, 0x80, 0x04, 0x6F, 0xD0, 0xE7, 0xD7, 0xB1, 0x3E, 0x9B, 0xED, 0xC0, 0xDA, 0x7B,
+ 0xF6, 0xD3, 0x87, 0xF6, 0xF9, 0xE2, 0xD9, 0xBE, 0x9B, 0x55, 0x67, 0x14, 0xA6, 0x54, 0x32, 0x72, 0x93, 0x91, 0x82, 0x09,
+ 0xC6, 0xF9, 0x03, 0x07, 0xA6, 0xE3, 0x38, 0x1B, 0x8E, 0xF8, 0xE3, 0x9F, 0x75, 0xF7, 0xBC, 0x40, 0x7A, 0x4C, 0x76, 0xE5,
+ 0x9E, 0xFE, 0x35, 0x35, 0xFB, 0xB7, 0x98, 0x5B, 0x7C, 0x33, 0xCD, 0xB1, 0xAA, 0xC3, 0x7E, 0xDD, 0xB5, 0xFD, 0x33, 0xB9,
+ 0xEC, 0xDD, 0x5F, 0xB5, 0x8B, 0x82, 0xE1, 0xD2, 0xFB, 0x9A, 0x9B, 0x77, 0xC4, 0x6D, 0x1F, 0x68, 0xCE, 0x83, 0x4F, 0x5A,
+ 0xDA, 0xAF, 0x51, 0xDD, 0x46, 0xC1, 0xC8, 0xF5, 0xBB, 0x7A, 0x45, 0x56, 0x96, 0xEB, 0x2A, 0xE6, 0x43, 0x86, 0x4A, 0x32,
+ 0x3E, 0xC8, 0xC7, 0x15, 0x75, 0xD5, 0xB7, 0x55, 0x1B, 0xB4, 0xCC, 0xED, 0x55, 0xD5, 0x04, 0xFB, 0x54, 0x90, 0xD4, 0x31,
+ 0x93, 0xA6, 0x78, 0xB3, 0x39, 0xCE, 0xB9, 0x77, 0x09, 0xA1, 0xEC, 0x17, 0x0E, 0x69, 0xC2, 0x7C, 0xAE, 0x46, 0x18, 0xD5,
+ 0xD2, 0xF1, 0x1D, 0xAD, 0xF5, 0xDB, 0x22, 0xB8, 0xCD, 0xDB, 0xA6, 0xD5, 0x82, 0x9B, 0x1B, 0x5B, 0x2C, 0x88, 0xF7, 0x14,
+ 0x35, 0xC4, 0x6B, 0xCD, 0x69, 0xE6, 0xAB, 0x34, 0xD6, 0x66, 0xA0, 0x2E, 0x43, 0x88, 0x24, 0x33, 0xE4, 0xBC, 0xD7, 0x98,
+ 0xCA, 0x31, 0xCE, 0xF0, 0xC3, 0x8B, 0x0D, 0x80, 0x13, 0xDD, 0xF8, 0xAD, 0xDA, 0x68, 0x28, 0xAE, 0x81, 0x8D, 0xCA, 0x3A,
+ 0x84, 0xB8, 0x89, 0x37, 0x02, 0x6C, 0x7C, 0xE3, 0x29, 0x95, 0xF8, 0x7A, 0xC2, 0x92, 0x9A, 0xA9, 0xEB, 0xAB, 0x6E, 0xA6,
+ 0x16, 0xA6, 0x1A, 0x4E, 0x48, 0x85, 0x99, 0x18, 0x64, 0xCD, 0xF5, 0x4F, 0x68, 0x35, 0x77, 0x45, 0x52, 0x86, 0x85, 0x3A,
+ 0xA5, 0x17, 0x34, 0xD7, 0x4E, 0x9F, 0x59, 0x59, 0xCA, 0x96, 0xE4, 0x8A, 0x64, 0xD7, 0x5E, 0x59, 0xED, 0xCC, 0x56, 0xA5,
+ 0x73, 0x1D, 0xB7, 0x18, 0xC0, 0xC0, 0x03, 0x8C, 0xAA, 0x6A, 0x26, 0xFF, 0x00, 0xF2, 0xF6, 0x92, 0x00, 0x09, 0xA5, 0xC7,
+ 0xD6, 0xD3, 0x9B, 0xEB, 0x4E, 0xA6, 0xB6, 0xA6, 0xA4, 0x56, 0xA6, 0x63, 0x03, 0xC8, 0x78, 0xFD, 0x42, 0x09, 0xB6, 0xA6,
+ 0x06, 0xDF, 0x2E, 0x35, 0x82, 0x01, 0x27, 0x04, 0xE3, 0xAF, 0x63, 0xB7, 0xE9, 0x9F, 0x43, 0xC5, 0xF8, 0x96, 0x3B, 0x4D,
+ 0xB4, 0x69, 0x8F, 0x70, 0xD1, 0xD7, 0x35, 0xF8, 0xD2, 0x58, 0x95, 0x32, 0x0C, 0xD8, 0x32, 0x5B, 0x99, 0x02, 0x7D, 0x3E,
+ 0x53, 0xF0, 0xA7, 0xC0, 0x94, 0xC9, 0xE6, 0x6E, 0x4C, 0x29, 0x91, 0x56, 0xD4, 0x88, 0xCF, 0x37, 0x95, 0x04, 0xB8, 0xD3,
+ 0x88, 0x5E, 0x14, 0xA4, 0xF3, 0x72, 0xAD, 0x41, 0x53, 0x03, 0x1C, 0x24, 0x22, 0x4C, 0x8B, 0x61, 0x1B, 0x33, 0x6C, 0xF1,
+ 0x17, 0xC6, 0x91, 0x0D, 0x3E, 0x55, 0xE2, 0xC8, 0x58, 0xBB, 0x79, 0xB6, 0x62, 0xF6, 0x8D, 0x0D, 0x41, 0xA3, 0x26, 0x96,
+ 0x95, 0x84, 0x17, 0x56, 0xB7, 0x5D, 0x76, 0x44, 0x87, 0xDF, 0x71, 0xC9, 0x12, 0x24, 0xC9, 0x79, 0xC5, 0xBA, 0xF4, 0x89,
+ 0x32, 0x1E, 0x53, 0x8F, 0x48, 0x90, 0xFB, 0xCE, 0x2D, 0xE7, 0x9D, 0x75, 0xC5, 0x38, 0xEB, 0xAB, 0x5B, 0x8E, 0x2D, 0x4A,
+ 0x52, 0x94, 0x40, 0x29, 0x23, 0xCC, 0x0B, 0x2A, 0xAE, 0x65, 0xBB, 0x77, 0xBA, 0xFC, 0xA3, 0x4E, 0x39, 0xE6, 0xD1, 0x76,
+ 0x63, 0x9B, 0x44, 0x5E, 0xDE, 0x74, 0xF5, 0x43, 0xBC, 0x8D, 0x80, 0x0F, 0x6C, 0x6D, 0x9C, 0x1C, 0xF7, 0x04, 0x6F, 0xD3,
+ 0xD7, 0x6E, 0x2B, 0xEF, 0xE5, 0xA3, 0x5F, 0x0B, 0xFE, 0xFF, 0x00, 0xCC, 0x9F, 0xD3, 0x83, 0x46, 0x90, 0x5C, 0x8F, 0xFB,
+ 0x7E, 0xB9, 0xDF, 0x6F, 0x99, 0xED, 0xEB, 0xC1, 0xA3, 0x48, 0x7B, 0x4A, 0x7F, 0x7C, 0x7E, 0x29, 0xFE, 0x7C, 0x1A, 0x35,
+ 0x35, 0x19, 0x5B, 0xEC, 0xAF, 0x76, 0xD9, 0xC7, 0xA7, 0xC8, 0x83, 0xEB, 0xB7, 0x7E, 0xFC, 0x77, 0xA8, 0x31, 0x97, 0xC5,
+ 0xE3, 0xD6, 0x3F, 0xCF, 0x8D, 0x74, 0xC7, 0x90, 0xED, 0x3C, 0xFD, 0xF9, 0xD2, 0x66, 0x59, 0xDC, 0x67, 0x63, 0x9C, 0x8C,
+ 0xF6, 0x3D, 0x7A, 0x9E, 0xF9, 0xDB, 0x3E, 0xBD, 0x3A, 0x70, 0xC4, 0xBC, 0x64, 0x0B, 0xCD, 0xA5, 0xF0, 0x42, 0x27, 0x99,
+ 0xBF, 0x11, 0xA5, 0xA4, 0x55, 0x27, 0x24, 0xE4, 0x8F, 0x76, 0xFD, 0x07, 0xBC, 0xF6, 0xDC, 0x7E, 0x67, 0xDD, 0xC4, 0x35,
+ 0x25, 0xA1, 0x1F, 0x17, 0xF8, 0x62, 0xE7, 0x78, 0x6C, 0x73, 0xAA, 0xB5, 0xAF, 0x79, 0x3D, 0xE0, 0x06, 0x7E, 0x67, 0xCF,
+ 0xE1, 0xA1, 0x97, 0x28, 0xEE, 0x79, 0x8E, 0x3E, 0xEF, 0x43, 0x8C, 0x83, 0xD3, 0x19, 0x1D, 0x3A, 0x9E, 0xFB, 0xF6, 0xDF,
+ 0x84, 0xD6, 0xDA, 0x0C, 0xDE, 0x6E, 0x23, 0x7B, 0x16, 0xB9, 0x21, 0x99, 0xE6, 0x24, 0x74, 0x9E, 0x7B, 0x0C, 0x7C, 0x78,
+ 0x26, 0xDE, 0x3E, 0xB1, 0x7D, 0x02, 0xE5, 0x4D, 0xA6, 0x81, 0x2B, 0x5A, 0x42, 0x53, 0x95, 0x12, 0x4F, 0xDD, 0xE5, 0x07,
+ 0x99, 0x4A, 0xDC, 0x8C, 0x80, 0x32, 0x76, 0x3D, 0x31, 0xDC, 0x71, 0x9B, 0x54, 0x5D, 0xA9, 0x26, 0xD9, 0xCF, 0xEF, 0x69,
+ 0xE3, 0x12, 0xBA, 0x5D, 0x45, 0xAE, 0x2B, 0x88, 0xF5, 0xF9, 0x7C, 0x31, 0x16, 0x2F, 0x89, 0xB6, 0xD8, 0xD1, 0x7D, 0x5A,
+ 0xB9, 0x74, 0x7A, 0xB7, 0xE2, 0x02, 0x97, 0xA6, 0x97, 0x5D, 0x5F, 0x45, 0x2D, 0x7B, 0x80, 0x5A, 0x97, 0x5E, 0xA5, 0x51,
+ 0xD8, 0x89, 0x57, 0xA1, 0x5A, 0x55, 0xC3, 0x06, 0x9D, 0x51, 0x43, 0x17, 0x54, 0x6A, 0x7C, 0xB7, 0xAB, 0x56, 0xE4, 0x25,
+ 0x44, 0xAB, 0x53, 0x1C, 0x4D, 0x76, 0xAD, 0x4C, 0x8F, 0x6F, 0x85, 0xCC, 0x65, 0x95, 0x55, 0x43, 0xA5, 0x48, 0x4B, 0xAB,
+ 0x7A, 0x2A, 0x09, 0xA2, 0x91, 0xF6, 0xC1, 0x95, 0xAA, 0x09, 0x42, 0x56, 0x60, 0x6E, 0x5A, 0x2E, 0xC7, 0x77, 0xD7, 0x41,
+ 0x5D, 0x3B, 0x6D, 0x54, 0x95, 0x27, 0x55, 0x34, 0xD4, 0x43, 0x59, 0x28, 0x42, 0xC0, 0xB9, 0xF6, 0x64, 0x5F, 0x2E, 0xA3,
+ 0x4A, 0xED, 0x05, 0xD4, 0x30, 0xA5, 0xB4, 0x8E, 0x74, 0x29, 0x3C, 0xC8, 0x5A, 0x47, 0xF4, 0x54, 0x01, 0x49, 0xC8, 0xC8,
+ 0xDC, 0x1E, 0xA3, 0xB1, 0x04, 0x6D, 0xB9, 0xCD, 0xAC, 0xA8, 0xA9, 0x98, 0x9C, 0x43, 0x03, 0x2D, 0xB3, 0x01, 0x31, 0x89,
+ 0x96, 0xEF, 0x94, 0xDC, 0x3A, 0x8B, 0x11, 0x2B, 0x97, 0xCF, 0x3D, 0xBE, 0xFC, 0x3A, 0xAC, 0xBA, 0x87, 0x49, 0xF6, 0x88,
+ 0x72, 0x98, 0x71, 0xAE, 0x64, 0xAD, 0xB7, 0x12, 0xB0, 0x40, 0x50, 0x51, 0xE5, 0x3F, 0x67, 0x1B, 0x9E, 0xF9, 0xC9, 0xC0,
+ 0xDB, 0xAE, 0x3A, 0xF3, 0xD6, 0x48, 0x98, 0x65, 0xF8, 0x70, 0xFA, 0x0E, 0x5C, 0xC8, 0xCC, 0x76, 0xE7, 0x66, 0xF4, 0xB1,
+ 0x34, 0xB0, 0x17, 0x98, 0x6D, 0x57, 0x84, 0x99, 0x99, 0x71, 0x11, 0xA6, 0x1B, 0xD5, 0x99, 0x77, 0x27, 0x84, 0x5B, 0x46,
+ 0x93, 0x2D, 0xD5, 0x3B, 0x53, 0xD0, 0xCD, 0x51, 0xAC, 0xE9, 0x8B, 0x6E, 0x2C, 0xF3, 0xB8, 0x9B, 0x62, 0xAE, 0x86, 0xEE,
+ 0x3B, 0x44, 0x2F, 0x39, 0x21, 0xA4, 0xD2, 0xAA, 0x8A, 0xA7, 0xB2, 0x09, 0x28, 0x50, 0xA7, 0xA8, 0x00, 0xAF, 0x2C, 0x81,
+ 0x2D, 0x7D, 0x7F, 0x83, 0xA6, 0x95, 0xF6, 0xB6, 0x37, 0x6A, 0xDA, 0x89, 0x67, 0xA6, 0xAF, 0x68, 0xF3, 0x69, 0x82, 0xF3,
+ 0x9B, 0x44, 0x47, 0x35, 0x07, 0x4D, 0x68, 0x70, 0xA7, 0x88, 0x26, 0x08, 0x99, 0xB1, 0xF0, 0x93, 0x5A, 0xEB, 0x45, 0xD7,
+ 0x16, 0xFD, 0xB0, 0xEA, 0xF2, 0x54, 0xAD, 0x3F, 0xB7, 0x23, 0x12, 0x41, 0x49, 0x4B, 0x94, 0x9A, 0xCD, 0xD5, 0x48, 0x75,
+ 0xB2, 0x49, 0xCF, 0x33, 0x0A, 0x84, 0x1B, 0x56, 0x7D, 0x06, 0x09, 0x04, 0x71, 0x3B, 0x6F, 0xB4, 0x75, 0x5D, 0xFC, 0xBD,
+ 0xBC, 0xC2, 0xC9, 0x55, 0x74, 0x85, 0xB9, 0x22, 0x23, 0x88, 0x9D, 0x6B, 0x4D, 0xBA, 0xA5, 0xB4, 0xB2, 0xE3, 0xBA, 0xAF,
+ 0xAF, 0x89, 0x67, 0x8D, 0x58, 0x08, 0x4F, 0x7E, 0xCD, 0x39, 0x3F, 0xD1, 0x03, 0x63, 0x9C, 0x90, 0x07, 0xBF, 0x6C, 0x91,
+ 0xEB, 0xEF, 0xC9, 0xED, 0xB0, 0xCC, 0xFA, 0xC7, 0x6F, 0xB8, 0xFD, 0x53, 0x54, 0xF5, 0x1C, 0x5E, 0x61, 0x11, 0x22, 0x32,
+ 0x5C, 0xBA, 0x77, 0xED, 0xE7, 0x4B, 0x38, 0x42, 0xBE, 0xD2, 0x80, 0xCF, 0x4C, 0xF7, 0x39, 0xC0, 0xC6, 0x7B, 0x9F, 0x4F,
+ 0xD3, 0x81, 0xE2, 0xDC, 0xFC, 0x4C, 0xC6, 0x31, 0x7F, 0xAE, 0x9E, 0x87, 0x2A, 0x03, 0xA9, 0xE0, 0x00, 0xC7, 0xA3, 0xA7,
+ 0x0C, 0x4C, 0x5B, 0x03, 0x6B, 0xF7, 0x8E, 0x6D, 0xCB, 0x10, 0x49, 0xA4, 0xD4, 0xEE, 0xD8, 0x07, 0x18, 0x39, 0xFE, 0x1D,
+ 0x37, 0xF5, 0xCF, 0xE7, 0x8E, 0xFC, 0x3D, 0x2D, 0x0E, 0xB7, 0xC2, 0x7A, 0x93, 0xBE, 0x76, 0x39, 0x39, 0xF5, 0xD8, 0x7E,
+ 0xA7, 0x6E, 0x14, 0xF8, 0xB9, 0x9C, 0xC0, 0xF6, 0x98, 0x8D, 0x1A, 0x11, 0x72, 0xB3, 0xB0, 0xC7, 0x5E, 0xA7, 0x7F, 0x5F,
+ 0xE8, 0x8C, 0x6F, 0xF1, 0x3E, 0xEE, 0x1F, 0xC7, 0xEF, 0xEF, 0xD7, 0x47, 0xF7, 0xFE, 0xDF, 0x2D, 0x23, 0xED, 0x4E, 0x7E,
+ 0xFA, 0xBF, 0x04, 0xF0, 0x68, 0xD4, 0xC1, 0xED, 0x60, 0x67, 0x24, 0x67, 0x3D, 0x46, 0x37, 0x27, 0x3D, 0xBB, 0xED, 0xD7,
+ 0x71, 0x9C, 0x67, 0xD7, 0x8E, 0x86, 0x5E, 0x5F, 0x12, 0xAF, 0xAF, 0x27, 0xC0, 0xE3, 0xE1, 0xAE, 0x82, 0xAE, 0x0C, 0xDB,
+ 0x0F, 0x4C, 0xE4, 0xB2, 0xCD, 0xA2, 0x5E, 0xDE, 0x75, 0x87, 0xB6, 0x24, 0x6C, 0x0E, 0x09, 0x19, 0x00, 0xF5, 0x24, 0x7E,
+ 0x78, 0xDB, 0x1D, 0x3F, 0x2E, 0x08, 0x59, 0x89, 0xB4, 0x4E, 0x71, 0x01, 0x96, 0x78, 0xFD, 0xF1, 0x7D, 0x2E, 0xB2, 0x62,
+ 0x03, 0x33, 0x29, 0x56, 0x30, 0x58, 0xB3, 0xE1, 0xB7, 0x1A, 0xCB, 0xDA, 0x49, 0xDB, 0x3D, 0x72, 0x70, 0x00, 0x38, 0x4E,
+ 0x33, 0x92, 0x70, 0x41, 0xDF, 0x73, 0xB1, 0xEF, 0xBE, 0x76, 0xE1, 0x08, 0xE1, 0x1F, 0x46, 0x75, 0x3F, 0x99, 0xDB, 0x3E,
+ 0x41, 0x23, 0x9E, 0x73, 0xDA, 0xDF, 0x2D, 0x20, 0xF2, 0xD7, 0xCB, 0x93, 0x91, 0xB6, 0xC7, 0x7C, 0x60, 0x9E, 0xD8, 0xC6,
+ 0x09, 0x1D, 0x4E, 0x09, 0x19, 0x38, 0xDB, 0x85, 0x55, 0x40, 0x59, 0xBD, 0xF9, 0x2D, 0xE7, 0xEC, 0xF8, 0xEA, 0x7A, 0xDE,
+ 0x6E, 0xDE, 0x2F, 0x21, 0xE8, 0x71, 0x78, 0x94, 0xBC, 0x7A, 0xE9, 0x9F, 0x57, 0x90, 0xA4, 0xB4, 0xE0, 0xE6, 0xC6, 0x52,
+ 0x52, 0x71, 0xB6, 0x32, 0x0E, 0xC4, 0xE3, 0xDD, 0x9C, 0x1E, 0xE3, 0x1B, 0x0E, 0x30, 0x73, 0xE5, 0x57, 0xE3, 0xDF, 0xF6,
+ 0xB4, 0x59, 0xB4, 0x6A, 0x2E, 0xCE, 0x56, 0x16, 0x66, 0xE4, 0x5E, 0x4E, 0xE1, 0xDB, 0x11, 0x2F, 0x7D, 0x4A, 0xFE, 0x0D,
+ 0xBE, 0x90, 0xCD, 0x49, 0xF0, 0x23, 0xA9, 0xA9, 0xAE, 0xC0, 0xAC, 0x26, 0x8F, 0x6D, 0x55, 0x61, 0x22, 0xD8, 0xB8, 0x2B,
+ 0x13, 0xE9, 0x72, 0xAE, 0xDD, 0x39, 0xBB, 0xEC, 0x75, 0x87, 0x19, 0xFF, 0x00, 0x27, 0x7E, 0x23, 0x74, 0xCA, 0x3F, 0x32,
+ 0xAF, 0x6B, 0x06, 0x2C, 0x59, 0x12, 0x60, 0x50, 0x75, 0x0E, 0xD8, 0x43, 0x5A, 0x97, 0xA7, 0x34, 0xE7, 0x95, 0x1D, 0x2D,
+ 0x5C, 0xD6, 0xEC, 0x63, 0x4D, 0x44, 0x55, 0x5D, 0x0F, 0xFC, 0xBD, 0xE6, 0x1C, 0xED, 0xD6, 0x4D, 0x2D, 0x2C, 0xB0, 0xBC,
+ 0xCD, 0x2C, 0x05, 0x54, 0xCB, 0x10, 0x45, 0x41, 0x09, 0xB8, 0x1B, 0xB4, 0xC5, 0x67, 0x53, 0x33, 0x6B, 0x34, 0xD5, 0xFE,
+ 0xBA, 0x2A, 0x5F, 0x65, 0x5B, 0xB4, 0xFB, 0x95, 0x25, 0xFA, 0x73, 0xAF, 0x41, 0x16, 0x8F, 0x83, 0x0F, 0x0B, 0x1F, 0x48,
+ 0xA5, 0x1A, 0x5D, 0xEB, 0xE0, 0x7E, 0xEF, 0xB7, 0x3C, 0x3E, 0xEB, 0x7C, 0xBA, 0x12, 0x6F, 0x3B, 0x97, 0xC1, 0xEE, 0xA0,
+ 0x57, 0x19, 0xB8, 0x74, 0xCA, 0xB5, 0x4C, 0x98, 0x9F, 0x31, 0x57, 0xB7, 0x87, 0x1D, 0x4D, 0xA2, 0x32, 0xFA, 0xAA, 0x5A,
+ 0x5F, 0x55, 0x90, 0xA2, 0x69, 0xD3, 0x29, 0x34, 0xFA, 0xED, 0x12, 0x84, 0xFB, 0xC8, 0xA5, 0xD7, 0xAD, 0xFD, 0x38, 0x90,
+ 0x81, 0x4C, 0x46, 0x6D, 0x7B, 0x9B, 0x2C, 0x6E, 0x4D, 0x74, 0x5B, 0xA7, 0x72, 0x9E, 0x69, 0x88, 0x3A, 0x8B, 0x88, 0xE3,
+ 0xA8, 0x85, 0xF2, 0x89, 0xAC, 0xFF, 0x00, 0xFA, 0x8A, 0xF6, 0x5A, 0x69, 0xDD, 0x5D, 0xDD, 0xBC, 0x53, 0xB8, 0x09, 0x59,
+ 0x68, 0xE9, 0xAE, 0x95, 0x89, 0x09, 0x91, 0x59, 0x8F, 0x66, 0xA4, 0x27, 0x5C, 0x80, 0xF1, 0x31, 0xE0, 0x9B, 0x57, 0xF4,
+ 0x72, 0xEE, 0x9D, 0xA7, 0xFA, 0xA3, 0xA7, 0xF5, 0xEB, 0x02, 0xF2, 0x69, 0xA7, 0x24, 0xB7, 0x4C, 0xAB, 0xB2, 0xD3, 0xF0,
+ 0x2B, 0x10, 0x52, 0xE2, 0x9A, 0x15, 0x6B, 0x62, 0xB7, 0x01, 0xD9, 0x54, 0x4B, 0x9E, 0x8C, 0xB7, 0x12, 0x52, 0x9A, 0x9D,
+ 0x16, 0x6C, 0xB6, 0x5B, 0x51, 0x0C, 0x4A, 0x11, 0xA4, 0xA5, 0x6C, 0x23, 0x5A, 0x6A, 0xA2, 0xA0, 0xAC, 0x69, 0x7B, 0x23,
+ 0xDC, 0xE7, 0x0F, 0xC1, 0x27, 0x5D, 0x74, 0x6E, 0x6D, 0x6F, 0x53, 0x22, 0x41, 0x07, 0x51, 0x05, 0x54, 0xA5, 0xFD, 0xA9,
+ 0x8C, 0x11, 0x26, 0x1C, 0x8C, 0x26, 0xA1, 0xCF, 0x0D, 0x1E, 0x01, 0xF5, 0x2B, 0x58, 0x6E, 0xBB, 0x8F, 0x47, 0x69, 0x54,
+ 0xC9, 0x72, 0x5D, 0xD5, 0x8D, 0x53, 0xD0, 0x34, 0xC0, 0x8C, 0xC4, 0x75, 0xAF, 0xC9, 0x91, 0x42, 0x99, 0x7B, 0xC9, 0xB9,
+ 0x6A, 0x2A, 0xC2, 0x4E, 0x19, 0x89, 0x6A, 0xB6, 0xDB, 0xB3, 0x9D, 0x50, 0x0D, 0xB4, 0xCB, 0x71, 0xC2, 0xD4, 0x39, 0xD1,
+ 0x95, 0x4D, 0x34, 0x51, 0x46, 0xF0, 0xFB, 0x5D, 0x55, 0x51, 0x55, 0xE3, 0xD9, 0x69, 0xEA, 0xEA, 0x89, 0x3F, 0xD3, 0x96,
+ 0x78, 0xD6, 0x55, 0xD3, 0xB3, 0xB7, 0x57, 0xE6, 0x35, 0x15, 0x52, 0x53, 0xB9, 0x53, 0x38, 0xEA, 0x0A, 0x7A, 0x60, 0xA5,
+ 0x89, 0x59, 0x85, 0x91, 0xF4, 0x9D, 0x3D, 0xBC, 0x74, 0xF8, 0x09, 0xB9, 0x7C, 0x1B, 0x78, 0x85, 0xB9, 0x34, 0xEE, 0x43,
+ 0x0F, 0x2E, 0x8F, 0x4C, 0x91, 0x32, 0x45, 0x15, 0xE2, 0x8C, 0x34, 0xFD, 0x0E, 0xE6, 0x6E, 0x3D, 0xCF, 0x4E, 0x2C, 0xAC,
+ 0x24, 0x25, 0x48, 0x62, 0xA6, 0xED, 0xD5, 0x1C, 0x04, 0x92, 0x94, 0x96, 0x79, 0x49, 0xCF, 0x50, 0x36, 0xE2, 0x9A, 0xB6,
+ 0xE2, 0x11, 0x84, 0x98, 0x86, 0xAE, 0xA2, 0x4B, 0xBE, 0xF4, 0xF9, 0xBC, 0x13, 0xC3, 0xD9, 0xFC, 0xBD, 0xFA, 0x3F, 0x30,
+ 0xF6, 0x2B, 0x40, 0xF6, 0x5F, 0x67, 0xAA, 0x8A, 0xA1, 0x2A, 0x15, 0x6E, 0x34, 0xE3, 0x0A, 0xA7, 0x9A, 0x80, 0x86, 0x14,
+ 0xCF, 0xD9, 0xE5, 0xC0, 0xCF, 0xDD, 0xE8, 0x47, 0x51, 0xDB, 0x61, 0xD0, 0x7A, 0x8F, 0x53, 0xB6, 0x38, 0xAB, 0xDF, 0x33,
+ 0x62, 0xE1, 0xDF, 0x33, 0xC8, 0xE4, 0x26, 0xD3, 0x16, 0x70, 0x00, 0xFB, 0x2F, 0xE6, 0x35, 0x13, 0x34, 0xD1, 0x48, 0x82,
+ 0x37, 0x85, 0x89, 0xB6, 0x59, 0xC1, 0xF2, 0x35, 0x11, 0x1D, 0x50, 0x2A, 0xE5, 0x24, 0x67, 0x18, 0xDC, 0x1E, 0x9D, 0x77,
+ 0x1B, 0x1F, 0x76, 0xFF, 0x00, 0x91, 0x1C, 0x39, 0x3B, 0xFA, 0x7C, 0x71, 0xEB, 0x9E, 0x38, 0xCC, 0x5B, 0x4E, 0xAA, 0x13,
+ 0xFE, 0x92, 0xC4, 0xD5, 0x55, 0x2C, 0xB1, 0x88, 0x1E, 0xF6, 0x66, 0xF0, 0x91, 0x7D, 0x06, 0xF3, 0x6B, 0x42, 0x8F, 0xD9,
+ 0xC7, 0x72, 0xA3, 0xB9, 0xED, 0xD7, 0xA6, 0x32, 0x09, 0xDF, 0x7E, 0x98, 0xDF, 0x83, 0xBC, 0x5A, 0x0B, 0x62, 0x3F, 0x9B,
+ 0x44, 0x3D, 0xB5, 0x35, 0x74, 0xDA, 0x2A, 0x54, 0xB4, 0x74, 0xC5, 0x30, 0x72, 0x25, 0x80, 0x88, 0x8F, 0x3C, 0xE7, 0x5A,
+ 0xC7, 0xD6, 0x12, 0x0F, 0x50, 0x72, 0x48, 0xC1, 0xFD, 0xDE, 0xA4, 0xFA, 0xFA, 0xE3, 0x1B, 0x9E, 0x09, 0x15, 0x84, 0x82,
+ 0x2F, 0xE5, 0xFA, 0x72, 0x4F, 0x3C, 0x76, 0xD4, 0xF7, 0xBF, 0xF7, 0xFB, 0x35, 0xAC, 0x71, 0xFC, 0x13, 0x93, 0xBE, 0xC7,
+ 0x23, 0x3B, 0xE7, 0xDF, 0xB6, 0x4F, 0xAE, 0x07, 0xE1, 0xBF, 0x0F, 0x46, 0x83, 0x5B, 0xDE, 0xF0, 0x3F, 0x1D, 0xFE, 0x03,
+ 0xAE, 0x77, 0xDF, 0xB6, 0xDB, 0xF0, 0x68, 0xD2, 0x5E, 0x7A, 0xBF, 0x79, 0x5F, 0x97, 0x06, 0x8D, 0x4A, 0xE6, 0x56, 0x09,
+ 0xC1, 0xEB, 0xD7, 0x7C, 0xF4, 0xF7, 0xA7, 0x6F, 0x5E, 0x98, 0xDB, 0x6E, 0x9C, 0x57, 0x53, 0xDD, 0x7B, 0x12, 0x91, 0xF2,
+ 0x8B, 0xBC, 0xFA, 0x1A, 0x6A, 0xB9, 0xF4, 0xF8, 0x18, 0x34, 0x98, 0x94, 0x02, 0xB2, 0x4F, 0x4F, 0x4D, 0xFA, 0x03, 0x9D,
+ 0xBE, 0x5E, 0xEF, 0x9E, 0x78, 0x95, 0x5E, 0x5E, 0xD6, 0x52, 0x49, 0x98, 0x5C, 0xA7, 0x86, 0x7E, 0x7A, 0x51, 0x36, 0x3F,
+ 0x7F, 0xDA, 0xFF, 0x00, 0x2D, 0x3A, 0x2D, 0x88, 0xD2, 0x6B, 0xF5, 0x8A, 0x65, 0x0A, 0x95, 0x06, 0xA1, 0x58, 0xAC, 0xD5,
+ 0xE6, 0x46, 0x81, 0x4B, 0xA3, 0xD1, 0xE0, 0xCA, 0xAA, 0xD5, 0xAA, 0x73, 0x66, 0x49, 0x6E, 0x24, 0x48, 0x54, 0xFA, 0x6C,
+ 0x26, 0x9E, 0x99, 0x2E, 0x64, 0xA9, 0x52, 0x18, 0x8B, 0x1A, 0x34, 0x76, 0x5C, 0x75, 0xF9, 0x2F, 0xB2, 0xC3, 0x28, 0x5B,
+ 0xCE, 0xB6, 0x95, 0x32, 0xA6, 0xE9, 0x90, 0xBD, 0x80, 0x39, 0xBD, 0xAD, 0xEB, 0xFC, 0x6B, 0x4D, 0xBA, 0x7D, 0xEA, 0xAA,
+ 0x80, 0x22, 0x9F, 0x6A, 0x00, 0x92, 0x58, 0x58, 0xE0, 0xF5, 0xED, 0x8D, 0x58, 0x9B, 0xFF, 0x00, 0xC3, 0xAE, 0xA7, 0x69,
+ 0x8B, 0xB0, 0xA9, 0x9A, 0xA3, 0xA6, 0xDA, 0x83, 0xA6, 0x35, 0x7A, 0x93, 0x2A, 0x7A, 0x9B, 0x4E, 0xD4, 0x4B, 0x36, 0xBF,
+ 0x67, 0xCA, 0xA9, 0xA1, 0x09, 0x2A, 0x5A, 0xA9, 0x82, 0xB7, 0x02, 0x1B, 0x35, 0x02, 0xD0, 0x27, 0xCD, 0x44, 0x27, 0x9F,
+ 0x71, 0x90, 0x0F, 0x9E, 0x84, 0x0D, 0x82, 0x37, 0x04, 0xCF, 0x51, 0x29, 0x33, 0x4B, 0x19, 0x12, 0x46, 0xDE, 0x3A, 0xA1,
+ 0x9B, 0x16, 0x9D, 0x5D, 0x2E, 0xD5, 0x63, 0xD2, 0xD1, 0x5F, 0x0F, 0x42, 0x31, 0x85, 0x58, 0xBC, 0xC2, 0x37, 0xB1, 0x95,
+ 0xB3, 0x15, 0x66, 0xEB, 0xA2, 0x48, 0x80, 0xB7, 0x1A, 0x71, 0x1C, 0xA3, 0x2A, 0x19, 0x23, 0xA8, 0xED, 0x92, 0xA2, 0x77,
+ 0x1E, 0x9D, 0x37, 0xD8, 0xE0, 0x1E, 0x1A, 0x1C, 0x36, 0x7C, 0xC3, 0xE9, 0x66, 0x71, 0xC9, 0xA5, 0x56, 0xD7, 0x4A, 0xB4,
+ 0xF5, 0x54, 0x49, 0xEC, 0x96, 0x4E, 0x51, 0xEF, 0x4D, 0x66, 0x2A, 0x9B, 0x7C, 0x75, 0x5F, 0xAE, 0x7A, 0x33, 0x72, 0x9B,
+ 0x79, 0x0E, 0x37, 0xE6, 0x36, 0xA0, 0x72, 0x92, 0x9C, 0xE4, 0x75, 0xE6, 0xED, 0x9C, 0x75, 0x1D, 0x30, 0x7A, 0x60, 0x90,
+ 0x38, 0xC7, 0x72, 0x92, 0xA1, 0xC6, 0x21, 0xF5, 0x2E, 0x77, 0xE6, 0x07, 0x98, 0xED, 0x7D, 0x64, 0x89, 0x12, 0x44, 0x92,
+ 0x1E, 0x38, 0xD7, 0xEF, 0x0E, 0x7E, 0x29, 0x6F, 0x9F, 0x05, 0x77, 0xE5, 0xBF, 0x39, 0x35, 0x2B, 0xAD, 0xED, 0x17, 0x87,
+ 0x74, 0x37, 0x72, 0x24, 0x5A, 0x95, 0x19, 0x14, 0xFB, 0xEB, 0x44, 0x2E, 0x67, 0x5D, 0x01, 0xED, 0x51, 0xD1, 0xAA, 0xB3,
+ 0x2A, 0xF6, 0x8A, 0x24, 0xF8, 0xF9, 0x2F, 0x5D, 0x56, 0x8A, 0x4A, 0xAD, 0xCB, 0xC6, 0x9C, 0x24, 0xC6, 0xA9, 0xD3, 0xDD,
+ 0x71, 0xC5, 0xAD, 0x58, 0xD3, 0xB8, 0xEC, 0xCE, 0xD6, 0xEC, 0x57, 0xB3, 0x52, 0xF6, 0xF6, 0x16, 0x30, 0xDA, 0x22, 0x61,
+ 0x26, 0x12, 0xD7, 0x8A, 0x87, 0x1A, 0xFD, 0x98, 0x52, 0x69, 0x42, 0x86, 0x4E, 0xAE, 0x93, 0x20, 0x9F, 0xD5, 0xB7, 0xC5,
+ 0x47, 0xBD, 0x47, 0xBD, 0x42, 0x45, 0x54, 0xD5, 0xFD, 0x04, 0xFC, 0x2C, 0xF8, 0xE2, 0xF0, 0xD9, 0xE3, 0xF7, 0x4D, 0xAD,
+ 0xBD, 0x03, 0xF1, 0xAC, 0xCE, 0x9E, 0x5C, 0xB7, 0x94, 0xDA, 0x14, 0x0B, 0xAB, 0x4E, 0x35, 0x38, 0x21, 0x34, 0x3B, 0x3F,
+ 0x58, 0x2D, 0xEA, 0x84, 0x46, 0xD7, 0x49, 0xD4, 0x4B, 0x1A, 0xB5, 0x0D, 0xD8, 0x92, 0xB4, 0xE6, 0xFB, 0x72, 0x2A, 0x90,
+ 0x8B, 0x9A, 0x87, 0x06, 0x74, 0x28, 0x8A, 0x98, 0x99, 0x49, 0x84, 0xB5, 0x40, 0x79, 0xCA, 0x4C, 0x63, 0x73, 0x63, 0x73,
+ 0x6A, 0xAE, 0xBD, 0xAB, 0xD2, 0xDC, 0x0B, 0x8D, 0x2E, 0x22, 0x72, 0x77, 0x33, 0x4F, 0x36, 0xD7, 0x2D, 0x5B, 0x75, 0xED,
+ 0xFF, 0x00, 0xCC, 0xDB, 0x92, 0x1E, 0x94, 0xCB, 0x42, 0x98, 0x52, 0x44, 0x73, 0x4B, 0xC9, 0x0D, 0xF3, 0xAE, 0x92, 0xE8,
+ 0x7E, 0x80, 0xF8, 0x3A, 0xF0, 0xA4, 0xF4, 0x8A, 0x86, 0x9A, 0x44, 0xA0, 0x33, 0x72, 0x55, 0x9B, 0x75, 0xB5, 0x5C, 0x35,
+ 0x2B, 0x91, 0x57, 0x75, 0xD2, 0xE4, 0x37, 0x92, 0xD8, 0x72, 0x24, 0x3A, 0x94, 0xB7, 0xDF, 0x34, 0xDA, 0x7B, 0x88, 0x6D,
+ 0xA4, 0xBE, 0x98, 0x0D, 0xC4, 0x13, 0x02, 0x1A, 0x44, 0xB7, 0x24, 0x06, 0xDB, 0x4A, 0x70, 0x4D, 0xFD, 0xD2, 0xF4, 0xD5,
+ 0x49, 0x00, 0xDB, 0xA4, 0x63, 0xBA, 0x67, 0x01, 0x7F, 0xF1, 0x8D, 0x7B, 0x95, 0xD6, 0x4D, 0x4A, 0x93, 0xC0, 0x04, 0xCC,
+ 0xE0, 0x01, 0x86, 0xE7, 0x6E, 0x35, 0x4B, 0x3E, 0x97, 0x0F, 0x05, 0x2C, 0xF8, 0xB3, 0xD2, 0x28, 0x5A, 0xCD, 0xA5, 0xF4,
+ 0xBF, 0xAF, 0xEF, 0xDB, 0x02, 0x9A, 0xF3, 0x75, 0x0A, 0x55, 0x39, 0x84, 0xC8, 0xA9, 0x5C, 0x96, 0x9C, 0x77, 0x17, 0x35,
+ 0xC4, 0xC0, 0x69, 0x80, 0xA7, 0x66, 0x55, 0xED, 0xF7, 0x17, 0x29, 0xF6, 0xE0, 0xA0, 0x2D, 0xF9, 0x94, 0xA9, 0xF5, 0x36,
+ 0xE2, 0x25, 0xC9, 0x88, 0x8B, 0x1D, 0xEB, 0xD9, 0xAD, 0xDB, 0xA9, 0xDB, 0xAE, 0xD0, 0xC9, 0xCF, 0x98, 0x99, 0x6C, 0xB3,
+ 0x09, 0x19, 0x78, 0xD6, 0xFF, 0x00, 0x85, 0xDF, 0xFC, 0x9A, 0xE1, 0xF7, 0x57, 0xE4, 0xDF, 0x0F, 0x03, 0xCB, 0xE0, 0xF5,
+ 0xD7, 0x8B, 0x0A, 0xCF, 0x87, 0x6A, 0xDA, 0xAB, 0x0A, 0x10, 0xA2, 0xBA, 0xA6, 0x5C, 0x79, 0x58, 0xC2, 0x15, 0xB6, 0x16,
+ 0x50, 0xA4, 0x91, 0x82, 0x52, 0xA4, 0x9C, 0x85, 0xA3, 0x62, 0x95, 0x85, 0x24, 0xF4, 0xE3, 0xB2, 0x69, 0x4B, 0x9E, 0xBE,
+ 0x1B, 0x19, 0xFB, 0xB1, 0xE3, 0x5E, 0xBB, 0x56, 0xD5, 0x41, 0x53, 0x03, 0x7B, 0x09, 0x2D, 0xBB, 0x99, 0x93, 0x10, 0xFD,
+ 0x2D, 0x78, 0xB4, 0x67, 0xE8, 0x9E, 0xD7, 0x9D, 0x67, 0xD0, 0x4D, 0x5A, 0xD7, 0xAB, 0x56, 0x05, 0x2E, 0x3D, 0xAF, 0xA5,
+ 0xB0, 0xE5, 0xBD, 0x12, 0x93, 0x54, 0x4D, 0x41, 0x37, 0x06, 0xA3, 0xCB, 0xA2, 0xC6, 0x35, 0x1B, 0xB2, 0x15, 0x94, 0xD3,
+ 0x11, 0xDC, 0x8E, 0xB5, 0x5B, 0x14, 0xA4, 0x97, 0xE5, 0x49, 0x9C, 0xE3, 0x6C, 0xD4, 0x2A, 0x59, 0xA1, 0xD3, 0xFC, 0xC9,
+ 0xCD, 0xC9, 0x31, 0xA2, 0xAD, 0xEA, 0x69, 0xAA, 0x9A, 0x3F, 0xD5, 0x84, 0xB8, 0x71, 0x78, 0x31, 0x38, 0xB8, 0xAF, 0x31,
+ 0xAC, 0x6B, 0xFC, 0x4E, 0xD5, 0x1B, 0x94, 0xED, 0xB3, 0x57, 0x5E, 0x64, 0xF6, 0x69, 0x92, 0x29, 0x91, 0xBC, 0x8E, 0x13,
+ 0x01, 0x36, 0x22, 0x79, 0xB3, 0x7B, 0x69, 0x25, 0x6E, 0x86, 0xA2, 0xE3, 0x71, 0x5C, 0x71, 0x85, 0xA4, 0x38, 0x83, 0xCA,
+ 0xA1, 0xF6, 0x14, 0x02, 0x81, 0x47, 0xD9, 0x24, 0x82, 0x92, 0x0E, 0x7A, 0x11, 0x92, 0x08, 0xCF, 0x17, 0x03, 0x8A, 0xA2,
+ 0x66, 0x46, 0x6E, 0xF6, 0x89, 0xB3, 0x68, 0xFE, 0xDA, 0xB2, 0x8A, 0x2A, 0x64, 0x4A, 0x23, 0xDE, 0x82, 0xCF, 0xFD, 0x5D,
+ 0x8F, 0x81, 0x0F, 0x1E, 0x2B, 0xCD, 0x71, 0x85, 0x53, 0x5D, 0x6D, 0x89, 0x5F, 0xB3, 0x7D, 0xF7, 0x3C, 0xA8, 0xEC, 0xE0,
+ 0x97, 0xE4, 0xBA, 0x4E, 0x03, 0x51, 0xD9, 0x40, 0x53, 0xAF, 0x2F, 0xA1, 0xF2, 0xDB, 0x42, 0x97, 0xB9, 0x18, 0xCE, 0x38,
+ 0x03, 0xA7, 0x38, 0x79, 0x8B, 0x09, 0xF3, 0xEF, 0x66, 0xDC, 0x27, 0x89, 0xAB, 0x6E, 0xAA, 0x6F, 0x0A, 0x1E, 0xF5, 0x44,
+ 0x74, 0x9D, 0xA7, 0x92, 0xC9, 0x33, 0x6E, 0xD0, 0x69, 0xA0, 0xEC, 0xB4, 0xAC, 0x73, 0x21, 0x43, 0x72, 0xAF, 0x8E, 0xC7,
+ 0x94, 0x8C, 0x60, 0x29, 0x04, 0x10, 0x52, 0xA4, 0x10, 0x08, 0x20, 0xA4, 0x80, 0xA1, 0xB5, 0x0D, 0xB8, 0xC4, 0xB9, 0x21,
+ 0x96, 0x46, 0x42, 0xE7, 0x2F, 0xC7, 0x59, 0xFC, 0x9F, 0x4C, 0x68, 0x25, 0x3E, 0x0F, 0x43, 0xF8, 0x1C, 0x7A, 0xFA, 0x12,
+ 0x78, 0x3A, 0xA9, 0xEE, 0x7C, 0xF4, 0x69, 0x3F, 0x38, 0x7B, 0xBF, 0x03, 0xC2, 0xEB, 0xA7, 0xBF, 0xE8, 0xFF, 0x00, 0x1A,
+ 0x35, 0x27, 0x2E, 0x48, 0xF5, 0xC0, 0xCE, 0x7E, 0x1F, 0x8F, 0xF2, 0x1F, 0x1F, 0x5A, 0xD1, 0xAD, 0x6C, 0xB9, 0xE5, 0xB0,
+ 0x70, 0xA0, 0x3A, 0x92, 0xA3, 0xBE, 0x36, 0x18, 0xEB, 0xEF, 0xEB, 0xD3, 0xE1, 0x81, 0xBA, 0x49, 0xCE, 0x3B, 0x4F, 0xDB,
+ 0xF0, 0x98, 0xD3, 0x42, 0x06, 0x6E, 0xCC, 0x84, 0x90, 0x63, 0x23, 0x79, 0xBF, 0xA7, 0xC7, 0x4D, 0x8B, 0x43, 0xC4, 0x5D,
+ 0x1B, 0x42, 0xF5, 0x36, 0x15, 0xD1, 0x77, 0xD4, 0xAF, 0xDB, 0x56, 0x92, 0x95, 0xDB, 0x95, 0x2B, 0x6F, 0x53, 0xB4, 0xD5,
+ 0xC5, 0x26, 0xEF, 0xD2, 0xCB, 0xF6, 0xCF, 0xAE, 0xAA, 0xB5, 0x6F, 0x5C, 0xF1, 0x5B, 0x42, 0x83, 0x8F, 0x40, 0x71, 0x52,
+ 0x5E, 0x6A, 0x58, 0x6B, 0x9D, 0x4D, 0xC8, 0x89, 0x0D, 0x4B, 0x6D, 0x49, 0x50, 0x29, 0xCB, 0xF3, 0x69, 0xA2, 0xB6, 0x9D,
+ 0xCA, 0x5F, 0xCA, 0xAA, 0x90, 0x9A, 0x61, 0xAA, 0x9A, 0xA9, 0x5B, 0xB3, 0x32, 0x43, 0x11, 0x86, 0xC4, 0x26, 0xB2, 0xAF,
+ 0x72, 0xAD, 0xB2, 0xE9, 0xD0, 0x8D, 0x29, 0x50, 0xB4, 0x22, 0x44, 0x55, 0x04, 0xD3, 0x25, 0xA4, 0xB0, 0x5B, 0xD7, 0xD5,
+ 0x9F, 0x87, 0xBF, 0xA7, 0x67, 0x4A, 0x3C, 0x44, 0x69, 0xAA, 0x34, 0x5F, 0xC5, 0x95, 0xBB, 0xA3, 0x3E, 0x39, 0xF4, 0xF6,
+ 0xAB, 0x19, 0xA8, 0x95, 0x2A, 0xBE, 0x9E, 0xD4, 0x2D, 0xFB, 0x2B, 0x5B, 0x4B, 0x49, 0x42, 0x92, 0x8A, 0xC5, 0x73, 0x43,
+ 0xAF, 0x79, 0xD4, 0x08, 0x35, 0x4B, 0xAE, 0x30, 0x52, 0x9F, 0x4D, 0xC1, 0xA6, 0x17, 0x2D, 0xBB, 0x5C, 0x44, 0xA6, 0xC4,
+ 0xA8, 0x11, 0x84, 0xB5, 0x82, 0xA8, 0x3F, 0x0F, 0x45, 0x75, 0x75, 0xFE, 0x1B, 0x76, 0x91, 0x99, 0xE9, 0x18, 0xBF, 0x9A,
+ 0x2A, 0x4A, 0x89, 0x42, 0xC2, 0x8D, 0xEC, 0x10, 0x6B, 0x9F, 0xF2, 0xCE, 0xAE, 0xBD, 0x9A, 0xEA, 0xDB, 0x78, 0x47, 0xAE,
+ 0x83, 0x88, 0xEB, 0xA1, 0xAA, 0xA0, 0xB6, 0x2A, 0xA7, 0x1E, 0x35, 0xCA, 0x6F, 0x1F, 0xBA, 0x69, 0xE1, 0x46, 0xDA, 0x88,
+ 0xFE, 0xAA, 0x78, 0x39, 0xF1, 0x15, 0x4D, 0xBF, 0xEC, 0x27, 0x6A, 0xD4, 0xF8, 0x17, 0x4F, 0x87, 0x4D, 0x5F, 0x6A, 0xA5,
+ 0xA7, 0x9E, 0x2A, 0x34, 0x6E, 0x5D, 0x72, 0x43, 0x8C, 0x53, 0xC2, 0x6D, 0x0B, 0xCA, 0x05, 0x0E, 0xAF, 0xAA, 0x36, 0x2A,
+ 0x26, 0x06, 0xE9, 0xEE, 0x5C, 0x74, 0x58, 0xD3, 0x2A, 0xD4, 0x17, 0x65, 0x40, 0x6E, 0xA7, 0x2A, 0xE2, 0x87, 0x21, 0xCA,
+ 0xEB, 0x5A, 0x1D, 0x61, 0x59, 0xBD, 0x4F, 0x4A, 0x05, 0xF0, 0x33, 0x11, 0xD0, 0x2C, 0xCF, 0x88, 0x4B, 0x49, 0x11, 0xAE,
+ 0xED, 0xAD, 0xDA, 0xDA, 0x6A, 0xA3, 0x7C, 0x6E, 0x56, 0x53, 0xBB, 0xB5, 0xD3, 0x5D, 0x15, 0x20, 0x44, 0xB4, 0xFB, 0xB5,
+ 0x0B, 0x99, 0x24, 0x11, 0xBD, 0xB5, 0xCA, 0xE6, 0xE4, 0x43, 0xAA, 0xF2, 0xAC, 0x3C, 0xCA, 0x19, 0x7C, 0x25, 0x48, 0x75,
+ 0x4B, 0x4A, 0x10, 0x52, 0xB1, 0x91, 0xF6, 0xD4, 0x40, 0x19, 0x07, 0x39, 0x38, 0xFB, 0x39, 0x38, 0x3C, 0xA4, 0x1B, 0x11,
+ 0xA4, 0x83, 0xA8, 0x83, 0x3C, 0xFA, 0xCF, 0xDC, 0xFC, 0xF4, 0x14, 0xD5, 0x5A, 0x40, 0xD6, 0xB7, 0xA9, 0x5E, 0xDE, 0xF2,
+ 0xBC, 0x73, 0x13, 0xA1, 0xEA, 0x7A, 0x40, 0xFD, 0xD9, 0x05, 0xC8, 0xF4, 0x90, 0xCD, 0x6D, 0xF9, 0x68, 0x28, 0x62, 0x9F,
+ 0x4A, 0x42, 0xAA, 0xF3, 0x65, 0xB8, 0xE7, 0xD9, 0x4B, 0x51, 0xE1, 0xC2, 0x4B, 0xEF, 0xBE, 0xE3, 0xA4, 0xF2, 0x36, 0x94,
+ 0x36, 0xA0, 0xA5, 0xE0, 0x1D, 0x8E, 0x44, 0x57, 0xB6, 0x54, 0x5E, 0xD6, 0x0B, 0x53, 0x28, 0x71, 0x19, 0x00, 0x0B, 0xC1,
+ 0x7B, 0xF7, 0xD6, 0xCE, 0xC5, 0x24, 0x35, 0x55, 0x1C, 0xC3, 0x49, 0x07, 0x89, 0xA9, 0x6C, 0xF6, 0xE4, 0xBC, 0xB1, 0xA9,
+ 0xC9, 0x8B, 0x93, 0x51, 0xBC, 0x37, 0x69, 0xB7, 0x87, 0xCD, 0x1C, 0xAB, 0x5B, 0xF7, 0x75, 0x12, 0xAB, 0xA6, 0x30, 0x2A,
+ 0xAF, 0xCE, 0xAC, 0xDC, 0x74, 0x6A, 0xCD, 0xB6, 0xE3, 0x4F, 0x5C, 0xD7, 0x15, 0x52, 0xE7, 0x8F, 0x41, 0xA1, 0x9A, 0xB4,
+ 0x58, 0x95, 0x39, 0x34, 0x3B, 0x4A, 0x34, 0xE8, 0xB4, 0xC3, 0x3D, 0xB8, 0xCC, 0x46, 0xA8, 0xBF, 0x1E, 0x52, 0xE9, 0xC5,
+ 0xC8, 0x26, 0x34, 0x97, 0x7A, 0x0E, 0x93, 0x6B, 0x6B, 0x6E, 0xEF, 0xE5, 0x91, 0x55, 0x51, 0x55, 0xA6, 0x50, 0x20, 0xB8,
+ 0x7F, 0x55, 0xA2, 0x63, 0x8D, 0x67, 0xB5, 0xB3, 0x45, 0x26, 0xE6, 0xE7, 0x50, 0xD0, 0x74, 0x80, 0x85, 0x49, 0x4D, 0x14,
+ 0xC1, 0xD4, 0x53, 0x24, 0xC4, 0x59, 0x94, 0x20, 0xE6, 0x35, 0x7B, 0x34, 0x8F, 0xE9, 0x04, 0xD4, 0x5A, 0x53, 0x16, 0xDA,
+ 0xDC, 0xB8, 0xAB, 0x55, 0x24, 0xCD, 0x6D, 0xD6, 0x24, 0x46, 0x55, 0xC4, 0xE5, 0x46, 0x40, 0x66, 0x90, 0x64, 0x3D, 0x33,
+ 0x31, 0x22, 0xC6, 0xA8, 0xF3, 0x79, 0x69, 0x8E, 0xDA, 0x9D, 0x66, 0x12, 0xA3, 0x35, 0x19, 0xB4, 0xBD, 0x1D, 0xF1, 0x1D,
+ 0xB4, 0xB8, 0x1E, 0xD2, 0x8D, 0xA2, 0xBA, 0x66, 0x94, 0xAA, 0x41, 0x61, 0x06, 0x55, 0x17, 0x88, 0xBE, 0x4E, 0x90, 0xCF,
+ 0x26, 0xB2, 0xAA, 0x8D, 0xAA, 0xBA, 0xA3, 0xA4, 0x48, 0x65, 0x12, 0xEC, 0x5D, 0x92, 0xC3, 0x29, 0x74, 0xB9, 0x36, 0x6C,
+ 0x7A, 0x48, 0xF0, 0x11, 0xF4, 0xB0, 0xD9, 0xB0, 0x51, 0x06, 0xD3, 0xD4, 0xF9, 0xD3, 0x21, 0xD1, 0x27, 0xA2, 0x29, 0x5C,
+ 0xE9, 0x05, 0x2F, 0x31, 0x4D, 0x7E, 0x40, 0x61, 0x11, 0xA5, 0xC5, 0x9C, 0xBF, 0x29, 0xC9, 0x49, 0x90, 0x5C, 0x0B, 0x79,
+ 0x87, 0x90, 0x56, 0xA2, 0xA5, 0x79, 0x13, 0x5F, 0x52, 0x3C, 0x86, 0x39, 0xBF, 0x13, 0xF8, 0x5E, 0xA2, 0x4F, 0x66, 0xA2,
+ 0x7D, 0xA7, 0x19, 0x8B, 0xDD, 0xB3, 0x1C, 0x58, 0x8B, 0x5B, 0x5C, 0x3B, 0x9B, 0x15, 0x13, 0x55, 0x1E, 0xD0, 0x4C, 0xDE,
+ 0x51, 0x1E, 0x4E, 0x24, 0x86, 0x71, 0x7F, 0x8E, 0xBA, 0x67, 0x5F, 0xF0, 0xA3, 0xF4, 0x7F, 0xF8, 0x84, 0xB8, 0x06, 0xAC,
+ 0xB3, 0x1A, 0xD2, 0x7E, 0x75, 0x72, 0x47, 0xD6, 0x75, 0x89, 0x56, 0x75, 0xF0, 0xF5, 0xA7, 0x02, 0xE3, 0x96, 0xEA, 0x92,
+ 0xEB, 0xB2, 0x6B, 0xD4, 0x28, 0x33, 0xA2, 0x34, 0x2A, 0x12, 0x4E, 0x4C, 0xE9, 0x2C, 0x46, 0x81, 0x3E, 0x52, 0xD6, 0xB7,
+ 0x25, 0xBE, 0xEB, 0xEA, 0x2E, 0x9F, 0x3E, 0x77, 0xE9, 0xB3, 0x4A, 0x85, 0xA9, 0xAA, 0x1A, 0xA0, 0x46, 0x4A, 0x6A, 0x8B,
+ 0x9F, 0xA2, 0x7C, 0x4D, 0x66, 0x6E, 0xEE, 0xD0, 0x14, 0x95, 0x20, 0x60, 0x41, 0x8F, 0x98, 0xDB, 0xB1, 0x83, 0x8D, 0x5D,
+ 0x7B, 0x3A, 0x4E, 0x92, 0xD9, 0xD4, 0x0A, 0x45, 0x8B, 0x65, 0x4C, 0xB2, 0xE8, 0x36, 0xF5, 0x0A, 0x03, 0x74, 0xDA, 0x3D,
+ 0xBD, 0x47, 0x99, 0x4D, 0x8F, 0x02, 0x0C, 0x24, 0x79, 0x98, 0x66, 0x3C, 0x74, 0x3A, 0x50, 0xA0, 0xEA, 0x94, 0xEB, 0xAF,
+ 0x38, 0xB5, 0x38, 0xEC, 0xA7, 0xDC, 0x79, 0xF9, 0x2E, 0x3A, 0xF3, 0xAE, 0xAD, 0x50, 0xD1, 0xB8, 0xCA, 0xD1, 0x5D, 0xB2,
+ 0xA3, 0x6E, 0x79, 0xE0, 0x3E, 0x44, 0x07, 0x06, 0xB3, 0x65, 0x56, 0xA9, 0x57, 0x33, 0x96, 0x7B, 0xEB, 0x99, 0xDA, 0xFF,
+ 0x00, 0xF4, 0x42, 0xF8, 0x43, 0xD4, 0x8A, 0x9D, 0x5E, 0xFD, 0x9F, 0x73, 0xDD, 0xBA, 0x45, 0x6D, 0xBA, 0xE4, 0xBA, 0xDD,
+ 0xCD, 0x06, 0xD7, 0xAD, 0x5A, 0x70, 0x2D, 0x18, 0xAC, 0x2D, 0x4A, 0x95, 0x51, 0x95, 0x06, 0x45, 0xCF, 0x44, 0xAA, 0x26,
+ 0xD9, 0x88, 0xAC, 0xBB, 0x21, 0xC4, 0x47, 0x96, 0xAA, 0x6C, 0x30, 0xA3, 0xEC, 0x91, 0x63, 0x32, 0x94, 0xB2, 0x34, 0xA3,
+ 0x7B, 0x70, 0x9A, 0x5A, 0x0A, 0x9B, 0x70, 0xCD, 0xB9, 0xB6, 0x3F, 0xB6, 0x59, 0x9D, 0x6F, 0x4F, 0xE2, 0x77, 0x40, 0xA4,
+ 0x8A, 0xDB, 0x47, 0x51, 0xD4, 0xD9, 0x22, 0x49, 0x3A, 0x83, 0xB3, 0x7D, 0x78, 0xEA, 0xFA, 0x52, 0x75, 0xA7, 0xC1, 0xBE,
+ 0x95, 0x45, 0x8F, 0xE1, 0xFF, 0x00, 0xC1, 0x0E, 0x8F, 0x5B, 0x2D, 0x50, 0x2E, 0x29, 0xAA, 0x7A, 0x7E, 0xBB, 0x5F, 0x31,
+ 0x9C, 0xBD, 0xB5, 0x93, 0x5A, 0x59, 0xB5, 0xAA, 0xAE, 0xC5, 0x95, 0x77, 0x37, 0x75, 0x5C, 0x88, 0x76, 0xA1, 0xA7, 0xFA,
+ 0x15, 0x4D, 0xB8, 0xA3, 0xAA, 0x15, 0xBD, 0x45, 0xB4, 0xE2, 0x5B, 0x55, 0x4D, 0x69, 0xB8, 0xE9, 0x4E, 0xBC, 0xF3, 0x74,
+ 0x2D, 0x3B, 0xA1, 0xD4, 0x13, 0x73, 0x75, 0x15, 0x57, 0x46, 0xDF, 0x5E, 0xEB, 0xED, 0x6E, 0x53, 0x14, 0x52, 0x47, 0x49,
+ 0x28, 0x2B, 0x30, 0xD5, 0x09, 0xDE, 0x54, 0x42, 0xC2, 0x3D, 0xF4, 0x9B, 0xB5, 0x51, 0x55, 0x7B, 0xD5, 0xAD, 0x40, 0xD2,
+ 0x6D, 0x8C, 0x51, 0x42, 0x94, 0xAD, 0x3D, 0x23, 0x0D, 0x68, 0xE5, 0x13, 0x6E, 0x1B, 0x2C, 0x47, 0x17, 0xA2, 0x4A, 0x70,
+ 0x34, 0x10, 0xEB, 0xCE, 0x48, 0x74, 0x95, 0xB8, 0xF3, 0xCE, 0xAC, 0x2D, 0xE7, 0xDE, 0x75, 0x4A, 0x71, 0xE7, 0xDD, 0x5E,
+ 0x00, 0x53, 0xAF, 0x3C, 0xA7, 0x1D, 0x75, 0x60, 0x00, 0xA7, 0x16, 0xA2, 0x12, 0x91, 0xB0, 0x54, 0xBE, 0xC8, 0xCA, 0xDA,
+ 0xF3, 0xFD, 0x4C, 0xDE, 0x6F, 0xDB, 0x3F, 0x6E, 0x9E, 0x3B, 0xE2, 0x49, 0x22, 0xCE, 0x38, 0x3E, 0xF3, 0xA3, 0x83, 0xD9,
+ 0x03, 0xAE, 0x31, 0xDB, 0x1F, 0xAE, 0xC7, 0x86, 0xE7, 0xEF, 0xF6, 0xE3, 0xB6, 0x8D, 0x61, 0xE6, 0x8F, 0x77, 0xFB, 0xC3,
+ 0xF9, 0x70, 0xB4, 0x6A, 0x44, 0x72, 0x4A, 0xBF, 0x78, 0xF5, 0xE8, 0x06, 0x33, 0xD7, 0xDF, 0x9D, 0xFD, 0xE4, 0x8F, 0x5D,
+ 0xF8, 0xE8, 0xFB, 0xF1, 0xF2, 0x9F, 0xEF, 0xA3, 0xBD, 0xBC, 0x4C, 0xF2, 0xE1, 0x88, 0xB9, 0x13, 0x24, 0x8C, 0x99, 0xD6,
+ 0xBA, 0x4B, 0xBE, 0x62, 0x31, 0x9C, 0xE3, 0xD0, 0xE7, 0x04, 0x7B, 0xF7, 0xE8, 0x73, 0xD7, 0x20, 0xEF, 0xDF, 0x83, 0xE3,
+ 0xF7, 0xF7, 0xFE, 0x74, 0x6A, 0x2F, 0xBA, 0x68, 0x4C, 0x55, 0x9A, 0x71, 0x89, 0x4C, 0x21, 0xC4, 0x38, 0x95, 0x05, 0x05,
+ 0xA7, 0x9D, 0x2B, 0x07, 0xD7, 0x3B, 0x10, 0x7B, 0x82, 0x4A, 0x76, 0x1D, 0xF7, 0xE3, 0x9A, 0xBA, 0x0A, 0xAC, 0xCC, 0x5F,
+ 0xE5, 0x6E, 0xE4, 0xFE, 0x87, 0xE9, 0x65, 0x17, 0x6E, 0xC3, 0x16, 0xE2, 0xDF, 0xB3, 0xCF, 0xF1, 0x6D, 0x56, 0xEA, 0xC6,
+ 0x86, 0x5A, 0xB2, 0xDE, 0x53, 0xE8, 0xA6, 0xA2, 0x3B, 0xE1, 0x7C, 0xED, 0xBF, 0x0C, 0xAE, 0x2B, 0xCD, 0x38, 0x14, 0x56,
+ 0x97, 0x10, 0xE4, 0x75, 0x36, 0xA4, 0x29, 0x2A, 0xDD, 0x25, 0x04, 0x28, 0x28, 0x05, 0x27, 0x97, 0x23, 0x8C, 0x5D, 0x90,
+ 0xB8, 0xA1, 0x30, 0x33, 0x51, 0x38, 0xC4, 0x7A, 0xC3, 0x11, 0xAC, 0xDD, 0x9D, 0xB5, 0x98, 0x86, 0x66, 0x45, 0xA5, 0x3D,
+ 0x3A, 0x50, 0xF8, 0xC6, 0xA5, 0xAB, 0x7A, 0xE2, 0xD6, 0xCA, 0x15, 0x32, 0x2D, 0xB6, 0x35, 0x5E, 0xE5, 0xAD, 0xDB, 0x94,
+ 0xF5, 0x05, 0x51, 0xE0, 0x5E, 0x70, 0xED, 0xFB, 0xEA, 0x5D, 0xB4, 0xB0, 0x92, 0x84, 0xBD, 0x68, 0xD7, 0x2E, 0xFA, 0x3D,
+ 0x62, 0xB9, 0x6B, 0x48, 0x65, 0x27, 0xFC, 0xDD, 0xEA, 0x3D, 0x46, 0x39, 0x8A, 0xAC, 0x3B, 0x18, 0x36, 0xF2, 0x10, 0xB4,
+ 0x69, 0x4D, 0x5F, 0x88, 0x0E, 0x93, 0x75, 0x48, 0x7A, 0x7A, 0x82, 0xB6, 0x99, 0xCA, 0x35, 0x8B, 0x4B, 0xD3, 0x37, 0x09,
+ 0x18, 0x88, 0x74, 0x8D, 0xA8, 0x7D, 0xFA, 0x92, 0xD2, 0x39, 0x81, 0x90, 0xEA, 0x89, 0x42, 0xF6, 0x55, 0xC5, 0xC9, 0x9D,
+ 0x4A, 0x5A, 0x43, 0xAB, 0x96, 0xA6, 0x8C, 0xEA, 0x4D, 0x97, 0x71, 0x5E, 0xEE, 0xD1, 0x69, 0xF4, 0x8A, 0x1D, 0x42, 0xDD,
+ 0xA9, 0x50, 0xEE, 0x2B, 0xC6, 0xC5, 0x63, 0x54, 0xB4, 0xFE, 0x8D, 0x71, 0xDB, 0xD5, 0x96, 0x2A, 0x11, 0xE0, 0xEA, 0x7D,
+ 0x81, 0x29, 0xC4, 0xAE, 0xE3, 0xD3, 0xFB, 0xA6, 0x3A, 0x3E, 0xAA, 0xB8, 0x1C, 0x8E, 0x5E, 0x97, 0x01, 0xC8, 0xF0, 0xDD,
+ 0x7D, 0xA9, 0x10, 0x25, 0xCF, 0x4F, 0x15, 0x46, 0xE5, 0x14, 0x55, 0xD1, 0xBA, 0xBD, 0x3D, 0x34, 0xD3, 0x4D, 0x64, 0xAD,
+ 0x0C, 0x16, 0xA8, 0x9E, 0x46, 0xED, 0x30, 0x96, 0x8C, 0x43, 0xA3, 0x5F, 0x42, 0x2C, 0x94, 0x23, 0x42, 0xD3, 0x53, 0x4A,
+ 0x75, 0x5A, 0x7A, 0x8F, 0x76, 0x33, 0x4A, 0x8D, 0x22, 0x7B, 0x50, 0x5F, 0x5E, 0xD8, 0xF4, 0x4B, 0xE9, 0xC0, 0xAA, 0x58,
+ 0xBA, 0x71, 0x42, 0xB9, 0x6E, 0x4F, 0x07, 0x7A, 0x1F, 0x5F, 0xA6, 0xCD, 0xA6, 0x34, 0x9B, 0x73, 0x55, 0xBC, 0x2F, 0x56,
+ 0x20, 0x43, 0xB0, 0x6B, 0x88, 0x0C, 0x24, 0x32, 0x63, 0xD0, 0xFE, 0xA4, 0x95, 0x55, 0xA2, 0x3A, 0xE6, 0x42, 0x97, 0x4A,
+ 0x15, 0x65, 0xAA, 0x38, 0x0E, 0xB4, 0x82, 0x92, 0xD7, 0x28, 0xD6, 0xAF, 0xC0, 0x55, 0x53, 0xD4, 0x6E, 0x55, 0x5D, 0x15,
+ 0x5F, 0xAE, 0x97, 0xAF, 0xA8, 0x57, 0x17, 0x2A, 0xF0, 0xD9, 0x73, 0x3D, 0xB5, 0xC8, 0xED, 0x51, 0x5D, 0x65, 0x3F, 0x9B,
+ 0x50, 0xC0, 0xF4, 0xEE, 0xD3, 0xED, 0x5E, 0xA4, 0xF6, 0x6A, 0x16, 0x8A, 0x80, 0x0A, 0xBA, 0x84, 0xB5, 0xE2, 0xDA, 0xF3,
+ 0xC1, 0xF4, 0x97, 0xF8, 0xC4, 0xB8, 0xBC, 0x6D, 0xEA, 0xD4, 0xAD, 0x40, 0xAF, 0xD0, 0xE8, 0xB6, 0xDB, 0x92, 0xD9, 0x11,
+ 0xE2, 0x00, 0xEB, 0x71, 0xE3, 0xC1, 0xA5, 0x42, 0x80, 0xB9, 0x8D, 0x31, 0xED, 0xBE, 0x6C, 0xB7, 0xA6, 0xAD, 0x84, 0x43,
+ 0x44, 0x46, 0x8B, 0x31, 0xD3, 0x29, 0x15, 0x36, 0xD0, 0xD3, 0x92, 0x62, 0x95, 0xB9, 0xC6, 0xCE, 0xD9, 0xB7, 0xB4, 0x6D,
+ 0xFB, 0xA6, 0x3D, 0xB6, 0x2A, 0x60, 0x2A, 0x55, 0x26, 0xD2, 0x42, 0x40, 0xF3, 0x33, 0x63, 0xB6, 0x9A, 0x69, 0xD8, 0xD9,
+ 0xAB, 0x6F, 0xA8, 0xA9, 0xAA, 0xA2, 0x52, 0x18, 0x7A, 0xA2, 0xAB, 0x62, 0xC1, 0x24, 0x4F, 0xA5, 0xB5, 0x41, 0x2D, 0x99,
+ 0xD1, 0x60, 0x4D, 0xF3, 0x11, 0x48, 0xA1, 0xCA, 0x2C, 0x4D, 0x75, 0x31, 0x90, 0xB9, 0x33, 0x1D, 0x5C, 0x1E, 0x68, 0x8D,
+ 0x35, 0x4F, 0x6D, 0x97, 0x91, 0xC9, 0x22, 0x50, 0x8E, 0xA6, 0x19, 0x71, 0xDF, 0x22, 0x62, 0x10, 0xD4, 0xC1, 0x24, 0x3C,
+ 0xE2, 0xE2, 0x48, 0xF2, 0xA3, 0x56, 0xDD, 0x6D, 0x0C, 0xD2, 0x02, 0x3E, 0xC8, 0xAB, 0xD3, 0x68, 0x29, 0xF3, 0x9F, 0x68,
+ 0x6D, 0x39, 0x52, 0x23, 0x9D, 0x9E, 0xE8, 0xF7, 0x2C, 0xF9, 0xC5, 0xA1, 0x72, 0x44, 0x63, 0xB6, 0xAC, 0x7D, 0x17, 0x59,
+ 0xE7, 0x44, 0xA9, 0xBD, 0x52, 0xF6, 0x18, 0x08, 0x54, 0xE7, 0x45, 0x51, 0xC6, 0x98, 0xA6, 0xAD, 0xA6, 0xD8, 0x2E, 0xB0,
+ 0x85, 0x30, 0x11, 0x04, 0xCF, 0x4B, 0x6D, 0x24, 0xCD, 0x68, 0xB8, 0xDC, 0x38, 0x73, 0xD9, 0x8E, 0xB8, 0x88, 0x6D, 0x4D,
+ 0x17, 0x9F, 0x0E, 0x46, 0x4F, 0x61, 0xBB, 0xB7, 0x5D, 0xAB, 0x2F, 0x79, 0x62, 0xD6, 0xF1, 0x2B, 0x93, 0xCF, 0x1F, 0x17,
+ 0x4F, 0xBB, 0xCD, 0x29, 0x00, 0x88, 0xCD, 0x23, 0xDA, 0xD7, 0x66, 0xF3, 0x29, 0x6E, 0x03, 0x56, 0xD6, 0xCF, 0xF1, 0x65,
+ 0x77, 0x5B, 0xCD, 0xC6, 0x9B, 0x4D, 0xB8, 0xDB, 0x8A, 0x3F, 0x62, 0x96, 0xE8, 0xD1, 0x59, 0x7A, 0x4C, 0xA5, 0x21, 0x2D,
+ 0x72, 0x00, 0x56, 0xF3, 0x4B, 0x72, 0x3B, 0x65, 0x2D, 0x97, 0xA4, 0x3A, 0xA4, 0x2D, 0x98, 0xE8, 0x52, 0x98, 0x8A, 0x66,
+ 0x48, 0x41, 0x68, 0x27, 0x67, 0x6E, 0xA2, 0x69, 0x88, 0x58, 0x22, 0x09, 0xF8, 0xF1, 0xCF, 0x07, 0xD3, 0x47, 0xB2, 0xC5,
+ 0x35, 0x27, 0x2C, 0xD5, 0x57, 0x4E, 0x5B, 0x3C, 0x7A, 0x44, 0xF1, 0x7E, 0xFA, 0x95, 0xE9, 0x9F, 0x48, 0x25, 0xF5, 0x44,
+ 0x4C, 0x89, 0x0F, 0x5D, 0x72, 0x21, 0xBC, 0xA9, 0x30, 0x54, 0x61, 0x42, 0x6D, 0x49, 0x90, 0xF3, 0x12, 0x1B, 0x68, 0x29,
+ 0xB5, 0xAB, 0x91, 0xA0, 0x95, 0x43, 0xA8, 0x05, 0x07, 0x63, 0x29, 0x4C, 0x14, 0xAE, 0x62, 0x1F, 0x93, 0x26, 0x34, 0x7F,
+ 0xD8, 0x89, 0x7F, 0x0F, 0x4C, 0x20, 0x8C, 0xAB, 0x12, 0x45, 0xC4, 0x0B, 0x5C, 0x06, 0xD7, 0xCC, 0x98, 0x9D, 0x1F, 0x97,
+ 0x4B, 0x1E, 0xCC, 0xA0, 0x84, 0xD4, 0x40, 0x4C, 0x73, 0xD5, 0xD4, 0x66, 0x1B, 0xB6, 0x8E, 0x63, 0x51, 0xF6, 0xBE, 0x7D,
+ 0x23, 0x7A, 0xB3, 0xA9, 0xBA, 0x57, 0x50, 0xB3, 0x59, 0xBE, 0xAB, 0xB2, 0xA2, 0xCE, 0xA6, 0xBE, 0xFC, 0x9A, 0x7B, 0x95,
+ 0x49, 0xD0, 0x59, 0xA9, 0xD3, 0x5B, 0x4B, 0x70, 0x90, 0x11, 0x02, 0x43, 0xC8, 0x21, 0x6F, 0x3A, 0xDC, 0x94, 0x08, 0x01,
+ 0xB4, 0x97, 0x52, 0x97, 0x24, 0xA1, 0x6F, 0x64, 0x3B, 0xC6, 0x3B, 0x9B, 0x25, 0x27, 0xFA, 0x4C, 0xCB, 0x27, 0xB3, 0x6A,
+ 0x6E, 0x30, 0x82, 0xAC, 0x0F, 0xD1, 0x75, 0xD1, 0xB1, 0xF8, 0x7A, 0x28, 0xAC, 0xAE, 0xAA, 0x69, 0xA6, 0xFE, 0x10, 0x59,
+ 0x44, 0x0F, 0x0A, 0xDF, 0x07, 0x9D, 0x71, 0x9B, 0x5A, 0xAE, 0xA5, 0xEA, 0x16, 0xA5, 0xD1, 0xEF, 0xC5, 0xB5, 0x22, 0x22,
+ 0x6A, 0x1A, 0x6B, 0x63, 0xD9, 0x52, 0x29, 0x32, 0xD1, 0xE5, 0x39, 0x6D, 0x57, 0x34, 0xF6, 0x1C, 0xCA, 0x45, 0x52, 0x88,
+ 0x59, 0xC0, 0x0C, 0x47, 0xA9, 0xC6, 0x91, 0x0A, 0xEC, 0xA5, 0xB8, 0x91, 0xE5, 0x54, 0x18, 0xAC, 0x4F, 0x71, 0x87, 0x1C,
+ 0x72, 0x14, 0xE0, 0xC7, 0x0E, 0xF5, 0x5D, 0x5B, 0xD4, 0xB4, 0x10, 0x74, 0x53, 0x49, 0x4B, 0x72, 0x8A, 0xE8, 0x1E, 0xA2,
+ 0x26, 0xE3, 0x34, 0xD6, 0x46, 0x44, 0xBF, 0x69, 0x24, 0x6A, 0xA7, 0xA9, 0xAA, 0x92, 0xBA, 0xEA, 0xA6, 0x0F, 0x69, 0x2A,
+ 0x56, 0x62, 0x4E, 0xAE, 0xD3, 0x78, 0xC7, 0x33, 0xA6, 0xEC, 0x71, 0xE5, 0xA4, 0x6E, 0x79, 0x48, 0xC8, 0x38, 0x07, 0x1B,
+ 0x6C, 0x37, 0x20, 0x63, 0xAE, 0xFD, 0x32, 0x47, 0x7C, 0xF0, 0x1E, 0xD6, 0x52, 0x40, 0x59, 0xCC, 0xCC, 0x32, 0x13, 0x10,
+ 0xDA, 0x3D, 0x2D, 0xA6, 0xFD, 0x39, 0xCF, 0xC3, 0xD3, 0xC1, 0xFC, 0x69, 0x75, 0x3E, 0x91, 0xDC, 0x10, 0x73, 0xD4, 0x63,
+ 0xE4, 0x72, 0x47, 0x4E, 0x9B, 0x67, 0x86, 0x53, 0x31, 0x09, 0x7E, 0x16, 0xFF, 0x00, 0x4F, 0x13, 0xE9, 0xA0, 0xBF, 0x11,
+ 0xE1, 0xCF, 0x89, 0xD7, 0xCF, 0x38, 0x7A, 0x1F, 0xC4, 0xFF, 0x00, 0xCD, 0xC1, 0xD3, 0xFF, 0x00, 0x55, 0x3F, 0x3D, 0x1A,
+ 0x90, 0x56, 0xF6, 0x47, 0x53, 0xD3, 0xAF, 0x41, 0x9C, 0xF7, 0xC9, 0xCE, 0x3D, 0xDE, 0xA7, 0x8D, 0xB4, 0x68, 0x65, 0xAF,
+ 0x98, 0x11, 0xBE, 0x37, 0xC6, 0xDD, 0x4E, 0xFB, 0xA7, 0x6E, 0x80, 0x75, 0xCF, 0x4F, 0x9F, 0x07, 0xD9, 0xFD, 0xFE, 0xFE,
+ 0x16, 0xBB, 0x62, 0x6D, 0x86, 0xE6, 0x64, 0xF0, 0xCF, 0x3F, 0x70, 0x6B, 0x5A, 0xF2, 0x12, 0xE7, 0x30, 0x50, 0x0A, 0xC6,
+ 0x70, 0x48, 0x19, 0x03, 0xD0, 0x75, 0xC7, 0xC8, 0xF5, 0xC7, 0x13, 0x50, 0x22, 0xF2, 0x1F, 0x4B, 0xE9, 0x6B, 0x52, 0xE4,
+ 0x06, 0x54, 0x4F, 0xD9, 0xEF, 0x9C, 0x8C, 0x1C, 0xF4, 0x20, 0x12, 0x06, 0xDD, 0xB2, 0x3F, 0x80, 0xE3, 0x26, 0x4B, 0x3A,
+ 0x1F, 0xBF, 0xBB, 0x68, 0x45, 0xD3, 0xD0, 0x91, 0xB2, 0x53, 0x8C, 0x75, 0x03, 0x18, 0x07, 0x39, 0xDC, 0x63, 0xAF, 0xAF,
+ 0x63, 0xD7, 0x7E, 0x83, 0x3C, 0xCB, 0x30, 0xE6, 0x73, 0x8F, 0x8F, 0xEB, 0xA5, 0x04, 0xCC, 0x5F, 0xBF, 0xDF, 0xDF, 0x18,
+ 0xD3, 0x02, 0xEA, 0xA2, 0xB1, 0x50, 0x88, 0xFC, 0x69, 0x2D, 0x25, 0xE6, 0x5D, 0x42, 0x90, 0xA4, 0x29, 0x21, 0x69, 0x29,
+ 0x5A, 0x79, 0x54, 0x0A, 0x54, 0x30, 0x46, 0x0E, 0x15, 0x9C, 0x82, 0x3F, 0x01, 0x15, 0xD1, 0xD6, 0xE2, 0x9B, 0x99, 0x6D,
+ 0x8C, 0x62, 0x03, 0x11, 0x7E, 0xFA, 0x12, 0x44, 0x4C, 0xF7, 0x24, 0x49, 0xB5, 0xAC, 0x27, 0xDB, 0x3A, 0xB4, 0x9F, 0x45,
+ 0xDD, 0xD9, 0x77, 0xE9, 0xE5, 0x77, 0xC4, 0x6E, 0x93, 0xBF, 0x50, 0x7E, 0x56, 0x8F, 0x9B, 0x0E, 0x15, 0xEC, 0xCD, 0x26,
+ 0xA6, 0xF4, 0x87, 0xE8, 0x54, 0x2B, 0x9E, 0x6D, 0x52, 0x45, 0x2D, 0xB6, 0x22, 0xB6, 0xEB, 0x8B, 0x87, 0x0D, 0x55, 0xA8,
+ 0xCD, 0xCA, 0x71, 0xC5, 0x29, 0x97, 0x0A, 0x5B, 0x84, 0xB9, 0x2D, 0xA3, 0xCF, 0x6C, 0xC8, 0x1D, 0x7F, 0xF0, 0xBA, 0xEB,
+ 0x2A, 0xDE, 0xDB, 0x56, 0xAD, 0xBA, 0x28, 0x2B, 0xCB, 0x14, 0xD4, 0xB0, 0x07, 0x07, 0x58, 0xBD, 0x46, 0x2D, 0x39, 0xBB,
+ 0xC5, 0xBB, 0x41, 0x4B, 0x07, 0x15, 0xD2, 0xD0, 0x02, 0xB4, 0x95, 0x75, 0x75, 0x53, 0x6B, 0x85, 0xA6, 0x0B, 0x3E, 0xA9,
+ 0xA6, 0xBE, 0xA8, 0xCA, 0x8B, 0x22, 0x7D, 0x56, 0xA3, 0x02, 0x36, 0x61, 0xB9, 0x35, 0xF4, 0x37, 0x30, 0x84, 0xC5, 0x9C,
+ 0x8A, 0x7C, 0x5F, 0xDA, 0xA2, 0x23, 0xED, 0x47, 0x8C, 0xA6, 0xFF, 0x00, 0xCE, 0xA4, 0xA5, 0x3E, 0xC8, 0xC8, 0x9E, 0xE7,
+ 0x90, 0xDA, 0x99, 0x75, 0xD6, 0x9A, 0x4C, 0x45, 0x29, 0x55, 0xBF, 0x57, 0x53, 0x30, 0x14, 0x1E, 0xCD, 0x30, 0x44, 0x52,
+ 0x37, 0x1E, 0x46, 0xAF, 0xD7, 0x9E, 0xC6, 0xFD, 0x55, 0x29, 0x2D, 0xC3, 0xB5, 0xBE, 0x91, 0x9B, 0xF7, 0xE7, 0x50, 0x83,
+ 0xD5, 0xB4, 0xC1, 0x92, 0xEB, 0xCD, 0xA9, 0xD4, 0xB6, 0x84, 0xF3, 0x36, 0xA5, 0x48, 0x4B, 0xCF, 0x3C, 0xDA, 0x96, 0xD2,
+ 0xCA, 0x14, 0xBF, 0x67, 0x05, 0x41, 0x2B, 0x4A, 0xDB, 0xF3, 0x0B, 0xAB, 0x05, 0x21, 0x7C, 0xD2, 0x9C, 0x58, 0x00, 0xE0,
+ 0x39, 0x8C, 0xCD, 0xB9, 0x83, 0x95, 0x56, 0x3E, 0x2F, 0x78, 0x94, 0xC0, 0x4A, 0xDB, 0x3F, 0x2F, 0xA6, 0x34, 0x92, 0x75,
+ 0x19, 0xF6, 0x5E, 0x4B, 0xA9, 0x7C, 0x73, 0x12, 0x14, 0xA3, 0xCD, 0xCD, 0xCA, 0x12, 0xA0, 0xB2, 0x81, 0xCC, 0x79, 0x0A,
+ 0x79, 0xB0, 0xE2, 0x10, 0x11, 0x90, 0x41, 0x2D, 0xE3, 0x9D, 0x45, 0x47, 0x5F, 0x32, 0x59, 0x52, 0x4B, 0xF3, 0x75, 0x9B,
+ 0x37, 0xBD, 0x89, 0x79, 0x89, 0x8A, 0xE9, 0x79, 0x40, 0x3B, 0xF6, 0xEF, 0x04, 0xE7, 0xD7, 0x8D, 0x6E, 0xE1, 0xEA, 0x9C,
+ 0xD5, 0xBA, 0xC9, 0x4D, 0x49, 0xE6, 0x14, 0x89, 0x0B, 0x79, 0x2F, 0xA9, 0xD7, 0x14, 0x86, 0x9F, 0x5E, 0x12, 0x99, 0x09,
+ 0x68, 0x2C, 0x25, 0x2E, 0xE0, 0x12, 0x1C, 0x29, 0x05, 0xA5, 0x80, 0xB0, 0x97, 0x1C, 0x52, 0x8A, 0x99, 0xB8, 0xA5, 0x37,
+ 0x83, 0x33, 0x2A, 0xB5, 0x70, 0xB7, 0x2A, 0x20, 0x20, 0xED, 0x7B, 0xDE, 0x74, 0x91, 0x99, 0xB2, 0xC0, 0x71, 0x31, 0x03,
+ 0x6F, 0x4E, 0xE6, 0xA4, 0x6A, 0x5D, 0xD0, 0xCC, 0xD7, 0xA2, 0x39, 0x1B, 0xDA, 0x23, 0xBC, 0xA7, 0x5B, 0x99, 0xE7, 0x41,
+ 0x88, 0x99, 0x6F, 0x48, 0x5A, 0x33, 0x09, 0xA6, 0xC3, 0xCB, 0x42, 0x9C, 0x85, 0x1B, 0xCD, 0x71, 0x2E, 0xC2, 0x8E, 0xD0,
+ 0x2B, 0x4C, 0xA5, 0x21, 0x28, 0xE5, 0x74, 0xA9, 0xA5, 0xE8, 0x6E, 0x32, 0x02, 0x9F, 0xD4, 0xC1, 0x75, 0x79, 0x3C, 0x36,
+ 0xE9, 0x0B, 0x88, 0xCC, 0xBA, 0x47, 0xD2, 0x39, 0x08, 0xF9, 0xF1, 0xDB, 0x00, 0xF1, 0x2D, 0xEC, 0x6E, 0x9C, 0xD9, 0xB5,
+ 0x6B, 0xD5, 0xEF, 0x66, 0xA4, 0x42, 0x95, 0x0A, 0xAC, 0xDC, 0x46, 0xD3, 0x1E, 0x1D, 0x4E, 0x96, 0x97, 0xCC, 0x38, 0xF1,
+ 0x60, 0x37, 0x11, 0x09, 0x94, 0xCA, 0xE4, 0x5B, 0xEF, 0xD3, 0x17, 0x10, 0xC9, 0x75, 0xE8, 0xCE, 0xCA, 0x6D, 0x71, 0xB9,
+ 0x17, 0xED, 0xB1, 0x63, 0x25, 0x0A, 0x4F, 0xB5, 0xF7, 0xED, 0x6D, 0x75, 0xD2, 0x54, 0xF5, 0x75, 0x24, 0x85, 0x44, 0xC0,
+ 0x90, 0x64, 0x1B, 0x8D, 0xEE, 0x5D, 0xEF, 0xAA, 0xA7, 0x77, 0xF2, 0xE6, 0xA5, 0x51, 0x6E, 0x75, 0x45, 0x52, 0x72, 0x37,
+ 0x82, 0x2C, 0xBF, 0xA9, 0x3A, 0xB7, 0x55, 0xB8, 0x36, 0x4D, 0x9B, 0xA3, 0xCF, 0x5B, 0xDE, 0x32, 0xBC, 0x24, 0xD9, 0xD5,
+ 0xFD, 0x3F, 0x4B, 0xCF, 0xC7, 0xB6, 0x35, 0xCE, 0x89, 0xAF, 0xB6, 0xB7, 0x87, 0x5D, 0x65, 0xB3, 0x66, 0x33, 0x22, 0x42,
+ 0x23, 0x2E, 0xDA, 0xB8, 0x6E, 0xE8, 0x95, 0x6B, 0x76, 0xEB, 0x8A, 0x95, 0x34, 0xB7, 0x93, 0x68, 0xDE, 0x34, 0x3A, 0x84,
+ 0x07, 0x88, 0x77, 0x91, 0x34, 0xD7, 0x94, 0xE3, 0xE9, 0xC3, 0xF1, 0x1B, 0x29, 0x4B, 0xD6, 0xED, 0x81, 0x01, 0x53, 0x5D,
+ 0x1B, 0x6E, 0x64, 0x26, 0xB8, 0xB8, 0x0D, 0xC5, 0xB3, 0x63, 0x53, 0x56, 0xFE, 0xD6, 0xE5, 0x4D, 0x74, 0x6E, 0x55, 0x4C,
+ 0x3E, 0xD6, 0xDF, 0x41, 0x5D, 0x19, 0xCF, 0x54, 0x9D, 0x29, 0x17, 0x4C, 0xA6, 0x1B, 0xEB, 0x9A, 0x4D, 0xDA, 0xFA, 0x15,
+ 0x73, 0x5C, 0xEE, 0xD3, 0xF4, 0xDB, 0x5F, 0xAB, 0xB3, 0xAD, 0xA5, 0xBC, 0xAF, 0x65, 0x6E, 0xAB, 0x6B, 0x69, 0x7E, 0xA0,
+ 0xDE, 0x10, 0x99, 0x27, 0x29, 0x66, 0x4C, 0x4D, 0x2A, 0xD6, 0x77, 0xD8, 0xAE, 0x3E, 0xD2, 0x70, 0x85, 0x4B, 0xA5, 0xD2,
+ 0xA1, 0x22, 0x41, 0x01, 0x69, 0x81, 0x1F, 0x98, 0xB6, 0x9E, 0x12, 0x9A, 0x15, 0xFC, 0xBD, 0xC2, 0xFD, 0xCD, 0xAA, 0xEA,
+ 0x96, 0xD1, 0xEC, 0x56, 0x4D, 0xF0, 0xF4, 0xDF, 0x96, 0x57, 0x54, 0x6E, 0xD3, 0x1E, 0xF5, 0x35, 0x36, 0x94, 0x58, 0xE3,
+ 0xC5, 0x97, 0x8E, 0x32, 0xE9, 0x83, 0xA8, 0x56, 0xDC, 0x9B, 0x0A, 0xA1, 0x23, 0xFF, 0x00, 0x10, 0xAA, 0x54, 0x2D, 0xF5,
+ 0x54, 0x69, 0xF4, 0xFA, 0x1D, 0x66, 0xE4, 0xB4, 0x65, 0x69, 0xE5, 0x4E, 0xE5, 0x72, 0x6B, 0x32, 0x9D, 0x90, 0xBA, 0x5D,
+ 0xAB, 0x55, 0xAA, 0x54, 0xEA, 0xDC, 0xB4, 0x8F, 0x65, 0x0B, 0xAA, 0xAD, 0xCF, 0x32, 0x2B, 0x51, 0xA4, 0x47, 0x90, 0x89,
+ 0x81, 0x4A, 0x11, 0x95, 0x9D, 0x65, 0x5B, 0x77, 0x57, 0xA7, 0xA8, 0x29, 0xEA, 0xA4, 0xA5, 0xA9, 0xCA, 0x53, 0x4C, 0xAC,
+ 0x05, 0xEA, 0x64, 0x19, 0x2E, 0x34, 0xB3, 0x65, 0x45, 0x8E, 0xFD, 0x99, 0xEF, 0xDE, 0x1C, 0x17, 0xB4, 0x4D, 0xA6, 0x67,
+ 0x4C, 0x0F, 0xF1, 0x96, 0x3F, 0xAB, 0x5F, 0x87, 0x07, 0xE6, 0x9F, 0xF5, 0xFF, 0x00, 0xDC, 0x7F, 0x1A, 0xAD, 0x4B, 0xA6,
+ 0x46, 0x08, 0xDF, 0xA7, 0x4F, 0x80, 0xDF, 0xB9, 0xE9, 0xF2, 0xDB, 0x8D, 0x9A, 0xC8, 0xB4, 0xDF, 0xE1, 0x1F, 0x5B, 0xE8,
+ 0x49, 0x13, 0xB9, 0x1A, 0x4C, 0xC8, 0xC6, 0x77, 0xF8, 0x9C, 0xF6, 0xF9, 0x03, 0x81, 0xBF, 0xAF, 0x07, 0x5D, 0xAC, 0x7C,
+ 0xD3, 0xFC, 0xBF, 0xBD, 0xF1, 0xA6, 0xB3, 0xD8, 0xF4, 0xF5, 0xD2, 0x66, 0x40, 0xDF, 0x71, 0xFC, 0x7E, 0x3B, 0x9F, 0x5E,
+ 0xBE, 0xFE, 0xDC, 0x4B, 0x5B, 0xDA, 0x0F, 0x9F, 0xD6, 0xDC, 0xF6, 0xD2, 0xD2, 0x45, 0xD4, 0xFC, 0x7E, 0x27, 0xBF, 0xC0,
+ 0x67, 0x3C, 0x4A, 0xAE, 0x63, 0xD7, 0x97, 0xD7, 0x4D, 0x9E, 0x67, 0xC4, 0xE8, 0x47, 0x5E, 0x4A, 0x41, 0xEF, 0x8E, 0xBB,
+ 0xE3, 0x1F, 0xAE, 0x3B, 0x75, 0xE8, 0x37, 0x38, 0x1C, 0x2B, 0xDB, 0x8E, 0xD6, 0xFF, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x20,
+ 0x89, 0x50, 0x78, 0x32, 0xBD, 0xFD, 0x22, 0xF6, 0x72, 0x5F, 0x4C, 0x9A, 0xC4, 0xDC, 0xB7, 0x28, 0xA3, 0xCB, 0xC4, 0x76,
+ 0x83, 0xF2, 0xA4, 0x3A, 0xB2, 0xD4, 0x48, 0x2C, 0x2D, 0x61, 0xA4, 0x3D, 0x35, 0xFE, 0x47, 0x4B, 0x49, 0x75, 0xD3, 0xE4,
+ 0xC7, 0x69, 0xB6, 0xDE, 0x99, 0x31, 0xEF, 0xD8, 0x41, 0x8B, 0x25, 0xF3, 0xE5, 0x85, 0x51, 0x4C, 0x22, 0x2B, 0x66, 0xA1,
+ 0xB5, 0x24, 0x36, 0x5E, 0x7D, 0x69, 0x87, 0xA9, 0xE2, 0x72, 0x94, 0x0F, 0x3C, 0x1F, 0xF4, 0x83, 0x85, 0x82, 0xD6, 0x93,
+ 0x83, 0x1A, 0x94, 0x34, 0x62, 0xCB, 0xD6, 0x5B, 0xBE, 0x2B, 0xF6, 0xC6, 0x9A, 0xDA, 0x57, 0x33, 0x56, 0xC5, 0x66, 0xA3,
+ 0x1E, 0xB3, 0x74, 0x56, 0xD3, 0x45, 0xA8, 0xC5, 0x99, 0x76, 0x4B, 0x8C, 0x81, 0x1D, 0x89, 0x32, 0xC2, 0x19, 0x5B, 0x8C,
+ 0xD0, 0x68, 0x74, 0xFE, 0x78, 0x94, 0x6A, 0x2B, 0x6A, 0x7D, 0x31, 0x98, 0x91, 0x52, 0xA8, 0xCA, 0x7A, 0x4D, 0x56, 0xA3,
+ 0x2D, 0x51, 0xFA, 0x7F, 0x0B, 0xB5, 0xB9, 0xB9, 0xEC, 0x53, 0x4D, 0x54, 0x6D, 0xD7, 0x57, 0xE6, 0x6E, 0x56, 0x8D, 0x2D,
+ 0x49, 0x6B, 0x5F, 0xDD, 0x86, 0x29, 0xA6, 0x67, 0xA9, 0x6A, 0x4B, 0xDB, 0x0A, 0xEB, 0xA0, 0x46, 0xAA, 0xCA, 0x52, 0x49,
+ 0x88, 0xE9, 0xB7, 0x03, 0x79, 0x98, 0xF1, 0xDF, 0xCD, 0x88, 0xD5, 0x5D, 0x1A, 0xAD, 0x59, 0x74, 0x3A, 0x0D, 0x26, 0x7B,
+ 0x14, 0xF8, 0xD3, 0xA3, 0x53, 0x1B, 0xA9, 0x55, 0x63, 0xD3, 0x8C, 0xA9, 0x2E, 0xC6, 0x9B, 0x52, 0x3F, 0x5C, 0x3C, 0xF3,
+ 0xAF, 0x21, 0x58, 0x6E, 0x7C, 0xF8, 0x4F, 0xC4, 0x69, 0xF3, 0x36, 0x71, 0x7E, 0x98, 0x96, 0x55, 0x89, 0x2E, 0x38, 0xA0,
+ 0xE3, 0x9D, 0xDB, 0xBF, 0x86, 0x4A, 0x4E, 0x89, 0x20, 0xAA, 0xA6, 0x97, 0x96, 0x45, 0x66, 0xED, 0x55, 0x46, 0x2F, 0x07,
+ 0x90, 0xD4, 0xD0, 0x9B, 0x9D, 0x4D, 0x2D, 0x49, 0x31, 0x4F, 0x50, 0x52, 0xA1, 0x97, 0xB4, 0xE7, 0xBC, 0x97, 0x89, 0xD7,
+ 0x3D, 0x6F, 0x6A, 0x5C, 0x98, 0x52, 0x5D, 0x61, 0xB5, 0x2F, 0x08, 0x49, 0x0A, 0x09, 0x53, 0x89, 0x0B, 0x64, 0x82, 0xEB,
+ 0x0E, 0x29, 0x6F, 0xA1, 0x05, 0x28, 0x0D, 0xA8, 0x15, 0x25, 0x08, 0x08, 0x0A, 0x50, 0x08, 0x2E, 0x36, 0x09, 0x47, 0x8F,
+ 0xB9, 0x25, 0xAF, 0xE6, 0x0E, 0x12, 0xC5, 0xAD, 0x7B, 0x0D, 0xFE, 0x7A, 0xDA, 0x99, 0xBA, 0x04, 0x67, 0x30, 0x09, 0x98,
+ 0x61, 0xE2, 0x3C, 0x1D, 0xF5, 0x0D, 0x4A, 0xF6, 0xE2, 0xE1, 0x09, 0xF3, 0x76, 0xC9, 0xC6, 0xF8, 0x18, 0x1F, 0xBA, 0xA4,
+ 0xFA, 0x80, 0x01, 0x3B, 0x90, 0x36, 0x1C, 0xA5, 0x3C, 0x61, 0x52, 0xF9, 0x56, 0xC7, 0xF3, 0x7B, 0x58, 0xBF, 0x9D, 0x32,
+ 0x92, 0xCD, 0xB1, 0xC1, 0x9F, 0x87, 0x13, 0xCD, 0xA7, 0x89, 0xEE, 0xB4, 0x17, 0x26, 0xF9, 0x99, 0xFD, 0xA1, 0x00, 0x8C,
+ 0x9C, 0x64, 0x0F, 0xB6, 0x08, 0x04, 0x02, 0x3A, 0xA8, 0xA4, 0x00, 0x33, 0xCE, 0xA5, 0x04, 0x60, 0x1C, 0x80, 0xE9, 0x52,
+ 0x1E, 0x70, 0xFD, 0xC7, 0xED, 0xA2, 0x01, 0x18, 0x0B, 0xBC, 0xDB, 0x1C, 0xDA, 0xDF, 0x43, 0x32, 0xEA, 0xD1, 0x69, 0x64,
+ 0x07, 0xAA, 0x73, 0x19, 0x8A, 0xDB, 0xCC, 0x22, 0x51, 0x54, 0x59, 0x02, 0xA6, 0xF2, 0xA4, 0xE2, 0x0A, 0x0A, 0x10, 0x5D,
+ 0x92, 0x9E, 0x47, 0x59, 0x6A, 0x4B, 0x81, 0x28, 0xF2, 0x18, 0x8E, 0xF1, 0x41, 0x6A, 0x52, 0x82, 0x50, 0xE2, 0x12, 0x54,
+ 0xD9, 0xED, 0xD8, 0x1A, 0xEB, 0x29, 0xA6, 0xF5, 0x35, 0x28, 0xDC, 0x02, 0x61, 0x65, 0x60, 0x00, 0xB8, 0x1D, 0xA2, 0xD1,
+ 0x19, 0xA2, 0xCF, 0x48, 0xCE, 0x22, 0x03, 0xDA, 0xE0, 0x8E, 0x06, 0x18, 0x6F, 0x3D, 0xF9, 0xD7, 0x70, 0xFC, 0x2D, 0xDB,
+ 0xF4, 0xFA, 0x53, 0xB4, 0xA9, 0x93, 0xD8, 0x72, 0x44, 0x86, 0x56, 0x84, 0xCC, 0x44, 0xEA, 0x6D, 0x45, 0x97, 0x5D, 0x4A,
+ 0x14, 0xE2, 0xA5, 0xD5, 0x62, 0xB0, 0xD4, 0xF7, 0x98, 0x6D, 0x6F, 0xC2, 0x90, 0x89, 0x0F, 0x33, 0x25, 0x99, 0x08, 0x90,
+ 0xE4, 0x99, 0x0E, 0x37, 0x1F, 0xCD, 0x25, 0xF7, 0xFD, 0xFA, 0x08, 0x04, 0x9C, 0x86, 0x2A, 0x88, 0xC1, 0x67, 0x93, 0x2D,
+ 0xEC, 0xAE, 0x6D, 0x3C, 0xDB, 0xE9, 0x36, 0x98, 0xB4, 0x34, 0xB3, 0x4F, 0x22, 0x3F, 0x19, 0x33, 0x18, 0x09, 0xD7, 0x24,
+ 0x7E, 0x95, 0xEA, 0x9D, 0xDD, 0xAB, 0x5E, 0x37, 0xAE, 0x4B, 0x6E, 0xEC, 0x97, 0x21, 0xDB, 0x07, 0x4B, 0xEC, 0xDB, 0x1A,
+ 0x1E, 0x9E, 0x5B, 0xA0, 0xA4, 0x51, 0x58, 0x83, 0x70, 0xD1, 0xBE, 0xBA, 0x99, 0x55, 0x62, 0x1B, 0x63, 0xD9, 0x9E, 0x91,
+ 0x2E, 0x5B, 0xAF, 0x47, 0x71, 0xF2, 0x16, 0x53, 0xEC, 0xDE, 0xCA, 0xA2, 0x93, 0x14, 0xB6, 0x3E, 0x7F, 0xFE, 0x24, 0xD7,
+ 0x5F, 0xE2, 0x29, 0xDB, 0xBF, 0x45, 0x1B, 0x74, 0x34, 0x8E, 0x26, 0xB5, 0x54, 0x8C, 0xB6, 0x89, 0x8E, 0x23, 0xC6, 0xAB,
+ 0xF0, 0xFB, 0x54, 0xD7, 0x45, 0x2F, 0x4F, 0x13, 0x51, 0x71, 0xAB, 0x71, 0x5F, 0x69, 0xB7, 0x14, 0x94, 0xD2, 0x46, 0x21,
+ 0xB0, 0xBA, 0xA3, 0x67, 0x4F, 0xE8, 0x52, 0x59, 0x43, 0x4F, 0xD2, 0x62, 0x3C, 0xDA, 0x31, 0xC8, 0x97, 0x63, 0x32, 0xE7,
+ 0x21, 0x03, 0x00, 0xA4, 0x2D, 0xB5, 0x04, 0x9D, 0xF7, 0x23, 0x04, 0x76, 0x23, 0x1C, 0x70, 0x74, 0x01, 0x7B, 0x7D, 0x08,
+ 0xE2, 0xFC, 0x7A, 0xEB, 0xAB, 0xA0, 0x48, 0x4A, 0x78, 0x0B, 0x7D, 0x3E, 0x9F, 0x09, 0xB8, 0xC6, 0xB7, 0xD4, 0x6B, 0x3A,
+ 0x93, 0x45, 0x74, 0x48, 0x85, 0x05, 0x96, 0x9F, 0xE4, 0x0D, 0x07, 0x42, 0x79, 0x9D, 0x0D, 0x8C, 0xA8, 0x34, 0x16, 0x41,
+ 0x52, 0x5A, 0x18, 0x04, 0x36, 0x08, 0x40, 0x56, 0x0F, 0x28, 0xC6, 0x78, 0xA0, 0x2C, 0xC4, 0x29, 0x69, 0xCE, 0x03, 0x9C,
+ 0x62, 0xF1, 0xCF, 0x9D, 0x32, 0x8A, 0x69, 0x94, 0x01, 0xE5, 0xE6, 0x3F, 0x63, 0x94, 0x3E, 0x5A, 0x70, 0xFB, 0x10, 0xFD,
+ 0xD5, 0xFE, 0x23, 0xF9, 0x70, 0x41, 0xD8, 0xF9, 0x1A, 0x26, 0xAF, 0xF4, 0xFF, 0x00, 0xF2, 0x35, 0x3A, 0x2A, 0x46, 0x06,
+ 0x4F, 0xC3, 0xF8, 0x01, 0xDF, 0xE5, 0x8C, 0xF1, 0xD3, 0x9D, 0x56, 0x81, 0x91, 0x50, 0x6D, 0x94, 0xAD, 0x6E, 0x2C, 0x25,
+ 0x09, 0x49, 0x52, 0x94, 0xB5, 0x84, 0x24, 0x04, 0xEE, 0x54, 0x54, 0xAC, 0x00, 0x00, 0xDF, 0x24, 0xA4, 0x6D, 0xE8, 0x37,
+ 0x69, 0x01, 0x73, 0xBE, 0x70, 0x3D, 0xF8, 0x3F, 0xBF, 0x64, 0xD3, 0xE3, 0x82, 0x79, 0x81, 0x4F, 0xDF, 0xE1, 0x69, 0xD0,
+ 0x48, 0xAB, 0x07, 0xDD, 0x43, 0x31, 0xE3, 0xBE, 0xFB, 0x8E, 0x14, 0xA1, 0xB4, 0x36, 0xC3, 0xAB, 0x5B, 0x85, 0x5F, 0x71,
+ 0x2D, 0x24, 0xA1, 0x2A, 0x75, 0x6E, 0x67, 0x0D, 0xA1, 0xA0, 0xE2, 0xDC, 0x27, 0x0D, 0xA5, 0x44, 0xA4, 0x70, 0x0A, 0x90,
+ 0x4C, 0x66, 0x0F, 0xD3, 0xE1, 0x3F, 0xCD, 0xF4, 0x0B, 0x70, 0xAE, 0xAC, 0xF1, 0x34, 0x91, 0x30, 0x93, 0xD4, 0x90, 0xF2,
+ 0x27, 0xAF, 0x2E, 0x96, 0x66, 0x72, 0x5D, 0x4F, 0x3A, 0x56, 0x14, 0x08, 0x18, 0x20, 0x91, 0x9D, 0x89, 0xCE, 0x0E, 0xE9,
+ 0xC7, 0x70, 0x7A, 0x67, 0xA0, 0x24, 0xF0, 0x8B, 0x84, 0x4D, 0xEE, 0x59, 0x08, 0x6D, 0x2A, 0xC4, 0x71, 0xF6, 0x20, 0x9F,
+ 0x8D, 0xFB, 0xF7, 0xE7, 0xED, 0xD2, 0x72, 0x5F, 0x25, 0x0A, 0xC2, 0xBA, 0xFC, 0x77, 0xCF, 0x4F, 0x87, 0xE3, 0x9F, 0x5E,
+ 0xBC, 0x0D, 0xA6, 0x78, 0x17, 0x3E, 0x3C, 0x4F, 0xDF, 0x6D, 0x1A, 0x8B, 0x2B, 0x17, 0x9E, 0xAC, 0xD9, 0xDF, 0x5B, 0x7F,
+ 0x93, 0x6B, 0xAA, 0x25, 0x03, 0xEB, 0x77, 0x60, 0xCA, 0x94, 0x67, 0x5A, 0xF4, 0x0B, 0x85, 0xE6, 0xA6, 0xD3, 0x98, 0x91,
+ 0x1E, 0x2C, 0xEA, 0x5C, 0x8A, 0xCC, 0x39, 0x4F, 0x53, 0x24, 0x26, 0x3C, 0x97, 0x59, 0x5A, 0xE3, 0x92, 0x85, 0x21, 0x7C,
+ 0xC1, 0xB6, 0xDE, 0x2B, 0x71, 0x79, 0xF5, 0xEF, 0xED, 0x4F, 0x45, 0x41, 0xD6, 0x8D, 0x50, 0x53, 0x54, 0x21, 0x02, 0x54,
+ 0x8C, 0x59, 0x4B, 0x5E, 0xD3, 0x9D, 0x67, 0x5D, 0x35, 0x55, 0x3D, 0x28, 0x0E, 0x7A, 0x89, 0xE2, 0x2C, 0x11, 0x7B, 0xF2,
+ 0xB8, 0x3B, 0x6B, 0x7D, 0xA2, 0x5F, 0x48, 0x8F, 0x8D, 0x2F, 0x0D, 0x77, 0xD5, 0x1E, 0xED, 0xB8, 0x2F, 0x97, 0x35, 0x4F,
+ 0x4F, 0xA3, 0xCD, 0x61, 0xBB, 0xCA, 0xC9, 0xB9, 0xA9, 0x94, 0xB7, 0xE0, 0xD5, 0xED, 0x97, 0x1E, 0x6C, 0x55, 0xE1, 0xC6,
+ 0x53, 0x30, 0xA1, 0xCB, 0xA6, 0xBE, 0xEC, 0x20, 0xEA, 0x18, 0x7A, 0x24, 0xC4, 0x21, 0xB5, 0x10, 0x97, 0x1B, 0xF2, 0x56,
+ 0xE7, 0x17, 0xB1, 0xF8, 0xFD, 0xFD, 0xBD, 0xCA, 0x4A, 0xF7, 0x1A, 0xE8, 0x6A, 0x06, 0x9A, 0xA1, 0xCC, 0x13, 0x4A, 0x0A,
+ 0x54, 0x71, 0x1E, 0x91, 0xAE, 0x3A, 0xF6, 0x9C, 0xEE, 0x14, 0xD5, 0x4C, 0x9E, 0xD5, 0x27, 0x4D, 0x74, 0xE3, 0xDA, 0x12,
+ 0x04, 0xA6, 0xD3, 0x4C, 0x55, 0x38, 0xF4, 0xF5, 0xD9, 0xAB, 0xB6, 0x0D, 0x95, 0xAE, 0x5A, 0x67, 0x68, 0xEA, 0x25, 0x9D,
+ 0x6A, 0x51, 0x28, 0xF4, 0xAD, 0x40, 0xB5, 0xE8, 0x57, 0xAD, 0x36, 0x8F, 0x16, 0xD6, 0x7E, 0x5B, 0x10, 0x95, 0x59, 0xA7,
+ 0xC1, 0xA8, 0x47, 0x8B, 0x51, 0xA8, 0xA5, 0x94, 0x2D, 0xD7, 0x52, 0xF3, 0xAD, 0xC6, 0x53, 0x9E, 0x4B, 0xCD, 0x53, 0x12,
+ 0xCB, 0x52, 0xE4, 0xBB, 0x24, 0xB8, 0x5F, 0x8F, 0xF4, 0x65, 0x42, 0x46, 0x66, 0x2A, 0x17, 0xCD, 0xA5, 0xF1, 0x10, 0xF2,
+ 0x5C, 0xCF, 0x1C, 0xF4, 0x57, 0x56, 0xDD, 0x68, 0xB3, 0x55, 0x15, 0x74, 0xFB, 0xD1, 0x3D, 0x28, 0x79, 0x11, 0x2E, 0x4D,
+ 0xD1, 0x33, 0x1A, 0xF3, 0xFB, 0xAF, 0x3E, 0x18, 0xEB, 0x74, 0x7A, 0xAD, 0x46, 0x7B, 0x8C, 0x34, 0xCC, 0x64, 0x4F, 0xA8,
+ 0x45, 0x50, 0x82, 0x2A, 0x13, 0xA4, 0xB6, 0xEC, 0x4E, 0x64, 0xF9, 0x2D, 0xB8, 0xE4, 0x44, 0x38, 0x63, 0xBA, 0xEA, 0xDF,
+ 0x53, 0x02, 0x3B, 0x2E, 0x08, 0xE7, 0xCA, 0x69, 0x2F, 0x37, 0x4F, 0x42, 0x65, 0xBF, 0xE7, 0xFE, 0x27, 0xF0, 0xA5, 0x6B,
+ 0x55, 0x16, 0x99, 0x9A, 0x41, 0x65, 0xE1, 0xA6, 0x3F, 0x73, 0x37, 0xF4, 0xF5, 0x76, 0xEB, 0xA7, 0x70, 0x23, 0xDE, 0xB6,
+ 0x52, 0x1C, 0xAC, 0x19, 0xB3, 0x03, 0x2D, 0xED, 0x05, 0xB5, 0x4C, 0x6A, 0x3A, 0x62, 0xEC, 0x62, 0xB0, 0xEB, 0x4A, 0x8C,
+ 0x3C, 0xE7, 0x1B, 0x1E, 0x73, 0x6E, 0xBA, 0xEA, 0x56, 0x16, 0x86, 0x94, 0xA7, 0x79, 0x46, 0x53, 0xC8, 0xB7, 0x08, 0x50,
+ 0x71, 0xB6, 0xD0, 0xDA, 0x81, 0x40, 0x23, 0x64, 0x27, 0xCC, 0xAF, 0xF0, 0xF1, 0x66, 0x68, 0xCC, 0x95, 0x17, 0x62, 0x2F,
+ 0xDE, 0x4B, 0x4D, 0xA0, 0xEC, 0x91, 0xAB, 0xC6, 0x6D, 0xEB, 0x9C, 0x4F, 0xF3, 0xDF, 0x58, 0xC7, 0xD3, 0x07, 0x70, 0x30,
+ 0x5B, 0x47, 0x92, 0xA5, 0x2D, 0xC3, 0xE6, 0x29, 0xD5, 0xF9, 0x4C, 0xF2, 0xF3, 0xCA, 0x0D, 0xA5, 0xA2, 0x84, 0xB2, 0x85,
+ 0xAD, 0x0D, 0xBB, 0x2B, 0xCE, 0x48, 0x61, 0x4F, 0xB2, 0x14, 0x1A, 0x0A, 0xE6, 0x35, 0x46, 0xC5, 0x49, 0x61, 0xAA, 0xAB,
+ 0x36, 0x16, 0x70, 0x90, 0x18, 0x9C, 0x37, 0xFD, 0xCD, 0x1C, 0x0E, 0x67, 0x11, 0x9F, 0x90, 0x2F, 0xC2, 0xDD, 0xFD, 0x6E,
+ 0xEF, 0x84, 0xAD, 0x16, 0x7E, 0xB5, 0xA8, 0x94, 0x8A, 0x64, 0xA8, 0xD1, 0x1E, 0x8F, 0x53, 0x90, 0xC2, 0x1B, 0x71, 0xE4,
+ 0xBA, 0xDD, 0x3D, 0xD6, 0x56, 0x03, 0xAF, 0xB0, 0xFB, 0x6D, 0xC5, 0x90, 0xA7, 0xE3, 0x36, 0x12, 0xE9, 0x96, 0x5B, 0x41,
+ 0x9D, 0xEC, 0xCD, 0x3E, 0xFC, 0x26, 0xFC, 0xF6, 0xD8, 0x4C, 0xBF, 0x53, 0xF0, 0x9B, 0x1F, 0x97, 0xED, 0x56, 0x5D, 0x22,
+ 0x92, 0x09, 0xA4, 0x62, 0x66, 0x26, 0xFC, 0x46, 0x42, 0x4C, 0xE3, 0x0D, 0xEA, 0xBA, 0x28, 0x6A, 0xF6, 0x86, 0xE5, 0xAD,
+ 0x50, 0x7A, 0x88, 0x8B, 0x08, 0x07, 0x74, 0x60, 0x35, 0xDB, 0xFD, 0x49, 0xA2, 0x78, 0x76, 0xF0, 0xED, 0x65, 0xC6, 0x63,
+ 0x57, 0xB5, 0x4E, 0xC5, 0xD3, 0x76, 0xE4, 0x25, 0xF9, 0x14, 0xF6, 0x2E, 0x1B, 0x8D, 0x98, 0x0E, 0x4A, 0x9C, 0xD7, 0x97,
+ 0x4F, 0x8D, 0xEC, 0x71, 0xBF, 0x65, 0x2E, 0x1C, 0x16, 0x16, 0x95, 0x42, 0x87, 0x10, 0x34, 0xA0, 0x21, 0x25, 0xDA, 0x95,
+ 0x40, 0xA1, 0xE9, 0x5E, 0xC8, 0xC7, 0x65, 0x7B, 0x94, 0x51, 0x2D, 0x4D, 0x34, 0x04, 0xCD, 0x55, 0x21, 0x19, 0xE5, 0xB0,
+ 0x67, 0x04, 0xBE, 0xBA, 0xF3, 0x4F, 0xCD, 0xDC, 0x5A, 0xA9, 0x14, 0xCD, 0x55, 0x16, 0x0E, 0x73, 0x55, 0xBD, 0x26, 0x15,
+ 0x10, 0x1C, 0xEB, 0x81, 0x7E, 0x31, 0x69, 0x0C, 0xDD, 0xD5, 0xBA, 0x3E, 0xA7, 0x5B, 0xD5, 0x6A, 0x2D, 0xEF, 0x46, 0x81,
+ 0x4B, 0x9B, 0x4B, 0xA3, 0xDE, 0xB6, 0xAC, 0xD6, 0x6A, 0xF4, 0x8B, 0xB3, 0x4F, 0xE3, 0x4C, 0x91, 0x54, 0x6A, 0x3F, 0xB5,
+ 0x44, 0x53, 0xA9, 0x15, 0xEB, 0x12, 0x5C, 0x9A, 0x84, 0xD5, 0xC1, 0x77, 0xCB, 0x95, 0x26, 0xD5, 0xAB, 0x54, 0x1C, 0x6D,
+ 0xA1, 0xF5, 0x12, 0x5A, 0x57, 0x93, 0xFF, 0x00, 0x10, 0x0D, 0xD6, 0x8D, 0xFA, 0x3A, 0x6A, 0xA6, 0x91, 0xA5, 0xDC, 0xA1,
+ 0xEA, 0xA6, 0xAA, 0x4B, 0xC0, 0x96, 0xEB, 0xA1, 0x6A, 0x43, 0x2D, 0x2B, 0x7B, 0x4E, 0xBB, 0xF6, 0x52, 0x3A, 0x59, 0xA1,
+ 0x8B, 0xD3, 0x84, 0x62, 0xC8, 0xCC, 0x34, 0xB7, 0xF4, 0x60, 0x9C, 0x85, 0x33, 0x61, 0xA6, 0x9C, 0x42, 0x4A, 0x4A, 0x14,
+ 0x92, 0x32, 0x08, 0xE5, 0x29, 0x52, 0x4E, 0xE1, 0x49, 0xC1, 0xC2, 0xB6, 0x3B, 0x28, 0x64, 0x11, 0x8D, 0xC8, 0x3C, 0x79,
+ 0xEB, 0x4F, 0xB2, 0x9D, 0x99, 0x96, 0xEB, 0xC3, 0x27, 0x7C, 0xFD, 0x6D, 0xAE, 0x99, 0xC6, 0x3E, 0x7F, 0x28, 0xB5, 0xE7,
+ 0x4B, 0x79, 0x48, 0x3B, 0x1C, 0x9E, 0x9B, 0x02, 0x13, 0xD0, 0x77, 0xDB, 0xB7, 0x7F, 0x86, 0x4F, 0x4E, 0x17, 0x53, 0xD8,
+ 0x5F, 0x8A, 0xFE, 0xAC, 0xE8, 0xCE, 0x38, 0x7C, 0x9F, 0xE4, 0xFD, 0x1D, 0x25, 0xE4, 0xA3, 0xF7, 0xFF, 0x00, 0x4E, 0x1F,
+ 0x53, 0xFF, 0x00, 0xEA, 0x7E, 0x46, 0x88, 0x3C, 0xFC, 0xDF, 0xE7, 0x4F, 0xC7, 0x64, 0x10, 0x9D, 0x8E, 0xE0, 0x7F, 0xD0,
+ 0xC1, 0xFE, 0xE1, 0xDB, 0xAF, 0x4D, 0x7F, 0x4F, 0x3A, 0x7F, 0x7F, 0x7F, 0xE1, 0xD3, 0x7C, 0x5C, 0xD1, 0xAD, 0xAA, 0xE5,
+ 0x2E, 0xB3, 0x56, 0xB7, 0x25, 0xDD, 0xB4, 0x78, 0xA9, 0x9C, 0x26, 0x51, 0xE9, 0xF3, 0x62, 0x53, 0xEA, 0x05, 0xE9, 0x10,
+ 0x5E, 0x8F, 0x02, 0xA5, 0x05, 0xFA, 0x8B, 0x6F, 0x40, 0x72, 0x55, 0x26, 0x5B, 0x8D, 0xCA, 0x62, 0x3C, 0xD6, 0xFC, 0x95,
+ 0x2D, 0x29, 0x79, 0x2A, 0x4B, 0xF1, 0xD8, 0x26, 0x3A, 0xA8, 0x2A, 0xA5, 0x68, 0x6A, 0xA4, 0xEA, 0xA5, 0x24, 0xBC, 0x8F,
+ 0x4A, 0x0B, 0x0F, 0x4B, 0xCB, 0x99, 0x7D, 0x35, 0x35, 0x2C, 0x7B, 0x22, 0xDE, 0x19, 0x41, 0xC0, 0xC9, 0x72, 0xCF, 0xA9,
+ 0x68, 0xCE, 0x9B, 0xAF, 0xDE, 0xD1, 0x27, 0x4A, 0x6C, 0xD9, 0x3A, 0x6E, 0xAB, 0x39, 0x48, 0x7C, 0xC9, 0x6E, 0xE5, 0xBD,
+ 0x2E, 0xC9, 0xD7, 0xED, 0xD7, 0x12, 0x41, 0x51, 0x57, 0xB5, 0xD1, 0xE1, 0xA9, 0x31, 0x6D, 0x8A, 0x3D, 0x49, 0x0B, 0xFD,
+ 0xA3, 0x15, 0x69, 0x11, 0xAB, 0xD3, 0xA2, 0x3C, 0x11, 0x22, 0x12, 0xA3, 0x49, 0x43, 0x4F, 0x36, 0xBA, 0xC5, 0xFF, 0x00,
+ 0x97, 0xB5, 0xD2, 0xDB, 0xDA, 0xAD, 0x6B, 0xAE, 0xD7, 0x50, 0xF7, 0x69, 0x78, 0x98, 0x6D, 0xE9, 0xA9, 0x29, 0xA9, 0x01,
+ 0xF6, 0x48, 0x84, 0x61, 0x5F, 0x58, 0x63, 0xC6, 0x5B, 0x5B, 0xD5, 0xC3, 0x4B, 0xC4, 0x78, 0xCD, 0x34, 0x0A, 0xD7, 0xE5,
+ 0xA4, 0x27, 0x2B, 0x52, 0x94, 0xE2, 0xF6, 0xC8, 0x2B, 0x52, 0xCA, 0x94, 0xA5, 0x91, 0x9E, 0x75, 0xAC, 0x95, 0xA9, 0x44,
+ 0xA9, 0x45, 0x4A, 0x24, 0x9A, 0xA7, 0xAB, 0xD9, 0x3D, 0x92, 0x94, 0x73, 0x33, 0x9A, 0x8E, 0xF6, 0xC2, 0xB9, 0x21, 0x6C,
+ 0x26, 0xB4, 0x24, 0xED, 0x80, 0xB7, 0xDE, 0x31, 0xAD, 0x9A, 0xD7, 0xCC, 0x83, 0x9E, 0xE7, 0x3B, 0x8D, 0xF6, 0xEB, 0xB0,
+ 0xEC, 0x00, 0x27, 0xFE, 0xFC, 0x3A, 0x9E, 0x9E, 0x7E, 0x4C, 0xDB, 0x9C, 0x77, 0x2D, 0xF1, 0xBD, 0xB4, 0xD6, 0xC7, 0x19,
+ 0x83, 0x31, 0xF1, 0xF3, 0x13, 0x1F, 0xCE, 0x9A, 0x75, 0x87, 0x21, 0xA5, 0x3F, 0xB6, 0x75, 0x09, 0x51, 0xD9, 0x09, 0x39,
+ 0x52, 0xD4, 0x54, 0x79, 0x40, 0x0D, 0xA4, 0x17, 0x09, 0x52, 0xF2, 0x94, 0xA4, 0x03, 0xCC, 0xAD, 0x80, 0x2A, 0xC6, 0x33,
+ 0x9A, 0x25, 0xF6, 0x5B, 0xF0, 0x22, 0x8D, 0xAC, 0x4D, 0xB1, 0x8C, 0x5E, 0xF1, 0x1A, 0x99, 0x08, 0xBE, 0x66, 0xF1, 0x6F,
+ 0x17, 0xFE, 0x4F, 0x8F, 0x72, 0x2D, 0x4D, 0x37, 0xA5, 0xDC, 0x57, 0x75, 0x2E, 0x99, 0xA9, 0x54, 0xEA, 0x85, 0xBF, 0x62,
+ 0x45, 0x61, 0xAB, 0x9A, 0xF3, 0x5D, 0x69, 0xA7, 0x2D, 0xB4, 0x0B, 0x2E, 0x23, 0xE8, 0x72, 0x64, 0xCA, 0xDD, 0x56, 0xA8,
+ 0x86, 0x5B, 0xB5, 0xAD, 0xAA, 0x82, 0x40, 0x86, 0xE5, 0x62, 0x4A, 0x17, 0x52, 0xAA, 0x21, 0xE5, 0x53, 0x6D, 0x7A, 0x7C,
+ 0xEA, 0x9C, 0x96, 0x9E, 0x8B, 0x5B, 0x5B, 0x45, 0x7B, 0x94, 0x1B, 0x83, 0x4D, 0x07, 0xB7, 0x5C, 0xD9, 0x28, 0xA5, 0x65,
+ 0xA9, 0x6D, 0x45, 0x32, 0x47, 0x53, 0x7A, 0x94, 0x29, 0x1D, 0x67, 0xB8, 0x85, 0x0A, 0x45, 0xC8, 0x2E, 0x5F, 0x96, 0xD3,
+ 0x0C, 0x3C, 0xB6, 0x2E, 0xBE, 0xCC, 0xCF, 0xA3, 0x2F, 0x0C, 0x1F, 0x4E, 0x0F, 0xD1, 0xF7, 0x22, 0xB5, 0x41, 0xD1, 0x8B,
+ 0xD9, 0xEA, 0xF5, 0x0A, 0x8F, 0x02, 0x64, 0x3A, 0x15, 0xB9, 0x7C, 0x55, 0x2D, 0xF9, 0x34, 0xEB, 0x1E, 0x33, 0x0C, 0xB6,
+ 0xDD, 0x22, 0x28, 0x69, 0xA5, 0x4E, 0x8F, 0x26, 0x1C, 0x16, 0x58, 0x75, 0x6D, 0xC7, 0x7A, 0xA6, 0xB8, 0xC9, 0x55, 0x39,
+ 0xA6, 0x61, 0x8F, 0x66, 0x0E, 0x3A, 0xF0, 0xF6, 0x28, 0xFC, 0x7F, 0xE1, 0xEB, 0x7A, 0x29, 0xAC, 0x16, 0xAF, 0x65, 0xAE,
+ 0x96, 0x8A, 0x53, 0x19, 0xE0, 0x70, 0x12, 0x36, 0xC1, 0x83, 0xCB, 0xAF, 0x69, 0xAA, 0xA6, 0xAA, 0x77, 0x69, 0x6B, 0x6E,
+ 0xD3, 0x28, 0xB5, 0x66, 0xCD, 0x41, 0x4B, 0x57, 0x6B, 0xB2, 0x31, 0x4C, 0xEB, 0xA9, 0x1A, 0xC5, 0xE0, 0xCB, 0x4F, 0xF5,
+ 0x86, 0x93, 0x4F, 0xBD, 0x74, 0xC1, 0xB7, 0xAA, 0x90, 0x2A, 0x6B, 0x4D, 0x55, 0xF9, 0xF1, 0x98, 0x75, 0xFB, 0x6A, 0x5D,
+ 0x3A, 0x7C, 0x90, 0xA8, 0xDE, 0xD0, 0xFB, 0x0A, 0x92, 0x86, 0x55, 0x3E, 0x24, 0xBC, 0x46, 0x89, 0x4F, 0x4A, 0x22, 0xC7,
+ 0x53, 0x71, 0x9A, 0x62, 0x3C, 0x96, 0x50, 0x24, 0xAB, 0xAC, 0xA8, 0x6C, 0x84, 0x8F, 0x7E, 0x08, 0x3C, 0x49, 0xC7, 0xCB,
+ 0x12, 0xCC, 0xED, 0xEE, 0xEE, 0x6D, 0xA9, 0x72, 0x31, 0xC5, 0x42, 0x99, 0x93, 0x9E, 0x6F, 0x1F, 0x3D, 0x50, 0x0A, 0xBF,
+ 0xD1, 0x9D, 0x70, 0x55, 0x5A, 0x7A, 0x48, 0xB6, 0xA2, 0xC5, 0x7A, 0x0C, 0xA6, 0xDC, 0x54, 0x97, 0x0A, 0x61, 0x2A, 0x5B,
+ 0xE8, 0x12, 0x42, 0x25, 0x46, 0xA9, 0x9F, 0x6D, 0xA7, 0x54, 0x1F, 0x8A, 0xB4, 0x49, 0x95, 0x36, 0x0B, 0x12, 0x18, 0x66,
+ 0x24, 0x4F, 0x2A, 0x3A, 0x22, 0x49, 0x9A, 0xCF, 0x2B, 0x29, 0xA2, 0x9A, 0xB8, 0x33, 0x9B, 0x0F, 0xAB, 0x9E, 0xF7, 0xF1,
+ 0x3E, 0x75, 0xD6, 0x7E, 0x39, 0xA7, 0x15, 0x29, 0x0F, 0x98, 0x01, 0xB2, 0x18, 0xEC, 0x66, 0x53, 0x9B, 0x1A, 0xD8, 0xD2,
+ 0xBE, 0x8B, 0x54, 0xDB, 0x0A, 0x55, 0x62, 0xEC, 0xFA, 0xB6, 0x0D, 0x11, 0xE9, 0x48, 0xF3, 0x65, 0xCD, 0xA8, 0xBF, 0x43,
+ 0x5C, 0xAF, 0x3D, 0x4A, 0x90, 0x1C, 0xA8, 0xAA, 0xAA, 0x89, 0x09, 0x7E, 0x95, 0x0E, 0xA5, 0x1C, 0x39, 0x29, 0xC7, 0xDD,
+ 0x61, 0x0A, 0x3C, 0xAE, 0xD5, 0xE3, 0x84, 0xA4, 0x40, 0x7C, 0x29, 0xA6, 0xF4, 0xE6, 0xF0, 0x96, 0x7B, 0x41, 0x78, 0xB4,
+ 0x62, 0x7F, 0x98, 0x97, 0xF1, 0xF5, 0xD5, 0x11, 0xC7, 0x00, 0x31, 0x21, 0x10, 0x4C, 0x8E, 0x12, 0x3F, 0x89, 0xB1, 0x36,
+ 0x17, 0x85, 0x8D, 0x39, 0xD1, 0x67, 0x60, 0x6A, 0x15, 0x26, 0xE4, 0xB4, 0x2E, 0x99, 0xF1, 0xE3, 0x35, 0x2A, 0x43, 0xCC,
+ 0xD7, 0x22, 0xCF, 0x08, 0x7E, 0x4C, 0x26, 0x82, 0xC2, 0xC5, 0x36, 0x5B, 0xE1, 0xC7, 0x98, 0x90, 0xCF, 0x94, 0x5C, 0x52,
+ 0xE1, 0xAE, 0x1A, 0x04, 0x61, 0xEC, 0xF5, 0x04, 0xB2, 0xE3, 0x6C, 0xD7, 0x3E, 0xCC, 0xF7, 0x64, 0x8F, 0x89, 0xC4, 0x7A,
+ 0x63, 0xBE, 0xB0, 0xAF, 0x76, 0xBD, 0xC3, 0xA2, 0xA1, 0x88, 0xE6, 0x99, 0x22, 0x66, 0x31, 0x97, 0xCA, 0xB6, 0xBB, 0xC9,
+ 0xE3, 0x67, 0xE9, 0x07, 0x99, 0x7B, 0x6B, 0x9F, 0x8D, 0x5D, 0x77, 0xAB, 0xEA, 0x2B, 0xF3, 0x93, 0x1E, 0xD9, 0xB9, 0xDB,
+ 0xB7, 0x6D, 0x3A, 0x0A, 0x9F, 0x92, 0x29, 0xF4, 0x8B, 0x6D, 0xAA, 0x5C, 0x09, 0x90, 0x57, 0x4E, 0x69, 0xE7, 0x56, 0xA4,
+ 0x31, 0x52, 0x4C, 0x9F, 0xAC, 0x56, 0xEA, 0x54, 0x95, 0x49, 0x75, 0xF5, 0xA9, 0xDC, 0xF2, 0x36, 0x86, 0xFE, 0x77, 0xF1,
+ 0xF5, 0x57, 0xB9, 0xF8, 0x9D, 0xCA, 0x27, 0xD9, 0xDB, 0xE9, 0x29, 0x2E, 0x04, 0xD2, 0x2B, 0x0A, 0xCC, 0xB5, 0x44, 0xC7,
+ 0x6D, 0x75, 0xED, 0xED, 0x15, 0x05, 0x3F, 0xD3, 0x4D, 0x14, 0x14, 0xDD, 0x85, 0x69, 0x9A, 0x95, 0x8B, 0xB2, 0xB0, 0xB1,
+ 0x62, 0xF6, 0x0D, 0x44, 0xDA, 0x2D, 0x74, 0x5E, 0xFA, 0x09, 0x59, 0x75, 0xDB, 0x65, 0x4E, 0x5C, 0x16, 0x35, 0x59, 0xE6,
+ 0x17, 0x75, 0xE9, 0xDD, 0x52, 0x5A, 0xFE, 0xAB, 0xAA, 0x96, 0x15, 0x96, 0x6A, 0x94, 0x87, 0x9C, 0x4B, 0xA9, 0xA2, 0x5C,
+ 0xF4, 0xF1, 0x95, 0xC0, 0xAA, 0xB6, 0xDA, 0xDB, 0x79, 0x21, 0x50, 0x6A, 0x01, 0xDA, 0x7B, 0xEE, 0xB6, 0x9E, 0x7D, 0x9D,
+ 0xDA, 0xF6, 0x2A, 0x90, 0x2A, 0xA5, 0x86, 0xBA, 0x24, 0xB9, 0xC3, 0x0C, 0xA2, 0x70, 0xC4, 0x87, 0x72, 0xDA, 0xD8, 0xD9,
+ 0xE8, 0x84, 0x9A, 0x86, 0xCD, 0x37, 0xF6, 0x67, 0x35, 0x51, 0x50, 0xC9, 0x1D, 0x99, 0x1C, 0x37, 0x84, 0x95, 0xDF, 0xAB,
+ 0x51, 0x2A, 0x15, 0xAA, 0xD4, 0xBB, 0x62, 0x9B, 0x52, 0xA3, 0x5B, 0x32, 0xAA, 0x2E, 0x48, 0xA1, 0xD2, 0xAA, 0xE8, 0x8A,
+ 0xCD, 0x42, 0x9D, 0x0E, 0x4B, 0x6C, 0xBC, 0xEC, 0x15, 0xB7, 0x12, 0x44, 0xB8, 0xED, 0xC6, 0x89, 0x35, 0x72, 0x99, 0x82,
+ 0x86, 0xE4, 0x38, 0x11, 0x4F, 0x44, 0x64, 0x92, 0x12, 0x94, 0x81, 0xA9, 0x15, 0x35, 0xB4, 0x52, 0xD3, 0x42, 0xF5, 0x05,
+ 0x44, 0xF4, 0xDF, 0xDD, 0x21, 0x8C, 0x62, 0x66, 0xC0, 0x78, 0xD6, 0xD9, 0xB3, 0x61, 0x32, 0xDF, 0xD2, 0x47, 0x9F, 0x5B,
+ 0x2D, 0xA7, 0x44, 0x17, 0x93, 0x8C, 0x13, 0x80, 0x7F, 0x7B, 0xAF, 0xBF, 0x7E, 0x87, 0xF9, 0x71, 0x45, 0x08, 0xCA, 0x54,
+ 0xB9, 0x3A, 0x69, 0x21, 0xED, 0x79, 0xB7, 0x17, 0xEF, 0x31, 0x36, 0xD5, 0x02, 0xD8, 0x15, 0xF1, 0x79, 0xEF, 0x62, 0x5F,
+ 0x9F, 0xEB, 0xAC, 0x7C, 0xC4, 0x7E, 0xF0, 0xE2, 0xE1, 0xEC, 0xFC, 0x9D, 0x57, 0x4D, 0x5D, 0xAA, 0xFF, 0x00, 0xB3, 0x73,
+ 0xFF, 0x00, 0x4D, 0x3B, 0x56, 0xBE, 0x6D, 0xB3, 0x8C, 0x93, 0x8C, 0x9C, 0x13, 0xD7, 0x6E, 0xA3, 0xD7, 0x24, 0x03, 0xF3,
+ 0xE2, 0x5A, 0xA0, 0x71, 0xD5, 0x0A, 0x81, 0x21, 0x38, 0x14, 0x23, 0x8C, 0x71, 0x99, 0x9D, 0x4D, 0xA1, 0x1B, 0xDB, 0x1D,
+ 0xBC, 0xC5, 0xE7, 0x1F, 0x1D, 0x6A, 0xE5, 0x46, 0x0E, 0x27, 0x04, 0x02, 0x37, 0x3D, 0x70, 0x73, 0xBF, 0x53, 0x92, 0x46,
+ 0x46, 0xDD, 0x70, 0x47, 0xE1, 0xC6, 0x4D, 0x4C, 0xCD, 0xAE, 0x44, 0x24, 0x89, 0x98, 0x47, 0x3A, 0x06, 0x7E, 0x69, 0xF7,
+ 0xEB, 0x9D, 0x00, 0xD4, 0x26, 0xD2, 0xBC, 0xF2, 0xE7, 0x07, 0x60, 0x72, 0x47, 0x6E, 0xD8, 0x1F, 0x68, 0x76, 0xEB, 0xD3,
+ 0x63, 0xC0, 0xAF, 0x6A, 0x49, 0x1C, 0x44, 0xDE, 0x2D, 0xCC, 0x1D, 0xFE, 0x1A, 0x3E, 0xFE, 0xFE, 0xFB, 0x6B, 0x6E, 0xDA,
+ 0x54, 0xD8, 0x03, 0xB8, 0x3D, 0x48, 0x1E, 0x9D, 0xF6, 0x1D, 0x7A, 0xED, 0x8C, 0xF0, 0x0D, 0x3C, 0xD2, 0xB3, 0xDA, 0xA8,
+ 0x0F, 0xAA, 0xCF, 0xE9, 0xA5, 0x6B, 0xC8, 0xCE, 0x08, 0x62, 0xDD, 0xF0, 0xDE, 0xF6, 0x19, 0xF0, 0x0E, 0x85, 0x99, 0x29,
+ 0x4D, 0xB4, 0xB2, 0x14, 0x09, 0xC7, 0xDD, 0x1B, 0x76, 0xEC, 0x46, 0x08, 0x1E, 0xF0, 0x31, 0x93, 0x92, 0x30, 0x0F, 0x0E,
+ 0x69, 0x6C, 0x51, 0x60, 0x66, 0x6F, 0x62, 0x59, 0x66, 0xC3, 0x29, 0x0E, 0x4B, 0x04, 0xB1, 0xA7, 0x63, 0x12, 0x7C, 0x6D,
+ 0xF2, 0xE6, 0xA5, 0x73, 0xE6, 0xDA, 0xD2, 0xD2, 0xB5, 0xB6, 0xD5, 0xB1, 0x23, 0x52, 0xA4, 0xC7, 0xB2, 0xF5, 0x69, 0xFD,
+ 0x48, 0xA3, 0xA2, 0xA7, 0x15, 0x52, 0xED, 0x5B, 0xA2, 0x89, 0x6B, 0x5B, 0x35, 0x59, 0x12, 0x6A, 0x12, 0x9E, 0x8F, 0x5A,
+ 0x72, 0xE3, 0xF6, 0x39, 0xF7, 0x14, 0x07, 0x97, 0x4F, 0x76, 0x24, 0x15, 0xB7, 0x05, 0x86, 0x27, 0xD3, 0x99, 0x89, 0xE4,
+ 0x53, 0x64, 0x36, 0x87, 0x4B, 0xEE, 0xBA, 0x77, 0x76, 0xA8, 0xA6, 0x91, 0xA3, 0x72, 0xAD, 0xCA, 0x67, 0x15, 0x14, 0x52,
+ 0xB2, 0xBD, 0x56, 0xA5, 0xAA, 0x5E, 0x21, 0x12, 0xF7, 0xE3, 0x59, 0x54, 0xD5, 0x82, 0x8A, 0x95, 0x8F, 0xF4, 0xA6, 0x0C,
+ 0xAD, 0x5F, 0xAB, 0x4A, 0x91, 0x9B, 0xC6, 0xA2, 0x2B, 0xD2, 0xE1, 0xBF, 0x35, 0x70, 0xBA, 0xD5, 0xDA, 0xF4, 0x5A, 0x35,
+ 0xB0, 0xEC, 0xFF, 0x00, 0xAD, 0x93, 0x65, 0x50, 0xDE, 0xAA, 0x3B, 0x4C, 0x97, 0x55, 0x00, 0xA5, 0x15, 0x9B, 0xA6, 0xB1,
+ 0x59, 0x99, 0x3E, 0xE4, 0xBF, 0x2E, 0x34, 0xA1, 0x45, 0xB1, 0x5B, 0xBA, 0xEA, 0x93, 0x9C, 0x8C, 0x95, 0x38, 0x8A, 0x6C,
+ 0x68, 0x0C, 0xAC, 0xB4, 0x72, 0xAE, 0xBA, 0xF7, 0x24, 0x62, 0x8A, 0x66, 0x7A, 0x29, 0xB8, 0xF9, 0x6F, 0x55, 0x55, 0x3E,
+ 0x6A, 0x55, 0x4E, 0xDA, 0x5F, 0x96, 0xD5, 0x7D, 0xC6, 0x7B, 0x50, 0x41, 0x44, 0x18, 0x9B, 0x7B, 0x49, 0xDD, 0xB1, 0xC1,
+ 0xA8, 0xB2, 0xE2, 0xD3, 0x58, 0x32, 0x20, 0x18, 0x34, 0xDA, 0x49, 0x7E, 0xA3, 0x2D, 0x6D, 0xC3, 0xA6, 0x46, 0x85, 0x18,
+ 0x2A, 0x6C, 0xAA, 0x94, 0xA7, 0x13, 0x1E, 0x04, 0x48, 0x8D, 0xB4, 0x8F, 0x35, 0xD9, 0x32, 0x65, 0x2D, 0xA6, 0x1A, 0x65,
+ 0x20, 0xF9, 0xAB, 0x58, 0x47, 0x2F, 0x29, 0x56, 0x32, 0x69, 0xBC, 0x0A, 0xAA, 0x01, 0x08, 0xAB, 0xC7, 0xD2, 0x0D, 0x45,
+ 0x7B, 0x54, 0xF4, 0xA7, 0x4D, 0xED, 0x70, 0x09, 0xB5, 0xA3, 0xCF, 0x1C, 0xF3, 0x3A, 0xBE, 0x9A, 0x27, 0xF4, 0xC1, 0x78,
+ 0xF5, 0xF0, 0x89, 0x67, 0x41, 0xF0, 0xF5, 0xA7, 0x97, 0x04, 0x39, 0xF0, 0x34, 0xFD, 0x08, 0xB7, 0xA6, 0xC4, 0xBA, 0x45,
+ 0x42, 0xBD, 0x0E, 0x2B, 0xB4, 0xF7, 0xDA, 0x78, 0xD3, 0x53, 0x18, 0x4F, 0x89, 0x15, 0x2D, 0x53, 0xA6, 0xB0, 0xDB, 0x49,
+ 0x79, 0xC7, 0x1D, 0x79, 0xE5, 0xC7, 0x29, 0x0A, 0xF2, 0x42, 0x10, 0x3B, 0x28, 0xFC, 0x76, 0xFE, 0xD0, 0x6D, 0xD4, 0x6D,
+ 0xD7, 0xD1, 0x34, 0xFB, 0x54, 0xAD, 0x51, 0x38, 0xEA, 0x11, 0xB7, 0x0F, 0xC7, 0x5C, 0xD5, 0x53, 0x4D, 0x4F, 0x4B, 0xB7,
+ 0x55, 0x55, 0x81, 0xD5, 0x51, 0x52, 0x4A, 0x52, 0x13, 0x87, 0x18, 0x97, 0x2E, 0xBA, 0x63, 0xA5, 0x5F, 0xE1, 0x4D, 0x6B,
+ 0x9D, 0x36, 0xDE, 0x16, 0xC7, 0x88, 0x0D, 0x1A, 0xA3, 0xD7, 0x6B, 0x94, 0xD8, 0x25, 0x30, 0xEE, 0x8B, 0x62, 0xA2, 0xEC,
+ 0x75, 0x48, 0x9C, 0xC4, 0x09, 0xF1, 0x61, 0xBF, 0x26, 0x85, 0x57, 0x62, 0x62, 0x61, 0xB8, 0x91, 0x26, 0x3B, 0x2D, 0xC8,
+ 0xA6, 0x54, 0x92, 0x84, 0x43, 0x61, 0xE6, 0x59, 0x0D, 0x2E, 0x4B, 0xCE, 0x1E, 0x8A, 0x7F, 0xE2, 0x54, 0x7F, 0x5E, 0xC7,
+ 0x2A, 0xF4, 0x57, 0x12, 0xDE, 0x33, 0x4A, 0x99, 0xE1, 0xFE, 0x0C, 0x1D, 0x9D, 0xB9, 0x47, 0xAB, 0x6E, 0xE3, 0xD2, 0x8D,
+ 0x45, 0x91, 0x49, 0x21, 0xB8, 0x5B, 0x8F, 0x3C, 0x6B, 0x8E, 0x1E, 0x2B, 0x3E, 0x91, 0x0F, 0x16, 0xDE, 0x3C, 0x2F, 0x1A,
+ 0xA5, 0x52, 0xE4, 0xD4, 0x2B, 0x9A, 0xCB, 0xD3, 0x34, 0xD4, 0xA5, 0x3D, 0x6F, 0x69, 0xD5, 0xB9, 0x70, 0x56, 0x62, 0xD0,
+ 0xE1, 0x34, 0xF3, 0xE5, 0xD5, 0x7B, 0x5A, 0xDA, 0x96, 0xC4, 0x8A, 0xCC, 0xB5, 0x3A, 0x4B, 0xCE, 0x3B, 0x31, 0xC3, 0x0E,
+ 0x2B, 0xAA, 0x2D, 0x43, 0x8A, 0x95, 0x05, 0xB8, 0xE7, 0x2E, 0xF7, 0xE3, 0x77, 0xF7, 0xB1, 0x53, 0xB7, 0x41, 0xC5, 0x0A,
+ 0x4C, 0x63, 0xAE, 0xA2, 0x1A, 0x93, 0x89, 0xC4, 0xEB, 0x6D, 0xBD, 0xB9, 0x22, 0x81, 0xA2, 0x8A, 0x5F, 0x7A, 0x26, 0xBA,
+ 0x9B, 0x73, 0x3E, 0x1B, 0x16, 0x3C, 0xA0, 0xEA, 0xBC, 0xE9, 0xCE, 0xAB, 0x6B, 0xC7, 0x87, 0xAB, 0x92, 0x9F, 0x79, 0x59,
+ 0x57, 0xFD, 0xD3, 0x2A, 0x14, 0x09, 0x51, 0xDF, 0xAC, 0xD0, 0x5D, 0xAC, 0xD4, 0x9D, 0xA7, 0x55, 0xE9, 0xCD, 0x14, 0xA6,
+ 0x54, 0x49, 0x50, 0x9E, 0x94, 0xFC, 0x77, 0x02, 0xE2, 0x05, 0xB2, 0x97, 0x9B, 0x43, 0x52, 0x19, 0x49, 0x1C, 0x85, 0x6D,
+ 0xA5, 0x4D, 0xAB, 0x2D, 0xBF, 0xC4, 0xFE, 0x23, 0x66, 0xA2, 0xA3, 0x72, 0xBB, 0x27, 0x50, 0xD6, 0xB4, 0xAF, 0x66, 0x6C,
+ 0xCC, 0xC7, 0xCC, 0x7B, 0x6B, 0x4A, 0xB6, 0xEB, 0xA2, 0x55, 0x6B, 0xA4, 0xBB, 0x4D, 0x43, 0x30, 0x8D, 0xC9, 0xC2, 0x66,
+ 0x4B, 0xE7, 0x5D, 0x0B, 0xF1, 0x59, 0x32, 0x85, 0x7E, 0xDD, 0xF6, 0x3E, 0xB6, 0xDB, 0xEB, 0x6D, 0xD8, 0x3A, 0x9D, 0x60,
+ 0xDA, 0x8B, 0xAC, 0xF2, 0x29, 0x2A, 0x52, 0x65, 0x9A, 0x73, 0xD2, 0xED, 0x8A, 0x93, 0xBC, 0xA7, 0x74, 0xCF, 0xA4, 0xAA,
+ 0xA1, 0x42, 0x75, 0xD3, 0xB7, 0xD6, 0x36, 0xCA, 0x98, 0x59, 0x0E, 0x3C, 0xD2, 0x0F, 0x67, 0xE3, 0x22, 0xBA, 0xE8, 0xDF,
+ 0xA4, 0x1A, 0x77, 0x68, 0x3A, 0xE6, 0xCA, 0xD3, 0x2D, 0x1D, 0xC9, 0xA8, 0x9A, 0x67, 0x1D, 0x54, 0x46, 0x43, 0x5B, 0xEC,
+ 0x09, 0xD4, 0x5A, 0xC9, 0x10, 0xD9, 0x18, 0xB8, 0xC6, 0x01, 0x8B, 0x48, 0xBA, 0xAE, 0x88, 0xA7, 0xB4, 0x12, 0x95, 0x72,
+ 0x8E, 0xBD, 0x48, 0x00, 0x1F, 0xC3, 0x3D, 0x73, 0x93, 0x8D, 0xFB, 0x63, 0xAE, 0x39, 0x03, 0x80, 0xB1, 0x6B, 0x4B, 0x07,
+ 0x1C, 0x1F, 0x43, 0xD3, 0x5D, 0x11, 0x38, 0x2E, 0xDA, 0xD9, 0x5E, 0x23, 0xCF, 0x6D, 0x1E, 0xD3, 0x61, 0x18, 0xE5, 0x04,
+ 0x01, 0x9E, 0xA3, 0x1F, 0x01, 0x83, 0xD8, 0x0D, 0x86, 0xDD, 0xBA, 0x71, 0xB5, 0x34, 0xB4, 0xF5, 0x5C, 0x1B, 0x49, 0x9B,
+ 0x0E, 0x1E, 0x99, 0x89, 0xB8, 0x4C, 0x43, 0x7D, 0x0E, 0x13, 0x86, 0xC9, 0xF7, 0x7F, 0xBB, 0xE8, 0x8E, 0x62, 0x91, 0xD7,
+ 0x03, 0xDF, 0xBF, 0xBF, 0x6C, 0xFE, 0x83, 0x8B, 0x59, 0x67, 0xEF, 0xC6, 0x9E, 0x59, 0x82, 0xEF, 0x07, 0xCB, 0xE3, 0x6F,
+ 0x8E, 0xBE, 0x79, 0xBF, 0xED, 0x7E, 0x5F, 0xDD, 0xC2, 0xD5, 0x74, 0xBF, 0xE9, 0x3E, 0x6F, 0xFE, 0xDA, 0x77, 0x29, 0xC1,
+ 0xBE, 0xE4, 0x9E, 0xDB, 0x0C, 0x7C, 0xF0, 0x47, 0xC7, 0xBF, 0x5E, 0xBC, 0x60, 0xB6, 0x80, 0x03, 0xC7, 0x3E, 0xAF, 0x3A,
+ 0x83, 0x49, 0x95, 0xAB, 0x27, 0x7E, 0xBB, 0x74, 0x1D, 0x31, 0x8E, 0xF9, 0xED, 0xDB, 0x85, 0xA3, 0x5F, 0x3C, 0xD0, 0x37,
+ 0xD8, 0x9D, 0xBA, 0x0D, 0xCF, 0x6E, 0xA3, 0x6D, 0xBD, 0xFB, 0xF7, 0xDF, 0x87, 0x0C, 0x4F, 0x13, 0x1F, 0x1F, 0xBF, 0xBB,
+ 0x9A, 0x35, 0xF0, 0xBA, 0x0F, 0xAA, 0x71, 0x9C, 0x01, 0xDF, 0xE7, 0x9E, 0xDF, 0x9E, 0x76, 0xF7, 0xAE, 0xFF, 0x00, 0x3F,
+ 0xDB, 0xF7, 0xD2, 0xBF, 0x3F, 0xC1, 0x8E, 0xD2, 0xCF, 0xC7, 0xBD, 0xB5, 0xAF, 0x95, 0xFB, 0x40, 0x40, 0x19, 0xEB, 0x90,
+ 0x4E, 0xDD, 0x37, 0x19, 0xEF, 0xD3, 0x1E, 0xBF, 0x3C, 0xF1, 0x45, 0x4D, 0x89, 0xE9, 0x18, 0x14, 0x3C, 0xE5, 0xEF, 0xE6,
+ 0xF1, 0xA7, 0xA6, 0xCC, 0x8A, 0x63, 0x4F, 0x2C, 0xA8, 0xB4, 0x0A, 0x89, 0x56, 0xE4, 0x02, 0x46, 0x4E, 0xC3, 0x9B, 0xAE,
+ 0x3A, 0x63, 0x20, 0x10, 0x76, 0x27, 0x6C, 0xF0, 0x55, 0x44, 0x66, 0x11, 0x27, 0xCB, 0xE0, 0x09, 0x64, 0x6D, 0xA5, 0x11,
+ 0xCE, 0x3E, 0x1F, 0x3E, 0xEE, 0x6F, 0xCE, 0x62, 0x74, 0x8A, 0xE3, 0x47, 0x8A, 0xDA, 0x96, 0xE8, 0x4A, 0x12, 0xD9, 0xCF,
+ 0xBF, 0x9B, 0x20, 0x72, 0x80, 0x01, 0x52, 0x8A, 0x94, 0x79, 0x52, 0x94, 0x82, 0xA5, 0x28, 0x80, 0x9C, 0xA8, 0x80, 0x53,
+ 0x49, 0x4C, 0x76, 0x73, 0x07, 0x1E, 0x1E, 0x7F, 0x5D, 0x38, 0xB3, 0x9B, 0xCC, 0x2F, 0xCA, 0xC1, 0x04, 0x63, 0x96, 0xF9,
+ 0x8E, 0x5F, 0xD4, 0xBB, 0x6E, 0xB9, 0xA6, 0xD3, 0x28, 0x5A, 0x97, 0x73, 0x41, 0x34, 0x96, 0x29, 0x76, 0xE4, 0x8D, 0x47,
+ 0x8B, 0x4F, 0x7D, 0x3C, 0xB5, 0x83, 0x6C, 0xA1, 0xE4, 0xD2, 0xAD, 0x62, 0xC3, 0x2E, 0x24, 0x9A, 0x74, 0xBD, 0x49, 0xBA,
+ 0x24, 0xC3, 0xB6, 0xA8, 0x35, 0x07, 0x31, 0x2A, 0x4D, 0x21, 0xCA, 0xCC, 0xEA, 0x3A, 0x44, 0x06, 0x9F, 0xAA, 0x3F, 0xAD,
+ 0x03, 0xB6, 0x9B, 0xAF, 0xF4, 0x53, 0xF9, 0x95, 0x52, 0xF1, 0x48, 0xC5, 0x00, 0x47, 0xBD, 0xB9, 0x5C, 0x03, 0x76, 0x26,
+ 0x31, 0xA9, 0xAD, 0x69, 0x07, 0x33, 0x70, 0x3C, 0x49, 0x33, 0xD9, 0xAA, 0x0F, 0x84, 0x43, 0xCD, 0x62, 0x8B, 0x6D, 0x48,
+ 0x96, 0xEC, 0xFA, 0xD5, 0x54, 0xA2, 0x55, 0x6E, 0xBB, 0x51, 0x9B, 0x5B, 0xAC, 0x49, 0x09, 0xFF, 0x00, 0x49, 0xAA, 0xD5,
+ 0xA4, 0xBB, 0x36, 0xA0, 0xE0, 0xD8, 0xE1, 0xB5, 0x48, 0x7D, 0xC4, 0xB0, 0x93, 0xF7, 0x18, 0x4B, 0x4D, 0xA7, 0x01, 0x03,
+ 0x8E, 0x56, 0x95, 0x5A, 0xAD, 0x28, 0xB8, 0xE6, 0xA6, 0x62, 0xF8, 0xEC, 0x39, 0x02, 0xF7, 0x6F, 0x06, 0xD8, 0x43, 0x79,
+ 0x57, 0xA9, 0x9C, 0xAF, 0x3F, 0x3F, 0x91, 0x63, 0x4C, 0xBB, 0xA3, 0x4B, 0x9B, 0xAE, 0x3C, 0xC3, 0xC1, 0x4E, 0x46, 0x71,
+ 0xA5, 0x14, 0xF9, 0x8D, 0x25, 0x25, 0x4A, 0x69, 0x5B, 0xA9, 0xB3, 0x90, 0x46, 0xC4, 0x65, 0x0A, 0xDC, 0xA0, 0xE7, 0x1C,
+ 0xC0, 0xA8, 0x11, 0xDB, 0xBD, 0x9B, 0x5F, 0x8C, 0x76, 0xE6, 0xFA, 0x8D, 0xCD, 0x8A, 0x6B, 0x7D, 0xE8, 0x8F, 0x3F, 0xA7,
+ 0x3E, 0x2E, 0xCD, 0xDE, 0xCD, 0x9F, 0xF6, 0xE5, 0xA1, 0x1E, 0x95, 0x11, 0x98, 0xAD, 0x34, 0x10, 0x86, 0x5B, 0x4A, 0x00,
+ 0xC0, 0x24, 0x01, 0xD7, 0x72, 0x0F, 0x53, 0xF7, 0x8E, 0x09, 0x51, 0x24, 0xF1, 0x54, 0xD2, 0x07, 0x37, 0x59, 0xF3, 0xC4,
+ 0x7A, 0x72, 0x7C, 0xF5, 0xAD, 0x14, 0x53, 0x48, 0x74, 0xF6, 0x2F, 0x8E, 0xDF, 0x73, 0x9F, 0xA6, 0x9C, 0x52, 0xE8, 0x4D,
+ 0x2D, 0x95, 0x21, 0x48, 0x0A, 0x0A, 0x04, 0x6C, 0x31, 0x81, 0xD0, 0x8C, 0x7D, 0xDC, 0x8D, 0xBA, 0xFA, 0x1E, 0xC3, 0x81,
+ 0x2C, 0x04, 0x45, 0xED, 0xC5, 0xCB, 0x3F, 0x30, 0xC5, 0xFE, 0x5A, 0x7D, 0x23, 0x32, 0x67, 0xCC, 0xC7, 0xA3, 0x02, 0x6A,
+ 0x79, 0xD0, 0x7B, 0x7E, 0x81, 0xA8, 0x54, 0x7A, 0x0E, 0x9C, 0x5E, 0x77, 0x42, 0x6D, 0x0A, 0x5E, 0x9F, 0xDC, 0x28, 0xB6,
+ 0x26, 0xDD, 0x72, 0x50, 0xEC, 0x88, 0x36, 0xC6, 0x97, 0x6A, 0xAD, 0x61, 0xBF, 0xF1, 0x72, 0xE9, 0xAC, 0xC5, 0x63, 0x9A,
+ 0x4C, 0x9B, 0x63, 0x4D, 0x35, 0x58, 0x32, 0xCD, 0x7D, 0xC8, 0xA1, 0x53, 0x28, 0xF6, 0xF5, 0xCD, 0x0A, 0xA1, 0x08, 0xF9,
+ 0xB4, 0xF6, 0x9B, 0x7B, 0x6D, 0xA0, 0xAE, 0x82, 0x8A, 0xAA, 0x87, 0x65, 0x85, 0x9C, 0x6D, 0xEE, 0x27, 0x4B, 0x39, 0xE9,
+ 0xA3, 0x70, 0x07, 0x92, 0x44, 0x85, 0x9D, 0x67, 0x40, 0x53, 0x55, 0x54, 0x44, 0x80, 0xB4, 0x78, 0x9B, 0x84, 0xB3, 0x6A,
+ 0x59, 0xB4, 0xCD, 0xCC, 0x11, 0xA7, 0x46, 0xB2, 0xE8, 0x96, 0xA4, 0x78, 0x75, 0xD5, 0x0B, 0xBB, 0x45, 0xF5, 0x82, 0x84,
+ 0x6D, 0xFB, 0xF6, 0xCC, 0x96, 0xDB, 0x32, 0x9B, 0x43, 0x8D, 0xCD, 0xA4, 0xD7, 0x69, 0x33, 0x18, 0x6E, 0x65, 0x0E, 0xEB,
+ 0xB5, 0xEA, 0xCC, 0x7F, 0x9A, 0x57, 0x6D, 0x6B, 0x9A, 0x95, 0x22, 0x25, 0x66, 0x83, 0x5A, 0x80, 0xA5, 0xC5, 0xA8, 0x53,
+ 0xA5, 0xB0, 0xF3, 0x65, 0x0A, 0x52, 0x9A, 0x6A, 0x6A, 0xA6, 0xBD, 0xAA, 0x9A, 0x6A, 0x3A, 0x5A, 0x61, 0x2A, 0x96, 0x1E,
+ 0x54, 0x7B, 0x4E, 0x73, 0xE7, 0x99, 0xD4, 0x1C, 0xCD, 0x8E, 0x4C, 0x4A, 0xB1, 0x1F, 0x0E, 0x39, 0xF2, 0x9A, 0x88, 0xD6,
+ 0x42, 0x41, 0x1D, 0x14, 0x37, 0x19, 0x39, 0xDB, 0x24, 0x7C, 0xF7, 0x1D, 0x7A, 0x1E, 0xA3, 0x6E, 0xAD, 0x89, 0x56, 0xC3,
+ 0x16, 0x12, 0xEC, 0x0F, 0xC9, 0x97, 0x05, 0xB8, 0xE1, 0x5D, 0xB2, 0xCB, 0x72, 0x41, 0xBB, 0x79, 0xFD, 0x79, 0x7E, 0x76,
+ 0xB8, 0x81, 0x50, 0xC9, 0xC9, 0xC9, 0xC7, 0xA1, 0xEF, 0xFC, 0xBF, 0x4D, 0xC0, 0xE9, 0xC2, 0xEB, 0x62, 0x00, 0x31, 0x73,
+ 0x2C, 0x62, 0xED, 0xCE, 0xD6, 0xE3, 0xE3, 0xAA, 0x6B, 0xA8, 0x22, 0x9A, 0x4A, 0x0E, 0x2A, 0x63, 0xDA, 0xBB, 0xC4, 0x32,
+ 0xCB, 0x13, 0x33, 0xFA, 0xE9, 0x3F, 0x33, 0xDD, 0xF9, 0xFF, 0x00, 0x77, 0x0A, 0x5E, 0xEF, 0xCD, 0xD3, 0xEA, 0x7F, 0xD4,
+ 0x7C, 0x9F, 0xFD, 0x74, 0xEC, 0x2E, 0xFF, 0x00, 0xB4, 0x3E, 0x5B, 0xFE, 0x99, 0xFC, 0xF8, 0x21, 0xC6, 0x3D, 0x6D, 0xF5,
+ 0xD4, 0x6B, 0x12, 0xE0, 0xF7, 0x9F, 0xC7, 0x19, 0xF9, 0x9F, 0xD0, 0x70, 0x3D, 0xE4, 0x78, 0xB7, 0x62, 0xC4, 0xD8, 0xE3,
+ 0x46, 0xB1, 0x2E, 0x74, 0xC6, 0x07, 0xA9, 0x27, 0x61, 0xFF, 0x00, 0x5E, 0xBF, 0x97, 0x0A, 0x0B, 0xB0, 0xA8, 0x4E, 0x24,
+ 0xCF, 0x6B, 0xF0, 0x1C, 0x66, 0x2F, 0xA3, 0x49, 0x29, 0xCF, 0x53, 0x9D, 0xCE, 0xC3, 0xF9, 0x8C, 0x8C, 0x63, 0xB9, 0xCF,
+ 0xCF, 0xA7, 0x15, 0xD2, 0xC4, 0xB0, 0x66, 0xED, 0xAF, 0xDA, 0x33, 0xF0, 0xD1, 0xA4, 0x94, 0xE0, 0xC6, 0x09, 0x19, 0xEF,
+ 0xF1, 0xCF, 0x40, 0x37, 0x39, 0xEF, 0xEE, 0x00, 0xEF, 0x9E, 0x28, 0xA7, 0x98, 0x93, 0x8A, 0x5C, 0xB8, 0xBB, 0x68, 0x0B,
+ 0xE5, 0xE6, 0x02, 0x73, 0xA1, 0xB1, 0x92, 0xF3, 0x12, 0xC7, 0xCD, 0xE0, 0xF2, 0xFF, 0x00, 0x12, 0x13, 0x8E, 0x73, 0x02,
+ 0x33, 0x90, 0x49, 0x24, 0xE7, 0xA7, 0x62, 0x01, 0xF4, 0xF5, 0xF7, 0xFB, 0xC6, 0xD7, 0x05, 0x25, 0xDE, 0x98, 0x11, 0xE2,
+ 0x56, 0xE4, 0x9F, 0xEA, 0x6C, 0x5D, 0xC6, 0x0E, 0xE1, 0x03, 0x72, 0xDE, 0xD2, 0x86, 0x54, 0x3F, 0x5E, 0x5B, 0x66, 0x2D,
+ 0x9D, 0x11, 0x48, 0x69, 0x6D, 0x4B, 0xA1, 0xD6, 0x5D, 0xA1, 0x3F, 0x71, 0x26, 0x7D, 0x72, 0x45, 0x3A, 0x83, 0x42, 0x69,
+ 0x0E, 0x2B, 0xEB, 0x99, 0x14, 0x9F, 0x20, 0xD5, 0x9F, 0x78, 0xA0, 0x73, 0x08, 0x62, 0x6C, 0x98, 0x96, 0xFB, 0x0B, 0x49,
+ 0x49, 0x2E, 0x39, 0x5D, 0x79, 0x0A, 0x4C, 0x8A, 0x74, 0x75, 0xA6, 0x6F, 0x53, 0x4D, 0x45, 0x35, 0x56, 0x55, 0x5F, 0x4D,
+ 0x14, 0x91, 0x90, 0xBD, 0x56, 0x58, 0xA5, 0x64, 0x2F, 0x13, 0x53, 0x10, 0x94, 0xA2, 0x5B, 0xDE, 0x20, 0x65, 0x25, 0xB8,
+ 0xDA, 0x3C, 0xE1, 0x9E, 0xF6, 0x3C, 0xEB, 0x7B, 0xE2, 0x12, 0xE0, 0xAE, 0x4C, 0xBB, 0x63, 0x69, 0xFD, 0x7E, 0xA8, 0x2B,
+ 0x17, 0x73, 0x4F, 0x52, 0xEF, 0xFD, 0x67, 0xAA, 0x34, 0x53, 0xEC, 0xEE, 0xDE, 0xD2, 0xA9, 0x42, 0x35, 0x91, 0x60, 0xC2,
+ 0x43, 0x67, 0xCA, 0x8D, 0x6F, 0xE9, 0x75, 0x9C, 0xEA, 0x19, 0xA7, 0xD2, 0x58, 0x08, 0x8B, 0x0E, 0xA1, 0x59, 0x05, 0xB6,
+ 0x92, 0xE4, 0x26, 0xCA, 0x5F, 0xE2, 0x2A, 0x4A, 0x8D, 0xA1, 0x3A, 0x87, 0xF3, 0x37, 0x13, 0x9D, 0xC6, 0x90, 0xA6, 0x88,
+ 0xC7, 0x4E, 0xD8, 0xC8, 0x44, 0x8D, 0xFC, 0x6B, 0x31, 0x2B, 0xA9, 0x59, 0x8A, 0x6F, 0x49, 0xC8, 0x37, 0xA6, 0xD9, 0x6D,
+ 0x73, 0x37, 0xCD, 0xF5, 0x1C, 0x45, 0x8E, 0x0A, 0x53, 0xB0, 0xC7, 0xA7, 0x5C, 0x7C, 0x07, 0x73, 0xD3, 0x72, 0x06, 0xE7,
+ 0x8C, 0x02, 0x00, 0x75, 0xAE, 0x8B, 0x30, 0xDB, 0x27, 0x74, 0x8F, 0x7E, 0xD8, 0xC7, 0x7C, 0x63, 0xE5, 0xBE, 0x7D, 0x3B,
+ 0xF0, 0xF4, 0xA3, 0x16, 0x96, 0xDE, 0xBF, 0x05, 0xD6, 0x69, 0x8E, 0xDA, 0x3A, 0x0C, 0x7A, 0x63, 0x18, 0xFE, 0x3D, 0x7A,
+ 0xFC, 0x7A, 0x75, 0xE0, 0xD3, 0x44, 0x71, 0xEB, 0xF2, 0xFF, 0x00, 0x06, 0x85, 0x92, 0x94, 0x80, 0x52, 0x06, 0x33, 0xD8,
+ 0xE3, 0x62, 0x76, 0x00, 0xEF, 0xEB, 0x92, 0x08, 0xDB, 0x18, 0xC6, 0xFC, 0x1D, 0xDF, 0xF1, 0xF2, 0xC1, 0xA3, 0xE9, 0x07,
+ 0x8C, 0xE4, 0x8F, 0x1A, 0xD6, 0x5B, 0xD7, 0xCB, 0x7A, 0x5B, 0x7C, 0x51, 0x2F, 0xA9, 0x94, 0xD3, 0x5A, 0xB6, 0xDB, 0x6A,
+ 0xA3, 0x6D, 0xEA, 0x0D, 0xBA, 0x51, 0xCC, 0xDD, 0xC9, 0xA7, 0x37, 0x33, 0x02, 0x9D, 0x77, 0x52, 0x94, 0xD9, 0xCF, 0x99,
+ 0x21, 0xA8, 0x65, 0xAA, 0xCD, 0x38, 0x9C, 0x96, 0xAA, 0x94, 0x98, 0x2E, 0x36, 0x42, 0xB0, 0x41, 0x46, 0xE7, 0xE5, 0x6E,
+ 0x53, 0x52, 0x7B, 0x37, 0xA2, 0xAA, 0x5F, 0xEA, 0xA2, 0xA2, 0xE5, 0xF2, 0x24, 0xA1, 0x8B, 0x5A, 0x35, 0x8E, 0xE8, 0x81,
+ 0x58, 0xC7, 0x4A, 0x2A, 0x67, 0xA5, 0xB2, 0x72, 0x41, 0xEF, 0x36, 0x64, 0x22, 0xDC, 0xF4, 0xE3, 0x5E, 0xF5, 0x56, 0x97,
+ 0xA8, 0x7A, 0x0F, 0xA7, 0xBA, 0x69, 0xAA, 0xF5, 0x17, 0x2E, 0x7A, 0xD6, 0x94, 0x51, 0x5A, 0x57, 0x84, 0xCF, 0x12, 0xAD,
+ 0xE6, 0x74, 0x8B, 0xCF, 0x43, 0x65, 0xAD, 0xC9, 0xAD, 0xE8, 0xB5, 0xFF, 0x00, 0x3F, 0xED, 0x39, 0x32, 0x75, 0x9B, 0xED,
+ 0x2B, 0x97, 0x67, 0x48, 0x98, 0xF2, 0x9E, 0x8C, 0xA1, 0x3E, 0x88, 0x54, 0xDC, 0x5A, 0xB2, 0xD4, 0xDF, 0x66, 0xF7, 0x4B,
+ 0xB7, 0x41, 0x54, 0xA1, 0x4C, 0xEC, 0x6F, 0x12, 0x8D, 0x08, 0x7B, 0x1B, 0x93, 0x07, 0x5D, 0x17, 0xB5, 0xD7, 0x0A, 0xE4,
+ 0xBA, 0x6A, 0xEA, 0x51, 0x71, 0x68, 0xB2, 0x46, 0x4A, 0xA6, 0x2F, 0xD4, 0x5E, 0x62, 0x29, 0xC0, 0xCE, 0x39, 0xC4, 0xEB,
+ 0xEE, 0x21, 0xE7, 0x58, 0x7C, 0x25, 0xB9, 0x2C, 0x29, 0x01, 0xE4, 0xB6, 0xAF, 0x31, 0xB5, 0xA1, 0xD6, 0x5B, 0x7D, 0x89,
+ 0x11, 0xDD, 0xCE, 0x1F, 0x89, 0x36, 0x2B, 0xAC, 0x4B, 0x84, 0xF8, 0xD9, 0xE8, 0xAF, 0xB4, 0xE0, 0x09, 0x51, 0x52, 0x53,
+ 0xC6, 0xC8, 0xA6, 0x52, 0x32, 0x91, 0x7C, 0x43, 0xDB, 0xA6, 0x11, 0x89, 0x86, 0x32, 0x6A, 0x86, 0x6F, 0xCD, 0xC8, 0xE4,
+ 0xBF, 0xF8, 0x9D, 0x21, 0xE7, 0x0E, 0xCA, 0xFC, 0x32, 0x7E, 0x43, 0x39, 0x03, 0x7F, 0x4C, 0x6F, 0xC1, 0xA7, 0xAF, 0x9C,
+ 0xE7, 0xD1, 0x7F, 0x9F, 0xF3, 0xE0, 0xD1, 0xA7, 0x49, 0x78, 0x76, 0x3F, 0x0C, 0x0D, 0x8F, 0x4E, 0xE7, 0xA6, 0x7F, 0x3C,
+ 0x71, 0xA9, 0x45, 0xA7, 0xA6, 0x93, 0xBF, 0x55, 0x5C, 0x79, 0x84, 0x8F, 0xD2, 0x22, 0xFA, 0x70, 0xC3, 0x8B, 0x74, 0xFF,
+ 0x00, 0x55, 0x3C, 0xCC, 0xDA, 0x7C, 0x66, 0x7E, 0x0E, 0xB1, 0x2E, 0x93, 0xD3, 0x98, 0x9E, 0x9E, 0x9D, 0xFF, 0x00, 0xEF,
+ 0xEB, 0x9E, 0xDC, 0x28, 0x8B, 0x4D, 0x07, 0x92, 0xFE, 0x73, 0x29, 0xE0, 0xE3, 0xD1, 0xD2, 0xF5, 0x63, 0x33, 0x71, 0x23,
+ 0xBB, 0x6F, 0x89, 0x11, 0xE4, 0xC6, 0xB0, 0x53, 0xBE, 0xA4, 0x0F, 0xEB, 0x1C, 0xFC, 0x7D, 0x3F, 0xBB, 0xDF, 0xC3, 0xF5,
+ 0xAE, 0xAB, 0xD8, 0x29, 0x33, 0xE0, 0xB8, 0x3E, 0x9E, 0x9A, 0x0B, 0xC4, 0x3D, 0x44, 0x33, 0x02, 0x19, 0xF3, 0x2D, 0xBB,
+ 0xE3, 0x58, 0x17, 0x7A, 0xFD, 0xAC, 0x82, 0x31, 0xCA, 0x9D, 0x81, 0x1B, 0x77, 0xC1, 0xCF, 0xC7, 0x27, 0xBE, 0xDE, 0xA2,
+ 0x65, 0x69, 0x4A, 0x96, 0xF5, 0xD4, 0x92, 0x4C, 0x3E, 0xEA, 0x47, 0x07, 0x7E, 0xD2, 0x5A, 0x1F, 0x4B, 0xE9, 0x6B, 0x35,
+ 0x39, 0xF5, 0x7B, 0xF3, 0x82, 0x7E, 0x6E, 0x87, 0x53, 0xBD, 0x40, 0x38, 0xEF, 0x84, 0x83, 0xF8, 0x67, 0x1D, 0xF7, 0x2A,
+ 0x3B, 0xE0, 0xEC, 0x06, 0x0F, 0x14, 0x54, 0x52, 0x37, 0x73, 0x3E, 0xD3, 0xD3, 0x26, 0x15, 0x0B, 0x84, 0xCF, 0x48, 0x65,
+ 0x6F, 0xE0, 0x2D, 0x4B, 0x13, 0xDF, 0x80, 0x38, 0x26, 0xD3, 0xE8, 0x41, 0xFE, 0xAB, 0xF3, 0xA5, 0xA8, 0x4D, 0x31, 0xDA,
+ 0x52, 0xB3, 0x92, 0x90, 0x4F, 0x5E, 0xB8, 0x23, 0x60, 0x01, 0xC0, 0x1B, 0x9C, 0x67, 0xA0, 0x07, 0xD7, 0x3C, 0x65, 0x55,
+ 0x52, 0xA9, 0x61, 0x6D, 0xF0, 0xC5, 0xF3, 0x3E, 0x74, 0x99, 0x6D, 0x24, 0x2F, 0x24, 0xB1, 0x11, 0x13, 0xFC, 0xDB, 0xC5,
+ 0xB5, 0x2B, 0xE9, 0xF7, 0x8C, 0xDD, 0x2A, 0xD3, 0x6D, 0x29, 0xB5, 0xA3, 0xB9, 0x6B, 0x35, 0x50, 0xD4, 0xAB, 0x52, 0x8B,
+ 0x51, 0xA4, 0x32, 0xA9, 0x0D, 0xA5, 0xD5, 0x8A, 0xBF, 0xD6, 0xF5, 0x59, 0x8A, 0x53, 0x6D, 0xA8, 0x73, 0x07, 0x66, 0x4E,
+ 0x98, 0x5E, 0x52, 0xC2, 0x47, 0x32, 0x9D, 0xE6, 0x2A, 0x38, 0x2A, 0xE3, 0xA3, 0x6F, 0xF1, 0x9B, 0x7B, 0x7B, 0x54, 0x05,
+ 0x0B, 0xB9, 0x45, 0x31, 0x3C, 0x2F, 0x53, 0x55, 0x8C, 0x11, 0x33, 0xE7, 0xE1, 0x1A, 0xE5, 0x6B, 0xA5, 0x16, 0xAA, 0x98,
+ 0x73, 0x41, 0x6A, 0xBA, 0x85, 0xF6, 0x56, 0x66, 0x38, 0x00, 0x9F, 0x31, 0x1A, 0xAD, 0x76, 0xEC, 0xBA, 0xC5, 0x6E, 0x45,
+ 0x4E, 0xE7, 0xB8, 0xE4, 0x19, 0x97, 0x15, 0xD1, 0x55, 0xA8, 0x5C, 0x15, 0xE9, 0x4E, 0x12, 0xA5, 0xBF, 0x54, 0xAB, 0x48,
+ 0x5C, 0xB9, 0x23, 0x27, 0x7E, 0x46, 0x4A, 0x91, 0x15, 0x84, 0x92, 0x42, 0x23, 0xC7, 0x6D, 0x09, 0xC0, 0x48, 0x1C, 0x71,
+ 0x13, 0x52, 0xD6, 0xD4, 0xAD, 0x55, 0x35, 0x2C, 0xF2, 0xD9, 0xF8, 0x29, 0x7E, 0xC9, 0x6D, 0x6B, 0x45, 0x27, 0x4D, 0xFD,
+ 0xEA, 0x9E, 0xA5, 0xC5, 0xF8, 0x88, 0xEC, 0x20, 0x7A, 0x46, 0xA4, 0x58, 0xC4, 0x25, 0x03, 0x20, 0x60, 0xF5, 0xDF, 0x04,
+ 0x01, 0xD0, 0x1C, 0x7B, 0xC0, 0x3E, 0xFD, 0xB7, 0x39, 0xE2, 0xF5, 0xAF, 0x6F, 0x53, 0xCA, 0xDF, 0x1D, 0xEE, 0x73, 0xC6,
+ 0x74, 0xB7, 0x9A, 0x9E, 0xC7, 0xE3, 0x91, 0xB0, 0xEB, 0xD7, 0x23, 0x23, 0xE1, 0x8E, 0xB8, 0x1B, 0xEC, 0x78, 0x35, 0x51,
+ 0x50, 0xC9, 0xEC, 0xD2, 0xDD, 0x1A, 0x81, 0x0B, 0xC1, 0x76, 0x99, 0xC3, 0xC3, 0x3E, 0x2D, 0xAF, 0xDC, 0xE4, 0xFB, 0xC9,
+ 0xF8, 0xFE, 0x5B, 0xE4, 0xFF, 0x00, 0x0F, 0xD0, 0xD4, 0x11, 0x92, 0x61, 0xBF, 0x1D, 0xFD, 0x54, 0xC4, 0xC7, 0x97, 0x9D,
+ 0x08, 0xF9, 0xC8, 0x29, 0x39, 0xE9, 0x93, 0xF1, 0x38, 0xEF, 0x8E, 0xBD, 0x3B, 0xFE, 0x1B, 0xF0, 0x69, 0xF3, 0xFB, 0x7D,
+ 0xFD, 0xDB, 0x4C, 0xCA, 0xDB, 0x1E, 0xD2, 0xC3, 0xAD, 0xA9, 0x29, 0x21, 0x68, 0x29, 0x39, 0xDD, 0x3D, 0x30, 0x08, 0xFC,
+ 0x40, 0xEA, 0x7B, 0xE7, 0x19, 0xC7, 0x13, 0x54, 0xC4, 0x03, 0x7B, 0x4F, 0x07, 0x79, 0xD0, 0xE1, 0xF4, 0xF1, 0xFB, 0xDB,
+ 0xE7, 0x6D, 0x63, 0xA4, 0xBE, 0x26, 0xAA, 0x3A, 0x23, 0x4F, 0x9D, 0xA5, 0x5A, 0x87, 0x6C, 0x35, 0xA8, 0x5A, 0x3B, 0x50,
+ 0x96, 0xFC, 0xAA, 0x65, 0x2A, 0x7A, 0x03, 0xD2, 0xAD, 0xE7, 0x9F, 0x59, 0x5B, 0xE8, 0xA5, 0x3C, 0xBC, 0xA9, 0x84, 0xA1,
+ 0x6A, 0x52, 0xDB, 0x65, 0xA2, 0x95, 0x25, 0x2A, 0xFB, 0x00, 0xA3, 0x21, 0x1A, 0xEC, 0xFE, 0x25, 0xDA, 0x1D, 0xBA, 0xE9,
+ 0x37, 0x36, 0x97, 0xDD, 0xAB, 0xFA, 0x72, 0x4D, 0x3D, 0xBC, 0x84, 0x6B, 0x8D, 0xAC, 0xDB, 0xA8, 0x2B, 0x9E, 0x91, 0x4A,
+ 0x2B, 0xA5, 0xC1, 0x96, 0x96, 0xF7, 0x0F, 0xE9, 0x9C, 0x5A, 0x3B, 0x69, 0xC7, 0x76, 0xEA, 0x86, 0x9C, 0xDF, 0x97, 0x2D,
+ 0x1D, 0xCD, 0x2A, 0xA4, 0xD4, 0xE9, 0x56, 0xED, 0x22, 0xD3, 0x8D, 0x4A, 0x9A, 0x2A, 0x7C, 0xEA, 0x71, 0x53, 0xC5, 0x56,
+ 0xA5, 0x3A, 0x2C, 0x36, 0xDD, 0x50, 0x0A, 0x75, 0xBA, 0x5C, 0x19, 0x9E, 0xCC, 0x95, 0x9C, 0x94, 0x34, 0xA6, 0x23, 0xE7,
+ 0x91, 0x96, 0xD0, 0x95, 0xBB, 0xBB, 0x45, 0x6D, 0x3F, 0x95, 0x47, 0x48, 0x53, 0x0C, 0xCA, 0xC0, 0xA9, 0x3E, 0x93, 0x05,
+ 0xAC, 0x45, 0x38, 0x0D, 0x6F, 0x45, 0x65, 0x72, 0x53, 0x54, 0xC1, 0xEF, 0x04, 0x02, 0xB2, 0x17, 0x99, 0x7C, 0xE1, 0xBC,
+ 0xCF, 0x09, 0x37, 0x20, 0xAB, 0x24, 0x13, 0xEF, 0x38, 0xF8, 0x60, 0x0D, 0xC7, 0x4F, 0x5E, 0xBC, 0x67, 0x3C, 0xB3, 0xE9,
+ 0x09, 0x16, 0xBB, 0xCA, 0x92, 0xC4, 0xD8, 0xB7, 0x9D, 0x6A, 0x11, 0xF7, 0xF7, 0xFA, 0x69, 0x4F, 0x37, 0xDE, 0xAF, 0xC7,
+ 0xFB, 0xF8, 0xAD, 0x1A, 0x79, 0x70, 0x68, 0x71, 0x4F, 0xFB, 0xAA, 0xFF, 0x00, 0xC7, 0x58, 0xAF, 0xEE, 0x9F, 0x97, 0xEA,
+ 0x38, 0xBA, 0x32, 0xFA, 0x7E, 0xE6, 0xA7, 0x6F, 0xDD, 0xAB, 0xEF, 0x9A, 0x74, 0x81, 0xE9, 0xF3, 0x4F, 0xEA, 0x38, 0xD5,
+ 0xF7, 0x6B, 0xFF, 0x00, 0x6B, 0xF5, 0x35, 0xB5, 0x3E, 0xE5, 0x5F, 0x1F, 0xA1, 0xAC, 0x87, 0x5F, 0x92, 0xBF, 0x43, 0xC7,
+ 0x3E, 0xEF, 0xBA, 0x7F, 0xB6, 0x9F, 0xAE, 0xA7, 0x73, 0xDF, 0x3F, 0xDA, 0xFD, 0x4D, 0x0A, 0xAE, 0x87, 0xE0, 0x7F, 0x4E,
+ 0x1D, 0x7F, 0xFD, 0xDD, 0xCF, 0x53, 0xE9, 0xA2, 0xAC, 0xD7, 0xFE, 0xEA, 0x7F, 0xF0, 0xD3, 0x6A, 0xB5, 0xFE, 0x8C, 0xEF,
+ 0xF5, 0x57, 0xFA, 0x2B, 0x85, 0xA9, 0xD5, 0x23, 0xA8, 0x7F, 0xEA, 0x03, 0xDF, 0xFE, 0xF3, 0x7F, 0xDA, 0x47, 0x1C, 0xFA,
+ 0xF2, 0xEB, 0xFF, 0x00, 0xF2, 0x7F, 0xFE, 0x94, 0xFD, 0x6A, 0xD5, 0xBE, 0xB7, 0xFF, 0x00, 0xD1, 0xA3, 0x7C, 0xBF, 0x44,
+ 0xF1, 0xAD, 0x18, 0x7D, 0x7F, 0x63, 0x5E, 0x91, 0x8A, 0x3E, 0x1F, 0xF8, 0xBA, 0x7A, 0x23, 0xFF, 0x00, 0x28, 0x7F, 0x58,
+ 0xFF, 0x00, 0x1E, 0x2F, 0x5A, 0xD1, 0x97, 0xD3, 0xF7, 0x34, 0x07, 0xFE, 0xE8, 0xBF, 0xFE, 0xB0, 0xFF, 0x00, 0x88, 0x78,
+ 0x0F, 0x78, 0xFF, 0x00, 0x6D, 0x7F, 0x43, 0x58, 0xF3, 0x57, 0xAD, 0x1F, 0x53, 0x5B, 0x14, 0x7D, 0xE1, 0xF3, 0xFD, 0x0F,
+ 0x06, 0xAF, 0x49, 0xBB, 0xD1, 0x5F, 0xD6, 0x1F, 0xDB, 0x1C, 0x1A, 0x34, 0xDB, 0xA8, 0x7D, 0xC5, 0x7C, 0xBF, 0xE2, 0x0E,
+ 0x0D, 0x1A, 0xAF, 0x7A, 0x9B, 0xFE, 0xAF, 0x7F, 0xFF, 0x00, 0x99, 0xBF, 0xED, 0xAB, 0x8E, 0x63, 0x1F, 0x1A, 0xBE, 0xAE,
+ 0xB8, 0x37, 0x7D, 0xCF, 0x8D, 0x5F, 0xF9, 0x1A, 0xDB, 0x69, 0x47, 0xFA, 0xA9, 0x8F, 0xEB, 0x3B, 0xFD, 0xA5, 0x71, 0xAD,
+ 0x3E, 0xE5, 0x5F, 0x1F, 0xA1, 0xAD, 0xF6, 0x3D, 0xDA, 0x7F, 0xDB, 0xFB, 0x9A, 0x9C, 0xD9, 0xE8, 0x9F, 0x8A, 0xFF, 0x00,
+ 0x55, 0x70, 0x51, 0x93, 0xFD, 0xAF, 0xFE, 0x4E, 0xBA, 0x34, 0x4F, 0x1D, 0x9A, 0x35, 0xFF, 0xD9
+};
+
+NPT_UInt8 Platinum_120x120_png[26577] =
+{
+ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x81,
+ 0x00, 0x00, 0x00, 0x81, 0x08, 0x02, 0x00, 0x00, 0x00, 0x68, 0xC2, 0x4E, 0x07, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
+ 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC,
+ 0x61, 0x05, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00,
+ 0xFA, 0x00, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00,
+ 0x17, 0x70, 0x9C, 0xBA, 0x51, 0x3C, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x12, 0x00, 0x00,
+ 0x0B, 0x12, 0x01, 0xD2, 0xDD, 0x7E, 0xFC, 0x00, 0x00, 0x67, 0x3A, 0x49, 0x44, 0x41, 0x54, 0x78, 0x5E, 0x9D, 0xBD, 0x05,
+ 0x98, 0x9D, 0xD5, 0xD5, 0xF7, 0x3D, 0x68, 0x21, 0x68, 0x84, 0x84, 0xE8, 0x44, 0x67, 0x26, 0xE3, 0xEE, 0xEE, 0xEE, 0xEE,
+ 0x92, 0xF1, 0x89, 0x4D, 0xDC, 0x85, 0xB8, 0x13, 0x08, 0x10, 0xDC, 0xDD, 0x9D, 0x42, 0xA1, 0x58, 0xA1, 0x2D, 0xA5, 0x50,
+ 0xA1, 0x85, 0xB6, 0xB4, 0x94, 0xEA, 0x5B, 0x6F, 0xE9, 0x53, 0x8A, 0xE5, 0xFD, 0xAD, 0xBD, 0xEE, 0x7B, 0xCF, 0x3D, 0x93,
+ 0xC0, 0xF3, 0xBD, 0xDF, 0x5C, 0xFB, 0x3A, 0xD7, 0x7D, 0xCE, 0x9C, 0x39, 0x73, 0xCE, 0x92, 0xFF, 0xB2, 0xFF, 0xDE, 0xE7,
+ 0xB4, 0xC1, 0xAE, 0x61, 0x9F, 0x91, 0x9F, 0x2F, 0xB8, 0x3C, 0x71, 0xE2, 0x34, 0xCF, 0x23, 0xCE, 0xE5, 0x89, 0x13, 0x9F,
+ 0xFB, 0xF8, 0x9C, 0x3E, 0xFA, 0x99, 0x72, 0xF7, 0x8B, 0xCF, 0x4F, 0x9C, 0xE6, 0x79, 0x98, 0x3F, 0x3D, 0xED, 0x84, 0x3C,
+ 0xAC, 0xCF, 0x3C, 0x71, 0x42, 0xEE, 0x98, 0x9F, 0xD3, 0x3D, 0xD7, 0xA3, 0x7E, 0x7B, 0xDA, 0x69, 0x67, 0x98, 0x5F, 0xF1,
+ 0xA0, 0xBC, 0x10, 0xFF, 0xE8, 0xB4, 0xD3, 0x9C, 0x37, 0xA0, 0x7F, 0xA2, 0x77, 0xB9, 0xD5, 0x9F, 0xD3, 0x4F, 0x3F, 0xFD,
+ 0x8C, 0x33, 0xCE, 0xE0, 0xF6, 0xCC, 0x33, 0xCF, 0x3C, 0xFD, 0x74, 0x1F, 0xAE, 0x4F, 0x3B, 0xFD, 0xC4, 0xE9, 0xA7, 0x9D,
+ 0xC9, 0xDB, 0xFE, 0xFC, 0xF3, 0xCF, 0x4F, 0xF8, 0x7C, 0xFA, 0xF9, 0x67, 0x27, 0xBE, 0xF8, 0xE2, 0x8B, 0x13, 0x9F, 0x9D,
+ 0xF8, 0xE4, 0xF3, 0xCF, 0x7C, 0x3E, 0xFB, 0xFC, 0xD3, 0x13, 0x5F, 0xF0, 0x3A, 0x3C, 0x72, 0xFA, 0x17, 0x27, 0x3E, 0xF9,
+ 0xE2, 0x73, 0x1F, 0x9E, 0xFA, 0x85, 0xBC, 0x31, 0x1E, 0xD5, 0x77, 0x28, 0xAF, 0xEF, 0xBE, 0xB9, 0xD3, 0xCF, 0xE0, 0x21,
+ 0x7D, 0x1B, 0xCE, 0xBF, 0xE6, 0xC2, 0xF9, 0x25, 0x8F, 0x9C, 0x76, 0x1A, 0xAF, 0x63, 0x3F, 0xD8, 0xE7, 0x3C, 0xF5, 0xC4,
+ 0xC8, 0x33, 0xF5, 0x4A, 0x5F, 0xD0, 0xFE, 0xD5, 0x17, 0xA7, 0x7D, 0x71, 0x26, 0x22, 0x39, 0xF1, 0xF9, 0x17, 0x3E, 0xE6,
+ 0x53, 0xF0, 0x17, 0xA7, 0x8D, 0xFA, 0xF8, 0xF2, 0x47, 0x03, 0x9D, 0xCB, 0xCD, 0x5A, 0xCA, 0x6D, 0x7F, 0xC7, 0x32, 0xBD,
+ 0x30, 0xB7, 0x4B, 0xB9, 0xEB, 0x59, 0x4B, 0xFA, 0x3B, 0x96, 0xF4, 0xB5, 0x2F, 0x75, 0xD7, 0x62, 0xEF, 0x75, 0x6F, 0xDB,
+ 0x50, 0x6F, 0xDB, 0x12, 0x59, 0xAD, 0x4B, 0x9D, 0x8B, 0xB6, 0x25, 0x3D, 0xAD, 0x8B, 0xCD, 0x1A, 0x74, 0x2F, 0xFA, 0xB9,
+ 0xEE, 0x6E, 0x19, 0xEA, 0x6E, 0x19, 0xD0, 0xD5, 0xD5, 0xD4, 0xB7, 0xA8, 0xB9, 0x9F, 0x8B, 0x45, 0xCD, 0x83, 0x5C, 0xF4,
+ 0x34, 0xF5, 0x73, 0xAB, 0x0F, 0xEA, 0xD2, 0x6B, 0x6E, 0x79, 0x8E, 0x79, 0x9D, 0xC1, 0xBE, 0xF6, 0xC5, 0x43, 0x1D, 0x4B,
+ 0x97, 0xF4, 0xAC, 0x58, 0xDE, 0xBF, 0x7A, 0xD5, 0xE2, 0xF5, 0xEB, 0x96, 0x6F, 0xDC, 0xB0, 0x62, 0xF3, 0xDA, 0xE5, 0xEB,
+ 0xD6, 0xAF, 0xD8, 0xB0, 0x71, 0xE5, 0x96, 0xCD, 0x6B, 0xB6, 0x70, 0xBB, 0x76, 0xD9, 0x86, 0x15, 0x83, 0xAB, 0x97, 0xF5,
+ 0xAD, 0x5A, 0xBA, 0x68, 0x78, 0xA8, 0x9D, 0xB7, 0x31, 0xD8, 0xD5, 0xD2, 0xDF, 0xDD, 0xD0, 0xDB, 0x55, 0xDF, 0xD3, 0x51,
+ 0xBB, 0xA8, 0xB5, 0xB6, 0xAB, 0xB3, 0xBA, 0xAB, 0xBD, 0xBA, 0xB3, 0xAD, 0xAA, 0xA3, 0x95, 0x55, 0xD9, 0xCE, 0xAD, 0x73,
+ 0xCD, 0x05, 0x8F, 0x57, 0x77, 0xCA, 0x23, 0x35, 0xED, 0xED, 0xB5, 0x1D, 0x9D, 0xB5, 0x9D, 0xDC, 0xB6, 0xD7, 0xB6, 0xB5,
+ 0x56, 0xB7, 0xF1, 0x78, 0x4B, 0x65, 0x7B, 0x73, 0x45, 0x47, 0x73, 0x79, 0xAB, 0xAC, 0x8A, 0xB6, 0xA6, 0xF2, 0xD6, 0x86,
+ 0x92, 0xA6, 0x86, 0xD2, 0xE6, 0xC6, 0xE2, 0xA6, 0xFA, 0xA2, 0xE6, 0xFA, 0x92, 0x16, 0x59, 0xC5, 0x8D, 0x75, 0x25, 0xF5,
+ 0x75, 0xDC, 0x16, 0x37, 0xF3, 0xA0, 0x5C, 0x14, 0xD5, 0xD5, 0x16, 0x35, 0xC8, 0x2A, 0xAE, 0xAB, 0x2D, 0xAE, 0xA9, 0x29,
+ 0xAA, 0x95, 0x8B, 0xC2, 0x5A, 0x2E, 0xAA, 0x0B, 0x6B, 0x58, 0x3E, 0x56, 0xCA, 0x7C, 0x3C, 0x73, 0x2D, 0x82, 0xE6, 0xA2,
+ 0xAF, 0x6D, 0x99, 0x47, 0xCA, 0x2A, 0x7A, 0x91, 0x3B, 0x02, 0x45, 0xCA, 0x5C, 0x1B, 0xB9, 0x0F, 0x99, 0x8B, 0x25, 0x3D,
+ 0x2D, 0xA2, 0x00, 0x2B, 0x74, 0x34, 0xE1, 0x5E, 0x2F, 0xF6, 0x0A, 0x5D, 0x45, 0x6F, 0xE4, 0xDB, 0xEB, 0x15, 0xB4, 0x48,
+ 0xB9, 0xD1, 0x59, 0x9D, 0x8D, 0xBD, 0x2C, 0x1E, 0xB1, 0xCB, 0x3E, 0xB3, 0xBB, 0xCD, 0xE8, 0x60, 0xD1, 0xD2, 0xA5, 0xBD,
+ 0xC3, 0x2B, 0x87, 0xD6, 0xAC, 0x59, 0xBC, 0x76, 0x79, 0xFF, 0xCA, 0xE5, 0x03, 0xC3, 0xDB, 0x37, 0xED, 0xD8, 0xBB, 0x63,
+ 0xFF, 0xC6, 0x35, 0x9B, 0x56, 0x2E, 0x5D, 0xBD, 0x69, 0xF5, 0x66, 0xD6, 0xDA, 0x65, 0x9B, 0x56, 0x0C, 0xAD, 0x1C, 0xEE,
+ 0x5B, 0xBE, 0xA4, 0x6B, 0x79, 0x6F, 0xF3, 0x50, 0x67, 0x63, 0x7F, 0x77, 0x7D, 0x3F, 0x02, 0xED, 0xAC, 0x5D, 0xD4, 0x51,
+ 0xD3, 0xD5, 0x52, 0xD3, 0xD9, 0x54, 0xD5, 0x8E, 0xF4, 0x8D, 0x4C, 0xDB, 0x74, 0x71, 0xCD, 0x72, 0x54, 0x62, 0x14, 0xC0,
+ 0xEA, 0xA8, 0xEB, 0x64, 0x71, 0x81, 0x4A, 0x58, 0xAD, 0x95, 0x22, 0xFD, 0xA6, 0xB2, 0x16, 0x56, 0x23, 0xA2, 0x2F, 0x6D,
+ 0x46, 0x07, 0x35, 0x25, 0x8D, 0xC8, 0xBD, 0xBE, 0xB8, 0x5E, 0x44, 0xAF, 0xD2, 0x97, 0x8B, 0x5A, 0x11, 0x7A, 0x61, 0xBD,
+ 0x91, 0x7B, 0x9D, 0xC8, 0xDD, 0x08, 0xBD, 0xA6, 0xA8, 0x1A, 0xA1, 0x9B, 0x0B, 0xD1, 0x04, 0xD7, 0x55, 0x05, 0xD5, 0xA2,
+ 0x83, 0xD1, 0xD6, 0x8D, 0xA0, 0x47, 0xD9, 0xB8, 0x2B, 0x6E, 0xA4, 0x3C, 0x60, 0x6C, 0x5C, 0x44, 0xCF, 0xF2, 0x18, 0xF8,
+ 0x20, 0x3A, 0xB0, 0xA6, 0x6A, 0x04, 0x3D, 0x62, 0xEC, 0x6A, 0xE3, 0x1E, 0x89, 0x0F, 0xA8, 0xB8, 0x8D, 0x88, 0x7B, 0x54,
+ 0xD0, 0x56, 0xEE, 0x8B, 0x1A, 0x44, 0x01, 0xCE, 0xDD, 0xFA, 0x1E, 0xBD, 0xCB, 0xDF, 0x1A, 0xAD, 0xF4, 0x74, 0xB6, 0x0D,
+ 0x0C, 0xB6, 0x0D, 0x2E, 0x59, 0xB4, 0x74, 0x59, 0xDF, 0x8A, 0x95, 0x03, 0x2B, 0x10, 0xF1, 0x65, 0x5B, 0x77, 0xBF, 0xFD,
+ 0xFD, 0x1F, 0xFC, 0xF5, 0xAF, 0x7F, 0xFD, 0xC7, 0x3F, 0xFE, 0xF5, 0xBB, 0xDF, 0xFC, 0xFE, 0x89, 0x47, 0x9F, 0xD9, 0xB8,
+ 0x6A, 0xD3, 0x86, 0xE5, 0xEB, 0x37, 0xAC, 0xDE, 0x24, 0xDE, 0x80, 0x86, 0xBA, 0x97, 0x0F, 0x76, 0x0C, 0xC9, 0x7F, 0x6F,
+ 0xEC, 0xEE, 0xAC, 0xEB, 0x6E, 0xAF, 0xE9, 0x62, 0x61, 0xE6, 0x22, 0x71, 0x0C, 0xB9, 0xCA, 0x51, 0x03, 0x16, 0x6D, 0xD5,
+ 0xA0, 0x1E, 0xA0, 0xD2, 0x6F, 0xAB, 0xEB, 0xEC, 0xAA, 0xEB, 0x52, 0x7D, 0xB4, 0x57, 0xB7, 0xB7, 0x55, 0xA1, 0xAD, 0x8E,
+ 0xA6, 0xB2, 0x26, 0x91, 0x7E, 0x29, 0x86, 0xDF, 0xC4, 0x32, 0x26, 0x2F, 0x6A, 0x40, 0xE8, 0xAA, 0x00, 0x84, 0x6B, 0x6F,
+ 0xAB, 0x8A, 0xB8, 0x5B, 0x53, 0x57, 0xE4, 0xC8, 0x5D, 0x0D, 0x5F, 0x17, 0xD2, 0x67, 0x95, 0xE7, 0x57, 0xF9, 0x9C, 0x6C,
+ 0xEC, 0x16, 0x4C, 0xDC, 0x8B, 0x21, 0x35, 0x73, 0x5D, 0x2E, 0xBC, 0x38, 0x08, 0x83, 0x88, 0x79, 0x44, 0x85, 0xBE, 0xA8,
+ 0x55, 0x16, 0xD7, 0x8A, 0x30, 0xAE, 0xC9, 0xA3, 0x83, 0x41, 0x8B, 0x30, 0x5E, 0xA1, 0x5B, 0x89, 0x77, 0x34, 0xF4, 0xE8,
+ 0x42, 0xD6, 0xDC, 0xB6, 0xD7, 0x77, 0xEB, 0x6D, 0x5B, 0xDD, 0x22, 0x7D, 0x1C, 0x18, 0xE1, 0x57, 0x3D, 0xCD, 0xBD, 0x03,
+ 0xED, 0xFD, 0xE8, 0x60, 0x71, 0xD7, 0x92, 0x65, 0x3D, 0x4B, 0xB6, 0xAE, 0xDB, 0xF6, 0xA7, 0x3F, 0xFE, 0x19, 0x3C, 0xFD,
+ 0xF8, 0xE3, 0xFF, 0xF9, 0xF8, 0xE3, 0x8F, 0x3F, 0xFB, 0xE4, 0x53, 0xAE, 0x7F, 0xFA, 0xD3, 0xF7, 0xB6, 0xAC, 0xDF, 0xB6,
+ 0x6E, 0x78, 0x3D, 0xE8, 0xB4, 0x7A, 0x68, 0xE5, 0xD2, 0xEE, 0x25, 0xFC, 0x49, 0x37, 0xCA, 0x6E, 0x10, 0x90, 0xE9, 0xA8,
+ 0x12, 0x08, 0x72, 0xCC, 0xBF, 0xBC, 0xB5, 0xB1, 0xB2, 0x4D, 0x8C, 0x1A, 0xD3, 0x36, 0xF0, 0x82, 0x56, 0x5A, 0xAA, 0x5A,
+ 0x81, 0x9D, 0x96, 0xDA, 0xD6, 0x8E, 0x1A, 0x11, 0x7A, 0x43, 0x59, 0x63, 0x59, 0x4E, 0x79, 0x43, 0x49, 0x43, 0x73, 0x65,
+ 0x8B, 0xFE, 0x8A, 0x67, 0x36, 0x96, 0x37, 0x18, 0xD8, 0x71, 0xA4, 0x8F, 0x2B, 0xA8, 0xB1, 0x8B, 0xBD, 0x1B, 0x05, 0x28,
+ 0xE6, 0x00, 0x41, 0x18, 0x7B, 0x15, 0xAB, 0xA0, 0x5A, 0x0C, 0xBF, 0x60, 0x44, 0xF4, 0x95, 0xF9, 0x55, 0x15, 0x46, 0x01,
+ 0x5C, 0x8C, 0xE8, 0xC0, 0x35, 0x70, 0x31, 0xF3, 0x93, 0x70, 0x5C, 0x80, 0xB8, 0xA7, 0x55, 0xD0, 0xDC, 0x8A, 0x5B, 0x44,
+ 0xDC, 0xAC, 0xA2, 0x47, 0xE2, 0x6A, 0xE9, 0x22, 0x68, 0x90, 0x57, 0xEF, 0x8E, 0x11, 0x7A, 0x57, 0x93, 0xA0, 0x7F, 0x27,
+ 0xC6, 0xE8, 0x9A, 0xB9, 0x88, 0xBB, 0xA9, 0xDF, 0x4A, 0x7F, 0x94, 0xE8, 0x1B, 0xBA, 0xDB, 0x1A, 0xBA, 0x55, 0x07, 0xBA,
+ 0xC0, 0xF1, 0x45, 0xA2, 0x86, 0xEE, 0xFE, 0xB6, 0x3E, 0x64, 0x3A, 0xD0, 0x3E, 0xB8, 0xAC, 0x67, 0xE9, 0x83, 0xF7, 0x3C,
+ 0x84, 0xD0, 0x3F, 0xFA, 0xE8, 0xA3, 0xFF, 0x9A, 0x1F, 0x34, 0xF1, 0xEF, 0x7F, 0xFF, 0x9B, 0x47, 0x5E, 0x7F, 0xFD, 0x3B,
+ 0xAB, 0x96, 0xAD, 0x5E, 0xBB, 0x62, 0xDD, 0xAA, 0x25, 0xAB, 0x89, 0x1C, 0x3C, 0x19, 0x1D, 0x88, 0x21, 0xE3, 0x01, 0x2E,
+ 0xFE, 0x08, 0x94, 0x03, 0x26, 0x8A, 0x2A, 0xEE, 0x6A, 0xA9, 0x40, 0xD0, 0xCD, 0x66, 0xB5, 0x36, 0x54, 0x36, 0x56, 0xE6,
+ 0x56, 0x82, 0x30, 0x9B, 0x56, 0x6D, 0x6D, 0xAA, 0x68, 0xAE, 0xC8, 0x29, 0xAB, 0x2F, 0xAD, 0xE3, 0xA2, 0xB9, 0x5C, 0xF0,
+ 0xA7, 0xA1, 0x44, 0x2C, 0xDD, 0x2E, 0x47, 0xE8, 0xE0, 0x4F, 0x71, 0x8D, 0x62, 0xBD, 0xEA, 0x80, 0x0B, 0x07, 0x79, 0x8C,
+ 0x02, 0x44, 0xE2, 0x85, 0xD5, 0x48, 0x9F, 0x8B, 0xAA, 0xDC, 0x72, 0x75, 0x02, 0xAE, 0x7D, 0x8C, 0x69, 0xAB, 0x94, 0x91,
+ 0x29, 0xA1, 0x4F, 0x03, 0xA9, 0x77, 0x11, 0x48, 0x35, 0x8A, 0x8A, 0xC4, 0xDD, 0xA5, 0x81, 0x54, 0x6D, 0x7C, 0x00, 0xC0,
+ 0x15, 0x87, 0x68, 0x32, 0x16, 0x27, 0xF0, 0x22, 0x12, 0x77, 0x4D, 0x1E, 0xB9, 0xA3, 0x12, 0x9E, 0x03, 0xB0, 0x88, 0x0E,
+ 0x3C, 0x72, 0xEF, 0x43, 0xD0, 0xBA, 0xC4, 0x09, 0xEA, 0x44, 0xE8, 0xC4, 0x4C, 0x15, 0x3A, 0xC0, 0xDD, 0x55, 0x23, 0xB7,
+ 0xD8, 0x2F, 0xE2, 0x13, 0x28, 0x6F, 0xEC, 0xC4, 0x15, 0x3A, 0xEB, 0xDB, 0xB1, 0xEE, 0x25, 0x3D, 0xCB, 0x1F, 0x7D, 0xE8,
+ 0x49, 0x72, 0x9B, 0x4F, 0x3E, 0xF9, 0xF8, 0x33, 0x7E, 0xBE, 0xF8, 0x94, 0x9B, 0x4F, 0x3F, 0xFD, 0x54, 0x7D, 0xE2, 0xD8,
+ 0xA1, 0x63, 0xC3, 0x83, 0x2B, 0x56, 0x2E, 0x5E, 0x45, 0xE4, 0x40, 0x07, 0xBD, 0x4D, 0xFC, 0x95, 0x04, 0xDE, 0x96, 0xF2,
+ 0x0E, 0x81, 0x20, 0x83, 0xE9, 0x88, 0x1E, 0x35, 0xA8, 0x26, 0x04, 0x58, 0x4A, 0x1B, 0x1A, 0x4A, 0xB1, 0xF1, 0xA6, 0xA6,
+ 0x8A, 0x46, 0x2C, 0xBD, 0x32, 0xBF, 0xA2, 0x2A, 0xAF, 0xEA, 0x95, 0x97, 0x5F, 0xFF, 0xE4, 0xD3, 0xCF, 0xBF, 0xF3, 0xFA,
+ 0xF7, 0xEA, 0x0B, 0xEB, 0xCA, 0x73, 0x51, 0x43, 0x43, 0x63, 0xA9, 0x22, 0x4F, 0xAD, 0xA2, 0x8D, 0x22, 0xBB, 0x77, 0x21,
+ 0x6B, 0xD1, 0x41, 0x51, 0x03, 0x1E, 0x50, 0x59, 0x58, 0x83, 0xD0, 0xB9, 0x15, 0xA1, 0x1B, 0xD1, 0xEB, 0x05, 0xA2, 0xAF,
+ 0xC8, 0x2B, 0xE7, 0xB6, 0x34, 0x97, 0x8B, 0x4A, 0x1F, 0xD7, 0xC0, 0x55, 0x0D, 0x62, 0xEF, 0xAE, 0x75, 0x0B, 0x88, 0x8F,
+ 0x81, 0x14, 0x2B, 0x77, 0x0B, 0x2F, 0x08, 0x57, 0xD5, 0xC0, 0x12, 0xA0, 0x57, 0x40, 0x6F, 0x50, 0x89, 0xCB, 0x52, 0x84,
+ 0x41, 0x0D, 0x1D, 0x0D, 0x7D, 0xAC, 0xF6, 0xFA, 0xDE, 0xF6, 0xC6, 0x1E, 0x59, 0x22, 0xFA, 0x5E, 0xAF, 0xB1, 0xB7, 0xD5,
+ 0xF5, 0x38, 0x78, 0x5D, 0x2B, 0xA8, 0x8D, 0xC8, 0x24, 0x7B, 0x71, 0x17, 0x20, 0xDE, 0x51, 0xD7, 0xBE, 0xA8, 0xBE, 0x13,
+ 0x1B, 0x5C, 0xBD, 0x74, 0xCD, 0x40, 0xD7, 0xE0, 0xD5, 0x57, 0x5E, 0xF7, 0xD1, 0x47, 0xFF, 0x83, 0xE1, 0x93, 0x91, 0x92,
+ 0x32, 0x92, 0x98, 0xF2, 0xF3, 0xDF, 0x4F, 0x3F, 0xE6, 0x91, 0x27, 0x1F, 0x7F, 0x6A, 0xD5, 0xE0, 0xCA, 0x15, 0xFD, 0xC3,
+ 0xC3, 0x3D, 0xCB, 0xAC, 0x1F, 0x34, 0x55, 0x99, 0x64, 0x46, 0xAD, 0xDE, 0x44, 0x54, 0xF0, 0x44, 0x61, 0xBD, 0xAE, 0x08,
+ 0x78, 0x01, 0xDC, 0x5B, 0x54, 0xCA, 0x35, 0x05, 0x55, 0x39, 0x89, 0x99, 0x5B, 0xD6, 0x6F, 0xFD, 0xF8, 0xE3, 0x4F, 0x7E,
+ 0xFD, 0xC1, 0x2F, 0xFF, 0xF5, 0xAF, 0x7F, 0xAD, 0xE8, 0x5D, 0x9E, 0x97, 0x92, 0x5B, 0x99, 0x5B, 0x2E, 0xD6, 0xED, 0xE2,
+ 0x8C, 0x57, 0xF4, 0x6A, 0xF2, 0xDE, 0x05, 0xF8, 0x38, 0x26, 0x5F, 0x50, 0x5D, 0x9D, 0x2F, 0xE6, 0x2F, 0x2B, 0xAF, 0x52,
+ 0x6D, 0xBF, 0x22, 0x47, 0xA4, 0x5F, 0x9A, 0x5B, 0x51, 0x96, 0x5F, 0xEE, 0xA3, 0x06, 0x6E, 0x70, 0x7C, 0xA0, 0xB7, 0x59,
+ 0x96, 0x1B, 0x3F, 0xC5, 0xC6, 0x7B, 0x9A, 0x9C, 0x88, 0xDA, 0xD5, 0x32, 0xD8, 0xD5, 0x28, 0xB2, 0x36, 0x38, 0x23, 0x86,
+ 0xEF, 0x45, 0x76, 0xEE, 0x9A, 0xD5, 0xAB, 0x10, 0x6F, 0x2D, 0x5D, 0xD2, 0x41, 0x01, 0xF4, 0xBE, 0xF6, 0x46, 0x16, 0x96,
+ 0x8E, 0xD0, 0xE5, 0xB7, 0x22, 0x6E, 0x03, 0x35, 0x6A, 0xF5, 0x8E, 0xED, 0x9B, 0x80, 0xA9, 0x56, 0x6F, 0x45, 0xAF, 0xD8,
+ 0x8D, 0xF1, 0x72, 0xDB, 0x56, 0x25, 0x58, 0x51, 0x95, 0x57, 0xB1, 0x61, 0xD5, 0xB6, 0xDE, 0xF6, 0xBE, 0x0D, 0x2B, 0x37,
+ 0x7E, 0xF7, 0x3B, 0xDF, 0xD7, 0x4C, 0x1C, 0x1D, 0x98, 0x1F, 0x71, 0x09, 0x94, 0xF2, 0xE6, 0xF7, 0x7E, 0xB0, 0x7E, 0xD9,
+ 0x3A, 0xF0, 0x6A, 0x69, 0xE7, 0x50, 0x7F, 0x4B, 0x2F, 0xC1, 0xA0, 0xB5, 0xBA, 0x45, 0xA0, 0xA6, 0xCC, 0x11, 0xBD, 0xEB,
+ 0x04, 0x24, 0x97, 0x0D, 0x62, 0xD1, 0xE8, 0xA0, 0xD8, 0x81, 0x72, 0xA4, 0x5C, 0x9A, 0x59, 0x9C, 0x1D, 0x9F, 0x79, 0x60,
+ 0xF7, 0x21, 0x20, 0xEE, 0x9F, 0x7F, 0xFF, 0xC7, 0xCF, 0xDE, 0xFB, 0x65, 0x73, 0x4D, 0x4B, 0x61, 0x7A, 0x41, 0x49, 0x7A,
+ 0x21, 0xD2, 0x44, 0x43, 0x55, 0x05, 0x95, 0x1A, 0x51, 0x59, 0x56, 0xEE, 0xD8, 0x3B, 0x77, 0x55, 0xD6, 0xF6, 0xB7, 0x62,
+ 0xF5, 0x05, 0x15, 0x88, 0xBB, 0x4C, 0xA4, 0x5F, 0x63, 0x56, 0x15, 0x72, 0xE7, 0xAE, 0xAC, 0xFC, 0xF2, 0xD2, 0xBC, 0x32,
+ 0x1F, 0x91, 0x69, 0x8B, 0x23, 0xE8, 0xCE, 0x66, 0x81, 0x91, 0xEE, 0x16, 0xCD, 0xCA, 0x07, 0x10, 0x7A, 0x67, 0xB3, 0xA0,
+ 0x8A, 0x49, 0x63, 0xC4, 0xD2, 0x55, 0xD0, 0x8E, 0x81, 0x37, 0x01, 0xE8, 0xB2, 0xAC, 0xBD, 0x7B, 0xC1, 0xDD, 0xB9, 0xAE,
+ 0x5D, 0xA4, 0xF6, 0x0E, 0xBE, 0x1B, 0x84, 0x21, 0x43, 0x97, 0x24, 0x1D, 0x84, 0xC1, 0xC6, 0x2D, 0xCE, 0xA8, 0xC4, 0x35,
+ 0x63, 0x91, 0xA4, 0xA5, 0x46, 0x32, 0x74, 0xC1, 0x6E, 0xC5, 0x0D, 0x85, 0x8E, 0xF2, 0x06, 0x56, 0x43, 0x59, 0x7D, 0x51,
+ 0x7A, 0xFE, 0xA6, 0x35, 0x97, 0x2D, 0xEE, 0x5E, 0xD6, 0xDF, 0xD6, 0x7B, 0xFD, 0xD5, 0x37, 0x7E, 0xF8, 0xE1, 0x6F, 0xAD,
+ 0x0E, 0xB8, 0x30, 0x3A, 0x38, 0xF1, 0xEE, 0xBB, 0x3F, 0xDB, 0xB4, 0x62, 0x23, 0x90, 0xD5, 0xD3, 0xB8, 0xA8, 0xB7, 0xA5,
+ 0x07, 0x07, 0x22, 0xA8, 0x36, 0x95, 0xB6, 0x39, 0xC9, 0x4C, 0xA9, 0xC8, 0x1D, 0x93, 0x37, 0x90, 0x22, 0x08, 0x6E, 0x53,
+ 0x75, 0x8C, 0x97, 0x30, 0x90, 0x9B, 0x98, 0x5B, 0x94, 0x56, 0x84, 0xF2, 0xBE, 0xFB, 0x9D, 0xB7, 0xBE, 0xF3, 0xDA, 0x9B,
+ 0x3B, 0xB7, 0xEE, 0xCE, 0x49, 0xCA, 0xE6, 0xF1, 0x9C, 0xB8, 0xEC, 0x8A, 0x9C, 0x8A, 0xCA, 0xFC, 0x72, 0xC4, 0x6A, 0x64,
+ 0x2A, 0x11, 0x55, 0xE3, 0xAA, 0x48, 0x56, 0x1F, 0x01, 0x7C, 0x3C, 0xC8, 0xC3, 0x23, 0xAA, 0x18, 0x15, 0xBA, 0xFC, 0x21,
+ 0x0A, 0x30, 0xA2, 0x2F, 0xC9, 0x2D, 0x2D, 0xC9, 0x2D, 0xC1, 0x15, 0xC4, 0x0F, 0x14, 0x73, 0x3C, 0x08, 0x3E, 0x92, 0x20,
+ 0x1A, 0xAD, 0x38, 0xB9, 0xA3, 0xCA, 0x1A, 0x4B, 0x17, 0xD1, 0x9B, 0x74, 0xA5, 0xB5, 0xC9, 0xC9, 0x67, 0xD4, 0xDE, 0x15,
+ 0xD9, 0x91, 0xB5, 0x45, 0xF9, 0x96, 0xC6, 0x91, 0xE8, 0x8A, 0xE8, 0x91, 0xB2, 0x73, 0x6B, 0x92, 0x74, 0x91, 0xBB, 0x5B,
+ 0x13, 0x8D, 0x14, 0x4D, 0x9A, 0x38, 0x1A, 0xF3, 0x37, 0xE9, 0x4A, 0x33, 0xB9, 0x20, 0xF9, 0x09, 0x21, 0x11, 0xC1, 0x55,
+ 0x17, 0x56, 0x65, 0xC6, 0xA5, 0xE1, 0x07, 0x9B, 0xD6, 0x6C, 0x5B, 0xD4, 0xD2, 0xBD, 0x71, 0xD5, 0xC6, 0x47, 0x1F, 0x78,
+ 0xEC, 0xFF, 0xFC, 0xF1, 0xAF, 0x56, 0x0D, 0x9F, 0x7D, 0xF6, 0x09, 0xD7, 0xEF, 0xFC, 0xE8, 0xDD, 0x75, 0x2B, 0x37, 0x90,
+ 0xBC, 0x52, 0x5E, 0x2D, 0x6A, 0x44, 0xDF, 0x02, 0xF4, 0x0A, 0xFA, 0x9A, 0xBC, 0x4B, 0xFE, 0x6E, 0x93, 0x99, 0x42, 0x5E,
+ 0x56, 0xCC, 0x53, 0x05, 0x84, 0x13, 0xA4, 0x45, 0xA4, 0x22, 0xC7, 0xCC, 0x98, 0xB4, 0xE1, 0xBE, 0x15, 0x4B, 0xBB, 0x97,
+ 0x25, 0x87, 0x25, 0x94, 0x67, 0x96, 0x15, 0xA7, 0x17, 0x67, 0xC4, 0xA4, 0x89, 0xEC, 0xF2, 0x4B, 0x49, 0x96, 0x14, 0x46,
+ 0x54, 0xFA, 0xE5, 0x5C, 0x17, 0x38, 0x9A, 0x50, 0xD0, 0xAF, 0xC8, 0x15, 0xA1, 0x03, 0xF7, 0xDC, 0x12, 0x5A, 0x04, 0x76,
+ 0xF2, 0xCA, 0xCC, 0x23, 0x15, 0xBA, 0xE4, 0x3A, 0xAF, 0x4C, 0x97, 0x8F, 0x06, 0x4C, 0x37, 0x8A, 0x5A, 0x1C, 0x17, 0x7B,
+ 0x17, 0x28, 0x6F, 0x76, 0x14, 0xE0, 0xDA, 0xB8, 0x44, 0x51, 0x27, 0x5F, 0x6C, 0x02, 0xDF, 0x47, 0x44, 0xAF, 0xD2, 0x27,
+ 0x72, 0x4A, 0xF0, 0xAC, 0x75, 0xF2, 0x19, 0x1B, 0x5D, 0x15, 0xE8, 0xB5, 0x4C, 0xB5, 0xD7, 0xAA, 0x06, 0xC1, 0xFD, 0x4A,
+ 0x53, 0xB2, 0xAA, 0x13, 0xB8, 0x15, 0x93, 0x93, 0xBA, 0x20, 0xBB, 0x32, 0x6C, 0xD6, 0xC9, 0x31, 0x30, 0xC6, 0x84, 0xD0,
+ 0xD8, 0xA1, 0x9E, 0x65, 0xFB, 0x76, 0x5D, 0x49, 0x48, 0x18, 0x68, 0xEF, 0xDB, 0xB6, 0x65, 0xC7, 0x73, 0xCF, 0x7C, 0xF3,
+ 0xAF, 0x7F, 0xFD, 0xFB, 0x17, 0x9F, 0x7D, 0x2E, 0x2D, 0x8A, 0x13, 0x9F, 0x7F, 0xF2, 0xC9, 0x27, 0x18, 0xEF, 0xEA, 0xA1,
+ 0x55, 0x4B, 0xFB, 0x96, 0xF1, 0x87, 0x24, 0xF5, 0x2D, 0x15, 0x64, 0xF4, 0x1A, 0x48, 0x9D, 0x58, 0x2A, 0x17, 0x45, 0x75,
+ 0x26, 0x7D, 0x74, 0x92, 0x74, 0x63, 0x9B, 0xA5, 0xC5, 0x39, 0x25, 0x05, 0x69, 0xF9, 0xF1, 0x21, 0x31, 0xD5, 0x25, 0x35,
+ 0xF1, 0x81, 0x71, 0xC9, 0x11, 0x71, 0x71, 0xC1, 0xD1, 0xE1, 0x73, 0xC3, 0xF8, 0xA4, 0x49, 0x61, 0x09, 0x19, 0x71, 0x69,
+ 0x85, 0x59, 0x45, 0xC5, 0x3C, 0x2D, 0xAF, 0x54, 0xC4, 0x87, 0x34, 0x91, 0x2C, 0x7F, 0x68, 0x64, 0x6A, 0x57, 0x69, 0x81,
+ 0xA3, 0x1B, 0x07, 0x6D, 0x0A, 0x0C, 0xF2, 0xE4, 0x97, 0x97, 0xE4, 0xC8, 0x73, 0xB0, 0xFD, 0xB2, 0x7C, 0x44, 0x2F, 0xAF,
+ 0xA0, 0xAE, 0x80, 0x0E, 0x24, 0x60, 0x7A, 0x03, 0x29, 0xF0, 0xED, 0x86, 0x50, 0x8F, 0x99, 0x1B, 0x54, 0x31, 0xC6, 0x2E,
+ 0x98, 0x2E, 0x12, 0x17, 0x78, 0x11, 0x64, 0x57, 0x34, 0xB7, 0x0A, 0x50, 0x1D, 0x88, 0xB8, 0xEB, 0x47, 0x24, 0x2E, 0x0A,
+ 0x30, 0xF8, 0x63, 0xB1, 0x9E, 0x6B, 0x2B, 0x77, 0xA7, 0x68, 0x32, 0xE0, 0x63, 0x93, 0x77, 0x0D, 0x9E, 0x6A, 0xB9, 0x54,
+ 0x3A, 0x82, 0xB0, 0x79, 0x15, 0x65, 0x59, 0x65, 0xB1, 0x81, 0xD1, 0xA4, 0x28, 0x57, 0x5C, 0x71, 0xD3, 0x9A, 0xE5, 0x9B,
+ 0x86, 0xBA, 0x17, 0x53, 0x27, 0x5F, 0xB1, 0xF7, 0xE8, 0x37, 0xBE, 0xFE, 0xE2, 0x07, 0xBF, 0xFA, 0x2D, 0xB9, 0xE9, 0xFF,
+ 0xFC, 0xCF, 0xC7, 0xBF, 0xFF, 0xDD, 0x9F, 0x9E, 0x79, 0xF2, 0x1B, 0x43, 0x9D, 0x03, 0xCB, 0x7B, 0x97, 0x01, 0xDF, 0x88,
+ 0x9E, 0xD5, 0x50, 0x54, 0xAF, 0x21, 0x14, 0x4F, 0x92, 0x34, 0xB1, 0xD8, 0xA4, 0x8F, 0x05, 0x92, 0xB6, 0x0B, 0x50, 0x28,
+ 0x38, 0xE4, 0x94, 0x23, 0xE2, 0xFC, 0xD4, 0xDC, 0xA8, 0x85, 0x11, 0x35, 0xA5, 0xB5, 0xC9, 0x91, 0x49, 0x41, 0x73, 0x16,
+ 0x06, 0xCD, 0xF5, 0xCF, 0x4E, 0xCB, 0x69, 0xAE, 0x6D, 0x0F, 0x99, 0x17, 0x94, 0x9E, 0x94, 0x99, 0x9F, 0x51, 0x50, 0x94,
+ 0x5D, 0x8C, 0xAA, 0x10, 0x9F, 0x5A, 0xB1, 0x60, 0x3D, 0x0E, 0xA1, 0xA6, 0xAD, 0xCA, 0x70, 0xD0, 0xA6, 0xD4, 0x5C, 0x94,
+ 0xF1, 0x64, 0xF1, 0x1B, 0xD7, 0xEA, 0xF5, 0x42, 0x5F, 0x41, 0x97, 0x8F, 0xD8, 0x72, 0x7D, 0xBF, 0x09, 0x95, 0x5E, 0xBB,
+ 0x16, 0x29, 0x8B, 0xD0, 0x6B, 0x25, 0x90, 0xB2, 0xD4, 0xB4, 0x79, 0x04, 0xC9, 0x5A, 0x4B, 0x57, 0x59, 0x93, 0x53, 0xEA,
+ 0x85, 0x00, 0x7A, 0xAD, 0x80, 0x8C, 0x37, 0xBD, 0x91, 0xDE, 0x8B, 0x27, 0xB7, 0xD1, 0xCE, 0x8C, 0x74, 0x05, 0xAC, 0xE1,
+ 0x1B, 0xE4, 0xB1, 0x6D, 0x03, 0x9B, 0xAD, 0x6B, 0xE2, 0x48, 0x22, 0x08, 0x68, 0x20, 0x26, 0x80, 0xA2, 0x24, 0xBF, 0xAC,
+ 0x28, 0xA3, 0x30, 0x29, 0x34, 0x3E, 0xDA, 0x3F, 0x62, 0xFF, 0x9E, 0xCB, 0xF7, 0xEE, 0xBA, 0x7C, 0xE5, 0xD0, 0xBA, 0x81,
+ 0xCE, 0xC5, 0xAB, 0x97, 0xAC, 0x3B, 0x76, 0xE4, 0xEA, 0x67, 0x9E, 0x7E, 0xFE, 0xC7, 0x3F, 0x7A, 0xF7, 0x67, 0x3F, 0xFD,
+ 0xE5, 0x9B, 0xDF, 0xFB, 0xE1, 0x6D, 0xB7, 0xDF, 0xD3, 0xD5, 0xD0, 0x31, 0xD8, 0xB5, 0xA4, 0x32, 0xBB, 0xA2, 0x3C, 0xBB,
+ 0xB4, 0x26, 0xBF, 0xB2, 0xA2, 0xB0, 0xD2, 0x80, 0x72, 0x75, 0x65, 0x5E, 0x0D, 0xC1, 0x53, 0x32, 0x16, 0x7A, 0x06, 0x46,
+ 0x01, 0x0E, 0x04, 0x19, 0xB9, 0xA0, 0x83, 0x9C, 0xD4, 0xDC, 0x08, 0xFF, 0x30, 0x55, 0x49, 0xD8, 0x82, 0x90, 0xE8, 0x90,
+ 0x68, 0x3A, 0x2B, 0xD9, 0x29, 0xD9, 0x21, 0xFE, 0x41, 0x59, 0xC9, 0xD9, 0x79, 0xE9, 0xF9, 0x04, 0x67, 0xD4, 0x60, 0x25,
+ 0x68, 0xF5, 0x67, 0x3D, 0xC3, 0xB9, 0x50, 0xD8, 0xF1, 0x88, 0xDE, 0xF9, 0x93, 0x9C, 0x72, 0xFB, 0xB7, 0x38, 0x01, 0xFF,
+ 0x14, 0x1D, 0x48, 0xCA, 0x28, 0x9A, 0x68, 0x12, 0x4D, 0x18, 0x03, 0xEF, 0x6D, 0xAB, 0xD5, 0x28, 0xDA, 0xD9, 0x59, 0xDF,
+ 0x85, 0x88, 0xAD, 0x94, 0x55, 0xD0, 0xDA, 0x75, 0x41, 0xDC, 0x0A, 0x2C, 0xA3, 0xA4, 0x6F, 0x2C, 0x5D, 0xEC, 0x7D, 0x74,
+ 0x5A, 0x89, 0xC4, 0x9B, 0xAB, 0x65, 0x61, 0xE9, 0x9A, 0x74, 0x6A, 0xB9, 0xC4, 0xF5, 0x48, 0xC7, 0xA6, 0xA2, 0xCD, 0x2A,
+ 0xA0, 0xAE, 0xAC, 0xD9, 0xC4, 0x00, 0xE9, 0x73, 0x49, 0x96, 0x6D, 0x90, 0x9A, 0x77, 0x8C, 0x08, 0xD2, 0x62, 0x52, 0xE7,
+ 0x4C, 0x9A, 0x35, 0xB0, 0x68, 0xC9, 0xD1, 0x23, 0xD7, 0x11, 0x9C, 0x07, 0x16, 0x2D, 0xA3, 0x8D, 0xB1, 0x6E, 0x78, 0x1D,
+ 0xA9, 0xEA, 0xE3, 0x8F, 0x3D, 0x83, 0x43, 0xD0, 0xB1, 0x38, 0x72, 0xF0, 0xAA, 0xFA, 0xA2, 0x1A, 0x92, 0x8B, 0xD2, 0xAC,
+ 0xA2, 0xBC, 0x84, 0x5C, 0x92, 0x71, 0x1B, 0x09, 0x79, 0xA9, 0xF2, 0xA2, 0x0A, 0xCD, 0xD6, 0x35, 0x69, 0x51, 0x21, 0x96,
+ 0xE5, 0x94, 0x22, 0x59, 0xCC, 0x3C, 0x27, 0x35, 0x27, 0x32, 0x38, 0x3C, 0x2D, 0x3E, 0x9D, 0x4F, 0x17, 0x1F, 0x11, 0x5F,
+ 0x94, 0x5B, 0xD2, 0xD3, 0x3E, 0xB4, 0x70, 0xDE, 0x82, 0xF8, 0xA8, 0x84, 0x9C, 0xA4, 0x2C, 0x90, 0xAA, 0x20, 0xB3, 0x50,
+ 0x10, 0x29, 0x47, 0xC4, 0xE7, 0x75, 0x08, 0xC5, 0x25, 0x7D, 0x35, 0x6B, 0xEC, 0xB8, 0x2C, 0xB0, 0xA3, 0x42, 0x77, 0xC1,
+ 0x47, 0xAE, 0xED, 0xDF, 0x8A, 0x1F, 0xA8, 0xBD, 0xAB, 0x94, 0x25, 0x4D, 0xAC, 0x1F, 0x29, 0x4D, 0x91, 0xB5, 0x15, 0xB1,
+ 0x35, 0x6D, 0x95, 0xBB, 0x1A, 0xBB, 0xB4, 0x18, 0x01, 0x22, 0x1A, 0x8A, 0x20, 0x3B, 0x6D, 0x16, 0x23, 0x7A, 0x6F, 0x74,
+ 0xF5, 0xA2, 0x8D, 0x9A, 0x3F, 0x12, 0xD7, 0x84, 0x67, 0x4C, 0xCB, 0x4C, 0xF3, 0x1F, 0x4D, 0x19, 0xE5, 0xB6, 0x44, 0x10,
+ 0x1C, 0xB8, 0xA0, 0xD2, 0x51, 0xAC, 0x40, 0x58, 0xC8, 0x28, 0x37, 0x2D, 0x2F, 0x3D, 0x31, 0x75, 0xEE, 0x14, 0xDF, 0x94,
+ 0xA8, 0xD4, 0x03, 0xFB, 0xAE, 0xDE, 0xB3, 0xE3, 0xE8, 0xB2, 0xA1, 0xF5, 0xE4, 0x14, 0xF4, 0xB2, 0xD6, 0x0F, 0x6F, 0x3A,
+ 0xB2, 0xE7, 0x8A, 0x9B, 0xAE, 0xBF, 0xED, 0xDA, 0xAB, 0x6F, 0xDE, 0x34, 0xBC, 0x35, 0x3F, 0x29, 0xA7, 0xB5, 0xB6, 0xA3,
+ 0x34, 0xB3, 0x34, 0x2D, 0x32, 0xB9, 0x24, 0x0B, 0xF4, 0x10, 0xCB, 0x55, 0xA4, 0xE6, 0xD5, 0x24, 0x4F, 0x77, 0x53, 0x14,
+ 0xC4, 0xA4, 0x42, 0x29, 0xC8, 0x2E, 0x2A, 0xC8, 0x2C, 0xC0, 0xD8, 0x13, 0x22, 0x13, 0xB0, 0xFA, 0xDE, 0x8E, 0xC1, 0x92,
+ 0xBC, 0x8A, 0x9E, 0xF6, 0x01, 0x14, 0xEF, 0x3F, 0x67, 0x41, 0x6A, 0x5C, 0x2A, 0xBF, 0xCA, 0x49, 0x71, 0x74, 0xC0, 0x9B,
+ 0x61, 0x95, 0x66, 0x97, 0x10, 0xA2, 0x2D, 0x2E, 0x59, 0x29, 0x7B, 0xC5, 0x3D, 0x46, 0x01, 0x56, 0x79, 0xF6, 0xC2, 0xC7,
+ 0x81, 0x72, 0x8C, 0xDD, 0xC5, 0x13, 0x07, 0xBB, 0x4D, 0x14, 0xB5, 0x6B, 0x4C, 0xDA, 0xAE, 0xC6, 0x6E, 0x41, 0x46, 0xB2,
+ 0x4C, 0xB7, 0x15, 0xAC, 0x17, 0x72, 0xAB, 0x6D, 0xC8, 0x0A, 0x07, 0xF7, 0x15, 0x70, 0x58, 0xDA, 0x20, 0xB3, 0xDD, 0x4A,
+ 0xCD, 0x7F, 0xB4, 0x6D, 0xA0, 0x71, 0xD8, 0x55, 0x83, 0x38, 0x81, 0x93, 0xD8, 0xE5, 0x97, 0x4B, 0x18, 0xCC, 0x2E, 0x41,
+ 0x07, 0x29, 0xB1, 0x29, 0xC1, 0x0B, 0x82, 0x27, 0x5F, 0x34, 0x79, 0xD5, 0xD2, 0x0D, 0x07, 0xF7, 0x1F, 0xDF, 0xBE, 0x65,
+ 0x1F, 0xAE, 0x40, 0xEA, 0x89, 0xD5, 0xAF, 0x5E, 0xB6, 0xFE, 0xF0, 0xDE, 0x63, 0x7B, 0xB6, 0x1E, 0xA4, 0x9C, 0x4E, 0x09,
+ 0x4F, 0x20, 0xE4, 0x16, 0x67, 0x97, 0xC5, 0x85, 0xC4, 0x08, 0x80, 0x64, 0x15, 0xCA, 0x67, 0xD6, 0x58, 0x6A, 0xC2, 0xA9,
+ 0x86, 0x50, 0x2E, 0x54, 0x46, 0x0A, 0x44, 0xB9, 0xD9, 0x05, 0xD9, 0x29, 0x39, 0x88, 0x3B, 0x70, 0x7E, 0x40, 0x5A, 0x62,
+ 0xFA, 0x60, 0xF7, 0x72, 0x82, 0xB3, 0xDF, 0xEC, 0xF9, 0x71, 0xE1, 0x71, 0x29, 0xB1, 0xA9, 0x04, 0x06, 0x5E, 0x0A, 0x5F,
+ 0xE1, 0x99, 0x2C, 0x1B, 0x18, 0xAC, 0x0E, 0x3C, 0x20, 0xE3, 0xD8, 0xBE, 0x7D, 0xE4, 0x64, 0xD1, 0xAB, 0x16, 0x59, 0xA2,
+ 0x03, 0xB5, 0x77, 0x07, 0xCD, 0xEB, 0x1C, 0x1B, 0xD7, 0x07, 0x9D, 0x66, 0xBA, 0x2B, 0x6E, 0xC0, 0x44, 0x13, 0x4A, 0x6B,
+ 0xE0, 0xC8, 0x5A, 0xBB, 0x60, 0x4E, 0x56, 0xA3, 0x08, 0xE3, 0xB4, 0xDA, 0x4D, 0x4F, 0xD8, 0xD3, 0x19, 0x76, 0xD2, 0x4D,
+ 0x83, 0x39, 0x4E, 0xE2, 0xAF, 0xE9, 0xBF, 0xEB, 0x01, 0xAA, 0x00, 0x4A, 0xD6, 0xDA, 0xD2, 0x26, 0x6D, 0x06, 0xA0, 0x03,
+ 0x45, 0x55, 0x47, 0x46, 0x69, 0x79, 0xA9, 0x71, 0x69, 0xB1, 0xE1, 0x91, 0x17, 0x8E, 0x3B, 0x17, 0xE0, 0xBE, 0xFC, 0xF0,
+ 0xF5, 0x3B, 0x77, 0x5E, 0xBE, 0xB8, 0x7F, 0x4D, 0x43, 0x45, 0x2B, 0x4D, 0x1E, 0x1A, 0x18, 0x6B, 0x87, 0x37, 0xD2, 0x55,
+ 0x25, 0xA3, 0x8D, 0xF2, 0x0B, 0x27, 0x92, 0xF3, 0x09, 0xC3, 0x02, 0xC2, 0x78, 0x26, 0x82, 0xE3, 0x15, 0x00, 0x16, 0xD5,
+ 0x81, 0x82, 0x86, 0xBA, 0x97, 0x8A, 0xA9, 0x28, 0xB7, 0x18, 0xB1, 0x22, 0x62, 0x9E, 0x0C, 0x10, 0x25, 0x45, 0x24, 0x04,
+ 0xCC, 0x09, 0x08, 0x5C, 0xB0, 0xD0, 0x7F, 0xCE, 0xBC, 0xA8, 0x90, 0xB0, 0xE4, 0x98, 0x94, 0x8C, 0xA4, 0x9C, 0x9C, 0xF4,
+ 0x3C, 0x9E, 0xA0, 0x58, 0x34, 0x46, 0x07, 0x56, 0x91, 0x27, 0xCB, 0xFA, 0x2B, 0xA4, 0xEF, 0xE8, 0xC0, 0x49, 0x57, 0x4C,
+ 0xC5, 0x04, 0xA4, 0x08, 0xC8, 0x28, 0xA4, 0xB8, 0x0A, 0x50, 0x99, 0xAA, 0xAC, 0xED, 0xAC, 0x63, 0x24, 0xAE, 0x1A, 0xBB,
+ 0xB6, 0x41, 0xD5, 0x1A, 0xBB, 0xB5, 0xF4, 0x31, 0x17, 0xA7, 0x14, 0xBD, 0x86, 0x01, 0xAB, 0x00, 0xDB, 0x82, 0xE7, 0x02,
+ 0xD4, 0xB6, 0xD8, 0x5A, 0x9C, 0x59, 0x84, 0x1F, 0xA4, 0xC5, 0x65, 0x26, 0x44, 0xC5, 0xCD, 0x98, 0x36, 0xFD, 0xD2, 0x89,
+ 0x53, 0xD6, 0x0E, 0x6F, 0xC5, 0x15, 0xD6, 0xAD, 0xBA, 0xAC, 0xA1, 0xAA, 0xA3, 0x2C, 0xBB, 0x12, 0xE4, 0xA1, 0x88, 0x6D,
+ 0x2C, 0x6E, 0xC8, 0x4B, 0xCC, 0x0E, 0xF4, 0xF5, 0xAF, 0x29, 0x6B, 0xC8, 0xCF, 0x2A, 0x00, 0x55, 0xB2, 0x13, 0xB3, 0xF8,
+ 0xC3, 0xFC, 0x4C, 0x31, 0x3A, 0x8B, 0x0C, 0x64, 0x2C, 0x2C, 0xAB, 0x03, 0x1E, 0x47, 0xB8, 0xAA, 0x03, 0x30, 0x07, 0x4D,
+ 0x27, 0x44, 0x26, 0xC6, 0x84, 0xC6, 0x80, 0x4B, 0x78, 0x40, 0x46, 0x62, 0x86, 0x04, 0xE4, 0x94, 0x5C, 0x79, 0x9D, 0xAC,
+ 0x42, 0x55, 0x83, 0xFA, 0x81, 0x17, 0xD9, 0xFF, 0x7F, 0x28, 0x80, 0xD7, 0xF1, 0x31, 0x68, 0xBE, 0xA8, 0xB9, 0xBA, 0x8B,
+ 0xA5, 0x56, 0x6F, 0x96, 0x8B, 0x2D, 0x6E, 0xC5, 0xE4, 0xCD, 0x64, 0x2C, 0xB2, 0x7B, 0xA7, 0x1F, 0x5E, 0x59, 0x8F, 0x54,
+ 0x58, 0x2E, 0xE6, 0x58, 0x63, 0xB7, 0x51, 0x57, 0x5D, 0xC1, 0x8A, 0x5E, 0x15, 0xE0, 0x74, 0x6F, 0xDC, 0x2E, 0x3C, 0xA9,
+ 0x24, 0x3A, 0x10, 0x83, 0xCD, 0x71, 0xB0, 0x22, 0x3F, 0x23, 0x3F, 0x33, 0x29, 0x53, 0xF0, 0x3A, 0x20, 0xF8, 0x6B, 0x67,
+ 0x9D, 0x8D, 0x8B, 0xEC, 0xDB, 0x73, 0xD5, 0xE6, 0xF5, 0x7B, 0x69, 0xE2, 0x66, 0xC6, 0xE5, 0x25, 0x85, 0x25, 0xE5, 0xA6,
+ 0x16, 0x90, 0xB7, 0xC4, 0x87, 0xC6, 0xFA, 0xCD, 0xF7, 0xAF, 0x2B, 0x6B, 0xCC, 0xCD, 0xC8, 0x0B, 0x5A, 0xB0, 0x30, 0x3D,
+ 0x21, 0x03, 0x84, 0x11, 0x44, 0xCA, 0x2C, 0x19, 0x93, 0x59, 0x2A, 0x70, 0x3B, 0x7E, 0x96, 0x53, 0x8C, 0x7C, 0x0B, 0x53,
+ 0xF3, 0x79, 0x32, 0x12, 0x4F, 0x4F, 0x48, 0xC7, 0x21, 0xD2, 0xE2, 0xD3, 0x32, 0x12, 0x33, 0xB9, 0xCB, 0x83, 0xF9, 0xA9,
+ 0x79, 0xF8, 0x13, 0x0A, 0x50, 0x38, 0xF2, 0xEA, 0xE0, 0x94, 0xD2, 0xB7, 0x68, 0x73, 0xF2, 0x85, 0x7A, 0x92, 0x2E, 0x1F,
+ 0xB1, 0xEE, 0xEA, 0x45, 0x2D, 0x95, 0x48, 0xDF, 0x69, 0x15, 0xC8, 0x23, 0x06, 0xC4, 0xAD, 0x51, 0x9F, 0x7C, 0xA1, 0x71,
+ 0x55, 0x71, 0xC6, 0xBB, 0xAC, 0xAC, 0xAD, 0xBD, 0x5B, 0xB8, 0xF7, 0x4A, 0x5F, 0x11, 0x7F, 0x8C, 0x02, 0xA4, 0x6B, 0x46,
+ 0xFF, 0x80, 0xF9, 0x9F, 0xA0, 0x90, 0xB4, 0x10, 0x00, 0x74, 0x89, 0x07, 0xB4, 0x18, 0x35, 0x66, 0x66, 0x16, 0x60, 0x86,
+ 0x99, 0x49, 0x59, 0x49, 0xD1, 0x49, 0x58, 0xE8, 0xF8, 0x8B, 0x2E, 0xF6, 0x9B, 0xB3, 0x60, 0xC3, 0x9A, 0x9D, 0xDB, 0xB6,
+ 0x1D, 0xEC, 0xEF, 0x5E, 0x91, 0x9F, 0x5E, 0x94, 0x14, 0x91, 0x9C, 0x14, 0x9B, 0x92, 0x18, 0x93, 0x44, 0x42, 0xE9, 0x37,
+ 0xC7, 0xBF, 0xBE, 0xB2, 0x99, 0xE7, 0x2F, 0x9C, 0xE7, 0x8F, 0x28, 0x11, 0x22, 0xD7, 0xDE, 0x94, 0x66, 0x0C, 0x76, 0x0B,
+ 0x16, 0xE5, 0x18, 0x84, 0x49, 0x2B, 0x20, 0xF9, 0xC1, 0xE4, 0xB3, 0x92, 0x72, 0xB3, 0x52, 0x73, 0xE4, 0x16, 0x05, 0xA4,
+ 0x01, 0x44, 0xB9, 0x68, 0xD1, 0xC5, 0xA2, 0xB1, 0x7E, 0x20, 0x40, 0xE7, 0xE2, 0xFB, 0xFF, 0x47, 0xD1, 0x8F, 0xE8, 0xC0,
+ 0x89, 0x9C, 0x0A, 0xEB, 0xA6, 0x44, 0xE2, 0x11, 0x1D, 0x2A, 0xE9, 0xAF, 0x4E, 0x16, 0xB4, 0x83, 0xF2, 0x66, 0xE8, 0xE1,
+ 0x0C, 0x40, 0x6C, 0x63, 0xC7, 0x98, 0xB6, 0x85, 0x7B, 0x6F, 0x7F, 0x78, 0x8C, 0xD0, 0x75, 0x14, 0xE5, 0xF4, 0x8D, 0xDD,
+ 0xFE, 0xA5, 0x54, 0x64, 0x66, 0x2C, 0x65, 0xDB, 0xC2, 0x9A, 0x14, 0x09, 0x5E, 0x67, 0x17, 0x23, 0xC1, 0x82, 0xB4, 0x3C,
+ 0x24, 0x42, 0x58, 0x46, 0x07, 0xF3, 0x7D, 0xE7, 0x8D, 0x3B, 0xE7, 0x5C, 0x42, 0xF1, 0xDE, 0x5D, 0x57, 0x0F, 0x2F, 0xDB,
+ 0x44, 0xD9, 0x15, 0x1B, 0x11, 0x07, 0xFA, 0x93, 0x50, 0x86, 0x2F, 0x0C, 0x27, 0x90, 0xD6, 0x96, 0x37, 0x62, 0xBC, 0x01,
+ 0x73, 0xE7, 0x63, 0xCB, 0x59, 0xC9, 0x59, 0x1A, 0x15, 0xBE, 0x02, 0xC7, 0x89, 0x16, 0xFC, 0x56, 0xCD, 0x1C, 0x59, 0xA3,
+ 0x33, 0xFE, 0x44, 0x57, 0x6E, 0x5A, 0xAE, 0x64, 0xA5, 0x6E, 0x62, 0xCA, 0x73, 0xBC, 0x82, 0x56, 0x27, 0xF8, 0x6A, 0x1D,
+ 0x78, 0x0D, 0x5F, 0xAF, 0xE5, 0xE3, 0x98, 0xE5, 0xE3, 0x88, 0xDB, 0x9B, 0xA7, 0x8F, 0x1E, 0xB4, 0x5A, 0x33, 0x1F, 0x03,
+ 0xE5, 0x84, 0x41, 0xFB, 0x48, 0x7D, 0xB9, 0x93, 0x53, 0xDA, 0x47, 0x46, 0x4B, 0x9C, 0x6C, 0xA7, 0x55, 0x67, 0x4F, 0x32,
+ 0x08, 0x94, 0xD6, 0x8D, 0x3C, 0x62, 0xD3, 0x50, 0x9D, 0x8C, 0xEB, 0x68, 0x50, 0xEA, 0x32, 0x1A, 0x6A, 0x8C, 0x67, 0xCD,
+ 0xFC, 0x8F, 0xE2, 0xC0, 0xAB, 0x83, 0xBC, 0xF4, 0x3C, 0xC4, 0x4A, 0xCF, 0x20, 0x21, 0x2C, 0x2E, 0x6C, 0x61, 0xC8, 0xB9,
+ 0xE7, 0x9C, 0x9D, 0x14, 0x9D, 0xBC, 0x75, 0xE3, 0xBE, 0x55, 0x2B, 0xB6, 0xD5, 0x55, 0xB4, 0x88, 0x0E, 0xFC, 0x82, 0xC8,
+ 0xEE, 0xC3, 0x16, 0x06, 0xF9, 0xCF, 0x9A, 0x07, 0x16, 0x65, 0xA5, 0x66, 0x13, 0x54, 0x0D, 0xA0, 0x67, 0x22, 0x4A, 0x93,
+ 0x20, 0x09, 0x86, 0x78, 0x8B, 0x2C, 0x27, 0x9C, 0xE6, 0x95, 0x14, 0xE4, 0x22, 0x47, 0xA4, 0x23, 0x72, 0x31, 0xB5, 0x98,
+ 0xA8, 0x21, 0x37, 0x03, 0xDB, 0x97, 0x50, 0xEC, 0x66, 0x44, 0xFC, 0xD6, 0x51, 0xA4, 0x57, 0xE8, 0x56, 0xC4, 0xA7, 0x7C,
+ 0x50, 0x25, 0x6E, 0x9F, 0xA3, 0x6A, 0x1E, 0xD1, 0x81, 0x62, 0x0E, 0x53, 0x3D, 0x64, 0xAD, 0xB7, 0x63, 0x64, 0xED, 0xB5,
+ 0x74, 0x06, 0x7E, 0xDE, 0x3A, 0x76, 0xCC, 0x18, 0xC4, 0x62, 0xBA, 0x17, 0xDC, 0xC9, 0x70, 0x90, 0xBE, 0xF6, 0xCB, 0xB8,
+ 0x90, 0xAE, 0x7D, 0x69, 0x9D, 0x36, 0xEB, 0x1B, 0x8A, 0x45, 0x2B, 0x2C, 0x6D, 0xE5, 0xEB, 0x54, 0xD6, 0x19, 0xC9, 0x32,
+ 0x0D, 0x2F, 0x94, 0x4E, 0x8E, 0x69, 0xC1, 0x4B, 0xD5, 0xA3, 0x79, 0x11, 0x82, 0x50, 0xA4, 0x4E, 0x8E, 0x4C, 0x8C, 0x0C,
+ 0x8A, 0x9A, 0x3C, 0xE9, 0x92, 0x4B, 0x26, 0x4E, 0xA6, 0x44, 0x58, 0xBF, 0x7A, 0x27, 0xAD, 0xAD, 0xE4, 0x84, 0x74, 0x14,
+ 0x10, 0x1B, 0x1C, 0x83, 0x7A, 0xFC, 0x66, 0xCF, 0xAD, 0x28, 0xAD, 0xCB, 0x4C, 0xCF, 0xC1, 0x21, 0xC0, 0x2E, 0xFE, 0x04,
+ 0xE5, 0x29, 0x1C, 0xA9, 0x98, 0xBC, 0xB1, 0x54, 0x5E, 0x3F, 0x8F, 0xD4, 0xA8, 0xA4, 0x24, 0xAB, 0x54, 0x75, 0xA0, 0x0B,
+ 0x49, 0x89, 0xEB, 0xA4, 0xCB, 0xAD, 0x2B, 0x44, 0x44, 0x59, 0x48, 0x76, 0x30, 0xC6, 0x15, 0xAC, 0xE8, 0x4F, 0xB6, 0x77,
+ 0xAF, 0xE8, 0xED, 0x2B, 0xDB, 0xD7, 0xE7, 0x13, 0xF9, 0x78, 0x2D, 0xF7, 0xE4, 0xA4, 0x65, 0xAC, 0xED, 0x33, 0x69, 0x72,
+ 0x27, 0x7F, 0x1E, 0x89, 0x3B, 0x49, 0xBD, 0xDA, 0xB5, 0xDA, 0xB2, 0x6B, 0xD7, 0x46, 0xCA, 0x46, 0xB2, 0xD2, 0x7A, 0xB3,
+ 0x13, 0x70, 0xD7, 0xE4, 0xF1, 0x00, 0x79, 0x7E, 0xB1, 0x51, 0x92, 0x7A, 0x83, 0x27, 0x20, 0x4B, 0x63, 0x27, 0xAF, 0x46,
+ 0x5B, 0x8C, 0x58, 0xAB, 0x48, 0x27, 0x2D, 0x3F, 0x37, 0x39, 0x27, 0x3D, 0x29, 0x23, 0x39, 0x26, 0x39, 0x26, 0x08, 0xD0,
+ 0x5F, 0x70, 0xD6, 0x59, 0x67, 0x81, 0x39, 0xBB, 0xB6, 0x5C, 0xDE, 0xB7, 0x68, 0x38, 0x23, 0x39, 0x2B, 0xC4, 0x2F, 0x24,
+ 0xD4, 0x3F, 0x34, 0xD8, 0x2F, 0xD0, 0x6F, 0xC6, 0xFC, 0xC2, 0xBC, 0x4A, 0x70, 0x7C, 0x81, 0xEF, 0x1C, 0x74, 0x80, 0xEB,
+ 0x00, 0x47, 0x36, 0xBB, 0x1F, 0xD1, 0xC1, 0xA8, 0xCE, 0x41, 0x69, 0x91, 0xAB, 0x03, 0xFE, 0x97, 0x2A, 0x43, 0x2F, 0xDC,
+ 0x35, 0x12, 0x48, 0x6D, 0x7A, 0xAA, 0xD2, 0xF7, 0xFA, 0x81, 0xD7, 0xE4, 0xF5, 0x71, 0xAF, 0xD5, 0x7B, 0xB5, 0xAB, 0x8F,
+ 0xFB, 0xD8, 0xFC, 0xC4, 0xD6, 0xA8, 0x63, 0x2C, 0x5D, 0xEE, 0x96, 0x37, 0xE9, 0xD3, 0x90, 0x11, 0x95, 0x94, 0xC8, 0x5A,
+ 0x99, 0x1D, 0xBA, 0x30, 0xE4, 0x62, 0x43, 0xB3, 0x51, 0x3C, 0x31, 0xA4, 0x1A, 0x2E, 0x18, 0x70, 0x2B, 0xBB, 0xC6, 0x3B,
+ 0x7A, 0x55, 0xF6, 0x87, 0xCC, 0x63, 0xE5, 0xB6, 0x41, 0x56, 0x71, 0x4B, 0x23, 0x3A, 0x28, 0x6B, 0x94, 0x97, 0xE2, 0x5A,
+ 0x5F, 0xC4, 0x74, 0xAA, 0x69, 0x6A, 0x6A, 0xA3, 0xC2, 0xD6, 0x50, 0x0C, 0x0F, 0x88, 0x96, 0x84, 0xE5, 0x94, 0xF8, 0x54,
+ 0xEA, 0xA6, 0xD0, 0x80, 0xE0, 0xF3, 0xCE, 0x1D, 0x17, 0x11, 0x16, 0xB9, 0x69, 0xDD, 0x9E, 0x25, 0x03, 0x6B, 0x29, 0x74,
+ 0x83, 0xFD, 0x43, 0x28, 0xAF, 0x42, 0x03, 0x02, 0xE7, 0xCE, 0x98, 0x2D, 0x30, 0x92, 0x99, 0xBF, 0xC0, 0x77, 0x1E, 0x78,
+ 0x45, 0x58, 0xE6, 0xAF, 0xB2, 0xD3, 0x0C, 0x1C, 0x65, 0x8A, 0x4B, 0x8D, 0x24, 0x48, 0xD9, 0x4E, 0x7E, 0x69, 0x73, 0x1B,
+ 0x57, 0xBE, 0x82, 0x4B, 0xBA, 0x8A, 0x1D, 0x65, 0x88, 0x40, 0x71, 0x02, 0xAF, 0xB1, 0xAB, 0x0E, 0xAC, 0xDC, 0xBD, 0x96,
+ 0x7E, 0xB2, 0xE8, 0xAD, 0x6F, 0xA9, 0x87, 0xE9, 0x12, 0x1D, 0x78, 0xB1, 0xDB, 0x5E, 0x8F, 0x0D, 0xA1, 0x65, 0x0C, 0x40,
+ 0x64, 0x06, 0x22, 0x9D, 0x1C, 0xCF, 0x14, 0x50, 0x3B, 0xFB, 0xCE, 0x20, 0x10, 0x33, 0x77, 0xE9, 0x4D, 0x1A, 0x5A, 0x2D,
+ 0xC5, 0x43, 0xE9, 0x37, 0xF2, 0x4C, 0x77, 0x12, 0x5B, 0x5B, 0x04, 0xF8, 0x38, 0x42, 0x17, 0x05, 0x57, 0x34, 0x33, 0xE7,
+ 0x6A, 0x2E, 0x55, 0xEA, 0x4E, 0x23, 0x4B, 0x27, 0x5C, 0x84, 0x04, 0x74, 0xA0, 0x7E, 0x80, 0x91, 0x6A, 0x6A, 0xC4, 0x44,
+ 0x05, 0x88, 0x4F, 0x8C, 0x8E, 0x07, 0x79, 0xA6, 0x5D, 0x32, 0x75, 0xD2, 0x84, 0x4B, 0x96, 0xF6, 0xAF, 0x5A, 0xB1, 0x74,
+ 0x33, 0x4D, 0xBD, 0xB0, 0xC0, 0xF0, 0xC0, 0xD9, 0x01, 0xE4, 0x42, 0x73, 0x67, 0xF9, 0xA6, 0x27, 0xA5, 0x91, 0x6B, 0xCE,
+ 0x9F, 0x8D, 0x1F, 0x88, 0x0E, 0xB4, 0xD3, 0x20, 0x89, 0x8D, 0x80, 0xBE, 0x13, 0x15, 0x24, 0x96, 0xE6, 0x38, 0xBD, 0x0A,
+ 0x47, 0x07, 0xD9, 0x65, 0xA3, 0x81, 0x65, 0x04, 0xC7, 0xFF, 0x9F, 0x70, 0xE6, 0x14, 0xB0, 0x93, 0xE9, 0x08, 0xDD, 0xC9,
+ 0x6E, 0xD3, 0x9D, 0xC8, 0xEF, 0x33, 0x06, 0xC4, 0x2D, 0x92, 0xB8, 0x78, 0x22, 0xB1, 0xD4, 0x44, 0x54, 0x49, 0x1C, 0x47,
+ 0x40, 0xC6, 0x60, 0xB7, 0xA2, 0xB9, 0xFC, 0x09, 0xE6, 0x5C, 0x64, 0x84, 0x5E, 0x2C, 0x11, 0xB5, 0x86, 0xA9, 0x08, 0x13,
+ 0x92, 0xA2, 0x06, 0x87, 0x53, 0xE6, 0x0E, 0xAA, 0x34, 0xDB, 0x71, 0xA6, 0x86, 0x85, 0x32, 0xC9, 0x72, 0x66, 0xE8, 0x55,
+ 0x4D, 0xCD, 0x95, 0x4D, 0x4A, 0x68, 0x68, 0xAB, 0x90, 0xB9, 0x0D, 0x2F, 0x68, 0xFA, 0x45, 0x75, 0xD5, 0xC5, 0x0D, 0x36,
+ 0x35, 0xD2, 0x96, 0x4E, 0x1E, 0x3D, 0xFC, 0xE4, 0x6C, 0x52, 0x1D, 0x10, 0x26, 0x2A, 0x54, 0xE0, 0xE8, 0xEC, 0xB3, 0xCF,
+ 0xAC, 0x2E, 0xAD, 0x5F, 0xBF, 0x72, 0x7B, 0x6D, 0x79, 0x73, 0x64, 0x48, 0x14, 0xF9, 0x52, 0xC0, 0x3C, 0xFF, 0x39, 0x33,
+ 0x66, 0x27, 0xC5, 0x26, 0x17, 0xE6, 0x14, 0xA3, 0x8C, 0xC4, 0xA8, 0x44, 0xF5, 0x03, 0x70, 0x4C, 0xB2, 0xA3, 0xAC, 0x82,
+ 0x11, 0x35, 0x10, 0x87, 0x4D, 0xF3, 0xF2, 0xA4, 0xC4, 0xC6, 0xD1, 0xD3, 0x29, 0xE5, 0x6E, 0x5D, 0xE1, 0x94, 0xE6, 0x3F,
+ 0xC6, 0x15, 0xAC, 0xBD, 0xE7, 0x19, 0x1D, 0xA8, 0x02, 0xA4, 0xD6, 0x4B, 0x95, 0xBC, 0x8B, 0x0B, 0x47, 0x07, 0xA3, 0x41,
+ 0x7C, 0x24, 0x4B, 0x71, 0x72, 0x76, 0x9D, 0x77, 0xAB, 0x1A, 0x4A, 0x64, 0xF4, 0x6A, 0x96, 0x63, 0xAA, 0x9A, 0x4A, 0xBA,
+ 0x1E, 0x20, 0xD7, 0xD2, 0x9A, 0x97, 0x21, 0x09, 0x0D, 0x1F, 0x67, 0x52, 0xE8, 0x10, 0xCD, 0x0A, 0xC5, 0xAE, 0xAB, 0x0B,
+ 0x1C, 0xDE, 0x99, 0x0E, 0x63, 0xC9, 0x7F, 0x18, 0x52, 0x32, 0xEF, 0x85, 0xCF, 0x03, 0xAB, 0x07, 0x36, 0x5C, 0x6B, 0x35,
+ 0x3E, 0x21, 0xFC, 0x06, 0x69, 0x5A, 0x98, 0xBE, 0xA9, 0x36, 0x23, 0x25, 0x2C, 0xE7, 0xD8, 0xB0, 0x4C, 0x48, 0x48, 0x89,
+ 0x0D, 0x8F, 0x0E, 0x0F, 0x0C, 0x05, 0x8E, 0x50, 0xC6, 0xFA, 0x95, 0x5B, 0x69, 0x38, 0xC6, 0x84, 0xC7, 0xA2, 0x15, 0xE0,
+ 0x68, 0xDE, 0xCC, 0x39, 0x09, 0xD1, 0x89, 0x78, 0xC6, 0xBC, 0x59, 0x73, 0xD1, 0x01, 0x75, 0x2F, 0xA9, 0x11, 0x61, 0x99,
+ 0x7E, 0x83, 0x11, 0x8A, 0x24, 0x48, 0x92, 0xAE, 0xA0, 0x80, 0x3C, 0x51, 0x83, 0xF5, 0x0C, 0xD7, 0x09, 0xBE, 0x4A, 0x07,
+ 0x5E, 0xC5, 0x8C, 0xB1, 0x77, 0x3C, 0x75, 0x0C, 0xE2, 0xF3, 0xBF, 0xCC, 0x12, 0xAB, 0xD7, 0x94, 0xD7, 0x2E, 0xBD, 0xEB,
+ 0xE3, 0xA5, 0x8C, 0x69, 0xB7, 0x52, 0xA4, 0xEC, 0x30, 0xC8, 0x4C, 0x9A, 0xE8, 0xE6, 0xEC, 0x16, 0x5E, 0xEC, 0x85, 0x2A,
+ 0x43, 0x53, 0x49, 0xB1, 0x6E, 0x43, 0x34, 0x53, 0xDB, 0xB7, 0x9C, 0x03, 0x1D, 0x79, 0x33, 0x2D, 0xB1, 0xCC, 0x32, 0xEC,
+ 0x9A, 0x6B, 0xA6, 0x31, 0xC4, 0x5B, 0x78, 0x3B, 0xF9, 0xA9, 0x05, 0xCC, 0x6F, 0xCB, 0x33, 0x2B, 0x84, 0xD3, 0xE9, 0x70,
+ 0xDC, 0x20, 0x16, 0xB6, 0x42, 0x2C, 0x04, 0xA0, 0x4C, 0xFB, 0x9A, 0x59, 0x39, 0xE3, 0x40, 0x99, 0x73, 0x01, 0xE5, 0xF2,
+ 0xBE, 0x13, 0xB3, 0xB3, 0x13, 0x33, 0x4D, 0x48, 0x88, 0x8F, 0x0C, 0x8A, 0xBC, 0x74, 0xD2, 0x25, 0x53, 0xA7, 0x5C, 0x3A,
+ 0xBC, 0x64, 0xE3, 0xA2, 0xF6, 0x25, 0x74, 0x98, 0x49, 0x84, 0xA8, 0x8D, 0xE7, 0xCD, 0xF4, 0x8D, 0x8B, 0x8C, 0x2F, 0x2B,
+ 0xAC, 0xE0, 0x82, 0xBA, 0x3A, 0xC9, 0x94, 0xBB, 0xF8, 0x81, 0x18, 0x20, 0x73, 0x18, 0xB7, 0x50, 0x10, 0x89, 0x3B, 0x0A,
+ 0x00, 0x9D, 0x1C, 0x80, 0x32, 0x6A, 0x18, 0x05, 0xFA, 0xE2, 0x7F, 0x63, 0x1E, 0x71, 0x73, 0xA7, 0x93, 0x30, 0x47, 0xC4,
+ 0x3D, 0x66, 0x9D, 0x2C, 0x7D, 0xAB, 0x06, 0x5C, 0xC1, 0x07, 0x03, 0x57, 0x5C, 0xB6, 0x8C, 0x49, 0x2E, 0x14, 0x8B, 0x35,
+ 0xB4, 0x8E, 0x30, 0x58, 0x9D, 0xAC, 0xC6, 0xF0, 0x58, 0xDD, 0x52, 0xD6, 0x78, 0x80, 0x4C, 0xA9, 0x0C, 0x9F, 0xB2, 0x1A,
+ 0x14, 0xB2, 0xDC, 0x4A, 0x2F, 0xA9, 0x4F, 0x19, 0x4E, 0x3A, 0xDA, 0x26, 0xD7, 0xA4, 0xF7, 0x40, 0xC2, 0x87, 0x0E, 0xBA,
+ 0x1A, 0x16, 0x7D, 0xFB, 0x5B, 0xDF, 0x7B, 0xEC, 0x91, 0x27, 0xE1, 0x22, 0xD2, 0xE8, 0x6F, 0xAD, 0x6C, 0x66, 0xFE, 0x0E,
+ 0x17, 0x48, 0x18, 0x86, 0x35, 0xC2, 0xA2, 0x50, 0x35, 0xC8, 0xD0, 0xB1, 0x00, 0x6F, 0x10, 0x57, 0x40, 0x1C, 0x54, 0x4C,
+ 0x00, 0x0B, 0xDD, 0x4D, 0x46, 0x5D, 0x94, 0xC4, 0x20, 0xFE, 0xF9, 0xE3, 0xCE, 0xEB, 0x6E, 0xEB, 0x5F, 0xD2, 0xB7, 0x32,
+ 0x39, 0x2E, 0x15, 0x1D, 0x90, 0x17, 0x05, 0xCC, 0xF5, 0x23, 0x3E, 0x57, 0x95, 0xD4, 0x2D, 0x98, 0x33, 0x9B, 0xAA, 0x0D,
+ 0x3F, 0x40, 0x6D, 0x1A, 0x93, 0x09, 0xD4, 0xC0, 0xD1, 0x29, 0x33, 0x7A, 0x42, 0x8E, 0xC7, 0x0F, 0x46, 0x45, 0x02, 0xF0,
+ 0xA7, 0x38, 0xDD, 0x24, 0xAC, 0x9E, 0xE4, 0xD5, 0x9A, 0xBC, 0x26, 0x3F, 0xBA, 0x4C, 0xF6, 0x25, 0x8B, 0xC2, 0x82, 0xB7,
+ 0xEA, 0x35, 0x7C, 0xAF, 0xE8, 0x6D, 0x0D, 0xE8, 0xA3, 0x48, 0x62, 0x15, 0x00, 0x83, 0xD5, 0x31, 0x73, 0x37, 0xA2, 0x0A,
+ 0xB6, 0x18, 0x03, 0x77, 0xC8, 0xC3, 0x5C, 0x1B, 0x16, 0x31, 0xE2, 0x36, 0x78, 0x2D, 0x90, 0xCD, 0x35, 0x62, 0x12, 0x4B,
+ 0x2F, 0x32, 0x0E, 0x61, 0xC8, 0x36, 0x60, 0x08, 0xB0, 0x03, 0xCF, 0x00, 0xB9, 0x1B, 0x72, 0x47, 0xB5, 0xE9, 0xBE, 0x49,
+ 0x73, 0x86, 0x14, 0x13, 0x1D, 0x30, 0x68, 0x64, 0xBD, 0xF7, 0x93, 0x5F, 0x31, 0x05, 0xFE, 0xDB, 0xDF, 0xFE, 0xB6, 0x67,
+ 0xFB, 0x81, 0xDC, 0xA4, 0xAC, 0xD6, 0xAA, 0xA6, 0xEE, 0xA6, 0x45, 0xB0, 0x51, 0xA0, 0x12, 0x09, 0xE3, 0xB3, 0xA6, 0xB5,
+ 0xB9, 0x52, 0xF2, 0x5A, 0x5E, 0x93, 0xE0, 0xCC, 0x18, 0x00, 0x88, 0x47, 0x88, 0x84, 0x04, 0xEC, 0x9A, 0x0C, 0x95, 0x6A,
+ 0x20, 0x30, 0x60, 0xE1, 0xB8, 0x73, 0xBF, 0x56, 0x98, 0x57, 0xBA, 0x6E, 0xC5, 0x96, 0x8C, 0xE4, 0x4C, 0x12, 0x21, 0x32,
+ 0x54, 0x4A, 0x65, 0xFF, 0xB9, 0x7E, 0x55, 0xA5, 0x35, 0x81, 0xF3, 0xFD, 0xC8, 0xA0, 0x88, 0x1F, 0x34, 0x9A, 0x32, 0x52,
+ 0xF3, 0x0A, 0x92, 0x51, 0x03, 0xAE, 0x90, 0xCF, 0x48, 0x6E, 0x94, 0x1A, 0x46, 0xA4, 0xEF, 0xE4, 0x9A, 0xA0, 0x8A, 0x9B,
+ 0x74, 0x4A, 0x5E, 0x04, 0xB1, 0x45, 0x25, 0xCE, 0x1F, 0x8E, 0x29, 0x20, 0x2C, 0xCA, 0x8B, 0x0E, 0xD2, 0x51, 0x86, 0x2A,
+ 0x20, 0x9F, 0xE6, 0x15, 0x82, 0xB6, 0xF8, 0x63, 0xAB, 0x6E, 0x4F, 0xF9, 0x2D, 0x21, 0x41, 0x74, 0x50, 0x53, 0xC8, 0x32,
+ 0x48, 0x22, 0x04, 0xA6, 0x3A, 0x8C, 0x5A, 0xB9, 0x92, 0xC8, 0xDA, 0x06, 0x55, 0xD5, 0xC4, 0x08, 0x8B, 0xD8, 0x25, 0x25,
+ 0x8C, 0xE1, 0x9A, 0x19, 0x82, 0x5F, 0xBD, 0x0E, 0x0B, 0x45, 0x25, 0xF9, 0xD2, 0x74, 0x33, 0xC4, 0x02, 0xE8, 0x08, 0xDA,
+ 0x1D, 0x73, 0xE6, 0xE6, 0x89, 0x21, 0x71, 0x8C, 0x21, 0x53, 0x22, 0x92, 0x0A, 0x52, 0x0A, 0x5E, 0xFE, 0xE6, 0x6B, 0x42,
+ 0xD5, 0x3A, 0xF1, 0xC5, 0xDD, 0xB7, 0xDE, 0xCF, 0x27, 0xA4, 0xF1, 0xD9, 0xD7, 0xDC, 0xD3, 0xDB, 0xD4, 0xAD, 0x3C, 0x51,
+ 0x82, 0x04, 0xD1, 0x82, 0x98, 0x41, 0xE4, 0xC0, 0x87, 0x98, 0xA6, 0x91, 0x2C, 0x62, 0x5F, 0xE8, 0x20, 0x35, 0x3A, 0x05,
+ 0x1B, 0x8F, 0x08, 0x0E, 0xA7, 0x77, 0x84, 0x43, 0x6C, 0x5E, 0xBB, 0x3D, 0x27, 0x2B, 0x9F, 0x00, 0x10, 0x15, 0x12, 0x91,
+ 0x1C, 0x9B, 0xE8, 0x3F, 0x67, 0x4E, 0x79, 0x51, 0x65, 0x68, 0x70, 0x08, 0x61, 0x83, 0xB6, 0x1D, 0xF5, 0x81, 0xC6, 0x64,
+ 0x45, 0x86, 0x12, 0x4F, 0xE1, 0xAA, 0xCA, 0xB0, 0x91, 0x76, 0x54, 0xF6, 0x99, 0x63, 0x1E, 0x4F, 0x1F, 0x29, 0x6B, 0x6D,
+ 0x9B, 0x61, 0x34, 0xE0, 0x38, 0x85, 0xB4, 0xED, 0x73, 0x8C, 0xC1, 0xFD, 0x31, 0x0A, 0x90, 0xC8, 0x94, 0x9A, 0xAB, 0xB7,
+ 0x3E, 0x0A, 0x26, 0x2A, 0x6B, 0x3E, 0xA4, 0xC3, 0x98, 0x14, 0x9A, 0xBC, 0x61, 0xAA, 0x16, 0x55, 0x6B, 0xEF, 0xCC, 0xD5,
+ 0x8A, 0x4B, 0x9F, 0x77, 0x29, 0xDD, 0x3C, 0x0E, 0x0F, 0x50, 0x7F, 0xAB, 0x14, 0x57, 0x99, 0xD0, 0xE6, 0x57, 0x01, 0x1D,
+ 0xA6, 0xDD, 0x26, 0x94, 0x1B, 0xA1, 0x11, 0x14, 0x94, 0x79, 0xC7, 0x55, 0xBC, 0x3F, 0x46, 0xF3, 0x99, 0xF1, 0x19, 0x5B,
+ 0xD6, 0xED, 0xE6, 0x96, 0x11, 0xF1, 0x03, 0x77, 0x3F, 0x84, 0x0E, 0xD0, 0xC4, 0xAB, 0x2F, 0xBF, 0xD2, 0x5C, 0xDD, 0xC6,
+ 0x10, 0xB8, 0xA7, 0x79, 0x11, 0xEC, 0xD2, 0xEE, 0x56, 0x51, 0x06, 0x3E, 0x81, 0x43, 0x34, 0x95, 0x89, 0x1A, 0x08, 0x21,
+ 0x4C, 0x28, 0x69, 0x24, 0x64, 0xA6, 0x64, 0xF3, 0xB7, 0xC9, 0x51, 0xF1, 0xD1, 0xA1, 0x91, 0xB3, 0xA6, 0x4D, 0x9F, 0x3B,
+ 0x73, 0xCE, 0xFA, 0xB5, 0x3B, 0x4B, 0xF3, 0x2B, 0xE7, 0xCF, 0x9C, 0x9F, 0x16, 0x93, 0x52, 0x5D, 0x58, 0x19, 0xEE, 0x1F,
+ 0x5C, 0x90, 0x55, 0x92, 0x48, 0xFB, 0x39, 0x24, 0x82, 0x71, 0x3C, 0x33, 0x61, 0x6D, 0x19, 0x49, 0x40, 0x46, 0xA6, 0x19,
+ 0x23, 0x85, 0x95, 0x88, 0x55, 0xE1, 0x5E, 0x4A, 0x87, 0xB1, 0x10, 0x54, 0x92, 0xE1, 0xB4, 0x77, 0x9C, 0x82, 0xCB, 0x60,
+ 0xD1, 0x28, 0xDB, 0x37, 0x79, 0x8E, 0x9A, 0xFC, 0xC9, 0xD0, 0xFF, 0x65, 0xD2, 0x47, 0x01, 0xBA, 0x7C, 0x14, 0xBE, 0xD5,
+ 0x9C, 0xAD, 0x28, 0x9D, 0x88, 0x6A, 0xC0, 0xDD, 0x5D, 0xD5, 0x34, 0x0F, 0xBC, 0x91, 0xD6, 0xA5, 0x29, 0x38, 0x34, 0x6E,
+ 0x05, 0x1F, 0x9D, 0x95, 0x6B, 0x24, 0x50, 0x0F, 0x90, 0x94, 0xA6, 0x40, 0x9A, 0x6E, 0x26, 0xFF, 0x2B, 0x36, 0x55, 0x7E,
+ 0x01, 0xB8, 0x4C, 0xB2, 0x38, 0xEF, 0xD2, 0x59, 0xB9, 0xC9, 0x79, 0xFB, 0x77, 0x1E, 0x26, 0x14, 0xC7, 0x2C, 0x8C, 0x3A,
+ 0xB8, 0xF3, 0x88, 0x92, 0x76, 0x7F, 0xF7, 0x9B, 0xDF, 0x5E, 0xB6, 0x79, 0x07, 0x41, 0x18, 0xA1, 0xF7, 0xB5, 0x2D, 0x82,
+ 0xC0, 0xD2, 0xD7, 0xDA, 0x0B, 0x40, 0x75, 0xD6, 0xD2, 0x40, 0x14, 0xBE, 0x2D, 0x04, 0x0B, 0x58, 0x40, 0x78, 0x3A, 0xAE,
+ 0x40, 0xFF, 0x2E, 0x3E, 0x32, 0x36, 0x60, 0xFE, 0x82, 0xC9, 0x17, 0x4F, 0x58, 0xB7, 0x62, 0x1B, 0xC9, 0x6E, 0xB0, 0x6F,
+ 0x40, 0x59, 0x4E, 0x09, 0xD4, 0x20, 0xC6, 0x99, 0x39, 0x09, 0x59, 0x3C, 0x2D, 0x22, 0x20, 0x44, 0xFA, 0xCF, 0x19, 0xA6,
+ 0xFB, 0x6F, 0x52, 0x14, 0xB9, 0x95, 0x0C, 0xD5, 0x88, 0xDB, 0xB4, 0x4B, 0x35, 0x2F, 0x52, 0x1B, 0x37, 0x15, 0x19, 0x8F,
+ 0x8F, 0x52, 0x92, 0x94, 0xCD, 0xD9, 0x8A, 0x42, 0x23, 0x3E, 0xE1, 0x8D, 0x01, 0xDE, 0x9C, 0xE7, 0x2B, 0xF0, 0xC7, 0x8A,
+ 0x5E, 0x3B, 0xE4, 0x2C, 0x1F, 0x61, 0xE8, 0xE5, 0x3B, 0xDB, 0x13, 0x54, 0x0D, 0x22, 0xEB, 0x82, 0x2A, 0x51, 0x8C, 0x59,
+ 0x4A, 0xDA, 0xC6, 0xC0, 0x55, 0xB2, 0x4A, 0x49, 0xB3, 0x1C, 0x3F, 0x21, 0xB4, 0x16, 0x4B, 0x67, 0xCD, 0x28, 0x80, 0x0B,
+ 0x89, 0x0A, 0xA0, 0xBC, 0xA1, 0xB5, 0x3A, 0x33, 0x5B, 0xAD, 0xB0, 0x4C, 0x02, 0x2E, 0x7E, 0x0D, 0xDA, 0xD0, 0x42, 0x48,
+ 0x4D, 0x48, 0x63, 0x14, 0x33, 0x7D, 0xC2, 0x14, 0x5A, 0x0E, 0x3B, 0xB7, 0xEC, 0x67, 0x3A, 0x9F, 0x1C, 0x9E, 0xD8, 0xD7,
+ 0xD1, 0x6F, 0x78, 0x73, 0x9F, 0x7F, 0xFE, 0xC5, 0x7F, 0x5F, 0x7D, 0xF9, 0x5B, 0xC3, 0x4B, 0x57, 0xF3, 0x6A, 0x50, 0x1C,
+ 0xE1, 0x5A, 0x0F, 0xB5, 0x0F, 0xA0, 0x09, 0x1C, 0xA2, 0xB5, 0xAE, 0xAD, 0xB1, 0xB4, 0x1E, 0xAA, 0x44, 0x59, 0x66, 0x31,
+ 0x29, 0x36, 0xF3, 0x19, 0xAC, 0x3E, 0x26, 0x28, 0x6A, 0xD6, 0xC4, 0xE9, 0x2B, 0x97, 0x6D, 0x66, 0x36, 0x0E, 0x3B, 0x68,
+ 0x71, 0xD7, 0xD0, 0x55, 0x97, 0x5F, 0x03, 0xBF, 0x88, 0x0C, 0x8A, 0x72, 0x3D, 0x2E, 0x30, 0xBA, 0x30, 0x51, 0xC7, 0x90,
+ 0x4C, 0xC1, 0xC4, 0x03, 0x78, 0x0F, 0xA4, 0x46, 0xC4, 0x58, 0x2E, 0x78, 0x4B, 0x25, 0x02, 0x44, 0x25, 0xD8, 0x3B, 0xD2,
+ 0x57, 0x20, 0x92, 0xC8, 0x4C, 0x84, 0xC8, 0x35, 0xDD, 0x3D, 0xC6, 0xD1, 0x04, 0x64, 0xD3, 0x23, 0x52, 0xA8, 0xD1, 0xB6,
+ 0x9D, 0xA7, 0xE8, 0xD5, 0xD4, 0xD3, 0x71, 0x85, 0x93, 0x71, 0x5F, 0x61, 0xE7, 0x64, 0xE9, 0x3B, 0x3A, 0x18, 0xC5, 0x54,
+ 0x2D, 0x10, 0x09, 0x8A, 0x56, 0x8C, 0xA0, 0x2B, 0xC0, 0x5F, 0xB5, 0x68, 0xE7, 0x11, 0x61, 0x90, 0x29, 0xAB, 0x52, 0x39,
+ 0xF5, 0x68, 0x48, 0x08, 0x0A, 0xE6, 0x39, 0xC4, 0x5E, 0x21, 0xFE, 0x19, 0x4D, 0x08, 0xE7, 0xB2, 0x50, 0xF8, 0x65, 0x78,
+ 0x80, 0x77, 0x48, 0x22, 0x35, 0x7D, 0xB6, 0x33, 0xAB, 0x02, 0xA0, 0x29, 0xB2, 0x00, 0xF1, 0x69, 0xE3, 0x27, 0x4F, 0xBF,
+ 0x68, 0x6A, 0x7F, 0xC7, 0xD0, 0x91, 0x03, 0xD7, 0x4A, 0x7B, 0x2E, 0xA3, 0xE8, 0x95, 0x17, 0x5E, 0x35, 0x6C, 0x2D, 0x36,
+ 0x16, 0x7C, 0xFC, 0xF2, 0xF3, 0x2F, 0xC1, 0x2B, 0x6D, 0xAE, 0x68, 0xE8, 0xA8, 0x6B, 0x5B, 0xDC, 0x35, 0x08, 0x6B, 0x08,
+ 0xEE, 0x22, 0x35, 0x04, 0x0E, 0x41, 0xC9, 0x5D, 0x0D, 0xE3, 0x28, 0xB3, 0xB8, 0x30, 0x25, 0x0F, 0x59, 0x87, 0x2F, 0x08,
+ 0x59, 0xBF, 0x72, 0x73, 0x5F, 0x6B, 0x3F, 0xFD, 0x8C, 0x2B, 0x0E, 0x5C, 0xF9, 0x8D, 0xAF, 0xBF, 0x7C, 0xFC, 0xAA, 0x1B,
+ 0xAA, 0xF3, 0x2B, 0xDB, 0xEB, 0xBB, 0x32, 0x63, 0x52, 0x79, 0x4E, 0x31, 0x83, 0x01, 0x14, 0x20, 0x83, 0xFB, 0x42, 0xA4,
+ 0xCF, 0x42, 0xB8, 0x44, 0x5A, 0x02, 0x03, 0xD2, 0x97, 0xEB, 0x0C, 0xA7, 0x13, 0xA7, 0xFD, 0x41, 0x5C, 0x8D, 0x37, 0xCC,
+ 0xAD, 0x66, 0x44, 0x2C, 0xC6, 0x3B, 0x6E, 0x30, 0x30, 0xA5, 0x96, 0x1B, 0x7E, 0xA5, 0x52, 0x4B, 0x77, 0xE0, 0xC8, 0xAB,
+ 0x00, 0xCD, 0x7C, 0x2C, 0xF4, 0xAB, 0xE1, 0x5B, 0xF3, 0x57, 0x05, 0x88, 0x1F, 0xA8, 0x0E, 0xB4, 0x43, 0x29, 0x66, 0x6E,
+ 0x28, 0x37, 0x27, 0x2F, 0x11, 0xBA, 0x81, 0x78, 0x31, 0x70, 0x23, 0x77, 0x25, 0x76, 0x3B, 0x7B, 0x19, 0xCC, 0x5D, 0xC5,
+ 0x22, 0x79, 0x02, 0x64, 0x9E, 0x42, 0x71, 0x02, 0x6D, 0x33, 0x78, 0xFC, 0x80, 0xBE, 0x8A, 0x64, 0x6F, 0x60, 0x91, 0x49,
+ 0x2E, 0xD3, 0x48, 0xF0, 0x63, 0x43, 0x22, 0x7D, 0x2F, 0xF5, 0x1D, 0x77, 0xE6, 0x39, 0xBC, 0xDD, 0x23, 0x07, 0xAF, 0x59,
+ 0xDC, 0xBB, 0x22, 0x3D, 0x2A, 0xE5, 0xFA, 0x63, 0xD7, 0x7F, 0xFA, 0x5F, 0x61, 0x2D, 0xF2, 0x03, 0x6F, 0xEE, 0xB5, 0x57,
+ 0xBF, 0xB3, 0x71, 0xCD, 0x66, 0x32, 0x57, 0x5C, 0x61, 0xA8, 0x13, 0x7A, 0x1D, 0x24, 0xFB, 0x45, 0x86, 0xCE, 0x4E, 0x6F,
+ 0x83, 0xB2, 0x51, 0x7C, 0x37, 0x2B, 0x2E, 0x63, 0xE7, 0x96, 0xBD, 0xB0, 0xAC, 0x07, 0x5B, 0x7B, 0x9F, 0xFB, 0xFA, 0x0B,
+ 0xEF, 0xFF, 0xE2, 0xC3, 0x57, 0x5F, 0xFA, 0xEE, 0xB2, 0x9E, 0xE5, 0xE8, 0x4C, 0xDE, 0x40, 0x66, 0x21, 0x31, 0xA6, 0x24,
+ 0x83, 0x41, 0x50, 0x61, 0x41, 0x56, 0x0E, 0x12, 0xB7, 0x49, 0x91, 0x20, 0x8C, 0xAD, 0x0C, 0x28, 0xD9, 0x72, 0x49, 0x9D,
+ 0xA5, 0x6C, 0x86, 0x42, 0x20, 0xB4, 0x09, 0x74, 0x23, 0x4F, 0x16, 0x80, 0x62, 0xBC, 0x63, 0x13, 0x53, 0x1C, 0xC8, 0x9B,
+ 0x02, 0x49, 0x95, 0x43, 0x48, 0xD0, 0x5B, 0x57, 0xF4, 0x63, 0x6C, 0xDF, 0x2B, 0x7D, 0xFD, 0x15, 0x0A, 0x40, 0x0E, 0xA2,
+ 0x03, 0x2B, 0x71, 0x35, 0x70, 0x21, 0xDE, 0xE4, 0x19, 0xD2, 0x64, 0x1E, 0xEC, 0x62, 0xCC, 0x59, 0x99, 0x94, 0x66, 0x0B,
+ 0x83, 0xAB, 0x00, 0xBD, 0x50, 0xB6, 0xA5, 0xEA, 0xCF, 0x3A, 0x84, 0xF3, 0x6A, 0x85, 0x96, 0x6E, 0xE6, 0xE8, 0xC0, 0xA0,
+ 0x2D, 0xF6, 0x22, 0x51, 0x4B, 0x67, 0xB6, 0x0C, 0x69, 0x25, 0xB9, 0x0C, 0x8F, 0xA6, 0xED, 0x43, 0x52, 0x7F, 0xEE, 0xE9,
+ 0xE7, 0x06, 0xCC, 0xF2, 0xDB, 0xB6, 0x61, 0x27, 0xA2, 0x24, 0x97, 0x67, 0x03, 0xC1, 0xEF, 0x7E, 0xF7, 0x07, 0xDC, 0x81,
+ 0x5D, 0x05, 0x42, 0xE6, 0xFD, 0xE4, 0xD3, 0x6F, 0x3C, 0xF7, 0x22, 0xAC, 0x3A, 0x44, 0xBF, 0xBC, 0x7B, 0x29, 0x9C, 0xEA,
+ 0x25, 0x9D, 0x43, 0x83, 0x6D, 0xFD, 0x03, 0x2D, 0xBD, 0x7D, 0xAD, 0xA4, 0x4F, 0x74, 0xE0, 0x1B, 0x2F, 0xDF, 0x7F, 0x0C,
+ 0x34, 0x3B, 0x7E, 0xF4, 0xDA, 0xDF, 0x7C, 0xF8, 0x87, 0xFF, 0xFC, 0xE7, 0x3F, 0xBF, 0xFD, 0xCD, 0x1F, 0xAF, 0x3A, 0x74,
+ 0x9C, 0xED, 0x53, 0xDD, 0x4D, 0x5D, 0x15, 0xB9, 0xA5, 0xE8, 0xA9, 0x92, 0x69, 0x7E, 0x96, 0x0C, 0x5B, 0x0A, 0x73, 0x0A,
+ 0x24, 0x0C, 0xB8, 0x88, 0xAF, 0xF6, 0xCE, 0xAF, 0xCA, 0xB2, 0x8B, 0x79, 0x26, 0x61, 0x9F, 0x0C, 0x82, 0xE1, 0x1D, 0x75,
+ 0x0C, 0x6A, 0xD0, 0x36, 0x06, 0xCF, 0x27, 0xC2, 0x6B, 0xE8, 0x76, 0xCB, 0x02, 0xA7, 0x00, 0xB6, 0x01, 0x59, 0x4D, 0x9E,
+ 0xBB, 0xD6, 0xE4, 0xF5, 0x93, 0x9E, 0x72, 0x21, 0x7D, 0x5D, 0x3E, 0xCA, 0x1C, 0xB6, 0xF2, 0x35, 0x35, 0xD4, 0xC8, 0x23,
+ 0x50, 0x59, 0x0D, 0x47, 0x55, 0x76, 0x2B, 0x28, 0x6F, 0xBB, 0xBC, 0xA0, 0xBC, 0xA2, 0xB0, 0x82, 0xA5, 0x66, 0x2E, 0xD2,
+ 0x37, 0xB9, 0x10, 0x86, 0x5F, 0x55, 0x5C, 0xCD, 0xAA, 0x2C, 0xAA, 0xAA, 0x28, 0x16, 0x57, 0x30, 0x04, 0x1E, 0x61, 0x30,
+ 0xB8, 0xC1, 0x40, 0x8A, 0x4F, 0x49, 0x27, 0x52, 0xCC, 0x1C, 0x26, 0x31, 0x13, 0x38, 0xC2, 0x15, 0x68, 0xBD, 0xC5, 0x87,
+ 0x45, 0x86, 0x07, 0x06, 0xC3, 0xA3, 0x3A, 0xFF, 0xEC, 0x71, 0xE3, 0xC7, 0x8D, 0x5F, 0xD2, 0x37, 0x7C, 0xEC, 0xF0, 0x75,
+ 0x55, 0xC5, 0x55, 0xB5, 0x65, 0x75, 0xAF, 0xBF, 0xF6, 0x06, 0x0A, 0x40, 0x0D, 0x9F, 0x7E, 0xFA, 0x5F, 0x2E, 0xFE, 0xF2,
+ 0xD7, 0xBF, 0x1F, 0x3F, 0x7A, 0x1C, 0xD3, 0x5E, 0xDE, 0xBB, 0x74, 0xED, 0x92, 0xD5, 0x2B, 0x97, 0xAE, 0x5A, 0xB1, 0x64,
+ 0xD5, 0xAA, 0x25, 0xAB, 0x96, 0xF4, 0x2E, 0x81, 0xE6, 0x75, 0x68, 0xF7, 0xE1, 0xAD, 0xEB, 0xB6, 0xBE, 0xF3, 0xC3, 0xF7,
+ 0x3E, 0x63, 0xCB, 0xEE, 0x89, 0xCF, 0xFF, 0xFD, 0x3F, 0x1F, 0x3F, 0xFF, 0xEC, 0x4B, 0x6B, 0xD8, 0x1C, 0x38, 0xB8, 0x82,
+ 0x84, 0xAA, 0xA9, 0x82, 0x4D, 0x7A, 0xD5, 0xC8, 0xD7, 0xDB, 0x1D, 0xC2, 0xC6, 0xCB, 0x32, 0x05, 0x76, 0x10, 0x3D, 0x12,
+ 0x47, 0xEE, 0x6C, 0x32, 0x90, 0x2A, 0xD2, 0xE4, 0x72, 0x0E, 0x87, 0x2E, 0x5F, 0x83, 0x99, 0x43, 0x45, 0x31, 0x3A, 0x10,
+ 0x58, 0x73, 0x9A, 0x10, 0x99, 0xB9, 0xAE, 0xF9, 0x3B, 0x43, 0x37, 0x85, 0x23, 0x6B, 0xE9, 0x27, 0x2B, 0x00, 0xB9, 0xF3,
+ 0xF1, 0x47, 0xE9, 0x00, 0xAB, 0xD7, 0x1A, 0xCA, 0x0C, 0x4C, 0x1C, 0x03, 0x1F, 0x21, 0xB1, 0x1A, 0x39, 0x96, 0xE6, 0xBA,
+ 0xCC, 0x64, 0x23, 0x7D, 0x15, 0x31, 0xB2, 0xD6, 0x60, 0x80, 0x1A, 0x24, 0x56, 0x9B, 0x92, 0x4D, 0x62, 0x89, 0x70, 0x52,
+ 0x84, 0x5B, 0xE8, 0xC0, 0x91, 0xC9, 0x8B, 0x9C, 0xC9, 0x09, 0x91, 0x2D, 0xAD, 0x90, 0xF7, 0x47, 0x66, 0xC9, 0xFB, 0xA0,
+ 0x74, 0xC2, 0x15, 0x08, 0x0C, 0xB1, 0x61, 0xB1, 0x34, 0x9C, 0xA9, 0xA7, 0x2E, 0xBA, 0xE0, 0xC2, 0x0B, 0xCF, 0x38, 0x17,
+ 0xBE, 0xF4, 0x35, 0x57, 0xDD, 0x02, 0x99, 0x0E, 0x04, 0xB8, 0xFB, 0xB6, 0x7B, 0xD8, 0xDC, 0x41, 0x84, 0x00, 0x94, 0x34,
+ 0x4E, 0xBC, 0xFA, 0xEA, 0x6B, 0x6B, 0x86, 0xD7, 0xE2, 0x13, 0x5B, 0x56, 0x6D, 0xDA, 0xBE, 0x61, 0x3B, 0xFB, 0x32, 0x37,
+ 0xAE, 0x5E, 0xBF, 0x77, 0xC7, 0xBE, 0x43, 0x7B, 0x0F, 0xBF, 0xFD, 0xC6, 0x0F, 0x3F, 0xFF, 0x82, 0x98, 0x2E, 0xCF, 0x47,
+ 0x13, 0xBF, 0xF9, 0xF5, 0xEF, 0x0F, 0xEE, 0x3A, 0xC8, 0x46, 0xC1, 0x45, 0x8D, 0xD4, 0x19, 0x6D, 0x2D, 0xE5, 0x8D, 0xA8,
+ 0xC1, 0x64, 0xC9, 0x2A, 0x53, 0xE9, 0x4F, 0x94, 0x66, 0x17, 0x03, 0x3E, 0x48, 0x1F, 0xF5, 0x90, 0x8C, 0x11, 0x42, 0x6A,
+ 0xCD, 0x0E, 0x03, 0xFD, 0x8C, 0x92, 0xD4, 0x51, 0xD9, 0x18, 0x22, 0x97, 0xD5, 0x84, 0x19, 0x2D, 0x48, 0xC3, 0x43, 0x8B,
+ 0x61, 0x37, 0x0B, 0xB2, 0x3A, 0x70, 0xC2, 0xAF, 0x4A, 0xDF, 0x62, 0x8E, 0x15, 0xBA, 0xF7, 0x02, 0x21, 0xF8, 0xE8, 0x0E,
+ 0x05, 0x87, 0x9C, 0xAD, 0xCC, 0x7A, 0x97, 0x7B, 0xA3, 0x8C, 0x62, 0x97, 0x5D, 0x8C, 0x5D, 0x94, 0x94, 0x15, 0x1A, 0x9E,
+ 0x9A, 0xC9, 0xFA, 0x25, 0xEA, 0x16, 0x09, 0x7F, 0x56, 0x2A, 0x64, 0x53, 0x64, 0x08, 0xB5, 0xB6, 0x44, 0xEA, 0x38, 0x65,
+ 0x96, 0x0B, 0xCA, 0xE9, 0xC7, 0x70, 0x43, 0x82, 0xFA, 0x3E, 0xEF, 0x3B, 0x37, 0x5D, 0xDE, 0x99, 0xEB, 0x0A, 0xA9, 0xE8,
+ 0x20, 0x3E, 0x22, 0x21, 0x26, 0x2C, 0x8A, 0xF9, 0xD7, 0xC2, 0xF9, 0x01, 0x93, 0x2E, 0x1E, 0x7F, 0xB6, 0xCF, 0x99, 0xD0,
+ 0xB3, 0xAE, 0xBE, 0xF2, 0xA6, 0xCD, 0xAB, 0x2F, 0x43, 0x0D, 0x87, 0xF7, 0x1C, 0xFE, 0xF7, 0xBF, 0xFF, 0xA3, 0x0E, 0x21,
+ 0x1B, 0xC1, 0x4F, 0x9C, 0xF8, 0xE3, 0x1F, 0xFF, 0x74, 0xCB, 0xF5, 0xB7, 0xB2, 0xFF, 0x72, 0xCB, 0xCA, 0x8D, 0xF0, 0xE0,
+ 0x77, 0x6F, 0xDD, 0x83, 0xAA, 0x3E, 0xFC, 0xF0, 0x43, 0xB3, 0x2D, 0xE7, 0x53, 0x91, 0xBF, 0xE1, 0x60, 0xB3, 0x91, 0xE6,
+ 0x89, 0xC7, 0x9E, 0xDE, 0xBE, 0x76, 0x1B, 0xDB, 0x72, 0x16, 0x35, 0xD0, 0x02, 0x61, 0x57, 0x65, 0x03, 0x59, 0x1F, 0xB1,
+ 0x81, 0xA5, 0x74, 0x0D, 0x14, 0x40, 0xE5, 0x88, 0xF9, 0x23, 0x77, 0xEA, 0x21, 0xF9, 0x20, 0xA5, 0x75, 0xC4, 0x98, 0x86,
+ 0x62, 0xD3, 0x7D, 0x29, 0x00, 0x15, 0xA4, 0x55, 0x85, 0x1A, 0x24, 0xB7, 0x36, 0xD9, 0x9D, 0x3B, 0xE1, 0x71, 0x5C, 0xC1,
+ 0x19, 0x3E, 0xA7, 0x08, 0xC6, 0x9E, 0x12, 0x88, 0xC6, 0x48, 0x9F, 0x0F, 0xAE, 0x9F, 0x9D, 0x65, 0x74, 0x90, 0x6B, 0x09,
+ 0x4F, 0x42, 0x90, 0x1F, 0x21, 0x70, 0x8F, 0xE6, 0xAB, 0x1A, 0x5E, 0x94, 0x87, 0x1A, 0x55, 0x54, 0x49, 0x09, 0x8A, 0x0E,
+ 0x4C, 0x11, 0x57, 0xC3, 0x3B, 0x96, 0xD9, 0x40, 0x69, 0x6D, 0x63, 0x79, 0xBD, 0xEC, 0xD4, 0x90, 0xC1, 0x0E, 0x1F, 0x83,
+ 0x32, 0x9B, 0x38, 0x2F, 0xDA, 0x72, 0xAC, 0x29, 0x4B, 0x66, 0x1D, 0xD2, 0xC2, 0x4D, 0x96, 0x71, 0x98, 0x4C, 0x25, 0xE3,
+ 0x4D, 0xDB, 0x27, 0x26, 0x45, 0xD4, 0x10, 0x19, 0xEB, 0xA8, 0x61, 0xDE, 0xBC, 0x4B, 0xC6, 0x4F, 0x38, 0xDD, 0xE7, 0x34,
+ 0xF8, 0xFE, 0x57, 0x1E, 0xBA, 0x66, 0xDF, 0xEE, 0xA3, 0xBC, 0x08, 0xE2, 0x46, 0xEE, 0x46, 0xC4, 0x9F, 0xEB, 0x66, 0x1B,
+ 0x4A, 0xBA, 0x5F, 0xFD, 0xEA, 0xD7, 0x2F, 0xBF, 0xFC, 0xEA, 0xCB, 0x2F, 0xBD, 0xF6, 0xF3, 0x9F, 0xBF, 0xAF, 0xBB, 0x3F,
+ 0x8C, 0x86, 0x44, 0x49, 0xB2, 0x3B, 0xCA, 0x6C, 0xCF, 0xF9, 0xE0, 0x57, 0xBF, 0xBB, 0x7C, 0xDF, 0xE5, 0xB8, 0x0B, 0x7B,
+ 0x46, 0x06, 0x5A, 0x07, 0x28, 0x32, 0x9A, 0x8D, 0x37, 0x60, 0xEF, 0x86, 0xB1, 0x51, 0x46, 0xFE, 0x86, 0xA0, 0x01, 0x2B,
+ 0x3A, 0x22, 0xE0, 0x95, 0xD9, 0x7F, 0xD9, 0x42, 0xEF, 0xB6, 0xB5, 0xA2, 0x89, 0x67, 0xD6, 0x95, 0xCB, 0x64, 0x9B, 0x8A,
+ 0x44, 0xBC, 0x47, 0xBC, 0x41, 0x74, 0xA0, 0xB1, 0x4D, 0xFD, 0x80, 0x3A, 0x63, 0x0C, 0x01, 0xC0, 0x86, 0x62, 0x44, 0xAF,
+ 0x3D, 0x95, 0x31, 0x86, 0xAF, 0x3A, 0xB0, 0x4B, 0xE2, 0x81, 0x97, 0xA6, 0x6A, 0xF9, 0xAA, 0x5E, 0x8E, 0xAA, 0x7D, 0x02,
+ 0x5E, 0xE9, 0x78, 0x09, 0x21, 0x01, 0xE0, 0x12, 0x1D, 0x08, 0xA9, 0x1F, 0xB9, 0xEB, 0x00, 0x00, 0x7F, 0xE7, 0x03, 0x38,
+ 0x94, 0x7F, 0x94, 0x41, 0xEF, 0x4F, 0xF8, 0x29, 0x86, 0x7D, 0x8F, 0x47, 0x4B, 0x02, 0xEE, 0x84, 0x04, 0xEC, 0x45, 0xDF,
+ 0x1F, 0x21, 0x81, 0x3A, 0x0B, 0x44, 0x4A, 0x8C, 0x4A, 0x8A, 0x8B, 0x88, 0xA1, 0xCD, 0xC0, 0x44, 0x3E, 0x60, 0xEE, 0xDC,
+ 0x4B, 0x2E, 0x9E, 0xC4, 0xE1, 0x02, 0x89, 0xA1, 0xF1, 0x44, 0xDA, 0xA3, 0x87, 0xAF, 0x69, 0xAC, 0x6A, 0x5A, 0xBD, 0x74,
+ 0xB5, 0xEE, 0xBA, 0x31, 0xE1, 0x41, 0x02, 0xB5, 0xF7, 0x47, 0x6C, 0xFF, 0x33, 0x91, 0xBE, 0xFD, 0x31, 0xAE, 0x20, 0x7B,
+ 0x05, 0x9F, 0x7F, 0xEE, 0xC5, 0x9D, 0x5B, 0x77, 0xAD, 0x5B, 0xBA, 0x86, 0x30, 0x3E, 0xD0, 0xDA, 0x87, 0x37, 0x68, 0xAD,
+ 0x87, 0x70, 0x59, 0xB8, 0x2F, 0xCE, 0x41, 0xD2, 0x45, 0x29, 0x4E, 0x6B, 0x84, 0xDF, 0x22, 0x7A, 0x1A, 0x85, 0x7C, 0x96,
+ 0x8E, 0xFA, 0x16, 0x50, 0x11, 0xC5, 0xF0, 0x64, 0xEC, 0x80, 0x58, 0x88, 0x43, 0x88, 0xDF, 0x18, 0x1D, 0x90, 0x50, 0x15,
+ 0xCB, 0xB4, 0xD9, 0xE9, 0x48, 0xD3, 0x04, 0x93, 0x30, 0x90, 0x46, 0x24, 0x10, 0x2F, 0x17, 0xBC, 0x75, 0x71, 0x7F, 0x8C,
+ 0xD0, 0xBD, 0x77, 0x71, 0x05, 0x9F, 0x11, 0x72, 0xB6, 0xCB, 0xBC, 0xFC, 0x32, 0xD2, 0xA4, 0xFC, 0x7B, 0x41, 0x46, 0x29,
+ 0xB8, 0x94, 0x25, 0x28, 0xA5, 0x1C, 0x4E, 0x50, 0x56, 0xDF, 0x52, 0xD5, 0xC4, 0x7B, 0x95, 0x0F, 0xD0, 0xC0, 0x26, 0x56,
+ 0xF9, 0x18, 0xB4, 0x3F, 0xB5, 0xFF, 0xCC, 0x40, 0x46, 0x1A, 0xD7, 0x6C, 0x8A, 0xCB, 0x33, 0xC1, 0xD9, 0xD4, 0x68, 0x3A,
+ 0xC4, 0x60, 0xAA, 0xA5, 0xEF, 0x92, 0xA8, 0x80, 0x1A, 0x98, 0x76, 0x11, 0x9F, 0x69, 0x38, 0xA3, 0x86, 0x10, 0xFF, 0x85,
+ 0x0C, 0xE5, 0x27, 0x5C, 0x3C, 0x1E, 0x35, 0x24, 0x84, 0xC4, 0xE1, 0x0D, 0xA8, 0xA1, 0xB5, 0xAE, 0x95, 0x20, 0xFC, 0xDE,
+ 0x4F, 0x7F, 0x31, 0xB2, 0xEB, 0xE6, 0x0B, 0x7C, 0xE2, 0x13, 0xA4, 0xAC, 0x1B, 0x02, 0x35, 0x5A, 0xA8, 0xA3, 0xC8, 0x5E,
+ 0x4D, 0xF3, 0xC3, 0x23, 0xE0, 0xD8, 0xCD, 0xD7, 0xDD, 0xB2, 0x6D, 0xFD, 0xF6, 0xE1, 0xC1, 0xE1, 0x15, 0xFD, 0xCB, 0x69,
+ 0x81, 0xB0, 0x47, 0x0A, 0x11, 0x93, 0xDA, 0x8A, 0xE8, 0xAB, 0x5A, 0x78, 0xC3, 0xBD, 0xCD, 0x8B, 0x06, 0x5B, 0xFB, 0x06,
+ 0xDB, 0xFB, 0xDA, 0xEB, 0x9A, 0x77, 0x6F, 0xDD, 0xCD, 0xF3, 0x7B, 0x5B, 0xBA, 0xD9, 0xC3, 0x43, 0xFC, 0xE7, 0x56, 0x3B,
+ 0x25, 0x92, 0x59, 0x49, 0xE6, 0x5A, 0x4A, 0x06, 0x25, 0x6A, 0xA0, 0xAC, 0x23, 0x6D, 0x95, 0x89, 0xBF, 0x43, 0x84, 0x11,
+ 0xD1, 0xA7, 0x3A, 0x56, 0x4F, 0x7B, 0x8A, 0x2E, 0xA1, 0x7E, 0x40, 0x32, 0x40, 0xF7, 0xC2, 0x31, 0x7F, 0x05, 0x22, 0x5D,
+ 0x3E, 0x8E, 0xC4, 0x19, 0x6D, 0x8F, 0x9E, 0x6E, 0xEB, 0x5D, 0x2F, 0xF9, 0x00, 0xFD, 0xF3, 0xEF, 0x65, 0x0B, 0x15, 0xF8,
+ 0xCE, 0xDE, 0x92, 0x7C, 0x09, 0x5F, 0x8A, 0x45, 0x14, 0xAE, 0x92, 0x78, 0x94, 0xD7, 0x77, 0xD6, 0xB5, 0xE1, 0xF2, 0x7C,
+ 0x48, 0x3E, 0x00, 0x29, 0x3C, 0x85, 0x15, 0x1F, 0x92, 0xFE, 0x81, 0xC4, 0x0C, 0xE3, 0xCE, 0xDA, 0x0F, 0x00, 0x8E, 0x58,
+ 0x9A, 0xB7, 0xF1, 0xE6, 0x78, 0x1F, 0x66, 0x2E, 0x86, 0x2B, 0x24, 0x32, 0x00, 0x88, 0x0D, 0x8B, 0x63, 0x2A, 0x10, 0xB4,
+ 0xC0, 0x7F, 0xFE, 0xAC, 0xD9, 0x17, 0x5E, 0x78, 0x21, 0x6A, 0xC8, 0x8C, 0x4F, 0x27, 0x44, 0x1F, 0xDA, 0x7F, 0x65, 0x67,
+ 0x53, 0xD7, 0x9A, 0x65, 0x6B, 0xBF, 0xF7, 0xFA, 0x9B, 0x8A, 0x3C, 0xBA, 0x0F, 0x90, 0x65, 0xF0, 0x47, 0x9C, 0x80, 0xB8,
+ 0xFD, 0xD1, 0xBF, 0xFF, 0xF3, 0xCF, 0x7F, 0x7E, 0xF4, 0xCF, 0x7F, 0xFE, 0x93, 0x12, 0x8F, 0x5F, 0x69, 0xFC, 0x20, 0xCD,
+ 0x3D, 0xB8, 0xE7, 0xF0, 0xFA, 0x55, 0x1B, 0x70, 0x26, 0x34, 0xB1, 0xB4, 0x6B, 0xF1, 0x50, 0x5B, 0x7F, 0x5F, 0x4B, 0x37,
+ 0x05, 0xC7, 0x40, 0x5B, 0xEF, 0xE0, 0xA2, 0x21, 0x36, 0x8C, 0xAC, 0xEE, 0x5F, 0x31, 0xD8, 0xD1, 0xBF, 0x77, 0xFB, 0x5E,
+ 0x12, 0x2A, 0xFE, 0xE4, 0xBE, 0x3B, 0xEF, 0xE7, 0x23, 0x2C, 0xED, 0x5E, 0xBC, 0x64, 0xD1, 0x62, 0x9E, 0x46, 0x4E, 0x6C,
+ 0xF6, 0xF3, 0xD0, 0xC1, 0xAD, 0xE7, 0xB3, 0x88, 0x32, 0xB2, 0x44, 0x07, 0x04, 0x67, 0xFA, 0xB8, 0x2C, 0x87, 0x89, 0x44,
+ 0x10, 0x4E, 0xCC, 0xC9, 0x4C, 0x84, 0x8B, 0xE6, 0x28, 0xC3, 0x8B, 0xFE, 0x5E, 0xD1, 0x8F, 0xE8, 0x40, 0x73, 0x47, 0x2B,
+ 0x6E, 0x2F, 0x81, 0x92, 0x6B, 0xFB, 0xB8, 0x4E, 0xC0, 0x35, 0x97, 0x90, 0xC7, 0xF3, 0x49, 0xE3, 0xCA, 0xA4, 0x7D, 0x96,
+ 0x59, 0xCC, 0x76, 0x67, 0x2E, 0xD8, 0x28, 0xC9, 0x07, 0x83, 0x6E, 0x4E, 0xDB, 0x15, 0xD1, 0x0F, 0x75, 0xF4, 0xF3, 0x08,
+ 0xED, 0x36, 0x4C, 0x0C, 0x74, 0xC2, 0x57, 0x04, 0x94, 0x72, 0xD8, 0x09, 0x24, 0x09, 0x12, 0xDE, 0x20, 0x9D, 0x83, 0xD4,
+ 0x3C, 0xA2, 0x82, 0x62, 0x25, 0xED, 0x23, 0x02, 0x03, 0x3A, 0x80, 0xE5, 0x99, 0x18, 0x9E, 0x10, 0x43, 0xD1, 0x10, 0x14,
+ 0x19, 0x38, 0x7F, 0xFE, 0x3C, 0xDF, 0xD9, 0xE7, 0x9E, 0x37, 0x8E, 0xE3, 0x59, 0x40, 0xBC, 0xEB, 0x8F, 0xDF, 0x4E, 0xE9,
+ 0xD0, 0xD5, 0xDC, 0x45, 0x3E, 0xCA, 0x26, 0x83, 0xDF, 0xFF, 0xFE, 0x8F, 0x9F, 0x7C, 0x22, 0x22, 0x26, 0xFF, 0x31, 0x3B,
+ 0x93, 0x3F, 0x61, 0x47, 0x14, 0x60, 0xF5, 0xE1, 0x6F, 0xFE, 0xC0, 0xFA, 0xC3, 0x6F, 0xFF, 0xFC, 0xB7, 0xBF, 0xFD, 0x43,
+ 0x53, 0x29, 0x75, 0x07, 0xB6, 0xF0, 0xEF, 0xDA, 0xB6, 0x7B, 0xE3, 0xF0, 0xFA, 0x4D, 0x2B, 0x36, 0xAC, 0x59, 0xB6, 0x66,
+ 0xF5, 0x00, 0x9B, 0x67, 0x97, 0x73, 0xE6, 0xC2, 0xAA, 0xC1, 0x15, 0xE8, 0x95, 0x7D, 0xFD, 0x64, 0xB7, 0x6C, 0xF0, 0xFF,
+ 0xE0, 0x03, 0x02, 0xFB, 0xA7, 0xFF, 0xFD, 0xEF, 0x7F, 0xFE, 0xFC, 0xE7, 0x3F, 0x6F, 0x5E, 0xB3, 0x99, 0xDF, 0xAE, 0x5C,
+ 0xBC, 0x92, 0xB6, 0x07, 0xB5, 0x61, 0x4F, 0x73, 0x37, 0xFE, 0x2D, 0x25, 0xBA, 0xEE, 0xCD, 0x22, 0x9D, 0x11, 0x09, 0x94,
+ 0x12, 0x18, 0xF2, 0x52, 0x72, 0xA0, 0xCF, 0xD0, 0xC7, 0x4D, 0x8B, 0x4D, 0x72, 0xA5, 0x3F, 0x82, 0xF8, 0xA7, 0x14, 0xBD,
+ 0xB1, 0x3C, 0xE1, 0x52, 0xFA, 0xA8, 0x64, 0xBD, 0x74, 0x49, 0x91, 0x7B, 0xB6, 0x24, 0xD1, 0x36, 0x23, 0xD6, 0x0B, 0x5B,
+ 0x34, 0xA2, 0x7C, 0xD3, 0xF9, 0x29, 0x64, 0xEA, 0x42, 0x37, 0xA6, 0xBE, 0xBC, 0xE9, 0xA5, 0x6F, 0xBC, 0xCC, 0x89, 0x11,
+ 0x7F, 0xFB, 0xDB, 0x5F, 0x7E, 0xF5, 0xC1, 0x87, 0x8F, 0x3D, 0xF8, 0x38, 0xF9, 0x38, 0xEF, 0xB2, 0xAF, 0x49, 0xDA, 0x6D,
+ 0xD2, 0xF5, 0x04, 0x7F, 0xAB, 0xD8, 0xD3, 0x51, 0x0F, 0x76, 0x91, 0x86, 0x4B, 0xF5, 0x9F, 0x6E, 0x48, 0x54, 0xB0, 0x7D,
+ 0x4C, 0x1E, 0xAD, 0x6A, 0xE0, 0x33, 0x98, 0xC0, 0x90, 0xC2, 0xD8, 0x8B, 0x8E, 0x34, 0x4C, 0xBA, 0x88, 0xA0, 0xB0, 0x85,
+ 0x0B, 0xFC, 0xE6, 0xCC, 0x9C, 0x71, 0xD6, 0x99, 0xA7, 0x53, 0x37, 0xAC, 0x59, 0xBA, 0x1E, 0x6F, 0x60, 0xEF, 0x0D, 0x71,
+ 0x95, 0x2D, 0xCA, 0xB7, 0xDC, 0x78, 0xC7, 0x0B, 0xCF, 0xBD, 0xFC, 0x83, 0xB7, 0xDF, 0x79, 0xEF, 0xDD, 0xF7, 0x7F, 0xFA,
+ 0x93, 0x5F, 0xBC, 0xFD, 0xE6, 0x8F, 0x19, 0x07, 0xBD, 0xF1, 0xDD, 0xB7, 0xDF, 0xFA, 0xFE, 0x8F, 0x7F, 0xF8, 0x83, 0x9F,
+ 0xFC, 0xF4, 0x27, 0x3F, 0xFF, 0xD5, 0x2F, 0x7F, 0x83, 0x1A, 0x34, 0x47, 0xB2, 0xFB, 0x35, 0x77, 0x6D, 0xDB, 0xB3, 0x61,
+ 0xE5, 0x86, 0x6D, 0xEB, 0xB7, 0x6D, 0x59, 0xBB, 0x45, 0x0E, 0x18, 0x59, 0xBB, 0x85, 0x92, 0x62, 0xC7, 0xA6, 0x1D, 0xBB,
+ 0xB7, 0xED, 0xDC, 0xBC, 0x72, 0xE3, 0x8B, 0xCF, 0xBD, 0xA4, 0xCE, 0xF4, 0xDF, 0x4F, 0xA5, 0x4A, 0x7F, 0xEA, 0xD1, 0xA7,
+ 0x51, 0xCF, 0xF6, 0xB5, 0x5B, 0xD7, 0xAF, 0x58, 0x2F, 0x9A, 0xE0, 0xE4, 0x85, 0x36, 0x8E, 0x6C, 0x58, 0xD4, 0x56, 0x6F,
+ 0x34, 0x41, 0xA3, 0x8C, 0x62, 0x28, 0xAB, 0x3C, 0x2B, 0x36, 0x3D, 0x3E, 0x28, 0x26, 0x35, 0x3A, 0xB9, 0xA2, 0xB8, 0x12,
+ 0x7A, 0x36, 0x33, 0x54, 0xC0, 0x67, 0xB4, 0xDC, 0x45, 0xD6, 0x5F, 0xB6, 0xC6, 0xEA, 0xC0, 0xCA, 0x7D, 0x24, 0x17, 0x76,
+ 0x8B, 0x49, 0xE5, 0x77, 0x48, 0x20, 0x32, 0xBD, 0xCF, 0xD4, 0xA8, 0x24, 0xBA, 0x17, 0x78, 0x03, 0x01, 0xE0, 0xEF, 0x7F,
+ 0xFF, 0x27, 0x9F, 0xF3, 0x5F, 0xFF, 0xFC, 0x3B, 0xE6, 0xC3, 0x5B, 0x07, 0x07, 0x1E, 0xBA, 0xF7, 0x61, 0x52, 0x72, 0x69,
+ 0x7C, 0x0A, 0x28, 0x71, 0x54, 0x01, 0x9B, 0xB3, 0x19, 0x04, 0x49, 0x54, 0x00, 0x49, 0xA5, 0x5F, 0x46, 0xDD, 0x6F, 0x86,
+ 0xDA, 0x9E, 0xF4, 0x39, 0x33, 0x2D, 0x21, 0x25, 0x25, 0x2E, 0x09, 0x50, 0xC2, 0x1B, 0x48, 0x93, 0xA2, 0xC9, 0x56, 0x03,
+ 0x43, 0x19, 0xD0, 0x4F, 0x9F, 0x72, 0x29, 0x87, 0x02, 0xB1, 0x03, 0xE7, 0xD8, 0x15, 0x37, 0x6F, 0x5C, 0xB7, 0x03, 0x63,
+ 0x6C, 0x6F, 0xE0, 0x8C, 0x99, 0xE5, 0x6C, 0x21, 0xBE, 0xF6, 0xE8, 0x0D, 0xF7, 0xDD, 0xF3, 0xE0, 0x83, 0xF7, 0x3D, 0x7A,
+ 0xFF, 0x3D, 0x0F, 0xB3, 0x73, 0xFF, 0xEB, 0x4F, 0x3D, 0xFF, 0xEC, 0xD3, 0x2F, 0xB0, 0x5E, 0x7D, 0xE9, 0xDB, 0xE8, 0x03,
+ 0x35, 0xE0, 0x1F, 0x72, 0x7C, 0x90, 0xD9, 0x44, 0x4E, 0x2A, 0xF5, 0xE1, 0x6F, 0x7E, 0x77, 0xF4, 0xE0, 0x95, 0x1C, 0xB1,
+ 0xB3, 0x6B, 0xCB, 0xAE, 0xFD, 0x3B, 0x77, 0x1F, 0xD8, 0xB5, 0xE7, 0xE0, 0xAE, 0x43, 0x07, 0x76, 0x1E, 0xD8, 0xB1, 0x79,
+ 0xFB, 0xA3, 0x0F, 0x3F, 0x61, 0xE3, 0x8A, 0x22, 0xD8, 0xBF, 0xFE, 0xFD, 0xD1, 0xB5, 0x57, 0x5C, 0x7B, 0xD9, 0x3A, 0x72,
+ 0xDF, 0xDD, 0xA8, 0x6D, 0xC3, 0xF2, 0x75, 0xB8, 0xC5, 0x50, 0xEF, 0xE2, 0xDE, 0xF6, 0x5E, 0x82, 0x04, 0x6A, 0x28, 0x4A,
+ 0xCD, 0x67, 0x10, 0x42, 0x55, 0x3F, 0xD4, 0xB9, 0x18, 0xD1, 0xB1, 0x65, 0x81, 0xE9, 0x69, 0x54, 0x70, 0x14, 0xF6, 0xA4,
+ 0x3A, 0x30, 0x96, 0x2E, 0x0A, 0xC0, 0xCB, 0xF5, 0x62, 0xCC, 0xE2, 0x71, 0x47, 0x07, 0x63, 0x4C, 0x5E, 0xEF, 0x8E, 0x74,
+ 0xD2, 0x73, 0xA4, 0xD7, 0x46, 0x12, 0xC6, 0x16, 0x09, 0xAD, 0x4A, 0x90, 0x1D, 0x83, 0x2A, 0x76, 0x12, 0xEA, 0x46, 0x49,
+ 0xAC, 0xF2, 0x5D, 0x13, 0x2A, 0x39, 0xB9, 0x80, 0x5D, 0xED, 0x06, 0x88, 0xBF, 0xF8, 0xE0, 0x83, 0x0F, 0x76, 0x6C, 0xD9,
+ 0x45, 0xD1, 0xC7, 0x68, 0x8C, 0xDC, 0x9C, 0xC4, 0x49, 0xE8, 0x8B, 0xF9, 0x95, 0xF8, 0x93, 0xB4, 0x68, 0xB2, 0x84, 0x46,
+ 0x68, 0x5B, 0x2B, 0x9A, 0x23, 0x69, 0xE5, 0x9C, 0x12, 0x93, 0x9E, 0x14, 0x93, 0x00, 0x2E, 0x25, 0x86, 0xC7, 0x47, 0x87,
+ 0xC4, 0x30, 0xB5, 0x0F, 0x9A, 0xED, 0xC7, 0xE0, 0x7E, 0xEA, 0x84, 0xA9, 0xBB, 0xB6, 0x1E, 0xDA, 0x75, 0xD9, 0x21, 0xC6,
+ 0x96, 0xE4, 0x2A, 0xCC, 0xD7, 0x68, 0x5A, 0x70, 0x3E, 0x0B, 0x00, 0xB2, 0x6D, 0xE3, 0xF6, 0xBD, 0xDB, 0xF7, 0x5D, 0xBE,
+ 0xF7, 0xCA, 0x5B, 0x6F, 0xBA, 0x93, 0x4D, 0xCB, 0x40, 0xF9, 0x3D, 0x77, 0x3F, 0x4C, 0x6F, 0xE3, 0xED, 0x1F, 0xBC, 0xF3,
+ 0xBB, 0xDF, 0xFE, 0x1F, 0x4D, 0xA2, 0x4C, 0xEC, 0x10, 0xC9, 0xFE, 0xE3, 0x5F, 0xFF, 0x7C, 0xFC, 0xD1, 0xA7, 0xA8, 0xDD,
+ 0x76, 0x6E, 0xDE, 0x09, 0x3A, 0xED, 0xBB, 0x6C, 0x1F, 0x67, 0x2B, 0xBC, 0xF2, 0xD2, 0xAB, 0x94, 0xE2, 0x60, 0x96, 0x86,
+ 0x71, 0x7D, 0x3E, 0xB7, 0x20, 0xDE, 0xF1, 0x2B, 0xAF, 0xDD, 0xB9, 0xE5, 0x32, 0x74, 0x46, 0x54, 0xA7, 0xDC, 0x23, 0x9C,
+ 0xE0, 0x0D, 0xF5, 0x25, 0x35, 0xE0, 0x01, 0x9A, 0xB8, 0xF1, 0xF8, 0xCD, 0xBF, 0xFB, 0xFD, 0x1F, 0x69, 0x11, 0x62, 0x22,
+ 0xE4, 0xEB, 0xA4, 0x76, 0x8C, 0xED, 0x8C, 0xC4, 0x47, 0xC4, 0xCD, 0x87, 0x62, 0x9D, 0x2C, 0x7D, 0x9E, 0x76, 0x0A, 0x1D,
+ 0xD8, 0x4E, 0x16, 0xBD, 0x5C, 0x77, 0x9C, 0x24, 0x35, 0xA1, 0x36, 0xCA, 0x45, 0x64, 0xCA, 0xF8, 0x4C, 0xC8, 0x5E, 0x30,
+ 0x7B, 0x7E, 0x4B, 0x23, 0x87, 0x4E, 0xAD, 0xA4, 0xEE, 0x4D, 0x0A, 0x8F, 0x27, 0x32, 0xDF, 0x71, 0xD3, 0x3D, 0x7F, 0xFE,
+ 0xB3, 0x6E, 0x15, 0xFE, 0xEC, 0x3F, 0xFF, 0xF9, 0xB7, 0xB1, 0xA9, 0x13, 0x94, 0x48, 0x75, 0x95, 0x0D, 0x18, 0x3E, 0x11,
+ 0x9B, 0x52, 0x4E, 0x0A, 0x72, 0xE9, 0xBA, 0xB8, 0x69, 0x75, 0xAA, 0x44, 0x66, 0xEB, 0x0D, 0x44, 0x33, 0x36, 0xC8, 0xAB,
+ 0xF9, 0x08, 0x83, 0x28, 0x2A, 0x51, 0xD2, 0xA4, 0xB0, 0xF0, 0x30, 0xBF, 0x85, 0xD3, 0x26, 0x4F, 0xB9, 0x68, 0xDC, 0xC5,
+ 0x1B, 0xD7, 0xEF, 0xDC, 0xB1, 0xF5, 0x10, 0x84, 0x4C, 0x3E, 0x3F, 0x69, 0x31, 0x31, 0xB3, 0xA9, 0xB2, 0x8E, 0x70, 0xBA,
+ 0x69, 0xC5, 0x66, 0x4E, 0x08, 0xE1, 0x7C, 0x8F, 0xCD, 0xAB, 0xB7, 0xED, 0xDB, 0x79, 0xE0, 0x9A, 0x2B, 0xAE, 0x45, 0x19,
+ 0x0F, 0xDD, 0xFF, 0x04, 0xEB, 0x7B, 0x6F, 0xFC, 0xE0, 0x8F, 0x7F, 0xF8, 0x8B, 0xD9, 0x39, 0xEB, 0x64, 0x4A, 0x2A, 0xDC,
+ 0x3F, 0xFD, 0xE9, 0x4F, 0xDF, 0x7B, 0xE3, 0x6D, 0x4A, 0xEE, 0x37, 0xDF, 0x7C, 0xEB, 0x2F, 0x7F, 0xF9, 0x8B, 0xCD, 0xB5,
+ 0xAC, 0x0E, 0x34, 0xC5, 0x12, 0x9D, 0xFD, 0xE3, 0x1F, 0x4F, 0x3F, 0xF9, 0xEC, 0xD1, 0xFD, 0x47, 0xB7, 0xAC, 0xDD, 0x2A,
+ 0x67, 0x60, 0x0C, 0x2C, 0xE7, 0x7F, 0x1D, 0xDE, 0x77, 0x84, 0xFE, 0x2E, 0x1E, 0xCF, 0x13, 0x5E, 0xFF, 0xD6, 0x77, 0xD9,
+ 0x39, 0xAB, 0xF4, 0x56, 0xC0, 0x33, 0x29, 0x36, 0x11, 0xFA, 0x37, 0xC2, 0x85, 0x75, 0xC0, 0x6D, 0x7A, 0x2C, 0xB7, 0xE2,
+ 0x07, 0x5F, 0xB6, 0x1C, 0x3F, 0x38, 0x25, 0x8B, 0xC6, 0xA1, 0x22, 0x19, 0x96, 0xA7, 0x2D, 0x43, 0x14, 0xBE, 0xE9, 0xFE,
+ 0xCF, 0x9E, 0x36, 0x0D, 0xCE, 0xE1, 0xB6, 0xCD, 0x7B, 0xD7, 0xAE, 0xDA, 0xDA, 0xDB, 0xB1, 0x98, 0x94, 0x89, 0xEC, 0x05,
+ 0x88, 0xB8, 0xFD, 0xD6, 0xBB, 0x68, 0x99, 0xA9, 0x29, 0x99, 0x1D, 0xDB, 0x9F, 0x53, 0xBE, 0xAE, 0x5B, 0xB9, 0x3E, 0x2D,
+ 0x2A, 0x85, 0x6C, 0x5A, 0x72, 0x09, 0x13, 0x0C, 0x64, 0xB0, 0x6E, 0x62, 0xB2, 0x6D, 0xF6, 0x42, 0x34, 0xE7, 0x11, 0x61,
+ 0x62, 0x39, 0x51, 0x3A, 0x0D, 0x68, 0x02, 0x64, 0x13, 0xC2, 0xE2, 0x19, 0x0F, 0xCC, 0x9F, 0x36, 0x77, 0xE6, 0xE4, 0x99,
+ 0x97, 0x6D, 0x39, 0xB8, 0x74, 0x70, 0x1D, 0xE9, 0x60, 0x46, 0x5C, 0x3A, 0x1E, 0x46, 0x29, 0x8E, 0x7B, 0x41, 0xBD, 0x5E,
+ 0xD2, 0xB9, 0x84, 0xB0, 0xC9, 0x81, 0x5E, 0x1B, 0x97, 0x6D, 0xDC, 0xB6, 0x61, 0x37, 0xA3, 0xE9, 0x23, 0xFB, 0x8F, 0xDE,
+ 0x76, 0xE3, 0x1D, 0x0F, 0x3F, 0xF0, 0xE4, 0xE3, 0x8F, 0x3C, 0xFD, 0x9D, 0x6F, 0x7F, 0xFF, 0x2F, 0x7F, 0xFE, 0x87, 0x1A,
+ 0x87, 0x00, 0x92, 0x04, 0xF2, 0x4F, 0x1D, 0x6B, 0x77, 0xAB, 0x09, 0x9B, 0xDA, 0x7A, 0xFD, 0xC0, 0x20, 0x18, 0x55, 0xB7,
+ 0x3C, 0xF7, 0xA3, 0x8F, 0xFE, 0xF9, 0xFE, 0xFB, 0xBF, 0xFA, 0xF1, 0x0F, 0xDF, 0xF9, 0xD9, 0xCF, 0x7E, 0xF1, 0xF7, 0x8F,
+ 0x64, 0xD6, 0xA4, 0x8F, 0x43, 0x48, 0x88, 0x0F, 0x8E, 0xE5, 0x5C, 0x09, 0xDA, 0x79, 0x73, 0x2E, 0x9D, 0x9E, 0x18, 0x11,
+ 0x8B, 0xE9, 0x10, 0xD5, 0x44, 0x07, 0xB1, 0x29, 0x2C, 0x8F, 0xE8, 0x4F, 0xAD, 0x09, 0x9F, 0x31, 0xD2, 0xD7, 0x8E, 0xA0,
+ 0x6D, 0x0D, 0x2A, 0x70, 0x1B, 0xC4, 0x10, 0x56, 0x88, 0x66, 0x93, 0x88, 0x1E, 0xFA, 0x54, 0xC0, 0xFC, 0x79, 0x34, 0x15,
+ 0xB0, 0x71, 0xBA, 0xF6, 0x3B, 0xB6, 0x1F, 0xDE, 0xB7, 0xE3, 0xC8, 0x9A, 0xE5, 0x1B, 0xEA, 0x2B, 0x1A, 0xA8, 0x59, 0x68,
+ 0x54, 0x90, 0xE1, 0x11, 0x21, 0x0D, 0x16, 0x1B, 0x65, 0x7C, 0xF1, 0x39, 0xBD, 0x04, 0x68, 0x10, 0x29, 0xE1, 0x89, 0x05,
+ 0x09, 0xD9, 0xB4, 0xFB, 0x65, 0xAE, 0x9B, 0xA2, 0x8D, 0x2D, 0xB9, 0x16, 0xC6, 0x03, 0x19, 0x1E, 0xD3, 0xF6, 0xD4, 0x3C,
+ 0xDA, 0xF4, 0xE0, 0x2C, 0x8B, 0xF9, 0x3B, 0x0D, 0x3E, 0x22, 0x1E, 0xFA, 0x9B, 0x37, 0xD9, 0x97, 0x82, 0x76, 0xE7, 0x96,
+ 0x83, 0xE5, 0x39, 0x55, 0xE9, 0xD1, 0xA9, 0xD4, 0x6E, 0x3C, 0xC8, 0x89, 0x06, 0x38, 0x04, 0xE7, 0x17, 0x70, 0x18, 0x06,
+ 0x8C, 0x3F, 0xB6, 0x6A, 0xA1, 0x95, 0x8E, 0x86, 0x45, 0xC3, 0x03, 0xAB, 0xD6, 0x2C, 0xDD, 0xB8, 0x79, 0xC3, 0x8E, 0xAB,
+ 0x0F, 0x5F, 0xFF, 0xF0, 0x43, 0x4F, 0x3D, 0xF6, 0xE8, 0xD3, 0xAF, 0xBF, 0xFA, 0x06, 0xDB, 0xF9, 0x8D, 0xD4, 0x14, 0xF3,
+ 0xE9, 0x79, 0x48, 0xF9, 0x86, 0x95, 0xA8, 0xF4, 0x4F, 0xF9, 0xE3, 0x82, 0x92, 0xA6, 0xBF, 0xF6, 0xC7, 0x34, 0xA3, 0x3E,
+ 0x97, 0xFC, 0xF5, 0x81, 0xBB, 0x1F, 0x4C, 0x89, 0x4C, 0x04, 0x0F, 0x79, 0x0F, 0x53, 0x2F, 0x9A, 0x12, 0x11, 0x16, 0x4D,
+ 0x36, 0x41, 0xCD, 0x4F, 0x48, 0xA3, 0xEA, 0x64, 0xE1, 0xCD, 0xAA, 0x09, 0xB3, 0x4E, 0xE1, 0x0A, 0x3C, 0xEE, 0xE8, 0xC0,
+ 0x72, 0x34, 0xC6, 0xB0, 0x65, 0x64, 0x6A, 0x91, 0x3A, 0xC2, 0xC4, 0x37, 0x4D, 0x1E, 0xC9, 0xE5, 0x49, 0x5D, 0xD8, 0xA5,
+ 0x25, 0xFD, 0xB5, 0x71, 0xE7, 0xD2, 0x79, 0xA6, 0x5D, 0xBA, 0x7C, 0x70, 0xD5, 0xEE, 0x1D, 0x07, 0xAF, 0x38, 0x72, 0xDD,
+ 0xDE, 0xDD, 0x47, 0x07, 0xFB, 0x96, 0x92, 0x5C, 0x31, 0xE1, 0x22, 0x5C, 0xDF, 0x7C, 0xFC, 0x66, 0xAA, 0x2A, 0x45, 0xE4,
+ 0x37, 0xBE, 0xF7, 0x7D, 0x86, 0x97, 0x30, 0x21, 0x78, 0x73, 0x24, 0x70, 0x23, 0x0D, 0x45, 0x14, 0x9C, 0x21, 0x53, 0x46,
+ 0xE6, 0x59, 0x54, 0x21, 0xA4, 0xDE, 0x24, 0xE0, 0x14, 0x1F, 0xD2, 0x42, 0xCF, 0x2D, 0x2F, 0xCF, 0x29, 0xC9, 0x8C, 0x15,
+ 0x68, 0x62, 0x53, 0x78, 0x61, 0x7A, 0x11, 0x46, 0x97, 0x1A, 0x9E, 0x42, 0x1E, 0x92, 0x18, 0x9A, 0x58, 0x9C, 0x5E, 0x9A,
+ 0x12, 0x91, 0x92, 0x15, 0x9F, 0x0B, 0x11, 0x9F, 0x13, 0x8A, 0x84, 0x99, 0x50, 0x58, 0x0F, 0x4D, 0x86, 0xD3, 0x67, 0xD8,
+ 0x9C, 0xBC, 0x6A, 0xE9, 0xBA, 0x6D, 0x6B, 0xB6, 0x6F, 0x5D, 0xBF, 0xE3, 0xE8, 0xE1, 0xAB, 0xEE, 0xBD, 0xEB, 0x41, 0x92,
+ 0xA8, 0x5F, 0xBC, 0xFF, 0xE1, 0x7F, 0xFF, 0xEB, 0x14, 0xD8, 0x5A, 0x3A, 0x78, 0x45, 0xAF, 0xC8, 0xA3, 0x75, 0x86, 0x5E,
+ 0xD8, 0xDF, 0xDA, 0xA8, 0xCE, 0x23, 0x9F, 0x7C, 0x26, 0x9E, 0x81, 0x32, 0xEF, 0xBF, 0xE3, 0x7E, 0x62, 0xD8, 0xCE, 0x0D,
+ 0x3B, 0x1A, 0x6B, 0x9A, 0x2F, 0x19, 0x37, 0x21, 0x22, 0x28, 0x88, 0x94, 0x9A, 0xE1, 0x20, 0x7E, 0x60, 0xD4, 0x90, 0xA4,
+ 0xED, 0x48, 0x57, 0x19, 0x56, 0x13, 0x63, 0x2F, 0x7C, 0x4E, 0xA6, 0x45, 0x7A, 0xE9, 0x02, 0xC2, 0x73, 0x76, 0xB7, 0x42,
+ 0x68, 0x02, 0x63, 0xBA, 0x0B, 0xA9, 0xE4, 0x2D, 0x44, 0x7F, 0xFF, 0x79, 0xF3, 0xCF, 0x39, 0xE7, 0x1C, 0x0E, 0x66, 0x64,
+ 0x2F, 0xC6, 0xAC, 0x4B, 0xA7, 0x31, 0x5B, 0xA7, 0x64, 0x43, 0x19, 0x74, 0x78, 0x98, 0xC6, 0x6C, 0xD9, 0xB8, 0xBB, 0xA9,
+ 0xA6, 0x03, 0xE6, 0x04, 0x43, 0xCA, 0xAE, 0x96, 0x8E, 0xDB, 0xAF, 0xBD, 0xF5, 0x77, 0xBF, 0xFD, 0xD3, 0x6D, 0x37, 0xDF,
+ 0x87, 0xA5, 0x10, 0xB8, 0x28, 0x89, 0x51, 0x27, 0x7A, 0x82, 0x3C, 0x0A, 0x5F, 0x9A, 0xFF, 0xC2, 0x84, 0x84, 0x74, 0x9B,
+ 0xFC, 0x95, 0x17, 0xA1, 0x37, 0x40, 0x1E, 0x45, 0x0B, 0xA4, 0xB6, 0xA8, 0x8A, 0xF1, 0x4B, 0x56, 0x7C, 0x3A, 0x6A, 0xC6,
+ 0x7B, 0x32, 0xD8, 0x1C, 0x09, 0x43, 0x22, 0x26, 0x93, 0x44, 0x80, 0x6D, 0x7B, 0x40, 0x22, 0x64, 0x16, 0xCA, 0xC9, 0x9A,
+ 0xB2, 0xA6, 0xFA, 0xF2, 0xB6, 0xAA, 0xA2, 0xC6, 0xA2, 0x4C, 0xFA, 0xBE, 0xB5, 0x15, 0xB9, 0xB5, 0x1C, 0x35, 0x30, 0xD8,
+ 0xCD, 0x01, 0x87, 0x43, 0xAB, 0x87, 0xD6, 0xB0, 0x6D, 0xF6, 0xD0, 0x9E, 0xA3, 0xD7, 0x5E, 0x7D, 0xE3, 0x03, 0xF7, 0x3E,
+ 0x06, 0x87, 0x83, 0x2E, 0x13, 0x27, 0x4F, 0x69, 0xB6, 0xEA, 0x5A, 0xBA, 0x24, 0xAF, 0x9C, 0xD2, 0x42, 0x18, 0xFB, 0x1F,
+ 0xB6, 0xFA, 0xFF, 0xE7, 0x33, 0xD2, 0x53, 0x3D, 0x92, 0x67, 0x0C, 0x64, 0xA9, 0x86, 0x78, 0xE6, 0xDD, 0xB7, 0xDD, 0x45,
+ 0xEB, 0x65, 0xCB, 0xBA, 0xCB, 0xD6, 0x2F, 0x59, 0x3F, 0xF9, 0xBC, 0xF1, 0xA1, 0xF3, 0x64, 0xDF, 0x03, 0xB3, 0x90, 0x84,
+ 0xE8, 0x78, 0x3E, 0x9A, 0x24, 0x14, 0x31, 0x8E, 0x1A, 0x54, 0x07, 0xA0, 0x93, 0xC7, 0x21, 0x46, 0x5D, 0x3B, 0x3A, 0xF0,
+ 0xCA, 0x5D, 0xD1, 0xDF, 0xE1, 0x2A, 0x01, 0xD9, 0xEE, 0x54, 0xC8, 0x56, 0xDB, 0xBC, 0x16, 0xFF, 0x83, 0x6E, 0x33, 0x6D,
+ 0x4E, 0xC8, 0x9D, 0x17, 0x5C, 0x70, 0xC1, 0xE9, 0x67, 0x72, 0x26, 0xA5, 0xFC, 0x70, 0xCE, 0xE5, 0x05, 0xE7, 0x8E, 0x9B,
+ 0x37, 0x75, 0x0E, 0x41, 0x95, 0x3D, 0xC3, 0x3B, 0x36, 0xEF, 0xDB, 0xBD, 0xE3, 0xF0, 0x60, 0xFF, 0xEA, 0xCC, 0xC4, 0x1C,
+ 0xBF, 0x69, 0xF3, 0xC3, 0x16, 0x84, 0xD2, 0x22, 0xA6, 0x15, 0x01, 0x33, 0x85, 0x77, 0x9C, 0x1C, 0x97, 0xA2, 0x8D, 0x43,
+ 0xD4, 0xC0, 0x14, 0x2C, 0x27, 0x3E, 0x53, 0x02, 0x72, 0x74, 0x2A, 0x65, 0x07, 0x05, 0x84, 0x54, 0x7F, 0x79, 0x15, 0xA8,
+ 0x01, 0x6A, 0xC5, 0x65, 0x1B, 0x77, 0xDC, 0x72, 0xED, 0xAD, 0xE0, 0x3B, 0xD9, 0x7D, 0x4F, 0x63, 0x0F, 0xC7, 0x77, 0x70,
+ 0xAC, 0x47, 0x6A, 0x74, 0x5A, 0x42, 0x74, 0x12, 0xEF, 0x84, 0xBD, 0x37, 0x4C, 0x57, 0x8A, 0x0B, 0xCA, 0xD3, 0xE2, 0xB2,
+ 0xB3, 0xE2, 0xF3, 0x7B, 0x3B, 0x96, 0xB2, 0x45, 0xB0, 0xA6, 0x84, 0x53, 0x80, 0x96, 0x41, 0x88, 0xE7, 0x0C, 0x42, 0x8E,
+ 0x18, 0xDC, 0xB2, 0x6A, 0x2B, 0x99, 0xFE, 0xEE, 0x9D, 0xFB, 0x8E, 0x5D, 0x71, 0xD5, 0x9D, 0xB7, 0xDD, 0x4B, 0xF2, 0x4A,
+ 0xAC, 0x7E, 0xE7, 0xC7, 0x3F, 0x23, 0x9D, 0xA3, 0xBC, 0xE0, 0x74, 0x9C, 0x77, 0xDF, 0xF9, 0x05, 0xEB, 0x27, 0xEF, 0xFC,
+ 0xEC, 0xED, 0xB7, 0xDE, 0x31, 0x8F, 0xBF, 0x4F, 0xB3, 0x8F, 0xEA, 0xFA, 0x5F, 0xFF, 0xFA, 0xB7, 0x56, 0x82, 0xC6, 0x41,
+ 0xBE, 0xA0, 0x6F, 0xFB, 0xDB, 0x0F, 0xFF, 0x70, 0xDB, 0x8D, 0xB7, 0x93, 0x62, 0x0C, 0x75, 0x0F, 0x5D, 0x71, 0xF8, 0x86,
+ 0xD0, 0xB9, 0xC1, 0xF3, 0x2E, 0x9D, 0x1D, 0x11, 0x14, 0x12, 0x1D, 0x1A, 0x8E, 0x6D, 0xE1, 0x07, 0x9C, 0x72, 0xC1, 0xF6,
+ 0x08, 0x29, 0x36, 0x8D, 0x43, 0xB8, 0x3A, 0x38, 0xB5, 0x1A, 0xF8, 0xAD, 0xE8, 0xE0, 0xCB, 0xB8, 0x79, 0xAA, 0x0C, 0x8D,
+ 0x99, 0xDA, 0x54, 0x30, 0x6A, 0x20, 0x7D, 0x94, 0x6E, 0x33, 0x19, 0x58, 0x74, 0x50, 0x38, 0xFC, 0x11, 0x08, 0xFE, 0x53,
+ 0x2F, 0x99, 0x74, 0xE1, 0xF9, 0x17, 0x7C, 0xED, 0x6B, 0x5F, 0x63, 0x37, 0x80, 0x3D, 0x9D, 0xF4, 0x8C, 0xD3, 0xCE, 0xBE,
+ 0x74, 0xC2, 0x64, 0x32, 0x84, 0xBE, 0xF6, 0xC1, 0xED, 0x1B, 0xF7, 0xAC, 0x5E, 0xB9, 0x8D, 0x8D, 0x92, 0x64, 0xB4, 0x91,
+ 0x61, 0xB1, 0x6D, 0x0D, 0x5D, 0x6C, 0xEA, 0x8B, 0x0F, 0xE7, 0xFD, 0xA5, 0xA0, 0x2D, 0x3C, 0x23, 0x2D, 0x3A, 0x19, 0xC0,
+ 0xC1, 0xF6, 0x8F, 0xEC, 0xBB, 0xF2, 0x91, 0xFB, 0x1F, 0xFD, 0xE6, 0xB3, 0x2F, 0x40, 0x72, 0x79, 0xEB, 0xAD, 0x1F, 0xFC,
+ 0xFA, 0xD7, 0xBF, 0xA6, 0xF7, 0xA0, 0xE6, 0x48, 0xDB, 0x87, 0x0A, 0x80, 0xE3, 0x1C, 0x81, 0xA9, 0xA2, 0xB4, 0x12, 0x8C,
+ 0x80, 0xB0, 0xC4, 0xDB, 0x60, 0x14, 0x91, 0x12, 0x97, 0x91, 0x1A, 0x9F, 0x99, 0x40, 0x00, 0x8C, 0xCD, 0xC8, 0x4F, 0x29,
+ 0xAD, 0x2B, 0x6B, 0xED, 0x6C, 0x1D, 0x6A, 0xAD, 0xEF, 0xC1, 0x11, 0xE5, 0x78, 0xB7, 0xD6, 0x01, 0x0E, 0x55, 0xE3, 0x70,
+ 0x0B, 0x80, 0x9B, 0xBA, 0x6C, 0xFF, 0xAE, 0x83, 0x87, 0xF6, 0x1E, 0x39, 0x76, 0xE8, 0x2A, 0xB2, 0x58, 0x0A, 0x3D, 0x60,
+ 0xEA, 0x81, 0x7B, 0x1F, 0xB9, 0xEF, 0xEE, 0x87, 0xEE, 0xB9, 0xFD, 0xBE, 0x07, 0xEF, 0x79, 0x98, 0xBB, 0x4F, 0x3D, 0xF9,
+ 0xFC, 0x37, 0x5F, 0x78, 0x95, 0xF9, 0xCF, 0x8B, 0xDF, 0x7C, 0x95, 0x21, 0xD2, 0x0F, 0x7E, 0xF8, 0xD3, 0xF7, 0xDE, 0xFD,
+ 0xE5, 0x7B, 0x3F, 0xFB, 0xE5, 0x4F, 0x7F, 0xFC, 0xF3, 0x17, 0xBF, 0xF9, 0xAD, 0x6B, 0xAF, 0xBC, 0x91, 0x7E, 0x0C, 0x2D,
+ 0xB2, 0x03, 0x7B, 0x8F, 0xA2, 0x60, 0x50, 0x28, 0x74, 0x41, 0x20, 0x26, 0x15, 0x1F, 0x16, 0x1D, 0x13, 0x1A, 0xCB, 0x74,
+ 0x96, 0x3A, 0x1F, 0x1D, 0x8C, 0xB8, 0x42, 0x2C, 0x21, 0xDA, 0x09, 0x0F, 0x63, 0x2E, 0x54, 0x43, 0x3E, 0x1E, 0x05, 0xC8,
+ 0x64, 0x6E, 0x0C, 0x19, 0xCF, 0x4E, 0x47, 0x6D, 0x0F, 0x56, 0x2A, 0x72, 0x74, 0x10, 0x9B, 0x4C, 0x35, 0x88, 0x14, 0x28,
+ 0x65, 0x83, 0xFD, 0x69, 0x73, 0xCE, 0xA7, 0xB7, 0x33, 0xE3, 0xD2, 0xA9, 0x53, 0x26, 0x4F, 0x9A, 0x38, 0xE1, 0x62, 0x9A,
+ 0x3C, 0xE3, 0xC6, 0x8D, 0x83, 0x0E, 0x2D, 0xA7, 0xC3, 0x9E, 0x26, 0xCE, 0x31, 0x6B, 0xEA, 0x4C, 0x68, 0x9D, 0x4B, 0xFB,
+ 0x57, 0xB0, 0xB1, 0x7B, 0x71, 0xFF, 0x5A, 0x30, 0x84, 0xE7, 0xAB, 0x99, 0xE0, 0xBF, 0xB8, 0x2D, 0xCA, 0xA6, 0x3B, 0x86,
+ 0xD1, 0xD9, 0x7C, 0xC3, 0x8B, 0xCB, 0x92, 0x5F, 0x7D, 0xF1, 0xD9, 0xDF, 0xFF, 0xF6, 0x11, 0x49, 0x0E, 0x10, 0x4F, 0xDB,
+ 0xA3, 0x3C, 0xBB, 0x9C, 0xCA, 0x08, 0xF4, 0xE3, 0x45, 0x80, 0x32, 0x34, 0x4D, 0x0B, 0xAB, 0x30, 0xB3, 0xAC, 0xA4, 0xB0,
+ 0xA2, 0x20, 0xB7, 0xA2, 0xBA, 0xA4, 0x6D, 0xF3, 0xFA, 0x3D, 0x9C, 0xFE, 0x00, 0x8D, 0xB3, 0xA3, 0x65, 0x90, 0x19, 0x35,
+ 0x34, 0xC8, 0xA1, 0x9E, 0xE1, 0xB5, 0xC3, 0x9B, 0x09, 0x2A, 0xCC, 0x1B, 0x08, 0x12, 0x7B, 0xB7, 0x1D, 0x38, 0xB4, 0xE7,
+ 0x4A, 0x5A, 0x81, 0xD7, 0x1C, 0xBB, 0xF1, 0xFA, 0xE3, 0x37, 0xDF, 0x70, 0xFD, 0xED, 0x80, 0xD5, 0xF5, 0xC7, 0x6E, 0xB8,
+ 0xE1, 0xDA, 0xDB, 0x6E, 0xBE, 0xF9, 0xEE, 0xDB, 0x6F, 0xB9, 0xFB, 0x96, 0xEB, 0x6F, 0xBB, 0xEB, 0xD6, 0x7B, 0x50, 0xCC,
+ 0xC3, 0x0F, 0x3C, 0x7E, 0xDB, 0xCD, 0x77, 0xDD, 0x7B, 0xD7, 0xC3, 0xDC, 0xEE, 0xDF, 0x75, 0x60, 0xD5, 0xC0, 0x30, 0x50,
+ 0xC9, 0x21, 0x16, 0x57, 0x5E, 0x7E, 0x3D, 0x19, 0xDA, 0x94, 0xF3, 0x2F, 0x0E, 0x5D, 0x18, 0x12, 0x15, 0x1A, 0x89, 0x34,
+ 0xE8, 0x74, 0xA1, 0x03, 0xF2, 0x69, 0xAC, 0x8A, 0x37, 0x96, 0x12, 0x65, 0xE3, 0x81, 0x34, 0x86, 0x4F, 0xB9, 0x90, 0x80,
+ 0xE8, 0xC0, 0xDA, 0xFB, 0xC9, 0xCC, 0x48, 0xEF, 0x58, 0x4E, 0xB1, 0x08, 0x1D, 0xB0, 0xA7, 0x25, 0x39, 0x31, 0x2D, 0x2E,
+ 0x46, 0x4A, 0x59, 0xA2, 0x50, 0x44, 0x48, 0x28, 0xA0, 0x44, 0x8B, 0x8D, 0x82, 0x16, 0xCE, 0xF3, 0xFC, 0x59, 0x73, 0xFD,
+ 0x66, 0xCE, 0x9E, 0x33, 0xDD, 0x77, 0xE6, 0xD4, 0x69, 0x6C, 0x0E, 0x98, 0x3C, 0x61, 0xE2, 0x79, 0x17, 0x9C, 0xCF, 0x69,
+ 0xBC, 0x20, 0xD5, 0xB8, 0x73, 0xCE, 0x9B, 0x76, 0xE9, 0xF4, 0x4B, 0x27, 0x4F, 0x99, 0x36, 0x69, 0x12, 0xC3, 0x4B, 0xDE,
+ 0x34, 0x6F, 0x74, 0xE1, 0xDC, 0x85, 0xA0, 0x39, 0x21, 0x97, 0x4D, 0xC5, 0x77, 0xDC, 0x7A, 0xCF, 0x2F, 0x7F, 0xF9, 0xC1,
+ 0xC9, 0x7D, 0x69, 0x14, 0x03, 0x4C, 0x93, 0xCE, 0xDF, 0x70, 0xF5, 0x2D, 0xEB, 0x96, 0x6C, 0x84, 0x79, 0x97, 0x93, 0x90,
+ 0x03, 0x93, 0x2E, 0x3E, 0x26, 0xB9, 0xA4, 0xB0, 0x86, 0x29, 0x7C, 0x5C, 0x64, 0x2C, 0x4E, 0x56, 0x9C, 0x2D, 0xE7, 0x08,
+ 0xF5, 0x2E, 0x5A, 0xCA, 0xB9, 0x49, 0x83, 0xBD, 0xAB, 0x16, 0x19, 0x57, 0xE0, 0x08, 0x31, 0x0E, 0xE4, 0xE0, 0x9C, 0x2C,
+ 0x36, 0x89, 0x2C, 0x5F, 0xBC, 0x61, 0xE5, 0x92, 0xF5, 0x6B, 0x57, 0x6F, 0xE3, 0x04, 0xDA, 0x65, 0x03, 0xAB, 0x57, 0x2C,
+ 0x5E, 0x43, 0xFF, 0x83, 0x53, 0x6A, 0x77, 0x6C, 0xDC, 0xBD, 0x73, 0xD3, 0xBE, 0xDD, 0xDB, 0xF7, 0x72, 0xEA, 0xD1, 0xC1,
+ 0xDD, 0x97, 0xD3, 0x95, 0xDA, 0xBA, 0x61, 0xFB, 0xDE, 0xCB, 0x0E, 0x62, 0xE9, 0xFB, 0xB6, 0x1F, 0x3C, 0x7C, 0xE0, 0xD8,
+ 0x15, 0x87, 0x8E, 0x5D, 0x71, 0xE4, 0xF8, 0x65, 0x9B, 0x76, 0xAF, 0x59, 0xBC, 0x8A, 0xD3, 0x90, 0x00, 0x49, 0x36, 0x72,
+ 0x1F, 0xD8, 0x77, 0x0D, 0x86, 0x38, 0x65, 0xFC, 0xC4, 0x88, 0xC0, 0x08, 0x00, 0x96, 0xE6, 0x0A, 0x4E, 0x89, 0x4C, 0x50,
+ 0x00, 0x23, 0x29, 0x5C, 0x41, 0x23, 0xB3, 0x0D, 0x0C, 0xA3, 0x71, 0x69, 0x44, 0x25, 0x3E, 0x9A, 0x74, 0x4A, 0xAA, 0x6E,
+ 0x08, 0x01, 0xF9, 0xD0, 0x31, 0xD9, 0x16, 0x9A, 0x31, 0x76, 0x34, 0xAA, 0x39, 0x8C, 0x36, 0xD7, 0xB4, 0xF2, 0x16, 0x57,
+ 0x88, 0x4C, 0xE0, 0xBF, 0xF2, 0xBF, 0xE9, 0xAF, 0x71, 0xDE, 0x0C, 0xBB, 0xB1, 0xD9, 0x18, 0x03, 0xE7, 0x19, 0xEA, 0x39,
+ 0x3B, 0xDC, 0x45, 0x25, 0xB3, 0xE7, 0x53, 0xCA, 0xC1, 0xC9, 0xA5, 0xF5, 0xE6, 0x3B, 0x7D, 0xC6, 0xB4, 0xA9, 0x53, 0xD0,
+ 0x0A, 0x44, 0x68, 0xC6, 0x96, 0xBC, 0x6F, 0x9C, 0x37, 0x21, 0x2A, 0x6A, 0xF6, 0x74, 0x5F, 0x32, 0xEB, 0x25, 0x7D, 0xAB,
+ 0xA3, 0x16, 0x46, 0x86, 0xCD, 0x0D, 0xA6, 0xCE, 0x80, 0xE0, 0xF5, 0xE4, 0x63, 0x5F, 0x7F, 0xEF, 0xBD, 0x9F, 0xFF, 0xE5,
+ 0x2F, 0x7F, 0xA3, 0x3E, 0xA2, 0x13, 0xF7, 0xFE, 0xCF, 0x3F, 0x00, 0xC1, 0x8F, 0x1D, 0x3E, 0xCE, 0x11, 0x2D, 0x14, 0x04,
+ 0x32, 0x13, 0x4E, 0x2F, 0x4E, 0x4D, 0x48, 0x47, 0x85, 0xC5, 0xB9, 0x95, 0x7C, 0xE0, 0xF4, 0x14, 0x32, 0x66, 0x46, 0x13,
+ 0x15, 0x04, 0x06, 0xF8, 0x4E, 0x54, 0xE0, 0xCC, 0xEC, 0x2A, 0x8A, 0xEA, 0x0A, 0x32, 0x4A, 0xEB, 0x4B, 0x5A, 0x09, 0xD7,
+ 0xAC, 0xC6, 0xDA, 0x45, 0x95, 0xC5, 0x74, 0x18, 0x06, 0x87, 0x7A, 0x56, 0xEA, 0xB1, 0xA9, 0x9C, 0xDF, 0xC7, 0x2D, 0x30,
+ 0x85, 0x7F, 0x0C, 0x0F, 0xAD, 0x25, 0x9B, 0x58, 0xDC, 0x3D, 0xBC, 0x7A, 0xC9, 0xA6, 0x95, 0x03, 0xAB, 0x88, 0x1F, 0x1B,
+ 0x56, 0x6C, 0xA5, 0x2A, 0xA6, 0x08, 0xDD, 0xB8, 0x72, 0xDB, 0x96, 0x35, 0xDB, 0xB7, 0xAD, 0xDB, 0x45, 0xCA, 0x8B, 0xB3,
+ 0xD2, 0x71, 0x41, 0x4A, 0x1C, 0x87, 0xB3, 0x6D, 0xD3, 0x01, 0xA8, 0xF3, 0x93, 0x2E, 0xBE, 0x88, 0x8F, 0x0F, 0x95, 0x4F,
+ 0xFC, 0x20, 0x3C, 0x9C, 0x78, 0xA0, 0xFD, 0x2E, 0xD3, 0x7F, 0x4C, 0xB0, 0x6A, 0xA0, 0x9D, 0x47, 0xC2, 0xAA, 0x77, 0xC7,
+ 0x2C, 0x1F, 0x41, 0x7C, 0x43, 0x4E, 0x92, 0xA1, 0x8A, 0x69, 0x42, 0x90, 0xAA, 0x8F, 0x61, 0xC5, 0xD8, 0x96, 0x8E, 0xFA,
+ 0x81, 0x56, 0x1F, 0x40, 0xB9, 0xFE, 0x1B, 0x3A, 0x0A, 0xFC, 0x7B, 0x9A, 0x0A, 0x64, 0x4A, 0x51, 0x81, 0x61, 0x20, 0x3E,
+ 0xDD, 0x05, 0x3C, 0x03, 0x7D, 0xA0, 0x15, 0x56, 0xB0, 0x5F, 0x00, 0x8A, 0x91, 0xE5, 0x17, 0x18, 0xE2, 0x17, 0x4A, 0x0B,
+ 0x88, 0xA7, 0xC1, 0x2C, 0x32, 0x6F, 0x3A, 0x3A, 0xC0, 0xCF, 0x7F, 0xCA, 0x84, 0xC9, 0x1C, 0x73, 0xB0, 0x7D, 0xF3, 0x01,
+ 0x4E, 0x19, 0x66, 0xA6, 0x04, 0x39, 0x0E, 0x96, 0x51, 0x67, 0x4B, 0x17, 0x0D, 0x35, 0x3A, 0x42, 0x57, 0x1F, 0xBE, 0x96,
+ 0xC3, 0x40, 0xE8, 0xF0, 0x0C, 0x0F, 0xAC, 0xA1, 0x37, 0xC0, 0x1E, 0x50, 0x80, 0x88, 0x6E, 0x55, 0x44, 0x70, 0x14, 0x15,
+ 0x5C, 0x5A, 0x62, 0x06, 0xBE, 0x08, 0xDD, 0x3A, 0x3B, 0x35, 0x1F, 0x10, 0xE0, 0x42, 0x76, 0x18, 0x64, 0x15, 0x56, 0x31,
+ 0xC5, 0xAB, 0x6A, 0xCD, 0x48, 0x85, 0xAE, 0xDD, 0x52, 0x96, 0x57, 0x5B, 0x98, 0x59, 0xC1, 0x49, 0x87, 0x9C, 0xB6, 0xC4,
+ 0x86, 0xF8, 0xEA, 0xD2, 0x66, 0x9C, 0xA3, 0xBF, 0x6B, 0x79, 0x57, 0xDB, 0xE2, 0xBE, 0xCE, 0x65, 0xEC, 0xE1, 0x31, 0xC7,
+ 0xD6, 0xF4, 0x0E, 0x2D, 0x5A, 0x41, 0x85, 0xB1, 0xA4, 0x67, 0xD5, 0xFA, 0xD5, 0x3B, 0xE4, 0xA8, 0xE9, 0x9E, 0xE5, 0xAB,
+ 0x86, 0x37, 0xE0, 0x2E, 0x12, 0xDB, 0x3B, 0xFA, 0xF1, 0x3F, 0x52, 0x5E, 0x08, 0xE7, 0xE4, 0x0B, 0x99, 0xD1, 0x19, 0xA9,
+ 0x11, 0x49, 0xEC, 0x42, 0xA4, 0x6B, 0x82, 0xA3, 0xF3, 0x89, 0x60, 0xE8, 0xC4, 0x85, 0x46, 0xB1, 0x5B, 0x54, 0x04, 0x12,
+ 0x25, 0x99, 0x82, 0x66, 0x47, 0x9A, 0x0E, 0x59, 0x14, 0x1A, 0x23, 0x7D, 0x45, 0x63, 0x1F, 0x27, 0xF5, 0x34, 0xD2, 0x77,
+ 0x90, 0x27, 0xCD, 0xEC, 0x8A, 0x76, 0x49, 0xA9, 0x96, 0x15, 0xE3, 0x74, 0x37, 0xE3, 0x9D, 0x3E, 0xB3, 0x99, 0xBA, 0x18,
+ 0x5F, 0xA3, 0xE9, 0x1F, 0x81, 0x1A, 0xC4, 0x21, 0x00, 0x68, 0x6E, 0x51, 0x06, 0x66, 0x3E, 0x76, 0x05, 0x84, 0x10, 0x3C,
+ 0x88, 0x5D, 0x2C, 0x14, 0xC0, 0xD8, 0x52, 0xFF, 0x84, 0x07, 0x2F, 0x99, 0x48, 0x48, 0xBF, 0xA8, 0xB1, 0xAA, 0x71, 0xD7,
+ 0xD6, 0x03, 0x38, 0xF8, 0xA6, 0x0D, 0x7B, 0xA0, 0x7C, 0xD5, 0x57, 0xC9, 0xB9, 0x2D, 0xB4, 0x48, 0xDB, 0x9B, 0xE4, 0x08,
+ 0x1F, 0x33, 0x5F, 0x6C, 0x29, 0x97, 0xE1, 0x49, 0x59, 0x76, 0x42, 0x1E, 0x2A, 0xAF, 0xAE, 0x68, 0x84, 0x31, 0x47, 0xC1,
+ 0x98, 0x97, 0x51, 0x44, 0x8D, 0x2D, 0x5B, 0x04, 0x32, 0x0B, 0x68, 0x5B, 0xB2, 0xB7, 0x09, 0x1D, 0x70, 0x91, 0x97, 0x5D,
+ 0x52, 0x55, 0xDE, 0x20, 0x47, 0x24, 0xD0, 0x61, 0xCE, 0xAF, 0xCC, 0xCF, 0x2C, 0x2F, 0xCE, 0xAD, 0x46, 0x01, 0x00, 0x54,
+ 0x7F, 0xD7, 0x52, 0x92, 0x57, 0x9C, 0x6F, 0xB0, 0x7B, 0x05, 0x4A, 0xC5, 0x2D, 0x9A, 0x6B, 0x17, 0xA1, 0x12, 0x74, 0x83,
+ 0x67, 0xC8, 0x59, 0x30, 0x4C, 0x3D, 0x9B, 0x07, 0x28, 0x3B, 0xE4, 0x80, 0xAD, 0xE6, 0x3E, 0x39, 0x42, 0xA2, 0xBE, 0x5B,
+ 0xCF, 0x37, 0x85, 0xA4, 0x94, 0x1C, 0x9A, 0x04, 0xA5, 0x8C, 0x37, 0x4F, 0xA4, 0x81, 0x87, 0xC0, 0xF6, 0xDB, 0xE8, 0x70,
+ 0xF1, 0x03, 0x8C, 0xC0, 0xD6, 0x07, 0x28, 0xC3, 0xA4, 0x6D, 0x52, 0xAF, 0x25, 0x46, 0xCA, 0xCE, 0x75, 0x90, 0x23, 0x39,
+ 0x5A, 0xC7, 0x24, 0x49, 0x26, 0x6B, 0x92, 0xDF, 0xB2, 0xC0, 0x22, 0x53, 0xAF, 0x1A, 0xDB, 0x77, 0x0B, 0x57, 0x99, 0xC3,
+ 0x79, 0xE9, 0x79, 0x36, 0x29, 0x32, 0x6A, 0x90, 0xA9, 0x90, 0x99, 0x7C, 0xA5, 0x82, 0xC8, 0xEA, 0x5F, 0xAA, 0x06, 0x70,
+ 0x89, 0xE4, 0x8C, 0x77, 0x26, 0xCA, 0x08, 0x89, 0x46, 0x1F, 0xA0, 0x24, 0xB7, 0x5C, 0x8B, 0x56, 0xC2, 0xA2, 0x55, 0xF4,
+ 0x24, 0x0F, 0x26, 0x7C, 0x49, 0x04, 0xE3, 0xAE, 0xB4, 0xE4, 0x16, 0xF8, 0x5F, 0x70, 0xDE, 0xF9, 0x9C, 0xC8, 0x4E, 0x82,
+ 0x41, 0x12, 0x05, 0xE1, 0xEE, 0x8A, 0xCB, 0x6F, 0xDC, 0xB9, 0xF3, 0x30, 0x87, 0x81, 0x00, 0x17, 0x8D, 0xD5, 0xAD, 0x28,
+ 0x83, 0x23, 0x19, 0x39, 0xDA, 0x90, 0xBD, 0xAB, 0xC5, 0x19, 0x32, 0xF7, 0x26, 0xA9, 0xAD, 0xAB, 0x68, 0x22, 0x23, 0x42,
+ 0xDC, 0x20, 0x0F, 0x9F, 0x16, 0x2C, 0x22, 0x30, 0x70, 0x17, 0x5C, 0x2A, 0xCC, 0x2E, 0xCD, 0x4A, 0x11, 0x6F, 0x90, 0x3D,
+ 0x23, 0x6C, 0x61, 0x4B, 0x2D, 0xA0, 0x1B, 0x5F, 0x56, 0x50, 0x83, 0x3E, 0xC0, 0x2E, 0xC2, 0x4F, 0x6D, 0x79, 0x2B, 0xB1,
+ 0x1A, 0x65, 0x40, 0xD8, 0x21, 0x8B, 0x05, 0xAF, 0xAA, 0x0B, 0x1A, 0xB8, 0xDB, 0x5C, 0xD3, 0x5D, 0x9E, 0x5F, 0xD7, 0x5A,
+ 0xD3, 0xC3, 0x36, 0xE1, 0xC2, 0xB4, 0x32, 0xF2, 0x2B, 0x8A, 0x4A, 0x98, 0xE1, 0xED, 0x35, 0xDD, 0x55, 0x79, 0x35, 0x8C,
+ 0x0A, 0x38, 0x61, 0x88, 0x52, 0x3C, 0x2D, 0x2A, 0x8D, 0x33, 0x01, 0x38, 0x50, 0x87, 0x46, 0x69, 0x4D, 0x79, 0x9D, 0xEF,
+ 0xE4, 0xE9, 0x7C, 0x4C, 0xD5, 0x41, 0x52, 0xA4, 0xD4, 0x68, 0x22, 0x5C, 0x53, 0x1F, 0x18, 0x1D, 0xC8, 0x35, 0x91, 0x83,
+ 0x65, 0xE5, 0xAE, 0x17, 0xC9, 0xE8, 0x46, 0x75, 0x60, 0x03, 0x2F, 0xDD, 0x1B, 0x3B, 0x8F, 0xD6, 0x44, 0x68, 0x0C, 0x37,
+ 0xC6, 0x3B, 0x20, 0xD5, 0x01, 0xA4, 0x82, 0x12, 0xFF, 0x46, 0x41, 0x50, 0xB2, 0x82, 0xB0, 0x44, 0x94, 0xA1, 0x38, 0xE3,
+ 0xCA, 0xDA, 0x0A, 0x5D, 0x2E, 0xE4, 0x39, 0x68, 0xCB, 0x3C, 0x27, 0x26, 0x2C, 0x02, 0xB7, 0x60, 0xCB, 0xC6, 0x82, 0x39,
+ 0x73, 0x2F, 0x38, 0x7F, 0x1C, 0x71, 0xFB, 0x82, 0x73, 0xCE, 0xE7, 0x3D, 0x6C, 0x5D, 0xB7, 0xF7, 0xF8, 0xD5, 0xB7, 0xA3,
+ 0x09, 0x32, 0xDA, 0xC5, 0xBD, 0xAB, 0xC4, 0x5A, 0x4B, 0x5A, 0xCA, 0x0B, 0x6B, 0x31, 0x4C, 0x4E, 0x85, 0xE3, 0x09, 0xD8,
+ 0x14, 0xE9, 0x10, 0xA1, 0x18, 0x56, 0x40, 0xA2, 0xB4, 0x04, 0x52, 0xD0, 0x81, 0xF0, 0x65, 0xD8, 0x8F, 0x9F, 0x9E, 0x87,
+ 0xE1, 0xA3, 0x03, 0xDA, 0xC8, 0x28, 0x83, 0xD2, 0x44, 0x4E, 0xA0, 0xCB, 0x2E, 0x93, 0x1A, 0x22, 0xB7, 0x9C, 0x23, 0x89,
+ 0xA0, 0x07, 0xB2, 0x4F, 0xA2, 0x30, 0xB7, 0xBA, 0xB4, 0xB0, 0xBE, 0x9C, 0xAD, 0x2E, 0x35, 0xED, 0x75, 0x55, 0x1D, 0x64,
+ 0xB1, 0xC0, 0x97, 0x90, 0xF5, 0x8B, 0xEB, 0x0B, 0xB3, 0xCB, 0x2B, 0x0B, 0x1B, 0xC8, 0xB2, 0xD0, 0x47, 0x7E, 0x4A, 0x49,
+ 0x79, 0x56, 0x4D, 0x5D, 0x69, 0x1B, 0xFD, 0x44, 0x94, 0x51, 0x90, 0x51, 0x2E, 0x03, 0xE4, 0x94, 0x1C, 0xFA, 0xCA, 0xBC,
+ 0x0D, 0x9C, 0x80, 0xFF, 0x98, 0x12, 0x9F, 0xCC, 0x96, 0x13, 0x0E, 0xC9, 0xA0, 0xB5, 0x45, 0x70, 0x02, 0x85, 0xE8, 0xFB,
+ 0x3A, 0x2B, 0x4A, 0x3A, 0x8F, 0x02, 0x4A, 0x52, 0x31, 0x48, 0x33, 0x58, 0x94, 0x81, 0x8B, 0x44, 0xC5, 0xC9, 0x33, 0xC3,
+ 0xE5, 0x91, 0x51, 0x3A, 0xF0, 0x2A, 0x60, 0x8C, 0xF4, 0x4F, 0x9E, 0x4A, 0x2B, 0x35, 0xC8, 0x8B, 0x74, 0xEA, 0x0D, 0xD2,
+ 0xFA, 0x97, 0x5B, 0x51, 0x89, 0x68, 0x25, 0x8C, 0x14, 0x36, 0x0E, 0x03, 0x89, 0x8B, 0x4C, 0x88, 0xE5, 0xAE, 0xF1, 0x56,
+ 0xE7, 0x57, 0xE1, 0xF1, 0xE2, 0x16, 0x61, 0x0C, 0xF1, 0xD9, 0xD0, 0xEA, 0xC7, 0xE6, 0x3D, 0xCA, 0x3D, 0xAD, 0xF5, 0x62,
+ 0x42, 0xE2, 0xB7, 0x6D, 0xD8, 0x7B, 0xE3, 0x8D, 0xF7, 0x72, 0x6E, 0x1D, 0xFB, 0x5E, 0x49, 0xF6, 0x85, 0x3D, 0x56, 0x58,
+ 0x93, 0x9B, 0x54, 0xC4, 0xAF, 0x48, 0x04, 0x81, 0xD0, 0x78, 0xF3, 0xD9, 0x52, 0xE2, 0xD3, 0x18, 0x7F, 0xF2, 0xB2, 0x31,
+ 0x64, 0x07, 0x9C, 0x32, 0x14, 0x2F, 0x6D, 0x7A, 0xBC, 0x24, 0x33, 0x39, 0x97, 0x12, 0x9A, 0x4F, 0x84, 0xBF, 0xA2, 0x9E,
+ 0x9C, 0x74, 0x51, 0x0F, 0x7E, 0x80, 0x0E, 0xE0, 0x25, 0x02, 0x5C, 0x65, 0xC5, 0x35, 0xC5, 0x05, 0xD5, 0x00, 0x00, 0xEE,
+ 0x82, 0xD5, 0x67, 0xA6, 0xD1, 0xCA, 0x95, 0xDD, 0x86, 0xF1, 0x31, 0xE9, 0x39, 0x69, 0x05, 0x59, 0x29, 0x05, 0xDC, 0xE2,
+ 0x07, 0x29, 0x91, 0xE9, 0xEC, 0x8B, 0x29, 0xCD, 0xAF, 0xA6, 0xF2, 0x80, 0x4B, 0x48, 0xF8, 0x2C, 0xCF, 0xAE, 0xD4, 0x0D,
+ 0x2F, 0x1C, 0x86, 0x49, 0x7D, 0xC0, 0xF1, 0x0D, 0x7C, 0x40, 0xA2, 0x20, 0x15, 0x8F, 0xE4, 0x45, 0x44, 0x63, 0x53, 0x2A,
+ 0x1B, 0x90, 0x30, 0x81, 0x41, 0xC3, 0x03, 0xD2, 0x57, 0xB9, 0x0B, 0x10, 0x25, 0xE8, 0xD2, 0xB9, 0xA1, 0x8F, 0x95, 0xFB,
+ 0xC9, 0xBC, 0x30, 0xCC, 0x6A, 0x0C, 0x45, 0x69, 0xF4, 0x68, 0x94, 0x8F, 0xEA, 0x0C, 0x25, 0x54, 0x13, 0xDE, 0x80, 0xA3,
+ 0xFA, 0xD0, 0xA0, 0x6D, 0x7C, 0xD0, 0xE8, 0x5F, 0x4D, 0x20, 0x5A, 0x1C, 0x85, 0x77, 0x63, 0xD4, 0x13, 0x8B, 0x40, 0x71,
+ 0x05, 0x02, 0x38, 0xFC, 0xF5, 0x39, 0xD3, 0x67, 0x5E, 0x74, 0xDE, 0xF9, 0x5A, 0xE5, 0x61, 0xDD, 0x5B, 0xD6, 0xEE, 0xD9,
+ 0xBF, 0xFF, 0xD8, 0xA1, 0x43, 0xD7, 0x2A, 0xA1, 0xBA, 0x22, 0xB7, 0x0E, 0xAA, 0x19, 0x66, 0x8E, 0x8D, 0xF3, 0x5B, 0x29,
+ 0x12, 0x43, 0xA2, 0x89, 0x3A, 0x5C, 0x80, 0x45, 0x1C, 0x94, 0xC0, 0x86, 0x40, 0x0A, 0x05, 0xAE, 0x93, 0x63, 0xD3, 0x91,
+ 0xBB, 0x9C, 0x1F, 0x12, 0x95, 0x44, 0xFA, 0x94, 0x10, 0x95, 0x42, 0xE8, 0x96, 0x2D, 0x08, 0x12, 0xEA, 0x04, 0x4E, 0xF9,
+ 0x15, 0x52, 0x46, 0x7F, 0x74, 0x95, 0xA9, 0x8A, 0x38, 0x0F, 0x04, 0x8F, 0x41, 0x49, 0x54, 0x79, 0x70, 0xDD, 0x48, 0x70,
+ 0xF9, 0xEC, 0x3C, 0x82, 0xCE, 0x50, 0x0C, 0xDC, 0xE7, 0xEC, 0x8C, 0x7C, 0x22, 0x0A, 0x2E, 0x48, 0x4B, 0x9F, 0x03, 0x6E,
+ 0x68, 0x87, 0xB0, 0xDD, 0xA8, 0xBF, 0x75, 0xE8, 0xC0, 0xAE, 0x2B, 0x1F, 0xBC, 0xEF, 0x49, 0xB2, 0x58, 0xBC, 0x64, 0xDE,
+ 0x8C, 0x79, 0x24, 0x84, 0x26, 0x43, 0x8D, 0xC7, 0x2C, 0x10, 0xAE, 0x11, 0xB4, 0x48, 0x59, 0x96, 0xFB, 0xD9, 0x8D, 0x75,
+ 0x3A, 0x06, 0xAA, 0x6A, 0x18, 0xA5, 0x03, 0xAF, 0xED, 0xD3, 0x3F, 0xA0, 0x99, 0xA3, 0x71, 0xD8, 0x5E, 0x68, 0x6B, 0xC1,
+ 0x3B, 0xA5, 0xB3, 0xA9, 0xAA, 0x8B, 0x4B, 0x02, 0x0B, 0x56, 0x1F, 0x63, 0x14, 0x63, 0x95, 0xA4, 0xBA, 0xC1, 0x78, 0x05,
+ 0xAC, 0x82, 0x4D, 0xB4, 0x08, 0x8C, 0x24, 0x83, 0x02, 0x61, 0x51, 0x03, 0x9B, 0xCB, 0xD0, 0x01, 0xB7, 0x04, 0xC6, 0x2B,
+ 0x2E, 0xBF, 0x69, 0xDB, 0x96, 0x03, 0x6B, 0x56, 0x6C, 0x27, 0x66, 0x12, 0x51, 0x49, 0x7E, 0x08, 0xBF, 0xA8, 0x21, 0x31,
+ 0x2E, 0x15, 0x89, 0xE3, 0x0A, 0x48, 0x33, 0x9C, 0xCC, 0x38, 0x34, 0x3A, 0x2E, 0x22, 0x89, 0x0B, 0x5C, 0x21, 0x32, 0x44,
+ 0x8A, 0x3E, 0x3E, 0x33, 0xBF, 0x65, 0xC5, 0x1A, 0x5F, 0x91, 0xBA, 0xC9, 0x3C, 0x19, 0xE5, 0xA1, 0x24, 0x8A, 0x6A, 0xF4,
+ 0x44, 0xB3, 0x44, 0xD4, 0x60, 0x94, 0x24, 0xE7, 0x43, 0xB1, 0x31, 0x22, 0x39, 0x0F, 0xD1, 0x13, 0x60, 0xC2, 0x83, 0x22,
+ 0x50, 0x9B, 0x6C, 0x33, 0x49, 0xE6, 0x14, 0xBD, 0x0A, 0x39, 0xC0, 0x25, 0xBD, 0x40, 0xF6, 0xB6, 0x14, 0xD5, 0x72, 0x7C,
+ 0x1C, 0xBD, 0x5B, 0x68, 0x3B, 0x90, 0x48, 0xB6, 0xAE, 0xDD, 0xF9, 0xC0, 0xFD, 0x8F, 0x7F, 0xF8, 0x9B, 0x3F, 0xFE, 0xFC,
+ 0x67, 0x1F, 0xEE, 0xDA, 0xB6, 0x13, 0x05, 0xCC, 0x98, 0x32, 0x9D, 0xC6, 0x01, 0x9E, 0x4D, 0xC2, 0xCA, 0x5D, 0x00, 0xCA,
+ 0x40, 0x6E, 0x94, 0x64, 0x2B, 0xA4, 0x21, 0x21, 0xDC, 0xB2, 0x73, 0x48, 0x3A, 0x66, 0x60, 0x35, 0xDA, 0x42, 0x0E, 0x3E,
+ 0xCA, 0x43, 0xB2, 0xC9, 0x8F, 0x4D, 0x43, 0x69, 0x90, 0xC9, 0xAF, 0x52, 0x9D, 0x16, 0x05, 0xA8, 0x6A, 0xFB, 0x45, 0xEA,
+ 0xEC, 0x76, 0xD9, 0xF1, 0x90, 0x6D, 0x94, 0x7B, 0x9B, 0x53, 0x16, 0xAC, 0x4C, 0xA2, 0xE6, 0x04, 0x70, 0x1B, 0xC6, 0x4D,
+ 0x42, 0x15, 0xCB, 0xFB, 0x93, 0x83, 0x3E, 0x08, 0xCE, 0x7E, 0x81, 0xFE, 0xB3, 0xE6, 0x50, 0xDC, 0xD1, 0xF6, 0x40, 0x0D,
+ 0xBC, 0xE0, 0x86, 0x75, 0xBB, 0xB7, 0x6D, 0x39, 0xB8, 0x7C, 0xE9, 0xA6, 0xD6, 0xC6, 0x3E, 0xAA, 0x30, 0xE4, 0xC5, 0x56,
+ 0x56, 0xCC, 0x13, 0x01, 0x21, 0x77, 0x19, 0x95, 0x90, 0x2B, 0x27, 0xA4, 0x0B, 0x1B, 0x43, 0xFC, 0x20, 0x4E, 0x84, 0x1E,
+ 0xC1, 0x2D, 0xAC, 0x3D, 0x1E, 0x89, 0x89, 0x0E, 0x8B, 0x21, 0x73, 0xC7, 0xD5, 0x78, 0x32, 0xBF, 0xE5, 0x57, 0x2C, 0x50,
+ 0x11, 0x85, 0x19, 0x25, 0x89, 0x1D, 0x44, 0x61, 0xB9, 0xC4, 0xD2, 0xD8, 0x64, 0xF2, 0x2B, 0x56, 0x66, 0x8A, 0xCC, 0xF2,
+ 0x04, 0xCD, 0x52, 0xB2, 0xC9, 0xBB, 0x08, 0x12, 0xF8, 0x41, 0x51, 0x56, 0x39, 0x3D, 0xA8, 0x82, 0x9C, 0xAA, 0x9C, 0x94,
+ 0xE2, 0xCC, 0xD8, 0x6C, 0x2A, 0xC4, 0x8A, 0xAC, 0x4A, 0x4A, 0x19, 0xE6, 0xE4, 0x94, 0x14, 0x14, 0x71, 0x6F, 0x7C, 0xF7,
+ 0x87, 0xFF, 0xFD, 0xF8, 0x8B, 0xDF, 0xBC, 0xFF, 0x87, 0xA3, 0x87, 0xAF, 0xE5, 0xF9, 0x86, 0x90, 0x10, 0x10, 0xE0, 0x2B,
+ 0xED, 0x03, 0x36, 0x08, 0x2D, 0x98, 0xE1, 0x4B, 0xA9, 0x84, 0x85, 0x41, 0x9D, 0xE2, 0x98, 0x0D, 0x98, 0x3B, 0x78, 0xB0,
+ 0x4C, 0xDC, 0xD0, 0x44, 0x58, 0x9C, 0x8F, 0x97, 0x13, 0xE9, 0x45, 0x1E, 0xEB, 0x07, 0xA0, 0xAA, 0xC3, 0x14, 0x4B, 0x94,
+ 0xC6, 0xB5, 0x5B, 0x2D, 0x3B, 0xC3, 0x52, 0x4B, 0x0E, 0xD0, 0xC2, 0x6D, 0xCC, 0x3A, 0xA5, 0x32, 0x54, 0x2B, 0x02, 0x8B,
+ 0x06, 0x94, 0x30, 0x07, 0x0C, 0x84, 0x0C, 0x8A, 0x2A, 0xCF, 0x04, 0x06, 0xB6, 0x16, 0xFB, 0x72, 0x18, 0x08, 0x3A, 0xA0,
+ 0xA4, 0xE0, 0x4C, 0x96, 0x1D, 0xDB, 0x8F, 0x74, 0xB5, 0x0F, 0x72, 0x42, 0x11, 0x1B, 0xC1, 0x81, 0x7B, 0xAC, 0x98, 0x15,
+ 0xBA, 0x30, 0x9C, 0x3F, 0x47, 0xAC, 0xD8, 0x35, 0x0E, 0x11, 0xE4, 0x17, 0x1C, 0x46, 0x36, 0x8C, 0x3F, 0x51, 0xA3, 0x84,
+ 0x46, 0x87, 0x87, 0x44, 0x87, 0x07, 0x70, 0x4D, 0xE9, 0x14, 0x15, 0x41, 0x47, 0x39, 0x28, 0x92, 0xC5, 0x16, 0x7E, 0xC9,
+ 0xD0, 0x42, 0xA3, 0xC9, 0x86, 0xB9, 0x95, 0x43, 0x5E, 0x78, 0x24, 0x2C, 0x96, 0x57, 0x13, 0x8F, 0xE1, 0x5D, 0xF1, 0xFE,
+ 0x63, 0x33, 0xB8, 0xD5, 0x12, 0x4F, 0x55, 0x82, 0x82, 0x09, 0x1E, 0xD9, 0xA9, 0xC5, 0xE5, 0x85, 0xF5, 0x72, 0xF2, 0x74,
+ 0xCB, 0x60, 0x4F, 0x9B, 0xF4, 0x04, 0x81, 0xAC, 0xDC, 0xD4, 0xA2, 0xBC, 0x94, 0x7C, 0xC6, 0x18, 0x30, 0xA0, 0x68, 0xA4,
+ 0xD3, 0xAE, 0x87, 0x2D, 0x70, 0xCB, 0x75, 0x77, 0xDC, 0x7A, 0xFD, 0xBD, 0xA0, 0x13, 0xDF, 0x54, 0x42, 0xB4, 0x18, 0x1E,
+ 0xE2, 0x5B, 0x49, 0xB6, 0x1F, 0xD8, 0x75, 0x84, 0xBE, 0xC8, 0x8A, 0x65, 0xEB, 0x30, 0xF1, 0xB8, 0x88, 0x28, 0xA4, 0xC4,
+ 0x49, 0x02, 0x7C, 0x64, 0x30, 0x80, 0xB7, 0xE4, 0xE8, 0xC0, 0xD3, 0x92, 0xB3, 0x14, 0xA5, 0xEC, 0xAC, 0x84, 0x4C, 0x5D,
+ 0xE2, 0x92, 0x0E, 0x57, 0x69, 0x84, 0x28, 0xF9, 0xD5, 0xAE, 0xA0, 0x03, 0x55, 0xAB, 0x12, 0x4F, 0x12, 0x35, 0x02, 0x56,
+ 0x82, 0x18, 0xA6, 0xD2, 0x36, 0x25, 0x1E, 0xC8, 0x1E, 0x49, 0x64, 0x93, 0xC0, 0x30, 0x27, 0x00, 0x44, 0xA2, 0xCB, 0x04,
+ 0xF7, 0x74, 0xCB, 0x86, 0x7D, 0x9B, 0x37, 0xEE, 0x93, 0xB3, 0xFD, 0x4A, 0x1B, 0x01, 0x74, 0x72, 0x1B, 0xFA, 0x42, 0xB4,
+ 0x9B, 0x10, 0x22, 0xF0, 0x1D, 0x16, 0x10, 0xCE, 0x05, 0xE6, 0x8C, 0xAC, 0x41, 0x8F, 0xF0, 0xC0, 0x68, 0x2C, 0x9A, 0x0B,
+ 0x76, 0xC5, 0x86, 0x2E, 0x0C, 0x43, 0xC4, 0xB2, 0x02, 0xC2, 0x28, 0x0C, 0xD9, 0xA9, 0xC9, 0x2D, 0x07, 0x97, 0xF2, 0x48,
+ 0xA8, 0x7F, 0x58, 0x48, 0x40, 0x28, 0x4F, 0xE0, 0xDF, 0xA1, 0x27, 0xFC, 0x00, 0x45, 0xE2, 0x52, 0xBC, 0x14, 0x3A, 0x4E,
+ 0x8A, 0xA1, 0x1D, 0x9B, 0x88, 0xE8, 0x15, 0x8B, 0x78, 0x9C, 0x3A, 0x23, 0x27, 0xAD, 0x84, 0x1C, 0x89, 0xD5, 0x56, 0xDF,
+ 0x07, 0x2A, 0xB6, 0x37, 0x0F, 0x74, 0x77, 0x2C, 0x2D, 0xC9, 0xAB, 0xA9, 0x2A, 0x69, 0x22, 0x78, 0x14, 0xA5, 0x97, 0x02,
+ 0x92, 0x29, 0x49, 0xE9, 0xD8, 0x04, 0xF1, 0x89, 0x4A, 0x4D, 0x3C, 0x29, 0x31, 0x15, 0x14, 0x61, 0x1A, 0xC6, 0x79, 0xF3,
+ 0x03, 0xDD, 0x43, 0x74, 0x0C, 0x5B, 0x6A, 0x5B, 0xE8, 0xB7, 0x4F, 0xB9, 0x64, 0x32, 0xA0, 0x87, 0xA6, 0x49, 0xA5, 0x68,
+ 0xB5, 0x02, 0x00, 0x82, 0x45, 0xA7, 0x5C, 0x7C, 0x60, 0xC9, 0x4D, 0x13, 0x0C, 0x49, 0x26, 0x59, 0xC9, 0x62, 0xA7, 0xE0,
+ 0x88, 0xB9, 0xEC, 0x01, 0x06, 0xD6, 0x02, 0x50, 0x8A, 0x4B, 0x98, 0xFF, 0x28, 0x05, 0xC4, 0x39, 0x84, 0x46, 0x3B, 0xDE,
+ 0xB3, 0x31, 0x43, 0x92, 0x28, 0x00, 0xC1, 0x69, 0x78, 0x44, 0x45, 0x2C, 0x14, 0x23, 0xC5, 0xFC, 0x81, 0xD4, 0xB3, 0xCF,
+ 0x3A, 0x03, 0xD1, 0x6C, 0xDA, 0xB8, 0x8F, 0xF3, 0xA1, 0xBA, 0xBB, 0x96, 0x61, 0x98, 0x44, 0xD4, 0xDC, 0xF4, 0x42, 0xF6,
+ 0xB7, 0x12, 0x39, 0x29, 0xCD, 0x30, 0x7F, 0xC4, 0x0D, 0xB0, 0x00, 0x38, 0x48, 0x96, 0x30, 0x80, 0x40, 0xB9, 0x10, 0x89,
+ 0x2F, 0x08, 0x97, 0xFA, 0x7C, 0x41, 0x30, 0xA2, 0x0F, 0x9A, 0x1F, 0x4C, 0x4B, 0x4A, 0xAF, 0x17, 0xCE, 0x87, 0xDA, 0x1D,
+ 0x10, 0x34, 0x3F, 0x28, 0xC8, 0x2F, 0x24, 0x78, 0x01, 0x27, 0xBC, 0x84, 0xF1, 0x38, 0x4A, 0xE2, 0x6F, 0x79, 0x29, 0xD2,
+ 0x36, 0xCC, 0x42, 0x70, 0x2C, 0x28, 0x4A, 0x52, 0xAC, 0x58, 0x69, 0x0F, 0x03, 0x65, 0x31, 0x61, 0x49, 0x24, 0xAC, 0xB5,
+ 0x00, 0x4F, 0x51, 0x23, 0x55, 0xC5, 0xD2, 0xC1, 0xF5, 0x1B, 0xD6, 0xEC, 0xE2, 0x78, 0x8C, 0x55, 0x2B, 0xB6, 0xEE, 0xDE,
+ 0x79, 0x74, 0xDF, 0x9E, 0x63, 0x87, 0xF6, 0x5F, 0x7F, 0x60, 0xCF, 0xD5, 0xE4, 0x6F, 0x14, 0x34, 0x8B, 0x5A, 0xFB, 0x5A,
+ 0xEA, 0xDB, 0xA8, 0x5D, 0x38, 0x45, 0xAC, 0xA6, 0xB2, 0x89, 0x3C, 0x38, 0x23, 0x35, 0x87, 0x57, 0x13, 0x9B, 0x08, 0xA0,
+ 0xC7, 0x19, 0xC3, 0x28, 0x9E, 0xEF, 0x81, 0x88, 0x8A, 0x88, 0x06, 0xA6, 0xCC, 0x51, 0x4B, 0x21, 0xA7, 0xD0, 0x81, 0x57,
+ 0xDC, 0x96, 0xB5, 0xAA, 0x70, 0xE4, 0xC9, 0x8B, 0x54, 0xE2, 0x96, 0xC1, 0x21, 0x3A, 0x30, 0x3C, 0xAD, 0x53, 0xB2, 0x07,
+ 0xE4, 0x41, 0xE3, 0x13, 0x72, 0xAB, 0x25, 0x85, 0xCC, 0xF9, 0xA4, 0x48, 0x19, 0xE5, 0x0A, 0xC0, 0x28, 0x25, 0x1B, 0xAE,
+ 0x30, 0x7F, 0xB6, 0x2F, 0x31, 0x99, 0xFE, 0xC1, 0x86, 0xB5, 0x7B, 0x07, 0x7A, 0x56, 0x02, 0xCA, 0x84, 0x4A, 0xD9, 0xBD,
+ 0x43, 0x3B, 0xCB, 0x40, 0x84, 0x86, 0x59, 0x84, 0x8E, 0xEC, 0x70, 0x02, 0xF4, 0x81, 0x69, 0xB3, 0xC2, 0x17, 0x46, 0x20,
+ 0x59, 0xA4, 0x2C, 0xA7, 0x32, 0xCE, 0x0B, 0xE4, 0x36, 0x60, 0xDE, 0x42, 0x6E, 0xFD, 0x67, 0xFB, 0xFB, 0xCF, 0x0D, 0x60,
+ 0xC7, 0xB2, 0x2C, 0x73, 0xCD, 0xE3, 0x81, 0x0B, 0x82, 0x64, 0xCD, 0x0B, 0x14, 0x0D, 0x05, 0x84, 0x82, 0x63, 0x68, 0x1D,
+ 0xE9, 0xF0, 0xCA, 0xE4, 0xBE, 0x60, 0x14, 0xF5, 0x44, 0x43, 0x55, 0x4B, 0x43, 0x65, 0x67, 0x6E, 0x7A, 0x69, 0x05, 0xE7,
+ 0xF3, 0x57, 0x77, 0x2E, 0x5F, 0xBC, 0x11, 0xD7, 0x5C, 0xB7, 0x66, 0xE7, 0x91, 0x43, 0xD7, 0xEF, 0xDD, 0x7F, 0xCD, 0x2D,
+ 0xB7, 0x3C, 0x70, 0xFC, 0xF8, 0x1D, 0x00, 0x26, 0xC5, 0x1A, 0x47, 0x97, 0xF0, 0x75, 0x61, 0xFA, 0x35, 0x62, 0xF4, 0xF0,
+ 0x69, 0x1E, 0xD3, 0x2D, 0xA6, 0x32, 0x2D, 0xC8, 0xE3, 0x6B, 0xA3, 0x3A, 0x38, 0x2D, 0xB5, 0xBF, 0x8B, 0x2F, 0x1A, 0x1A,
+ 0xE4, 0xA0, 0x76, 0x5E, 0x7F, 0xCA, 0xC4, 0x09, 0x98, 0x1A, 0x0A, 0xA0, 0x36, 0xF2, 0x51, 0xE1, 0x6A, 0x45, 0x66, 0x57,
+ 0x9A, 0xC7, 0xF0, 0x35, 0x17, 0x3A, 0x49, 0x07, 0x63, 0x39, 0x4C, 0x99, 0xF1, 0x59, 0xCC, 0xD9, 0x69, 0xA9, 0xB2, 0xD4,
+ 0x1B, 0xBC, 0x40, 0xA4, 0xD7, 0x78, 0xBA, 0x2C, 0x33, 0x59, 0x95, 0x9C, 0x24, 0x5A, 0x13, 0x64, 0x49, 0xD4, 0xB4, 0x5E,
+ 0x63, 0x3E, 0x6A, 0xDA, 0x4D, 0xC1, 0x33, 0x26, 0x5F, 0x8A, 0x5C, 0xD6, 0xAF, 0xDD, 0x45, 0x24, 0x20, 0xC4, 0x09, 0xA7,
+ 0x3C, 0xB5, 0x00, 0x59, 0xE3, 0xDD, 0x54, 0xB9, 0xE4, 0xA6, 0x20, 0x06, 0xF2, 0x02, 0x2E, 0x78, 0xD0, 0x04, 0xDE, 0x28,
+ 0xE9, 0x44, 0x05, 0x84, 0x61, 0x6E, 0x18, 0x7E, 0xE0, 0x1C, 0x3F, 0xCE, 0xB3, 0x43, 0xD0, 0x0B, 0x66, 0x8B, 0xD0, 0xA5,
+ 0x6F, 0xE8, 0x3B, 0x8F, 0x86, 0x2E, 0xB7, 0x7A, 0x4D, 0x7F, 0x97, 0x0B, 0x6E, 0xD1, 0x04, 0x5E, 0x82, 0x1A, 0xD4, 0x93,
+ 0xD0, 0x44, 0x64, 0xB0, 0x94, 0xBB, 0x44, 0x0B, 0x66, 0x12, 0x14, 0xD5, 0x60, 0x60, 0x5E, 0x46, 0x59, 0x6B, 0x5D, 0x6F,
+ 0x4B, 0x43, 0x6F, 0x7F, 0xF7, 0xCA, 0x81, 0x1E, 0xCE, 0x9C, 0x3F, 0xB0, 0x63, 0xDB, 0xD1, 0x43, 0x07, 0x8E, 0xDF, 0x7A,
+ 0xEB, 0x83, 0xB7, 0xDC, 0xF1, 0xC8, 0x50, 0xDF, 0xEA, 0xD9, 0xD3, 0xE7, 0x68, 0x59, 0x73, 0xD6, 0x19, 0x67, 0x5E, 0x78,
+ 0xC1, 0x79, 0x90, 0xC6, 0xA7, 0x4C, 0x9C, 0xC4, 0x62, 0xD6, 0xCB, 0xC1, 0x87, 0x3C, 0xC8, 0x2D, 0xDC, 0x9C, 0x89, 0xE3,
+ 0x27, 0x4D, 0x1C, 0x3F, 0x81, 0xAE, 0xFE, 0xC5, 0x17, 0x5D, 0x80, 0xA3, 0xA3, 0x03, 0xAC, 0x8D, 0x66, 0x9A, 0xE8, 0xC0,
+ 0x0B, 0x32, 0x7A, 0x9D, 0x96, 0x02, 0x0A, 0x65, 0xB0, 0xFB, 0x97, 0x45, 0x21, 0xFA, 0x25, 0x28, 0x94, 0xEE, 0xCD, 0x53,
+ 0x5D, 0x32, 0x93, 0x7A, 0x83, 0x48, 0x7C, 0xB4, 0x26, 0x1C, 0x0F, 0xB0, 0x70, 0x64, 0x72, 0x24, 0x21, 0xF9, 0x6A, 0xE5,
+ 0x62, 0x72, 0xB5, 0x48, 0x6D, 0x34, 0x71, 0x1E, 0xDA, 0x94, 0xF1, 0xE3, 0x99, 0xBD, 0xD0, 0x3C, 0xC8, 0x4C, 0xA1, 0x0C,
+ 0x26, 0xC7, 0x4F, 0x03, 0x97, 0xC9, 0xEB, 0x1B, 0xAB, 0xDB, 0xAB, 0xCA, 0x9B, 0x10, 0xBD, 0xA9, 0x4E, 0xD3, 0x90, 0x1A,
+ 0x81, 0x84, 0x68, 0x8C, 0x04, 0x5D, 0xE4, 0x91, 0x04, 0x97, 0x24, 0x44, 0x5A, 0xB6, 0xB3, 0x16, 0xB0, 0x67, 0x9F, 0xD2,
+ 0x8F, 0x33, 0x5C, 0x38, 0x42, 0x84, 0x25, 0x6A, 0x98, 0x35, 0x57, 0xAE, 0xCD, 0xAD, 0x51, 0x86, 0x3F, 0x4F, 0x43, 0x07,
+ 0x68, 0x8E, 0x96, 0x09, 0x93, 0x00, 0xB0, 0x08, 0x87, 0x10, 0x1D, 0xB0, 0xB5, 0x1F, 0x52, 0x41, 0x56, 0x59, 0x4D, 0x45,
+ 0x1B, 0x2D, 0x58, 0xEC, 0xB7, 0xB7, 0x6B, 0xF9, 0xD0, 0xD0, 0xDA, 0xCB, 0xB6, 0x1D, 0x3E, 0x7A, 0xE4, 0xC6, 0x5B, 0x6E,
+ 0xBA, 0xFF, 0xF6, 0xDB, 0x1F, 0xE6, 0x54, 0x49, 0xFE, 0x10, 0xE9, 0x9F, 0x79, 0xFA, 0x19, 0x48, 0x9C, 0xB6, 0x3C, 0x43,
+ 0x94, 0xD9, 0xD3, 0x66, 0x10, 0xCF, 0x58, 0x73, 0x67, 0xCC, 0xE2, 0x76, 0xF6, 0x8C, 0x99, 0x33, 0x2F, 0x9D, 0x31, 0x6D,
+ 0xD2, 0x64, 0x0E, 0x03, 0xBD, 0x74, 0xCA, 0x25, 0xF4, 0x89, 0x79, 0x6F, 0xC4, 0x64, 0xB0, 0x71, 0xC4, 0x0F, 0x4E, 0x81,
+ 0xF5, 0x49, 0x8E, 0x02, 0x44, 0x07, 0x9E, 0x34, 0x54, 0xAF, 0x47, 0x97, 0x08, 0x23, 0x95, 0x9A, 0x11, 0xBA, 0x43, 0x2B,
+ 0x3B, 0x39, 0x61, 0x3D, 0x39, 0x73, 0xD5, 0x0C, 0x55, 0x9A, 0x5C, 0xD2, 0xBD, 0x80, 0xCE, 0x25, 0x1C, 0x53, 0x74, 0x30,
+ 0x6D, 0xD2, 0xA5, 0x30, 0x9A, 0xEA, 0x2B, 0x5B, 0x11, 0x2E, 0xB2, 0xE0, 0x91, 0xC4, 0x84, 0x34, 0x0E, 0xE5, 0xA2, 0xAC,
+ 0x6D, 0x6F, 0xE9, 0xCB, 0x61, 0xEF, 0x6A, 0xBE, 0xEC, 0x08, 0x8B, 0x0D, 0x4F, 0x4C, 0x4D, 0xCA, 0x24, 0x07, 0x37, 0x85,
+ 0x1E, 0x9A, 0x08, 0x07, 0x73, 0x34, 0x05, 0x44, 0xF4, 0x6A, 0xF8, 0x9C, 0x24, 0xC5, 0x62, 0x98, 0xE1, 0x3B, 0x6D, 0x16,
+ 0x0B, 0x3E, 0x8E, 0x91, 0x8E, 0x2F, 0x4B, 0x7E, 0x65, 0xD4, 0xC0, 0x93, 0x09, 0x8F, 0x00, 0x14, 0x4E, 0x40, 0x30, 0x27,
+ 0x6D, 0xD5, 0x12, 0x04, 0x30, 0xC0, 0x15, 0xB2, 0x93, 0x8B, 0x5A, 0xAA, 0xBB, 0x7B, 0xDA, 0x97, 0x74, 0xB4, 0x0C, 0xAD,
+ 0x59, 0xB1, 0x8D, 0x03, 0x9E, 0x39, 0x51, 0x95, 0xAA, 0xE5, 0xA6, 0x9B, 0xEE, 0xA3, 0x9B, 0xC2, 0x29, 0x07, 0x67, 0x9C,
+ 0xC6, 0xD7, 0x15, 0x9E, 0x0E, 0xC5, 0x44, 0xA5, 0x8F, 0x6A, 0x61, 0x8C, 0xEB, 0x32, 0xD6, 0x30, 0x17, 0x93, 0xA7, 0x7B,
+ 0xCF, 0xF2, 0xF3, 0xF5, 0xE3, 0x1F, 0x21, 0x7D, 0x3C, 0x00, 0x08, 0xC2, 0x09, 0xD0, 0x01, 0x71, 0xCB, 0xC7, 0x93, 0xE6,
+ 0x7B, 0xB2, 0xFE, 0xA4, 0x4C, 0x8E, 0x72, 0xFD, 0x12, 0x89, 0x3B, 0x4C, 0xD5, 0xAF, 0x20, 0x50, 0x9E, 0x42, 0x01, 0xF1,
+ 0xC9, 0x0E, 0x16, 0xC5, 0x25, 0x09, 0xE5, 0x26, 0x5E, 0x82, 0x81, 0x5B, 0x31, 0x4A, 0xF7, 0x5B, 0x92, 0xF7, 0xE0, 0x18,
+ 0xC4, 0x8D, 0x99, 0x24, 0xC7, 0x25, 0x51, 0x16, 0x21, 0x41, 0xCC, 0x13, 0xB9, 0x20, 0xDF, 0xE4, 0xD8, 0xCC, 0x84, 0x88,
+ 0x54, 0x92, 0x10, 0x42, 0x62, 0x3E, 0x1C, 0xDB, 0x9C, 0xB2, 0xF4, 0xC4, 0x6C, 0x62, 0x80, 0x6C, 0x67, 0x8B, 0x91, 0x73,
+ 0x36, 0xD1, 0x5F, 0xD0, 0xC2, 0x50, 0x50, 0x85, 0x4F, 0x28, 0x6B, 0xF6, 0x82, 0xB9, 0xB3, 0xE7, 0xA9, 0xED, 0x8B, 0x0E,
+ 0x66, 0xCC, 0x9E, 0x3D, 0x0D, 0x93, 0xF4, 0x55, 0x0B, 0x9D, 0x3B, 0x55, 0xAE, 0x55, 0x3D, 0xEA, 0x1C, 0xFE, 0x33, 0x17,
+ 0x00, 0x5C, 0xA4, 0xED, 0x20, 0x21, 0x80, 0x46, 0x5E, 0x84, 0x1A, 0x48, 0x5B, 0x49, 0x58, 0x61, 0x50, 0xD3, 0x5C, 0x22,
+ 0x0B, 0xEA, 0xEF, 0x1C, 0x1E, 0xE8, 0x5A, 0xC1, 0xE9, 0x30, 0xDB, 0xB7, 0x1E, 0xBC, 0xE6, 0xAA, 0xDB, 0x6F, 0xBC, 0xE1,
+ 0x3E, 0x94, 0x11, 0x1D, 0x18, 0x83, 0x13, 0x4C, 0xB8, 0xF0, 0x22, 0xDF, 0xA9, 0xD3, 0xB1, 0x7A, 0xB1, 0x80, 0x79, 0xF3,
+ 0x29, 0xF8, 0xE5, 0x3D, 0xCC, 0x97, 0xA3, 0xAC, 0x74, 0x94, 0x22, 0x89, 0x80, 0xE9, 0xDE, 0x23, 0x7A, 0x96, 0x0E, 0x5A,
+ 0x54, 0x07, 0x12, 0x93, 0x4F, 0x32, 0x73, 0xB1, 0x6B, 0x77, 0x59, 0x71, 0x7F, 0x15, 0x65, 0x75, 0x94, 0x32, 0x60, 0x65,
+ 0x19, 0x71, 0x8F, 0x58, 0xBD, 0x34, 0x70, 0xD2, 0x34, 0x0C, 0xA4, 0xC3, 0x7C, 0x32, 0xC4, 0x1B, 0xC7, 0x03, 0xA8, 0x92,
+ 0x4C, 0xDF, 0x2A, 0x3E, 0x14, 0xA2, 0xB5, 0x30, 0x04, 0x30, 0x49, 0x9E, 0xCC, 0x5B, 0x9A, 0x3B, 0x1D, 0x3B, 0x92, 0x23,
+ 0x70, 0x82, 0x03, 0x39, 0xC0, 0x31, 0x31, 0x3B, 0xA9, 0xB8, 0x34, 0xA3, 0xB2, 0x3C, 0xA7, 0x06, 0x63, 0xAC, 0xAF, 0xE8,
+ 0x20, 0x31, 0x27, 0xBB, 0x90, 0xF6, 0x4E, 0x6A, 0x0E, 0x88, 0x81, 0x07, 0x00, 0x62, 0x84, 0x04, 0xF9, 0xB4, 0x7E, 0xFE,
+ 0xF3, 0xE7, 0xFA, 0x2B, 0xD4, 0x70, 0xAB, 0x4E, 0x80, 0x02, 0x58, 0xF3, 0xA6, 0xCD, 0xF4, 0x9D, 0x2A, 0x10, 0x01, 0x38,
+ 0xA0, 0x69, 0x79, 0xC4, 0xF8, 0x81, 0x0C, 0xFE, 0x08, 0x0C, 0x73, 0x04, 0x9D, 0xD1, 0x01, 0xD6, 0x20, 0x9D, 0x8F, 0xB0,
+ 0x38, 0xAA, 0xB6, 0xCA, 0xB2, 0xFA, 0x76, 0xB8, 0xCB, 0x35, 0x1D, 0x64, 0x41, 0x4B, 0x06, 0xD6, 0x11, 0x8D, 0x37, 0xAE,
+ 0xDD, 0x45, 0x3C, 0xB8, 0xEA, 0xCA, 0x5B, 0xAF, 0xBF, 0xFE, 0xEE, 0x5D, 0xDB, 0x2F, 0x5F, 0x30, 0x33, 0x80, 0x08, 0x4C,
+ 0x51, 0x49, 0x4D, 0xC3, 0x40, 0x17, 0x92, 0x1D, 0x4B, 0xE5, 0xEE, 0x8C, 0x4C, 0x5C, 0xB9, 0xAB, 0xF4, 0x4D, 0x00, 0x30,
+ 0x1E, 0x40, 0xE8, 0x32, 0x3A, 0x00, 0xFD, 0xD0, 0x81, 0x93, 0xE1, 0x7C, 0x19, 0x23, 0xF5, 0x94, 0xF6, 0x7E, 0x12, 0xDC,
+ 0x7F, 0x29, 0x91, 0xCF, 0x06, 0x00, 0x76, 0xD3, 0x33, 0xB8, 0x67, 0x8D, 0xE8, 0xC0, 0x69, 0xB5, 0xC6, 0xC5, 0x87, 0x44,
+ 0xE9, 0x84, 0x07, 0x94, 0xA7, 0x5E, 0xD3, 0xCF, 0x03, 0x38, 0x90, 0x54, 0x10, 0x06, 0x40, 0x83, 0xC6, 0x8A, 0xCE, 0xDA,
+ 0xAA, 0x56, 0x92, 0xD4, 0xC5, 0x83, 0xEB, 0xA0, 0x4D, 0x70, 0x56, 0x64, 0x75, 0x71, 0x53, 0x7E, 0x4E, 0x39, 0x0A, 0x20,
+ 0x4A, 0x83, 0x8D, 0x64, 0xB7, 0x68, 0x82, 0x1C, 0x09, 0xF7, 0x27, 0x20, 0xD3, 0xD0, 0x47, 0x9D, 0x12, 0x0C, 0x8C, 0xA5,
+ 0x8B, 0xD5, 0x4F, 0xC5, 0x03, 0xA6, 0x1B, 0x3F, 0x10, 0xE9, 0xAB, 0x6E, 0xF4, 0x96, 0xA7, 0x89, 0xBE, 0xFD, 0x82, 0xD1,
+ 0x22, 0x21, 0x9D, 0x08, 0xCF, 0x3F, 0x25, 0x65, 0xA0, 0x10, 0xA9, 0xE4, 0xEC, 0xB8, 0x8A, 0x36, 0x3A, 0xDB, 0x1D, 0x8D,
+ 0x03, 0xD4, 0xEA, 0xE8, 0x60, 0xEB, 0xE6, 0x03, 0x5B, 0x36, 0xED, 0x23, 0x1E, 0x5C, 0x75, 0xD5, 0xAD, 0xBB, 0x76, 0x5C,
+ 0x3E, 0xDF, 0xD7, 0xEF, 0xBC, 0xB3, 0xCF, 0x30, 0x6F, 0xD8, 0x4F, 0x3E, 0xC2, 0xFC, 0x20, 0x14, 0x10, 0x32, 0xDF, 0x4C,
+ 0xAB, 0xFC, 0x83, 0x08, 0x6C, 0x3A, 0xC5, 0x32, 0x86, 0xEF, 0x80, 0x8F, 0xB4, 0x31, 0x16, 0x4A, 0xEE, 0x17, 0x1E, 0x14,
+ 0xC6, 0x21, 0x0E, 0xA2, 0x03, 0xF8, 0x84, 0x5F, 0x81, 0x2A, 0x46, 0xD6, 0x92, 0x71, 0xBA, 0xEB, 0xAB, 0x64, 0x7D, 0xEA,
+ 0x22, 0xD9, 0x80, 0x8F, 0xF5, 0x00, 0x53, 0x21, 0x4B, 0x43, 0xD1, 0xED, 0x75, 0xC7, 0x41, 0xAE, 0x26, 0x75, 0x01, 0xD3,
+ 0xA9, 0x21, 0xF9, 0x24, 0xA0, 0x2A, 0xB6, 0x49, 0x22, 0x0F, 0x20, 0x90, 0x8C, 0x56, 0x73, 0x22, 0x79, 0x5D, 0x4F, 0x67,
+ 0xEB, 0xE2, 0xA5, 0x8B, 0x37, 0x1C, 0x39, 0x72, 0xFD, 0x8A, 0xE5, 0x9B, 0x69, 0x5A, 0x70, 0x66, 0x5A, 0x71, 0x56, 0x75,
+ 0x71, 0x46, 0x05, 0xE7, 0xAA, 0xE1, 0x34, 0xD4, 0x3B, 0x88, 0x4F, 0x1B, 0x7F, 0x66, 0x6C, 0x17, 0x28, 0x15, 0xC6, 0xEC,
+ 0xF9, 0x48, 0x9F, 0x53, 0x4E, 0x0D, 0x1C, 0x61, 0xF2, 0xBE, 0xD8, 0x3B, 0xA0, 0x64, 0xB4, 0x22, 0xF1, 0xC0, 0x6F, 0xA6,
+ 0x0D, 0xCB, 0x0B, 0x78, 0x1A, 0x38, 0x16, 0x1E, 0x4E, 0xEF, 0x53, 0x26, 0x80, 0xE4, 0x69, 0x58, 0x03, 0x09, 0x71, 0x75,
+ 0x51, 0x33, 0x27, 0x03, 0xA1, 0x06, 0x2A, 0x64, 0x38, 0x96, 0x4B, 0x86, 0xD6, 0xAF, 0x5D, 0xBB, 0x03, 0x2C, 0x42, 0x13,
+ 0x87, 0x2F, 0xBF, 0xE1, 0xEA, 0x63, 0xB7, 0x05, 0x05, 0x84, 0x5D, 0x74, 0xDE, 0x38, 0xB4, 0x8E, 0xE8, 0xD5, 0xD2, 0x65,
+ 0x39, 0x42, 0x17, 0xB4, 0xD1, 0xB7, 0x64, 0x30, 0x67, 0x21, 0x69, 0xB7, 0x2E, 0x6A, 0x20, 0xA4, 0x8F, 0x2B, 0xE8, 0x5D,
+ 0x9F, 0xD1, 0xF4, 0x60, 0x27, 0x9F, 0x39, 0xB9, 0xEB, 0xA0, 0xB9, 0xA6, 0xB2, 0x27, 0xDD, 0xDB, 0x91, 0xBB, 0x52, 0x94,
+ 0x61, 0xE6, 0xEE, 0x3A, 0x99, 0xCC, 0x64, 0xB9, 0x7F, 0x38, 0xB8, 0xA3, 0x80, 0x70, 0xC3, 0x8E, 0x09, 0x89, 0x46, 0xEE,
+ 0x20, 0x95, 0x1C, 0xFE, 0x67, 0x72, 0x47, 0x1E, 0x01, 0x61, 0xAA, 0x2B, 0x0C, 0x1F, 0x62, 0x70, 0xF5, 0xA6, 0x0D, 0x7B,
+ 0x0F, 0x1F, 0xBE, 0x6E, 0xEF, 0x9E, 0xAB, 0xF8, 0xD8, 0x7B, 0x77, 0x1F, 0xEB, 0x6A, 0x5B, 0xB2, 0xA8, 0x65, 0x31, 0xDF,
+ 0x92, 0x51, 0x5F, 0xD9, 0x5E, 0x5B, 0xD2, 0x9A, 0x97, 0x56, 0x2C, 0xFC, 0xB0, 0x0C, 0x99, 0x62, 0x46, 0x9B, 0x32, 0x3B,
+ 0x32, 0x20, 0x9C, 0x8F, 0x67, 0xD2, 0x7F, 0x7F, 0x0D, 0xD1, 0xEA, 0x10, 0x26, 0x48, 0x4A, 0xB2, 0xA4, 0x79, 0x11, 0xB7,
+ 0x6A, 0xFE, 0x80, 0x06, 0x17, 0x8A, 0xDD, 0x08, 0x8B, 0x82, 0x23, 0x34, 0x38, 0x82, 0x5E, 0x3F, 0x2D, 0x29, 0x46, 0x05,
+ 0xA0, 0x5F, 0x5B, 0x53, 0x3F, 0xFC, 0xA8, 0xBE, 0x8E, 0xE5, 0x2B, 0x96, 0x6E, 0x05, 0x91, 0x28, 0xC4, 0xF6, 0xEC, 0x3E,
+ 0xB6, 0x6B, 0xC7, 0xD1, 0xBD, 0xBB, 0xAF, 0x24, 0x32, 0x97, 0xE4, 0x55, 0xD1, 0xE8, 0x55, 0x05, 0x40, 0xF3, 0x09, 0xF7,
+ 0x0B, 0xE5, 0x64, 0x4F, 0x05, 0x19, 0x67, 0xA6, 0x2B, 0x52, 0x0E, 0x8E, 0x5C, 0xC8, 0x51, 0x87, 0x22, 0x7A, 0xA9, 0xCC,
+ 0x51, 0x40, 0x50, 0x88, 0x73, 0x57, 0xAE, 0xC3, 0xA4, 0x2F, 0xA6, 0x23, 0xE2, 0x31, 0xCB, 0xCD, 0x2C, 0x8D, 0xE8, 0x0D,
+ 0x7F, 0xD8, 0xDB, 0x19, 0x85, 0xE7, 0xCD, 0x90, 0x1A, 0x96, 0x15, 0xDD, 0x92, 0xF4, 0xA8, 0x64, 0x99, 0xEB, 0xBA, 0x3C,
+ 0x32, 0xC4, 0x3D, 0x46, 0x07, 0x27, 0x8F, 0x19, 0xAC, 0x13, 0x00, 0xDF, 0x5C, 0xD3, 0x97, 0xA6, 0x2B, 0x40, 0x49, 0xD9,
+ 0xC6, 0x37, 0x62, 0xF6, 0x0E, 0xAF, 0x5A, 0xBA, 0x89, 0x53, 0x70, 0xB6, 0x6F, 0x3D, 0xB4, 0x6F, 0xEF, 0xD5, 0xD7, 0x5E,
+ 0x7B, 0xE7, 0x9D, 0x77, 0x3E, 0xBA, 0x7F, 0xEF, 0xD5, 0x7B, 0x76, 0x5D, 0x09, 0x14, 0xE0, 0x07, 0xD4, 0x47, 0xCB, 0x86,
+ 0x36, 0x30, 0x07, 0xA6, 0x8D, 0x4A, 0xE1, 0x4A, 0x3F, 0x99, 0x7E, 0x00, 0xEF, 0x56, 0x46, 0xA7, 0x48, 0xD0, 0x5F, 0xE6,
+ 0xD5, 0x7C, 0x42, 0x84, 0x82, 0x68, 0xD8, 0x77, 0xAE, 0x81, 0x11, 0x4D, 0x83, 0x6F, 0x66, 0x49, 0x72, 0xC2, 0x52, 0xC1,
+ 0xE9, 0x35, 0x7F, 0x25, 0x88, 0xE1, 0x17, 0x22, 0x0C, 0x09, 0xD3, 0xB1, 0x20, 0x29, 0xE0, 0x58, 0x27, 0x26, 0x39, 0x75,
+ 0xE5, 0xED, 0x8C, 0x36, 0x01, 0xA2, 0xCD, 0x1B, 0xF7, 0xEE, 0xBC, 0xEC, 0x08, 0x5D, 0xF4, 0xD5, 0x2B, 0xB7, 0xD3, 0xC7,
+ 0x5D, 0xB1, 0x7C, 0xCB, 0x8E, 0xAD, 0x87, 0x21, 0x6A, 0x90, 0x11, 0xF1, 0x0A, 0xC4, 0x73, 0x31, 0xF6, 0x00, 0x29, 0x86,
+ 0x45, 0x01, 0x6A, 0xEC, 0x08, 0xDD, 0xBC, 0x19, 0x1E, 0xE4, 0x95, 0x35, 0xEB, 0xD3, 0x69, 0x2E, 0x4B, 0x9E, 0xC0, 0x7B,
+ 0x56, 0x1D, 0x7C, 0xD9, 0x62, 0x3B, 0x86, 0x1A, 0x38, 0x48, 0xC2, 0xAD, 0x15, 0xA5, 0x14, 0xBA, 0x71, 0x52, 0xEB, 0x6A,
+ 0xA9, 0x65, 0xAE, 0x9D, 0x61, 0xCE, 0x58, 0xFA, 0x86, 0x4B, 0x6F, 0x1A, 0x19, 0x2D, 0xC4, 0xC8, 0xEC, 0x02, 0x02, 0x88,
+ 0x14, 0x65, 0xA1, 0x31, 0xA0, 0x04, 0xF9, 0x38, 0xDF, 0xA3, 0x0D, 0x73, 0x5B, 0x76, 0x33, 0x94, 0xD5, 0xE2, 0x10, 0xD4,
+ 0x04, 0xA4, 0x86, 0x74, 0xE8, 0x60, 0xA9, 0x1C, 0x3E, 0x74, 0xFD, 0xCD, 0xB7, 0x3E, 0x74, 0xC7, 0x1D, 0x8F, 0xDC, 0x7B,
+ 0xFF, 0xD3, 0x77, 0xDF, 0xF9, 0xD8, 0x0D, 0xD7, 0xDD, 0x7D, 0xFC, 0x9A, 0x3B, 0xF7, 0xEC, 0xBC, 0x6A, 0xE5, 0xF0, 0x16,
+ 0x8A, 0xA3, 0xC1, 0xCE, 0x15, 0x32, 0x66, 0x89, 0x93, 0xEE, 0xBA, 0x76, 0x00, 0x69, 0x84, 0xF1, 0xC1, 0x40, 0x64, 0x64,
+ 0x6A, 0x44, 0x23, 0x19, 0x88, 0xEA, 0xC3, 0x50, 0x0B, 0x4C, 0xD6, 0x24, 0xD9, 0xA1, 0x7F, 0xF0, 0xBC, 0x00, 0xC1, 0x6E,
+ 0xCE, 0xA4, 0x0D, 0x90, 0x3A, 0x59, 0x08, 0x09, 0xF4, 0x56, 0x99, 0x85, 0x45, 0x26, 0x02, 0x6E, 0xC5, 0xD9, 0x55, 0xAD,
+ 0x7C, 0xE3, 0x6F, 0xF7, 0x72, 0x3A, 0x13, 0x28, 0x60, 0xA0, 0x6F, 0x15, 0x86, 0x4F, 0x35, 0x40, 0x1F, 0x77, 0xE5, 0xF0,
+ 0x56, 0xBA, 0x14, 0x14, 0xCC, 0x83, 0xBD, 0xAB, 0x77, 0x6C, 0x3A, 0x08, 0xA0, 0x73, 0x7A, 0x12, 0x8A, 0xE7, 0x02, 0x88,
+ 0x57, 0xE9, 0x4B, 0xA1, 0x63, 0x74, 0x60, 0x25, 0xCE, 0x05, 0xEF, 0x4D, 0x44, 0x8F, 0x9A, 0x83, 0x4D, 0x77, 0x2B, 0x48,
+ 0xDE, 0x2A, 0xB7, 0x63, 0x75, 0x60, 0xD1, 0xC6, 0xDA, 0xB2, 0xF6, 0x15, 0xA4, 0xB5, 0xC0, 0x10, 0x3F, 0x16, 0x93, 0xB7,
+ 0x42, 0x97, 0x24, 0x47, 0x1F, 0xF4, 0x92, 0x5B, 0xB5, 0x47, 0xCD, 0x14, 0xE9, 0x64, 0x32, 0x81, 0x33, 0xD2, 0x71, 0x0B,
+ 0x63, 0xDE, 0x13, 0x20, 0x70, 0xF1, 0x85, 0x17, 0x49, 0xD8, 0x9C, 0x31, 0xFB, 0xE2, 0x71, 0xE7, 0x53, 0xE9, 0x68, 0xC1,
+ 0xC9, 0x0F, 0xFB, 0x93, 0x2F, 0x3E, 0xFF, 0x82, 0xA8, 0xE0, 0x68, 0x80, 0xF8, 0xE1, 0x87, 0x9F, 0xFB, 0xCE, 0x77, 0xDE,
+ 0x79, 0xF4, 0xD1, 0xE7, 0xEF, 0xBA, 0xEB, 0xB1, 0x6B, 0xAE, 0xBC, 0x0D, 0x28, 0xD8, 0xBA, 0x71, 0xFF, 0xB2, 0x25, 0x1B,
+ 0x97, 0xF6, 0xAF, 0x81, 0x2D, 0xC1, 0x40, 0x98, 0x2D, 0x9E, 0xA6, 0xA9, 0x95, 0x41, 0x17, 0x4F, 0x1B, 0x1E, 0x2C, 0xF9,
+ 0xA8, 0xA0, 0x53, 0xB0, 0x14, 0xDE, 0x9A, 0x05, 0x22, 0x7A, 0x96, 0xDA, 0xA9, 0x93, 0x9C, 0x98, 0x43, 0x81, 0x69, 0x17,
+ 0x92, 0x98, 0x89, 0x98, 0xE8, 0x87, 0x47, 0x27, 0xD3, 0x17, 0xA9, 0x2C, 0x68, 0x04, 0xEE, 0x40, 0x1E, 0xB2, 0x20, 0xF4,
+ 0xBD, 0x7B, 0xE7, 0x15, 0xC7, 0x8E, 0xDE, 0x76, 0xD9, 0xF6, 0x23, 0x07, 0x0F, 0x1E, 0xDF, 0xBB, 0xF7, 0xD8, 0xD6, 0xAD,
+ 0x07, 0x48, 0x93, 0x80, 0x44, 0xCA, 0x66, 0x6E, 0xA1, 0x18, 0xA1, 0x00, 0x5E, 0x96, 0x13, 0xC5, 0x14, 0x70, 0x84, 0xED,
+ 0xC2, 0x32, 0xF6, 0xCE, 0x47, 0x70, 0xEE, 0xEA, 0x83, 0xA3, 0x17, 0x6A, 0xF0, 0xF9, 0x32, 0x22, 0xAA, 0x45, 0x1E, 0xAB,
+ 0x00, 0x11, 0x34, 0x68, 0xEE, 0x2E, 0x77, 0x66, 0x6D, 0x06, 0x8A, 0x26, 0xD9, 0xE7, 0x48, 0x2D, 0xEF, 0x28, 0xED, 0xE4,
+ 0x01, 0x8E, 0xDB, 0x99, 0x30, 0x4D, 0x3A, 0xA6, 0x98, 0xC1, 0x42, 0x49, 0x22, 0x42, 0x52, 0xDF, 0x9B, 0x2F, 0x66, 0xF7,
+ 0x7E, 0x57, 0x3C, 0x4A, 0x38, 0x4D, 0x96, 0x8F, 0xCF, 0xAC, 0x29, 0xBE, 0x6B, 0x96, 0x6F, 0x79, 0xF0, 0xE1, 0xE7, 0x9E,
+ 0x79, 0xEA, 0xD5, 0xEB, 0x6F, 0xBC, 0x0F, 0x7B, 0x3C, 0x7C, 0xF0, 0x3A, 0xBE, 0xF3, 0x60, 0x68, 0x60, 0x0D, 0x4C, 0xA1,
+ 0x2E, 0xBE, 0xA2, 0xBA, 0x79, 0xA0, 0x20, 0xB5, 0x8C, 0x7D, 0xE7, 0xD4, 0x19, 0xEA, 0x88, 0xF2, 0x66, 0x62, 0x52, 0xEC,
+ 0xA0, 0xCD, 0xD8, 0xA3, 0x98, 0x27, 0x98, 0xC3, 0x85, 0xF4, 0xC9, 0x83, 0xE9, 0xB5, 0x26, 0x0A, 0xF1, 0x20, 0x30, 0x92,
+ 0xC7, 0x85, 0x6C, 0x60, 0xE8, 0x20, 0xE8, 0x80, 0xB6, 0x4D, 0x41, 0x56, 0x45, 0x4B, 0x6D, 0x0F, 0xF2, 0x05, 0x73, 0xB6,
+ 0x6D, 0x3D, 0x74, 0x60, 0xFF, 0xF1, 0xDB, 0x6E, 0x7D, 0x98, 0x8C, 0xE0, 0x8A, 0xCB, 0xAF, 0xBF, 0xFA, 0xEA, 0xDB, 0xAE,
+ 0x3C, 0x7A, 0x33, 0xEF, 0x01, 0xC5, 0x34, 0x56, 0x75, 0x51, 0x45, 0xD3, 0xCE, 0x0A, 0x0B, 0x09, 0x9F, 0x3B, 0x63, 0xC6,
+ 0x08, 0xBC, 0x04, 0x22, 0xE8, 0x28, 0x49, 0x97, 0x83, 0xF9, 0x77, 0xA2, 0x0F, 0x79, 0x65, 0xFE, 0xA9, 0xBB, 0x84, 0xE7,
+ 0xE0, 0x2E, 0x7E, 0x7B, 0x0A, 0x1D, 0x78, 0xE1, 0xDB, 0x4B, 0x60, 0xD1, 0xC1, 0xB4, 0xCE, 0xA6, 0xE9, 0xC1, 0xDA, 0x45,
+ 0xF3, 0x5D, 0x67, 0x72, 0xC2, 0x2C, 0x8B, 0x90, 0xE9, 0x9D, 0x25, 0x33, 0x69, 0x0A, 0xA4, 0x9B, 0x5E, 0xBD, 0x4E, 0x40,
+ 0x67, 0x82, 0x73, 0x42, 0x78, 0x1F, 0xB8, 0x30, 0x29, 0x90, 0xDF, 0xDC, 0x79, 0xB3, 0x66, 0xCC, 0x64, 0xD3, 0x19, 0x5C,
+ 0x9D, 0x89, 0x17, 0x5D, 0x0C, 0xC7, 0x82, 0x19, 0x8E, 0x68, 0x45, 0xDA, 0x5F, 0xA2, 0x86, 0xD8, 0xD0, 0x84, 0x2D, 0x9B,
+ 0xF6, 0xDF, 0x7D, 0xF7, 0xE3, 0xB4, 0x07, 0xF0, 0x09, 0xF2, 0xC2, 0x63, 0x57, 0xDC, 0x82, 0x3D, 0x2E, 0x19, 0x5A, 0x07,
+ 0x21, 0xA5, 0xA2, 0xA0, 0x1E, 0x57, 0x20, 0x3C, 0xD0, 0xCD, 0x27, 0x96, 0x32, 0x6E, 0x22, 0x5B, 0x45, 0x07, 0xD2, 0x86,
+ 0x92, 0xDD, 0x00, 0x32, 0xF5, 0x54, 0xF6, 0x8D, 0x36, 0xA6, 0x9C, 0xC1, 0x96, 0x21, 0x44, 0x61, 0xFE, 0xC2, 0x6F, 0x10,
+ 0xB5, 0x25, 0xD2, 0x02, 0x31, 0x3B, 0xB1, 0x32, 0xCB, 0xB2, 0x85, 0x02, 0x43, 0x39, 0xB6, 0x7A, 0x78, 0xDB, 0xEE, 0xDD,
+ 0x57, 0xDC, 0x72, 0xF3, 0x83, 0x07, 0xF6, 0x5C, 0x45, 0x77, 0xE8, 0xE6, 0x5B, 0x1F, 0x64, 0xC4, 0x7D, 0xDB, 0x6D, 0x0F,
+ 0x1D, 0xDC, 0x7F, 0x0D, 0xAE, 0x40, 0xE1, 0xC6, 0xBF, 0x83, 0x8E, 0xDF, 0x54, 0xDF, 0x06, 0xED, 0x3C, 0x74, 0x41, 0x80,
+ 0xC6, 0x24, 0x99, 0x5B, 0x04, 0x45, 0x49, 0xD9, 0x0F, 0xF8, 0x18, 0xB9, 0x5B, 0x8A, 0x89, 0xAA, 0x41, 0x66, 0x56, 0xEE,
+ 0xAF, 0xB8, 0xEB, 0x63, 0xCD, 0xDC, 0x4B, 0x45, 0x72, 0xD5, 0x20, 0xF3, 0x58, 0xE5, 0xC3, 0x68, 0x32, 0x23, 0x86, 0x26,
+ 0x52, 0x76, 0xC6, 0xA1, 0x0E, 0x87, 0x85, 0x91, 0x10, 0xB3, 0x14, 0x1D, 0x1D, 0xAB, 0x86, 0x4C, 0x23, 0x48, 0x49, 0x4E,
+ 0xEE, 0x5C, 0xDB, 0xB9, 0xD0, 0xDA, 0x58, 0x27, 0x79, 0x02, 0x1A, 0x8C, 0xC2, 0xFD, 0x64, 0xA0, 0x4F, 0xDE, 0x82, 0x43,
+ 0x90, 0xB9, 0x83, 0xAD, 0x34, 0xEC, 0x20, 0x11, 0xD3, 0xF3, 0x1A, 0x7F, 0xC1, 0x85, 0x42, 0x22, 0x3E, 0xFD, 0xCC, 0x73,
+ 0xCE, 0x18, 0xC7, 0xD8, 0xE4, 0x81, 0x47, 0x9E, 0x7B, 0xFA, 0xA9, 0x57, 0xEF, 0xB9, 0xE7, 0xB1, 0xE3, 0x57, 0xDF, 0xC1,
+ 0x37, 0xE1, 0x1C, 0x3B, 0x76, 0x0B, 0xE3, 0x1D, 0x1C, 0x62, 0xE5, 0x92, 0x8D, 0xDD, 0x9D, 0x8B, 0xE5, 0x5B, 0x71, 0x8A,
+ 0x5B, 0x18, 0x78, 0x71, 0x1A, 0x34, 0x3D, 0x3E, 0x1A, 0x99, 0x12, 0xAE, 0x62, 0x4C, 0x7D, 0xCE, 0x58, 0x9F, 0x14, 0xD6,
+ 0xF0, 0x8B, 0xB9, 0x6B, 0xDE, 0x61, 0x12, 0x43, 0x2A, 0x06, 0xF4, 0xFC, 0x4A, 0x76, 0xB5, 0x24, 0xA4, 0x53, 0x67, 0xC0,
+ 0x88, 0x85, 0xB9, 0x5D, 0x92, 0x59, 0x49, 0x8B, 0x94, 0x6E, 0x39, 0x18, 0x78, 0xFB, 0x6D, 0x8F, 0xDC, 0x73, 0xD7, 0x13,
+ 0xF4, 0x24, 0xEE, 0xBC, 0xFB, 0xF1, 0x07, 0x1F, 0xFC, 0x3A, 0xD2, 0xBF, 0xFF, 0xFE, 0xA7, 0x09, 0x4E, 0xD7, 0x5C, 0x7D,
+ 0xC7, 0xD1, 0xCB, 0x6F, 0x5A, 0xB7, 0x76, 0x17, 0xBD, 0x13, 0x8A, 0x09, 0xF6, 0x17, 0x13, 0xC6, 0x66, 0x4E, 0x99, 0x2E,
+ 0x29, 0xBF, 0xF1, 0x39, 0x05, 0x1C, 0x47, 0xE2, 0x1E, 0x9A, 0x8F, 0xD7, 0x1B, 0xCC, 0x75, 0x18, 0x4B, 0xFC, 0xC0, 0x6B,
+ 0xF8, 0xA3, 0xC7, 0x8D, 0x42, 0x80, 0xC1, 0xBA, 0x91, 0x9A, 0xF2, 0x00, 0xB8, 0x90, 0x61, 0x8B, 0x09, 0xE8, 0x12, 0x52,
+ 0x82, 0x23, 0xF9, 0xD6, 0x25, 0x1E, 0x27, 0x23, 0xE4, 0xB5, 0x94, 0x6D, 0x29, 0xAA, 0x8A, 0x66, 0xD2, 0x6B, 0x36, 0xF5,
+ 0x45, 0xB2, 0xD1, 0xD5, 0x21, 0x16, 0x58, 0xB2, 0x85, 0x4B, 0x43, 0x12, 0x6A, 0x9E, 0x74, 0xE8, 0x4C, 0xC5, 0x48, 0x84,
+ 0x24, 0x84, 0x92, 0x2C, 0x6A, 0x77, 0x01, 0xB7, 0x10, 0x65, 0x40, 0x22, 0x9E, 0x38, 0xE9, 0xDC, 0xAF, 0xC9, 0x16, 0x87,
+ 0xAC, 0xA4, 0x7C, 0x6C, 0xF0, 0xBE, 0xFB, 0x9E, 0xBA, 0xEE, 0xF8, 0x9D, 0x00, 0xC2, 0xD1, 0x23, 0x37, 0x90, 0xA8, 0xD0,
+ 0x2D, 0xC0, 0x24, 0xA1, 0x96, 0x0E, 0x0F, 0xAD, 0x87, 0xB0, 0xC5, 0x6E, 0x03, 0xC8, 0x2F, 0x18, 0x66, 0x4E, 0xD2, 0xC8,
+ 0xD1, 0x35, 0x08, 0x1A, 0x05, 0xA8, 0x37, 0x90, 0xF0, 0x70, 0x8C, 0x1B, 0x8E, 0xC2, 0x86, 0x06, 0xC2, 0x38, 0x5C, 0x5B,
+ 0xD9, 0x4E, 0xC1, 0xB1, 0xFC, 0x4C, 0x26, 0x98, 0x9D, 0x65, 0x70, 0x5C, 0x47, 0x2D, 0xD1, 0x98, 0xD6, 0x2C, 0x95, 0x20,
+ 0x73, 0x6C, 0x58, 0x1D, 0x77, 0xDC, 0xFE, 0x28, 0x89, 0xD9, 0x93, 0x4F, 0xBE, 0x74, 0xC7, 0x6D, 0x0F, 0x73, 0x77, 0xD7,
+ 0xF6, 0x23, 0x03, 0x1D, 0xC3, 0x7D, 0xDD, 0xCB, 0xF8, 0xA7, 0xD0, 0xF1, 0xD6, 0xAF, 0xDF, 0xD5, 0x54, 0xDF, 0x45, 0x53,
+ 0x8B, 0x39, 0x2B, 0xEE, 0x45, 0x8A, 0xA1, 0x88, 0xA4, 0x0A, 0xF0, 0x62, 0x8E, 0x48, 0xDC, 0x98, 0xBF, 0x75, 0x05, 0xEB,
+ 0x1F, 0x8E, 0x1F, 0x78, 0xE3, 0xA7, 0x35, 0x5E, 0xC5, 0x10, 0x37, 0x8F, 0x14, 0x1E, 0x0A, 0xB5, 0x0F, 0xFF, 0x43, 0x67,
+ 0xF1, 0xDC, 0x15, 0x69, 0x86, 0x40, 0x71, 0x4D, 0x60, 0x8C, 0x07, 0x0F, 0xDE, 0xD0, 0x17, 0xA5, 0x01, 0xA7, 0x0C, 0x17,
+ 0xEB, 0x19, 0x5E, 0x36, 0xC7, 0x18, 0x2A, 0x98, 0x36, 0x4A, 0x35, 0x35, 0xD4, 0xEC, 0x85, 0x7E, 0x0B, 0xD0, 0xA4, 0xAD,
+ 0x2E, 0x5A, 0x9E, 0xB3, 0xA6, 0x4D, 0xA5, 0xE1, 0x7B, 0x9A, 0xCF, 0x59, 0x4C, 0xE1, 0xAF, 0xBD, 0xE6, 0xCE, 0x07, 0x1E,
+ 0x7A, 0xF6, 0xA1, 0x87, 0x9E, 0xBD, 0xFD, 0xF6, 0x07, 0xB1, 0x50, 0xBA, 0x05, 0x57, 0x1F, 0xBB, 0xF5, 0xC8, 0xA1, 0xEB,
+ 0x48, 0x64, 0xE9, 0xA6, 0x6D, 0x5C, 0xBD, 0x83, 0x4C, 0x09, 0xAE, 0x35, 0x6C, 0xC6, 0x46, 0x73, 0x42, 0x7A, 0x41, 0xAA,
+ 0x1C, 0x67, 0xC0, 0x4C, 0x38, 0x33, 0x39, 0x1D, 0xE6, 0x84, 0x94, 0x99, 0x09, 0x69, 0x24, 0x5D, 0xC2, 0x52, 0x30, 0xDF,
+ 0x85, 0x00, 0xF9, 0x1E, 0x8E, 0x17, 0x4C, 0xE1, 0xF4, 0x98, 0x1C, 0x78, 0x44, 0x9C, 0xD1, 0xC4, 0xA0, 0xA6, 0x91, 0xAF,
+ 0x67, 0xE2, 0x4B, 0xFB, 0x5A, 0x06, 0xF7, 0xEC, 0xBA, 0x02, 0x87, 0xBB, 0xFF, 0xBE, 0x67, 0x30, 0xFF, 0x9B, 0x6E, 0xB8,
+ 0x97, 0x6D, 0x77, 0xB8, 0xC8, 0xC2, 0x39, 0xC1, 0x6C, 0x4D, 0xC4, 0x2C, 0xE8, 0x11, 0x01, 0xA4, 0x2D, 0x75, 0x1D, 0xA4,
+ 0x49, 0x0D, 0x35, 0x8B, 0xF0, 0x06, 0x88, 0x81, 0xBC, 0x79, 0x96, 0xA6, 0x43, 0xC4, 0x67, 0x09, 0x06, 0xA1, 0xCC, 0x4D,
+ 0x1D, 0xF4, 0xF7, 0x3A, 0x81, 0x92, 0x0D, 0x25, 0x66, 0x10, 0x0F, 0x6C, 0x36, 0x39, 0x86, 0x99, 0xA2, 0x44, 0x25, 0x91,
+ 0x66, 0xB8, 0xD0, 0x89, 0xF9, 0x1B, 0x14, 0x90, 0x99, 0x9C, 0x8A, 0x8F, 0x4B, 0x81, 0x47, 0x1C, 0x0B, 0x8D, 0xC4, 0x7E,
+ 0x4D, 0x7B, 0xD6, 0xB7, 0xBA, 0xA2, 0x9E, 0x7F, 0x49, 0xB2, 0x61, 0xC8, 0xDF, 0x86, 0x63, 0x23, 0xA8, 0x25, 0x3D, 0x51,
+ 0x75, 0x20, 0x13, 0x3C, 0x5C, 0x75, 0x1A, 0x4A, 0x8B, 0x8E, 0x91, 0x59, 0x26, 0x6F, 0x71, 0xF8, 0xA9, 0x5A, 0xE2, 0x6A,
+ 0xC5, 0x44, 0x91, 0x45, 0xCB, 0x81, 0x61, 0x13, 0xDD, 0x18, 0x7A, 0x93, 0xF4, 0x27, 0x6E, 0xBD, 0xF9, 0x81, 0xDB, 0xEE,
+ 0x78, 0xE4, 0xE1, 0x87, 0xBE, 0xF1, 0xC8, 0x43, 0x12, 0x12, 0xEE, 0xBA, 0xF3, 0x71, 0x1E, 0x41, 0x07, 0xBB, 0x76, 0x5E,
+ 0xB1, 0x6E, 0xCD, 0x8E, 0x15, 0x4B, 0x37, 0x61, 0x9B, 0x3D, 0x9D, 0x7C, 0x6D, 0xE0, 0x80, 0xE8, 0x80, 0x6D, 0x20, 0x85,
+ 0xF5, 0x25, 0x99, 0xE5, 0x6C, 0x1B, 0x2D, 0xCD, 0xAA, 0x80, 0xA2, 0x90, 0x9B, 0x98, 0x2F, 0x47, 0x21, 0x16, 0xD7, 0x65,
+ 0xC4, 0xE6, 0xE6, 0x25, 0x71, 0xC0, 0x33, 0x67, 0xC0, 0x96, 0xC0, 0x40, 0xA5, 0xCE, 0x82, 0x3F, 0x09, 0xCB, 0x91, 0x56,
+ 0x39, 0xDC, 0x19, 0xE1, 0xA4, 0x36, 0xF4, 0xF2, 0x6A, 0xFB, 0xF7, 0x5F, 0xCD, 0x78, 0x80, 0x20, 0x74, 0xCD, 0x55, 0xB7,
+ 0xAD, 0x5A, 0xBE, 0x25, 0x3C, 0x30, 0xF6, 0x74, 0x9F, 0xB3, 0x6C, 0xDA, 0xA6, 0x17, 0x9C, 0x6D, 0x0B, 0x07, 0x60, 0xE9,
+ 0xE2, 0xB5, 0x75, 0xD5, 0x2D, 0xCA, 0x82, 0xA1, 0x1D, 0x22, 0xB5, 0x5E, 0x90, 0xF0, 0x2A, 0x94, 0x8F, 0x8D, 0x0E, 0xC2,
+ 0x43, 0x25, 0x0B, 0x38, 0x09, 0x88, 0xC8, 0x4D, 0x05, 0xB2, 0x44, 0x07, 0x63, 0xA5, 0x3F, 0x42, 0x48, 0x32, 0x24, 0x2D,
+ 0xB0, 0x3B, 0x24, 0x1C, 0xA0, 0x80, 0xB6, 0x46, 0xDA, 0x3E, 0x6B, 0x86, 0x2F, 0x0D, 0x2F, 0x18, 0x03, 0xD8, 0x29, 0x03,
+ 0x10, 0x7C, 0x85, 0xDD, 0x58, 0x58, 0x01, 0x00, 0xA2, 0xFC, 0x6F, 0x65, 0xD2, 0xA1, 0x03, 0x95, 0xBE, 0xF5, 0x24, 0x0D,
+ 0xE6, 0xFA, 0x82, 0x2E, 0xC9, 0x0E, 0xC6, 0x47, 0xB8, 0x43, 0xAA, 0x30, 0xD5, 0x8D, 0xCE, 0x34, 0xB4, 0xBF, 0x48, 0x12,
+ 0xC9, 0x77, 0x3B, 0xA1, 0x8C, 0xA9, 0x97, 0x48, 0xE7, 0x9D, 0xF1, 0x21, 0x72, 0xBF, 0xF7, 0xDE, 0x27, 0x1F, 0x78, 0xE8,
+ 0xB9, 0xFB, 0x1E, 0xF8, 0x3A, 0xA0, 0xF4, 0xC0, 0x03, 0xCF, 0x3C, 0xF2, 0xC8, 0x37, 0x58, 0x24, 0x8E, 0x97, 0x6D, 0x3B,
+ 0xC4, 0x13, 0x56, 0x0F, 0x6F, 0xE5, 0xC8, 0x6B, 0x86, 0xCF, 0x10, 0x00, 0xE8, 0x36, 0x37, 0x55, 0x89, 0x45, 0xB7, 0xD4,
+ 0x75, 0xB3, 0x69, 0x92, 0x38, 0xC1, 0xD7, 0x8A, 0x72, 0xC8, 0x3F, 0x5A, 0x61, 0x31, 0x91, 0xAF, 0xCA, 0xAF, 0xA7, 0xB6,
+ 0x90, 0x60, 0x9E, 0x51, 0x01, 0xF2, 0xB4, 0x35, 0x0D, 0xA0, 0x03, 0xF9, 0xE2, 0xE8, 0xB6, 0xC5, 0xE8, 0x92, 0xD1, 0xD8,
+ 0x75, 0xC7, 0xEF, 0x42, 0x01, 0xB7, 0xDE, 0xF9, 0x08, 0x0E, 0x91, 0x18, 0x99, 0x26, 0x89, 0x9A, 0x49, 0x11, 0x18, 0x74,
+ 0x43, 0xE5, 0x27, 0x8B, 0x33, 0xE9, 0x82, 0xA4, 0x0D, 0x64, 0x53, 0x83, 0x7D, 0x2B, 0xE8, 0x68, 0xD5, 0x54, 0xB6, 0x20,
+ 0x22, 0xD4, 0x20, 0x19, 0xAA, 0x22, 0x92, 0x64, 0x47, 0x92, 0x1A, 0x99, 0x40, 0xED, 0x44, 0x08, 0x55, 0x86, 0x4D, 0x52,
+ 0x7D, 0xDC, 0xD4, 0xC5, 0x61, 0xEF, 0x3A, 0x00, 0x12, 0x65, 0x98, 0x71, 0x0E, 0x23, 0x31, 0x8E, 0x6A, 0x13, 0xB0, 0xA2,
+ 0x9A, 0x15, 0xE2, 0x85, 0x7C, 0x43, 0x52, 0x1E, 0xE7, 0x4E, 0x32, 0x2F, 0x65, 0x76, 0xCA, 0xA8, 0x8F, 0xD4, 0x18, 0x46,
+ 0xBB, 0x28, 0x3F, 0x50, 0x38, 0x97, 0x8A, 0x36, 0x4A, 0x63, 0xD2, 0x30, 0xEE, 0xA2, 0x93, 0x13, 0xCC, 0x5D, 0x1D, 0x08,
+ 0x25, 0x4B, 0x88, 0x37, 0x86, 0xA7, 0xA5, 0xF1, 0x79, 0x34, 0x5B, 0x5B, 0x7C, 0x02, 0x50, 0xA2, 0x6E, 0x68, 0x6A, 0xEC,
+ 0x04, 0xF7, 0x89, 0xC3, 0xE4, 0x45, 0xF7, 0x3F, 0xF8, 0xEC, 0x8B, 0x2F, 0xBF, 0xF5, 0xF2, 0xCB, 0xDF, 0x7F, 0xF9, 0xD5,
+ 0xB7, 0x5F, 0xF9, 0xD6, 0x0F, 0x1F, 0x7E, 0xF4, 0x79, 0xF4, 0xF1, 0xD0, 0x83, 0xCF, 0x91, 0x3B, 0x6E, 0xD9, 0x78, 0x90,
+ 0x9A, 0x16, 0x13, 0xA6, 0x92, 0xA2, 0x90, 0xE6, 0x62, 0xED, 0xCA, 0xCB, 0xA0, 0x4A, 0x0A, 0x19, 0x82, 0x01, 0x40, 0x43,
+ 0x0F, 0x23, 0x20, 0xBE, 0x34, 0x5D, 0xBE, 0x9B, 0xB2, 0xB9, 0x8F, 0xC7, 0xE9, 0x43, 0x34, 0xD5, 0x75, 0x93, 0xF8, 0x12,
+ 0x7E, 0x07, 0x16, 0x0D, 0x2F, 0x5D, 0xBC, 0x7E, 0xCD, 0xAA, 0xED, 0x5B, 0x37, 0xEF, 0x27, 0xD2, 0xE0, 0x5E, 0x84, 0x5F,
+ 0xE2, 0xF0, 0x3D, 0x77, 0x3F, 0x49, 0xCC, 0xBF, 0xE0, 0x9C, 0x8B, 0x10, 0xF7, 0x19, 0x67, 0x9C, 0xC5, 0x84, 0x15, 0x14,
+ 0x1A, 0x7F, 0xF1, 0x85, 0x13, 0x2E, 0x18, 0xCF, 0xD6, 0x23, 0xB6, 0xE3, 0x69, 0x4A, 0x4D, 0x83, 0x84, 0xAD, 0xFA, 0xCD,
+ 0x1C, 0x5A, 0x5F, 0xDB, 0xA5, 0xDF, 0x04, 0x63, 0x0A, 0x05, 0x47, 0xD0, 0x24, 0xAF, 0x4E, 0xAD, 0xE0, 0xC9, 0x50, 0x47,
+ 0xE9, 0x40, 0x13, 0x47, 0xDB, 0x4A, 0x73, 0x87, 0x8B, 0x71, 0x89, 0x61, 0xB0, 0x77, 0x25, 0x72, 0xD2, 0x5D, 0x01, 0x3A,
+ 0xB0, 0x2F, 0x86, 0xA2, 0x9C, 0x6F, 0x06, 0x2F, 0x1C, 0xE9, 0xE3, 0x16, 0x81, 0x01, 0x41, 0x54, 0x58, 0xD8, 0xA9, 0xA1,
+ 0x96, 0x48, 0x2E, 0x2C, 0x34, 0x26, 0x08, 0x3C, 0x11, 0x51, 0xF1, 0x91, 0xB2, 0x4B, 0x54, 0x5E, 0xD6, 0xD5, 0x81, 0xF2,
+ 0x1B, 0x8D, 0x1F, 0xC8, 0x73, 0x48, 0x37, 0x75, 0x94, 0x2F, 0x89, 0x79, 0x28, 0x39, 0x92, 0x99, 0xA0, 0x05, 0x88, 0x1A,
+ 0x1C, 0xC6, 0xFC, 0x82, 0x60, 0xB0, 0x88, 0x93, 0x63, 0xE1, 0xF8, 0xAF, 0x5B, 0xB5, 0x63, 0xC3, 0xBA, 0x5D, 0x07, 0xF6,
+ 0x1D, 0x23, 0x17, 0x7A, 0xEA, 0xA9, 0x97, 0x9F, 0xFF, 0xE6, 0xF7, 0xBE, 0xFE, 0xDC, 0xEB, 0xAF, 0xBD, 0xF6, 0xF6, 0xB3,
+ 0xCF, 0xBE, 0xFA, 0xCD, 0x6F, 0xBE, 0xF1, 0xDC, 0x73, 0xAF, 0x3F, 0xF2, 0xD8, 0x0B, 0xE8, 0x86, 0xF4, 0x11, 0xDA, 0x36,
+ 0xB1, 0x81, 0xA6, 0xC2, 0xEA, 0x65, 0x9B, 0xF9, 0xDA, 0x2E, 0x88, 0xAA, 0x74, 0x17, 0x54, 0xCA, 0x24, 0xFB, 0xCB, 0x06,
+ 0xD6, 0x12, 0x33, 0xC8, 0x29, 0x71, 0x17, 0x1E, 0xA1, 0xF3, 0xC1, 0x33, 0x65, 0x28, 0x7F, 0xE0, 0x38, 0x64, 0x6F, 0xCA,
+ 0x0E, 0xDA, 0x0F, 0x87, 0x0F, 0x5E, 0x7B, 0xFC, 0xEA, 0x5B, 0xAF, 0xB9, 0xE6, 0x76, 0xDC, 0x8E, 0x71, 0x31, 0xBF, 0x82,
+ 0x78, 0x2A, 0x93, 0xB2, 0x33, 0x65, 0x50, 0x33, 0x75, 0xE2, 0x25, 0xEC, 0x56, 0x67, 0x31, 0x11, 0x63, 0x34, 0xC6, 0x67,
+ 0xE7, 0x98, 0x67, 0x65, 0x43, 0x11, 0xD5, 0x70, 0x23, 0x16, 0x69, 0x12, 0xF8, 0x2C, 0x35, 0xA0, 0xA9, 0x99, 0x25, 0x4D,
+ 0x72, 0x32, 0x51, 0x97, 0x76, 0x0E, 0x04, 0x49, 0xC0, 0x90, 0x14, 0x56, 0xB0, 0xC8, 0x2A, 0xC0, 0x9B, 0xBF, 0x8B, 0x09,
+ 0x43, 0xA5, 0x0F, 0x33, 0xB1, 0x37, 0x28, 0x0A, 0x59, 0x43, 0x4F, 0x67, 0x70, 0x48, 0x0A, 0x81, 0xF8, 0xC8, 0xE8, 0x49,
+ 0xE4, 0x81, 0xC2, 0x89, 0x17, 0x4E, 0x20, 0xA1, 0xD4, 0xC6, 0x00, 0x9D, 0x4B, 0x07, 0x8B, 0x22, 0xA3, 0x84, 0x41, 0x46,
+ 0x05, 0xE0, 0x38, 0x84, 0xBB, 0x37, 0xC8, 0xC4, 0x6A, 0x8B, 0x45, 0xC2, 0xD0, 0x0E, 0x17, 0x92, 0x1D, 0xB4, 0x7D, 0xD8,
+ 0x67, 0x1A, 0x9D, 0x30, 0x1C, 0xA9, 0xF5, 0x03, 0x44, 0x0D, 0x0C, 0x9E, 0xF8, 0x24, 0xC4, 0x52, 0x52, 0x8E, 0x86, 0xDA,
+ 0x0E, 0xEA, 0x03, 0x86, 0x88, 0x9B, 0xD6, 0xEF, 0x04, 0x19, 0x38, 0xB5, 0x02, 0x08, 0x7A, 0xEA, 0xA9, 0x17, 0x7F, 0xF4,
+ 0xA3, 0xF7, 0x7F, 0xF0, 0x83, 0x9F, 0x3F, 0xF3, 0xCC, 0xCB, 0xDF, 0x7E, 0xE3, 0xC7, 0xAF, 0xBD, 0xF6, 0x43, 0x4D, 0x1C,
+ 0xC1, 0x71, 0x34, 0xB1, 0x7F, 0xC7, 0x95, 0xDB, 0x36, 0xED, 0x67, 0xE3, 0x34, 0x0E, 0x84, 0x32, 0x56, 0x0E, 0x6F, 0xA2,
+ 0xF5, 0x8F, 0x99, 0x93, 0xED, 0xE0, 0x4F, 0x58, 0x3A, 0x7D, 0xA7, 0xDD, 0x97, 0x5D, 0x4E, 0x2B, 0xD0, 0x04, 0xF6, 0xEB,
+ 0xA9, 0xBC, 0x30, 0x79, 0x62, 0xCC, 0x7D, 0xF7, 0x3E, 0x8D, 0xA6, 0xAF, 0x3E, 0x76, 0x33, 0xA1, 0xF8, 0xAA, 0x2B, 0x6F,
+ 0xD9, 0xBC, 0x79, 0x5F, 0x62, 0x64, 0x06, 0x22, 0x86, 0x0B, 0x4B, 0x05, 0x43, 0x70, 0x62, 0x33, 0x8B, 0xB3, 0xA6, 0x4E,
+ 0xF7, 0x9D, 0x3C, 0x95, 0x4C, 0x1A, 0x65, 0xB0, 0x13, 0x04, 0x80, 0x02, 0x9F, 0x39, 0xEB, 0x8A, 0x83, 0xCE, 0x81, 0x6B,
+ 0xBA, 0x81, 0xD2, 0xBD, 0xA0, 0x49, 0x47, 0x54, 0x30, 0x0E, 0x61, 0xF0, 0x47, 0x3E, 0xA6, 0xB9, 0x8D, 0x8A, 0x0C, 0x8C,
+ 0x51, 0x98, 0x1A, 0xD1, 0x81, 0x42, 0x87, 0x75, 0x02, 0x01, 0x22, 0x73, 0x6A, 0x87, 0x39, 0x58, 0x2B, 0x64, 0x8E, 0xEF,
+ 0x6C, 0x4C, 0x9E, 0xC1, 0xF4, 0x39, 0xE7, 0x9C, 0x8D, 0x0F, 0xA2, 0x7F, 0xA2, 0xB1, 0x34, 0xEB, 0x69, 0xB9, 0xF8, 0x07,
+ 0x21, 0x38, 0x09, 0xF4, 0x80, 0x7B, 0xB0, 0x70, 0xB6, 0x14, 0x6D, 0x0C, 0xE8, 0xCB, 0xFE, 0x2C, 0xD4, 0x36, 0xE2, 0x0D,
+ 0x91, 0x44, 0x0B, 0x93, 0xC2, 0x86, 0x4B, 0x89, 0x60, 0xA8, 0xF0, 0xF8, 0x81, 0x79, 0x7F, 0x92, 0xD5, 0x85, 0x84, 0x2C,
+ 0x0C, 0x04, 0xFA, 0x18, 0xBF, 0x10, 0x81, 0xC8, 0xE8, 0x31, 0x25, 0x66, 0xF7, 0x18, 0x2C, 0x3B, 0x2C, 0xC9, 0xE2, 0x43,
+ 0x65, 0xEA, 0x1B, 0x91, 0x1E, 0x9F, 0xD3, 0xDD, 0x36, 0x48, 0xFB, 0xFE, 0xC1, 0x07, 0x9E, 0x7D, 0xF6, 0xD9, 0xD7, 0x5E,
+ 0xFE, 0xD6, 0xF7, 0x5F, 0x7C, 0xE5, 0x7B, 0xCF, 0x3D, 0xFF, 0x1D, 0x74, 0x40, 0x4F, 0x89, 0x98, 0xC1, 0xC5, 0xE5, 0x97,
+ 0xDF, 0xC0, 0x77, 0x8D, 0x23, 0x44, 0x0C, 0x99, 0x0E, 0x07, 0x2E, 0x62, 0x94, 0x77, 0xCB, 0x9D, 0x77, 0x3C, 0x76, 0xDD,
+ 0x75, 0x77, 0x91, 0x53, 0x91, 0x71, 0xDE, 0x7D, 0xEF, 0x93, 0x32, 0x97, 0xBF, 0xE5, 0x81, 0xFB, 0xEF, 0x7F, 0xF2, 0x9E,
+ 0x7B, 0x9E, 0xF8, 0xC6, 0x37, 0xBE, 0xFD, 0xCC, 0x33, 0xAF, 0x82, 0x3F, 0x38, 0x99, 0xD4, 0x83, 0x37, 0x3F, 0xC8, 0xD3,
+ 0x2E, 0xDB, 0x72, 0x28, 0x2E, 0x2C, 0x19, 0x1D, 0x40, 0x3B, 0x43, 0xF4, 0xF3, 0xA7, 0xCB, 0xE4, 0x47, 0x13, 0x68, 0xEC,
+ 0xCF, 0xB4, 0xC1, 0x67, 0x12, 0x00, 0x7C, 0xA7, 0x4F, 0x63, 0x97, 0xD1, 0x85, 0xE3, 0xCE, 0x23, 0x99, 0xF6, 0x9D, 0xCA,
+ 0x50, 0x73, 0x56, 0x70, 0x80, 0xEA, 0x20, 0x42, 0x5A, 0xB9, 0x76, 0x37, 0x86, 0xCD, 0x97, 0xDC, 0x4E, 0x06, 0x85, 0xBA,
+ 0x8F, 0x95, 0xBB, 0xBD, 0x50, 0xFB, 0x15, 0x0F, 0x40, 0x46, 0x2C, 0x34, 0x16, 0x20, 0xAD, 0x79, 0xC4, 0x6D, 0xDA, 0xBF,
+ 0x32, 0x29, 0xD5, 0x7E, 0x24, 0x78, 0xAD, 0x0A, 0xD0, 0xFE, 0x94, 0xD9, 0x6A, 0x20, 0xD8, 0xA2, 0x7F, 0x6E, 0xD4, 0x20,
+ 0x83, 0x62, 0x93, 0xB0, 0x3A, 0x65, 0x1D, 0x04, 0x1B, 0xE3, 0x01, 0xD2, 0x1B, 0x10, 0xE0, 0x32, 0x6A, 0x60, 0x47, 0x5B,
+ 0x70, 0x60, 0x08, 0x6D, 0x77, 0x94, 0x6A, 0x06, 0x2C, 0xB3, 0xE8, 0xB1, 0x10, 0xC3, 0xB1, 0x2F, 0xD4, 0xBF, 0x78, 0x70,
+ 0x2D, 0x03, 0x03, 0x3C, 0x4F, 0x53, 0x11, 0xAD, 0x9C, 0x27, 0x5C, 0x30, 0x91, 0xE9, 0x1B, 0xA5, 0x2C, 0x12, 0x7C, 0xEA,
+ 0x89, 0x6F, 0xBE, 0xF0, 0xC2, 0xB7, 0x9F, 0x7E, 0xFA, 0xA5, 0xC7, 0x1E, 0x7B, 0x01, 0x95, 0x90, 0xCB, 0xD3, 0x59, 0x7A,
+ 0xE2, 0x89, 0x17, 0xB9, 0x25, 0xA7, 0x24, 0xB4, 0xE2, 0x34, 0x8F, 0x3F, 0xF9, 0xF2, 0x53, 0x4F, 0xBC, 0x74, 0xEF, 0x83,
+ 0x5F, 0xBF, 0xFD, 0xCE, 0xC7, 0xB8, 0xFB, 0xD8, 0x63, 0xDF, 0x78, 0xFC, 0xB1, 0x17, 0x5F, 0x27, 0x9C, 0x3C, 0xFC, 0x1C,
+ 0xD2, 0x07, 0xDC, 0xF8, 0xAB, 0xEF, 0x7E, 0xFB, 0x47, 0xAF, 0xBE, 0xFA, 0xFD, 0xE7, 0x5E, 0x78, 0xFD, 0x89, 0xA7, 0x5E,
+ 0x46, 0x13, 0x94, 0x23, 0xC7, 0xAE, 0xBC, 0x95, 0xD3, 0x19, 0x60, 0xFB, 0x72, 0x78, 0x0F, 0x5F, 0x73, 0xA1, 0xF3, 0x67,
+ 0x19, 0xBA, 0xF9, 0x8A, 0x1C, 0xA4, 0x2B, 0x6E, 0x68, 0x03, 0x2C, 0x99, 0xD9, 0xCD, 0xF2, 0x65, 0xA1, 0x27, 0x54, 0xA2,
+ 0x4D, 0x59, 0x69, 0x52, 0x19, 0x92, 0x99, 0x69, 0xD5, 0x99, 0x34, 0x69, 0xA1, 0x2C, 0x15, 0x97, 0x2A, 0x46, 0x7A, 0x76,
+ 0x2A, 0x7A, 0x5B, 0xFA, 0x3A, 0xF9, 0xBB, 0xF0, 0xC8, 0xA3, 0x65, 0xB3, 0x67, 0xB8, 0x90, 0x41, 0xB5, 0x07, 0x6B, 0xC7,
+ 0x23, 0x9A, 0xB7, 0x68, 0x4B, 0xD2, 0x34, 0xCA, 0xE5, 0xB5, 0x00, 0x13, 0xD1, 0x41, 0xB0, 0x34, 0x82, 0x34, 0xF5, 0xB4,
+ 0xFB, 0x0C, 0x34, 0x5B, 0x55, 0x14, 0x92, 0x97, 0xA5, 0x69, 0x6A, 0xB4, 0x6B, 0x4A, 0x18, 0x43, 0xC6, 0xF2, 0x0B, 0x64,
+ 0x04, 0xC8, 0xC7, 0x63, 0x8C, 0x95, 0x9F, 0x53, 0xDC, 0xD5, 0xDA, 0x0D, 0xCD, 0xDD, 0x7C, 0x91, 0x47, 0x2C, 0x29, 0x0A,
+ 0x95, 0x81, 0xC6, 0x3D, 0x91, 0xFD, 0x69, 0x9A, 0x90, 0x38, 0xAD, 0xA4, 0xA9, 0x93, 0xA6, 0x81, 0xEF, 0x77, 0xDD, 0xF1,
+ 0xB0, 0xC0, 0xD1, 0xB7, 0x7F, 0xF8, 0xDE, 0xBB, 0x1F, 0xBC, 0xFB, 0xEE, 0x6F, 0x89, 0x10, 0x44, 0x6C, 0x94, 0x41, 0x90,
+ 0xE0, 0xE2, 0x95, 0x6F, 0xFD, 0xE0, 0xD5, 0x57, 0xDF, 0x7E, 0xFC, 0xF1, 0x6F, 0x3E, 0xFB, 0xF5, 0xD7, 0x09, 0xE0, 0x2F,
+ 0xBD, 0xF2, 0xD6, 0x4B, 0x2F, 0xBD, 0xF9, 0xC6, 0xDB, 0x3F, 0x79, 0xE5, 0xB5, 0xB7, 0xB0, 0x7A, 0xAA, 0x0D, 0xA6, 0xF3,
+ 0x34, 0x44, 0xF1, 0x2A, 0x3A, 0xE4, 0x8C, 0x65, 0x68, 0xCD, 0xDE, 0x76, 0xCB, 0x83, 0x37, 0xDD, 0x70, 0x9F, 0xF6, 0x85,
+ 0x40, 0x33, 0x36, 0xDB, 0x4C, 0x9A, 0x30, 0x11, 0xD7, 0x07, 0x6A, 0xE0, 0x61, 0x08, 0x01, 0x60, 0xCE, 0x02, 0x5D, 0x0B,
+ 0x67, 0xF3, 0xCD, 0x3B, 0x73, 0x64, 0x8A, 0x39, 0x7B, 0x81, 0x79, 0x7C, 0x9E, 0x9A, 0xA6, 0x88, 0xC8, 0x5F, 0x98, 0x7D,
+ 0x90, 0x9D, 0x64, 0xC0, 0x67, 0x10, 0xC9, 0xA8, 0x41, 0x96, 0x48, 0xCC, 0x3F, 0x3C, 0xCA, 0x3F, 0x82, 0x2F, 0xB7, 0xE5,
+ 0x56, 0x74, 0x60, 0x13, 0x18, 0x23, 0x29, 0x43, 0x87, 0x86, 0x36, 0x1B, 0x2A, 0xBD, 0x65, 0xF0, 0x5A, 0xC9, 0xA0, 0x2A,
+ 0x68, 0x28, 0xAB, 0xDA, 0x80, 0xD4, 0xD6, 0x23, 0xFD, 0x48, 0x1D, 0x82, 0x1B, 0x20, 0x92, 0x4A, 0x44, 0xB0, 0xC5, 0x98,
+ 0xB6, 0x83, 0x48, 0xC6, 0xEA, 0xA3, 0x23, 0x63, 0x90, 0xBB, 0xEC, 0x9F, 0x06, 0x9A, 0xA4, 0x4B, 0x01, 0xEB, 0x4C, 0x6A,
+ 0x48, 0x90, 0x87, 0x61, 0x8B, 0xA6, 0xB3, 0xF4, 0x59, 0x3B, 0x9A, 0x3B, 0x37, 0xAE, 0xDE, 0xBA, 0xA4, 0x7F, 0x19, 0x3D,
+ 0x73, 0x2C, 0x8E, 0x0E, 0x3E, 0x3B, 0xA2, 0x48, 0x7F, 0x91, 0x3D, 0x32, 0xA7, 0x7D, 0x04, 0x4B, 0x87, 0x1F, 0x02, 0xE0,
+ 0xD9, 0x67, 0x9E, 0x75, 0xFA, 0xE9, 0x6C, 0xBC, 0x35, 0x1D, 0xBD, 0xA9, 0xB3, 0xD9, 0x50, 0x86, 0x2D, 0x7F, 0xEB, 0x5B,
+ 0x6F, 0xBD, 0xF5, 0xFD, 0x9F, 0xFC, 0xE2, 0x17, 0xBF, 0x7F, 0xFE, 0xF9, 0xD7, 0x5F, 0x79, 0xE5, 0xCD, 0x37, 0xBE, 0xFF,
+ 0xD3, 0x5F, 0xFF, 0xF6, 0xCF, 0xEF, 0xBC, 0xFB, 0xAB, 0x9F, 0xFC, 0xE4, 0x97, 0xEF, 0xBF, 0xFF, 0x87, 0xA7, 0x9F, 0x66,
+ 0xAB, 0xF1, 0xDB, 0x84, 0x8D, 0x6F, 0xBD, 0xFE, 0x23, 0xA2, 0xFA, 0x4B, 0x2F, 0xBD, 0xF1, 0xF0, 0x83, 0x7C, 0xDD, 0xF8,
+ 0x8D, 0x40, 0x5C, 0x4A, 0x62, 0x16, 0x9C, 0xD4, 0xB9, 0x33, 0xE0, 0x1B, 0xD3, 0xBC, 0x0A, 0x82, 0x2D, 0x40, 0x3A, 0x4B,
+ 0x43, 0x10, 0xAE, 0x31, 0x34, 0x4B, 0x52, 0x2C, 0xEA, 0xE1, 0x85, 0xFE, 0x81, 0x97, 0x8C, 0xBF, 0x58, 0xAA, 0x96, 0x39,
+ 0x01, 0x41, 0x73, 0x11, 0x37, 0xE4, 0x14, 0x61, 0x63, 0xC8, 0xA4, 0x48, 0x59, 0x04, 0x3A, 0xBE, 0x37, 0xB3, 0x7B, 0x9D,
+ 0x9D, 0xC9, 0xBE, 0x47, 0xFF, 0x30, 0x64, 0x2D, 0xFD, 0x98, 0x20, 0x86, 0x4B, 0x22, 0x43, 0xED, 0x57, 0x5B, 0x0F, 0xD0,
+ 0x0B, 0x1F, 0xA1, 0xBB, 0x3A, 0x74, 0x78, 0xDD, 0x48, 0x23, 0x20, 0xAE, 0xCD, 0x7D, 0xED, 0x26, 0x3A, 0x95, 0x94, 0x06,
+ 0x4C, 0x67, 0xC9, 0xEB, 0xAA, 0xF4, 0xD5, 0x03, 0xB4, 0xEC, 0xD6, 0x67, 0xCA, 0xF6, 0x1B, 0x04, 0x6D, 0xA4, 0x8F, 0x21,
+ 0xB3, 0xCC, 0xB4, 0x20, 0x2E, 0x36, 0x32, 0x8A, 0x6B, 0x43, 0x76, 0x97, 0xC3, 0x1B, 0xA9, 0xE9, 0x40, 0x36, 0x92, 0x5D,
+ 0x8C, 0x40, 0xBE, 0xC3, 0xC9, 0x7C, 0x95, 0x1F, 0x1F, 0x00, 0x2C, 0xA2, 0x87, 0xC3, 0x1E, 0x7F, 0x22, 0xDB, 0xC5, 0x17,
+ 0x4F, 0x90, 0x3A, 0xE8, 0x9C, 0x73, 0x49, 0x07, 0x85, 0x38, 0x35, 0x7E, 0xA2, 0x72, 0xA7, 0xB8, 0x86, 0xCC, 0xE3, 0x38,
+ 0x84, 0xD9, 0xA9, 0xA0, 0xED, 0x65, 0x1A, 0x3B, 0x8A, 0x2D, 0x4F, 0x3C, 0xF1, 0xC2, 0xD3, 0x4F, 0xBF, 0xF2, 0xE2, 0x2B,
+ 0xDF, 0x45, 0xEE, 0x6F, 0xBE, 0xF9, 0xD3, 0x37, 0xDF, 0x7C, 0xEF, 0xAD, 0xB7, 0xDE, 0x7B, 0xE3, 0xAD, 0x77, 0x5F, 0x7A,
+ 0xE9, 0x3B, 0x8F, 0x3E, 0xF1, 0xFC, 0x95, 0x57, 0xDD, 0xCA, 0x44, 0x88, 0x3D, 0x81, 0x28, 0x18, 0xA5, 0x8E, 0x29, 0xBB,
+ 0x24, 0xFC, 0x9E, 0x77, 0x21, 0xC2, 0xAA, 0x2E, 0xAB, 0x1D, 0xEC, 0x5F, 0x43, 0x75, 0x46, 0x30, 0xCF, 0xC9, 0x2C, 0x18,
+ 0x7F, 0xC1, 0xF9, 0xC2, 0xDA, 0x33, 0xC3, 0x1F, 0x23, 0x6B, 0xC7, 0xDE, 0xED, 0xEC, 0xDE, 0xD9, 0xF4, 0xE8, 0x0E, 0x32,
+ 0xC5, 0x4C, 0x0D, 0xC3, 0x55, 0x45, 0x8F, 0x0E, 0x54, 0x1F, 0xEA, 0x13, 0xD2, 0xAF, 0x35, 0xD0, 0x64, 0x74, 0x80, 0x02,
+ 0xDC, 0x2D, 0xB5, 0xE2, 0x07, 0xB2, 0xD3, 0xDC, 0x70, 0xC4, 0x9D, 0x2D, 0x63, 0x0E, 0x77, 0xDE, 0x5B, 0x56, 0x58, 0x4D,
+ 0xDA, 0xAE, 0x88, 0x94, 0xBB, 0x41, 0xB2, 0xEF, 0x4C, 0xFD, 0x40, 0x82, 0x41, 0x88, 0x58, 0xB7, 0xBE, 0x8E, 0xB8, 0x54,
+ 0x48, 0x3C, 0xB3, 0x72, 0xCD, 0x44, 0xB5, 0x4B, 0x8C, 0x1D, 0x01, 0x71, 0xD4, 0xF7, 0xC2, 0xCD, 0x9A, 0x2F, 0x9E, 0x4B,
+ 0x8F, 0x13, 0xFE, 0x2C, 0xA2, 0xE9, 0x6C, 0xEE, 0x09, 0x5A, 0x18, 0x8C, 0xF9, 0xD3, 0xB0, 0xC3, 0xFA, 0xF8, 0xCA, 0x21,
+ 0x72, 0x41, 0x72, 0x12, 0xDA, 0x47, 0xB2, 0xC8, 0x43, 0x48, 0x0D, 0x27, 0x5D, 0x42, 0x8E, 0xA0, 0xAE, 0xC0, 0xAF, 0x18,
+ 0x1E, 0x90, 0xF2, 0xF7, 0x72, 0xF8, 0x5F, 0xF7, 0x32, 0x9A, 0x77, 0x64, 0xFA, 0xA4, 0xA4, 0xF4, 0x94, 0x40, 0x24, 0xA2,
+ 0x02, 0xD1, 0xE2, 0xF1, 0xC7, 0x9F, 0x7B, 0x0A, 0xE4, 0x79, 0xE0, 0xEB, 0x77, 0xDF, 0xFD, 0x28, 0xE7, 0xFD, 0x40, 0xDE,
+ 0xBA, 0xE8, 0x9C, 0x8B, 0x75, 0x4A, 0x61, 0xE0, 0x4D, 0x0A, 0x2E, 0xA9, 0xC0, 0xCC, 0xB5, 0x6A, 0x05, 0xCB, 0xE0, 0x1B,
+ 0x08, 0x97, 0x2D, 0x5E, 0x4B, 0x46, 0xC0, 0x46, 0x20, 0xFE, 0x23, 0xA0, 0xAF, 0x40, 0xAF, 0xB3, 0x7B, 0x61, 0x48, 0x2C,
+ 0x70, 0xB8, 0x2A, 0x0A, 0xCE, 0x6C, 0xC5, 0x61, 0xA2, 0xE9, 0x0E, 0x90, 0x9D, 0xB1, 0x9A, 0x00, 0x86, 0x44, 0x66, 0x59,
+ 0xAA, 0x03, 0xEF, 0x22, 0xD6, 0xA2, 0x03, 0x27, 0x77, 0xD4, 0x4C, 0x86, 0x7C, 0x14, 0xC4, 0xD0, 0xAD, 0x64, 0x36, 0x66,
+ 0xBA, 0xBD, 0x27, 0x69, 0xCC, 0x8D, 0x2E, 0xB8, 0xE5, 0xAE, 0x45, 0x21, 0x92, 0x28, 0xFE, 0x04, 0x89, 0xC7, 0x87, 0x02,
+ 0x65, 0xB2, 0xA4, 0x9B, 0x24, 0x9B, 0x20, 0xA4, 0x0E, 0x10, 0xAD, 0x04, 0xB3, 0x71, 0xD3, 0x99, 0x6F, 0x00, 0xF7, 0x3C,
+ 0xD8, 0xD7, 0xBE, 0x98, 0x96, 0x0B, 0x4D, 0x1E, 0x44, 0x4F, 0xFD, 0x41, 0xC5, 0x87, 0x7F, 0xA8, 0x6D, 0x32, 0xC0, 0x21,
+ 0x26, 0xCF, 0x9C, 0x32, 0x95, 0xB6, 0x30, 0xEC, 0x1D, 0xDF, 0x99, 0x1C, 0x04, 0xA0, 0xCC, 0xB5, 0xE9, 0xDC, 0x45, 0xEE,
+ 0x08, 0x65, 0xDC, 0xD9, 0x92, 0x98, 0x63, 0xA1, 0xE4, 0x08, 0xE0, 0x03, 0x1A, 0xA2, 0xD5, 0x3A, 0xFE, 0xBC, 0x0B, 0x2E,
+ 0x38, 0xE7, 0xC2, 0x49, 0x17, 0x4D, 0x86, 0x1F, 0x5F, 0x5B, 0xD9, 0xBE, 0x62, 0xF9, 0x46, 0x9A, 0x0D, 0xD4, 0x5C, 0xB7,
+ 0xDE, 0xFE, 0x08, 0xD9, 0xED, 0x50, 0xFF, 0x30, 0x81, 0x4A, 0x63, 0x3B, 0x12, 0x17, 0x35, 0x9C, 0x7E, 0x3A, 0x28, 0x77,
+ 0xCE, 0xD9, 0x5F, 0xE3, 0xFF, 0x92, 0x5F, 0x8E, 0x28, 0xC3, 0xE7, 0x34, 0xEC, 0x17, 0xA5, 0xF6, 0xF7, 0x0E, 0x2F, 0x5F,
+ 0xB2, 0x8E, 0x58, 0xC5, 0x3F, 0x95, 0x01, 0x1C, 0xA2, 0x9F, 0x2F, 0x94, 0x61, 0x97, 0x30, 0xE1, 0x0C, 0xEE, 0x2D, 0x65,
+ 0xC8, 0x12, 0x87, 0x74, 0xB4, 0xA9, 0x88, 0x8D, 0x02, 0x34, 0x30, 0x9C, 0xBC, 0x7C, 0xA4, 0xA5, 0x63, 0x3A, 0x42, 0xDE,
+ 0x10, 0x4A, 0x19, 0x25, 0xC0, 0x6D, 0x3A, 0xCC, 0x8A, 0x30, 0x2A, 0x68, 0xDB, 0xEA, 0x93, 0x71, 0x9D, 0x48, 0xDF, 0x86,
+ 0x01, 0xC8, 0xC9, 0xE6, 0x69, 0x61, 0x62, 0xFE, 0x04, 0x73, 0x8D, 0xBA, 0x72, 0x0B, 0xDC, 0x9B, 0x0B, 0xEA, 0x00, 0x09,
+ 0x2D, 0xF4, 0x0E, 0x83, 0xA4, 0xD1, 0x04, 0x97, 0x62, 0xCA, 0xF8, 0x4B, 0xA0, 0xF6, 0x73, 0xAE, 0x2E, 0x07, 0x01, 0x67,
+ 0x24, 0xA5, 0x61, 0x65, 0x00, 0x3D, 0x86, 0x4D, 0x06, 0x8C, 0x7C, 0xB1, 0xF7, 0x59, 0x97, 0x0A, 0x15, 0x85, 0x48, 0xC8,
+ 0xAF, 0xF8, 0x86, 0x15, 0x19, 0xC7, 0xCB, 0x44, 0x5E, 0x58, 0x11, 0x74, 0x55, 0xF1, 0x06, 0x60, 0x0A, 0xAB, 0x95, 0xA3,
+ 0x00, 0xCE, 0x95, 0xFD, 0x84, 0xA7, 0xFC, 0x39, 0x7F, 0xDC, 0x05, 0xA4, 0xEA, 0x42, 0x54, 0xAD, 0x6C, 0xE0, 0x84, 0x1E,
+ 0xF2, 0x16, 0x95, 0x3B, 0x2A, 0xE0, 0x96, 0xBA, 0x97, 0x89, 0x05, 0xE0, 0x36, 0x79, 0xC2, 0x45, 0x32, 0xBD, 0x18, 0x3F,
+ 0x41, 0x0E, 0xDE, 0x38, 0xEB, 0x6C, 0xED, 0x43, 0x9C, 0x77, 0xDE, 0x79, 0x6C, 0x1A, 0x1C, 0xEC, 0x5F, 0xD9, 0xB3, 0x68,
+ 0x39, 0xA7, 0x30, 0xC0, 0xC0, 0xA4, 0xCD, 0x4E, 0x6C, 0x20, 0x81, 0x36, 0x5C, 0x15, 0x93, 0xF9, 0xC8, 0x4E, 0x6C, 0xB9,
+ 0xB0, 0x3A, 0xB0, 0x33, 0x64, 0x51, 0x80, 0x0A, 0x5D, 0x5C, 0xE1, 0x14, 0xD2, 0xC7, 0x09, 0x78, 0xDC, 0x47, 0x73, 0x79,
+ 0x3A, 0x88, 0xEA, 0x07, 0xCE, 0x52, 0xE9, 0x87, 0x4B, 0x20, 0xB5, 0x6A, 0x70, 0x35, 0x21, 0xC5, 0xB0, 0xED, 0xCA, 0xAA,
+ 0xE8, 0xD5, 0x63, 0xC4, 0x0F, 0x8C, 0xB8, 0x61, 0x8E, 0xB2, 0xDC, 0x6B, 0x7D, 0xC4, 0xFC, 0xD6, 0x74, 0xE8, 0x94, 0xF0,
+ 0x0D, 0x03, 0x87, 0x4C, 0xE3, 0xDC, 0xAF, 0x8D, 0xBB, 0xF8, 0xC2, 0xF1, 0xE7, 0x8C, 0x3B, 0x57, 0x51, 0x05, 0x99, 0x02,
+ 0xF7, 0xD8, 0x3E, 0x29, 0x36, 0x26, 0x2F, 0x0C, 0x38, 0x93, 0x7E, 0x28, 0x25, 0x42, 0x77, 0xFD, 0x4B, 0x16, 0x38, 0x73,
+ 0x0E, 0xC4, 0x45, 0xCA, 0x25, 0x8C, 0x97, 0xAD, 0xFF, 0x98, 0xA7, 0xD3, 0xCB, 0x51, 0xC9, 0x49, 0x53, 0x41, 0x66, 0xA2,
+ 0x62, 0xE8, 0xA7, 0x09, 0x11, 0x5A, 0x20, 0xFE, 0xDC, 0x71, 0x08, 0x9A, 0xE9, 0x90, 0xB6, 0x7A, 0x78, 0x3E, 0x17, 0xC2,
+ 0x10, 0x9D, 0x74, 0x09, 0xCD, 0x28, 0x07, 0xEB, 0x64, 0x6E, 0x31, 0x99, 0x37, 0x30, 0x79, 0xC2, 0x78, 0x94, 0xAA, 0x6F,
+ 0x89, 0xDA, 0x93, 0xB3, 0x2E, 0x6A, 0xAB, 0xDB, 0x20, 0x81, 0x4B, 0x2B, 0x77, 0xC6, 0x6C, 0x9A, 0x02, 0xE1, 0xFE, 0x81,
+ 0xDA, 0xEB, 0xB5, 0xE9, 0x89, 0x93, 0xAA, 0x90, 0x89, 0xDA, 0x9C, 0x45, 0xE2, 0xA5, 0x2C, 0x76, 0xA3, 0x9C, 0x52, 0x01,
+ 0xF6, 0x41, 0x1F, 0x4D, 0xE1, 0x4D, 0x4F, 0x5F, 0x6C, 0x5F, 0xEA, 0x5B, 0x13, 0x48, 0xD5, 0x0F, 0x9C, 0x0B, 0x37, 0xD5,
+ 0x71, 0xA4, 0x6F, 0x9A, 0xAE, 0x32, 0x08, 0xD4, 0x00, 0x60, 0x54, 0xA2, 0x82, 0xD6, 0xA5, 0xD2, 0xD7, 0x4C, 0x54, 0x55,
+ 0xA8, 0x11, 0x1B, 0xBF, 0x31, 0xCC, 0xEA, 0x08, 0x8A, 0x17, 0x99, 0xB9, 0xFB, 0xCE, 0x45, 0xDC, 0x60, 0x0E, 0x8B, 0x8A,
+ 0x9F, 0xCF, 0x6F, 0xA4, 0x0F, 0xE0, 0xCC, 0x16, 0xEE, 0x9B, 0x61, 0x8E, 0xBA, 0x34, 0x08, 0xAE, 0xE7, 0x91, 0x08, 0x4A,
+ 0x5B, 0x7B, 0xAE, 0x34, 0x53, 0x65, 0xAF, 0xCE, 0x84, 0x89, 0xF4, 0xA9, 0x20, 0x64, 0xE8, 0xA6, 0x1D, 0xB5, 0x6B, 0xF0,
+ 0x84, 0x3D, 0xB6, 0x08, 0x17, 0x71, 0x13, 0x4E, 0x08, 0x2A, 0x36, 0x97, 0x55, 0x99, 0x9A, 0xBE, 0x9B, 0x3C, 0x93, 0x70,
+ 0xA2, 0x91, 0x06, 0x5D, 0xCE, 0x98, 0x36, 0x1D, 0x9E, 0x3A, 0x6B, 0xE6, 0xD4, 0x4B, 0xA7, 0x5D, 0x3A, 0x55, 0xE3, 0x8D,
+ 0x6C, 0x99, 0xF6, 0xF1, 0xC1, 0x59, 0x7B, 0xDA, 0x07, 0xEA, 0x6A, 0x5B, 0xD9, 0x9A, 0xC9, 0xBC, 0x81, 0x5E, 0x85, 0x04,
+ 0x30, 0x93, 0x97, 0x6B, 0xBB, 0xD7, 0x7B, 0x2B, 0xDE, 0xE0, 0xCF, 0xC4, 0x14, 0x08, 0x12, 0x03, 0x57, 0x33, 0xFF, 0x32,
+ 0x08, 0x72, 0x92, 0x1A, 0xFF, 0x30, 0x74, 0x60, 0x6C, 0x5F, 0x91, 0xC7, 0xA4, 0x43, 0x12, 0x51, 0x75, 0xAB, 0x94, 0xEC,
+ 0xF0, 0x72, 0xA4, 0x29, 0x76, 0xED, 0x9A, 0xFC, 0x48, 0x1A, 0x1A, 0xE6, 0x40, 0x90, 0x91, 0xB8, 0x81, 0xAF, 0x91, 0xE7,
+ 0xBB, 0x58, 0xE4, 0x28, 0x49, 0x58, 0x05, 0x5A, 0xAC, 0x03, 0xB2, 0xDA, 0x14, 0x22, 0xAC, 0x99, 0x02, 0x47, 0x38, 0x58,
+ 0x4A, 0xC5, 0xA5, 0xFE, 0x74, 0x68, 0x3F, 0x73, 0xE0, 0xC6, 0x8A, 0x02, 0xBC, 0x69, 0x9F, 0xB9, 0xAB, 0x89, 0xF9, 0x3C,
+ 0xE6, 0x0A, 0x60, 0x88, 0x7C, 0xE3, 0x42, 0x69, 0xCD, 0x84, 0x8B, 0x27, 0x22, 0x5D, 0x92, 0x57, 0xDA, 0x09, 0xF4, 0x97,
+ 0x94, 0x7A, 0x8E, 0x86, 0x68, 0xEF, 0xD0, 0xE8, 0x57, 0xB9, 0x5B, 0xE9, 0x6B, 0xEF, 0x53, 0x3C, 0x60, 0xE2, 0x94, 0xE9,
+ 0x97, 0x4C, 0x85, 0x11, 0x0D, 0xAC, 0xCD, 0x21, 0xD8, 0x50, 0x1B, 0x4E, 0x95, 0xF2, 0x4A, 0xD8, 0xC1, 0x53, 0x67, 0x12,
+ 0x5A, 0xA6, 0x5E, 0x32, 0xE1, 0xDC, 0x73, 0xCF, 0xE5, 0x0F, 0x39, 0x5E, 0x9A, 0x96, 0x1F, 0x0E, 0xC1, 0x76, 0x04, 0x66,
+ 0x4D, 0xD2, 0x9E, 0xB1, 0xB5, 0x91, 0x76, 0x84, 0xC4, 0xDE, 0x05, 0xFA, 0xA3, 0xFC, 0xB8, 0x36, 0x81, 0xD7, 0x4D, 0xDC,
+ 0x4D, 0x26, 0x39, 0x92, 0x0E, 0x69, 0x52, 0x64, 0x9F, 0x6F, 0x92, 0x57, 0x74, 0x60, 0x48, 0xE7, 0xD2, 0x47, 0x93, 0xAA,
+ 0xCA, 0xDD, 0xDB, 0xED, 0x11, 0xA5, 0xB5, 0x6E, 0xB1, 0x6B, 0x4D, 0x3D, 0xDD, 0x20, 0x71, 0xCA, 0x5F, 0xF1, 0xA0, 0xC4,
+ 0x61, 0x8F, 0x43, 0x8C, 0x84, 0x13, 0x69, 0x0A, 0x69, 0x6F, 0x4E, 0x48, 0x38, 0x14, 0xC6, 0x86, 0xF9, 0x23, 0x20, 0xA3,
+ 0x92, 0x35, 0x35, 0x8E, 0x44, 0x57, 0x60, 0x57, 0x93, 0x3F, 0x87, 0x2D, 0x6B, 0xE6, 0x0A, 0xCE, 0x69, 0x24, 0xEC, 0x2D,
+ 0x98, 0x3D, 0x7F, 0xF2, 0xC5, 0x93, 0x38, 0xED, 0x44, 0xE8, 0x30, 0x45, 0x95, 0x08, 0x1A, 0x60, 0xE1, 0x70, 0x6C, 0x36,
+ 0x56, 0xA8, 0x69, 0xB3, 0xA4, 0xE3, 0x3D, 0xE9, 0x12, 0xD4, 0x00, 0xB8, 0x5B, 0x2F, 0x51, 0x8C, 0xE2, 0xF9, 0xB4, 0xBF,
+ 0x78, 0x0E, 0x7B, 0x28, 0x67, 0x4F, 0x15, 0xE6, 0x1D, 0x1D, 0x08, 0x86, 0xF2, 0x08, 0x57, 0x6A, 0xDD, 0x99, 0xF3, 0x84,
+ 0x23, 0x6C, 0xCE, 0x9D, 0xE1, 0x45, 0x50, 0x98, 0xFF, 0x82, 0x40, 0x36, 0xFE, 0x51, 0x36, 0xE1, 0x82, 0xC4, 0x15, 0x22,
+ 0x0A, 0xAE, 0x20, 0x52, 0x0E, 0x16, 0x3E, 0x92, 0x65, 0xCF, 0x69, 0xE0, 0x15, 0xF9, 0xBA, 0x7C, 0xBA, 0x91, 0x60, 0xA0,
+ 0x2C, 0x23, 0x17, 0xA9, 0x22, 0x8D, 0xE8, 0xB5, 0x7A, 0x70, 0x74, 0xE0, 0xF6, 0x76, 0x4C, 0xF2, 0xEE, 0x81, 0x14, 0x95,
+ 0xB5, 0x57, 0xD0, 0x5E, 0x33, 0x1F, 0xF3, 0x4C, 0xEF, 0x5D, 0x22, 0xB3, 0xA2, 0xBF, 0xB3, 0xF4, 0xE8, 0x04, 0x43, 0x6D,
+ 0x97, 0x4E, 0xBA, 0x61, 0x7F, 0x08, 0x19, 0xC4, 0xD0, 0x31, 0x75, 0x6E, 0xA3, 0x24, 0x59, 0x14, 0xE0, 0xE4, 0xDD, 0x9A,
+ 0xEA, 0x99, 0xDF, 0x2A, 0x7B, 0x50, 0x2F, 0x48, 0x0A, 0x79, 0xCE, 0x8C, 0x89, 0x93, 0xE9, 0x30, 0x92, 0x8F, 0x42, 0x44,
+ 0x64, 0xCB, 0x22, 0x62, 0x25, 0x96, 0x22, 0xAF, 0xA9, 0x97, 0x4E, 0x9E, 0x3E, 0x79, 0x86, 0xA0, 0x0A, 0x11, 0xDB, 0x85,
+ 0x14, 0x30, 0x07, 0xF4, 0x17, 0x44, 0x3A, 0x43, 0xE2, 0x30, 0xEE, 0x42, 0x7F, 0x6D, 0xDA, 0xE4, 0x4B, 0x44, 0x01, 0xE2,
+ 0x79, 0xC2, 0x81, 0xC4, 0x17, 0x1D, 0xBA, 0xBC, 0xE9, 0x3A, 0x68, 0x47, 0x88, 0xDF, 0x4E, 0x9F, 0x3A, 0x8D, 0x36, 0xF5,
+ 0xD9, 0xE7, 0x7C, 0xAD, 0xA3, 0xB9, 0x8B, 0x29, 0x1B, 0x69, 0x02, 0xA2, 0x04, 0x06, 0x70, 0x5C, 0xCA, 0x55, 0xCB, 0x95,
+ 0x73, 0xA7, 0x66, 0xA1, 0xDA, 0xFA, 0x75, 0x62, 0xB2, 0xAB, 0x09, 0xAB, 0x12, 0xC4, 0x8D, 0xA3, 0xA8, 0xE8, 0x23, 0xA9,
+ 0x90, 0xD9, 0xF9, 0xC3, 0x19, 0x1E, 0x01, 0x21, 0x3E, 0x0E, 0xCF, 0xC0, 0x40, 0xD0, 0xC9, 0x62, 0x1D, 0x91, 0xA3, 0x8B,
+ 0xFB, 0xDE, 0x20, 0xEC, 0x7D, 0xBE, 0xA1, 0x4A, 0x8C, 0xC2, 0x9F, 0x91, 0x58, 0x6D, 0x14, 0xA0, 0x69, 0x95, 0x33, 0x6E,
+ 0x65, 0x76, 0x16, 0x14, 0xE6, 0xE4, 0x76, 0xC6, 0x21, 0x2C, 0x59, 0x53, 0xE4, 0x6E, 0x96, 0x00, 0xAE, 0xE6, 0xDA, 0x7E,
+ 0x41, 0x28, 0xCC, 0xE5, 0x92, 0x06, 0x20, 0x5F, 0x71, 0xFF, 0x90, 0x28, 0x7A, 0x35, 0x6D, 0x75, 0x8B, 0x7C, 0x67, 0xCC,
+ 0x3B, 0xFF, 0x9C, 0xAF, 0xCD, 0x98, 0x3C, 0x0D, 0xB3, 0x25, 0x79, 0xD5, 0x8E, 0xA6, 0x30, 0xAB, 0x09, 0xDA, 0x53, 0x50,
+ 0xCA, 0x14, 0x70, 0x89, 0xE4, 0x47, 0x63, 0x80, 0x86, 0x01, 0x8D, 0x01, 0x73, 0xA6, 0xE9, 0xAE, 0x10, 0x89, 0x3D, 0x0A,
+ 0x80, 0x1A, 0xF3, 0x69, 0x07, 0xE1, 0x8E, 0xB4, 0x83, 0x78, 0xDC, 0xE0, 0xD2, 0x74, 0x9A, 0x45, 0xB1, 0x31, 0x89, 0x9C,
+ 0xE0, 0x49, 0x37, 0x05, 0xF9, 0xF2, 0xB9, 0x64, 0xAF, 0xD5, 0x5C, 0x3F, 0x15, 0xAE, 0x70, 0x8A, 0xE8, 0x42, 0x2B, 0x75,
+ 0x8E, 0xCF, 0x65, 0x13, 0x21, 0x25, 0x37, 0x62, 0xFE, 0x41, 0xC1, 0xAE, 0xD5, 0x87, 0x21, 0x7A, 0xBD, 0xD6, 0xC7, 0x95,
+ 0x95, 0x64, 0x74, 0x70, 0x92, 0xED, 0xDB, 0xA2, 0xD7, 0x03, 0xFD, 0x1E, 0xBB, 0x76, 0x0C, 0xDC, 0x09, 0x06, 0x4E, 0x19,
+ 0x61, 0x32, 0x1F, 0x96, 0xA4, 0x40, 0xBA, 0x1F, 0xDA, 0x85, 0x2C, 0x6F, 0x6A, 0xEB, 0x90, 0x70, 0x4C, 0xD3, 0x4A, 0xB9,
+ 0x69, 0x9A, 0xD2, 0x39, 0xF4, 0x58, 0x76, 0x4F, 0xBA, 0xD2, 0x47, 0x01, 0x26, 0xEE, 0x29, 0x41, 0x5C, 0x46, 0x6C, 0x14,
+ 0x44, 0xD8, 0x26, 0xD7, 0x98, 0x1B, 0x92, 0x85, 0xD1, 0xC5, 0x60, 0x12, 0x60, 0x31, 0x59, 0xEC, 0x34, 0xD3, 0xD1, 0x14,
+ 0x30, 0xD1, 0x76, 0x26, 0x08, 0x83, 0x26, 0x78, 0xDC, 0x54, 0x12, 0x13, 0xC9, 0x38, 0x49, 0x75, 0x8C, 0x07, 0x4C, 0x21,
+ 0xE5, 0xB5, 0x3B, 0x0F, 0x04, 0x06, 0x09, 0x33, 0x6C, 0x87, 0x22, 0x02, 0x99, 0x9E, 0x8F, 0x1B, 0x75, 0x44, 0x2B, 0xF8,
+ 0x07, 0x81, 0x8A, 0x66, 0xD1, 0xF8, 0x8B, 0x26, 0xB0, 0x9B, 0x2C, 0x92, 0x24, 0x3E, 0x34, 0x8A, 0xEF, 0xDA, 0x06, 0x55,
+ 0x98, 0x1B, 0xB3, 0x97, 0x4D, 0x5A, 0x6F, 0x48, 0x9F, 0xB2, 0x5F, 0x67, 0xC8, 0x66, 0x76, 0xE6, 0x74, 0xE0, 0x49, 0xDF,
+ 0xCD, 0x49, 0x42, 0x22, 0x74, 0x0A, 0x66, 0x28, 0xD6, 0x01, 0xC1, 0x62, 0xF8, 0xDC, 0x85, 0xF0, 0x6B, 0x58, 0xEF, 0x8E,
+ 0x0E, 0x6C, 0x20, 0xD5, 0x4C, 0xC6, 0x26, 0xA3, 0x5E, 0x09, 0x8E, 0xF1, 0x86, 0xFF, 0xF5, 0xAE, 0x4D, 0x8D, 0x3C, 0x19,
+ 0x91, 0x53, 0x5E, 0x38, 0x9C, 0x0C, 0x13, 0xA9, 0xC4, 0x25, 0xDD, 0x61, 0x32, 0xAE, 0xAD, 0x6A, 0x40, 0xF4, 0x32, 0xD4,
+ 0x84, 0x39, 0xCB, 0x46, 0x46, 0x37, 0xCF, 0xD3, 0x44, 0x50, 0x82, 0x21, 0xC7, 0x27, 0x9A, 0xF2, 0x02, 0xF9, 0x72, 0xC6,
+ 0x3C, 0xA9, 0x3A, 0x94, 0x5B, 0xB3, 0xD5, 0x09, 0x1E, 0xF5, 0x6C, 0x0E, 0x1E, 0x91, 0xED, 0x66, 0xB2, 0xE1, 0x69, 0x16,
+ 0xF5, 0x84, 0xD0, 0xF7, 0xA6, 0x39, 0x59, 0x2C, 0x7A, 0x02, 0x7C, 0x58, 0xD8, 0xF5, 0xFC, 0xE9, 0x8E, 0xED, 0x6B, 0xDE,
+ 0xE5, 0x6C, 0x1B, 0x61, 0x88, 0xAD, 0xCB, 0x34, 0x7F, 0x84, 0x7C, 0x6F, 0x1C, 0x82, 0x97, 0x42, 0x0D, 0x24, 0xC1, 0x7C,
+ 0x77, 0x6F, 0x73, 0x5D, 0x2B, 0x0E, 0xC7, 0xD9, 0x84, 0x6B, 0x86, 0xD7, 0xF1, 0x7E, 0x50, 0x1E, 0x34, 0x53, 0xA6, 0xF6,
+ 0xB6, 0x78, 0x62, 0x5C, 0x33, 0x12, 0x1E, 0xDC, 0x70, 0x2D, 0x9F, 0xD4, 0x60, 0x8E, 0x90, 0xFB, 0x02, 0x8D, 0x4F, 0xAB,
+ 0xF4, 0xF5, 0x6E, 0x40, 0xB0, 0x8F, 0x05, 0xFD, 0xFF, 0x55, 0xB2, 0x63, 0x9F, 0x60, 0x8A, 0x2F, 0x6F, 0xAD, 0x20, 0x68,
+ 0x63, 0x96, 0x4D, 0x58, 0xB5, 0x33, 0x6A, 0xDF, 0xA2, 0x62, 0x91, 0xD3, 0xC8, 0xC5, 0x0F, 0x4C, 0x3A, 0xA1, 0xB9, 0x9D,
+ 0x96, 0x33, 0x7A, 0xA1, 0xDB, 0x48, 0x25, 0xB8, 0x29, 0x79, 0xD6, 0x58, 0x10, 0x92, 0x05, 0xAF, 0x98, 0xEB, 0x71, 0x8E,
+ 0x0E, 0x81, 0x9A, 0x13, 0x10, 0xEA, 0x6B, 0x5A, 0x31, 0x6D, 0x8C, 0x1A, 0x04, 0x77, 0x13, 0x59, 0x8C, 0x3A, 0x00, 0x30,
+ 0x71, 0x1A, 0xCB, 0xBA, 0x1D, 0xCA, 0x6C, 0x93, 0x47, 0x8E, 0xF3, 0xA6, 0x89, 0x73, 0x98, 0xD4, 0x8B, 0xED, 0x4A, 0x22,
+ 0x62, 0x9B, 0x74, 0xC9, 0x8E, 0x01, 0x67, 0x88, 0xED, 0xEC, 0x21, 0x20, 0x29, 0xD0, 0xFE, 0xA8, 0x32, 0xB7, 0x27, 0x8C,
+ 0xBF, 0x68, 0xE6, 0xF4, 0x59, 0x9C, 0x27, 0x05, 0x48, 0xD2, 0xDA, 0x7A, 0xF9, 0x1B, 0xDF, 0x3E, 0xB2, 0xEB, 0x30, 0xED,
+ 0x23, 0x82, 0x13, 0x72, 0xE4, 0x73, 0xC9, 0x18, 0xCA, 0x24, 0x7E, 0x4E, 0x39, 0x16, 0x28, 0xF8, 0xC3, 0x3E, 0x03, 0xC5,
+ 0x2B, 0xB5, 0x77, 0xC7, 0xEF, 0x9D, 0x8E, 0xA7, 0xB1, 0x36, 0x3E, 0xA0, 0x3F, 0x3A, 0x30, 0x3D, 0x89, 0xFF, 0xE7, 0xE5,
+ 0x84, 0x59, 0x39, 0x34, 0xCA, 0x36, 0xEC, 0xBC, 0x74, 0x1A, 0x2D, 0x1D, 0xEC, 0x23, 0x9E, 0x0E, 0x07, 0x56, 0x63, 0x66,
+ 0xDC, 0x32, 0x43, 0x96, 0x63, 0x2A, 0x24, 0xB5, 0x30, 0x18, 0xCA, 0x3B, 0xA6, 0x93, 0xAA, 0x59, 0x93, 0xB5, 0x26, 0xAD,
+ 0x3F, 0x75, 0x17, 0x23, 0x45, 0xC9, 0x70, 0xDF, 0x72, 0xBE, 0x10, 0x65, 0xEA, 0xA4, 0x4B, 0x39, 0xD8, 0x17, 0x40, 0xB8,
+ 0xE8, 0xC2, 0xF3, 0x01, 0x74, 0xDD, 0x62, 0xA7, 0xB9, 0xEC, 0x08, 0xAD, 0x5A, 0x76, 0x82, 0x38, 0x1D, 0x66, 0xCB, 0x80,
+ 0x17, 0xDC, 0x37, 0xD6, 0xAD, 0xE6, 0x6F, 0xB7, 0x28, 0x39, 0xBB, 0x94, 0x4C, 0xE2, 0xAF, 0x14, 0x1B, 0x93, 0x20, 0x38,
+ 0x0D, 0x51, 0xFE, 0x5C, 0x5C, 0xE1, 0x9C, 0xB3, 0x21, 0x4F, 0x34, 0xD7, 0xB6, 0x93, 0xD1, 0x72, 0xA8, 0xD8, 0x5F, 0x7E,
+ 0xFB, 0x4F, 0xCE, 0xD6, 0x36, 0x53, 0x2C, 0x3F, 0x09, 0x12, 0xC1, 0xA2, 0x00, 0xC5, 0x22, 0x69, 0x65, 0x8A, 0x85, 0x89,
+ 0x19, 0xF1, 0x2B, 0x46, 0x23, 0x6E, 0x39, 0xED, 0x6C, 0x40, 0x53, 0x50, 0xB2, 0x08, 0xEC, 0xC3, 0x8E, 0x54, 0x8B, 0x18,
+ 0x5F, 0xA1, 0x89, 0x31, 0x11, 0x42, 0xC7, 0x35, 0x1A, 0x69, 0xED, 0xC2, 0x16, 0x46, 0x5A, 0x1A, 0x9E, 0x5F, 0x9D, 0xCC,
+ 0xE9, 0x90, 0x5E, 0xB7, 0x91, 0xBE, 0xEA, 0xC0, 0x82, 0xA9, 0x06, 0xB7, 0x91, 0x24, 0xCF, 0x98, 0x09, 0x82, 0x43, 0x28,
+ 0x04, 0xE1, 0xAD, 0x6B, 0x2F, 0x5B, 0x3B, 0xB4, 0x76, 0xC6, 0xE4, 0xC9, 0x64, 0x44, 0x44, 0x63, 0x6A, 0x28, 0x42, 0xAB,
+ 0xEE, 0xE8, 0xB3, 0x02, 0x95, 0x64, 0xD7, 0x74, 0xF0, 0x0D, 0xF1, 0xDD, 0xD9, 0x14, 0x66, 0x68, 0x32, 0xEC, 0x38, 0x93,
+ 0x7D, 0xB2, 0xDA, 0x6A, 0x96, 0xDE, 0x27, 0x7B, 0x31, 0x3D, 0x1B, 0x95, 0x40, 0x15, 0xA7, 0xEF, 0xE6, 0xA6, 0x6A, 0xF6,
+ 0x45, 0xF8, 0x5B, 0x06, 0xAB, 0x13, 0x2E, 0xBC, 0x00, 0x9E, 0xC7, 0xBA, 0xE5, 0x5B, 0xF9, 0x38, 0xA8, 0xEA, 0x91, 0xFB,
+ 0x9E, 0x42, 0x0D, 0x9C, 0xAE, 0x46, 0x2C, 0x09, 0x99, 0x1B, 0xE0, 0x04, 0x86, 0xE0, 0x60, 0x97, 0x00, 0x27, 0x70, 0x6A,
+ 0x44, 0x4F, 0x2D, 0xED, 0x0C, 0x5A, 0xB8, 0x1B, 0x21, 0x35, 0xB6, 0x1B, 0xFF, 0xDC, 0x58, 0x88, 0x0E, 0xBE, 0xDC, 0x09,
+ 0xE8, 0x77, 0x9A, 0xF3, 0x85, 0xC6, 0x00, 0x8E, 0x07, 0x61, 0x14, 0x67, 0x1C, 0xB4, 0xF1, 0xE8, 0x43, 0x2A, 0x32, 0x75,
+ 0x91, 0x53, 0x29, 0x40, 0x06, 0x9F, 0xDA, 0xBE, 0x66, 0xB9, 0x07, 0xAF, 0xC9, 0x70, 0x43, 0xCA, 0x1C, 0x13, 0x2A, 0x24,
+ 0xC3, 0x33, 0xFB, 0x29, 0x40, 0x15, 0x42, 0x31, 0x65, 0x1D, 0x27, 0xCD, 0xEE, 0xBB, 0x6C, 0x3F, 0x39, 0xD2, 0x7C, 0xDF,
+ 0x05, 0x1C, 0x30, 0x07, 0x5E, 0x11, 0x66, 0x49, 0x8D, 0x4C, 0x2B, 0x9F, 0x8C, 0xD6, 0xD9, 0x6E, 0xE7, 0xCC, 0x4F, 0xDC,
+ 0x7A, 0x42, 0xB3, 0x5E, 0x50, 0xDE, 0xB9, 0x35, 0x6D, 0x67, 0x31, 0x73, 0x77, 0xCF, 0x8C, 0xED, 0xBB, 0xE9, 0xE6, 0x19,
+ 0xBB, 0x9C, 0xED, 0x0B, 0xF2, 0x64, 0xF1, 0x2D, 0xFE, 0x11, 0xF9, 0x18, 0xF1, 0xBF, 0x83, 0x6F, 0x75, 0x6E, 0x19, 0x00,
+ 0x00, 0x71, 0xC7, 0xB7, 0xBF, 0xFD, 0xCE, 0x2F, 0x7E, 0xFC, 0x6B, 0xBE, 0x28, 0x42, 0x66, 0x50, 0xF3, 0x16, 0x90, 0xE9,
+ 0xE9, 0x10, 0x5F, 0x58, 0x6B, 0xEE, 0x5E, 0x33, 0x4D, 0x61, 0xBD, 0xDD, 0x24, 0x6F, 0x0E, 0xA2, 0x8F, 0x8F, 0xD5, 0xC1,
+ 0x28, 0x7B, 0x37, 0xAC, 0xD8, 0x51, 0x08, 0x33, 0x62, 0xF5, 0x66, 0x7A, 0xAC, 0xD2, 0xD7, 0xD4, 0xD3, 0x1A, 0x3E, 0x9D,
+ 0x8C, 0x93, 0x45, 0xEF, 0x65, 0x38, 0xC9, 0xC9, 0x1E, 0x86, 0x58, 0x20, 0x24, 0x1C, 0x65, 0xDD, 0x38, 0xBD, 0x2D, 0x13,
+ 0x15, 0xA4, 0x8A, 0xD6, 0xC0, 0x80, 0xA9, 0xFA, 0xCD, 0x9D, 0x43, 0x71, 0x94, 0x95, 0x92, 0xB1, 0x61, 0xD5, 0x36, 0x36,
+ 0x7A, 0x80, 0x03, 0xD0, 0x49, 0x61, 0x34, 0xC1, 0x28, 0x20, 0x71, 0x64, 0xB7, 0x29, 0x1F, 0xDE, 0x14, 0x74, 0xCE, 0x1E,
+ 0xBC, 0x11, 0x5B, 0xF6, 0x96, 0x17, 0x5A, 0x5B, 0x8C, 0xDE, 0x9E, 0x67, 0xC5, 0xED, 0x08, 0x45, 0xB7, 0x81, 0xF8, 0x33,
+ 0x9D, 0x95, 0xA5, 0xB9, 0xB2, 0x2A, 0x4C, 0x51, 0x8E, 0xA8, 0x43, 0xF8, 0x01, 0x58, 0xD6, 0xAF, 0xD9, 0x0E, 0xD5, 0x9E,
+ 0x8C, 0x8B, 0x23, 0x41, 0x7E, 0xF6, 0xD6, 0xAF, 0x9E, 0x7C, 0xF0, 0x19, 0xBE, 0xA2, 0x59, 0xBE, 0x60, 0x6F, 0x8E, 0x9F,
+ 0x26, 0xA3, 0xB6, 0x7B, 0xE1, 0x74, 0xF1, 0x0C, 0x6F, 0xCA, 0xCD, 0xAD, 0x47, 0x36, 0x65, 0xDA, 0x07, 0x1D, 0x1D, 0x9C,
+ 0x52, 0xD0, 0x63, 0x9A, 0x13, 0x5F, 0xA2, 0x8C, 0x11, 0x2C, 0xD2, 0x90, 0x7B, 0xB2, 0xF9, 0x5B, 0x92, 0xE5, 0x28, 0x6E,
+ 0x13, 0x1E, 0x80, 0xC9, 0x07, 0x38, 0x5D, 0x3C, 0x33, 0xE5, 0x90, 0x90, 0x60, 0xEA, 0x78, 0xD9, 0x31, 0x00, 0x62, 0x82,
+ 0xC2, 0xB2, 0xD7, 0x2C, 0x38, 0x9C, 0x93, 0x05, 0x39, 0xCD, 0x95, 0xAC, 0x86, 0xFD, 0x26, 0xCB, 0xFA, 0xD7, 0xCD, 0x9B,
+ 0xE3, 0x37, 0xFE, 0x82, 0x71, 0xD2, 0xD1, 0x23, 0x41, 0x74, 0x2B, 0x6A, 0x95, 0x9A, 0x57, 0xB2, 0xA7, 0xBC, 0xD6, 0xDC,
+ 0xD7, 0x9A, 0xBF, 0xDE, 0x75, 0xCC, 0xD6, 0x95, 0x94, 0xAD, 0x0D, 0x9D, 0xE2, 0x9C, 0x33, 0x17, 0xD0, 0x01, 0xB5, 0xC7,
+ 0x25, 0x53, 0x20, 0x14, 0xB5, 0x34, 0x77, 0x2E, 0x1D, 0x5A, 0xA3, 0xFB, 0x0F, 0x39, 0x93, 0xE5, 0xAD, 0x37, 0x7E, 0xC6,
+ 0xE1, 0x93, 0x58, 0x12, 0x9E, 0x84, 0xB6, 0x8C, 0x1A, 0xC0, 0x7D, 0xC9, 0x7F, 0xD4, 0xCC, 0xED, 0xBF, 0xF0, 0x7A, 0x80,
+ 0xF7, 0xAD, 0xFA, 0x7C, 0xA9, 0x64, 0x47, 0x63, 0xFD, 0xD8, 0xA7, 0xB9, 0x21, 0xD7, 0x43, 0xE1, 0x93, 0x04, 0xD9, 0x91,
+ 0xB2, 0x7B, 0x81, 0xA3, 0x68, 0xEC, 0xB5, 0x9E, 0xA1, 0x6C, 0x0E, 0x61, 0x76, 0xD8, 0xCD, 0x40, 0xCC, 0x57, 0xD9, 0x94,
+ 0xB2, 0x90, 0xBA, 0x51, 0x9A, 0x5C, 0xA6, 0xCF, 0x45, 0xAB, 0x3D, 0x94, 0x0C, 0x52, 0x1A, 0xB7, 0x1C, 0x97, 0x19, 0x93,
+ 0xC2, 0x79, 0x65, 0xDC, 0x25, 0x1F, 0xE7, 0x2C, 0x4B, 0x1A, 0x44, 0xE3, 0xCE, 0x3E, 0x8B, 0xC6, 0x8E, 0x89, 0x04, 0xEC,
+ 0x9F, 0x95, 0x6D, 0x1D, 0x76, 0xC4, 0x3D, 0x22, 0x5C, 0x4F, 0xD9, 0x61, 0x3F, 0xFC, 0x08, 0x16, 0x5B, 0xB9, 0xBB, 0xE9,
+ 0xAF, 0x3A, 0x9F, 0xD5, 0xD0, 0x68, 0x3F, 0x30, 0xC7, 0xE7, 0xCE, 0x9E, 0x3F, 0x7B, 0x96, 0x2F, 0x93, 0x54, 0xFA, 0xA6,
+ 0xEB, 0x56, 0x6C, 0x21, 0x33, 0x06, 0xA0, 0xC0, 0x52, 0xCE, 0xA2, 0x7C, 0xEE, 0xF1, 0x17, 0xF9, 0x86, 0x1C, 0xB3, 0xB7,
+ 0x4E, 0xF6, 0xF3, 0x3A, 0xD5, 0x8C, 0x47, 0xA3, 0x56, 0xEB, 0x5E, 0xB8, 0xB3, 0xD7, 0x5F, 0xAE, 0x83, 0x53, 0x01, 0xBD,
+ 0x88, 0x52, 0xD1, 0xC9, 0x00, 0xCE, 0xC9, 0xBB, 0x1B, 0xC6, 0xA0, 0x90, 0x23, 0xF1, 0x11, 0xDD, 0x40, 0x0A, 0x17, 0xE9,
+ 0xC3, 0x3B, 0x1B, 0xA1, 0x7B, 0x98, 0x93, 0x0E, 0x8C, 0xF4, 0x0D, 0x81, 0xC3, 0x0C, 0xC1, 0x09, 0x9B, 0x7C, 0x66, 0xCE,
+ 0x98, 0xE1, 0x96, 0x66, 0xA2, 0x20, 0xF2, 0x8C, 0x39, 0x74, 0x2E, 0x39, 0x06, 0x96, 0x5C, 0xF3, 0xE2, 0xF3, 0xCF, 0xD3,
+ 0xB6, 0x76, 0xF0, 0x3C, 0xC1, 0x22, 0xA5, 0x77, 0x78, 0xAD, 0x5E, 0x2B, 0x20, 0x5B, 0x5E, 0x38, 0x96, 0x38, 0x5A, 0xDC,
+ 0x6E, 0xB7, 0x59, 0x23, 0xA7, 0x2C, 0xDD, 0xB2, 0xCA, 0x2C, 0xCC, 0xB6, 0x49, 0x6C, 0x93, 0x4A, 0x7A, 0x85, 0xC6, 0x15,
+ 0xE8, 0x41, 0xD1, 0x8E, 0x65, 0xCC, 0x89, 0x1A, 0x0A, 0xF2, 0x4B, 0x69, 0xF6, 0x31, 0x9B, 0x62, 0x0C, 0x7E, 0x68, 0xD7,
+ 0x15, 0x30, 0xD8, 0x99, 0xCB, 0x92, 0xFB, 0x4A, 0x91, 0x4F, 0xF7, 0xD4, 0x6C, 0x86, 0x35, 0xFF, 0x9A, 0x0B, 0x61, 0x00,
+ 0x7D, 0xD9, 0xFA, 0x4A, 0x3F, 0x30, 0x28, 0x7F, 0x4A, 0xB2, 0xAA, 0x91, 0xB5, 0x8C, 0x71, 0xC4, 0xF6, 0x45, 0x2B, 0xCE,
+ 0x66, 0xAB, 0x11, 0x1D, 0x18, 0xCE, 0x96, 0x2C, 0xDD, 0x88, 0x42, 0x88, 0x36, 0x94, 0x02, 0x48, 0x02, 0x6E, 0x89, 0xE0,
+ 0x8E, 0xB6, 0x9D, 0xEE, 0xAE, 0x0E, 0xAB, 0xB5, 0xFF, 0x1E, 0x04, 0xDA, 0xA2, 0x00, 0x7A, 0x7F, 0x94, 0x48, 0xA4, 0x92,
+ 0x7C, 0x78, 0x40, 0x09, 0x4E, 0x27, 0xDF, 0x92, 0x7A, 0xCE, 0x99, 0x67, 0x91, 0x0E, 0xA1, 0x03, 0xD3, 0xDA, 0x73, 0xC8,
+ 0xA9, 0xD6, 0xFC, 0x15, 0x55, 0x74, 0xD9, 0x60, 0xE8, 0xA4, 0x86, 0xAE, 0x62, 0xB4, 0x4C, 0xB5, 0x0F, 0xEA, 0x05, 0x82,
+ 0xD3, 0x84, 0x7D, 0xA4, 0x37, 0x65, 0xE2, 0x87, 0x09, 0x09, 0x7E, 0xCC, 0xF1, 0x25, 0x3B, 0x9A, 0xC5, 0x7E, 0xFF, 0x19,
+ 0xB4, 0xC7, 0x09, 0x45, 0x9C, 0x47, 0xC4, 0x56, 0x35, 0x4E, 0x2F, 0xA1, 0x42, 0xA4, 0x24, 0xEA, 0x6E, 0xED, 0xAE, 0xAF,
+ 0xA8, 0x97, 0x49, 0x70, 0x64, 0x02, 0xCD, 0x12, 0x23, 0x7D, 0x67, 0xB8, 0x6F, 0x33, 0xAE, 0x93, 0xBD, 0x41, 0xBD, 0x6D,
+ 0x94, 0x0E, 0xD4, 0xCC, 0x9D, 0xA5, 0x71, 0x55, 0xEF, 0x9E, 0x2A, 0xBD, 0xF1, 0xCE, 0x35, 0xA3, 0x43, 0xA5, 0x93, 0x65,
+ 0x3D, 0xC3, 0x4D, 0xFF, 0x9D, 0x2E, 0x8A, 0x66, 0xA2, 0xD1, 0x81, 0xA2, 0x15, 0xC9, 0x85, 0x5C, 0x9A, 0x8D, 0x42, 0xD0,
+ 0x48, 0x7D, 0x10, 0x00, 0xFF, 0x40, 0x86, 0xE0, 0xE4, 0x42, 0x34, 0x64, 0x98, 0xE5, 0x2E, 0x98, 0x2E, 0x65, 0x2A, 0xAE,
+ 0xC0, 0x07, 0x6B, 0x6E, 0xE8, 0xA4, 0x44, 0x9A, 0xE3, 0x3B, 0x97, 0x69, 0x0C, 0x6D, 0x09, 0xD9, 0xD6, 0x0A, 0x51, 0x7E,
+ 0xC1, 0x88, 0x0E, 0x2C, 0xA6, 0x5B, 0xF9, 0x9E, 0xF2, 0x42, 0xAA, 0x10, 0x53, 0xB2, 0x7A, 0x73, 0x76, 0xF5, 0x1B, 0x1B,
+ 0x24, 0xA5, 0x43, 0x65, 0x06, 0xC5, 0xAA, 0x03, 0x4D, 0xBD, 0x24, 0xBB, 0x9D, 0x35, 0x4F, 0x5B, 0x17, 0x74, 0x9F, 0x52,
+ 0xE2, 0x12, 0x38, 0x77, 0xB8, 0xB7, 0x7B, 0x19, 0x7B, 0x1A, 0x68, 0xE1, 0x91, 0x68, 0xD1, 0xC7, 0x25, 0x18, 0x40, 0x45,
+ 0x0C, 0x09, 0x08, 0xE3, 0x11, 0x0D, 0x2A, 0x8E, 0x4B, 0x2D, 0x90, 0x7D, 0x89, 0x5F, 0xB6, 0x7C, 0x94, 0x64, 0x38, 0x86,
+ 0x12, 0xFC, 0x25, 0x42, 0x3F, 0x45, 0xA2, 0xE9, 0x6C, 0x78, 0x73, 0x50, 0x5E, 0x37, 0xBC, 0x99, 0x17, 0x74, 0x77, 0x80,
+ 0x4A, 0x0E, 0x3A, 0xC2, 0xE6, 0x70, 0x48, 0x06, 0xEC, 0x01, 0xD6, 0x83, 0x86, 0xDC, 0x21, 0x9F, 0x04, 0x80, 0xC8, 0x85,
+ 0xA6, 0x35, 0x14, 0x10, 0x48, 0x5F, 0x81, 0x84, 0x8F, 0x31, 0xA7, 0x9C, 0xE3, 0xE1, 0x17, 0xC2, 0xC9, 0x05, 0x70, 0xBC,
+ 0x96, 0x0C, 0xAE, 0x66, 0x5A, 0x00, 0xAD, 0x85, 0x36, 0x1C, 0x4D, 0x21, 0x9C, 0xC3, 0x9B, 0xE3, 0x7B, 0x43, 0xAB, 0x7A,
+ 0x80, 0x54, 0x49, 0xA3, 0x1D, 0x42, 0x4B, 0x6E, 0x5D, 0xF6, 0x57, 0x5A, 0x2B, 0x8D, 0xB8, 0x85, 0xD9, 0xC4, 0xC9, 0x3F,
+ 0x55, 0xE9, 0x43, 0x02, 0x97, 0xF3, 0x17, 0xE6, 0x91, 0x7A, 0x4A, 0x0D, 0x48, 0x04, 0x9A, 0x33, 0x63, 0xAA, 0x1E, 0xB7,
+ 0x47, 0x75, 0xC2, 0x97, 0x57, 0x32, 0xF1, 0x87, 0xBA, 0x8A, 0xDC, 0xB5, 0xE5, 0x27, 0x66, 0x31, 0x67, 0x01, 0x24, 0x78,
+ 0x5C, 0x41, 0x62, 0x83, 0x47, 0xEE, 0x36, 0x69, 0xB6, 0x9A, 0xB0, 0x31, 0xCC, 0xC7, 0x15, 0x77, 0x18, 0x15, 0x96, 0x0D,
+ 0xAA, 0x56, 0x07, 0x58, 0xB7, 0x3E, 0x08, 0xDB, 0xCE, 0x71, 0x0B, 0x8F, 0xAF, 0x08, 0x97, 0x42, 0xAC, 0x5B, 0x46, 0x02,
+ 0x9C, 0x9E, 0x61, 0x44, 0xAF, 0xB9, 0xBF, 0xEC, 0xB2, 0x53, 0xE9, 0x9B, 0x23, 0xCE, 0xA4, 0xA9, 0x6B, 0x9E, 0x13, 0xC5,
+ 0xC1, 0xE2, 0x12, 0xA2, 0x17, 0xBA, 0xFB, 0xB9, 0x8D, 0xA4, 0x14, 0x82, 0x90, 0x05, 0xE7, 0x7E, 0x18, 0xE4, 0x99, 0x03,
+ 0x49, 0x82, 0x9D, 0xE2, 0x6C, 0x1E, 0xE1, 0xA0, 0x45, 0x1C, 0x42, 0xBE, 0x4A, 0xA2, 0x67, 0x98, 0x34, 0x9F, 0x0F, 0x8F,
+ 0xEF, 0x83, 0x09, 0x4A, 0xEC, 0x39, 0x19, 0x8B, 0xA4, 0x31, 0xE0, 0x91, 0xA9, 0x0A, 0x17, 0x41, 0x47, 0xFA, 0x3B, 0xD2,
+ 0x37, 0x7D, 0x7C, 0x93, 0xB0, 0x9F, 0x14, 0x1E, 0xBC, 0x09, 0x12, 0x4A, 0xF5, 0x92, 0x56, 0x4C, 0x07, 0x49, 0x0A, 0x6F,
+ 0xDE, 0x1B, 0x13, 0x1E, 0x3A, 0x86, 0x34, 0xCC, 0xD9, 0xFC, 0xC4, 0x57, 0xF4, 0xC9, 0xD9, 0x5D, 0x1D, 0x43, 0x20, 0x27,
+ 0x61, 0x0C, 0x25, 0x81, 0xA2, 0x69, 0x09, 0xF2, 0x65, 0xB8, 0x58, 0x92, 0x57, 0xEE, 0xE8, 0x43, 0x96, 0x7B, 0x72, 0x88,
+ 0x05, 0x28, 0xC1, 0xA2, 0xFF, 0xD5, 0xE4, 0x2D, 0x45, 0x1B, 0x3C, 0xB1, 0xD7, 0x5E, 0x4B, 0x77, 0xDB, 0xB6, 0xA2, 0x24,
+ 0xE7, 0xDA, 0x94, 0xEC, 0x23, 0x51, 0xD7, 0x90, 0xF1, 0x0D, 0xCD, 0xCF, 0xB4, 0x28, 0xCC, 0x84, 0x4F, 0x27, 0x79, 0x52,
+ 0xD6, 0x63, 0x98, 0xA6, 0x1C, 0x53, 0xB7, 0xA5, 0xFC, 0xA1, 0x3D, 0xC9, 0xAE, 0xA6, 0xF2, 0xA2, 0x0A, 0x3E, 0x61, 0x5B,
+ 0x43, 0x37, 0xFE, 0xCE, 0x4E, 0x79, 0xE6, 0xFE, 0xD2, 0xF8, 0x9C, 0x78, 0x11, 0x79, 0xBA, 0x6C, 0x7D, 0xE0, 0x6C, 0x14,
+ 0x90, 0xDA, 0xCF, 0x1F, 0x3B, 0xD5, 0x3F, 0x74, 0xDA, 0x2F, 0x27, 0xE9, 0x40, 0x48, 0x9F, 0xEE, 0xD0, 0x51, 0x2F, 0x88,
+ 0xBA, 0xB6, 0x7F, 0x60, 0x11, 0xC9, 0xE6, 0x4E, 0xF2, 0x04, 0xB7, 0xB6, 0xB0, 0xCD, 0x0C, 0xAB, 0x03, 0xD3, 0xB7, 0xF0,
+ 0x45, 0xBE, 0xE7, 0x9D, 0x2B, 0x93, 0x4E, 0x42, 0x05, 0x5F, 0xEE, 0xCB, 0xEE, 0xE5, 0xBE, 0x9E, 0x15, 0x75, 0x15, 0x2D,
+ 0x14, 0xF0, 0xD8, 0x1C, 0x86, 0xCB, 0xB1, 0xB4, 0xB8, 0x82, 0x7A, 0x06, 0xEF, 0xD3, 0x51, 0x27, 0xBE, 0x35, 0x52, 0xC7,
+ 0x18, 0x8E, 0x8C, 0xB9, 0xEB, 0xEA, 0xC0, 0x86, 0x50, 0x97, 0x15, 0xAC, 0x7B, 0x16, 0x14, 0x58, 0xC2, 0x42, 0xCC, 0x16,
+ 0x06, 0x17, 0x5E, 0x04, 0xDF, 0x21, 0x8E, 0xB9, 0xF4, 0x55, 0xEF, 0xB5, 0xE9, 0xD6, 0x2A, 0x29, 0x4F, 0x68, 0x74, 0x66,
+ 0xD1, 0xEB, 0x97, 0xB2, 0x4B, 0x1E, 0x34, 0x5D, 0x14, 0x9D, 0x74, 0xB3, 0x4C, 0x73, 0x74, 0xA4, 0x97, 0x22, 0xEF, 0xC9,
+ 0x2F, 0xF0, 0xD2, 0x09, 0x93, 0x92, 0x12, 0x52, 0xD9, 0x70, 0xCA, 0xA6, 0x81, 0xBE, 0xCE, 0x25, 0x1C, 0xBE, 0xCE, 0x4E,
+ 0xF1, 0xB6, 0xBA, 0x4E, 0xDE, 0x3D, 0xE3, 0x17, 0xE6, 0xBD, 0xC4, 0x67, 0x9A, 0xCC, 0x4E, 0x69, 0xE6, 0x29, 0x77, 0x6D,
+ 0x10, 0x36, 0xB0, 0x26, 0xB0, 0x63, 0x8D, 0xDD, 0x1A, 0xB8, 0xC5, 0x1C, 0xD4, 0xA0, 0xBF, 0xB5, 0x0D, 0x35, 0xAB, 0x03,
+ 0x5B, 0x30, 0xDB, 0xB2, 0x4E, 0x7B, 0x47, 0x96, 0x5D, 0x20, 0x85, 0xC2, 0xD4, 0x69, 0x4C, 0x4C, 0xD9, 0x0C, 0xC2, 0x90,
+ 0x8E, 0x3F, 0xE4, 0x6B, 0x8C, 0xD9, 0xE3, 0x0E, 0xCF, 0x9E, 0x6F, 0x5C, 0xE0, 0x5B, 0xD2, 0x38, 0xDA, 0x87, 0x33, 0xCA,
+ 0xF9, 0xBC, 0x7C, 0xD9, 0x83, 0xF4, 0x51, 0x4C, 0xDC, 0xD2, 0x13, 0x74, 0x3C, 0xE4, 0xB0, 0x11, 0x8A, 0x98, 0x8F, 0x2B,
+ 0x6B, 0x91, 0x78, 0x8C, 0xC3, 0x8B, 0x37, 0x47, 0xB3, 0x1B, 0x29, 0x3B, 0xE8, 0x14, 0x38, 0xB2, 0xDF, 0x5C, 0xC6, 0x14,
+ 0xA1, 0xCE, 0x28, 0x46, 0x03, 0xAC, 0xA4, 0xF6, 0x86, 0xCA, 0x6A, 0xC6, 0x78, 0x96, 0x55, 0x29, 0xE0, 0xA3, 0x8D, 0x75,
+ 0x3B, 0x53, 0x95, 0x51, 0x9F, 0x9F, 0x3B, 0xE5, 0xF0, 0x13, 0x14, 0x72, 0x86, 0x33, 0x9C, 0xE5, 0xE8, 0x27, 0x4D, 0x05,
+ 0xDE, 0x22, 0xD3, 0x47, 0x76, 0x3E, 0xCB, 0x96, 0x8D, 0x8E, 0xC5, 0x8B, 0x3A, 0x06, 0x98, 0x56, 0xF2, 0x7D, 0x9C, 0x6C,
+ 0xEA, 0xC3, 0x09, 0x68, 0x4E, 0x10, 0x12, 0x01, 0x22, 0x6D, 0xF4, 0x5B, 0x20, 0xD2, 0xD0, 0x67, 0x21, 0x88, 0xC0, 0x8E,
+ 0x0E, 0xA2, 0xFC, 0x46, 0x02, 0x2F, 0x56, 0xEF, 0x55, 0xB6, 0xD7, 0xE4, 0xBD, 0x75, 0x93, 0xBD, 0x1E, 0xDB, 0xB1, 0x30,
+ 0x0D, 0x28, 0xC1, 0xA2, 0xD9, 0xFE, 0x42, 0xEF, 0x9D, 0xE9, 0x2B, 0x04, 0xA7, 0xC9, 0xD3, 0x74, 0xE8, 0x4F, 0x5B, 0x5B,
+ 0x09, 0x83, 0x6C, 0x8A, 0xE9, 0x6A, 0xEA, 0xE9, 0x69, 0x1F, 0xE2, 0xC4, 0x07, 0xF6, 0x67, 0x00, 0x4D, 0xD3, 0xC6, 0x4F,
+ 0x32, 0xFD, 0x41, 0x39, 0xD1, 0x08, 0x8F, 0xD1, 0x45, 0x35, 0x43, 0x80, 0xD1, 0x60, 0xA6, 0x1F, 0xC1, 0xC7, 0x63, 0xD4,
+ 0x4E, 0x7B, 0xC7, 0xA9, 0x9E, 0x3C, 0xE3, 0x21, 0x45, 0x1E, 0xE1, 0x14, 0x29, 0xBD, 0x57, 0xC9, 0xC3, 0x2E, 0x83, 0xD5,
+ 0xBD, 0x70, 0xE8, 0xC4, 0x1A, 0x0F, 0xC5, 0x21, 0xA4, 0x7F, 0x62, 0x0A, 0x2E, 0xB7, 0x00, 0x96, 0x81, 0x81, 0x6C, 0xA2,
+ 0x37, 0xF3, 0x23, 0x33, 0x52, 0xD6, 0x8F, 0x2D, 0x2E, 0x29, 0x2D, 0x17, 0xD9, 0x80, 0xC6, 0xB4, 0x9D, 0xFE, 0x33, 0x9C,
+ 0x5F, 0xD2, 0x50, 0xCE, 0xD5, 0x85, 0xCA, 0x40, 0xDE, 0x4D, 0x2E, 0xC8, 0x16, 0x7E, 0xA6, 0x95, 0x7A, 0xD4, 0x8D, 0x1E,
+ 0x3B, 0xA1, 0x7E, 0x6D, 0xCB, 0x63, 0xAF, 0x64, 0x2D, 0xC2, 0x8C, 0x98, 0xB9, 0xF9, 0x5F, 0x72, 0xAC, 0x87, 0x69, 0x99,
+ 0xA9, 0x97, 0x8C, 0x29, 0xD9, 0x6C, 0x5E, 0x64, 0xB1, 0xC8, 0xB6, 0x2B, 0xB4, 0x1D, 0x6B, 0x4E, 0x08, 0x93, 0xD1, 0x1B,
+ 0xA6, 0x00, 0x19, 0x00, 0xDA, 0x80, 0x50, 0x37, 0x7C, 0x7C, 0xA0, 0x45, 0x31, 0x1A, 0xE2, 0xCF, 0xD9, 0x7B, 0xCB, 0xE1,
+ 0x19, 0x55, 0xC5, 0x55, 0xA4, 0x0F, 0x0C, 0xF2, 0x78, 0x82, 0x39, 0xCD, 0xCB, 0x99, 0x93, 0x8F, 0x16, 0xBD, 0xC7, 0x0F,
+ 0x64, 0x8B, 0x88, 0x96, 0xAC, 0x9C, 0xF4, 0x69, 0xB6, 0x2A, 0x58, 0x5E, 0xAA, 0x5E, 0x48, 0x47, 0x41, 0x4F, 0x56, 0x30,
+ 0xA2, 0xB7, 0x4B, 0xE3, 0xAD, 0x76, 0x3D, 0x47, 0x96, 0x6C, 0x92, 0x36, 0xDA, 0xC2, 0x75, 0x9C, 0xA2, 0x57, 0x76, 0x15,
+ 0x68, 0xFE, 0x23, 0x2A, 0x31, 0x07, 0x68, 0xE8, 0xB2, 0x75, 0xBC, 0x8A, 0x52, 0x0A, 0x31, 0xDF, 0x79, 0x1C, 0x87, 0x88,
+ 0x9B, 0x6B, 0xA6, 0x2B, 0xC7, 0xA3, 0x91, 0x9A, 0xCF, 0xF2, 0xE5, 0x43, 0xE2, 0x07, 0x7C, 0x6C, 0x93, 0x11, 0x8D, 0x38,
+ 0x81, 0x0D, 0x71, 0x5E, 0x73, 0xF6, 0x26, 0xFE, 0x9A, 0xF6, 0x48, 0x00, 0x70, 0xB9, 0x40, 0x7A, 0xD7, 0xA9, 0xC5, 0xDC,
+ 0x0B, 0xEF, 0x9F, 0x7B, 0x2B, 0x29, 0x7D, 0x7D, 0xB7, 0x89, 0x2D, 0x63, 0x09, 0xBF, 0xD9, 0xB3, 0x51, 0xC3, 0xEC, 0x59,
+ 0x12, 0x99, 0xB1, 0x09, 0x26, 0xA3, 0xCA, 0x9D, 0xE1, 0x07, 0x72, 0xD4, 0xE4, 0xF1, 0x72, 0x5C, 0x1D, 0xAF, 0x80, 0x81,
+ 0xF3, 0xC5, 0x33, 0x1C, 0x65, 0x2A, 0xE9, 0x83, 0xAF, 0x58, 0x8C, 0xEE, 0x16, 0x70, 0x6F, 0x1D, 0x82, 0xB0, 0xA2, 0x93,
+ 0x0F, 0xC2, 0x22, 0x54, 0x3A, 0x0B, 0x36, 0xB6, 0x5C, 0xEB, 0x6D, 0xB4, 0x0A, 0xDD, 0x09, 0xAD, 0x1E, 0xBE, 0xFC, 0x29,
+ 0x44, 0xEF, 0x12, 0xEA, 0xB5, 0xE1, 0xA3, 0x1B, 0x1F, 0x74, 0x49, 0x12, 0x82, 0x67, 0x08, 0xEB, 0x46, 0xA4, 0x4F, 0x37,
+ 0x54, 0xA5, 0x6F, 0x9D, 0x40, 0xDE, 0xB1, 0x41, 0x21, 0x4D, 0xC0, 0x99, 0xCE, 0x63, 0x5C, 0x7C, 0x3C, 0xD8, 0x25, 0x4A,
+ 0x8C, 0xC0, 0xD9, 0xF9, 0x9C, 0x66, 0x6F, 0xC5, 0x74, 0x02, 0xB2, 0xE8, 0xC0, 0xD3, 0xFA, 0x57, 0x3F, 0xD0, 0x57, 0x73,
+ 0x9A, 0xF2, 0xE6, 0x5A, 0x01, 0x4A, 0x27, 0xD2, 0xD2, 0x31, 0x5E, 0x10, 0x44, 0x6A, 0x24, 0x77, 0xDD, 0x69, 0x9D, 0x37,
+ 0x0B, 0xB2, 0xD7, 0xB6, 0x53, 0x34, 0xA6, 0x65, 0xA4, 0x31, 0xD9, 0x0C, 0xD7, 0x84, 0x8C, 0x23, 0x47, 0x21, 0x4D, 0x57,
+ 0xFE, 0xCB, 0x64, 0x06, 0x79, 0x32, 0xA7, 0x3E, 0x13, 0x96, 0xA4, 0x28, 0x83, 0xE1, 0x33, 0xE6, 0x42, 0xE8, 0xE2, 0x6D,
+ 0x93, 0xC5, 0x3A, 0x07, 0xAC, 0x29, 0x22, 0xCD, 0x95, 0xBA, 0xD2, 0x65, 0x68, 0x3B, 0xD0, 0x24, 0x3A, 0xD0, 0x2A, 0x49,
+ 0x8D, 0x5A, 0xF3, 0x16, 0x79, 0xC4, 0xC4, 0x52, 0xBB, 0x1C, 0x47, 0x31, 0xB3, 0x53, 0x39, 0x9A, 0xC4, 0xD1, 0x87, 0x1C,
+ 0xCD, 0x11, 0x11, 0x10, 0x24, 0xD3, 0x22, 0x13, 0x63, 0x95, 0xD9, 0x61, 0xCD, 0xDF, 0x99, 0xC3, 0x38, 0xF9, 0x0F, 0xD9,
+ 0x67, 0x90, 0x4E, 0x53, 0x9D, 0x96, 0x96, 0x6D, 0x09, 0x2C, 0x90, 0xDD, 0x25, 0x0A, 0x44, 0x7C, 0x36, 0x3E, 0x18, 0x3A,
+ 0xA0, 0x16, 0xA5, 0x51, 0x4C, 0xC4, 0x33, 0x6C, 0x14, 0x61, 0x24, 0x9A, 0x13, 0xFB, 0xA6, 0x31, 0xA1, 0x14, 0xFE, 0x8B,
+ 0x3B, 0x1B, 0xF0, 0xF6, 0xE9, 0x1C, 0x5B, 0xF6, 0x60, 0x0E, 0xA5, 0x16, 0xA2, 0x57, 0x4D, 0xA8, 0xCF, 0x49, 0xBC, 0x75,
+ 0xFD, 0xE0, 0x94, 0xD8, 0xE5, 0x3C, 0xC7, 0xD3, 0x73, 0x55, 0x53, 0x55, 0xF8, 0x56, 0xDE, 0xB5, 0xB3, 0xE3, 0x63, 0xE6,
+ 0x1C, 0xBA, 0xD9, 0x44, 0x05, 0x48, 0xB1, 0x4A, 0xDF, 0x3B, 0xE3, 0xAC, 0x33, 0xCF, 0xE4, 0x20, 0x4D, 0xC3, 0xE3, 0x13,
+ 0xF6, 0xC6, 0x84, 0x89, 0x62, 0x34, 0x72, 0xC4, 0xA0, 0x97, 0xAC, 0xA6, 0xA3, 0x0E, 0x3F, 0x07, 0x97, 0x24, 0x42, 0x04,
+ 0xF8, 0x58, 0x41, 0xE3, 0x10, 0xA6, 0x99, 0xEC, 0x88, 0x5E, 0x65, 0x6D, 0xEF, 0x6A, 0x5B, 0xDF, 0xBB, 0x5C, 0x71, 0x43,
+ 0xE9, 0x96, 0x52, 0x4B, 0x3D, 0x40, 0x27, 0x47, 0x0E, 0xE1, 0x40, 0x20, 0x88, 0x91, 0x9E, 0x0C, 0xB5, 0x19, 0xF8, 0xA9,
+ 0x0E, 0xBC, 0xB9, 0xA0, 0xB7, 0x2D, 0xA3, 0x89, 0x87, 0x30, 0x4A, 0xA6, 0xCD, 0x20, 0x24, 0x38, 0x1F, 0x89, 0x7D, 0x78,
+ 0x67, 0x9E, 0x41, 0xAB, 0x52, 0x28, 0x78, 0xC6, 0xA6, 0x24, 0x2B, 0xD5, 0x61, 0x99, 0x71, 0x05, 0x5B, 0xEF, 0x8C, 0xD4,
+ 0x68, 0x7E, 0xC2, 0xC3, 0x90, 0x42, 0xD7, 0x08, 0x5D, 0x8E, 0x88, 0x12, 0x11, 0xCC, 0x93, 0x67, 0xB2, 0x29, 0xE3, 0x54,
+ 0x4D, 0x9B, 0x93, 0x43, 0xB1, 0x3E, 0x4D, 0x11, 0x52, 0x27, 0x39, 0x6A, 0x25, 0xFA, 0xAF, 0x9D, 0x8D, 0x37, 0xBE, 0xB3,
+ 0x67, 0x31, 0xDE, 0x44, 0x0D, 0xB2, 0x3D, 0x70, 0x32, 0xEF, 0x19, 0xBB, 0x41, 0xF4, 0xEA, 0x01, 0xB8, 0x2F, 0xEA, 0x21,
+ 0x8C, 0xB9, 0x3A, 0x10, 0x3F, 0xD0, 0x1D, 0x22, 0x06, 0x8E, 0x9C, 0x53, 0x95, 0x54, 0xB5, 0xFF, 0x17, 0x16, 0x99, 0xD1,
+ 0x86, 0x7F, 0x90, 0x34, 0x08, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
+};
+
+NPT_UInt8 Platinum_48x48_jpg[3041] =
+{
+ 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00,
+ 0xFF, 0xDB, 0x00, 0x43, 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, 0xFF, 0xDB, 0x00, 0x43, 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, 0xFF, 0xC0,
+ 0x00, 0x11, 0x08, 0x00, 0x30, 0x00, 0x30, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00,
+ 0x1D, 0x00, 0x00, 0x01, 0x04, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06,
+ 0x07, 0x08, 0x09, 0x03, 0x04, 0x01, 0x02, 0x0A, 0xFF, 0xC4, 0x00, 0x31, 0x10, 0x00, 0x01, 0x04, 0x02, 0x01, 0x03, 0x02,
+ 0x05, 0x03, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x11, 0x08, 0x12, 0x21,
+ 0x00, 0x31, 0x09, 0x13, 0x14, 0x41, 0x71, 0x15, 0x51, 0x61, 0x16, 0x22, 0x17, 0x32, 0x81, 0x91, 0xA1, 0xC1, 0xF0, 0xFF,
+ 0xC4, 0x00, 0x1A, 0x01, 0x00, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x03, 0x00, 0x01, 0x04, 0x05, 0x06, 0xFF, 0xC4, 0x00, 0x30, 0x11, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04,
+ 0x06, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x11, 0x21, 0x00, 0x03, 0x31, 0x12, 0x41, 0x51, 0x61, 0x71,
+ 0x04, 0x13, 0x22, 0x91, 0x32, 0x42, 0x81, 0xA1, 0xD1, 0xF0, 0xB1, 0x14, 0x15, 0x23, 0xE1, 0xF1, 0xC1, 0xFF, 0xDA, 0x00,
+ 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xAF, 0x09, 0xB2, 0x4E, 0x79, 0xFE, 0xF5, 0xF6, 0xFD,
+ 0xFE, 0xC9, 0xE7, 0xF7, 0xF2, 0xBF, 0xBF, 0xB7, 0x1F, 0xB2, 0xF8, 0xF5, 0xEB, 0x19, 0xA3, 0xFF, 0x00, 0x55, 0xFB, 0x3F,
+ 0xCE, 0x47, 0xB6, 0xBB, 0x44, 0x26, 0xF8, 0x3C, 0x77, 0xB7, 0xD8, 0xE3, 0xFF, 0x00, 0xBE, 0x71, 0xA1, 0x13, 0xE4, 0x6B,
+ 0xC2, 0xA7, 0x7F, 0xF1, 0xC7, 0x3C, 0xFB, 0xAF, 0xF0, 0xA8, 0xAB, 0xED, 0xCF, 0xB7, 0xB2, 0x7F, 0x3E, 0x85, 0x92, 0x94,
+ 0xF9, 0xBF, 0x6E, 0x7F, 0x9F, 0xDB, 0x45, 0xF2, 0xB8, 0xB9, 0x57, 0xB6, 0x5F, 0xD6, 0xC7, 0xD3, 0xB3, 0xDF, 0xC6, 0xB0,
+ 0x63, 0x7B, 0x6E, 0xA7, 0x02, 0xCE, 0xF0, 0x5B, 0xEC, 0x90, 0x2A, 0xEB, 0x4C, 0x70, 0x4C, 0xCF, 0x17, 0x5B, 0xC0, 0x2E,
+ 0x7E, 0x72, 0xD2, 0x95, 0x59, 0x25, 0xD8, 0x51, 0x4C, 0x2D, 0xCB, 0x87, 0x7C, 0x73, 0xC7, 0x48, 0x5B, 0xE4, 0x88, 0x5B,
+ 0xA9, 0xA0, 0x7B, 0x25, 0x82, 0xA2, 0x73, 0x49, 0x8D, 0xDD, 0xD0, 0xF9, 0xCD, 0xBD, 0x3A, 0x08, 0xF5, 0x74, 0xF5, 0x34,
+ 0xCA, 0xEB, 0xA6, 0xFE, 0x92, 0xF0, 0xD1, 0x68, 0xAD, 0x60, 0xCD, 0x78, 0x93, 0x08, 0x46, 0x49, 0x77, 0xD3, 0x22, 0x2F,
+ 0x28, 0x87, 0x8E, 0xCD, 0x7E, 0x1A, 0x39, 0x0C, 0xE1, 0xD4, 0xA9, 0xF8, 0x8C, 0xF5, 0x17, 0xD3, 0x36, 0xD7, 0xEA, 0x02,
+ 0x3B, 0x2E, 0x98, 0xB0, 0xD8, 0xF5, 0xDE, 0x2E, 0x4E, 0x0D, 0x8C, 0x4D, 0x97, 0x61, 0x62, 0x86, 0x2D, 0x78, 0x98, 0xB6,
+ 0xC9, 0x81, 0x85, 0x09, 0x9A, 0x63, 0xE2, 0x08, 0x13, 0xBE, 0x82, 0x16, 0xD7, 0x12, 0xC0, 0x60, 0x99, 0x41, 0x64, 0x22,
+ 0x12, 0x4B, 0x26, 0xB0, 0x84, 0x61, 0xBE, 0xB5, 0xF1, 0x22, 0x36, 0x9D, 0xCD, 0x8B, 0xDB, 0xDD, 0x9F, 0x54, 0x8B, 0x32,
+ 0xAF, 0x48, 0x35, 0x9F, 0x5A, 0xFF, 0x00, 0x26, 0x68, 0xD0, 0x7C, 0x3F, 0xD1, 0xB7, 0x5B, 0x8F, 0x54, 0x99, 0x2C, 0x5B,
+ 0xB7, 0xA1, 0x31, 0x27, 0x9A, 0xBA, 0xE1, 0x57, 0x25, 0x95, 0x9D, 0x57, 0xB4, 0xFB, 0x50, 0x59, 0xAA, 0x23, 0xC4, 0x5B,
+ 0x89, 0x43, 0x1E, 0x41, 0x06, 0x52, 0x6D, 0xA9, 0x19, 0xBF, 0xEB, 0x56, 0xEE, 0x9E, 0x7C, 0x5A, 0x4C, 0x7C, 0x10, 0xC2,
+ 0xC5, 0xBF, 0xA6, 0xDC, 0x3B, 0x28, 0x20, 0x88, 0x7B, 0xD6, 0x17, 0x76, 0x99, 0x14, 0x46, 0x4F, 0x78, 0x64, 0xA4, 0xC9,
+ 0x4F, 0x30, 0xE3, 0x55, 0xD7, 0x45, 0x21, 0x57, 0xF3, 0xA5, 0xD6, 0xCB, 0x21, 0xC5, 0x21, 0x5E, 0x39, 0xF5, 0xEC, 0x1D,
+ 0xF2, 0xF9, 0xD1, 0xFC, 0xDC, 0xDB, 0x17, 0x25, 0x55, 0x1F, 0x8B, 0xA9, 0x3A, 0xBA, 0xB9, 0xC9, 0x8A, 0xA2, 0x3F, 0x7A,
+ 0xD0, 0x72, 0x2E, 0x5C, 0xE4, 0x54, 0xEF, 0xE3, 0xF0, 0xBF, 0x9F, 0x0B, 0xCF, 0x3C, 0xFB, 0xF0, 0xBF, 0xC7, 0x8F, 0xB7,
+ 0xA2, 0x77, 0x1F, 0x57, 0xC5, 0xBE, 0xBF, 0xC7, 0xDE, 0x83, 0xD7, 0x53, 0xE6, 0xCB, 0xC0, 0x79, 0xE7, 0x3C, 0xFA, 0xDF,
+ 0x7F, 0x2D, 0xE9, 0x4E, 0xEB, 0xBE, 0xEF, 0x1D, 0xEE, 0x55, 0x5F, 0x64, 0xF2, 0xBC, 0xFF, 0x00, 0x3E, 0xEA, 0xBF, 0x9E,
+ 0x3D, 0x39, 0xDD, 0x2B, 0xB6, 0x78, 0x6F, 0xFB, 0x79, 0xFF, 0x00, 0xBF, 0x3A, 0x63, 0x28, 0x1D, 0xFF, 0x00, 0x46, 0xBC,
+ 0xF1, 0x87, 0xD8, 0xF3, 0xCE, 0x81, 0xDE, 0x5F, 0x97, 0x52, 0x34, 0x85, 0x7D, 0x34, 0xB2, 0xAC, 0x6C, 0x49, 0x5B, 0x0A,
+ 0xB9, 0x62, 0x74, 0xCD, 0x45, 0x45, 0x56, 0x31, 0xF2, 0x27, 0x6B, 0x16, 0x46, 0xA2, 0xB5, 0x8F, 0x7A, 0x2B, 0x11, 0xEA,
+ 0xD5, 0x7A, 0xF6, 0xF7, 0x7A, 0x5C, 0xB7, 0x51, 0x29, 0xBF, 0xD8, 0xE3, 0xB6, 0x32, 0xE3, 0xD8, 0x78, 0xE3, 0x42, 0xEE,
+ 0x54, 0x8B, 0x8F, 0x39, 0xC9, 0x46, 0x2C, 0xA1, 0x30, 0xF7, 0x7B, 0xE0, 0xCE, 0xA5, 0x4C, 0xDD, 0x25, 0x33, 0xAA, 0xBD,
+ 0x39, 0x95, 0xEC, 0xBE, 0x92, 0x2D, 0xC8, 0xDC, 0x38, 0xBE, 0x3F, 0x57, 0x24, 0x5B, 0x23, 0x5C, 0x4E, 0xD1, 0x44, 0xDF,
+ 0x5A, 0x89, 0xF3, 0x8C, 0xD8, 0x6C, 0x63, 0xCE, 0x75, 0xF8, 0x8D, 0x8E, 0x7B, 0xEC, 0x74, 0x29, 0xE6, 0x54, 0x13, 0x63,
+ 0xE0, 0x23, 0xD9, 0x50, 0x10, 0x0C, 0x82, 0x1D, 0x7F, 0x51, 0x86, 0xCD, 0x2A, 0x0C, 0xEC, 0xB3, 0xDD, 0x37, 0x31, 0x3A,
+ 0x05, 0xA2, 0x47, 0xE1, 0x5A, 0xCC, 0x6D, 0xCC, 0x66, 0x19, 0xE9, 0x41, 0xBA, 0x4E, 0xA3, 0x3A, 0x09, 0x6E, 0x46, 0x69,
+ 0x19, 0xA6, 0xDC, 0xAE, 0x89, 0x52, 0xC2, 0x77, 0x76, 0x5F, 0xE5, 0x53, 0x20, 0xD2, 0xDD, 0x0C, 0xBB, 0x30, 0xFB, 0x33,
+ 0xA2, 0xFE, 0xA7, 0xF4, 0x4E, 0x33, 0xAD, 0xB7, 0xB6, 0xE8, 0xC1, 0x6D, 0x31, 0xAC, 0x77, 0x7C, 0x57, 0xD9, 0x9F, 0x40,
+ 0x4D, 0x8B, 0x25, 0x88, 0xC2, 0x2C, 0xF1, 0x70, 0x31, 0x7A, 0x3C, 0x88, 0xAB, 0x21, 0x64, 0x8A, 0x39, 0x42, 0x5B, 0xC3,
+ 0xE2, 0x75, 0xED, 0x63, 0xA7, 0x6B, 0x56, 0xC8, 0x12, 0x9C, 0x7C, 0x3D, 0xF0, 0x3D, 0x92, 0xBC, 0x46, 0xE5, 0x29, 0x75,
+ 0x12, 0x96, 0x19, 0x11, 0x15, 0x25, 0xD3, 0x1B, 0x6A, 0x8F, 0xC5, 0x48, 0xBC, 0xDB, 0xDA, 0xB4, 0xAD, 0xB8, 0x8F, 0x51,
+ 0x19, 0x12, 0x76, 0xC0, 0x91, 0x1B, 0x68, 0x55, 0x13, 0x17, 0x20, 0x39, 0x4E, 0x1E, 0xCF, 0x66, 0x78, 0x88, 0x08, 0x8D,
+ 0xA8, 0x43, 0xE0, 0x73, 0x7B, 0x93, 0xFC, 0xCA, 0x9E, 0x7C, 0xA2, 0x2A, 0x72, 0xBE, 0x15, 0xBC, 0xB5, 0x5A, 0xA8, 0x9E,
+ 0x55, 0x51, 0x5A, 0xEE, 0x38, 0x5E, 0x7D, 0x33, 0x06, 0x78, 0xFB, 0xFF, 0x00, 0xE2, 0xFE, 0xF5, 0xED, 0xA3, 0x62, 0xC2,
+ 0x87, 0x0B, 0xC6, 0x39, 0xE6, 0xDF, 0xB9, 0xC6, 0x39, 0xD2, 0x6C, 0x9B, 0x27, 0x35, 0x55, 0xBD, 0xDC, 0x2A, 0x73, 0xEF,
+ 0xCF, 0xDB, 0xF6, 0xE7, 0x85, 0x4F, 0x7F, 0x1F, 0xED, 0xC7, 0xAB, 0xD5, 0x6B, 0xAD, 0xCD, 0xF9, 0xC3, 0x04, 0x4C, 0x95,
+ 0xCA, 0xC5, 0x31, 0xB1, 0x48, 0xB0, 0x7C, 0xC7, 0x48, 0xD6, 0x2C, 0x88, 0xD5, 0x56, 0xA4, 0x8E, 0x85, 0x7E, 0x6B, 0x58,
+ 0xE5, 0x4E, 0xD7, 0xBE, 0x35, 0x49, 0x18, 0x8A, 0xAF, 0x8F, 0x87, 0xB5, 0x17, 0xD0, 0xCA, 0xE9, 0x4A, 0xB3, 0x25, 0x96,
+ 0x5F, 0xAF, 0x0D, 0x79, 0xA4, 0x6B, 0x87, 0x51, 0xF4, 0xE7, 0x15, 0x60, 0x9C, 0xF7, 0x1A, 0xBA, 0xF7, 0xFD, 0x1D, 0x3D,
+ 0x5B, 0x1B, 0xAC, 0x8D, 0x37, 0xB7, 0x75, 0x56, 0x3F, 0x8B, 0x1B, 0xD2, 0x81, 0x3A, 0x43, 0x75, 0x62, 0x21, 0x54, 0xD4,
+ 0xA6, 0x6F, 0xAD, 0x32, 0x28, 0xAD, 0xB5, 0x9E, 0xC9, 0xAF, 0x01, 0xB0, 0x86, 0x61, 0x59, 0xA6, 0x20, 0x7B, 0x88, 0x22,
+ 0x8F, 0x2F, 0x9C, 0x46, 0x3C, 0xD6, 0xE5, 0xD8, 0xBA, 0xE3, 0x01, 0x5B, 0xD8, 0x23, 0xD2, 0xFF, 0x00, 0x15, 0x26, 0x42,
+ 0x7E, 0xB4, 0x64, 0x9B, 0x8D, 0xB6, 0x4C, 0xEF, 0xD3, 0xF4, 0xCE, 0xB2, 0xFE, 0x19, 0xC7, 0xB7, 0x38, 0x94, 0x2B, 0xB1,
+ 0x2E, 0x35, 0x51, 0xDC, 0xDD, 0x16, 0x33, 0xFA, 0xE3, 0x27, 0x1D, 0x5D, 0x2F, 0x4B, 0xCD, 0xC5, 0xC3, 0x45, 0x62, 0x32,
+ 0x8B, 0xEE, 0x77, 0x79, 0xB4, 0x2E, 0x2D, 0x6B, 0xD3, 0x56, 0xB9, 0xA8, 0xEB, 0xFF, 0x00, 0x43, 0xF5, 0x8D, 0xAC, 0x31,
+ 0x5D, 0xA8, 0xFA, 0xC9, 0x29, 0x28, 0xF4, 0xFE, 0x30, 0xFD, 0x93, 0x26, 0xC3, 0xB2, 0xB0, 0x92, 0xF0, 0x31, 0xA6, 0x1E,
+ 0xD8, 0xB4, 0xC2, 0xC4, 0xD7, 0xB3, 0x4B, 0x8A, 0x0E, 0xD3, 0x4A, 0x2A, 0x07, 0x64, 0x97, 0x21, 0xA0, 0xD6, 0xA7, 0x63,
+ 0x76, 0xAD, 0x46, 0x59, 0x9D, 0x56, 0x43, 0x08, 0x12, 0x59, 0xFC, 0xBE, 0xA8, 0x4E, 0x0D, 0xCC, 0x4F, 0x97, 0x26, 0xCA,
+ 0xEE, 0xDC, 0xE2, 0x94, 0x0A, 0x22, 0xA3, 0x46, 0x35, 0x5F, 0xF1, 0x6E, 0x3D, 0x2C, 0x65, 0x2E, 0x98, 0xAC, 0xE4, 0xB0,
+ 0x20, 0xE1, 0xA2, 0xAD, 0x91, 0x72, 0xC0, 0xD0, 0x88, 0xA6, 0x07, 0x56, 0xEF, 0xAB, 0x3E, 0x30, 0xB8, 0x77, 0x53, 0x58,
+ 0x19, 0xDA, 0x8B, 0xE2, 0x2D, 0x84, 0xB3, 0x70, 0xE1, 0xF7, 0x67, 0x8F, 0x75, 0x53, 0x7D, 0x8B, 0x14, 0x15, 0x06, 0x71,
+ 0x83, 0xDF, 0x80, 0xC7, 0xC1, 0x0D, 0xBE, 0x3C, 0xF7, 0x04, 0x3D, 0x3A, 0x3C, 0x81, 0x66, 0x20, 0x63, 0x00, 0x6C, 0x91,
+ 0x02, 0x50, 0x72, 0xAC, 0x24, 0xC7, 0x3C, 0x5F, 0x30, 0x57, 0xB3, 0xFD, 0x2C, 0x64, 0x46, 0x5F, 0x0F, 0x38, 0xC2, 0x79,
+ 0x25, 0x07, 0xB8, 0xF6, 0xAB, 0x3A, 0xBC, 0x92, 0x1B, 0xCF, 0x9E, 0x33, 0x91, 0xF9, 0x72, 0xEB, 0xD9, 0x94, 0xB6, 0xD3,
+ 0x91, 0x6C, 0x4E, 0xF9, 0xC3, 0x5C, 0x73, 0xFF, 0x00, 0xAB, 0xAE, 0xA7, 0x77, 0xAF, 0xC1, 0x2F, 0x34, 0xD1, 0x74, 0x15,
+ 0x74, 0x7A, 0xAF, 0x69, 0xD5, 0xE5, 0x3A, 0xA6, 0x80, 0xAA, 0x7C, 0x2E, 0x8B, 0x0F, 0x3E, 0x83, 0x18, 0xB6, 0xD8, 0x12,
+ 0xD9, 0xD9, 0x4E, 0x73, 0x1B, 0xB2, 0x72, 0xF5, 0x0E, 0xFC, 0xF6, 0xC1, 0xFA, 0xC9, 0x24, 0x1C, 0x7E, 0x40, 0x1D, 0x6B,
+ 0xB2, 0x10, 0x6B, 0xC8, 0x26, 0xB6, 0x9E, 0x41, 0x43, 0xFA, 0x16, 0x57, 0xAD, 0xD8, 0xF8, 0x9D, 0xBB, 0x65, 0x28, 0x31,
+ 0x93, 0x52, 0x93, 0x9A, 0xED, 0xF4, 0x9C, 0x38, 0xF3, 0x8F, 0xBA, 0xAC, 0xDA, 0x97, 0xC5, 0x75, 0x49, 0x67, 0x19, 0x45,
+ 0xCC, 0x94, 0xEA, 0x0E, 0x98, 0xFE, 0x53, 0x05, 0xA6, 0x02, 0xF3, 0xCF, 0x7B, 0x7C, 0x9D, 0x49, 0x93, 0xA5, 0xF4, 0xC6,
+ 0x5C, 0xC5, 0x5E, 0x2D, 0x30, 0x76, 0x66, 0x16, 0x70, 0x94, 0xE0, 0x92, 0x59, 0x81, 0xD3, 0x8A, 0x54, 0xEF, 0x94, 0x7A,
+ 0x81, 0xCD, 0x3C, 0xA3, 0x4E, 0x2E, 0x3A, 0xB8, 0x55, 0xA1, 0x29, 0x47, 0x18, 0x51, 0x73, 0xC9, 0x0B, 0xE6, 0x26, 0x69,
+ 0x25, 0x7A, 0xAF, 0xA0, 0x27, 0x24, 0xC5, 0x17, 0x90, 0x2A, 0xCE, 0xE1, 0x58, 0x7B, 0x97, 0x8C, 0xFB, 0x5E, 0x9C, 0xA5,
+ 0xFB, 0xE4, 0x30, 0x7A, 0xF0, 0x70, 0xE7, 0x27, 0x6F, 0x05, 0x3A, 0xDF, 0x9A, 0xC9, 0x8A, 0x8B, 0xDE, 0xA9, 0xC7, 0x85,
+ 0xF2, 0xE4, 0x4F, 0x6F, 0xBF, 0x95, 0xE3, 0xD9, 0x7D, 0xBD, 0xFF, 0x00, 0xED, 0x9D, 0x63, 0x78, 0xEF, 0x59, 0xE2, 0x9F,
+ 0x2D, 0x63, 0xBF, 0x9F, 0xE2, 0x7F, 0x3E, 0x3D, 0xBF, 0xBE, 0x9A, 0x04, 0x69, 0x01, 0x24, 0x13, 0x4C, 0xAC, 0x47, 0x35,
+ 0x18, 0xF7, 0xAA, 0xB5, 0xA8, 0xE5, 0x54, 0x46, 0xAA, 0xAF, 0x6F, 0x6F, 0x2A, 0xE5, 0x5E, 0x17, 0xB5, 0x13, 0x9E, 0x57,
+ 0x8E, 0x3C, 0xAA, 0x7A, 0x5A, 0x99, 0x68, 0x3E, 0xFE, 0xB7, 0xFD, 0xF6, 0xAE, 0xFA, 0x9A, 0x79, 0x3A, 0x67, 0xD7, 0x16,
+ 0xDB, 0x83, 0x03, 0xDE, 0x78, 0x9E, 0xB1, 0xCB, 0x30, 0x3B, 0xAF, 0xD1, 0x4F, 0x03, 0x67, 0x65, 0x98, 0x4D, 0x4E, 0x55,
+ 0xF5, 0x19, 0x92, 0x94, 0x35, 0x6C, 0x18, 0x90, 0x79, 0x00, 0xD8, 0xC9, 0x02, 0x86, 0x32, 0x53, 0x8F, 0x09, 0x2D, 0x1A,
+ 0xFA, 0xE6, 0xB6, 0x63, 0x8B, 0x22, 0xC5, 0xF4, 0xE1, 0x5A, 0xA0, 0xA3, 0xC2, 0x0A, 0x4D, 0xA7, 0xE0, 0xF6, 0xCD, 0xDD,
+ 0xBD, 0xF8, 0x43, 0x72, 0x19, 0x94, 0x67, 0xD2, 0x3D, 0xC3, 0xA4, 0xBF, 0xCA, 0x47, 0x9B, 0x72, 0xAD, 0x0D, 0x70, 0xE4,
+ 0x9E, 0xE6, 0xDC, 0x77, 0x2F, 0x85, 0xFA, 0x57, 0xF2, 0xF3, 0xDE, 0xB3, 0x6F, 0x49, 0x58, 0x4C, 0x73, 0x8C, 0xC4, 0x2C,
+ 0x8E, 0x2D, 0x91, 0x41, 0x74, 0x55, 0x74, 0x43, 0x1E, 0x3A, 0x0A, 0x44, 0xA3, 0xAC, 0x4B, 0x14, 0xF1, 0x3B, 0xFB, 0x5E,
+ 0xE4, 0x72, 0x2C, 0x6A, 0x88, 0xA8, 0x8E, 0x56, 0xAB, 0xD7, 0x84, 0xED, 0x5E, 0x79, 0x6A, 0xFD, 0xBD, 0x64, 0xDC, 0x96,
+ 0xF4, 0x67, 0xD2, 0xC5, 0x2A, 0x54, 0xE1, 0x28, 0x2A, 0xF2, 0x7A, 0xE0, 0x5B, 0x3D, 0x79, 0xD6, 0x82, 0x05, 0x64, 0xA6,
+ 0xB9, 0xBB, 0xE7, 0xF6, 0xAE, 0x3F, 0xB9, 0xD5, 0x9E, 0x74, 0x5B, 0xAB, 0x6F, 0xB2, 0xEC, 0x67, 0x28, 0xD9, 0xF9, 0x76,
+ 0x33, 0x79, 0x7B, 0x47, 0x87, 0x53, 0x5B, 0x98, 0x88, 0x24, 0xB6, 0x55, 0x90, 0xAD, 0xF5, 0x5D, 0x5C, 0xE5, 0xD4, 0x46,
+ 0x5D, 0xBD, 0x57, 0x16, 0x75, 0x50, 0xBA, 0xCE, 0x30, 0x19, 0x3D, 0x98, 0x6E, 0x69, 0x61, 0x8D, 0x24, 0xE4, 0xB6, 0x56,
+ 0xA3, 0x58, 0xAD, 0xEA, 0x7C, 0x1E, 0xDA, 0xED, 0x4B, 0x72, 0x71, 0xBE, 0xA2, 0x44, 0x46, 0xB2, 0x87, 0x6E, 0x28, 0x5C,
+ 0x59, 0xE3, 0x35, 0xD9, 0x1B, 0xB3, 0x76, 0xD2, 0x31, 0x97, 0x4C, 0x97, 0x15, 0x4A, 0x1C, 0x2E, 0x4A, 0xB7, 0xD9, 0xC7,
+ 0x27, 0x7D, 0x57, 0x5D, 0xEE, 0xC8, 0xDA, 0x39, 0xF1, 0xB6, 0x97, 0xD9, 0xD4, 0xB8, 0x79, 0x39, 0x06, 0x42, 0x54, 0x76,
+ 0x57, 0x27, 0x55, 0xE1, 0x35, 0x54, 0xB6, 0x43, 0xD8, 0xB5, 0x5C, 0xB3, 0x0E, 0x3D, 0x88, 0x12, 0xC6, 0x5C, 0xEE, 0x8A,
+ 0x47, 0xBC, 0x62, 0xCC, 0xB7, 0x7D, 0x9D, 0x8D, 0xAC, 0x90, 0x34, 0xDB, 0x72, 0xCE, 0x3F, 0xB8, 0x87, 0x72, 0x19, 0xEE,
+ 0x4A, 0xFA, 0x88, 0x1D, 0x56, 0x9D, 0x31, 0x23, 0xD3, 0x9E, 0x05, 0x73, 0x5E, 0x5B, 0x6F, 0xBF, 0x1A, 0x74, 0x63, 0x22,
+ 0xBE, 0xBB, 0xA3, 0x21, 0x10, 0xF1, 0x8A, 0x0B, 0xE0, 0xA3, 0xC1, 0xC1, 0xE3, 0x9B, 0x29, 0xCE, 0x9B, 0x95, 0x12, 0x51,
+ 0x51, 0x5C, 0xC7, 0xC4, 0xF6, 0x96, 0x08, 0xD6, 0x11, 0xFC, 0xB7, 0x3A, 0x37, 0x7C, 0xC8, 0xA1, 0x2D, 0xAE, 0x8E, 0x22,
+ 0x58, 0xE8, 0xDB, 0xF2, 0x49, 0x46, 0xBD, 0x58, 0xD5, 0x95, 0x8E, 0x64, 0x8C, 0x91, 0xED, 0x59, 0x39, 0x82, 0x53, 0xDB,
+ 0x2B, 0x1B, 0x05, 0xA7, 0x16, 0x9E, 0x31, 0x2F, 0x5E, 0xE3, 0xA3, 0x4B, 0xC5, 0xA7, 0x0D, 0x9F, 0xAE, 0x3F, 0xBE, 0x9E,
+ 0xDA, 0xC1, 0x21, 0x6E, 0x08, 0x07, 0x7D, 0x43, 0xA5, 0x21, 0x58, 0xC5, 0x59, 0x15, 0x1A, 0x92, 0xCD, 0x22, 0xAB, 0xBB,
+ 0x9E, 0xFE, 0xC6, 0xF6, 0x77, 0xBD, 0x51, 0x5C, 0xF4, 0x89, 0x8B, 0x1A, 0x3B, 0x84, 0x8E, 0x3E, 0xDE, 0x5B, 0xC4, 0xEB,
+ 0x7A, 0x6B, 0x37, 0x76, 0xE1, 0x68, 0xEF, 0xC2, 0x16, 0x9C, 0x56, 0x6F, 0x06, 0x2B, 0x57, 0xA5, 0x6E, 0x8B, 0xEA, 0x8B,
+ 0x64, 0x74, 0xBD, 0xB3, 0x3F, 0xC4, 0x9D, 0x01, 0x85, 0xE1, 0xD9, 0x2E, 0x4F, 0x61, 0x5A, 0xCC, 0x4E, 0xCE, 0x4D, 0xBF,
+ 0x8C, 0x4A, 0x78, 0x19, 0x0D, 0x15, 0x85, 0x88, 0x85, 0xDA, 0xE2, 0x54, 0xD4, 0x61, 0xDB, 0x57, 0x17, 0x48, 0x06, 0x48,
+ 0x68, 0x55, 0x8C, 0x2E, 0xFA, 0xD0, 0xF5, 0xB8, 0x1A, 0x30, 0x45, 0x70, 0xC1, 0x88, 0xC6, 0x4F, 0x33, 0xCB, 0x6B, 0x7E,
+ 0x5B, 0x13, 0x65, 0xB3, 0x02, 0x6C, 0xAA, 0x0B, 0x31, 0x2E, 0x37, 0xF8, 0x63, 0x1B, 0xC5, 0xB5, 0xF5, 0x36, 0x88, 0x3E,
+ 0x75, 0x9B, 0x77, 0x6A, 0x5B, 0xC6, 0x40, 0xA5, 0x4E, 0x49, 0x49, 0x38, 0xE1, 0xC1, 0xE2, 0xD7, 0xD4, 0x4A, 0xD5, 0x83,
+ 0xE6, 0x9F, 0x13, 0x6F, 0x86, 0x36, 0x7D, 0x53, 0x7D, 0x97, 0xE4, 0x1D, 0x1C, 0xF5, 0x11, 0x5B, 0xB9, 0x0B, 0x80, 0x62,
+ 0x71, 0xDD, 0x7C, 0x16, 0x41, 0x85, 0xC3, 0xAF, 0x72, 0xAC, 0x8E, 0x46, 0x32, 0x1B, 0x31, 0x84, 0xCF, 0x60, 0x20, 0xDB,
+ 0xBC, 0x73, 0x1C, 0x0A, 0xC7, 0xE6, 0x94, 0xC9, 0xAC, 0xB1, 0xDB, 0x12, 0x66, 0xA4, 0x86, 0x19, 0x06, 0x85, 0x49, 0x9D,
+ 0x62, 0x66, 0xDF, 0xF7, 0x1D, 0x89, 0x17, 0x2D, 0xA9, 0x33, 0x0C, 0x0C, 0x62, 0xDB, 0x74, 0x7D, 0x77, 0x55, 0xEB, 0x47,
+ 0x16, 0x1A, 0xCB, 0x19, 0x7C, 0x44, 0x3A, 0x61, 0x1D, 0xC7, 0xA7, 0x88, 0xDC, 0x6E, 0x49, 0x79, 0xE9, 0xBC, 0x1D, 0xB3,
+ 0x8A, 0x32, 0x6A, 0x1C, 0xEF, 0x9E, 0xAD, 0x05, 0xEA, 0x73, 0x4F, 0x62, 0x98, 0x2E, 0x1F, 0xAD, 0xCF, 0xE9, 0x7C, 0x1D,
+ 0x69, 0xB0, 0x1D, 0x91, 0xDF, 0xE0, 0x78, 0x2E, 0xCC, 0xC8, 0xAE, 0x29, 0x33, 0xD7, 0x65, 0x54, 0x9F, 0xA7, 0xD0, 0xE6,
+ 0xF2, 0x5E, 0x20, 0xB8, 0xED, 0xD2, 0xD8, 0x62, 0x16, 0x94, 0x52, 0x56, 0x2D, 0x49, 0x9F, 0x34, 0x2A, 0xF9, 0x6F, 0x21,
+ 0xB1, 0xAF, 0x73, 0x54, 0x8E, 0xD8, 0xF3, 0xEF, 0xFC, 0x5B, 0xF1, 0x3B, 0x21, 0x12, 0x5B, 0x0C, 0x26, 0x5C, 0x09, 0x7E,
+ 0x28, 0xA7, 0xD1, 0x21, 0x08, 0xB5, 0x19, 0x46, 0x91, 0x2B, 0x23, 0x8D, 0x3B, 0x6F, 0x6A, 0x4E, 0xE4, 0x9D, 0xEB, 0x92,
+ 0xC7, 0x96, 0x5F, 0x94, 0xF1, 0x55, 0x8C, 0xB6, 0x01, 0x9A, 0x5E, 0x0D, 0x47, 0x15, 0xB0, 0xB6, 0x26, 0x47, 0x91, 0x6E,
+ 0x67, 0xD7, 0xD8, 0x4A, 0xD8, 0x5A, 0x51, 0xAF, 0x1E, 0x01, 0xA7, 0x3A, 0x68, 0x61, 0x64, 0x0E, 0x34, 0xD6, 0x8D, 0x1C,
+ 0x51, 0x4F, 0x64, 0x53, 0x63, 0x6C, 0xB6, 0x06, 0xA4, 0x51, 0x48, 0x79, 0x4B, 0x21, 0x73, 0x31, 0x48, 0x9A, 0x57, 0xBD,
+ 0x31, 0xA7, 0x33, 0x6E, 0x5C, 0xDD, 0x03, 0xC1, 0xF5, 0x21, 0x46, 0x79, 0x5B, 0xE6, 0xD4, 0xB5, 0xD6, 0xC8, 0xC6, 0x80,
+ 0xE6, 0xBD, 0x8A, 0x3F, 0x63, 0xF5, 0xA3, 0xDB, 0x44, 0x9C, 0x62, 0x7B, 0xAB, 0xBF, 0x3F, 0x7F, 0xC7, 0x9F, 0x0B, 0xC7,
+ 0xDB, 0xFE, 0x3F, 0x21, 0xD1, 0x2A, 0xE3, 0x3E, 0xE7, 0xF7, 0xFC, 0xFF, 0x00, 0x37, 0xAD, 0x49, 0xCC, 0x6A, 0xB5, 0x51,
+ 0xDC, 0xB9, 0x17, 0x9E, 0x3D, 0x95, 0x3F, 0xD5, 0x3F, 0xF2, 0xA7, 0x0B, 0xC2, 0xF3, 0xC7, 0xAB, 0x22, 0x0D, 0xAD, 0x01,
+ 0x63, 0x66, 0x7C, 0x51, 0xCF, 0xEC, 0xFD, 0x9B, 0x25, 0x27, 0x25, 0x77, 0xE2, 0xBD, 0xDD, 0x0E, 0x5C, 0x8B, 0x19, 0x0E,
+ 0x86, 0xC6, 0x20, 0xEF, 0xE9, 0x0E, 0xCC, 0x2E, 0xE7, 0x9F, 0x1E, 0x83, 0x1A, 0x88, 0x79, 0x88, 0xBE, 0xC6, 0xEB, 0xA1,
+ 0x9A, 0x02, 0x2C, 0xF2, 0x72, 0x64, 0x96, 0x14, 0x0A, 0xAC, 0x52, 0x81, 0x46, 0x89, 0x54, 0x44, 0x32, 0x4B, 0x61, 0x60,
+ 0x69, 0x90, 0x45, 0x0A, 0x8E, 0x10, 0x96, 0x48, 0x55, 0xB2, 0x8F, 0x4A, 0xC5, 0x3A, 0x97, 0xA6, 0x30, 0x3F, 0x14, 0x4E,
+ 0x65, 0x35, 0x68, 0xE2, 0xC0, 0x2D, 0x16, 0xFB, 0x36, 0xB6, 0x63, 0x2E, 0x83, 0x9B, 0xFA, 0xAD, 0xA4, 0x3C, 0xF9, 0xA7,
+ 0x01, 0xEF, 0xEB, 0xA0, 0x6C, 0xA8, 0xAC, 0xE2, 0x17, 0x38, 0x78, 0x3B, 0xE2, 0x62, 0x7C, 0xB4, 0x46, 0x35, 0x15, 0x8D,
+ 0x6B, 0x51, 0xAD, 0x6B, 0x79, 0x4E, 0x51, 0xA8, 0xDE, 0x1B, 0xE3, 0x9E, 0x53, 0xEF, 0xED, 0xCA, 0x80, 0x3B, 0x1F, 0x63,
+ 0x4C, 0xAA, 0xCF, 0xDB, 0xF5, 0x7D, 0x5F, 0x37, 0xFE, 0x03, 0x4A, 0x2C, 0x4F, 0x3D, 0x97, 0x54, 0x66, 0x74, 0x59, 0xD8,
+ 0xD5, 0x42, 0x5D, 0x09, 0x51, 0x34, 0xB0, 0x5E, 0x51, 0x1B, 0x58, 0x1D, 0xC8, 0x57, 0xB8, 0xDD, 0x84, 0x2E, 0x12, 0xF2,
+ 0xAC, 0xBA, 0x73, 0xF8, 0x0A, 0xDA, 0x29, 0xC3, 0x7A, 0xBD, 0x6B, 0x0B, 0x7C, 0x31, 0xD8, 0x36, 0x37, 0x80, 0xD2, 0x82,
+ 0x90, 0xB6, 0x9C, 0x31, 0x46, 0x7F, 0x2E, 0x44, 0x9F, 0xA8, 0xBA, 0x91, 0x43, 0x71, 0x79, 0x2B, 0x03, 0x5C, 0x82, 0x9E,
+ 0xF9, 0xD0, 0x4E, 0xEA, 0xCE, 0x63, 0x9A, 0xAB, 0xB3, 0x84, 0xAF, 0x6F, 0xF1, 0xA1, 0xF7, 0x59, 0x16, 0x25, 0x67, 0x72,
+ 0x7C, 0xF8, 0x55, 0xCD, 0x4D, 0xBE, 0x3C, 0x4C, 0xAE, 0x36, 0xB1, 0x29, 0xCA, 0xB5, 0x36, 0x2A, 0xB0, 0x8C, 0x98, 0x89,
+ 0x05, 0xA3, 0x2E, 0x5B, 0xC0, 0x81, 0xB8, 0x65, 0x85, 0x58, 0xCD, 0x8A, 0x12, 0x20, 0xB3, 0x89, 0xF6, 0x51, 0x44, 0xA3,
+ 0xA1, 0xE4, 0x94, 0x63, 0xA6, 0x26, 0x69, 0x36, 0x37, 0x51, 0x91, 0x28, 0xB9, 0x02, 0xEB, 0x3D, 0x9E, 0xA0, 0xC8, 0x72,
+ 0x52, 0xE4, 0xCE, 0xA4, 0x27, 0xD6, 0x08, 0xD9, 0xE8, 0xF1, 0x8E, 0x5B, 0x01, 0x6F, 0xD3, 0x1D, 0xEB, 0x8D, 0x7F, 0xFF,
+ 0xD9
+};
+
+NPT_UInt8 Platinum_48x48_png[4681] =
+{
+ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30,
+ 0x00, 0x00, 0x00, 0x30, 0x08, 0x02, 0x00, 0x00, 0x00, 0xD8, 0x60, 0x6E, 0xD0, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
+ 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC,
+ 0x61, 0x05, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00,
+ 0xFA, 0x00, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00,
+ 0x17, 0x70, 0x9C, 0xBA, 0x51, 0x3C, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x12, 0x00, 0x00,
+ 0x0B, 0x12, 0x01, 0xD2, 0xDD, 0x7E, 0xFC, 0x00, 0x00, 0x11, 0xB2, 0x49, 0x44, 0x41, 0x54, 0x58, 0x47, 0x6D, 0x98, 0x09,
+ 0x90, 0x5C, 0xD5, 0x75, 0x86, 0x9F, 0x90, 0x10, 0x48, 0x02, 0x84, 0x00, 0xED, 0xB3, 0xAF, 0xBD, 0x4F, 0x77, 0xCF, 0xF4,
+ 0xEC, 0x7B, 0xEF, 0x33, 0xBD, 0xCE, 0xDA, 0x3D, 0x3D, 0xDD, 0xB3, 0xF6, 0xEC, 0xDA, 0x46, 0x1A, 0xA1, 0x0D, 0xA1, 0x65,
+ 0x8C, 0x30, 0x94, 0x04, 0x8C, 0x25, 0x90, 0xC0, 0x06, 0x51, 0x91, 0x64, 0x04, 0xA2, 0x2C, 0x88, 0x21, 0x18, 0x12, 0x0C,
+ 0x49, 0x2C, 0x82, 0x4C, 0xC0, 0x31, 0x06, 0x93, 0x18, 0x2A, 0x94, 0x43, 0x62, 0xA8, 0x72, 0x01, 0x55, 0x10, 0x6C, 0x19,
+ 0xA4, 0xC9, 0x77, 0xDF, 0x1D, 0x35, 0x63, 0xC7, 0x5D, 0xA7, 0x5E, 0xBD, 0x7E, 0xCB, 0x3D, 0xFF, 0xFD, 0xCF, 0x39, 0xFF,
+ 0x39, 0xDD, 0x0B, 0xC6, 0xFA, 0xB7, 0x28, 0xEA, 0x67, 0xC1, 0x95, 0xD9, 0x2B, 0x0B, 0xC4, 0xC9, 0xEC, 0x15, 0xBE, 0xCC,
+ 0xF2, 0x91, 0xD7, 0x95, 0xD9, 0x05, 0xB3, 0x0A, 0x97, 0xAE, 0x88, 0x4B, 0x7C, 0x16, 0x28, 0x0B, 0xAF, 0x28, 0xB3, 0xD7,
+ 0x88, 0x27, 0xB8, 0xB9, 0x70, 0xE1, 0xC2, 0xEB, 0xAE, 0xBB, 0x6E, 0xE1, 0x82, 0xD9, 0x25, 0x37, 0x2C, 0xF9, 0xFA, 0x4F,
+ 0xB3, 0x57, 0xAE, 0x5C, 0xF9, 0xD3, 0x1F, 0xFE, 0xF8, 0xD5, 0xA5, 0x3F, 0x7E, 0xF3, 0xCD, 0x37, 0xCA, 0x65, 0xF1, 0x8A,
+ 0x82, 0x2D, 0x10, 0x9F, 0x85, 0x8B, 0x16, 0x70, 0xF7, 0xEB, 0xCB, 0xB3, 0x0B, 0x2E, 0x5F, 0x11, 0x37, 0x38, 0xB0, 0xB6,
+ 0x58, 0xE4, 0x9A, 0x05, 0xCA, 0x37, 0x72, 0xB5, 0xCB, 0xF8, 0x1E, 0xE9, 0xDD, 0x24, 0x2D, 0xD9, 0xB3, 0x61, 0xB8, 0x67,
+ 0x23, 0x36, 0x94, 0xD8, 0x30, 0x14, 0xDF, 0x38, 0x98, 0x98, 0x48, 0xC6, 0xC7, 0x92, 0x71, 0x8E, 0x13, 0x03, 0x5D, 0xE3,
+ 0x83, 0xDD, 0xA3, 0x03, 0xB1, 0x91, 0xFE, 0xAE, 0x61, 0x69, 0x7D, 0xD1, 0xA1, 0xDE, 0xAE, 0x21, 0x4E, 0x46, 0x7B, 0xC6,
+ 0x26, 0x7A, 0x27, 0x4E, 0x3D, 0x76, 0xFA, 0xE3, 0x8F, 0x3F, 0x7E, 0xFD, 0xB5, 0x8B, 0x7B, 0x77, 0xEE, 0x9B, 0x1C, 0xD9,
+ 0x92, 0x8C, 0x0D, 0xF5, 0xB4, 0xF5, 0xC7, 0x5B, 0x7A, 0x63, 0xA1, 0x44, 0x77, 0x28, 0xC1, 0x49, 0x5F, 0x67, 0x6F, 0xC4,
+ 0x17, 0xE9, 0x0A, 0x74, 0xF5, 0xB4, 0xF6, 0x44, 0x03, 0x89, 0x88, 0x3F, 0xD6, 0xE1, 0xEB, 0xC4, 0xB8, 0xD8, 0xDE, 0xDC,
+ 0xD1, 0xD1, 0xD4, 0xD1, 0xD6, 0xD4, 0xDE, 0xEA, 0x6D, 0xC3, 0x14, 0xDC, 0x4B, 0x10, 0xB8, 0xC7, 0x2B, 0xEE, 0x39, 0x0E,
+ 0x76, 0x8F, 0x0F, 0xC4, 0xC6, 0x40, 0xC0, 0x51, 0x20, 0x88, 0x8E, 0xF5, 0xC5, 0x86, 0xB1, 0x44, 0x6C, 0xA8, 0x37, 0x92,
+ 0xEC, 0xE9, 0x1C, 0xEC, 0xEB, 0x18, 0xEC, 0x6D, 0x1F, 0xE0, 0x38, 0x10, 0xED, 0x4F, 0xC6, 0x06, 0x7F, 0xF5, 0xCB, 0x77,
+ 0x66, 0x67, 0x2F, 0xB3, 0xCB, 0xBF, 0x7B, 0xEE, 0x85, 0xF1, 0xBE, 0xB1, 0x91, 0xEE, 0x91, 0x78, 0xB8, 0x27, 0x16, 0x8C,
+ 0x47, 0x03, 0xDD, 0x9D, 0xC1, 0xEE, 0x78, 0x38, 0x1E, 0x68, 0xF4, 0xFD, 0xF8, 0x47, 0xCF, 0x3D, 0x74, 0xFF, 0x43, 0xCD,
+ 0x75, 0xDE, 0x58, 0x30, 0x06, 0x88, 0xCE, 0xE6, 0xCE, 0x8E, 0xA6, 0x36, 0x15, 0x4A, 0x2B, 0x38, 0x5A, 0x3C, 0xAD, 0x61,
+ 0x67, 0xB8, 0xC5, 0xD5, 0xA2, 0x0C, 0x26, 0x04, 0x0E, 0xE9, 0x7B, 0x20, 0x2E, 0x69, 0x18, 0xC5, 0xB7, 0xA4, 0x41, 0x30,
+ 0x11, 0x49, 0xF6, 0x46, 0x86, 0x53, 0x20, 0xC0, 0xD1, 0xDB, 0xD6, 0x9F, 0x68, 0xED, 0x63, 0xDF, 0xDD, 0xE1, 0x9E, 0x88,
+ 0xAF, 0xA3, 0xBF, 0x2B, 0x79, 0x6C, 0xE6, 0x04, 0x31, 0x02, 0x10, 0xC8, 0x46, 0xE3, 0xC3, 0xFD, 0x1D, 0xBD, 0x5D, 0x81,
+ 0xEE, 0xA8, 0xBF, 0x33, 0xEA, 0x8F, 0xE2, 0x9B, 0xDD, 0xBB, 0x2A, 0x1D, 0x67, 0x7F, 0x78, 0x6E, 0xCF, 0xD4, 0x1D, 0x8E,
+ 0xF2, 0x46, 0x10, 0x08, 0xF7, 0xDE, 0xB6, 0x90, 0x47, 0x9C, 0x60, 0x9C, 0x04, 0x3C, 0x2D, 0x41, 0x77, 0x4B, 0xC0, 0x1D,
+ 0x54, 0x54, 0xF7, 0x02, 0x41, 0x5F, 0x2C, 0x29, 0xDD, 0xAB, 0xC7, 0xE1, 0x44, 0xC7, 0x80, 0x04, 0x21, 0x8E, 0x80, 0x50,
+ 0x71, 0x10, 0x88, 0x44, 0x4B, 0xAF, 0x84, 0xD2, 0x05, 0x01, 0xC1, 0x48, 0x53, 0xAD, 0x07, 0x40, 0x5B, 0x37, 0x6E, 0x3B,
+ 0x7F, 0xF6, 0x3C, 0x80, 0xFE, 0xF9, 0x1F, 0x5F, 0x4B, 0xB4, 0xC5, 0xC1, 0xD1, 0xE1, 0x6B, 0x57, 0xAD, 0x13, 0xC7, 0x4D,
+ 0xF6, 0x66, 0x67, 0x95, 0xA3, 0x58, 0x6B, 0xAD, 0xB3, 0xD5, 0x72, 0xE2, 0x77, 0x05, 0x70, 0x8C, 0xFB, 0xA0, 0x27, 0xC4,
+ 0xD1, 0xEF, 0x09, 0xF2, 0x35, 0xE0, 0x0A, 0x07, 0xDC, 0x01, 0x6E, 0x29, 0xF8, 0x56, 0xA3, 0x30, 0x24, 0xDD, 0xCB, 0x58,
+ 0xCC, 0x59, 0x5B, 0xBF, 0x00, 0xD1, 0xDA, 0x07, 0x1F, 0x82, 0x92, 0x70, 0x0F, 0x68, 0x80, 0x12, 0x0B, 0x77, 0xC7, 0x02,
+ 0x3D, 0x9D, 0xFE, 0x48, 0x4B, 0x73, 0xAB, 0xBB, 0xDE, 0xD3, 0x50, 0x56, 0x7F, 0xE7, 0xEE, 0xEF, 0x8E, 0xF5, 0x6F, 0x38,
+ 0x77, 0xF6, 0xFC, 0xF7, 0x0E, 0x3F, 0x14, 0xB4, 0xFB, 0x83, 0x8D, 0xBE, 0x60, 0x53, 0x58, 0xEE, 0x1E, 0x67, 0x1E, 0xBB,
+ 0xB7, 0xDA, 0x56, 0x1D, 0xF6, 0xB5, 0x36, 0xD6, 0xD8, 0xEB, 0xCA, 0xEB, 0x9A, 0x1C, 0x81, 0x66, 0x97, 0x5F, 0x60, 0xF2,
+ 0x84, 0x38, 0x02, 0x42, 0x9A, 0xCF, 0xE9, 0xC7, 0x94, 0x94, 0x7B, 0x1C, 0x43, 0x80, 0x34, 0x89, 0x00, 0xF7, 0x12, 0x87,
+ 0xA4, 0x24, 0x1A, 0x4E, 0x90, 0xA4, 0x18, 0x99, 0x41, 0x56, 0x46, 0x9A, 0x3A, 0x59, 0x8E, 0x25, 0x0A, 0xB3, 0xF3, 0x87,
+ 0x06, 0x36, 0x6E, 0x1A, 0xBD, 0x7D, 0xB0, 0x2B, 0x99, 0x68, 0x49, 0xD4, 0x57, 0x34, 0x34, 0x56, 0x35, 0xCE, 0xD1, 0xE0,
+ 0x09, 0x71, 0xE2, 0x75, 0x34, 0x01, 0x08, 0xAB, 0xB0, 0x56, 0x38, 0xEB, 0xDD, 0x5E, 0x47, 0x33, 0x6F, 0xCD, 0x07, 0x21,
+ 0xA1, 0x34, 0x3B, 0x7C, 0x98, 0x92, 0x68, 0x1D, 0x50, 0x4D, 0xE5, 0x40, 0x0D, 0x87, 0x04, 0x01, 0x02, 0x41, 0x46, 0x28,
+ 0x41, 0x68, 0x24, 0x08, 0x4E, 0x44, 0x98, 0xFC, 0x31, 0x91, 0xAA, 0xFE, 0x08, 0x99, 0x11, 0x72, 0x05, 0x59, 0xC2, 0x6A,
+ 0x30, 0x97, 0x17, 0x57, 0xEC, 0xD8, 0x76, 0xB0, 0xB6, 0xA4, 0xAE, 0xCC, 0x5C, 0xD6, 0x50, 0xD9, 0x50, 0x53, 0x5A, 0xE3,
+ 0x6D, 0x6C, 0xC2, 0x87, 0x8C, 0x02, 0x21, 0xF3, 0xD4, 0xBA, 0x6B, 0xCB, 0xEA, 0xEC, 0x55, 0x2E, 0x18, 0x05, 0x1F, 0x6F,
+ 0xA5, 0x10, 0x48, 0x1C, 0x3C, 0x23, 0x4D, 0x89, 0xB7, 0xF4, 0x4B, 0xDF, 0x29, 0x04, 0x12, 0xC4, 0x7C, 0x03, 0xC1, 0x55,
+ 0x4B, 0x00, 0x48, 0xD0, 0xE3, 0x13, 0x80, 0x60, 0xC8, 0xDB, 0xE8, 0x6D, 0xAC, 0xA8, 0xCD, 0x5A, 0x9F, 0x39, 0x3A, 0xB4,
+ 0xC5, 0x59, 0xEF, 0x32, 0x14, 0x68, 0xEA, 0x2A, 0x1B, 0xC0, 0xE7, 0x69, 0xF0, 0x48, 0xAF, 0x00, 0x6A, 0x76, 0xF9, 0x78,
+ 0xCC, 0xD3, 0xE0, 0x15, 0x68, 0x1A, 0x05, 0x9A, 0xF9, 0x26, 0x71, 0x70, 0x5D, 0x9A, 0xF2, 0x17, 0xBE, 0x65, 0xAD, 0x0A,
+ 0x83, 0x09, 0xE1, 0xB8, 0xAB, 0xD3, 0xD7, 0x85, 0x7B, 0x28, 0xE1, 0x84, 0x2B, 0xE8, 0x0A, 0xCF, 0x48, 0xFD, 0x08, 0xBB,
+ 0x5B, 0xF0, 0xE4, 0xAC, 0x75, 0xE5, 0x65, 0xE4, 0x34, 0x7B, 0xC2, 0x6D, 0x81, 0x48, 0x7E, 0x66, 0x6E, 0x55, 0x69, 0x75,
+ 0xB9, 0xA5, 0x9C, 0x8B, 0xB8, 0x91, 0x98, 0x30, 0xD5, 0x6B, 0x93, 0x6A, 0x73, 0x4C, 0xCC, 0x07, 0x21, 0xA1, 0x48, 0xC4,
+ 0x0A, 0xF5, 0x89, 0x54, 0xA8, 0x69, 0x11, 0x17, 0x5B, 0x57, 0x8F, 0x94, 0x09, 0x06, 0x82, 0x36, 0x21, 0x5F, 0xED, 0x68,
+ 0x86, 0x94, 0x2F, 0x4E, 0xC2, 0xCE, 0x56, 0x6E, 0xF5, 0x53, 0xEC, 0xBE, 0x68, 0xC8, 0x1B, 0x66, 0xF7, 0xA4, 0x85, 0x45,
+ 0x5F, 0x64, 0x35, 0x16, 0x47, 0x5B, 0xE3, 0xB9, 0xE9, 0x99, 0xD0, 0x53, 0x66, 0x2D, 0x77, 0xD4, 0x38, 0xBD, 0x76, 0xB7,
+ 0x60, 0xC2, 0x35, 0x97, 0x1C, 0x02, 0x81, 0xE3, 0xAF, 0xA0, 0x91, 0x38, 0xA4, 0xB9, 0xEA, 0xDC, 0xCA, 0xB7, 0x1C, 0xA8,
+ 0x64, 0x48, 0x93, 0x32, 0x2A, 0x4D, 0x6A, 0x28, 0xD5, 0xEB, 0xB7, 0xFB, 0x20, 0xE6, 0xFC, 0x53, 0xCF, 0x4C, 0x8D, 0x6F,
+ 0x6B, 0xF3, 0xB4, 0x20, 0x89, 0x5D, 0x81, 0x08, 0x11, 0x71, 0x35, 0xB8, 0xAB, 0x4A, 0xAA, 0x35, 0xB9, 0x85, 0xED, 0x2D,
+ 0x51, 0x6D, 0x6E, 0x61, 0xA9, 0xA5, 0xAC, 0xA2, 0xB8, 0x0C, 0x40, 0x44, 0x4D, 0x50, 0xE2, 0x14, 0x01, 0xF2, 0x39, 0x45,
+ 0x96, 0xA4, 0xE2, 0xE2, 0xB1, 0x0B, 0x3E, 0x52, 0x50, 0xC0, 0x01, 0xA3, 0x18, 0x6F, 0x01, 0x28, 0xC2, 0xBE, 0x29, 0x19,
+ 0x7C, 0x0B, 0xF5, 0x54, 0x8F, 0xF0, 0x21, 0x05, 0xAD, 0xD5, 0xD3, 0x41, 0xE9, 0xAA, 0xF5, 0x19, 0xE0, 0x85, 0x86, 0xCA,
+ 0xC6, 0x03, 0xBB, 0x0F, 0xBC, 0xF3, 0xF6, 0xBB, 0x33, 0xF7, 0xCE, 0xB4, 0x37, 0xB7, 0x25, 0x5A, 0x84, 0x0A, 0x07, 0x9D,
+ 0x7E, 0x47, 0xA5, 0x5D, 0x9B, 0xA7, 0xC1, 0x77, 0x9D, 0xAD, 0xA6, 0xBE, 0xA2, 0xBE, 0xA2, 0xA4, 0xD2, 0x5D, 0xA3, 0xE6,
+ 0x6F, 0xE3, 0x9F, 0xC5, 0xC8, 0xD7, 0x08, 0x49, 0xDF, 0x46, 0x07, 0x1C, 0x29, 0x28, 0x12, 0x8D, 0x00, 0xD4, 0xD2, 0xD4,
+ 0x8E, 0xE3, 0x79, 0x26, 0x84, 0x9C, 0xAF, 0x5C, 0x0F, 0x7B, 0x3B, 0x38, 0x07, 0x0D, 0xDA, 0x05, 0x3D, 0xEE, 0xBA, 0xA6,
+ 0x32, 0x63, 0x69, 0xA9, 0xC1, 0x36, 0x31, 0xB8, 0xE9, 0xAD, 0x8B, 0x6F, 0xBE, 0xF9, 0xE6, 0x1B, 0xD3, 0xBB, 0x0E, 0xC4,
+ 0xC3, 0x31, 0x60, 0xD1, 0x04, 0x50, 0x23, 0xA0, 0xEF, 0xDF, 0x75, 0x60, 0xFF, 0xCE, 0x69, 0x7B, 0x99, 0x9D, 0xDC, 0x12,
+ 0x85, 0x26, 0x4C, 0x84, 0x49, 0x66, 0x31, 0xE7, 0x92, 0x18, 0x69, 0xF3, 0x89, 0x91, 0x68, 0xEC, 0xD5, 0x0E, 0x85, 0x55,
+ 0x64, 0x2B, 0x91, 0x12, 0x2E, 0x8E, 0xDE, 0x30, 0x27, 0x32, 0x4C, 0xE1, 0xA6, 0x16, 0x7F, 0x53, 0x18, 0x40, 0x42, 0x6D,
+ 0x55, 0x86, 0xCC, 0x85, 0x86, 0xC2, 0xAC, 0xC2, 0x48, 0x28, 0xF6, 0xDC, 0xF9, 0xE7, 0x2F, 0x5F, 0xBE, 0xFC, 0xDA, 0x6B,
+ 0xAF, 0x6F, 0x9F, 0x98, 0x1A, 0x49, 0x0C, 0x0F, 0xC7, 0x93, 0xDB, 0x36, 0x4C, 0x7D, 0xF0, 0xC1, 0x7F, 0xFE, 0xE2, 0xCD,
+ 0xB7, 0x81, 0xD8, 0xE6, 0x0D, 0x8B, 0x30, 0x39, 0xBD, 0xEC, 0x24, 0xE8, 0x0C, 0xB4, 0xBA, 0x85, 0x10, 0xAB, 0x57, 0xA8,
+ 0x38, 0xE2, 0x25, 0xD2, 0x25, 0xC5, 0x4A, 0x63, 0x95, 0x1D, 0x28, 0x18, 0x27, 0x4A, 0xD8, 0x1D, 0x82, 0x03, 0x10, 0xC8,
+ 0x56, 0x22, 0xE4, 0xBC, 0x29, 0x0C, 0x8E, 0x4E, 0x7F, 0x47, 0x2C, 0xDC, 0x45, 0x7F, 0xA6, 0xF5, 0x70, 0x9D, 0xE4, 0x65,
+ 0x09, 0x00, 0x21, 0xB5, 0x60, 0xCA, 0x5C, 0x9F, 0xC6, 0x2B, 0x27, 0x66, 0x1E, 0xFE, 0xEA, 0xAB, 0x2F, 0x3F, 0xFF, 0xFC,
+ 0xF3, 0xA7, 0x4E, 0x3D, 0x75, 0xF2, 0x91, 0xC7, 0xFF, 0xE3, 0xBD, 0xDF, 0xD0, 0x3D, 0x2E, 0x5D, 0xBA, 0x74, 0xE4, 0xD0,
+ 0x91, 0xDE, 0xB6, 0x44, 0xBB, 0xA7, 0x25, 0xE0, 0xF0, 0x87, 0x9D, 0xC1, 0xCE, 0xE6, 0xF6, 0x56, 0x57, 0x88, 0x10, 0xB3,
+ 0xB2, 0xCF, 0x4D, 0xC5, 0x11, 0x35, 0x91, 0xC8, 0x12, 0x90, 0xC4, 0x81, 0xB1, 0x38, 0xA6, 0xA4, 0xC4, 0x5B, 0x6A, 0x06,
+ 0xFB, 0x08, 0x78, 0x83, 0xF4, 0x04, 0xF6, 0xC4, 0x5A, 0xDD, 0xA1, 0xAE, 0xBE, 0xF6, 0x1E, 0x56, 0x64, 0x69, 0x77, 0xA3,
+ 0x97, 0xF7, 0xD1, 0x37, 0x34, 0xB7, 0x48, 0xAB, 0x5F, 0x75, 0xCB, 0xAD, 0x91, 0xD6, 0xAE, 0xC3, 0x77, 0xDF, 0xF7, 0xC9,
+ 0x27, 0x9F, 0xA8, 0xE3, 0x0D, 0x9F, 0x6F, 0xBE, 0xFE, 0xFA, 0x6B, 0xCE, 0xDF, 0xFD, 0xD5, 0xAF, 0xB7, 0x0C, 0x6F, 0x1E,
+ 0x89, 0x25, 0x7B, 0x5A, 0xBA, 0x07, 0x3A, 0xFB, 0x06, 0x23, 0xFD, 0x87, 0xEF, 0x3A, 0xBC, 0x71, 0x70, 0xA2, 0xA7, 0x35,
+ 0xCE, 0xF6, 0x20, 0x2C, 0xE8, 0x22, 0x76, 0x1E, 0x7B, 0xED, 0x1C, 0x2B, 0x12, 0x0A, 0x86, 0xCA, 0x2B, 0x52, 0x27, 0xE6,
+ 0x8B, 0x37, 0xB0, 0xDC, 0x55, 0xCE, 0x1D, 0x1B, 0x6F, 0x7F, 0xE9, 0xF9, 0x17, 0x0F, 0xEE, 0x99, 0xA6, 0x94, 0x08, 0x01,
+ 0x98, 0x44, 0x4A, 0xD6, 0xB8, 0xD9, 0x0A, 0x42, 0x5C, 0x55, 0x52, 0x65, 0x28, 0xD0, 0xDD, 0x76, 0xEB, 0x8A, 0x8D, 0x23,
+ 0x93, 0x7B, 0x6F, 0xDF, 0xFB, 0xC6, 0xC5, 0xB7, 0x7E, 0xF7, 0xBB, 0x4F, 0xDE, 0xFF, 0xCD, 0x87, 0xFF, 0xFE, 0xDE, 0x07,
+ 0xBF, 0xFF, 0xFD, 0xA7, 0x8C, 0x22, 0xAF, 0xBC, 0xFC, 0xEA, 0xD6, 0x89, 0x6D, 0xDB, 0x27, 0xB6, 0x4D, 0x8E, 0x4F, 0x7E,
+ 0x7F, 0xE6, 0x61, 0x50, 0x3E, 0xFB, 0xF4, 0xDF, 0x4E, 0xF4, 0x33, 0x3C, 0x8D, 0xC5, 0x82, 0x51, 0x9A, 0xBF, 0xB3, 0xC2,
+ 0xCE, 0xF6, 0x40, 0x20, 0x71, 0xD4, 0x95, 0xD7, 0x53, 0x0D, 0x1C, 0x95, 0x94, 0x68, 0x5E, 0xD5, 0x89, 0x26, 0x7B, 0xB5,
+ 0xDD, 0x53, 0xDF, 0x3C, 0x39, 0xBE, 0xF5, 0xDD, 0x77, 0xDF, 0x63, 0xA1, 0x7F, 0xB9, 0xF0, 0x3A, 0x29, 0xE2, 0xAB, 0xF3,
+ 0x86, 0x9C, 0x7E, 0x77, 0xBD, 0xDB, 0x5E, 0xE3, 0x6E, 0xA8, 0x70, 0x50, 0x4D, 0x50, 0x95, 0xB1, 0x66, 0x9D, 0xC7, 0xE9,
+ 0xDB, 0x3C, 0x32, 0x15, 0x6F, 0xED, 0x26, 0x97, 0xEF, 0xBF, 0x77, 0xE6, 0xF1, 0x47, 0x4F, 0xBF, 0xFA, 0xCA, 0x85, 0x2F,
+ 0xBF, 0xFC, 0x52, 0x8E, 0x22, 0x0C, 0x6E, 0x3F, 0x7E, 0xF6, 0xB9, 0x2F, 0xBE, 0xF8, 0x82, 0xAF, 0xFF, 0xFB, 0x87, 0xAF,
+ 0x9E, 0x7E, 0xE2, 0x47, 0xFB, 0x76, 0xEE, 0xDF, 0x3A, 0xB1, 0xF5, 0xFB, 0x0F, 0x3E, 0x7C, 0xF4, 0xF0, 0x31, 0x51, 0x8F,
+ 0xD6, 0x8A, 0xBA, 0xCA, 0x7A, 0x96, 0x22, 0x13, 0xB0, 0xDA, 0xB2, 0x5A, 0x45, 0xEC, 0x5B, 0x55, 0x49, 0x21, 0x12, 0x75,
+ 0x22, 0xD7, 0xAA, 0x2B, 0xEB, 0x4C, 0x46, 0x7D, 0x77, 0x47, 0xEF, 0x68, 0xDF, 0xC4, 0xF7, 0x8E, 0x1C, 0xFB, 0xB7, 0xB7,
+ 0x7E, 0xF9, 0xFE, 0xFB, 0xEF, 0x43, 0x03, 0xC3, 0x83, 0xC8, 0xC4, 0x7A, 0xEA, 0xD9, 0x0D, 0x85, 0xEC, 0xD2, 0x92, 0x5F,
+ 0xE4, 0xAD, 0xF5, 0x35, 0x37, 0xF8, 0x98, 0x72, 0xBA, 0x42, 0xB1, 0x81, 0xE8, 0xE0, 0xA6, 0xE1, 0xC9, 0xC3, 0x87, 0x1E,
+ 0xF8, 0xC9, 0xF3, 0xFF, 0xA0, 0x82, 0x60, 0x64, 0x53, 0xC7, 0xD8, 0xAB, 0x1F, 0x82, 0xFA, 0xD9, 0x67, 0x9F, 0x71, 0x7C,
+ 0xE3, 0xE2, 0xBF, 0x92, 0xA3, 0x26, 0x8D, 0x81, 0xE8, 0xB3, 0x37, 0x28, 0x07, 0x8A, 0x38, 0x96, 0x57, 0x2B, 0x12, 0x8D,
+ 0xD4, 0x28, 0xA1, 0x4E, 0x55, 0x0E, 0x78, 0x43, 0xDF, 0x6E, 0xBE, 0x69, 0xB9, 0x26, 0x2F, 0xBF, 0xA6, 0xBC, 0xCE, 0xE7,
+ 0x0A, 0x4D, 0x8E, 0x4D, 0xDD, 0x7D, 0xF0, 0x1E, 0x31, 0x3C, 0xD8, 0x6A, 0xA1, 0xD7, 0xDF, 0xD0, 0xCC, 0x08, 0x36, 0x92,
+ 0x18, 0xDA, 0x33, 0xB5, 0x67, 0xFA, 0x8E, 0x69, 0xC8, 0x2F, 0xB3, 0x42, 0x9A, 0xCB, 0x6B, 0x0F, 0xB6, 0xF9, 0x98, 0x29,
+ 0x27, 0xB6, 0x6F, 0xDC, 0xF9, 0xD0, 0xCC, 0x89, 0xD7, 0x7E, 0x76, 0xF1, 0xB7, 0x1F, 0xFE, 0xF7, 0x47, 0x1F, 0xFD, 0xCF,
+ 0x87, 0x1F, 0xFE, 0xF6, 0xA3, 0xFF, 0xFA, 0xF8, 0xD3, 0x4F, 0x3F, 0xBF, 0x74, 0xE9, 0x0F, 0x60, 0x7B, 0xF5, 0xEF, 0x5F,
+ 0x41, 0x54, 0x4D, 0xF9, 0x3A, 0x5B, 0x51, 0x71, 0x65, 0x71, 0x25, 0xD1, 0x07, 0x16, 0x68, 0x30, 0x4E, 0x14, 0x21, 0x5F,
+ 0x2A, 0x31, 0xB2, 0x0E, 0x49, 0x11, 0x18, 0x82, 0x49, 0x7D, 0x7E, 0x21, 0x69, 0x7B, 0xE3, 0xB2, 0x1B, 0x56, 0xDC, 0x7C,
+ 0x53, 0xDA, 0xBA, 0x74, 0xB3, 0xB1, 0x04, 0xB9, 0x2B, 0x31, 0x59, 0x2B, 0x8B, 0xAB, 0x18, 0xFC, 0xC8, 0x98, 0xAB, 0x23,
+ 0xE2, 0xAF, 0x19, 0x93, 0x59, 0xB4, 0xBE, 0xAA, 0x91, 0xAC, 0xEF, 0xEA, 0x48, 0x32, 0xEE, 0x0D, 0xC4, 0xC7, 0x37, 0x0D,
+ 0x6F, 0xDB, 0xBE, 0x79, 0xD7, 0xBE, 0x5D, 0xD3, 0x0F, 0xDC, 0x7B, 0xEC, 0xFE, 0x7B, 0x8E, 0x1E, 0x7D, 0xE0, 0xF8, 0x63,
+ 0xC7, 0x4F, 0x9E, 0x3D, 0xF3, 0xF4, 0x83, 0x0F, 0x1C, 0x1F, 0xEA, 0x4E, 0x46, 0xDB, 0x62, 0x05, 0x59, 0x79, 0x78, 0xA1,
+ 0xEB, 0x49, 0x40, 0xD5, 0xA5, 0x95, 0x72, 0x44, 0x51, 0xE6, 0xCB, 0x25, 0x59, 0x06, 0x20, 0x18, 0xE2, 0xA1, 0x32, 0x73,
+ 0xB9, 0xCD, 0x64, 0x2B, 0x36, 0x14, 0x43, 0x2C, 0x2F, 0xE7, 0x64, 0x64, 0x92, 0xC5, 0x00, 0xA2, 0x67, 0xF5, 0x44, 0x93,
+ 0xBB, 0xA7, 0xEE, 0x3C, 0x76, 0xFF, 0x83, 0x3F, 0x38, 0xFE, 0xE8, 0xD6, 0xE1, 0xAD, 0x84, 0x8C, 0xC4, 0x6C, 0xAC, 0x71,
+ 0xD0, 0xD4, 0x90, 0x99, 0xA0, 0xB7, 0x3D, 0xDC, 0x1C, 0x8D, 0xB6, 0xF6, 0xF5, 0x77, 0x8F, 0x0D, 0xF7, 0x6D, 0x60, 0x5A,
+ 0x1F, 0xE9, 0xDF, 0x48, 0x9E, 0x8D, 0x0D, 0x6E, 0x1E, 0x4F, 0x6E, 0xE9, 0x8D, 0x0C, 0x78, 0xAA, 0x5D, 0x3C, 0x66, 0xD0,
+ 0xE9, 0x6B, 0xAC, 0x95, 0x60, 0x62, 0x87, 0xF4, 0x63, 0x9A, 0x4F, 0xA5, 0xAD, 0x0A, 0xBF, 0x4A, 0x4A, 0x9D, 0x52, 0xD2,
+ 0x94, 0xAA, 0x23, 0xE0, 0x97, 0x16, 0x95, 0x42, 0x2C, 0x53, 0x4E, 0xA9, 0xA5, 0x9C, 0xAF, 0x58, 0x7E, 0x76, 0xCE, 0xBA,
+ 0x35, 0x6B, 0xE3, 0x9D, 0x03, 0xBB, 0x77, 0xDE, 0xC5, 0xC4, 0x12, 0x76, 0xB5, 0x09, 0x21, 0xA9, 0x71, 0xD4, 0x94, 0xD7,
+ 0x36, 0x54, 0xDB, 0xC1, 0x04, 0x4F, 0x58, 0xB3, 0x3D, 0xD0, 0xCA, 0x40, 0x1D, 0xEE, 0x69, 0x0B, 0x77, 0x73, 0x12, 0xF2,
+ 0x47, 0x82, 0x8E, 0xB6, 0x90, 0xB3, 0x35, 0xE4, 0x0A, 0x33, 0x1B, 0x39, 0x6A, 0x1C, 0x6C, 0xCF, 0x58, 0x60, 0xAC, 0xB2,
+ 0x55, 0xC0, 0x4A, 0x55, 0x69, 0x25, 0x68, 0x08, 0x5F, 0x85, 0xB5, 0x52, 0x49, 0x69, 0xB6, 0x04, 0x24, 0x8B, 0x90, 0xFC,
+ 0x27, 0xCB, 0xC4, 0xA3, 0x25, 0xE2, 0x39, 0x69, 0xEC, 0x06, 0x64, 0x90, 0x94, 0x95, 0x96, 0xCE, 0x6F, 0xA8, 0xF1, 0x91,
+ 0x2D, 0x07, 0xF6, 0x1D, 0xF1, 0x39, 0xC2, 0x0C, 0x40, 0xB4, 0x77, 0x10, 0xDB, 0xCC, 0x65, 0xD5, 0x65, 0xB5, 0x55, 0xA5,
+ 0x35, 0xE5, 0xA4, 0x6A, 0x65, 0x03, 0x41, 0xAC, 0xAD, 0xA8, 0x27, 0xB7, 0x40, 0x09, 0x62, 0x3A, 0x8F, 0xE8, 0xFC, 0xCE,
+ 0x20, 0x7B, 0xD8, 0xB9, 0x69, 0xD7, 0x03, 0x47, 0x8E, 0xF9, 0x5D, 0x7E, 0x8B, 0xC1, 0x4A, 0x10, 0xAC, 0x7A, 0x2B, 0xD1,
+ 0x60, 0xE7, 0xB8, 0x50, 0x52, 0xC4, 0xD0, 0x20, 0xA5, 0x5C, 0xD6, 0x97, 0xDB, 0xA5, 0x30, 0xCC, 0x65, 0xBE, 0x9A, 0xFF,
+ 0xA9, 0x19, 0x94, 0x37, 0x4B, 0x8C, 0x25, 0xA4, 0x57, 0xB1, 0xA5, 0x74, 0xCF, 0xAE, 0x43, 0x38, 0x80, 0x1B, 0x92, 0x1A,
+ 0x34, 0x56, 0x63, 0x09, 0x66, 0x31, 0x14, 0x9B, 0xF5, 0x16, 0xE1, 0xC9, 0x68, 0x29, 0x36, 0x95, 0x70, 0x4B, 0x88, 0x4D,
+ 0xB5, 0x88, 0xA9, 0xB7, 0x21, 0xD0, 0x19, 0xEE, 0xE9, 0x08, 0xC4, 0xFD, 0xCE, 0xD0, 0xD4, 0x86, 0x1D, 0xF7, 0x4C, 0x1F,
+ 0x21, 0x82, 0x2D, 0x9E, 0x70, 0x5F, 0xF7, 0x00, 0xBC, 0xB0, 0x2C, 0xBB, 0x55, 0xA4, 0x6C, 0x33, 0x05, 0x8B, 0x3C, 0x90,
+ 0x80, 0x04, 0x43, 0xC2, 0x54, 0x4C, 0x42, 0x1B, 0xE4, 0x11, 0x58, 0xF0, 0x24, 0x83, 0x98, 0xBD, 0x3E, 0xBD, 0xD9, 0x13,
+ 0x1C, 0xEC, 0xDD, 0x44, 0x98, 0xC4, 0x5A, 0x45, 0x36, 0x89, 0xC3, 0x90, 0x6F, 0xD0, 0xE5, 0xEA, 0xB4, 0x39, 0x5A, 0x4D,
+ 0xB6, 0x46, 0x93, 0xAB, 0xD5, 0xE5, 0xEB, 0x4D, 0x5A, 0x23, 0x77, 0xA1, 0xD0, 0x5E, 0xEB, 0x6C, 0x76, 0x86, 0x49, 0xF9,
+ 0xDD, 0x3B, 0x0F, 0x1D, 0xBE, 0xEF, 0x91, 0xCE, 0xF6, 0xDE, 0xF4, 0xF5, 0x59, 0x85, 0xF9, 0x05, 0x56, 0xB3, 0xAD, 0xAE,
+ 0xD6, 0xC1, 0x3A, 0x66, 0x93, 0x85, 0x4A, 0x52, 0x50, 0xB9, 0x94, 0x6C, 0x4B, 0xDD, 0x14, 0x6C, 0x7F, 0x8B, 0xE9, 0x5B,
+ 0xC9, 0x92, 0x02, 0x0D, 0xAB, 0x0C, 0xD1, 0x56, 0x83, 0x09, 0xFE, 0x2B, 0x6D, 0xD5, 0xF8, 0x70, 0x3B, 0xFC, 0xE5, 0xC5,
+ 0x95, 0x24, 0x3B, 0x68, 0x18, 0xF8, 0x99, 0x1E, 0x73, 0xD2, 0xB2, 0x72, 0xD2, 0x32, 0x18, 0xD6, 0x72, 0x33, 0xF2, 0xE8,
+ 0xC4, 0x45, 0x9A, 0xA2, 0xB2, 0x92, 0xAA, 0x86, 0x2A, 0x27, 0x99, 0xBE, 0x61, 0x7C, 0xC7, 0xC3, 0xC7, 0xCF, 0xEC, 0xDE,
+ 0x71, 0xF0, 0xDA, 0x6B, 0xAF, 0xBD, 0x65, 0xC5, 0xF2, 0xF4, 0xB5, 0xEB, 0xD2, 0xD6, 0xAC, 0x5D, 0xBF, 0x7A, 0x4D, 0xE6,
+ 0xBA, 0x8C, 0xFC, 0xAC, 0x3C, 0x0A, 0x48, 0x51, 0x99, 0xA8, 0xAB, 0xAB, 0xA8, 0x61, 0x7E, 0x80, 0x12, 0x19, 0x29, 0xA9,
+ 0x9B, 0x52, 0x3A, 0xE5, 0x51, 0x46, 0x0D, 0x86, 0x08, 0xB9, 0x51, 0x63, 0x22, 0x25, 0x71, 0x56, 0x63, 0x6B, 0xEC, 0x89,
+ 0x8D, 0xF9, 0x9B, 0xDA, 0x49, 0x17, 0x38, 0xD0, 0x17, 0x50, 0x8F, 0x39, 0x39, 0xE9, 0xD9, 0xD9, 0xEB, 0x33, 0xB3, 0xD6,
+ 0xA5, 0xC1, 0x22, 0xC8, 0xB8, 0x62, 0xD2, 0x16, 0x21, 0x19, 0xA8, 0x14, 0x75, 0xB7, 0x7D, 0xF2, 0xE0, 0x23, 0x27, 0x7E,
+ 0xE8, 0x71, 0x06, 0x56, 0xDC, 0x78, 0x13, 0x0D, 0x51, 0xA4, 0x76, 0xA1, 0xDE, 0x50, 0xA8, 0x07, 0x8A, 0x59, 0x67, 0x2A,
+ 0xD2, 0x1A, 0x15, 0xE9, 0xEF, 0xAA, 0x63, 0x71, 0xAE, 0xCA, 0x94, 0x40, 0x30, 0x67, 0x65, 0xE8, 0x84, 0x40, 0x03, 0x3D,
+ 0x24, 0x10, 0x0F, 0xD4, 0x57, 0x35, 0x50, 0x47, 0x1B, 0xC6, 0xA6, 0xF6, 0xEF, 0x3B, 0xB2, 0x63, 0xFB, 0x34, 0x51, 0xF0,
+ 0x39, 0x5A, 0xC9, 0xA4, 0x22, 0x9D, 0x59, 0x97, 0xAF, 0x45, 0x23, 0xF2, 0x33, 0xB3, 0x31, 0xA8, 0xE2, 0x1C, 0x8D, 0x25,
+ 0x6A, 0xAC, 0x80, 0x66, 0x26, 0xFB, 0x36, 0x4D, 0x6D, 0xDD, 0x77, 0xCF, 0xDD, 0x0F, 0x76, 0x47, 0xFB, 0x69, 0x3B, 0x16,
+ 0x9D, 0x85, 0xC1, 0x01, 0x10, 0x20, 0x63, 0x08, 0x06, 0x10, 0xA6, 0xCC, 0xC9, 0x76, 0xF9, 0x9C, 0x56, 0x0A, 0x40, 0x65,
+ 0xB8, 0x17, 0x68, 0xE6, 0x6A, 0x52, 0x15, 0x2E, 0x59, 0x68, 0xEC, 0x83, 0x42, 0x23, 0x9D, 0xF5, 0x5A, 0x93, 0xA3, 0xC1,
+ 0xF3, 0xC8, 0x89, 0x33, 0x67, 0xCF, 0x3E, 0x47, 0xAD, 0x25, 0xFB, 0x26, 0x49, 0x58, 0xD2, 0x8B, 0x75, 0x09, 0x90, 0x49,
+ 0xA3, 0x23, 0x1B, 0xF8, 0x05, 0x42, 0x10, 0xF9, 0x4A, 0x11, 0x51, 0x62, 0xC9, 0xBE, 0xCD, 0x77, 0xEC, 0xFE, 0xEE, 0xA1,
+ 0x83, 0x33, 0xB7, 0x4F, 0x1D, 0xE8, 0x8B, 0x8F, 0xC3, 0x0A, 0xEE, 0xB9, 0xA5, 0x26, 0x80, 0x59, 0x9C, 0xE8, 0xAD, 0x94,
+ 0x82, 0x22, 0x65, 0x9B, 0x63, 0x6D, 0x89, 0x50, 0x27, 0x59, 0xE7, 0xE8, 0x0D, 0x8E, 0x49, 0x17, 0xBE, 0x4A, 0x93, 0x17,
+ 0x29, 0x9C, 0x8C, 0x75, 0xEB, 0x6F, 0xBA, 0x71, 0xD9, 0x75, 0xD7, 0x2E, 0xA6, 0xF2, 0x35, 0xF9, 0x86, 0xB3, 0x4F, 0x3C,
+ 0x7F, 0xE2, 0xC4, 0xE9, 0x5D, 0x3B, 0xBE, 0xD3, 0x1B, 0x1D, 0x0D, 0x3A, 0x43, 0x24, 0x80, 0x14, 0x88, 0x8A, 0xA2, 0x72,
+ 0x55, 0xF4, 0x44, 0x67, 0xA0, 0x26, 0xC2, 0x4D, 0x5D, 0x07, 0xEF, 0x3C, 0x72, 0xF2, 0xB1, 0xA7, 0x9F, 0x7C, 0xF2, 0xF9,
+ 0x13, 0x0F, 0x9D, 0x82, 0x2A, 0x39, 0x2F, 0x14, 0x9B, 0x6C, 0x24, 0x9F, 0xA8, 0x47, 0xA3, 0xC5, 0x66, 0xB0, 0x94, 0x1A,
+ 0x05, 0xA0, 0xB9, 0x70, 0x08, 0x97, 0xD6, 0x52, 0x6E, 0x40, 0x03, 0xDB, 0x92, 0x05, 0x05, 0x08, 0xC4, 0x4A, 0x35, 0x55,
+ 0x84, 0x8C, 0x25, 0xC5, 0xBA, 0x22, 0xA2, 0xCE, 0x48, 0x8F, 0x76, 0x2F, 0xBF, 0xF1, 0xE6, 0xFB, 0x0E, 0x3F, 0x72, 0xFA,
+ 0xF4, 0x33, 0x33, 0xF7, 0xFF, 0x00, 0x4C, 0x23, 0xFD, 0x9B, 0x3B, 0x9A, 0xA3, 0x08, 0xF7, 0xD5, 0xCA, 0xB5, 0xBB, 0x6B,
+ 0x3C, 0x0C, 0x0E, 0x41, 0x77, 0x47, 0xBC, 0x33, 0x09, 0xEE, 0xC7, 0x1F, 0x7F, 0x1A, 0x85, 0x84, 0x5D, 0xAF, 0x27, 0x10,
+ 0x69, 0x4F, 0x58, 0x8D, 0x16, 0x96, 0xA2, 0x66, 0xD5, 0x06, 0x20, 0x30, 0x91, 0xA0, 0x8A, 0x24, 0x40, 0xB6, 0x15, 0x8B,
+ 0xDE, 0xC8, 0x0F, 0x6F, 0xE6, 0x26, 0x46, 0x02, 0x7C, 0x43, 0xA9, 0x0A, 0xA8, 0x42, 0x1A, 0x80, 0x78, 0x19, 0x7A, 0x81,
+ 0x4B, 0xE0, 0xF3, 0x32, 0xB2, 0x48, 0xD5, 0x93, 0x27, 0xCF, 0xBD, 0xFC, 0xCA, 0x5B, 0x2F, 0xBE, 0x78, 0xE1, 0xD1, 0x47,
+ 0x9F, 0xDC, 0xB5, 0xEB, 0xAE, 0xB1, 0xA1, 0x6D, 0xC0, 0x4A, 0x44, 0x86, 0x22, 0xA1, 0x78, 0xA7, 0xAF, 0xBB, 0xAB, 0xAD,
+ 0x7F, 0xA8, 0x77, 0xE3, 0x50, 0xFF, 0xE6, 0x1D, 0x3B, 0xA6, 0x9F, 0x38, 0xF7, 0x02, 0xBF, 0xDD, 0xF8, 0x7B, 0x6A, 0xD1,
+ 0x42, 0xF1, 0xBF, 0x18, 0xD1, 0xE9, 0x6E, 0xEB, 0x11, 0xA9, 0xA3, 0x35, 0x4B, 0x86, 0x30, 0xA2, 0x26, 0x00, 0x49, 0x34,
+ 0x34, 0xAF, 0xA2, 0x02, 0xBD, 0xD9, 0x54, 0x8C, 0x9A, 0x15, 0x64, 0xE7, 0x6B, 0x72, 0x0A, 0xC0, 0x5B, 0x66, 0xB1, 0x71,
+ 0x1D, 0x13, 0x0F, 0x88, 0xF3, 0x32, 0xF2, 0x9A, 0x6D, 0x91, 0xAA, 0xDA, 0xAC, 0xFC, 0xBE, 0xC4, 0xE8, 0xE8, 0xD0, 0xA6,
+ 0x1D, 0x53, 0xFB, 0x5E, 0x7C, 0xE1, 0x67, 0xAF, 0xBF, 0xF1, 0x0E, 0xE1, 0x80, 0xB0, 0x83, 0xFB, 0x8F, 0x1C, 0xFA, 0xCE,
+ 0xCC, 0xF4, 0x81, 0xFB, 0xEE, 0xBE, 0xFB, 0xE8, 0xD1, 0x99, 0xC7, 0x4E, 0x9D, 0x3A, 0xFF, 0xEC, 0xB3, 0x2F, 0x9F, 0x3B,
+ 0xF7, 0xC2, 0xC3, 0xC7, 0x4F, 0xE7, 0xE5, 0x14, 0xAE, 0x5A, 0xB1, 0x92, 0xBA, 0xCB, 0x5A, 0xB7, 0x8E, 0xB8, 0x1B, 0xF5,
+ 0x26, 0x40, 0x10, 0x38, 0xB2, 0x5B, 0xCD, 0x21, 0x21, 0xD9, 0x8A, 0x8A, 0x46, 0xEC, 0x9E, 0x00, 0x71, 0x9B, 0xA7, 0x73,
+ 0x33, 0x33, 0xC4, 0x43, 0xFA, 0x22, 0x98, 0xE4, 0x22, 0xB7, 0x30, 0xA2, 0x59, 0x66, 0xB1, 0x70, 0x51, 0xA7, 0xD1, 0x57,
+ 0xDA, 0x2A, 0x28, 0xB4, 0xBA, 0x9A, 0x46, 0x9D, 0xC6, 0x28, 0xFF, 0xF5, 0xD3, 0x16, 0x18, 0xCF, 0x9C, 0x7A, 0xE6, 0xED,
+ 0xB7, 0x3F, 0xB8, 0x78, 0xF1, 0xDD, 0x7F, 0xBA, 0xF0, 0xD6, 0xAB, 0xAF, 0xFE, 0xFC, 0x27, 0x2F, 0x31, 0xFE, 0xBF, 0xF3,
+ 0xEC, 0xF9, 0x97, 0xC0, 0x77, 0xD7, 0xF4, 0x7D, 0xC7, 0x1F, 0xFC, 0x9B, 0xA3, 0x33, 0x27, 0xAB, 0x2A, 0x6A, 0x33, 0x57,
+ 0xAD, 0xD5, 0xE5, 0x69, 0x0A, 0xB3, 0x73, 0x75, 0x79, 0x05, 0xD9, 0xE9, 0x19, 0x85, 0x39, 0x05, 0xF0, 0x6D, 0xD1, 0x59,
+ 0xC1, 0x84, 0x15, 0x6B, 0x2D, 0x0A, 0x9E, 0x48, 0xC0, 0x52, 0x53, 0x05, 0xBE, 0x41, 0x00, 0x2B, 0x25, 0xEA, 0x6D, 0xC0,
+ 0x95, 0x98, 0xCC, 0x12, 0x90, 0x3C, 0x12, 0x2C, 0xD0, 0xF3, 0x87, 0x41, 0xC0, 0x1B, 0x02, 0xCD, 0xFA, 0xB5, 0x69, 0x37,
+ 0x2C, 0x5D, 0xB6, 0x6E, 0xD5, 0xEA, 0xB5, 0x2B, 0x57, 0x81, 0xA9, 0xCC, 0x56, 0xB9, 0x7F, 0xEF, 0xA1, 0xBD, 0x7B, 0x0E,
+ 0x9D, 0x39, 0x73, 0xFE, 0xC2, 0x85, 0x5F, 0xFC, 0xF4, 0xA7, 0x3F, 0x9F, 0x9A, 0xBC, 0x63, 0xED, 0xEA, 0x34, 0x89, 0x78,
+ 0xE9, 0xD2, 0x1B, 0xBA, 0xA3, 0x83, 0xF1, 0xAE, 0x24, 0x35, 0x01, 0xC1, 0x18, 0xA2, 0x65, 0x2A, 0x34, 0x59, 0x34, 0x46,
+ 0x00, 0x89, 0x82, 0xD7, 0x5A, 0xA4, 0x29, 0x32, 0x58, 0x15, 0x45, 0xF4, 0x73, 0xD1, 0xDE, 0x00, 0x21, 0xC3, 0xC9, 0x09,
+ 0x5F, 0x4B, 0xCD, 0x25, 0xA0, 0x11, 0x47, 0x73, 0x09, 0xC9, 0xAE, 0xCF, 0xD7, 0xA2, 0xCE, 0x19, 0x69, 0x99, 0x8C, 0x6F,
+ 0x69, 0xAB, 0xD6, 0xA0, 0xCB, 0xE8, 0x0D, 0x8A, 0xBC, 0x62, 0xF9, 0xCD, 0xCB, 0x97, 0xDD, 0x20, 0x7D, 0x2F, 0x5E, 0x7C,
+ 0x3D, 0x71, 0xAF, 0x2C, 0xAF, 0x59, 0xB4, 0x68, 0x11, 0x7F, 0x89, 0xAE, 0x5C, 0x71, 0xCB, 0xAA, 0x95, 0xB7, 0x5E, 0x73,
+ 0x8D, 0xB2, 0x76, 0xF5, 0xBA, 0x64, 0xFF, 0x06, 0x7D, 0x01, 0x8A, 0xA0, 0x55, 0xB5, 0x47, 0xC8, 0x8F, 0x48, 0x47, 0x8D,
+ 0x99, 0x34, 0x82, 0x02, 0x64, 0x8C, 0x13, 0x45, 0x10, 0xA0, 0xFA, 0x2B, 0xB5, 0xAA, 0xEE, 0xCD, 0x56, 0x70, 0xCC, 0x41,
+ 0x31, 0x97, 0x90, 0x37, 0xEA, 0x15, 0x01, 0x91, 0x77, 0x48, 0x64, 0xDA, 0x2A, 0x4A, 0xAF, 0x72, 0xAE, 0x21, 0x93, 0x38,
+ 0xA2, 0xC8, 0x94, 0x24, 0xFE, 0x16, 0x2F, 0x5E, 0xB4, 0xEA, 0xB6, 0x95, 0xCB, 0x96, 0x2C, 0x95, 0xC8, 0xF8, 0x77, 0x36,
+ 0x7D, 0x4D, 0x5A, 0x56, 0xDA, 0x7A, 0x1E, 0xE0, 0x67, 0x13, 0x74, 0xD2, 0x89, 0xD9, 0xBF, 0x36, 0x37, 0x5F, 0xCA, 0xE0,
+ 0x55, 0x6E, 0x04, 0x0E, 0x91, 0xDA, 0x5A, 0x8B, 0xA5, 0xB0, 0x48, 0x49, 0x71, 0x30, 0x0F, 0x87, 0x15, 0x10, 0x5C, 0x97,
+ 0x65, 0x25, 0x4C, 0x9D, 0xD4, 0x84, 0xE8, 0xA9, 0x3B, 0x13, 0x62, 0x5F, 0xA0, 0x83, 0x30, 0x0C, 0x4C, 0xA4, 0xBF, 0xAB,
+ 0xDA, 0xB9, 0x7A, 0xE5, 0x2A, 0x1A, 0x53, 0x76, 0x5A, 0x16, 0xC7, 0xA5, 0x4B, 0x97, 0xC2, 0x13, 0xD1, 0xCC, 0x4D, 0x47,
+ 0xB2, 0x73, 0x31, 0xB8, 0x24, 0xB2, 0x06, 0x9D, 0x11, 0xCD, 0xA3, 0x1A, 0x8C, 0x1A, 0x1A, 0x90, 0xD8, 0xA1, 0x54, 0x67,
+ 0x0C, 0x28, 0x98, 0x50, 0x6A, 0xE1, 0x58, 0x0D, 0xD6, 0xFF, 0xB7, 0x12, 0x22, 0xA8, 0x5E, 0x17, 0xB9, 0xC5, 0xFB, 0x6A,
+ 0x89, 0xCE, 0xB1, 0x4D, 0x26, 0xEA, 0x8B, 0xF4, 0x79, 0xA2, 0x07, 0x91, 0x58, 0xB0, 0x9D, 0xBE, 0x7A, 0x6D, 0x61, 0xAE,
+ 0x68, 0x1A, 0xE8, 0x53, 0xE6, 0xDA, 0xF5, 0x74, 0x06, 0xE8, 0xA4, 0x75, 0x40, 0xA1, 0x21, 0x57, 0x70, 0x49, 0xB9, 0x00,
+ 0x97, 0x9E, 0x3F, 0x36, 0x30, 0x6E, 0x56, 0x19, 0x62, 0x4D, 0x21, 0xD6, 0x1A, 0x33, 0x50, 0xE4, 0xB2, 0x48, 0xBC, 0xF2,
+ 0x57, 0x70, 0x98, 0xAC, 0x20, 0x90, 0x38, 0xA4, 0x15, 0x1B, 0x8B, 0x64, 0x62, 0xC9, 0x5A, 0x10, 0xB0, 0x74, 0x66, 0x53,
+ 0x9E, 0x68, 0x87, 0x9D, 0xA1, 0x4E, 0x06, 0x1D, 0x1A, 0x2A, 0x1C, 0x68, 0x0B, 0x75, 0xB8, 0xC7, 0x90, 0x4D, 0x68, 0x03,
+ 0x04, 0x88, 0xE7, 0xDA, 0x67, 0x81, 0x8E, 0x36, 0x42, 0xE0, 0xD0, 0x94, 0x2D, 0xA3, 0xDB, 0x66, 0xEE, 0x39, 0x06, 0x6D,
+ 0x42, 0x78, 0xB4, 0xA2, 0xA1, 0xD2, 0xEC, 0x30, 0x15, 0x90, 0x41, 0x00, 0x4A, 0x39, 0x9E, 0x77, 0x42, 0x0E, 0xAB, 0x13,
+ 0xD6, 0x3C, 0x13, 0x7F, 0x02, 0x19, 0x08, 0xB6, 0x0A, 0x48, 0x53, 0x44, 0x6E, 0x32, 0x89, 0xF2, 0x1B, 0xC1, 0x66, 0x2E,
+ 0x81, 0x12, 0x19, 0x47, 0x59, 0x41, 0xF2, 0x3C, 0x15, 0x56, 0xF6, 0x6D, 0x2C, 0xD4, 0xF2, 0x3C, 0x84, 0xE5, 0x66, 0xE7,
+ 0x30, 0x43, 0xEE, 0xDD, 0xBE, 0x7F, 0xF3, 0xF8, 0x24, 0xDD, 0x97, 0x35, 0x65, 0xE8, 0xD5, 0xB7, 0xB4, 0x84, 0x52, 0xA1,
+ 0x9A, 0xE6, 0x70, 0xD0, 0x16, 0xE6, 0xB9, 0x4F, 0x69, 0xB9, 0xC5, 0x70, 0x15, 0x9C, 0xA1, 0x44, 0xA5, 0x47, 0x18, 0x12,
+ 0x0A, 0x38, 0x7C, 0xF0, 0x23, 0x89, 0x89, 0x16, 0x3E, 0x24, 0x9A, 0xD4, 0x46, 0xD9, 0xAE, 0x1C, 0x27, 0x52, 0x69, 0xC7,
+ 0xC3, 0x3C, 0xB0, 0xFA, 0xD6, 0xDB, 0x6A, 0xAA, 0xEA, 0xF9, 0xE7, 0x2A, 0xDA, 0xD2, 0x45, 0x03, 0xE5, 0x4F, 0x1C, 0x40,
+ 0x00, 0x85, 0xD7, 0x59, 0x93, 0xA3, 0x22, 0xA7, 0xAD, 0x39, 0x3E, 0x0C, 0xA2, 0xCF, 0xCD, 0xC5, 0x88, 0x51, 0x57, 0xF6,
+ 0xE1, 0xB9, 0x6E, 0x2C, 0x64, 0x54, 0x96, 0x03, 0xAF, 0xC9, 0x94, 0x0F, 0x37, 0xB7, 0xF3, 0x9B, 0x49, 0x64, 0xEB, 0x55,
+ 0x3E, 0xA4, 0x7B, 0x91, 0xA4, 0x1A, 0x71, 0x14, 0x6D, 0x51, 0x0D, 0x84, 0x10, 0x9E, 0x7C, 0x2D, 0xD1, 0x24, 0xC9, 0x96,
+ 0xDF, 0x78, 0x53, 0x7B, 0x30, 0xD6, 0x58, 0xE7, 0xA2, 0xE1, 0xCB, 0x28, 0xAB, 0xB2, 0x04, 0xA3, 0xFC, 0xBE, 0xD1, 0x29,
+ 0x73, 0x4D, 0xC4, 0x60, 0x16, 0xC3, 0xF6, 0x9F, 0x21, 0x50, 0xE7, 0x01, 0x3D, 0xC9, 0xAB, 0xFA, 0x10, 0x61, 0x12, 0x91,
+ 0xC2, 0x0D, 0xA3, 0x1D, 0xB4, 0x6F, 0x48, 0x4E, 0xC6, 0x3B, 0xFB, 0x56, 0xAE, 0xBC, 0x15, 0x1F, 0x0C, 0x1B, 0x2C, 0x9A,
+ 0x2A, 0x19, 0x89, 0x49, 0xB2, 0xF5, 0x17, 0x80, 0x74, 0xD9, 0x05, 0x6B, 0xF8, 0x4B, 0x60, 0xF9, 0xCD, 0xFC, 0xFF, 0xD7,
+ 0xD5, 0xD6, 0xEB, 0x73, 0x04, 0x0B, 0x33, 0x72, 0x99, 0xA2, 0x74, 0x05, 0x28, 0x48, 0x01, 0xA0, 0x95, 0xB9, 0x41, 0x64,
+ 0xAE, 0x9B, 0xCC, 0x49, 0xB8, 0x4C, 0xDE, 0x94, 0x89, 0x18, 0xA9, 0x68, 0x64, 0xBC, 0x11, 0x46, 0x4D, 0x81, 0xD6, 0xDD,
+ 0xE8, 0x41, 0x66, 0x56, 0xDF, 0xB2, 0x4A, 0x26, 0xB2, 0x88, 0x97, 0xC6, 0x20, 0x94, 0xF7, 0x2A, 0x0E, 0x09, 0x25, 0x65,
+ 0xEC, 0x5E, 0xD6, 0x5A, 0x6E, 0x66, 0x16, 0x9A, 0xB4, 0x78, 0xF1, 0x62, 0x66, 0x6D, 0x9B, 0xB9, 0x94, 0x11, 0x56, 0x74,
+ 0x46, 0x55, 0xD2, 0xA8, 0x47, 0x65, 0x9E, 0x57, 0x21, 0x97, 0xB2, 0x88, 0x30, 0xF2, 0x9F, 0x82, 0x44, 0xAC, 0x38, 0x49,
+ 0x65, 0x03, 0xF1, 0x66, 0x13, 0x50, 0xB2, 0x6C, 0xD9, 0x32, 0x54, 0xF8, 0xFA, 0xEB, 0xAF, 0x47, 0xA6, 0x19, 0xE6, 0x65,
+ 0x7E, 0x08, 0x62, 0x0A, 0x45, 0x74, 0xF8, 0x99, 0x2C, 0xC2, 0x34, 0x0F, 0x8D, 0x48, 0xEA, 0x02, 0x11, 0x1D, 0x4D, 0x4E,
+ 0x1E, 0x72, 0x40, 0x03, 0x59, 0xB2, 0x64, 0x89, 0x90, 0xF5, 0x45, 0xD7, 0x32, 0x4D, 0x23, 0xB3, 0x5C, 0x97, 0x0C, 0xFD,
+ 0x1F, 0x2E, 0xB6, 0xCD, 0xAB, 0xF2, 0x82, 0x27, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60,
+ 0x82
+};
+
diff --git a/lib/libUPnP/Platinum/Source/Core/PltMimeType.cpp b/lib/libUPnP/Platinum/Source/Core/PltMimeType.cpp
new file mode 100644
index 0000000..a466595
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltMimeType.cpp
@@ -0,0 +1,162 @@
+/*****************************************************************
+|
+| Platinum - AV Media MimeType
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMimeType.h"
+#include "PltHttp.h"
+//#include "NptLogging.h"
+
+//NPT_SET_LOCAL_LOGGER("platinum.media.server.mimetype")
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+const NPT_HttpFileRequestHandler_FileTypeMapEntry
+PLT_HttpFileRequestHandler_DefaultFileTypeMap[] = {
+ {"l16", "audio/L16;rate=44100;channels=2"},
+ {"l16m", "audio/L16;rate=44100;channels=1"},
+
+ {"wav", "audio/wav"},
+ {"wavm", "audio/wav"},
+ {"alac", "audio/x-alac"},
+ //{"wavm", "audio/x-wav"},
+};
+
+const NPT_HttpFileRequestHandler_FileTypeMapEntry
+PLT_HttpFileRequestHandler_360FileTypeMap[] = {
+ {"l16", "audio/L16"},
+ {"l16m", "audio/L16;rate=44100;channels=1"},
+ {"avi", "video/avi"},
+ {"divx", "video/avi"},
+ {"xvid", "video/avi"},
+ {"mov", "video/quicktime"}
+};
+
+const NPT_HttpFileRequestHandler_FileTypeMapEntry
+PLT_HttpFileRequestHandler_PS3FileTypeMap[] = {
+ {"avi", "video/x-msvideo"},
+ {"divx", "video/x-msvideo"},
+ {"xvid", "video/x-msvideo"},
+ {"mov", "video/mp4"}
+};
+
+const NPT_HttpFileRequestHandler_FileTypeMapEntry
+PLT_HttpFileRequestHandler_SonosFileTypeMap[] = {
+ {"wav", "audio/wav"},
+};
+
+/*----------------------------------------------------------------------
+ | PLT_MimeType::GetMimeType
+ +---------------------------------------------------------------------*/
+const char*
+PLT_MimeType::GetMimeType(const NPT_String& filename,
+ const PLT_HttpRequestContext* context /* = NULL */)
+{
+ return GetMimeType(filename, context?PLT_HttpHelper::GetDeviceSignature(context->GetRequest()):PLT_DEVICE_UNKNOWN);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MimeType::GetMimeType
++---------------------------------------------------------------------*/
+const char*
+PLT_MimeType::GetMimeType(const NPT_String& filename,
+ PLT_DeviceSignature signature /* = PLT_DEVICE_UNKNOWN */)
+{
+ int last_dot = filename.ReverseFind('.');
+ if (last_dot >= 0) { // passing just the extension is ok (ex .mp3)
+ NPT_String extension = filename.GetChars()+last_dot+1;
+ return GetMimeTypeFromExtension(extension, signature);
+ }
+
+ return "application/octet-stream";
+}
+
+/*----------------------------------------------------------------------
+ | PLT_MimeType::GetMimeTypeFromExtension
+ +---------------------------------------------------------------------*/
+const char*
+PLT_MimeType::GetMimeTypeFromExtension(const NPT_String& extension,
+ const PLT_HttpRequestContext* context /* = NULL */)
+{
+ return GetMimeTypeFromExtension(extension, context?PLT_HttpHelper::GetDeviceSignature(context->GetRequest()):PLT_DEVICE_UNKNOWN);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MimeType::GetMimeTypeFromExtension
++---------------------------------------------------------------------*/
+const char*
+PLT_MimeType::GetMimeTypeFromExtension(const NPT_String& extension,
+ PLT_DeviceSignature signature /* = PLT_DEVICE_UNKNOWN */)
+{
+ if (signature != PLT_DEVICE_UNKNOWN) {
+ // look for special case for 360
+ if (signature == PLT_DEVICE_XBOX_360 || signature == PLT_DEVICE_XBOX_ONE) {
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(PLT_HttpFileRequestHandler_360FileTypeMap); i++) {
+ if (extension.Compare(PLT_HttpFileRequestHandler_360FileTypeMap[i].extension, true) == 0) {
+ return PLT_HttpFileRequestHandler_360FileTypeMap[i].mime_type;
+ }
+ }
+
+ // fallback to default if not found
+ } else if (signature == PLT_DEVICE_PS3) {
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(PLT_HttpFileRequestHandler_PS3FileTypeMap); i++) {
+ if (extension.Compare(PLT_HttpFileRequestHandler_PS3FileTypeMap[i].extension, true) == 0) {
+ return PLT_HttpFileRequestHandler_PS3FileTypeMap[i].mime_type;
+ }
+ }
+
+ // fallback to default if not found
+ } else if (signature == PLT_DEVICE_SONOS) {
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(PLT_HttpFileRequestHandler_SonosFileTypeMap); i++) {
+ if (extension.Compare(PLT_HttpFileRequestHandler_SonosFileTypeMap[i].extension, true) == 0) {
+ return PLT_HttpFileRequestHandler_SonosFileTypeMap[i].mime_type;
+ }
+ }
+
+ // fallback to default if not found
+ }
+ }
+
+ // dlna custom ones
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(PLT_HttpFileRequestHandler_DefaultFileTypeMap); i++) {
+ if (extension.Compare(PLT_HttpFileRequestHandler_DefaultFileTypeMap[i].extension, true) == 0) {
+ return PLT_HttpFileRequestHandler_DefaultFileTypeMap[i].mime_type;
+ }
+ }
+
+ const char* type = NPT_HttpFileRequestHandler::GetDefaultContentType(extension);
+ return type?type:"application/octet-stream";
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltMimeType.h b/lib/libUPnP/Platinum/Source/Core/PltMimeType.h
new file mode 100644
index 0000000..0af0a89
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltMimeType.h
@@ -0,0 +1,75 @@
+/*****************************************************************
+|
+| Platinum - AV Media MimeType
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP AV Media MimeType.
+ */
+
+#ifndef _PLT_MIMETYPE_H_
+#define _PLT_MIMETYPE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttp.h"
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_HttpRequestContext;
+
+/*----------------------------------------------------------------------
+| PLT_MimeType
++---------------------------------------------------------------------*/
+class PLT_MimeType
+{
+public:
+ virtual ~PLT_MimeType() {}
+
+ static const char* GetMimeType(const NPT_String& filename,
+ const PLT_HttpRequestContext* context = NULL);
+ static const char* GetMimeType(const NPT_String& filename,
+ PLT_DeviceSignature signature = PLT_DEVICE_UNKNOWN);
+
+ static const char* GetMimeTypeFromExtension(const NPT_String& extension,
+ const PLT_HttpRequestContext* context = NULL);
+ static const char* GetMimeTypeFromExtension(const NPT_String& extension,
+ PLT_DeviceSignature signature = PLT_DEVICE_UNKNOWN);
+
+private:
+ PLT_MimeType() {}
+
+};
+
+#endif /* _PLT_MIMETYPE_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltProtocolInfo.cpp b/lib/libUPnP/Platinum/Source/Core/PltProtocolInfo.cpp
new file mode 100644
index 0000000..d22dc02
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltProtocolInfo.cpp
@@ -0,0 +1,598 @@
+/*****************************************************************
+|
+| Platinum - AV Media Item
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltProtocolInfo.h"
+#include "PltMimeType.h"
+#include "PltHttp.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.protocolinfo")
+
+/*----------------------------------------------------------------------
+| defines
++---------------------------------------------------------------------*/
+#define PLT_FIELD_ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+#define PLT_FIELD_NUM "0123456789"
+
+#define PLT_SP_FLAG_MASK 0x80000000
+#define PLT_LOP_NPT_MASK 0x40000000
+#define PLT_LOP_BYTES_MASK 0x20000000
+#define PLT_PLAYCONTAINER_PARAM_MASK 0x10000000
+#define PLT_S0_INCREASING_MASK 0x08000000
+#define PLT_SN_INCREASING_MASK 0x04000000
+#define PLT_RTSP_PAUSE_MASK 0x02000000
+#define PLT_TM_S_MASK 0x01000000
+#define PLT_TM_I_MASK 0x00800000
+#define PLT_TM_B_MASK 0x00400000
+#define PLT_HTTP_STALLING_MASK 0x00200000
+#define PLT_DLNA_V1_5_FLAG_MASK 0x00100000
+#define PLT_LP_FLAG_MASK 0x00010000
+#define PLT_CLEARTEXTBYTESEEK_FULL_MASK 0x00008000
+#define PLT_LOP_CLEARTEXTBYTES_MASK 0x00004000
+
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static const char PLT_DLNAPNCharsToValidate[] = PLT_FIELD_ALPHA PLT_FIELD_NUM "_";
+static const char PLT_DLNAPSCharsToValidate[] = PLT_FIELD_NUM "-,/";
+static const char PLT_DLNAFlagCharsToValidate[] = "01";
+static const char PLT_DLNAHexCharsToValidate[] = PLT_FIELD_NUM "ABCDEFabcdef";
+static const char PLT_DLNAOTherNameCharsToValidate[] = PLT_FIELD_ALPHA PLT_FIELD_NUM;
+static const char PLT_DLNAOTherValueCharsToValidate[] = PLT_FIELD_ALPHA PLT_FIELD_NUM "_-+,";
+
+static const PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry
+PLT_HttpFileRequestHandler_DefaultDlnaMap[] = {
+ {"image/gif", "DLNA.ORG_PN=GIF_LRG"},
+ {"image/jpeg", "DLNA.ORG_PN=JPEG_LRG"},
+ {"image/jp2", "DLNA.ORG_PN=JPEG_LRG"},
+ {"image/png", "DLNA.ORG_PN=PNG_LRG"},
+ {"image/bmp", "DLNA.ORG_PN=BMP_LRG"},
+ {"image/tiff", "DLNA.ORG_PN=TIFF_LRG"},
+ {"audio/L16", "DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/L16;rate=44100;channels=2", "DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/L16;rate=44100;channels=1", "DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/L16;rate=32000;channels=1", "DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/mpeg", "DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/mp4", "DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/x-ms-wma", "DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/wav", "DLNA.ORG_OP=01;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000"}, // UVerse
+ {"audio/x-wav", "DLNA.ORG_OP=01;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"video/avi", "DLNA.ORG_PN=AVI;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"video/mp4", "DLNA.ORG_PN=MPEG4_P2_SP_AAC;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"video/mpeg", "DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"video/quicktime","DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"video/x-ms-wmv", "DLNA.ORG_PN=WMVHIGH_BASE;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"video/x-msvideo","DLNA.ORG_PN=AVI;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"video/x-ms-asf", "DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"video/x-matroska","DLNA.ORG_OP=01;DLNA.ORG_CI=0"},
+ {"video/x-flv", "DLNA.ORG_OP=01;DLNA.ORG_CI=0"},
+};
+
+static const PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry
+PLT_HttpFileRequestHandler_360DlnaMap[] = {
+ {"video/quicktime","DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"video/mp4", "DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/wav", "DLNA.ORG_OP=01;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/mp4", "DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000"},
+ {"audio/mpeg", "DLNA.ORG_PN=MP3;DLNA.ORG_OP=01"},
+ {"audio/x-ms-wma", "DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_CI=0"}
+};
+
+static const PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry
+PLT_HttpFileRequestHandler_SonosDlnaMap[] = {
+ {"audio/wav", "*"}
+};
+
+static const PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry
+PLT_HttpFileRequestHandler_PS3DlnaMap[] = {
+ {"image/jpg", "DLNA.ORG_OP=01"},
+ {"image/png", "DLNA.ORG_OP=01"}
+};
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::PLT_ProtocolInfo
++---------------------------------------------------------------------*/
+PLT_ProtocolInfo::PLT_ProtocolInfo() :
+ m_Valid(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::PLT_ProtocolInfo
++---------------------------------------------------------------------*/
+/*PLT_ProtocolInfo::PLT_ProtocolInfo(NPT_String protocol_info) :
+ m_Valid(false)
+{
+ SetProtocolInfo(protocol_info);
+}*/
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::PLT_ProtocolInfo
++---------------------------------------------------------------------*/
+PLT_ProtocolInfo::PLT_ProtocolInfo(const char* protocol_info) :
+ m_Valid(false)
+{
+ SetProtocolInfo(protocol_info);
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::PLT_ProtocolInfo
++---------------------------------------------------------------------*/
+PLT_ProtocolInfo::PLT_ProtocolInfo(const char* protocol,
+ const char* mask,
+ const char* content_type,
+ const char* extra) :
+ m_Protocol(protocol),
+ m_Mask(mask),
+ m_ContentType(content_type),
+ m_Extra(extra),
+ m_Valid(false)
+{
+ ValidateExtra();
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::SetProtocolInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ProtocolInfo::SetProtocolInfo(const char* protocol_info)
+{
+ if (!protocol_info || protocol_info[0] == '\0')
+ return NPT_ERROR_INVALID_PARAMETERS;
+
+ NPT_List<NPT_String> parts = NPT_String(protocol_info).Split(":");
+ if (parts.GetItemCount() != 4)
+ return NPT_ERROR_INVALID_SYNTAX;
+
+ NPT_List<NPT_String>::Iterator part = parts.GetFirstItem();
+ m_Protocol = *part++;
+ m_Mask = *part++;
+ m_ContentType = *part++;
+ m_Extra = *part;
+
+ return ValidateExtra();
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::ParseExtra
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ProtocolInfo::ParseExtra(NPT_List<FieldEntry>& entries)
+{
+ if (m_Extra == "*") return NPT_SUCCESS;
+
+ // remove extra characters which could cause parsing errors
+ m_Extra.Trim(";");
+
+ NPT_List<NPT_String> fields = m_Extra.Split(";");
+ NPT_List<NPT_String>::Iterator field = fields.GetFirstItem();
+ if (!field) NPT_CHECK_SEVERE(NPT_ERROR_INVALID_SYNTAX);
+
+ while (field) {
+ NPT_List<NPT_String> entry = (*field).Split("=");
+ if (entry.GetItemCount() != 2) NPT_CHECK_SEVERE(NPT_ERROR_INVALID_SYNTAX);
+ entries.Add(FieldEntry(*entry.GetFirstItem(), *entry.GetLastItem()));
+ ++field;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::ValidateField
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ProtocolInfo::ValidateField(const char* val,
+ const char* valid_chars,
+ NPT_Cardinal num_chars /* = 0 */)
+{
+ if (!valid_chars || !val || val[0] == '\0')
+ return NPT_ERROR_INVALID_PARAMETERS;
+
+ // shortcut
+ if (num_chars && NPT_StringLength(val) != num_chars)
+ return NPT_ERROR_INVALID_SYNTAX;
+
+ while (val) {
+ char c = *val++;
+ if (c == '\0') return NPT_SUCCESS;
+
+ // look for character in valid chars
+ const char* p = valid_chars;
+ while (*p != c && ++p) {};
+
+ // reached end of valid chars means we didn't find it
+ if (!p) break;
+ }
+
+ return NPT_ERROR_INVALID_SYNTAX;
+
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::ValidateExtra
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ProtocolInfo::ValidateExtra()
+{
+ if (m_Extra != "*") {
+ m_Valid = false;
+
+ NPT_List<FieldEntry> entries;
+ NPT_CHECK(ParseExtra(entries));
+
+ NPT_List<FieldEntry>::Iterator entry =
+ entries.GetFirstItem();
+
+ // parse other optional fields
+ PLT_ProtocolInfoParserState state = PLT_PROTINFO_PARSER_STATE_START;
+ for (;entry;entry++) {
+ if (entry->m_Key == "DLNA.ORG_PN") {
+ // pn-param only allowed as first param
+ if (state > PLT_PROTINFO_PARSER_STATE_START) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ NPT_CHECK_LABEL_SEVERE(ValidateField(
+ entry->m_Value,
+ PLT_DLNAPNCharsToValidate), failure);
+
+ m_DLNA_PN = entry->m_Value;
+ state = PLT_PROTINFO_PARSER_STATE_PN;
+ continue;
+ } else if (entry->m_Key == "DLNA.ORG_OP") {
+ // op-param only allowed after pn-param
+ if (state > PLT_PROTINFO_PARSER_STATE_PN) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // validate value
+ NPT_CHECK_LABEL_SEVERE(ValidateField(
+ entry->m_Value,
+ PLT_DLNAFlagCharsToValidate,
+ 2), failure);
+
+ m_DLNA_OP = entry->m_Value;
+ state = PLT_PROTINFO_PARSER_STATE_OP;
+ continue;
+ } else if (entry->m_Key == "DLNA.ORG_PS") {
+ // ps-param only allowed after op-param
+ if (state > PLT_PROTINFO_PARSER_STATE_OP) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // validate value
+ NPT_CHECK_LABEL_SEVERE(ValidateField(
+ entry->m_Value,
+ PLT_DLNAPSCharsToValidate), failure);
+
+ m_DLNA_PS = entry->m_Value;
+ state = PLT_PROTINFO_PARSER_STATE_PS;
+ continue;
+ } else if (entry->m_Key == "DLNA.ORG_CI") {
+ // ci-param only allowed after ps-param
+ if (state > PLT_PROTINFO_PARSER_STATE_PS) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // validate value
+ NPT_CHECK_LABEL_SEVERE(ValidateField(
+ entry->m_Value,
+ PLT_DLNAFlagCharsToValidate,
+ 1), failure);
+
+ m_DLNA_CI = entry->m_Value;
+ state = PLT_PROTINFO_PARSER_STATE_CI;
+ continue;
+ } else if (entry->m_Key == "DLNA.ORG_FLAGS") {
+ // flags-param only allowed after ci-param
+ if (state > PLT_PROTINFO_PARSER_STATE_CI) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // validate value
+ NPT_CHECK_LABEL_SEVERE(ValidateField(
+ entry->m_Value,
+ PLT_DLNAHexCharsToValidate,
+ 32), failure);
+
+ m_DLNA_FLAGS = entry->m_Value;
+ state = PLT_PROTINFO_PARSER_STATE_FLAGS;
+ continue;
+ } else if (entry->m_Key == "DLNA.ORG_MAXSP") {
+ // maxsp-param only allowed after flags-param
+ if (state > PLT_PROTINFO_PARSER_STATE_FLAGS) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // validate value
+ NPT_CHECK_LABEL_SEVERE(ValidateField(
+ entry->m_Value,
+ PLT_FIELD_NUM "."), failure);
+
+ m_DLNA_MAXSP = entry->m_Value;
+ state = PLT_PROTINFO_PARSER_STATE_MAXSP;
+ continue;
+ } else {
+ // don't switch state for unknown value so we don't break parsing next ones
+ // Sony TVs for example have DLNA.ORG_PN=xx;SONY.COM_PN=xx;DLNA.ORG_FLAGS=xxx
+ //state = PLT_PROTINFO_PARSER_STATE_OTHER;
+
+ // validate key first which should IANA_*<"a"-"z","A"-"Z","0"-"9">
+ int index = entry->m_Key.Find("_");
+ if (index == -1) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // validate key
+ if (NPT_FAILED(ValidateField(
+ entry->m_Key.GetChars()+index,
+ PLT_DLNAOTherNameCharsToValidate))) {
+ NPT_LOG_WARNING_2("Invalid protocolinfo 4th field other param: %s=%s",
+ (const char*)entry->m_Key,
+ (const char*)entry->m_Value);
+ continue;
+ }
+
+ // validate value
+ if (NPT_FAILED(ValidateField(
+ entry->m_Value,
+ PLT_DLNAOTherValueCharsToValidate))) {
+
+ NPT_LOG_WARNING_2("Invalid protocolinfo 4th field other param: %s=%s",
+ (const char*)entry->m_Key,
+ (const char*)entry->m_Value);
+ continue;
+ }
+
+ m_DLNA_OTHER.Add(*entry);
+ continue;
+ }
+ }
+ }
+
+ m_Valid = true;
+ return NPT_SUCCESS;
+
+failure:
+ NPT_LOG_WARNING_1("Failure to parse Protocol Info Extras:%s", m_Extra.GetChars());
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::ToString
++---------------------------------------------------------------------*/
+NPT_String
+PLT_ProtocolInfo::ToString() const
+{
+ NPT_String output = m_Protocol + ":";
+ output += m_Mask + ":";
+ output += m_ContentType + ":";
+ // if it wasn't valid or extra is not DLNA, just use it as is
+ if (!m_Valid || m_Extra == "*") {
+ output += m_Extra;
+ } else {
+ bool add_semicolon = false;
+ if (!m_DLNA_PN.IsEmpty()) {
+ output += "DLNA.ORG_PN=" + m_DLNA_PN;
+ add_semicolon = true;
+ }
+ if (!m_DLNA_OP.IsEmpty()) {
+ if (add_semicolon) output += ";";
+ output += "DLNA.ORG_OP=" + m_DLNA_OP;
+ add_semicolon = true;
+ }
+ if (!m_DLNA_PS.IsEmpty()) {
+ if (add_semicolon) output += ";";
+ output += "DLNA.ORG_PS=" + m_DLNA_PS;
+ add_semicolon = true;
+ }
+ if (!m_DLNA_CI.IsEmpty()) {
+ if (add_semicolon) output += ";";
+ output += "DLNA.ORG_CI=" + m_DLNA_CI;
+ add_semicolon = true;
+ }
+ if (!m_DLNA_FLAGS.IsEmpty()) {
+ if (add_semicolon) output += ";";
+ output += "DLNA.ORG_FLAGS=" + m_DLNA_FLAGS;
+ add_semicolon = true;
+ }
+ if (!m_DLNA_MAXSP.IsEmpty()) {
+ if (add_semicolon) output += ";";
+ output += "DLNA.ORG_MAXSP=" + m_DLNA_MAXSP;
+ add_semicolon = true;
+ }
+ if (m_DLNA_OTHER.GetItemCount()) {
+ for (NPT_List<FieldEntry>::Iterator iter = m_DLNA_OTHER.GetFirstItem();
+ iter;
+ iter++) {
+ if (add_semicolon) output += ";";
+ output += iter->m_Key + "=" + iter->m_Value;
+ add_semicolon = true;
+ }
+ }
+ }
+
+ return output;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::Match
++---------------------------------------------------------------------*/
+bool
+PLT_ProtocolInfo::Match(const PLT_ProtocolInfo& other) const
+{
+ // we need the first 3 params
+ if (m_Protocol != '*' &&
+ other.GetProtocol() != '*' &&
+ m_Protocol != other.GetProtocol()) return false;
+
+ if (m_Mask != '*' &&
+ other.GetMask() != '*' &&
+ m_Mask != other.GetMask()) return false;
+
+ if (m_ContentType != '*' &&
+ other.GetContentType() != '*' &&
+ m_ContentType != other.GetContentType()) return false;
+
+ // match DLNAPn of 4th item if not '*'
+ if (m_Extra == '*' ||
+ other.GetExtra() == '*' ||
+ (!m_DLNA_PN.IsEmpty() && m_DLNA_PN == other.GetDLNA_PN())) return true;
+
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::GetMimeTypeFromProtocolInfo
++---------------------------------------------------------------------*/
+NPT_String
+PLT_ProtocolInfo::GetMimeTypeFromProtocolInfo(const char* protocol_info)
+{
+ /*NPT_String info = protocol_info;
+ NPT_List<NPT_String> fragments = info.Split(":");
+ if (fragments.GetItemCount() != 4) return "";
+ return *fragments.GetItem(2);*/
+
+ PLT_ProtocolInfo info(protocol_info);
+ return info.m_ContentType;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::GetDlnaExtension
++---------------------------------------------------------------------*/
+const char*
+PLT_ProtocolInfo::GetDlnaExtension(const char* mime_type,
+ const PLT_HttpRequestContext* context /* = NULL */)
+{
+ return GetDlnaExtension(mime_type,
+ context?PLT_HttpHelper::GetDeviceSignature(context->GetRequest()):PLT_DEVICE_UNKNOWN);
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::GetDlnaExtension
++---------------------------------------------------------------------*/
+const char*
+PLT_ProtocolInfo::GetDlnaExtension(const char* mime_type,
+ PLT_DeviceSignature signature /* = PLT_DEVICE_UNKNOWN */)
+{
+ NPT_String _mime_type = mime_type;
+
+ if (signature != PLT_DEVICE_UNKNOWN) {
+ // look for special case for 360
+ if (signature == PLT_DEVICE_XBOX_360 || signature == PLT_DEVICE_XBOX_ONE || signature == PLT_DEVICE_WMP) {
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(PLT_HttpFileRequestHandler_360DlnaMap); i++) {
+ if (_mime_type.Compare(PLT_HttpFileRequestHandler_360DlnaMap[i].mime_type, true) == 0) {
+ return PLT_HttpFileRequestHandler_360DlnaMap[i].dlna_ext;
+ }
+ }
+ } else if (signature == PLT_DEVICE_SONOS) {
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(PLT_HttpFileRequestHandler_SonosDlnaMap); i++) {
+ if (_mime_type.Compare(PLT_HttpFileRequestHandler_SonosDlnaMap[i].mime_type, true) == 0) {
+ return PLT_HttpFileRequestHandler_SonosDlnaMap[i].dlna_ext;
+ }
+ }
+ } else if (signature == PLT_DEVICE_PS3) {
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(PLT_HttpFileRequestHandler_PS3DlnaMap); i++) {
+ if (_mime_type.Compare(PLT_HttpFileRequestHandler_PS3DlnaMap[i].mime_type, true) == 0) {
+ return PLT_HttpFileRequestHandler_PS3DlnaMap[i].dlna_ext;
+ }
+ }
+
+ return "DLNA.ORG_OP=01"; // Should we try default dlna instead?
+ }
+ }
+
+ for (unsigned int i=0; i<NPT_ARRAY_SIZE(PLT_HttpFileRequestHandler_DefaultDlnaMap); i++) {
+ if (_mime_type.Compare(PLT_HttpFileRequestHandler_DefaultDlnaMap[i].mime_type, true) == 0) {
+ return PLT_HttpFileRequestHandler_DefaultDlnaMap[i].dlna_ext;
+ }
+ }
+
+ return "*";
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::GetProtocolInfoFromMimeType
++---------------------------------------------------------------------*/
+PLT_ProtocolInfo
+PLT_ProtocolInfo::GetProtocolInfoFromMimeType(const char* mime_type,
+ bool with_dlna_extension /* = true */,
+ PLT_DeviceSignature signature /* = PLT_DEVICE_UNKNOWN */)
+{
+ return PLT_ProtocolInfo("http-get:*:"+NPT_String(mime_type)+":"+ \
+ (with_dlna_extension?GetDlnaExtension(mime_type, signature):"*"));
+}
+
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::GetProtocolInfoFromMimeType
++---------------------------------------------------------------------*/
+PLT_ProtocolInfo
+PLT_ProtocolInfo::GetProtocolInfoFromMimeType(const char* mime_type,
+ bool with_dlna_extension /* = true */,
+ const PLT_HttpRequestContext* context /* = NULL */)
+{
+ return GetProtocolInfoFromMimeType(mime_type,
+ with_dlna_extension,
+ context?PLT_HttpHelper::GetDeviceSignature(context->GetRequest()):PLT_DEVICE_UNKNOWN);
+}
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::GetProtocolInfo
++---------------------------------------------------------------------*/
+PLT_ProtocolInfo
+PLT_ProtocolInfo::GetProtocolInfo(const char* filename,
+ bool with_dlna_extension /* = true */,
+ PLT_DeviceSignature signature /* = PLT_DEVICE_UNKNOWN */)
+{
+ return GetProtocolInfoFromMimeType(PLT_MimeType::GetMimeType(filename, signature),
+ with_dlna_extension,
+ signature);
+}
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo::GetProtocolInfo
++---------------------------------------------------------------------*/
+PLT_ProtocolInfo
+PLT_ProtocolInfo::GetProtocolInfo(const char* filename,
+ bool with_dlna_extension /* = true */,
+ const PLT_HttpRequestContext* context /* = NULL */)
+{
+ return GetProtocolInfoFromMimeType(PLT_MimeType::GetMimeType(filename, context),
+ with_dlna_extension,
+ context);
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltProtocolInfo.h b/lib/libUPnP/Platinum/Source/Core/PltProtocolInfo.h
new file mode 100644
index 0000000..d86ef0c
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltProtocolInfo.h
@@ -0,0 +1,158 @@
+/*****************************************************************
+|
+| Platinum - AV Media Protocol Info
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP AV Media Object Protocol Info.
+ */
+
+#ifndef _PLT_PROTOCOL_INFO_H_
+#define _PLT_PROTOCOL_INFO_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttp.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_HttpRequestContext;
+
+/*----------------------------------------------------------------------
+| typedefs
++---------------------------------------------------------------------*/
+typedef struct PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry {
+ const char* mime_type;
+ const char* dlna_ext;
+} PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry ;
+
+/*----------------------------------------------------------------------
+| PLT_ProtocolInfo
++---------------------------------------------------------------------*/
+/**
+ The PLT_ProtocolInfo class holds information about the protocol info of a
+ given UPnP Media Item resource.
+ */
+class PLT_ProtocolInfo
+{
+public:
+ class FieldEntry {
+ public:
+ FieldEntry(const char* key, const char* value) :
+ m_Key(key), m_Value(value) {}
+ NPT_String m_Key;
+ NPT_String m_Value;
+ };
+
+ // class methods
+ static NPT_String GetMimeTypeFromProtocolInfo(const char* protocol_info);
+
+ static const char* GetDlnaExtension(const char* mime_type,
+ const PLT_HttpRequestContext* context = NULL);
+ static const char* GetDlnaExtension(const char* mime_type,
+ PLT_DeviceSignature signature = PLT_DEVICE_UNKNOWN);
+
+ static PLT_ProtocolInfo GetProtocolInfo(const char* filename,
+ bool with_dlna_extension = true,
+ const PLT_HttpRequestContext* context = NULL);
+ static PLT_ProtocolInfo GetProtocolInfo(const char* filename,
+ bool with_dlna_extension = true,
+ PLT_DeviceSignature signature = PLT_DEVICE_UNKNOWN);
+
+ static PLT_ProtocolInfo GetProtocolInfoFromMimeType(const char* mime_type,
+ bool with_dlna_extension = true,
+ const PLT_HttpRequestContext* context = NULL);
+ static PLT_ProtocolInfo GetProtocolInfoFromMimeType(const char* mime_type,
+ bool with_dlna_extension = true,
+ PLT_DeviceSignature signature = PLT_DEVICE_UNKNOWN);
+
+ // methods
+ PLT_ProtocolInfo();
+ //PLT_ProtocolInfo(NPT_String protocol_info);
+ PLT_ProtocolInfo(const char* protocol_info);
+ PLT_ProtocolInfo(const char* protocol,
+ const char* mask,
+ const char* content_type,
+ const char* extra);
+ const NPT_String& GetProtocol() const { return m_Protocol; }
+ const NPT_String& GetMask() const { return m_Mask; }
+ const NPT_String& GetContentType() const { return m_ContentType; }
+ const NPT_String& GetExtra() const { return m_Extra; }
+
+ const NPT_String& GetDLNA_PN() const { return m_DLNA_PN; }
+
+ bool IsValid() { return m_Valid; }
+
+ NPT_String ToString() const;
+
+ bool Match(const PLT_ProtocolInfo& other) const;
+
+private:
+ typedef enum {
+ PLT_PROTINFO_PARSER_STATE_START,
+ PLT_PROTINFO_PARSER_STATE_PN,
+ PLT_PROTINFO_PARSER_STATE_OP,
+ PLT_PROTINFO_PARSER_STATE_PS,
+ PLT_PROTINFO_PARSER_STATE_CI,
+ PLT_PROTINFO_PARSER_STATE_FLAGS,
+ PLT_PROTINFO_PARSER_STATE_MAXSP,
+ PLT_PROTINFO_PARSER_STATE_OTHER
+ } PLT_ProtocolInfoParserState;
+
+ NPT_Result SetProtocolInfo(const char* protocol_info);
+ NPT_Result ValidateField(const char* val,
+ const char* valid_chars,
+ NPT_Cardinal num_chars = 0); // 0 means variable number of chars
+ NPT_Result ParseExtra(NPT_List<FieldEntry>& entries);
+ NPT_Result ValidateExtra();
+
+private:
+ NPT_String m_Protocol;
+ NPT_String m_Mask;
+ NPT_String m_ContentType;
+ NPT_String m_Extra;
+
+ NPT_String m_DLNA_PN; // DLNA.ORG_PN Parameter (pn-param)
+ NPT_String m_DLNA_OP; // Operations Parameter (op-param)
+ NPT_String m_DLNA_PS; // Server-Side PlaySpeeds Parameter (ps-param)
+ NPT_String m_DLNA_CI; // Conversion Indicator Flag (ci-param)
+ NPT_String m_DLNA_FLAGS; // Flags Parameter (flags-param)
+ NPT_String m_DLNA_MAXSP; // Maximum RTSP Speed Header value (maxsp-param)
+ NPT_List<FieldEntry> m_DLNA_OTHER; // Vendor-defined 4th field Parameters (other-param)
+
+ bool m_Valid;
+};
+
+#endif /* _PLT_PROTOCOL_INFO_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltService.cpp b/lib/libUPnP/Platinum/Source/Core/PltService.cpp
new file mode 100644
index 0000000..b86fb23
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltService.cpp
@@ -0,0 +1,920 @@
+/*****************************************************************
+|
+| Platinum - Service
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltService.h"
+#include "PltSsdp.h"
+#include "PltUPnP.h"
+#include "PltDeviceData.h"
+#include "PltUtilities.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.service")
+
+/*----------------------------------------------------------------------
+| PLT_Service::PLT_Service
++---------------------------------------------------------------------*/
+PLT_Service::PLT_Service(PLT_DeviceData* device,
+ const char* type,
+ const char* id,
+ const char* name,
+ const char* last_change_namespace /* = NULL */) :
+ m_Device(device),
+ m_ServiceType(type),
+ m_ServiceID(id),
+ m_ServiceName(name),
+ m_EventTask(NULL),
+ m_EventingPaused(false),
+ m_LastChangeNamespace(last_change_namespace)
+{
+ if (name) InitURLs(name);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::~PLT_Service
++---------------------------------------------------------------------*/
+PLT_Service::~PLT_Service()
+{
+ Cleanup();
+}
+
+/*----------------------------------------------------------------------
+ | PLT_Service::Cleanup
+ +---------------------------------------------------------------------*/
+ void
+ PLT_Service::Cleanup()
+ {
+ m_ActionDescs.Apply(NPT_ObjectDeleter<PLT_ActionDesc>());
+ m_StateVars.Apply(NPT_ObjectDeleter<PLT_StateVariable>());
+
+ m_ActionDescs.Clear();
+ m_StateVars.Clear();
+ m_Subscribers.Clear();
+ }
+
+/*----------------------------------------------------------------------
+| PLT_Service::GetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::GetSCPDXML(NPT_String& scpd)
+{
+ NPT_Result res;
+
+ // it is required to have at least 1 state variable
+ if (m_StateVars.GetItemCount() == 0) return NPT_FAILURE;
+
+ NPT_XmlElementNode* spec = NULL;
+ NPT_XmlElementNode* actionList = NULL;
+ NPT_XmlElementNode* top = new NPT_XmlElementNode("scpd");
+ NPT_XmlElementNode* serviceStateTable = NULL;
+ NPT_CHECK_LABEL_SEVERE(res = top->SetNamespaceUri("", "urn:schemas-upnp-org:service-1-0"), cleanup);
+
+ // add spec version
+ spec = new NPT_XmlElementNode("specVersion");
+ NPT_CHECK_LABEL_SEVERE(res = top->AddChild(spec), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(spec, "major", "1"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(spec, "minor", "0"), cleanup);
+
+ // add actions
+ actionList = new NPT_XmlElementNode("actionList");
+ NPT_CHECK_LABEL_SEVERE(res = top->AddChild(actionList), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = m_ActionDescs.ApplyUntil(
+ PLT_GetSCPDXMLIterator<PLT_ActionDesc>(actionList),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)), cleanup);
+
+ // add service state table
+ serviceStateTable = new NPT_XmlElementNode("serviceStateTable");
+ NPT_CHECK_LABEL_SEVERE(res = top->AddChild(serviceStateTable), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = m_StateVars.ApplyUntil(
+ PLT_GetSCPDXMLIterator<PLT_StateVariable>(serviceStateTable),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)), cleanup);
+
+ // serialize node
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::Serialize(*top, scpd, true, 2), cleanup);
+
+cleanup:
+ delete top;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::ToXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::GetDescription(NPT_XmlElementNode* parent, NPT_XmlElementNode** service_out /* = NULL */)
+{
+ NPT_XmlElementNode* service = new NPT_XmlElementNode("service");
+ if (service_out) {
+ *service_out = service;
+ }
+ NPT_CHECK_SEVERE(parent->AddChild(service));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "serviceType", m_ServiceType));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "serviceId", m_ServiceID));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "SCPDURL", GetSCPDURL()));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "controlURL", GetControlURL()));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "eventSubURL", GetEventSubURL()));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::InitURLs
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::InitURLs(const char* service_name)
+{
+ m_SCPDURL = service_name;
+ m_SCPDURL += "/" + m_Device->GetUUID() + NPT_String("/scpd.xml");
+ m_ControlURL = service_name;
+ m_ControlURL += "/" + m_Device->GetUUID() + NPT_String("/control.xml");
+ m_EventSubURL = service_name;
+ m_EventSubURL += "/" + m_Device->GetUUID() + NPT_String("/event.xml");
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::SetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::SetSCPDXML(const char* scpd)
+{
+ if (scpd == NULL) return NPT_ERROR_INVALID_PARAMETERS;
+
+ Cleanup();
+
+ NPT_XmlParser parser;
+ NPT_XmlNode* tree = NULL;
+ NPT_Result res;
+ NPT_Array<NPT_XmlElementNode*> stateVariables;
+ NPT_Array<NPT_XmlElementNode*> actions;
+ NPT_XmlElementNode* root;
+ NPT_XmlElementNode* actionList;
+ NPT_XmlElementNode* stateTable;
+
+ res = parser.Parse(scpd, tree);
+ NPT_CHECK_LABEL_FATAL(res, failure);
+
+ // make sure root tag is right
+ root = tree->AsElementNode();
+ if (!root || NPT_String::Compare(root->GetTag(), "scpd") != 0) {
+ NPT_LOG_SEVERE("Invalid scpd root tag name");
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // make sure we have required children presents
+ stateTable = PLT_XmlHelper::GetChild(root, "serviceStateTable");
+ if (!stateTable ||
+ stateTable->GetChildren().GetItemCount() == 0 ||
+ NPT_FAILED(PLT_XmlHelper::GetChildren(stateTable,
+ stateVariables,
+ "stateVariable"))) {
+ NPT_LOG_SEVERE("No state variables found");
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ for (int k = 0 ; k < (int)stateVariables.GetItemCount(); k++) {
+ NPT_String name, type, send;
+ PLT_XmlHelper::GetChildText(stateVariables[k], "name", name);
+ PLT_XmlHelper::GetChildText(stateVariables[k], "dataType", type);
+ PLT_XmlHelper::GetAttribute(stateVariables[k], "sendEvents", send);
+
+ if (name.GetLength() == 0 || type.GetLength() == 0) {
+ NPT_LOG_SEVERE_1("Invalid state variable name or type at position %d", k+1);
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ PLT_StateVariable* variable = new PLT_StateVariable(this);
+ m_StateVars.Add(variable);
+
+ variable->m_Name = name;
+ variable->m_DataType = type;
+ variable->m_IsSendingEvents = IsTrue(send);
+ PLT_XmlHelper::GetChildText(stateVariables[k], "defaultValue", variable->m_DefaultValue);
+
+ NPT_XmlElementNode* allowedValueList = PLT_XmlHelper::GetChild(stateVariables[k], "allowedValueList");
+ if (allowedValueList) {
+ NPT_Array<NPT_XmlElementNode*> allowedValues;
+ PLT_XmlHelper::GetChildren(allowedValueList, allowedValues, "allowedValue");
+ for (int l = 0 ; l < (int)allowedValues.GetItemCount(); l++) {
+ const NPT_String* text = allowedValues[l]->GetText();
+ if (text) {
+ variable->m_AllowedValues.Add(new NPT_String(*text));
+ }
+ }
+ } else {
+ NPT_XmlElementNode* allowedValueRange = PLT_XmlHelper::GetChild(stateVariables[k], "allowedValueRange");
+ if (allowedValueRange) {
+ NPT_String min, max, step;
+ PLT_XmlHelper::GetChildText(allowedValueRange, "minimum", min);
+ PLT_XmlHelper::GetChildText(allowedValueRange, "maximum", max);
+ PLT_XmlHelper::GetChildText(allowedValueRange, "step", step);
+
+ // these are required but try to be nice
+ // in case bad devices provide nothing
+ if (min.GetLength() == 0) {
+ if (variable->m_DataType == "ui1" ||
+ variable->m_DataType == "ui2" ||
+ variable->m_DataType == "ui4") {
+ min = NPT_String::FromInteger(0);
+ } else if (variable->m_DataType == "i1") {
+ min = NPT_String::FromInteger(-128);
+ } else if (variable->m_DataType == "i2") {
+ min = NPT_String::FromInteger(-32768);
+ } else if (variable->m_DataType == "i4" ||
+ variable->m_DataType == "int") {
+ min = NPT_String::FromInteger(-2147483647 - 1);
+ } else {
+ NPT_LOG_SEVERE_1("Invalid variable data type %s", variable->m_DataType.GetChars());
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+ }
+ if (max.GetLength() == 0) {
+ if (variable->m_DataType == "ui1") {
+ max = NPT_String::FromInteger(0xff);
+ } else if (variable->m_DataType == "ui2") {
+ max = NPT_String::FromInteger(0xffff);
+ } else if (variable->m_DataType == "ui4") {
+ max = NPT_String::FromInteger(0xffffffff);
+ } else if (variable->m_DataType == "i1") {
+ max = NPT_String::FromInteger(0x7f);
+ } else if (variable->m_DataType == "i2") {
+ max = NPT_String::FromInteger(0x7fff);
+ } else if (variable->m_DataType == "i4" ||
+ variable->m_DataType == "int") {
+ max = NPT_String::FromInteger(0x7fffffff);
+ } else {
+ NPT_LOG_SEVERE_1("Invalid variable data type %s", variable->m_DataType.GetChars());
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+ }
+
+ variable->m_AllowedValueRange = new NPT_AllowedValueRange;
+ NPT_ParseInteger32(min, variable->m_AllowedValueRange->min_value);
+ NPT_ParseInteger32(max, variable->m_AllowedValueRange->max_value);
+ variable->m_AllowedValueRange->step = -1;
+
+ if (step.GetLength() != 0) {
+ NPT_ParseInteger(step, variable->m_AllowedValueRange->step);
+ }
+ }
+ }
+ }
+
+ // actions
+ actionList = PLT_XmlHelper::GetChild(root, "actionList");
+ if (actionList) {
+ res = PLT_XmlHelper::GetChildren(actionList, actions, "action");
+ NPT_CHECK_LABEL_SEVERE(res, failure);
+
+ for (int i = 0 ; i < (int)actions.GetItemCount(); i++) {
+ NPT_String action_name;
+ PLT_XmlHelper::GetChildText(actions[i], "name", action_name);
+ if (action_name.GetLength() == 0) {
+ NPT_LOG_SEVERE_1("Invalid action name for action number %d", i+1);
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ PLT_ActionDesc* action_desc = new PLT_ActionDesc(action_name, this);
+ m_ActionDescs.Add(action_desc);
+
+ // action arguments
+ NPT_XmlElementNode* argumentList = PLT_XmlHelper::GetChild(actions[i], "argumentList");
+ if (argumentList == NULL || !argumentList->GetChildren().GetItemCount())
+ continue; // no arguments is ok I guess
+
+ NPT_Array<NPT_XmlElementNode*> arguments;
+ NPT_CHECK_LABEL_SEVERE(PLT_XmlHelper::GetChildren(argumentList, arguments, "argument"), failure);
+
+ bool ret_value_found = false;
+ for (int j = 0 ; j < (int)arguments.GetItemCount(); j++) {
+ NPT_String name, direction, relatedStateVar;
+ PLT_XmlHelper::GetChildText(arguments[j], "name", name);
+ PLT_XmlHelper::GetChildText(arguments[j], "direction", direction);
+ PLT_XmlHelper::GetChildText(arguments[j], "relatedStateVariable", relatedStateVar);
+
+ if (name.GetLength() == 0 || direction.GetLength() == 0 || relatedStateVar.GetLength() == 0) {
+ NPT_LOG_SEVERE_1("Invalid argument for action %s", (const char*)action_name);
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // make sure the related state variable exists
+ PLT_StateVariable* variable = FindStateVariable(relatedStateVar);
+ if (variable == NULL) {
+ NPT_LOG_SEVERE_1("State variable not found %s", (const char*)relatedStateVar);
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ bool ret_value = false;
+ NPT_XmlElementNode* ret_val_node = PLT_XmlHelper::GetChild(arguments[j], "retVal");
+ if (ret_val_node) {
+ // verify this is the only retVal we've had
+ if (ret_value_found) {
+ NPT_LOG_SEVERE("Return argument already found");
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ } else {
+ ret_value = true;
+ ret_value_found = true;
+ }
+ }
+ action_desc->GetArgumentDescs().Add(new PLT_ArgumentDesc(name, j, direction, variable, ret_value));
+ }
+ }
+ }
+
+ // delete the tree
+ delete tree;
+ return NPT_SUCCESS;
+
+failure:
+ NPT_LOG_FATAL_1("Failed to parse scpd: %s", scpd);
+ if (tree) delete tree;
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::GetSCPDURL
++---------------------------------------------------------------------*/
+NPT_String
+PLT_Service::GetSCPDURL(bool absolute /* = false */)
+{
+ NPT_HttpUrl url = GetDevice()->NormalizeURL(m_SCPDURL);
+ return absolute?url.ToString():url.ToRequestString();
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::GetControlURL
++---------------------------------------------------------------------*/
+NPT_String
+PLT_Service::GetControlURL(bool absolute /* = false */)
+{
+ NPT_HttpUrl url = GetDevice()->NormalizeURL(m_ControlURL);
+ return absolute?url.ToString():url.ToRequestString();
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::GetEventSubURL
++---------------------------------------------------------------------*/
+NPT_String
+PLT_Service::GetEventSubURL(bool absolute /* = false */)
+{
+ NPT_HttpUrl url = GetDevice()->NormalizeURL(m_EventSubURL);
+ return absolute?url.ToString():url.ToRequestString();
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::ForceVersion
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::ForceVersion(NPT_Cardinal version)
+{
+ if (version < 1) return NPT_FAILURE;
+
+ m_ServiceType = m_ServiceType.SubString(0, m_ServiceType.GetLength()-1);
+ m_ServiceType += NPT_String::FromIntegerU(version);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::FindActionDesc
++---------------------------------------------------------------------*/
+PLT_ActionDesc*
+PLT_Service::FindActionDesc(const char* name)
+{
+ PLT_ActionDesc* action = NULL;
+ NPT_ContainerFind(m_ActionDescs, PLT_ActionDescNameFinder(name), action);
+ return action;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::FindStateVariable
++---------------------------------------------------------------------*/
+PLT_StateVariable*
+PLT_Service::FindStateVariable(const char* name)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ return stateVariable;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::GetStateVariableValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::GetStateVariableValue(const char* name, NPT_String& value)
+{
+ PLT_StateVariable* stateVariable = FindStateVariable(name);
+ NPT_CHECK_POINTER_FATAL(stateVariable);
+ value = stateVariable->GetValue();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::IsSubscribable
++---------------------------------------------------------------------*/
+bool
+PLT_Service::IsSubscribable()
+{
+ NPT_List<PLT_StateVariable*>::Iterator var = m_StateVars.GetFirstItem();
+ while (var) {
+ if ((*var)->IsSendingEvents()) return true;
+ ++var;
+ }
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::SetStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::SetStateVariable(const char* name, const char* value, const bool clearonsend /*=false*/)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ if (stateVariable == NULL)
+ return NPT_FAILURE;
+
+ return stateVariable->SetValue(value, clearonsend);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::SetStateVariableRate
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::SetStateVariableRate(const char* name, NPT_TimeInterval rate)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ if (stateVariable == NULL)
+ return NPT_FAILURE;
+
+ return stateVariable->SetRate(rate);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::SetStateVariableExtraAttribute
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::SetStateVariableExtraAttribute(const char* name,
+ const char* key,
+ const char* value)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ if (stateVariable == NULL)
+ return NPT_FAILURE;
+
+ return stateVariable->SetExtraAttribute(key, value);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::IncStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::IncStateVariable(const char* name)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ if (stateVariable == NULL)
+ return NPT_FAILURE;
+
+ NPT_String value = stateVariable->GetValue();
+ NPT_Int32 num;
+ if (value.GetLength() == 0 || NPT_FAILED(value.ToInteger(num))) {
+ return NPT_FAILURE;
+ }
+
+ // convert value to int
+ return stateVariable->SetValue(NPT_String::FromInteger(num+1));
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::ProcessNewSubscription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::ProcessNewSubscription(PLT_TaskManagerReference task_manager,
+ const NPT_SocketAddress& addr,
+ const NPT_String& callback_urls,
+ int timeout,
+ NPT_HttpResponse& response)
+{
+ NPT_LOG_FINE_2("New subscription for %s (timeout = %d)", m_EventSubURL.GetChars(), timeout);
+
+// // first look if we don't have a subscriber with same callbackURL
+// PLT_EventSubscriber* subscriber = NULL;
+// if (NPT_SUCCEEDED(NPT_ContainerFind(m_Subscribers, PLT_EventSubscriberFinderByCallbackURL(strCallbackURL),
+// subscriber))) {
+// // update local interface and timeout
+// subscriber->m_local_if.SetIpAddress((unsigned long) addr.GetIpAddress());
+// subscriber->m_ExpirationTime = NPT_Time(NULL) + timeout;
+//
+// PLT_UPnPMessageHelper::SetSID("uuid:" + subscriber->m_sid);
+// PLT_UPnPMessageHelper::SetTimeOut(timeout);
+// return NPT_SUCCESS;
+// }
+//
+ // reject if we have too many subscribers already
+ if (m_Subscribers.GetItemCount() > 30) {
+ response.SetStatus(500, "Internal Server Error");
+ return NPT_FAILURE;
+ }
+
+ //TODO: prevent hacking by making sure callbackurl is not ourselves?
+
+ // generate a unique subscriber ID
+ NPT_String sid;
+ PLT_UPnPMessageHelper::GenerateGUID(sid);
+ sid = "uuid:" + sid;
+
+ PLT_EventSubscriberReference subscriber(new PLT_EventSubscriber(task_manager, this, sid, timeout));
+ // parse the callback URLs
+ bool reachable = false;
+ if (callback_urls[0] == '<') {
+ char* szURLs = (char*)(const char*)callback_urls;
+ char* brackL = szURLs;
+ char* brackR = szURLs;
+ while (++brackR < szURLs + callback_urls.GetLength()) {
+ if (*brackR == '>') {
+ NPT_String strCallbackURL = NPT_String(brackL+1, (NPT_Size)(brackR-brackL-1));
+ NPT_HttpUrl url(strCallbackURL);
+
+ if (url.IsValid()) {
+ subscriber->AddCallbackURL(strCallbackURL);
+ reachable = true;
+ }
+ brackL = ++brackR;
+ }
+ }
+ }
+
+ if (reachable == false) {
+ NPT_CHECK_LABEL_FATAL(NPT_FAILURE, cleanup);
+ }
+
+ // keep track of which interface we receive the request, we will use this one
+ // when notifying
+ subscriber->SetLocalIf(addr);
+
+ PLT_UPnPMessageHelper::SetSID(response, subscriber->GetSID());
+ PLT_UPnPMessageHelper::SetTimeOut(response, timeout);
+
+ {
+ NPT_AutoLock lock(m_Lock);
+
+ // new subscriber should get all vars in the LastChange var
+ UpdateLastChange(m_StateVars);
+
+ // send all state vars to sub immediately
+ NPT_Result res = subscriber->Notify(m_StateVars);
+
+ // reset LastChange var to what was really just changed
+ UpdateLastChange(m_StateVarsChanged);
+
+ // make sure the event worked before spawning our recurrent task
+ NPT_CHECK_LABEL_FATAL(res, cleanup);
+
+ // schedule a recurring event notification task if not running already
+ if (!m_EventTask) {
+ PLT_ServiceEventTask *task = new PLT_ServiceEventTask(this);
+ NPT_CHECK_SEVERE(task_manager->StartTask(task));
+
+ m_EventTask = task;
+ }
+
+ m_Subscribers.Add(subscriber);
+ }
+
+ return NPT_SUCCESS;
+
+cleanup:
+ response.SetStatus(412, "Precondition Failed");
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::ProcessRenewSubscription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::ProcessRenewSubscription(const NPT_SocketAddress& addr,
+ const NPT_String& sid,
+ int timeout_secs,
+ NPT_HttpResponse& response)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ NPT_LOG_FINE_2("Renewing subscription for %s (sub=%s)",
+ m_EventSubURL.GetChars(),
+ sid.GetChars());
+
+ // first look if we don't have a subscriber with same callbackURL
+ PLT_EventSubscriberReference subscriber;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderBySID(sid),
+ subscriber))) {
+
+ NPT_TimeStamp now, expiration;
+ NPT_System::GetCurrentTimeStamp(now);
+ expiration = subscriber->GetExpirationTime();
+
+ // renew subscriber if it has not expired
+ if (expiration > now ) {
+ // update local interface and timeout
+ subscriber->SetLocalIf(addr);
+ subscriber->SetTimeout(timeout_secs);
+
+ PLT_UPnPMessageHelper::SetSID(response, subscriber->GetSID());
+ PLT_UPnPMessageHelper::SetTimeOut(response, timeout_secs);
+ return NPT_SUCCESS;
+ } else {
+ NPT_LOG_FINE_1("Subscriber \"%s\" didn't renew in time", (const char*)subscriber->GetSID());
+ m_Subscribers.Remove(subscriber);
+ }
+ }
+
+ NPT_LOG_WARNING_1("Failed to renew subscription for %s!", sid.GetChars());
+
+ // didn't find a valid Subscriber in our list
+ response.SetStatus(412, "Precondition Failed");
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::ProcessCancelSubscription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::ProcessCancelSubscription(const NPT_SocketAddress& /* addr */,
+ const NPT_String& sid,
+ NPT_HttpResponse& response)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ // first look if we don't have a subscriber with same callbackURL
+ PLT_EventSubscriberReference sub;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderBySID(sid),
+ sub))) {
+ NPT_LOG_FINE_2("Cancelling subscription for %s (sub=%s)",
+ m_EventSubURL.GetChars(),
+ sid.GetChars());
+
+ // remove sub
+ m_Subscribers.Remove(sub);
+ return NPT_SUCCESS;
+ }
+
+ NPT_LOG_WARNING_1("Cancelling subscription for unknown subscriber %s!", sid.GetChars());
+
+ // didn't find a valid Subscriber in our list
+ response.SetStatus(412, "Precondition Failed");
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::AddChanged
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::AddChanged(PLT_StateVariable* var)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ // no event task means no subscribers yet, so don't bother
+ // Note: this will take care also when setting default state
+ // variables values during init and avoid being published
+ if (!m_EventTask) return NPT_SUCCESS;
+
+ if (var->IsSendingEvents()) {
+ if (!m_StateVarsToPublish.Contains(var)) m_StateVarsToPublish.Add(var);
+ } else if (var->IsSendingEvents(true)) {
+ if (!m_StateVarsChanged.Contains(var)) m_StateVarsChanged.Add(var);
+
+ UpdateLastChange(m_StateVarsChanged);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::UpdateLastChange
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::UpdateLastChange(NPT_List<PLT_StateVariable*>& vars)
+{
+ PLT_StateVariable* var = FindStateVariable("LastChange");
+ if (var == NULL) return NPT_FAILURE;
+
+ NPT_ASSERT(m_LastChangeNamespace.GetLength() > 0);
+
+ if (vars.GetItemCount() == 0) {
+ // no vars to update, remove LastChange from vars to publish
+ m_StateVarsToPublish.Remove(var);
+ return NPT_SUCCESS;
+ }
+
+ NPT_Reference<NPT_XmlElementNode> top(new NPT_XmlElementNode("Event"));
+ NPT_CHECK_SEVERE(top->SetNamespaceUri("", m_LastChangeNamespace));
+
+ NPT_XmlElementNode* instance = new NPT_XmlElementNode("InstanceID");
+ NPT_CHECK_SEVERE(top->AddChild(instance));
+ NPT_CHECK_SEVERE(instance->SetAttribute("val", "0"));
+
+ // build list of changes
+ NPT_CHECK_SEVERE(vars.ApplyUntil(
+ PLT_LastChangeXMLIterator(instance),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)));
+
+ // serialize node
+ NPT_String value;
+ NPT_CHECK_SEVERE(PLT_XmlHelper::Serialize(*top, value, false));
+
+ // set the state change directly instead of calling SetValue
+ // to avoid recursive lock, instead add LastChange var directly
+ var->m_Value = value;
+
+ // add to list of vars scheduled to be published next time if not already there
+ if (!m_StateVarsToPublish.Contains(var)) m_StateVarsToPublish.Add(var);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::PauseEventing
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::PauseEventing(bool pause /* = TRUE */)
+{
+ NPT_AutoLock lock(m_Lock);
+ m_EventingPaused = pause;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::NotifyChanged
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::NotifyChanged()
+{
+ NPT_AutoLock lock(m_Lock);
+
+ // no eventing for now
+ if (m_EventingPaused) return NPT_SUCCESS;
+
+ // pick the vars that are ready to be published
+ // based on their moderation rate and last publication
+ NPT_List<PLT_StateVariable*> vars_ready;
+ NPT_List<PLT_StateVariable*>::Iterator iter = m_StateVarsToPublish.GetFirstItem();
+ while (iter) {
+ PLT_StateVariable* var = *iter;
+ if (var->IsReadyToPublish()) {
+ vars_ready.Add(var);
+ m_StateVarsToPublish.Erase(iter++);
+
+ // clear last changed list if we're about to send LastChange var
+ if (!var->GetName().Compare("LastChange")) m_StateVarsChanged.Clear();
+
+ continue;
+ }
+
+ ++iter;
+ }
+
+ // if nothing to publish then bail out now
+ // we'll clean up expired subscribers when we have something to publish
+ if (vars_ready.GetItemCount() == 0) return NPT_SUCCESS;
+
+ // send vars that are ready to go and remove old subscribers
+ NPT_List<PLT_EventSubscriberReference>::Iterator sub_iter = m_Subscribers.GetFirstItem();
+ while (sub_iter) {
+ PLT_EventSubscriberReference sub = *sub_iter;
+
+ NPT_TimeStamp now, expiration;
+ NPT_System::GetCurrentTimeStamp(now);
+ expiration = sub->GetExpirationTime();
+
+ // forget sub if it didn't renew subscription in time or if notification failed
+ if (expiration == NPT_TimeStamp() || now < expiration + NPT_TimeStamp(30.f)) {
+ // TODO: Notification is asynchronous, so we won't know if it failed until
+ // the subscriber m_SubscriberTask is done
+ NPT_Result res = vars_ready.GetItemCount()?sub->Notify(vars_ready):NPT_SUCCESS;
+ if (NPT_SUCCEEDED(res)) {
+ ++sub_iter;
+ continue;
+ }
+ }
+
+ m_Subscribers.Erase(sub_iter++);
+ }
+
+ // some state variables must be cleared immediatly after sending
+ iter = vars_ready.GetFirstItem();
+ while (iter) {
+ PLT_StateVariable* var = *iter;
+ var->OnSendCompleted();
+ ++iter;
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceSCPDURLFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceSCPDURLFinder::operator()(PLT_Service* const & service) const
+{
+ return m_URL.Compare(service->GetSCPDURL(m_URL.StartsWith("http://")?true:false), true)?false:true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceControlURLFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceControlURLFinder::operator()(PLT_Service* const & service) const
+{
+ return m_URL.Compare(service->GetControlURL(m_URL.StartsWith("http://")?true:false), true)?false:true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceEventSubURLFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceEventSubURLFinder::operator()(PLT_Service* const & service) const
+{
+ return m_URL.Compare(service->GetEventSubURL(m_URL.StartsWith("http://")?true:false), true)?false:true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceIDFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceIDFinder::operator()(PLT_Service* const & service) const
+{
+ return m_Id.Compare(service->GetServiceID(), true) ? false : true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceTypeFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceTypeFinder::operator()(PLT_Service* const & service) const
+{
+ // DLNA: match any version if last char is '*'
+ if (m_Type.EndsWith("*")) {
+ return m_Type.CompareN(service->GetServiceType(), m_Type.GetLength()-1, true) ? false : true;
+ }
+
+ return m_Type.Compare(service->GetServiceType(), true) ? false : true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceNameFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceNameFinder::operator()(PLT_Service* const & service) const
+{
+ return m_Name.Compare(service->GetServiceName(), true) ? false : true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_GetLastChangeXMLIterator::operator()
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_LastChangeXMLIterator::operator()(PLT_StateVariable* const &var) const
+{
+ // only add vars that are indirectly evented
+ if (!var->IsSendingEvents(true)) return NPT_SUCCESS;
+
+ NPT_XmlElementNode* variable = new NPT_XmlElementNode((const char*)var->GetName());
+ NPT_CHECK_SEVERE(m_Node->AddChild(variable));
+ NPT_CHECK_SEVERE(var->Serialize(*variable));
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltService.h b/lib/libUPnP/Platinum/Source/Core/PltService.h
new file mode 100644
index 0000000..ebca195
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltService.h
@@ -0,0 +1,522 @@
+/*****************************************************************
+|
+| Platinum - Service
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP Service
+ */
+
+#ifndef _PLT_SERVICE_H_
+#define _PLT_SERVICE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltEvent.h"
+#include "PltArgument.h"
+#include "PltStateVariable.h"
+#include "PltAction.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_DeviceData;
+
+/*----------------------------------------------------------------------
+| PLT_Service class
++---------------------------------------------------------------------*/
+/**
+ UPnP Service.
+ The PLT_Service class holds information about a UPnP service of a given device.
+ It maintains a list of actions and state variables. A PLT_DeviceData instance can own
+ one or more PLT_Service instances. When a PLT_Service is advertised as part of a
+ a UPnP Device (PLT_DeviceHost), it also maintains a list of subscribers to nofify when
+ state variables change.
+ */
+class PLT_Service
+{
+public:
+ // methods
+ /**
+ Create an instance of a UPnP Service either hosted or discovered.
+ @param device Pointer to the PLT_DeviceData the service is associated to
+ @param type String representing the UPnP service type
+ @param id String representing the UPnP service id
+ @param name A String to create unique service SCPD, control and eventing urls
+ @param last_change_namespace A String for the LastChange state variable namespace if any
+ */
+ PLT_Service(PLT_DeviceData* device,
+ const char* type,
+ const char* id,
+ const char* name,
+ const char* last_change_namespace = NULL);
+ virtual ~PLT_Service();
+
+ // methods
+ /**
+ When service is hosted by a PLT_DeviceHost, this setups the SCPD, control and event urls.
+ @param service_name the service name used to format unique urls
+ */
+ NPT_Result InitURLs(const char* service_name);
+
+ /**
+ Verify the service has been properly initialized or is a valid discovered service.
+ @return true if valid.
+ */
+ bool IsValid() { return (m_ActionDescs.GetItemCount() > 0); }
+
+ /**
+ When a PLT_DeviceHost needs to change more than one state variables at a time
+ but would rather send only one event with all state variable changes, this can be
+ used to pause and resume the automatic eventing.
+ @param pause Flag to indicate if eventing should be paused or resumed
+ */
+ NPT_Result PauseEventing(bool pause = true);
+
+ // class methods
+ static bool IsTrue(const NPT_String& value) {
+ if (value.Compare("1", true) &&
+ value.Compare("true", true) &&
+ value.Compare("yes", true)) {
+ return false;
+ }
+ return true;
+ }
+
+ // accessor methods
+ /**
+ Set the SCPD url for control points to be able to fetch the SCPD xml document.
+ @param url relative path of SCPD url
+ */
+ NPT_Result SetSCPDURL(const char* url) { m_SCPDURL = url; return NPT_SUCCESS; }
+
+ /*
+ Set the Service Control url for control points to be able to invoke actions.
+ @param url relative path of control url
+ */
+ NPT_Result SetControlURL(const char* url) { m_ControlURL = url; return NPT_SUCCESS; };
+
+ /**
+ Set the Service Event subscription url for control points to be able to subscribe
+ to events.
+ @param url relative path of even url
+ */
+ NPT_Result SetEventSubURL(const char* url) { m_EventSubURL = url; return NPT_SUCCESS; };
+
+ /**
+ Return the SCPD url associated with this service.
+ @param absolute flag to indicate if absolute url including ip and port should
+ be returned
+ @return SCPD url
+ */
+ NPT_String GetSCPDURL(bool absolute = false);
+
+ /**
+ Return the Control url associated with this service.
+ @param absolute flag to indicate if absolute url including ip and port should
+ be returned
+ @return Control url
+ */
+ NPT_String GetControlURL(bool absolute = false);
+
+ /**
+ Return the Event subscription url associated with this service.
+ @param absolute flag to indicate if absolute url including ip and port should
+ be returned
+ @return Event url
+ */
+ NPT_String GetEventSubURL(bool absolute = false);
+
+ /**
+ Return the service id.
+ @return service id
+ */
+ const NPT_String& GetServiceID() const { return m_ServiceID; }
+
+ /**
+ Return the service type.
+ @return service type
+ */
+ const NPT_String& GetServiceType() const { return m_ServiceType; }
+
+ /**
+ Return the service friendly name.
+ @return service name
+ */
+ const NPT_String& GetServiceName() const { return m_ServiceName; }
+
+ /**
+ Return the PLT_DeviceData* the service is associated with.
+ @return PLT_DeviceData pointer
+ */
+ PLT_DeviceData* GetDevice() { return m_Device; }
+
+ /**
+ When a control point discover a new service with a higher version number
+ than it can work with, a lower version can be set to force backward
+ compatibility.
+ @param version Integer specifying the version to use
+ */
+ NPT_Result ForceVersion(NPT_Cardinal version);
+
+ /**
+ Return the service SCPD xml document.
+ @param xml String to receive document
+ */
+ NPT_Result GetSCPDXML(NPT_String& xml);
+
+ /**
+ Set the service SCPD xml document.
+ @param xml String SCPD xml document
+ */
+ NPT_Result SetSCPDXML(const char* xml);
+
+ /**
+ Populate the UPnP Device description document with service information.
+ @param parent XML Element where to insert the service XML Element
+ @param service Pointer to service XML Element node newly created so it can be
+ extended with additional non standard information.
+ */
+ NPT_Result GetDescription(NPT_XmlElementNode* parent, NPT_XmlElementNode** service = NULL);
+
+ /**
+ Set a new value for a given state variable. The service keeps track of which
+ state variables have changed and events are being triggered by a PLT_ServiceEventTask
+ when necessary.
+ @param name state variable name
+ @param value new State Variable value.
+ @param clearonsend whether the State Variable should clear immediatly in ::OnSendingCompleted
+ */
+ NPT_Result SetStateVariable(const char* name, const char* value, const bool clearonsend = false);
+
+ /**
+ Certain state variables notifications must not be sent faster than a certain
+ rate according to the UPnP specs. This sets the rate for a given state variable.
+ @param name state variable name
+ @param rate a time interval specifying the minimum interval allowed between
+ notifications.
+ */
+ NPT_Result SetStateVariableRate(const char* name, NPT_TimeInterval rate);
+
+ /**
+ Certain state variables require extra xml attributes when serialized.
+ @param name state variable name
+ @param key the attribute name
+ @param value the attribute value
+ */
+ NPT_Result SetStateVariableExtraAttribute(const char* name, const char* key, const char* value);
+
+ /**
+ Helper function to increment a state variable representing a number.
+ @param name state variable name
+ */
+ NPT_Result IncStateVariable(const char* name);
+
+ /**
+ Return the PLT_StateVariable pointer given a state variable name.
+ @param name state variable name
+ @return PLT_StateVariable pointer
+ */
+ PLT_StateVariable* FindStateVariable(const char* name);
+
+ /**
+ Return the state variable value given a state variable name.
+ @param name state variable name
+ @param value state variable value output
+ */
+ NPT_Result GetStateVariableValue(const char* name, NPT_String& value);
+
+ /**
+ Return whether a service is capable of sending events.
+ @return true if sending events
+ */
+ bool IsSubscribable();
+
+ /**
+ Return the list of state variables.
+ @return list of state variable pointers.
+ */
+ const NPT_List<PLT_StateVariable*>& GetStateVariables() const { return m_StateVars; }
+
+ /**
+ Return the PLT_ActionDesc given an action name
+ @param name action name
+ @return PLT_ActioDesc pointer
+ */
+ PLT_ActionDesc* FindActionDesc(const char* name);
+
+ /**
+ Return an array of actions descriptions PLT_ActionDesc.
+ @return array of PLT_ActionDesc pointers.
+ */
+ const NPT_Array<PLT_ActionDesc*>& GetActionDescs() const { return m_ActionDescs; }
+
+private:
+ /**
+ A task to send events.
+ The PLT_ServiceEventTask is started when receiving a first subscription. It
+ monitors if some state variables have changed and sends events to all
+ subscribers if so.
+ */
+ class PLT_ServiceEventTask : public PLT_ThreadTask {
+ public:
+ PLT_ServiceEventTask(PLT_Service* service) : m_Service(service) {}
+
+ void DoRun() override {
+ while (!IsAborting(100)) m_Service->NotifyChanged();
+ }
+
+ private:
+ PLT_Service* m_Service;
+ };
+
+ // methods
+ void Cleanup();
+
+ /**
+ Called by a PLT_StateVariable to keep track of what events need to be
+ sent by the PLT_ServiceEventTask task.
+ @param var PLT_StateVariable pointer
+ */
+ NPT_Result AddChanged(PLT_StateVariable* var);
+
+ /**
+ Certain UPnP services combine state variable changes into one single
+ state variable called "LastChange". This function updates the LastChange
+ state variable by looking through the list passed for state variables that
+ are not individually evented.
+ */
+ NPT_Result UpdateLastChange(NPT_List<PLT_StateVariable*>& vars);
+
+ /**
+ Send state variable change events to all subscribers.
+ */
+ NPT_Result NotifyChanged();
+
+ // Events
+ /**
+ Called by PLT_DeviceHost when it receives a request for a new subscription.
+ */
+ NPT_Result ProcessNewSubscription(
+ PLT_TaskManagerReference task_manager,
+ const NPT_SocketAddress& addr,
+ const NPT_String& callback_urls,
+ int timeout,
+ NPT_HttpResponse& response);
+
+ /**
+ Called by PLT_DeviceHost when it receives a request renewing an existing
+ subscription.
+ */
+ NPT_Result ProcessRenewSubscription(
+ const NPT_SocketAddress& addr,
+ const NPT_String& sid,
+ int timeout,
+ NPT_HttpResponse& response);
+
+ /**
+ Called by PLT_DeviceHost when it receives a request to cancel an existing
+ subscription.
+ */
+ NPT_Result ProcessCancelSubscription(
+ const NPT_SocketAddress& addr,
+ const NPT_String& sid,
+ NPT_HttpResponse& response);
+
+
+protected:
+ // friends that need to call private functions
+ friend class PLT_StateVariable; // AddChanged
+ friend class PLT_DeviceHost; // ProcessXXSubscription
+
+ //members
+ PLT_DeviceData* m_Device;
+ NPT_String m_ServiceType;
+ NPT_String m_ServiceID;
+ NPT_String m_ServiceName;
+ NPT_String m_SCPDURL;
+ NPT_String m_ControlURL;
+ NPT_String m_EventSubURL;
+ PLT_ServiceEventTask* m_EventTask;
+ NPT_Array<PLT_ActionDesc*> m_ActionDescs;
+ NPT_List<PLT_StateVariable*> m_StateVars;
+ NPT_Mutex m_Lock;
+ NPT_List<PLT_StateVariable*> m_StateVarsChanged;
+ NPT_List<PLT_StateVariable*> m_StateVarsToPublish;
+ NPT_List<PLT_EventSubscriberReference> m_Subscribers;
+ bool m_EventingPaused;
+ NPT_String m_LastChangeNamespace;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceSCPDURLFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_ServiceSCPDURLFinder class returns an instance of a PLT_Service given a
+ service SCPD url.
+ */
+class PLT_ServiceSCPDURLFinder
+{
+public:
+ // methods
+ PLT_ServiceSCPDURLFinder(const char* url) : m_URL(url) {}
+ virtual ~PLT_ServiceSCPDURLFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_URL;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceControlURLFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_ServiceControlURLFinder class returns an instance of a PLT_Service
+ given a service control url.
+ */
+class PLT_ServiceControlURLFinder
+{
+public:
+ // methods
+ PLT_ServiceControlURLFinder(const char* url) : m_URL(url) {}
+ virtual ~PLT_ServiceControlURLFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_URL;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceEventSubURLFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_ServiceEventSubURLFinder class returns an instance of a PLT_Service
+ given a service event subscription url.
+ */
+class PLT_ServiceEventSubURLFinder
+{
+public:
+ // methods
+ PLT_ServiceEventSubURLFinder(const char* url) : m_URL(url) {}
+ virtual ~PLT_ServiceEventSubURLFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_URL;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceIDFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_ServiceIDFinder class returns an instance of a PLT_Service given a
+ service id.
+ */
+class PLT_ServiceIDFinder
+{
+public:
+ // methods
+ PLT_ServiceIDFinder(const char* id) : m_Id(id) {}
+ virtual ~PLT_ServiceIDFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_Id;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceTypeFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_ServiceTypeFinder class returns an instance of a PLT_Service given a
+ service type.
+ */
+class PLT_ServiceTypeFinder
+{
+public:
+ // methods
+ PLT_ServiceTypeFinder(const char* type) : m_Type(type) {}
+ virtual ~PLT_ServiceTypeFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_Type;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceNameFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_ServiceNameFinder class returns an instance of a PLT_Service given a
+ service name.
+ */
+class PLT_ServiceNameFinder
+{
+public:
+ // methods
+ PLT_ServiceNameFinder(const char* name) : m_Name(name) {}
+ virtual ~PLT_ServiceNameFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_Name;
+};
+
+/*----------------------------------------------------------------------
+| PLT_LastChangeXMLIterator
++---------------------------------------------------------------------*/
+/**
+ The PLT_LastChangeXMLIterator class is used to serialize the LastChange variable
+ changes into xml given a list of state variables.
+ */
+class PLT_LastChangeXMLIterator
+{
+public:
+ // methods
+ PLT_LastChangeXMLIterator(NPT_XmlElementNode* node) : m_Node(node) {}
+ virtual ~PLT_LastChangeXMLIterator() {}
+
+ NPT_Result operator()(PLT_StateVariable* const & var) const;
+
+private:
+ NPT_XmlElementNode* m_Node;
+};
+
+#endif /* _PLT_SERVICE_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltSsdp.cpp b/lib/libUPnP/Platinum/Source/Core/PltSsdp.cpp
new file mode 100644
index 0000000..fda6f35
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltSsdp.cpp
@@ -0,0 +1,513 @@
+/*****************************************************************
+|
+| Platinum - SSDP
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltSsdp.h"
+#include "PltDatagramStream.h"
+#include "PltDeviceHost.h"
+#include "PltUPnP.h"
+#include "PltHttp.h"
+#include "PltVersion.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.ssdp")
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSender::SendSsdp
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpSender::SendSsdp(NPT_HttpRequest& request,
+ const char* usn,
+ const char* target,
+ NPT_UdpSocket& socket,
+ bool notify,
+ const NPT_SocketAddress* addr /* = NULL */)
+{
+ NPT_CHECK_SEVERE(FormatPacket(request, usn, target, socket, notify));
+
+ // logging
+ NPT_String prefix = NPT_String::Format("Sending SSDP %s packet for %s",
+ (const char*)request.GetMethod(),
+ usn);
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINER, prefix, &request);
+
+ // use a memory stream to write all the data
+ NPT_MemoryStream stream;
+ NPT_Result res = request.Emit(stream);
+ NPT_CHECK(res);
+
+ // copy stream into a data packet and send it
+ NPT_LargeSize size;
+ stream.GetSize(size);
+ if (size != (NPT_Size)size) NPT_CHECK(NPT_ERROR_OUT_OF_RANGE);
+
+ NPT_DataBuffer packet(stream.GetData(), (NPT_Size)size);
+ NPT_CHECK_WARNING(socket.Send(packet, addr));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSender::SendSsdp
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpSender::SendSsdp(NPT_HttpResponse& response,
+ const char* usn,
+ const char* target,
+ NPT_UdpSocket& socket,
+ bool notify,
+ const NPT_SocketAddress* addr /* = NULL */)
+{
+ NPT_CHECK_SEVERE(FormatPacket(response, usn, target, socket, notify));
+
+ // logging
+ NPT_String prefix = NPT_String::Format("Sending SSDP Response:");
+ PLT_LOG_HTTP_RESPONSE(NPT_LOG_LEVEL_FINER, prefix, &response);
+
+ // use a memory stream to write all the data
+ NPT_MemoryStream stream;
+ NPT_Result res = response.Emit(stream);
+ if (NPT_FAILED(res)) return res;
+
+ // copy stream into a data packet and send it
+ NPT_LargeSize size;
+ stream.GetSize(size);
+ if (size != (NPT_Size)size) NPT_CHECK(NPT_ERROR_OUT_OF_RANGE);
+
+ NPT_DataBuffer packet(stream.GetData(), (NPT_Size)size);
+ NPT_CHECK_WARNING(socket.Send(packet, addr));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSender::FormatPacket
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpSender::FormatPacket(NPT_HttpMessage& message,
+ const char* usn,
+ const char* target,
+ NPT_UdpSocket& socket,
+ bool notify)
+{
+ NPT_COMPILER_UNUSED(socket);
+
+ PLT_UPnPMessageHelper::SetUSN(message, usn);
+ if (notify) {
+ PLT_UPnPMessageHelper::SetNT(message, target);
+ } else {
+ PLT_UPnPMessageHelper::SetST(message, target);
+ PLT_UPnPMessageHelper::SetDate(message);
+ }
+ //PLT_HttpHelper::SetContentLength(message, 0);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceSearchResponseInterfaceIterator class
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpDeviceSearchResponseInterfaceIterator::operator()(NPT_NetworkInterface*& net_if) const
+{
+ const NPT_SocketAddress* remote_addr = &m_RemoteAddr;
+
+ NPT_List<NPT_NetworkInterfaceAddress>::Iterator niaddr =
+ net_if->GetAddresses().GetFirstItem();
+ if (!niaddr) return NPT_SUCCESS;
+
+ // don't try to bind on port 1900 or connect will fail later
+ NPT_UdpSocket socket(NPT_SOCKET_FLAG_CANCELLABLE);
+ //socket.Bind(NPT_SocketAddress(NPT_IpAddress::Any, 1900), true);
+
+ // by connecting, the kernel chooses which interface to use to route to the remote
+ // this is the IP we should use in our Location URL header
+ NPT_CHECK_WARNING(socket.Connect(m_RemoteAddr, 5000));
+ NPT_SocketInfo info;
+ socket.GetInfo(info);
+
+ // did we successfully connect and found out which interface is used?
+ if (info.local_address.GetIpAddress().AsLong()) {
+ // check that the interface the kernel chose matches the interface
+ // we wanted to send on
+ if ((*niaddr).GetPrimaryAddress().AsLong() != info.local_address.GetIpAddress().AsLong()) {
+ return NPT_SUCCESS;
+ }
+
+ // socket already connected, so we don't need to specify where to go
+ remote_addr = NULL;
+ }
+
+ NPT_HttpResponse response(200, "OK", NPT_HTTP_PROTOCOL_1_1);
+ PLT_UPnPMessageHelper::SetLocation(response, m_Device->GetDescriptionUrl(info.local_address.GetIpAddress().ToString()));
+ PLT_UPnPMessageHelper::SetLeaseTime(response, m_Device->GetLeaseTime());
+ PLT_UPnPMessageHelper::SetServer(response, PLT_HTTP_DEFAULT_SERVER, false);
+ response.GetHeaders().SetHeader("EXT", "");
+
+ // process search response twice to be DLNA compliant
+#if defined(PLATINUM_UPNP_SPECS_STRICT)
+ {
+ //NPT_UdpSocket socket;
+ NPT_CHECK_SEVERE(m_Device->SendSsdpSearchResponse(response, socket, m_ST, remote_addr));
+ }
+ NPT_System::Sleep(NPT_TimeInterval(PLT_DLNA_SSDP_DELAY_GROUP));
+#endif
+ {
+ //NPT_UdpSocket socket;
+ NPT_CHECK_SEVERE(m_Device->SendSsdpSearchResponse(response, socket, m_ST, remote_addr));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceSearchResponseTask::DoRun()
++---------------------------------------------------------------------*/
+void
+PLT_SsdpDeviceSearchResponseTask::DoRun()
+{
+ NPT_List<NPT_NetworkInterface*> if_list;
+ NPT_CHECK_LABEL_WARNING(PLT_UPnPMessageHelper::GetNetworkInterfaces(if_list, true),
+ done);
+
+ if_list.Apply(PLT_SsdpDeviceSearchResponseInterfaceIterator(
+ m_Device,
+ m_RemoteAddr,
+ m_ST));
+ if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+
+done:
+ return;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpAnnounceInterfaceIterator class
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpAnnounceInterfaceIterator::operator()(NPT_NetworkInterface*& net_if) const
+{
+ // don't use this interface address if it's not broadcast capable
+ if (m_Broadcast && !(net_if->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_BROADCAST)) {
+ return NPT_FAILURE;
+ }
+
+ NPT_List<NPT_NetworkInterfaceAddress>::Iterator niaddr =
+ net_if->GetAddresses().GetFirstItem();
+ if (!niaddr) return NPT_FAILURE;
+
+ // Remove disconnected interfaces
+ NPT_IpAddress addr = (*niaddr).GetPrimaryAddress();
+ if (!addr.ToString().Compare("0.0.0.0")) return NPT_FAILURE;
+
+ if (!m_Broadcast &&
+ !(net_if->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_MULTICAST) &&
+ !(net_if->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_LOOPBACK)) {
+ NPT_LOG_INFO_2("Not a valid interface: %s (flags: %d)",
+ (const char*)addr.ToString(), net_if->GetFlags());
+ return NPT_FAILURE;
+ }
+
+ NPT_HttpUrl url;
+ NPT_UdpMulticastSocket multicast_socket(NPT_SOCKET_FLAG_CANCELLABLE);
+ NPT_UdpSocket broadcast_socket(NPT_SOCKET_FLAG_CANCELLABLE);
+ NPT_UdpSocket* socket;
+
+ if (m_Broadcast) {
+ url = NPT_HttpUrl((*niaddr).GetBroadcastAddress().ToString(), 1900, "*");
+ socket = &broadcast_socket;
+ } else {
+ url = NPT_HttpUrl("239.255.255.250", 1900, "*");
+ NPT_CHECK_SEVERE(multicast_socket.SetInterface(addr));
+ socket = &multicast_socket;
+ multicast_socket.SetTimeToLive(PLT_Constants::GetInstance().GetAnnounceMulticastTimeToLive());
+ }
+
+ NPT_HttpRequest req(url, "NOTIFY", NPT_HTTP_PROTOCOL_1_1);
+ PLT_HttpHelper::SetHost(req, "239.255.255.250:1900");
+
+ // Location header valid only for ssdp:alive or ssdp:update messages
+ if (m_Type != PLT_ANNOUNCETYPE_BYEBYE) {
+ PLT_UPnPMessageHelper::SetLocation(req, m_Device->GetDescriptionUrl(addr.ToString()));
+ }
+
+ NPT_CHECK_SEVERE(m_Device->Announce(req, *socket, m_Type));
+
+#if defined(PLATINUM_UPNP_SPECS_STRICT)
+ // delay alive only as we don't want to delay when stopping
+ if (m_Type != PLT_ANNOUNCETYPE_BYEBYE) {
+ NPT_System::Sleep(NPT_TimeInterval(PLT_DLNA_SSDP_DELAY_GROUP));
+ }
+
+ NPT_CHECK_SEVERE(m_Device->Announce(req, *socket, m_Type));
+#endif
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceAnnounceUnicastTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_SsdpDeviceAnnounceTask::DoRun()
+{
+ NPT_List<NPT_NetworkInterface*> if_list;
+
+ while (1) {
+ NPT_CHECK_LABEL_FATAL(PLT_UPnPMessageHelper::GetNetworkInterfaces(if_list, false),
+ cleanup);
+
+ // if we're announcing our arrival, sends a byebye first (NMPR compliance)
+ if (m_IsByeByeFirst == true) {
+ m_IsByeByeFirst = false;
+
+ if (m_ExtraBroadcast) {
+ if_list.Apply(PLT_SsdpAnnounceInterfaceIterator(m_Device, PLT_ANNOUNCETYPE_BYEBYE, true));
+ }
+
+ // multicast now
+ if_list.Apply(PLT_SsdpAnnounceInterfaceIterator(m_Device, PLT_ANNOUNCETYPE_BYEBYE, false));
+
+ // schedule to announce alive in 200 ms
+ if (IsAborting(200)) break;
+ }
+
+ if (m_ExtraBroadcast) {
+ if_list.Apply(PLT_SsdpAnnounceInterfaceIterator(m_Device, PLT_ANNOUNCETYPE_ALIVE, true));
+ }
+
+ // multicast now
+ if_list.Apply(PLT_SsdpAnnounceInterfaceIterator(m_Device, PLT_ANNOUNCETYPE_ALIVE, false));
+
+
+cleanup:
+ if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+ if_list.Clear();
+
+ if (IsAborting((NPT_Timeout)m_Repeat.ToMillis())) break;
+ };
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpListenTask::GetInputStream(NPT_InputStreamReference& stream)
+{
+ if (!m_Datagram.IsNull()) {
+ stream = m_Datagram;
+ return NPT_SUCCESS;
+ } else {
+ NPT_InputStreamReference input_stream;
+ NPT_Result res = m_Socket->GetInputStream(input_stream);
+ if (NPT_FAILED(res)) {
+ return res;
+ }
+ // for datagrams, we can't simply read from the socket directly
+ // we need to read datagram into a buffer
+ m_Datagram = new PLT_InputDatagramStream((NPT_UdpSocket*)m_Socket);
+ stream = m_Datagram;
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask::GetInfo
++---------------------------------------------------------------------*/
+void
+PLT_SsdpListenTask::DoAbort()
+{
+ PLT_HttpServerSocketTask::DoAbort();
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpListenTask::GetInfo(NPT_SocketInfo& info)
+{
+ if (m_Datagram.IsNull()) return NPT_FAILURE;
+ return m_Datagram->GetInfo(info);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask::SetupResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpListenTask::SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(response);
+
+ NPT_AutoLock lock(m_Mutex);
+ m_Listeners.Apply(PLT_SsdpPacketListenerIterator(request, context));
+
+ // return error since we don't have anything to respond
+ // as we use a separate task to respond with ssdp
+ return NPT_ERROR_TERMINATED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchTask::PLT_SsdpSearchTask
++---------------------------------------------------------------------*/
+PLT_SsdpSearchTask::PLT_SsdpSearchTask(NPT_UdpSocket* socket,
+ PLT_SsdpSearchResponseListener* listener,
+ NPT_HttpRequest* request,
+ NPT_TimeInterval frequency) :
+ m_Listener(listener),
+ m_Request(request),
+ m_Frequency(frequency?frequency:NPT_TimeInterval(30.)),
+ m_Repeat(frequency.ToSeconds()!=0),
+ m_Socket(socket)
+{
+ m_Socket->SetReadTimeout((NPT_Timeout)m_Frequency.ToMillis());
+ m_Socket->SetWriteTimeout(10000);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchTask::~PLT_SsdpSearchTask
++---------------------------------------------------------------------*/
+PLT_SsdpSearchTask::~PLT_SsdpSearchTask()
+{
+ delete m_Socket;
+ delete m_Request;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchTask::DoAbort
++---------------------------------------------------------------------*/
+void
+PLT_SsdpSearchTask::DoAbort()
+{
+ m_Socket->Cancel();
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_SsdpSearchTask::DoRun()
+{
+ NPT_HttpResponse* response = NULL;
+ NPT_Timeout timeout = 30000;
+ NPT_HttpRequestContext context;
+
+ do {
+ // get the address of the server
+ NPT_IpAddress server_address;
+ NPT_CHECK_LABEL_SEVERE(server_address.ResolveName(
+ m_Request->GetUrl().GetHost(),
+ timeout),
+ done);
+ NPT_SocketAddress address(server_address,
+ m_Request->GetUrl().GetPort());
+
+ // send 2 requests in a row
+ NPT_OutputStreamReference output_stream(
+ new PLT_OutputDatagramStream(m_Socket,
+ 4096,
+ &address));
+ NPT_CHECK_LABEL_SEVERE(NPT_HttpClient::WriteRequest(
+ *output_stream.AsPointer(),
+ *m_Request,
+ false),
+ done);
+ NPT_CHECK_LABEL_SEVERE(NPT_HttpClient::WriteRequest(
+ *output_stream.AsPointer(),
+ *m_Request,
+ false),
+ done);
+ output_stream = NULL;
+
+ // keep track of when we sent the request
+ NPT_TimeStamp last_send;
+ NPT_System::GetCurrentTimeStamp(last_send);
+
+ while (!IsAborting(0)) {
+ // read response
+ PLT_InputDatagramStreamReference input_stream(
+ new PLT_InputDatagramStream(m_Socket));
+
+ NPT_InputStreamReference stream = input_stream;
+ NPT_Result res = NPT_HttpClient::ReadResponse(
+ stream,
+ false,
+ false,
+ response);
+ // callback to process response
+ if (NPT_SUCCEEDED(res)) {
+ // get source info
+ NPT_SocketInfo info;
+ input_stream->GetInfo(info);
+
+ context.SetLocalAddress(info.local_address);
+ context.SetRemoteAddress(info.remote_address);
+
+ // process response
+ ProcessResponse(NPT_SUCCESS, *m_Request, context, response);
+ delete response;
+ response = NULL;
+ } else if (res != NPT_ERROR_TIMEOUT) {
+ NPT_LOG_WARNING_1("PLT_SsdpSearchTask got an error (%d) waiting for response", res);
+ if (IsAborting(0))
+ break;
+
+ NPT_System::Sleep(NPT_TimeInterval(.15f));
+ }
+
+ input_stream = NULL;
+
+ // check if it's time to resend request
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ if (now >= last_send + m_Frequency)
+ break;
+ }
+ } while (!IsAborting(0) && m_Repeat);
+
+done:
+ return;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpSearchTask::ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ return m_Listener->ProcessSsdpSearchResponse(res, context, response);
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltSsdp.h b/lib/libUPnP/Platinum/Source/Core/PltSsdp.h
new file mode 100644
index 0000000..0bbbd75
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltSsdp.h
@@ -0,0 +1,389 @@
+/*****************************************************************
+|
+| Platinum - SSDP
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP SSDP
+ */
+
+#ifndef _PLT_SSDP_H_
+#define _PLT_SSDP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltThreadTask.h"
+#include "PltHttpServerTask.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_DeviceHost;
+
+/*----------------------------------------------------------------------
+| PLT_SsdpAnnounceType
++---------------------------------------------------------------------*/
+typedef enum {
+ PLT_ANNOUNCETYPE_BYEBYE,
+ PLT_ANNOUNCETYPE_ALIVE,
+ PLT_ANNOUNCETYPE_UPDATE
+} PLT_SsdpAnnounceType;
+
+/*----------------------------------------------------------------------
+| PLT_SsdpPacketListener class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpPacketListener class is an interface for handling SSDP packets
+ (M-SEARCH and NOTIFY).
+ */
+class PLT_SsdpPacketListener
+{
+public:
+ virtual ~PLT_SsdpPacketListener() {}
+ virtual NPT_Result OnSsdpPacket(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context) = 0;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchResponseListener class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpSearchResponseListener class is an interface for handling SSDP M-SEARCH
+ responses.
+ */
+class PLT_SsdpSearchResponseListener
+{
+public:
+ virtual ~PLT_SsdpSearchResponseListener() {}
+ virtual NPT_Result ProcessSsdpSearchResponse(NPT_Result res,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) = 0;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSender class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpSender class provides a mechanism to format and send SSDP packets.
+ */
+class PLT_SsdpSender
+{
+public:
+ static NPT_Result SendSsdp(NPT_HttpRequest& request,
+ const char* usn,
+ const char* nt,
+ NPT_UdpSocket& socket,
+ bool notify,
+ const NPT_SocketAddress* addr = NULL);
+
+ static NPT_Result SendSsdp(NPT_HttpResponse& response,
+ const char* usn,
+ const char* nt,
+ NPT_UdpSocket& socket,
+ bool notify,
+ const NPT_SocketAddress* addr = NULL);
+
+private:
+ static NPT_Result FormatPacket(NPT_HttpMessage& message,
+ const char* usn,
+ const char* nt,
+ NPT_UdpSocket& socket,
+ bool notify);
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceSearchResponseInterfaceIterator class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpDeviceSearchResponseInterfaceIterator class looks for the best network
+ interface to use then sends a SSDP M-SEARCH response.
+ */
+class PLT_SsdpDeviceSearchResponseInterfaceIterator
+{
+public:
+ PLT_SsdpDeviceSearchResponseInterfaceIterator(PLT_DeviceHost* device,
+ NPT_SocketAddress remote_addr,
+ const char* st) :
+ m_Device(device), m_RemoteAddr(remote_addr), m_ST(st) {}
+ virtual ~PLT_SsdpDeviceSearchResponseInterfaceIterator() {}
+
+ NPT_Result operator()(NPT_NetworkInterface*& if_addr) const;
+
+private:
+ PLT_DeviceHost* m_Device;
+ NPT_SocketAddress m_RemoteAddr;
+ NPT_String m_ST;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceSearchResponseTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpDeviceSearchResponseTask class is used by a PLT_DeviceHost to respond
+ to SSDP M-SEARCH requests from UPnP ControlPoints.
+ */
+class PLT_SsdpDeviceSearchResponseTask : public PLT_ThreadTask
+{
+public:
+ PLT_SsdpDeviceSearchResponseTask(PLT_DeviceHost* device,
+ NPT_SocketAddress remote_addr,
+ const char* st) :
+ m_Device(device), m_RemoteAddr(remote_addr), m_ST(st) {}
+
+protected:
+ ~PLT_SsdpDeviceSearchResponseTask() override {}
+
+ // PLT_ThreadTask methods
+ void DoRun() override;
+
+protected:
+ PLT_DeviceHost* m_Device;
+ NPT_SocketAddress m_RemoteAddr;
+ NPT_String m_ST;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpAnnounceInterfaceIterator class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpAnnounceInterfaceIterator class is used to send SSDP announcements
+ given a list of network interaces.
+ */
+class PLT_SsdpAnnounceInterfaceIterator
+{
+public:
+ PLT_SsdpAnnounceInterfaceIterator(PLT_DeviceHost* device, PLT_SsdpAnnounceType type, bool broadcast = false) :
+ m_Device(device), m_Type(type), m_Broadcast(broadcast) {}
+
+ NPT_Result operator()(NPT_NetworkInterface*& if_addr) const;
+
+private:
+ PLT_DeviceHost* m_Device;
+ PLT_SsdpAnnounceType m_Type;
+ bool m_Broadcast;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpInitMulticastIterator class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpInitMulticastIterator class is used to join a multicast group
+ given a list of IP addresses.
+ */
+class PLT_SsdpInitMulticastIterator
+{
+public:
+ PLT_SsdpInitMulticastIterator(NPT_UdpMulticastSocket* socket) :
+ m_Socket(socket) {}
+
+ NPT_Result operator()(NPT_IpAddress& if_addr) const {
+ NPT_IpAddress addr;
+ addr.ResolveName("239.255.255.250");
+ // OSX bug, since we're reusing the socket, we need to leave group first
+ // before joining it
+ m_Socket->LeaveGroup(addr, if_addr);
+ return m_Socket->JoinGroup(addr, if_addr);
+ }
+
+private:
+ NPT_UdpMulticastSocket* m_Socket;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceAnnounceTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpDeviceAnnounceTask class is a task to send UPnP Device SSDP announcements
+ (alive or byebye). It can be setup to automatically repeat after an interval.
+ */
+class PLT_SsdpDeviceAnnounceTask : public PLT_ThreadTask
+{
+public:
+ PLT_SsdpDeviceAnnounceTask(PLT_DeviceHost* device,
+ NPT_TimeInterval repeat,
+ bool is_byebye_first = false,
+ bool extra_broadcast = false) :
+ m_Device(device),
+ m_Repeat(repeat),
+ m_IsByeByeFirst(is_byebye_first),
+ m_ExtraBroadcast(extra_broadcast) {}
+
+protected:
+ ~PLT_SsdpDeviceAnnounceTask() override {}
+
+ // PLT_ThreadTask methods
+ void DoRun() override;
+
+protected:
+ PLT_DeviceHost* m_Device;
+ NPT_TimeInterval m_Repeat;
+ bool m_IsByeByeFirst;
+ bool m_ExtraBroadcast;
+};
+
+/*----------------------------------------------------------------------
+| PLT_NetworkInterfaceAddressSearchIterator class
++---------------------------------------------------------------------*/
+/**
+ The PLT_NetworkInterfaceAddressSearchIterator class returns the network interface
+ given an IP address.
+ */
+class PLT_NetworkInterfaceAddressSearchIterator
+{
+public:
+ PLT_NetworkInterfaceAddressSearchIterator(NPT_String ip) : m_Ip(ip) {}
+ virtual ~PLT_NetworkInterfaceAddressSearchIterator() {}
+
+ NPT_Result operator()(NPT_NetworkInterface*& addr) const {
+ NPT_List<NPT_NetworkInterfaceAddress>::Iterator niaddr = addr->GetAddresses().GetFirstItem();
+ if (!niaddr) return NPT_FAILURE;
+
+ return (m_Ip.Compare((*niaddr).GetPrimaryAddress().ToString(), true) == 0) ? NPT_SUCCESS : NPT_FAILURE;
+ }
+
+private:
+ NPT_String m_Ip;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpPacketListenerIterator class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpPacketListenerIterator class iterates through a list of
+ PLT_SsdpPacketListener instances to notify of a new SSDP incoming packet.
+ */
+class PLT_SsdpPacketListenerIterator
+{
+public:
+ PLT_SsdpPacketListenerIterator(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context) :
+ m_Request(request), m_Context(context) {}
+
+ NPT_Result operator()(PLT_SsdpPacketListener*& listener) const {
+ return listener->OnSsdpPacket(m_Request, m_Context);
+ }
+
+private:
+ NPT_HttpRequest& m_Request;
+ const NPT_HttpRequestContext& m_Context;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpListenTask class is used to listen for incoming SSDP packets and
+ keep track of a list of PLT_SsdpPacketListener listeners to notify when a new
+ SSDP packet has arrived.
+ */
+class PLT_SsdpListenTask : public PLT_HttpServerSocketTask
+{
+public:
+ PLT_SsdpListenTask(NPT_Socket* socket) :
+ PLT_HttpServerSocketTask(socket, true) {
+ // Change read time out for UDP because iPhone 3.0 seems to hang
+ // after reading everything from the socket even though
+ // more stuff arrived
+#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+ m_Socket->SetReadTimeout(10000);
+#endif
+ }
+
+ NPT_Result AddListener(PLT_SsdpPacketListener* listener) {
+ NPT_AutoLock lock(m_Mutex);
+ m_Listeners.Add(listener);
+ return NPT_SUCCESS;
+ }
+
+ NPT_Result RemoveListener(PLT_SsdpPacketListener* listener) {
+ NPT_AutoLock lock(m_Mutex);
+ m_Listeners.Remove(listener);
+ return NPT_SUCCESS;
+ }
+
+ // PLT_Task methods
+ void DoAbort() override;
+
+protected:
+ ~PLT_SsdpListenTask() override {}
+
+ // PLT_HttpServerSocketTask methods
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override;
+ NPT_Result GetInfo(NPT_SocketInfo& info) override;
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+protected:
+ PLT_InputDatagramStreamReference m_Datagram;
+ NPT_List<PLT_SsdpPacketListener*> m_Listeners;
+ NPT_Mutex m_Mutex;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_SsdpSearchTask class is a task used by a PLT_CtrlPoint to issue a SSDP
+ M-SEARCH request. It can be set to repeat at a certain frequencey.
+ */
+class PLT_SsdpSearchTask : public PLT_ThreadTask
+{
+public:
+ PLT_SsdpSearchTask(NPT_UdpSocket* socket,
+ PLT_SsdpSearchResponseListener* listener,
+ NPT_HttpRequest* request,
+ NPT_TimeInterval frequency = NPT_TimeInterval(0.)); // pass 0 for one time
+
+protected:
+ ~PLT_SsdpSearchTask() override;
+
+ // PLT_ThreadTask methods
+ void DoAbort() override;
+ void DoRun() override;
+
+ virtual NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+private:
+ PLT_SsdpSearchResponseListener* m_Listener;
+ NPT_HttpRequest* m_Request;
+ NPT_TimeInterval m_Frequency;
+ bool m_Repeat;
+ NPT_UdpSocket* m_Socket;
+};
+
+#endif /* _PLT_SSDP_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
new file mode 100644
index 0000000..f733d5c
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
@@ -0,0 +1,269 @@
+/*****************************************************************
+|
+| Platinum - Service State Variable
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltStateVariable.h"
+#include "PltService.h"
+#include "PltUtilities.h"
+#include "PltUPnP.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.statevariable")
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::PLT_StateVariable
++---------------------------------------------------------------------*/
+PLT_StateVariable::PLT_StateVariable(PLT_Service* service) :
+ m_Service(service),
+ m_AllowedValueRange(NULL),
+ m_IsSendingEvents(false),
+ m_IsSendingEventsIndirectly(true),
+ m_ShouldClearOnSend(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::~PLT_StateVariable
++---------------------------------------------------------------------*/
+PLT_StateVariable::~PLT_StateVariable()
+{
+ m_AllowedValues.Apply(NPT_ObjectDeleter<NPT_String>());
+ if (m_AllowedValueRange) delete m_AllowedValueRange;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::GetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::GetSCPDXML(NPT_XmlElementNode* node)
+{
+ NPT_XmlElementNode* variable = new NPT_XmlElementNode("stateVariable");
+ NPT_CHECK_SEVERE(node->AddChild(variable));
+
+ NPT_CHECK_SEVERE(variable->SetAttribute("sendEvents", m_IsSendingEvents?"yes":"no"));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(variable, "name", m_Name));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(variable, "dataType", m_DataType));
+ if (m_DefaultValue.GetLength()) {
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(variable, "defaultValue", m_DefaultValue));
+ }
+
+ if (m_AllowedValues.GetItemCount()) {
+ NPT_XmlElementNode* allowedValueList = new NPT_XmlElementNode("allowedValueList");
+ NPT_CHECK_SEVERE(variable->AddChild(allowedValueList));
+ for( int l = 0 ; l < (int)m_AllowedValues.GetItemCount(); l++) {
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(allowedValueList, "allowedValue", (*m_AllowedValues[l])));
+ }
+ } else if (m_AllowedValueRange) {
+ NPT_XmlElementNode* range = new NPT_XmlElementNode("allowedValueRange");
+ NPT_CHECK_SEVERE(variable->AddChild(range));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(range, "minimum", NPT_String::FromInteger(m_AllowedValueRange->min_value)));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(range, "maximum", NPT_String::FromInteger(m_AllowedValueRange->max_value)));
+ if (m_AllowedValueRange->step != -1) {
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(range, "step", NPT_String::FromInteger(m_AllowedValueRange->step)));
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::GetService
++---------------------------------------------------------------------*/
+PLT_Service*
+PLT_StateVariable::GetService()
+{
+ return m_Service;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::IsSendingEvents
++---------------------------------------------------------------------*/
+bool
+PLT_StateVariable::IsSendingEvents(bool indirectly /* = false */)
+{
+ if (indirectly) {
+ return (!m_IsSendingEvents &&
+ !m_Name.StartsWith("A_ARG_TYPE_") &&
+ m_IsSendingEventsIndirectly);
+ }
+
+ return m_IsSendingEvents;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::DisableIndirectEventing
++---------------------------------------------------------------------*/
+void
+PLT_StateVariable::DisableIndirectEventing()
+{
+ m_IsSendingEventsIndirectly = false;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::SetRate
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::SetRate(NPT_TimeInterval rate)
+{
+ if (!IsSendingEvents()) return NPT_FAILURE;
+
+ m_Rate = rate;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::SetValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::SetValue(const char* value, const bool clearonsend /*=false*/)
+{
+ if (value == NULL) {
+ return NPT_FAILURE;
+ }
+
+ // update only if it's different
+ if (m_Value != value) {
+ NPT_Result res = ValidateValue(value);
+ if (NPT_FAILED(res)) {
+ return res;
+ }
+
+ m_Value = value;
+ m_ShouldClearOnSend = clearonsend;
+ m_Service->AddChanged(this);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::IsReadyToPublish
++---------------------------------------------------------------------*/
+bool
+PLT_StateVariable::IsReadyToPublish()
+{
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+
+ if (m_Rate == NPT_TimeStamp() || m_LastEvent + m_Rate <= now ) {
+ m_LastEvent = now;
+ return true;
+ }
+
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::OnSendCompleted
++---------------------------------------------------------------------*/
+void
+PLT_StateVariable::OnSendCompleted()
+{
+ if(m_ShouldClearOnSend)
+ m_Value = m_DefaultValue;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::ValidateValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::ValidateValue(const char* value)
+{
+ if (m_DataType.Compare("string", true) == 0) {
+ // if we have a value allowed restriction, make sure the value is in our list
+ if (m_AllowedValues.GetItemCount()) {
+ // look for a comma separated list
+ NPT_String _value = value;
+ NPT_List<NPT_String> values = _value.Split(",");
+ NPT_List<NPT_String>::Iterator val = values.GetFirstItem();
+ while (val) {
+ val->Trim(" ");
+ if (!m_AllowedValues.Find(NPT_StringFinder(*val))) {
+#if defined(NPT_CONFIG_ENABLE_LOGGING)
+ NPT_LOG_WARNING_2("Invalid value of %s for state variable %s",
+ (const char*)*val,
+ (const char*)m_Name);
+ for (unsigned long i=0; i < m_AllowedValues.GetItemCount(); i++) {
+ NPT_String *val2 = *m_AllowedValues.GetItem(i);
+ NPT_LOG_WARNING_1("Allowed: %s", (const char*)*val2);
+ }
+#endif
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ ++val;
+ }
+ }
+ }
+
+ // TODO: there are more to it than allowed values, we need to test for range, etc..
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::Find
++---------------------------------------------------------------------*/
+PLT_StateVariable*
+PLT_StateVariable::Find(NPT_List<PLT_StateVariable*>& vars, const char* name)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(vars, PLT_StateVariableNameFinder(name), stateVariable);
+ return stateVariable;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::SetExtraAttribute
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::SetExtraAttribute(const char* name, const char* value)
+{
+ return m_ExtraAttributes.Put(NPT_String(name), NPT_String(value));
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::Serialize
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::Serialize(NPT_XmlElementNode& node)
+{
+ NPT_List<NPT_Map<NPT_String, NPT_String>::Entry*>::Iterator entry =
+ m_ExtraAttributes.GetEntries().GetFirstItem();
+ while (entry) {
+ const NPT_String& key = (*entry)->GetKey();
+ const NPT_String& value = (*entry)->GetValue();
+ node.SetAttribute(key, value);
+ ++entry;
+ }
+ return node.SetAttribute("val", GetValue());
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h
new file mode 100644
index 0000000..465e95c
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h
@@ -0,0 +1,231 @@
+/*****************************************************************
+|
+| Platinum - Service State Variable
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP State Variable
+ */
+
+#ifndef _PLT_STATE_VARIABLE_H_
+#define _PLT_STATE_VARIABLE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Argument;
+class PLT_Service;
+
+/*----------------------------------------------------------------------
+| NPT_AllowedValueRange struct
++---------------------------------------------------------------------*/
+/**
+ The NPT_AllowedValueRange struct holds the min, max and step value allowed of
+ a UPnP Service state variable.
+ */
+typedef struct {
+ NPT_Int32 min_value;
+ NPT_Int32 max_value;
+ NPT_Int32 step;
+} NPT_AllowedValueRange;
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable class
++---------------------------------------------------------------------*/
+/**
+ The PLT_StateVariable class maintains the state of a UPnP Service state variable.
+ It is used by a PLT_DeviceHost instance to notify subscribers of a change or by a
+ subscriber (PLT_CtrlPoint) when a service state variable change notification
+ has been received.
+ */
+class PLT_StateVariable
+{
+public:
+ PLT_StateVariable(PLT_Service* service);
+ ~PLT_StateVariable();
+
+ /**
+ Populate the SCPD xml document with state variable information.
+ @param node XML Element where to insert the state variable XML Element
+ */
+ NPT_Result GetSCPDXML(NPT_XmlElementNode* node);
+
+ /**
+ Return the PLT_Service that this state variable is associated with.
+ @return PLT_Service pointer.
+ */
+ PLT_Service* GetService();
+
+ /**
+ Return whether the state variable is eventable directly or indirectly. A state
+ variable sends events indirectly when part of the "LastChange" state variable.
+ @param indirectly Boolean to test if the state variable is sending events indirectly
+ @return Whether the state variable sends events according to the input flag specified.
+ */
+ bool IsSendingEvents(bool indirectly = false);
+
+ /**
+ Force the state variable to send events directly.
+ */
+ void DisableIndirectEventing();
+
+ /**
+ Certain state variables notifications must not be sent faster than a certain
+ rate according to the UPnP specs. This sets the rate for a given state variable.
+ @param rate time interval to respect between notifications.
+ */
+ NPT_Result SetRate(NPT_TimeInterval rate);
+
+ /**
+ Set the state variable value. The value is first validated to make sure
+ it is an allowed value. Once the value is validated, it is marked for eventing by
+ calling the PLT_Service AddChanged function.
+ @param value new state variable value. Can be a comma separated list of values.
+ @param clearonsend whether the statevariable should be cleared immediatly after sending
+ */
+ NPT_Result SetValue(const char* value, const bool clearonsend = false);
+
+ /**
+ Validate the new value of the state variable.
+ @param value new state variable value. Can be a comma separated list of values.
+ */
+ NPT_Result ValidateValue(const char* value);
+
+ /**
+ Certain state variables require extra xml attributes when serialized.
+ @param name the attribute name
+ @param value the attribute value
+ */
+ NPT_Result SetExtraAttribute(const char* name, const char* value);
+
+ /**
+ Return the state variable name.
+ @return state variable name.
+ */
+ const NPT_String& GetName() const { return m_Name; }
+
+ /**
+ Return the current state variable value.
+ @return state variable current value.
+ */
+ const NPT_String& GetValue() const { return m_Value; }
+
+ /**
+ Return the state variable data type.
+ @return state variable data type.
+ */
+ const NPT_String& GetDataType() const { return m_DataType; }
+
+ /**
+ Return the state variable allowed value range if any.
+ @return state variable value range pointer or null if none.
+ */
+ const NPT_AllowedValueRange* GetAllowedValueRange() const { return m_AllowedValueRange; }
+
+ /**
+ Helper function to return a state variable given a list of state variables
+ and a state variable name.
+ @param vars list of state variables
+ @param name state variable name to look for
+ @return PLT_StateVariable pointer.
+ */
+ static PLT_StateVariable* Find(NPT_List<PLT_StateVariable*>& vars,
+ const char* name);
+
+protected:
+ /**
+ Return whether the state variable value changed and subscribers need to
+ be notified.
+ */
+ bool IsReadyToPublish();
+
+ /**
+ * If this statevariable should clear after sending to all subscribers, clears the value without
+ * eventing the change
+ */
+ void OnSendCompleted();
+
+ /**
+ Serialize the state variable into xml.
+ */
+ NPT_Result Serialize(NPT_XmlElementNode& node);
+
+protected:
+ friend class PLT_Service;
+ friend class PLT_LastChangeXMLIterator;
+
+ //members
+ PLT_Service* m_Service;
+ NPT_AllowedValueRange* m_AllowedValueRange;
+ NPT_String m_Name;
+ NPT_String m_DataType;
+ NPT_String m_DefaultValue;
+ bool m_IsSendingEvents;
+ bool m_IsSendingEventsIndirectly;
+ bool m_ShouldClearOnSend;
+ NPT_TimeInterval m_Rate;
+ NPT_TimeStamp m_LastEvent;
+ NPT_Array<NPT_String*> m_AllowedValues;
+ NPT_String m_Value;
+
+ NPT_Map<NPT_String,NPT_String> m_ExtraAttributes;
+};
+
+/*----------------------------------------------------------------------
+| PLT_StateVariableNameFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_StateVariableNameFinder class returns the PLT_StateVariable instance
+ given a state variable name.
+ */
+class PLT_StateVariableNameFinder
+{
+public:
+ // methods
+ PLT_StateVariableNameFinder(const char* name) : m_Name(name) {}
+ virtual ~PLT_StateVariableNameFinder() {}
+
+ bool operator()(const PLT_StateVariable* const & state_variable) const {
+ return state_variable->GetName().Compare(m_Name, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Name;
+};
+
+#endif /* _PLT_STATE_VARIABLE_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltTaskManager.cpp b/lib/libUPnP/Platinum/Source/Core/PltTaskManager.cpp
new file mode 100644
index 0000000..368a057
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltTaskManager.cpp
@@ -0,0 +1,236 @@
+/*****************************************************************
+|
+| Platinum - Task Manager
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltTaskManager.h"
+#include "PltThreadTask.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.taskmanager")
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::PLT_TaskManager
++---------------------------------------------------------------------*/
+PLT_TaskManager::PLT_TaskManager(NPT_Cardinal max_items /* = 0 */) :
+ m_Queue(NULL),
+ m_MaxTasks(max_items),
+ m_RunningTasks(0),
+ m_Stopping(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::~PLT_TaskManager
++---------------------------------------------------------------------*/
+PLT_TaskManager::~PLT_TaskManager()
+{
+ Abort();
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::StartTask
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_TaskManager::StartTask(PLT_ThreadTask* task,
+ NPT_TimeInterval* delay /* = NULL*/,
+ bool auto_destroy /* = true */)
+{
+ NPT_CHECK_POINTER_SEVERE(task);
+ return task->Start(this, delay, auto_destroy);
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::Reset
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_TaskManager::Reset()
+{
+ NPT_AutoLock lock(m_TasksLock);
+ m_Stopping = false;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::Abort
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_TaskManager::Abort()
+{
+ NPT_Cardinal num_running_tasks;
+
+ do {
+ {
+ NPT_AutoLock lock(m_TasksLock);
+
+ m_Stopping = true;
+
+ // unblock the queue if any by deleting it
+ if (m_Queue) {
+ int* val = NULL;
+ while(NPT_SUCCEEDED(m_Queue->Pop(val, 0))) delete val;
+
+ delete m_Queue;
+ m_Queue = NULL;
+ }
+ }
+
+ // abort all running tasks
+ {
+ NPT_AutoLock lock(m_TasksLock);
+
+ NPT_List<PLT_ThreadTask*>::Iterator task = m_Tasks.GetFirstItem();
+ while (task) {
+ // stop task if it's not already stopping
+ if (!(*task)->IsAborting(0)) {
+ (*task)->Stop(false);
+ }
+ ++task;
+ }
+
+ num_running_tasks = m_Tasks.GetItemCount();
+ }
+
+ if (num_running_tasks == 0)
+ break;
+
+ NPT_System::Sleep(NPT_TimeInterval(0.05));
+ } while (1);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::AddTask
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_TaskManager::AddTask(PLT_ThreadTask* task)
+{
+ NPT_Result result = NPT_SUCCESS;
+ int *val = NULL;
+
+ // verify we're not stopping or maxed out number of running tasks
+ do {
+ m_TasksLock.Lock();
+
+ // returning an error if we're stopping
+ if (m_Stopping) {
+ m_TasksLock.Unlock();
+ delete val;
+ if (task->m_AutoDestroy) delete task;
+ NPT_CHECK_WARNING(NPT_ERROR_INTERRUPTED);
+ }
+
+ if (m_MaxTasks) {
+ val = val?val:new int;
+
+ if (!m_Queue) {
+ m_Queue = new NPT_Queue<int>(m_MaxTasks);
+ }
+
+
+ // try to add to queue but don't block forever if queue is full
+ result = m_Queue->Push(val, 20);
+ if (NPT_SUCCEEDED(result)) break;
+
+ // release lock if it's a failure
+ // this gives a chance for the taskmanager
+ // to abort the queue if full
+ m_TasksLock.Unlock();
+
+ // if it failed due to something other than a timeout
+ // it probably means the queue is aborting
+ if (result != NPT_ERROR_TIMEOUT) {
+ delete val;
+ if (task->m_AutoDestroy) delete task;
+ NPT_CHECK_WARNING(result);
+ }
+ }
+ } while (result == NPT_ERROR_TIMEOUT);
+
+ // start task now
+ if (NPT_FAILED(result = task->StartThread())) {
+ m_TasksLock.Unlock();
+
+ // Remove task from queue and delete task if autodestroy is set
+ RemoveTask(task);
+
+ return result;
+ }
+
+ NPT_LOG_FINER_3("[TaskManager 0x%p] %d/%d running tasks", (void*)this, ++m_RunningTasks, m_MaxTasks);
+
+ // keep track of running task
+ result = m_Tasks.Add(task);
+
+ m_TasksLock.Unlock();
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::RemoveTask
++---------------------------------------------------------------------*/
+// called by a PLT_ThreadTask::Run when done
+NPT_Result
+PLT_TaskManager::RemoveTask(PLT_ThreadTask* task)
+{
+ NPT_Result result = NPT_SUCCESS;
+
+ {
+ NPT_AutoLock lock(m_TasksLock);
+
+ if (m_Queue) {
+ int* val = NULL;
+ result = m_Queue->Pop(val, 100);
+
+ // if for some reason the queue is empty, don't block forever
+ if (NPT_SUCCEEDED(result)) {
+ delete val;
+ } else {
+ NPT_LOG_WARNING_1("Failed to pop task from queue %d", result);
+ }
+ }
+
+ NPT_LOG_FINER_3("[TaskManager 0x%p] %d/%d running tasks", (void*)this, --m_RunningTasks, m_MaxTasks);
+ m_Tasks.Remove(task);
+ }
+
+ // cleanup task only if auto-destroy flag was set
+ // otherwise it's the owner's responsability to
+ // clean it up
+ if (task->m_AutoDestroy) delete task;
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltTaskManager.h b/lib/libUPnP/Platinum/Source/Core/PltTaskManager.h
new file mode 100644
index 0000000..aa1a58d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltTaskManager.h
@@ -0,0 +1,116 @@
+/*****************************************************************
+|
+| Platinum - Task Manager
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ Runnable Tasks Manager
+ */
+
+#ifndef _PLT_TASKMANAGER_H_
+#define _PLT_TASKMANAGER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_ThreadTask;
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager class
++---------------------------------------------------------------------*/
+/**
+ The PLT_TaskManager class maintains a list of runnable tasks. During shutdown, it
+ can stop all running tasks. Additionally, it can limit the number of
+ tasks that can run at any given time.
+ */
+class PLT_TaskManager
+{
+public:
+ /**
+ Create a new Task Manager.
+ @param max_tasks Maximum number of concurrent tasks that the task manager
+ will allow. When the value is reached, a thread calling AddTask will block until
+ a task has finished.
+ */
+ PLT_TaskManager(NPT_Cardinal max_tasks = 0);
+ virtual ~PLT_TaskManager();
+
+ /**
+ Start a new new task and associates it with this task manager.
+ @param task new task
+ @param delay optional time interval to wait before launching the new task
+ @param auto_destroy a flag to indicate if the task is owned by someone else
+ and thus should not destroy itself when done.
+ */
+ virtual NPT_Result StartTask(PLT_ThreadTask* task,
+ NPT_TimeInterval* delay = NULL,
+ bool auto_destroy = true);
+
+ /**
+ Stop all tasks associated with this task manager.
+ */
+ NPT_Result Abort();
+
+ /**
+ Reset task manager after an Abort so new tasks can be queued.
+ */
+ NPT_Result Reset();
+
+ /**
+ Returns the max number of concurrent tasks allowed. 0 for no limit.
+ */
+ NPT_Cardinal GetMaxTasks() { return m_MaxTasks; }
+
+private:
+ friend class PLT_ThreadTask;
+
+ // called by PLT_ThreadTask
+ NPT_Result AddTask(PLT_ThreadTask* task);
+ NPT_Result RemoveTask(PLT_ThreadTask* task);
+
+private:
+ NPT_List<PLT_ThreadTask*> m_Tasks;
+ NPT_Mutex m_TasksLock;
+ NPT_Queue<int>* m_Queue;
+ NPT_Cardinal m_MaxTasks;
+ NPT_Cardinal m_RunningTasks;
+ bool m_Stopping;
+};
+
+typedef NPT_Reference<PLT_TaskManager> PLT_TaskManagerReference;
+
+#endif /* _PLT_TASKMANAGER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltThreadTask.cpp b/lib/libUPnP/Platinum/Source/Core/PltThreadTask.cpp
new file mode 100644
index 0000000..1ae6064
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltThreadTask.cpp
@@ -0,0 +1,190 @@
+/*****************************************************************
+|
+| Platinum - Tasks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltThreadTask.h"
+#include "PltTaskManager.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.threadtask")
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::PLT_ThreadTask
++---------------------------------------------------------------------*/
+PLT_ThreadTask::PLT_ThreadTask() :
+ m_TaskManager(NULL),
+ m_Thread(NULL),
+ m_AutoDestroy(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::~PLT_ThreadTask
++---------------------------------------------------------------------*/
+PLT_ThreadTask::~PLT_ThreadTask()
+{
+ if (!m_AutoDestroy) delete m_Thread;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ThreadTask::Start(PLT_TaskManager* task_manager,/* = NULL */
+ NPT_TimeInterval* delay, /* = NULL */
+ bool auto_destroy /* = true */)
+{
+ m_Abort.SetValue(0);
+ m_AutoDestroy = auto_destroy;
+ m_Delay = delay?*delay:NPT_TimeStamp(0.);
+ m_TaskManager = task_manager;
+
+ if (m_TaskManager) {
+ NPT_CHECK_SEVERE(m_TaskManager->AddTask(this));
+ return NPT_SUCCESS;
+ } else {
+ NPT_Result result = StartThread();
+
+ // suicide now if task is to auto destroy when finish
+ if (NPT_FAILED(result) && m_AutoDestroy) {
+ delete this;
+ }
+ return result;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::StartThread
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ThreadTask::StartThread()
+{
+ m_Started.SetValue(0);
+
+ m_Thread = new NPT_Thread((NPT_Runnable&)*this, m_AutoDestroy);
+ NPT_Result result = m_Thread->Start();
+ if (NPT_FAILED(result)) {
+
+ // delete thread manually in case m_AutoDestroy was true
+ if (m_AutoDestroy) {
+ delete m_Thread;
+ m_Thread = NULL;
+ }
+
+ NPT_CHECK_FATAL(result);
+ }
+
+ return m_Started.WaitUntilEquals(1, NPT_TIMEOUT_INFINITE);
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ThreadTask::Stop(bool blocking /* = true */)
+{
+ // keep variable around in case
+ // we get destroyed
+ bool auto_destroy = m_AutoDestroy;
+
+ // tell thread we want to die
+ m_Abort.SetValue(1);
+ DoAbort();
+
+ // return without waiting if non blocking or not started
+ if (!blocking || !m_Thread) return NPT_SUCCESS;
+
+ // if auto-destroy, the thread may be already dead by now
+ // so we can't wait on m_Thread.
+ // only Task Manager will know when task is finished
+ return auto_destroy?NPT_FAILURE:m_Thread->Wait();
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::Kill
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ThreadTask::Kill()
+{
+ Stop();
+
+ // A task can only be destroyed manually
+ // when the m_AutoDestroy is false
+ // otherwise the Task Manager takes
+ // care of deleting it when the thread exits
+ NPT_ASSERT(m_AutoDestroy == false);
+ if (!m_AutoDestroy) delete this;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::Run
++---------------------------------------------------------------------*/
+void
+PLT_ThreadTask::Run()
+{
+ m_Started.SetValue(1);
+
+ // wait before starting task if necessary
+ if ((float)m_Delay > 0.f) {
+ // more than 100ms, loop so we can abort it
+ if ((float)m_Delay > 0.1f) {
+ NPT_TimeStamp start, now;
+ NPT_System::GetCurrentTimeStamp(start);
+ do {
+ NPT_System::GetCurrentTimeStamp(now);
+ if (now >= start + m_Delay) break;
+ } while (!IsAborting(100));
+ } else {
+ NPT_System::Sleep(m_Delay);
+ }
+ }
+
+ // loop
+ if (!IsAborting(0)) {
+ DoInit();
+ DoRun();
+ }
+
+ // notify the Task Manager we're done
+ // it will destroy us if m_AutoDestroy is true
+ if (m_TaskManager) {
+ m_TaskManager->RemoveTask(this);
+ } else if (m_AutoDestroy) {
+ // destroy ourselves otherwise
+ delete this;
+ }
+}
diff --git a/lib/libUPnP/Platinum/Source/Core/PltThreadTask.h b/lib/libUPnP/Platinum/Source/Core/PltThreadTask.h
new file mode 100644
index 0000000..49bda3d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltThreadTask.h
@@ -0,0 +1,140 @@
+/*****************************************************************
+|
+| Platinum - Thread Tasks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ Runnable Task
+ */
+
+#ifndef _PLT_THREADTASK_H_
+#define _PLT_THREADTASK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltTaskManager.h"
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask class
++---------------------------------------------------------------------*/
+/**
+ The PLT_ThreadTask class is a base class for executing a given task in a worker
+ thread. A PLT_ThreadTask is usually always associated to a PLT_TaskManager
+ which maintains a list to stop and destroy tasks when finished.
+ */
+class PLT_ThreadTask : public NPT_Runnable
+{
+public:
+ friend class PLT_TaskManager;
+
+ /**
+ When a task is not managed by a PLT_TaskManager, the owner must call
+ this to stop and destroy it.
+ */
+ NPT_Result Kill();
+
+protected:
+ /**
+ Return whether this task is in the process of stopping.
+ @param timeout number of milliseconds to wait
+ @return boolean indicating if the task is stopping
+ */
+ virtual bool IsAborting(NPT_Timeout timeout) {
+ return NPT_SUCCEEDED(m_Abort.WaitUntilEquals(1, timeout));
+ }
+
+ /**
+ Start a task by associating it with a task manager.
+ @param task_manager PLT_TaskManager pointer
+ @param delay optional time interval to wait before launching the new task
+ @param auto_destroy a flag to indicate if the task is owned by someone else
+ and thus should not destroy itself when done.
+ */
+ NPT_Result Start(PLT_TaskManager* task_manager = NULL,
+ NPT_TimeInterval* delay = NULL,
+ bool auto_destroy = true);
+ /**
+ Stop the task. This is either called by a task manager or the Kill method.
+ @param blocking Whether the method should block until the task has finished.
+ */
+ NPT_Result Stop(bool blocking = true);
+
+ /**
+ This method to override in derived classes is called when the task is about
+ to start.
+ */
+ virtual void DoInit() {}
+
+ /**
+ This method to override in derived classes is called when the task is about
+ to stop.
+ */
+ virtual void DoAbort() {}
+
+ /**
+ This method to override in derived classes is the main task loop.
+ */
+ virtual void DoRun() {}
+
+ /**
+ A PLT_ThreadTask base class is never instantiated directly.
+ */
+ PLT_ThreadTask();
+
+ /**
+ The task manager will destroy the task when finished if m_AutoDestroy is
+ true otherwise the owner of this task must use the Kill method.
+ */
+ ~PLT_ThreadTask() override;
+
+private:
+ NPT_Result StartThread();
+
+ // NPT_Thread methods
+ void Run() override;
+
+protected:
+ // members
+ PLT_TaskManager* m_TaskManager;
+
+private:
+ // members
+ NPT_SharedVariable m_Started;
+ NPT_SharedVariable m_Abort;
+ NPT_Thread* m_Thread;
+ bool m_AutoDestroy;
+ NPT_TimeInterval m_Delay;
+};
+
+#endif /* _PLT_THREADTASK_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltUPnP.cpp b/lib/libUPnP/Platinum/Source/Core/PltUPnP.cpp
new file mode 100644
index 0000000..e0b1e8b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltUPnP.cpp
@@ -0,0 +1,298 @@
+/*****************************************************************
+|
+| Platinum - UPnP Engine
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltVersion.h"
+#include "PltUPnP.h"
+#include "PltDeviceHost.h"
+#include "PltCtrlPoint.h"
+#include "PltSsdp.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.upnp")
+
+/*----------------------------------------------------------------------
+| PLT_UPnP_CtrlPointStartIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_CtrlPointStartIterator
+{
+public:
+ PLT_UPnP_CtrlPointStartIterator(PLT_SsdpListenTask* listen_task) :
+ m_ListenTask(listen_task) {}
+ virtual ~PLT_UPnP_CtrlPointStartIterator() {}
+
+ NPT_Result operator()(PLT_CtrlPointReference& ctrl_point) const {
+ NPT_CHECK_SEVERE(ctrl_point->Start(m_ListenTask));
+ return NPT_SUCCESS;
+ }
+
+private:
+ PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+| PLT_UPnP_CtrlPointStopIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_CtrlPointStopIterator
+{
+public:
+ PLT_UPnP_CtrlPointStopIterator(PLT_SsdpListenTask* listen_task) :
+ m_ListenTask(listen_task) {}
+ virtual ~PLT_UPnP_CtrlPointStopIterator() {}
+
+ NPT_Result operator()(PLT_CtrlPointReference& ctrl_point) const {
+ return ctrl_point->Stop(m_ListenTask);
+ }
+
+
+private:
+ PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+| PLT_UPnP_DeviceStartIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_DeviceStartIterator
+{
+public:
+ PLT_UPnP_DeviceStartIterator(PLT_SsdpListenTask* listen_task) :
+ m_ListenTask(listen_task) {}
+ virtual ~PLT_UPnP_DeviceStartIterator() {}
+
+ NPT_Result operator()(PLT_DeviceHostReference& device_host) const {
+
+ // We should always increment the boot id on restart
+ // so it is used in place of boot id during initial announcement
+ device_host->SetBootId(device_host->GenerateNextBootId());
+ device_host->SetNextBootId(0);
+
+ NPT_CHECK_SEVERE(device_host->Start(m_ListenTask));
+ return NPT_SUCCESS;
+ }
+
+private:
+ PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+| PLT_UPnP_DeviceStopIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_DeviceStopIterator
+{
+public:
+ PLT_UPnP_DeviceStopIterator(PLT_SsdpListenTask* listen_task) :
+ m_ListenTask(listen_task) {}
+ virtual ~PLT_UPnP_DeviceStopIterator() {}
+
+ NPT_Result operator()(PLT_DeviceHostReference& device_host) const {
+ return device_host->Stop(m_ListenTask);
+ }
+
+
+private:
+ PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::PLT_UPnP
++---------------------------------------------------------------------*/
+PLT_UPnP::PLT_UPnP() :
+ m_TaskManager(NULL),
+ m_Started(false),
+ m_SsdpListenTask(NULL),
+ m_IgnoreLocalUUIDs(true)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::~PLT_UPnP
++---------------------------------------------------------------------*/
+PLT_UPnP::~PLT_UPnP()
+{
+ Stop();
+
+ m_CtrlPoints.Clear();
+ m_Devices.Clear();
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::Start()
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::Start()
+{
+ NPT_LOG_INFO("Starting UPnP...");
+
+ NPT_AutoLock lock(m_Lock);
+
+ if (m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ NPT_List<NPT_IpAddress> ips;
+ PLT_UPnPMessageHelper::GetIPAddresses(ips);
+
+ /* Create multicast socket and bind on 1900. If other apps didn't
+ play nicely by setting the REUSE_ADDR flag, this could fail */
+ NPT_Reference<NPT_UdpMulticastSocket> socket(new NPT_UdpMulticastSocket(NPT_SOCKET_FLAG_CANCELLABLE));
+ NPT_CHECK_SEVERE(socket->Bind(NPT_SocketAddress(NPT_IpAddress::Any, 1900), true));
+
+ /* Join multicast group for every ip we found */
+ NPT_CHECK_SEVERE(ips.ApplyUntil(PLT_SsdpInitMulticastIterator(socket.AsPointer()),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)));
+
+ /* create the ssdp listener */
+ m_SsdpListenTask = new PLT_SsdpListenTask(socket.AsPointer());
+ socket.Detach();
+ NPT_Reference<PLT_TaskManager> taskManager(new PLT_TaskManager());
+ NPT_CHECK_SEVERE(taskManager->StartTask(m_SsdpListenTask));
+
+ /* start devices & ctrlpoints */
+ m_CtrlPoints.Apply(PLT_UPnP_CtrlPointStartIterator(m_SsdpListenTask));
+ m_Devices.Apply(PLT_UPnP_DeviceStartIterator(m_SsdpListenTask));
+
+ m_TaskManager = taskManager;
+ m_Started = true;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::Stop()
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (!m_Started) NPT_CHECK_WARNING(NPT_ERROR_INVALID_STATE);
+
+ NPT_LOG_INFO("Stopping UPnP...");
+
+ // Stop ctrlpoints and devices first
+ m_CtrlPoints.Apply(PLT_UPnP_CtrlPointStopIterator(m_SsdpListenTask));
+ m_Devices.Apply(PLT_UPnP_DeviceStopIterator(m_SsdpListenTask));
+
+ // stop remaining tasks
+ m_TaskManager->Abort();
+ m_SsdpListenTask = NULL;
+ m_TaskManager = NULL;
+
+ m_Started = false;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::AddDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::AddDevice(PLT_DeviceHostReference& device)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ // tell all our controllers to ignore this device
+ if (m_IgnoreLocalUUIDs) {
+ for (NPT_List<PLT_CtrlPointReference>::Iterator iter =
+ m_CtrlPoints.GetFirstItem();
+ iter;
+ iter++) {
+ (*iter)->IgnoreUUID(device->GetUUID());
+ }
+ }
+
+ if (m_Started) {
+ NPT_LOG_INFO("Starting Device...");
+ NPT_CHECK_SEVERE(device->Start(m_SsdpListenTask));
+ }
+
+ m_Devices.Add(device);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::RemoveDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::RemoveDevice(PLT_DeviceHostReference& device)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (m_Started) {
+ device->Stop(m_SsdpListenTask);
+ }
+
+ return m_Devices.Remove(device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::AddCtrlPoint
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::AddCtrlPoint(PLT_CtrlPointReference& ctrl_point)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ // tell the control point to ignore our own running devices
+ if (m_IgnoreLocalUUIDs) {
+ for (NPT_List<PLT_DeviceHostReference>::Iterator iter =
+ m_Devices.GetFirstItem();
+ iter;
+ iter++) {
+ ctrl_point->IgnoreUUID((*iter)->GetUUID());
+ }
+ }
+
+ if (m_Started) {
+ NPT_LOG_INFO("Starting Ctrlpoint...");
+ NPT_CHECK_SEVERE(ctrl_point->Start(m_SsdpListenTask));
+ }
+
+ m_CtrlPoints.Add(ctrl_point);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::RemoveCtrlPoint
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::RemoveCtrlPoint(PLT_CtrlPointReference& ctrl_point)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (m_Started) {
+ ctrl_point->Stop(m_SsdpListenTask);
+ }
+
+ return m_CtrlPoints.Remove(ctrl_point);
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Core/PltUPnP.h b/lib/libUPnP/Platinum/Source/Core/PltUPnP.h
new file mode 100644
index 0000000..7822bf3
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltUPnP.h
@@ -0,0 +1,143 @@
+/*****************************************************************
+|
+| Platinum - UPnP Engine
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP Devices and ControlPoints Manager
+ */
+
+#ifndef _PLT_UPNP_H_
+#define _PLT_UPNP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltTaskManager.h"
+#include "PltCtrlPoint.h"
+#include "PltDeviceHost.h"
+#include "PltUtilities.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define PLT_DLNA_SSDP_DELAY 0.05f
+#define PLT_DLNA_SSDP_DELAY_GROUP 0.2f
+
+/*----------------------------------------------------------------------
+| forward definitions
++---------------------------------------------------------------------*/
+class PLT_SsdpListenTask;
+
+/*----------------------------------------------------------------------
+| PLT_UPnP class
++---------------------------------------------------------------------*/
+/**
+ The PLT_UPnP class maintains a list of devices (PLT_DeviceHost) to advertise and/or
+ control points (PLT_CtrlPoint).
+ */
+class PLT_UPnP
+{
+public:
+ /**
+ Create a UPnP instance.
+ */
+ PLT_UPnP();
+ ~PLT_UPnP();
+
+ /**
+ Add and start a device inside this UPnP context.
+ @param device device to start.
+ */
+ NPT_Result AddDevice(PLT_DeviceHostReference& device);
+
+ /**
+ Add and start a control point inside this UPnP context.
+ @param ctrlpoint control point to start.
+ */
+ NPT_Result AddCtrlPoint(PLT_CtrlPointReference& ctrlpoint);
+
+ /**
+ Remove an existing device from this UPnP context.
+ @param device device to stop.
+ */
+ NPT_Result RemoveDevice(PLT_DeviceHostReference& device);
+
+ /**
+ Remove an existing control point from this UPnP context.
+ @param ctrlpoint control point to stop.
+ */
+ NPT_Result RemoveCtrlPoint(PLT_CtrlPointReference& ctrlpoint);
+
+ /**
+ Start the UPnP context and all existing devices and control points
+ associated with it.
+ */
+ NPT_Result Start();
+
+ /**
+ Stop the UPnP context and all existing devices and control points
+ associated with it.
+ */
+ NPT_Result Stop();
+
+ /**
+ Return the UPnP Engine state.
+ @return True if the UPnP engine is running.
+ */
+ bool IsRunning() { return m_Started; }
+
+ /**
+ When a device and a control point are added to the same UPnP context, it is
+ desired that the device be not discovered by the control point. For example when
+ creating a combo UPnP Renderer/CtrlPoint. This methods tells the control point
+ to ignore devices associated with the same UPnP context.
+ @param ignore boolean to ignore devices in context
+ */
+ void SetIgnoreLocalUUIDs(bool ignore) { m_IgnoreLocalUUIDs = ignore; }
+
+private:
+ // members
+ NPT_Mutex m_Lock;
+ NPT_List<PLT_DeviceHostReference> m_Devices;
+ NPT_List<PLT_CtrlPointReference> m_CtrlPoints;
+ NPT_Reference<PLT_TaskManager> m_TaskManager;
+
+ // Since we can only have one socket listening on port 1900,
+ // we create it in here and we will attach every control points
+ // and devices to it when they're added
+ bool m_Started;
+ PLT_SsdpListenTask* m_SsdpListenTask;
+ bool m_IgnoreLocalUUIDs;
+};
+
+#endif /* _PLT_UPNP_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Core/PltUtilities.h b/lib/libUPnP/Platinum/Source/Core/PltUtilities.h
new file mode 100644
index 0000000..4677f5b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Core/PltUtilities.h
@@ -0,0 +1,766 @@
+/*****************************************************************
+|
+| Platinum - Utilities
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_UTILITIES_H_
+#define _PLT_UTILITIES_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_XmlAttributeFinder
++---------------------------------------------------------------------*/
+/**
+ The PLT_XmlAttributeFinder class is used to determine if an attribute
+ exists given an xml element node, an attribute name and namespace.
+ */
+class PLT_XmlAttributeFinder
+{
+public:
+ // if 'namespc' is NULL, we're looking for ANY namespace
+ // if 'namespc' is '\0', we're looking for NO namespace
+ // if 'namespc' is non-empty, look for that SPECIFIC namespace
+ PLT_XmlAttributeFinder(const NPT_XmlElementNode& element,
+ const char* name,
+ const char* namespc) :
+ m_Element(element), m_Name(name), m_Namespace(namespc) {}
+
+ bool operator()(const NPT_XmlAttribute* const & attribute) const {
+ if (attribute->GetName() == m_Name) {
+ if (m_Namespace) {
+ const NPT_String& prefix = attribute->GetPrefix();
+ if (m_Namespace[0] == '\0') {
+ // match if the attribute has NO namespace
+ return prefix.IsEmpty();
+ } else {
+ // match if the attribute has the SPECIFIC namespace
+ // we're looking for
+ const NPT_String* namespc = m_Element.GetNamespaceUri(prefix);
+ return namespc && *namespc == m_Namespace;
+ }
+ } else {
+ // ANY namespace will match
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+private:
+ const NPT_XmlElementNode& m_Element;
+ const char* m_Name;
+ const char* m_Namespace;
+};
+
+/*----------------------------------------------------------------------
+| PLT_XmlHelper
++---------------------------------------------------------------------*/
+/**
+ The PLT_XmlHelper class is a set of utility functions for manipulating
+ xml documents and DOM trees.
+ */
+class PLT_XmlHelper
+{
+public:
+
+ // static methods
+
+ static NPT_Result Parse(const NPT_String& xml, NPT_XmlElementNode*& tree) {
+ // reset tree
+ tree = NULL;
+
+ // parse body
+ NPT_XmlParser parser;
+ NPT_XmlNode* node;
+ NPT_Result result = parser.Parse(xml, node);
+ if (NPT_FAILED(result)) {
+ //NPT_LOG_FINEST_1("Failed to parse %s", xml.IsEmpty()?"(empty string)":xml.GetChars());
+ NPT_CHECK(result);
+ }
+
+ tree = node->AsElementNode();
+ if (!tree) {
+ delete node;
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result GetChildText(NPT_XmlElementNode* node,
+ const char* tag,
+ NPT_String& value,
+ const char* namespc = "",
+ NPT_Cardinal max_size = 1024) {
+ value = "";
+
+ if (!node) return NPT_FAILURE;
+
+ // special case "" means we look for the same namespace as the parent
+ if (namespc && namespc[0] == '\0') {
+ namespc = node->GetNamespace()?node->GetNamespace()->GetChars():NPT_XML_NO_NAMESPACE;
+ }
+
+ NPT_XmlElementNode* child = node->GetChild(tag, namespc);
+ if (!child) return NPT_FAILURE;
+
+ const NPT_String* text = child->GetText();
+ // DLNA 7.3.17
+ if (text)
+ value = text->SubString(0, max_size);
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result RemoveAttribute(NPT_XmlElementNode* node,
+ const char* name,
+ const char* namespc = "") {
+ if (!node) return NPT_FAILURE;
+
+ // special case "" means we look for the same namespace as the parent
+ if (namespc && namespc[0] == '\0') {
+ namespc = node->GetNamespace()?node->GetNamespace()->GetChars():NPT_XML_NO_NAMESPACE;
+ }
+
+ NPT_List<NPT_XmlAttribute*>::Iterator attribute;
+ attribute = node->GetAttributes().Find(PLT_XmlAttributeFinder(*node, name, namespc));
+ if (!attribute) return NPT_FAILURE;
+
+ delete *attribute;
+ NPT_CHECK(node->GetAttributes().Erase(attribute));
+
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result GetAttribute(NPT_XmlElementNode* node,
+ const char* name,
+ NPT_XmlAttribute*& attr,
+ const char* namespc = "") {
+ attr = NULL;
+
+ if (!node) return NPT_FAILURE;
+
+ // special case "" means we look for the same namespace as the parent
+ if (namespc && namespc[0] == '\0') {
+ namespc = node->GetNamespace()?node->GetNamespace()->GetChars():NPT_XML_NO_NAMESPACE;
+ }
+
+ NPT_List<NPT_XmlAttribute*>::Iterator attribute;
+ attribute = node->GetAttributes().Find(PLT_XmlAttributeFinder(*node, name, namespc));
+ if (!attribute) {
+ //NPT_Debug("Failed to find attribute [%s]:%s", namespc, name);
+ return NPT_FAILURE;
+ }
+
+ attr = (*attribute);
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result GetAttribute(NPT_XmlElementNode* node,
+ const char* name,
+ NPT_String& value,
+ const char* namespc = "",
+ NPT_Cardinal max_size = 1024) {
+ value = "";
+
+ NPT_XmlAttribute* attribute = NULL;
+ NPT_Result result = GetAttribute(node, name, attribute, namespc);
+ if (NPT_FAILED(result)) return result;
+
+ if (!attribute) return NPT_FAILURE;
+ // DLNA 7.3.17 truncate to 1024 bytes
+ value = attribute->GetValue().SubString(0, max_size);
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result SetAttribute(NPT_XmlElementNode* node,
+ const char* name,
+ const char* value,
+ const char* namespc = "") {
+ NPT_XmlAttribute* attribute = NULL;
+ NPT_CHECK(GetAttribute(node, name, attribute, namespc));
+ if (!attribute) return NPT_FAILURE;
+
+ attribute->SetValue(value);
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result AddChildText(NPT_XmlElementNode* node,
+ const char* tag,
+ const char* text,
+ const char* prefix = NULL) {
+ if (!node) return NPT_FAILURE;
+ NPT_XmlElementNode* child = new NPT_XmlElementNode(prefix, tag);
+ child->AddText(text);
+ return node->AddChild(child);
+ }
+
+ static bool IsMatch(const NPT_XmlNode* const & node, const char* tag, const char* namespc_mapped) {
+ // if m_Namespace is NULL, we're looking for ANY namespace
+ // if m_Namespace is '\0', we're looking for NO namespace
+ // if m_Namespace is non-empty, look for that SPECIFIC namespace
+
+ const NPT_XmlElementNode* element = node->AsElementNode();
+ // is tag the same (case sensitive)?
+ if (element && element->GetTag() == tag) {
+ if (namespc_mapped) {
+ // look for a SPECIFIC namespace or NO namespace
+ const NPT_String* namespc = element->GetNamespace();
+ if (namespc) {
+ // the element has a namespace, match if it is equal to
+ // what we're looking for
+ return *namespc == namespc_mapped;
+ } else {
+ // the element does not have a namespace, match if we're
+ // looking for NO namespace
+ return namespc_mapped[0] == '\0';
+ }
+ } else {
+ // ANY namespace will match
+ return true;
+ }
+ }
+ return false;
+ }
+
+ static NPT_Result GetChildren(NPT_XmlElementNode* node,
+ NPT_Array<NPT_XmlElementNode*>& children,
+ const char* tag,
+ const char* namespc = "") {
+ if (!node) return NPT_FAILURE;
+
+ // special case "" means we look for the same namespace as the parent
+ if (namespc && namespc[0] == '\0') {
+ namespc = node->GetNamespace()?node->GetNamespace()->GetChars():NPT_XML_NO_NAMESPACE;
+ }
+
+ const char* namespc_mapped = (namespc==NULL)?"":(namespc[0]=='*' && namespc[1]=='\0')?NULL:namespc;
+
+ // get all children first
+ NPT_List<NPT_XmlNode*>& allchildren = node->GetChildren();
+
+ // iterate through children and add only elements with matching tag
+ NPT_List<NPT_XmlNode*>::Iterator child = allchildren.GetFirstItem();
+ while (child) {
+ if (IsMatch(*child, tag, namespc_mapped)) {
+ children.Add((*child)->AsElementNode());
+ }
+ ++child;
+ }
+ return NPT_SUCCESS;
+ }
+
+ static NPT_XmlElementNode* GetChild(NPT_XmlElementNode* node,
+ const char* tag,
+ const char* namespc = "") {
+ if (!node) return NULL;
+
+ // special case "" means we look for the same namespace as the parent
+ if (namespc && namespc[0] == '\0') {
+ namespc = node->GetNamespace()?node->GetNamespace()->GetChars():NPT_XML_NO_NAMESPACE;
+ }
+
+ return node->GetChild(tag, namespc);
+ }
+
+ static NPT_Result GetChild(NPT_XmlElementNode* parent,
+ NPT_XmlElementNode*& child,
+ NPT_Ordinal n = 0) {
+ if (!parent) return NPT_FAILURE;
+
+ // reset child
+ child = NULL;
+
+ // get all children first
+ NPT_List<NPT_XmlNode*>::Iterator children = parent->GetChildren().GetFirstItem();
+ while (children) {
+ if ((*children)->AsElementNode() && n-- == 0) {
+ child = (*children)->AsElementNode();
+ return NPT_SUCCESS;
+ }
+ children++;
+ }
+
+ return NPT_FAILURE;
+ }
+
+ static NPT_Result Serialize(NPT_XmlNode& node, NPT_String& xml, bool add_header = true, NPT_Int8 indentation = 0) {
+ NPT_XmlWriter writer(indentation);
+ NPT_StringOutputStreamReference stream(new NPT_StringOutputStream(&xml));
+ NPT_CHECK(writer.Serialize(node, *stream, add_header));
+ return NPT_SUCCESS;
+ }
+
+ static NPT_String Serialize(NPT_XmlNode& node, bool add_header = true, NPT_Int8 indentation = 0) {
+ NPT_XmlWriter writer(indentation);
+ NPT_String xml;
+ NPT_StringOutputStreamReference stream(new NPT_StringOutputStream(&xml));
+ if (NPT_FAILED(writer.Serialize(node, *stream, add_header))) {
+ NPT_Debug("Failed to serialize xml node");
+ return "";
+ }
+
+ return xml;
+ }
+private:
+ // members
+};
+
+/*----------------------------------------------------------------------
+| NPT_StringFinder
++---------------------------------------------------------------------*/
+/**
+ The NPT_StringFinder class is used to determine if a string is found
+ as part of a list of strings.
+ */
+class NPT_StringFinder
+{
+public:
+ // methods
+ explicit NPT_StringFinder(NPT_String& value, bool ignore_case = false) :
+ m_Value(value.GetChars()), m_IgnoreCase(ignore_case) {}
+
+ explicit NPT_StringFinder(const char* value, bool ignore_case = false) :
+ m_Value(value), m_IgnoreCase(ignore_case) {}
+
+ virtual ~NPT_StringFinder() {}
+
+ bool operator()(const NPT_String* const & value) const {
+ return value->Compare(m_Value, m_IgnoreCase) ? false : true;
+ }
+ bool operator()(const NPT_String& value) const {
+ return value.Compare(m_Value, m_IgnoreCase) ? false : true;
+ }
+
+private:
+ // members
+ const char* m_Value;
+ bool m_IgnoreCase;
+};
+
+/*----------------------------------------------------------------------
+| NPT_IpAddressFinder
++---------------------------------------------------------------------*/
+/**
+ The NPT_IpAddressFinder class is used to determine if a IP Address is found
+ as part of a list of IP Addresses.
+ */
+class NPT_IpAddressFinder
+{
+public:
+ // methods
+ NPT_IpAddressFinder(NPT_IpAddress ip) : m_Value(ip) {}
+ virtual ~NPT_IpAddressFinder() {}
+
+ bool operator()(const NPT_IpAddress* const & value) const {
+ return *value == m_Value;
+ }
+ bool operator()(const NPT_IpAddress& value) const {
+ return value == m_Value;
+ }
+
+private:
+ // members
+ NPT_IpAddress m_Value;
+};
+
+
+/*----------------------------------------------------------------------
+| PLT_UPnPMessageHelper class
++---------------------------------------------------------------------*/
+/**
+ The PLT_UPnPMessageHelper class is a set of utility functions for manipulating
+ specific UPnP HTTP headers.
+ */
+class PLT_UPnPMessageHelper
+{
+public:
+ // methods
+ static const NPT_String* GetST(const NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("ST");
+ }
+ static NPT_Result SetST(NPT_HttpMessage& message,
+ const char* st) {
+ return message.GetHeaders().SetHeader("ST", st);
+ }
+
+ static const NPT_String* GetNT(const NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("NT");
+ }
+ static NPT_Result SetNT(NPT_HttpMessage& message,
+ const char* nt) {
+ return message.GetHeaders().SetHeader("NT", nt);
+ }
+
+ static const NPT_String* GetNTS(const NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("NTS");
+ }
+ static NPT_Result SetNTS(NPT_HttpMessage& message,
+ const char* nts) {
+ return message.GetHeaders().SetHeader("NTS", nts);
+ }
+
+ static const NPT_String* GetMAN(const NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("MAN");
+ }
+ static NPT_Result SetMAN(NPT_HttpMessage& message,
+ const char* man) {
+ return message.GetHeaders().SetHeader("MAN", man);
+ }
+
+ static const NPT_String* GetLocation(const NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("Location");
+ }
+ static NPT_Result SetLocation(NPT_HttpMessage& message,
+ const char* location) {
+ return message.GetHeaders().SetHeader("Location", location);
+ }
+
+ static const NPT_String* GetServer(const NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_SERVER);
+ }
+ static NPT_Result SetServer(NPT_HttpMessage& message,
+ const char* server,
+ bool replace = true) {
+ return message.GetHeaders().SetHeader(
+ NPT_HTTP_HEADER_SERVER,
+ server,
+ replace);
+ }
+
+ static const NPT_String* GetUSN(const NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("USN");
+ }
+ static NPT_Result SetUSN(NPT_HttpMessage& message,
+ const char* usn) {
+ return message.GetHeaders().SetHeader("USN", usn);
+ }
+
+ static const NPT_String* GetCallbacks(const NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("CALLBACK");
+ }
+ static NPT_Result SetCallbacks(NPT_HttpMessage& message, const char* callbacks) {
+ return message.GetHeaders().SetHeader("CALLBACK", callbacks);
+ }
+
+ static const NPT_String* GetSID(const NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("SID");
+ }
+ static NPT_Result SetSID(NPT_HttpMessage& message,
+ const char* sid) {
+ return message.GetHeaders().SetHeader("SID", sid);
+ }
+
+ static NPT_Result GetLeaseTime(const NPT_HttpMessage& message, NPT_TimeInterval& lease) {
+ const NPT_String* cc =
+ message.GetHeaders().GetHeaderValue("Cache-Control");
+ NPT_CHECK_POINTER(cc);
+ return ExtractLeaseTime(*cc, lease);
+ }
+ static NPT_Result SetLeaseTime(NPT_HttpMessage& message, const NPT_TimeInterval& lease) {
+ return message.GetHeaders().SetHeader("Cache-Control",
+ "max-age="+NPT_String::FromInteger(lease.ToSeconds()));
+ }
+
+ static NPT_Result GetBootId(const NPT_HttpMessage& message, NPT_UInt32& bootId) {
+ bootId = 0;
+ const NPT_String* bid = message.GetHeaders().GetHeaderValue("BOOTID.UPNP.ORG");
+ NPT_CHECK_POINTER(bid);
+ return NPT_ParseInteger32(*bid, bootId, false);
+ }
+ static NPT_Result SetBootId(NPT_HttpMessage& message, const NPT_UInt32& bootId) {
+ return message.GetHeaders().SetHeader("BOOTID.UPNP.ORG",
+ NPT_String::FromInteger(bootId));
+ }
+
+ static NPT_Result GetNextBootId(const NPT_HttpMessage& message, NPT_UInt32& nextBootId) {
+ nextBootId = 0;
+ const NPT_String* nbid = message.GetHeaders().GetHeaderValue("NEXTBOOTID.UPNP.ORG");
+ NPT_CHECK_POINTER(nbid);
+ return NPT_ParseInteger32(*nbid, nextBootId, false);
+ }
+ static NPT_Result SetNextBootId(NPT_HttpMessage& message, const NPT_UInt32& nextBootId) {
+ return message.GetHeaders().SetHeader("NEXTBOOTID.UPNP.ORG",
+ NPT_String::FromInteger(nextBootId));
+ }
+
+ static NPT_Result GetConfigId(const NPT_HttpMessage& message, NPT_UInt32& configId) {
+ configId = 0;
+ const NPT_String* cid = message.GetHeaders().GetHeaderValue("CONFIGID.UPNP.ORG");
+ NPT_CHECK_POINTER(cid);
+ return NPT_ParseInteger32(*cid, configId, false);
+ }
+ static NPT_Result SetConfigId(NPT_HttpMessage& message, const NPT_UInt32& configId) {
+ return message.GetHeaders().SetHeader("CONFIGID.UPNP.ORG", NPT_String::FromInteger(configId));
+ }
+
+ static NPT_Result GetTimeOut(const NPT_HttpMessage& message, NPT_Int32& seconds) {
+ seconds = 0;
+ const NPT_String* timeout =
+ message.GetHeaders().GetHeaderValue("TIMEOUT");
+ NPT_CHECK_POINTER(timeout);
+ return ExtractTimeOut(*timeout, seconds);
+ }
+ static NPT_Result SetTimeOut(NPT_HttpMessage& message, const NPT_Int32 seconds) {
+ if (seconds >= 0) {
+ return message.GetHeaders().SetHeader("TIMEOUT", "Second-"+NPT_String::FromInteger(seconds));
+ } else {
+ return message.GetHeaders().SetHeader("TIMEOUT", "Second-infinite");
+ }
+ }
+
+ static NPT_Result SetDate(NPT_HttpMessage& message) {
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ NPT_DateTime date(now);
+
+ return message.GetHeaders().SetHeader("Date", date.ToString(NPT_DateTime::FORMAT_RFC_1123));
+ }
+
+ static NPT_Result GetIfModifiedSince(const NPT_HttpMessage& message, NPT_DateTime& date) {
+ const NPT_String* value = message.GetHeaders().GetHeaderValue("If-Modified-Since");
+ if (!value) return NPT_FAILURE;
+
+ // Try RFC 1123, RFC 1036, then ANSI
+ if (NPT_SUCCEEDED(date.FromString(*value, NPT_DateTime::FORMAT_RFC_1123)))
+ return NPT_SUCCESS;
+
+ if (NPT_SUCCEEDED(date.FromString(*value, NPT_DateTime::FORMAT_RFC_1036)))
+ return NPT_SUCCESS;
+
+ return date.FromString(*value, NPT_DateTime::FORMAT_ANSI);
+ }
+ static NPT_Result SetIfModifiedSince(NPT_HttpMessage& message, const NPT_DateTime& date) {
+ return message.GetHeaders().SetHeader("If-Modified-Since",
+ date.ToString(NPT_DateTime::FORMAT_RFC_1123));
+ }
+
+ static NPT_Result GetMX(const NPT_HttpMessage& message, NPT_UInt32& value) {
+ value = 0;
+ const NPT_String* mx =
+ message.GetHeaders().GetHeaderValue("MX");
+ NPT_CHECK_POINTER(mx);
+ return NPT_ParseInteger32(*mx, value, false); // no relax to be UPnP compliant
+ }
+ static NPT_Result SetMX(NPT_HttpMessage& message, const NPT_UInt32 mx) {
+ return message.GetHeaders().SetHeader("MX",
+ NPT_String::FromInteger(mx));
+ }
+
+ static NPT_Result GetSeq(const NPT_HttpMessage& message, NPT_UInt32& value) {
+ value = 0;
+ const NPT_String* seq =
+ message.GetHeaders().GetHeaderValue("SEQ");
+ NPT_CHECK_POINTER(seq);
+ return NPT_ParseInteger32(*seq, value);
+ }
+ static NPT_Result SetSeq(NPT_HttpMessage& message, const NPT_UInt32 seq) {
+ return message.GetHeaders().SetHeader("SEQ",
+ NPT_String::FromInteger(seq));
+ }
+
+ static const char* GenerateUUID(int count, NPT_String& uuid) {
+ uuid = "";
+ for (int i=0;i<(count<100?count:100);i++) {
+ int random = NPT_System::GetRandomInteger();
+ uuid += (char)((random % 25) + 66);
+ }
+ return uuid;
+ }
+
+ static const char* GenerateSerialNumber(NPT_String& sn, int count = 40) {
+ sn = "{";
+ for (int i=0;i<count;i++) {
+ char nibble = (char)(NPT_System::GetRandomInteger() % 16);
+ sn += (nibble < 10) ? ('0' + nibble) : ('a' + (nibble-10));
+ }
+ sn += "}";
+ return sn;
+ }
+
+ static const char* GenerateGUID(NPT_String& guid) {
+ guid = "";
+ for (int i=0;i<32;i++) {
+ char nibble = (char)(NPT_System::GetRandomInteger() % 16);
+ guid += (nibble < 10) ? ('0' + nibble) : ('a' + (nibble-10));
+ if (i == 7 || i == 11 || i == 15 || i == 19) {
+ guid += '-';
+ }
+ }
+ return guid;
+ }
+
+ static NPT_Result ExtractLeaseTime(const NPT_String& cache_control, NPT_TimeInterval& lease) {
+ NPT_Int32 value;
+ if (cache_control.StartsWith("max-age=", true) &&
+ NPT_SUCCEEDED(NPT_ParseInteger32(cache_control.GetChars()+8, value))) {
+ lease.SetSeconds(value);
+ return NPT_SUCCESS;
+ }
+ return NPT_FAILURE;
+ }
+
+ static NPT_Result ExtractTimeOut(const char* timeout, NPT_Int32& len) {
+ NPT_String temp = timeout;
+ if (temp.CompareN("Second-", 7, true)) {
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+
+ if (temp.Compare("Second-infinite", true) == 0) {
+ len = NPT_TIMEOUT_INFINITE;
+ return NPT_SUCCESS;
+ }
+ return temp.SubString(7).ToInteger(len);
+ }
+
+ static NPT_Result GetIPAddresses(NPT_List<NPT_IpAddress>& ips, bool with_localhost = false) {
+ NPT_List<NPT_NetworkInterface*> if_list;
+ NPT_CHECK(GetNetworkInterfaces(if_list, with_localhost));
+
+ NPT_List<NPT_NetworkInterface*>::Iterator iface = if_list.GetFirstItem();
+ while (iface) {
+ NPT_IpAddress ip = (*(*iface)->GetAddresses().GetFirstItem()).GetPrimaryAddress();
+ if (ip.ToString().Compare("0.0.0.0") &&
+ (with_localhost || ip.ToString().Compare("127.0.0.1"))) {
+ ips.Add(ip);
+ }
+ ++iface;
+ }
+
+ if (with_localhost && !ips.Find(NPT_IpAddressFinder(NPT_IpAddress(127, 0, 0, 1)))) {
+ NPT_IpAddress localhost;
+ localhost.Parse("127.0.0.1");
+ ips.Add(localhost);
+ }
+
+ if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& if_list,
+ bool with_localhost = false) {
+ NPT_CHECK(_GetNetworkInterfaces(if_list, with_localhost, false));
+
+ // if no valid interfaces or if requested, add localhost interface
+ if (if_list.GetItemCount() == 0) {
+ NPT_CHECK(_GetNetworkInterfaces(if_list, true, true));
+ }
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result GetMACAddresses(NPT_List<NPT_String>& addresses) {
+ NPT_List<NPT_NetworkInterface*> if_list;
+ NPT_CHECK(GetNetworkInterfaces(if_list));
+
+ NPT_List<NPT_NetworkInterface*>::Iterator iface = if_list.GetFirstItem();
+ while (iface) {
+ NPT_String ip = (*(*iface)->GetAddresses().GetFirstItem()).GetPrimaryAddress().ToString();
+ if (ip.Compare("0.0.0.0") && ip.Compare("127.0.0.1")) {
+ addresses.Add((*iface)->GetMacAddress().ToString());
+ }
+ ++iface;
+ }
+
+ if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+ return NPT_SUCCESS;
+ }
+
+
+ static bool IsLocalNetworkAddress(const NPT_IpAddress& address) {
+ if (address.ToString() == "127.0.0.1") return true;
+
+ NPT_List<NPT_NetworkInterface*> if_list;
+ NPT_NetworkInterface::GetNetworkInterfaces(if_list);
+
+ NPT_List<NPT_NetworkInterface*>::Iterator iface = if_list.GetFirstItem();
+ while (iface) {
+ if((*iface)->IsAddressInNetwork(address)) return true;
+ ++iface;
+ }
+
+ if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+ return false;
+ }
+
+private:
+
+ static NPT_Result _GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& if_list,
+ bool include_localhost = false,
+ bool only_localhost = false) {
+ NPT_List<NPT_NetworkInterface*> _if_list;
+ NPT_CHECK(NPT_NetworkInterface::GetNetworkInterfaces(_if_list));
+
+ NPT_NetworkInterface* iface;
+ while (NPT_SUCCEEDED(_if_list.PopHead(iface))) {
+ // only interested in non PTP & multicast capable interfaces
+ if ((iface->GetAddresses().GetItemCount() == 0) ||
+ !(iface->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_MULTICAST) ||
+ (iface->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT)) {
+ delete iface;
+ continue;
+ }
+
+ NPT_String ip = iface->GetAddresses().GetFirstItem()->GetPrimaryAddress().ToString();
+
+ if (iface->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_LOOPBACK) {
+ if (include_localhost || only_localhost) {
+ if_list.Add(iface);
+ continue;
+ }
+ } else if (ip.Compare("0.0.0.0") && !only_localhost) {
+ if_list.Add(iface);
+ continue;
+ }
+
+ delete iface;
+ }
+
+ // cleanup any remaining items in list if we breaked early
+ _if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+ return NPT_SUCCESS;
+ }
+};
+
+#endif // _PLT_UTILITIES_H_
+
+
+
+
+
+
+
+
+
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp
new file mode 100644
index 0000000..ccac60d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp
@@ -0,0 +1,348 @@
+/*****************************************************************
+|
+| Platinum - AV Media Connect Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "Platinum.h"
+#include "PltMediaConnect.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.devices.mediaconnect")
+
+/*----------------------------------------------------------------------
+| forward references
++---------------------------------------------------------------------*/
+extern NPT_UInt8 X_MS_MediaReceiverRegistrarSCPD[];
+extern NPT_UInt8 MS_ContentDirectorySCPD[];
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::PLT_MediaConnect
++---------------------------------------------------------------------*/
+PLT_MediaConnect::PLT_MediaConnect(const char* friendly_name,
+ bool add_hostname /* = true */,
+ const char* udn /* = NULL */,
+ NPT_UInt16 port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_MediaServer(friendly_name, false, udn, port, port_rebind),
+ m_AddHostname(add_hostname)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::~PLT_MediaConnect
++---------------------------------------------------------------------*/
+PLT_MediaConnect::~PLT_MediaConnect()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::SetupServices
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::SetupServices()
+{
+ NPT_Reference<PLT_Service> service(new PLT_Service(
+ this,
+ "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1",
+ "urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar",
+ "X_MS_MediaReceiverRegistrar"));
+
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) X_MS_MediaReceiverRegistrarSCPD));
+ NPT_CHECK_FATAL(AddService(service.AsPointer()));
+
+ service->SetStateVariable("AuthorizationGrantedUpdateID", "1");
+ service->SetStateVariable("AuthorizationDeniedUpdateID", "1");
+ service->SetStateVariable("ValidationSucceededUpdateID", "0");
+ service->SetStateVariable("ValidationRevokedUpdateID", "0");
+
+ service.Detach();
+ return PLT_MediaServer::SetupServices();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::ProcessGetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::ProcessGetDescription(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ // lock to make sure another request is not modifying the device while we are already
+ NPT_AutoLock lock(m_Lock);
+
+ NPT_Result res = NPT_SUCCESS;
+ NPT_String oldModelName = m_ModelName;
+ NPT_String oldModelNumber = m_ModelNumber;
+ NPT_String oldModelURL = m_ModelURL;
+ NPT_String oldManufacturerURL = m_ManufacturerURL;
+ NPT_String oldDlnaDoc = m_DlnaDoc;
+ NPT_String oldDlnaCap = m_DlnaCap;
+ NPT_String oldAggregationFlags = m_AggregationFlags;
+ NPT_String oldFriendlyName = m_FriendlyName;
+
+ NPT_String hostname;
+ NPT_System::GetMachineName(hostname);
+
+ PLT_DeviceSignature signature = PLT_HttpHelper::GetDeviceSignature(request);
+
+ if (signature == PLT_DEVICE_XBOX_360 || signature == PLT_DEVICE_XBOX_ONE /*|| signature == PLT_SONOS*/) {
+ // XBox needs to see something behind a ':' to even show it
+ if (m_AddHostname && hostname.GetLength() > 0) {
+ m_FriendlyName += ": " + hostname;
+ } else if (m_FriendlyName.Find(":") == -1) {
+ m_FriendlyName += ": 1";
+ }
+ }
+ else if (m_AddHostname && hostname.GetLength() > 0) {
+ m_FriendlyName += " (" + hostname + ")";
+ }
+
+ // change some things based on device signature from request
+ if (signature == PLT_DEVICE_XBOX_360 || signature == PLT_DEVICE_XBOX_ONE || signature == PLT_DEVICE_WMP /*|| signature == PLT_SONOS*/) {
+ m_ModelName = "Windows Media Player Sharing";
+ m_ModelNumber = (signature == PLT_DEVICE_SONOS)?"3.0":"12.0";
+ m_ModelURL = "http://www.microsoft.com/";//"http://go.microsoft.com/fwlink/?LinkId=105926";
+ m_Manufacturer = (signature == PLT_DEVICE_SONOS)?"Microsoft":"Microsoft Corporation";
+ m_ManufacturerURL = "http://www.microsoft.com/";
+ m_DlnaDoc = (signature == PLT_DEVICE_SONOS)?"DMS-1.00":"DMS-1.50";
+ m_DlnaCap = "";
+ m_AggregationFlags = "";
+
+ //PLT_UPnPMessageHelper::GenerateGUID(m_SerialNumber);
+ // TODO: http://msdn.microsoft.com/en-us/library/ff362657(PROT.10).aspx
+ // TODO: <serialNumber>GUID</serialNumber>
+
+ } else if (signature == PLT_DEVICE_SONOS) {
+ m_ModelName = "Rhapsody";
+ m_ModelNumber = "3.0";
+ } else if (signature == PLT_DEVICE_PS3) {
+ m_DlnaDoc = "DMS-1.50";
+ m_DlnaCap = "";
+ m_AggregationFlags = "10";
+ }
+
+ // return description with modified params
+ res = PLT_MediaServer::ProcessGetDescription(request, context, response);
+
+ // reset to old values now
+ m_FriendlyName = oldFriendlyName;
+ m_ModelName = oldModelName;
+ m_ModelNumber = oldModelNumber;
+ m_ModelURL = oldModelURL;
+ m_ManufacturerURL = oldManufacturerURL;
+ m_DlnaDoc = oldDlnaDoc;
+ m_DlnaCap = oldDlnaCap;
+ m_AggregationFlags = oldAggregationFlags;
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::ProcessGetSCPD
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::ProcessGetSCPD(PLT_Service* service,
+ NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ PLT_DeviceSignature signature = PLT_HttpHelper::GetDeviceSignature(request);
+
+ // Override SCPD response by providing an SCPD without a Search action
+ // to all devices except XBox or WMP which need it
+ if (service->GetServiceType() == "urn:schemas-upnp-org:service:ContentDirectory:1" &&
+ signature != PLT_DEVICE_XBOX_360 &&
+ signature != PLT_DEVICE_XBOX_ONE &&
+ signature != PLT_DEVICE_WMP &&
+ signature != PLT_DEVICE_SONOS) {
+ NPT_HttpEntity* entity;
+ PLT_HttpHelper::SetBody(response, (const char*) MS_ContentDirectorySCPD, &entity);
+ entity->SetContentType("text/xml; charset=\"utf-8\"");
+ return NPT_SUCCESS;
+ }
+
+ return PLT_MediaServer::ProcessGetSCPD(service, request, context, response);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::OnAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::OnAction(PLT_ActionReference& action,
+
+ const PLT_HttpRequestContext& context)
+{
+ /* parse the action name */
+ NPT_String name = action->GetActionDesc().GetName();
+
+ /* handle X_MS_MediaReceiverRegistrar actions here */
+ if (name.Compare("IsAuthorized") == 0) {
+ return OnIsAuthorized(action);
+ }
+ if (name.Compare("RegisterDevice") == 0) {
+ return OnRegisterDevice(action);
+ }
+ if (name.Compare("IsValidated") == 0) {
+ return OnIsValidated(action);
+ }
+
+ return PLT_MediaServer::OnAction(action, context);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::OnIsAuthorized
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::OnIsAuthorized(PLT_ActionReference& action)
+{
+ NPT_CHECK_WARNING(action->SetArgumentValue("Result", "1"));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::OnRegisterDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::OnRegisterDevice(PLT_ActionReference& action)
+{
+ NPT_String reqMsgBase64;
+ NPT_CHECK_WARNING(action->GetArgumentValue("RegistrationReqMsg", reqMsgBase64));
+
+ NPT_String respMsgBase64;
+ NPT_CHECK_WARNING(action->SetArgumentValue("RegistrationRespMsg", respMsgBase64));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::OnIsValidated
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::OnIsValidated(PLT_ActionReference& action)
+{
+ NPT_CHECK_WARNING(action->SetArgumentValue("Result", "1"));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::GetMappedObjectId
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::GetMappedObjectId(const char* object_id, NPT_String& mapped_object_id)
+{
+ if (!object_id) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // Reroute XBox 360 and WMP requests to our route
+ if (NPT_StringsEqual(object_id, "15")) {
+ mapped_object_id = "0/Videos"; // Videos
+ } else if (NPT_StringsEqual(object_id, "16")) {
+ mapped_object_id = "0/Photos"; // Photos
+ } else {
+ mapped_object_id = object_id;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaConnectDelegate::GetFilePath
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaConnectDelegate::GetFilePath(const char* object_id, NPT_String& filepath)
+{
+ if (!object_id) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // Reroute XBox 360 and WMP requests to our route
+ if (NPT_StringsEqual(object_id, "15")) {
+ return PLT_FileMediaServerDelegate::GetFilePath("", filepath); // Videos
+ } else if (NPT_StringsEqual(object_id, "16")) {
+ return PLT_FileMediaServerDelegate::GetFilePath("", filepath); // Photos
+ } else if (NPT_StringsEqual(object_id, "13") || NPT_StringsEqual(object_id, "4")) {
+ return PLT_FileMediaServerDelegate::GetFilePath("", filepath); // Music
+ }
+
+ return PLT_FileMediaServerDelegate::GetFilePath(object_id, filepath);;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaConnectDelegate::OnSearchContainer
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaConnectDelegate::OnSearchContainer(PLT_ActionReference& action,
+ const char* object_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context)
+{
+ /* parse search criteria */
+
+ /* TODO: HACK TO PASS DLNA */
+ if (search_criteria && NPT_StringsEqual(search_criteria, "Unknownfieldname")) {
+ /* error */
+ NPT_LOG_WARNING_1("Unsupported or invalid search criteria %s", search_criteria);
+ action->SetError(708, "Unsupported or invalid search criteria");
+ return NPT_FAILURE;
+ }
+
+ /* locate the file from the object ID */
+ NPT_String dir;
+ if (NPT_FAILED(GetFilePath(object_id, dir))) {
+ /* error */
+ NPT_LOG_WARNING("ObjectID not found.");
+ action->SetError(710, "No Such Container.");
+ return NPT_FAILURE;
+ }
+
+ /* retrieve the item type */
+ NPT_FileInfo info;
+ NPT_Result res = NPT_File::GetInfo(dir, &info);
+ if (NPT_FAILED(res) || (info.m_Type != NPT_FileInfo::FILE_TYPE_DIRECTORY)) {
+ /* error */
+ NPT_LOG_WARNING("No such container");
+ action->SetError(710, "No such container");
+ return NPT_FAILURE;
+ }
+
+ /* hack for now to return something back to XBox 360 */
+ return OnBrowseDirectChildren(action,
+ object_id,
+ filter,
+ starting_index,
+ requested_count,
+ sort_criteria,
+ context);
+}
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h
new file mode 100644
index 0000000..b628d9b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h
@@ -0,0 +1,110 @@
+/*****************************************************************
+|
+| Platinum - AV Media Connect Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_CONNECT_H_
+#define _PLT_MEDIA_CONNECT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltFileMediaServer.h"
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect
++---------------------------------------------------------------------*/
+class PLT_MediaConnect : public PLT_MediaServer
+{
+public:
+ // class methods
+ static NPT_Result GetMappedObjectId(const char* object_id,
+ NPT_String& mapped_object_id);
+
+ // constructor
+ PLT_MediaConnect(const char* friendly_name,
+ bool add_hostname = true,
+ const char* udn = NULL,
+ NPT_UInt16 port = 0,
+ bool port_rebind = false);
+
+protected:
+ ~PLT_MediaConnect() override;
+
+ // PLT_DeviceHost methods
+ NPT_Result SetupServices() override;
+ NPT_Result OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context) override;
+ NPT_Result ProcessGetDescription(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+ NPT_Result ProcessGetSCPD(PLT_Service* service,
+ NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+ // X_MS_MediaReceiverRegistrar
+ virtual NPT_Result OnIsAuthorized(PLT_ActionReference& action);
+ virtual NPT_Result OnRegisterDevice(PLT_ActionReference& action);
+ virtual NPT_Result OnIsValidated(PLT_ActionReference& action);
+
+protected:
+ NPT_Mutex m_Lock;
+ bool m_AddHostname;
+};
+
+/*----------------------------------------------------------------------
+ | PLT_FileMediaConnectDelegate class
+ +---------------------------------------------------------------------*/
+class PLT_FileMediaConnectDelegate : public PLT_FileMediaServerDelegate
+{
+public:
+ // constructor & destructor
+ PLT_FileMediaConnectDelegate(const char* url_root, const char* file_root) :
+ PLT_FileMediaServerDelegate(url_root, file_root) {}
+ ~PLT_FileMediaConnectDelegate() override {}
+
+ // PLT_FileMediaServerDelegate methods
+ NPT_Result GetFilePath(const char* object_id, NPT_String& filepath) override;
+ NPT_Result OnSearchContainer(PLT_ActionReference& action,
+ const char* object_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context) override;
+};
+
+#endif /* _PLT_MEDIA_CONNECT_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.cpp
new file mode 100644
index 0000000..dd54bc8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.cpp
@@ -0,0 +1,214 @@
+/*****************************************************************
+|
+| Platinum - XBox 360
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltXbox360.h"
+#include "PltService.h"
+#include "PltUtilities.h"
+#include "PltSsdp.h"
+
+/*----------------------------------------------------------------------
+| externals
++---------------------------------------------------------------------*/
+extern NPT_UInt8 Platinum_48x48_png[4681];
+
+/*----------------------------------------------------------------------
+| PLT_Xbox360::PLT_Xbox360
++---------------------------------------------------------------------*/
+PLT_Xbox360::PLT_Xbox360(const char* uuid /* = NULL */,
+ unsigned int port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_MediaRenderer("Xbox 360", false, uuid, port, port_rebind)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Xbox360::~PLT_Xbox360
++---------------------------------------------------------------------*/
+PLT_Xbox360::~PLT_Xbox360()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Xbox360::SetupServices
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Xbox360::SetupServices()
+{
+ NPT_CHECK(PLT_MediaRenderer::SetupServices());
+
+ m_ModelDescription = "Xbox 360";
+ m_ModelName = "Xbox 360";
+ m_ModelURL = "http://www.xbox.com";
+ m_Manufacturer = "Microsoft Corporation";
+ m_ManufacturerURL = "http://www.microsoft.com";
+
+ NPT_Array<PLT_Service*>::Iterator service;
+
+ if (NPT_SUCCEEDED(NPT_ContainerFind(
+ m_Services,
+ PLT_ServiceTypeFinder("urn:schemas-upnp-org:service:RenderingControl:1"),
+ service))) {
+ InitServiceURLs(*service, "RenderingControl");
+ }
+
+ if (NPT_SUCCEEDED(NPT_ContainerFind(
+ m_Services,
+ PLT_ServiceTypeFinder("urn:schemas-upnp-org:service:ConnectionManager:1"),
+ service))) {
+ InitServiceURLs(*service, "ConnectionManager");
+ }
+
+ // remove AVTransport
+ if (NPT_SUCCEEDED(NPT_ContainerFind(
+ m_Services,
+ PLT_ServiceTypeFinder("urn:schemas-upnp-org:service:AVTransport:1"),
+ service))) {
+ m_Services.Erase(service);
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::InitServiceURLs
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Xbox360::InitServiceURLs(PLT_Service* service, const char* service_name)
+{
+ service->SetSCPDURL("/Content/" + NPT_String(service_name));
+ service->SetControlURL("/Control/" + NPT_String(service_name));
+ service->SetEventSubURL("/Event/" + NPT_String(service_name));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Xbox360::GetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Xbox360::GetDescription(NPT_XmlElementNode* root, NPT_XmlElementNode** device_out)
+{
+ // if no device out passed, pass one
+ NPT_XmlElementNode* device_out_local;
+ if (!device_out) device_out = &device_out_local;
+
+ NPT_CHECK(PLT_MediaRenderer::GetDescription(root, device_out));
+
+ // add extra stuff
+ root->SetNamespaceUri("ms", " urn:microsoft-com:wmc-1-0");
+ root->SetNamespaceUri("microsoft", "urn-schemas-microsoft-com:WMPNSS-1-0");
+
+ if (*device_out) {
+ (*device_out)->SetAttribute("ms", "X_MS_SupportsWMDRM", "true");
+ NPT_XmlElementNode* device_caps = new NPT_XmlElementNode("microsoft", "X_DeviceCaps");
+ device_caps->AddText("4754");
+ (*device_out)->AddChild(device_caps);
+
+ NPT_XmlElementNode* handshake = new NPT_XmlElementNode("microsoft", "HandshakeFlags");
+ handshake->AddText("1");
+ (*device_out)->AddChild(handshake);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Xbox360::SetupIcons
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Xbox360::SetupIcons()
+{
+ AddIcon(
+ PLT_DeviceIcon("image/png", 48, 48, 32, "/xbox360.png"),
+ Platinum_48x48_png, sizeof(Platinum_48x48_png), false);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::Announce
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Xbox360::Announce(PLT_DeviceData* device,
+ NPT_HttpRequest& req,
+ NPT_UdpSocket& socket,
+ PLT_SsdpAnnounceType type)
+{
+ AnnouncePresence(socket, "");
+
+ return PLT_MediaRenderer::Announce(device, req, socket, type);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::AnnouncePresence
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Xbox360::AnnouncePresence(NPT_UdpSocket& socket,
+ const char* serial_number)
+{
+ NPT_COMPILER_UNUSED(serial_number);
+
+ NPT_HttpRequest req(
+ NPT_HttpUrl("239.255.255.250", 1900, "*"),
+ "NOTIFY",
+ NPT_HTTP_PROTOCOL_1_1);
+ PLT_HttpHelper::SetHost(req, "239.255.255.250:1900");
+
+ NPT_Result res = NPT_SUCCESS;
+ // get location URL based on ip address of interface
+ PLT_UPnPMessageHelper::SetNTS(req, "ssdp:alive");
+ PLT_UPnPMessageHelper::SetLeaseTime(req, NPT_TimeInterval(4.));
+ PLT_UPnPMessageHelper::SetServer(req, "dashboard/1.0 UpnP/1.0 xbox/2.0", true);
+ req.GetHeaders().SetHeader("AL",
+ "<urn:schemas-microsoft-com:nhed:attributes?type=X02&firmwarever=8955.0&udn=uuid:10000000-0000-0000-0200-00125A8FEFAC>");
+ PLT_UPnPMessageHelper::SetLocation(req, "*");
+
+ // target address
+ NPT_IpAddress ip;
+ if (NPT_FAILED(res = ip.ResolveName(req.GetUrl().GetHost()))) {
+ return res;
+ }
+ NPT_SocketAddress addr(ip, req.GetUrl().GetPort());
+
+ PLT_SsdpSender::SendSsdp(req,
+ "uuid:00000000-0000-0000-0200-00125A8FEFAC::urn:schemas-microsoft-com:nhed:presence:1",
+ "urn:schemas-microsoft-com:nhed:presence:1",
+ socket,
+ true,
+ &addr);
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.h b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.h
new file mode 100644
index 0000000..346ce57
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.h
@@ -0,0 +1,73 @@
+/*****************************************************************
+|
+| Platinum - XBox 360
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_XBOX360_H_
+#define _PLT_XBOX360_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMediaRenderer.h"
+
+class PLT_Xbox360 : public PLT_MediaRenderer
+{
+public:
+ PLT_Xbox360(const char* uuid = NULL,
+ unsigned int port = 0,
+ bool port_rebind = false);
+
+protected:
+ // PLT_DeviceHost methods
+ NPT_Result SetupServices() override;
+ NPT_Result SetupIcons() override;
+ virtual NPT_Result InitServiceURLs(PLT_Service* service, const char* service_name);
+
+ virtual NPT_Result Announce(PLT_DeviceData* device,
+ NPT_HttpRequest& request,
+ NPT_UdpSocket& socket,
+ PLT_SsdpAnnounceType type);
+
+ // PLT_DeviceData methods
+ NPT_Result GetDescription(NPT_String& desc) override { return PLT_MediaRenderer::GetDescription(desc); }
+ NPT_Result GetDescription(NPT_XmlElementNode* parent,
+ NPT_XmlElementNode** device = NULL) override;
+
+protected:
+ ~PLT_Xbox360() override;
+
+ virtual NPT_Result AnnouncePresence(NPT_UdpSocket& socket,
+ const char* serial_number);
+};
+
+#endif /* _PLT_XBOX360_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.cpp
new file mode 100644
index 0000000..e05504b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.cpp
@@ -0,0 +1,176 @@
+/*****************************************************************
+|
+| Platinum - MediaConnect SCPD
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 X_MS_MediaReceiverRegistrarSCPD[2589] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x27, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A,
+ 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E,
+ 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x73,
+ 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E,
+ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C,
+ 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65,
+ 0x71, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x71, 0x4D, 0x73,
+ 0x67, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69,
+ 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F,
+ 0x6E, 0x52, 0x65, 0x73, 0x70, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x73, 0x56, 0x61, 0x6C, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x65, 0x76,
+ 0x69, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73,
+ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65,
+ 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x6E, 0x74, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x71, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x62, 0x69, 0x6E,
+ 0x2E, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+ 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x67, 0x69, 0x73,
+ 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x62, 0x69, 0x6E, 0x2E,
+ 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x47, 0x72, 0x61,
+ 0x6E, 0x74, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x75, 0x74, 0x68, 0x6F,
+ 0x72, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x65, 0x6E, 0x69, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+ 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x56, 0x61, 0x6C, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x75, 0x63, 0x63, 0x65,
+ 0x65, 0x64, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x56, 0x61, 0x6C, 0x69, 0x64,
+ 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x76, 0x6F, 0x6B, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x3C,
+ 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
+};
+
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.xml b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.xml
new file mode 100644
index 0000000..aa90cb0
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scpd xmlns='urn:schemas-upnp-org:service-1-0'>
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <actionList>
+ <action>
+ <name>IsAuthorized</name>
+ <argumentList>
+ <argument>
+ <name>DeviceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_DeviceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Result</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>RegisterDevice</name>
+ <argumentList>
+ <argument>
+ <name>RegistrationReqMsg</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_RegistrationReqMsg</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RegistrationRespMsg</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_RegistrationRespMsg</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>IsValidated</name>
+ <argumentList>
+ <argument>
+ <name>DeviceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_DeviceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Result</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_DeviceID</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Result</name>
+ <dataType>int</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_RegistrationReqMsg</name>
+ <dataType>bin.base64</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_RegistrationRespMsg</name>
+ <dataType>bin.base64</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>AuthorizationGrantedUpdateID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>AuthorizationDeniedUpdateID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>ValidationSucceededUpdateID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>ValidationRevokedUpdateID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ </serviceStateTable>
+</scpd> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/process_scpds.sh b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/process_scpds.sh
new file mode 100644
index 0000000..50e446b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/process_scpds.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+set -x
+
+# abort on any errors
+set -e
+
+# ContentDirectory
+../../../Targets/x86-unknown-cygwin/Debug/TextToHeader.exe -v X_MS_MediaReceiverRegistrarSCPD -h MediaConnect X_MS_MediaReceiverRegistrarSCPD.xml X_MS_MediaReceiverRegistrarSCPD.cpp
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp
new file mode 100644
index 0000000..4803a33
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp
@@ -0,0 +1,996 @@
+/*****************************************************************
+|
+| Platinum - AVTransport SCPD
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 RDR_AVTransportSCPD[] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
+ 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68, 0x65,
+ 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+ 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F,
+ 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E,
+ 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56,
+ 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72,
+ 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74,
+ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43,
+ 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53,
+ 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6F,
+ 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D,
+ 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x51,
+ 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6F,
+ 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D,
+ 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
+ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x4E, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65,
+ 0x72, 0x4F, 0x66, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74,
+ 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74,
+ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
+ 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44,
+ 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x55,
+ 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73,
+ 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E,
+ 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D,
+ 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50,
+ 0x6C, 0x61, 0x79, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79,
+ 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75,
+ 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67,
+ 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x57,
+ 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x63,
+ 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47,
+ 0x65, 0x74, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73,
+ 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54,
+ 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72,
+ 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B,
+ 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+ 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D,
+ 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54,
+ 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E,
+ 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x52, 0x65, 0x6C, 0x54, 0x69, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74,
+ 0x69, 0x76, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x54, 0x69, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x43, 0x6F, 0x75, 0x6E,
+ 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6F, 0x75, 0x6E,
+ 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x62,
+ 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49,
+ 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+ 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x70,
+ 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74,
+ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50,
+ 0x6C, 0x61, 0x79, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53,
+ 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F,
+ 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x51, 0x75, 0x61,
+ 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+ 0x6E, 0x74, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65,
+ 0x78, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x61, 0x75, 0x73, 0x65, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
+ 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
+ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74,
+ 0x50, 0x6C, 0x61, 0x79, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6F, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49,
+ 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x65, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x6E, 0x69,
+ 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65,
+ 0x65, 0x6B, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x61,
+ 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E,
+ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73,
+ 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55,
+ 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55,
+ 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E,
+ 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56,
+ 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53,
+ 0x65, 0x74, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74,
+ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65,
+ 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44,
+ 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73,
+ 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x50, 0x6C, 0x61,
+ 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x77, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64,
+ 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F,
+ 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x53, 0x74, 0x6F, 0x70, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
+ 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x5F, 0x4F, 0x4E, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54,
+ 0x5F, 0x41, 0x4C, 0x4C, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x48, 0x55, 0x46, 0x46, 0x4C, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x48, 0x55, 0x46, 0x46,
+ 0x4C, 0x45, 0x5F, 0x4E, 0x4F, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
+ 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x3C, 0x2F, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63,
+ 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49,
+ 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4C, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6E,
+ 0x67, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+ 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
+ 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
+ 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74,
+ 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
+ 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
+ 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73,
+ 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x54, 0x4F, 0x50, 0x50, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x50, 0x41, 0x55,
+ 0x53, 0x45, 0x44, 0x5F, 0x50, 0x4C, 0x41, 0x59, 0x42, 0x41, 0x43, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x50, 0x4C, 0x41, 0x59, 0x49, 0x4E,
+ 0x47, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x54, 0x52, 0x41, 0x4E, 0x53, 0x49, 0x54, 0x49, 0x4F, 0x4E, 0x49, 0x4E, 0x47, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F,
+ 0x5F, 0x4D, 0x45, 0x44, 0x49, 0x41, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x54, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+ 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74,
+ 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69,
+ 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65,
+ 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+ 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75,
+ 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34,
+ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75,
+ 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35,
+ 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
+ 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74,
+ 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74,
+ 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B,
+ 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x4E, 0x45, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x55, 0x4E,
+ 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x44, 0x41, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x48, 0x44, 0x44, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
+ 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+ 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70,
+ 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
+ 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64,
+ 0x69, 0x75, 0x6D, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50,
+ 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+ 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x50, 0x6C, 0x61,
+ 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x4E, 0x45,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x44, 0x41, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x48, 0x44,
+ 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F,
+ 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72,
+ 0x4F, 0x66, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E,
+ 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F,
+ 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+ 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x52, 0x45, 0x4C, 0x5F, 0x54, 0x49, 0x4D,
+ 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x5F, 0x4E, 0x52, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62,
+ 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x61,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
+ 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73,
+ 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
+ 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4F, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x45, 0x52, 0x52, 0x4F, 0x52, 0x5F, 0x4F,
+ 0x43, 0x43, 0x55, 0x52, 0x52, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50, 0x6C, 0x61,
+ 0x79, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
+ 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73,
+ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x3C, 0x2F,
+ 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
+};
+
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml
new file mode 100644
index 0000000..f9ee988
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml
@@ -0,0 +1,515 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <actionList>
+ <action>
+ <name>GetCurrentTransportActions</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Actions</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTransportActions</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetDeviceCapabilities</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PlayMedia</name>
+ <direction>out</direction>
+ <relatedStateVariable>PossiblePlaybackStorageMedia</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RecMedia</name>
+ <direction>out</direction>
+ <relatedStateVariable>PossibleRecordStorageMedia</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RecQualityModes</name>
+ <direction>out</direction>
+ <relatedStateVariable>PossibleRecordQualityModes</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetMediaInfo</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NrTracks</name>
+ <direction>out</direction>
+ <relatedStateVariable>NumberOfTracks</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>MediaDuration</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentMediaDuration</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentURI</name>
+ <direction>out</direction>
+ <relatedStateVariable>AVTransportURI</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentURIMetaData</name>
+ <direction>out</direction>
+ <relatedStateVariable>AVTransportURIMetaData</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NextURI</name>
+ <direction>out</direction>
+ <relatedStateVariable>NextAVTransportURI</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NextURIMetaData</name>
+ <direction>out</direction>
+ <relatedStateVariable>NextAVTransportURIMetaData</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PlayMedium</name>
+ <direction>out</direction>
+ <relatedStateVariable>PlaybackStorageMedium</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RecordMedium</name>
+ <direction>out</direction>
+ <relatedStateVariable>RecordStorageMedium</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>WriteStatus</name>
+ <direction>out</direction>
+ <relatedStateVariable>RecordMediumWriteStatus</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetPositionInfo</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Track</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTrack</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>TrackDuration</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTrackDuration</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>TrackMetaData</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTrackMetaData</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>TrackURI</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTrackURI</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RelTime</name>
+ <direction>out</direction>
+ <relatedStateVariable>RelativeTimePosition</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>AbsTime</name>
+ <direction>out</direction>
+ <relatedStateVariable>AbsoluteTimePosition</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RelCount</name>
+ <direction>out</direction>
+ <relatedStateVariable>RelativeCounterPosition</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>AbsCount</name>
+ <direction>out</direction>
+ <relatedStateVariable>AbsoluteCounterPosition</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetTransportInfo</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentTransportState</name>
+ <direction>out</direction>
+ <relatedStateVariable>TransportState</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentTransportStatus</name>
+ <direction>out</direction>
+ <relatedStateVariable>TransportStatus</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentSpeed</name>
+ <direction>out</direction>
+ <relatedStateVariable>TransportPlaySpeed</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetTransportSettings</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PlayMode</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentPlayMode</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RecQualityMode</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentRecordQualityMode</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Next</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Pause</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Play</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Speed</name>
+ <direction>in</direction>
+ <relatedStateVariable>TransportPlaySpeed</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Previous</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Seek</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Unit</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_SeekMode</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Target</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_SeekTarget</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetAVTransportURI</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentURI</name>
+ <direction>in</direction>
+ <relatedStateVariable>AVTransportURI</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentURIMetaData</name>
+ <direction>in</direction>
+ <relatedStateVariable>AVTransportURIMetaData</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetNextAVTransportURI</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NextURI</name>
+ <direction>in</direction>
+ <relatedStateVariable>NextAVTransportURI</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NextURIMetaData</name>
+ <direction>in</direction>
+ <relatedStateVariable>NextAVTransportURIMetaData</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetPlayMode</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NewPlayMode</name>
+ <direction>in</direction>
+ <relatedStateVariable>CurrentPlayMode</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Stop</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents="no">
+ <name>CurrentPlayMode</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>NORMAL</allowedValue>
+ <allowedValue>REPEAT_ONE</allowedValue>
+ <allowedValue>REPEAT_ALL</allowedValue>
+ <allowedValue>SHUFFLE</allowedValue>
+ <allowedValue>SHUFFLE_NOREPEAT</allowedValue>
+ </allowedValueList>
+ <defaultValue>NORMAL</defaultValue>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RecordStorageMedium</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>NOT_IMPLEMENTED</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>LastChange</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RelativeTimePosition</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTrackURI</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTrackDuration</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentRecordQualityMode</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>NOT_IMPLEMENTED</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentMediaDuration</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>AbsoluteCounterPosition</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RelativeCounterPosition</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_InstanceID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>AVTransportURI</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>TransportState</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>STOPPED</allowedValue>
+ <allowedValue>PAUSED_PLAYBACK</allowedValue>
+ <allowedValue>PLAYING</allowedValue>
+ <allowedValue>TRANSITIONING</allowedValue>
+ <allowedValue>NO_MEDIA_PRESENT</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTrackMetaData</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>NextAVTransportURI</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PossibleRecordQualityModes</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>NOT_IMPLEMENTED</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTrack</name>
+ <dataType>ui4</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>65535</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>AbsoluteTimePosition</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>NextAVTransportURIMetaData</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PlaybackStorageMedium</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>NONE</allowedValue>
+ <allowedValue>UNKNOWN</allowedValue>
+ <allowedValue>CD-DA</allowedValue>
+ <allowedValue>HDD</allowedValue>
+ <allowedValue>NETWORK</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTransportActions</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RecordMediumWriteStatus</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>NOT_IMPLEMENTED</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PossiblePlaybackStorageMedia</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>NONE</allowedValue>
+ <allowedValue>UNKNOWN</allowedValue>
+ <allowedValue>CD-DA</allowedValue>
+ <allowedValue>HDD</allowedValue>
+ <allowedValue>NETWORK</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>AVTransportURIMetaData</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>NumberOfTracks</name>
+ <dataType>ui4</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>65535</maximum>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_SeekMode</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>REL_TIME</allowedValue>
+ <allowedValue>TRACK_NR</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_SeekTarget</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PossibleRecordStorageMedia</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>NOT_IMPLEMENTED</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>TransportStatus</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>OK</allowedValue>
+ <allowedValue>ERROR_OCCURRED</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>TransportPlaySpeed</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>1</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ </serviceStateTable>
+</scpd> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPDFull.xml b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPDFull.xml
new file mode 100644
index 0000000..72de6b0
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPDFull.xml
@@ -0,0 +1,561 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <actionList>
+ <action>
+ <name>GetCurrentTransportActions</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Actions</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTransportActions</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetDeviceCapabilities</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PlayMedia</name>
+ <direction>out</direction>
+ <relatedStateVariable>PossiblePlaybackStorageMedia</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RecMedia</name>
+ <direction>out</direction>
+ <relatedStateVariable>PossibleRecordStorageMedia</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RecQualityModes</name>
+ <direction>out</direction>
+ <relatedStateVariable>PossibleRecordQualityModes</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetMediaInfo</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NrTracks</name>
+ <direction>out</direction>
+ <relatedStateVariable>NumberOfTracks</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>MediaDuration</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentMediaDuration</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentURI</name>
+ <direction>out</direction>
+ <relatedStateVariable>AVTransportURI</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentURIMetaData</name>
+ <direction>out</direction>
+ <relatedStateVariable>AVTransportURIMetaData</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NextURI</name>
+ <direction>out</direction>
+ <relatedStateVariable>NextAVTransportURI</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NextURIMetaData</name>
+ <direction>out</direction>
+ <relatedStateVariable>NextAVTransportURIMetaData</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PlayMedium</name>
+ <direction>out</direction>
+ <relatedStateVariable>PlaybackStorageMedium</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RecordMedium</name>
+ <direction>out</direction>
+ <relatedStateVariable>RecordStorageMedium</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>WriteStatus</name>
+ <direction>out</direction>
+ <relatedStateVariable>RecordMediumWriteStatus</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetPositionInfo</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Track</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTrack</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>TrackDuration</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTrackDuration</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>TrackMetaData</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTrackMetaData</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>TrackURI</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentTrackURI</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RelTime</name>
+ <direction>out</direction>
+ <relatedStateVariable>RelativeTimePosition</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>AbsTime</name>
+ <direction>out</direction>
+ <relatedStateVariable>AbsoluteTimePosition</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RelCount</name>
+ <direction>out</direction>
+ <relatedStateVariable>RelativeCounterPosition</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>AbsCount</name>
+ <direction>out</direction>
+ <relatedStateVariable>AbsoluteCounterPosition</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetTransportInfo</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentTransportState</name>
+ <direction>out</direction>
+ <relatedStateVariable>TransportState</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentTransportStatus</name>
+ <direction>out</direction>
+ <relatedStateVariable>TransportStatus</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentSpeed</name>
+ <direction>out</direction>
+ <relatedStateVariable>TransportPlaySpeed</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetTransportSettings</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PlayMode</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentPlayMode</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RecQualityMode</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentRecordQualityMode</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Next</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Pause</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Play</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Speed</name>
+ <direction>in</direction>
+ <relatedStateVariable>TransportPlaySpeed</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Previous</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Seek</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Unit</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_SeekMode</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Target</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_SeekTarget</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetAVTransportURI</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentURI</name>
+ <direction>in</direction>
+ <relatedStateVariable>AVTransportURI</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentURIMetaData</name>
+ <direction>in</direction>
+ <relatedStateVariable>AVTransportURIMetaData</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetPlayMode</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NewPlayMode</name>
+ <direction>in</direction>
+ <relatedStateVariable>CurrentPlayMode</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Stop</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents="no">
+ <name>CurrentPlayMode</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>NORMAL</allowedValue>
+ <allowedValue>REPEAT_ALL</allowedValue>
+ <allowedValue>INTRO</allowedValue>
+ </allowedValueList>
+ <defaultValue>NORMAL</defaultValue>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RecordStorageMedium</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>UNKNOWN</allowedValue>
+ <allowedValue>DV</allowedValue>
+ <allowedValue>MINI-DV</allowedValue>
+ <allowedValue>VHS</allowedValue>
+ <allowedValue>W-VHS</allowedValue>
+ <allowedValue>S-VHS</allowedValue>
+ <allowedValue>D-VHS</allowedValue>
+ <allowedValue>VHSC</allowedValue>
+ <allowedValue>VIDEO8</allowedValue>
+ <allowedValue>HI8</allowedValue>
+ <allowedValue>CD-ROM</allowedValue>
+ <allowedValue>CD-DA</allowedValue>
+ <allowedValue>CD-R</allowedValue>
+ <allowedValue>CD-RW</allowedValue>
+ <allowedValue>VIDEO-CD</allowedValue>
+ <allowedValue>SACD</allowedValue>
+ <allowedValue>MD-AUDIO</allowedValue>
+ <allowedValue>MD-PICTURE</allowedValue>
+ <allowedValue>DVD-ROM</allowedValue>
+ <allowedValue>DVD-VIDEO</allowedValue>
+ <allowedValue>DVD-R</allowedValue>
+ <allowedValue>DVD+RW</allowedValue>
+ <allowedValue>DVD-RW</allowedValue>
+ <allowedValue>DVD-RAM</allowedValue>
+ <allowedValue>DVD-AUDIO</allowedValue>
+ <allowedValue>DAT</allowedValue>
+ <allowedValue>LD</allowedValue>
+ <allowedValue>HDD</allowedValue>
+ <allowedValue>MICRO-MV</allowedValue>
+ <allowedValue>NETWORK</allowedValue>
+ <allowedValue>NONE</allowedValue>
+ <allowedValue>NOT_IMPLEMENTED</allowedValue>
+ <allowedValue> vendor-defined </allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>LastChange</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RelativeTimePosition</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTrackURI</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTrackDuration</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentRecordQualityMode</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>0:EP</allowedValue>
+ <allowedValue>1:LP</allowedValue>
+ <allowedValue>2:SP</allowedValue>
+ <allowedValue>0:BASIC</allowedValue>
+ <allowedValue>1:MEDIUM</allowedValue>
+ <allowedValue>2:HIGH</allowedValue>
+ <allowedValue>NOT_IMPLEMENTED</allowedValue>
+ <allowedValue> vendor-defined </allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentMediaDuration</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>AbsoluteCounterPosition</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RelativeCounterPosition</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_InstanceID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>AVTransportURI</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>TransportState</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>STOPPED</allowedValue>
+ <allowedValue>PAUSED_PLAYBACK</allowedValue>
+ <allowedValue>PAUSED_RECORDING</allowedValue>
+ <allowedValue>PLAYING</allowedValue>
+ <allowedValue>RECORDING</allowedValue>
+ <allowedValue>TRANSITIONING</allowedValue>
+ <allowedValue>NO_MEDIA_PRESENT</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTrackMetaData</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>NextAVTransportURI</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PossibleRecordQualityModes</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTrack</name>
+ <dataType>ui4</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>4294967295</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>AbsoluteTimePosition</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>NextAVTransportURIMetaData</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PlaybackStorageMedium</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>UNKNOWN</allowedValue>
+ <allowedValue>DV</allowedValue>
+ <allowedValue>MINI-DV</allowedValue>
+ <allowedValue>VHS</allowedValue>
+ <allowedValue>W-VHS</allowedValue>
+ <allowedValue>S-VHS</allowedValue>
+ <allowedValue>D-VHS</allowedValue>
+ <allowedValue>VHSC</allowedValue>
+ <allowedValue>VIDEO8</allowedValue>
+ <allowedValue>HI8</allowedValue>
+ <allowedValue>CD-ROM</allowedValue>
+ <allowedValue>CD-DA</allowedValue>
+ <allowedValue>CD-R</allowedValue>
+ <allowedValue>CD-RW</allowedValue>
+ <allowedValue>VIDEO-CD</allowedValue>
+ <allowedValue>SACD</allowedValue>
+ <allowedValue>MD-AUDIO</allowedValue>
+ <allowedValue>MD-PICTURE</allowedValue>
+ <allowedValue>DVD-ROM</allowedValue>
+ <allowedValue>DVD-VIDEO</allowedValue>
+ <allowedValue>DVD-R</allowedValue>
+ <allowedValue>DVD+RW</allowedValue>
+ <allowedValue>DVD-RW</allowedValue>
+ <allowedValue>DVD-RAM</allowedValue>
+ <allowedValue>DVD-AUDIO</allowedValue>
+ <allowedValue>DAT</allowedValue>
+ <allowedValue>LD</allowedValue>
+ <allowedValue>HDD</allowedValue>
+ <allowedValue>MICRO-MV</allowedValue>
+ <allowedValue>NETWORK</allowedValue>
+ <allowedValue>NONE</allowedValue>
+ <allowedValue>NOT_IMPLEMENTED</allowedValue>
+ <allowedValue> vendor-defined </allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>CurrentTransportActions</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RecordMediumWriteStatus</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>WRITABLE</allowedValue>
+ <allowedValue>PROTECTED</allowedValue>
+ <allowedValue>NOT_WRITABLE</allowedValue>
+ <allowedValue>UNKNOWN</allowedValue>
+ <allowedValue>NOT_IMPLEMENTED</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PossiblePlaybackStorageMedia</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>AVTransportURIMetaData</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>NumberOfTracks</name>
+ <dataType>ui4</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>4294967295</maximum>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_SeekMode</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>ABS_TIME</allowedValue>
+ <allowedValue>REL_TIME</allowedValue>
+ <allowedValue>ABS_COUNT</allowedValue>
+ <allowedValue>REL_COUNT</allowedValue>
+ <allowedValue>TRACK_NR</allowedValue>
+ <allowedValue>CHANNEL_FREQ</allowedValue>
+ <allowedValue>TAPE-INDEX</allowedValue>
+ <allowedValue>FRAME</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_SeekTarget</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PossibleRecordStorageMedia</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>TransportStatus</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>OK</allowedValue>
+ <allowedValue>ERROR_OCCURRED</allowedValue>
+ <allowedValue> vendor-defined </allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>TransportPlaySpeed</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>1</allowedValue>
+ <allowedValue> vendor-defined </allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ </serviceStateTable>
+</scpd> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp
new file mode 100644
index 0000000..87aabf3
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp
@@ -0,0 +1,1392 @@
+/*****************************************************************
+|
+| Platinum - AV Media Controller (Media Renderer Control Point)
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaController.h"
+#include "PltDidl.h"
+#include "PltDeviceData.h"
+#include "PltUtilities.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.renderer.controller")
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::PLT_MediaController
++---------------------------------------------------------------------*/
+PLT_MediaController::PLT_MediaController(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaControllerDelegate* delegate /* = NULL */) :
+ m_CtrlPoint(ctrl_point),
+ m_Delegate(delegate)
+{
+ m_CtrlPoint->AddListener(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::~PLT_MediaController
++---------------------------------------------------------------------*/
+PLT_MediaController::~PLT_MediaController()
+{
+ m_CtrlPoint->RemoveListener(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnDeviceAdded
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnDeviceAdded(PLT_DeviceDataReference& device)
+{
+ // verify the device implements the function we need
+ PLT_Service* serviceAVT = NULL;
+ PLT_Service* serviceCMR;
+ PLT_Service* serviceRC;
+ NPT_String type;
+
+ if (!device->GetType().StartsWith("urn:schemas-upnp-org:device:MediaRenderer"))
+ return NPT_FAILURE;
+
+ // optional service
+ type = "urn:schemas-upnp-org:service:AVTransport:*";
+ if (NPT_SUCCEEDED(device->FindServiceByType(type, serviceAVT))) {
+ // in case it's a newer upnp implementation, force to 1
+ NPT_LOG_FINE_1("Service %s found", (const char*)type);
+ serviceAVT->ForceVersion(1);
+ }
+
+ // required services
+ type = "urn:schemas-upnp-org:service:ConnectionManager:*";
+ if (NPT_FAILED(device->FindServiceByType(type, serviceCMR))) {
+ NPT_LOG_FINE_1("Service %s not found", (const char*)type);
+ return NPT_FAILURE;
+ } else {
+ // in case it's a newer upnp implementation, force to 1
+ serviceCMR->ForceVersion(1);
+ }
+
+ type = "urn:schemas-upnp-org:service:RenderingControl:*";
+ if (NPT_FAILED(device->FindServiceByType(type, serviceRC))) {
+ NPT_LOG_FINE_1("Service %s not found", (const char*)type);
+ return NPT_FAILURE;
+ } else {
+ // in case it's a newer upnp implementation, force to 1
+ serviceRC->ForceVersion(1);
+ }
+
+ {
+ NPT_AutoLock lock(m_MediaRenderers);
+
+ PLT_DeviceDataReference data;
+ NPT_String uuid = device->GetUUID();
+
+ // is it a new device?
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_MediaRenderers,
+ PLT_DeviceDataFinder(uuid), data))) {
+ NPT_LOG_WARNING_1("Device (%s) is already in our list!", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE_1("Device Found: %s", (const char*)*device);
+
+ m_MediaRenderers.Add(device);
+ }
+
+ if (m_Delegate && m_Delegate->OnMRAdded(device)) {
+ // subscribe to services eventing only if delegate wants it
+ if (serviceAVT) m_CtrlPoint->Subscribe(serviceAVT);
+
+ // subscribe to required services
+ m_CtrlPoint->Subscribe(serviceCMR);
+ m_CtrlPoint->Subscribe(serviceRC);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnDeviceRemoved
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnDeviceRemoved(PLT_DeviceDataReference& device)
+{
+ if (!device->GetType().StartsWith("urn:schemas-upnp-org:device:MediaRenderer"))
+ return NPT_FAILURE;
+
+ {
+ NPT_AutoLock lock(m_MediaRenderers);
+
+ // only release if we have kept it around
+ PLT_DeviceDataReference data;
+ NPT_String uuid = device->GetUUID();
+
+ // Have we seen that device?
+ if (NPT_FAILED(NPT_ContainerFind(m_MediaRenderers, PLT_DeviceDataFinder(uuid), data))) {
+ NPT_LOG_WARNING_1("Device (%s) not found in our list!", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE_1("Device Removed: %s", (const char*)*device);
+
+ m_MediaRenderers.Remove(device);
+ }
+
+ if (m_Delegate) {
+ m_Delegate->OnMRRemoved(device);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::FindRenderer
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::FindRenderer(const char* uuid, PLT_DeviceDataReference& device)
+{
+ NPT_AutoLock lock(m_MediaRenderers);
+
+ if (NPT_FAILED(NPT_ContainerFind(m_MediaRenderers, PLT_DeviceDataFinder(uuid), device))) {
+ NPT_LOG_FINE_1("Device (%s) not found in our list of renderers", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetProtocolInfoSink
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetProtocolInfoSink(const NPT_String& device_uuid,
+ NPT_List<NPT_String>& sinks)
+{
+ PLT_DeviceDataReference renderer;
+ NPT_CHECK_WARNING(FindRenderer(device_uuid, renderer));
+
+ // look for ConnectionManager service
+ PLT_Service* serviceCMR;
+ NPT_CHECK_SEVERE(renderer->FindServiceByType("urn:schemas-upnp-org:service:ConnectionManager:*",
+ serviceCMR));
+
+ NPT_String value;
+ NPT_CHECK_SEVERE(serviceCMR->GetStateVariableValue("SinkProtocolInfo",
+ value));
+
+ sinks = value.Split(",");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetTransportState
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetTransportState(const NPT_String& device_uuid,
+ NPT_String& state)
+{
+ PLT_DeviceDataReference renderer;
+ NPT_CHECK_WARNING(FindRenderer(device_uuid, renderer));
+
+ // look for AVTransport service
+ PLT_Service* serviceAVT;
+ NPT_CHECK_SEVERE(renderer->FindServiceByType("urn:schemas-upnp-org:service:AVTransport:*",
+ serviceAVT));
+
+ NPT_CHECK_SEVERE(serviceAVT->GetStateVariableValue("TransportState",
+ state));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetVolumeState
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetVolumeState(const NPT_String& device_uuid,
+ NPT_UInt32& volume)
+{
+ PLT_DeviceDataReference renderer;
+ NPT_CHECK_WARNING(FindRenderer(device_uuid, renderer));
+
+ // look for RenderingControl service
+ PLT_Service* serviceRC;
+ NPT_CHECK_SEVERE(renderer->FindServiceByType("urn:schemas-upnp-org:service:RenderingControl:*",
+ serviceRC));
+
+ NPT_String value;
+ NPT_CHECK_SEVERE(serviceRC->GetStateVariableValue("Volume",
+ value));
+
+ return value.ToInteger32(volume);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::FindMatchingProtocolInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::FindMatchingProtocolInfo(NPT_List<NPT_String>& sinks,
+ const char* protocol_info)
+{
+ PLT_ProtocolInfo protocol(protocol_info);
+ for (NPT_List<NPT_String>::Iterator iter = sinks.GetFirstItem();
+ iter;
+ iter++) {
+ PLT_ProtocolInfo sink(*iter);
+ if (sink.Match(protocol)) {
+ return NPT_SUCCESS;
+ }
+ }
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::FindBestResource
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::FindBestResource(PLT_DeviceDataReference& device,
+ PLT_MediaObject& item,
+ NPT_Cardinal& resource_index)
+{
+ if (item.m_Resources.GetItemCount() <= 0) return NPT_ERROR_INVALID_PARAMETERS;
+
+ NPT_List<NPT_String> sinks;
+ NPT_CHECK_SEVERE(GetProtocolInfoSink(device->GetUUID(), sinks));
+
+ // look for best resource
+ for (NPT_Cardinal i=0; i< item.m_Resources.GetItemCount(); i++) {
+ if (NPT_SUCCEEDED(FindMatchingProtocolInfo(
+ sinks,
+ item.m_Resources[i].m_ProtocolInfo.ToString()))) {
+ resource_index = i;
+ return NPT_SUCCESS;
+ }
+ }
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::InvokeActionWithInstance
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::InvokeActionWithInstance(PLT_ActionReference& action,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ // Set the object id
+ NPT_CHECK_SEVERE(action->SetArgumentValue(
+ "InstanceID",
+ NPT_String::FromInteger(instance_id)));
+
+ // set the arguments on the action, this will check the argument values
+ return m_CtrlPoint->InvokeAction(action, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetCurrentTransportActions
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetCurrentTransportActions(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetCurrentTransportActions",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetDeviceCapabilities
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetDeviceCapabilities(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetDeviceCapabilities",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetMediaInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetMediaInfo(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetMediaInfo",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetPositionInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetPositionInfo(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetPositionInfo",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetTransportInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetTransportInfo(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetTransportInfo",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetTransportSettings
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetTransportSettings(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetTransportSettings",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Next
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Next(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Next",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Pause
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Pause(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Pause",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Play
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Play(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ NPT_String speed,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Play",
+ action));
+
+ // Set the speed
+ if (NPT_FAILED(action->SetArgumentValue("Speed", speed))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Previous
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Previous(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Previous",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Seek(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ NPT_String unit,
+ NPT_String target,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Seek",
+ action));
+
+ // Set the unit
+ if (NPT_FAILED(action->SetArgumentValue("Unit", unit))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // Set the target
+ if (NPT_FAILED(action->SetArgumentValue("Target", target))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::CanSetNextAVTransportURI
++---------------------------------------------------------------------*/
+bool
+PLT_MediaController::CanSetNextAVTransportURI(PLT_DeviceDataReference &device)
+{
+ if (device.IsNull()) return false;
+
+ PLT_ActionDesc* action_desc;
+ NPT_Result result = m_CtrlPoint->FindActionDesc(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "SetNextAVTransportURI",
+ action_desc);
+ return (result == NPT_SUCCESS);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::SetAVTransportURI
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::SetAVTransportURI(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ const char* uri,
+ const char* metadata,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "SetAVTransportURI",
+ action));
+
+ // set the uri
+ if (NPT_FAILED(action->SetArgumentValue("CurrentURI", uri))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the uri metadata
+ if (NPT_FAILED(action->SetArgumentValue("CurrentURIMetaData", metadata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::SetNextAVTransportURI
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::SetNextAVTransportURI(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ const char* next_uri,
+ const char* next_metadata,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "SetNextAVTransportURI",
+ action));
+
+ // set the uri
+ if (NPT_FAILED(action->SetArgumentValue("NextURI", next_uri))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the uri metadata
+ if (NPT_FAILED(action->SetArgumentValue("NextURIMetaData", next_metadata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::SetPlayMode
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::SetPlayMode(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ NPT_String new_play_mode,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "SetPlayMode",
+ action));
+
+ // set the New PlayMode
+ if (NPT_FAILED(action->SetArgumentValue("NewPlayMode", new_play_mode))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Stop(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Stop",
+ action));
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetCurrentConnectionIDs
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetCurrentConnectionIDs(PLT_DeviceDataReference& device,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "GetCurrentConnectionIDs",
+ action));
+
+ // set the arguments on the action, this will check the argument values
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetCurrentConnectionInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetCurrentConnectionInfo(PLT_DeviceDataReference& device,
+ NPT_UInt32 connection_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "GetCurrentConnectionInfo",
+ action));
+
+ // set the New PlayMode
+ if (NPT_FAILED(action->SetArgumentValue("ConnectionID",
+ NPT_String::FromInteger(connection_id)))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the arguments on the action, this will check the argument values
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetProtocolInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetProtocolInfo(PLT_DeviceDataReference& device,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "GetProtocolInfo",
+ action));
+
+ // set the arguments on the action, this will check the argument values
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::SetMute
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::SetMute(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ const char* channel,
+ bool mute,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:RenderingControl:1",
+ "SetMute",
+ action));
+
+ // set the channel
+ if (NPT_FAILED(action->SetArgumentValue("Channel", channel))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the channel
+ if (NPT_FAILED(action->SetArgumentValue("DesiredMute",
+ mute?"1":"0"))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::SetVolume
++---------------------------------------------------------------------*/
+NPT_Result PLT_MediaController::SetVolume(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ const char* channel,
+ int volume,
+ void* userdata)
+{
+
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:RenderingControl:1",
+ "SetVolume",
+ action));
+
+ // set the channel
+ if (NPT_FAILED(action->SetArgumentValue("Channel", channel))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ if (NPT_FAILED(action->SetArgumentValue("DesiredVolume",
+ NPT_String::FromInteger(volume)))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetMute
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetMute(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ const char* channel,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:RenderingControl:1",
+ "GetMute",
+ action));
+
+ // set the channel
+ if (NPT_FAILED(action->SetArgumentValue("Channel", channel))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetVolume
++---------------------------------------------------------------------*/
+NPT_Result PLT_MediaController::GetVolume(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ const char* channel,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:RenderingControl:1",
+ "GetVolume",
+ action));
+
+ // set the channel
+ if (NPT_FAILED(action->SetArgumentValue("Channel", channel))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return InvokeActionWithInstance(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnActionResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnActionResponse(NPT_Result res,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ if (m_Delegate == NULL) return NPT_SUCCESS;
+
+ PLT_DeviceDataReference device;
+ NPT_String uuid = action->GetActionDesc().GetService()->GetDevice()->GetUUID();
+
+ /* extract action name */
+ NPT_String actionName = action->GetActionDesc().GetName();
+
+ /* AVTransport response ? */
+ if (actionName.Compare("GetCurrentTransportActions", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetCurrentTransportActionsResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetDeviceCapabilities", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetDeviceCapabilitiesResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetMediaInfo", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetMediaInfoResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetPositionInfo", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetPositionInfoResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetTransportInfo", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetTransportInfoResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetTransportSettings", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetTransportSettingsResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("Next", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnNextResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Pause", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnPauseResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Play", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnPlayResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Previous", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnPreviousResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Seek", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnSeekResult(res, device, userdata);
+ }
+ else if (actionName.Compare("SetAVTransportURI", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnSetAVTransportURIResult(res, device, userdata);
+ }
+ else if (actionName.Compare("SetNextAVTransportURI", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnSetNextAVTransportURIResult(res, device, userdata);
+ }
+ else if (actionName.Compare("SetPlayMode", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnSetPlayModeResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Stop", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnStopResult(res, device, userdata);
+ }
+ else if (actionName.Compare("GetCurrentConnectionIDs", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetCurrentConnectionIDsResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetCurrentConnectionInfo", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetCurrentConnectionInfoResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetProtocolInfo", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetProtocolInfoResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("SetMute", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnSetMuteResult(res, device, userdata);
+ }
+ else if (actionName.Compare("GetMute", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetMuteResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("SetVolume", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnSetVolumeResult(res, device, userdata);
+ }
+ else if (actionName.Compare("GetVolume", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ return OnGetVolumeResponse(res, device, action, userdata);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetCurrentTransportActionsResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetCurrentTransportActionsResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String actions;
+ PLT_StringList values;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("Actions", actions))) {
+ goto bad_action;
+ }
+
+ // parse the list of actions and return a list to listener
+ ParseCSV(actions, values);
+
+ m_Delegate->OnGetCurrentTransportActionsResult(NPT_SUCCESS, device, &values, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetCurrentTransportActionsResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetDeviceCapabilitiesResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetDeviceCapabilitiesResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_DeviceCapabilities capabilities;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("PlayMedia", value))) {
+ goto bad_action;
+ }
+ // parse the list of medias and return a list to listener
+ ParseCSV(value, capabilities.play_media);
+
+ if (NPT_FAILED(action->GetArgumentValue("RecMedia", value))) {
+ goto bad_action;
+ }
+ // parse the list of rec and return a list to listener
+ ParseCSV(value, capabilities.rec_media);
+
+ if (NPT_FAILED(action->GetArgumentValue("RecQualityModes", value))) {
+ goto bad_action;
+ }
+ // parse the list of modes and return a list to listener
+ ParseCSV(value, capabilities.rec_quality_modes);
+
+ m_Delegate->OnGetDeviceCapabilitiesResult(NPT_SUCCESS, device, &capabilities, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetDeviceCapabilitiesResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetMediaInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetMediaInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_MediaInfo info;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("NrTracks", info.num_tracks))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("MediaDuration", value))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.media_duration))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("CurrentURI", info.cur_uri))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("CurrentURIMetaData", info.cur_metadata))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("NextURI", info.next_uri))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("NextURIMetaData", info.next_metadata))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("PlayMedium", info.play_medium))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("RecordMedium", info.rec_medium))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("WriteStatus", info.write_status))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetMediaInfoResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetMediaInfoResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetPositionInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetPositionInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_PositionInfo info;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("Track", info.track))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("TrackDuration", value))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.track_duration))) {
+ // some renderers return garbage sometimes
+ info.track_duration = NPT_TimeStamp(0.);
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("TrackMetaData", info.track_metadata))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("TrackURI", info.track_uri))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("RelTime", value))) {
+ goto bad_action;
+ }
+
+ // NOT_IMPLEMENTED is a valid value according to spec
+ if (value != "NOT_IMPLEMENTED" && NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.rel_time))) {
+ // some dogy renderers return garbage sometimes
+ info.rel_time = NPT_TimeStamp(-1.0f);
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("AbsTime", value))) {
+ goto bad_action;
+ }
+
+ // NOT_IMPLEMENTED is a valid value according to spec
+ if (value != "NOT_IMPLEMENTED" && NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.abs_time))) {
+ // some dogy renderers return garbage sometimes
+ info.abs_time = NPT_TimeStamp(-1.0f);
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("RelCount", info.rel_count))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("AbsCount", info.abs_count))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetPositionInfoResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetPositionInfoResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetTransportInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetTransportInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ PLT_TransportInfo info;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("CurrentTransportState", info.cur_transport_state))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("CurrentTransportStatus", info.cur_transport_status))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("CurrentSpeed", info.cur_speed))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetTransportInfoResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetTransportInfoResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetTransportSettingsResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetTransportSettingsResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ PLT_TransportSettings settings;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("PlayMode", settings.play_mode))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("RecQualityMode", settings.rec_quality_mode))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetTransportSettingsResult(NPT_SUCCESS, device, &settings, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetTransportSettingsResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetCurrentConnectionIDsResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetCurrentConnectionIDsResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_StringList IDs;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("ConnectionIDs", value))) {
+ goto bad_action;
+ }
+ // parse the list of medias and return a list to listener
+ ParseCSV(value, IDs);
+
+ m_Delegate->OnGetCurrentConnectionIDsResult(NPT_SUCCESS, device, &IDs, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetCurrentConnectionIDsResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetCurrentConnectionInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetCurrentConnectionInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_ConnectionInfo info;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("RcsID", info.rcs_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("AVTransportID", info.avtransport_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("ProtocolInfo", info.protocol_info))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("PeerConnectionManager", info.peer_connection_mgr))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("PeerConnectionID", info.peer_connection_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("Direction", info.direction))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("Status", info.status))) {
+ goto bad_action;
+ }
+ m_Delegate->OnGetCurrentConnectionInfoResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetCurrentConnectionInfoResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetProtocolInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetProtocolInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String source_info, sink_info;
+ PLT_StringList sources, sinks;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("Source", source_info))) {
+ goto bad_action;
+ }
+ ParseCSV(source_info, sources);
+
+ if (NPT_FAILED(action->GetArgumentValue("Sink", sink_info))) {
+ goto bad_action;
+ }
+ ParseCSV(sink_info, sinks);
+
+ m_Delegate->OnGetProtocolInfoResult(NPT_SUCCESS, device, &sources, &sinks, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetProtocolInfoResult(NPT_FAILURE, device, NULL, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetMuteResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetMuteResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String channel, mute;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("Channel", channel))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("CurrentMute", mute))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetMuteResult(
+ NPT_SUCCESS,
+ device,
+ channel,
+ PLT_Service::IsTrue(mute)?true:false,
+ userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetMuteResult(NPT_FAILURE, device, "", false, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetVolumeResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetVolumeResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String channel;
+ NPT_String current_volume;
+ NPT_UInt32 volume;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("Channel", channel))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("CurrentVolume", current_volume))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(current_volume.ToInteger(volume))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetVolumeResult(NPT_SUCCESS, device, channel, volume, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetVolumeResult(NPT_FAILURE, device, "", 0, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnEventNotify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnEventNotify(PLT_Service* service,
+ NPT_List<PLT_StateVariable*>* vars)
+{
+ if (!service->GetDevice()->GetType().StartsWith("urn:schemas-upnp-org:device:MediaRenderer"))
+ return NPT_FAILURE;
+
+ if (!m_Delegate) return NPT_SUCCESS;
+
+ /* make sure device associated to service is still around */
+ PLT_DeviceDataReference data;
+ NPT_CHECK_WARNING(FindRenderer(service->GetDevice()->GetUUID(), data));
+
+ m_Delegate->OnMRStateVariablesChanged(service, vars);
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h
new file mode 100644
index 0000000..743c94f
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h
@@ -0,0 +1,349 @@
+/*****************************************************************
+|
+| Platinum - AV Media Controller (Media Renderer Control Point)
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_CONTROLLER_H_
+#define _PLT_MEDIA_CONTROLLER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltCtrlPoint.h"
+#include "PltMediaItem.h"
+
+/*----------------------------------------------------------------------
+| Defines
++---------------------------------------------------------------------*/
+typedef NPT_List<NPT_String> PLT_StringList;
+
+typedef struct {
+ PLT_StringList play_media;
+ PLT_StringList rec_media;
+ PLT_StringList rec_quality_modes;
+} PLT_DeviceCapabilities;
+
+typedef struct {
+ NPT_UInt32 num_tracks;
+ NPT_TimeStamp media_duration;
+ NPT_String cur_uri;
+ NPT_String cur_metadata;
+ NPT_String next_uri;
+ NPT_String next_metadata;
+ NPT_String play_medium;
+ NPT_String rec_medium;
+ NPT_String write_status;
+} PLT_MediaInfo;
+
+typedef struct {
+ NPT_UInt32 track;
+ NPT_TimeStamp track_duration;
+ NPT_String track_metadata;
+ NPT_String track_uri;
+ NPT_TimeStamp rel_time;
+ NPT_TimeStamp abs_time;
+ NPT_Int32 rel_count;
+ NPT_Int32 abs_count;
+} PLT_PositionInfo;
+
+typedef struct {
+ NPT_String cur_transport_state;
+ NPT_String cur_transport_status;
+ NPT_String cur_speed;
+} PLT_TransportInfo;
+
+typedef struct {
+ NPT_String play_mode;
+ NPT_String rec_quality_mode;
+} PLT_TransportSettings;
+
+typedef struct {
+ NPT_UInt32 rcs_id;
+ NPT_UInt32 avtransport_id;
+ NPT_String protocol_info;
+ NPT_String peer_connection_mgr;
+ NPT_UInt32 peer_connection_id;
+ NPT_String direction;
+ NPT_String status;
+} PLT_ConnectionInfo;
+
+/*----------------------------------------------------------------------
+| PLT_MediaControllerDelegate
++---------------------------------------------------------------------*/
+class PLT_MediaControllerDelegate
+{
+public:
+ virtual ~PLT_MediaControllerDelegate() {}
+
+ virtual bool OnMRAdded(PLT_DeviceDataReference& /* device */) { return true; }
+ virtual void OnMRRemoved(PLT_DeviceDataReference& /* device */) {}
+ virtual void OnMRStateVariablesChanged(PLT_Service* /* service */,
+ NPT_List<PLT_StateVariable*>* /* vars */) {}
+
+ // AVTransport
+ virtual void OnGetCurrentTransportActionsResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_StringList* /* actions */,
+ void* /* userdata */) {}
+
+ virtual void OnGetDeviceCapabilitiesResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_DeviceCapabilities* /* capabilities */,
+ void* /* userdata */) {}
+
+ virtual void OnGetMediaInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_MediaInfo* /* info */,
+ void* /* userdata */) {}
+
+ virtual void OnGetPositionInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_PositionInfo* /* info */,
+ void* /* userdata */) {}
+
+ virtual void OnGetTransportInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_TransportInfo* /* info */,
+ void* /* userdata */) {}
+
+ virtual void OnGetTransportSettingsResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_TransportSettings* /* settings */,
+ void* /* userdata */) {}
+
+ virtual void OnNextResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnPauseResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnPlayResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnPreviousResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnSeekResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnSetAVTransportURIResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnSetNextAVTransportURIResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnSetPlayModeResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnStopResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ // ConnectionManager
+ virtual void OnGetCurrentConnectionIDsResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_StringList* /* ids */,
+ void* /* userdata */) {}
+
+ virtual void OnGetCurrentConnectionInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_ConnectionInfo* /* info */,
+ void* /* userdata */) {}
+
+ virtual void OnGetProtocolInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_StringList* /* sources */,
+ PLT_StringList* /* sinks */,
+ void* /* userdata */) {}
+
+ // RenderingControl
+ virtual void OnSetMuteResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnGetMuteResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ const char* /* channel */,
+ bool /* mute */,
+ void* /* userdata */) {}
+
+ virtual void OnSetVolumeResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnGetVolumeResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ const char* /* channel */,
+ NPT_UInt32 /* volume */,
+ void* /* userdata */) {}
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaController
++---------------------------------------------------------------------*/
+class PLT_MediaController : public PLT_CtrlPointListener
+{
+public:
+ PLT_MediaController(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaControllerDelegate* delegate = NULL);
+ ~PLT_MediaController() override;
+
+ // public methods
+ virtual void SetDelegate(PLT_MediaControllerDelegate* delegate) {
+ m_Delegate = delegate;
+ }
+
+ // PLT_CtrlPointListener methods
+ NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device) override;
+ NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device) override;
+ NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata) override;
+ NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars) override;
+
+ // AVTransport
+ NPT_Result GetCurrentTransportActions(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetDeviceCapabilities(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetMediaInfo(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetPositionInfo(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetTransportInfo(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetTransportSettings(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result Next(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result Pause(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result Play(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, NPT_String speed, void* userdata);
+ NPT_Result Previous(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result Seek(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, NPT_String unit, NPT_String target, void* userdata);
+ bool CanSetNextAVTransportURI(PLT_DeviceDataReference& device);
+ NPT_Result SetAVTransportURI(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, const char* uri, const char* metadata, void* userdata);
+ NPT_Result SetNextAVTransportURI(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, const char* next_uri, const char* next_metadata, void* userdata);
+ NPT_Result SetPlayMode(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, NPT_String new_play_mode, void* userdata);
+ NPT_Result Stop(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+
+ // ConnectionManager
+ NPT_Result GetCurrentConnectionIDs(PLT_DeviceDataReference& device, void* userdata);
+ NPT_Result GetCurrentConnectionInfo(PLT_DeviceDataReference& device, NPT_UInt32 connection_id, void* userdata);
+ NPT_Result GetProtocolInfo(PLT_DeviceDataReference& device, void* userdata);
+
+ // RenderingControl
+ NPT_Result SetMute(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, const char* channel, bool mute, void* userdata);
+ NPT_Result GetMute(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, const char* channel, void* userdata);
+ NPT_Result SetVolume(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, const char* channel, int volume, void* userdata);
+ NPT_Result GetVolume(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, const char* channel, void* userdata);
+
+ // VariableStates
+ virtual NPT_Result GetProtocolInfoSink(const NPT_String& device_uuid, NPT_List<NPT_String>& sinks);
+ virtual NPT_Result GetTransportState(const NPT_String& device_uuid, NPT_String& state);
+ virtual NPT_Result GetVolumeState(const NPT_String& device_uuid, NPT_UInt32& volume);
+
+ // methods
+ virtual NPT_Result FindRenderer(const char* uuid, PLT_DeviceDataReference& device);
+ virtual NPT_Result FindMatchingProtocolInfo(NPT_List<NPT_String>& sinks, const char* protocol_info);
+ virtual NPT_Result FindBestResource(PLT_DeviceDataReference& device, PLT_MediaObject& item, NPT_Cardinal& resource_index);
+
+private:
+ NPT_Result InvokeActionWithInstance(PLT_ActionReference& action, NPT_UInt32 instance_id, void* userdata = NULL);
+
+ NPT_Result OnGetCurrentTransportActionsResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetDeviceCapabilitiesResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetMediaInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetPositionInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetTransportInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetTransportSettingsResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+
+ NPT_Result OnGetCurrentConnectionIDsResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetCurrentConnectionInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetProtocolInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+
+ NPT_Result OnGetMuteResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetVolumeResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+
+public:
+ static void ParseCSV(const char* csv, PLT_StringList& values) {
+ const char* start = csv;
+ const char* p = start;
+
+ // look for the , character
+ while (*p) {
+ if (*p == ',') {
+ NPT_String val(start, (int)(p-start));
+ val.Trim(' ');
+ values.Add(val);
+ start = p + 1;
+ }
+ p++;
+ }
+
+ // last one
+ NPT_String last(start, (int)(p-start));
+ last.Trim(' ');
+ if (last.GetLength()) {
+ values.Add(last);
+ }
+ }
+
+private:
+ PLT_CtrlPointReference m_CtrlPoint;
+ PLT_MediaControllerDelegate* m_Delegate;
+ NPT_Lock<PLT_DeviceDataReferenceList> m_MediaRenderers;
+};
+
+typedef NPT_Reference<PLT_MediaController> PLT_MediaControllerReference;
+
+#endif /* _PLT_MEDIA_CONTROLLER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp
new file mode 100644
index 0000000..88144f7
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp
@@ -0,0 +1,516 @@
+/*****************************************************************
+|
+| Platinum - AV Media Renderer Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaRenderer.h"
+#include "PltService.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.renderer")
+
+/*----------------------------------------------------------------------
+| external references
++---------------------------------------------------------------------*/
+extern NPT_UInt8 RDR_ConnectionManagerSCPD[];
+extern NPT_UInt8 RDR_AVTransportSCPD[];
+extern NPT_UInt8 RDR_RenderingControlSCPD[];
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::PLT_MediaRenderer
++---------------------------------------------------------------------*/
+PLT_MediaRenderer::PLT_MediaRenderer(const char* friendly_name,
+ bool show_ip /* = false */,
+ const char* uuid /* = NULL */,
+ unsigned int port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_DeviceHost("/",
+ uuid,
+ "urn:schemas-upnp-org:device:MediaRenderer:1",
+ friendly_name,
+ show_ip,
+ port,
+ port_rebind),
+ m_Delegate(NULL)
+{
+ m_ModelDescription = "Plutinosoft AV Media Renderer Device";
+ m_ModelName = "AV Renderer Device";
+ m_ModelURL = "http://www.plutinosoft.com/platinum";
+ m_DlnaDoc = "DMR-1.50";
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::~PLT_MediaRenderer
++---------------------------------------------------------------------*/
+PLT_MediaRenderer::~PLT_MediaRenderer()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::SetupServices
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::SetupServices()
+{
+ NPT_Reference<PLT_Service> service;
+
+ {
+ /* AVTransport */
+ service = new PLT_Service(
+ this,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "urn:upnp-org:serviceId:AVTransport",
+ "AVTransport",
+ "urn:schemas-upnp-org:metadata-1-0/AVT/");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_AVTransportSCPD));
+ NPT_CHECK_FATAL(AddService(service.AsPointer()));
+
+ service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f));
+ service->SetStateVariable("A_ARG_TYPE_InstanceID", "0");
+
+ // GetCurrentTransportActions
+ service->SetStateVariable("CurrentTransportActions", "Play,Pause,Stop,Seek,Next,Previous");
+
+ // GetDeviceCapabilities
+ service->SetStateVariable("PossiblePlaybackStorageMedia", "NONE,NETWORK,HDD,CD-DA,UNKNOWN");
+ service->SetStateVariable("PossibleRecordStorageMedia", "NOT_IMPLEMENTED");
+ service->SetStateVariable("PossibleRecordQualityModes", "NOT_IMPLEMENTED");
+
+ // GetMediaInfo
+ service->SetStateVariable("NumberOfTracks", "0");
+ service->SetStateVariable("CurrentMediaDuration", "00:00:00");
+ service->SetStateVariable("AVTransportURI", "");
+ service->SetStateVariable("AVTransportURIMetadata", "");;
+ service->SetStateVariable("NextAVTransportURI", "NOT_IMPLEMENTED");
+ service->SetStateVariable("NextAVTransportURIMetadata", "NOT_IMPLEMENTED");
+ service->SetStateVariable("PlaybackStorageMedium", "NONE");
+ service->SetStateVariable("RecordStorageMedium", "NOT_IMPLEMENTED");
+ service->SetStateVariable("RecordMediumWriteStatus", "NOT_IMPLEMENTED");
+
+ // GetPositionInfo
+ service->SetStateVariable("CurrentTrack", "0");
+ service->SetStateVariable("CurrentTrackDuration", "00:00:00");
+ service->SetStateVariable("CurrentTrackMetadata", "");
+ service->SetStateVariable("CurrentTrackURI", "");
+ service->SetStateVariable("RelativeTimePosition", "00:00:00");
+ service->SetStateVariable("AbsoluteTimePosition", "00:00:00");
+ service->SetStateVariable("RelativeCounterPosition", "2147483647"); // means NOT_IMPLEMENTED
+ service->SetStateVariable("AbsoluteCounterPosition", "2147483647"); // means NOT_IMPLEMENTED
+
+ // disable indirect eventing for certain state variables
+ PLT_StateVariable* var;
+ var = service->FindStateVariable("RelativeTimePosition");
+ if (var) var->DisableIndirectEventing();
+ var = service->FindStateVariable("AbsoluteTimePosition");
+ if (var) var->DisableIndirectEventing();
+ var = service->FindStateVariable("RelativeCounterPosition");
+ if (var) var->DisableIndirectEventing();
+ var = service->FindStateVariable("AbsoluteCounterPosition");
+ if (var) var->DisableIndirectEventing();
+
+ // GetTransportInfo
+ service->SetStateVariable("TransportState", "NO_MEDIA_PRESENT");
+ service->SetStateVariable("TransportStatus", "OK");
+ service->SetStateVariable("TransportPlaySpeed", "1");
+
+ // GetTransportSettings
+ service->SetStateVariable("CurrentPlayMode", "NORMAL");
+ service->SetStateVariable("CurrentRecordQualityMode", "NOT_IMPLEMENTED");
+
+ service.Detach();
+ service = NULL;
+ }
+
+ {
+ /* ConnectionManager */
+ service = new PLT_Service(
+ this,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "urn:upnp-org:serviceId:ConnectionManager",
+ "ConnectionManager");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_ConnectionManagerSCPD));
+ NPT_CHECK_FATAL(AddService(service.AsPointer()));
+
+ service->SetStateVariable("CurrentConnectionIDs", "0");
+
+ // put all supported mime types here instead
+ service->SetStateVariable("SinkProtocolInfo", "http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO,http-get:*:video/x-ms-asf:DLNA.ORG_PN=MPEG4_P2_ASF_SP_G726,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMDRM_WMABASE,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVSPLL_BASE,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC_XAC3,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMDRM_WMVSPLL_BASE,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVSPML_BASE,http-get:*:video/x-ms-asf:DLNA.ORG_PN=MPEG4_P2_ASF_ASP_L5_SO_G726,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL_XAC3,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAPRO,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN,http-get:*:video/x-ms-asf:DLNA.ORG_PN=MPEG4_P2_ASF_ASP_L4_SO_G726,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3X,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVSPML_MP3,http-get:*:video/x-ms-wmv:*");
+ service->SetStateVariable("SourceProtocolInfo", "");
+
+ service.Detach();
+ service = NULL;
+ }
+
+ {
+ /* RenderingControl */
+ service = new PLT_Service(
+ this,
+ "urn:schemas-upnp-org:service:RenderingControl:1",
+ "urn:upnp-org:serviceId:RenderingControl",
+ "RenderingControl",
+ "urn:schemas-upnp-org:metadata-1-0/RCS/");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_RenderingControlSCPD));
+ NPT_CHECK_FATAL(AddService(service.AsPointer()));
+
+ service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f));
+
+ service->SetStateVariable("Mute", "0");
+ service->SetStateVariableExtraAttribute("Mute", "Channel", "Master");
+ service->SetStateVariable("Volume", "100");
+ service->SetStateVariableExtraAttribute("Volume", "Channel", "Master");
+ service->SetStateVariable("VolumeDB", "0");
+ service->SetStateVariableExtraAttribute("VolumeDB", "Channel", "Master");
+
+ service->SetStateVariable("PresetNameList", "FactoryDefaults");
+
+ service.Detach();
+ service = NULL;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ /* parse the action name */
+ NPT_String name = action->GetActionDesc().GetName();
+
+ // since all actions take an instance ID and we only support 1 instance
+ // verify that the Instance ID is 0 and return an error here now if not
+ NPT_String serviceType = action->GetActionDesc().GetService()->GetServiceType();
+ if (serviceType.Compare("urn:schemas-upnp-org:service:AVTransport:1", true) == 0) {
+ if (NPT_FAILED(action->VerifyArgumentValue("InstanceID", "0"))) {
+ action->SetError(718, "Not valid InstanceID");
+ return NPT_FAILURE;
+ }
+ }
+ serviceType = action->GetActionDesc().GetService()->GetServiceType();
+ if (serviceType.Compare("urn:schemas-upnp-org:service:RenderingControl:1", true) == 0) {
+ if (NPT_FAILED(action->VerifyArgumentValue("InstanceID", "0"))) {
+ action->SetError(702, "Not valid InstanceID");
+ return NPT_FAILURE;
+ }
+ }
+
+ /* Is it a ConnectionManager Service Action ? */
+ if (name.Compare("GetCurrentConnectionInfo", true) == 0) {
+ return OnGetCurrentConnectionInfo(action);
+ }
+
+ /* Is it a AVTransport Service Action ? */
+ if (name.Compare("Next", true) == 0) {
+ return OnNext(action);
+ }
+ if (name.Compare("Pause", true) == 0) {
+ return OnPause(action);
+ }
+ if (name.Compare("Play", true) == 0) {
+ return OnPlay(action);
+ }
+ if (name.Compare("Previous", true) == 0) {
+ return OnPrevious(action);
+ }
+ if (name.Compare("Seek", true) == 0) {
+ return OnSeek(action);
+ }
+ if (name.Compare("Stop", true) == 0) {
+ return OnStop(action);
+ }
+ if (name.Compare("SetAVTransportURI", true) == 0) {
+ return OnSetAVTransportURI(action);
+ }
+ if (name.Compare("SetNextAVTransportURI", true) == 0) {
+ return OnSetNextAVTransportURI(action);
+ }
+ if (name.Compare("SetPlayMode", true) == 0) {
+ return OnSetPlayMode(action);
+ }
+
+ /* Is it a RendererControl Service Action ? */
+ if (name.Compare("SetVolume", true) == 0) {
+ return OnSetVolume(action);
+ }
+ if (name.Compare("SetVolumeDB", true) == 0) {
+ return OnSetVolumeDB(action);
+ }
+ if (name.Compare("GetVolumeDBRange", true) == 0) {
+ return OnGetVolumeDBRange(action);
+
+ }
+ if (name.Compare("SetMute", true) == 0) {
+ return OnSetMute(action);
+ }
+
+ // other actions rely on state variables
+ NPT_CHECK_LABEL_WARNING(action->SetArgumentsOutFromStateVariable(), failure);
+ return NPT_SUCCESS;
+
+failure:
+ action->SetError(401,"No Such Action.");
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnGetCurrentConnectionInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnGetCurrentConnectionInfo(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnGetCurrentConnectionInfo(action);
+ }
+
+ if (NPT_FAILED(action->VerifyArgumentValue("ConnectionID", "0"))) {
+ action->SetError(706,"No Such Connection.");
+ return NPT_FAILURE;
+ }
+
+ if (NPT_FAILED(action->SetArgumentValue("RcsID", "0"))){
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("AVTransportID", "0"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentOutFromStateVariable("ProtocolInfo"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("PeerConnectionManager", "/"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("PeerConnectionID", "-1"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("Direction", "Input"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("Status", "Unknown"))) {
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnNext
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnNext(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnNext(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnPause
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnPause(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnPause(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnPlay
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnPlay(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnPlay(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnPrevious
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnPrevious(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnPrevious(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSeek
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSeek(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnSeek(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnStop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnStop(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnStop(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSetAVTransportURI
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetAVTransportURI(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnSetAVTransportURI(action);
+ }
+
+ // default implementation is using state variable
+ NPT_String uri;
+ NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURI", uri));
+
+ NPT_String metadata;
+ NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURIMetaData", metadata));
+
+ PLT_Service* serviceAVT;
+ NPT_CHECK_WARNING(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceAVT));
+
+ // update service state variables
+ serviceAVT->SetStateVariable("AVTransportURI", uri);
+ serviceAVT->SetStateVariable("AVTransportURIMetaData", metadata);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+ | PLT_MediaRenderer::OnSetAVTransportURI
+ +---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetNextAVTransportURI(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnSetNextAVTransportURI(action);
+ }
+
+ // default implementation is using state variable
+ NPT_String uri;
+ NPT_CHECK_WARNING(action->GetArgumentValue("NextURI", uri));
+
+ NPT_String metadata;
+ NPT_CHECK_WARNING(action->GetArgumentValue("NextURIMetaData", metadata));
+
+ PLT_Service* serviceAVT;
+ NPT_CHECK_WARNING(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceAVT));
+
+ // update service state variables
+ serviceAVT->SetStateVariable("NextAVTransportURI", uri);
+ serviceAVT->SetStateVariable("NextAVTransportURIMetaData", metadata);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSetPlayMode
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetPlayMode(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnSetPlayMode(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSetVolume
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetVolume(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnSetVolume(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSetVolumeDB
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetVolumeDB(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnSetVolumeDB(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnGetVolumeDBRange
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnGetVolumeDBRange(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnGetVolumeDBRange(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSetMute
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetMute(PLT_ActionReference& action)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnSetMute(action);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h
new file mode 100644
index 0000000..ec30a36
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h
@@ -0,0 +1,119 @@
+/*****************************************************************
+|
+| Platinum - AV Media Renderer Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_RENDERER_H_
+#define _PLT_MEDIA_RENDERER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDeviceHost.h"
+
+/*----------------------------------------------------------------------
+| PLT_MediaRendererDelegate
++---------------------------------------------------------------------*/
+class PLT_MediaRendererDelegate
+{
+public:
+ virtual ~PLT_MediaRendererDelegate() {}
+
+ // ConnectionManager
+ virtual NPT_Result OnGetCurrentConnectionInfo(PLT_ActionReference& action) = 0;
+
+ // AVTransport
+ virtual NPT_Result OnNext(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnPause(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnPlay(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnPrevious(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSeek(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnStop(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetAVTransportURI(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetNextAVTransportURI(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetPlayMode(PLT_ActionReference& action) = 0;
+
+ // RenderingControl
+ virtual NPT_Result OnSetVolume(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetVolumeDB(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnGetVolumeDBRange(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetMute(PLT_ActionReference& action) = 0;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer
++---------------------------------------------------------------------*/
+class PLT_MediaRenderer : public PLT_DeviceHost
+{
+public:
+ PLT_MediaRenderer(const char* friendly_name,
+ bool show_ip = false,
+ const char* uuid = NULL,
+ unsigned int port = 0,
+ bool port_rebind = false);
+ // methods
+ virtual void SetDelegate(PLT_MediaRendererDelegate* delegate) { m_Delegate = delegate; }
+
+ // PLT_DeviceHost methods
+ NPT_Result SetupServices() override;
+ NPT_Result OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context) override;
+
+protected:
+ ~PLT_MediaRenderer() override;
+
+ // PLT_MediaRendererInterface methods
+ // ConnectionManager
+ virtual NPT_Result OnGetCurrentConnectionInfo(PLT_ActionReference& action);
+
+ // AVTransport
+ virtual NPT_Result OnNext(PLT_ActionReference& action);
+ virtual NPT_Result OnPause(PLT_ActionReference& action);
+ virtual NPT_Result OnPlay(PLT_ActionReference& action);
+ virtual NPT_Result OnPrevious(PLT_ActionReference& action);
+ virtual NPT_Result OnSeek(PLT_ActionReference& action);
+ virtual NPT_Result OnStop(PLT_ActionReference& action);
+ virtual NPT_Result OnSetAVTransportURI(PLT_ActionReference& action);
+ virtual NPT_Result OnSetNextAVTransportURI(PLT_ActionReference& action);
+ virtual NPT_Result OnSetPlayMode(PLT_ActionReference& action);
+
+ // RenderingControl
+ virtual NPT_Result OnSetVolume(PLT_ActionReference& action);
+ virtual NPT_Result OnSetVolumeDB(PLT_ActionReference &action);
+ virtual NPT_Result OnGetVolumeDBRange(PLT_ActionReference &action);
+ virtual NPT_Result OnSetMute(PLT_ActionReference& action);
+
+private:
+ PLT_MediaRendererDelegate* m_Delegate;
+};
+
+#endif /* _PLT_MEDIA_RENDERER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.cpp
new file mode 100644
index 0000000..4cc0e02
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.cpp
@@ -0,0 +1,257 @@
+/*****************************************************************
+|
+| Platinum - ConnectionManager SCPD
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 RDR_ConnectionManagerSCPD[] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x27, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A,
+ 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E,
+ 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65,
+ 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x6E,
+ 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E,
+ 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+ 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49,
+ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x6F, 0x74, 0x6F,
+ 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x65, 0x65, 0x72,
+ 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E,
+ 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43,
+ 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63,
+ 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6F, 0x74,
+ 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x69, 0x6E,
+ 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x69, 0x6E, 0x6B, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63,
+ 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49,
+ 0x44, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69,
+ 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
+ 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F,
+ 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F,
+ 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x74, 0x61,
+ 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4F, 0x4B, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x46, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x4D, 0x69, 0x73, 0x6D, 0x61, 0x74, 0x63,
+ 0x68, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6E, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x55, 0x6E, 0x72, 0x65, 0x6C, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65,
+ 0x6C, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x55, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F,
+ 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
+ 0x45, 0x5F, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
+ 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
+ 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E,
+ 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x79, 0x65, 0x73, 0x27, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x69, 0x6E, 0x6B, 0x50, 0x72,
+ 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E,
+ 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+ 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x49, 0x6E, 0x70, 0x75, 0x74,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x4F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27,
+ 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43,
+ 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x0D, 0x0A, 0x00
+};
+
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.xml b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.xml
new file mode 100644
index 0000000..9545801
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scpd xmlns='urn:schemas-upnp-org:service-1-0'>
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <actionList>
+ <action>
+ <name>GetCurrentConnectionInfo</name>
+ <argumentList>
+ <argument>
+ <name>ConnectionID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_ConnectionID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RcsID</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_RcsID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>AVTransportID</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_AVTransportID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>ProtocolInfo</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_ProtocolInfo</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PeerConnectionManager</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_ConnectionManager</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PeerConnectionID</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_ConnectionID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Direction</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Direction</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Status</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_ConnectionStatus</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetProtocolInfo</name>
+ <argumentList>
+ <argument>
+ <name>Source</name>
+ <direction>out</direction>
+ <relatedStateVariable>SourceProtocolInfo</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Sink</name>
+ <direction>out</direction>
+ <relatedStateVariable>SinkProtocolInfo</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetCurrentConnectionIDs</name>
+ <argumentList>
+ <argument>
+ <name>ConnectionIDs</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentConnectionIDs</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_ProtocolInfo</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_ConnectionStatus</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>OK</allowedValue>
+ <allowedValue>ContentFormatMismatch</allowedValue>
+ <allowedValue>InsufficientBandwidth</allowedValue>
+ <allowedValue>UnreliableChannel</allowedValue>
+ <allowedValue>Unknown</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_AVTransportID</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_RcsID</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_ConnectionID</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_ConnectionManager</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='yes'>
+ <name>SourceProtocolInfo</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='yes'>
+ <name>SinkProtocolInfo</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_Direction</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>Input</allowedValue>
+ <allowedValue>Output</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents='yes'>
+ <name>CurrentConnectionIDs</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ </serviceStateTable>
+</scpd>
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.cpp
new file mode 100644
index 0000000..a01b1c9
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.cpp
@@ -0,0 +1,434 @@
+/*****************************************************************
+|
+| Platinum - RenderingControl SCPD
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 RDR_RenderingControlSCPD[7748] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72,
+ 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E,
+ 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69,
+ 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x47, 0x65, 0x74, 0x4D, 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73,
+ 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x75, 0x74,
+ 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4D, 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65,
+ 0x74, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+ 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x56, 0x6F, 0x6C, 0x75, 0x6D,
+ 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x47, 0x65, 0x74, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49,
+ 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x56,
+ 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65,
+ 0x44, 0x42, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x52, 0x61, 0x6E,
+ 0x67, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E,
+ 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x4D, 0x69, 0x6E, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x4D, 0x61, 0x78, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4C, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x73,
+ 0x65, 0x74, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
+ 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x4C, 0x69, 0x73, 0x74,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72,
+ 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x4D, 0x75, 0x74, 0x65, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68,
+ 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4D, 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4D,
+ 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E,
+ 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73,
+ 0x69, 0x72, 0x65, 0x64, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56, 0x6F,
+ 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73,
+ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4C, 0x61, 0x73, 0x74, 0x43, 0x68,
+ 0x61, 0x6E, 0x67, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E,
+ 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4D, 0x61, 0x73, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E,
+ 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
+ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32,
+ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69,
+ 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30,
+ 0x30, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+ 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4D, 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x62, 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E,
+ 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x46, 0x61, 0x63, 0x74,
+ 0x6F, 0x72, 0x79, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x73, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x46,
+ 0x61, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x73, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+ 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x56,
+ 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x32, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D,
+ 0x3E, 0x2D, 0x33, 0x32, 0x37, 0x36, 0x37, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E,
+ 0x33, 0x32, 0x37, 0x36, 0x37, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
+};
+
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.xml b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.xml
new file mode 100644
index 0000000..c5e9d29
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.xml
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <actionList>
+ <action>
+ <name>GetMute</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentMute</name>
+ <direction>out</direction>
+ <relatedStateVariable>Mute</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetVolume</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentVolume</name>
+ <direction>out</direction>
+ <relatedStateVariable>Volume</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetVolumeDB</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentVolume</name>
+ <direction>out</direction>
+ <relatedStateVariable>VolumeDB</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetVolumeDBRange</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>MinValue</name>
+ <direction>out</direction>
+ <relatedStateVariable>VolumeDB</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>MaxValue</name>
+ <direction>out</direction>
+ <relatedStateVariable>VolumeDB</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>ListPresets</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentPresetNameList</name>
+ <direction>out</direction>
+ <relatedStateVariable>PresetNameList</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SelectPreset</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PresetName</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_PresetName</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetMute</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredMute</name>
+ <direction>in</direction>
+ <relatedStateVariable>Mute</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetVolume</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredVolume</name>
+ <direction>in</direction>
+ <relatedStateVariable>Volume</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents="yes">
+ <name>LastChange</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Channel</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>Master</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_InstanceID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>Volume</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>Mute</name>
+ <dataType>boolean</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PresetNameList</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>FactoryDefaults</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_PresetName</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>FactoryDefaults</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>VolumeDB</name>
+ <dataType>i2</dataType>
+ <allowedValueRange>
+ <minimum>-32767</minimum>
+ <maximum>32767</maximum>
+ </allowedValueRange>
+ </stateVariable>
+ </serviceStateTable>
+</scpd> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD_Full.xml b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD_Full.xml
new file mode 100644
index 0000000..59af0fd
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD_Full.xml
@@ -0,0 +1,749 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <actionList>
+ <action>
+ <name>GetBlueVideoBlackLevel</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentBlueVideoBlackLevel</name>
+ <direction>out</direction>
+ <relatedStateVariable>BlueVideoBlackLevel</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetBlueVideoGain</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentBlueVideoGain</name>
+ <direction>out</direction>
+ <relatedStateVariable>BlueVideoGain</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetBrightness</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentBrightness</name>
+ <direction>out</direction>
+ <relatedStateVariable>Brightness</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetColorTemperature</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentColorTemperature</name>
+ <direction>out</direction>
+ <relatedStateVariable>ColorTemperature</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetContrast</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentContrast</name>
+ <direction>out</direction>
+ <relatedStateVariable>Contrast</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetGreenVideoBlackLevel</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentGreenVideoBlackLevel</name>
+ <direction>out</direction>
+ <relatedStateVariable>GreenVideoBlackLevel</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetGreenVideoGain</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentGreenVideoGain</name>
+ <direction>out</direction>
+ <relatedStateVariable>GreenVideoGain</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetHorizontalKeystone</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentHorizontalKeystone</name>
+ <direction>out</direction>
+ <relatedStateVariable>HorizontalKeystone</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetLoudness</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentLoudness</name>
+ <direction>out</direction>
+ <relatedStateVariable>Loudness</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetMute</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentMute</name>
+ <direction>out</direction>
+ <relatedStateVariable>Mute</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetRedVideoBlackLevel</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentRedVideoBlackLevel</name>
+ <direction>out</direction>
+ <relatedStateVariable>RedVideoBlackLevel</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetRedVideoGain</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentRedVideoGain</name>
+ <direction>out</direction>
+ <relatedStateVariable>RedVideoGain</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetSharpness</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentSharpness</name>
+ <direction>out</direction>
+ <relatedStateVariable>Sharpness</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetVerticalKeystone</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentVerticalKeystone</name>
+ <direction>out</direction>
+ <relatedStateVariable>VerticalKeystone</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetVolume</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentVolume</name>
+ <direction>out</direction>
+ <relatedStateVariable>Volume</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetVolumeDB</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentVolume</name>
+ <direction>out</direction>
+ <relatedStateVariable>VolumeDB</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetVolumeDBRange</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>MinValue</name>
+ <direction>out</direction>
+ <relatedStateVariable>VolumeDB</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>MaxValue</name>
+ <direction>out</direction>
+ <relatedStateVariable>VolumeDB</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>ListPresets</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentPresetNameList</name>
+ <direction>out</direction>
+ <relatedStateVariable>PresetNameList</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SelectPreset</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PresetName</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_PresetName</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetBlueVideoBlackLevel</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredBlueVideoBlackLevel</name>
+ <direction>in</direction>
+ <relatedStateVariable>BlueVideoBlackLevel</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetBlueVideoGain</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredBlueVideoGain</name>
+ <direction>in</direction>
+ <relatedStateVariable>BlueVideoGain</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetBrightness</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredBrightness</name>
+ <direction>in</direction>
+ <relatedStateVariable>Brightness</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetColorTemperature</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredColorTemperature</name>
+ <direction>in</direction>
+ <relatedStateVariable>ColorTemperature</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetContrast</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredContrast</name>
+ <direction>in</direction>
+ <relatedStateVariable>Contrast</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetGreenVideoBlackLevel</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredGreenVideoBlackLevel</name>
+ <direction>in</direction>
+ <relatedStateVariable>GreenVideoBlackLevel</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetGreenVideoGain</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredGreenVideoGain</name>
+ <direction>in</direction>
+ <relatedStateVariable>GreenVideoGain</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetHorizontalKeystone</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredHorizontalKeystone</name>
+ <direction>in</direction>
+ <relatedStateVariable>HorizontalKeystone</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetLoudness</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredLoudness</name>
+ <direction>in</direction>
+ <relatedStateVariable>Loudness</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetMute</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredMute</name>
+ <direction>in</direction>
+ <relatedStateVariable>Mute</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetRedVideoBlackLevel</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredRedVideoBlackLevel</name>
+ <direction>in</direction>
+ <relatedStateVariable>RedVideoBlackLevel</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetRedVideoGain</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredRedVideoGain</name>
+ <direction>in</direction>
+ <relatedStateVariable>RedVideoGain</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetSharpness</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredSharpness</name>
+ <direction>in</direction>
+ <relatedStateVariable>Sharpness</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetVerticalKeystone</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredVerticalKeystone</name>
+ <direction>in</direction>
+ <relatedStateVariable>VerticalKeystone</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetVolume</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredVolume</name>
+ <direction>in</direction>
+ <relatedStateVariable>Volume</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>SetVolumeDB</name>
+ <argumentList>
+ <argument>
+ <name>InstanceID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Channel</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>DesiredVolume</name>
+ <direction>in</direction>
+ <relatedStateVariable>VolumeDB</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents="no">
+ <name>VerticalKeystone</name>
+ <dataType>i2</dataType>
+ <allowedValueRange>
+ <minimum>-32768</minimum>
+ <maximum>32767</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>LastChange</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Channel</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>Master</allowedValue>
+ <allowedValue>LF</allowedValue>
+ <allowedValue>RF</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>Loudness</name>
+ <dataType>boolean</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>HorizontalKeystone</name>
+ <dataType>i2</dataType>
+ <allowedValueRange>
+ <minimum>-32768</minimum>
+ <maximum>32767</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_InstanceID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>BlueVideoBlackLevel</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RedVideoGain</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>GreenVideoBlackLevel</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>Volume</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>Mute</name>
+ <dataType>boolean</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>Brightness</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>PresetNameList</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_PresetName</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>FactoryDefaults</allowedValue>
+ <allowedValue>InstallationDefaults</allowedValue>
+ <allowedValue>Vendor defined</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>ColorTemperature</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>65535</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>VolumeDB</name>
+ <dataType>i2</dataType>
+ <allowedValueRange>
+ <minimum>-32768</minimum>
+ <maximum>32767</maximum>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>Contrast</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>GreenVideoGain</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>RedVideoBlackLevel</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>BlueVideoGain</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>Sharpness</name>
+ <dataType>ui2</dataType>
+ <allowedValueRange>
+ <minimum>0</minimum>
+ <maximum>100</maximum>
+ <step>1</step>
+ </allowedValueRange>
+ </stateVariable>
+ </serviceStateTable>
+</scpd> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/process_scpds.sh b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/process_scpds.sh
new file mode 100644
index 0000000..07d5056
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/process_scpds.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+set -x
+
+# abort on any errors
+set -e
+
+# AVTransport
+../../../Targets/x86-unknown-cygwin/Debug/TextToHeader.exe -v RDR_AVTransportSCPD -h AVTransport AVTransportSCPD.xml AVTransportSCPD.cpp
+
+# Rendering Control
+../../../Targets/x86-unknown-cygwin/Debug/TextToHeader.exe -v RDR_RenderingControlSCPD -h RenderingControl RenderingControlSCPD.xml RenderingControlSCPD.cpp
+
+# ConnectionManager
+../../../Targets/x86-unknown-cygwin/Debug/TextToHeader.exe -v RDR_ConnectionManagerSCPD -h ConnectionManager ConnectionManagerSCPD.xml RdrConnectionManagerSCPD.cpp \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.cpp
new file mode 100644
index 0000000..973b3b1
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.cpp
@@ -0,0 +1,262 @@
+/*****************************************************************
+|
+| Platinum - ConnectionManager SCPD
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP Service SCPD for urn:schemas-upnp-org:service:ConnectionManager:1
+ */
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 MS_ConnectionManagerSCPD[4216] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x27, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A,
+ 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E,
+ 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65,
+ 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x6E,
+ 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E,
+ 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+ 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49,
+ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x6F, 0x74, 0x6F,
+ 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x65, 0x65, 0x72,
+ 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E,
+ 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43,
+ 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63,
+ 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6F, 0x74,
+ 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x69, 0x6E,
+ 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x69, 0x6E, 0x6B, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63,
+ 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49,
+ 0x44, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69,
+ 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
+ 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F,
+ 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F,
+ 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x74, 0x61,
+ 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4F, 0x4B, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x46, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x4D, 0x69, 0x73, 0x6D, 0x61, 0x74, 0x63,
+ 0x68, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6E, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x55, 0x6E, 0x72, 0x65, 0x6C, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65,
+ 0x6C, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x55, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F,
+ 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
+ 0x45, 0x5F, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
+ 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
+ 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E,
+ 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x79, 0x65, 0x73, 0x27, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x69, 0x6E, 0x6B, 0x50, 0x72,
+ 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E,
+ 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+ 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x49, 0x6E, 0x70, 0x75, 0x74,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x4F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27,
+ 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43,
+ 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x0D, 0x0A, 0x00
+};
+
+/** @} */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.xml b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.xml
new file mode 100644
index 0000000..9545801
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scpd xmlns='urn:schemas-upnp-org:service-1-0'>
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <actionList>
+ <action>
+ <name>GetCurrentConnectionInfo</name>
+ <argumentList>
+ <argument>
+ <name>ConnectionID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_ConnectionID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RcsID</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_RcsID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>AVTransportID</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_AVTransportID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>ProtocolInfo</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_ProtocolInfo</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PeerConnectionManager</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_ConnectionManager</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>PeerConnectionID</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_ConnectionID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Direction</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Direction</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Status</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_ConnectionStatus</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetProtocolInfo</name>
+ <argumentList>
+ <argument>
+ <name>Source</name>
+ <direction>out</direction>
+ <relatedStateVariable>SourceProtocolInfo</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Sink</name>
+ <direction>out</direction>
+ <relatedStateVariable>SinkProtocolInfo</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetCurrentConnectionIDs</name>
+ <argumentList>
+ <argument>
+ <name>ConnectionIDs</name>
+ <direction>out</direction>
+ <relatedStateVariable>CurrentConnectionIDs</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_ProtocolInfo</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_ConnectionStatus</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>OK</allowedValue>
+ <allowedValue>ContentFormatMismatch</allowedValue>
+ <allowedValue>InsufficientBandwidth</allowedValue>
+ <allowedValue>UnreliableChannel</allowedValue>
+ <allowedValue>Unknown</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_AVTransportID</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_RcsID</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_ConnectionID</name>
+ <dataType>i4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_ConnectionManager</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='yes'>
+ <name>SourceProtocolInfo</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='yes'>
+ <name>SinkProtocolInfo</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents='no'>
+ <name>A_ARG_TYPE_Direction</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>Input</allowedValue>
+ <allowedValue>Output</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents='yes'>
+ <name>CurrentConnectionIDs</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ </serviceStateTable>
+</scpd>
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.cpp
new file mode 100644
index 0000000..03f0924
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.cpp
@@ -0,0 +1,267 @@
+/*****************************************************************
+|
+| Platinum - ContentDirectory SCPD
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 MS_ContentDirectorySCPD[4409] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A,
+ 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69,
+ 0x6E, 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x42,
+ 0x72, 0x6F, 0x77, 0x73, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4F, 0x62,
+ 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65,
+ 0x78, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6F, 0x75,
+ 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69,
+ 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E,
+ 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F,
+ 0x72, 0x74, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x72,
+ 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55,
+ 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x49, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61,
+ 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x65, 0x72,
+ 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
+ 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C,
+ 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77,
+ 0x73, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x43, 0x68, 0x69, 0x6C, 0x64, 0x72, 0x65, 0x6E, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+ 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
+ 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F,
+ 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F,
+ 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
+ 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72,
+ 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75,
+ 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x55, 0x70, 0x64,
+ 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+ 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43,
+ 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+ 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74,
+ 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x3C,
+ 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
+};
+
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.xml b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.xml
new file mode 100644
index 0000000..9605f91
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.xml
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <actionList>
+ <action>
+ <name>Browse</name>
+ <argumentList>
+ <argument>
+ <name>ObjectID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_ObjectID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>BrowseFlag</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_BrowseFlag</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Filter</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Filter</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>StartingIndex</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Index</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RequestedCount</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>SortCriteria</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_SortCriteria</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Result</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NumberReturned</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>TotalMatches</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>UpdateID</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_UpdateID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetSortCapabilities</name>
+ <argumentList>
+ <argument>
+ <name>SortCaps</name>
+ <direction>out</direction>
+ <relatedStateVariable>SortCapabilities</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetSystemUpdateID</name>
+ <argumentList>
+ <argument>
+ <name>Id</name>
+ <direction>out</direction>
+ <relatedStateVariable>SystemUpdateID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetSearchCapabilities</name>
+ <argumentList>
+ <argument>
+ <name>SearchCaps</name>
+ <direction>out</direction>
+ <relatedStateVariable>SearchCapabilities</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_BrowseFlag</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>BrowseMetadata</allowedValue>
+ <allowedValue>BrowseDirectChildren</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>ContainerUpdateIDs</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>SystemUpdateID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Count</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_SortCriteria</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>SortCapabilities</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Index</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_ObjectID</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_UpdateID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Result</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>SearchCapabilities</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Filter</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ </serviceStateTable>
+</scpd> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp
new file mode 100644
index 0000000..bc16048
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp
@@ -0,0 +1,453 @@
+/*****************************************************************
+|
+| Platinum - ContentDirectory SCPD
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 MS_ContentDirectorywSearchSCPD[8121] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
+0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68, 0x65,
+0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E,
+0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E,
+0x20, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E,
+0x20, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x3C,
+0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F,
+0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x3C, 0x2F, 0x6E,
+0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09,
+0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C,
+0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44,
+0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
+0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+0x61, 0x6D, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E,
+0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72,
+0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61,
+0x67, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C,
+0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A,
+0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09,
+0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
+0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74,
+0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A,
+0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
+0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
+0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71,
+0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A,
+0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
+0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
+0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72,
+0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
+0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F,
+0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09,
+0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
+0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
+0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62,
+0x65, 0x72, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09,
+0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
+0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
+0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x6F, 0x74,
+0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
+0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
+0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
+0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61,
+0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69,
+0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
+0x45, 0x5F, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F,
+0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
+0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+0x47, 0x65, 0x74, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C,
+0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x73,
+0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C,
+0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C,
+0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74,
+0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09,
+0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
+0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x79,
+0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
+0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72,
+0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
+0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C,
+0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
+0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
+0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65,
+0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
+0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
+0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x65, 0x61,
+0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A,
+0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09,
+0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3C, 0x2F, 0x6E, 0x61,
+0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C,
+0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F,
+0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x61,
+0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74,
+0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43,
+0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65,
+0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72,
+0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x52, 0x65,
+0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C,
+0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+0x61, 0x6D, 0x65, 0x3E, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61,
+0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
+0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+0x5F, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74,
+0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4F, 0x62, 0x6A, 0x65,
+0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C,
+0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
+0x65, 0x6E, 0x74, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x54, 0x61,
+0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x77, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3C, 0x2F,
+0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+0x54, 0x59, 0x50, 0x45, 0x5F, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C, 0x2F, 0x72,
+0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65,
+0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E,
+0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A,
+0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
+0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61,
+0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x4D, 0x65,
+0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x43, 0x68, 0x69, 0x6C, 0x64, 0x72, 0x65,
+0x6E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
+0x09, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A,
+0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49,
+0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09,
+0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
+0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
+0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C,
+0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
+0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61,
+0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69,
+0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74,
+0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74,
+0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C,
+0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A,
+0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09,
+0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43,
+0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+0x62, 0x6C, 0x65, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61,
+0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
+0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61,
+0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
+0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
+0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09, 0x09,
+0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62,
+0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
+0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
+0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09,
+0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52,
+0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61,
+0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09,
+0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69,
+0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
+0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
+0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+0x54, 0x61, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
+0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
+0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x0A,
+0x00
+};
+
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml
new file mode 100644
index 0000000..cba42e5
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <actionList>
+ <action>
+ <name>Browse</name>
+ <argumentList>
+ <argument>
+ <name>ObjectID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_ObjectID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>BrowseFlag</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_BrowseFlag</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Filter</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Filter</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>StartingIndex</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Index</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RequestedCount</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>SortCriteria</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_SortCriteria</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Result</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NumberReturned</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>TotalMatches</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>UpdateID</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_UpdateID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetSortCapabilities</name>
+ <argumentList>
+ <argument>
+ <name>SortCaps</name>
+ <direction>out</direction>
+ <relatedStateVariable>SortCapabilities</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetSystemUpdateID</name>
+ <argumentList>
+ <argument>
+ <name>Id</name>
+ <direction>out</direction>
+ <relatedStateVariable>SystemUpdateID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetSearchCapabilities</name>
+ <argumentList>
+ <argument>
+ <name>SearchCaps</name>
+ <direction>out</direction>
+ <relatedStateVariable>SearchCapabilities</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>Search</name>
+ <argumentList>
+ <argument>
+ <name>ContainerID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_ObjectID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>SearchCriteria</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_SearchCriteria</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Filter</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Filter</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>StartingIndex</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Index</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>RequestedCount</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>SortCriteria</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_SortCriteria</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>Result</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NumberReturned</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>TotalMatches</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>UpdateID</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_UpdateID</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>UpdateObject</name>
+ <argumentList>
+ <argument>
+ <name>ObjectID</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_ObjectID</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>CurrentTagValue</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_TagValueList</relatedStateVariable>
+ </argument>
+ <argument>
+ <name>NewTagValue</name>
+ <direction>in</direction>
+ <relatedStateVariable>A_ARG_TYPE_TagValueList</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_BrowseFlag</name>
+ <dataType>string</dataType>
+ <allowedValueList>
+ <allowedValue>BrowseMetadata</allowedValue>
+ <allowedValue>BrowseDirectChildren</allowedValue>
+ </allowedValueList>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>ContainerUpdateIDs</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="yes">
+ <name>SystemUpdateID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Count</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_SortCriteria</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_SearchCriteria</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>SortCapabilities</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Index</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_ObjectID</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_UpdateID</name>
+ <dataType>ui4</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Result</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>SearchCapabilities</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_Filter</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ <stateVariable sendEvents="no">
+ <name>A_ARG_TYPE_TagValueList</name>
+ <dataType>string</dataType>
+ </stateVariable>
+ </serviceStateTable>
+</scpd>
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
new file mode 100644
index 0000000..37d36dd
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
@@ -0,0 +1,406 @@
+/*****************************************************************
+|
+| Platinum - DIDL
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDidl.h"
+#include "PltUtilities.h"
+#include "PltService.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.didl")
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+const char* didl_header = "<DIDL-Lite xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\""
+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\""
+ " xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\""
+ " xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\""
+ " xmlns:sec=\"http://www.sec.co.kr/\""
+ " xmlns:xbmc=\"urn:schemas-xbmc-org:metadata-1-0/\">";
+const char* didl_footer = "</DIDL-Lite>";
+const char* didl_namespace_dc = "http://purl.org/dc/elements/1.1/";
+const char* didl_namespace_upnp = "urn:schemas-upnp-org:metadata-1-0/upnp/";
+const char* didl_namespace_dlna = "urn:schemas-dlna-org:metadata-1-0/";
+const char* didl_namespace_xbmc = "urn:schemas-xbmc-org:metadata-1-0/";
+
+/*----------------------------------------------------------------------
+| PLT_Didl::ConvertFilterToMask
++---------------------------------------------------------------------*/
+NPT_UInt64
+PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+{
+ // easy out
+ if (filter.GetLength() == 0) return PLT_FILTER_MASK_ALL;
+
+ // a filter string is a comma delimited set of fields identifying
+ // a given DIDL property (or set of properties).
+ // These fields are or start with: upnp:, @, res@, res, dc:, container@
+
+ NPT_UInt64 mask = 0;
+ const char* s = filter;
+ int i = 0;
+
+ while (s[i] != '\0') {
+ int next_comma = filter.Find(',', i);
+ int len = ((next_comma < 0)?(int)filter.GetLength():next_comma)-i;
+
+ if (NPT_String::CompareN(s+i, "*", 1) == 0) {
+ // return now, there's no point in parsing the rest
+ return PLT_FILTER_MASK_ALL;
+ }
+
+ // title is required, so we return a non empty mask
+ mask |= PLT_FILTER_MASK_TITLE;
+
+ if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_TITLE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_TITLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_REFID, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_REFID;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_CREATOR, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_CREATOR;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ARTIST, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_ARTIST;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ACTOR, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_ACTOR;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_DIRECTOR, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_DIRECTOR;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_AUTHOR, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_AUTHOR;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_DATE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_DATE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ALBUM, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_ALBUM;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_GENRE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_GENRE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ALBUMARTURI, len, true) == 0 ||
+ NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ALBUMARTURI_DLNAPROFILEID, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_ALBUMARTURI;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_DESCRIPTION, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_DESCRIPTION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_LONGDESCRIPTION, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_LONGDESCRIPTION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ORIGINALTRACK, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_ORIGINALTRACK;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_LASTPOSITION, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_LASTPOSITION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_LASTPLAYBACK, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_LASTPLAYBACK;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_PLAYCOUNT, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_PLAYCOUNT;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_SEARCHABLE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_SEARCHABLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_SEARCHCLASS, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_SEARCHCLASS;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_CONTAINER_SEARCHABLE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_SEARCHABLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_CHILDCOUNT, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_CHILDCOUNT;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_CONTAINER_CHILDCOUNT, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_CHILDCOUNT;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_PROGRAMTITLE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_PROGRAMTITLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_SERIESTITLE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_SERIESTITLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_EPISODE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_EPISODE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RATING, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RATING;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_PUBLISHER, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_PUBLISHER;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_DURATION, len, true) == 0 ||
+ NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_DURATION_SHORT, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_DURATION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_SIZE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_SIZE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_PROTECTION, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_PROTECTION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_RESOLUTION, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_RESOLUTION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_BITRATE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_BITRATE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_BITSPERSAMPLE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_BITSPERSAMPLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_NRAUDIOCHANNELS, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_NRAUDIOCHANNELS;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_SAMPLEFREQUENCY, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_SAMPLEFREQUENCY;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_EPISODE_COUNT, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_EPISODE_COUNT;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_EPISODE_SEASON, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_EPISODE_SEASON;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_LASTPLAYERSTATE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_LASTPLAYERSTATE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_DATEADDED, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_DATEADDED;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_RATING, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_RATING;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_VOTES, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_VOTES;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_ARTWORK, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_ARTWORK;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER;
+ } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_COUNTRY, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_COUNTRY;
+ } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_USERRATING, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_USERRATING;
+ }
+
+ if (next_comma < 0) {
+ return mask;
+ }
+
+ i = next_comma + 1;
+ }
+
+ return mask;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::AppendXmlUnEscape
++---------------------------------------------------------------------*/
+void
+PLT_Didl::AppendXmlUnEscape(NPT_String& out, const char* in)
+{
+ unsigned int i=0;
+ while (i<NPT_StringLength(in)) {
+ if (NPT_String::CompareN(in+i, "&lt;", 4) == 0) {
+ out += '<';
+ i +=4;
+ } else if (NPT_String::CompareN(in+i, "&gt;", 4) == 0) {
+ out += '>';
+ i += 4;
+ } else if (NPT_String::CompareN(in+i, "&amp;", 5) == 0) {
+ out += '&';
+ i += 5;
+ } else if (NPT_String::CompareN(in+i, "&quot;", 6) == 0) {
+ out += '"';
+ i += 6;
+ } else if (NPT_String::CompareN(in+i, "&apos;", 6) == 0) {
+ out += '\'';
+ i += 6;
+ } else {
+ out += *(in+i);
+ i++;
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::AppendXmlEscape
++---------------------------------------------------------------------*/
+void
+PLT_Didl::AppendXmlEscape(NPT_String& out, const char* in)
+{
+ if (!in) return;
+
+ for (int i=0; i<(int)NPT_StringLength(in); i++) {
+ if (*(in+i) == '<') {
+ out += "&lt;";
+ } else if (*(in+i) == '>') {
+ out += "&gt;";
+ } else if (*(in+i) == '&') {
+ out += "&amp;";
+ } else if (*(in+i) == '"') {
+ out += "&quot;";
+ } else if (*(in+i) == '\'') {
+ out += "&apos;";
+ } else {
+ out += *(in+i);
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::FormatTimeStamp
++---------------------------------------------------------------------*/
+NPT_String
+PLT_Didl::FormatTimeStamp(NPT_UInt32 seconds)
+{
+ NPT_String result;
+ int hours = seconds/3600;
+ if (hours == 0) {
+ result += "0:";
+ } else {
+ result += NPT_String::FromInteger(hours) + ":";
+ }
+
+ int minutes = (seconds/60)%60;
+ if (minutes == 0) {
+ result += "00:";
+ } else {
+ if (minutes < 10) {
+ result += '0';
+ }
+ result += NPT_String::FromInteger(minutes) + ":";
+ }
+
+ int secs = seconds%60;
+ if (secs == 0) {
+ result += "00";
+ } else {
+ if (secs < 10) {
+ result += '0';
+ }
+ result += NPT_String::FromInteger(secs);
+ }
+
+ result += ".000"; // needed for XBOX360 otherwise it won't play the track
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::ParseTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Didl::ParseTimeStamp(const NPT_String& timestamp, NPT_UInt32& seconds)
+{
+ // assume a timestamp in the format HH:MM:SS.FFF
+ int separator;
+ NPT_String str = timestamp;
+ NPT_UInt32 value;
+
+ // reset output params first
+ seconds = 0;
+
+ // remove milliseconds first if any
+ if ((separator = str.ReverseFind('.')) != -1) {
+ str = str.Left(separator);
+ }
+
+ // look for next separator
+ if ((separator = str.ReverseFind(':')) == -1) return NPT_FAILURE;
+
+ // extract seconds
+ NPT_CHECK_WARNING(str.SubString(separator+1).ToInteger(value));
+ seconds = value;
+ str = str.Left(separator);
+
+ // look for next separator
+ if ((separator = str.ReverseFind(':')) == -1) return NPT_FAILURE;
+
+ // extract minutes
+ NPT_CHECK_WARNING(str.SubString(separator+1).ToInteger(value));
+ seconds += 60*value;
+ str = str.Left(separator);
+
+ // extract hours
+ NPT_CHECK_WARNING(str.ToInteger(value));
+ seconds += 3600*value;
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Didl::ToDidl(PLT_MediaObject& object, const NPT_String& filter, NPT_String& didl)
+{
+ NPT_UInt64 mask = ConvertFilterToMask(filter);
+
+ // Allocate enough space for the didl
+ didl.Reserve(2048);
+
+ return object.ToDidl(mask, didl);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::FromDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Didl::FromDidl(const char* xml, PLT_MediaObjectListReference& objects)
+{
+ NPT_String str;
+ PLT_MediaObject* object = NULL;
+ NPT_XmlNode* node = NULL;
+ NPT_XmlElementNode* didl = NULL;
+ NPT_XmlParser parser;
+
+ NPT_LOG_FINE("Parsing Didl...");
+
+ NPT_CHECK_LABEL_SEVERE(parser.Parse(xml, node), cleanup);
+ if (!node || !node->AsElementNode()) {
+ NPT_LOG_SEVERE("Invalid node type");
+ goto cleanup;
+ }
+
+ didl = node->AsElementNode();
+
+ if (didl->GetTag().Compare("DIDL-Lite", true)) {
+ NPT_LOG_SEVERE("Invalid node tag");
+ goto cleanup;
+ }
+
+ // create entry list
+ objects = new PLT_MediaObjectList();
+
+ // for each child, find out if it's a container or not
+ // and then invoke the FromDidl on it
+ for (NPT_List<NPT_XmlNode*>::Iterator children = didl->GetChildren().GetFirstItem(); children; children++) {
+ NPT_XmlElementNode* child = (*children)->AsElementNode();
+ if (!child) continue;
+
+ if (child->GetTag().Compare("Container", true) == 0) {
+ object = new PLT_MediaContainer();
+ } else if (child->GetTag().Compare("item", true) == 0) {
+ object = new PLT_MediaItem();
+ } else {
+ NPT_LOG_WARNING("Invalid node tag");
+ continue;
+ }
+
+ if (NPT_FAILED(object->FromDidl(child))) {
+ NPT_LOG_WARNING_1("Invalid didl for object: %s",
+ (const char*) PLT_XmlHelper::Serialize(*child, false));
+ continue;
+ }
+
+ objects->Add(object);
+ object = NULL; // reset to make sure it doesn't get deleted twice in case of error
+ }
+
+ delete node;
+ return NPT_SUCCESS;
+
+cleanup:
+ objects = NULL;
+ delete node;
+ delete object;
+ return NPT_FAILURE;
+}
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
new file mode 100644
index 0000000..b74ed0f
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
@@ -0,0 +1,197 @@
+/*****************************************************************
+|
+| Platinum - DIDL handling
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP AV Didl
+ */
+
+#ifndef _PLT_DIDL_H_
+#define _PLT_DIDL_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaItem.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define PLT_FILTER_MASK_ALL NPT_UINT64_C(0xFFFFFFFFFFFFFFFF)
+
+#define PLT_FILTER_MASK_CREATOR NPT_UINT64_C(0x0000000000000001)
+#define PLT_FILTER_MASK_ARTIST NPT_UINT64_C(0x0000000000000002)
+#define PLT_FILTER_MASK_ALBUM NPT_UINT64_C(0x0000000000000004)
+#define PLT_FILTER_MASK_GENRE NPT_UINT64_C(0x0000000000000008)
+#define PLT_FILTER_MASK_ALBUMARTURI NPT_UINT64_C(0x0000000000000010)
+#define PLT_FILTER_MASK_DESCRIPTION NPT_UINT64_C(0x0000000000000020)
+#define PLT_FILTER_MASK_SEARCHABLE NPT_UINT64_C(0x0000000000000040)
+#define PLT_FILTER_MASK_CHILDCOUNT NPT_UINT64_C(0x0000000000000080)
+#define PLT_FILTER_MASK_ORIGINALTRACK NPT_UINT64_C(0x0000000000000100)
+#define PLT_FILTER_MASK_ACTOR NPT_UINT64_C(0x0000000000000200)
+#define PLT_FILTER_MASK_AUTHOR NPT_UINT64_C(0x0000000000000400)
+#define PLT_FILTER_MASK_DIRECTOR NPT_UINT64_C(0x0000000000000800)
+#define PLT_FILTER_MASK_DATE NPT_UINT64_C(0x0000000000001000)
+#define PLT_FILTER_MASK_PROGRAMTITLE NPT_UINT64_C(0x0000000000002000)
+#define PLT_FILTER_MASK_SERIESTITLE NPT_UINT64_C(0x0000000000004000)
+#define PLT_FILTER_MASK_EPISODE NPT_UINT64_C(0x0000000000008000)
+#define PLT_FILTER_MASK_TITLE NPT_UINT64_C(0x0000000000010000)
+
+#define PLT_FILTER_MASK_RES NPT_UINT64_C(0x0000000000020000)
+#define PLT_FILTER_MASK_RES_DURATION NPT_UINT64_C(0x0000000000040000)
+#define PLT_FILTER_MASK_RES_SIZE NPT_UINT64_C(0x0000000000080000)
+#define PLT_FILTER_MASK_RES_PROTECTION NPT_UINT64_C(0x0000000000100000)
+#define PLT_FILTER_MASK_RES_RESOLUTION NPT_UINT64_C(0x0000000000200000)
+#define PLT_FILTER_MASK_RES_BITRATE NPT_UINT64_C(0x0000000000400000)
+#define PLT_FILTER_MASK_RES_BITSPERSAMPLE NPT_UINT64_C(0x0000000000800000)
+#define PLT_FILTER_MASK_RES_NRAUDIOCHANNELS NPT_UINT64_C(0x0000000001000000)
+#define PLT_FILTER_MASK_RES_SAMPLEFREQUENCY NPT_UINT64_C(0x0000000002000000)
+
+#define PLT_FILTER_MASK_LONGDESCRIPTION NPT_UINT64_C(0x0000000004000000)
+#define PLT_FILTER_MASK_ICON NPT_UINT64_C(0x0000000008000000)
+#define PLT_FILTER_MASK_RATING NPT_UINT64_C(0x0000000010000000)
+
+#define PLT_FILTER_MASK_TOC NPT_UINT64_C(0x0000000020000000)
+#define PLT_FILTER_MASK_SEARCHCLASS NPT_UINT64_C(0x0000000040000000)
+#define PLT_FILTER_MASK_REFID NPT_UINT64_C(0x0000000080000000)
+
+#define PLT_FILTER_MASK_LASTPOSITION NPT_UINT64_C(0x0000000100000000)
+#define PLT_FILTER_MASK_LASTPLAYBACK NPT_UINT64_C(0x0000000200000000)
+#define PLT_FILTER_MASK_PLAYCOUNT NPT_UINT64_C(0x0000000400000000)
+
+#define PLT_FILTER_MASK_PUBLISHER NPT_UINT64_C(0x0000000800000000)
+
+#define PLT_FILTER_MASK_EPISODE_COUNT NPT_UINT64_C(0x0000001000000000)
+#define PLT_FILTER_MASK_EPISODE_SEASON NPT_UINT64_C(0x0000002000000000)
+
+#define PLT_FILTER_MASK_XBMC_DATEADDED NPT_UINT64_C(0x0000100000000000)
+#define PLT_FILTER_MASK_XBMC_RATING NPT_UINT64_C(0x0000200000000000)
+#define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000400000000000)
+#define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000)
+#define PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER NPT_UINT64_C(0x0001000000000000)
+#define PLT_FILTER_MASK_XBMC_COUNTRY NPT_UINT64_C(0x0002000000000000)
+#define PLT_FILTER_MASK_XBMC_USERRATING NPT_UINT64_C(0x0004000000000000)
+#define PLT_FILTER_MASK_XBMC_LASTPLAYERSTATE NPT_UINT64_C(0x0008000000000000)
+
+#define PLT_FILTER_FIELD_TITLE "dc:title"
+#define PLT_FILTER_FIELD_CREATOR "dc:creator"
+#define PLT_FILTER_FIELD_DATE "dc:date"
+#define PLT_FILTER_FIELD_ARTIST "upnp:artist"
+#define PLT_FILTER_FIELD_ACTOR "upnp:actor"
+#define PLT_FILTER_FIELD_AUTHOR "upnp:author"
+#define PLT_FILTER_FIELD_DIRECTOR "upnp:director"
+#define PLT_FILTER_FIELD_ALBUM "upnp:album"
+#define PLT_FILTER_FIELD_GENRE "upnp:genre"
+#define PLT_FILTER_FIELD_ALBUMARTURI "upnp:albumArtURI"
+#define PLT_FILTER_FIELD_ALBUMARTURI_DLNAPROFILEID "upnp:albumArtURI@dlna:profileID"
+#define PLT_FILTER_FIELD_DESCRIPTION "dc:description"
+#define PLT_FILTER_FIELD_LONGDESCRIPTION "upnp:longDescription"
+#define PLT_FILTER_FIELD_ICON "upnp:icon"
+#define PLT_FILTER_FIELD_RATING "upnp:rating"
+#define PLT_FILTER_FIELD_ORIGINALTRACK "upnp:originalTrackNumber"
+#define PLT_FILTER_FIELD_PROGRAMTITLE "upnp:programTitle"
+#define PLT_FILTER_FIELD_SERIESTITLE "upnp:seriesTitle"
+#define PLT_FILTER_FIELD_EPISODE "upnp:episodeNumber"
+#define PLT_FILTER_FIELD_LASTPOSITION "upnp:lastPlaybackPosition"
+#define PLT_FILTER_FIELD_LASTPLAYBACK "upnp:lastPlaybackTime"
+#define PLT_FILTER_FIELD_PLAYCOUNT "upnp:playbackCount"
+#define PLT_FILTER_FIELD_SEARCHCLASS "upnp:searchClass"
+#define PLT_FILTER_FIELD_SEARCHABLE "@searchable"
+#define PLT_FILTER_FIELD_CHILDCOUNT "@childcount"
+#define PLT_FILTER_FIELD_CONTAINER_CHILDCOUNT "container@childCount"
+#define PLT_FILTER_FIELD_CONTAINER_SEARCHABLE "container@searchable"
+#define PLT_FILTER_FIELD_REFID "@refID"
+#define PLT_FILTER_FIELD_PUBLISHER "dc:publisher"
+
+#define PLT_FILTER_FIELD_RES "res"
+#define PLT_FILTER_FIELD_RES_DURATION "res@duration"
+#define PLT_FILTER_FIELD_RES_DURATION_SHORT "@duration"
+#define PLT_FILTER_FIELD_RES_SIZE "res@size"
+#define PLT_FILTER_FIELD_RES_PROTECTION "res@protection"
+#define PLT_FILTER_FIELD_RES_RESOLUTION "res@resolution"
+#define PLT_FILTER_FIELD_RES_BITRATE "res@bitrate"
+#define PLT_FILTER_FIELD_RES_BITSPERSAMPLE "res@bitsPerSample"
+#define PLT_FILTER_FIELD_RES_NRAUDIOCHANNELS "res@nrAudioChannels"
+#define PLT_FILTER_FIELD_RES_SAMPLEFREQUENCY "res@sampleFrequency"
+
+#define PLT_FILTER_FIELD_EPISODE_COUNT "upnp:episodeCount"
+#define PLT_FILTER_FIELD_EPISODE_SEASON "upnp:episodeSeason"
+
+#define PLT_FILTER_FIELD_XBMC_LASTPLAYERSTATE "xbmc:lastPlayerState"
+#define PLT_FILTER_FIELD_XBMC_DATEADDED "xbmc:dateadded"
+#define PLT_FILTER_FIELD_XBMC_RATING "xbmc:rating"
+#define PLT_FILTER_FIELD_XBMC_VOTES "xbmc:votes"
+#define PLT_FILTER_FIELD_XBMC_ARTWORK "xbmc:artwork"
+#define PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER "xbmc:uniqueidentifier"
+#define PLT_FILTER_FIELD_XBMC_COUNTRY "xbmc:country"
+#define PLT_FILTER_FIELD_XBMC_USERRATING "xbmc:userrating"
+
+extern const char* didl_header;
+extern const char* didl_footer;
+extern const char* didl_namespace_dc;
+extern const char* didl_namespace_upnp;
+extern const char* didl_namespace_dlna;
+extern const char* didl_namespace_xbmc;
+
+/*----------------------------------------------------------------------
+| PLT_Didl
++---------------------------------------------------------------------*/
+/**
+ DIDL manipulation.
+ The PLT_Didl class provides a mechanism to (de)serialize a PLT_MediaObject or
+ list of PLT_MediaObject (PLT_MediaObjectList).
+ */
+class PLT_Didl
+{
+public:
+ static NPT_Result ToDidl(PLT_MediaObject& object,
+ const NPT_String& filter,
+ NPT_String& didl);
+ static NPT_Result FromDidl(const char* didl,
+ PLT_MediaObjectListReference& objects);
+ static void AppendXmlEscape(NPT_String& out, const char* in);
+ static void AppendXmlUnEscape(NPT_String& out, const char* in);
+ static NPT_Result ParseTimeStamp(const NPT_String& timestamp, NPT_UInt32& seconds);
+ static NPT_String FormatTimeStamp(NPT_UInt32 seconds);
+ static NPT_Result ParseTimeStamp(const NPT_String& in, NPT_TimeStamp& timestamp) {
+ NPT_UInt32 seconds;
+ NPT_Result res = ParseTimeStamp(in, seconds);
+ timestamp = NPT_TimeStamp((double)seconds);
+ return res;
+ }
+
+ static NPT_UInt64 ConvertFilterToMask(const NPT_String& filter);
+};
+
+#endif /* _PLT_DIDL_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.cpp
new file mode 100644
index 0000000..421d0c2
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.cpp
@@ -0,0 +1,519 @@
+/*****************************************************************
+|
+| Platinum - File Media Server Delegate
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltFileMediaServer.h"
+#include "PltMediaItem.h"
+#include "PltService.h"
+#include "PltTaskManager.h"
+#include "PltHttpServer.h"
+#include "PltDidl.h"
+#include "PltVersion.h"
+#include "PltMimeType.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.file.delegate")
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::PLT_FileMediaServerDelegate
++---------------------------------------------------------------------*/
+PLT_FileMediaServerDelegate::PLT_FileMediaServerDelegate(const char* url_root,
+ const char* file_root,
+ bool use_cache) :
+ m_UrlRoot(url_root),
+ m_FileRoot(file_root),
+ m_FilterUnknownOut(false),
+ m_UseCache(use_cache)
+{
+ /* Trim excess separators */
+ m_FileRoot.TrimRight("/\\");
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::~PLT_FileMediaServerDelegate
++---------------------------------------------------------------------*/
+PLT_FileMediaServerDelegate::~PLT_FileMediaServerDelegate()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::ProcessFileRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServerDelegate::ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_HttpUrlQuery query(request.GetUrl().GetQuery());
+
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINE, "PLT_FileMediaServerDelegate::ProcessFileRequest:", &request);
+
+ if (request.GetMethod().Compare("GET") && request.GetMethod().Compare("HEAD")) {
+ response.SetStatus(500, "Internal Server Error");
+ return NPT_SUCCESS;
+ }
+
+ /* Extract file path from url */
+ NPT_String file_path;
+ NPT_CHECK_LABEL_WARNING(ExtractResourcePath(request.GetUrl(), file_path), failure);
+
+ /* Serve file */
+ NPT_CHECK_WARNING(ServeFile(request, context, response, NPT_FilePath::Create(m_FileRoot, file_path)));
+ return NPT_SUCCESS;
+
+failure:
+ response.SetStatus(404, "File Not Found");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::ServeFile
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServerDelegate::ServeFile(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ const NPT_String& file_path)
+{
+ NPT_CHECK_WARNING(PLT_HttpServer::ServeFile(request, context, response, file_path));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::OnBrowseMetadata
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServerDelegate::OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(sort_criteria);
+ NPT_COMPILER_UNUSED(requested_count);
+ NPT_COMPILER_UNUSED(starting_index);
+
+ NPT_String didl;
+ PLT_MediaObjectReference item;
+
+ /* locate the file from the object ID */
+ NPT_String filepath;
+ if (NPT_FAILED(GetFilePath(object_id, filepath))) {
+ /* error */
+ NPT_LOG_WARNING("PLT_FileMediaServerDelegate::OnBrowse - ObjectID not found.");
+ action->SetError(701, "No Such Object.");
+ return NPT_FAILURE;
+ }
+
+ /* build the object didl */
+ item = BuildFromFilePath(filepath, context, true, false, (NPT_String(filter).Find("ALLIP")!=-1));
+ if (item.IsNull()) return NPT_FAILURE;
+ NPT_String tmp;
+ NPT_CHECK_SEVERE(PLT_Didl::ToDidl(*item.AsPointer(), filter, tmp));
+
+ /* add didl header and footer */
+ didl = didl_header + tmp + didl_footer;
+
+ NPT_CHECK_SEVERE(action->SetArgumentValue("Result", didl));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("NumberReturned", "1"));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("TotalMatches", "1"));
+
+ /* update ID may be wrong here, it should be the one of the container?
+ TODO: We need to keep track of the overall updateID of the CDS */
+ NPT_CHECK_SEVERE(action->SetArgumentValue("UpdateId", "1"));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::OnBrowseDirectChildren
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServerDelegate::OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(sort_criteria);
+
+ /* locate the file from the object ID */
+ NPT_String dir;
+ NPT_FileInfo info;
+ if (NPT_FAILED(GetFilePath(object_id, dir)) || NPT_FAILED(NPT_File::GetInfo(dir, &info)) || info.m_Type != NPT_FileInfo::FILE_TYPE_DIRECTORY) {
+ /* error */
+ NPT_LOG_WARNING_1("ObjectID \'%s\' not found or not allowed", object_id);
+ action->SetError(701, "No such Object");
+ NPT_CHECK_WARNING(NPT_FAILURE);
+ }
+
+ /* get uuid from device via action reference */
+ NPT_String uuid = action->GetActionDesc().GetService()->GetDevice()->GetUUID();
+
+ /* Try to get list from cache if allowed */
+ NPT_Result res;
+ NPT_Reference<NPT_List<NPT_String> > entries;
+ NPT_TimeStamp cached_entries_time;
+ if (!m_UseCache || NPT_FAILED(m_DirCache.Get(uuid, dir, entries, &cached_entries_time)) || cached_entries_time < info.m_ModificationTime) {
+ /* if not found in cache or if current dir has newer modified time fetch fresh new list from source */
+ entries = new NPT_List<NPT_String>();
+ res = NPT_File::ListDir(dir, *entries);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_WARNING_1("PLT_FileMediaServerDelegate::OnBrowseDirectChildren - failed to open dir %s", (const char*) dir);
+ NPT_CHECK_WARNING(res);
+ }
+
+ /* sort results according to modification date */
+ res = entries->Sort(NPT_FileDateComparator(dir));
+ if (NPT_FAILED(res)) {
+ NPT_LOG_WARNING_1("PLT_FileMediaServerDelegate::OnBrowseDirectChildren - failed to open sort dir %s", (const char*) dir);
+ NPT_CHECK_WARNING(res);
+ }
+
+ /* add new list to cache */
+ if (m_UseCache) {
+ m_DirCache.Put(uuid, dir, entries, &info.m_ModificationTime);
+ }
+ }
+
+ unsigned long cur_index = 0;
+ unsigned long num_returned = 0;
+ unsigned long total_matches = 0;
+ NPT_String didl = didl_header;
+ bool allip = (NPT_String(filter).Find("ALLIP") != -1);
+
+ PLT_MediaObjectReference item;
+ for (NPT_List<NPT_String>::Iterator it = entries->GetFirstItem();
+ it;
+ ++it) {
+ NPT_String filepath = NPT_FilePath::Create(dir, *it);
+
+ /* verify we want to process this file first */
+ if (!ProcessFile(filepath, filter)) continue;
+
+ /* build item object from file path */
+ item = BuildFromFilePath(filepath,
+ context,
+ true,
+ false,
+ allip);
+
+ /* generate didl if within range requested */
+ if (!item.IsNull()) {
+ if ((cur_index >= starting_index) &&
+ ((num_returned < requested_count) || (requested_count == 0))) {
+ NPT_String tmp;
+ NPT_CHECK_SEVERE(PLT_Didl::ToDidl(*item.AsPointer(), filter, tmp));
+
+ didl += tmp;
+ ++num_returned;
+ }
+ ++cur_index;
+ ++total_matches;
+ }
+ };
+
+ didl += didl_footer;
+
+ NPT_LOG_FINE_6("BrowseDirectChildren from %s returning %d-%lu/%lu objects (%lu out of %d requested)",
+ (const char*)context.GetLocalAddress().GetIpAddress().ToString(),
+ starting_index, starting_index+num_returned, total_matches, num_returned, requested_count);
+
+ NPT_CHECK_SEVERE(action->SetArgumentValue("Result", didl));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("NumberReturned", NPT_String::FromInteger(num_returned)));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("TotalMatches", NPT_String::FromInteger(total_matches))); // 0 means we don't know how many we have but most browsers don't like that!!
+ NPT_CHECK_SEVERE(action->SetArgumentValue("UpdateId", "1"));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::OnSearchContainer
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServerDelegate::OnSearchContainer(PLT_ActionReference& action,
+ const char* object_id,
+ const char* search_criteria,
+ const char* /* filter */,
+ NPT_UInt32 /* starting_index */,
+ NPT_UInt32 /* requested_count */,
+ const char* /* sort_criteria */,
+ const PLT_HttpRequestContext& /* context */)
+{
+ /* parse search criteria */
+
+ /* TODO: HACK TO PASS DLNA */
+ if (search_criteria && NPT_StringsEqual(search_criteria, "Unknownfieldname")) {
+ /* error */
+ NPT_LOG_WARNING_1("Unsupported or invalid search criteria %s", search_criteria);
+ action->SetError(708, "Unsupported or invalid search criteria");
+ return NPT_FAILURE;
+ }
+
+ /* locate the file from the object ID */
+ NPT_String dir;
+ if (NPT_FAILED(GetFilePath(object_id, dir))) {
+ /* error */
+ NPT_LOG_WARNING("ObjectID not found.");
+ action->SetError(710, "No Such Container.");
+ return NPT_FAILURE;
+ }
+
+ /* retrieve the item type */
+ NPT_FileInfo info;
+ NPT_Result res = NPT_File::GetInfo(dir, &info);
+ if (NPT_FAILED(res) || (info.m_Type != NPT_FileInfo::FILE_TYPE_DIRECTORY)) {
+ /* error */
+ NPT_LOG_WARNING("No such container");
+ action->SetError(710, "No such container");
+ return NPT_FAILURE;
+ }
+
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::GetFilePath
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServerDelegate::GetFilePath(const char* object_id,
+ NPT_String& filepath)
+{
+ if (!object_id) return NPT_ERROR_INVALID_PARAMETERS;
+
+ filepath = m_FileRoot;
+
+ /* object id is formatted as 0/<filepath> */
+ if (NPT_StringLength(object_id) >= 1) {
+ filepath += (object_id + (object_id[0]=='0'?1:0));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::BuildSafeResourceUri
++---------------------------------------------------------------------*/
+NPT_String
+PLT_FileMediaServerDelegate::BuildSafeResourceUri(const NPT_HttpUrl& base_uri,
+ const char* host,
+ const char* file_path)
+{
+ NPT_String result;
+ NPT_HttpUrl uri = base_uri;
+
+ if (host) uri.SetHost(host);
+
+ NPT_String uri_path = uri.GetPath();
+ if (!uri_path.EndsWith("/")) uri_path += "/";
+
+ /* some controllers (like WMP) will call us with an already urldecoded version.
+ We're intentionally prepending a known urlencoded string
+ to detect it when we receive the request urlencoded or already decoded to avoid double decoding*/
+ uri_path += "%/";
+ uri_path += file_path;
+
+ /* set path */
+ uri.SetPath(uri_path);
+
+ /* 360 hack: force inclusion of port in case it's 80 */
+ return uri.ToStringWithDefaultPort(0);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::ExtractResourcePath
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServerDelegate::ExtractResourcePath(const NPT_HttpUrl& url,
+ NPT_String& file_path)
+{
+ /* Extract non decoded path, we need to autodetect urlencoding */
+ NPT_String uri_path = url.GetPath();
+ NPT_String url_root_encode = NPT_Uri::PercentEncode(m_UrlRoot, NPT_Uri::PathCharsToEncode);
+
+ NPT_Ordinal skip = 0;
+ if (uri_path.StartsWith(m_UrlRoot)) {
+ skip = m_UrlRoot.GetLength();
+ } else if (uri_path.StartsWith(url_root_encode)) {
+ skip = url_root_encode.GetLength();
+ } else {
+ return NPT_FAILURE;
+ }
+
+ /* account for extra slash */
+ skip += ((m_UrlRoot=="/")?0:1);
+ file_path = uri_path.SubString(skip);
+
+ /* detect if client such as WMP sent a non urlencoded url */
+ if (file_path.StartsWith("%/")) {
+ NPT_LOG_FINE("Received a urldecoded version of our url!");
+ file_path.Erase(0, 2);
+ } else {
+ /* remove our prepended string we used to detect urldecoded version */
+ if (file_path.StartsWith("%25/")) file_path.Erase(0, 4);
+
+ /* ok to urldecode */
+ file_path = NPT_Uri::PercentDecode(file_path);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::BuildResourceUri
++---------------------------------------------------------------------*/
+NPT_String
+PLT_FileMediaServerDelegate::BuildResourceUri(const NPT_HttpUrl& base_uri,
+ const char* host,
+ const char* file_path)
+{
+ return BuildSafeResourceUri(base_uri, host, file_path);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate::BuildFromFilePath
++---------------------------------------------------------------------*/
+PLT_MediaObject*
+PLT_FileMediaServerDelegate::BuildFromFilePath(const NPT_String& filepath,
+ const PLT_HttpRequestContext& context,
+ bool with_count /* = true */,
+ bool keep_extension_in_title /* = false */,
+ bool allip /* = false */)
+{
+ NPT_String root = m_FileRoot;
+ PLT_MediaItemResource resource;
+ PLT_MediaObject* object = NULL;
+
+ NPT_LOG_FINEST_1("Building didl for file '%s'", (const char*)filepath);
+
+ /* retrieve the entry type (directory or file) */
+ NPT_FileInfo info;
+ NPT_CHECK_LABEL_FATAL(NPT_File::GetInfo(filepath, &info), failure);
+
+ if (info.m_Type == NPT_FileInfo::FILE_TYPE_REGULAR) {
+ object = new PLT_MediaItem();
+
+ /* Set the title using the filename for now */
+ object->m_Title = NPT_FilePath::BaseName(filepath, keep_extension_in_title);
+ if (object->m_Title.GetLength() == 0) goto failure;
+
+ /* make sure we return something with a valid mimetype */
+ if (m_FilterUnknownOut &&
+ NPT_StringsEqual(PLT_MimeType::GetMimeType(filepath, &context),
+ "application/octet-stream")) {
+ goto failure;
+ }
+
+ /* Set the protocol Info from the extension */
+ resource.m_ProtocolInfo = PLT_ProtocolInfo::GetProtocolInfo(filepath, true, &context);
+ if (!resource.m_ProtocolInfo.IsValid()) goto failure;
+
+ /* Set the resource file size */
+ resource.m_Size = info.m_Size;
+
+ /* format the resource URI */
+ NPT_String url = filepath.SubString(root.GetLength()+1);
+
+ // get list of ip addresses
+ NPT_List<NPT_IpAddress> ips;
+ NPT_CHECK_LABEL_SEVERE(PLT_UPnPMessageHelper::GetIPAddresses(ips), failure);
+
+ /* if we're passed an interface where we received the request from
+ move the ip to the top so that it is used for the first resource */
+ if (context.GetLocalAddress().GetIpAddress().ToString() != "0.0.0.0") {
+ ips.Remove(context.GetLocalAddress().GetIpAddress());
+ ips.Insert(ips.GetFirstItem(), context.GetLocalAddress().GetIpAddress());
+ } else if (!allip) {
+ NPT_LOG_WARNING("Couldn't determine local interface IP so we might return an unreachable IP");
+ }
+ object->m_ObjectClass.type = PLT_MediaItem::GetUPnPClass(filepath, &context);
+
+ /* add as many resources as we have interfaces s*/
+ NPT_HttpUrl base_uri("127.0.0.1", context.GetLocalAddress().GetPort(), NPT_HttpUrl::PercentEncode(m_UrlRoot, NPT_Uri::PathCharsToEncode));
+ NPT_List<NPT_IpAddress>::Iterator ip = ips.GetFirstItem();
+ while (ip) {
+ resource.m_Uri = BuildResourceUri(base_uri, ip->ToString(), url);
+ object->m_Resources.Add(resource);
+ ++ip;
+
+ /* if we only want the one resource reachable by client */
+ if (!allip) break;
+ }
+ } else {
+ object = new PLT_MediaContainer;
+
+ /* Assign a title for this container */
+ if (filepath.Compare(root, true) == 0) {
+ object->m_Title = "Root";
+ } else {
+ object->m_Title = NPT_FilePath::BaseName(filepath, keep_extension_in_title);
+ if (object->m_Title.GetLength() == 0) goto failure;
+ }
+
+ /* Get the number of children for this container */
+ NPT_LargeSize count = 0;
+ if (with_count && NPT_SUCCEEDED(NPT_File::GetSize(filepath, count))) {
+ ((PLT_MediaContainer*)object)->m_ChildrenCount = (NPT_Int32)count;
+ }
+
+ object->m_ObjectClass.type = "object.container.storageFolder";
+ }
+
+ /* is it the root? */
+ if (filepath.Compare(root, true) == 0) {
+ object->m_ParentID = "-1";
+ object->m_ObjectID = "0";
+ } else {
+ NPT_String directory = NPT_FilePath::DirName(filepath);
+ /* is the parent path the root? */
+ if (directory.GetLength() == root.GetLength()) {
+ object->m_ParentID = "0";
+ } else {
+ object->m_ParentID = "0" + filepath.SubString(root.GetLength(), directory.GetLength() - root.GetLength());
+ }
+ object->m_ObjectID = "0" + filepath.SubString(root.GetLength());
+ }
+
+ return object;
+
+failure:
+ delete object;
+ return NULL;
+}
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h
new file mode 100644
index 0000000..fa4b5e4
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h
@@ -0,0 +1,151 @@
+/*****************************************************************
+|
+| Platinum - File Media Server
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP AV Filesystem based Media Server sample implementation
+ */
+
+#ifndef _PLT_FILE_MEDIA_SERVER_H_
+#define _PLT_FILE_MEDIA_SERVER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaServer.h"
+#include "PltMediaCache.h"
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServerDelegate
++---------------------------------------------------------------------*/
+/**
+ File Media Server Delegate.
+ The PLT_FileMediaServerDelegate class is an example of a PLT_MediaServerDelegate
+ implementation for a file system backed Media Server.
+ */
+class PLT_FileMediaServerDelegate : public PLT_MediaServerDelegate
+{
+public:
+ // class methods
+ static NPT_String BuildSafeResourceUri(const NPT_HttpUrl& base_uri,
+ const char* host,
+ const char* file_path);
+ // constructor & destructor
+ PLT_FileMediaServerDelegate(const char* url_root, const char* file_root, bool use_cache = false);
+ ~PLT_FileMediaServerDelegate() override;
+
+protected:
+ // PLT_MediaServerDelegate methods
+ NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context) override;
+ NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context) override;
+ NPT_Result OnSearchContainer(PLT_ActionReference& action,
+ const char* object_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context) override;
+ NPT_Result ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+ // overridable methods
+ virtual NPT_Result ExtractResourcePath(const NPT_HttpUrl& url, NPT_String& file_path);
+ virtual NPT_String BuildResourceUri(const NPT_HttpUrl& base_uri, const char* host, const char* file_path);
+ virtual NPT_Result ServeFile(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ const NPT_String& file_path);
+ virtual NPT_Result GetFilePath(const char* object_id, NPT_String& filepath);
+ virtual bool ProcessFile(const NPT_String&, const char* filter = NULL) { NPT_COMPILER_UNUSED(filter); return true;}
+ virtual PLT_MediaObject* BuildFromFilePath(const NPT_String& filepath,
+ const PLT_HttpRequestContext& context,
+ bool with_count = true,
+ bool keep_extension_in_title = false,
+ bool allip = false);
+
+protected:
+ friend class PLT_MediaItem;
+
+ NPT_String m_UrlRoot;
+ NPT_String m_FileRoot;
+ bool m_FilterUnknownOut;
+ bool m_UseCache;
+
+ PLT_MediaCache<NPT_Reference<NPT_List<NPT_String> >, NPT_TimeStamp> m_DirCache;
+};
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer
++---------------------------------------------------------------------*/
+/**
+ File Media Server.
+ The PLT_FileMediaServer class is an example of a PLT_MediaServer implementation
+ for a file system backed Media Server.
+ */
+class PLT_FileMediaServer : public PLT_MediaServer,
+ public PLT_FileMediaServerDelegate
+{
+public: // constructor
+ PLT_FileMediaServer(const char* file_root,
+ const char* friendly_name,
+ bool show_ip = false,
+ const char* uuid = NULL,
+ NPT_UInt16 port = 0,
+ bool port_rebind = false) :
+ PLT_MediaServer(friendly_name,
+ show_ip,
+ uuid,
+ port,
+ port_rebind),
+ PLT_FileMediaServerDelegate("/", file_root) {SetDelegate(this);}
+
+protected:
+ ~PLT_FileMediaServer() override {}
+};
+
+#endif /* _PLT_FILE_MEDIA_SERVER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
new file mode 100644
index 0000000..2478441
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
@@ -0,0 +1,571 @@
+/*****************************************************************
+|
+| Platinum - AV Media Browser (Media Server Control Point)
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaBrowser.h"
+#include "PltDidl.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.browser")
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::PLT_MediaBrowser
++---------------------------------------------------------------------*/
+PLT_MediaBrowser::PLT_MediaBrowser(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaBrowserDelegate* delegate /* = NULL */) :
+ m_CtrlPoint(ctrl_point),
+ m_Delegate(delegate)
+{
+ m_CtrlPoint->AddListener(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::~PLT_MediaBrowser
++---------------------------------------------------------------------*/
+PLT_MediaBrowser::~PLT_MediaBrowser()
+{
+ m_CtrlPoint->RemoveListener(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnDeviceAdded
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnDeviceAdded(PLT_DeviceDataReference& device)
+{
+ // verify the device implements the function we need
+ PLT_Service* serviceCDS;
+ PLT_Service* serviceCMR;
+ NPT_String type;
+
+ if (!device->GetType().StartsWith("urn:schemas-upnp-org:device:MediaServer"))
+ return NPT_FAILURE;
+
+ type = "urn:schemas-upnp-org:service:ContentDirectory:*";
+ if (NPT_FAILED(device->FindServiceByType(type, serviceCDS))) {
+ NPT_LOG_WARNING_2("Service %s not found in device \"%s\"",
+ type.GetChars(),
+ device->GetFriendlyName().GetChars());
+ return NPT_FAILURE;
+ } else {
+ // in case it's a newer upnp implementation, force to 1
+ serviceCDS->ForceVersion(1);
+ }
+
+ type = "urn:schemas-upnp-org:service:ConnectionManager:*";
+ if (NPT_FAILED(device->FindServiceByType(type, serviceCMR))) {
+ NPT_LOG_WARNING_2("Service %s not found in device \"%s\"",
+ type.GetChars(),
+ device->GetFriendlyName().GetChars());
+ return NPT_FAILURE;
+ } else {
+ // in case it's a newer upnp implementation, force to 1
+ serviceCMR->ForceVersion(1);
+ }
+
+ {
+ NPT_AutoLock lock(m_MediaServers);
+
+ PLT_DeviceDataReference data;
+ NPT_String uuid = device->GetUUID();
+
+ // is it a new device?
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_MediaServers, PLT_DeviceDataFinder(uuid), data))) {
+ NPT_LOG_WARNING_1("Device (%s) is already in our list!", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE_1("Device Found: %s", (const char*)*device);
+
+ m_MediaServers.Add(device);
+ }
+
+ if (m_Delegate && m_Delegate->OnMSAdded(device)) {
+ m_CtrlPoint->Subscribe(serviceCDS);
+ m_CtrlPoint->Subscribe(serviceCMR);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnDeviceRemoved
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnDeviceRemoved(PLT_DeviceDataReference& device)
+{
+ if (!device->GetType().StartsWith("urn:schemas-upnp-org:device:MediaServer"))
+ return NPT_FAILURE;
+
+ {
+ NPT_AutoLock lock(m_MediaServers);
+
+ // only release if we have kept it around
+ PLT_DeviceDataReference data;
+ NPT_String uuid = device->GetUUID();
+
+ // Have we seen that device?
+ if (NPT_FAILED(NPT_ContainerFind(m_MediaServers, PLT_DeviceDataFinder(uuid), data))) {
+ NPT_LOG_WARNING_1("Device (%s) not found in our list!", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE_1("Device Removed: %s", (const char*)*device);
+
+ m_MediaServers.Remove(device);
+ }
+
+ if (m_Delegate) {
+ m_Delegate->OnMSRemoved(device);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::FindServer
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::FindServer(const char* uuid, PLT_DeviceDataReference& device)
+{
+ NPT_AutoLock lock(m_MediaServers);
+
+ if (NPT_FAILED(NPT_ContainerFind(m_MediaServers, PLT_DeviceDataFinder(uuid), device))) {
+ NPT_LOG_FINE_1("Device (%s) not found in our list of servers", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::Search
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::Search(PLT_DeviceDataReference& device,
+ const char* container_id,
+ const char* search_criteria,
+ NPT_UInt32 start_index,
+ NPT_UInt32 count,
+ const char* filter,
+ void* userdata)
+{
+ // verify device still in our list
+ PLT_DeviceDataReference device_data;
+ NPT_CHECK_WARNING(FindServer(device->GetUUID(), device_data));
+
+ // create action
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:ContentDirectory:1",
+ "Search",
+ action));
+
+ // Set the container id
+ PLT_Arguments args;
+ if (NPT_FAILED(action->SetArgumentValue("ContainerID", container_id))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Search Criteria
+ if (NPT_FAILED(action->SetArgumentValue("SearchCriteria", search_criteria))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+
+ // set the Filter
+ if (NPT_FAILED(action->SetArgumentValue("Filter", filter))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Starting Index
+ if (NPT_FAILED(action->SetArgumentValue("StartingIndex",
+ NPT_String::FromInteger(start_index)))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Requested Count
+ if (NPT_FAILED(action->SetArgumentValue("RequestedCount",
+ NPT_String::FromInteger(count)))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Requested Count
+ if (NPT_FAILED(action->SetArgumentValue("SortCriteria", ""))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // invoke the action
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::Browse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::Browse(PLT_DeviceDataReference& device,
+ const char* obj_id,
+ NPT_UInt32 start_index,
+ NPT_UInt32 count,
+ bool browse_metadata,
+ const char* filter,
+ const char* sort_criteria,
+ void* userdata)
+{
+ // verify device still in our list
+ PLT_DeviceDataReference device_data;
+ NPT_CHECK_WARNING(FindServer(device->GetUUID(), device_data));
+
+ // create action
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:ContentDirectory:1",
+ "Browse",
+ action));
+
+ // Set the object id
+ PLT_Arguments args;
+ if (NPT_FAILED(action->SetArgumentValue("ObjectID", obj_id))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the browse_flag
+ if (NPT_FAILED(action->SetArgumentValue("BrowseFlag",
+ browse_metadata?"BrowseMetadata":"BrowseDirectChildren"))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Filter
+ if (NPT_FAILED(action->SetArgumentValue("Filter", filter))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Starting Index
+ if (NPT_FAILED(action->SetArgumentValue("StartingIndex",
+ NPT_String::FromInteger(start_index)))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Requested Count
+ if (NPT_FAILED(action->SetArgumentValue("RequestedCount",
+ NPT_String::FromInteger(count)))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Requested Count
+ if (NPT_FAILED(action->SetArgumentValue("SortCriteria", sort_criteria))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // invoke the action
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::GetSearchCapabilities
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::GetSearchCapabilities(PLT_DeviceDataReference& device,
+ void* userdata)
+{
+ // verify device still in our list
+ PLT_DeviceDataReference device_data;
+ NPT_CHECK_WARNING(FindServer(device->GetUUID(), device_data));
+
+ // create action
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:ContentDirectory:1",
+ "GetSearchCapabilities",
+ action));
+
+ // invoke the action
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::GetSortCapabilities
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::GetSortCapabilities(PLT_DeviceDataReference& device,
+ void* userdata)
+{
+ // verify device still in our list
+ PLT_DeviceDataReference device_data;
+ NPT_CHECK_WARNING(FindServer(device->GetUUID(), device_data));
+
+ // create action
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
+ device,
+ "urn:schemas-upnp-org:service:ContentDirectory:1",
+ "GetSortCapabilities",
+ action));
+
+ // invoke the action
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnActionResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnActionResponse(NPT_Result res,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ // look for device in our list first
+ PLT_DeviceDataReference device;
+ NPT_String uuid = action->GetActionDesc().GetService()->GetDevice()->GetUUID();
+ if (NPT_FAILED(FindServer(uuid, device))) res = NPT_FAILURE;
+
+ NPT_String actionName = action->GetActionDesc().GetName();
+ if (actionName.Compare("Browse", true) == 0) {
+ return OnBrowseResponse(res, device, action, userdata);
+ } else if (actionName.Compare("Search", true) == 0) {
+ return OnSearchResponse(res, device, action, userdata);
+ } else if (actionName.Compare("GetSearchCapabilities", true) == 0) {
+ return OnGetSearchCapabilitiesResponse(res, device, action, userdata);
+ } else if (actionName.Compare("GetSortCapabilities", true) == 0) {
+ return OnGetSortCapabilitiesResponse(res, device, action, userdata);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnBrowseResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnBrowseResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_BrowseInfo info;
+ NPT_String unescaped;
+
+ if (!m_Delegate) return NPT_SUCCESS;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("ObjectID", info.object_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("UpdateID", value)) ||
+ value.GetLength() == 0 ||
+ NPT_FAILED(value.ToInteger(info.uid))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("NumberReturned", value)) ||
+ value.GetLength() == 0 ||
+ NPT_FAILED(value.ToInteger(info.nr))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("TotalMatches", value)) ||
+ value.GetLength() == 0 ||
+ NPT_FAILED(value.ToInteger(info.tm))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("Result", value)) ||
+ value.GetLength() == 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(PLT_Didl::FromDidl(value, info.items))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnBrowseResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnBrowseResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnSearchResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnSearchResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_BrowseInfo info;
+ NPT_String unescaped;
+
+ if (!m_Delegate) return NPT_SUCCESS;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("ContainerId", info.object_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("UpdateID", value)) ||
+ value.GetLength() == 0 ||
+ NPT_FAILED(value.ToInteger(info.uid))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("NumberReturned", value)) ||
+ value.GetLength() == 0 ||
+ NPT_FAILED(value.ToInteger(info.nr))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("TotalMatches", value)) ||
+ value.GetLength() == 0 ||
+ NPT_FAILED(value.ToInteger(info.tm))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("Result", value)) ||
+ value.GetLength() == 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(PLT_Didl::FromDidl(value, info.items))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnSearchResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnSearchResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnGetSearchCapabilitiesResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnGetSearchCapabilitiesResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+
+ if (!m_Delegate) return NPT_SUCCESS;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("SearchCaps", value))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetSearchCapabilitiesResult(NPT_SUCCESS, device, value, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetSearchCapabilitiesResult(NPT_FAILURE, device, value, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnGetSearchCapabilitiesResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnGetSortCapabilitiesResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+
+ if (!m_Delegate) return NPT_SUCCESS;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("SortCaps", value))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetSortCapabilitiesResult(NPT_SUCCESS, device, value, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetSortCapabilitiesResult(NPT_FAILURE, device, value, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnEventNotify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars)
+{
+ if (!service->GetDevice()->GetType().StartsWith("urn:schemas-upnp-org:device:MediaServer"))
+ return NPT_FAILURE;
+
+ if (!m_Delegate) return NPT_SUCCESS;
+
+ /* make sure device associated to service is still around */
+ PLT_DeviceDataReference data;
+ NPT_CHECK_WARNING(FindServer(service->GetDevice()->GetUUID(), data));
+
+ m_Delegate->OnMSStateVariablesChanged(service, vars);
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
new file mode 100644
index 0000000..2484dcc
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
@@ -0,0 +1,184 @@
+/*****************************************************************
+|
+| Platinum - AV Media Browser (Media Server Control Point)
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP AV Media Controller implementation.
+ */
+
+#ifndef _PLT_MEDIA_BROWSER_H_
+#define _PLT_MEDIA_BROWSER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltCtrlPoint.h"
+#include "PltMediaItem.h"
+
+/*----------------------------------------------------------------------
+| PLT_BrowseInfo
++---------------------------------------------------------------------*/
+/**
+ The PLT_BrowseInfo struct is used to marshall Browse or Search action
+ response results across different threads of execution.
+ */
+typedef struct {
+ NPT_String object_id;
+ PLT_MediaObjectListReference items;
+ NPT_UInt32 si;
+ NPT_UInt32 nr;
+ NPT_UInt32 tm;
+ NPT_UInt32 uid;
+} PLT_BrowseInfo;
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowserDelegate
++---------------------------------------------------------------------*/
+/**
+ The PLT_MediaBrowserDelegate class is an interface for receiving PLT_MediaBrowser
+ events or action responses.
+ */
+class PLT_MediaBrowserDelegate
+{
+public:
+ virtual ~PLT_MediaBrowserDelegate() {}
+
+ virtual bool OnMSAdded(PLT_DeviceDataReference& /* device */) { return true; }
+ virtual void OnMSRemoved(PLT_DeviceDataReference& /* device */) {}
+ virtual void OnMSStateVariablesChanged(
+ PLT_Service* /*service*/,
+ NPT_List<PLT_StateVariable*>* /*vars*/) {}
+
+ // ContentDirectory
+ virtual void OnBrowseResult(
+ NPT_Result /*res*/,
+ PLT_DeviceDataReference& /*device*/,
+ PLT_BrowseInfo* /*info*/,
+ void* /*userdata*/) {}
+
+ virtual void OnSearchResult(
+ NPT_Result /*res*/,
+ PLT_DeviceDataReference& /*device*/,
+ PLT_BrowseInfo* /*info*/,
+ void* /*userdata*/) {}
+
+ virtual void OnGetSearchCapabilitiesResult(
+ NPT_Result /*res*/,
+ PLT_DeviceDataReference& /*device*/,
+ NPT_String /*searchCapabilities*/,
+ void* /*userdata*/) {}
+
+ virtual void OnGetSortCapabilitiesResult(
+ NPT_Result /*res*/,
+ PLT_DeviceDataReference& /*device*/,
+ NPT_String /*sortCapabilities*/,
+ void* /*userdata*/) {}
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser
++---------------------------------------------------------------------*/
+/**
+ The PLT_MediaBrowser class implements a UPnP AV Media Server control point.
+ */
+class PLT_MediaBrowser : public PLT_CtrlPointListener
+{
+public:
+ PLT_MediaBrowser(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaBrowserDelegate* delegate = NULL);
+ ~PLT_MediaBrowser() override;
+
+ // ContentDirectory service
+ virtual NPT_Result Browse(PLT_DeviceDataReference& device,
+ const char* object_id,
+ NPT_UInt32 start_index,
+ NPT_UInt32 count = 30, // DLNA recommendations
+ bool browse_metadata = false,
+ const char* filter = "dc:date,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:originalTrackNumber,upnp:album,upnp:artist,upnp:author", // explicitely specify res otherwise WMP won't return a URL!
+ const char* sort_criteria = "",
+ void* userdata = NULL);
+
+ virtual NPT_Result Search(PLT_DeviceDataReference& device,
+ const char* container_id,
+ const char* search_criteria,
+ NPT_UInt32 start_index,
+ NPT_UInt32 count = 30, // DLNA recommendations
+ const char* filter = "dc:date,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:originalTrackNumber,upnp:album,upnp:artist,upnp:author", // explicitely specify res otherwise WMP won't return a URL!
+ void* userdata = NULL);
+
+ virtual NPT_Result GetSearchCapabilities(PLT_DeviceDataReference& device,
+ void* userdata = NULL);
+
+ virtual NPT_Result GetSortCapabilities(PLT_DeviceDataReference& device,
+ void* userdata = NULL);
+
+ // methods
+ virtual const NPT_Lock<PLT_DeviceDataReferenceList>& GetMediaServers() { return m_MediaServers; }
+ virtual NPT_Result FindServer(const char* uuid, PLT_DeviceDataReference& device);
+ virtual void SetDelegate(PLT_MediaBrowserDelegate* delegate) { m_Delegate = delegate; }
+
+protected:
+ // PLT_CtrlPointListener methods
+ NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device) override;
+ NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device) override;
+ NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata) override;
+ NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars) override;
+
+ // ContentDirectory service responses
+ virtual NPT_Result OnBrowseResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata);
+
+ virtual NPT_Result OnSearchResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata);
+
+ virtual NPT_Result OnGetSearchCapabilitiesResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata);
+
+ virtual NPT_Result OnGetSortCapabilitiesResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata);
+
+protected:
+ PLT_CtrlPointReference m_CtrlPoint;
+ PLT_MediaBrowserDelegate* m_Delegate;
+ NPT_Lock<PLT_DeviceDataReferenceList> m_MediaServers;
+};
+
+#endif /* _PLT_MEDIA_BROWSER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaCache.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaCache.cpp
new file mode 100644
index 0000000..aae5d01
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaCache.cpp
@@ -0,0 +1,37 @@
+/*****************************************************************
+|
+| Platinum - AV Media Cache
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaCache.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaCache.h
new file mode 100644
index 0000000..8e365d8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaCache.h
@@ -0,0 +1,203 @@
+/*****************************************************************
+|
+| Platinum - AV Media Cache
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ Simple Object Caching utility.
+ */
+
+#ifndef _PLT_MEDIA_CACHE_H_
+#define _PLT_MEDIA_CACHE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache
++---------------------------------------------------------------------*/
+/**
+ The PLT_MediaCache template provides a way to hold references to object in
+ memory.
+ */
+template <typename T, typename U>
+class PLT_MediaCache
+{
+public:
+ typedef typename NPT_Map<NPT_String,T>::Entry ElementEntry;
+ typedef typename NPT_List<ElementEntry*>::Iterator ElementIterator;
+
+ PLT_MediaCache<T,U>() {}
+ virtual ~PLT_MediaCache<T,U>() {}
+
+ NPT_Result Put(const char* root, const char* key, T& value, U* tag = NULL);
+ NPT_Result Get(const char* root, const char* key, T& value, U* tag = NULL);
+ NPT_Result Clear(const char* root, const char* key);
+ NPT_Result Clear(const char* root = NULL);
+
+private:
+ // methods
+ NPT_String GenerateKey(const char* root, const char* key);
+
+private:
+ // members
+ NPT_Mutex m_Mutex;
+ NPT_Map<NPT_String, T> m_Items;
+ NPT_Map<NPT_String, U> m_Tags;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::GenerateKey
++---------------------------------------------------------------------*/
+template <typename T, typename U>
+inline
+NPT_String
+PLT_MediaCache<T,U>::GenerateKey(const char* root, const char* key)
+{
+ // TODO: There could be collision
+ NPT_String result = root;
+ result += "/";
+ result += key;
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::Put
++---------------------------------------------------------------------*/
+template <typename T, typename U>
+inline
+NPT_Result
+PLT_MediaCache<T,U>::Put(const char* root,
+ const char* key,
+ T& value,
+ U* tag)
+{
+ NPT_AutoLock lock(m_Mutex);
+
+ NPT_String fullkey = GenerateKey(root, key);
+ if (fullkey.GetLength() == 0) return NPT_ERROR_INVALID_PARAMETERS;
+
+ m_Items.Erase(fullkey);
+ NPT_CHECK(m_Items.Put(fullkey, value));
+
+ if (tag) NPT_CHECK(m_Tags.Put(fullkey, *tag));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::Get
++---------------------------------------------------------------------*/
+template <typename T, typename U>
+inline
+NPT_Result
+PLT_MediaCache<T,U>::Get(const char* root,
+ const char* key,
+ T& value,
+ U* tag /* = NULL */)
+{
+ NPT_AutoLock lock(m_Mutex);
+
+ NPT_String fullkey = GenerateKey(root, key);
+ if (fullkey.GetLength() == 0) return NPT_ERROR_INVALID_PARAMETERS;
+
+ T* _value = NULL;
+ NPT_CHECK(m_Items.Get(fullkey, _value));
+
+ U* _tag;
+ if (tag) {
+ m_Tags.Get(fullkey, _tag);
+ if (_tag) *tag = *_tag;
+ }
+
+ value = *_value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::Clear
++---------------------------------------------------------------------*/
+template <typename T, typename U>
+inline
+NPT_Result
+PLT_MediaCache<T,U>::Clear(const char* root, const char* key)
+{
+ NPT_AutoLock lock(m_Mutex);
+
+ NPT_String fullkey = GenerateKey(root, key);
+ if (fullkey.GetLength() == 0) return NPT_ERROR_INVALID_PARAMETERS;
+
+ ElementIterator entries = m_Items.GetEntries().GetFirstItem();
+ ElementIterator entry;
+ while (entries) {
+ entry = entries++;
+ if ((*entry)->GetKey() == (fullkey)) {
+ m_Items.Erase(fullkey);
+ m_Tags.Erase(fullkey);
+ return NPT_SUCCESS;
+ }
+ }
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::Clear
++---------------------------------------------------------------------*/
+template <typename T, typename U>
+inline
+NPT_Result
+PLT_MediaCache<T,U>::Clear(const char* root)
+{
+ NPT_AutoLock lock(m_Mutex);
+
+ if (!root || root[0]=='\0')
+ return m_Items.Clear();
+
+ NPT_String key = GenerateKey(root, "");
+ ElementIterator entries = m_Items.GetEntries().GetFirstItem();
+ ElementIterator entry;
+ while (entries) {
+ entry = entries++;
+ NPT_String entry_key = (*entry)->GetKey();
+ if (entry_key.StartsWith(key)) {
+ m_Items.Erase(entry_key);
+ m_Tags.Erase(entry_key);
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+#endif /* _PLT_MEDIA_CACHE_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
new file mode 100644
index 0000000..fac1690
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
@@ -0,0 +1,1128 @@
+/*****************************************************************
+|
+| Platinum - AV Media Item
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMediaItem.h"
+#include "PltMediaServer.h"
+#include "PltDidl.h"
+#include "PltUtilities.h"
+#include "PltService.h"
+#include "PltMimeType.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.item")
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(PLT_MediaObject)
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(PLT_MediaItem)
+NPT_DEFINE_DYNAMIC_CAST_ANCHOR(PLT_MediaContainer)
+
+/*----------------------------------------------------------------------
+| PLT_PersonRoles::AddPerson
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PersonRoles::Add(const NPT_String& name, const NPT_String& role /* = "" */)
+{
+ PLT_PersonRole person;
+ person.name = name;
+ person.role = role;
+
+ return NPT_List<PLT_PersonRole>::Add(person);
+}
+
+/*----------------------------------------------------------------------
+| PLT_PersonRoles::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PersonRoles::ToDidl(NPT_String& didl, const NPT_String& tag)
+{
+ NPT_String tmp;
+ for (NPT_List<PLT_PersonRole>::Iterator it =
+ NPT_List<PLT_PersonRole>::GetFirstItem(); it; it++) {
+ // if there's an empty artist, allow it only if there's nothing else
+ if (it->name.IsEmpty() && m_ItemCount>1 && !tmp.IsEmpty()) continue;
+
+ tmp += "<upnp:" + tag;
+ if (!it->role.IsEmpty()) {
+ tmp += " role=\"";
+ PLT_Didl::AppendXmlEscape(tmp, it->role);
+ tmp += "\"";
+ }
+ tmp += ">";
+ PLT_Didl::AppendXmlEscape(tmp, it->name);
+ tmp += "</upnp:" + tag + ">";
+ }
+
+ didl += tmp;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_PersonRoles::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PersonRoles::FromDidl(const NPT_Array<NPT_XmlElementNode*>& nodes)
+{
+ for (NPT_Cardinal i=0; i<nodes.GetItemCount(); i++) {
+ PLT_PersonRole person;
+ const NPT_String* name = nodes[i]->GetText();
+ const NPT_String* role = nodes[i]->GetAttribute("role");
+ // DLNA 7.3.17
+ if (name) person.name = name->SubString(0, 1024);
+ if (role) person.role = role->SubString(0, 1024);
+ NPT_CHECK(NPT_List<PLT_PersonRole>::Add(person));
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Artworks::Add
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Artworks::Add(const NPT_String& type, const NPT_String& url)
+{
+ PLT_Artwork artwork;
+ artwork.type = type;
+ artwork.url = url;
+
+ return NPT_List<PLT_Artwork>::Add(artwork);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Artworks::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Artworks::ToDidl(NPT_String& didl, const NPT_String& tag)
+{
+ NPT_String tmp;
+ for (NPT_List<PLT_Artwork>::Iterator it =
+ NPT_List<PLT_Artwork>::GetFirstItem(); it; it++) {
+ if (it->type.IsEmpty()) continue;
+
+ tmp += "<xbmc:" + tag;
+ if (!it->type.IsEmpty()) {
+ tmp += " type=\"";
+ PLT_Didl::AppendXmlEscape(tmp, it->type);
+ tmp += "\"";
+ }
+ tmp += ">";
+ PLT_Didl::AppendXmlEscape(tmp, it->url);
+ tmp += "</xbmc:" + tag + ">";
+ }
+
+ didl += tmp;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Artworks::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Artworks::FromDidl(const NPT_Array<NPT_XmlElementNode*>& nodes)
+{
+ for (NPT_Cardinal i=0; i<nodes.GetItemCount(); i++) {
+ PLT_Artwork artwork;
+ const NPT_String* url = nodes[i]->GetText();
+ const NPT_String* type = nodes[i]->GetAttribute("type");
+ if (type) artwork.type = *type;
+ if (url) artwork.url = *url;
+ NPT_CHECK(NPT_List<PLT_Artwork>::Add(artwork));
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItemResource::PLT_MediaItemResource
++---------------------------------------------------------------------*/
+PLT_MediaItemResource::PLT_MediaItemResource()
+{
+ m_Uri = "";
+ m_ProtocolInfo = PLT_ProtocolInfo();
+ m_Duration = (NPT_UInt32)-1;
+ m_Size = (NPT_LargeSize)-1;
+ m_Protection = "";
+ m_Bitrate = (NPT_UInt32)-1;
+ m_BitsPerSample = (NPT_UInt32)-1;
+ m_SampleFrequency = (NPT_UInt32)-1;
+ m_NbAudioChannels = (NPT_UInt32)-1;
+ m_Resolution = "";
+ m_ColorDepth = (NPT_UInt32)-1;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObject::GetUPnPClass
++---------------------------------------------------------------------*/
+const char*
+PLT_MediaObject::GetUPnPClass(const char* filename,
+ const PLT_HttpRequestContext* context /* = NULL */)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ const char* ret = NULL;
+ NPT_String mime_type = PLT_MimeType::GetMimeType(filename, context);
+
+ if (mime_type.StartsWith("audio")) {
+ ret = "object.item.audioItem.musicTrack";
+ } else if (mime_type.StartsWith("video")) {
+ ret = "object.item.videoItem"; //Note: 360 wants "object.item.videoItem" and not "object.item.videoItem.Movie"
+ } else if (mime_type.StartsWith("image")) {
+ ret = "object.item.imageItem.photo";
+ } else {
+ ret = "object.item";
+ }
+
+ return ret;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObject::Reset
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaObject::Reset()
+{
+ m_ObjectClass.type = "";
+ m_ObjectClass.friendly_name = "";
+ m_ObjectID = "";
+ m_ParentID = "";
+
+ m_Title = "";
+ m_Creator = "";
+ m_Date = "";
+ m_Restricted = true;
+
+ m_People.actors.Clear();
+ m_People.artists.Clear();
+ m_People.authors.Clear();
+ m_People.directors.Clear();
+ m_People.publisher.Clear();
+
+ m_Affiliation.album = "";
+ m_Affiliation.genres.Clear();
+ m_Affiliation.playlist = "";
+
+ m_Description.description = "";
+ m_Description.long_description = "";
+ m_Description.icon_uri = "";
+ m_ExtraInfo.album_arts.Clear();
+ m_ExtraInfo.artist_discography_uri = "";
+
+ m_MiscInfo.original_track_number = 0;
+ m_MiscInfo.last_position = 0;
+ m_MiscInfo.last_time = "";
+ m_MiscInfo.play_count = -1;
+ m_MiscInfo.dvdregioncode = 0;
+ m_MiscInfo.toc = "";
+ m_MiscInfo.user_annotation = "";
+
+ m_Recorded.program_title = "";
+ m_Recorded.series_title = "";
+ m_Recorded.episode_number = 0;
+ m_Recorded.episode_count = 0;
+ m_Recorded.episode_season = 0;
+
+ m_Resources.Clear();
+
+ m_XbmcInfo.last_playerstate = "";
+ m_XbmcInfo.date_added = "";
+ m_XbmcInfo.rating = 0.0f;
+ m_XbmcInfo.votes = 0;
+ m_XbmcInfo.artwork.Clear();
+ m_XbmcInfo.unique_identifier = "";
+ m_XbmcInfo.countries.Clear();
+ m_XbmcInfo.user_rating = 0;
+
+ m_Didl = "";
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObject::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaObject::ToDidl(const NPT_String& filter, NPT_String& didl)
+{
+ return ToDidl(PLT_Didl::ConvertFilterToMask(filter), didl);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObject::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+{
+ // title is required
+ didl += "<dc:title>";
+ PLT_Didl::AppendXmlEscape(didl, m_Title);
+ didl += "</dc:title>";
+
+ // creator
+ if (mask & PLT_FILTER_MASK_CREATOR) {
+ didl += "<dc:creator>";
+ if (m_Creator.IsEmpty()) m_Creator = "Unknown";
+ PLT_Didl::AppendXmlEscape(didl, m_Creator);
+ didl += "</dc:creator>";
+ }
+
+ // date
+ if ((mask & PLT_FILTER_MASK_DATE) && !m_Date.IsEmpty()) {
+ didl += "<dc:date>";
+ PLT_Didl::AppendXmlEscape(didl, m_Date);
+ didl += "</dc:date>";
+ }
+
+ // artist
+ if (mask & PLT_FILTER_MASK_ARTIST) {
+ // force an empty artist just in case (not DLNA Compliant though)
+ //if (m_People.artists.GetItemCount() == 0) m_People.artists.Add("");
+ m_People.artists.ToDidl(didl, "artist");
+ }
+
+ // actor
+ if (mask & PLT_FILTER_MASK_ACTOR) {
+ m_People.actors.ToDidl(didl, "actor");
+ }
+
+ // actor
+ if (mask & PLT_FILTER_MASK_AUTHOR) {
+ m_People.authors.ToDidl(didl, "author");
+ }
+
+ // director
+ if (mask & PLT_FILTER_MASK_DIRECTOR) {
+ m_People.directors.ToDidl(didl, "director");
+ }
+
+ // publisher
+ if (mask & PLT_FILTER_MASK_PUBLISHER) {
+ // Add unknown publisher
+ if (m_People.publisher.GetItemCount() == 0)
+ m_People.publisher.Add("Unknown");
+
+ for (NPT_List<NPT_String>::Iterator it =
+ m_People.publisher.GetFirstItem(); it; ++it) {
+ didl += "<dc:publisher>";
+ PLT_Didl::AppendXmlEscape(didl, (*it));
+ didl += "</dc:publisher>";
+ }
+ }
+
+ // album
+ if ((mask & PLT_FILTER_MASK_ALBUM) && !m_Affiliation.album.IsEmpty()) {
+ didl += "<upnp:album>";
+ PLT_Didl::AppendXmlEscape(didl, m_Affiliation.album);
+ didl += "</upnp:album>";
+ }
+
+ // genre
+ if (mask & PLT_FILTER_MASK_GENRE) {
+ // Add unknown genre
+ if (m_Affiliation.genres.GetItemCount() == 0)
+ m_Affiliation.genres.Add("Unknown");
+
+ for (NPT_List<NPT_String>::Iterator it =
+ m_Affiliation.genres.GetFirstItem(); it; ++it) {
+ didl += "<upnp:genre>";
+ PLT_Didl::AppendXmlEscape(didl, (*it));
+ didl += "</upnp:genre>";
+ }
+ }
+
+ // album art URI
+ if ((mask & PLT_FILTER_MASK_ALBUMARTURI) && m_ExtraInfo.album_arts.GetItemCount()) {
+ for (NPT_List<PLT_AlbumArtInfo>::Iterator iter = m_ExtraInfo.album_arts.GetFirstItem();
+ iter;
+ iter++) {
+ didl += "<upnp:albumArtURI";
+ if (!(*iter).dlna_profile.IsEmpty()) {
+ didl += " dlna:profileID=\"";
+ PLT_Didl::AppendXmlEscape(didl, (*iter).dlna_profile);
+ didl += "\"";
+ }
+ didl += ">";
+ PLT_Didl::AppendXmlEscape(didl, (*iter).uri);
+ didl += "</upnp:albumArtURI>";
+ }
+ }
+
+ // description
+ if ((mask & PLT_FILTER_MASK_DESCRIPTION) && !m_Description.description.IsEmpty()) {
+ didl += "<dc:description>";
+ PLT_Didl::AppendXmlEscape(didl, m_Description.description);
+ didl += "</dc:description>";
+ }
+
+ // long description
+ if ((mask & PLT_FILTER_MASK_LONGDESCRIPTION) && !m_Description.long_description.IsEmpty()) {
+ didl += "<upnp:longDescription>";
+ PLT_Didl::AppendXmlEscape(didl, m_Description.long_description);
+ didl += "</upnp:longDescription>";
+ }
+
+ // icon
+ if ((mask & PLT_FILTER_MASK_ICON) && !m_Description.icon_uri.IsEmpty()) {
+ didl += "<upnp:icon>";
+ PLT_Didl::AppendXmlEscape(didl, m_Description.icon_uri);
+ didl += "</upnp:icon>";
+ }
+
+ // rating
+ if ((mask & PLT_FILTER_MASK_RATING) && !m_Description.rating.IsEmpty()) {
+ didl += "<upnp:rating>";
+ PLT_Didl::AppendXmlEscape(didl, m_Description.rating);
+ didl += "</upnp:rating>";
+ }
+
+ // original track number
+ if ((mask & PLT_FILTER_MASK_ORIGINALTRACK) && m_MiscInfo.original_track_number > 0) {
+ didl += "<upnp:originalTrackNumber>";
+ didl += NPT_String::FromInteger(m_MiscInfo.original_track_number);
+ didl += "</upnp:originalTrackNumber>";
+ }
+
+ // last playback position
+ if (mask & PLT_FILTER_MASK_LASTPOSITION && m_MiscInfo.last_position > 0) {
+ didl += "<upnp:lastPlaybackPosition>";
+ didl += NPT_String::FromInteger(m_MiscInfo.last_position);
+ didl += "</upnp:lastPlaybackPosition>";
+ }
+
+ // last playback datetime
+ if (mask & PLT_FILTER_MASK_LASTPLAYBACK && !m_MiscInfo.last_time.IsEmpty()) {
+ didl += "<upnp:lastPlaybackTime>";
+ PLT_Didl::AppendXmlEscape(didl, m_MiscInfo.last_time);
+ didl += "</upnp:lastPlaybackTime>";
+ }
+
+ // playcount
+ if (mask & PLT_FILTER_MASK_PLAYCOUNT && m_MiscInfo.play_count > -1) {
+ didl += "<upnp:playbackCount>";
+ didl += NPT_String::FromInteger(m_MiscInfo.play_count);
+ didl += "</upnp:playbackCount>";
+ }
+
+ // program title
+ if (mask & PLT_FILTER_MASK_PROGRAMTITLE && !m_Recorded.program_title.IsEmpty()) {
+ didl += "<upnp:programTitle>";
+ PLT_Didl::AppendXmlEscape(didl, m_Recorded.program_title);
+ didl += "</upnp:programTitle>";
+ }
+
+ // series title
+ if ((mask & PLT_FILTER_MASK_SERIESTITLE) && !m_Recorded.series_title.IsEmpty()) {
+ didl += "<upnp:seriesTitle>";
+ PLT_Didl::AppendXmlEscape(didl, m_Recorded.series_title);
+ didl += "</upnp:seriesTitle>";
+ }
+
+ // episode number
+ if ((mask & PLT_FILTER_MASK_EPISODE) && m_Recorded.episode_number > 0) {
+ didl += "<upnp:episodeNumber>";
+ didl += NPT_String::FromInteger(m_Recorded.episode_number);
+ didl += "</upnp:episodeNumber>";
+ }
+
+ // episode count
+ if ((mask & PLT_FILTER_MASK_EPISODE_COUNT) && m_Recorded.episode_count > 0) {
+ didl += "<upnp:episodeCount>";
+ didl += NPT_String::FromInteger(m_Recorded.episode_count);
+ didl += "</upnp:episodeCount>";
+ }
+
+ // episode count
+ if ((mask & PLT_FILTER_MASK_EPISODE_SEASON)) {
+ didl += "<upnp:episodeSeason>";
+ didl += NPT_String::FromInteger(m_Recorded.episode_season);
+ didl += "</upnp:episodeSeason>";
+ }
+
+ if ((mask & PLT_FILTER_MASK_TOC) && !m_MiscInfo.toc.IsEmpty()) {
+ didl += "<upnp:toc>";
+ PLT_Didl::AppendXmlEscape(didl, m_MiscInfo.toc);
+ didl += "</upnp:toc>";
+ }
+
+ // resource
+ if (mask & PLT_FILTER_MASK_RES) {
+ for (NPT_Cardinal i=0; i<m_Resources.GetItemCount(); i++) {
+ didl += "<res";
+
+ if ((mask & PLT_FILTER_MASK_RES_DURATION) && m_Resources[i].m_Duration != (NPT_UInt32)-1) {
+ didl += " duration=\"";
+ didl += PLT_Didl::FormatTimeStamp(m_Resources[i].m_Duration);
+ didl += "\"";
+ }
+
+ if ((mask & PLT_FILTER_MASK_RES_SIZE) && m_Resources[i].m_Size != (NPT_LargeSize)-1) {
+ didl += " size=\"";
+ didl += NPT_String::FromIntegerU(m_Resources[i].m_Size);
+ didl += "\"";
+ }
+
+ if ((mask & PLT_FILTER_MASK_RES_PROTECTION) && !m_Resources[i].m_Protection.IsEmpty()) {
+ didl += " protection=\"";
+ PLT_Didl::AppendXmlEscape(didl, m_Resources[i].m_Protection);
+ didl += "\"";
+ }
+
+ if ((mask & PLT_FILTER_MASK_RES_RESOLUTION) && !m_Resources[i].m_Resolution.IsEmpty()) {
+ didl += " resolution=\"";
+ PLT_Didl::AppendXmlEscape(didl, m_Resources[i].m_Resolution);
+ didl += "\"";
+ }
+
+ if ((mask & PLT_FILTER_MASK_RES_BITRATE) && m_Resources[i].m_Bitrate != (NPT_Size)-1) {
+ didl += " bitrate=\"";
+ didl += NPT_String::FromIntegerU(m_Resources[i].m_Bitrate);
+ didl += "\"";
+ }
+
+ if ((mask & PLT_FILTER_MASK_RES_BITSPERSAMPLE) && m_Resources[i].m_BitsPerSample != (NPT_Size)-1) {
+ didl += " bitsPerSample=\"";
+ didl += NPT_String::FromIntegerU(m_Resources[i].m_BitsPerSample);
+ didl += "\"";
+ }
+
+ if ((mask & PLT_FILTER_MASK_RES_SAMPLEFREQUENCY) && m_Resources[i].m_SampleFrequency != (NPT_Size)-1) {
+ didl += " sampleFrequency=\"";
+ didl += NPT_String::FromIntegerU(m_Resources[i].m_SampleFrequency);
+ didl += "\"";
+ }
+
+ if ((mask & PLT_FILTER_MASK_RES_NRAUDIOCHANNELS) && m_Resources[i].m_NbAudioChannels != (NPT_Size)-1) {
+ didl += " nrAudioChannels=\"";
+ didl += NPT_String::FromIntegerU(m_Resources[i].m_NbAudioChannels);
+ didl += "\"";
+ }
+
+ didl += " protocolInfo=\"";
+ PLT_Didl::AppendXmlEscape(didl, m_Resources[i].m_ProtocolInfo.ToString());
+ didl += "\"";
+ /* adding custom data */
+ NPT_List<NPT_Map<NPT_String, NPT_String>::Entry*>::Iterator entry = m_Resources[i].m_CustomData.GetEntries().GetFirstItem();
+ while (entry)
+ {
+ didl += " ";
+ PLT_Didl::AppendXmlEscape(didl, (*entry)->GetKey());
+ didl += "=\"";
+ PLT_Didl::AppendXmlEscape(didl, (*entry)->GetValue());
+ didl += "\"";
+
+ entry++;
+ }
+
+ didl += ">";
+ PLT_Didl::AppendXmlEscape(didl, m_Resources[i].m_Uri);
+ didl += "</res>";
+ }
+ }
+
+ //sec resources related
+ for (NPT_Cardinal i = 0; i < m_SecResources.GetItemCount(); i++) {
+ didl += "<sec:";
+ PLT_Didl::AppendXmlEscape(didl, m_SecResources[i].name);
+
+ NPT_List<NPT_Map<NPT_String, NPT_String>::Entry*>::Iterator entry = m_SecResources[i].attributes.GetEntries().GetFirstItem();
+ while (entry)
+ {
+ didl += " sec:";
+ PLT_Didl::AppendXmlEscape(didl, (*entry)->GetKey());
+ didl += "=\"";
+ PLT_Didl::AppendXmlEscape(didl, (*entry)->GetValue());
+ didl += "\"";
+
+ entry++;
+ }
+
+ didl += ">";
+ PLT_Didl::AppendXmlEscape(didl, m_SecResources[i].value);
+
+ didl += "</sec:";
+ PLT_Didl::AppendXmlEscape(didl, m_SecResources[i].name);
+ didl += ">";
+ }
+
+ // xbmc dateadded
+ if ((mask & PLT_FILTER_MASK_XBMC_DATEADDED) && !m_XbmcInfo.date_added.IsEmpty()) {
+ didl += "<xbmc:dateadded>";
+ PLT_Didl::AppendXmlEscape(didl, m_XbmcInfo.date_added);
+ didl += "</xbmc:dateadded>";
+ }
+
+ // xbmc rating
+ if (mask & PLT_FILTER_MASK_XBMC_RATING) {
+ didl += "<xbmc:rating>";
+ didl += NPT_String::Format("%.1f", m_XbmcInfo.rating);
+ didl += "</xbmc:rating>";
+ }
+
+ // xbmc votes
+ if (mask & PLT_FILTER_MASK_XBMC_VOTES && m_XbmcInfo.votes != 0) {
+ didl += "<xbmc:votes>";
+ didl += NPT_String::Format("%i", m_XbmcInfo.votes);
+ didl += "</xbmc:votes>";
+ }
+
+ // xbmc artwork
+ if (mask & PLT_FILTER_MASK_XBMC_ARTWORK) {
+ m_XbmcInfo.artwork.ToDidl(didl, "artwork");
+ }
+
+ // xbmc unique identifier
+ if (mask & PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER && !m_XbmcInfo.unique_identifier.IsEmpty()) {
+ didl += "<xbmc:uniqueidentifier>";
+ PLT_Didl::AppendXmlEscape(didl, m_XbmcInfo.unique_identifier);
+ didl += "</xbmc:uniqueidentifier>";
+ }
+
+ // country
+ if (mask & PLT_FILTER_MASK_XBMC_COUNTRY) {
+ for (NPT_List<NPT_String>::Iterator it =
+ m_XbmcInfo.countries.GetFirstItem(); it; ++it) {
+ didl += "<xbmc:country>";
+ PLT_Didl::AppendXmlEscape(didl, (*it));
+ didl += "</xbmc:country>";
+ }
+ }
+
+ // user rating
+ if (mask & PLT_FILTER_MASK_XBMC_USERRATING) {
+ didl += "<xbmc:userrating>";
+ didl += NPT_String::FromInteger(m_XbmcInfo.user_rating);
+ didl += "</xbmc:userrating>";
+ }
+
+ // xbmc last playback state
+ if (mask & PLT_FILTER_MASK_XBMC_LASTPLAYERSTATE && !m_XbmcInfo.last_playerstate.IsEmpty()) {
+ didl += "<xbmc:lastPlayerState>";
+ PLT_Didl::AppendXmlEscape(didl, m_XbmcInfo.last_playerstate);
+ didl += "</xbmc:lastPlayerState>";
+ }
+
+ // class is required
+ didl += "<upnp:class";
+ if (!m_ObjectClass.friendly_name.IsEmpty()) {
+ didl += " name=\"" + m_ObjectClass.friendly_name+"\"";
+ }
+ didl += ">";
+ PLT_Didl::AppendXmlEscape(didl, m_ObjectClass.type);
+ didl += "</upnp:class>";
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObject::FromDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+{
+ NPT_String str, xml;
+ NPT_Array<NPT_XmlElementNode*> children;
+ NPT_Result res;
+
+ // check if item is restricted (is default true?)
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(entry, "restricted", str, "", 5))) {
+ m_Restricted = PLT_Service::IsTrue(str);
+ }
+
+ // read non-required elements
+ PLT_XmlHelper::GetChildText(entry, "creator", m_Creator, didl_namespace_dc, 256);
+ PLT_XmlHelper::GetChildText(entry, "date", m_Date, didl_namespace_dc, 256);
+
+ // parse date and make sure it's valid
+ NPT_String parsed_date;
+ for (int format=0; format<=NPT_DateTime::FORMAT_RFC_1036; format++) {
+ NPT_DateTime date;
+ if (NPT_SUCCEEDED(date.FromString(m_Date, (NPT_DateTime::Format)format))) {
+ parsed_date = date.ToString((NPT_DateTime::Format)format);
+ break;
+ }
+ }
+ m_Date = parsed_date;
+
+ res = PLT_XmlHelper::GetAttribute(entry, "id", m_ObjectID);
+ NPT_CHECK_SEVERE(res);
+
+ res = PLT_XmlHelper::GetAttribute(entry, "parentID", m_ParentID);
+ NPT_CHECK_SEVERE(res);
+
+ PLT_XmlHelper::GetAttribute(entry, "refID", m_ReferenceID);
+
+ res = PLT_XmlHelper::GetChildText(entry, "title", m_Title, didl_namespace_dc);
+ NPT_CHECK_SEVERE(res);
+
+ res = PLT_XmlHelper::GetChildText(entry, "class", m_ObjectClass.type, didl_namespace_upnp);
+ NPT_CHECK_SEVERE(res);
+
+ // DLNA 7.3.17.3 max bytes for dc:title and upnp:class is 256 bytes
+ m_Title = m_Title.SubString(0, 256);
+ m_ObjectClass.type = m_ObjectClass.type.SubString(0, 256);
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "artist", didl_namespace_upnp);
+ m_People.artists.FromDidl(children);
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "author", didl_namespace_upnp);
+ m_People.authors.FromDidl(children);
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "actor", didl_namespace_upnp);
+ m_People.actors.FromDidl(children);
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "director", didl_namespace_upnp);
+ m_People.directors.FromDidl(children);
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "publisher", didl_namespace_dc);
+ for (NPT_Cardinal i=0; i<children.GetItemCount(); i++) {
+ if (children[i]->GetText()) {
+ m_People.publisher.Add(*children[i]->GetText());
+ }
+ }
+
+ PLT_XmlHelper::GetChildText(entry, "album", m_Affiliation.album, didl_namespace_upnp, 256);
+ PLT_XmlHelper::GetChildText(entry, "programTitle", m_Recorded.program_title, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "seriesTitle", m_Recorded.series_title, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "episodeNumber", str, didl_namespace_upnp);
+ NPT_UInt32 value;
+ if (NPT_FAILED(str.ToInteger(value))) value = 0;
+ m_Recorded.episode_number = value;
+ PLT_XmlHelper::GetChildText(entry, "episodeCount", str, didl_namespace_upnp);
+ if (NPT_FAILED(str.ToInteger(value))) value = 0;
+ m_Recorded.episode_count = value;
+ PLT_XmlHelper::GetChildText(entry, "episodeSeason", str, didl_namespace_upnp);
+ if (NPT_FAILED(str.ToInteger(value))) value = -1;
+ m_Recorded.episode_season = value;
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "genre", didl_namespace_upnp);
+ for (NPT_Cardinal i=0; i<children.GetItemCount(); i++) {
+ if (children[i]->GetText()) {
+ m_Affiliation.genres.Add(children[i]->GetText()->SubString(0, 256));
+ }
+ }
+
+ PLT_XmlHelper::GetChildText(entry, "description", m_Description.description, didl_namespace_dc);
+ PLT_XmlHelper::GetChildText(entry, "longDescription", m_Description.long_description, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "icon", m_Description.icon_uri, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "rating", m_Description.rating, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "toc", m_MiscInfo.toc, didl_namespace_upnp);
+
+ // album arts
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "albumArtURI", didl_namespace_upnp);
+ for (NPT_Cardinal i=0; i<children.GetItemCount(); i++) {
+ if (children[i]->GetText()) {
+ PLT_AlbumArtInfo info;
+ info.uri = children[i]->GetText()->SubString(0, 1024);
+ PLT_XmlHelper::GetAttribute(children[i], "profileID", info.dlna_profile, didl_namespace_dlna);
+ m_ExtraInfo.album_arts.Add(info);
+ }
+ }
+
+ PLT_XmlHelper::GetChildText(entry, "originalTrackNumber", str, didl_namespace_upnp);
+ if (NPT_FAILED(str.ToInteger(value))) value = 0;
+ m_MiscInfo.original_track_number = value;
+
+ PLT_XmlHelper::GetChildText(entry, "lastPlaybackPosition", str, didl_namespace_upnp);
+ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(str, value))) {
+ // fall back to raw integer parsing
+ if (NPT_FAILED(str.ToInteger(value))) value = 0;
+ }
+ m_MiscInfo.last_position = value;
+
+ PLT_XmlHelper::GetChildText(entry, "lastPlaybackTime", m_MiscInfo.last_time, didl_namespace_upnp, 256);
+ NPT_String parsed_last_time;
+ for (int format=0; format<=NPT_DateTime::FORMAT_RFC_1036; format++) {
+ NPT_DateTime date;
+ if (NPT_SUCCEEDED(date.FromString(m_MiscInfo.last_time, (NPT_DateTime::Format)format))) {
+ parsed_last_time = date.ToString((NPT_DateTime::Format)format);
+ break;
+ }
+ }
+ m_MiscInfo.last_time = parsed_last_time;
+
+ PLT_XmlHelper::GetChildText(entry, "playbackCount", str, didl_namespace_upnp);
+ if (NPT_FAILED(str.ToInteger(value))) value = -1;
+ m_MiscInfo.play_count = value;
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "res");
+ for (NPT_Cardinal i=0; i<children.GetItemCount(); i++) {
+ PLT_MediaItemResource resource;
+
+ // extract url
+ if (children[i]->GetText() == NULL) {
+ NPT_LOG_WARNING_1("No resource text found in: %s", (const char*)PLT_XmlHelper::Serialize(*children[i]));
+ } else {
+ resource.m_Uri = children[i]->GetText()->SubString(0, 1024);
+
+ // basic uri validation, ignoring scheme (could be rtsp)
+ NPT_HttpUrl url(resource.m_Uri, true);
+ if (!url.IsValid()) {
+ NPT_LOG_WARNING_1("Invalid resource uri: %s", (const char*)resource.m_Uri);
+ continue;
+ }
+ }
+
+ // extract protocol info
+ NPT_String protocol_info;
+ res = PLT_XmlHelper::GetAttribute(children[i], "protocolInfo", protocol_info, "", 256);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_WARNING_1("No protocol info found in: %s", (const char*)PLT_XmlHelper::Serialize(*children[i]));
+ } else {
+ resource.m_ProtocolInfo = PLT_ProtocolInfo(protocol_info);
+ if (!resource.m_ProtocolInfo.IsValid()) {
+ NPT_LOG_WARNING_1("Invalid resource protocol info: %s", (const char*)protocol_info);
+ }
+ }
+
+ // extract known attributes
+ PLT_XmlHelper::GetAttribute(children[i], "protection", resource.m_Protection, "", 256);
+ PLT_XmlHelper::GetAttribute(children[i], "resolution", resource.m_Resolution, "", 256);
+
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(children[i], "size", str, "", 256))) {
+ if (NPT_FAILED(str.ToInteger64(resource.m_Size))) resource.m_Size = (NPT_Size)-1;
+ }
+
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(children[i], "duration", str, "", 256))) {
+ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(str, resource.m_Duration))) {
+ // if error while converting, ignore and set to -1 to indicate we don't know the duration
+ resource.m_Duration = (NPT_UInt32)-1;
+ PLT_XmlHelper::RemoveAttribute(children[i], "duration");
+ } else {
+ // DLNA: reformat duration in case it was not compliant
+ str = PLT_Didl::FormatTimeStamp(resource.m_Duration);
+ PLT_XmlHelper::SetAttribute(children[i], "duration", str);
+ }
+ }
+ m_Resources.Add(resource);
+ }
+
+ PLT_XmlHelper::GetChildText(entry, "lastPlayerState", m_XbmcInfo.last_playerstate, didl_namespace_xbmc, 2048);
+
+ PLT_XmlHelper::GetChildText(entry, "dateadded", m_XbmcInfo.date_added, didl_namespace_xbmc, 256);
+ // parse date and make sure it's valid
+ for (int format=0; format<=NPT_DateTime::FORMAT_RFC_1036; format++) {
+ NPT_DateTime date;
+ if (NPT_SUCCEEDED(date.FromString(m_XbmcInfo.date_added, (NPT_DateTime::Format)format))) {
+ parsed_date = date.ToString((NPT_DateTime::Format)format);
+ break;
+ }
+ }
+ m_XbmcInfo.date_added = parsed_date;
+
+ PLT_XmlHelper::GetChildText(entry, "rating", str, didl_namespace_xbmc);
+ NPT_Float floatValue;
+ if (NPT_FAILED(str.ToFloat(floatValue))) floatValue = 0.0;
+ m_XbmcInfo.rating = floatValue;
+
+ PLT_XmlHelper::GetChildText(entry, "votes", str, didl_namespace_xbmc, 256);
+ NPT_Int32 intValue;
+ if (NPT_FAILED(str.ToInteger(intValue))) intValue = 0;
+ m_XbmcInfo.votes = intValue;
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "artwork", didl_namespace_xbmc);
+ m_XbmcInfo.artwork.FromDidl(children);
+
+ PLT_XmlHelper::GetChildText(entry, "uniqueidentifier", m_XbmcInfo.unique_identifier, didl_namespace_xbmc, 256);
+
+ // re serialize the entry didl as a we might need to pass it to a renderer
+ // we may have modified the tree to "fix" issues, so as not to break a renderer
+ // (don't write xml prefix as this didl could be part of a larger document)
+ //res = PLT_XmlHelper::Serialize(*entry, xml, false);
+ m_Didl = "";
+ res = ToDidl(PLT_FILTER_MASK_ALL, m_Didl);
+ NPT_CHECK_SEVERE(res);
+
+ m_Didl = didl_header + m_Didl + didl_footer;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObjectList::PLT_MediaObjectList
++---------------------------------------------------------------------*/
+PLT_MediaObjectList::PLT_MediaObjectList()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObjectList::~PLT_MediaObjectList
++---------------------------------------------------------------------*/
+PLT_MediaObjectList::~PLT_MediaObjectList()
+{
+ Apply(NPT_ObjectDeleter<PLT_MediaObject>());
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem::PLT_MediaItem
++---------------------------------------------------------------------*/
+PLT_MediaItem::PLT_MediaItem()
+{
+ Reset();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem::~PLT_MediaItem
++---------------------------------------------------------------------*/
+PLT_MediaItem::~PLT_MediaItem()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaItem::ToDidl(const NPT_String& filter, NPT_String& didl)
+{
+ return PLT_MediaObject::ToDidl(filter, didl);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaItem::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+{
+ didl += "<item id=\"";
+
+ PLT_Didl::AppendXmlEscape(didl, m_ObjectID);
+ didl += "\" parentID=\"";
+ PLT_Didl::AppendXmlEscape(didl, m_ParentID);
+
+ if ((mask & PLT_FILTER_MASK_REFID) && !m_ReferenceID.IsEmpty()) {
+ didl += "\" refID=\"";
+ PLT_Didl::AppendXmlEscape(didl, m_ReferenceID);
+ }
+
+ didl += "\" restricted=\"";
+ didl += m_Restricted?"1\"":"0\"";
+
+ didl += ">";
+
+ NPT_CHECK_SEVERE(PLT_MediaObject::ToDidl(mask, didl));
+
+ /* close tag */
+ didl += "</item>";
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem::FromDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaItem::FromDidl(NPT_XmlElementNode* entry)
+{
+ /* reset first */
+ Reset();
+
+ if (entry->GetTag().Compare("item", true) != 0) {
+ NPT_CHECK_SEVERE(NPT_ERROR_INTERNAL);
+ }
+
+ NPT_Result result = PLT_MediaObject::FromDidl(entry);
+
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::PLT_MediaContainer
++---------------------------------------------------------------------*/
+PLT_MediaContainer::PLT_MediaContainer()
+{
+ Reset();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::~PLT_MediaContainer
++---------------------------------------------------------------------*/
+PLT_MediaContainer::~PLT_MediaContainer(void)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::Reset
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaContainer::Reset()
+{
+ m_SearchClasses.Clear();
+ m_Searchable = false;
+ m_ChildrenCount = -1;
+ m_ContainerUpdateID = 0;
+
+ return PLT_MediaObject::Reset();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaContainer::ToDidl(const NPT_String& filter, NPT_String& didl)
+{
+ return PLT_MediaObject::ToDidl(filter, didl);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaContainer::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+{
+ // container id property
+ didl += "<container id=\"";
+ PLT_Didl::AppendXmlEscape(didl, m_ObjectID);
+
+ // parent id property
+ didl += "\" parentID=\"";
+ PLT_Didl::AppendXmlEscape(didl, m_ParentID);
+
+ // ref id
+ if ((mask & PLT_FILTER_MASK_REFID) && !m_ReferenceID.IsEmpty()) {
+ didl += "\" refID=\"";
+ PLT_Didl::AppendXmlEscape(didl, m_ReferenceID);
+ }
+
+ // restricted property
+ didl += "\" restricted=\"";
+ didl += m_Restricted?"1\"":"0\"";
+
+ // searchable property
+ if (mask & PLT_FILTER_MASK_SEARCHABLE) {
+ didl += " searchable=\"";
+ didl += m_Searchable?"1\"":"0\"";
+ }
+
+ // childcount property
+ if ((mask & PLT_FILTER_MASK_CHILDCOUNT) && m_ChildrenCount != -1) {
+ didl += " childCount=\"";
+ didl += NPT_String::FromInteger(m_ChildrenCount);
+ didl += "\"";
+ }
+
+ didl += ">";
+
+ if ((mask & PLT_FILTER_MASK_SEARCHCLASS) && m_SearchClasses.GetItemCount()) {
+ NPT_List<PLT_SearchClass>::Iterator search_class = m_SearchClasses.GetFirstItem();
+ while (search_class) {
+ didl += "<upnp:searchClass includeDerived=\"";
+ didl += (*search_class).include_derived?"1\"":"0\"";
+
+ // frienly name is any
+ if (!(*search_class).friendly_name.IsEmpty()) {
+ didl += " name=\"" + (*search_class).friendly_name + "\"";
+ }
+ didl += ">";
+ didl += (*search_class).type;
+ didl += "</upnp:searchClass>";
+
+ ++search_class;
+ }
+ }
+
+ NPT_CHECK_SEVERE(PLT_MediaObject::ToDidl(mask, didl));
+
+ /* close tag */
+ didl += "</container>";
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::FromDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaContainer::FromDidl(NPT_XmlElementNode* entry)
+{
+ NPT_String str;
+
+ /* reset first */
+ Reset();
+
+ // check entry type
+ if (entry->GetTag().Compare("Container", true) != 0)
+ return NPT_ERROR_INTERNAL;
+
+ // check if item is searchable (is default true?)
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(entry, "searchable", str, "", 5))) {
+ m_Searchable = PLT_Service::IsTrue(str);
+ }
+
+ // look for childCount
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(entry, "childCount", str, "", 256))) {
+ NPT_UInt32 count;
+ NPT_CHECK_SEVERE(str.ToInteger(count));
+ m_ChildrenCount = count;
+ }
+
+ // upnp:searchClass child elements
+ NPT_Array<NPT_XmlElementNode*> children;
+ PLT_XmlHelper::GetChildren(entry, children, "upnp:searchClass");
+
+ for (NPT_Cardinal i=0; i<children.GetItemCount(); i++) {
+ PLT_SearchClass search_class;
+
+ // extract url
+ if (children[i]->GetText() == NULL) {
+ NPT_LOG_WARNING_1("No searchClass text found in: %s",
+ (const char*)PLT_XmlHelper::Serialize(*children[i]));
+ continue;
+ }
+
+ // DLNA 7.3.17.4
+ search_class.type = children[i]->GetText()->SubString(0, 256);
+
+ // extract optional attribute name
+ PLT_XmlHelper::GetAttribute(children[i], "name", search_class.friendly_name);
+
+ // includeDerived property
+ if (NPT_FAILED(PLT_XmlHelper::GetAttribute(children[i], "includeDerived", str))) {
+ NPT_LOG_WARNING_1("No required attribute searchClass@includeDerived found in: %s",
+ (const char*)PLT_XmlHelper::Serialize(*children[i]));
+ continue;
+ }
+
+ search_class.include_derived = PLT_Service::IsTrue(str);
+ m_SearchClasses.Add(search_class);
+ }
+
+ return PLT_MediaObject::FromDidl(entry);
+}
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
new file mode 100644
index 0000000..3a13967
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
@@ -0,0 +1,348 @@
+/*****************************************************************
+|
+| Platinum - AV Media Item
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP AV Media Object reprensentation.
+ */
+
+#ifndef _PLT_MEDIA_ITEM_H_
+#define _PLT_MEDIA_ITEM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttp.h"
+#include "PltProtocolInfo.h"
+
+/*----------------------------------------------------------------------
+| typedefs
++---------------------------------------------------------------------*/
+/**
+ The PLT_ObjectClass struct is used to assign a type to a PLT_MediaObject.
+ */
+typedef struct {
+ NPT_String type;
+ NPT_String friendly_name;
+} PLT_ObjectClass;
+
+typedef struct {
+ NPT_String type;
+ NPT_String friendly_name;
+ bool include_derived;
+} PLT_SearchClass;
+
+typedef struct {
+ NPT_String name;
+ NPT_String role;
+} PLT_PersonRole;
+
+class PLT_PersonRoles : public NPT_List<PLT_PersonRole>
+{
+public:
+ NPT_Result Add(const NPT_String& name, const NPT_String& role = "");
+ NPT_Result ToDidl(NPT_String& didl, const NPT_String& tag);
+ NPT_Result FromDidl(const NPT_Array<NPT_XmlElementNode*>& nodes);
+};
+
+typedef struct {
+ NPT_String allowed_use; // (CSV)
+ NPT_String validity_start;
+ NPT_String validity_end;
+ NPT_String remaining_time;
+ NPT_String usage_info;
+ NPT_String rights_info_uri;
+ NPT_String content_info_uri;
+} PLT_Constraint;
+
+typedef struct {
+ PLT_PersonRoles artists;
+ PLT_PersonRoles actors;
+ PLT_PersonRoles authors;
+ NPT_String producer; //TODO: can be multiple
+ PLT_PersonRoles directors;
+ NPT_List<NPT_String> publisher;
+ NPT_String contributor; // should match m_Creator (dc:creator) //TODO: can be multiple
+} PLT_PeopleInfo;
+
+typedef struct {
+ NPT_List<NPT_String> genres;
+ NPT_String album; //TODO: can be multiple
+ NPT_String playlist; // dc:title of the playlist item the content belongs too //TODO: can be multiple
+} PLT_AffiliationInfo;
+
+typedef struct {
+ NPT_String description;
+ NPT_String long_description;
+ NPT_String icon_uri;
+ NPT_String region;
+ NPT_String rating;
+ NPT_String rights; //TODO: can be multiple
+ NPT_String date;
+ NPT_String language;
+} PLT_Description;
+
+typedef struct {
+ NPT_String uri;
+ NPT_String dlna_profile;
+} PLT_AlbumArtInfo;
+
+typedef struct {
+ NPT_List<PLT_AlbumArtInfo> album_arts;
+ NPT_String artist_discography_uri;
+ NPT_String lyrics_uri;
+ NPT_List<NPT_String> relations; // dc:relation
+} PLT_ExtraInfo;
+
+typedef struct {
+ NPT_UInt32 dvdregioncode;
+ NPT_UInt32 original_track_number;
+ NPT_String toc;
+ NPT_String user_annotation; //TODO: can be multiple
+ NPT_UInt32 last_position;
+ NPT_String last_time;
+ NPT_Int32 play_count;
+} PLT_MiscInfo;
+
+typedef struct {
+ NPT_UInt64 total;
+ NPT_UInt64 used;
+ NPT_UInt64 free;
+ NPT_UInt64 max_partition;
+ NPT_UInt64 medium;
+} PLT_StorageInfo;
+
+typedef struct {
+ NPT_String program_title;
+ NPT_String series_title;
+ NPT_UInt32 episode_number;
+ NPT_UInt32 episode_count;
+ NPT_UInt32 episode_season;
+} PLT_RecordedInfo;
+
+typedef struct {
+ NPT_String type;
+ NPT_String url;
+} PLT_Artwork;
+
+class PLT_Artworks : public NPT_List<PLT_Artwork>
+{
+public:
+ NPT_Result Add(const NPT_String& type, const NPT_String& url);
+ NPT_Result ToDidl(NPT_String& didl, const NPT_String& tag);
+ NPT_Result FromDidl(const NPT_Array<NPT_XmlElementNode*>& nodes);
+};
+
+typedef struct {
+ NPT_String last_playerstate;
+ NPT_String date_added;
+ NPT_Float rating;
+ NPT_Int32 votes;
+ PLT_Artworks artwork;
+ NPT_String unique_identifier;
+ NPT_List<NPT_String> countries;
+ NPT_Int32 user_rating;
+} PLT_XbmcInfo;
+
+typedef struct {
+ NPT_String name;
+ NPT_Map<NPT_String, NPT_String> attributes;
+ NPT_String value;
+} PLT_SecResource;
+
+/*----------------------------------------------------------------------
+| PLT_MediaItemResource
++---------------------------------------------------------------------*/
+class PLT_MediaItemResource
+{
+public:
+ PLT_MediaItemResource();
+ ~PLT_MediaItemResource() {}
+
+ NPT_String m_Uri;
+ PLT_ProtocolInfo m_ProtocolInfo;
+ NPT_UInt32 m_Duration; /* seconds */
+ NPT_LargeSize m_Size;
+ NPT_String m_Protection;
+ NPT_UInt32 m_Bitrate; /* bytes/seconds */
+ NPT_UInt32 m_BitsPerSample;
+ NPT_UInt32 m_SampleFrequency;
+ NPT_UInt32 m_NbAudioChannels;
+ NPT_String m_Resolution;
+ NPT_UInt32 m_ColorDepth;
+ /* to add custom data to resource, that are not standard one, or are only
+ proper for some type of devices (UPnP)*/
+ NPT_Map<NPT_String, NPT_String> m_CustomData;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaObject
++---------------------------------------------------------------------*/
+/**
+ The PLT_MediaObject class is any data entity that can be returned by a
+ ContentDirectory Service from a browsing or searching action. This is the
+ base class from which PLT_MediaItem and PLT_MediaContainer derive.
+ */
+class PLT_MediaObject
+{
+protected:
+ NPT_IMPLEMENT_DYNAMIC_CAST(PLT_MediaObject)
+
+ PLT_MediaObject() : m_Restricted(true) {}
+
+public:
+ virtual ~PLT_MediaObject() {}
+
+ bool IsContainer() { return m_ObjectClass.type.StartsWith("object.container"); }
+
+ static const char* GetUPnPClass(const char* filename,
+ const PLT_HttpRequestContext* context = NULL);
+
+ virtual NPT_Result Reset();
+ virtual NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl);
+ virtual NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl);
+ virtual NPT_Result FromDidl(NPT_XmlElementNode* entry);
+
+public:
+ /* common properties */
+ PLT_ObjectClass m_ObjectClass;
+ NPT_String m_ObjectID;
+ NPT_String m_ParentID;
+ NPT_String m_ReferenceID;
+
+ /* metadata */
+ NPT_String m_Title;
+ NPT_String m_Creator;
+ NPT_String m_Date;
+ PLT_PeopleInfo m_People;
+ PLT_AffiliationInfo m_Affiliation;
+ PLT_Description m_Description;
+ PLT_RecordedInfo m_Recorded;
+
+ /* properties */
+ bool m_Restricted;
+
+ /* extras */
+ PLT_ExtraInfo m_ExtraInfo;
+
+ /* miscellaneous info */
+ PLT_MiscInfo m_MiscInfo;
+
+ /* resources related */
+ NPT_Array<PLT_MediaItemResource> m_Resources;
+
+ /* sec resources related */
+ NPT_Array<PLT_SecResource> m_SecResources;
+
+ /* XBMC specific */
+ PLT_XbmcInfo m_XbmcInfo;
+
+ /* original DIDL for Control Points to pass to a renderer when invoking SetAVTransportURI */
+ NPT_String m_Didl;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem
++---------------------------------------------------------------------*/
+/**
+ The PLT_MediaItem class represents a first-level class derived directly from
+ PLT_MediaObject. It most often represents a single piece of AV data.
+ */
+class PLT_MediaItem : public PLT_MediaObject
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST_D(PLT_MediaItem, PLT_MediaObject)
+
+ PLT_MediaItem();
+ ~PLT_MediaItem() override;
+
+ // PLT_MediaObject methods
+ NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl) override;
+ NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl) override;
+ NPT_Result FromDidl(NPT_XmlElementNode* entry) override;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer
++---------------------------------------------------------------------*/
+/**
+ The PLT_MediaContainer class represents a first-level class derived directly
+ from PLT_MediaObject. A PLT_MediaContainer represents a collection of
+ PLT_MediaObject instances.
+ */
+class PLT_MediaContainer : public PLT_MediaObject
+{
+public:
+ NPT_IMPLEMENT_DYNAMIC_CAST_D(PLT_MediaContainer, PLT_MediaObject)
+
+ PLT_MediaContainer();
+ ~PLT_MediaContainer() override;
+
+ // PLT_MediaObject methods
+ NPT_Result Reset() override;
+ NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl) override;
+ NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl) override;
+ NPT_Result FromDidl(NPT_XmlElementNode* entry) override;
+
+public:
+ NPT_List<PLT_SearchClass> m_SearchClasses;
+
+ /* properties */
+ bool m_Searchable;
+
+ /* container info related */
+ NPT_Int32 m_ChildrenCount;
+ NPT_UInt32 m_ContainerUpdateID;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaObjectList
++---------------------------------------------------------------------*/
+/**
+ The PLT_MediaObjectList class is a list of PLT_MediaObject instances.
+ */
+class PLT_MediaObjectList : public NPT_List<PLT_MediaObject*>
+{
+public:
+ PLT_MediaObjectList();
+
+protected:
+ virtual ~PLT_MediaObjectList(void);
+ friend class NPT_Reference<PLT_MediaObjectList>;
+};
+
+typedef NPT_Reference<PLT_MediaObjectList> PLT_MediaObjectListReference;
+typedef NPT_Reference<PLT_MediaObject> PLT_MediaObjectReference;
+
+#endif /* _PLT_MEDIA_ITEM_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
new file mode 100644
index 0000000..8686aa9
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
@@ -0,0 +1,711 @@
+/*****************************************************************
+|
+| Platinum - AV Media Server Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltMediaServer.h"
+#include "PltMediaItem.h"
+#include "PltService.h"
+#include "PltTaskManager.h"
+#include "PltHttpServer.h"
+#include "PltDidl.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server")
+
+/*----------------------------------------------------------------------
+| forward references
++---------------------------------------------------------------------*/
+extern NPT_UInt8 MS_ConnectionManagerSCPD[];
+extern NPT_UInt8 MS_ContentDirectorywSearchSCPD[];
+
+const char* BrowseFlagsStr[] = {
+ "BrowseMetadata",
+ "BrowseDirectChildren"
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::PLT_MediaServer
++---------------------------------------------------------------------*/
+PLT_MediaServer::PLT_MediaServer(const char* friendly_name,
+ bool show_ip /* = false */,
+ const char* uuid /* = NULL */,
+ NPT_UInt16 port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_DeviceHost("/DeviceDescription.xml",
+ uuid,
+ "urn:schemas-upnp-org:device:MediaServer:1",
+ friendly_name,
+ show_ip,
+ port,
+ port_rebind),
+ m_Delegate(NULL)
+{
+ m_ModelDescription = "Plutinosoft AV Media Server Device";
+ m_ModelName = "AV Media Server Device";
+ m_ModelURL = "http://www.plutinosoft.com/platinum";
+ m_DlnaDoc = "DMS-1.50";
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::~PLT_MediaServer
++---------------------------------------------------------------------*/
+PLT_MediaServer::~PLT_MediaServer()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::SetupServices
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::SetupServices()
+{
+ NPT_Reference<PLT_Service> service;
+
+ {
+ service = new PLT_Service(
+ this,
+ "urn:schemas-upnp-org:service:ContentDirectory:1",
+ "urn:upnp-org:serviceId:ContentDirectory",
+ "ContentDirectory");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ContentDirectorywSearchSCPD));
+ NPT_CHECK_FATAL(AddService(service.AsPointer()));
+
+ service->SetStateVariable("ContainerUpdateIDs", "");
+ service->SetStateVariableRate("ContainerUpdateIDs", NPT_TimeInterval(2.));
+ service->SetStateVariable("SystemUpdateID", "0");
+ service->SetStateVariableRate("SystemUpdateID", NPT_TimeInterval(2.));
+ service->SetStateVariable("SearchCapability", "@id,@refID,dc:title,upnp:class,upnp:genre,upnp:artist,upnp:author,upnp:author@role,upnp:album,dc:creator,res@size,res@duration,res@protocolInfo,res@protection,dc:publisher,dc:language,upnp:originalTrackNumber,dc:date,upnp:producer,upnp:rating,upnp:actor,upnp:director,upnp:toc,dc:description,microsoft:userRatingInStars,microsoft:userEffectiveRatingInStars,microsoft:userRating,microsoft:userEffectiveRating,microsoft:serviceProvider,microsoft:artistAlbumArtist,microsoft:artistPerformer,microsoft:artistConductor,microsoft:authorComposer,microsoft:authorOriginalLyricist,microsoft:authorWriter,upnp:userAnnotation,upnp:channelName,upnp:longDescription,upnp:programTitle");
+ service->SetStateVariable("SortCapability", "dc:title,upnp:genre,upnp:album,dc:creator,res@size,res@duration,res@bitrate,dc:publisher,dc:language,upnp:originalTrackNumber,dc:date,upnp:producer,upnp:rating,upnp:actor,upnp:director,upnp:toc,dc:description,microsoft:year,microsoft:userRatingInStars,microsoft:userEffectiveRatingInStars,microsoft:userRating,microsoft:userEffectiveRating,microsoft:serviceProvider,microsoft:artistAlbumArtist,microsoft:artistPerformer,microsoft:artistConductor,microsoft:authorComposer,microsoft:authorOriginalLyricist,microsoft:authorWriter,microsoft:sourceUrl,upnp:userAnnotation,upnp:channelName,upnp:longDescription,upnp:programTitle");
+
+ service.Detach();
+ service = NULL;
+ }
+
+ {
+ service = new PLT_Service(
+ this,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "urn:upnp-org:serviceId:ConnectionManager",
+ "ConnectionManager");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ConnectionManagerSCPD));
+ NPT_CHECK_FATAL(AddService(service.AsPointer()));
+
+ service->SetStateVariable("CurrentConnectionIDs", "0");
+ service->SetStateVariable("SinkProtocolInfo", "");
+ service->SetStateVariable("SourceProtocolInfo", "http-get:*:*:*");
+
+ service.Detach();
+ service = NULL;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::UpdateSystemUpdateID
++---------------------------------------------------------------------*/
+void
+PLT_MediaServer::UpdateSystemUpdateID(NPT_UInt32 update)
+{
+ NPT_COMPILER_UNUSED(update);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::UpdateContainerUpdateID
++---------------------------------------------------------------------*/
+void PLT_MediaServer::UpdateContainerUpdateID(const char* id, NPT_UInt32 update)
+{
+ NPT_COMPILER_UNUSED(id);
+ NPT_COMPILER_UNUSED(update);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ /* parse the action name */
+ NPT_String name = action->GetActionDesc().GetName();
+
+ // ContentDirectory
+ if (name.Compare("Browse", true) == 0) {
+ return OnBrowse(action, context);
+ }
+ if (name.Compare("Search", true) == 0) {
+ return OnSearch(action, context);
+ }
+ if (name.Compare("UpdateObject", true) == 0) {
+ return OnUpdate(action, context);
+ }
+ if (name.Compare("GetSystemUpdateID", true) == 0) {
+ return OnGetSystemUpdateID(action, context);
+ }
+ if (name.Compare("GetSortCapabilities", true) == 0) {
+ return OnGetSortCapabilities(action, context);
+ }
+ if (name.Compare("GetSearchCapabilities", true) == 0) {
+ return OnGetSearchCapabilities(action, context);
+ }
+
+ // ConnectionMananger
+ if (name.Compare("GetCurrentConnectionIDs", true) == 0) {
+ return OnGetCurrentConnectionIDs(action, context);
+ }
+ if (name.Compare("GetProtocolInfo", true) == 0) {
+ return OnGetProtocolInfo(action, context);
+ }
+ if (name.Compare("GetCurrentConnectionInfo", true) == 0) {
+ return OnGetCurrentConnectionInfo(action, context);
+ }
+
+ action->SetError(401,"No Such Action.");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::ProcessHttpGetRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::ProcessHttpGetRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ /* Try to handle file request */
+ if (m_Delegate) return m_Delegate->ProcessFileRequest(request, context, response);
+
+ return NPT_ERROR_NO_SUCH_ITEM;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetCurrentConnectionIDs
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetCurrentConnectionIDs(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetProtocolInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetProtocolInfo(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetCurrentConnectionInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetCurrentConnectionInfo(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ if (NPT_FAILED(action->VerifyArgumentValue("ConnectionID", "0"))) {
+ action->SetError(706,"No Such Connection.");
+ return NPT_FAILURE;
+ }
+
+ if (NPT_FAILED(action->SetArgumentValue("RcsID", "-1"))){
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("AVTransportID", "-1"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("ProtocolInfo", "http-get:*:*:*"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("PeerConnectionManager", "/"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("PeerConnectionID", "-1"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("Direction", "Output"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("Status", "Unknown"))) {
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetSortCapabilities
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetSortCapabilities(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetSearchCapabilities
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetSearchCapabilities(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetSystemUpdateID
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetSystemUpdateID(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::ParseBrowseFlag
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::ParseBrowseFlag(const char* str, BrowseFlags& flag)
+{
+ if (NPT_String::Compare(str, BrowseFlagsStr[0], true) == 0) {
+ flag = BROWSEMETADATA;
+ return NPT_SUCCESS;
+ }
+ if (NPT_String::Compare(str, BrowseFlagsStr[1], true) == 0) {
+ flag = BROWSEDIRECTCHILDREN;
+ return NPT_SUCCESS;
+ }
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::ParseSort
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::ParseSort(const NPT_String& sort, NPT_List<NPT_String>& list)
+{
+ // reset output params first
+ list.Clear();
+
+ // easy out
+ if (sort.GetLength() == 0 || sort == "*") return NPT_SUCCESS;
+
+ list = sort.Split(",");
+
+ // verify each property has a namespace
+ NPT_List<NPT_String>::Iterator property = list.GetFirstItem();
+ while (property) {
+ NPT_List<NPT_String> parsed_property = (*property).Split(":");
+ if (parsed_property.GetItemCount() != 2)
+ parsed_property = (*property).Split("@");
+ if (parsed_property.GetItemCount() != 2 ||
+ (!(*property).StartsWith("-") && !(*property).StartsWith("+"))) {
+ NPT_LOG_WARNING_1("Invalid SortCriteria property %s", (*property).GetChars());
+ return NPT_FAILURE;
+ }
+ property++;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::ParseTagList
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::ParseTagList(const NPT_String& updates, NPT_Map<NPT_String,NPT_String>& tags)
+{
+ // reset output params first
+ tags.Clear();
+
+ NPT_List<NPT_String> split = updates.Split(",");
+ NPT_XmlNode* node = NULL;
+ NPT_XmlElementNode* didl_partial = NULL;
+ NPT_XmlParser parser;
+
+ // as these are single name value pairs, separated by commas we wrap in a tag
+ // to create a valid tree
+ NPT_String xml("<TagValueList>");
+ for (NPT_List<NPT_String>::Iterator entry = split.GetFirstItem(); entry; entry++) {
+ NPT_String& element = (*entry);
+ if (element.IsEmpty())
+ xml.Append("<empty>empty</empty>");
+ else
+ xml.Append(element);
+ }
+ xml.Append("</TagValueList>");
+
+ NPT_LOG_FINE("Parsing TagList...");
+ NPT_CHECK_LABEL_SEVERE(parser.Parse(xml, node), cleanup);
+ if (!node || !node->AsElementNode()) {
+ NPT_LOG_SEVERE("Invalid node type");
+ goto cleanup;
+ }
+
+ didl_partial = node->AsElementNode();
+ if (didl_partial->GetTag().Compare("TagValueList", true)) {
+ NPT_LOG_SEVERE("Invalid node tag");
+ goto cleanup;
+ }
+
+ for (NPT_List<NPT_XmlNode*>::Iterator children = didl_partial->GetChildren().GetFirstItem(); children; children++) {
+ NPT_XmlElementNode* child = (*children)->AsElementNode();
+ if (!child) continue;
+ const NPT_String *txt = child->GetText();
+ tags[child->GetTag()] = txt ? txt->GetChars() : "";
+ }
+
+ return NPT_SUCCESS;
+
+cleanup:
+ if (node) delete node;
+ return NPT_FAILURE;
+}
+
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnBrowse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnBrowse(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_Result res;
+ NPT_String object_id;
+ NPT_String browse_flag_val;
+ NPT_String filter;
+ NPT_String start;
+ NPT_String count;
+ NPT_String sort;
+ NPT_List<NPT_String> sort_list;
+
+ if (NPT_FAILED(action->GetArgumentValue("ObjectId", object_id)) ||
+ NPT_FAILED(action->GetArgumentValue("BrowseFlag", browse_flag_val)) ||
+ NPT_FAILED(action->GetArgumentValue("Filter", filter)) ||
+ NPT_FAILED(action->GetArgumentValue("StartingIndex", start)) ||
+ NPT_FAILED(action->GetArgumentValue("RequestedCount", count)) ||
+ NPT_FAILED(action->GetArgumentValue("SortCriteria", sort))) {
+ NPT_LOG_WARNING("Missing arguments");
+ action->SetError(402, "Invalid args");
+ return NPT_SUCCESS;
+ }
+
+ /* extract flag */
+ BrowseFlags flag;
+ if (NPT_FAILED(ParseBrowseFlag(browse_flag_val, flag))) {
+ /* error */
+ NPT_LOG_WARNING_1("BrowseFlag value not allowed (%s)", (const char*)browse_flag_val);
+ action->SetError(402, "Invalid args");
+ return NPT_SUCCESS;
+ }
+
+ /* convert index and counts to int */
+ NPT_UInt32 starting_index, requested_count;
+ if (NPT_FAILED(start.ToInteger(starting_index)) ||
+ NPT_FAILED(count.ToInteger(requested_count)) ||
+ PLT_Didl::ConvertFilterToMask(filter) == 0) {
+ NPT_LOG_WARNING_3("Invalid arguments (%s, %s, %s)",
+ start.GetChars(), count.GetChars(), filter.GetChars());
+ action->SetError(402, "Invalid args");
+ return NPT_FAILURE;
+ }
+
+ /* parse sort criteria for validation */
+ if (NPT_FAILED(ParseSort(sort, sort_list))) {
+ NPT_LOG_WARNING_1("Unsupported or invalid sort criteria error (%s)",
+ sort.GetChars());
+ action->SetError(709, "Unsupported or invalid sort criteria error");
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE_6("Processing %s from %s with id=\"%s\", filter=\"%s\", start=%d, count=%d",
+ (const char*)browse_flag_val,
+ (const char*)context.GetRemoteAddress().GetIpAddress().ToString(),
+ (const char*)object_id,
+ (const char*)filter,
+ starting_index,
+ requested_count);
+
+ /* Invoke the browse function */
+ if (flag == BROWSEMETADATA) {
+ res = OnBrowseMetadata(
+ action,
+ object_id,
+ filter,
+ starting_index,
+ requested_count,
+ sort,
+ context);
+ } else {
+ res = OnBrowseDirectChildren(
+ action,
+ object_id,
+ filter,
+ starting_index,
+ requested_count,
+ sort,
+ context);
+ }
+
+ if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) {
+ action->SetError(800, "Internal error");
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnSearch
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnSearch(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_Result res;
+ NPT_String container_id;
+ NPT_String search;
+ NPT_String filter;
+ NPT_String start;
+ NPT_String count;
+ NPT_String sort;
+ NPT_List<NPT_String> sort_list;
+
+ if (NPT_FAILED(action->GetArgumentValue("ContainerId", container_id)) ||
+ NPT_FAILED(action->GetArgumentValue("SearchCriteria", search)) ||
+ NPT_FAILED(action->GetArgumentValue("Filter", filter)) ||
+ NPT_FAILED(action->GetArgumentValue("StartingIndex", start)) ||
+ NPT_FAILED(action->GetArgumentValue("RequestedCount", count)) ||
+ NPT_FAILED(action->GetArgumentValue("SortCriteria", sort))) {
+ NPT_LOG_WARNING("Missing arguments");
+ action->SetError(402, "Invalid args");
+ return NPT_SUCCESS;
+ }
+
+ /* convert index and counts to int */
+ NPT_UInt32 starting_index, requested_count;
+ if (NPT_FAILED(start.ToInteger(starting_index)) ||
+ NPT_FAILED(count.ToInteger(requested_count))) {
+ NPT_LOG_WARNING_2("Invalid arguments (%s, %s)",
+ start.GetChars(), count.GetChars());
+ action->SetError(402, "Invalid args");
+ return NPT_FAILURE;
+ }
+
+ /* parse sort criteria */
+ if (NPT_FAILED(ParseSort(sort, sort_list))) {
+ NPT_LOG_WARNING_1("Unsupported or invalid sort criteria error (%s)",
+ sort.GetChars());
+ action->SetError(709, "Unsupported or invalid sort criteria error");
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_INFO_5("Processing Search from %s with id=\"%s\", search=\"%s\", start=%d, count=%d",
+ (const char*)context.GetRemoteAddress().GetIpAddress().ToString(),
+ (const char*)container_id,
+ (const char*)search,
+ starting_index,
+ requested_count);
+
+ if (search.IsEmpty() || search == "*") {
+ res = OnBrowseDirectChildren(
+ action,
+ container_id,
+ filter,
+ starting_index,
+ requested_count,
+ sort,
+ context);
+ } else {
+ res = OnSearchContainer(
+ action,
+ container_id,
+ search,
+ filter,
+ starting_index,
+ requested_count,
+ sort,
+ context);
+ }
+
+ if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) {
+ action->SetError(800, "Internal error");
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnUpdate
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnUpdate(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ if (!m_Delegate)
+ return NPT_ERROR_NOT_IMPLEMENTED;
+
+ int err;
+ const char* msg = NULL;
+
+ NPT_String object_id, current_xml, new_xml;
+ NPT_Map<NPT_String,NPT_String> curr_values;
+ NPT_Map<NPT_String,NPT_String> new_values;
+
+ NPT_CHECK_LABEL(action->GetArgumentValue("ObjectID", object_id), args);
+ NPT_CHECK_LABEL(object_id.IsEmpty(),args);
+ NPT_CHECK_LABEL(action->GetArgumentValue("CurrentTagValue", current_xml), args);
+ NPT_CHECK_LABEL(action->GetArgumentValue("NewTagValue", new_xml), args);
+
+ if (NPT_FAILED(ParseTagList(current_xml, curr_values))) {
+ err = 702;
+ msg = "Invalid currentTagvalue";
+ goto failure;
+ }
+ if (NPT_FAILED(ParseTagList(new_xml, new_values))) {
+ err = 703;
+ msg = "Invalid newTagValue";
+ goto failure;
+ }
+
+ if (curr_values.GetEntryCount() != new_values.GetEntryCount()) {
+ err = 706;
+ msg = "Paramater mismatch";
+ goto failure;
+ }
+
+ return m_Delegate->OnUpdateObject(action, object_id, curr_values, new_values, context);
+
+args:
+ err = 402;
+ msg = "Invalid args";
+
+failure:
+ NPT_LOG_WARNING_1("%s", msg);
+ action->SetError(err, msg);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnBrowseMetadata
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnBrowseMetadata(action,
+ object_id,
+ filter,
+ starting_index,
+ requested_count,
+ sort_criteria,
+ context);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnBrowseDirectChildren
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnBrowseDirectChildren(action,
+ object_id,
+ filter,
+ starting_index,
+ requested_count,
+ sort_criteria,
+ context);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnSearchContainer
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnSearchContainer(PLT_ActionReference& action,
+ const char* object_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context)
+{
+ if (m_Delegate) {
+ return m_Delegate->OnSearchContainer(action,
+ object_id,
+ search_criteria,
+ filter,
+ starting_index,
+ requested_count,
+ sort_criteria,
+ context);
+ }
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h
new file mode 100644
index 0000000..d35d8d8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h
@@ -0,0 +1,196 @@
+/*****************************************************************
+|
+| Platinum - AV Media Server Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP AV Media Server.
+ */
+
+#ifndef _PLT_MEDIA_SERVER_H_
+#define _PLT_MEDIA_SERVER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltDeviceHost.h"
+#include "PltMediaItem.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define MAX_PATH_LENGTH 1024
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerDelegate
++---------------------------------------------------------------------*/
+/**
+ The PLT_MediaServerDelegate class is an interface for delegating the handling
+ of the required UPnP AV ContentDirectory service actions. It also handles
+ resource HTTP requests (downloading).
+ */
+class PLT_MediaServerDelegate
+{
+public:
+ PLT_MediaServerDelegate() {}
+ virtual ~PLT_MediaServerDelegate() {}
+
+ virtual NPT_Result OnBrowseMetadata(PLT_ActionReference& /*action*/,
+ const char* /*object_id*/,
+ const char* /*filter*/,
+ NPT_UInt32 /*starting_index*/,
+ NPT_UInt32 /*requested_count*/,
+ const char* /*sort_criteria*/,
+ const PLT_HttpRequestContext& /*context*/) = 0;
+ virtual NPT_Result OnBrowseDirectChildren(PLT_ActionReference& /*action*/,
+ const char* /*object_id*/,
+ const char* /*filter*/,
+ NPT_UInt32 /*starting_index*/,
+ NPT_UInt32 /*requested_count*/,
+ const char* /*sort_criteria*/,
+ const PLT_HttpRequestContext& /*context*/) = 0;
+ virtual NPT_Result OnSearchContainer(PLT_ActionReference& /*action*/,
+ const char* /*container_id*/,
+ const char* /*search_criteria*/,
+ const char* /*filter*/,
+ NPT_UInt32 /*starting_index*/,
+ NPT_UInt32 /*requested_count*/,
+ const char* /*sort_criteria*/,
+ const PLT_HttpRequestContext& /*context*/) = 0;
+ virtual NPT_Result OnUpdateObject(PLT_ActionReference& /*action*/,
+ const char* /*object_id*/,
+ NPT_Map<NPT_String,NPT_String>& /*current_vals*/,
+ NPT_Map<NPT_String,NPT_String>& /*new_vals*/,
+ const PLT_HttpRequestContext& /*context*/) = 0;
+
+ virtual NPT_Result ProcessFileRequest(NPT_HttpRequest& /*request*/,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& /*response*/) = 0;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer
++---------------------------------------------------------------------*/
+/**
+ The PLT_MediaServer class implements the base class for a UPnP AV
+ Media Server device.
+ */
+class PLT_MediaServer : public PLT_DeviceHost
+{
+public:
+ /* BrowseFlags */
+ enum BrowseFlags {
+ BROWSEMETADATA,
+ BROWSEDIRECTCHILDREN
+ };
+
+ // class methods
+ static NPT_Result ParseBrowseFlag(const char* str, BrowseFlags& flag);
+ static NPT_Result ParseSort(const NPT_String& sort, NPT_List<NPT_String>& list);
+ static NPT_Result ParseTagList(const NPT_String& updates, NPT_Map<NPT_String,NPT_String>& tags);
+
+ // constructor
+ PLT_MediaServer(const char* friendly_name,
+ bool show_ip = false,
+ const char* uuid = NULL,
+ NPT_UInt16 port = 0,
+ bool port_rebind = false);
+
+ // methods
+ virtual void SetDelegate(PLT_MediaServerDelegate* delegate) { m_Delegate = delegate; }
+ PLT_MediaServerDelegate* GetDelegate() { return m_Delegate; }
+ virtual void UpdateSystemUpdateID(NPT_UInt32 update);
+ virtual void UpdateContainerUpdateID(const char* id, NPT_UInt32 update);
+
+protected:
+ ~PLT_MediaServer() override;
+
+ // PLT_DeviceHost methods
+ NPT_Result SetupServices() override;
+ NPT_Result OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context) override;
+ NPT_Result ProcessHttpGetRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+ // ConnectionManager
+ virtual NPT_Result OnGetCurrentConnectionIDs(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnGetProtocolInfo(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnGetCurrentConnectionInfo(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+
+ // ContentDirectory
+ virtual NPT_Result OnGetSortCapabilities(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnGetSearchCapabilities(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnGetSystemUpdateID(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnBrowse(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnSearch(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnUpdate(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+
+ // overridable methods
+ virtual NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnSearchContainer(PLT_ActionReference& action,
+ const char* container_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context);
+
+private:
+ PLT_MediaServerDelegate* m_Delegate;
+};
+
+#endif /* _PLT_MEDIA_SERVER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
new file mode 100644
index 0000000..794b56b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
@@ -0,0 +1,578 @@
+/*****************************************************************
+|
+| Platinum - Synchronous Media Browser
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltSyncMediaBrowser.h"
+#include <algorithm>
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.syncbrowser")
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::PLT_SyncMediaBrowser
++---------------------------------------------------------------------*/
+PLT_SyncMediaBrowser::PLT_SyncMediaBrowser(PLT_CtrlPointReference& ctrlPoint,
+ bool use_cache /* = false */,
+ PLT_MediaContainerChangesListener* listener /* = NULL */) :
+ PLT_MediaBrowser(ctrlPoint),
+ m_ContainerListener(listener),
+ m_UseCache(use_cache)
+{
+ SetDelegate(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::~PLT_SyncMediaBrowser
++---------------------------------------------------------------------*/
+PLT_SyncMediaBrowser::~PLT_SyncMediaBrowser()
+{
+}
+
+/* Blocks forever waiting for a response from a request
+ * It is expected the request to succeed or to timeout and return an error eventually
+ */
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::WaitForResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::WaitForResponse(NPT_SharedVariable& shared_var)
+{
+ return shared_var.WaitUntilEquals(1, 30000);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnDeviceAdded
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::OnDeviceAdded(PLT_DeviceDataReference& device)
+{
+ NPT_String uuid = device->GetUUID();
+
+ // test if it's a media server
+ PLT_Service* service;
+ if (NPT_SUCCEEDED(device->FindServiceByType("urn:schemas-upnp-org:service:ContentDirectory:*", service))) {
+ NPT_AutoLock lock(m_MediaServers);
+ m_MediaServers.Put(uuid, device);
+ }
+
+ return PLT_MediaBrowser::OnDeviceAdded(device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnDeviceRemoved
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::OnDeviceRemoved(PLT_DeviceDataReference& device)
+{
+ NPT_String uuid = device->GetUUID();
+
+ // Remove from our list of servers first if found
+ {
+ NPT_AutoLock lock(m_MediaServers);
+ m_MediaServers.Erase(uuid);
+ }
+
+ // clear cache for that device
+ if (m_UseCache) m_Cache.Clear(device.AsPointer()->GetUUID());
+
+ return PLT_MediaBrowser::OnDeviceRemoved(device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::Find
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::Find(const char* ip, PLT_DeviceDataReference& device)
+{
+ NPT_AutoLock lock(m_MediaServers);
+ const NPT_List<PLT_DeviceMapEntry*>::Iterator it =
+ m_MediaServers.GetEntries().Find(PLT_DeviceMapFinderByIp(ip));
+ if (it) {
+ device = (*it)->GetValue();
+ return NPT_SUCCESS;
+ }
+ return NPT_FAILURE;
+}
+
+static void OnResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata)
+{
+ NPT_COMPILER_UNUSED(device);
+
+ if (!userdata) return;
+
+ PLT_BrowseDataReference* data = (PLT_BrowseDataReference*) userdata;
+ (*data)->res = res;
+ if (NPT_SUCCEEDED(res) && info) {
+ (*data)->info = *info;
+ }
+ (*data)->shared_var.SetValue(1);
+ delete data;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnBrowseResult
++---------------------------------------------------------------------*/
+void
+PLT_SyncMediaBrowser::OnBrowseResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata)
+{
+ OnResult(res, device, info, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnSearchResult
++---------------------------------------------------------------------*/
+void
+PLT_SyncMediaBrowser::OnSearchResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata)
+{
+ OnResult(res, device, info, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnGetSearchCapabilitiesResult
++---------------------------------------------------------------------*/
+void
+PLT_SyncMediaBrowser::OnGetSearchCapabilitiesResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ NPT_String searchCapabilities,
+ void* userdata)
+{
+ NPT_COMPILER_UNUSED(device);
+
+ if (!userdata) return;
+
+ PLT_CapabilitiesDataReference* data = (PLT_CapabilitiesDataReference*) userdata;
+ (*data)->res = res;
+ if (NPT_SUCCEEDED(res)) {
+ (*data)->capabilities = searchCapabilities;
+ }
+ (*data)->shared_var.SetValue(1);
+ delete data;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnGetSortCapabilitiesResult
++---------------------------------------------------------------------*/
+void
+PLT_SyncMediaBrowser::OnGetSortCapabilitiesResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ NPT_String sortCapabilities,
+ void* userdata)
+{
+ NPT_COMPILER_UNUSED(device);
+
+ if (!userdata) return;
+
+ PLT_CapabilitiesDataReference* data = (PLT_CapabilitiesDataReference*) userdata;
+ (*data)->res = res;
+ if (NPT_SUCCEEDED(res)) {
+ (*data)->capabilities = sortCapabilities;
+ }
+ (*data)->shared_var.SetValue(1);
+ delete data;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnMSStateVariablesChanged
++---------------------------------------------------------------------*/
+void
+PLT_SyncMediaBrowser::OnMSStateVariablesChanged(PLT_Service* service,
+ NPT_List<PLT_StateVariable*>* vars)
+{
+ NPT_AutoLock lock(m_MediaServers);
+
+ PLT_DeviceDataReference device;
+ const NPT_List<PLT_DeviceMapEntry*>::Iterator it =
+ m_MediaServers.GetEntries().Find(PLT_DeviceMapFinderByUUID(service->GetDevice()->GetUUID()));
+ if (!it) return; // device with this service has gone away
+
+ device = (*it)->GetValue();
+ PLT_StateVariable* var = PLT_StateVariable::Find(*vars, "ContainerUpdateIDs");
+ if (var) {
+ // variable found, parse value
+ NPT_String value = var->GetValue();
+ NPT_String item_id, update_id;
+ int index;
+
+ while (value.GetLength()) {
+ // look for container id
+ index = value.Find(',');
+ if (index < 0) break;
+ item_id = value.Left(index);
+ value = value.SubString(index+1);
+
+ // look for update id
+ if (value.GetLength()) {
+ index = value.Find(',');
+ update_id = (index<0)?value:value.Left(index);
+ value = (index < 0) ? "" : value.SubString(index + 1).GetChars();
+
+ // clear cache for that device
+ if (m_UseCache) m_Cache.Clear(device->GetUUID(), item_id);
+
+ // notify listener
+ if (m_ContainerListener) m_ContainerListener->OnContainerChanged(device, item_id, update_id);
+ }
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::BrowseSync
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::BrowseSync(PLT_BrowseDataReference& browse_data,
+ PLT_DeviceDataReference& device,
+ const char* object_id,
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata,
+ const char* filter,
+ const char* sort)
+{
+ NPT_Result res;
+
+ browse_data->shared_var.SetValue(0);
+ browse_data->info.si = index;
+
+ // send off the browse packet. Note that this will
+ // not block. There is a call to WaitForResponse in order
+ // to block until the response comes back.
+ res = PLT_MediaBrowser::Browse(device,
+ (const char*)object_id,
+ index,
+ count,
+ browse_metadata,
+ filter,
+ sort,
+ new PLT_BrowseDataReference(browse_data));
+ NPT_CHECK_SEVERE(res);
+
+ return WaitForResponse(browse_data->shared_var);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::SearchSync
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::SearchSync(PLT_BrowseDataReference& browse_data,
+ PLT_DeviceDataReference& device,
+ const char* container_id,
+ const char* search_criteria,
+ NPT_Int32 index,
+ NPT_Int32 count,
+ const char* filter)
+{
+ NPT_Result res;
+
+ browse_data->shared_var.SetValue(0);
+ browse_data->info.si = index;
+
+ // send off the search packet. Note that this will
+ // not block. There is a call to WaitForResponse in order
+ // to block until the response comes back.
+ res = PLT_MediaBrowser::Search(device,
+ container_id,
+ search_criteria,
+ index,
+ count,
+ filter,
+ new PLT_BrowseDataReference(browse_data));
+ NPT_CHECK_SEVERE(res);
+
+ return WaitForResponse(browse_data->shared_var);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::GetSearchCapabilitiesSync
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::GetSearchCapabilitiesSync(PLT_DeviceDataReference& device,
+ NPT_String& searchCapabilities)
+{
+ NPT_Result res;
+
+ PLT_CapabilitiesDataReference capabilities_data(new PLT_CapabilitiesData(), true);
+ capabilities_data->shared_var.SetValue(0);
+
+ // send of the GetSearchCapabilities packet. Note that this will
+ // not block. There is a call to WaitForResponse in order
+ // to block until the response comes back.
+ res = PLT_MediaBrowser::GetSearchCapabilities(device,
+ new PLT_CapabilitiesDataReference(capabilities_data));
+ NPT_CHECK_SEVERE(res);
+
+ res = WaitForResponse(capabilities_data->shared_var);
+ NPT_CHECK_LABEL_WARNING(res, done);
+
+ if (NPT_FAILED(capabilities_data->res)) {
+ res = capabilities_data->res;
+ NPT_CHECK_LABEL_WARNING(res, done);
+ }
+
+ searchCapabilities = capabilities_data->capabilities;
+
+done:
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::GetSortCapabilitiesSync
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::GetSortCapabilitiesSync(PLT_DeviceDataReference& device,
+ NPT_String& sortCapabilities)
+{
+ NPT_Result res;
+
+ PLT_CapabilitiesDataReference capabilities_data(new PLT_CapabilitiesData(), true);
+ capabilities_data->shared_var.SetValue(0);
+
+ // send of the GetSortCapabilities packet. Note that this will
+ // not block. There is a call to WaitForResponse in order
+ // to block until the response comes back.
+ res = PLT_MediaBrowser::GetSortCapabilities(device,
+ new PLT_CapabilitiesDataReference(capabilities_data));
+ NPT_CHECK_SEVERE(res);
+
+ res = WaitForResponse(capabilities_data->shared_var);
+ NPT_CHECK_LABEL_WARNING(res, done);
+
+ if (NPT_FAILED(capabilities_data->res)) {
+ res = capabilities_data->res;
+ NPT_CHECK_LABEL_WARNING(res, done);
+ }
+
+ sortCapabilities = capabilities_data->capabilities;
+
+done:
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::BrowseSync
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::BrowseSync(PLT_DeviceDataReference& device,
+ const char* object_id,
+ PLT_MediaObjectListReference& list,
+ bool metadata, /* = false */
+ NPT_Int32 start, /* = 0 */
+ NPT_Cardinal max_results /* = 0 */)
+{
+ NPT_Result res = NPT_FAILURE;
+ NPT_Int32 index = start;
+ NPT_UInt32 count = 0;
+
+ // only cache metadata or if starting from 0 and asking for maximum
+ bool cache = m_UseCache && (metadata || (start == 0 && max_results == 0));
+
+ // reset output params
+ list = NULL;
+
+ // look into cache first
+ if (cache && NPT_SUCCEEDED(m_Cache.Get(device->GetUUID(), object_id, list))) return NPT_SUCCESS;
+
+ do {
+ PLT_BrowseDataReference browse_data(new PLT_BrowseData());
+
+ // send off the browse packet. Note that this will
+ // not block. There is a call to WaitForResponse in order
+ // to block until the response comes back.
+ res = BrowseSync(
+ browse_data,
+ device,
+ (const char*)object_id,
+ index,
+ metadata?1:200, // DLNA recommendations for browsing children is no more than 30 at a time
+ metadata);
+ NPT_CHECK_LABEL_WARNING(res, done);
+
+ if (NPT_FAILED(browse_data->res)) {
+ res = browse_data->res;
+ NPT_CHECK_LABEL_WARNING(res, done);
+ }
+
+ // server returned no more, bail now
+ if (browse_data->info.nr == 0)
+ break;
+
+ if (browse_data->info.nr != browse_data->info.items->GetItemCount()) {
+ NPT_LOG_WARNING_2("Server returned unexpected number of items (%d vs %d)",
+ browse_data->info.nr, browse_data->info.items->GetItemCount());
+ }
+ count += std::max<NPT_UInt32>(browse_data->info.nr, browse_data->info.items->GetItemCount());
+
+ if (list.IsNull()) {
+ list = browse_data->info.items;
+ } else {
+ list->Add(*browse_data->info.items);
+ // clear the list items so that the data inside is not
+ // cleaned up by PLT_MediaItemList dtor since we copied
+ // each pointer into the new list.
+ browse_data->info.items->Clear();
+ }
+
+ // stop now if our list contains exactly what the server said it had.
+ // Note that the server could return 0 if it didn't know how many items were
+ // available. In this case we have to continue browsing until
+ // nothing is returned back by the server.
+ // Unless we were told to stop after reaching a certain amount to avoid
+ // length delays
+ // (some servers may return a total matches out of whack at some point too)
+ if ((browse_data->info.tm && browse_data->info.tm <= count) ||
+ (max_results && count >= max_results))
+ break;
+
+ // ask for the next chunk of entries
+ index = count;
+ } while(1);
+
+done:
+ // cache the result
+ if (cache && NPT_SUCCEEDED(res) && !list.IsNull() && list->GetItemCount()) {
+ m_Cache.Put(device->GetUUID(), object_id, list);
+ }
+
+ // clear entire cache data for device if failed, the device could be gone
+ if (NPT_FAILED(res) && cache) m_Cache.Clear(device->GetUUID());
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::SearchSync
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::SearchSync(PLT_DeviceDataReference& device,
+ const char* container_id,
+ const char* search_criteria,
+ PLT_MediaObjectListReference& list,
+ NPT_Int32 start, /* = 0 */
+ NPT_Cardinal max_results /* = 0 */)
+{
+ NPT_Result res = NPT_FAILURE;
+ NPT_Int32 index = start;
+ NPT_UInt32 count = 0;
+
+ // reset output params
+ list = NULL;
+
+ do {
+ PLT_BrowseDataReference browse_data(new PLT_BrowseData(), true);
+
+ // send off the search packet. Note that this will
+ // not block. There is a call to WaitForResponse in order
+ // to block until the response comes back.
+ res = SearchSync(
+ browse_data,
+ device,
+ container_id,
+ search_criteria,
+ index,
+ 200); // DLNA recommendations for browsing children is no more than 30 at a time
+
+ NPT_CHECK_LABEL_WARNING(res, done);
+
+ if (NPT_FAILED(browse_data->res)) {
+ res = browse_data->res;
+ NPT_CHECK_LABEL_WARNING(res, done);
+ }
+
+ // server returned no more, bail now
+ if (browse_data->info.nr == 0)
+ break;
+
+ if (browse_data->info.nr != browse_data->info.items->GetItemCount()) {
+ NPT_LOG_WARNING_2("Server returned unexpected number of items (%d vs %d)",
+ browse_data->info.nr, browse_data->info.items->GetItemCount());
+ }
+ count += std::max<NPT_UInt32>(browse_data->info.nr, browse_data->info.items->GetItemCount());
+
+ if (list.IsNull()) {
+ list = browse_data->info.items;
+ } else {
+ list->Add(*browse_data->info.items);
+ // clear the list items so that the data inside is not
+ // cleaned up by PLT_MediaItemList dtor since we copied
+ // each pointer into the new list.
+ browse_data->info.items->Clear();
+ }
+
+ // stop now if our list contains exactly what the server said it had.
+ // Note that the server could return 0 if it didn't know how many items were
+ // available. In this case we have to continue browsing until
+ // nothing is returned back by the server.
+ // Unless we were told to stop after reaching a certain amount to avoid
+ // length delays
+ // (some servers may return a total matches out of whack at some point too)
+ if ((browse_data->info.tm && browse_data->info.tm <= count) ||
+ (max_results && count >= max_results))
+ break;
+
+ // ask for the next chunk of entries
+ index = count;
+ } while(1);
+
+done:
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::IsCached
++---------------------------------------------------------------------*/
+bool
+PLT_SyncMediaBrowser::IsCached(const char* uuid, const char* object_id)
+{
+ NPT_AutoLock lock(m_MediaServers);
+ const NPT_List<PLT_DeviceMapEntry*>::Iterator it =
+ m_MediaServers.GetEntries().Find(PLT_DeviceMapFinderByUUID(uuid));
+ if (!it) {
+ m_Cache.Clear(uuid);
+ return false; // device with this service has gone away
+ }
+
+ PLT_MediaObjectListReference list;
+ return NPT_SUCCEEDED(m_Cache.Get(uuid, object_id, list))?true:false;
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
new file mode 100644
index 0000000..6da21cb
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
@@ -0,0 +1,218 @@
+/*****************************************************************
+|
+| Platinum - Synchronous Media Browser
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/** @file
+ UPnP AV Media Controller synchronous implementation.
+ */
+
+#ifndef _PLT_SYNC_MEDIA_BROWSER_
+#define _PLT_SYNC_MEDIA_BROWSER_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltCtrlPoint.h"
+#include "PltMediaBrowser.h"
+#include "PltMediaCache.h"
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef NPT_Map<NPT_String, PLT_DeviceDataReference> PLT_DeviceMap;
+typedef NPT_Map<NPT_String, PLT_DeviceDataReference>::Entry PLT_DeviceMapEntry;
+
+typedef struct PLT_BrowseData {
+ NPT_SharedVariable shared_var;
+ NPT_Result res;
+ PLT_BrowseInfo info;
+} PLT_BrowseData;
+
+typedef NPT_Reference<PLT_BrowseData> PLT_BrowseDataReference;
+
+typedef struct PLT_CapabilitiesData {
+ NPT_SharedVariable shared_var;
+ NPT_Result res;
+ NPT_String capabilities;
+} PLT_CapabilitiesData;
+
+typedef NPT_Reference<PLT_CapabilitiesData> PLT_CapabilitiesDataReference;
+
+// explicitely specify res otherwise WMP won't return a URL!
+#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:lastPlayerState,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country,xbmc:userrating"
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainerListener
++---------------------------------------------------------------------*/
+class PLT_MediaContainerChangesListener
+{
+public:
+ virtual ~PLT_MediaContainerChangesListener() {}
+ virtual void OnContainerChanged(PLT_DeviceDataReference& device,
+ const char* item_id,
+ const char* update_id) = 0;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser
++---------------------------------------------------------------------*/
+class PLT_SyncMediaBrowser : public PLT_MediaBrowser,
+ public PLT_MediaBrowserDelegate
+{
+public:
+ PLT_SyncMediaBrowser(PLT_CtrlPointReference& ctrlPoint,
+ bool use_cache = false,
+ PLT_MediaContainerChangesListener* listener = NULL);
+ ~PLT_SyncMediaBrowser() override;
+
+ // PLT_MediaBrowser methods
+ NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device) override;
+ NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device) override;
+
+ // PLT_MediaBrowserDelegate methods
+ void OnMSStateVariablesChanged(PLT_Service* service,
+ NPT_List<PLT_StateVariable*>* vars) override;
+ void OnBrowseResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata) override;
+ void OnSearchResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata) override;
+ void OnGetSearchCapabilitiesResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ NPT_String searchCapabilities,
+ void* userdata) override;
+ void OnGetSortCapabilitiesResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ NPT_String sortCapabilities,
+ void* userdata) override;
+
+ // methods
+ void SetContainerListener(PLT_MediaContainerChangesListener* listener) {
+ m_ContainerListener = listener;
+ }
+ NPT_Result BrowseSync(PLT_DeviceDataReference& device,
+ const char* id,
+ PLT_MediaObjectListReference& list,
+ bool metadata = false,
+ NPT_Int32 start = 0,
+ NPT_Cardinal max_results = 0); // 0 means all
+
+ NPT_Result SearchSync(PLT_DeviceDataReference& device,
+ const char* container_id,
+ const char* search_criteria,
+ PLT_MediaObjectListReference& list,
+ NPT_Int32 start = 0,
+ NPT_Cardinal max_results = 0); // 0 means all
+
+ NPT_Result GetSearchCapabilitiesSync(PLT_DeviceDataReference& device,
+ NPT_String& searchCapabilities);
+
+ NPT_Result GetSortCapabilitiesSync(PLT_DeviceDataReference& device,
+ NPT_String& sortCapabilities);
+
+ const NPT_Lock<PLT_DeviceMap>& GetMediaServersMap() const { return m_MediaServers; }
+ bool IsCached(const char* uuid, const char* object_id);
+
+protected:
+ NPT_Result BrowseSync(PLT_BrowseDataReference& browse_data,
+ PLT_DeviceDataReference& device,
+ const char* object_id,
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata = false,
+ const char* filter = PLT_DEFAULT_FILTER,
+ const char* sort = "");
+
+ NPT_Result SearchSync(PLT_BrowseDataReference& browse_data,
+ PLT_DeviceDataReference& device,
+ const char* container_id,
+ const char* search_criteria,
+ NPT_Int32 index,
+ NPT_Int32 count,
+ const char* filter = PLT_DEFAULT_FILTER); // explicitely specify res otherwise WMP won't return a URL!
+
+private:
+ NPT_Result Find(const char* ip, PLT_DeviceDataReference& device);
+ NPT_Result WaitForResponse(NPT_SharedVariable& shared_var);
+
+private:
+ NPT_Lock<PLT_DeviceMap> m_MediaServers;
+ PLT_MediaContainerChangesListener* m_ContainerListener;
+ bool m_UseCache;
+ PLT_MediaCache<PLT_MediaObjectListReference,NPT_String> m_Cache;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceMapFinderByIp
++---------------------------------------------------------------------*/
+class PLT_DeviceMapFinderByIp
+{
+public:
+ // methods
+ PLT_DeviceMapFinderByIp(const char* ip) : m_IP(ip) {}
+
+ bool operator()(const PLT_DeviceMapEntry* const& entry) const {
+ const PLT_DeviceDataReference& device = entry->GetValue();
+ return (device->GetURLBase().GetHost() == m_IP);
+ }
+
+private:
+ // members
+ NPT_String m_IP;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceFinderByUUID
++---------------------------------------------------------------------*/
+class PLT_DeviceMapFinderByUUID
+{
+public:
+ // methods
+ PLT_DeviceMapFinderByUUID(const char* uuid) : m_UUID(uuid) {}
+
+ bool operator()(const PLT_DeviceMapEntry* const& entry) const {
+ PLT_DeviceDataReference device = entry->GetValue();
+ return device->GetUUID() == m_UUID;
+ }
+
+private:
+ // members
+ NPT_String m_UUID;
+};
+
+#endif /* _PLT_SYNC_MEDIA_BROWSER_ */
+
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/process_scpds.sh b/lib/libUPnP/Platinum/Source/Devices/MediaServer/process_scpds.sh
new file mode 100644
index 0000000..bba4bc8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/process_scpds.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+set -x
+
+# abort on any errors
+set -e
+
+# ContentDirectory
+../../../Targets/x86-unknown-cygwin/Debug/TextToHeader.exe -v MS_ContentDirectorySCPD -h ContentDirectory ContentDirectorySCPD.xml ContentDirectorySCPD.cpp
+
+# ContentDirectory with Search
+../../../Targets/x86-unknown-cygwin/Debug/TextToHeader.exe -v MS_ContentDirectorywSearchSCPD -h ContentDirectory ContentDirectorywSearchSCPD.xml ContentDirectorywSearchSCPD.cpp
+
+# ConnectionManager
+../../../Targets/x86-unknown-cygwin/Debug/TextToHeader.exe -v MS_ConnectionManagerSCPD -h ConnectionManager ConnectionManagerSCPD.xml ConnectionManagerSCPD.cpp \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Action.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/Action.cpp
new file mode 100644
index 0000000..08a028d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Action.cpp
@@ -0,0 +1,92 @@
+/*****************************************************************
+|
+| Platinum - Managed Action
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "Action.h"
+#include "ActionDescription.h"
+#include "Service.h"
+#include "ActionArgumentDescription.h"
+#include "EnumerableNptArray.h"
+
+Platinum::Service^ Platinum::Action::ParentService::get()
+{
+ return marshal_as<Service^>(*(*m_pHandle)->GetActionDesc().GetService());
+}
+
+Platinum::ActionDescription^ Platinum::Action::Description::get()
+{
+ return marshal_as<ActionDescription^>((*m_pHandle)->GetActionDesc());
+}
+
+IEnumerable<Platinum::ActionArgumentDescription^>^ Platinum::Action::Arguments::get()
+{
+ return gcnew Enumerables::EnumerableNptArray<ActionArgumentDescription^, PLT_ArgumentDesc*>(
+ (*m_pHandle)->GetActionDesc().GetArgumentDescs()
+ );
+}
+
+Platinum::ActionArgumentDescription^ Platinum::Action::GetArgument( String^ name )
+{
+ if (String::IsNullOrEmpty(name))
+ throw gcnew ArgumentException("null or empty", "name");
+
+ marshal_context c;
+
+ PLT_ArgumentDesc* arg = (*m_pHandle)->GetActionDesc().GetArgumentDesc(c.marshal_as<const char*>(name));
+
+ if (!arg)
+ return nullptr;
+
+ return marshal_as<ActionArgumentDescription^>(*arg);
+}
+
+Int32 Platinum::Action::SetArgumentValue( String^ name, String^ value )
+{
+ if (String::IsNullOrEmpty(name))
+ throw gcnew ArgumentException("null or empty", "name");
+
+ marshal_context c;
+ return (*m_pHandle)->SetArgumentValue(c.marshal_as<const char*>(name), c.marshal_as<const char*>(value));
+}
+
+void Platinum::Action::HandleActionResponse( NeptuneException^ error, Action^ action )
+{
+ if (action->m_pHandle == m_pHandle)
+ {
+ this->ActionResponse(error);
+ }
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Action.h b/lib/libUPnP/Platinum/Source/Extras/Managed/Action.h
new file mode 100644
index 0000000..7a45f89
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Action.h
@@ -0,0 +1,159 @@
+/*****************************************************************
+|
+| Platinum - Managed Action
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+ref class ActionArgumentDescription;
+ref class ActionDescription;
+ref class Service;
+
+/*----------------------------------------------------------------------
+| Action
++---------------------------------------------------------------------*/
+public ref class Action
+{
+public:
+
+ delegate void ActionResponseDelegate(NeptuneException^ error);
+
+private:
+
+ PLT_ActionReference* m_pHandle;
+
+internal:
+
+ property PLT_ActionReference& Handle
+ {
+ PLT_ActionReference& get()
+ {
+ return *m_pHandle;
+ }
+ }
+
+public:
+
+ property String^ Name
+ {
+ String^ get()
+ {
+ return gcnew String((*m_pHandle)->GetActionDesc().GetName());
+ }
+ }
+
+ property IEnumerable<ActionArgumentDescription^>^ Arguments
+ {
+ IEnumerable<ActionArgumentDescription^>^ get();
+ }
+
+ property Service^ ParentService
+ {
+ Service^ get();
+ }
+
+ property ActionDescription^ Description
+ {
+ ActionDescription^ get();
+ }
+
+public:
+
+ event ActionResponseDelegate^ ActionResponse;
+
+public:
+
+ ActionArgumentDescription^ GetArgument(String^ name);
+ Int32 SetArgumentValue(String^ name, String^ value);
+
+internal:
+
+ void HandleActionResponse(NeptuneException^ error, Action^ action);
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ Action^ a = (Action^)obj;
+
+ return (m_pHandle->AsPointer() == a->m_pHandle->AsPointer());
+
+ /*if (m_pHandle->AsPointer() == a->m_pHandle->AsPointer())
+ return true;
+
+ return ((*m_pHandle)->GetActionDesc() == (*a->m_pHandle)->GetActionDesc());*/
+ }
+
+internal:
+
+ Action(PLT_ActionReference& action)
+ {
+ if (action.IsNull())
+ throw gcnew ArgumentNullException("action");
+
+ m_pHandle = new PLT_ActionReference(action);
+ }
+
+public:
+
+ ~Action()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!Action();
+ }
+
+ !Action()
+ {
+ // clean-up unmanaged
+ if (m_pHandle != 0)
+ {
+ delete m_pHandle;
+
+ m_pHandle = 0;
+ }
+ }
+
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::Action, PLT_ActionReference); \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/ActionArgumentDescription.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/ActionArgumentDescription.cpp
new file mode 100644
index 0000000..d6db6eb
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/ActionArgumentDescription.cpp
@@ -0,0 +1,45 @@
+/*****************************************************************
+|
+| Platinum - Managed ActionArgumentDescription
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "ActionArgumentDescription.h"
+#include "StateVariable.h"
+
+Platinum::StateVariable^ Platinum::ActionArgumentDescription::RelatedStateVariable::get()
+{
+ return marshal_as<StateVariable^>(*m_pHandle->GetRelatedStateVariable());
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/ActionArgumentDescription.h b/lib/libUPnP/Platinum/Source/Extras/Managed/ActionArgumentDescription.h
new file mode 100644
index 0000000..6f3fda3
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/ActionArgumentDescription.h
@@ -0,0 +1,153 @@
+/*****************************************************************
+|
+| Platinum - Managed ActionArgumentDescription
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| ActionArgumentDirection
++---------------------------------------------------------------------*/
+public enum class ActionArgumentDirection
+{
+ In,
+ Out,
+ InOut
+};
+
+ref class StateVariable;
+
+/*----------------------------------------------------------------------
+| ActionArgumentDescription
++---------------------------------------------------------------------*/
+public ref class ActionArgumentDescription
+{
+private:
+
+ PLT_ArgumentDesc* m_pHandle;
+
+public:
+
+ property String^ Name
+ {
+ String^ get()
+ {
+ return gcnew String(m_pHandle->GetName());
+ }
+ }
+
+ property ActionArgumentDirection Direction
+ {
+ ActionArgumentDirection get()
+ {
+ return ParseArgumentDirection(m_pHandle->GetDirection());
+ }
+ }
+
+ property Boolean HasReturnValue
+ {
+ Boolean get()
+ {
+ return Boolean(m_pHandle->HasReturnValue());
+ }
+ }
+
+ property StateVariable^ RelatedStateVariable
+ {
+ StateVariable^ get();
+ }
+
+private:
+
+ static ActionArgumentDirection ParseArgumentDirection(const NPT_String& dir)
+ {
+ NPT_String s (dir);
+
+ s.MakeLowercase();
+
+ if (s == "in")
+ return ActionArgumentDirection::In;
+
+ if (s == "out")
+ return ActionArgumentDirection::Out;
+
+ if (s == "inout")
+ return ActionArgumentDirection::InOut;
+
+ if (s == "io")
+ return ActionArgumentDirection::InOut;
+
+ throw gcnew ArgumentException("unknown direction");
+ }
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (m_pHandle == ((ActionArgumentDescription^)obj)->m_pHandle);
+ }
+
+internal:
+
+ ActionArgumentDescription(PLT_ArgumentDesc& devData)
+ {
+ m_pHandle = &devData;
+ }
+
+public:
+
+ ~ActionArgumentDescription()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!ActionArgumentDescription();
+ }
+
+ !ActionArgumentDescription()
+ {
+ // clean-up unmanaged
+ }
+
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::ActionArgumentDescription, PLT_ArgumentDesc);
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/ActionDescription.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/ActionDescription.cpp
new file mode 100644
index 0000000..de3ef5a
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/ActionDescription.cpp
@@ -0,0 +1,69 @@
+/*****************************************************************
+|
+| Platinum - Managed ActionDescription
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "ActionDescription.h"
+#include "Service.h"
+#include "ActionArgumentDescription.h"
+#include "EnumerableNptArray.h"
+
+Platinum::Service^ Platinum::ActionDescription::ParentService::get()
+{
+ return marshal_as<Service^>(*m_pHandle->GetService());
+}
+
+IEnumerable<Platinum::ActionArgumentDescription^>^ Platinum::ActionDescription::Arguments::get()
+{
+ return gcnew Enumerables::EnumerableNptArray<ActionArgumentDescription^, PLT_ArgumentDesc*>(
+ m_pHandle->GetArgumentDescs()
+ );
+}
+
+Platinum::ActionArgumentDescription^ Platinum::ActionDescription::GetArgument( String^ name )
+{
+ if (String::IsNullOrEmpty(name))
+ throw gcnew ArgumentException("null or empty", "name");
+
+ marshal_context c;
+
+ PLT_ArgumentDesc* arg = m_pHandle->GetArgumentDesc(c.marshal_as<const char*>(name));
+
+ if (!arg)
+ return nullptr;
+
+ return marshal_as<ActionArgumentDescription^>(*arg);
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/ActionDescription.h b/lib/libUPnP/Platinum/Source/Extras/Managed/ActionDescription.h
new file mode 100644
index 0000000..dbbe1a7
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/ActionDescription.h
@@ -0,0 +1,123 @@
+/*****************************************************************
+|
+| Platinum - Managed ActionDescription
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+ref class ActionArgumentDescription;
+ref class Service;
+
+/*----------------------------------------------------------------------
+| ActionDescription
++---------------------------------------------------------------------*/
+public ref class ActionDescription
+{
+private:
+
+ PLT_ActionDesc* m_pHandle;
+
+internal:
+
+ property PLT_ActionDesc& Handle
+ {
+ PLT_ActionDesc& get()
+ {
+ return *m_pHandle;
+ }
+ }
+
+public:
+
+ property String^ Name
+ {
+ String^ get()
+ {
+ return gcnew String(m_pHandle->GetName());
+ }
+ }
+
+ property IEnumerable<ActionArgumentDescription^>^ Arguments
+ {
+ IEnumerable<ActionArgumentDescription^>^ get();
+ }
+
+ property Service^ ParentService
+ {
+ Service^ get();
+ }
+
+public:
+
+ ActionArgumentDescription^ GetArgument(String^ name);
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (m_pHandle == ((ActionDescription^)obj)->m_pHandle);
+ }
+
+internal:
+
+ ActionDescription(PLT_ActionDesc& devData)
+ {
+ m_pHandle = &devData;
+ }
+
+public:
+
+ ~ActionDescription()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!ActionDescription();
+ }
+
+ !ActionDescription()
+ {
+ }
+
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::ActionDescription, PLT_ActionDesc);
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Clix.h b/lib/libUPnP/Platinum/Source/Extras/Managed/Clix.h
new file mode 100644
index 0000000..2b93f60
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Clix.h
@@ -0,0 +1,202 @@
+// ------------------------------------------------------------------------------------------- //
+// clix.h
+//
+// http://www.nuclex.org/articles/5-cxx/10-marshaling-strings-in-cxx-cli
+//
+// Marshals strings between .NET and C++ using C++/CLI (Visual C++ 2005 and later only).
+// Faster and cleaner than the System::Interop method because it uses garbage collected memory.
+// Use at your own leisure. No warranties whatsoever provided.
+//
+// Original code by Markus Ewald (http://www.nuclex.org/articles/marshaling-strings-in-cxx-cli)
+// Updated version including several improvements suggested by Neil Hunt
+// ------------------------------------------------------------------------------------------- //
+#pragma once
+
+#include <string>
+#include <vcclr.h>
+
+// CLI extensions namespace
+namespace clix {
+
+ /// <summary>Encoding types for strings</summary>
+ enum Encoding {
+
+ /// <summary>ANSI encoding</summary>
+ /// <remarks>
+ /// This is the default encoding you've most likely been using all around in C++. ANSI
+ /// means 8 Bit encoding with character codes depending on the system's selected code page.
+ /// <remarks>
+ E_ANSI,
+
+ /// <summary>UTF-8 encoding</summary>
+ /// <remarks>
+ /// This is the encoding commonly used for multilingual C++ strings. All ASCII characters
+ /// (0-127) will be represented as single bytes. Be aware that UTF-8 uses more than one
+ /// byte for extended characters, so std::string::length() might not reflect the actual
+ /// length of the string in characters if it contains any non-ASCII characters.
+ /// <remarks>
+ E_UTF8,
+
+ /// <summary>UTF-16 encoding</summary>
+ /// <remarks>
+ /// This is the suggested to be used for marshaling and the native encoding of .NET
+ /// strings. It is similar to UTF-8 but uses a minimum of two bytes per character, making
+ /// the number of bytes required for a given string better predictable. Be aware, however,
+ /// that UTF-16 can still use more than two bytes for a character, so std::wstring::length()
+ /// might not reflect the actual length of the string.
+ /// </remarks>
+ E_UTF16, E_UNICODE = E_UTF16
+
+ };
+
+ // Ignore this if you're just scanning the headers for informations :-)
+ /* All this template stuff might seem like overkill, but it is well thought out and enables
+ you to use a readable and convenient call while still keeping the highest possible code
+ efficiency due to compile-time evaluation of the required conversion path.
+ */
+ namespace detail {
+
+ // Get C++ string type for specified encoding
+ template<Encoding encoding> struct StringTypeSelecter;
+ template<> struct StringTypeSelecter<E_ANSI> { typedef std::string Type; };
+ template<> struct StringTypeSelecter<E_UTF8> { typedef std::string Type; };
+ template<> struct StringTypeSelecter<E_UTF16> { typedef std::wstring Type; };
+
+ // Compile-time check whether a given type is a managed System::String
+ template<typename StringType> struct IsManagedString { enum { Result = false }; };
+ template<> struct IsManagedString<System::String ^> { enum { Result = true }; };
+
+ // Compile-time selection of two types depending on a boolean expression
+ template<bool expression> struct Select;
+ template<> struct Select<false> {
+ template<typename TrueType, typename FalseType> struct Type { typedef FalseType Result; };
+ };
+ template<> struct Select<true> {
+ template<typename TrueType, typename FalseType> struct Type { typedef TrueType Result; };
+ };
+
+ // Direction of the marshaling process
+ enum MarshalingDirection {
+ CxxFromNet,
+ NetFromCxx
+ };
+
+ // The actual marshaling code
+ template<MarshalingDirection direction> struct StringMarshaler;
+
+ // Marshals to .NET from C++ strings
+ template<> struct StringMarshaler<NetFromCxx> {
+
+ template<Encoding encoding, typename SourceType>
+ static System::String ^marshal(const SourceType &string) {
+ // Constructs a std::[w]string in case someone gave us a char * to choke on
+ return marshalCxxString<encoding, SourceType>(string);
+ }
+
+ template<Encoding encoding, typename SourceType>
+ static System::String ^marshalCxxString(
+ const typename StringTypeSelecter<encoding>::Type &cxxString
+ ) {
+ typedef typename StringTypeSelecter<encoding>::Type SourceStringType;
+ size_t byteCount = cxxString.length() * sizeof(SourceStringType::value_type);
+
+ // Copy the C++ string contents into a managed array of bytes
+ array<unsigned char> ^bytes = gcnew array<unsigned char>(byteCount);
+ { pin_ptr<unsigned char> pinnedBytes = &bytes[0];
+ memcpy(pinnedBytes, cxxString.c_str(), byteCount);
+ }
+
+ // Now let one of .NET's encoding classes do the rest
+ return decode<encoding>(bytes);
+ }
+
+ private:
+ // Converts a byte array based on the selected encoding
+ template<Encoding encoding> static System::String ^decode(array<unsigned char> ^bytes);
+ template<> static System::String ^decode<E_ANSI>(array<unsigned char> ^bytes) {
+ return System::Text::Encoding::Default->GetString(bytes);
+ }
+ template<> static System::String ^decode<E_UTF8>(array<unsigned char> ^bytes) {
+ return System::Text::Encoding::UTF8->GetString(bytes);
+ }
+ template<> static System::String ^decode<E_UTF16>(array<unsigned char> ^bytes) {
+ return System::Text::Encoding::Unicode->GetString(bytes);
+ }
+ };
+
+ // Marshals to C++ strings from .NET
+ template<> struct StringMarshaler<CxxFromNet> {
+
+ template<Encoding encoding, typename SourceType>
+ static typename detail::StringTypeSelecter<encoding>::Type marshal(
+ System::String ^string
+ ) {
+ typedef typename StringTypeSelecter<encoding>::Type StringType;
+
+ // First, we use .NET's encoding classes to convert the string into a byte array
+ array<unsigned char> ^bytes = encode<encoding>(string);
+
+ // fix crash if empty string passed
+ if (bytes->Length == 0) return StringType();
+
+ // Then we construct our native string from that byte array
+ pin_ptr<unsigned char> pinnedBytes(&bytes[0]);
+ return StringType(
+ reinterpret_cast<StringType::value_type *>(static_cast<unsigned char *>(pinnedBytes)),
+ bytes->Length / sizeof(StringType::value_type)
+ );
+ }
+
+ template<> static std::wstring marshal<E_UTF16, System::String ^>(
+ System::String ^string
+ ) {
+ // fix crash if empty string passed
+ if (string->Length == 0) return std::wstring();
+
+ // We can directly access the characters in the managed string
+ pin_ptr<const wchar_t> pinnedChars(::PtrToStringChars(string));
+ return std::wstring(pinnedChars, string->Length);
+ }
+
+ private:
+ // Converts a string based on the selected encoding
+ template<Encoding encoding> static array<unsigned char> ^encode(System::String ^string);
+ template<> static array<unsigned char> ^encode<E_ANSI>(System::String ^string) {
+ return System::Text::Encoding::Default->GetBytes(string);
+ }
+ template<> static array<unsigned char> ^encode<E_UTF8>(System::String ^string) {
+ return System::Text::Encoding::UTF8->GetBytes(string);
+ }
+ template<> static array<unsigned char> ^encode<E_UTF16>(System::String ^string) {
+ return System::Text::Encoding::Unicode->GetBytes(string);
+ }
+
+ };
+
+ } // namespace detail
+
+ // ----------------------------------------------------------------------------------------- //
+ // clix::marshalString()
+ // ----------------------------------------------------------------------------------------- //
+ /// <summary>Marshals strings between .NET managed and C++ native</summary>
+ /// <remarks>
+ /// This all-in-one function marshals native C++ strings to .NET strings and vice versa.
+ /// You have to specify an encoding to use for the conversion, which always applies to the
+ /// native C++ string as .NET always uses UTF-16 for its own strings.
+ /// </remarks>
+ /// <param name="string">String to be marshalled to the other side</param>
+ /// <returns>The marshaled representation of the string</returns>
+ template<Encoding encoding, typename SourceType>
+ typename detail::Select<detail::IsManagedString<SourceType>::Result>::Type<
+ typename detail::StringTypeSelecter<encoding>::Type,
+ System::String ^
+ >::Result marshalString(SourceType string) {
+
+ // Pass on the call to our nifty template routines
+ return detail::StringMarshaler<
+ detail::IsManagedString<SourceType>::Result ? detail::CxxFromNet : detail::NetFromCxx
+ >::marshal<encoding, SourceType>(string);
+
+ }
+
+} // namespace clix
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPoint.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPoint.cpp
new file mode 100644
index 0000000..506dbec
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPoint.cpp
@@ -0,0 +1,115 @@
+/*****************************************************************
+|
+| Platinum - Managed ControlPoint
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "ControlPoint.h"
+#include "ControlPointEventBridge.h"
+#include "Action.h"
+#include "ActionDescription.h"
+#include "Service.h"
+
+void Platinum::ControlPoint::RegisterEvents()
+{
+ if (!m_pBridge)
+ {
+ m_pBridge = new ControlPointEventBridge(this);
+ }
+
+ Helpers::ThrowOnError((*m_pHandle)->AddListener(m_pBridge));
+}
+
+Platinum::Action^ Platinum::ControlPoint::CreateAction( ActionDescription^ desc )
+{
+ if (desc == nullptr)
+ throw gcnew ArgumentNullException("desc");
+
+ // create action
+ PLT_ActionReference r(new PLT_Action(desc->Handle));
+
+ return gcnew Action(r);
+}
+
+
+void Platinum::ControlPoint::InvokeAction(Action^ action)
+{
+ // register events
+ this->ActionResponse += gcnew ActionResponseDelegate(action, &Action::HandleActionResponse);
+
+ Helpers::ThrowOnError(
+ (*m_pHandle)->InvokeAction(action->Handle)
+ );
+}
+
+void Platinum::ControlPoint::Subscribe( Service^ srv )
+{
+ if (srv == nullptr)
+ throw gcnew ArgumentNullException("srv");
+
+ Helpers::ThrowOnError(
+ (*m_pHandle)->Subscribe(&srv->Handle, false)
+ );
+}
+
+void Platinum::ControlPoint::Unsubscribe( Service^ srv )
+{
+ if (srv == nullptr)
+ throw gcnew ArgumentNullException("srv");
+
+ Helpers::ThrowOnError(
+ (*m_pHandle)->Subscribe(&srv->Handle, true)
+ );
+}
+
+Platinum::ControlPoint::!ControlPoint()
+{
+ // clean-up unmanaged
+ if (m_pHandle != 0)
+ {
+ // remove listener first, is it necessary?
+ if (m_pBridge) (*m_pHandle)->RemoveListener(m_pBridge);
+
+ delete m_pHandle;
+
+ m_pHandle = 0;
+ }
+
+ if (m_pBridge != 0)
+ {
+ delete m_pBridge;
+
+ m_pBridge = 0;
+ }
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPoint.h b/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPoint.h
new file mode 100644
index 0000000..0fd0bba
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPoint.h
@@ -0,0 +1,227 @@
+/*****************************************************************
+|
+| Platinum - Managed ControlPoint
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+ref class Action;
+ref class ActionDescription;
+ref class DeviceData;
+ref class Service;
+ref class StateVariable;
+class ControlPointEventBridge;
+
+/*----------------------------------------------------------------------
+| ControlPoint
++---------------------------------------------------------------------*/
+public ref class ControlPoint
+{
+public:
+
+ delegate void DeviceAddedDelegate(DeviceData^ dev);
+ delegate void DeviceRemovedDelegate(DeviceData^ dev);
+ delegate void ActionResponseDelegate(NeptuneException^ error, Action^ action);
+ delegate void EventNotifyDelegate(Service^ srv, IEnumerable<StateVariable^>^ vars);
+
+private:
+
+ PLT_CtrlPointReference* m_pHandle;
+ ControlPointEventBridge* m_pBridge;
+ List<DeviceData^>^ m_pDevices;
+
+public:
+
+ property array<DeviceData^>^ Devices
+ {
+ array<DeviceData^>^ get()
+ {
+ System::Threading::Monitor::Enter(m_pDevices);
+
+ return m_pDevices->ToArray();
+
+ System::Threading::Monitor::Exit(m_pDevices);
+ }
+ }
+
+internal:
+
+ property PLT_CtrlPointReference& Handle
+ {
+ PLT_CtrlPointReference& get()
+ {
+ return *m_pHandle;
+ }
+ }
+
+public:
+
+ event DeviceAddedDelegate^ DeviceAdded;
+ event DeviceRemovedDelegate^ DeviceRemoved;
+ event ActionResponseDelegate^ ActionResponse;
+ event EventNotifyDelegate^ EventNotify;
+
+internal:
+
+ void OnDeviceAdded(DeviceData^ dev)
+ {
+ // add to list
+ System::Threading::Monitor::Enter(m_pDevices);
+
+ m_pDevices->Add(dev);
+
+ System::Threading::Monitor::Exit(m_pDevices);
+
+ // handle events
+ this->DeviceAdded(dev);
+ }
+
+ void OnDeviceRemoved(DeviceData^ dev)
+ {
+ // handle events
+ this->DeviceRemoved(dev);
+
+ // remove from list
+ System::Threading::Monitor::Enter(m_pDevices);
+
+ m_pDevices->Remove(dev);
+
+ System::Threading::Monitor::Exit(m_pDevices);
+ }
+
+ void OnActionResponse(NeptuneException^ error, Action^ action)
+ {
+ this->ActionResponse(error, action);
+ }
+
+ void OnEventNotify(Service^ srv, IEnumerable<StateVariable^>^ vars)
+ {
+ this->EventNotify(srv, vars);
+ }
+
+public:
+
+ Action^ CreateAction(ActionDescription^ desc);
+ void InvokeAction(Action^ action);
+
+ void Subscribe(Service^ srv);
+ void Unsubscribe(Service^ srv);
+
+private:
+
+ void RegisterEvents();
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (*m_pHandle == *((ControlPoint^)obj)->m_pHandle);
+ }
+
+internal:
+
+ ControlPoint(PLT_CtrlPointReference& ctlPoint)
+ {
+ if (ctlPoint.IsNull())
+ throw gcnew ArgumentNullException("ctlPoint");
+
+ m_pHandle = new PLT_CtrlPointReference(ctlPoint);
+
+ RegisterEvents();
+ }
+
+ ControlPoint(PLT_CtrlPoint& ctlPoint)
+ {
+ m_pHandle = new PLT_CtrlPointReference(&ctlPoint);
+
+ RegisterEvents();
+ }
+
+public:
+
+ ControlPoint(String^ autoSearcheviceType)
+ {
+ if (String::IsNullOrEmpty(autoSearcheviceType))
+ {
+ throw gcnew ArgumentException("null or empty", "autoSearcheviceType");
+ }
+
+ marshal_context c;
+
+ m_pHandle = new PLT_CtrlPointReference(
+ new PLT_CtrlPoint(c.marshal_as<const char*>(autoSearcheviceType))
+ );
+
+ m_pDevices = gcnew List<DeviceData^>();
+
+ RegisterEvents();
+ }
+
+ ControlPoint(bool autoSearch)
+ {
+ if (autoSearch)
+ {
+ m_pHandle = new PLT_CtrlPointReference(new PLT_CtrlPoint());
+ }
+ else
+ {
+ m_pHandle = new PLT_CtrlPointReference(new PLT_CtrlPoint(0));
+ }
+
+ m_pDevices = gcnew List<DeviceData^>();
+
+ RegisterEvents();
+ }
+
+ ~ControlPoint()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!ControlPoint();
+ }
+
+ !ControlPoint();
+
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::ControlPoint, PLT_CtrlPoint);
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPointEventBridge.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPointEventBridge.cpp
new file mode 100644
index 0000000..f229202
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPointEventBridge.cpp
@@ -0,0 +1,88 @@
+/*****************************************************************
+|
+| Platinum - Managed ControlPointEventBridge
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "ControlPointEventBridge.h"
+#include "ControlPoint.h"
+#include "DeviceData.h"
+#include "Action.h"
+#include "Service.h"
+#include "EnumerableNptList.h"
+#include "StateVariable.h"
+
+NPT_Result Platinum::ControlPointEventBridge::OnDeviceAdded( PLT_DeviceDataReference& device )
+{
+ m_pControlPoint->OnDeviceAdded(gcnew DeviceData(device));
+
+ return NPT_SUCCESS;
+}
+
+NPT_Result Platinum::ControlPointEventBridge::OnDeviceRemoved( PLT_DeviceDataReference& device )
+{
+ m_pControlPoint->OnDeviceRemoved(gcnew DeviceData(device));
+
+ return NPT_SUCCESS;
+}
+
+NPT_Result Platinum::ControlPointEventBridge::OnActionResponse( NPT_Result res, PLT_ActionReference& action, void* userdata )
+{
+ if (NPT_FAILED(res))
+ {
+ m_pControlPoint->OnActionResponse(
+ gcnew NeptuneException(res),
+ gcnew Action(action)
+ );
+ }
+ else
+ {
+ m_pControlPoint->OnActionResponse(
+ nullptr,
+ gcnew Action(action)
+ );
+ }
+
+ return NPT_SUCCESS;
+}
+
+NPT_Result Platinum::ControlPointEventBridge::OnEventNotify( PLT_Service* service, NPT_List<PLT_StateVariable*>* vars )
+{
+ m_pControlPoint->OnEventNotify(
+ gcnew Service(*service),
+ gcnew Enumerables::EnumerableNptList<StateVariable^, PLT_StateVariable*>(*vars)
+ );
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPointEventBridge.h b/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPointEventBridge.h
new file mode 100644
index 0000000..83a6807
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/ControlPointEventBridge.h
@@ -0,0 +1,68 @@
+/*****************************************************************
+|
+| Platinum - Managed ControlPointEventBridge
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+ref class ControlPoint;
+
+/*----------------------------------------------------------------------
+| ControlPointEventBridge
++---------------------------------------------------------------------*/
+private class ControlPointEventBridge : public PLT_CtrlPointListener
+{
+private:
+
+ gcroot<ControlPoint^> m_pControlPoint;
+
+public:
+
+ virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device);
+ virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device);
+ virtual NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata);
+ virtual NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars);
+
+public:
+
+ ControlPointEventBridge(gcroot<ControlPoint^> cp)
+ {
+ m_pControlPoint = cp;
+ }
+ virtual ~ControlPointEventBridge()
+ {}
+
+};
+
+
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceData.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceData.cpp
new file mode 100644
index 0000000..06a6d54
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceData.cpp
@@ -0,0 +1,168 @@
+/*****************************************************************
+|
+| Platinum - Managed DeviceData
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "DeviceData.h"
+#include "Service.h"
+#include "EnumerableNptArray.h"
+
+IEnumerable<Platinum::Service^>^ Platinum::DeviceData::Services::get()
+{
+ return gcnew Enumerables::EnumerableNptArray<Service^, PLT_Service*>(
+ (*m_pHandle)->GetServices()
+ );
+}
+
+IEnumerable<Platinum::DeviceData^>^ Platinum::DeviceData::EmbeddedDevices::get()
+{
+ return gcnew Enumerables::EnumerableNptArrayRef<DeviceData^, PLT_DeviceDataReference>(
+ (*m_pHandle)->GetEmbeddedDevices()
+ );
+}
+
+Platinum::DeviceData^ Platinum::DeviceData::FindEmbeddedDeviceByType( String^ type )
+{
+ if (String::IsNullOrEmpty(type))
+ throw gcnew ArgumentException("null or empty", "type");
+
+ PLT_DeviceDataReference r;
+ marshal_context c;
+
+ Helpers::ThrowOnErrorButNoSuchItem((*m_pHandle)->FindEmbeddedDeviceByType(
+ c.marshal_as<const char*>(type),
+ r
+ ));
+
+ if (r.IsNull())
+ return nullptr;
+
+ return marshal_as<DeviceData^>(r);
+}
+
+Platinum::Service^ Platinum::DeviceData::FindServiceById( String^ id )
+{
+ if (String::IsNullOrEmpty(id))
+ throw gcnew ArgumentException("null or empty", "id");
+
+ PLT_Service* r = 0;
+ marshal_context c;
+
+ Helpers::ThrowOnErrorButNoSuchItem((*m_pHandle)->FindServiceById(
+ c.marshal_as<const char*>(id),
+ r
+ ));
+
+ if (!r)
+ return nullptr;
+
+ return marshal_as<Service^>(*r);
+}
+
+Platinum::Service^ Platinum::DeviceData::FindServiceByType( String^ type )
+{
+ if (String::IsNullOrEmpty(type))
+ throw gcnew ArgumentException("null or empty", "type");
+
+ PLT_Service* r = 0;
+ marshal_context c;
+
+ Helpers::ThrowOnErrorButNoSuchItem((*m_pHandle)->FindServiceByType(
+ c.marshal_as<const char*>(type),
+ r
+ ));
+
+ if (!r)
+ return nullptr;
+
+ return marshal_as<Service^>(*r);
+}
+
+Platinum::Service^ Platinum::DeviceData::FindServiceBySCPDURL( Uri^ url )
+{
+ if (url == nullptr)
+ throw gcnew ArgumentNullException("url");
+
+ PLT_Service* r = 0;
+ marshal_context c;
+
+ Helpers::ThrowOnErrorButNoSuchItem((*m_pHandle)->FindServiceBySCPDURL(
+ c.marshal_as<const char*>(url->ToString()),
+ r
+ ));
+
+ if (!r)
+ return nullptr;
+
+ return marshal_as<Service^>(*r);
+}
+
+Platinum::Service^ Platinum::DeviceData::FindServiceByControlURL( Uri^ url )
+{
+ if (url == nullptr)
+ throw gcnew ArgumentNullException("url");
+
+ PLT_Service* r = 0;
+ marshal_context c;
+
+ Helpers::ThrowOnErrorButNoSuchItem((*m_pHandle)->FindServiceByControlURL(
+ c.marshal_as<const char*>(url->ToString()),
+ r
+ ));
+
+ if (!r)
+ return nullptr;
+
+ return marshal_as<Service^>(*r);
+}
+
+Platinum::Service^ Platinum::DeviceData::FindServiceByEventSubURL( Uri^ url )
+{
+ if (url == nullptr)
+ throw gcnew ArgumentNullException("url");
+
+ PLT_Service* r = 0;
+ marshal_context c;
+
+ Helpers::ThrowOnErrorButNoSuchItem((*m_pHandle)->FindServiceByEventSubURL(
+ c.marshal_as<const char*>(url->ToString()),
+ r
+ ));
+
+ if (!r)
+ return nullptr;
+
+ return marshal_as<Service^>(*r);
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceData.h b/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceData.h
new file mode 100644
index 0000000..e7e321f
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceData.h
@@ -0,0 +1,264 @@
+/*****************************************************************
+|
+| Platinum - Managed DeviceData
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| DeviceIcon
++---------------------------------------------------------------------*/
+public ref class DeviceIcon : public ManagedWrapper<PLT_DeviceIcon>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, MimeType, m_MimeType, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(Int32, Width, m_Width, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(Int32, Height, m_Height, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(Int32, Depth, m_Depth, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, UrlPath, m_UrlPath, m_pHandle);
+
+internal:
+
+ DeviceIcon(PLT_DeviceIcon& native) :
+ ManagedWrapper<PLT_DeviceIcon>(native)
+ {}
+
+public:
+ DeviceIcon() :
+ ManagedWrapper<PLT_DeviceIcon>()
+ {}
+
+ DeviceIcon(String^ mimeType, Int32 width, Int32 height, Int32 depth, String^ urlPath) :
+ ManagedWrapper<PLT_DeviceIcon>()
+ {
+ MimeType = mimeType;
+ Width = width;
+ Height = height;
+ Depth = depth;
+ UrlPath = urlPath;
+ }
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::DeviceIcon, PLT_DeviceIcon);
+
+namespace Platinum
+{
+
+ref class Service;
+
+/*----------------------------------------------------------------------
+| DeviceData
++---------------------------------------------------------------------*/
+public ref class DeviceData
+{
+protected:
+
+ PLT_DeviceDataReference* m_pHandle;
+
+public:
+
+ property String^ Description
+ {
+ String^ get()
+ {
+ NPT_String s;
+
+ Helpers::ThrowOnError((*m_pHandle)->GetDescription(s));
+
+ return gcnew String(s);
+ }
+ }
+
+ property Uri^ DescriptionUrl
+ {
+ Uri^ get()
+ {
+ return marshal_as<Uri^>((*m_pHandle)->GetDescriptionUrl());
+ }
+ }
+
+ property Uri^ UrlBase
+ {
+ Uri^ get()
+ {
+ return marshal_as<Uri^>((*m_pHandle)->GetURLBase());
+ }
+ }
+
+ property Uri^ IconUrl
+ {
+ Uri^ get()
+ {
+ return marshal_as<Uri^>((*m_pHandle)->GetIconUrl());
+ }
+ }
+
+ property TimeSpan^ LeaseTime
+ {
+ TimeSpan^ get()
+ {
+ return marshal_as<TimeSpan>((*m_pHandle)->GetLeaseTime());
+ }
+ }
+
+ property String^ UUID
+ {
+ String^ get()
+ {
+ return gcnew String((*m_pHandle)->GetUUID());
+ }
+ }
+
+ property String^ FriendlyName
+ {
+ String^ get()
+ {
+ return gcnew String((*m_pHandle)->GetFriendlyName());
+ }
+ }
+
+ property String^ TypeName
+ {
+ String^ get()
+ {
+ return gcnew String((*m_pHandle)->GetType());
+ }
+ }
+
+ property String^ ModelDescription
+ {
+ String^ get()
+ {
+ return gcnew String((*m_pHandle)->GetModelDescription());
+ }
+ }
+
+ property String^ ParentUUID
+ {
+ String^ get()
+ {
+ return gcnew String((*m_pHandle)->GetParentUUID());
+ }
+ }
+
+ property IEnumerable<Service^>^ Services
+ {
+ IEnumerable<Service^>^ get();
+ }
+
+ property IEnumerable<DeviceData^>^ EmbeddedDevices
+ {
+ IEnumerable<DeviceData^>^ get();
+ }
+
+internal:
+
+ property PLT_DeviceDataReference& Handle
+ {
+ PLT_DeviceDataReference& get()
+ {
+ return *m_pHandle;
+ }
+ }
+
+public:
+
+ DeviceData^ FindEmbeddedDeviceByType(String^ type);
+ Service^ FindServiceById(String^ serviceId);
+ Service^ FindServiceByType(String^ type);
+ Service^ FindServiceBySCPDURL(Uri^ url);
+ Service^ FindServiceByControlURL(Uri^ url);
+ Service^ FindServiceByEventSubURL(Uri^ url);
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (*m_pHandle == *((DeviceData^)obj)->m_pHandle);
+ }
+
+internal:
+
+ DeviceData(PLT_DeviceDataReference& devData)
+ {
+ if (devData.IsNull())
+ throw gcnew ArgumentNullException("devData");
+
+ m_pHandle = new PLT_DeviceDataReference(devData);
+ }
+
+ DeviceData(PLT_DeviceData& devData)
+ {
+ m_pHandle = new PLT_DeviceDataReference(&devData);
+ }
+
+public:
+
+ ~DeviceData()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!DeviceData();
+ }
+
+ !DeviceData()
+ {
+ // clean-up unmanaged
+ if (m_pHandle != 0)
+ {
+ delete m_pHandle;
+
+ m_pHandle = 0;
+ }
+ }
+
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::DeviceData, PLT_DeviceData);
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::DeviceData, PLT_DeviceDataReference);
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceHost.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceHost.cpp
new file mode 100644
index 0000000..93b15f3
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceHost.cpp
@@ -0,0 +1,38 @@
+/*****************************************************************
+|
+| Platinum - DeviceHost
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "DeviceHost.h" \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceHost.h b/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceHost.h
new file mode 100644
index 0000000..d920e06
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/DeviceHost.h
@@ -0,0 +1,124 @@
+/*****************************************************************
+|
+| Platinum - DeviceHost
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+#include "DeviceData.h"
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| DeviceHost
++---------------------------------------------------------------------*/
+public ref class DeviceHost : public DeviceData
+{
+private:
+
+ PLT_DeviceHostReference* m_pHostHandle;
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (*m_pHandle == ((DeviceHost^)obj)->Handle);
+ }
+
+internal:
+
+ property PLT_DeviceHostReference& Host
+ {
+ PLT_DeviceHostReference& get()
+ {
+ return *m_pHostHandle;
+ }
+ }
+
+internal:
+
+ DeviceHost(PLT_DeviceHostReference& devHost) :
+ m_pHostHandle(new PLT_DeviceHostReference(devHost)),
+ DeviceData((PLT_DeviceDataReference&)*m_pHostHandle)
+ {
+ }
+
+ DeviceHost(PLT_DeviceHost& devHost) :
+ m_pHostHandle(new PLT_DeviceHostReference(&devHost)),
+ DeviceData((PLT_DeviceDataReference&)*m_pHostHandle) // we must make sure to pass our newly created ref object
+ {
+ }
+
+public:
+
+ void setLeaseTime(TimeSpan^ lease)
+ {
+ (*m_pHostHandle)->SetLeaseTime(NPT_TimeInterval((double)lease->TotalSeconds));
+ }
+
+ NPT_Result AddIcon(DeviceIcon^ icon, array<Byte>^ data)
+ {
+ pin_ptr<Byte> pinnedBuffer = &data[0];
+ return (*m_pHostHandle)->AddIcon(icon->Handle, (const void*)pinnedBuffer, data->Length, true);
+ }
+
+ ~DeviceHost()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!DeviceHost();
+ }
+
+ !DeviceHost()
+ {
+ // clean-up unmanaged
+ if (m_pHostHandle != 0)
+ {
+ delete m_pHostHandle;
+
+ m_pHostHandle = 0;
+ }
+ }
+
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::DeviceHost, PLT_DeviceHost);
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::DeviceHost, PLT_DeviceHostReference); \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Didl.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/Didl.cpp
new file mode 100644
index 0000000..9c8e9c2
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Didl.cpp
@@ -0,0 +1,39 @@
+/*****************************************************************
+|
+| Platinum - Managed Didl
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "Didl.h"
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Didl.h b/lib/libUPnP/Platinum/Source/Extras/Managed/Didl.h
new file mode 100644
index 0000000..57b02df
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Didl.h
@@ -0,0 +1,70 @@
+/*****************************************************************
+|
+| Platinum - Managed Didl
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDidl.h"
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| Didl
++---------------------------------------------------------------------*/
+public ref class Didl
+{
+public:
+
+ static property String^ header
+ {
+ String^ get()
+ {
+ return gcnew String(didl_header);
+ }
+ }
+
+ static property String^ footer
+ {
+ String^ get()
+ {
+ return gcnew String(didl_footer);
+ }
+ }
+
+};
+
+}
+
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/EnumerableNptArray.h b/lib/libUPnP/Platinum/Source/Extras/Managed/EnumerableNptArray.h
new file mode 100644
index 0000000..7d17959
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/EnumerableNptArray.h
@@ -0,0 +1,226 @@
+/*****************************************************************
+|
+| Platinum - Managed EnumerableNptArray
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+namespace Enumerables
+{
+
+/*----------------------------------------------------------------------
+| EnumerableNptArray
++---------------------------------------------------------------------*/
+template<typename T_DotNetType, typename T_NativeType>
+private ref class EnumerableNptArray : public IEnumerable<T_DotNetType>
+{
+private:
+
+ ref class EnumerableNptArrayIterator : public IEnumerator<T_DotNetType>
+ {
+ private:
+
+ const NPT_Array<T_NativeType>* m_pArray;
+ NPT_Ordinal m_Index;
+
+ public:
+
+ virtual property T_DotNetType Current
+ {
+ T_DotNetType get()
+ {
+ return marshal_as<T_DotNetType>(*(*m_pArray)[m_Index]);
+ }
+ }
+
+ private:
+
+ virtual property Object^ Current2
+ {
+ Object^ get() sealed = System::Collections::IEnumerator::Current::get
+ {
+ return marshal_as<T_DotNetType>(*(*m_pArray)[m_Index]); // FIXME: This is a problem when T_NativeType is not a pointer (like PLT_DeviceDataReference for example)
+ }
+ }
+
+ public:
+
+ virtual bool MoveNext()
+ {
+ if (m_Index < m_pArray->GetItemCount() - 1)
+ {
+ m_Index++;
+ }
+
+ return false;
+ }
+
+ virtual void Reset()
+ {
+ m_Index = -1;
+ }
+
+ public:
+
+ EnumerableNptArrayIterator(const NPT_Array<T_NativeType>& array)
+ {
+ m_Index = -1;
+ m_pArray = &array;
+ }
+
+ ~EnumerableNptArrayIterator()
+ {
+ }
+
+ };
+
+private:
+
+ const NPT_Array<T_NativeType>* m_pArray;
+
+public:
+
+ virtual IEnumerator<T_DotNetType>^ GetEnumerator()
+ {
+ return gcnew EnumerableNptArrayIterator(*m_pArray);
+ }
+
+private:
+
+ virtual System::Collections::IEnumerator^ GetEnumerator2() sealed = System::Collections::IEnumerable::GetEnumerator
+ {
+ return gcnew EnumerableNptArrayIterator(*m_pArray);
+ }
+
+public:
+
+ EnumerableNptArray(const NPT_Array<T_NativeType>& array)
+ {
+ m_pArray = &array;
+ }
+};
+
+/*----------------------------------------------------------------------
+| EnumerableNptArrayRef
++---------------------------------------------------------------------*/
+template<typename T_DotNetType, typename T_NativeType>
+private ref class EnumerableNptArrayRef : public IEnumerable<T_DotNetType>
+{
+private:
+
+ ref class EnumerableNptArrayRefIterator : public IEnumerator<T_DotNetType>
+ {
+ private:
+
+ const NPT_Array<T_NativeType>* m_pArray;
+ NPT_Ordinal m_Index;
+
+ public:
+
+ virtual property T_DotNetType Current
+ {
+ T_DotNetType get()
+ {
+ return marshal_as<T_DotNetType>((*m_pArray)[m_Index]);
+ }
+ }
+
+ private:
+
+ virtual property Object^ Current2
+ {
+ Object^ get() sealed = System::Collections::IEnumerator::Current::get
+ {
+ return marshal_as<T_DotNetType>((*m_pArray)[m_Index]); // FIXME: This is a problem when T_NativeType is not a pointer (like PLT_DeviceDataReference for example)
+ }
+ }
+
+ public:
+
+ virtual bool MoveNext()
+ {
+ if (m_Index < m_pArray->GetItemCount() - 1)
+ {
+ m_Index++;
+ }
+
+ return false;
+ }
+
+ virtual void Reset()
+ {
+ m_Index = -1;
+ }
+
+ public:
+
+ EnumerableNptArrayRefIterator(const NPT_Array<T_NativeType>& array)
+ {
+ m_Index = -1;
+ m_pArray = &array;
+ }
+
+ ~EnumerableNptArrayRefIterator()
+ {
+ }
+
+ };
+
+private:
+
+ const NPT_Array<T_NativeType>* m_pArray;
+
+public:
+
+ virtual IEnumerator<T_DotNetType>^ GetEnumerator()
+ {
+ return gcnew EnumerableNptArrayRefIterator(*m_pArray);
+ }
+
+private:
+
+ virtual System::Collections::IEnumerator^ GetEnumerator2() sealed = System::Collections::IEnumerable::GetEnumerator
+ {
+ return gcnew EnumerableNptArrayRefIterator(*m_pArray);
+ }
+
+public:
+
+ EnumerableNptArrayRef(const NPT_Array<T_NativeType>& array)
+ {
+ m_pArray = &array;
+ }
+};
+
+}
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/EnumerableNptList.h b/lib/libUPnP/Platinum/Source/Extras/Managed/EnumerableNptList.h
new file mode 100644
index 0000000..fea89ae
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/EnumerableNptList.h
@@ -0,0 +1,234 @@
+/*****************************************************************
+|
+| Platinum - Managed EnumerableNptList
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+namespace Enumerables
+{
+
+/*----------------------------------------------------------------------
+| EnumerableNptList
++---------------------------------------------------------------------*/
+template<typename T_DotNetType, typename T_NativeType>
+private ref class EnumerableNptList : public IEnumerable<T_DotNetType>
+{
+private:
+
+ ref class EnumerableNptListIterator : public IEnumerator<T_DotNetType>
+ {
+ private:
+
+ const NPT_List<T_NativeType>* m_pList;
+ typename NPT_List<T_NativeType>::Iterator* m_pIt;
+
+ public:
+
+ virtual property T_DotNetType Current
+ {
+ T_DotNetType get()
+ {
+ return marshal_as<T_DotNetType>(***m_pIt); // FIXME: This is a problem when T_NativeType is not a pointer (like PLT_DeviceDataReference for example)
+ }
+ }
+
+ private:
+
+ virtual property Object^ Current2
+ {
+ Object^ get() sealed = System::Collections::IEnumerator::Current::get
+ {
+ return marshal_as<T_DotNetType>(***m_pIt); // FIXME: This is a problem when T_NativeType is not a pointer (like PLT_DeviceDataReference for example)
+ }
+ }
+
+ public:
+
+ virtual bool MoveNext()
+ {
+ if (!m_pIt)
+ {
+ m_pIt = &m_pList->GetFirstItem();
+ }
+ else
+ {
+ (*m_pIt)++;
+ }
+
+ return *m_pIt;
+ }
+
+ virtual void Reset()
+ {
+ m_pIt = 0;
+ }
+
+ public:
+
+ EnumerableNptListIterator(const NPT_List<T_NativeType>& list)
+ {
+ m_pIt = 0;
+ m_pList = &list;
+ }
+
+ ~EnumerableNptListIterator()
+ {
+ }
+
+ };
+
+private:
+
+ const NPT_List<T_NativeType>* m_pList;
+
+public:
+
+ virtual IEnumerator<T_DotNetType>^ GetEnumerator()
+ {
+ return gcnew EnumerableNptListIterator(*m_pList);
+ }
+
+private:
+
+ virtual System::Collections::IEnumerator^ GetEnumerator2() sealed = System::Collections::IEnumerable::GetEnumerator
+ {
+ return gcnew EnumerableNptListIterator(*m_pList);
+ }
+
+public:
+
+ EnumerableNptList(const NPT_List<T_NativeType>& list)
+ {
+ m_pList = &list;
+ }
+};
+
+/*----------------------------------------------------------------------
+| EnumerableNptListRef
++---------------------------------------------------------------------*/
+template<typename T_DotNetType, typename T_NativeType>
+private ref class EnumerableNptListRef : public IEnumerable<T_DotNetType>
+{
+private:
+
+ ref class EnumerableNptListRefIterator : public IEnumerator<T_DotNetType>
+ {
+ private:
+
+ const NPT_List<T_NativeType>* m_pList;
+ typename NPT_List<T_NativeType>::Iterator* m_pIt;
+
+ public:
+
+ virtual property T_DotNetType Current
+ {
+ T_DotNetType get()
+ {
+ return marshal_as<T_DotNetType>(**m_pIt);
+ }
+ }
+
+ private:
+
+ virtual property Object^ Current2
+ {
+ Object^ get() sealed = System::Collections::IEnumerator::Current::get
+ {
+ return marshal_as<T_DotNetType>(**m_pIt);
+ }
+ }
+
+ public:
+
+ virtual bool MoveNext()
+ {
+ if (!m_pIt)
+ {
+ m_pIt = &m_pList->GetFirstItem();
+ }
+ else
+ {
+ (*m_pIt)++;
+ }
+
+ return *m_pIt;
+ }
+
+ virtual void Reset()
+ {
+ m_pIt = 0;
+ }
+
+ public:
+
+ EnumerableNptListRefIterator(const NPT_List<T_NativeType>& list)
+ {
+ m_pIt = 0;
+ m_pList = &list;
+ }
+
+ ~EnumerableNptListRefIterator()
+ {
+ }
+
+ };
+
+private:
+
+ const NPT_List<T_NativeType>* m_pList;
+
+public:
+
+ virtual IEnumerator<T_DotNetType>^ GetEnumerator()
+ {
+ return gcnew EnumerableNptListRefIterator(*m_pList);
+ }
+
+private:
+
+ virtual System::Collections::IEnumerator^ GetEnumerator2() sealed = System::Collections::IEnumerable::GetEnumerator
+ {
+ return gcnew EnumerableNptListRefIterator(*m_pList);
+ }
+
+public:
+
+ EnumerableNptListRef(const NPT_List<T_NativeType>& list)
+ {
+ m_pList = &list;
+ }
+};
+
+}
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Helpers.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/Helpers.cpp
new file mode 100644
index 0000000..3dbefdf
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Helpers.cpp
@@ -0,0 +1,39 @@
+/*****************************************************************
+|
+| Platinum - Managed Helpers
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "Helpers.h"
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Helpers.h b/lib/libUPnP/Platinum/Source/Extras/Managed/Helpers.h
new file mode 100644
index 0000000..13a9764
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Helpers.h
@@ -0,0 +1,378 @@
+/*****************************************************************
+|
+| Platinum - Managed Helpers
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NeptuneException.h"
+#include "Clix.h"
+
+using namespace clix;
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| Helpers
++---------------------------------------------------------------------*/
+private ref class Helpers
+{
+public:
+
+ static void ThrowOnError(NPT_Result r)
+ {
+ if (NPT_FAILED(r))
+ {
+ throw gcnew NeptuneException(r);
+ }
+ }
+
+ static void ThrowOnErrorButNoSuchItem(NPT_Result r)
+ {
+ if (NPT_FAILED(r) && (r != NPT_ERROR_NO_SUCH_ITEM))
+ {
+ throw gcnew NeptuneException(r);
+ }
+ }
+
+ // this code was part of RouterControl.IO (http://routercontrol.codeplex.com)
+ // for more details see:
+ // http://www.knopflerfish.org/releases/current/docs/jars/upnp/upnp_api-2.0.0/src/org/osgi/service/upnp/UPnPStateVariable.java
+ static Type^ ParseType(const NPT_String& upnpType)
+ {
+ NPT_String s (upnpType);
+
+ s.MakeLowercase();
+
+ if (s == "string")
+ return String::typeid;
+
+ if (s == "char")
+ return Char::typeid;
+
+ if (s == "boolean")
+ return Boolean::typeid;
+
+ if (s == "ui1")
+ return Byte::typeid;
+
+ if (s == "ui2")
+ return UInt16::typeid;
+
+ if (s == "ui4")
+ return UInt32::typeid;
+
+ if (s == "i1")
+ return SByte::typeid;
+
+ if (s == "i2")
+ return Int16::typeid;
+
+ if ((s == "i4") || (s == "int"))
+ return Int32::typeid;
+
+ if ((s == "r4") || (s == "float"))
+ return Single::typeid;
+
+ if ((s == "r8") || (s == "number") || (s == "fixed.14.4"))
+ return Double::typeid;
+
+ if ((s == "date") || (s == "datetime") || (s == "datetime.tz"))
+ return DateTime::typeid;
+
+ if ((s == "time") || (s == "time.tz")) // milliseconds since midnight
+ return UInt64::typeid;
+
+ if ((s == "bin.base64") || (s == "bin.hex"))
+ return array<Byte>::typeid;
+
+ if (s == "uri")
+ return Uri::typeid;
+
+ if (s == "uuid")
+ return Guid::typeid;
+
+ throw gcnew ArgumentException("unknown type", "upnpType");
+ }
+
+ static Object^ ConvertValue(const NPT_String& targetType, const NPT_String& val)
+ {
+ return ConvertValue(ParseType(targetType), val);
+ }
+
+ static Object^ ConvertValue(Type^ targetType, const NPT_String& val)
+ {
+ String^ strVal = gcnew String(val);
+
+ if (targetType == String::typeid)
+ return strVal;
+
+ if (targetType == Char::typeid)
+ {
+ if (val.IsEmpty())
+ throw gcnew ArgumentException("character value is empty", "val");
+
+ return Char(val[0]);
+ }
+
+ if (targetType == Boolean::typeid)
+ return Convert::ToBoolean(strVal);
+
+ if (targetType == Byte::typeid)
+ return Convert::ToByte(strVal);
+
+ if (targetType == SByte::typeid)
+ return Convert::ToSByte(strVal);
+
+ if (targetType == UInt16::typeid)
+ return Convert::ToUInt16(strVal);
+
+ if (targetType == UInt32::typeid)
+ return Convert::ToUInt32(strVal);
+
+ if (targetType == UInt64::typeid)
+ return Convert::ToUInt64(strVal);
+
+ if (targetType == Int16::typeid)
+ return Convert::ToInt16(strVal);
+
+ if (targetType == Int32::typeid)
+ return Convert::ToInt32(strVal);
+
+ if (targetType == Int64::typeid)
+ return Convert::ToInt64(strVal);
+
+ if (targetType == Single::typeid)
+ return Convert::ToSingle(strVal);
+
+ if (targetType == Double::typeid)
+ return Convert::ToDouble(strVal);
+
+ if (targetType == DateTime::typeid)
+ return Convert::ToDateTime(strVal);
+
+ if (targetType == array<Byte>::typeid)
+ return Convert::FromBase64String(strVal);
+
+ if (targetType == Uri::typeid)
+ return marshal_as<Uri^>(val);
+
+ if (targetType == Guid::typeid)
+ return gcnew Guid(strVal);
+
+ throw gcnew ArgumentException("unsupported type", "targetType");
+ }
+
+};
+
+/*----------------------------------------------------------------------
+| StringConv
++---------------------------------------------------------------------*/
+struct StringConv
+{
+ gcroot<msclr::interop::marshal_context^> c;
+ //const char* szAnsi;
+ std::string szAnsi;
+
+ StringConv(System::String^ s) :
+ //c(gcnew msclr::interop::marshal_context),
+ //szAnsi(c->marshal_as<E_UTF8>(s))
+ szAnsi(marshalString<E_UTF8>(s))
+ {}
+
+ ~StringConv()
+ {}
+
+ operator const char*() const
+ {
+ //return szAnsi;
+ return szAnsi.c_str();
+ }
+};
+
+/*----------------------------------------------------------------------
+| StringConvA
++---------------------------------------------------------------------*/
+struct StringConvA
+{
+ char* szAnsi;
+
+ StringConvA(System::String^ s) :
+ szAnsi(static_cast<char*>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(s).ToPointer()))
+ {}
+
+ ~StringConvA()
+ {
+
+ System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(szAnsi));
+ }
+
+ operator LPCSTR() const
+ {
+ return szAnsi;
+ }
+};
+
+/*----------------------------------------------------------------------
+| StringConvW
++---------------------------------------------------------------------*/
+struct StringConvW
+{
+ wchar_t* szUnicode;
+
+ StringConvW(System::String^ s) :
+ szUnicode(static_cast<wchar_t*>(System::Runtime::InteropServices::Marshal::StringToHGlobalUni(s).ToPointer()))
+ {}
+
+ ~StringConvW()
+ {
+
+ System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(szUnicode));
+ }
+
+ operator LPCWSTR() const
+ {
+ return szUnicode;
+ }
+};
+
+/*----------------------------------------------------------------------
+| ManagedWrapper
++---------------------------------------------------------------------*/
+template<typename T_NativeType>
+public ref class ManagedWrapper
+{
+protected:
+
+ T_NativeType* m_pHandle;
+ bool m_Owned;
+
+internal:
+
+ property T_NativeType& Handle
+ {
+ T_NativeType& get()
+ {
+ return *m_pHandle;
+ }
+ }
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (m_pHandle == ((ManagedWrapper^)obj)->m_pHandle);
+ }
+
+internal:
+
+ ManagedWrapper() : m_Owned(true)
+ {
+ m_pHandle = new T_NativeType();
+ }
+
+ /*ManagedWrapper(ManagedWrapper^ obj)
+ {
+ m_pHandle = new T_NativeType(obj->Handle);
+ }
+
+ ManagedWrapper(T_NativeType object_class) : m_Owned(true)
+ {
+ m_pHandle = new T_NativeType(object_class.Handle);
+ }*/
+
+ ManagedWrapper(T_NativeType& object_class) : m_Owned(false)
+ {
+ // IMPORTANT: we're keeping a reference of the native pointer
+ // so passing a reference to a local variable allocated on the stack is not OK
+ m_pHandle = &object_class;
+ }
+
+public:
+
+ ~ManagedWrapper()
+ {
+ this->!ManagedWrapper();
+ }
+
+ !ManagedWrapper()
+ {
+ if (m_pHandle != 0 && m_Owned)
+ {
+ delete m_pHandle;
+ }
+
+ m_pHandle = 0;
+ }
+};
+
+}
+
+#define PLATINUM_MANAGED_IMPLEMENT_PROPERTY(propertyType, propertyName, nativeVar, nativePtr) \
+property propertyType propertyName { \
+ propertyType get() { \
+ return (nativePtr##->##nativeVar); \
+ } \
+ void set(propertyType var) { \
+ nativePtr##->##nativeVar = (var); \
+ } \
+}
+
+#define PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(propertyType, propertyName, nativeVar, nativePtr) \
+property propertyType propertyName { \
+ propertyType get() { \
+ return marshal_as<propertyType>(nativePtr##->##nativeVar); \
+ } \
+ void set(propertyType var) { \
+ std::string s = marshalString<E_UTF8>(var); \
+ nativePtr##->##nativeVar = s.c_str(); \
+ } \
+}
+
+#define PLATINUM_MANAGED_IMPLEMENT_OBJECT_PROPERTY(propertyType, propertyName, nativeVar, nativePtr) \
+property propertyType propertyName { \
+ propertyType get() { \
+ return marshal_as<propertyType>(nativePtr##->##nativeVar); \
+ } \
+ void set(propertyType var) { \
+ nativePtr##->##nativeVar = var->Handle; \
+ } \
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Http.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/Http.cpp
new file mode 100644
index 0000000..155b307
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Http.cpp
@@ -0,0 +1,38 @@
+/*****************************************************************
+|
+| Platinum - Managed Http
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "Http.h"
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Http.h b/lib/libUPnP/Platinum/Source/Extras/Managed/Http.h
new file mode 100644
index 0000000..01059f4
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Http.h
@@ -0,0 +1,286 @@
+/*****************************************************************
+|
+| Platinum - Managed Http
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| HttpRequest
++---------------------------------------------------------------------*/
+public ref class HttpRequest
+{
+protected:
+
+ NPT_HttpRequest* m_pHandle;
+
+internal:
+
+ property NPT_HttpRequest& Handle
+ {
+ NPT_HttpRequest& get()
+ {
+ return *m_pHandle;
+ }
+ }
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (m_pHandle == ((HttpRequest^)obj)->m_pHandle);
+ }
+
+public:
+
+ // properties
+ virtual property Uri^ URI
+ {
+ Uri^ get()
+ {
+ return marshal_as<Uri^>(m_pHandle->GetUrl());
+ }
+ }
+
+internal:
+
+ // Note: Because a NPT_HttpRequest cannot do a deep copy,
+ // this only refers to the original native object
+ HttpRequest(NPT_HttpRequest& native) :
+ m_pHandle(&native)
+ {
+ }
+
+public:
+
+ ~HttpRequest()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!HttpRequest();
+ }
+
+ !HttpRequest()
+ {
+ // clean-up unmanaged
+ }
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::HttpRequest, NPT_HttpRequest);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| HttpRequest
++---------------------------------------------------------------------*/
+public ref class HttpResponse
+{
+protected:
+
+ NPT_HttpResponse* m_pHandle;
+
+internal:
+
+ property NPT_HttpResponse& Handle
+ {
+ NPT_HttpResponse& get()
+ {
+ return *m_pHandle;
+ }
+ }
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (m_pHandle == ((HttpResponse^)obj)->m_pHandle);
+ }
+
+internal:
+
+ // Note: Because a NPT_HttpResponse cannot do a deep copy,
+ // this only refers to the original native object
+ HttpResponse(NPT_HttpResponse& native) :
+ m_pHandle(&native)
+ {
+ }
+
+public:
+
+ ~HttpResponse()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!HttpResponse();
+ }
+
+ !HttpResponse()
+ {
+ // clean-up unmanaged
+ }
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::HttpResponse, NPT_HttpResponse);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| DeviceSignature
++---------------------------------------------------------------------*/
+public enum class DeviceSignature
+{
+ Unknown,
+ XBox,
+ PS3,
+ WMP
+};
+
+/*----------------------------------------------------------------------
+| HttpRequestContext
++---------------------------------------------------------------------*/
+public ref class HttpRequestContext : ManagedWrapper<PLT_HttpRequestContext>
+{
+
+public:
+
+ ref struct SocketAddress {
+ String^ ip;
+ UInt32 port;
+ };
+
+ virtual property SocketAddress^ LocalAddress
+ {
+ SocketAddress^ get()
+ {
+ SocketAddress^ local = gcnew SocketAddress;
+ local->ip = marshal_as<String^>(Handle.GetLocalAddress().GetIpAddress().ToString());
+ local->port = Handle.GetLocalAddress().GetPort();
+ return local;
+ }
+ }
+
+ virtual property SocketAddress^ RemoteAddress
+ {
+ SocketAddress^ get()
+ {
+ SocketAddress^ local = gcnew SocketAddress;
+ local->ip = marshal_as<String^>(Handle.GetRemoteAddress().GetIpAddress().ToString());
+ local->port = Handle.GetRemoteAddress().GetPort();
+ return local;
+ }
+ }
+
+ virtual property HttpRequest^ Request
+ {
+ HttpRequest^ get()
+ {
+ return marshal_as<HttpRequest^>(m_pHandle->GetRequest());
+ }
+ }
+
+ virtual property DeviceSignature Signature
+ {
+ DeviceSignature get()
+ {
+ return ParseDeviceSignature(m_pHandle->GetDeviceSignature());
+ }
+ }
+private:
+
+ static DeviceSignature ParseDeviceSignature(PLT_DeviceSignature signature)
+ {
+ switch (signature)
+ {
+ case PLT_DEVICE_XBOX:
+ return DeviceSignature::XBox;
+ case PLT_DEVICE_PS3:
+ return DeviceSignature::PS3;
+ case PLT_DEVICE_WMP:
+ return DeviceSignature::WMP;
+ default:
+ return DeviceSignature::Unknown;
+ }
+ }
+
+
+internal:
+
+ HttpRequestContext(PLT_HttpRequestContext& native) :
+ ManagedWrapper<PLT_HttpRequestContext>(native)
+ {
+ }
+
+ ~HttpRequestContext()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!HttpRequestContext();
+ }
+
+ !HttpRequestContext()
+ {
+ // clean-up unmanaged
+ }
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::HttpRequestContext, PLT_HttpRequestContext);
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/MediaConnect.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaConnect.cpp
new file mode 100644
index 0000000..f31b433
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaConnect.cpp
@@ -0,0 +1,59 @@
+/*****************************************************************
+|
+| Platinum - Managed MediaConnect
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "MediaConnect.h"
+#include "PltMediaConnect.h"
+
+Platinum::MediaConnect::MediaConnect(PLT_MediaConnect* server) :
+ MediaServer((PLT_MediaServer*)server)
+{
+}
+
+Platinum::MediaConnect::MediaConnect(String^ friendlyName) :
+ MediaServer(new PLT_MediaConnect(StringConv(friendlyName)))
+{
+}
+
+Platinum::MediaConnect::MediaConnect(String^ friendlyName, String^ uuid, Int16 port) :
+ MediaServer(new PLT_MediaConnect(StringConv(friendlyName), true, StringConv(uuid), port))
+{
+}
+
+Platinum::MediaConnect::!MediaConnect()
+{
+
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/MediaConnect.h b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaConnect.h
new file mode 100644
index 0000000..54a9ec4
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaConnect.h
@@ -0,0 +1,80 @@
+/*****************************************************************
+|
+| Platinum - Managed MediaConnect
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "MediaServer.h"
+
+class PLT_MediaConnect;
+
+namespace Platinum
+{
+
+ref class MediaServer;
+
+/*----------------------------------------------------------------------
+| MediaConnect
++---------------------------------------------------------------------*/
+public ref class MediaConnect : public MediaServer
+{
+public:
+
+private:
+
+
+public:
+
+ // properties
+
+private:
+
+public:
+
+ MediaConnect(String^ friendlyName);
+ MediaConnect(String^ friendlyName, String^ uuid, Int16 port);
+ MediaConnect(PLT_MediaConnect* server);
+
+ ~MediaConnect()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!MediaConnect();
+ }
+
+ !MediaConnect();
+};
+
+} \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/MediaObject.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaObject.cpp
new file mode 100644
index 0000000..23b56a7
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaObject.cpp
@@ -0,0 +1,118 @@
+/*****************************************************************
+|
+| Platinum - Managed MediaObject
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "MediaObject.h"
+#include "EnumerableNptArray.h"
+#include "EnumerableNptList.h"
+
+IEnumerable<Platinum::PersonRole^>^ Platinum::PeopleInfo::Actors::get()
+{
+ return gcnew Enumerables::EnumerableNptListRef<PersonRole^, PLT_PersonRole>(
+ m_pHandle->actors
+ );
+}
+
+IEnumerable<Platinum::PersonRole^>^ Platinum::PeopleInfo::Artists::get()
+{
+ return gcnew Enumerables::EnumerableNptListRef<PersonRole^, PLT_PersonRole>(
+ m_pHandle->artists
+ );
+}
+
+IEnumerable<Platinum::PersonRole^>^ Platinum::PeopleInfo::Authors::get()
+{
+ return gcnew Enumerables::EnumerableNptListRef<PersonRole^, PLT_PersonRole>(
+ m_pHandle->authors
+ );
+}
+
+IEnumerable<System::String^>^ Platinum::AffiliationInfo::Genres::get()
+{
+ return gcnew Enumerables::EnumerableNptListRef<String^, NPT_String>(
+ m_pHandle->genres
+ );
+}
+
+IEnumerable<System::String^>^ Platinum::ExtraInfo::Relations::get()
+{
+ return gcnew Enumerables::EnumerableNptListRef<String^, NPT_String>(
+ m_pHandle->relations
+ );
+}
+
+IEnumerable<Platinum::AlbumArtInfo^>^ Platinum::ExtraInfo::AlbumArts::get()
+{
+ return gcnew Enumerables::EnumerableNptListRef<AlbumArtInfo^, PLT_AlbumArtInfo>(
+ m_pHandle->album_arts
+ );
+}
+
+
+Platinum::ProtocolInfo^ Platinum::ProtocolInfo::GetProtocolInfo(String^ filename,
+ bool with_dlna_extension,
+ HttpRequestContext^ context)
+{
+ return marshal_as<Platinum::ProtocolInfo^>(PLT_ProtocolInfo::GetProtocolInfo(StringConv(filename),
+ with_dlna_extension,
+ (context==nullptr)?NULL:&context->Handle).ToString());
+}
+
+Platinum::ProtocolInfo^ Platinum::ProtocolInfo::GetProtocolInfoFromMimeType(String^ mime_type,
+ bool with_dlna_extension,
+ HttpRequestContext^ context)
+{
+ return marshal_as<Platinum::ProtocolInfo^>(PLT_ProtocolInfo::GetProtocolInfoFromMimeType(StringConv(mime_type),
+ with_dlna_extension,
+ (context==nullptr)?NULL:&context->Handle).ToString());
+}
+
+Platinum::MediaItem^ Platinum::MediaObject::item()
+{
+ return gcnew MediaItem(this);
+}
+
+Platinum::MediaContainer^ Platinum::MediaObject::container()
+{
+ return gcnew MediaContainer(this);
+}
+
+IEnumerable<Platinum::MediaResource^>^ Platinum::MediaObject::Resources::get()
+{
+ return gcnew Enumerables::EnumerableNptArrayRef<MediaResource^, PLT_MediaItemResource>(
+ (*m_pHandle)->m_Resources
+ );
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/MediaObject.h b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaObject.h
new file mode 100644
index 0000000..11ebfce
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaObject.h
@@ -0,0 +1,735 @@
+/*****************************************************************
+|
+| Platinum - Managed ActionDescription
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMediaItem.h"
+#include "Http.h"
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| ObjectClass
++---------------------------------------------------------------------*/
+public ref class ObjectClass : public ManagedWrapper<PLT_ObjectClass>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Type, type, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, FriendlyName, friendly_name, m_pHandle);
+
+internal:
+
+ ObjectClass(PLT_ObjectClass& native) :
+ ManagedWrapper<PLT_ObjectClass>(native)
+ {}
+
+public:
+
+ ObjectClass(String^ type)
+ {
+ Type = type;
+ }
+
+ ObjectClass(String^ type, String^ friendly_name)
+ {
+ Type = type;
+ FriendlyName = friendly_name;
+ }
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::ObjectClass, PLT_ObjectClass);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| PersonRole
++---------------------------------------------------------------------*/
+public ref class PersonRole : public ManagedWrapper<PLT_PersonRole>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Name, name, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Role, role, m_pHandle);
+
+internal:
+
+ PersonRole(PLT_PersonRole& native) :
+ ManagedWrapper<PLT_PersonRole>(native)
+ {}
+
+public:
+ PersonRole(String^ name)
+ {
+ Name = name;
+ }
+
+ PersonRole(String^ name, String^ role)
+ {
+ Name = name;
+ Role = role;
+ }
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::PersonRole, PLT_PersonRole);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| PeopleInfo
++---------------------------------------------------------------------*/
+public ref class PeopleInfo : public ManagedWrapper<PLT_PeopleInfo>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Producer, producer, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Director, director, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Publisher, publisher, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Contributor, contributor, m_pHandle);
+
+ property IEnumerable<PersonRole^>^ Artists
+ {
+ IEnumerable<PersonRole^>^ get();
+ }
+
+ property IEnumerable<PersonRole^>^ Actors
+ {
+ IEnumerable<PersonRole^>^ get();
+ }
+
+ property IEnumerable<PersonRole^>^ Authors
+ {
+ IEnumerable<PersonRole^>^ get();
+ }
+
+public:
+
+ void AddArtist(PersonRole^ artist)
+ {
+ ((NPT_List<PLT_PersonRole>&)m_pHandle->artists).Add(artist->Handle);
+ }
+
+ void AddActor(PersonRole^ actor)
+ {
+ ((NPT_List<PLT_PersonRole>&)m_pHandle->actors).Add(actor->Handle);
+ }
+
+ void AddAuthors(PersonRole^ author)
+ {
+ ((NPT_List<PLT_PersonRole>&)m_pHandle->authors).Add(author->Handle);
+ }
+
+internal:
+
+ PeopleInfo(PLT_PeopleInfo& native) :
+ ManagedWrapper<PLT_PeopleInfo>(native)
+ {}
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::PeopleInfo, PLT_PeopleInfo);
+
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| AffiliationInfo
++---------------------------------------------------------------------*/
+public ref class AffiliationInfo : public ManagedWrapper<PLT_AffiliationInfo>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Album, album, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Playlist, playlist, m_pHandle);
+
+ property IEnumerable<String^>^ Genres
+ {
+ IEnumerable<String^>^ get();
+ }
+
+public:
+
+ void AddGenre(String^ genre)
+ {
+ m_pHandle->genres.Add(NPT_String(StringConv(genre)));
+ }
+
+internal:
+
+ AffiliationInfo(PLT_AffiliationInfo& native) :
+ ManagedWrapper<PLT_AffiliationInfo>(native)
+ {}
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::AffiliationInfo, PLT_AffiliationInfo);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| DescriptionInfo
++---------------------------------------------------------------------*/
+public ref class DescriptionInfo : public ManagedWrapper<PLT_Description>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, DescriptionText, description, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, LongDescriptionText, long_description, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, IconUri, icon_uri, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Region, region, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Rating, rating, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Date, date, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Language, language, m_pHandle);
+
+internal:
+
+ DescriptionInfo(PLT_Description& native) :
+ ManagedWrapper<PLT_Description>(native)
+ {}
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::DescriptionInfo, PLT_Description);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| RecordedInfo
++---------------------------------------------------------------------*/
+public ref class RecordedInfo : public ManagedWrapper<PLT_RecordedInfo>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, ProgramTitle, program_title, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, SeriesTitle, series_title, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, EpisodeNumber, episode_number, m_pHandle);
+
+internal:
+
+ RecordedInfo(PLT_RecordedInfo& native) :
+ ManagedWrapper<PLT_RecordedInfo>(native)
+ {}
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::RecordedInfo, PLT_RecordedInfo);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| AlbumArtInfo
++---------------------------------------------------------------------*/
+public ref class AlbumArtInfo : public ManagedWrapper<PLT_AlbumArtInfo>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Uri, uri, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, DlnaProfile, dlna_profile, m_pHandle);
+
+internal:
+
+ AlbumArtInfo(PLT_AlbumArtInfo& native) :
+ ManagedWrapper<PLT_AlbumArtInfo>(native)
+ {}
+
+public:
+ AlbumArtInfo(String^ uri)
+ {
+ Uri = uri;
+ }
+
+ AlbumArtInfo(String^ uri, String^ dlna_profile)
+ {
+ Uri = uri;
+ DlnaProfile = dlna_profile;
+ }
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::AlbumArtInfo, PLT_AlbumArtInfo);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| ExtraInfo
++---------------------------------------------------------------------*/
+public ref class ExtraInfo : public ManagedWrapper<PLT_ExtraInfo>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, ArtistDiscographyUri, artist_discography_uri, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, LyricsUri, lyrics_uri, m_pHandle);
+
+ property IEnumerable<String^>^ Relations
+ {
+ IEnumerable<String^>^ get();
+ }
+
+ property IEnumerable<AlbumArtInfo^>^ AlbumArts
+ {
+ IEnumerable<AlbumArtInfo^>^ get();
+ }
+
+public:
+
+ void AddGenre(String^ relation)
+ {
+ m_pHandle->relations.Add(NPT_String(StringConv(relation)));
+ }
+
+ void AddAlbumArtInfo(AlbumArtInfo^ info)
+ {
+ m_pHandle->album_arts.Add(info->Handle);
+ }
+
+
+internal:
+
+ ExtraInfo(PLT_ExtraInfo& native) :
+ ManagedWrapper<PLT_ExtraInfo>(native)
+ {}
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::ExtraInfo, PLT_ExtraInfo);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| MiscInfo
++---------------------------------------------------------------------*/
+public ref class MiscInfo : public ManagedWrapper<PLT_MiscInfo>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, DvdRegionCode, dvdregioncode, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, OriginalTrackNumber, original_track_number, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Toc, toc, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, UserAnnotation, user_annotation, m_pHandle);
+
+internal:
+
+ MiscInfo(PLT_MiscInfo& native) :
+ ManagedWrapper<PLT_MiscInfo>(native)
+ {}
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::MiscInfo, PLT_MiscInfo);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| ProtocolInfo
++---------------------------------------------------------------------*/
+public ref class ProtocolInfo : public ManagedWrapper<PLT_ProtocolInfo>
+{
+public:
+
+ // properties
+
+public:
+ static ProtocolInfo^ GetProtocolInfo(String^ filename)
+ {
+ return GetProtocolInfo(filename, true, nullptr);
+ }
+
+ static ProtocolInfo^ GetProtocolInfo(String^ filename,
+ bool with_dlna_extension)
+ {
+ return GetProtocolInfo(filename, with_dlna_extension, nullptr);
+ }
+
+ static ProtocolInfo^ GetProtocolInfo(String^ filename,
+ bool with_dlna_extension,
+ HttpRequestContext^ context);
+
+ static ProtocolInfo^ GetProtocolInfoFromMimeType(String^ mime_type)
+ {
+ return GetProtocolInfoFromMimeType(mime_type, true, nullptr);
+ }
+
+ static ProtocolInfo^ GetProtocolInfoFromMimeType(String^ mime_type,
+ bool with_dlna_extension)
+ {
+ return GetProtocolInfoFromMimeType(mime_type, with_dlna_extension, nullptr);
+ }
+
+ static ProtocolInfo^ GetProtocolInfoFromMimeType(String^ mime_type,
+ bool with_dlna_extension,
+ HttpRequestContext^ context);
+
+internal:
+
+ ProtocolInfo(PLT_ProtocolInfo& native) :
+ ManagedWrapper<PLT_ProtocolInfo>(native)
+ {}
+
+public:
+
+ ProtocolInfo(NPT_String& protocol_info) :
+ ManagedWrapper<PLT_ProtocolInfo>()
+ {
+ *m_pHandle = PLT_ProtocolInfo(protocol_info);
+ }
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::ProtocolInfo, PLT_ProtocolInfo);
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::ProtocolInfo, NPT_String);
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| MediaResource
++---------------------------------------------------------------------*/
+public ref class MediaResource : public ManagedWrapper<PLT_MediaItemResource>
+{
+public:
+
+ // properties
+
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, URI, m_Uri, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_OBJECT_PROPERTY(ProtocolInfo^, ProtoInfo, m_ProtocolInfo, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, Duration, m_Duration, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt64, Size, m_Size, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Protection, m_Protection, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, Bitrate, m_Bitrate, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, BitsPerSample, m_BitsPerSample, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, SampleFrequency, m_SampleFrequency, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, NbAudioChannels, m_NbAudioChannels, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Resolution, m_Resolution, m_pHandle);
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, ColorDepth, m_ColorDepth, m_pHandle);
+
+internal:
+
+ MediaResource(PLT_MediaItemResource& native) :
+ ManagedWrapper<PLT_MediaItemResource>(native)
+ {}
+
+public:
+ MediaResource() :
+ ManagedWrapper<PLT_MediaItemResource>()
+ {}
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::MediaResource, PLT_MediaItemResource);
+
+namespace Platinum
+{
+ref class MediaItem;
+ref class MediaContainer;
+
+/*----------------------------------------------------------------------
+| MediaObject
++---------------------------------------------------------------------*/
+public ref class MediaObject
+{
+protected:
+
+ PLT_MediaObjectReference* m_pHandle;
+
+public:
+
+ // properties
+
+ /* common properties */
+ PLATINUM_MANAGED_IMPLEMENT_OBJECT_PROPERTY(ObjectClass^, Class, m_ObjectClass, (*m_pHandle));
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, ObjectID, m_ObjectID, (*m_pHandle));
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, ParentID, m_ParentID, (*m_pHandle));
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, ReferenceID, m_ReferenceID, (*m_pHandle));
+
+ /* metadata */
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Title, m_Title, (*m_pHandle));
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Creator, m_Creator, (*m_pHandle));
+ PLATINUM_MANAGED_IMPLEMENT_STRING_PROPERTY(String^, Date, m_Date, (*m_pHandle));
+ PLATINUM_MANAGED_IMPLEMENT_OBJECT_PROPERTY(PeopleInfo^, People, m_People, (*m_pHandle));
+ PLATINUM_MANAGED_IMPLEMENT_OBJECT_PROPERTY(AffiliationInfo^, Affiliation, m_Affiliation, (*m_pHandle));
+ PLATINUM_MANAGED_IMPLEMENT_OBJECT_PROPERTY(DescriptionInfo^, Description, m_Description, (*m_pHandle));
+ PLATINUM_MANAGED_IMPLEMENT_OBJECT_PROPERTY(RecordedInfo^, Recorded, m_Recorded, (*m_pHandle));
+
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(bool, Restricted, m_Restricted, (*m_pHandle));
+
+ /* extras */
+ PLATINUM_MANAGED_IMPLEMENT_OBJECT_PROPERTY(ExtraInfo^, Extra, m_ExtraInfo, (*m_pHandle));
+
+ /* miscellaneous info */
+ PLATINUM_MANAGED_IMPLEMENT_OBJECT_PROPERTY(MiscInfo^, Miscellaneous, m_MiscInfo, (*m_pHandle));
+
+ property IEnumerable<MediaResource^>^ Resources
+ {
+ IEnumerable<MediaResource^>^ get();
+ }
+
+public:
+
+ void AddResource(MediaResource^ resource)
+ {
+ (*m_pHandle)->m_Resources.Add(resource->Handle);
+ }
+
+internal:
+
+ property PLT_MediaObjectReference& Handle
+ {
+ PLT_MediaObjectReference& get()
+ {
+ return *m_pHandle;
+ }
+ }
+
+public:
+
+ MediaItem^ item();
+ MediaContainer^ container();
+
+ String^ ToDidl(String^ filter)
+ {
+ NPT_String didl;
+ didl.Reserve(1024);
+
+ marshal_context c;
+ NPT_String _filter(c.marshal_as<const char*>(filter));
+
+ (*m_pHandle)->ToDidl(_filter, didl);
+
+ return marshal_as<String^>(didl.GetChars());
+ }
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (*m_pHandle == *((MediaObject^)obj)->m_pHandle);
+ }
+
+internal:
+
+ MediaObject(PLT_MediaObjectReference& media)
+ {
+ if (media.IsNull())
+ throw gcnew ArgumentNullException("media");
+
+ m_pHandle = new PLT_MediaObjectReference(media);
+ }
+
+ MediaObject(PLT_MediaObject& media)
+ {
+ m_pHandle = new PLT_MediaObjectReference(&media);
+ }
+
+protected:
+
+ MediaObject(PLT_MediaObject* media)
+ {
+ if (media == NULL)
+ throw gcnew ArgumentNullException("media");
+
+ m_pHandle = new PLT_MediaObjectReference(media);
+ }
+
+public:
+
+ ~MediaObject()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!MediaObject();
+ }
+
+ !MediaObject()
+ {
+ // clean-up unmanaged
+ if (m_pHandle != 0)
+ {
+ delete m_pHandle;
+
+ m_pHandle = 0;
+ }
+ }
+
+};
+
+/*----------------------------------------------------------------------
+| MediaItem
++---------------------------------------------------------------------*/
+public ref class MediaItem : public MediaObject
+{
+internal:
+
+ MediaItem(PLT_MediaItem& media) : MediaObject(media)
+ {}
+
+public:
+
+ MediaItem() : MediaObject(new PLT_MediaItem)
+ {}
+
+ MediaItem(PLT_MediaObjectReference& media) : MediaObject(media)
+ {
+ if (media->IsContainer())
+ throw gcnew ArgumentException("object");
+ }
+
+ MediaItem(MediaObject^ media) : MediaObject(*media->Handle)
+ {
+ if (media->Handle->IsContainer())
+ throw gcnew ArgumentException("object");
+ }
+
+ ~MediaItem()
+ {
+ this->!MediaItem();
+ }
+
+ !MediaItem()
+ {}
+};
+
+/*----------------------------------------------------------------------
+| MediaContainer
++---------------------------------------------------------------------*/
+public ref class MediaContainer : public MediaObject
+{
+public:
+
+ // properties
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(bool, Searchable, m_Searchable, ((PLT_MediaContainer*)m_pHandle->AsPointer()));
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(Int32, ChildrenCount, m_ChildrenCount, ((PLT_MediaContainer*)m_pHandle->AsPointer()));
+ PLATINUM_MANAGED_IMPLEMENT_PROPERTY(UInt32, ContainerUpdateID, m_ContainerUpdateID, ((PLT_MediaContainer*)m_pHandle->AsPointer()));
+
+internal:
+
+ MediaContainer(PLT_MediaContainer& media) :
+ MediaObject(media)
+ {}
+
+public:
+ MediaContainer() :
+ MediaObject(new PLT_MediaContainer)
+ {}
+
+ MediaContainer(PLT_MediaObjectReference& media) :
+ MediaObject(media)
+ {
+ if (!media->IsContainer())
+ throw gcnew ArgumentException("object");
+ }
+
+ MediaContainer(MediaObject^ media) :
+ MediaObject(*media->Handle)
+ {
+ if (!media->Handle->IsContainer())
+ throw gcnew ArgumentException("object");
+ }
+
+ ~MediaContainer()
+ {
+ this->!MediaContainer();
+ }
+
+ !MediaContainer()
+ {}
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::MediaObject, PLT_MediaObject);
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::MediaObject, PLT_MediaObjectReference);
+
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::MediaItem, PLT_MediaItem);
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::MediaContainer, PLT_MediaContainer); \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServer.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServer.cpp
new file mode 100644
index 0000000..0ecf275
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServer.cpp
@@ -0,0 +1,121 @@
+/*****************************************************************
+|
+| Platinum - Managed MediaServer
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "PltMimeType.h"
+#include "MediaServer.h"
+#include "DeviceHost.h"
+#include "MediaServerEventBridge.h"
+
+Platinum::MediaServer::MediaServer(PLT_MediaServer* server) :
+ DeviceHost(*(server))
+{
+ RegisterEvents();
+}
+
+Platinum::MediaServer::MediaServer(String^ friendlyName) :
+ DeviceHost(*(new PLT_MediaServer(StringConv(friendlyName))))
+{
+ RegisterEvents();
+}
+
+Platinum::MediaServer::MediaServer(String^ friendlyName, String^ uuid) :
+ DeviceHost(*(new PLT_MediaServer(StringConv(friendlyName), false, StringConv(uuid))))
+{
+ RegisterEvents();
+}
+
+void Platinum::MediaServer::RegisterEvents()
+{
+ if (!m_pBridge)
+ {
+ m_pBridge = new MediaServerEventBridge(this);
+ }
+
+ PLT_MediaServer* server = (PLT_MediaServer*)(Handle.AsPointer());
+ server->SetDelegate(m_pBridge);
+}
+
+Platinum::MediaServer::!MediaServer()
+{
+
+}
+
+void Platinum::MediaServer::UpdateSystemUpdateID(Int32 update)
+{
+ PLT_MediaServer* server = (PLT_MediaServer*)(Handle.AsPointer());
+ server->UpdateSystemUpdateID(update);
+}
+
+
+void Platinum::MediaServer::UpdateContainerUpdateID(String^ id, Int32 update)
+{
+ PLT_MediaServer* server = (PLT_MediaServer*)(Handle.AsPointer());
+ server->UpdateContainerUpdateID(StringConv(id), update);
+}
+
+Int32 Platinum::MediaServer::SetResponseFilePath(HttpRequestContext^ context, HttpResponse^ response, String^ filepath)
+{
+ NPT_CHECK_WARNING(PLT_HttpServer::ServeFile(context->Request->Handle,
+ context->Handle,
+ response->Handle,
+ NPT_String(StringConv(filepath))));
+
+ /* Update content type header according to file and context */
+ NPT_HttpEntity* entity = response->Handle.GetEntity();
+ if (entity) entity->SetContentType(
+ PLT_MimeType::GetMimeType(NPT_String(StringConv(filepath)),
+ &context->Handle));
+
+ /* streaming header for DLNA */
+ response->Handle.GetHeaders().SetHeader("transferMode.dlna.org", "Streaming");
+ return NPT_SUCCESS;
+}
+
+
+Int32 Platinum::MediaServer::SetResponseData(HttpRequestContext^ context, HttpResponse^ response, array<Byte>^ data)
+{
+ NPT_HttpEntity* entity = response->Handle.GetEntity();
+ if (entity)
+ {
+ pin_ptr<Byte> pinnedBuffer = &data[0];
+ entity->SetInputStream((const void*)pinnedBuffer, data->Length);
+ }
+
+ /* interactive header for DLNA ?*/
+ response->Handle.GetHeaders().SetHeader("transferMode.dlna.org", "Interactive");
+ return NPT_SUCCESS;
+} \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServer.h b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServer.h
new file mode 100644
index 0000000..ad78319
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServer.h
@@ -0,0 +1,131 @@
+/*****************************************************************
+|
+| Platinum - Managed MediaServer
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "DeviceHost.h"
+#include "Http.h"
+
+class PLT_MediaServer;
+
+namespace Platinum
+{
+
+ref class DeviceHost;
+ref class Action;
+class MediaServerEventBridge;
+
+/*----------------------------------------------------------------------
+| MediaServer
++---------------------------------------------------------------------*/
+public ref class MediaServer : public DeviceHost
+{
+public:
+
+ delegate Int32 BrowseMetadataDelegate(Action^ action, String^ object_id, String^ filter, Int32 starting_index, Int32 requested_count, String^ sort_criteria, HttpRequestContext^ context);
+ delegate Int32 BrowseDirectChildrenDelegate(Action^ action, String^ object_id, String^ filter, Int32 starting_index, Int32 requested_count, String^ sort_criteria, HttpRequestContext^ context);
+ delegate Int32 SearchContainerDelegate(Action^ action, String^ object_id, String^ searchCriteria, String^ filter, Int32 starting_index, Int32 requested_count, String^ sort_criteria, HttpRequestContext^ context);
+ delegate Int32 ProcessFileRequestDelegate(HttpRequestContext^ context, HttpResponse^ response);
+
+private:
+
+ MediaServerEventBridge* m_pBridge;
+
+public:
+
+ // properties
+
+private:
+
+ void RegisterEvents();
+
+public:
+
+ event BrowseMetadataDelegate^ BrowseMetadata;
+ event BrowseDirectChildrenDelegate^ BrowseDirectChildren;
+ event SearchContainerDelegate^ SearchContainer;
+ event ProcessFileRequestDelegate^ ProcessFileRequest;
+
+
+internal:
+
+ Int32 OnBrowseMetadataDelegate(Action^ action, String^ object_id, String^ filter, Int32 starting_index, Int32 requested_count, String^ sort_criteria, HttpRequestContext^ context)
+ {
+ // handle events
+ return this->BrowseMetadata(action, object_id, filter, starting_index, requested_count, sort_criteria, context);
+ }
+
+ Int32 OnBrowseDirectChildrenDelegate(Action^ action, String^ object_id, String^ filter, Int32 starting_index, Int32 requested_count, String^ sort_criteria, HttpRequestContext^ context)
+ {
+ // handle events
+ return this->BrowseDirectChildren(action, object_id, filter, starting_index, requested_count, sort_criteria, context);
+ }
+
+ Int32 OnSearchContainerDelegate(Action^ action, String^ object_id, String^ searchCriteria, String^ filter, Int32 starting_index, Int32 requested_count, String^ sort_criteria, HttpRequestContext^ context)
+ {
+ // handle events
+ return this->SearchContainer(action, object_id, searchCriteria, filter, starting_index, requested_count, sort_criteria, context);
+ }
+
+ Int32 OnProcessFileRequestDelegate(HttpRequestContext^ context, HttpResponse^ response)
+ {
+ return this->ProcessFileRequest(context, response);
+ }
+
+public:
+
+ MediaServer(String^ friendlyName);
+ MediaServer(String^ friendlyName, String^ uuid);
+ MediaServer(PLT_MediaServer* server);
+
+ void UpdateSystemUpdateID(Int32 update);
+ void UpdateContainerUpdateID(String^ id, Int32 update);
+
+ ~MediaServer()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!MediaServer();
+ }
+
+ !MediaServer();
+
+
+ static Int32 SetResponseFilePath(HttpRequestContext^ context, HttpResponse^ response, String^ filepath);
+ static Int32 SetResponseData(HttpRequestContext^ context, HttpResponse^ response, array<Byte>^ data);
+};
+
+} \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServerEventBridge.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServerEventBridge.cpp
new file mode 100644
index 0000000..32da39a
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServerEventBridge.cpp
@@ -0,0 +1,103 @@
+/*****************************************************************
+|
+| Platinum - Managed MediaServerEventBridge
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "MediaServerEventBridge.h"
+#include "MediaServer.h"
+#include "Action.h"
+
+NPT_Result Platinum::MediaServerEventBridge::OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context)
+{
+ return m_pMediaServer->OnBrowseMetadataDelegate(marshal_as<Action^>(action),
+ marshal_as<String^>(object_id),
+ marshal_as<String^>(filter),
+ starting_index,
+ requested_count,
+ marshal_as<String^>(sort_criteria),
+ marshal_as<HttpRequestContext^>(context));
+}
+
+NPT_Result Platinum::MediaServerEventBridge::OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context)
+{
+ return m_pMediaServer->OnBrowseDirectChildrenDelegate(marshal_as<Action^>(action),
+ marshal_as<String^>(object_id),
+ marshal_as<String^>(filter),
+ starting_index,
+ requested_count,
+ marshal_as<String^>(sort_criteria),
+ marshal_as<HttpRequestContext^>(context));
+}
+
+NPT_Result Platinum::MediaServerEventBridge::OnSearchContainer(PLT_ActionReference& action,
+ const char* object_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context)
+{
+
+ return m_pMediaServer->OnSearchContainerDelegate(marshal_as<Action^>(action),
+ marshal_as<String^>(object_id),
+ marshal_as<String^>(search_criteria),
+ marshal_as<String^>(filter),
+ starting_index,
+ requested_count,
+ marshal_as<String^>(sort_criteria),
+ marshal_as<HttpRequestContext^>(context));
+}
+
+NPT_Result Platinum::MediaServerEventBridge::ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ PLT_HttpRequestContext _context(request, context);
+ return m_pMediaServer->OnProcessFileRequestDelegate(marshal_as<HttpRequestContext^>(_context),
+ marshal_as<HttpResponse^>(response));
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServerEventBridge.h b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServerEventBridge.h
new file mode 100644
index 0000000..ca13044
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/MediaServerEventBridge.h
@@ -0,0 +1,97 @@
+/*****************************************************************
+|
+| Platinum - Managed MediaServerEventBridge
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#pragma once
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMediaServer.h"
+
+namespace Platinum
+{
+
+ref class MediaServer;
+
+/*----------------------------------------------------------------------
+| MediaServerEventBridge
++---------------------------------------------------------------------*/
+private class MediaServerEventBridge : public PLT_MediaServerDelegate
+{
+private:
+
+ gcroot<MediaServer^> m_pMediaServer;
+
+public:
+
+ // PLT_MediaServerDelegate methods
+ virtual NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnSearchContainer(PLT_ActionReference& action,
+ const char* object_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+public:
+
+ MediaServerEventBridge(gcroot<MediaServer^> server)
+ {
+ m_pMediaServer = server;
+ }
+
+ virtual ~MediaServerEventBridge()
+ {}
+
+};
+
+
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Neptun_marshal_as.h b/lib/libUPnP/Platinum/Source/Extras/Managed/Neptun_marshal_as.h
new file mode 100644
index 0000000..429be7d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Neptun_marshal_as.h
@@ -0,0 +1,104 @@
+/*****************************************************************
+|
+| Platinum - Managed Marshalling
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace msclr {
+namespace interop {
+
+// -------------------------- NPT_IpAddress -------
+
+template<>
+inline String^ marshal_as<String^, NPT_IpAddress> (const NPT_IpAddress& from)
+{
+ return gcnew String(from.ToString());
+}
+
+// -------------------------- NPT_HttpUrl -------
+
+template<>
+inline Uri^ marshal_as<Uri^, NPT_HttpUrl> (const NPT_HttpUrl& from)
+{
+ if (!from.IsValid())
+ return nullptr;
+
+ return gcnew Uri(gcnew String(from.ToString()));
+}
+
+// -------------------------- NPT_String -------
+
+template<>
+inline Uri^ marshal_as<Uri^, NPT_String> (const NPT_String& from)
+{
+ if (from.IsEmpty())
+ return nullptr;
+
+ return gcnew Uri(gcnew String(from));
+}
+
+template<>
+inline String^ marshal_as<String^, NPT_String> (const NPT_String& from)
+{
+ return gcnew String(from);
+}
+
+// -------------------------- PLT_ProtocolInfo -------
+
+template<>
+inline String^ marshal_as<String^, PLT_ProtocolInfo> (const PLT_ProtocolInfo& from)
+{
+ return gcnew String(from.ToString());
+}
+
+// -------------------------- NPT_TimeInterval -------
+
+template<>
+inline TimeSpan marshal_as<TimeSpan, NPT_TimeInterval> (const NPT_TimeInterval& from)
+{
+ return TimeSpan(from.ToSeconds() * TimeSpan::TicksPerSecond);
+}
+
+// ---------------------------------------------
+
+
+}}
+
+
+// -------------------------- generic wrapper marshal macro -------
+
+#define PLATINUM_MANAGED_MARSHAL_AS(dotNetType,nativeType) \
+ namespace msclr { namespace interop { \
+ template<> \
+ inline dotNetType^ marshal_as<dotNetType^, nativeType> (const nativeType& from) \
+ { return gcnew dotNetType(const_cast<nativeType&>(from)); } \
+ }}
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneException.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneException.cpp
new file mode 100644
index 0000000..aef0fee
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneException.cpp
@@ -0,0 +1,39 @@
+/*****************************************************************
+|
+| Platinum - Managed NeptuneException
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "NeptuneException.h"
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneException.h b/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneException.h
new file mode 100644
index 0000000..04c943d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneException.h
@@ -0,0 +1,64 @@
+/*****************************************************************
+|
+| Platinum - Managed NeptuneException
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| NeptuneException
++---------------------------------------------------------------------*/
+[Serializable]
+public ref class NeptuneException : Exception
+{
+private:
+
+ int m_err;
+
+public:
+
+ property int ErrorResult
+ {
+ int get() { return m_err; }
+ }
+
+public:
+
+ NeptuneException(NPT_Result r)
+ : Exception(gcnew String(NPT_ResultText(r))), m_err(r)
+ {
+ }
+
+};
+
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneLoggingBridge.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneLoggingBridge.cpp
new file mode 100644
index 0000000..d69f5eb
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneLoggingBridge.cpp
@@ -0,0 +1,38 @@
+/*****************************************************************
+|
+| Platinum - Managed NeptuneLoggingBridge
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "NeptuneLoggingBridge.h"
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneLoggingBridge.h b/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneLoggingBridge.h
new file mode 100644
index 0000000..920dd3d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/NeptuneLoggingBridge.h
@@ -0,0 +1,207 @@
+/*****************************************************************
+|
+| Platinum - Managed NeptuneLoggingBridge
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+using namespace log4net;
+
+namespace Platinum
+{
+
+/*----------------------------------------------------------------------
+| NeptuneLoggingBridge
++---------------------------------------------------------------------*/
+class NeptuneLoggingBridge : NPT_LogHandler
+{
+private:
+
+ NPT_Mutex m_SetLoggerNameLock;
+ gcroot<String^> m_pFormatString;
+ gcroot<ILog^> m_pLogger;
+
+public:
+
+ static void Configure()
+ {
+ static NPT_Mutex lock;
+
+ lock.Lock();
+
+ static NeptuneLoggingBridge instance;
+
+ // clear config
+ NPT_LogManager::GetDefault().Configure("plist:.level=ALL;.handlers=;platinum.level=ALL;platinum.handlers=");
+
+ // get root logger
+ NPT_Logger* rootLogger = NPT_LogManager::GetLogger("platinum");
+
+ if (rootLogger)
+ {
+ // set handler
+ rootLogger->AddHandler(&instance, false);
+ }
+
+ lock.Unlock();
+ }
+
+public:
+
+ virtual void Log(const NPT_LogRecord& record)
+ {
+ gcroot<ILog^> log = SetLoggerName(record.m_LoggerName);
+
+ switch (record.m_Level)
+ {
+ case NPT_LOG_LEVEL_FATAL:
+ if (log->IsFatalEnabled)
+ {
+ log->FatalFormat(
+ m_pFormatString,
+ marshal_as<String^>(NPT_Log::GetLogLevelName(record.m_Level)),
+ marshal_as<String^>(record.m_Message),
+ marshal_as<String^>(record.m_SourceFile),
+ UInt32(record.m_SourceLine)
+ );
+ }
+
+ break;
+
+ case NPT_LOG_LEVEL_SEVERE:
+ if (log->IsErrorEnabled)
+ {
+ log->ErrorFormat(
+ m_pFormatString,
+ marshal_as<String^>(NPT_Log::GetLogLevelName(record.m_Level)),
+ marshal_as<String^>(record.m_Message),
+ marshal_as<String^>(record.m_SourceFile),
+ UInt32(record.m_SourceLine)
+ );
+ }
+
+ break;
+
+ case NPT_LOG_LEVEL_WARNING:
+ if (log->IsWarnEnabled)
+ {
+ log->WarnFormat(
+ m_pFormatString,
+ marshal_as<String^>(NPT_Log::GetLogLevelName(record.m_Level)),
+ marshal_as<String^>(record.m_Message),
+ marshal_as<String^>(record.m_SourceFile),
+ UInt32(record.m_SourceLine)
+ );
+ }
+
+ break;
+
+ case NPT_LOG_LEVEL_INFO:
+ if (log->IsInfoEnabled)
+ {
+ log->InfoFormat(
+ m_pFormatString,
+ marshal_as<String^>(NPT_Log::GetLogLevelName(record.m_Level)),
+ marshal_as<String^>(record.m_Message),
+ marshal_as<String^>(record.m_SourceFile),
+ UInt32(record.m_SourceLine)
+ );
+ }
+
+ break;
+
+ case NPT_LOG_LEVEL_FINE:
+ case NPT_LOG_LEVEL_FINER:
+ case NPT_LOG_LEVEL_FINEST:
+ if (log->IsDebugEnabled)
+ {
+ log->DebugFormat(
+ m_pFormatString,
+ marshal_as<String^>(NPT_Log::GetLogLevelName(record.m_Level)),
+ marshal_as<String^>(record.m_Message),
+ marshal_as<String^>(record.m_SourceFile),
+ UInt32(record.m_SourceLine)
+ );
+ }
+
+ break;
+
+ default:
+ if (log->IsWarnEnabled)
+ {
+ log->WarnFormat(
+ m_pFormatString,
+ marshal_as<String^>("UNKNOWN_LOG_LEVEL"),
+ marshal_as<String^>(record.m_Message),
+ marshal_as<String^>(record.m_SourceFile),
+ UInt32(record.m_SourceLine)
+ );
+ }
+
+ break;
+ }
+ }
+
+private:
+
+ gcroot<ILog^> SetLoggerName(const char* name)
+ {
+ m_SetLoggerNameLock.Lock();
+
+ gcroot<String^> loggerName = gcnew String(name);
+ gcroot<ILog^> logger = m_pLogger;
+
+ if (logger->Logger->Name != loggerName)
+ {
+ logger = LogManager::GetLogger(loggerName);
+
+ m_pLogger = logger;
+ }
+
+ m_SetLoggerNameLock.Unlock();
+
+ return logger;
+ }
+
+public:
+
+ NeptuneLoggingBridge()
+ {
+ m_pLogger = LogManager::GetLogger(gcnew String("NeptuneLoggingBridge"));
+ m_pFormatString = gcnew String("{0}: {2}:{3}: {1}");
+ }
+
+ virtual ~NeptuneLoggingBridge()
+ {
+ }
+
+};
+
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Service.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/Service.cpp
new file mode 100644
index 0000000..5f66254
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Service.cpp
@@ -0,0 +1,97 @@
+/*****************************************************************
+|
+| Platinum - Managed Service
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "Service.h"
+#include "ActionDescription.h"
+#include "StateVariable.h"
+#include "DeviceData.h"
+#include "EnumerableNptArray.h"
+#include "EnumerableNptList.h"
+
+Platinum::DeviceData^ Platinum::Service::ParentDevice::get()
+{
+ return marshal_as<DeviceData^>(*m_pHandle->GetDevice());
+}
+
+IEnumerable<Platinum::StateVariable^>^ Platinum::Service::StateVariables::get()
+{
+ return gcnew Enumerables::EnumerableNptList<StateVariable^, PLT_StateVariable*>(
+ m_pHandle->GetStateVariables()
+ );
+}
+
+IEnumerable<Platinum::ActionDescription^>^ Platinum::Service::Actions::get()
+{
+ return gcnew Enumerables::EnumerableNptArray<ActionDescription^, PLT_ActionDesc*>(
+ m_pHandle->GetActionDescs()
+ );
+}
+
+Platinum::ActionDescription^ Platinum::Service::FindAction( String^ name )
+{
+ if (String::IsNullOrEmpty(name))
+ throw gcnew ArgumentException("null or empty", "name");
+
+ marshal_context c;
+
+ PLT_ActionDesc* d = m_pHandle->FindActionDesc(
+ c.marshal_as<const char*>(name)
+ );
+
+ if (!d)
+ return nullptr;
+
+ return marshal_as<ActionDescription^>(*d);
+}
+
+Platinum::StateVariable^ Platinum::Service::FindStateVariable( String^ name )
+{
+ if (String::IsNullOrEmpty(name))
+ throw gcnew ArgumentException("null or empty", "name");
+
+ marshal_context c;
+
+ PLT_StateVariable* d = m_pHandle->FindStateVariable(
+ c.marshal_as<const char*>(name)
+ );
+
+ if (!d)
+ return nullptr;
+
+ return marshal_as<StateVariable^>(*d);
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/Service.h b/lib/libUPnP/Platinum/Source/Extras/Managed/Service.h
new file mode 100644
index 0000000..1578f23
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/Service.h
@@ -0,0 +1,147 @@
+/*****************************************************************
+|
+| Platinum - Managed Service
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+ref class DeviceData;
+ref class ActionDescription;
+ref class StateVariable;
+
+/*----------------------------------------------------------------------
+| Service
++---------------------------------------------------------------------*/
+public ref class Service
+{
+private:
+
+ PLT_Service* m_pHandle;
+
+internal:
+
+ property PLT_Service& Handle
+ {
+ PLT_Service& get()
+ {
+ return *m_pHandle;
+ }
+ }
+
+public:
+
+ property Uri^ SCPDURL
+ {
+ Uri^ get()
+ {
+ return marshal_as<Uri^>(m_pHandle->GetSCPDURL());
+ }
+ }
+
+ property String^ ServiceID
+ {
+ String^ get()
+ {
+ return gcnew String(m_pHandle->GetServiceID());
+ }
+ }
+
+ property String^ ServiceType
+ {
+ String^ get()
+ {
+ return gcnew String(m_pHandle->GetServiceType());
+ }
+ }
+
+ property DeviceData^ ParentDevice
+ {
+ DeviceData^ get();
+ }
+
+ property IEnumerable<StateVariable^>^ StateVariables
+ {
+ IEnumerable<StateVariable^>^ get();
+ }
+
+ property IEnumerable<ActionDescription^>^ Actions
+ {
+ IEnumerable<ActionDescription^>^ get();
+ }
+
+public:
+
+ ActionDescription^ FindAction(String^ name);
+ StateVariable^ FindStateVariable(String^ name);
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (m_pHandle == ((Service^)obj)->m_pHandle);
+ }
+
+internal:
+
+ Service(PLT_Service& devData)
+ {
+ m_pHandle = &devData;
+ }
+
+public:
+
+ ~Service()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!Service();
+ }
+
+ !Service()
+ {
+ // clean-up unmanaged
+ }
+
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::Service, PLT_Service);
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/StateVariable.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/StateVariable.cpp
new file mode 100644
index 0000000..9a4208c
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/StateVariable.cpp
@@ -0,0 +1,44 @@
+/*****************************************************************
+|
+| Platinum - Managed StateVariable
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "StateVariable.h"
+#include "Service.h"
+
+Platinum::Service^ Platinum::StateVariable::ParentService::get()
+{
+ return marshal_as<Service^>(*m_pHandle->GetService());
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/StateVariable.h b/lib/libUPnP/Platinum/Source/Extras/Managed/StateVariable.h
new file mode 100644
index 0000000..7184a15
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/StateVariable.h
@@ -0,0 +1,165 @@
+/*****************************************************************
+|
+| Platinum - Managed StateVariable
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+ref class Service;
+
+/*----------------------------------------------------------------------
+| StateVariable
++---------------------------------------------------------------------*/
+public ref class StateVariable
+{
+private:
+
+ PLT_StateVariable* m_pHandle;
+
+public:
+
+ property String^ Name
+ {
+ String^ get()
+ {
+ return gcnew String(m_pHandle->GetName());
+ }
+ }
+
+ property Service^ ParentService
+ {
+ Service^ get();
+ }
+
+ property Type^ DataType
+ {
+ Type^ get()
+ {
+ return Helpers::ParseType(m_pHandle->GetDataType());
+ }
+ }
+
+ property String^ DataTypeString
+ {
+ String^ get()
+ {
+ return gcnew String(m_pHandle->GetDataType());
+ }
+ }
+
+ property Object^ Value
+ {
+ Object^ get()
+ {
+ return Helpers::ConvertValue(
+ m_pHandle->GetDataType(),
+ m_pHandle->GetValue()
+ );
+ }
+ }
+
+ property String^ ValueString
+ {
+ String^ get()
+ {
+ return gcnew String(m_pHandle->GetValue());
+ }
+
+ void set (String^ value)
+ {
+ if (value == nullptr)
+ throw gcnew ArgumentNullException("value");
+
+ marshal_context c;
+
+ Helpers::ThrowOnError(m_pHandle->SetValue(
+ c.marshal_as<const char*>(value)
+ ));
+ }
+ }
+
+public:
+
+ void ValidateValue(String^ value)
+ {
+ if (value == nullptr)
+ throw gcnew ArgumentNullException("value");
+
+ marshal_context c;
+
+ Helpers::ThrowOnError(m_pHandle->ValidateValue(
+ c.marshal_as<const char*>(value)
+ ));
+ }
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (m_pHandle == ((StateVariable^)obj)->m_pHandle);
+ }
+
+internal:
+
+ StateVariable(PLT_StateVariable& devData)
+ {
+ m_pHandle = &devData;
+ }
+
+public:
+
+ ~StateVariable()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!StateVariable();
+ }
+
+ !StateVariable()
+ {
+ // clean-up unmanaged
+ }
+
+};
+
+}
+
+// marshal wrapper
+PLATINUM_MANAGED_MARSHAL_AS(Platinum::StateVariable, PLT_StateVariable);
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/UPnP.cpp b/lib/libUPnP/Platinum/Source/Extras/Managed/UPnP.cpp
new file mode 100644
index 0000000..d80d745
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/UPnP.cpp
@@ -0,0 +1,81 @@
+/*****************************************************************
+|
+| Platinum - Managed UPnP
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "StdAfx.h"
+#include "UPnP.h"
+#include "ControlPoint.h"
+#include "DeviceHost.h"
+#include "NeptuneLoggingBridge.h"
+
+void Platinum::UPnP::AddControlPoint( ControlPoint^ cp )
+{
+ Helpers::ThrowOnError(m_pHandle->AddCtrlPoint(cp->Handle));
+}
+
+void Platinum::UPnP::RemoveControlPoint( ControlPoint^ cp )
+{
+ Helpers::ThrowOnError(m_pHandle->RemoveCtrlPoint(cp->Handle));
+}
+
+void Platinum::UPnP::AddDeviceHost( DeviceHost^ host )
+{
+ Helpers::ThrowOnError(m_pHandle->AddDevice((PLT_DeviceHostReference)host->Host));
+}
+
+void Platinum::UPnP::RemoveDeviceHost( DeviceHost^ host )
+{
+ Helpers::ThrowOnError(m_pHandle->RemoveDevice((PLT_DeviceHostReference)host->Host));
+}
+
+static Platinum::UPnP::UPnP()
+{
+ NeptuneLoggingBridge::Configure();
+}
+
+List<String^>^ Platinum::UPnP::GetIpAddresses(bool include_localhost)
+{
+ NPT_List<NPT_IpAddress> ips;
+ PLT_UPnPMessageHelper::GetIPAddresses(ips, include_localhost); // TODO: Throw on Error?
+
+ List<String^>^ _ips = gcnew List<String^>();
+ NPT_List<NPT_IpAddress>::Iterator ip = ips.GetFirstItem();
+ while (ip) {
+ _ips->Add(gcnew String((*ip).ToString()));
+ ++ip;
+ }
+
+ return _ips;
+} \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/UPnP.h b/lib/libUPnP/Platinum/Source/Extras/Managed/UPnP.h
new file mode 100644
index 0000000..4c87e8d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/UPnP.h
@@ -0,0 +1,131 @@
+/*****************************************************************
+|
+| Platinum - Managed UPnP
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#pragma once
+
+namespace Platinum
+{
+
+ref class ControlPoint;
+ref class DeviceHost;
+class NeptuneLoggingBridge;
+
+/*----------------------------------------------------------------------
+| UPnP
++---------------------------------------------------------------------*/
+public ref class UPnP
+{
+public:
+
+ static const unsigned short DefaultPort = 1900;
+
+private:
+
+ PLT_UPnP* m_pHandle;
+
+public:
+
+ void Start()
+ {
+ Helpers::ThrowOnError(m_pHandle->Start());
+ }
+
+ void Stop()
+ {
+ if (m_pHandle) m_pHandle->Stop();
+ }
+
+ void AddControlPoint(ControlPoint^ cp);
+ void RemoveControlPoint(ControlPoint^ cp);
+
+ void AddDeviceHost(DeviceHost^ host);
+ void RemoveDeviceHost(DeviceHost^ host);
+
+ static List<String^>^ GetIpAddresses()
+ {
+ return GetIpAddresses(false);
+ }
+ static List<String^>^ GetIpAddresses(bool include_localhost);
+
+ property bool Running
+ {
+ bool get()
+ {
+ return m_pHandle->IsRunning();
+ }
+ }
+
+public:
+
+ virtual Boolean Equals(Object^ obj) override
+ {
+ if (obj == nullptr)
+ return false;
+
+ if (!this->GetType()->IsInstanceOfType(obj))
+ return false;
+
+ return (m_pHandle == ((UPnP^)obj)->m_pHandle);
+ }
+
+public:
+
+ static UPnP();
+
+ UPnP()
+ {
+ m_pHandle = new PLT_UPnP();
+ }
+
+ ~UPnP()
+ {
+ // clean-up managed
+
+ // clean-up unmanaged
+ this->!UPnP();
+ }
+
+ !UPnP()
+ {
+ // clean-up unmanaged
+ if (m_pHandle != 0)
+ {
+ delete m_pHandle;
+
+ m_pHandle = 0;
+ }
+ }
+};
+
+
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/Managed/clix.hpp b/lib/libUPnP/Platinum/Source/Extras/Managed/clix.hpp
new file mode 100644
index 0000000..bb93978
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/Managed/clix.hpp
@@ -0,0 +1,209 @@
+// ------------------------------------------------------------------------------------------- //
+// clix.h
+//
+// Marshals strings between .NET and C++ using C++/CLI (Visual C++ 2005 and later only).
+// Faster and cleaner than the System::Interop method because it uses garbage collected memory.
+// Use at your own leisure. No warranties whatsoever provided.
+//
+// Original code by Markus Ewald (http://www.nuclex.org/articles/marshaling-strings-in-cxx-cli)
+// Updated version including several improvements suggested by Neil Hunt
+//
+// Licensed under the IBM CPL (free of charge, closed source commercial use is okay)
+// ------------------------------------------------------------------------------------------- //
+#pragma once
+
+#include <string>
+#include <vcclr.h>
+
+// CLI extensions namespace
+namespace clix {
+
+ /// <summary>Encoding types for strings</summary>
+ enum Encoding {
+
+ /// <summary>ANSI encoding</summary>
+ /// <remarks>
+ /// This is the default encoding you've most likely been using all around in C++. ANSI
+ /// means 8 Bit encoding with character codes depending on the system's selected code page.
+ /// <remarks>
+ E_ANSI,
+
+ /// <summary>UTF-8 encoding</summary>
+ /// <remarks>
+ /// This is the encoding commonly used for multilingual C++ strings. All ASCII characters
+ /// (0-127) will be represented as single bytes. Be aware that UTF-8 uses more than one
+ /// byte for extended characters, so std::string::length() might not reflect the actual
+ /// length of the string in characters if it contains any non-ASCII characters.
+ /// <remarks>
+ E_UTF8,
+
+ /// <summary>UTF-16 encoding</summary>
+ /// <remarks>
+ /// This is the suggested encoding for marshaling and the native encoding of .NET strings.
+ /// It is similar to UTF-8 but uses a minimum of two bytes per character, making the number
+ /// of bytes required for a given string better predictable. Be aware, however, that UTF-16
+ /// can still use more than two bytes for a character, so std::wstring::length() might not
+ /// reflect the actual length of the string.
+ /// </remarks>
+ E_UTF16, E_UNICODE = E_UTF16
+
+ };
+
+ // Ignore this if you're just scanning the headers for informations!
+ /* All this template stuff might seem like overkill, but it is well thought out and enables
+ you to use a readable and convenient call while still keeping the highest possible code
+ efficiency due to compile-time evaluation of the required conversion path.
+ */
+ namespace detail {
+
+ // Get C++ string type for specified encoding
+ template<Encoding encoding> struct StringTypeSelector;
+ template<> struct StringTypeSelector<E_ANSI> { typedef std::string Type; };
+ template<> struct StringTypeSelector<E_UTF8> { typedef std::string Type; };
+ template<> struct StringTypeSelector<E_UTF16> { typedef std::wstring Type; };
+
+ // Compile-time selection depending on whether a string is managed
+ template<typename StringType> struct IfManaged {
+ struct Select {
+ template<typename TrueType, typename FalseType>
+ struct Either { typedef FalseType Type; };
+ };
+ enum { Result = false };
+ };
+ template<> struct IfManaged<System::String ^> {
+ struct Select {
+ template<typename TrueType, typename FalseType>
+ struct Either { typedef TrueType Type; };
+ };
+ enum { Result = true };
+ };
+
+ // Direction of the marshaling process
+ enum MarshalingDirection {
+ CxxFromNet,
+ NetFromCxx
+ };
+
+ // The actual marshaling code
+ template<MarshalingDirection direction> struct StringMarshaler;
+
+ // Marshals to .NET from C++ strings
+ template<> struct StringMarshaler<NetFromCxx> {
+
+ template<Encoding encoding, typename SourceType>
+ static System::String ^marshal(const SourceType &string) {
+ // Constructs a std::[w]string in case someone gave us a char * to choke on
+ return marshalCxxString<encoding, SourceType>(string);
+ }
+
+ template<Encoding encoding, typename SourceType>
+ static System::String ^marshalCxxString(
+ const typename StringTypeSelector<encoding>::Type &cxxString
+ ) {
+ typedef typename StringTypeSelector<encoding>::Type SourceStringType;
+ size_t byteCount = cxxString.length() * sizeof(SourceStringType::value_type);
+
+ // Empty strings would cause trouble accessing the array below
+ if(byteCount == 0) {
+ return System::String::Empty;
+ }
+
+ // Copy the C++ string contents into a managed array of bytes
+ array<unsigned char> ^bytes = gcnew array<unsigned char>(byteCount);
+ { pin_ptr<unsigned char> pinnedBytes = &bytes[0];
+ memcpy(pinnedBytes, cxxString.c_str(), byteCount);
+ }
+
+ // Now let one of .NET's encoding classes do the rest
+ return decode<encoding>(bytes);
+ }
+
+ private:
+ // Converts a byte array based on the selected encoding
+ template<Encoding encoding> static System::String ^decode(array<unsigned char> ^bytes);
+ template<> static System::String ^decode<E_ANSI>(array<unsigned char> ^bytes) {
+ return System::Text::Encoding::Default->GetString(bytes);
+ }
+ template<> static System::String ^decode<E_UTF8>(array<unsigned char> ^bytes) {
+ return System::Text::Encoding::UTF8->GetString(bytes);
+ }
+ template<> static System::String ^decode<E_UTF16>(array<unsigned char> ^bytes) {
+ return System::Text::Encoding::Unicode->GetString(bytes);
+ }
+ };
+
+ // Marshals to C++ strings from .NET
+ template<> struct StringMarshaler<CxxFromNet> {
+
+ template<Encoding encoding, typename SourceType>
+ static typename detail::StringTypeSelector<encoding>::Type marshal(
+ System::String ^string
+ ) {
+ typedef typename StringTypeSelector<encoding>::Type StringType;
+
+ // Empty strings would cause a problem when accessing the empty managed array
+ if(string->Length == 0) {
+ return StringType();
+ }
+
+ // First, we use .NET's encoding classes to convert the string into a byte array
+ array<unsigned char> ^bytes = encode<encoding>(string);
+
+ // Then we construct our native string from that byte array
+ pin_ptr<unsigned char> pinnedBytes(&bytes[0]);
+ return StringType(
+ reinterpret_cast<StringType::value_type *>(static_cast<unsigned char *>(pinnedBytes)),
+ bytes->Length / sizeof(StringType::value_type)
+ );
+ }
+
+ template<> static std::wstring marshal<E_UTF16, System::String ^>(
+ System::String ^string
+ ) {
+ // We can directly accesss the characters in the managed string
+ pin_ptr<const wchar_t> pinnedChars(::PtrToStringChars(string));
+ return std::wstring(pinnedChars, string->Length);
+ }
+
+ private:
+ // Converts a string based on the selected encoding
+ template<Encoding encoding> static array<unsigned char> ^encode(System::String ^string);
+ template<> static array<unsigned char> ^encode<E_ANSI>(System::String ^string) {
+ return System::Text::Encoding::Default->GetBytes(string);
+ }
+ template<> static array<unsigned char> ^encode<E_UTF8>(System::String ^string) {
+ return System::Text::Encoding::UTF8->GetBytes(string);
+ }
+ template<> static array<unsigned char> ^encode<E_UTF16>(System::String ^string) {
+ return System::Text::Encoding::Unicode->GetBytes(string);
+ }
+
+ };
+
+ } // namespace detail
+
+ // ----------------------------------------------------------------------------------------- //
+ // clix::marshalString()
+ // ----------------------------------------------------------------------------------------- //
+ /// <summary>Marshals strings between .NET managed and C++ native</summary>
+ /// <remarks>
+ /// This all-in-one function marshals native C++ strings to .NET strings and vice versa.
+ /// You have to specify an encoding to use for the conversion, which always applies to the
+ /// native C++ string as .NET always uses UTF-16 for its own strings.
+ /// </remarks>
+ /// <param name="string">String to be marshalled to the other side</param>
+ /// <returns>The marshaled representation of the string</returns>
+ template<Encoding encoding, typename SourceType>
+ typename detail::IfManaged<SourceType>::Select::Either<
+ typename detail::StringTypeSelector<encoding>::Type,
+ System::String ^
+ >::Type marshalString(SourceType string) {
+
+ // Pass on the call to our nifty template routines
+ return detail::StringMarshaler<
+ detail::IfManaged<SourceType>::Result ? detail::CxxFromNet : detail::NetFromCxx
+ >::marshal<encoding, SourceType>(string);
+
+ }
+
+} // namespace clix
diff --git a/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltMediaServerObject.h b/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltMediaServerObject.h
new file mode 100644
index 0000000..bbc6743
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltMediaServerObject.h
@@ -0,0 +1,84 @@
+//
+// PltMediaServerObject.h
+// Platinum
+//
+// Created by Sylvain on 9/14/10.
+// Copyright 2010 Plutinosoft LLC. All rights reserved.
+//
+
+#import "Neptune.h"
+
+#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+#include <UIKit/UIKit.h>
+#else
+#import <Cocoa/Cocoa.h>
+#endif
+
+#import "PltUPnPObject.h"
+
+// define
+#if !defined(_PLATINUM_H_)
+typedef class PLT_HttpRequestContext PLT_HttpRequestContext;
+typedef class NPT_HttpResponse NPT_HttpResponse;
+#endif
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerObject
++---------------------------------------------------------------------*/
+@interface PLT_MediaServerObject : PLT_DeviceHostObject
+@property (nonatomic, assign) id delegate;
+@end
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerBrowseCapsule
++---------------------------------------------------------------------*/
+@interface PLT_MediaServerBrowseCapsule : PLT_ActionObject {
+ NSString* objectId;
+ NPT_UInt32 start;
+ NPT_UInt32 count;
+ NSString* filter;
+ NSString* sort;
+ PLT_HttpRequestContext* context;
+}
+
+- (id)initWithAction:(PLT_Action*)action objectId:(const char*)objectId filter:(const char*)filter start:(NPT_UInt32)start count:(NPT_UInt32)count sort:(const char*)sort context:(PLT_HttpRequestContext*)context;
+
+@property (readonly, copy) NSString* objectId;
+@property (readonly) NPT_UInt32 start;
+@property (readonly) NPT_UInt32 count;
+@property (readonly, copy) NSString* filter;
+@property (readonly, copy) NSString* sort;
+@end
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerSearchCapsule
++---------------------------------------------------------------------*/
+@interface PLT_MediaServerSearchCapsule : PLT_MediaServerBrowseCapsule {
+ NSString* search;
+}
+
+- (id)initWithAction:(PLT_Action*)action objectId:(const char*)objectId search:(const char*)search filter:(const char*)filter start:(NPT_UInt32)start count:(NPT_UInt32)count sort:(const char*)sort context:(PLT_HttpRequestContext*)context;
+
+@property (readonly, copy) NSString* search;
+@end
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerFileRequestCapsule
++---------------------------------------------------------------------*/
+@interface PLT_MediaServerFileRequestCapsule : NSObject {
+ NPT_HttpResponse* response;
+ PLT_HttpRequestContext* context;
+}
+
+- (id)initWithResponse:(NPT_HttpResponse*)response context:(PLT_HttpRequestContext*)context;
+@end
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerDelegateObject
++---------------------------------------------------------------------*/
+@protocol PLT_MediaServerDelegateObject
+- (NPT_Result)onBrowseMetadata:(PLT_MediaServerBrowseCapsule*)info;
+- (NPT_Result)onBrowseDirectChildren:(PLT_MediaServerBrowseCapsule*)info;
+- (NPT_Result)onSearchContainer:(PLT_MediaServerSearchCapsule*)info;
+- (NPT_Result)onFileRequest:(PLT_MediaServerFileRequestCapsule*)info;
+@end
diff --git a/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltMediaServerObject.mm b/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltMediaServerObject.mm
new file mode 100644
index 0000000..0900819
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltMediaServerObject.mm
@@ -0,0 +1,198 @@
+//
+// PltMediaServerObject.mm
+// Platinum
+//
+// Created by Sylvain on 9/14/10.
+// Copyright 2010 Plutinosoft LLC. All rights reserved.
+//
+
+#import "Platinum.h"
+#import "PltMediaServerObject.h"
+#import "PltMediaConnect.h"
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerDelegate_Wrapper
++---------------------------------------------------------------------*/
+class PLT_MediaServerDelegate_Wrapper : public PLT_MediaServerDelegate {
+public:
+ PLT_MediaServerDelegate_Wrapper(PLT_MediaServerObject* target) : m_Target(target) {}
+
+ NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context) {
+ if (![m_Target.delegate respondsToSelector:@selector(onBrowseMetadata:)])
+ return NPT_FAILURE;
+
+ PLT_MediaServerBrowseCapsule* capsule =
+ [[PLT_MediaServerBrowseCapsule alloc] initWithAction:action.AsPointer()
+ objectId:object_id
+ filter:filter
+ start:starting_index
+ count:requested_count
+ sort:sort_criteria
+ context:(PLT_HttpRequestContext*)&context];
+ NPT_Result result = [m_Target.delegate onBrowseMetadata:capsule];
+
+ return result;
+ }
+
+ NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context) {
+ if (![m_Target.delegate respondsToSelector:@selector(onBrowseDirectChildren:)])
+ return NPT_FAILURE;
+
+ PLT_MediaServerBrowseCapsule* capsule =
+ [[PLT_MediaServerBrowseCapsule alloc] initWithAction:action.AsPointer()
+ objectId:object_id
+ filter:filter
+ start:starting_index
+ count:requested_count
+ sort:sort_criteria
+ context:(PLT_HttpRequestContext*)&context];
+ NPT_Result result = [m_Target.delegate onBrowseDirectChildren:capsule];
+
+ return result;
+ }
+
+ NPT_Result OnSearchContainer(PLT_ActionReference& action,
+ const char* container_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+ const PLT_HttpRequestContext& context) {
+ if (![m_Target.delegate respondsToSelector:@selector(onSearchContainer:)])
+ return NPT_FAILURE;
+
+ PLT_MediaServerSearchCapsule* capsule =
+ [[PLT_MediaServerSearchCapsule alloc] initWithAction:action.AsPointer()
+ objectId:container_id
+ search:search_criteria
+ filter:filter
+ start:starting_index
+ count:requested_count
+ sort:sort_criteria
+ context:(PLT_HttpRequestContext*)&context];
+ NPT_Result result = [m_Target.delegate onSearchContainer:capsule];
+
+ return result;
+ }
+
+ NPT_Result ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) {
+ PLT_HttpRequestContext _context(request, context);
+ PLT_MediaServerFileRequestCapsule* capsule =
+ [[PLT_MediaServerFileRequestCapsule alloc] initWithResponse:&response
+ context:&_context];
+ NPT_Result result = [m_Target.delegate onFileRequest:capsule];
+
+ return result;
+ }
+
+private:
+ PLT_MediaServerObject* m_Target;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerBrowseCapsule
++---------------------------------------------------------------------*/
+@implementation PLT_MediaServerBrowseCapsule
+
+@synthesize objectId, filter, start, count, sort;
+
+- (id)initWithAction:(PLT_Action*)action objectId:(const char*)_id filter:(const char*)_filter start:(NPT_UInt32)_start count:(NPT_UInt32)_count sort:(const char*)_sort context:(PLT_HttpRequestContext*)_context
+{
+ if ((self = [super initWithAction:action])) {
+ objectId = [[NSString alloc] initWithCString:_id encoding:NSUTF8StringEncoding];
+ filter = [[NSString alloc] initWithCString:(_filter==NULL)?"":_filter
+ encoding:NSUTF8StringEncoding];
+ sort = [[NSString alloc] initWithCString:(_sort==NULL)?"":_sort
+ encoding:NSUTF8StringEncoding];
+ start = _start;
+ count = _count;
+ context = _context;
+ }
+ return self;
+}
+
+@end
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerSearchCapsule
++---------------------------------------------------------------------*/
+@implementation PLT_MediaServerSearchCapsule
+
+@synthesize search;
+
+- (id)initWithAction:(PLT_Action*)action objectId:(const char*)_id search:(const char*)_search filter:(const char*)_filter start:(NPT_UInt32)_start count:(NPT_UInt32)_count sort:(const char*)_sort context:(PLT_HttpRequestContext*)_context
+{
+ if ((self = [super initWithAction:action
+ objectId:_id
+ filter:_filter
+ start:_start
+ count:_count
+ sort:_sort
+ context:_context])) {
+ search = [[NSString alloc] initWithCString:_search encoding:NSUTF8StringEncoding];
+ }
+ return self;
+}
+
+@end
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerFileRequestCapsule
++---------------------------------------------------------------------*/
+@implementation PLT_MediaServerFileRequestCapsule
+
+- (id)initWithResponse:(NPT_HttpResponse*)_response context:(PLT_HttpRequestContext*)_context
+{
+ if ((self = [super init])) {
+ response = _response;
+ context = _context;
+ }
+ return self;
+}
+
+@end
+
+/*----------------------------------------------------------------------
+| PLT_MediaServerObject
++---------------------------------------------------------------------*/
+@interface PLT_MediaServerObject () {
+ PLT_MediaServerDelegate_Wrapper *_wrapper;
+}
+@end
+
+@implementation PLT_MediaServerObject
+
+- (id)init
+{
+ if ((self = [super init])) {
+ PLT_MediaConnect* server = new PLT_MediaConnect("Test");
+ PLT_DeviceHostReference _device(server);
+ [self setDevice:&_device];
+
+ _wrapper = new PLT_MediaServerDelegate_Wrapper(self);
+ server->SetDelegate(_wrapper);
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ delete _wrapper;
+}
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltUPnPObject.h b/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltUPnPObject.h
new file mode 100644
index 0000000..4c9b8ed
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltUPnPObject.h
@@ -0,0 +1,61 @@
+//
+// PltUPnPObject.h
+// Platinum
+//
+// Created by Sylvain on 9/14/10.
+// Copyright 2010 Plutinosoft LLC. All rights reserved.
+//
+
+#import "Neptune.h"
+
+#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+#include <UIKit/UIKit.h>
+#else
+#import <Cocoa/Cocoa.h>
+#endif
+
+
+#if !defined(_PLATINUM_H_)
+typedef struct PLT_UPnP PLT_UPnP;
+typedef struct PLT_Action PLT_Action;
+typedef struct PLT_DeviceHostReference PLT_DeviceHostReference;
+#endif
+
+/*----------------------------------------------------------------------
+| PLT_ActionObject
++---------------------------------------------------------------------*/
+@interface PLT_ActionObject : NSObject {
+@private
+ PLT_Action* action;
+}
+
+- (id)initWithAction:(PLT_Action *)_action;
+- (NPT_Result)setValue:(NSString*)value forArgument:(NSString*)argument;
+- (NPT_Result)setErrorCode:(unsigned int)code withDescription:(NSString*)description;
+@end
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHostObject
++---------------------------------------------------------------------*/
+@interface PLT_DeviceHostObject : NSObject {
+@private
+ PLT_DeviceHostReference* device;
+}
+
+- (void)setDevice:(PLT_DeviceHostReference*)_device;
+- (PLT_DeviceHostReference&)getDevice;
+@end
+
+/*----------------------------------------------------------------------
+| PLT_UPnPObject
++---------------------------------------------------------------------*/
+@interface PLT_UPnPObject : NSObject
+
+- (NPT_Result)start;
+- (NPT_Result)stop;
+- (bool)isRunning;
+
+- (NPT_Result)addDevice:(PLT_DeviceHostObject*)device;
+- (NPT_Result)removeDevice:(PLT_DeviceHostObject*)device;
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltUPnPObject.mm b/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltUPnPObject.mm
new file mode 100644
index 0000000..d49f1f5
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/ObjectiveC/PltUPnPObject.mm
@@ -0,0 +1,118 @@
+//
+// PltUPnPObject.mm
+// Platinum
+//
+// Created by Sylvain on 9/14/10.
+// Copyright 2010 Plutinosoft LLC. All rights reserved.
+//
+
+#import "Platinum.h"
+#import "PltUPnPObject.h"
+
+/*----------------------------------------------------------------------
+| PLT_ActionObject
++---------------------------------------------------------------------*/
+@implementation PLT_ActionObject
+
+- (id)initWithAction:(PLT_Action *)_action
+{
+ if ((self = [super init])) {
+ action = _action;
+ }
+ return self;
+}
+
+- (NPT_Result)setValue:(NSString *)value forArgument:(NSString *)argument
+{
+ return action->SetArgumentValue([argument UTF8String], [value UTF8String]);
+}
+
+- (NPT_Result)setErrorCode:(unsigned int)code withDescription:(NSString*)description
+{
+ return action->SetError(code, [description UTF8String]);
+}
+
+@end
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHostObject
++---------------------------------------------------------------------*/
+@implementation PLT_DeviceHostObject
+
+- (id)init
+{
+ return [super init];
+}
+
+- (void)setDevice:(PLT_DeviceHostReference*)_device
+{
+ delete device;
+ device = new PLT_DeviceHostReference(*_device);
+}
+
+- (void)dealloc
+{
+ delete device;
+}
+
+- (PLT_DeviceHostReference&)getDevice
+{
+ return *device;
+}
+
+@end
+
+/*----------------------------------------------------------------------
+| PLT_UPnPObject
++---------------------------------------------------------------------*/
+
+@interface PLT_UPnPObject () {
+ PLT_UPnP *_upnp;
+ NSMutableArray *_devices;
+}
+@end
+
+@implementation PLT_UPnPObject
+
+- (id)init
+{
+ if ((self = [super init])) {
+ _upnp = new PLT_UPnP();
+ _devices = [NSMutableArray array];
+ }
+ return self;
+}
+
+-(void) dealloc
+{
+ delete _upnp;
+}
+
+- (NPT_Result)start
+{
+ return _upnp->Start();
+}
+
+- (NPT_Result)stop
+{
+ return _upnp->Stop();
+}
+
+- (bool)isRunning
+{
+ return _upnp->IsRunning();
+}
+
+- (NPT_Result)addDevice:(PLT_DeviceHostObject*)device
+{
+ [_devices addObject:device];
+ return _upnp->AddDevice([device getDevice]);
+}
+
+- (NPT_Result)removeDevice:(PLT_DeviceHostObject*)device
+{
+ [_devices removeObject:device];
+ return _upnp->RemoveDevice([device getDevice]);
+}
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltDownloader.cpp b/lib/libUPnP/Platinum/Source/Extras/PltDownloader.cpp
new file mode 100644
index 0000000..a910370
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltDownloader.cpp
@@ -0,0 +1,132 @@
+/*****************************************************************
+|
+| Platinum - Downloader
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDownloader.h"
+#include "PltTaskManager.h"
+#include "Neptune.h"
+
+
+NPT_SET_LOCAL_LOGGER("platinum.extra.downloader")
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::PLT_Downloader
++---------------------------------------------------------------------*/
+PLT_Downloader::PLT_Downloader(NPT_HttpUrl& url,
+ NPT_OutputStreamReference& output) :
+ PLT_HttpClientSocketTask(new NPT_HttpRequest(url,
+ "GET",
+ NPT_HTTP_PROTOCOL_1_1)),
+ m_URL(url),
+ m_Output(output),
+ m_State(PLT_DOWNLOADER_IDLE)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::~PLT_Downloader
++---------------------------------------------------------------------*/
+PLT_Downloader::~PLT_Downloader()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_Downloader::DoRun()
+{
+ m_State = PLT_DOWNLOADER_STARTED;
+ return PLT_HttpClientSocketTask::DoRun();
+}
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::DoAbort
++---------------------------------------------------------------------*/
+void
+PLT_Downloader::DoAbort()
+{
+ PLT_HttpClientSocketTask::DoAbort();
+ m_State = PLT_DOWNLOADER_IDLE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Downloader::ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+
+ if (NPT_FAILED(res)) {
+ NPT_LOG_WARNING_2("Downloader error %d for %s", res, m_URL.ToString().GetChars());
+ m_State = PLT_DOWNLOADER_ERROR;
+ return res;
+ }
+
+ m_State = PLT_DOWNLOADER_DOWNLOADING;
+
+ NPT_HttpEntity* entity;
+ NPT_InputStreamReference body;
+ if (!response ||
+ !(entity = response->GetEntity()) ||
+ NPT_FAILED(entity->GetInputStream(body)) ||
+ body.IsNull()) {
+ m_State = PLT_DOWNLOADER_ERROR;
+ NPT_LOG_WARNING_2("No body %d for %s", res, m_URL.ToString().GetChars());
+ return NPT_FAILURE;
+ }
+
+ // Read body (no content length means until socket is closed)
+ res = NPT_StreamToStreamCopy(*body.AsPointer(),
+ *m_Output.AsPointer(),
+ 0,
+ entity->GetContentLength());
+
+ if (NPT_FAILED(res)) {
+ NPT_LOG_WARNING_2("Downloader error %d for %s", res, m_URL.ToString().GetChars());
+ m_State = PLT_DOWNLOADER_ERROR;
+ return res;
+ }
+
+ NPT_LOG_INFO_1("Finished downloading %s", m_URL.ToString().GetChars());
+ m_State = PLT_DOWNLOADER_SUCCESS;
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltDownloader.h b/lib/libUPnP/Platinum/Source/Extras/PltDownloader.h
new file mode 100644
index 0000000..15d9279
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltDownloader.h
@@ -0,0 +1,89 @@
+/*****************************************************************
+|
+| Platinum - Downloader
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_DOWNLOADER_H_
+#define _PLT_DOWNLOADER_H_
+
+/*----------------------------------------------------------------------
+| Includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttpClientTask.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Downloader;
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef enum {
+ PLT_DOWNLOADER_IDLE,
+ PLT_DOWNLOADER_STARTED,
+ PLT_DOWNLOADER_DOWNLOADING,
+ PLT_DOWNLOADER_ERROR,
+ PLT_DOWNLOADER_SUCCESS
+} Plt_DowloaderState;
+
+/*----------------------------------------------------------------------
+| PLT_Downloader class
++---------------------------------------------------------------------*/
+class PLT_Downloader : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_Downloader(NPT_HttpUrl& url,
+ NPT_OutputStreamReference& output);
+ ~PLT_Downloader() override;
+
+ Plt_DowloaderState GetState() { return m_State; }
+
+ // PLT_HttpClientTask method
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) override;
+
+protected:
+ void DoRun() override;
+ void DoAbort() override;
+
+private:
+ // members
+ NPT_HttpUrl m_URL;
+ NPT_OutputStreamReference m_Output;
+ Plt_DowloaderState m_State;
+};
+
+#endif /* _PLT_DOWNLOADER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltFrameBuffer.cpp b/lib/libUPnP/Platinum/Source/Extras/PltFrameBuffer.cpp
new file mode 100644
index 0000000..5c4232d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltFrameBuffer.cpp
@@ -0,0 +1,129 @@
+/*****************************************************************
+|
+| Platinum - Frame Buffer
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltFrameBuffer.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.framebuffer")
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::PLT_FrameBuffer
++---------------------------------------------------------------------*/
+PLT_FrameBuffer::PLT_FrameBuffer(const char* mime_type) :
+ m_MimeType(mime_type),
+ m_Aborted(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::~PLT_FrameBuffer
++---------------------------------------------------------------------*/
+PLT_FrameBuffer::~PLT_FrameBuffer()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::Reset
++---------------------------------------------------------------------*/
+void
+PLT_FrameBuffer::Reset()
+{
+ NPT_AutoLock lock(m_FrameLock);
+
+ // mark that we're planning to receive more frames
+ m_Aborted = false;
+
+ // reset to 0 for new readers to
+ m_FrameIndex.SetValue(0);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::Abort
++---------------------------------------------------------------------*/
+void
+PLT_FrameBuffer::Abort()
+{
+ NPT_AutoLock lock(m_FrameLock);
+
+ // mark that we're not planning to receive more frames
+ m_Aborted = true;
+
+ // increment to unlock readers
+ m_FrameIndex.SetValue(m_FrameIndex.GetValue()+1);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::SetNextFrame
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameBuffer::SetNextFrame(const NPT_Byte* data, NPT_Size size)
+{
+ NPT_AutoLock lock(m_FrameLock);
+
+ m_Frame.SetData(data, size);
+ m_FrameIndex.SetValue(m_FrameIndex.GetValue()+1);
+
+ NPT_LOG_INFO_1("Set frame %d", m_FrameIndex.GetValue());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::GetNextFrame
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameBuffer::GetNextFrame(NPT_UInt32& last_frame_index,
+ NPT_DataBuffer& buffer,
+ NPT_Timeout timeout)
+{
+ NPT_CHECK_WARNING(m_FrameIndex.WaitWhileEquals(last_frame_index, timeout));
+
+ {
+ NPT_AutoLock lock(m_FrameLock);
+
+ // if we're aborted or we reseted, disconnect
+ if (m_Aborted || last_frame_index > (NPT_UInt32)m_FrameIndex.GetValue())
+ return NPT_ERROR_EOS;
+
+ buffer.SetData(m_Frame.GetData(), m_Frame.GetDataSize());
+
+ // update current frame index
+ last_frame_index = m_FrameIndex.GetValue();
+ NPT_LOG_INFO_1("Retrieved frame %d", last_frame_index);
+ }
+
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltFrameBuffer.h b/lib/libUPnP/Platinum/Source/Extras/PltFrameBuffer.h
new file mode 100644
index 0000000..aa270df
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltFrameBuffer.h
@@ -0,0 +1,76 @@
+/*****************************************************************
+|
+| Platinum - Frame Buffer
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_FRAME_BUFFER_H_
+#define _PLT_FRAME_BUFFER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer
++---------------------------------------------------------------------*/
+class PLT_FrameBuffer
+{
+ public:
+ // constructor & destructor
+ PLT_FrameBuffer(const char* mime_type);
+ virtual ~PLT_FrameBuffer();
+
+ void Reset();
+ void Abort();
+ void AddReader() { m_Readers.Increment(); }
+ void RemoveReader() { m_Readers.Decrement(); }
+ int GetNbReaders() { return m_Readers.GetValue(); }
+ const char* GetMimeType() { return m_MimeType; }
+
+ // data buffer handling methods
+ virtual NPT_Result SetNextFrame(const NPT_Byte* buffer, NPT_Size bufferSize);
+ virtual NPT_Result GetNextFrame(NPT_UInt32& last_frame_index,
+ NPT_DataBuffer& buffer,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+
+ protected:
+ // members
+ NPT_String m_MimeType;
+ bool m_Aborted;
+ NPT_SharedVariable m_FrameIndex;
+ NPT_DataBuffer m_Frame;
+ NPT_Mutex m_FrameLock;
+ NPT_AtomicVariable m_Readers;
+};
+
+#endif // _PLT_FRAME_BUFFER_H_
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.cpp b/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.cpp
new file mode 100644
index 0000000..d01d414
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.cpp
@@ -0,0 +1,236 @@
+/*****************************************************************
+|
+| Platinum - Frame Server
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltFrameStream.h"
+#include "PltFrameServer.h"
+#include "PltUtilities.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.frame")
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define BOUNDARY "BOUNDARYGOAWAY"
+
+/*----------------------------------------------------------------------
+| PLT_SocketPolicyServer
++---------------------------------------------------------------------*/
+class PLT_SocketPolicyServer : public NPT_Thread
+{
+public:
+ PLT_SocketPolicyServer(const char* policy,
+ NPT_IpPort port = 0,
+ const char* authorized_ports = "5900") :
+ m_Socket(NPT_SOCKET_FLAG_CANCELLABLE),
+ m_Policy(policy),
+ m_Port(port),
+ m_AuthorizedPorts(authorized_ports),
+ m_Aborted(false) {}
+
+ ~PLT_SocketPolicyServer() {
+ Stop();
+ }
+
+ NPT_Result Start() {
+ NPT_Result result = NPT_FAILURE;
+
+ // bind
+ // randomly try a port for our http server
+ int retries = 100;
+ do {
+ int random = NPT_System::GetRandomInteger();
+ NPT_IpPort port = (unsigned short)(50000 + (random % 15000));
+
+ result = m_Socket.Bind(
+ NPT_SocketAddress(NPT_IpAddress::Any, m_Port?m_Port:port),
+ false);
+
+ if (NPT_SUCCEEDED(result) || m_Port)
+ break;
+ } while (--retries > 0);
+
+ if (NPT_FAILED(result) || retries == 0) return NPT_FAILURE;
+
+ // remember that we're bound
+ NPT_SocketInfo info;
+ m_Socket.GetInfo(info);
+ m_Port = info.local_address.GetPort();
+
+ return NPT_Thread::Start();
+ }
+
+ NPT_Result Stop() {
+ m_Aborted = true;
+ m_Socket.Cancel();
+
+ return Wait();
+ }
+
+ void Run() {
+ do {
+ // wait for a connection
+ NPT_Socket* client = NULL;
+ NPT_LOG_FINE_1("waiting for connection on port %d...", m_Port);
+ NPT_Result result = m_Socket.WaitForNewClient(client, NPT_TIMEOUT_INFINITE);
+ if (NPT_FAILED(result) || client == NULL) return;
+
+ NPT_SocketInfo client_info;
+ client->GetInfo(client_info);
+ NPT_LOG_FINE_2("client connected (%s -> %s)",
+ client_info.local_address.ToString().GetChars(),
+ client_info.remote_address.ToString().GetChars());
+
+ // get the output stream
+ NPT_OutputStreamReference output;
+ client->GetOutputStream(output);
+
+ // generate policy based on our current IP
+ NPT_String policy = "<cross-domain-policy>";
+ policy += "<allow-access-from domain=\""+client_info.local_address.GetIpAddress().ToString()+"\" to-ports=\""+m_AuthorizedPorts+"\"/>";
+ policy += "<allow-access-from domain=\""+client_info.remote_address.GetIpAddress().ToString()+"\" to-ports=\""+m_AuthorizedPorts+"\"/>";
+ policy += "</cross-domain-policy>";
+
+ NPT_MemoryStream* mem_input = new NPT_MemoryStream();
+ mem_input->Write(policy.GetChars(), policy.GetLength());
+ NPT_InputStreamReference input(mem_input);
+
+ NPT_StreamToStreamCopy(*input, *output);
+
+
+ delete client;
+ } while (!m_Aborted);
+ }
+
+ NPT_TcpServerSocket m_Socket;
+ NPT_String m_Policy;
+ NPT_IpPort m_Port;
+ NPT_String m_AuthorizedPorts;
+ bool m_Aborted;
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpStreamRequestHandler::SetupResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpStreamRequestHandler::SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ PLT_LOG_HTTP_REQUEST(NPT_LOG_LEVEL_FINE, "PLT_HttpStreamRequestHandler::SetupResponse:", &request);
+
+ if (request.GetMethod().Compare("GET") &&
+ request.GetMethod().Compare("HEAD")) {
+ return NPT_FAILURE;
+ }
+
+ NPT_Reference<PLT_FrameBuffer> buffer;
+ if (!m_StreamValidator.OnNewRequestAccept(request, context, response, buffer)) {
+ return NPT_ERROR_NO_SUCH_ITEM;
+ }
+
+ response.SetProtocol(NPT_HTTP_PROTOCOL_1_0);
+ response.GetHeaders().SetHeader(NPT_HTTP_HEADER_CONNECTION, "close");
+ response.GetHeaders().SetHeader("Cache-Control", "no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0");
+ response.GetHeaders().SetHeader("Pragma", "no-cache");
+ response.GetHeaders().SetHeader("Expires", "Tue, 4 Jan 2000 02:43:05 GMT");
+
+ // HEAD request has no entity or if status code is not 2xx
+ if (!request.GetMethod().Compare("HEAD") || response.GetStatusCode()/100 != 2)
+ return NPT_SUCCESS;
+
+ NPT_HttpEntity* entity = response.GetEntity();
+ NPT_CHECK_POINTER_FATAL(entity);
+ entity->SetContentType("multipart/x-mixed-replace;boundary=" BOUNDARY);
+
+ NPT_InputStreamReference body(new PLT_InputFrameStream(buffer, BOUNDARY));
+ entity->SetInputStream(body, false);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::PLT_FrameServer
++---------------------------------------------------------------------*/
+PLT_FrameServer::PLT_FrameServer(const char* resource_name,
+ PLT_StreamValidator& stream_validator,
+ NPT_IpAddress address,
+ NPT_UInt16 port,
+ bool policy_server_enabled) :
+ PLT_HttpServer(address, port, false),
+ m_PolicyServer(NULL),
+ m_StreamValidator(stream_validator),
+ m_PolicyServerEnabled(policy_server_enabled)
+{
+ NPT_String resource(resource_name);
+ resource.Trim("/\\");
+ AddRequestHandler(
+ new PLT_HttpStreamRequestHandler(stream_validator),
+ "/" + resource,
+ true,
+ true);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::~PLT_FrameServer
++---------------------------------------------------------------------*/
+PLT_FrameServer::~PLT_FrameServer()
+{
+ delete m_PolicyServer;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameServer::Start()
+{
+ // start main server so we can get the listening port
+ NPT_CHECK_SEVERE(PLT_HttpServer::Start());
+
+ // start the xml socket policy server for flash
+ if (m_PolicyServerEnabled) {
+ m_PolicyServer = new PLT_SocketPolicyServer(
+ "",
+ 8989,
+ "5900,"+NPT_String::FromInteger(GetPort()));
+ NPT_CHECK_SEVERE(m_PolicyServer->Start());
+ }
+
+ return NPT_SUCCESS;
+}
+
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.h b/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.h
new file mode 100644
index 0000000..e5c1192
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.h
@@ -0,0 +1,103 @@
+/*****************************************************************
+|
+| Platinum - Frame Server
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_FRAME_SERVER_H_
+#define _PLT_FRAME_SERVER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttpServer.h"
+#include "PltFrameBuffer.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_SocketPolicyServer;
+
+/*----------------------------------------------------------------------
+| PLT_StreamValidator class
++---------------------------------------------------------------------*/
+class PLT_StreamValidator
+{
+public:
+ virtual ~PLT_StreamValidator() {}
+ virtual bool OnNewRequestAccept(const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ NPT_Reference<PLT_FrameBuffer>& buffer) = 0;
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpStreamRequestHandler
++---------------------------------------------------------------------*/
+class PLT_HttpStreamRequestHandler : public NPT_HttpRequestHandler
+{
+public:
+ // constructor
+ PLT_HttpStreamRequestHandler(PLT_StreamValidator& stream_validator) :
+ m_StreamValidator(stream_validator) {}
+
+ // NPT_HttpRequestHandler methods
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) override;
+
+private:
+ PLT_StreamValidator& m_StreamValidator;
+};
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer class
++---------------------------------------------------------------------*/
+class PLT_FrameServer : public PLT_HttpServer
+{
+public:
+ PLT_FrameServer(const char* resource_name,
+ PLT_StreamValidator& stream_validator,
+ NPT_IpAddress address = NPT_IpAddress::Any,
+ NPT_UInt16 port = 0,
+ bool policy_server_enabled = false);
+ ~PLT_FrameServer() override;
+
+ NPT_Result Start() override;
+
+protected:
+ PLT_SocketPolicyServer* m_PolicyServer;
+ PLT_StreamValidator& m_StreamValidator;
+ bool m_PolicyServerEnabled;
+};
+
+#endif /* _PLT_FRAME_SERVER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.cpp b/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.cpp
new file mode 100644
index 0000000..2b3b3e1
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.cpp
@@ -0,0 +1,128 @@
+/*****************************************************************
+|
+| Platinum - Frame Stream
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltFrameStream.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.framestream")
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::PLT_InputFrameStream
++---------------------------------------------------------------------*/
+PLT_InputFrameStream::PLT_InputFrameStream(NPT_Reference<PLT_FrameBuffer>& frame_buffer,
+ const char* boundary) :
+ m_FrameBuffer(frame_buffer),
+ m_LastFrameIndex(0),
+ m_Boundary(boundary),
+ m_Eos(false)
+{
+ m_FrameBuffer->AddReader();
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::~PLT_InputFrameStream
++---------------------------------------------------------------------*/
+PLT_InputFrameStream::~PLT_InputFrameStream()
+{
+ m_FrameBuffer->RemoveReader();
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputFrameStream::GetAvailable(NPT_LargeSize& available)
+{
+ NPT_CHECK_WARNING(m_Part.GetAvailable(available));
+
+ if (available == 0 && !m_Eos) {
+ NPT_CHECK_WARNING(FillBuffer());
+ NPT_CHECK_WARNING(m_Part.GetAvailable(available));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::FillBuffer
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputFrameStream::FillBuffer()
+{
+ // reset memorystream
+ m_Part.SetDataSize(0);
+
+ // fetch next frame
+ NPT_DataBuffer frame;
+ NPT_Result result = m_FrameBuffer->GetNextFrame(m_LastFrameIndex, frame);
+
+ // error (EOS) or empty frame means we're done
+ if (NPT_FAILED(result) || frame.GetDataSize() == 0) {
+ m_Part.WriteLine("--" + m_Boundary + "--");
+ m_Eos = true;
+ return NPT_SUCCESS;
+ }
+
+ m_Part.WriteLine("--" + m_Boundary);
+ m_Part.WriteLine("Content-Type: " + NPT_String(m_FrameBuffer->GetMimeType()));
+ m_Part.WriteLine("Content-Length: "+NPT_String::FromInteger(frame.GetDataSize()));
+ m_Part.WriteLine("");
+ m_Part.Write(frame.GetData(), frame.GetDataSize());
+ m_Part.WriteLine("");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputFrameStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read /*= 0*/)
+{
+
+ if (bytes_read) *bytes_read = 0;
+
+ if (bytes_to_read == 0) {
+ return NPT_SUCCESS;
+ }
+
+ // make sure we have data
+ NPT_LargeSize available;
+ NPT_CHECK_WARNING(GetAvailable(available));
+
+ return m_Part.Read(buffer, bytes_to_read, bytes_read);
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.h b/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.h
new file mode 100644
index 0000000..6d6deb8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.h
@@ -0,0 +1,79 @@
+/*****************************************************************
+|
+| Platinum - Frame Stream
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_FRAMESTREAM_H_
+#define _PLT_FRAMESTREAM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltFrameBuffer.h"
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream
++---------------------------------------------------------------------*/
+class PLT_InputFrameStream : public NPT_InputStream
+{
+public:
+ // methods
+ PLT_InputFrameStream(NPT_Reference<PLT_FrameBuffer>& frame_buffer,
+ const char* boundary);
+ ~PLT_InputFrameStream() override;
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = 0) override;
+
+ NPT_Result Seek(NPT_Position offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Skip(NPT_Size offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Tell(NPT_Position& offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result GetSize(NPT_LargeSize& size) override { NPT_COMPILER_UNUSED(size); return NPT_FAILURE; }
+ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+private:
+ NPT_Result FillBuffer();
+
+protected:
+ NPT_Reference<PLT_FrameBuffer> m_FrameBuffer;
+ NPT_MemoryStream m_Part;
+ NPT_UInt32 m_LastFrameIndex;
+ NPT_String m_Boundary;
+ bool m_Eos;
+};
+
+typedef NPT_Reference<PLT_InputFrameStream> PLT_InputFrameStreamReference;
+
+#endif /* _PLT_FRAMESTREAM_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltLeaks.cpp b/lib/libUPnP/Platinum/Source/Extras/PltLeaks.cpp
new file mode 100644
index 0000000..91b1b99
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltLeaks.cpp
@@ -0,0 +1,99 @@
+/*****************************************************************
+|
+| Platinum - Leaks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltLeaks.h"
+
+#if defined(WIN32)
+#include <crtdbg.h>
+#include <stdio.h>
+#include "string.h"
+
+/*----------------------------------------------------------------------
+| PLT_Leak_AllocHook
++---------------------------------------------------------------------*/
+int PLT_Leak_AllocHook(int alloc_type,
+ void* user_data,
+ size_t size,
+ int block_type,
+ long request_number,
+ const unsigned char* filename,
+ int line_number)
+{
+ (void)alloc_type;
+ (void)user_data;
+ (void)size;
+ (void)block_type;
+ (void)request_number;
+ (void)line_number;
+ (void)filename;
+ /*
+ * if (request_number == 34556)
+ * return 2;
+ *
+ */
+ return 1;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Leak_Enable
++---------------------------------------------------------------------*/
+void
+PLT_Leak_Enable(void)
+{
+#if defined(_DEBUG)
+ /*
+ * If you want VC to dump file name and line number of leaking resource
+ * use #define _CRTDBG_MAP_ALLOC in suspected file (project)
+ * and #include "crtdbg.h" in suspected file
+ */
+_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF |
+ _CRTDBG_LEAK_CHECK_DF);
+
+_CrtSetAllocHook(PLT_Leak_AllocHook );
+
+#endif
+}
+#else
+/*----------------------------------------------------------------------
+| PLT_Leak_Enable
++---------------------------------------------------------------------*/
+void
+PLT_Leak_Enable(void)
+{
+}
+#endif
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltLeaks.h b/lib/libUPnP/Platinum/Source/Extras/PltLeaks.h
new file mode 100644
index 0000000..73d1e3a
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltLeaks.h
@@ -0,0 +1,51 @@
+/*****************************************************************
+|
+| Platinum - Leaks
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_LEAKS_H_
+#define _PLT_LEAKS_H_
+
+/*----------------------------------------------------------------------
+| functions
++---------------------------------------------------------------------*/
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+void PLT_Leak_Enable(void);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* _PLT_LEAKS_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltMetadataHandler.cpp b/lib/libUPnP/Platinum/Source/Extras/PltMetadataHandler.cpp
new file mode 100644
index 0000000..b7d0312
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltMetadataHandler.cpp
@@ -0,0 +1,90 @@
+/*****************************************************************
+|
+| Platinum - Metadata Handler
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMetadataHandler.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.metadata.handler")
+
+/*----------------------------------------------------------------------
+| PLT_MetadataHandler::Load
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MetadataHandler::Load(const char* filename)
+{
+ NPT_File file(filename);
+ NPT_Result res = file.Open(NPT_FILE_OPEN_MODE_READ);
+ if (res != NPT_SUCCESS) {
+ NPT_LOG_SEVERE_2("error %d opening : %s\n", res, filename);
+ } else {
+ NPT_InputStreamReference stream;
+ res = file.GetInputStream(stream);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_SEVERE_2("error %d getting input stream: %s\n", res, filename);
+ }
+ res = Load(*stream);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_SEVERE_2("error %d reading header: %s\n", res, filename);
+ }
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MetadataHandler::Save
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MetadataHandler::Save(const char* filename)
+{
+ NPT_File file(filename);
+ NPT_Result res = file.Open(NPT_FILE_OPEN_MODE_WRITE);
+ if (res != NPT_SUCCESS) {
+ NPT_LOG_SEVERE_2("error %d opening : %s\n", res, filename);
+ } else {
+ NPT_OutputStreamReference stream;
+ res = file.GetOutputStream(stream);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_SEVERE_2("error %d getting output stream: %s\n", res, filename);
+ }
+ res = Save(*stream);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_SEVERE_2("error %d writing header: %s\n", res, filename);
+ }
+ }
+
+ return res;
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltMetadataHandler.h b/lib/libUPnP/Platinum/Source/Extras/PltMetadataHandler.h
new file mode 100644
index 0000000..d1709bd
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltMetadataHandler.h
@@ -0,0 +1,91 @@
+/*****************************************************************
+|
+| Platinum - Metadata Handler
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_METADATA_HANDLER_H_
+#define _PLT_METADATA_HANDLER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_MetadataHandler class
++---------------------------------------------------------------------*/
+class PLT_MetadataHandler
+{
+public:
+ virtual ~PLT_MetadataHandler() {}
+
+ // metadata overridables
+ virtual bool HandleExtension(const char* extension) = 0;
+ virtual NPT_Result Load(NPT_InputStream& stream,
+ NPT_TimeInterval sleeptime = NPT_TimeInterval(.01),
+ NPT_TimeInterval timeout = NPT_TimeInterval(30.)) = 0;
+ virtual NPT_Result Save(NPT_OutputStream& stream,
+ NPT_TimeInterval sleeptime = NPT_TimeInterval(.01),
+ NPT_TimeInterval timeout = NPT_TimeInterval(30.)) = 0;
+
+ virtual const char* GetLicenseData(NPT_String& licenseData) = 0;
+ virtual NPT_Result GetCoverArtData(char*& caData, int& len) = 0;
+ virtual const char* GetContentID(NPT_String& value) = 0;
+ virtual const char* GetTitle(NPT_String& value) = 0;
+ virtual const char* GetDescription(NPT_String& value) = 0;
+ virtual NPT_Result GetDuration(NPT_UInt32& seconds) = 0;
+ virtual const char* GetProtection(NPT_String& protection) = 0;
+ virtual NPT_Result GetYear(NPT_Size& year) = 0;
+
+ // helper functions
+ virtual NPT_Result Load(const char* filename);
+ virtual NPT_Result Save(const char* filename);
+};
+
+/*----------------------------------------------------------------------
+| PLT_MetadataHandlerFinder
++---------------------------------------------------------------------*/
+class PLT_MetadataHandlerFinder
+{
+public:
+ // methods
+ PLT_MetadataHandlerFinder(const char* extension) : m_Extension(extension) {}
+ bool operator()(PLT_MetadataHandler* const & handler) const {
+ return handler->HandleExtension(m_Extension) ? true : false;
+ }
+
+private:
+ // members
+ NPT_String m_Extension;
+};
+
+#endif /* _PLT_METADATA_HANDLER_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.cpp b/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.cpp
new file mode 100644
index 0000000..92eb355
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.cpp
@@ -0,0 +1,255 @@
+/*****************************************************************
+|
+| Platinum - Ring Buffer Stream
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltRingBufferStream.h"
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| defines
++---------------------------------------------------------------------*/
+#ifdef max
+#undef max
+#endif
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+
+#ifdef min
+#undef min
+#endif
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::PLT_RingBufferStream
++---------------------------------------------------------------------*/
+PLT_RingBufferStream::PLT_RingBufferStream(NPT_Size buffer_size,
+ bool blocking /* = true */) :
+ m_TotalBytesRead(0),
+ m_TotalBytesWritten(0),
+ m_Blocking(blocking),
+ m_Eos(false),
+ m_Aborted(false)
+{
+ m_RingBuffer = new NPT_RingBuffer(buffer_size);
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::PLT_RingBufferStream
++---------------------------------------------------------------------*/
+PLT_RingBufferStream::PLT_RingBufferStream(NPT_RingBufferReference& buffer,
+ bool blocking /* = true */) :
+ m_RingBuffer(buffer),
+ m_TotalBytesRead(0),
+ m_TotalBytesWritten(0),
+ m_Blocking(blocking),
+ m_Eos(false),
+ m_Aborted(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::~PLT_RingBufferStream
++---------------------------------------------------------------------*/
+PLT_RingBufferStream::~PLT_RingBufferStream()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_RingBufferStream::Read(void* buffer,
+ NPT_Size max_bytes_to_read,
+ NPT_Size* _bytes_read /*= NULL*/)
+{
+ NPT_Size bytes_to_read;
+ NPT_Size bytes_read = 0;
+
+ // reset output param first
+ if (_bytes_read) *_bytes_read = 0;
+
+ // wait for data
+ do {
+ {
+ NPT_AutoLock autoLock(m_Lock);
+
+ if (m_Aborted) {
+ return NPT_ERROR_INTERRUPTED;
+ }
+
+ // check for data
+ if (m_RingBuffer->GetAvailable())
+ break;
+
+ if (m_Eos) {
+ return NPT_ERROR_EOS;
+ } else if (!m_Blocking) {
+ return NPT_ERROR_WOULD_BLOCK;
+ }
+ }
+
+ // sleep and try again
+ NPT_System::Sleep(NPT_TimeInterval(.1));
+ } while (1);
+
+ {
+ NPT_AutoLock autoLock(m_Lock);
+
+ // try twice in case available data was not contiguous
+ for (int i=0; i<2; i++) {
+ bytes_to_read = min(max_bytes_to_read - bytes_read, m_RingBuffer->GetContiguousAvailable());
+
+ // break if nothing to read the second time
+ if (bytes_to_read == 0) break;
+
+ // read into buffer and advance
+ NPT_CHECK(m_RingBuffer->Read((unsigned char*)buffer+bytes_read, bytes_to_read));
+
+ // keep track of the total bytes we have read so far
+ m_TotalBytesRead += bytes_to_read;
+ bytes_read += bytes_to_read;
+
+ if (_bytes_read) *_bytes_read += bytes_to_read;
+ }
+ }
+
+ // we have read some chars, so return success
+ // even if we have read less than asked
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_RingBufferStream::Write(const void* buffer,
+ NPT_Size max_bytes_to_write,
+ NPT_Size* _bytes_written /*= NULL*/)
+{
+ NPT_Size bytes_to_write;
+ NPT_Size bytes_written = 0;
+
+ // reset output param first
+ if (_bytes_written) *_bytes_written = 0;
+
+ // wait for space
+ do {
+ {
+ NPT_AutoLock autoLock(m_Lock);
+
+ if (m_Aborted) {
+ return NPT_ERROR_INTERRUPTED;
+ }
+
+ // return immediately if we are told we're finished
+ if (m_Eos) {
+ return NPT_ERROR_EOS;
+ }
+
+ if (m_RingBuffer->GetSpace())
+ break;
+
+ if (!m_Blocking) {
+ return NPT_ERROR_WOULD_BLOCK;
+ }
+ }
+
+ // sleep and try again
+ NPT_System::Sleep(NPT_TimeInterval(.1));
+ } while (1);
+
+ {
+ NPT_AutoLock autoLock(m_Lock);
+
+ // try twice in case available space was not contiguous
+ for (int i=0; i<2; i++) {
+ bytes_to_write = min(max_bytes_to_write - bytes_written, m_RingBuffer->GetContiguousSpace());
+
+ // break if no space to write the second time
+ if (bytes_to_write == 0) break;
+
+ // write into buffer
+ NPT_CHECK(m_RingBuffer->Write((unsigned char*)buffer+bytes_written, bytes_to_write));
+
+ m_TotalBytesWritten += bytes_to_write;
+ bytes_written += bytes_to_write;
+
+ if (_bytes_written) *_bytes_written += bytes_to_write;
+ }
+ }
+
+ // we have written some chars, so return success
+ // even if we have written less than provided
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::Flush
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_RingBufferStream::Flush()
+{
+ NPT_AutoLock autoLock(m_Lock);
+
+ m_RingBuffer->Flush();
+ m_TotalBytesRead = 0;
+ m_TotalBytesWritten = 0;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::SetEOS
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_RingBufferStream::SetEOS()
+{
+ NPT_AutoLock autoLock(m_Lock);
+
+ m_Eos = true;
+ return NPT_SUCCESS;
+}
+
+
+/*----------------------------------------------------------------------
+ | PLT_RingBufferStream::Abort
+ +---------------------------------------------------------------------*/
+NPT_Result
+PLT_RingBufferStream::Abort()
+{
+ NPT_AutoLock autoLock(m_Lock);
+
+ m_Aborted = true;
+ return NPT_SUCCESS;
+}
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.h b/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.h
new file mode 100644
index 0000000..bd56b8a
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.h
@@ -0,0 +1,119 @@
+/*****************************************************************
+|
+| Platinum - Ring buffer stream
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_RING_BUFFER_STREAM_H_
+#define _PLT_RING_BUFFER_STREAM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream class
++---------------------------------------------------------------------*/
+class PLT_RingBufferStream : public NPT_DelegatingInputStream,
+ public NPT_DelegatingOutputStream
+{
+public:
+ PLT_RingBufferStream(NPT_Size buffer_size = 4096, bool blocking = true);
+ PLT_RingBufferStream(NPT_RingBufferReference& buffer, bool blocking = true);
+ ~PLT_RingBufferStream() override;
+
+ // methods
+ bool IsAborted() { return m_Aborted; }
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL) override;
+ NPT_Result GetSize(NPT_LargeSize& size) override {
+ NPT_COMPILER_UNUSED(size);
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ NPT_Result GetSpace(NPT_LargeSize& space) {
+ NPT_AutoLock autoLock(m_Lock);
+ space = m_RingBuffer->GetSpace();
+ return NPT_SUCCESS;
+ }
+ NPT_Result GetAvailable(NPT_LargeSize& available) override {
+ NPT_AutoLock autoLock(m_Lock);
+ available = m_RingBuffer->GetAvailable();
+ return NPT_SUCCESS;
+ }
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written = NULL) override;
+ NPT_Result Flush() override;
+ NPT_Result SetEOS();
+ NPT_Result Abort();
+
+protected:
+ // NPT_DelegatingInputStream methods
+ NPT_Result InputSeek(NPT_Position offset) override {
+ NPT_COMPILER_UNUSED(offset);
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ NPT_Result InputTell(NPT_Position& offset) override {
+ NPT_AutoLock autoLock(m_Lock);
+ offset = m_TotalBytesRead;
+ return NPT_SUCCESS;
+ }
+
+ // NPT_DelegatingOutputStream methods
+ NPT_Result OutputSeek(NPT_Position offset) override {
+ NPT_COMPILER_UNUSED(offset);
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+ NPT_Result OutputTell(NPT_Position& offset) override {
+ NPT_AutoLock autoLock(m_Lock);
+ offset = m_TotalBytesWritten;
+ return NPT_SUCCESS;
+ }
+
+private:
+ NPT_RingBufferReference m_RingBuffer;
+ NPT_Offset m_TotalBytesRead;
+ NPT_Offset m_TotalBytesWritten;
+ NPT_Mutex m_Lock;
+ bool m_Blocking;
+ bool m_Eos;
+ bool m_Aborted;
+};
+
+typedef NPT_Reference<PLT_RingBufferStream> PLT_RingBufferStreamReference;
+
+#endif // _PLT_RING_BUFFER_STREAM_H_
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.cpp b/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.cpp
new file mode 100644
index 0000000..80d1614
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.cpp
@@ -0,0 +1,227 @@
+/*****************************************************************
+|
+| Platinum - Stream Pump
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltStreamPump.h"
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_StreamPump::PLT_StreamPump
++---------------------------------------------------------------------*/
+PLT_StreamPump::PLT_StreamPump(NPT_Size size) :
+ m_TotalBytesRead(0),
+ m_TotalBytesWritten(0)
+{
+ m_RingBuffer = new NPT_RingBuffer(size);
+}
+
+/*----------------------------------------------------------------------
+| PLT_StreamPump::~PLT_StreamPump
++---------------------------------------------------------------------*/
+PLT_StreamPump::~PLT_StreamPump()
+{
+ delete m_RingBuffer;
+}
+/*----------------------------------------------------------------------+
+| PLT_StreamPump::PushData
++----------------------------------------------------------------------*/
+NPT_Result
+PLT_StreamPump::PushData(NPT_OutputStream& output,
+ NPT_Size& bytes_written)
+{
+ NPT_Result res = NPT_ERROR_WOULD_BLOCK;
+ NPT_Size count = 0;
+ NPT_Size bytes_available = m_RingBuffer->GetContiguousAvailable();
+
+ bytes_written = 0;
+
+ if (bytes_available) {
+ res = output.Write(m_RingBuffer->GetReadPointer(), bytes_available, &count);
+ m_RingBuffer->MoveOut(count);
+ bytes_written += count;
+
+ // check if we wrapped around
+ bytes_available = m_RingBuffer->GetContiguousAvailable();
+ if (NPT_SUCCEEDED(res) && bytes_available) {
+ res = output.Write(m_RingBuffer->GetReadPointer(), bytes_available, &count);
+ m_RingBuffer->MoveOut(count);
+ bytes_written += count;
+ }
+ }
+
+ m_TotalBytesWritten += bytes_written;
+
+ return res;
+}
+
+/*----------------------------------------------------------------------+
+| PLT_StreamPump::PullData
++----------------------------------------------------------------------*/
+NPT_Result
+PLT_StreamPump::PullData(NPT_InputStream& input,
+ NPT_Size max_bytes_to_read)
+{
+ NPT_Result res = NPT_ERROR_WOULD_BLOCK;
+ NPT_Size byte_space = m_RingBuffer->GetContiguousSpace();
+
+ // check that there is space left
+ // make sure we don't read more than our contiguous space
+ NPT_Size nb_to_read = (max_bytes_to_read<byte_space)?max_bytes_to_read:byte_space;
+ if (nb_to_read > 0) {
+ NPT_Size count;
+ res = input.Read(m_RingBuffer->GetWritePointer(), nb_to_read, &count);
+ m_RingBuffer->MoveIn(count);
+ max_bytes_to_read -= count;
+ m_TotalBytesRead += count;
+
+ byte_space = m_RingBuffer->GetContiguousSpace();
+ nb_to_read = (max_bytes_to_read<byte_space)?max_bytes_to_read:byte_space;
+ // if we filled our contiguous space, and we wrapped, check if there is more to read
+ if (NPT_SUCCEEDED(res) && (nb_to_read > 0)) {
+ res = input.Read(m_RingBuffer->GetWritePointer(), nb_to_read, &count);
+ m_RingBuffer->MoveIn(count);
+ m_TotalBytesRead += count;
+ }
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump::PLT_PipeInputStreamPump
++---------------------------------------------------------------------*/
+PLT_PipeInputStreamPump::PLT_PipeInputStreamPump(NPT_OutputStreamReference& output,
+ NPT_Size size) :
+ PLT_StreamPump(size),
+ m_Output(output),
+ m_LastRes(NPT_SUCCESS)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump::~PLT_PipeInputStreamPump
++---------------------------------------------------------------------*/
+PLT_PipeInputStreamPump::~PLT_PipeInputStreamPump()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump::Receive
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PipeInputStreamPump::Receive(NPT_InputStream& input,
+ NPT_Size max_bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ NPT_Size count;
+ NPT_Result res;
+
+ if ((m_LastRes == NPT_SUCCESS) || (m_LastRes == NPT_ERROR_WOULD_BLOCK)) {
+ // look at what we have buffered already from out input
+ // and if have less than what was asked, read more
+ NPT_Size available = m_RingBuffer->GetAvailable();
+ if (available < max_bytes_to_read) {
+ m_LastRes = PullData(input, max_bytes_to_read-available);
+ }
+ } else if (!m_RingBuffer->GetAvailable()) {
+ // if the buffer is now empty, return the input last error
+ return m_LastRes;
+ }
+
+ // write as much as we can on the output stream
+ res = PushData(*m_Output, count);
+
+ if (bytes_read) *bytes_read = count;
+ return res;
+}
+
+
+/*----------------------------------------------------------------------
+| PLT_PipeOutputStreamPump::PLT_PipeOutputStreamPump
++---------------------------------------------------------------------*/
+PLT_PipeOutputStreamPump::PLT_PipeOutputStreamPump(NPT_InputStreamReference& input,
+ NPT_Size size /* 65535 */,
+ NPT_Size max_bytes_to_read /* = 0 */) :
+ PLT_StreamPump(size),
+ m_Input(input),
+ m_MaxBytesToRead(max_bytes_to_read),
+ m_LastRes(NPT_SUCCESS)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeOutputStreamPump::~PLT_PipeOutputStreamPump
++---------------------------------------------------------------------*/
+PLT_PipeOutputStreamPump::~PLT_PipeOutputStreamPump()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeOutputStreamPump::Transmit
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PipeOutputStreamPump::Transmit(NPT_OutputStream& output)
+{
+ NPT_Size count;
+ NPT_Result res;
+
+ if ((m_LastRes == NPT_SUCCESS) || (m_LastRes == NPT_ERROR_WOULD_BLOCK)) {
+ // fill the entire space by default
+ NPT_Size max_space = m_RingBuffer->GetSpace();
+ if (max_space) {
+ NPT_Size max_to_read = max_space;
+ if (m_MaxBytesToRead != 0) {
+ // if a total maximum amount was set, make sure we don't read more
+ max_to_read = ((m_MaxBytesToRead - m_TotalBytesRead) < max_space) ? (m_MaxBytesToRead - m_TotalBytesRead) : max_space;
+ }
+
+ // any data to read
+ if (max_to_read) {
+ m_LastRes = PullData(*m_Input, max_to_read);
+ } else {
+ m_LastRes = NPT_ERROR_EOS;
+ }
+ }
+ } else if (!m_RingBuffer->GetAvailable()) {
+ // if the buffer is now empty, return the input last error
+ return m_LastRes;
+ }
+
+ // write as much as we can on the output stream
+ res = PushData(output, count);
+ return res;
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.h b/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.h
new file mode 100644
index 0000000..f8fa719
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.h
@@ -0,0 +1,131 @@
+/*****************************************************************
+|
+| Platinum - Stream Pump
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_STREAM_PUMP_H_
+#define _PLT_STREAM_PUMP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStream
++---------------------------------------------------------------------*/
+class PLT_PipeInputStream
+{
+public:
+ // constructor and destructor
+ virtual ~PLT_PipeInputStream() {};
+
+ // methods
+ virtual NPT_Result Receive(NPT_InputStream& stream, NPT_Size max_bytes_to_read, NPT_Size* bytes_read = 0) = 0;
+};
+
+typedef NPT_Reference<PLT_PipeInputStream> PLT_PipeInputStreamReference;
+
+/*----------------------------------------------------------------------
+| PLT_PipeOutputStream
++---------------------------------------------------------------------*/
+class PLT_PipeOutputStream
+{
+public:
+ // constructor and destructor
+ virtual ~PLT_PipeOutputStream() {};
+
+ // methods
+ virtual NPT_Result Transmit(NPT_OutputStream& stream) = 0;
+};
+
+typedef NPT_Reference<PLT_PipeOutputStream> PLT_PipeOutputStreamReference;
+
+/*----------------------------------------------------------------------
+| PLT_StreamPump class
++---------------------------------------------------------------------*/
+class PLT_StreamPump
+{
+public:
+ virtual ~PLT_StreamPump();
+
+protected:
+ // methods
+ PLT_StreamPump(NPT_Size size = 65535);
+ NPT_Result PullData(NPT_InputStream& input, NPT_Size max_bytes_to_read);
+ NPT_Result PushData(NPT_OutputStream& output, NPT_Size& bytes_written);
+
+ // members
+ NPT_RingBuffer* m_RingBuffer;
+ NPT_Offset m_TotalBytesRead;
+ NPT_Offset m_TotalBytesWritten;
+};
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump class
++---------------------------------------------------------------------*/
+class PLT_PipeInputStreamPump : public PLT_StreamPump,
+ public PLT_PipeInputStream
+{
+public:
+ PLT_PipeInputStreamPump(NPT_OutputStreamReference& output, NPT_Size size = 65535);
+ ~PLT_PipeInputStreamPump() override;
+
+ NPT_Result Receive(NPT_InputStream& input, NPT_Size max_bytes_to_read, NPT_Size* bytes_read) override;
+
+protected:
+ NPT_OutputStreamReference m_Output;
+ NPT_Result m_LastRes;
+};
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump class
++---------------------------------------------------------------------*/
+class PLT_PipeOutputStreamPump : public PLT_StreamPump,
+ public PLT_PipeOutputStream
+{
+public:
+ PLT_PipeOutputStreamPump(NPT_InputStreamReference& input,
+ NPT_Size size = 65535,
+ NPT_Size max_bytes_to_read = 0);
+ ~PLT_PipeOutputStreamPump() override;
+
+ NPT_Result Transmit(NPT_OutputStream& output) override;
+
+protected:
+ NPT_InputStreamReference m_Input;
+ NPT_Size m_MaxBytesToRead;
+ NPT_Result m_LastRes;
+};
+
+
+#endif // _PLT_STREAM_PUMP_H_
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/AndroidManifest.xml b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/AndroidManifest.xml
new file mode 100644
index 0000000..a30a0a9
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/AndroidManifest.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.plutinosoft.platinum"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk android:minSdkVersion="10" />
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name">
+ </application>
+
+</manifest> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/Android.mk b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/Android.mk
new file mode 100644
index 0000000..e39fe62
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/Android.mk
@@ -0,0 +1,52 @@
+LOCAL_PATH := $(call my-dir)
+
+PLT_ROOT := $(LOCAL_PATH)/../../../../../..
+PLT_SRC_ROOT := $(PLT_ROOT)/Source
+
+ifeq ($(NDK_DEBUG),1)
+PLT_PREBUILT_PATH := ../../../../../../Build/Targets/arm-android-linux/Debug
+else
+PLT_PREBUILT_PATH := ../../../../../../Build/Targets/arm-android-linux/Release
+endif
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := Platinum
+LOCAL_SRC_FILES := $(PLT_PREBUILT_PATH)/libPlatinum.a
+LOCAL_EXPORT_C_INCLUDES += $(PLT_SRC_ROOT)/Platinum
+LOCAL_EXPORT_C_INCLUDES += $(PLT_SRC_ROOT)/Core
+LOCAL_EXPORT_C_INCLUDES += $(PLT_SRC_ROOT)/Devices/MediaConnect
+LOCAL_EXPORT_C_INCLUDES += $(PLT_SRC_ROOT)/Devices/MediaServer
+LOCAL_EXPORT_C_INCLUDES += $(PLT_SRC_ROOT)/Devices/MediaRenderer
+LOCAL_EXPORT_C_INCLUDES += $(PLT_SRC_ROOT)/Extras
+LOCAL_C_INCLUDES += $(PLT_ROOT)/../Neptune/Source/Core
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := Neptune
+LOCAL_SRC_FILES := $(PLT_PREBUILT_PATH)/libNeptune.a
+LOCAL_EXPORT_C_INCLUDES += $(PLT_ROOT)/../Neptune/Source/Core
+include $(PREBUILT_STATIC_LIBRARY)
+
+ifneq ($(NPT_CONFIG_NO_SSL),1)
+include $(CLEAR_VARS)
+LOCAL_MODULE := axTLS
+LOCAL_SRC_FILES := $(PLT_PREBUILT_PATH)/libaxTLS.a
+include $(PREBUILT_STATIC_LIBRARY)
+endif
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := platinum-jni
+LOCAL_SRC_FILES := platinum-jni.cpp
+LOCAL_LDLIBS += -llog
+LOCAL_LDLIBS += -landroid
+
+LOCAL_CFLAGS += -DNPT_CONFIG_ENABLE_LOGGING
+
+LOCAL_STATIC_LIBRARIES := Platinum
+LOCAL_STATIC_LIBRARIES += Neptune
+
+ifneq ($(NPT_CONFIG_NO_SSL),1)
+LOCAL_STATIC_LIBRARIES += axTLS
+endif
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/Application.mk b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/Application.mk
new file mode 100644
index 0000000..d0a1e39
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI := armeabi armeabi-v7a \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/platinum-jni.cpp b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/platinum-jni.cpp
new file mode 100644
index 0000000..eb5209a
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/platinum-jni.cpp
@@ -0,0 +1,81 @@
+/*****************************************************************
+|
+| Android JNI Interface
+|
+| (c) 2002-2012 Plutinosoft LLC
+| Author: Sylvain Rebaud (sylvain@plutinosoft.com)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <assert.h>
+#include <jni.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "platinum-jni.h"
+#include "Platinum.h"
+
+#include <android/log.h>
+
+/*----------------------------------------------------------------------
+| logging
++---------------------------------------------------------------------*/
+NPT_SET_LOCAL_LOGGER("platinum.android.jni")
+
+/*----------------------------------------------------------------------
+| functions
++---------------------------------------------------------------------*/
+__attribute__((constructor)) static void onDlOpen(void)
+{
+}
+
+/*----------------------------------------------------------------------
+| JNI_OnLoad
++---------------------------------------------------------------------*/
+JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
+{
+ NPT_LogManager::GetDefault().Configure("plist:.level=FINE;.handlers=ConsoleHandler;.ConsoleHandler.outputs=2;.ConsoleHandler.colors=false;.ConsoleHandler.filter=59");
+ return JNI_VERSION_1_4;
+}
+
+/*
+ * Class: com_plutinosoft_platinum_UPnP
+ * Method: _init
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_com_plutinosoft_platinum_UPnP__1init(JNIEnv *env, jclass)
+{
+ NPT_LOG_INFO("init");
+ PLT_UPnP* self = new PLT_UPnP();
+ return (jlong)self;
+}
+
+/*
+ * Class: com_plutinosoft_platinum_UPnP
+ * Method: _start
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL Java_com_plutinosoft_platinum_UPnP__1start(JNIEnv *, jclass, jlong _self)
+{
+ NPT_LOG_INFO("start");
+ PLT_UPnP* self = (PLT_UPnP*)_self;
+
+ return self->Start();
+}
+
+/*
+ * Class: com_plutinosoft_platinum_UPnP
+ * Method: _stop
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL Java_com_plutinosoft_platinum_UPnP__1stop(JNIEnv *, jclass, jlong _self)
+{
+ NPT_LOG_INFO("stop");
+ PLT_UPnP* self = (PLT_UPnP*)_self;
+
+ return self->Stop();
+}
+
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/platinum-jni.h b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/platinum-jni.h
new file mode 100644
index 0000000..ed96e1a
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/platinum-jni.h
@@ -0,0 +1,37 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_plutinosoft_platinum_UPnP */
+
+#ifndef _Included_com_plutinosoft_platinum_UPnP
+#define _Included_com_plutinosoft_platinum_UPnP
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: com_plutinosoft_platinum_UPnP
+ * Method: _init
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_com_plutinosoft_platinum_UPnP__1init
+ (JNIEnv *, jclass);
+
+/*
+ * Class: com_plutinosoft_platinum_UPnP
+ * Method: _start
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL Java_com_plutinosoft_platinum_UPnP__1start
+ (JNIEnv *, jclass, jlong);
+
+/*
+ * Class: com_plutinosoft_platinum_UPnP
+ * Method: _stop
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL Java_com_plutinosoft_platinum_UPnP__1stop
+ (JNIEnv *, jclass, jlong);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/update-header.sh b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/update-header.sh
new file mode 100644
index 0000000..4fd611d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/jni/update-header.sh
@@ -0,0 +1 @@
+javah -o platinum-jni.h -classpath ../bin/platinum.jar com.plutinosoft.platinum.UPnP
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/proguard-project.txt b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/project.properties b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/project.properties
new file mode 100644
index 0000000..03d0617
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/project.properties
@@ -0,0 +1,15 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-10
+android.library=true
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-hdpi/ic_launcher.png b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-ldpi/ic_launcher.png b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..9923872
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-mdpi/ic_launcher.png b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-xhdpi/ic_launcher.png b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/layout/main.xml b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/layout/main.xml
new file mode 100644
index 0000000..bc12cd8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/layout/main.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical" >
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/hello" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/values/strings.xml b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/values/strings.xml
new file mode 100644
index 0000000..09d80ad
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/res/values/strings.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="hello">Hello World!</string>
+ <string name="app_name">Platinum</string>
+
+</resources> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/src/com/plutinosoft/platinum/UPnP.java b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/src/com/plutinosoft/platinum/UPnP.java
new file mode 100644
index 0000000..fc285fe
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/module/platinum/src/com/plutinosoft/platinum/UPnP.java
@@ -0,0 +1,25 @@
+package com.plutinosoft.platinum;
+
+public class UPnP {
+ public UPnP() {
+ cSelf = _init();
+ }
+
+ public int start() {
+ return _start(cSelf);
+ }
+
+ public int stop() {
+ return _stop(cSelf);
+ }
+
+ // C glue
+ private static native long _init();
+ private static native int _start(long self);
+ private static native int _stop(long self);
+ private final long cSelf;
+
+ static {
+ System.loadLibrary("platinum-jni");
+ }
+}
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/AndroidManifest.xml b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/AndroidManifest.xml
new file mode 100644
index 0000000..af402dc
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.plutinosoft.platinum.sample"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk android:minSdkVersion="10" />
+ <uses-permission android:name="android.permission.INTERNET"/>
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name" >
+ <activity
+ android:name=".PlatinumUPnPActivity"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/proguard-project.txt b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/project.properties b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/project.properties
new file mode 100644
index 0000000..69631c2
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/project.properties
@@ -0,0 +1,15 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-10
+android.library.reference.1=../../module/platinum
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-hdpi/ic_launcher.png b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-ldpi/ic_launcher.png b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..9923872
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-mdpi/ic_launcher.png b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-xhdpi/ic_launcher.png b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/layout/main.xml b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/layout/main.xml
new file mode 100644
index 0000000..046546d
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/layout/main.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical" >
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+
+ <Button
+ android:id="@+id/startStopButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentTop="true"
+ android:onClick="onStartStopButtonClicked"
+ android:text="Start" />
+
+ </RelativeLayout>
+
+</LinearLayout> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/values/strings.xml b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/values/strings.xml
new file mode 100644
index 0000000..973f71e
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/res/values/strings.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="hello">Hello World, PlatinumUPnPActivity!</string>
+ <string name="app_name">PlatinumUPnP</string>
+
+</resources> \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/src/com/plutinosoft/platinum/sample/PlatinumUPnPActivity.java b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/src/com/plutinosoft/platinum/sample/PlatinumUPnPActivity.java
new file mode 100644
index 0000000..baa3c5c
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platform/Android/samples/sample-upnp/src/com/plutinosoft/platinum/sample/PlatinumUPnPActivity.java
@@ -0,0 +1,44 @@
+package com.plutinosoft.platinum.sample;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+
+import com.plutinosoft.platinum.UPnP;
+
+public class PlatinumUPnPActivity extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ startStopButton = (Button)findViewById(R.id.startStopButton);
+ startStopButton.setEnabled(true);
+
+ upnp = new UPnP();
+ }
+
+ public void onStartStopButtonClicked(View button) {
+ if (isRunning) {
+ upnp.stop();
+ isRunning = false;
+ startStopButton.setText("Start`");
+ } else {
+ int result = upnp.start();
+ Log.d(TAG, "upnp.Start returned: " + result);
+ if (result == 0) {
+ isRunning = true;
+ startStopButton.setText("Stop");
+ }
+ }
+ }
+
+ private final String TAG = PlatinumUPnPActivity.this.getClass().getName();
+ private UPnP upnp;
+ private boolean isRunning;
+
+ private Button startStopButton;
+} \ No newline at end of file
diff --git a/lib/libUPnP/Platinum/Source/Platinum/Platinum.h b/lib/libUPnP/Platinum/Source/Platinum/Platinum.h
new file mode 100644
index 0000000..970cb8b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platinum/Platinum.h
@@ -0,0 +1,111 @@
+/*****************************************************************
+|
+| Platinum - Top Level Include
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+ ****************************************************************/
+/** @file
+ Master Header file included by Platinum client applications.
+
+ Client Applications should only need to include this file, as it
+ includes all the more specific include files required to use the API
+ */
+
+/**
+@mainpage Platinum UPnP SDK
+
+@section intro Introduction
+
+The Platinum SDK contains all the software components necessary to
+build and use the Platinum UPnP Framework. This includes
+the Platinum framework and the Neptune C++ runtime
+library.
+
+@section architecture Architecture
+
+The Platinum framework consists of a core framework that implements the UPnP
+core specifications including GENA, SOAP and SSDP. Building on top of that, the
+Platinum framework provides the foundation for UPnP AV Media Server and
+Media Renderer compliant implementations.
+
+The Platinum framework leverages the Neptune C++ runtime library which offers an
+elegant platform abstraction layer for multithreading, file system and
+network operations. Additionally, it provides support for XML parsing, string and time
+manipulation, template based linked-lists, stacks and arrays, and a configurable
+cross-platform logging system.
+
+*/
+
+#ifndef _PLATINUM_H_
+#define _PLATINUM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltCtrlPoint.h"
+#include "PltDeviceData.h"
+#include "PltHttpServer.h"
+#include "PltVersion.h"
+
+#include "PltMimeType.h"
+#include "PltProtocolInfo.h"
+#include "PltAction.h"
+#include "PltArgument.h"
+#include "PltConstants.h"
+#include "PltCtrlPointTask.h"
+#include "PltDatagramStream.h"
+#include "PltDeviceHost.h"
+#include "PltEvent.h"
+#include "PltHttp.h"
+#include "PltHttpClientTask.h"
+#include "PltHttpServer.h"
+#include "PltHttpServerTask.h"
+#include "PltService.h"
+#include "PltSsdp.h"
+#include "PltStateVariable.h"
+#include "PltTaskManager.h"
+#include "PltThreadTask.h"
+#include "PltUtilities.h"
+
+#include "PltMediaServer.h"
+#include "PltMediaBrowser.h"
+#include "PltMediaRenderer.h"
+#include "PltMediaController.h"
+#include "PltDidl.h"
+#include "PltFileMediaServer.h"
+#include "PltMediaCache.h"
+#include "PltMediaItem.h"
+#include "PltSyncMediaBrowser.h"
+
+#include "PltXbox360.h"
+#include "PltMediaConnect.h"
+
+#endif /* _PLATINUM_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Platinum/PltVersion.h b/lib/libUPnP/Platinum/Source/Platinum/PltVersion.h
new file mode 100644
index 0000000..5101009
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Platinum/PltVersion.h
@@ -0,0 +1,44 @@
+/*****************************************************************
+|
+| Platinum - Version Info
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_VERSION_H_
+#define _PLT_VERSION_H_
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define PLT_PLATINUM_SDK_VERSION 0x00010513
+#define PLT_PLATINUM_SDK_VERSION_STRING "1.0.5.13"
+
+#endif // _PLT_VERSION_H_
diff --git a/lib/libUPnP/Platinum/Source/Tests/FileMediaServer/FileMediaServerTest.cpp b/lib/libUPnP/Platinum/Source/Tests/FileMediaServer/FileMediaServerTest.cpp
new file mode 100644
index 0000000..0d1223b
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/FileMediaServer/FileMediaServerTest.cpp
@@ -0,0 +1,159 @@
+/*****************************************************************
+|
+| Platinum - Test UPnP A/V MediaServer
+|
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltFileMediaServer.h"
+
+#include <stdlib.h>
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.file.test")
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+struct Options {
+ const char* path;
+ const char* friendly_name;
+ const char* guid;
+ NPT_UInt32 port;
+} Options;
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit()
+{
+ fprintf(stderr, "usage: FileMediaServerTest [-f <friendly_name>] [-p <port>] [-g <guid>] <path>\n");
+ fprintf(stderr, "-f : optional upnp device friendly name\n");
+ fprintf(stderr, "-p : optional http port\n");
+ fprintf(stderr, "<path> : local path to serve\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| ParseCommandLine
++---------------------------------------------------------------------*/
+static void
+ParseCommandLine(char** args)
+{
+ const char* arg;
+
+ /* default values */
+ Options.path = NULL;
+ Options.friendly_name = NULL;
+ Options.guid = NULL;
+ Options.port = 0;
+
+ while ((arg = *args++)) {
+ if (!strcmp(arg, "-f")) {
+ Options.friendly_name = *args++;
+ } else if (!strcmp(arg, "-g")) {
+ Options.guid = *args++;
+ } else if (!strcmp(arg, "-p")) {
+ if (NPT_FAILED(NPT_ParseInteger32(*args++, Options.port))) {
+ fprintf(stderr, "ERROR: invalid argument\n");
+ PrintUsageAndExit();
+ }
+ } else if (Options.path == NULL) {
+ Options.path = arg;
+ } else {
+ fprintf(stderr, "ERROR: too many arguments\n");
+ PrintUsageAndExit();
+ }
+ }
+
+ /* check args */
+ if (Options.path == NULL) {
+ fprintf(stderr, "ERROR: path missing\n");
+ PrintUsageAndExit();
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /* argc */, char** argv)
+{
+ // setup Neptune logging
+ NPT_LogManager::GetDefault().Configure("plist:.level=FINE;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=56");
+
+ /* parse command line */
+ ParseCommandLine(argv+1);
+
+ /* for faster DLNA faster testing */
+ PLT_Constants::GetInstance().SetDefaultDeviceLease(NPT_TimeInterval(60.));
+
+ PLT_UPnP upnp;
+ PLT_DeviceHostReference device(
+ new PLT_FileMediaServer(
+ Options.path,
+ Options.friendly_name?Options.friendly_name:"Platinum UPnP Media Server",
+ false,
+ Options.guid, // NULL for random ID
+ (NPT_UInt16)Options.port)
+ );
+
+ NPT_List<NPT_IpAddress> list;
+ NPT_CHECK_SEVERE(PLT_UPnPMessageHelper::GetIPAddresses(list));
+ NPT_String ip = list.GetFirstItem()->ToString();
+
+ device->m_ModelDescription = "Platinum File Media Server";
+ device->m_ModelURL = "http://www.plutinosoft.com/";
+ device->m_ModelNumber = "1.0";
+ device->m_ModelName = "Platinum File Media Server";
+ device->m_Manufacturer = "Plutinosoft";
+ device->m_ManufacturerURL = "http://www.plutinosoft.com/";
+
+ upnp.AddDevice(device);
+ NPT_String uuid = device->GetUUID();
+
+ NPT_CHECK_SEVERE(upnp.Start());
+ NPT_LOG_INFO("Press 'q' to quit.");
+
+ char buf[256];
+ while (gets(buf)) {
+ if (*buf == 'q')
+ break;
+ }
+
+ upnp.Stop();
+
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Tests/Http/HttpTest.cpp b/lib/libUPnP/Platinum/Source/Tests/Http/HttpTest.cpp
new file mode 100644
index 0000000..00b1f52
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/Http/HttpTest.cpp
@@ -0,0 +1,526 @@
+/*****************************************************************
+|
+| Platinum - HTTP tests
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltTaskManager.h"
+#include "PltHttpServer.h"
+#include "PltDownloader.h"
+#include "PltRingBufferStream.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+NPT_SET_LOCAL_LOGGER("platinum.core.http.test")
+
+//#define TEST1
+//#define TEST2
+//#define TEST3
+//#define TEST4
+#define TEST5
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+struct Options {
+ NPT_UInt32 port;
+ NPT_String path;
+} Options;
+
+/*----------------------------------------------------------------------
+| PLT_HttpCustomRequestHandler
++---------------------------------------------------------------------*/
+class PLT_HttpCustomRequestHandler : public NPT_HttpRequestHandler
+{
+public:
+ // constructors
+ PLT_HttpCustomRequestHandler(NPT_InputStreamReference& body,
+ const char* mime_type,
+ bool update_content_length = false) :
+ m_Body(body),
+ m_MimeType(mime_type),
+ m_UpdateContentLength(update_content_length) {}
+
+ // NPT_HttpRequetsHandler methods
+ virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) {
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_HttpEntity* entity = response.GetEntity();
+ if (entity == NULL) return NPT_ERROR_INVALID_STATE;
+
+ entity->SetContentType(m_MimeType);
+ entity->SetInputStream(m_Body, m_UpdateContentLength);
+
+ return NPT_SUCCESS;
+ }
+
+private:
+ NPT_InputStreamReference m_Body;
+ NPT_String m_MimeType;
+ bool m_UpdateContentLength;
+};
+
+
+#ifdef TEST1
+/*----------------------------------------------------------------------
+| Test1
++---------------------------------------------------------------------*/
+static bool
+Test1(PLT_TaskManager* task_manager, NPT_HttpUrl url, NPT_Size& size)
+{
+ NPT_LOG_INFO("########### TEST 1 ######################");
+
+ NPT_MemoryStreamReference memory_stream(new NPT_MemoryStream());
+ NPT_OutputStreamReference output_stream(memory_stream);
+ PLT_Downloader downloader(task_manager, url, output_stream);
+ downloader.Start();
+
+ while (1) {
+ switch(downloader.GetState()) {
+ case PLT_DOWNLOADER_SUCCESS: {
+ size = memory_stream->GetDataSize();
+ return true;
+ }
+
+ case PLT_DOWNLOADER_ERROR:
+ return false;
+
+ default:
+ NPT_System::Sleep(NPT_TimeInterval(.1f));
+ break;
+ }
+ };
+
+ return false;
+}
+#endif
+
+#ifdef TEST2
+/*----------------------------------------------------------------------
+| DumpBody
++---------------------------------------------------------------------*/
+static NPT_Result
+ReadBody(PLT_Downloader& downloader, NPT_InputStreamReference& stream, NPT_Size& size)
+{
+ NPT_LargeSize avail;
+ char buffer[2048];
+ NPT_Result ret = NPT_ERROR_WOULD_BLOCK;
+
+ /* reset output param first */
+ size = 0;
+
+ /*
+ we test for availability first to avoid
+ getting stuck in Read forever in case blocking is true
+ and the download is done writing to the stream
+ */
+ NPT_CHECK(stream->GetAvailable(avail));
+
+ if (avail) {
+ ret = stream->Read(buffer, 2048, &size);
+ NPT_LOG_FINER_2("Read %d bytes (result = %d)\n", size, ret);
+ return ret;
+ } else {
+ Plt_DowloaderState state = downloader.GetState();
+ switch (state) {
+ case PLT_DOWNLOADER_ERROR:
+ return NPT_FAILURE;
+
+ case PLT_DOWNLOADER_SUCCESS:
+ /* no more data expected */
+ return NPT_ERROR_EOS;
+
+ default:
+ NPT_System::Sleep(NPT_TimeInterval(.1f));
+ break;
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| Test2
++---------------------------------------------------------------------*/
+static bool
+Test2(PLT_TaskManager* task_manager, NPT_HttpUrl url, NPT_Size& size)
+{
+ NPT_LOG_INFO("########### TEST 2 ######################");
+
+ /* reset output param first */
+ size = 0;
+
+ PLT_RingBufferStreamReference ringbuffer_stream(new PLT_RingBufferStream());
+ NPT_OutputStreamReference output_stream(ringbuffer_stream);
+ NPT_InputStreamReference input_stream(ringbuffer_stream);
+ PLT_Downloader downloader(task_manager, url, output_stream);
+ downloader.Start();
+
+ while (1) {
+ switch(downloader.GetState()) {
+ case PLT_DOWNLOADER_SUCCESS:
+ ringbuffer_stream->SetEOS();
+ /* fallthrough */
+
+ case PLT_DOWNLOADER_DOWNLOADING: {
+ NPT_Size bytes_read;
+ NPT_Result res = ReadBody(downloader, input_stream, bytes_read);
+ if (NPT_FAILED(res)) {
+ return (res==NPT_ERROR_EOS)?true:false;
+ }
+ size += bytes_read;
+ }
+ break;
+
+ case PLT_DOWNLOADER_ERROR:
+ return false;
+
+ default:
+ NPT_System::Sleep(NPT_TimeInterval(.1f));
+ break;
+ }
+ };
+
+ return false;
+}
+#endif
+
+
+#ifdef TEST3
+class RingBufferWriterTask : public PLT_ThreadTask
+{
+public:
+ RingBufferWriterTask(PLT_RingBufferStreamReference& ringbuffer_stream)
+ : m_RingBufferStream(ringbuffer_stream) {}
+
+ // PLT_ThreadTask methods
+ virtual void DoRun() {
+ char buffer[32768];
+ m_RingBufferStream->WriteFully(buffer, 32768);
+
+ /* mark as done */
+ m_RingBufferStream->SetEOS();
+ }
+
+private:
+ PLT_RingBufferStreamReference m_RingBufferStream;
+};
+
+/*----------------------------------------------------------------------
+| Test3
++---------------------------------------------------------------------*/
+static bool
+Test3(PLT_TaskManager* task_manager, NPT_HttpUrl url, PLT_RingBufferStreamReference& ringbuffer_stream, NPT_Size& size)
+{
+ NPT_LOG_INFO("########### TEST 3 ######################");
+
+ /* reset output param first */
+ size = 0;
+
+ NPT_MemoryStreamReference memory_stream(new NPT_MemoryStream());
+ NPT_OutputStreamReference output_stream(memory_stream);
+ PLT_Downloader downloader(task_manager, url, output_stream);
+ downloader.Start();
+
+ /* asynchronously write onto ring buffer stream */
+ task_manager->StartTask(new RingBufferWriterTask(ringbuffer_stream));
+
+ /* start pulling data */
+ while (1) {
+ switch(downloader.GetState()) {
+ case PLT_DOWNLOADER_SUCCESS:
+ size = memory_stream->GetDataSize();
+ return true;
+
+ case PLT_DOWNLOADER_ERROR:
+ return false;
+
+ default:
+ NPT_System::Sleep(NPT_TimeInterval(.1f));
+ break;
+ }
+ };
+
+ return false;
+}
+#endif
+
+#ifdef TEST4
+class ClientStuckTask : public PLT_ThreadTask
+{
+public:
+ ClientStuckTask(NPT_HttpUrl& url, NPT_HttpClient& client)
+ : m_Url(url), m_Client(client) {}
+
+ // PLT_ThreadTask methods
+ virtual void DoRun() {
+ NPT_HttpRequest request(m_Url, NPT_HTTP_METHOD_GET);
+ NPT_HttpResponse* response = NULL;
+ m_Client.SendRequest(request, response);
+ }
+
+ virtual void DoAbort() {
+ m_Client.Abort();
+ }
+
+private:
+ NPT_HttpUrl m_Url;
+ NPT_HttpClient& m_Client;
+ bool m_Aborted;
+};
+/*----------------------------------------------------------------------
+| Test4
++---------------------------------------------------------------------*/
+static bool
+Test4(PLT_TaskManager* task_manager, NPT_HttpUrl url, NPT_TimeInterval wait_before_kill)
+{
+ NPT_LOG_INFO("########### TEST 4 ######################");
+
+ NPT_HttpClient client;
+
+ /* start task to asynchronously fetch url */
+ ClientStuckTask* task = new ClientStuckTask(url, client);
+ task_manager->StartTask(task, NULL, false);
+
+ /* wait a bit and abort client */
+ NPT_System::Sleep(wait_before_kill);
+
+ task->Kill();
+ return true;
+}
+#endif
+
+#ifdef TEST5
+/*----------------------------------------------------------------------
+| Test5
++---------------------------------------------------------------------*/
+static bool
+Test5(NPT_HttpUrl url)
+{
+ NPT_LOG_INFO("########### TEST 5 ######################");
+
+ NPT_HttpClient client;
+
+ // first request
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_POST, NPT_HTTP_PROTOCOL_1_1);
+ NPT_HttpEntity* request_entity = new NPT_HttpEntity();
+ request_entity->SetInputStream("Testing");
+ request.SetEntity(request_entity);
+
+ NPT_HttpResponse* response = NULL;
+ client.SendRequest(request, response);
+ NPT_HttpEntity* entity = NULL;
+ if (response && (entity = response->GetEntity())) {
+ NPT_DataBuffer buffer;
+ if (NPT_FAILED(entity->Load(buffer))) return false;
+ }
+
+ // try again
+ delete response;
+ response = NULL;
+ request_entity = new NPT_HttpEntity();
+ request_entity->SetInputStream("Testing2");
+ request.SetEntity(request_entity);
+ client.SendRequest(request, response);
+ entity = NULL;
+ if (response && (entity = response->GetEntity())) {
+ NPT_DataBuffer buffer;
+ if (NPT_FAILED(entity->Load(buffer))) return false;
+ }
+
+ return true;
+}
+#endif
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(char** args)
+{
+ fprintf(stderr, "usage: %s [-p <port>] [-f <filepath>]\n", args[0]);
+ fprintf(stderr, "-p : optional server port\n");
+ fprintf(stderr, "-f : optional local filepath to serve\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| ParseCommandLine
++---------------------------------------------------------------------*/
+static void
+ParseCommandLine(char** args)
+{
+ const char* arg;
+ char** tmp = args+1;
+
+ /* default values */
+ Options.port = 0;
+ Options.path = "";
+
+ while ((arg = *tmp++)) {
+ if (Options.port == 0 && !strcmp(arg, "-p")) {
+ NPT_UInt32 port;
+ if (NPT_FAILED(NPT_ParseInteger32(*tmp++, port, false))) {
+ fprintf(stderr, "ERROR: invalid port\n");
+ exit(1);
+ }
+ Options.port = port;
+ } else if (Options.path.IsEmpty() && !strcmp(arg, "-f")) {
+ Options.path = *tmp++;
+ } else {
+ fprintf(stderr, "ERROR: too many arguments\n");
+ PrintUsageAndExit(args);
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ NPT_COMPILER_UNUSED(argc);
+
+ NPT_HttpRequestHandler* handler;
+ NPT_Reference<NPT_DataBuffer> buffer;
+ bool result;
+
+ /* parse command line */
+ ParseCommandLine(argv);
+
+ /* create http server */
+ PLT_HttpServer http_server(Options.port?Options.port:8089);
+ NPT_String url;
+
+ if (!Options.path.IsEmpty()) {
+ /* extract folder path */
+ int index1 = Options.path.ReverseFind('\\');
+ int index2 = Options.path.ReverseFind('/');
+ if (index1 <= 0 && index2 <=0) {
+ fprintf(stderr, "ERROR: invalid path\n");
+ exit(1);
+ }
+
+ NPT_FileInfo info;
+ NPT_CHECK_SEVERE(NPT_File::GetInfo(Options.path, &info));
+
+ /* add file request handler */
+ handler = new NPT_HttpFileRequestHandler(
+ Options.path.Left(index1>index2?index1:index2),
+ "/");
+ http_server.AddRequestHandler(handler, "/", true);
+
+ /* build url */
+ url = "/" + Options.path.SubString((index1>index2?index1:index2)+1);
+ } else {
+ /* create random garbage data */
+ buffer = new NPT_DataBuffer(32768);
+ buffer->SetDataSize(32768);
+
+ /* add static handler */
+ handler = new NPT_HttpStaticRequestHandler(buffer->GetData(),
+ buffer->GetDataSize(),
+ "application/octet-stream");
+ http_server.AddRequestHandler(handler, "/test");
+
+ /* build url */
+ url = "/test";
+ }
+
+ /* add custom handler */
+ PLT_RingBufferStreamReference ringbuffer_stream(new PLT_RingBufferStream());
+ NPT_InputStreamReference stream(ringbuffer_stream);
+ NPT_HttpRequestHandler* custom_handler = new PLT_HttpCustomRequestHandler(stream, "text/xml");
+ http_server.AddRequestHandler(custom_handler, "/custom");
+
+ /* start server */
+ NPT_CHECK_SEVERE(http_server.Start());
+
+ /* a task manager for the tests downloader */
+ PLT_TaskManager task_manager;
+
+ /* small delay to let the server start */
+ NPT_System::Sleep(NPT_TimeInterval(1.f));
+
+ /* execute tests */
+ NPT_Size size;
+ NPT_COMPILER_UNUSED(size);
+
+#ifdef TEST1
+ result = Test1(&task_manager, NPT_HttpUrl("127.0.0.1", http_server.GetPort(), url), size);
+ if (!result) return -1;
+#endif
+
+#ifdef TEST2
+ result = Test2(&task_manager, NPT_HttpUrl("127.0.0.1", http_server.GetPort(), url), size);
+ if (!result) return -1;
+#endif
+
+#ifdef TEST3
+ result = Test3(&task_manager, NPT_HttpUrl("127.0.0.1", http_server.GetPort(), "/custom"), ringbuffer_stream, size);
+ if (!result) return -1;
+#endif
+
+#ifdef TEST4
+ result = Test4(&task_manager, NPT_HttpUrl("127.0.0.1", http_server.GetPort(), "/custom"), NPT_TimeInterval(.1f));
+ if (!result) return -1;
+
+ result = Test4(&task_manager, NPT_HttpUrl("127.0.0.1", http_server.GetPort(), "/custom"), NPT_TimeInterval(1.f));
+ if (!result) return -1;
+
+ result = Test4(&task_manager, NPT_HttpUrl("127.0.0.1", http_server.GetPort(), "/custom"), NPT_TimeInterval(2.f));
+ if (!result) return -1;
+#endif
+
+#ifdef TEST5
+ result = Test5(NPT_HttpUrl("127.0.0.1", http_server.GetPort(), "/test"));
+ if (!result) return -1;
+#endif
+
+ NPT_System::Sleep(NPT_TimeInterval(1.f));
+
+ // abort server tasks that are waiting on ring buffer stream
+ ringbuffer_stream->Abort();
+
+ http_server.Stop();
+
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Tests/LightSample/LightSampleTest.cpp b/lib/libUPnP/Platinum/Source/Tests/LightSample/LightSampleTest.cpp
new file mode 100644
index 0000000..d9f35a0
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/LightSample/LightSampleTest.cpp
@@ -0,0 +1,76 @@
+/*****************************************************************
+|
+| Platinum - Test Light Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltLightSample.h"
+
+#define TEST_EMBEDDED_DEVICE 1
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /* argc */, char** /* argv */)
+{
+ // setup Neptune logging
+ NPT_LogManager::GetDefault().Configure("plist:.level=FINE;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=42");
+
+ PLT_UPnP upnp;
+
+ PLT_DeviceHostReference device(new PLT_LightSampleDevice("Platinum Light Bulb"));
+
+#ifdef TEST_EMBEDDED_DEVICE
+ PLT_DeviceDataReference device2(new PLT_LightSampleDevice("Platinum Light Bulb embed 1"));
+ device->AddEmbeddedDevice((PLT_DeviceDataReference&)device2);
+
+ PLT_DeviceDataReference device3(new PLT_LightSampleDevice("Platinum Light Bulb embed 2"));
+ device->AddEmbeddedDevice(device3);
+#endif
+
+ upnp.AddDevice(device);
+ upnp.Start();
+
+ char buf[256];
+ while (gets(buf)) {
+ if (*buf == 'q')
+ break;
+ }
+
+ upnp.Stop();
+
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Tests/LightSample/PltLightSample.cpp b/lib/libUPnP/Platinum/Source/Tests/LightSample/PltLightSample.cpp
new file mode 100644
index 0000000..f31ffe1
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/LightSample/PltLightSample.cpp
@@ -0,0 +1,171 @@
+/*****************************************************************
+|
+| Platinum - Light Sample Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "Platinum.h"
+#include "PltLightSample.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.test.lightsample")
+
+/*----------------------------------------------------------------------
+| forward references
++---------------------------------------------------------------------*/
+extern NPT_UInt8 SCPDXML[];
+
+/*----------------------------------------------------------------------
+| PLT_LightSampleDevice::PLT_LightSampleDevice
++---------------------------------------------------------------------*/
+PLT_LightSampleDevice::PLT_LightSampleDevice(const char* FriendlyName, const char* UUID) :
+ PLT_DeviceHost("/", UUID, "urn:schemas-upnp-org:device:SwitchPower:1", FriendlyName)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_LightSampleDevice::~PLT_LightSampleDevice
++---------------------------------------------------------------------*/
+PLT_LightSampleDevice::~PLT_LightSampleDevice()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_LightSampleDevice::SetupServices
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_LightSampleDevice::SetupServices()
+{
+ NPT_Result res;
+ PLT_Service* service = new PLT_Service(
+ this,
+ "urn:schemas-upnp-org:service:SwitchPower:1",
+ "urn:upnp-org:serviceId:SwitchPower.001",
+ "SwitchPower");
+ NPT_CHECK_LABEL_FATAL(res = service->SetSCPDXML((const char*)SCPDXML), failure);
+ NPT_CHECK_LABEL_FATAL(res = AddService(service), failure);
+
+ service->SetStateVariable("Status", "True");
+
+ return NPT_SUCCESS;
+
+failure:
+ delete service;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_LightSampleDevice::OnAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_LightSampleDevice::OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ /* parse the action name */
+ NPT_String name = action->GetActionDesc().GetName();
+ if (name.Compare("SetTarget") == 0) {
+ NPT_String value;
+ action->GetArgumentValue("newTargetValue", value);
+
+ PLT_StateVariable* variable = action->GetActionDesc().GetService()->FindStateVariable("Status");
+ if (NPT_FAILED(variable->SetValue(value))) {
+ action->SetError(402, "Invalid Args");
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+ } else if (name.Compare("GetStatus") == 0) {
+ PLT_StateVariable* variable = action->GetActionDesc().GetService()->FindStateVariable("Status");
+ if (variable) {
+ action->SetArgumentValue("ResultStatus", variable->GetValue());
+ return NPT_SUCCESS;
+ }
+ }
+
+ action->SetError(501, "Action Failed");
+ return NPT_FAILURE;
+}
+
+NPT_UInt8 SCPDXML[957] =
+{
+ 0x20, 0x20, 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30,
+ 0x22, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x20, 0x3F,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75,
+ 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A,
+ 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x73, 0x70,
+ 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72,
+ 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x6F,
+ 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x70,
+ 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20,
+ 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x6E, 0x65, 0x77, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x73,
+ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x20,
+ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x62, 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x3C, 0x2F,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x61, 0x72, 0x67, 0x65,
+ 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x62, 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E
+};
diff --git a/lib/libUPnP/Platinum/Source/Tests/LightSample/PltLightSample.h b/lib/libUPnP/Platinum/Source/Tests/LightSample/PltLightSample.h
new file mode 100644
index 0000000..a23e8ff
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/LightSample/PltLightSample.h
@@ -0,0 +1,59 @@
+/*****************************************************************
+|
+| Platinum - Light Sample Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_LIGHT_SAMPLE_H_
+#define _PLT_LIGHT_SAMPLE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDeviceHost.h"
+
+/*----------------------------------------------------------------------
+| PLT_LightSampleDevice class
++---------------------------------------------------------------------*/
+class PLT_LightSampleDevice : public PLT_DeviceHost
+{
+public:
+ PLT_LightSampleDevice(const char* FriendlyName,
+ const char* UUID = "");
+ virtual ~PLT_LightSampleDevice();
+
+ // PLT_DeviceHost methods
+ virtual NPT_Result SetupServices();
+ virtual NPT_Result OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+};
+
+#endif /* _PLT_LIGHT_SAMPLE_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaRenderer/MediaRendererTest.cpp b/lib/libUPnP/Platinum/Source/Tests/MediaRenderer/MediaRendererTest.cpp
new file mode 100644
index 0000000..54d9d24
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaRenderer/MediaRendererTest.cpp
@@ -0,0 +1,121 @@
+/*****************************************************************
+|
+| Platinum - Test UPnP A/V MediaRenderer
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltMediaRenderer.h"
+
+#include <stdlib.h>
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+struct Options {
+ const char* friendly_name;
+} Options;
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(char** args)
+{
+ fprintf(stderr, "usage: %s [-f <friendly_name>]\n", args[0]);
+ fprintf(stderr, "-f : optional upnp server friendly name\n");
+ fprintf(stderr, "<path> : local path to serve\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| ParseCommandLine
++---------------------------------------------------------------------*/
+static void
+ParseCommandLine(char** args)
+{
+ const char* arg;
+ char** tmp = args+1;
+
+ /* default values */
+ Options.friendly_name = NULL;
+
+ while ((arg = *tmp++)) {
+ if (!strcmp(arg, "-f")) {
+ Options.friendly_name = *tmp++;
+ } else {
+ fprintf(stderr, "ERROR: too many arguments\n");
+ PrintUsageAndExit(args);
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /* argc */, char** argv)
+{
+ PLT_UPnP upnp;
+
+ /* parse command line */
+ ParseCommandLine(argv);
+
+ PLT_DeviceHostReference device(
+ new PLT_MediaRenderer(Options.friendly_name?Options.friendly_name:"Platinum Media Renderer",
+ false,
+ "e6572b54-f3c7-2d91-2fb5-b757f2537e21"));
+ upnp.AddDevice(device);
+ bool added = true;
+
+ upnp.Start();
+
+ char buf[256];
+ while (gets(buf)) {
+ if (*buf == 'q')
+ break;
+
+ if (*buf == 's') {
+ if (added) {
+ upnp.RemoveDevice(device);
+ } else {
+ upnp.AddDevice(device);
+ }
+ added = !added;
+ }
+ }
+
+ upnp.Stop();
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/English.lproj/InfoPlist.strings b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/English.lproj/InfoPlist.strings
new file mode 100644
index 0000000..b92732c
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/English.lproj/InfoPlist.strings
@@ -0,0 +1 @@
+/* Localized versions of Info.plist keys */
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/English.lproj/MainMenu.xib b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/English.lproj/MainMenu.xib
new file mode 100644
index 0000000..8d4fb5c
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/English.lproj/MainMenu.xib
@@ -0,0 +1,3224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">10F569</string>
+ <string key="IBDocument.InterfaceBuilderVersion">788</string>
+ <string key="IBDocument.AppKitVersion">1038.29</string>
+ <string key="IBDocument.HIToolboxVersion">461.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">788</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="2"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="53522055">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="493647166">
+ <object class="NSMutableString" key="NSClassName">
+ <characters key="NS.bytes">NSApplication</characters>
+ </object>
+ </object>
+ <object class="NSCustomObject" id="909243075">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="547858435">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="483958638">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{6, 593}, {480, 360}}</string>
+ <int key="NSWTFlags">1886912512</int>
+ <string key="NSWindowTitle">MediaServerCocoaTest</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSWindowContentMinSize">{213, 107}</string>
+ <object class="NSView" key="NSWindowView" id="823886803">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButton" id="544612128">
+ <reference key="NSNextResponder" ref="823886803"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{19, 312}, {96, 32}}</string>
+ <reference key="NSSuperview" ref="823886803"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="879879405">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Start</string>
+ <object class="NSFont" key="NSSupport" id="293448079">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="544612128"/>
+ <int key="NSButtonFlags">-927579905</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="293448079"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{480, 360}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
+ <string key="NSMinSize">{213, 129}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ </object>
+ <object class="NSMenu" id="1055885701">
+ <string key="NSTitle">MainMenu</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="376192112">
+ <reference key="NSMenu" ref="1055885701"/>
+ <string key="NSTitle">MediaServerCocoaTest</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <object class="NSCustomResource" key="NSOnImage" id="893455832">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="424226900">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="123765298">
+ <string key="NSTitle">MediaServerCocoaTest</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="743093781">
+ <reference key="NSMenu" ref="123765298"/>
+ <string key="NSTitle">About MediaServerCocoaTest</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="791044830">
+ <reference key="NSMenu" ref="123765298"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="124073989">
+ <reference key="NSMenu" ref="123765298"/>
+ <string key="NSTitle">Preferences…</string>
+ <string key="NSKeyEquiv">,</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="621602699">
+ <reference key="NSMenu" ref="123765298"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="515282677">
+ <reference key="NSMenu" ref="123765298"/>
+ <string key="NSTitle">Services</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="939189088">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">Services</characters>
+ </object>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <string key="NSName">_NSServicesMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="931166327">
+ <reference key="NSMenu" ref="123765298"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="780549861">
+ <reference key="NSMenu" ref="123765298"/>
+ <string key="NSTitle">Hide MediaServerCocoaTest</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="514007154">
+ <reference key="NSMenu" ref="123765298"/>
+ <string key="NSTitle">Hide Others</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="163840636">
+ <reference key="NSMenu" ref="123765298"/>
+ <string key="NSTitle">Show All</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="901869444">
+ <reference key="NSMenu" ref="123765298"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="349823970">
+ <reference key="NSMenu" ref="123765298"/>
+ <string key="NSTitle">Quit MediaServerCocoaTest</string>
+ <string key="NSKeyEquiv">q</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ <string key="NSName">_NSAppleMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="842783111">
+ <reference key="NSMenu" ref="1055885701"/>
+ <string key="NSTitle">File</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="960517776">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">File</characters>
+ </object>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="1005751409">
+ <reference key="NSMenu" ref="960517776"/>
+ <string key="NSTitle">Save</string>
+ <string key="NSKeyEquiv">s</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="402151840">
+ <reference key="NSMenu" ref="960517776"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="620705007">
+ <reference key="NSMenu" ref="960517776"/>
+ <string key="NSTitle">Page Setup…</string>
+ <string key="NSKeyEquiv">P</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="51940822">
+ <reference key="NSMenu" ref="960517776"/>
+ <string key="NSTitle">Print…</string>
+ <string key="NSKeyEquiv">p</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="545718297">
+ <reference key="NSMenu" ref="1055885701"/>
+ <string key="NSTitle">Edit</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="1022019938">
+ <string key="NSTitle">Edit</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="307109690">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Undo</string>
+ <string key="NSKeyEquiv">z</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="744402274">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Redo</string>
+ <string key="NSKeyEquiv">Z</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="831119715">
+ <reference key="NSMenu" ref="1022019938"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="70873500">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Cut</string>
+ <string key="NSKeyEquiv">x</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="808304593">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Copy</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="597871667">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Paste</string>
+ <string key="NSKeyEquiv">v</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="324532357">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Paste and Match Style</string>
+ <string key="NSKeyEquiv">V</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="618358412">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Delete</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="883438165">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Select All</string>
+ <string key="NSKeyEquiv">a</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="473717252">
+ <reference key="NSMenu" ref="1022019938"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="69846141">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Find</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="216314426">
+ <string key="NSTitle">Find</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="914446540">
+ <reference key="NSMenu" ref="216314426"/>
+ <string key="NSTitle">Find…</string>
+ <string key="NSKeyEquiv">f</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <int key="NSTag">1</int>
+ </object>
+ <object class="NSMenuItem" id="160366792">
+ <reference key="NSMenu" ref="216314426"/>
+ <string key="NSTitle">Find Next</string>
+ <string key="NSKeyEquiv">g</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <int key="NSTag">2</int>
+ </object>
+ <object class="NSMenuItem" id="248661547">
+ <reference key="NSMenu" ref="216314426"/>
+ <string key="NSTitle">Find Previous</string>
+ <string key="NSKeyEquiv">G</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <int key="NSTag">3</int>
+ </object>
+ <object class="NSMenuItem" id="30033296">
+ <reference key="NSMenu" ref="216314426"/>
+ <string key="NSTitle">Use Selection for Find</string>
+ <string key="NSKeyEquiv">e</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <int key="NSTag">7</int>
+ </object>
+ <object class="NSMenuItem" id="827334636">
+ <reference key="NSMenu" ref="216314426"/>
+ <string key="NSTitle">Jump to Selection</string>
+ <string key="NSKeyEquiv">j</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="365048869">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Spelling and Grammar</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="666968844">
+ <string key="NSTitle">Spelling</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="356339891">
+ <reference key="NSMenu" ref="666968844"/>
+ <string key="NSTitle">Show Spelling and Grammar</string>
+ <string key="NSKeyEquiv">:</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="416352713">
+ <reference key="NSMenu" ref="666968844"/>
+ <string key="NSTitle">Check Document Now</string>
+ <string key="NSKeyEquiv">;</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="47615281">
+ <reference key="NSMenu" ref="666968844"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="252035059">
+ <reference key="NSMenu" ref="666968844"/>
+ <string key="NSTitle">Check Spelling While Typing</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="286376998">
+ <reference key="NSMenu" ref="666968844"/>
+ <string key="NSTitle">Check Grammar With Spelling</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="81755183">
+ <reference key="NSMenu" ref="666968844"/>
+ <string key="NSTitle">Correct Spelling Automatically</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="958645126">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Substitutions</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="218631249">
+ <string key="NSTitle">Substitutions</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="64764928">
+ <reference key="NSMenu" ref="218631249"/>
+ <string key="NSTitle">Show Substitutions</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="136936362">
+ <reference key="NSMenu" ref="218631249"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="607672977">
+ <reference key="NSMenu" ref="218631249"/>
+ <string key="NSTitle">Smart Copy/Paste</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="484928874">
+ <reference key="NSMenu" ref="218631249"/>
+ <string key="NSTitle">Smart Quotes</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="693070189">
+ <reference key="NSMenu" ref="218631249"/>
+ <string key="NSTitle">Smart Dashes</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="1059551809">
+ <reference key="NSMenu" ref="218631249"/>
+ <string key="NSTitle">Smart Links</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="416554597">
+ <reference key="NSMenu" ref="218631249"/>
+ <string key="NSTitle">Text Replacement</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="814247416">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Transformations</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="562140037">
+ <string key="NSTitle">Transformations</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="698135111">
+ <reference key="NSMenu" ref="562140037"/>
+ <string key="NSTitle">Make Upper Case</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="899181471">
+ <reference key="NSMenu" ref="562140037"/>
+ <string key="NSTitle">Make Lower Case</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="582459168">
+ <reference key="NSMenu" ref="562140037"/>
+ <string key="NSTitle">Capitalize</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="1058116061">
+ <reference key="NSMenu" ref="1022019938"/>
+ <string key="NSTitle">Speech</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="792127484">
+ <string key="NSTitle">Speech</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="318734362">
+ <reference key="NSMenu" ref="792127484"/>
+ <string key="NSTitle">Start Speaking</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="612849471">
+ <reference key="NSMenu" ref="792127484"/>
+ <string key="NSTitle">Stop Speaking</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="259022320">
+ <reference key="NSMenu" ref="1055885701"/>
+ <string key="NSTitle">Format</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="708542952">
+ <string key="NSTitle">Format</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="1044121641">
+ <reference key="NSMenu" ref="708542952"/>
+ <string key="NSTitle">Font</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="16789759">
+ <string key="NSTitle">Font</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="486510693">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Show Fonts</string>
+ <string key="NSKeyEquiv">t</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="322671057">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Bold</string>
+ <string key="NSKeyEquiv">b</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <int key="NSTag">2</int>
+ </object>
+ <object class="NSMenuItem" id="294925675">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Italic</string>
+ <string key="NSKeyEquiv">i</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <int key="NSTag">1</int>
+ </object>
+ <object class="NSMenuItem" id="386587767">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Underline</string>
+ <string key="NSKeyEquiv">u</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="530490813">
+ <reference key="NSMenu" ref="16789759"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="791073707">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Bigger</string>
+ <string key="NSKeyEquiv">+</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <int key="NSTag">3</int>
+ </object>
+ <object class="NSMenuItem" id="820131188">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Smaller</string>
+ <string key="NSKeyEquiv">-</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <int key="NSTag">4</int>
+ </object>
+ <object class="NSMenuItem" id="593643800">
+ <reference key="NSMenu" ref="16789759"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="17067790">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Kern</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="277000559">
+ <string key="NSTitle">Kern</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="53041874">
+ <reference key="NSMenu" ref="277000559"/>
+ <string key="NSTitle">Use Default</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="665619559">
+ <reference key="NSMenu" ref="277000559"/>
+ <string key="NSTitle">Use None</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="807093337">
+ <reference key="NSMenu" ref="277000559"/>
+ <string key="NSTitle">Tighten</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="81316040">
+ <reference key="NSMenu" ref="277000559"/>
+ <string key="NSTitle">Loosen</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="654563803">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Ligature</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="164619877">
+ <string key="NSTitle">Ligature</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="291130592">
+ <reference key="NSMenu" ref="164619877"/>
+ <string key="NSTitle">Use Default</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="557989785">
+ <reference key="NSMenu" ref="164619877"/>
+ <string key="NSTitle">Use None</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="8023761">
+ <reference key="NSMenu" ref="164619877"/>
+ <string key="NSTitle">Use All</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="35184653">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Baseline</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="1040787833">
+ <string key="NSTitle">Baseline</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="299485767">
+ <reference key="NSMenu" ref="1040787833"/>
+ <string key="NSTitle">Use Default</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="362581379">
+ <reference key="NSMenu" ref="1040787833"/>
+ <string key="NSTitle">Superscript</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="368049810">
+ <reference key="NSMenu" ref="1040787833"/>
+ <string key="NSTitle">Subscript</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="650703522">
+ <reference key="NSMenu" ref="1040787833"/>
+ <string key="NSTitle">Raise</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="470064337">
+ <reference key="NSMenu" ref="1040787833"/>
+ <string key="NSTitle">Lower</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="638669489">
+ <reference key="NSMenu" ref="16789759"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="169445129">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Show Colors</string>
+ <string key="NSKeyEquiv">C</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="511988305">
+ <reference key="NSMenu" ref="16789759"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="637704817">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Copy Style</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="684848834">
+ <reference key="NSMenu" ref="16789759"/>
+ <string key="NSTitle">Paste Style</string>
+ <string key="NSKeyEquiv">v</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ <string key="NSName">_NSFontMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="446410933">
+ <reference key="NSMenu" ref="708542952"/>
+ <string key="NSTitle">Text</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="640850853">
+ <string key="NSTitle">Text</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="775088230">
+ <reference key="NSMenu" ref="640850853"/>
+ <string key="NSTitle">Align Left</string>
+ <string key="NSKeyEquiv">{</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="20804296">
+ <reference key="NSMenu" ref="640850853"/>
+ <string key="NSTitle">Center</string>
+ <string key="NSKeyEquiv">|</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="489997371">
+ <reference key="NSMenu" ref="640850853"/>
+ <string key="NSTitle">Justify</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="766941912">
+ <reference key="NSMenu" ref="640850853"/>
+ <string key="NSTitle">Align Right</string>
+ <string key="NSKeyEquiv">}</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="831789293">
+ <reference key="NSMenu" ref="640850853"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="473944779">
+ <reference key="NSMenu" ref="640850853"/>
+ <string key="NSTitle">Show Ruler</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="405928732">
+ <reference key="NSMenu" ref="640850853"/>
+ <string key="NSTitle">Copy Ruler</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1310720</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="784305476">
+ <reference key="NSMenu" ref="640850853"/>
+ <string key="NSTitle">Paste Ruler</string>
+ <string key="NSKeyEquiv">v</string>
+ <int key="NSKeyEquivModMask">1310720</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="147235865">
+ <reference key="NSMenu" ref="1055885701"/>
+ <string key="NSTitle">View</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="877676881">
+ <string key="NSTitle">View</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="653321099">
+ <reference key="NSMenu" ref="877676881"/>
+ <string key="NSTitle">Show Toolbar</string>
+ <string key="NSKeyEquiv">t</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="854660346">
+ <reference key="NSMenu" ref="877676881"/>
+ <string key="NSTitle">Customize Toolbar…</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="560112995">
+ <reference key="NSMenu" ref="1055885701"/>
+ <string key="NSTitle">Window</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="747245393">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">Window</characters>
+ </object>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="814052996">
+ <reference key="NSMenu" ref="747245393"/>
+ <string key="NSTitle">Minimize</string>
+ <string key="NSKeyEquiv">m</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="319459889">
+ <reference key="NSMenu" ref="747245393"/>
+ <string key="NSTitle">Zoom</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="1042829312">
+ <reference key="NSMenu" ref="747245393"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ <object class="NSMenuItem" id="1057689233">
+ <reference key="NSMenu" ref="747245393"/>
+ <string key="NSTitle">Bring All to Front</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ <string key="NSName">_NSWindowsMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="713319646">
+ <reference key="NSMenu" ref="1055885701"/>
+ <string key="NSTitle">Help</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="508081226">
+ <string key="NSTitle">Help</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="954120217">
+ <reference key="NSMenu" ref="508081226"/>
+ <string key="NSTitle">MediaServerCocoaTest Help</string>
+ <string key="NSKeyEquiv">?</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="893455832"/>
+ <reference key="NSMixedImage" ref="424226900"/>
+ </object>
+ </object>
+ <string key="NSName">_NSHelpMenu</string>
+ </object>
+ </object>
+ </object>
+ <string key="NSName">_NSMainMenu</string>
+ </object>
+ <object class="NSCustomObject" id="612578685">
+ <string key="NSClassName">MediaServerCocoaTest_AppDelegate</string>
+ </object>
+ <object class="NSCustomObject" id="39582327">
+ <string key="NSClassName">NSFontManager</string>
+ </object>
+ <object class="NSCustomObject" id="770142414">
+ <string key="NSClassName">MediaServerCocoaTestController</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">print:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="51940822"/>
+ </object>
+ <int key="connectionID">86</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">runPageLayout:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="620705007"/>
+ </object>
+ <int key="connectionID">87</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">terminate:</string>
+ <reference key="source" ref="493647166"/>
+ <reference key="destination" ref="349823970"/>
+ </object>
+ <int key="connectionID">139</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">orderFrontStandardAboutPanel:</string>
+ <reference key="source" ref="493647166"/>
+ <reference key="destination" ref="743093781"/>
+ </object>
+ <int key="connectionID">142</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hideOtherApplications:</string>
+ <reference key="source" ref="493647166"/>
+ <reference key="destination" ref="514007154"/>
+ </object>
+ <int key="connectionID">146</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hide:</string>
+ <reference key="source" ref="493647166"/>
+ <reference key="destination" ref="780549861"/>
+ </object>
+ <int key="connectionID">152</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">unhideAllApplications:</string>
+ <reference key="source" ref="493647166"/>
+ <reference key="destination" ref="163840636"/>
+ </object>
+ <int key="connectionID">153</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="493647166"/>
+ <reference key="destination" ref="612578685"/>
+ </object>
+ <int key="connectionID">206</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="483958638"/>
+ <reference key="destination" ref="612578685"/>
+ </object>
+ <int key="connectionID">207</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="612578685"/>
+ <reference key="destination" ref="483958638"/>
+ </object>
+ <int key="connectionID">208</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">saveAction:</string>
+ <reference key="source" ref="612578685"/>
+ <reference key="destination" ref="1005751409"/>
+ </object>
+ <int key="connectionID">211</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performMiniaturize:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="814052996"/>
+ </object>
+ <int key="connectionID">247</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performZoom:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="319459889"/>
+ </object>
+ <int key="connectionID">248</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">arrangeInFront:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="1057689233"/>
+ </object>
+ <int key="connectionID">249</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleToolbarShown:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="653321099"/>
+ </object>
+ <int key="connectionID">342</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">runToolbarCustomizationPalette:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="854660346"/>
+ </object>
+ <int key="connectionID">343</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">addFontTrait:</string>
+ <reference key="source" ref="39582327"/>
+ <reference key="destination" ref="322671057"/>
+ </object>
+ <int key="connectionID">393</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">addFontTrait:</string>
+ <reference key="source" ref="39582327"/>
+ <reference key="destination" ref="294925675"/>
+ </object>
+ <int key="connectionID">394</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">modifyFont:</string>
+ <reference key="source" ref="39582327"/>
+ <reference key="destination" ref="820131188"/>
+ </object>
+ <int key="connectionID">395</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">orderFrontFontPanel:</string>
+ <reference key="source" ref="39582327"/>
+ <reference key="destination" ref="486510693"/>
+ </object>
+ <int key="connectionID">396</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">modifyFont:</string>
+ <reference key="source" ref="39582327"/>
+ <reference key="destination" ref="791073707"/>
+ </object>
+ <int key="connectionID">397</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">raiseBaseline:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="650703522"/>
+ </object>
+ <int key="connectionID">398</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">lowerBaseline:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="470064337"/>
+ </object>
+ <int key="connectionID">399</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copyFont:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="637704817"/>
+ </object>
+ <int key="connectionID">400</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">subscript:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="368049810"/>
+ </object>
+ <int key="connectionID">401</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">superscript:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="362581379"/>
+ </object>
+ <int key="connectionID">402</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">tightenKerning:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="807093337"/>
+ </object>
+ <int key="connectionID">403</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">underline:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="386587767"/>
+ </object>
+ <int key="connectionID">404</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">orderFrontColorPanel:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="169445129"/>
+ </object>
+ <int key="connectionID">405</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">useAllLigatures:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="8023761"/>
+ </object>
+ <int key="connectionID">406</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">loosenKerning:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="81316040"/>
+ </object>
+ <int key="connectionID">407</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">pasteFont:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="684848834"/>
+ </object>
+ <int key="connectionID">408</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">unscript:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="299485767"/>
+ </object>
+ <int key="connectionID">409</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">useStandardKerning:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="53041874"/>
+ </object>
+ <int key="connectionID">410</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">useStandardLigatures:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="291130592"/>
+ </object>
+ <int key="connectionID">411</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">turnOffLigatures:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="557989785"/>
+ </object>
+ <int key="connectionID">412</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">turnOffKerning:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="665619559"/>
+ </object>
+ <int key="connectionID">413</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">alignLeft:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="775088230"/>
+ </object>
+ <int key="connectionID">414</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">alignJustified:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="489997371"/>
+ </object>
+ <int key="connectionID">415</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copyRuler:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="405928732"/>
+ </object>
+ <int key="connectionID">416</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">alignCenter:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="20804296"/>
+ </object>
+ <int key="connectionID">417</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleRuler:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="473944779"/>
+ </object>
+ <int key="connectionID">418</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">alignRight:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="766941912"/>
+ </object>
+ <int key="connectionID">419</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">pasteRuler:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="784305476"/>
+ </object>
+ <int key="connectionID">420</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">capitalizeWord:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="582459168"/>
+ </object>
+ <int key="connectionID">489</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">cut:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="70873500"/>
+ </object>
+ <int key="connectionID">490</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">paste:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="597871667"/>
+ </object>
+ <int key="connectionID">491</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleSmartInsertDelete:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="607672977"/>
+ </object>
+ <int key="connectionID">492</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleAutomaticQuoteSubstitution:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="484928874"/>
+ </object>
+ <int key="connectionID">493</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">redo:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="744402274"/>
+ </object>
+ <int key="connectionID">494</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleAutomaticDashSubstitution:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="693070189"/>
+ </object>
+ <int key="connectionID">495</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleContinuousSpellChecking:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="252035059"/>
+ </object>
+ <int key="connectionID">496</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">undo:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="307109690"/>
+ </object>
+ <int key="connectionID">497</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleGrammarChecking:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="286376998"/>
+ </object>
+ <int key="connectionID">498</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">startSpeaking:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="318734362"/>
+ </object>
+ <int key="connectionID">499</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showGuessPanel:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="356339891"/>
+ </object>
+ <int key="connectionID">500</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">checkSpelling:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="416352713"/>
+ </object>
+ <int key="connectionID">501</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">pasteAsPlainText:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="324532357"/>
+ </object>
+ <int key="connectionID">502</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copy:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="808304593"/>
+ </object>
+ <int key="connectionID">503</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">delete:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="618358412"/>
+ </object>
+ <int key="connectionID">504</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">lowercaseWord:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="899181471"/>
+ </object>
+ <int key="connectionID">505</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">selectAll:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="883438165"/>
+ </object>
+ <int key="connectionID">506</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">stopSpeaking:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="612849471"/>
+ </object>
+ <int key="connectionID">507</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">orderFrontSubstitutionsPanel:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="64764928"/>
+ </object>
+ <int key="connectionID">508</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleAutomaticTextReplacement:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="416554597"/>
+ </object>
+ <int key="connectionID">509</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleAutomaticLinkDetection:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="1059551809"/>
+ </object>
+ <int key="connectionID">510</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleAutomaticSpellingCorrection:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="81755183"/>
+ </object>
+ <int key="connectionID">511</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">uppercaseWord:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="698135111"/>
+ </object>
+ <int key="connectionID">512</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performFindPanelAction:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="160366792"/>
+ </object>
+ <int key="connectionID">513</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performFindPanelAction:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="30033296"/>
+ </object>
+ <int key="connectionID">514</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performFindPanelAction:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="914446540"/>
+ </object>
+ <int key="connectionID">515</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">centerSelectionInVisibleArea:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="827334636"/>
+ </object>
+ <int key="connectionID">516</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performFindPanelAction:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="248661547"/>
+ </object>
+ <int key="connectionID">517</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showHelp:</string>
+ <reference key="source" ref="909243075"/>
+ <reference key="destination" ref="954120217"/>
+ </object>
+ <int key="connectionID">521</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="770142414"/>
+ <reference key="destination" ref="483958638"/>
+ </object>
+ <int key="connectionID">524</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mainButton</string>
+ <reference key="source" ref="770142414"/>
+ <reference key="destination" ref="544612128"/>
+ </object>
+ <int key="connectionID">527</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="53522055"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="493647166"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="909243075"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="547858435"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">21</int>
+ <reference key="object" ref="483958638"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="823886803"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Window</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="823886803"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="544612128"/>
+ </object>
+ <reference key="parent" ref="483958638"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">29</int>
+ <reference key="object" ref="1055885701"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="376192112"/>
+ <reference ref="842783111"/>
+ <reference ref="560112995"/>
+ <reference ref="147235865"/>
+ <reference ref="259022320"/>
+ <reference ref="545718297"/>
+ <reference ref="713319646"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">MainMenu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">56</int>
+ <reference key="object" ref="376192112"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="123765298"/>
+ </object>
+ <reference key="parent" ref="1055885701"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">57</int>
+ <reference key="object" ref="123765298"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="743093781"/>
+ <reference ref="124073989"/>
+ <reference ref="515282677"/>
+ <reference ref="780549861"/>
+ <reference ref="349823970"/>
+ <reference ref="621602699"/>
+ <reference ref="931166327"/>
+ <reference ref="514007154"/>
+ <reference ref="901869444"/>
+ <reference ref="163840636"/>
+ <reference ref="791044830"/>
+ </object>
+ <reference key="parent" ref="376192112"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">58</int>
+ <reference key="object" ref="743093781"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">129</int>
+ <reference key="object" ref="124073989"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">131</int>
+ <reference key="object" ref="515282677"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="939189088"/>
+ </object>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">130</int>
+ <reference key="object" ref="939189088"/>
+ <reference key="parent" ref="515282677"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">134</int>
+ <reference key="object" ref="780549861"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">136</int>
+ <reference key="object" ref="349823970"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">143</int>
+ <reference key="object" ref="621602699"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">144</int>
+ <reference key="object" ref="931166327"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">145</int>
+ <reference key="object" ref="514007154"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">149</int>
+ <reference key="object" ref="901869444"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">150</int>
+ <reference key="object" ref="163840636"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">196</int>
+ <reference key="object" ref="791044830"/>
+ <reference key="parent" ref="123765298"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">83</int>
+ <reference key="object" ref="842783111"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="960517776"/>
+ </object>
+ <reference key="parent" ref="1055885701"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">81</int>
+ <reference key="object" ref="960517776"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="402151840"/>
+ <reference ref="1005751409"/>
+ <reference ref="620705007"/>
+ <reference ref="51940822"/>
+ </object>
+ <reference key="parent" ref="842783111"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">74</int>
+ <reference key="object" ref="402151840"/>
+ <reference key="parent" ref="960517776"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">75</int>
+ <reference key="object" ref="1005751409"/>
+ <reference key="parent" ref="960517776"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">77</int>
+ <reference key="object" ref="620705007"/>
+ <reference key="parent" ref="960517776"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">78</int>
+ <reference key="object" ref="51940822"/>
+ <reference key="parent" ref="960517776"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">241</int>
+ <reference key="object" ref="560112995"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="747245393"/>
+ </object>
+ <reference key="parent" ref="1055885701"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">242</int>
+ <reference key="object" ref="747245393"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1042829312"/>
+ <reference ref="319459889"/>
+ <reference ref="1057689233"/>
+ <reference ref="814052996"/>
+ </object>
+ <reference key="parent" ref="560112995"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">243</int>
+ <reference key="object" ref="1042829312"/>
+ <reference key="parent" ref="747245393"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">244</int>
+ <reference key="object" ref="319459889"/>
+ <reference key="parent" ref="747245393"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">245</int>
+ <reference key="object" ref="1057689233"/>
+ <reference key="parent" ref="747245393"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">246</int>
+ <reference key="object" ref="814052996"/>
+ <reference key="parent" ref="747245393"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">338</int>
+ <reference key="object" ref="147235865"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="877676881"/>
+ </object>
+ <reference key="parent" ref="1055885701"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">339</int>
+ <reference key="object" ref="877676881"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="854660346"/>
+ <reference ref="653321099"/>
+ </object>
+ <reference key="parent" ref="147235865"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">340</int>
+ <reference key="object" ref="854660346"/>
+ <reference key="parent" ref="877676881"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">341</int>
+ <reference key="object" ref="653321099"/>
+ <reference key="parent" ref="877676881"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">205</int>
+ <reference key="object" ref="612578685"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">MediaServerCocoaTest_AppDelegate</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">347</int>
+ <reference key="object" ref="259022320"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="708542952"/>
+ </object>
+ <reference key="parent" ref="1055885701"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">348</int>
+ <reference key="object" ref="708542952"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1044121641"/>
+ <reference ref="446410933"/>
+ </object>
+ <reference key="parent" ref="259022320"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">349</int>
+ <reference key="object" ref="1044121641"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="16789759"/>
+ </object>
+ <reference key="parent" ref="708542952"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">350</int>
+ <reference key="object" ref="446410933"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="640850853"/>
+ </object>
+ <reference key="parent" ref="708542952"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">351</int>
+ <reference key="object" ref="640850853"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="775088230"/>
+ <reference ref="20804296"/>
+ <reference ref="489997371"/>
+ <reference ref="766941912"/>
+ <reference ref="831789293"/>
+ <reference ref="473944779"/>
+ <reference ref="405928732"/>
+ <reference ref="784305476"/>
+ </object>
+ <reference key="parent" ref="446410933"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">352</int>
+ <reference key="object" ref="775088230"/>
+ <reference key="parent" ref="640850853"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">353</int>
+ <reference key="object" ref="20804296"/>
+ <reference key="parent" ref="640850853"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">354</int>
+ <reference key="object" ref="489997371"/>
+ <reference key="parent" ref="640850853"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">355</int>
+ <reference key="object" ref="766941912"/>
+ <reference key="parent" ref="640850853"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">356</int>
+ <reference key="object" ref="831789293"/>
+ <reference key="parent" ref="640850853"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">357</int>
+ <reference key="object" ref="473944779"/>
+ <reference key="parent" ref="640850853"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">358</int>
+ <reference key="object" ref="405928732"/>
+ <reference key="parent" ref="640850853"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">359</int>
+ <reference key="object" ref="784305476"/>
+ <reference key="parent" ref="640850853"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">360</int>
+ <reference key="object" ref="16789759"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="486510693"/>
+ <reference ref="322671057"/>
+ <reference ref="294925675"/>
+ <reference ref="386587767"/>
+ <reference ref="530490813"/>
+ <reference ref="791073707"/>
+ <reference ref="820131188"/>
+ <reference ref="593643800"/>
+ <reference ref="17067790"/>
+ <reference ref="654563803"/>
+ <reference ref="35184653"/>
+ <reference ref="638669489"/>
+ <reference ref="169445129"/>
+ <reference ref="511988305"/>
+ <reference ref="637704817"/>
+ <reference ref="684848834"/>
+ </object>
+ <reference key="parent" ref="1044121641"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">361</int>
+ <reference key="object" ref="486510693"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">362</int>
+ <reference key="object" ref="322671057"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">363</int>
+ <reference key="object" ref="294925675"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">364</int>
+ <reference key="object" ref="386587767"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">365</int>
+ <reference key="object" ref="530490813"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">366</int>
+ <reference key="object" ref="791073707"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">367</int>
+ <reference key="object" ref="820131188"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">368</int>
+ <reference key="object" ref="593643800"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">369</int>
+ <reference key="object" ref="17067790"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="277000559"/>
+ </object>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">370</int>
+ <reference key="object" ref="654563803"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="164619877"/>
+ </object>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">371</int>
+ <reference key="object" ref="35184653"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1040787833"/>
+ </object>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">372</int>
+ <reference key="object" ref="638669489"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">373</int>
+ <reference key="object" ref="169445129"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">374</int>
+ <reference key="object" ref="511988305"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">375</int>
+ <reference key="object" ref="637704817"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">376</int>
+ <reference key="object" ref="684848834"/>
+ <reference key="parent" ref="16789759"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">377</int>
+ <reference key="object" ref="1040787833"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="299485767"/>
+ <reference ref="362581379"/>
+ <reference ref="368049810"/>
+ <reference ref="650703522"/>
+ <reference ref="470064337"/>
+ </object>
+ <reference key="parent" ref="35184653"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">378</int>
+ <reference key="object" ref="299485767"/>
+ <reference key="parent" ref="1040787833"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">379</int>
+ <reference key="object" ref="362581379"/>
+ <reference key="parent" ref="1040787833"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">380</int>
+ <reference key="object" ref="368049810"/>
+ <reference key="parent" ref="1040787833"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">381</int>
+ <reference key="object" ref="650703522"/>
+ <reference key="parent" ref="1040787833"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">382</int>
+ <reference key="object" ref="470064337"/>
+ <reference key="parent" ref="1040787833"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">383</int>
+ <reference key="object" ref="164619877"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="291130592"/>
+ <reference ref="557989785"/>
+ <reference ref="8023761"/>
+ </object>
+ <reference key="parent" ref="654563803"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">384</int>
+ <reference key="object" ref="291130592"/>
+ <reference key="parent" ref="164619877"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">385</int>
+ <reference key="object" ref="557989785"/>
+ <reference key="parent" ref="164619877"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">386</int>
+ <reference key="object" ref="8023761"/>
+ <reference key="parent" ref="164619877"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">387</int>
+ <reference key="object" ref="277000559"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="53041874"/>
+ <reference ref="665619559"/>
+ <reference ref="807093337"/>
+ <reference ref="81316040"/>
+ </object>
+ <reference key="parent" ref="17067790"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">388</int>
+ <reference key="object" ref="53041874"/>
+ <reference key="parent" ref="277000559"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">389</int>
+ <reference key="object" ref="665619559"/>
+ <reference key="parent" ref="277000559"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">390</int>
+ <reference key="object" ref="807093337"/>
+ <reference key="parent" ref="277000559"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">391</int>
+ <reference key="object" ref="81316040"/>
+ <reference key="parent" ref="277000559"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">392</int>
+ <reference key="object" ref="39582327"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">444</int>
+ <reference key="object" ref="545718297"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1022019938"/>
+ </object>
+ <reference key="parent" ref="1055885701"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">445</int>
+ <reference key="object" ref="1022019938"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="307109690"/>
+ <reference ref="744402274"/>
+ <reference ref="831119715"/>
+ <reference ref="70873500"/>
+ <reference ref="808304593"/>
+ <reference ref="597871667"/>
+ <reference ref="324532357"/>
+ <reference ref="618358412"/>
+ <reference ref="883438165"/>
+ <reference ref="473717252"/>
+ <reference ref="69846141"/>
+ <reference ref="365048869"/>
+ <reference ref="958645126"/>
+ <reference ref="814247416"/>
+ <reference ref="1058116061"/>
+ </object>
+ <reference key="parent" ref="545718297"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">446</int>
+ <reference key="object" ref="307109690"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">447</int>
+ <reference key="object" ref="744402274"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">448</int>
+ <reference key="object" ref="831119715"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">449</int>
+ <reference key="object" ref="70873500"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">450</int>
+ <reference key="object" ref="808304593"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">451</int>
+ <reference key="object" ref="597871667"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">452</int>
+ <reference key="object" ref="324532357"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">453</int>
+ <reference key="object" ref="618358412"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">454</int>
+ <reference key="object" ref="883438165"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">455</int>
+ <reference key="object" ref="473717252"/>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">456</int>
+ <reference key="object" ref="69846141"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="216314426"/>
+ </object>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">457</int>
+ <reference key="object" ref="365048869"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="666968844"/>
+ </object>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">458</int>
+ <reference key="object" ref="958645126"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="218631249"/>
+ </object>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">459</int>
+ <reference key="object" ref="814247416"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="562140037"/>
+ </object>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">460</int>
+ <reference key="object" ref="1058116061"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="792127484"/>
+ </object>
+ <reference key="parent" ref="1022019938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">461</int>
+ <reference key="object" ref="792127484"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="318734362"/>
+ <reference ref="612849471"/>
+ </object>
+ <reference key="parent" ref="1058116061"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">462</int>
+ <reference key="object" ref="318734362"/>
+ <reference key="parent" ref="792127484"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">463</int>
+ <reference key="object" ref="612849471"/>
+ <reference key="parent" ref="792127484"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">464</int>
+ <reference key="object" ref="562140037"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="698135111"/>
+ <reference ref="899181471"/>
+ <reference ref="582459168"/>
+ </object>
+ <reference key="parent" ref="814247416"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">465</int>
+ <reference key="object" ref="698135111"/>
+ <reference key="parent" ref="562140037"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">466</int>
+ <reference key="object" ref="899181471"/>
+ <reference key="parent" ref="562140037"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">467</int>
+ <reference key="object" ref="582459168"/>
+ <reference key="parent" ref="562140037"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">468</int>
+ <reference key="object" ref="218631249"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="64764928"/>
+ <reference ref="136936362"/>
+ <reference ref="607672977"/>
+ <reference ref="484928874"/>
+ <reference ref="693070189"/>
+ <reference ref="1059551809"/>
+ <reference ref="416554597"/>
+ </object>
+ <reference key="parent" ref="958645126"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">469</int>
+ <reference key="object" ref="64764928"/>
+ <reference key="parent" ref="218631249"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">470</int>
+ <reference key="object" ref="136936362"/>
+ <reference key="parent" ref="218631249"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">471</int>
+ <reference key="object" ref="607672977"/>
+ <reference key="parent" ref="218631249"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">472</int>
+ <reference key="object" ref="484928874"/>
+ <reference key="parent" ref="218631249"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">473</int>
+ <reference key="object" ref="693070189"/>
+ <reference key="parent" ref="218631249"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">474</int>
+ <reference key="object" ref="1059551809"/>
+ <reference key="parent" ref="218631249"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">475</int>
+ <reference key="object" ref="416554597"/>
+ <reference key="parent" ref="218631249"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">476</int>
+ <reference key="object" ref="666968844"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="356339891"/>
+ <reference ref="416352713"/>
+ <reference ref="47615281"/>
+ <reference ref="252035059"/>
+ <reference ref="286376998"/>
+ <reference ref="81755183"/>
+ </object>
+ <reference key="parent" ref="365048869"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">477</int>
+ <reference key="object" ref="356339891"/>
+ <reference key="parent" ref="666968844"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">478</int>
+ <reference key="object" ref="416352713"/>
+ <reference key="parent" ref="666968844"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">479</int>
+ <reference key="object" ref="47615281"/>
+ <reference key="parent" ref="666968844"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">480</int>
+ <reference key="object" ref="252035059"/>
+ <reference key="parent" ref="666968844"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">481</int>
+ <reference key="object" ref="286376998"/>
+ <reference key="parent" ref="666968844"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">482</int>
+ <reference key="object" ref="81755183"/>
+ <reference key="parent" ref="666968844"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">483</int>
+ <reference key="object" ref="216314426"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="914446540"/>
+ <reference ref="160366792"/>
+ <reference ref="248661547"/>
+ <reference ref="30033296"/>
+ <reference ref="827334636"/>
+ </object>
+ <reference key="parent" ref="69846141"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">484</int>
+ <reference key="object" ref="914446540"/>
+ <reference key="parent" ref="216314426"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">485</int>
+ <reference key="object" ref="160366792"/>
+ <reference key="parent" ref="216314426"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">486</int>
+ <reference key="object" ref="248661547"/>
+ <reference key="parent" ref="216314426"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">487</int>
+ <reference key="object" ref="30033296"/>
+ <reference key="parent" ref="216314426"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">488</int>
+ <reference key="object" ref="827334636"/>
+ <reference key="parent" ref="216314426"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">518</int>
+ <reference key="object" ref="713319646"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="508081226"/>
+ </object>
+ <reference key="parent" ref="1055885701"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">519</int>
+ <reference key="object" ref="508081226"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="954120217"/>
+ </object>
+ <reference key="parent" ref="713319646"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">520</int>
+ <reference key="object" ref="954120217"/>
+ <reference key="parent" ref="508081226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">523</int>
+ <reference key="object" ref="770142414"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">MediaServerCocoaTestController</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">525</int>
+ <reference key="object" ref="544612128"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="879879405"/>
+ </object>
+ <reference key="parent" ref="823886803"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">526</int>
+ <reference key="object" ref="879879405"/>
+ <reference key="parent" ref="544612128"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-3.IBPluginDependency</string>
+ <string>-3.ImportedFromIB2</string>
+ <string>129.IBPluginDependency</string>
+ <string>129.ImportedFromIB2</string>
+ <string>130.IBEditorWindowLastContentRect</string>
+ <string>130.IBPluginDependency</string>
+ <string>130.ImportedFromIB2</string>
+ <string>131.IBPluginDependency</string>
+ <string>131.ImportedFromIB2</string>
+ <string>134.IBPluginDependency</string>
+ <string>134.ImportedFromIB2</string>
+ <string>136.IBPluginDependency</string>
+ <string>136.ImportedFromIB2</string>
+ <string>143.IBPluginDependency</string>
+ <string>143.ImportedFromIB2</string>
+ <string>144.IBPluginDependency</string>
+ <string>144.ImportedFromIB2</string>
+ <string>145.IBPluginDependency</string>
+ <string>145.ImportedFromIB2</string>
+ <string>149.IBPluginDependency</string>
+ <string>149.ImportedFromIB2</string>
+ <string>150.IBPluginDependency</string>
+ <string>150.ImportedFromIB2</string>
+ <string>196.IBPluginDependency</string>
+ <string>196.ImportedFromIB2</string>
+ <string>2.IBPluginDependency</string>
+ <string>2.ImportedFromIB2</string>
+ <string>205.ImportedFromIB2</string>
+ <string>21.IBEditorWindowLastContentRect</string>
+ <string>21.IBPluginDependency</string>
+ <string>21.IBWindowTemplateEditedContentRect</string>
+ <string>21.ImportedFromIB2</string>
+ <string>21.NSWindowTemplate.visibleAtLaunch</string>
+ <string>21.windowTemplate.hasMinSize</string>
+ <string>21.windowTemplate.minSize</string>
+ <string>241.IBPluginDependency</string>
+ <string>241.ImportedFromIB2</string>
+ <string>242.IBEditorWindowLastContentRect</string>
+ <string>242.IBPluginDependency</string>
+ <string>242.ImportedFromIB2</string>
+ <string>243.IBPluginDependency</string>
+ <string>243.ImportedFromIB2</string>
+ <string>244.IBPluginDependency</string>
+ <string>244.ImportedFromIB2</string>
+ <string>245.IBPluginDependency</string>
+ <string>245.ImportedFromIB2</string>
+ <string>246.IBPluginDependency</string>
+ <string>246.ImportedFromIB2</string>
+ <string>29.IBEditorWindowLastContentRect</string>
+ <string>29.IBPluginDependency</string>
+ <string>29.ImportedFromIB2</string>
+ <string>338.IBPluginDependency</string>
+ <string>338.ImportedFromIB2</string>
+ <string>339.IBEditorWindowLastContentRect</string>
+ <string>339.IBPluginDependency</string>
+ <string>339.ImportedFromIB2</string>
+ <string>340.IBPluginDependency</string>
+ <string>340.ImportedFromIB2</string>
+ <string>341.IBPluginDependency</string>
+ <string>341.ImportedFromIB2</string>
+ <string>347.IBPluginDependency</string>
+ <string>348.IBEditorWindowLastContentRect</string>
+ <string>348.IBPluginDependency</string>
+ <string>349.IBPluginDependency</string>
+ <string>350.IBPluginDependency</string>
+ <string>351.IBPluginDependency</string>
+ <string>352.IBPluginDependency</string>
+ <string>353.IBPluginDependency</string>
+ <string>354.IBPluginDependency</string>
+ <string>355.IBPluginDependency</string>
+ <string>356.IBPluginDependency</string>
+ <string>357.IBPluginDependency</string>
+ <string>358.IBPluginDependency</string>
+ <string>359.IBPluginDependency</string>
+ <string>360.IBPluginDependency</string>
+ <string>361.IBPluginDependency</string>
+ <string>362.IBPluginDependency</string>
+ <string>363.IBPluginDependency</string>
+ <string>364.IBPluginDependency</string>
+ <string>365.IBPluginDependency</string>
+ <string>366.IBPluginDependency</string>
+ <string>367.IBPluginDependency</string>
+ <string>368.IBPluginDependency</string>
+ <string>369.IBPluginDependency</string>
+ <string>370.IBPluginDependency</string>
+ <string>371.IBPluginDependency</string>
+ <string>372.IBPluginDependency</string>
+ <string>373.IBPluginDependency</string>
+ <string>374.IBPluginDependency</string>
+ <string>375.IBPluginDependency</string>
+ <string>376.IBPluginDependency</string>
+ <string>377.IBPluginDependency</string>
+ <string>378.IBPluginDependency</string>
+ <string>379.IBPluginDependency</string>
+ <string>380.IBPluginDependency</string>
+ <string>381.IBPluginDependency</string>
+ <string>382.IBPluginDependency</string>
+ <string>383.IBPluginDependency</string>
+ <string>384.IBPluginDependency</string>
+ <string>385.IBPluginDependency</string>
+ <string>386.IBPluginDependency</string>
+ <string>387.IBPluginDependency</string>
+ <string>388.IBPluginDependency</string>
+ <string>389.IBPluginDependency</string>
+ <string>390.IBPluginDependency</string>
+ <string>391.IBPluginDependency</string>
+ <string>444.IBPluginDependency</string>
+ <string>445.IBEditorWindowLastContentRect</string>
+ <string>445.IBPluginDependency</string>
+ <string>446.IBPluginDependency</string>
+ <string>447.IBPluginDependency</string>
+ <string>448.IBPluginDependency</string>
+ <string>449.IBPluginDependency</string>
+ <string>450.IBPluginDependency</string>
+ <string>451.IBPluginDependency</string>
+ <string>452.IBPluginDependency</string>
+ <string>453.IBPluginDependency</string>
+ <string>454.IBPluginDependency</string>
+ <string>455.IBPluginDependency</string>
+ <string>456.IBPluginDependency</string>
+ <string>457.IBPluginDependency</string>
+ <string>458.IBPluginDependency</string>
+ <string>459.IBPluginDependency</string>
+ <string>460.IBPluginDependency</string>
+ <string>461.IBPluginDependency</string>
+ <string>462.IBPluginDependency</string>
+ <string>463.IBPluginDependency</string>
+ <string>464.IBEditorWindowLastContentRect</string>
+ <string>464.IBPluginDependency</string>
+ <string>465.IBPluginDependency</string>
+ <string>466.IBPluginDependency</string>
+ <string>467.IBPluginDependency</string>
+ <string>468.IBPluginDependency</string>
+ <string>469.IBPluginDependency</string>
+ <string>470.IBPluginDependency</string>
+ <string>471.IBPluginDependency</string>
+ <string>472.IBPluginDependency</string>
+ <string>473.IBPluginDependency</string>
+ <string>474.IBPluginDependency</string>
+ <string>475.IBPluginDependency</string>
+ <string>476.IBPluginDependency</string>
+ <string>477.IBPluginDependency</string>
+ <string>478.IBPluginDependency</string>
+ <string>479.IBPluginDependency</string>
+ <string>480.IBPluginDependency</string>
+ <string>481.IBPluginDependency</string>
+ <string>482.IBPluginDependency</string>
+ <string>483.IBPluginDependency</string>
+ <string>484.IBPluginDependency</string>
+ <string>485.IBPluginDependency</string>
+ <string>486.IBPluginDependency</string>
+ <string>487.IBPluginDependency</string>
+ <string>488.IBPluginDependency</string>
+ <string>518.IBPluginDependency</string>
+ <string>519.IBEditorWindowLastContentRect</string>
+ <string>519.IBPluginDependency</string>
+ <string>520.IBPluginDependency</string>
+ <string>523.IBPluginDependency</string>
+ <string>525.IBPluginDependency</string>
+ <string>526.IBPluginDependency</string>
+ <string>56.IBPluginDependency</string>
+ <string>56.ImportedFromIB2</string>
+ <string>57.IBEditorWindowLastContentRect</string>
+ <string>57.IBPluginDependency</string>
+ <string>57.ImportedFromIB2</string>
+ <string>58.IBPluginDependency</string>
+ <string>58.ImportedFromIB2</string>
+ <string>74.IBPluginDependency</string>
+ <string>74.ImportedFromIB2</string>
+ <string>75.IBPluginDependency</string>
+ <string>75.ImportedFromIB2</string>
+ <string>77.IBPluginDependency</string>
+ <string>77.ImportedFromIB2</string>
+ <string>78.IBPluginDependency</string>
+ <string>78.ImportedFromIB2</string>
+ <string>81.IBEditorWindowLastContentRect</string>
+ <string>81.IBPluginDependency</string>
+ <string>81.ImportedFromIB2</string>
+ <string>83.IBPluginDependency</string>
+ <string>83.ImportedFromIB2</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{370, 880}, {64, 6}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <integer value="1"/>
+ <string>{{319, 476}, {480, 360}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{319, 476}, {480, 360}}</string>
+ <integer value="1"/>
+ <integer value="1"/>
+ <integer value="1"/>
+ <string>{213, 107}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{610, 1023}, {194, 73}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{380, 810}, {528, 20}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{410, 921}, {234, 43}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{494, 1053}, {83, 43}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{450, 813}, {254, 283}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{783, 793}, {170, 63}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{681, 1073}, {250, 23}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{85, 781}, {245, 183}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>{{408, 1023}, {176, 73}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">527</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">MediaServerCocoaTestController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>mainButton</string>
+ <string>window</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSButton</string>
+ <string>NSWindow</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>mainButton</string>
+ <string>window</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBToOneOutletInfo">
+ <string key="name">mainButton</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">window</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">../../../Source/Tests/MediaServerCocoaTest/MediaServerCocoaTestController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">MediaServerCocoaTest_AppDelegate</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="actions">
+ <string key="NS.key.0">saveAction:</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <string key="NS.key.0">saveAction:</string>
+ <object class="IBActionInfo" key="NS.object.0">
+ <string key="name">saveAction:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">window</string>
+ <string key="NS.object.0">NSWindow</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">window</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">window</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">../../../Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">MediaServerCocoaTest_AppDelegate</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1050" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="3000" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../../../../Build/Targets/universal-apple-macosx/Platinum.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSMenuCheckmark</string>
+ <string>NSMenuMixedState</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{9, 8}</string>
+ <string>{7, 2}</string>
+ </object>
+ </object>
+ </data>
+</archive>
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest-Info.plist b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest-Info.plist
new file mode 100644
index 0000000..883d858
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest-Info.plist
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>${MACOSX_DEPLOYMENT_TARGET}</string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTestController.h b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTestController.h
new file mode 100644
index 0000000..2de7c10
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTestController.h
@@ -0,0 +1,20 @@
+//
+// MediaServerCocoaTestController.h
+// Platinum
+//
+// Created by Sylvain on 9/14/10.
+// Copyright 2010 Plutinosoft LLC. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <Platinum/PltUPnPObject.h>
+#import <Platinum/PltMediaServerObject.h>
+
+@interface MediaServerCocoaTestController : NSObject <PLT_MediaServerDelegateObject> {
+ IBOutlet NSWindow* window;
+ IBOutlet NSButton* mainButton;
+
+ PLT_UPnPObject* upnp;
+}
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTestController.mm b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTestController.mm
new file mode 100644
index 0000000..d7b9a29
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTestController.mm
@@ -0,0 +1,64 @@
+//
+// MediaServerCocoaTestController.mm
+// Platinum
+//
+// Created by Sylvain on 9/14/10.
+// Copyright 2010 Plutinosoft LLC. All rights reserved.
+//
+
+#import "MediaServerCocoaTestController.h"
+#import <Neptune/Neptune.h>
+
+
+@implementation MediaServerCocoaTestController
+
++ (void)initialize {
+ NPT_LogManager::GetDefault().Configure("plist:.level=INFO;.handlers=ConsoleHandler;.ConsoleHandler.outputs=1;.ConsoleHandler.filter=61");
+}
+
+- (void)awakeFromNib {
+ upnp = [[PLT_UPnPObject alloc] init];
+
+ // create server and add ourselves as the delegate
+ PLT_MediaServerObject* server = [[PLT_MediaServerObject alloc] init];
+ [server setDelegate:self];
+ [upnp addDevice:server];
+
+ [mainButton setTarget:self];
+ [mainButton setTitle:@"Start"];
+ [mainButton setAction:@selector(performUPnPStarStop:)];
+}
+
+- (void)performUPnPStarStop:(id)sender {
+ if ([upnp isRunning]) {
+ [upnp stop];
+ [mainButton setTitle:@"Start"];
+ } else {
+ [upnp start];
+ [mainButton setTitle:@"Stop"];
+ }
+}
+
+#pragma mark - PLT_MediaServerDelegateObject
+
+- (NPT_Result)onBrowseMetadata:(PLT_MediaServerBrowseCapsule*)info
+{
+ return NPT_FAILURE;
+}
+
+- (NPT_Result)onBrowseDirectChildren:(PLT_MediaServerBrowseCapsule*)info
+{
+ return NPT_FAILURE;
+}
+
+- (NPT_Result)onSearchContainer:(PLT_MediaServerSearchCapsule*)info
+{
+ return NPT_FAILURE;
+}
+
+- (NPT_Result)onFileRequest:(PLT_MediaServerFileRequestCapsule*)info
+{
+ return NPT_FAILURE;
+}
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.h b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.h
new file mode 100644
index 0000000..07ca005
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.h
@@ -0,0 +1,28 @@
+//
+// MediaServerCocoaTest_AppDelegate.h
+// MediaServerCocoaTest
+//
+// Created by Sylvain on 9/14/10.
+// Copyright Plutinosoft LLC 2010 . All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@interface MediaServerCocoaTest_AppDelegate : NSObject
+{
+ NSWindow *window;
+
+ NSPersistentStoreCoordinator *persistentStoreCoordinator;
+ NSManagedObjectModel *managedObjectModel;
+ NSManagedObjectContext *managedObjectContext;
+}
+
+@property (nonatomic, retain) IBOutlet NSWindow *window;
+
+@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
+@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
+@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
+
+- (IBAction)saveAction:sender;
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.m b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.m
new file mode 100644
index 0000000..e8120ba
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.m
@@ -0,0 +1,212 @@
+//
+// MediaServerCocoaTest_AppDelegate.m
+// MediaServerCocoaTest
+//
+// Created by Sylvain on 9/14/10.
+// Copyright Plutinosoft LLC 2010 . All rights reserved.
+//
+
+#import "MediaServerCocoaTest_AppDelegate.h"
+
+@implementation MediaServerCocoaTest_AppDelegate
+
+@synthesize window;
+
+/**
+ Returns the support directory for the application, used to store the Core Data
+ store file. This code uses a directory named "MediaServerCocoaTest" for
+ the content, either in the NSApplicationSupportDirectory location or (if the
+ former cannot be found), the system's temporary directory.
+ */
+
+- (NSString *)applicationSupportDirectory {
+
+ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
+ NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory();
+ return [basePath stringByAppendingPathComponent:@"MediaServerCocoaTest"];
+}
+
+
+/**
+ Creates, retains, and returns the managed object model for the application
+ by merging all of the models found in the application bundle.
+ */
+
+- (NSManagedObjectModel *)managedObjectModel {
+
+ if (managedObjectModel) return managedObjectModel;
+
+ managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
+ return managedObjectModel;
+}
+
+
+/**
+ Returns the persistent store coordinator for the application. This
+ implementation will create and return a coordinator, having added the
+ store for the application to it. (The directory for the store is created,
+ if necessary.)
+ */
+
+- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
+
+ if (persistentStoreCoordinator) return persistentStoreCoordinator;
+
+ NSManagedObjectModel *mom = [self managedObjectModel];
+ if (!mom) {
+ NSAssert(NO, @"Managed object model is nil");
+ NSLog(@"%@:%s No model to generate a store from", [self class], _cmd);
+ return nil;
+ }
+
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+ NSString *applicationSupportDirectory = [self applicationSupportDirectory];
+ NSError *error = nil;
+
+ if ( ![fileManager fileExistsAtPath:applicationSupportDirectory isDirectory:NULL] ) {
+ if (![fileManager createDirectoryAtPath:applicationSupportDirectory withIntermediateDirectories:NO attributes:nil error:&error]) {
+ NSAssert(NO, ([NSString stringWithFormat:@"Failed to create App Support directory %@ : %@", applicationSupportDirectory,error]));
+ NSLog(@"Error creating application support directory at %@ : %@",applicationSupportDirectory,error);
+ return nil;
+ }
+ }
+
+ NSURL *url = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @"storedata"]];
+ persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: mom];
+ if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType
+ configuration:nil
+ URL:url
+ options:nil
+ error:&error]){
+ [[NSApplication sharedApplication] presentError:error];
+ [persistentStoreCoordinator release], persistentStoreCoordinator = nil;
+ return nil;
+ }
+
+ return persistentStoreCoordinator;
+}
+
+/**
+ Returns the managed object context for the application (which is already
+ bound to the persistent store coordinator for the application.)
+ */
+
+- (NSManagedObjectContext *) managedObjectContext {
+
+ if (managedObjectContext) return managedObjectContext;
+
+ NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
+ if (!coordinator) {
+ NSMutableDictionary *dict = [NSMutableDictionary dictionary];
+ [dict setValue:@"Failed to initialize the store" forKey:NSLocalizedDescriptionKey];
+ [dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey];
+ NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
+ [[NSApplication sharedApplication] presentError:error];
+ return nil;
+ }
+ managedObjectContext = [[NSManagedObjectContext alloc] init];
+ [managedObjectContext setPersistentStoreCoordinator: coordinator];
+
+ return managedObjectContext;
+}
+
+/**
+ Returns the NSUndoManager for the application. In this case, the manager
+ returned is that of the managed object context for the application.
+ */
+
+- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
+ return [[self managedObjectContext] undoManager];
+}
+
+
+/**
+ Performs the save action for the application, which is to send the save:
+ message to the application's managed object context. Any encountered errors
+ are presented to the user.
+ */
+
+- (IBAction) saveAction:(id)sender {
+
+ NSError *error = nil;
+
+ if (![[self managedObjectContext] commitEditing]) {
+ NSLog(@"%@:%s unable to commit editing before saving", [self class], _cmd);
+ }
+
+ if (![[self managedObjectContext] save:&error]) {
+ [[NSApplication sharedApplication] presentError:error];
+ }
+}
+
+
+/**
+ Implementation of the applicationShouldTerminate: method, used here to
+ handle the saving of changes in the application managed object context
+ before the application terminates.
+ */
+
+- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
+
+ if (!managedObjectContext) return NSTerminateNow;
+
+ if (![managedObjectContext commitEditing]) {
+ NSLog(@"%@:%s unable to commit editing to terminate", [self class], _cmd);
+ return NSTerminateCancel;
+ }
+
+ if (![managedObjectContext hasChanges]) return NSTerminateNow;
+
+ NSError *error = nil;
+ if (![managedObjectContext save:&error]) {
+
+ // This error handling simply presents error information in a panel with an
+ // "Ok" button, which does not include any attempt at error recovery (meaning,
+ // attempting to fix the error.) As a result, this implementation will
+ // present the information to the user and then follow up with a panel asking
+ // if the user wishes to "Quit Anyway", without saving the changes.
+
+ // Typically, this process should be altered to include application-specific
+ // recovery steps.
+
+ BOOL result = [sender presentError:error];
+ if (result) return NSTerminateCancel;
+
+ NSString *question = NSLocalizedString(@"Could not save changes while quitting. Quit anyway?", @"Quit without saves error question message");
+ NSString *info = NSLocalizedString(@"Quitting now will lose any changes you have made since the last successful save", @"Quit without saves error question info");
+ NSString *quitButton = NSLocalizedString(@"Quit anyway", @"Quit anyway button title");
+ NSString *cancelButton = NSLocalizedString(@"Cancel", @"Cancel button title");
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:question];
+ [alert setInformativeText:info];
+ [alert addButtonWithTitle:quitButton];
+ [alert addButtonWithTitle:cancelButton];
+
+ NSInteger answer = [alert runModal];
+ [alert release];
+ alert = nil;
+
+ if (answer == NSAlertAlternateReturn) return NSTerminateCancel;
+
+ }
+
+ return NSTerminateNow;
+}
+
+
+/**
+ Implementation of dealloc, to release the retained variables.
+ */
+
+- (void)dealloc {
+
+ [window release];
+ [managedObjectContext release];
+ [persistentStoreCoordinator release];
+ [managedObjectModel release];
+
+ [super dealloc];
+}
+
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.mm b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.mm
new file mode 100644
index 0000000..c6fb49a
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_AppDelegate.mm
@@ -0,0 +1,195 @@
+//
+// MediaServerCocoaTest_AppDelegate.m
+// MediaServerCocoaTest
+//
+// Created by Sylvain on 9/14/10.
+// Copyright Plutinosoft LLC 2010 . All rights reserved.
+//
+
+#import "MediaServerCocoaTest_AppDelegate.h"
+
+@implementation MediaServerCocoaTest_AppDelegate
+
+@synthesize window;
+
+/**
+ Returns the support directory for the application, used to store the Core Data
+ store file. This code uses a directory named "MediaServerCocoaTest" for
+ the content, either in the NSApplicationSupportDirectory location or (if the
+ former cannot be found), the system's temporary directory.
+ */
+
+- (NSString *)applicationSupportDirectory {
+
+ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
+ NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory();
+ return [basePath stringByAppendingPathComponent:@"MediaServerCocoaTest"];
+}
+
+
+/**
+ Creates, retains, and returns the managed object model for the application
+ by merging all of the models found in the application bundle.
+ */
+
+- (NSManagedObjectModel *)managedObjectModel {
+
+ if (managedObjectModel) return managedObjectModel;
+
+ managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
+ return managedObjectModel;
+}
+
+
+/**
+ Returns the persistent store coordinator for the application. This
+ implementation will create and return a coordinator, having added the
+ store for the application to it. (The directory for the store is created,
+ if necessary.)
+ */
+
+- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
+
+ if (persistentStoreCoordinator) return persistentStoreCoordinator;
+
+ NSManagedObjectModel *mom = [self managedObjectModel];
+ if (!mom) {
+ NSAssert(NO, @"Managed object model is nil");
+ //NSLog(@"%@:%s No model to generate a store from", [self class], _cmd);
+ return nil;
+ }
+
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+ NSString *applicationSupportDirectory = [self applicationSupportDirectory];
+ NSError *error = nil;
+
+ if ( ![fileManager fileExistsAtPath:applicationSupportDirectory isDirectory:NULL] ) {
+ if (![fileManager createDirectoryAtPath:applicationSupportDirectory withIntermediateDirectories:NO attributes:nil error:&error]) {
+ NSAssert(NO, ([NSString stringWithFormat:@"Failed to create App Support directory %@ : %@", applicationSupportDirectory,error]));
+ NSLog(@"Error creating application support directory at %@ : %@",applicationSupportDirectory,error);
+ return nil;
+ }
+ }
+
+ NSURL *url = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @"storedata"]];
+ persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: mom];
+ if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType
+ configuration:nil
+ URL:url
+ options:nil
+ error:&error]){
+ [[NSApplication sharedApplication] presentError:error];
+ persistentStoreCoordinator = nil;
+ return nil;
+ }
+
+ return persistentStoreCoordinator;
+}
+
+/**
+ Returns the managed object context for the application (which is already
+ bound to the persistent store coordinator for the application.)
+ */
+
+- (NSManagedObjectContext *) managedObjectContext {
+
+ if (managedObjectContext) return managedObjectContext;
+
+ NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
+ if (!coordinator) {
+ NSMutableDictionary *dict = [NSMutableDictionary dictionary];
+ [dict setValue:@"Failed to initialize the store" forKey:NSLocalizedDescriptionKey];
+ [dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey];
+ NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
+ [[NSApplication sharedApplication] presentError:error];
+ return nil;
+ }
+ managedObjectContext = [[NSManagedObjectContext alloc] init];
+ [managedObjectContext setPersistentStoreCoordinator: coordinator];
+
+ return managedObjectContext;
+}
+
+/**
+ Returns the NSUndoManager for the application. In this case, the manager
+ returned is that of the managed object context for the application.
+ */
+
+- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
+ return [[self managedObjectContext] undoManager];
+}
+
+
+/**
+ Performs the save action for the application, which is to send the save:
+ message to the application's managed object context. Any encountered errors
+ are presented to the user.
+ */
+
+- (IBAction) saveAction:(id)sender {
+
+ NSError *error = nil;
+
+ if (![[self managedObjectContext] commitEditing]) {
+ //NSLog(@"%@:%s unable to commit editing before saving", [self class], _cmd);
+ }
+
+ if (![[self managedObjectContext] save:&error]) {
+ [[NSApplication sharedApplication] presentError:error];
+ }
+}
+
+
+/**
+ Implementation of the applicationShouldTerminate: method, used here to
+ handle the saving of changes in the application managed object context
+ before the application terminates.
+ */
+
+- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
+
+ if (!managedObjectContext) return NSTerminateNow;
+
+ if (![managedObjectContext commitEditing]) {
+ //NSLog(@"%@:%s unable to commit editing to terminate", [self class], _cmd);
+ return NSTerminateCancel;
+ }
+
+ if (![managedObjectContext hasChanges]) return NSTerminateNow;
+
+ NSError *error = nil;
+ if (![managedObjectContext save:&error]) {
+
+ // This error handling simply presents error information in a panel with an
+ // "Ok" button, which does not include any attempt at error recovery (meaning,
+ // attempting to fix the error.) As a result, this implementation will
+ // present the information to the user and then follow up with a panel asking
+ // if the user wishes to "Quit Anyway", without saving the changes.
+
+ // Typically, this process should be altered to include application-specific
+ // recovery steps.
+
+ BOOL result = [sender presentError:error];
+ if (result) return NSTerminateCancel;
+
+ NSString *question = NSLocalizedString(@"Could not save changes while quitting. Quit anyway?", @"Quit without saves error question message");
+ NSString *info = NSLocalizedString(@"Quitting now will lose any changes you have made since the last successful save", @"Quit without saves error question info");
+ NSString *quitButton = NSLocalizedString(@"Quit anyway", @"Quit anyway button title");
+ NSString *cancelButton = NSLocalizedString(@"Cancel", @"Cancel button title");
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:question];
+ [alert setInformativeText:info];
+ [alert addButtonWithTitle:quitButton];
+ [alert addButtonWithTitle:cancelButton];
+
+ NSInteger answer = [alert runModal];
+ alert = nil;
+
+ if (answer == NSAlertAlternateReturn) return NSTerminateCancel;
+
+ }
+
+ return NSTerminateNow;
+}
+
+@end
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_DataModel.xcdatamodel/elements b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_DataModel.xcdatamodel/elements
new file mode 100644
index 0000000..2209062
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_DataModel.xcdatamodel/elements
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_DataModel.xcdatamodel/layout b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_DataModel.xcdatamodel/layout
new file mode 100644
index 0000000..85196a8
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_DataModel.xcdatamodel/layout
Binary files differ
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_Prefix.pch b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_Prefix.pch
new file mode 100644
index 0000000..23e1c62
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/MediaServerCocoaTest_Prefix.pch
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'MediaServerCocoaTest' target in the 'MediaServerCocoaTest' project
+//
+
+#ifdef __OBJC__
+ #import <Cocoa/Cocoa.h>
+#endif
diff --git a/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/main.mm b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/main.mm
new file mode 100644
index 0000000..87077c6
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/MediaServerCocoaTest/main.mm
@@ -0,0 +1,14 @@
+//
+// main.m
+// MediaServerCocoaTest
+//
+// Created by Sylvain on 9/14/10.
+// Copyright Plutinosoft LLC 2010. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+int main(int argc, char *argv[])
+{
+ return NSApplicationMain(argc, (const char **) argv);
+}
diff --git a/lib/libUPnP/Platinum/Source/Tests/Simple/PltSimple.cpp b/lib/libUPnP/Platinum/Source/Tests/Simple/PltSimple.cpp
new file mode 100644
index 0000000..0d32ec2
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/Simple/PltSimple.cpp
@@ -0,0 +1,111 @@
+/*****************************************************************
+|
+| Platinum - Simple Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "Platinum.h"
+#include "PltSimple.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.test.simple")
+
+/*----------------------------------------------------------------------
+| forward references
++---------------------------------------------------------------------*/
+extern const char* SCPDXML_SIMPLE;
+
+/*----------------------------------------------------------------------
+| PLT_Simple::PLT_Simple
++---------------------------------------------------------------------*/
+PLT_Simple::PLT_Simple(const char* FriendlyName, const char* UUID) :
+ PLT_DeviceHost("/", UUID, "urn:schemas-upnp-org:device:Simple:1", FriendlyName)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Simple::~PLT_Simple
++---------------------------------------------------------------------*/
+PLT_Simple::~PLT_Simple()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Simple::SetupServices
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Simple::SetupServices()
+{
+ NPT_Result res;
+ PLT_Service* service = new PLT_Service(
+ this,
+ "urn:schemas-upnp-org:service:Test:1",
+ "urn:upnp-org:serviceId:Test.001",
+ "Test");
+
+ NPT_CHECK_LABEL_FATAL(res = service->SetSCPDXML((const char*)SCPDXML_SIMPLE), failure);
+ NPT_CHECK_LABEL_FATAL(res = AddService(service), failure);
+
+ service->SetStateVariable("Status", "True");
+
+ return NPT_SUCCESS;
+
+failure:
+ delete service;
+ return res;
+}
+
+const char* SCPDXML_SIMPLE =
+ "<?xml version=\"1.0\" ?>"
+ " <scpd xmlns=\"urn:schemas-upnp-org:service-1-0\">"
+ " <specVersion>"
+ " <major>1</major>"
+ " <minor>0</minor>"
+ " </specVersion>"
+ " <serviceStateTable>"
+ " <stateVariable sendEvents=\"yes\">"
+ " <name>LastChange</name>"
+ " <dataType>string</dataType>"
+ " <defaultValue></defaultValue>"
+ " </stateVariable>"
+ " <stateVariable sendEvents=\"yes\">"
+ " <name>PresetNameList</name>"
+ " <dataType>string</dataType>"
+ " <defaultValue></defaultValue>"
+ " </stateVariable>"
+ " </serviceStateTable>"
+ " <intel_nmpr:X_INTEL_NMPR xmlns:intel_nmpr=\"udn:schemas-intel-com:device-1-0\">2.1</intel_nmpr:X_INTEL_NMPR>"
+ " <dlna:X_DLNADOC xmlns:dlna=\"udn:schemas-dlna-org:device-1-0\">DMP 1.00</dlna:X_DLNADOC>"
+ " </scpd>";
+
diff --git a/lib/libUPnP/Platinum/Source/Tests/Simple/PltSimple.h b/lib/libUPnP/Platinum/Source/Tests/Simple/PltSimple.h
new file mode 100644
index 0000000..487e760
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/Simple/PltSimple.h
@@ -0,0 +1,56 @@
+/*****************************************************************
+|
+| Platinum -Simple Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_SIMPLE_H_
+#define _PLT_SIMPLE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDeviceHost.h"
+
+/*----------------------------------------------------------------------
+| PLT_Simple class
++---------------------------------------------------------------------*/
+class PLT_Simple : public PLT_DeviceHost
+{
+public:
+ PLT_Simple(const char* FriendlyName, const char* UUID = "");
+ virtual ~PLT_Simple();
+
+ // PLT_DeviceHost methods
+ virtual NPT_Result SetupServices();
+};
+
+#endif /* _PLT_SIMPLE_H_ */
diff --git a/lib/libUPnP/Platinum/Source/Tests/Simple/SimpleTest.cpp b/lib/libUPnP/Platinum/Source/Tests/Simple/SimpleTest.cpp
new file mode 100644
index 0000000..6596227
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/Simple/SimpleTest.cpp
@@ -0,0 +1,63 @@
+/*****************************************************************
+|
+| Platinum - Test Light Device
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltSimple.h"
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /* argc */, char** /* argv */)
+{
+ PLT_UPnP upnp;
+
+ PLT_DeviceHostReference device(new PLT_Simple("Platinum Test"));
+
+ upnp.AddDevice(device);
+ upnp.Start();
+
+ char buf[256];
+ while (gets(buf)) {
+ if (*buf == 'q')
+ break;
+ }
+
+ upnp.Stop();
+
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Tests/Ssdp/SsdpTest1.cpp b/lib/libUPnP/Platinum/Source/Tests/Ssdp/SsdpTest1.cpp
new file mode 100644
index 0000000..1e1f6aa
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/Ssdp/SsdpTest1.cpp
@@ -0,0 +1,66 @@
+/*****************************************************************
+|
+| Platinum - SSDP Test Program 1
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "Platinum.h"
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int, char**)
+{
+ // setup Neptune logging
+ NPT_LogManager::GetDefault().Configure("plist:.level=FINE;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=42");
+
+ PLT_UPnP upnp;
+ PLT_CtrlPointReference ctrl_point(new PLT_CtrlPoint());
+ upnp.AddCtrlPoint(ctrl_point);
+
+ if (NPT_FAILED(upnp.Start()))
+ return 1;
+
+ char buf[256];
+ while (gets(buf)) {
+ if (*buf == 'q')
+ break;
+ }
+
+ upnp.Stop();
+
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Tests/Time/TimeTest1.cpp b/lib/libUPnP/Platinum/Source/Tests/Time/TimeTest1.cpp
new file mode 100644
index 0000000..6d62708
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tests/Time/TimeTest1.cpp
@@ -0,0 +1,189 @@
+/*****************************************************************
+|
+| Platinum - Time Test
+|
+| Copyright (c) 2004-2010, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+| licensing@plutinosoft.com
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include "Neptune.h"
+#include "Platinum.h"
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#define SHOULD_SUCCEED(r) \
+ do { \
+ if (NPT_FAILED(r)) { \
+ fprintf(stderr, "FAILED: line %d\n", __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+#define SHOULD_FAIL(r) \
+ do { \
+ if (NPT_SUCCEEDED(r)) { \
+ fprintf(stderr, "should have failed line %d (%d)\n", \
+ __LINE__, r); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_I(a, b) \
+ do { \
+ if ((a) != (b)) { \
+ fprintf(stderr, "got %d expected %d line %d\n", \
+ (int)a, (int)b, __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_F(a, b) \
+ do { \
+ if ((a) != (b)) { \
+ fprintf(stderr, "got %f, expected %f line %d\n", \
+ (float)a, (float)b, __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+#define SHOULD_EQUAL_S(a, b) \
+ do { \
+ if (!NPT_StringsEqual(a,b)) { \
+ fprintf(stderr, "got %s, expected %s line %d\n", \
+ a, b, __LINE__); \
+ NPT_ASSERT(0); \
+ } \
+ } while(0)
+
+/*----------------------------------------------------------------------
+| TestSuiteGetTime
++---------------------------------------------------------------------*/
+static void
+TestSuiteGetTime()
+{
+ NPT_TimeStamp now, now2;
+ NPT_DateTime today;
+
+ /* get utc time */
+ SHOULD_SUCCEED(NPT_System::GetCurrentTimeStamp(now));
+
+ /* convert utc time to date */
+ SHOULD_SUCCEED(today.FromTimeStamp(now));
+
+ /* convert local time back to utc */
+ SHOULD_SUCCEED(today.ToTimeStamp(now2));
+
+ /* verify utc time has not change */
+ SHOULD_EQUAL_I(now.ToSeconds(), now2.ToSeconds());
+}
+
+/*----------------------------------------------------------------------
+| TestSuiteSetDateTimeZone
++---------------------------------------------------------------------*/
+static void
+TestSuiteSetDateTimeZone()
+{
+ NPT_TimeStamp now, now2;
+ NPT_DateTime today, today2;
+ NPT_Int32 tz;
+
+ /* get utc time */
+ SHOULD_SUCCEED(NPT_System::GetCurrentTimeStamp(now));
+
+ /* convert utc time to date */
+ SHOULD_SUCCEED(today.FromTimeStamp(now));
+
+ for (tz = -60*12; tz <= 60*12; tz+=30) {
+ /* convert date to another timezone */
+ today2 = today;
+ SHOULD_SUCCEED(today2.ChangeTimeZone(tz));
+
+ /* get timestamp from converted date */
+ SHOULD_SUCCEED(today2.ToTimeStamp(now2));
+
+ /* verify utc time has not change */
+ SHOULD_EQUAL_I(now.ToSeconds(), now2.ToSeconds());
+ }
+}
+
+/*----------------------------------------------------------------------
+| TestSuiteFormatTime
++---------------------------------------------------------------------*/
+static void
+TestSuiteFormatTime()
+{
+ NPT_DateTime gmt_today, tz_today;
+ NPT_TimeStamp now;
+ NPT_String output_s;
+
+ /* current time */
+ SHOULD_SUCCEED(NPT_System::GetCurrentTimeStamp(now));
+
+ /* get the date */
+ SHOULD_SUCCEED(gmt_today.FromTimeStamp(now));
+
+ /* print out current local date and daylight savings settings */
+ /* this should convert to GMT internally if dst is set */
+ printf("GMT time for Today is: %s\n", gmt_today.ToString().GetChars());
+
+ /* convert the date to GMT-8 */
+ tz_today = gmt_today;
+ SHOULD_SUCCEED(tz_today.ChangeTimeZone(-8*60));
+
+ /* this should convert to GMT internally if dst is set */
+ printf("(GMT-8) time for Today is: %s\n", tz_today.ToString(NPT_DateTime::FORMAT_RFC_1123).GetChars());
+ printf("(GMT-8) time for Today is: %s\n", tz_today.ToString(NPT_DateTime::FORMAT_RFC_1036).GetChars());
+ printf("(GMT-8) time for Today is: %s\n", tz_today.ToString(NPT_DateTime::FORMAT_ANSI).GetChars());
+ printf("(GMT-8) time for Today is: %s\n", tz_today.ToString(NPT_DateTime::FORMAT_W3C).GetChars());
+
+ /* print with RFC1123 */
+ printf("GMT time for Today is: %s\n", gmt_today.ToString(NPT_DateTime::FORMAT_RFC_1123).GetChars());
+ printf("GMT time for Today is: %s\n", gmt_today.ToString(NPT_DateTime::FORMAT_RFC_1036).GetChars());
+ printf("GMT time for Today is: %s\n", gmt_today.ToString(NPT_DateTime::FORMAT_ANSI).GetChars());
+ printf("GMT time for Today is: %s\n", gmt_today.ToString(NPT_DateTime::FORMAT_W3C).GetChars());
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** /*argv*/)
+{
+ TestSuiteGetTime();
+ TestSuiteSetDateTimeZone();
+ TestSuiteFormatTime();
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Tools/SsdpProxy/SsdpProxy.cpp b/lib/libUPnP/Platinum/Source/Tools/SsdpProxy/SsdpProxy.cpp
new file mode 100644
index 0000000..a0643a9
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tools/SsdpProxy/SsdpProxy.cpp
@@ -0,0 +1,405 @@
+/*****************************************************************
+|
+| Platinum - Ssdp Proxy
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "SsdpProxy.h"
+#include "PltUPnPHelper.h"
+
+#if defined (WIN32)
+#include <windows.h>
+#include <conio.h>
+#else
+#include <unistd.h>
+#endif
+
+NPT_SET_LOCAL_LOGGER("platinum.tools.ssdpproxy")
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static struct {
+ NPT_UInt32 port;
+} Options;
+
+/*----------------------------------------------------------------------
+| PLT_SsdpProxy::PLT_SsdpProxy
++---------------------------------------------------------------------*/
+PLT_SsdpProxy::PLT_SsdpProxy() :
+ m_UnicastListener(NULL)
+{
+
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpProxy::~PLT_SsdpProxy
++---------------------------------------------------------------------*/
+PLT_SsdpProxy::~PLT_SsdpProxy()
+{
+ delete m_UnicastListener;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpProxy::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpProxy::Start(NPT_UInt32 port)
+{
+ /* create a SSDP multicast listener task */
+ NPT_Socket* multicast_socket = new NPT_UdpMulticastSocket();
+ NPT_CHECK_SEVERE(multicast_socket->Bind(NPT_SocketAddress(NPT_IpAddress::Any, 1900)));
+ PLT_SsdpListenTask* m_SsdpMulticastListenTask = new PLT_SsdpListenTask(multicast_socket, true);
+ NPT_CHECK_SEVERE(m_SsdpMulticastListenTask->AddListener(this));
+ NPT_CHECK_SEVERE(StartTask(m_SsdpMulticastListenTask));
+
+ /* create a SSDP unicast listener task */
+ /* any broadcast message sent to that, we will receive */
+ NPT_Socket* unicast_socket = new NPT_UdpSocket();
+ NPT_CHECK_SEVERE(unicast_socket->Bind(NPT_SocketAddress(NPT_IpAddress::Any, port)));
+ m_UnicastListener = new PLT_SsdpUnicastListener(this);
+ PLT_SsdpListenTask* m_SsdpUnicastListenTask = new PLT_SsdpListenTask(unicast_socket, false);
+ NPT_CHECK_SEVERE(m_SsdpUnicastListenTask->AddListener(m_UnicastListener));
+ NPT_CHECK_SEVERE(StartTask(m_SsdpUnicastListenTask));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| CopyRequest
++---------------------------------------------------------------------*/
+static NPT_HttpRequest*
+CopyRequest(const NPT_HttpUrl& url, NPT_HttpRequest* request)
+{
+ NPT_HttpRequest* new_request = new NPT_HttpRequest(
+ url,
+ request->GetMethod(),
+ request->GetProtocol());
+ NPT_List<NPT_HttpHeader*>::Iterator headers = request->GetHeaders().GetHeaders().GetFirstItem();
+ while (headers) {
+ new_request->GetHeaders().AddHeader((*headers)->GetName(), (*headers)->GetValue());
+ ++headers;
+ }
+
+ return new_request;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpProxy::OnSsdpPacket
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpProxy::OnSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ // is it a forward message ?
+ if (request.GetHeaders().GetHeader("X_SsdpProxy"))
+ return NPT_SUCCESS;
+
+ request.GetHeaders().AddHeader("X_SsdpProxy", "forwarded");
+
+ // override MX to force a fast response
+ NPT_UInt32 MX;
+ if (NPT_SUCCEEDED(PLT_UPnPMessageHelper::GetMX(request, MX))) {
+ PLT_UPnPMessageHelper::SetMX(request, 1);
+ }
+
+ // for each interface, send this request on the broadcast address
+ NPT_List<NPT_NetworkInterface*> if_list;
+ NPT_List<NPT_NetworkInterface*>::Iterator net_if;
+ NPT_List<NPT_NetworkInterfaceAddress>::Iterator net_if_addr;
+ NPT_CHECK(NPT_NetworkInterface::GetNetworkInterfaces(if_list));
+
+ for (net_if = if_list.GetFirstItem(); net_if; net_if++) {
+ if (!((*net_if)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_BROADCAST) ||
+ ((*net_if)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_LOOPBACK))
+ continue;
+
+ for (net_if_addr = (*net_if)->GetAddresses().GetFirstItem(); net_if_addr; net_if_addr++) {
+ // copy request
+ NPT_HttpRequest* new_request = CopyRequest(
+ NPT_HttpUrl((*net_if_addr).GetBroadcastAddress().ToString(), 1900, request.GetUrl().GetPath()),
+ &request);
+
+ // create search task to send request in broadcast
+ // and forward unicast responses back to remote in unicast
+ PLT_SsdpProxyForwardTask* task = new PLT_SsdpProxyForwardTask(
+ new NPT_UdpSocket(),
+ new_request,
+ 10000,
+ context.GetRemoteAddress());
+ StartTask(task);
+ }
+ }
+
+ if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+
+ // send special broadcast message for xbox
+ NPT_HttpRequest* new_request = CopyRequest(
+ NPT_HttpUrl("255.255.255.255", 1900, request.GetUrl().GetPath()),
+ &request);
+
+ // create search task to send request in broadcast
+ // and forward unicast responses back to remote in unicast
+ PLT_SsdpProxyForwardTask* task = new PLT_SsdpProxyForwardTask(
+ new NPT_UdpSocket(),
+ new_request,
+ 10000,
+ context.GetRemoteAddress());
+ StartTask(task);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpProxy::OnUnicastSsdpPacket
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpProxy::OnUnicastSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ // is it a forward message ?
+ if (request.GetHeaders().GetHeader("X_SsdpProxy"))
+ return NPT_SUCCESS;
+
+ request.GetHeaders().AddHeader("X_SsdpProxy", "forwarded");
+
+ // look on which interface we received it and send the ssdp search request on this only
+ NPT_List<NPT_NetworkInterface*> if_list;
+ NPT_List<NPT_NetworkInterface*>::Iterator net_if;
+ NPT_List<NPT_NetworkInterfaceAddress>::Iterator net_if_addr;
+
+ NPT_CHECK_SEVERE(NPT_NetworkInterface::GetNetworkInterfaces(if_list));
+
+ for (net_if = if_list.GetFirstItem(); net_if; net_if++) {
+ //if (!((*net_if)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_MULTICAST) ||
+ // (*net_if)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_LOOPBACK) {
+ if ((*net_if)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_LOOPBACK) {
+ continue;
+ }
+
+ for (net_if_addr = (*net_if)->GetAddresses().GetFirstItem(); net_if_addr; net_if_addr++) {
+ // by using the netmask on each interface, we can figure out if the remote IP address
+ // we received the request from matches the interface we want to multicast to.
+ // it's important to do that as to avoid sending a NOTIFY or M-SEARCH packet to a host
+ // that would not be reachable from the remote which sends this packet in the first place
+ int i=0;
+ while (i<4) {
+ if ((context.GetRemoteAddress().GetIpAddress().AsBytes()[i] & (*net_if_addr).GetNetMask().AsBytes()[i]) !=
+ ((*net_if_addr).GetPrimaryAddress().AsBytes()[i] & (*net_if_addr).GetNetMask().AsBytes()[i])) {
+ break;
+ }
+ i++;
+ }
+
+ /* check that we have a match */
+ if (i != 4) {
+ continue;
+ }
+
+ // override MX to force a fast response
+ NPT_UInt32 MX;
+ if (NPT_SUCCEEDED(PLT_UPnPMessageHelper::GetMX(request, MX))) {
+ PLT_UPnPMessageHelper::SetMX(request, 1);
+ }
+
+ // unicast
+ // WMC doesn't respond to multicast searches issued from the same machine
+ // a work around is to send a unicast request!
+ // copy request and change host header
+ NPT_HttpRequest* unicast_request = CopyRequest(
+ NPT_HttpUrl((*net_if_addr).GetPrimaryAddress().ToString(), 1900, request.GetUrl().GetPath()),
+ &request);
+
+ // create unicast socket
+ NPT_UdpSocket* unicast_socket = new NPT_UdpSocket();
+ // create search task to send request in unicast
+ // and forward responses back to remote
+ PLT_SsdpProxyForwardTask* uncast_task = new PLT_SsdpProxyForwardTask(
+ unicast_socket,
+ unicast_request,
+ 10000,
+ context.GetRemoteAddress());
+ StartTask(uncast_task);
+
+ // multicast
+ // simply redirect request to 239.255.255.250
+ NPT_HttpRequest* new_request = CopyRequest(
+ NPT_HttpUrl("239.255.255.250", 1900, request.GetUrl().GetPath()),
+ &request);
+
+ // create multicast socket
+ NPT_UdpMulticastSocket* socket = new NPT_UdpMulticastSocket();
+ socket->SetInterface((*net_if_addr).GetPrimaryAddress());
+ socket->SetTimeToLive(4);
+
+ // create search task to send request in multicast
+ // and forward responses back to remote
+ PLT_SsdpProxyForwardTask* task = new PLT_SsdpProxyForwardTask(
+ socket,
+ new_request,
+ 10000,
+ context.GetRemoteAddress());
+ StartTask(task);
+ }
+ }
+
+ if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>());
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpUnicastListener::OnSsdpPacket
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpUnicastListener::OnSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ return m_Proxy->OnUnicastSsdpPacket(request, context);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpProxyForwardTask::PLT_SsdpProxyForwardTask
++---------------------------------------------------------------------*/
+PLT_SsdpProxyForwardTask::PLT_SsdpProxyForwardTask(NPT_UdpSocket* socket,
+ NPT_HttpRequest* request,
+ NPT_Timeout timeout,
+ const NPT_SocketAddress& forward_address) :
+ PLT_SsdpSearchTask(socket, NULL, request, timeout, false),
+ m_ForwardAddress(forward_address)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpProxyForwardTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpProxyForwardTask::ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(context);
+ NPT_COMPILER_UNUSED(request);
+
+ if (NPT_FAILED(res) || response == NULL) return NPT_FAILURE;
+
+ // use a memory stream to write the response
+ NPT_MemoryStream stream;
+ NPT_CHECK_SEVERE(response->Emit(stream));
+
+ // copy stream into a data packet and forward it
+ NPT_LargeSize size;
+ stream.GetSize(size);
+ if (size != (NPT_Size)size) return NPT_ERROR_OUT_OF_RANGE;
+
+ NPT_DataBuffer packet(stream.GetData(), (NPT_Size)size);
+ NPT_UdpSocket socket;
+ return socket.Send(packet, &m_ForwardAddress);
+}
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(char** args)
+{
+ fprintf(stderr, "usage: %s [-p <port>] \n", args[0]);
+ fprintf(stderr, "-p : optional upnp unicast ssdp port (default: 1901)\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| ParseCommandLine
++---------------------------------------------------------------------*/
+static void
+ParseCommandLine(char** args)
+{
+ const char* arg;
+ char** tmp = args+1;
+
+ /* default values */
+ Options.port = 1900;
+
+ while ((arg = *tmp++)) {
+ if (!strcmp(arg, "-p")) {
+ if (NPT_FAILED(NPT_ParseInteger32(*tmp++, Options.port, false))) {
+ fprintf(stderr, "ERROR: invalid argument\n");
+ PrintUsageAndExit(args);
+ }
+ } else {
+ fprintf(stderr, "ERROR: invalid arguments\n");
+ PrintUsageAndExit(args);
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ NPT_COMPILER_UNUSED(argc);
+
+ //PLT_SetLogLevel(4);
+ PLT_SsdpProxy proxy;
+
+ /* parse command line */
+ ParseCommandLine(argv);
+
+ NPT_Result res = proxy.Start(Options.port);
+ if (res == NPT_ERROR_BIND_FAILED) {
+ fprintf(stderr, "ERROR: couldn't bind to port %d\n", Options.port);
+ return -1;
+ } else if (NPT_FAILED(res)) {
+ fprintf(stderr, "ERROR: unknown (%d)\n", res);
+ return -1;
+ }
+
+ fprintf(stdout, "Listening for SSDP unicast packets on port %d\n", Options.port);
+ fprintf(stdout, "Enter q to quit\n");
+
+ char buf[256];
+ while (gets(buf)) {
+ if (*buf == 'q')
+ break;
+ }
+
+ return 0;
+}
diff --git a/lib/libUPnP/Platinum/Source/Tools/SsdpProxy/SsdpProxy.h b/lib/libUPnP/Platinum/Source/Tools/SsdpProxy/SsdpProxy.h
new file mode 100644
index 0000000..3dc4bc9
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tools/SsdpProxy/SsdpProxy.h
@@ -0,0 +1,109 @@
+/*****************************************************************
+|
+| Platinum - Ssdp Proxy tool
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_SSDP_PROXY_H_
+#define _PLT_SSDP_PROXY_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltTaskManager.h"
+#include "PltSsdp.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_SsdpUnicastListener;
+
+/*----------------------------------------------------------------------
+| PLT_SsdpProxy class
++---------------------------------------------------------------------*/
+class PLT_SsdpProxy : public PLT_TaskManager,
+ public PLT_SsdpPacketListener
+{
+public:
+ PLT_SsdpProxy();
+ ~PLT_SsdpProxy();
+
+ NPT_Result Start(NPT_UInt32 port);
+
+ // PLT_SsdpPacketListener method
+ virtual NPT_Result OnSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context);
+
+ // PLT_SsdpUnicastListener redirect
+ virtual NPT_Result OnUnicastSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context);
+
+private:
+ PLT_SsdpUnicastListener* m_UnicastListener;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpUnicastListener class
++---------------------------------------------------------------------*/
+class PLT_SsdpUnicastListener : public PLT_SsdpPacketListener
+{
+public:
+ PLT_SsdpUnicastListener(PLT_SsdpProxy* proxy) : m_Proxy(proxy) {}
+
+ // PLT_SsdpPacketListener method
+ NPT_Result OnSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context);
+
+private:
+ PLT_SsdpProxy* m_Proxy;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpProxySearchResponseListener class
++---------------------------------------------------------------------*/
+class PLT_SsdpProxyForwardTask : public PLT_SsdpSearchTask
+{
+public:
+ PLT_SsdpProxyForwardTask(NPT_UdpSocket* socket,
+ NPT_HttpRequest* request,
+ NPT_Timeout timeout,
+ const NPT_SocketAddress& forward_address);
+
+ NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+private:
+ NPT_SocketAddress m_ForwardAddress;
+};
+
+#endif // _PLT_SSDP_PROXY_H_
diff --git a/lib/libUPnP/Platinum/Source/Tools/TextToHeader/TextToHeader.cpp b/lib/libUPnP/Platinum/Source/Tools/TextToHeader/TextToHeader.cpp
new file mode 100644
index 0000000..2e1aad7
--- /dev/null
+++ b/lib/libUPnP/Platinum/Source/Tools/TextToHeader/TextToHeader.cpp
@@ -0,0 +1,267 @@
+/*****************************************************************
+|
+| Platinum - Tool text to .h
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| 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
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| 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; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+static struct {
+ const char* in_filename;
+ const char* variable_name;
+ const char* header_name;
+ const char* out_filename;
+} Options;
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(char** args)
+{
+ fprintf(stderr, "usage: %s [-v <variable> -h <header name>] <intput> <output>\n", args[0]);
+ fprintf(stderr, "-v : optional variable name\n");
+ fprintf(stderr, "-h : optional header name\n");
+ fprintf(stderr, "<input> : input scpd filename\n");
+ fprintf(stderr, "<output> : output filename\n");
+ exit(1);
+}
+
+/*----------------------------------------------------------------------
+| ParseCommandLine
++---------------------------------------------------------------------*/
+static void
+ParseCommandLine(char** args)
+{
+ const char* arg;
+ char** tmp = args+1;
+
+ /* default values */
+ Options.in_filename = NULL;
+ Options.variable_name = NULL;
+ Options.out_filename = NULL;
+
+ while ((arg = *tmp++)) {
+ if (!strcmp(arg, "-v")) {
+ Options.variable_name = *tmp++;
+ } else if (!strcmp(arg, "-h")) {
+ Options.header_name = *tmp++;
+ } else if (Options.in_filename == NULL) {
+ Options.in_filename = arg;
+ } else if (Options.out_filename == NULL) {
+ Options.out_filename = arg;
+ } else {
+ fprintf(stderr, "ERROR: too many arguments\n");
+ PrintUsageAndExit(args);
+ }
+ }
+
+ /* check args */
+ if (Options.in_filename == NULL) {
+ fprintf(stderr, "ERROR: input filename missing\n");
+ PrintUsageAndExit(args);
+ }
+ if (Options.out_filename == NULL) {
+ fprintf(stderr, "ERROR: output filename missing\n");
+ PrintUsageAndExit(args);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PrintHex
++---------------------------------------------------------------------*/
+/*static void
+PrintHex(unsigned char* h, unsigned int size)
+{
+ unsigned int i;
+ for (i=0; i<size; i++) {
+ printf("%c%c",
+ h[i]>>4 >= 10 ?
+ 'A' + (h[i]>>4)-10 :
+ '0' + (h[i]>>4),
+ (h[i]&0xF) >= 10 ?
+ 'A' + (h[i]&0xF)-10 :
+ '0' + (h[i]&0xF));
+ }
+}*/
+
+/*----------------------------------------------------------------------
+| PrintHexForHeader
++---------------------------------------------------------------------*/
+static void
+PrintHexForHeader(FILE* out, unsigned char h)
+{
+ fprintf(out, "0x%c%c",
+ h>>4 >= 10 ?
+ 'A' + (h>>4)-10 :
+ '0' + (h>>4),
+ (h&0xF) >= 10 ?
+ 'A' + (h&0xF)-10 :
+ '0' + (h&0xF));
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int /*argc*/, char** argv)
+{
+ FILE* in;
+ FILE* out;
+ unsigned char* data_block = NULL;
+ unsigned long data_block_size;
+ unsigned long k;
+ unsigned char col;
+
+ /* parse command line */
+ ParseCommandLine(argv);
+
+ /* open input */
+ in = fopen(Options.in_filename, "rb");
+ if (in == NULL) {
+ fprintf(stderr, "ERROR: cannot open input file (%s): %s\n",
+ Options.in_filename, strerror(errno));
+ }
+
+ /* read data in one chunk */
+ {
+ struct stat info;
+ if (stat(Options.in_filename, &info)) {
+ fprintf(stderr, "ERROR: cannot get input file size\n");
+ return 1;
+ }
+
+ data_block_size = info.st_size;
+ data_block = (unsigned char*)new unsigned char[data_block_size+1];
+ if (data_block == NULL) {
+ fprintf(stderr, "ERROR: out of memory\n");
+ return 1;
+ }
+
+ if (fread(data_block, data_block_size, 1, in) != 1) {
+ fprintf(stderr, "ERROR: cannot read input file\n");
+ return 1;
+ }
+ data_block[data_block_size++] = 0;
+ }
+
+ /* open output */
+ out = fopen(Options.out_filename, "w+");
+ if (out == NULL) {
+ fprintf(stderr, "ERROR: cannot open out output file (%s): %s\n",
+ Options.out_filename, strerror(errno));
+ }
+ fprintf(out,
+"/*****************************************************************\n"
+"|\n"
+"| Platinum - %s SCPD\n"
+"|\n"
+"| Copyright (c) 2004-2008, Plutinosoft, LLC.\n"
+"| All rights reserved.\n"
+"| http://www.plutinosoft.com\n"
+"|\n"
+"| This program is free software; you can redistribute it and/or\n"
+"| modify it under the terms of the GNU General Public License\n"
+"| as published by the Free Software Foundation; either version 2\n"
+"| of the License, or (at your option) any later version.\n"
+"|\n"
+"| OEMs, ISVs, VARs and other distributors that combine and \n"
+"| distribute commercially licensed software with Platinum software\n"
+"| and do not wish to distribute the source code for the commercially\n"
+"| licensed software under version 2, or (at your option) any later\n"
+"| version, of the GNU General Public License (the \"GPL\") must enter\n"
+"| into a commercial license agreement with Plutinosoft, LLC.\n"
+"| \n"
+"| This program is distributed in the hope that it will be useful,\n"
+"| but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+"| GNU General Public License for more details.\n"
+"|\n"
+"| You should have received a copy of the GNU General Public License\n"
+"| along with this program; see the file LICENSE.txt. If not, write to\n"
+"| the Free Software Foundation, Inc., \n"
+"| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n"
+"| http://www.gnu.org/licenses/gpl-2.0.html\n"
+"|\n"
+"****************************************************************/\n",
+ Options.header_name?Options.header_name:"");
+ fprintf(out, "\n"
+"/*----------------------------------------------------------------------\n"
+"| includes\n"
+"+---------------------------------------------------------------------*/\n");
+ fprintf(out, "#include \"NptTypes.h\"\n");
+ fprintf(out, "\n"
+"/*----------------------------------------------------------------------\n"
+"| globals\n"
+"+---------------------------------------------------------------------*/\n");
+ fprintf(out, "NPT_UInt8 %s[] =\n",
+ Options.variable_name?Options.variable_name:"kData");
+ fprintf(out, "{\n ");
+ col = 0;
+
+ /* rewind the input file */
+ fseek(in, 0, SEEK_SET);
+
+ for (k = 0; k < data_block_size; k++) {
+ //PrintHex(&data_block[k], 1);
+ PrintHexForHeader(out, data_block[k]);
+ if (k < data_block_size - 1) fprintf(out, ", ");
+
+ /* wrap around 20 columns */
+ if (++col > 19) {
+ col = 0;
+ fprintf(out, "\n ");
+ }
+ }
+
+ /* print footer */
+ fprintf(out, "\n};\n\n");
+
+ /* close file */
+ fclose(out);
+
+ /* close file */
+ fclose(in);
+
+ if (data_block) {
+ delete[] data_block;
+ }
+ return 0;
+}
diff --git a/lib/libUPnP/patches/0001-platinum-fix-compile-error-in-NptWin32Threads.cpp.patch b/lib/libUPnP/patches/0001-platinum-fix-compile-error-in-NptWin32Threads.cpp.patch
new file mode 100644
index 0000000..e66f491
--- /dev/null
+++ b/lib/libUPnP/patches/0001-platinum-fix-compile-error-in-NptWin32Threads.cpp.patch
@@ -0,0 +1,14 @@
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
+@@ -636,10 +636,10 @@
+ } else {
+ return NPT_SUCCESS;
+ }
+-| NPT_Win32Thread::CancelBlockerSocket
+ }
+
+ /*----------------------------------------------------------------------
++| NPT_Win32Thread::CancelBlockerSocket
+ +---------------------------------------------------------------------*/
+ NPT_Result
+ NPT_Win32Thread::CancelBlockerSocket()
diff --git a/lib/libUPnP/patches/0002-platinum-add-custom-CMakeLists.txt.patch b/lib/libUPnP/patches/0002-platinum-add-custom-CMakeLists.txt.patch
new file mode 100644
index 0000000..c45643e
--- /dev/null
+++ b/lib/libUPnP/patches/0002-platinum-add-custom-CMakeLists.txt.patch
@@ -0,0 +1,132 @@
+--- /dev/null 2018-02-07 16:00:11.607220700 +0100
++++ b/lib/libUPnP/CMakeLists.txt 2018-02-12 11:03:15.002174234 +0100
+@@ -0,0 +1,129 @@
++set(SOURCES Platinum/Source/Core/PltAction.cpp
++ Platinum/Source/Core/PltArgument.cpp
++ Platinum/Source/Core/PltConstants.cpp
++ Platinum/Source/Core/PltCtrlPoint.cpp
++ Platinum/Source/Core/PltCtrlPointTask.cpp
++ Platinum/Source/Core/PltDatagramStream.cpp
++ Platinum/Source/Core/PltDeviceData.cpp
++ Platinum/Source/Core/PltDeviceHost.cpp
++ Platinum/Source/Core/PltEvent.cpp
++ Platinum/Source/Core/PltHttp.cpp
++ Platinum/Source/Core/PltHttpClientTask.cpp
++ Platinum/Source/Core/PltHttpServer.cpp
++ Platinum/Source/Core/PltHttpServerTask.cpp
++ Platinum/Source/Core/PltIconsData.cpp
++ Platinum/Source/Core/PltMimeType.cpp
++ Platinum/Source/Core/PltProtocolInfo.cpp
++ Platinum/Source/Core/PltService.cpp
++ Platinum/Source/Core/PltSsdp.cpp
++ Platinum/Source/Core/PltStateVariable.cpp
++ Platinum/Source/Core/PltTaskManager.cpp
++ Platinum/Source/Core/PltThreadTask.cpp
++ Platinum/Source/Core/PltUPnP.cpp
++ Platinum/Source/Devices/MediaServer/PltDidl.cpp
++ Platinum/Source/Devices/MediaServer/PltFileMediaServer.cpp
++ Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
++ Platinum/Source/Devices/MediaServer/PltMediaCache.cpp
++ Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++ Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
++ Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.cpp
++ Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.cpp
++ Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp
++ Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
++ Neptune/Source/Core/Neptune.cpp
++ Neptune/Source/Core/NptAutomaticCleaner.cpp
++ Neptune/Source/Core/NptBase64.cpp
++ Neptune/Source/Core/NptBufferedStreams.cpp
++ Neptune/Source/Core/NptCommon.cpp
++ Neptune/Source/Core/NptDataBuffer.cpp
++ Neptune/Source/Core/NptDebug.cpp
++ Neptune/Source/Core/NptFile.cpp
++ Neptune/Source/Core/NptHash.cpp
++ Neptune/Source/Core/NptHttp.cpp
++ Neptune/Source/Core/NptList.cpp
++ Neptune/Source/Core/NptLogging.cpp
++ Neptune/Source/Core/NptMessaging.cpp
++ Neptune/Source/Core/NptNetwork.cpp
++ Neptune/Source/Core/NptQueue.cpp
++ Neptune/Source/Core/NptResults.cpp
++ Neptune/Source/Core/NptRingBuffer.cpp
++ Neptune/Source/Core/NptSimpleMessageQueue.cpp
++ Neptune/Source/Core/NptSockets.cpp
++ Neptune/Source/Core/NptStreams.cpp
++ Neptune/Source/Core/NptStrings.cpp
++ Neptune/Source/Core/NptSystem.cpp
++ Neptune/Source/Core/NptThreads.cpp
++ Neptune/Source/Core/NptTime.cpp
++ Neptune/Source/Core/NptTls.cpp
++ Neptune/Source/Core/NptUri.cpp
++ Neptune/Source/Core/NptUtils.cpp
++ Neptune/Source/Core/NptXml.cpp
++ Neptune/Source/System/Bsd/NptBsdResolver.cpp
++ Neptune/Source/System/Bsd/NptBsdSockets.cpp
++ Neptune/Source/System/StdC/NptStdcDebug.cpp
++ Neptune/Source/System/StdC/NptStdcEnvironment.cpp
++ Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp
++ Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp
++ Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp
++ Platinum/Source/Devices/MediaRenderer/RdrConnectionManagerSCPD.cpp
++ Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.cpp
++ Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.cpp
++ Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp
++ Neptune/Source/System/Posix/NptPosixEnvironment.cpp)
++
++if(NOT CORE_SYSTEM_NAME STREQUAL windows AND NOT CORE_SYSTEM_NAME STREQUAL windowsstore)
++ list(APPEND SOURCES Neptune/Source/System/Posix/NptPosixSystem.cpp
++ Neptune/Source/System/Posix/NptSelectableMessageQueue.cpp
++ Neptune/Source/System/Posix/NptPosixQueue.cpp
++ Neptune/Source/System/Posix/NptPosixThreads.cpp
++ Neptune/Source/System/Posix/NptPosixTime.cpp
++ Neptune/Source/System/Bsd/NptBsdNetwork.cpp)
++ if(APPLE)
++ list(APPEND SOURCES Neptune/Source/System/Apple/NptAppleAutoreleasePool.mm)
++ else()
++ list(APPEND SOURCES Neptune/Source/System/Null/NptNullAutoreleasePool.cpp)
++ endif()
++else()
++ list(APPEND SOURCES Neptune/Source/System/Win32/NptWin32Console.cpp
++ Neptune/Source/System/Win32/NptWin32Debug.cpp
++ Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp
++ Neptune/Source/System/Win32/NptWin32MessageQueue.cpp
++ Neptune/Source/System/Win32/NptWin32Network.cpp
++ Neptune/Source/System/Win32/NptWin32Queue.cpp
++ Neptune/Source/System/Win32/NptWin32SerialPort.cpp
++ Neptune/Source/System/Win32/NptWin32System.cpp
++ Neptune/Source/System/Win32/NptWin32Threads.cpp
++ Neptune/Source/System/Win32/NptWin32Time.cpp)
++endif()
++
++if(CORE_SYSTEM_NAME STREQUAL "freebsd")
++ list(APPEND SOURCES Neptune/Source/System/Bsd/NptBsdResolver.cpp
++ Neptune/Source/System/Bsd/NptBsdSockets.cpp)
++endif()
++
++
++add_library(upnp STATIC ${SOURCES} ${HEADERS})
++target_compile_definitions(upnp PUBLIC -DNPT_CONFIG_ENABLE_LOGGING)
++if(CORE_SYSTEM_NAME STREQUAL "freebsd")
++ target_compile_definitions(upnp PUBLIC -DNPT_CONFIG_HAVE_GETADDRINFO)
++endif()
++
++target_include_directories(upnp PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
++ Platinum/Source/Core
++ Platinum/Source/Platinum
++ Platinum/Source/Devices/MediaConnect
++ Platinum/Source/Devices/MediaRenderer
++ Platinum/Source/Devices/MediaServer
++ Platinum/Source/Extras
++ Neptune/Source/Core
++ Neptune/Source/System/Posix)
++if(CORE_SYSTEM_NAME STREQUAL windows OR CORE_SYSTEM_NAME STREQUAL windowsstore)
++ target_include_directories(upnp PRIVATE Neptune/Source/System/Win32)
++endif()
++set_target_properties(upnp PROPERTIES FOLDER lib)
++source_group_by_folder(upnp)
++set(core_DEPENDS upnp ${core_DEPENDS} CACHE STRING "" FORCE)
++
++if(CORE_SYSTEM_NAME STREQUAL windowsstore)
++ set_target_properties(upnp PROPERTIES STATIC_LIBRARY_FLAGS "/ignore:4264")
++endif()
diff --git a/lib/libUPnP/patches/0003-platinum-log-allowed-values-with-state-variable-erro.patch b/lib/libUPnP/patches/0003-platinum-log-allowed-values-with-state-variable-erro.patch
new file mode 100644
index 0000000..5a39207
--- /dev/null
+++ b/lib/libUPnP/patches/0003-platinum-log-allowed-values-with-state-variable-erro.patch
@@ -0,0 +1,39 @@
+From 60f546b6f4a54a399a0cd0cece84486b7018c477 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Wed, 6 Jun 2012 17:04:31 +0100
+Subject: [PATCH 03/24] platinum: log allowed values with state variable
+ errors
+
+---
+ lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
+index a772bbf..c3eb7cc 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
++++ b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
+@@ -198,12 +198,16 @@ PLT_StateVariable::ValidateValue(const char* value)
+ NPT_List<NPT_String>::Iterator val = values.GetFirstItem();
+ while (val) {
+ val->Trim(" ");
+- if (!m_AllowedValues.Find(NPT_StringFinder(*val))) {
+- NPT_LOG_WARNING_2("Invalid value of %s for state variable %s",
+- (const char*)*val,
+- (const char*)m_Name);
++ if (!m_AllowedValues.Find(NPT_StringFinder(*val))) {
++ NPT_LOG_WARNING_2("Invalid value of %s for state variable %s",
++ (const char*)*val,
++ (const char*)m_Name);
++ for (unsigned long i=0; i < m_AllowedValues.GetItemCount(); i++) {
++ NPT_String *val = *m_AllowedValues.GetItem(i);
++ NPT_LOG_WARNING_1("Allowed: %s", (const char*)*val);
++ }
+ return NPT_ERROR_INVALID_PARAMETERS;
+- }
++ }
+ ++val;
+ }
+ }
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0004-platinum-make-sure-Neptune-threads-are-named.patch b/lib/libUPnP/patches/0004-platinum-make-sure-Neptune-threads-are-named.patch
new file mode 100644
index 0000000..8279e19
--- /dev/null
+++ b/lib/libUPnP/patches/0004-platinum-make-sure-Neptune-threads-are-named.patch
@@ -0,0 +1,45 @@
+From e8af954923d374303564863c8fe6a41499bf43c5 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Wed, 6 Jun 2012 19:22:09 +0100
+Subject: [PATCH 04/24] platinum: make sure Neptune threads are named
+
+---
+ .../Source/System/Win32/NptWin32Threads.cpp | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
+index 9666a4c..8de7d74 100644
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
+@@ -525,6 +525,28 @@ NPT_Win32Thread::EntryPoint(void* argument)
+ NPT_System::GetCurrentTimeStamp(now);
+ NPT_System::SetRandomSeed((NPT_UInt32)(now.ToNanos()) + ::GetCurrentThreadId());
+
++ // set a default name
++ #pragma pack(push,8)
++ struct THREADNAME_INFO
++ {
++ DWORD dwType; // must be 0x1000
++ LPCSTR szName; // pointer to name (in same addr space)
++ DWORD dwThreadID; // thread ID (-1 caller thread)
++ DWORD dwFlags; // reserved for future use, most be zero
++ } info;
++ #pragma pack(pop)
++ info.dwType = 0x1000;
++ info.szName = "Neptune Thread";
++ info.dwThreadID = GetCurrentThreadId();
++ info.dwFlags = 0;
++ __try
++ {
++ RaiseException(0x406d1388, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info);
++ }
++ __except(EXCEPTION_EXECUTE_HANDLER)
++ {
++ }
++
+ thread->m_ThreadId = (DWORD)::GetCurrentThreadId();
+
+ // run the thread
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0005-platinum-use-server-provided-item-count-to-iterate-b.patch b/lib/libUPnP/patches/0005-platinum-use-server-provided-item-count-to-iterate-b.patch
new file mode 100644
index 0000000..b35bd0b
--- /dev/null
+++ b/lib/libUPnP/patches/0005-platinum-use-server-provided-item-count-to-iterate-b.patch
@@ -0,0 +1,95 @@
+From 883f4f02d741317f5c8c6866d38b4b78dd79adf1 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Wed, 6 Jun 2012 18:40:00 +0100
+Subject: [PATCH 05/24] platinum: use server provided item count to iterate
+ browse req
+
+all other modifications to libPlatinum/Neptune since codiqs last commit have
+been checked and are not required / have been included upstream
+
+the following patches therefore do not need to be reinstated:
+
+5e5156bde70bb4250c9d912e43656a19d008f110
+4df0a4cb1cd059f585de289a10ab915ce1bd95a8
+a6eaa587174f73c0fdd7a5130774772c7d475fec
+964b08aed02ee52d7f88250409b4e3fdd0363be3
+2f70d124f75d76813e48ecc26ffd9aa3625072aa
+299d326314619aa3a085f2c026e55860a75b3a5c
+5bbf59fbc049325ec4205fadaa0903a753b866ee
+370c8366ed83115558e4dcb00561207854c4f971
+755f17fe4353b7047ca04c16b7461d1ef3b8ed1b
+20c1ed61030f7a5bada60821507f29e54821b1a9
+0b11444d6e405fa17e73ef0abc9ceba25a559cce
+f96d966e7575b4d9f7c864ad153dd9fb968344c9
+99479c384176fd3f82d518506e560ba08ad57e40
+347aa55b6c55e2801ff7a421e8bcc02ce0314cab
+a1993bf0380b9ced60c39064833435e458aa5434
+f13f20aaa9493d58264c55f2a5b2cafd09435b0e
+95df1d019cb7ea64a6f748a9104db1ecd666af42
+887728b93d0a8cddd6a08bfddc4079f4c2ae82f8
+66d2daf7bd90f7be2cb4cdbc5088488627953e3f
+ec70e260e95becc5bfcd86512b245776ef9653ea
+296435b9a9262b23b49cbfb2302e36e730f292e7
+99e0a1eaf18ed07625143e4fadc6eb027f822857
+588a66a55067433ade77769a39c81552a995b38d
+3fd25488ba88b30cfa0f5b834bbde91a21f05a73
+---
+ .../Source/Devices/MediaServer/PltSyncMediaBrowser.cpp | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+index f6391fb..96c36df 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+@@ -36,6 +36,7 @@
+ | includes
+ +---------------------------------------------------------------------*/
+ #include "PltSyncMediaBrowser.h"
++#include <algorithm>
+
+ NPT_SET_LOCAL_LOGGER("platinum.media.server.syncbrowser")
+
+@@ -239,6 +240,7 @@ PLT_SyncMediaBrowser::BrowseSync(PLT_DeviceDataReference& device,
+ {
+ NPT_Result res = NPT_FAILURE;
+ NPT_Int32 index = start;
++ NPT_UInt32 count = 0;
+
+ // only cache metadata or if starting from 0 and asking for maximum
+ bool cache = m_UseCache && (metadata || (start == 0 && max_results == 0));
+@@ -270,9 +272,15 @@ PLT_SyncMediaBrowser::BrowseSync(PLT_DeviceDataReference& device,
+ }
+
+ // server returned no more, bail now
+- if (browse_data->info.items->GetItemCount() == 0)
++ if (browse_data->info.nr == 0)
+ break;
+
++ if (browse_data->info.nr != browse_data->info.items->GetItemCount()) {
++ NPT_LOG_WARNING_2("Server returned unexpected number of items (%d vs %d)",
++ browse_data->info.nr, browse_data->info.items->GetItemCount());
++ }
++ count += std::max<NPT_UInt32>(browse_data->info.nr, browse_data->info.items->GetItemCount());
++
+ if (list.IsNull()) {
+ list = browse_data->info.items;
+ } else {
+@@ -290,12 +298,12 @@ PLT_SyncMediaBrowser::BrowseSync(PLT_DeviceDataReference& device,
+ // Unless we were told to stop after reaching a certain amount to avoid
+ // length delays
+ // (some servers may return a total matches out of whack at some point too)
+- if ((browse_data->info.tm && browse_data->info.tm <= list->GetItemCount()) ||
+- (max_results && list->GetItemCount() >= max_results))
++ if ((browse_data->info.tm && browse_data->info.tm <= count) ||
++ (max_results && count >= max_results))
+ break;
+
+ // ask for the next chunk of entries
+- index = list->GetItemCount();
++ index = count;
+ } while(1);
+
+ done:
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0006-platinum-report-and-support-proper-mimetypes-for-mat.patch b/lib/libUPnP/patches/0006-platinum-report-and-support-proper-mimetypes-for-mat.patch
new file mode 100644
index 0000000..2817b27
--- /dev/null
+++ b/lib/libUPnP/patches/0006-platinum-report-and-support-proper-mimetypes-for-mat.patch
@@ -0,0 +1,40 @@
+From 0b4a39723d3476c8a279a787660065ac1a64767a Mon Sep 17 00:00:00 2001
+From: Joakim Plate <elupus@ecce.se>
+Date: Tue, 25 Sep 2012 23:32:48 +0200
+Subject: [PATCH 06/24] platinum: report and support proper mimetypes for
+ matroska
+
+---
+ lib/libUPnP/Neptune/Source/Core/NptHttp.cpp | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp b/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
+index 132746a..1700afc 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
++++ b/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
+@@ -2799,12 +2799,14 @@ NPT_HttpFileRequestHandler_DefaultFileTypeMap[] = {
+ {"aif", "audio/x-aiff"},
+ {"aifc", "audio/x-aiff"},
+ {"aiff", "audio/x-aiff"},
++ {"mka", "audio/x-matroska"},
+ {"mpa", "audio/mpeg"},
+ {"mp2", "audio/mpeg"},
+ {"mp3", "audio/mpeg"},
+ {"m4a", "audio/mp4"},
+ {"wma", "audio/x-ms-wma"},
+ {"wav", "audio/x-wav"},
++ {"mkv", "video/x-matroska"},
+ {"mpeg", "video/mpeg"},
+ {"mpg", "video/mpeg"},
+ {"mp4", "video/mp4"},
+@@ -2817,6 +2819,7 @@ NPT_HttpFileRequestHandler_DefaultFileTypeMap[] = {
+ {"wtv", "video/x-ms-wmv"},
+ {"asf", "video/x-ms-asf"},
+ {"mkv", "video/x-matroska"},
++ {"mk3d", "video/x-matroska-3d"},
+ {"flv", "video/x-flv"},
+ {"avi", "video/x-msvideo"},
+ {"divx", "video/x-msvideo"},
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0007-platinum-also-support-sort-criterias-in-format-res-p.patch b/lib/libUPnP/patches/0007-platinum-also-support-sort-criterias-in-format-res-p.patch
new file mode 100644
index 0000000..da4d936
--- /dev/null
+++ b/lib/libUPnP/patches/0007-platinum-also-support-sort-criterias-in-format-res-p.patch
@@ -0,0 +1,26 @@
+From 091b91cdba14242c965dc5a41d74ba00386a5d91 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Fri, 14 Sep 2012 11:12:03 +0100
+Subject: [PATCH 07/24] platinum: also support sort criterias in format
+ res@<property>
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+index b8ce964..e275069 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+@@ -342,6 +342,8 @@ PLT_MediaServer::ParseSort(const NPT_String& sort, NPT_List<NPT_String>& list)
+ NPT_List<NPT_String>::Iterator property = list.GetFirstItem();
+ while (property) {
+ NPT_List<NPT_String> parsed_property = (*property).Split(":");
++ if (parsed_property.GetItemCount() != 2)
++ parsed_property = (*property).Split("@");
+ if (parsed_property.GetItemCount() != 2 ||
+ (!(*property).StartsWith("-") && !(*property).StartsWith("+"))) {
+ NPT_LOG_WARNING_1("Invalid SortCriteria property %s", (*property).GetChars());
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0008-platinum-allow-some-statevariables-to-reset-to-defau.patch b/lib/libUPnP/patches/0008-platinum-allow-some-statevariables-to-reset-to-defau.patch
new file mode 100644
index 0000000..8841447
--- /dev/null
+++ b/lib/libUPnP/patches/0008-platinum-allow-some-statevariables-to-reset-to-defau.patch
@@ -0,0 +1,151 @@
+From 73a60837afb1a0ddf03ac500665c28853d95dca8 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Tue, 9 Oct 2012 10:14:39 +0100
+Subject: [PATCH 08/24] platinum: allow some statevariables to reset to
+ default value after sending completed (needed for
+ ContainerUpdateIDs usage)
+
+---
+ lib/libUPnP/Platinum/Source/Core/PltService.cpp | 11 +++++++++--
+ lib/libUPnP/Platinum/Source/Core/PltService.h | 3 ++-
+ lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp | 16 ++++++++++++++--
+ lib/libUPnP/Platinum/Source/Core/PltStateVariable.h | 10 +++++++++-
+ 4 files changed, 34 insertions(+), 6 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltService.cpp b/lib/libUPnP/Platinum/Source/Core/PltService.cpp
+index b1fec51..b86fb23 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltService.cpp
++++ b/lib/libUPnP/Platinum/Source/Core/PltService.cpp
+@@ -459,14 +459,14 @@ PLT_Service::IsSubscribable()
+ | PLT_Service::SetStateVariable
+ +---------------------------------------------------------------------*/
+ NPT_Result
+-PLT_Service::SetStateVariable(const char* name, const char* value)
++PLT_Service::SetStateVariable(const char* name, const char* value, const bool clearonsend /*=false*/)
+ {
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ if (stateVariable == NULL)
+ return NPT_FAILURE;
+
+- return stateVariable->SetValue(value);
++ return stateVariable->SetValue(value, clearonsend);
+ }
+
+ /*----------------------------------------------------------------------
+@@ -835,6 +835,13 @@ PLT_Service::NotifyChanged()
+ m_Subscribers.Erase(sub_iter++);
+ }
+
++ // some state variables must be cleared immediatly after sending
++ iter = vars_ready.GetFirstItem();
++ while (iter) {
++ PLT_StateVariable* var = *iter;
++ var->OnSendCompleted();
++ ++iter;
++ }
+ return NPT_SUCCESS;
+ }
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltService.h b/lib/libUPnP/Platinum/Source/Core/PltService.h
+index 84959f2..0401ea2 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltService.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltService.h
+@@ -216,8 +216,9 @@ public:
+ when necessary.
+ @param name state variable name
+ @param value new State Variable value.
++ @param clearonsend whether the State Variable should clear immediatly in ::OnSendingCompleted
+ */
+- NPT_Result SetStateVariable(const char* name, const char* value);
++ NPT_Result SetStateVariable(const char* name, const char* value, const bool clearonsend = false);
+
+ /**
+ Certain state variables notifications must not be sent faster than a certain
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
+index c3eb7cc..d38392e 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
++++ b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
+@@ -49,7 +49,8 @@ PLT_StateVariable::PLT_StateVariable(PLT_Service* service) :
+ m_Service(service),
+ m_AllowedValueRange(NULL),
+ m_IsSendingEvents(false),
+- m_IsSendingEventsIndirectly(true)
++ m_IsSendingEventsIndirectly(true),
++ m_ShouldClearOnSend(false)
+ {
+ }
+
+@@ -146,7 +147,7 @@ PLT_StateVariable::SetRate(NPT_TimeInterval rate)
+ | PLT_StateVariable::SetValue
+ +---------------------------------------------------------------------*/
+ NPT_Result
+-PLT_StateVariable::SetValue(const char* value)
++PLT_StateVariable::SetValue(const char* value, const bool clearonsend /*=false*/)
+ {
+ if (value == NULL) {
+ return NPT_FAILURE;
+@@ -160,6 +161,7 @@ PLT_StateVariable::SetValue(const char* value)
+ }
+
+ m_Value = value;
++ m_ShouldClearOnSend = clearonsend;
+ m_Service->AddChanged(this);
+ }
+
+@@ -184,6 +186,16 @@ PLT_StateVariable::IsReadyToPublish()
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_StateVariable::OnSendCompleted
+++---------------------------------------------------------------------*/
++void
++PLT_StateVariable::OnSendCompleted()
++{
++ if(m_ShouldClearOnSend)
++ m_Value = m_DefaultValue;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_StateVariable::ValidateValue
+ +---------------------------------------------------------------------*/
+ NPT_Result
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h
+index 46ec9e9..465e95c 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h
+@@ -115,8 +115,9 @@ public:
+ it is an allowed value. Once the value is validated, it is marked for eventing by
+ calling the PLT_Service AddChanged function.
+ @param value new state variable value. Can be a comma separated list of values.
++ @param clearonsend whether the statevariable should be cleared immediatly after sending
+ */
+- NPT_Result SetValue(const char* value);
++ NPT_Result SetValue(const char* value, const bool clearonsend = false);
+
+ /**
+ Validate the new value of the state variable.
+@@ -173,6 +174,12 @@ protected:
+ bool IsReadyToPublish();
+
+ /**
++ * If this statevariable should clear after sending to all subscribers, clears the value without
++ * eventing the change
++ */
++ void OnSendCompleted();
++
++ /**
+ Serialize the state variable into xml.
+ */
+ NPT_Result Serialize(NPT_XmlElementNode& node);
+@@ -189,6 +196,7 @@ protected:
+ NPT_String m_DefaultValue;
+ bool m_IsSendingEvents;
+ bool m_IsSendingEventsIndirectly;
++ bool m_ShouldClearOnSend;
+ NPT_TimeInterval m_Rate;
+ NPT_TimeStamp m_LastEvent;
+ NPT_Array<NPT_String*> m_AllowedValues;
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0009-platinum-add-support-for-upnp-lastPlaybackPosition-u.patch b/lib/libUPnP/patches/0009-platinum-add-support-for-upnp-lastPlaybackPosition-u.patch
new file mode 100644
index 0000000..4a8efb1
--- /dev/null
+++ b/lib/libUPnP/patches/0009-platinum-add-support-for-upnp-lastPlaybackPosition-u.patch
@@ -0,0 +1,96 @@
+From 5f4aa26956ebc15e774186955e49cc7c77896f0e Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Mon, 30 Jul 2012 13:02:34 +0100
+Subject: [PATCH 09/24] platinum: add support for upnp:lastPlaybackPosition,
+ upnp:lastPlaybackTime and upnp:playbackCount
+
+---
+ .../Source/Devices/MediaServer/PltMediaItem.cpp | 43 ++++++++++++++++++++++
+ .../Source/Devices/MediaServer/PltMediaItem.h | 3 ++
+ 2 files changed, 46 insertions(+)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 62e0ba9..3ec7696 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -183,6 +183,9 @@ PLT_MediaObject::Reset()
+ m_ExtraInfo.artist_discography_uri = "";
+
+ m_MiscInfo.original_track_number = 0;
++ m_MiscInfo.last_position = 0;
++ m_MiscInfo.last_time = "";
++ m_MiscInfo.play_count = -1;
+ m_MiscInfo.dvdregioncode = 0;
+ m_MiscInfo.toc = "";
+ m_MiscInfo.user_annotation = "";
+@@ -316,6 +319,27 @@ PLT_MediaObject::ToDidl(NPT_UInt32 mask, NPT_String& didl)
+ didl += "</upnp:originalTrackNumber>";
+ }
+
++ // last playback position
++ if (m_MiscInfo.last_position > 0) {
++ didl += "<upnp:lastPlaybackPosition>";
++ didl += NPT_String::FromInteger(m_MiscInfo.last_position);
++ didl += "</upnp:lastPlaybackPosition>";
++ }
++
++ // last playback datetime
++ if (!m_MiscInfo.last_time.IsEmpty()) {
++ didl += "<upnp:lastPlaybackTime>";
++ PLT_Didl::AppendXmlEscape(didl, m_MiscInfo.last_time);
++ didl += "</upnp:lastPlaybackTime>";
++ }
++
++ // playcount
++ if (m_MiscInfo.play_count > -1) {
++ didl += "<upnp:playbackCount>";
++ didl += NPT_String::FromInteger(m_MiscInfo.play_count);
++ didl += "</upnp:playbackCount>";
++ }
++
+ // program title
+ if (mask & PLT_FILTER_MASK_PROGRAMTITLE && !m_Recorded.program_title.IsEmpty()) {
+ didl += "<upnp:programTitle>";
+@@ -510,6 +534,25 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ if (NPT_FAILED(str.ToInteger(value))) value = 0;
+ m_MiscInfo.original_track_number = value;
+
++ PLT_XmlHelper::GetChildText(entry, "lastPlaybackPosition", str, didl_namespace_upnp);
++ if (NPT_FAILED(str.ToInteger(value))) value = 0;
++ m_MiscInfo.last_position = value;
++
++ PLT_XmlHelper::GetChildText(entry, "lastPlaybackTime", m_MiscInfo.last_time, didl_namespace_dc, 256);
++ NPT_String parsed_last_time;
++ for (int format=0; format<=NPT_DateTime::FORMAT_RFC_1036; format++) {
++ NPT_DateTime date;
++ if (NPT_SUCCEEDED(date.FromString(m_MiscInfo.last_time, (NPT_DateTime::Format)format))) {
++ parsed_last_time = date.ToString((NPT_DateTime::Format)format);
++ break;
++ }
++ }
++ m_MiscInfo.last_time = parsed_last_time;
++
++ PLT_XmlHelper::GetChildText(entry, "playbackCount", str, didl_namespace_upnp);
++ if (NPT_FAILED(str.ToInteger(value))) value = -1;
++ m_MiscInfo.play_count = value;
++
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "res");
+ for (NPT_Cardinal i=0; i<children.GetItemCount(); i++) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 81f3dc8..cc3bdf9 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -130,6 +130,9 @@ typedef struct {
+ NPT_UInt32 original_track_number;
+ NPT_String toc;
+ NPT_String user_annotation; //TODO: can be multiple
++ NPT_UInt32 last_position;
++ NPT_String last_time;
++ NPT_Int32 play_count;
+ } PLT_MiscInfo;
+
+ typedef struct {
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0010-platinum-use-PersonRole-for-directors.-Also-fixes-Fr.patch b/lib/libUPnP/patches/0010-platinum-use-PersonRole-for-directors.-Also-fixes-Fr.patch
new file mode 100644
index 0000000..76da427
--- /dev/null
+++ b/lib/libUPnP/patches/0010-platinum-use-PersonRole-for-directors.-Also-fixes-Fr.patch
@@ -0,0 +1,129 @@
+From 501fb90b02537c45837526677220c67b8d8eb3f3 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Sun, 7 Oct 2012 10:46:54 +0100
+Subject: [PATCH 10/24] platinum: use PersonRole for directors. Also fixes
+ ::FromDidl for authors, actors, directors -
+ previously duplicate entries were present
+
+---
+ .../Platinum/Source/Devices/MediaServer/PltDidl.h | 40 ++++++++++++----------
+ .../Source/Devices/MediaServer/PltMediaItem.cpp | 12 +++++++
+ .../Source/Devices/MediaServer/PltMediaItem.h | 2 +-
+ 3 files changed, 34 insertions(+), 20 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index f6eaf14..c50d450 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -61,28 +61,29 @@
+ #define PLT_FILTER_MASK_ORIGINALTRACK 0x00000100
+ #define PLT_FILTER_MASK_ACTOR 0x00000200
+ #define PLT_FILTER_MASK_AUTHOR 0x00000400
+-#define PLT_FILTER_MASK_DATE 0x00000800
+-#define PLT_FILTER_MASK_PROGRAMTITLE 0x00001000
+-#define PLT_FILTER_MASK_SERIESTITLE 0x00002000
+-#define PLT_FILTER_MASK_EPISODE 0x00004000
+-#define PLT_FILTER_MASK_TITLE 0x00008000
++#define PLT_FILTER_MASK_DIRECTOR 0x00000800
++#define PLT_FILTER_MASK_DATE 0x00001000
++#define PLT_FILTER_MASK_PROGRAMTITLE 0x00002000
++#define PLT_FILTER_MASK_SERIESTITLE 0x00004000
++#define PLT_FILTER_MASK_EPISODE 0x00008000
++#define PLT_FILTER_MASK_TITLE 0x00010000
+
+-#define PLT_FILTER_MASK_RES 0x00010000
+-#define PLT_FILTER_MASK_RES_DURATION 0x00020000
+-#define PLT_FILTER_MASK_RES_SIZE 0x00040000
+-#define PLT_FILTER_MASK_RES_PROTECTION 0x00080000
+-#define PLT_FILTER_MASK_RES_RESOLUTION 0x00100000
+-#define PLT_FILTER_MASK_RES_BITRATE 0x00200000
+-#define PLT_FILTER_MASK_RES_BITSPERSAMPLE 0x00400000
+-#define PLT_FILTER_MASK_RES_NRAUDIOCHANNELS 0x00800000
+-#define PLT_FILTER_MASK_RES_SAMPLEFREQUENCY 0x01000000
++#define PLT_FILTER_MASK_RES 0x00020000
++#define PLT_FILTER_MASK_RES_DURATION 0x00040000
++#define PLT_FILTER_MASK_RES_SIZE 0x00080000
++#define PLT_FILTER_MASK_RES_PROTECTION 0x00100000
++#define PLT_FILTER_MASK_RES_RESOLUTION 0x00200000
++#define PLT_FILTER_MASK_RES_BITRATE 0x00400000
++#define PLT_FILTER_MASK_RES_BITSPERSAMPLE 0x00800000
++#define PLT_FILTER_MASK_RES_NRAUDIOCHANNELS 0x01000000
++#define PLT_FILTER_MASK_RES_SAMPLEFREQUENCY 0x02000000
+
+-#define PLT_FILTER_MASK_LONGDESCRIPTION 0x02000000
+-#define PLT_FILTER_MASK_ICON 0x04000000
++#define PLT_FILTER_MASK_LONGDESCRIPTION 0x04000000
++#define PLT_FILTER_MASK_ICON 0x08000000
+
+-#define PLT_FILTER_MASK_TOC 0x02000000
+-#define PLT_FILTER_MASK_SEARCHCLASS 0x04000000
+-#define PLT_FILTER_MASK_REFID 0x08000000
++#define PLT_FILTER_MASK_TOC 0x10000000
++#define PLT_FILTER_MASK_SEARCHCLASS 0x20000000
++#define PLT_FILTER_MASK_REFID 0x40000000
+
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+@@ -90,6 +91,7 @@
+ #define PLT_FILTER_FIELD_ARTIST "upnp:artist"
+ #define PLT_FILTER_FIELD_ACTOR "upnp:actor"
+ #define PLT_FILTER_FIELD_AUTHOR "upnp:author"
++#define PLT_FILTER_FIELD_DIRECTOR "upnp:director"
+ #define PLT_FILTER_FIELD_ALBUM "upnp:album"
+ #define PLT_FILTER_FIELD_GENRE "upnp:genre"
+ #define PLT_FILTER_FIELD_ALBUMARTURI "upnp:albumArtURI"
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 3ec7696..d46d1a5 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -253,6 +253,11 @@ PLT_MediaObject::ToDidl(NPT_UInt32 mask, NPT_String& didl)
+ m_People.authors.ToDidl(didl, "author");
+ }
+
++ // director
++ if (mask & PLT_FILTER_MASK_DIRECTOR) {
++ m_People.directors.ToDidl(didl, "director");
++ }
++
+ // album
+ if ((mask & PLT_FILTER_MASK_ALBUM) && !m_Affiliation.album.IsEmpty()) {
+ didl += "<upnp:album>";
+@@ -488,15 +493,22 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ m_Title = m_Title.SubString(0, 256);
+ m_ObjectClass.type = m_ObjectClass.type.SubString(0, 256);
+
++ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "artist", didl_namespace_upnp);
+ m_People.artists.FromDidl(children);
+
++ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "author", didl_namespace_upnp);
+ m_People.authors.FromDidl(children);
+
++ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "actor", didl_namespace_upnp);
+ m_People.actors.FromDidl(children);
+
++ children.Clear();
++ PLT_XmlHelper::GetChildren(entry, children, "director", didl_namespace_upnp);
++ m_People.directors.FromDidl(children);
++
+ PLT_XmlHelper::GetChildText(entry, "album", m_Affiliation.album, didl_namespace_upnp, 256);
+ PLT_XmlHelper::GetChildText(entry, "programTitle", m_Recorded.program_title, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "seriesTitle", m_Recorded.series_title, didl_namespace_upnp);
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index cc3bdf9..fe04f34 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -91,7 +91,7 @@ typedef struct {
+ PLT_PersonRoles actors;
+ PLT_PersonRoles authors;
+ NPT_String producer; //TODO: can be multiple
+- NPT_String director; //TODO: can be multiple
++ PLT_PersonRoles directors;
+ NPT_String publisher; //TODO: can be multiple
+ NPT_String contributor; // should match m_Creator (dc:creator) //TODO: can be multiple
+ } PLT_PeopleInfo;
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0011-platinum-support-video-ratings.patch b/lib/libUPnP/patches/0011-platinum-support-video-ratings.patch
new file mode 100644
index 0000000..c97d649
--- /dev/null
+++ b/lib/libUPnP/patches/0011-platinum-support-video-ratings.patch
@@ -0,0 +1,66 @@
+From a650caab79695b0caaef7b860ae59086a335bb30 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Sat, 6 Oct 2012 23:35:52 +0100
+Subject: [PATCH 11/24] platinum: support video ratings
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 8 +++++---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 8 ++++++++
+ 2 files changed, 13 insertions(+), 3 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index c50d450..8d9704f 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -80,10 +80,11 @@
+
+ #define PLT_FILTER_MASK_LONGDESCRIPTION 0x04000000
+ #define PLT_FILTER_MASK_ICON 0x08000000
++#define PLT_FILTER_MASK_RATING 0x10000000
+
+-#define PLT_FILTER_MASK_TOC 0x10000000
+-#define PLT_FILTER_MASK_SEARCHCLASS 0x20000000
+-#define PLT_FILTER_MASK_REFID 0x40000000
++#define PLT_FILTER_MASK_TOC 0x20000000
++#define PLT_FILTER_MASK_SEARCHCLASS 0x40000000
++#define PLT_FILTER_MASK_REFID 0x80000000
+
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+@@ -99,6 +100,7 @@
+ #define PLT_FILTER_FIELD_DESCRIPTION "dc:description"
+ #define PLT_FILTER_FIELD_LONGDESCRIPTION "upnp:longDescription"
+ #define PLT_FILTER_FIELD_ICON "upnp:icon"
++#define PLT_FILTER_FIELD_RATING "upnp:rating"
+ #define PLT_FILTER_FIELD_ORIGINALTRACK "upnp:originalTrackNumber"
+ #define PLT_FILTER_FIELD_PROGRAMTITLE "upnp:programTitle"
+ #define PLT_FILTER_FIELD_SERIESTITLE "upnp:seriesTitle"
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index d46d1a5..3416112 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -317,6 +317,13 @@ PLT_MediaObject::ToDidl(NPT_UInt32 mask, NPT_String& didl)
+ didl += "</upnp:icon>";
+ }
+
++ // rating
++ if ((mask & PLT_FILTER_MASK_RATING) && !m_Description.rating.IsEmpty()) {
++ didl += "<upnp:rating>";
++ PLT_Didl::AppendXmlEscape(didl, m_Description.rating);
++ didl += "</upnp:rating>";
++ }
++
+ // original track number
+ if ((mask & PLT_FILTER_MASK_ORIGINALTRACK) && m_MiscInfo.original_track_number > 0) {
+ didl += "<upnp:originalTrackNumber>";
+@@ -528,6 +535,7 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ PLT_XmlHelper::GetChildText(entry, "description", m_Description.description, didl_namespace_dc);
+ PLT_XmlHelper::GetChildText(entry, "longDescription", m_Description.long_description, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "icon", m_Description.icon_uri, didl_namespace_upnp);
++ PLT_XmlHelper::GetChildText(entry, "rating", m_Description.rating, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "toc", m_MiscInfo.toc, didl_namespace_upnp);
+
+ // album arts
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0012-platinum-increase-number-of-requested-items-per-iter.patch b/lib/libUPnP/patches/0012-platinum-increase-number-of-requested-items-per-iter.patch
new file mode 100644
index 0000000..93402a2
--- /dev/null
+++ b/lib/libUPnP/patches/0012-platinum-increase-number-of-requested-items-per-iter.patch
@@ -0,0 +1,26 @@
+From 058d7557b61afc45d83f98477f3ef5d1ab6cb571 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Thu, 11 Oct 2012 13:22:35 +0100
+Subject: [PATCH 12/24] platinum: increase number of requested items per
+ iteration. gives 2-3 times speed up.
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+index 96c36df..24219ff 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+@@ -262,7 +262,7 @@ PLT_SyncMediaBrowser::BrowseSync(PLT_DeviceDataReference& device,
+ device,
+ (const char*)object_id,
+ index,
+- metadata?1:30, // DLNA recommendations for browsing children is no more than 30 at a time
++ metadata?1:200, // DLNA recommendations for browsing children is no more than 30 at a time
+ metadata);
+ NPT_CHECK_LABEL_WARNING(res, done);
+
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0013-platinum-fixes-support-for-filtering-by-the-extended.patch b/lib/libUPnP/patches/0013-platinum-fixes-support-for-filtering-by-the-extended.patch
new file mode 100644
index 0000000..6e7333b
--- /dev/null
+++ b/lib/libUPnP/patches/0013-platinum-fixes-support-for-filtering-by-the-extended.patch
@@ -0,0 +1,71 @@
+From 38538aa36eaf64d7bcff662735ae9b5a0c1db08c Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Thu, 25 Oct 2012 11:59:46 +0100
+Subject: [PATCH 13/24] platinum: fixes support for filtering by the extended
+ properties we need
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp | 6 ++++++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 1 +
+ .../Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ 3 files changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index 2c20b25..6ad2ec4 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -92,6 +92,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_ARTIST;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ACTOR, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_ACTOR;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_DIRECTOR, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_DIRECTOR;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_AUTHOR, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_AUTHOR;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_DATE, len, true) == 0) {
+@@ -105,6 +107,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_ALBUMARTURI;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_DESCRIPTION, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_DESCRIPTION;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_LONGDESCRIPTION, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_LONGDESCRIPTION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ORIGINALTRACK, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_ORIGINALTRACK;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_SEARCHABLE, len, true) == 0) {
+@@ -123,6 +127,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_SERIESTITLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_EPISODE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_EPISODE;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RATING, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_RATING;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_DURATION, len, true) == 0 ||
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 3416112..b10d75a 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -171,6 +171,7 @@ PLT_MediaObject::Reset()
+ m_People.actors.Clear();
+ m_People.artists.Clear();
+ m_People.authors.Clear();
++ m_People.directors.Clear();
+
+ m_Affiliation.album = "";
+ m_Affiliation.genres.Clear();
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 0fe43b5..e8cb7c6 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -118,7 +118,7 @@ protected:
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata = false,
+- const char* filter = "dc:date,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:album,upnp:artist,upnp:author,searchable,childCount", // explicitely specify res otherwise WMP won't return a URL!
++ const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,searchable,childCount", // explicitely specify res otherwise WMP won't return a URL!
+ const char* sort = "");
+ private:
+ NPT_Result Find(const char* ip, PLT_DeviceDataReference& device);
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0014-platinum-switch-to-NPT_UInt64-for-bitmask-flags.patch b/lib/libUPnP/patches/0014-platinum-switch-to-NPT_UInt64-for-bitmask-flags.patch
new file mode 100644
index 0000000..288ccbd
--- /dev/null
+++ b/lib/libUPnP/patches/0014-platinum-switch-to-NPT_UInt64-for-bitmask-flags.patch
@@ -0,0 +1,212 @@
+From 7f93296d158095f59169d12c4181af060f4b9884 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Fri, 26 Oct 2012 12:30:04 +0100
+Subject: [PATCH 14/24] platinum: switch to NPT_UInt64 for bitmask flags
+
+---
+ .../Source/Devices/MediaServer/PltDidl.cpp | 6 +-
+ .../Platinum/Source/Devices/MediaServer/PltDidl.h | 68 +++++++++++-----------
+ .../Source/Devices/MediaServer/PltMediaItem.cpp | 6 +-
+ .../Source/Devices/MediaServer/PltMediaItem.h | 6 +-
+ .../Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ 5 files changed, 44 insertions(+), 44 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index 6ad2ec4..6f72dda 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -56,7 +56,7 @@ const char* didl_namespace_dlna = "urn:schemas-dlna-org:metadata-1-0/";
+ /*----------------------------------------------------------------------
+ | PLT_Didl::ConvertFilterToMask
+ +---------------------------------------------------------------------*/
+-NPT_UInt32
++NPT_UInt64
+ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ {
+ // easy out
+@@ -66,7 +66,7 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ // a given DIDL property (or set of properties).
+ // These fields are or start with: upnp:, @, res@, res, dc:, container@
+
+- NPT_UInt32 mask = 0;
++ NPT_UInt64 mask = 0;
+ const char* s = filter;
+ int i = 0;
+
+@@ -301,7 +301,7 @@ PLT_Didl::ParseTimeStamp(const NPT_String& timestamp, NPT_UInt32& seconds)
+ NPT_Result
+ PLT_Didl::ToDidl(PLT_MediaObject& object, const NPT_String& filter, NPT_String& didl)
+ {
+- NPT_UInt32 mask = ConvertFilterToMask(filter);
++ NPT_UInt64 mask = ConvertFilterToMask(filter);
+
+ // Allocate enough space for the didl
+ didl.Reserve(2048);
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index 8d9704f..29ce9ca 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -48,43 +48,43 @@
+ /*----------------------------------------------------------------------
+ | constants
+ +---------------------------------------------------------------------*/
+-#define PLT_FILTER_MASK_ALL 0xFFFFFFFF
++#define PLT_FILTER_MASK_ALL 0xFFFFFFFFFFFFFFFF
+
+-#define PLT_FILTER_MASK_CREATOR 0x00000001
+-#define PLT_FILTER_MASK_ARTIST 0x00000002
+-#define PLT_FILTER_MASK_ALBUM 0x00000004
+-#define PLT_FILTER_MASK_GENRE 0x00000008
+-#define PLT_FILTER_MASK_ALBUMARTURI 0x00000010
+-#define PLT_FILTER_MASK_DESCRIPTION 0x00000020
+-#define PLT_FILTER_MASK_SEARCHABLE 0x00000040
+-#define PLT_FILTER_MASK_CHILDCOUNT 0x00000080
+-#define PLT_FILTER_MASK_ORIGINALTRACK 0x00000100
+-#define PLT_FILTER_MASK_ACTOR 0x00000200
+-#define PLT_FILTER_MASK_AUTHOR 0x00000400
+-#define PLT_FILTER_MASK_DIRECTOR 0x00000800
+-#define PLT_FILTER_MASK_DATE 0x00001000
+-#define PLT_FILTER_MASK_PROGRAMTITLE 0x00002000
+-#define PLT_FILTER_MASK_SERIESTITLE 0x00004000
+-#define PLT_FILTER_MASK_EPISODE 0x00008000
+-#define PLT_FILTER_MASK_TITLE 0x00010000
++#define PLT_FILTER_MASK_CREATOR 0x0000000000000001
++#define PLT_FILTER_MASK_ARTIST 0x0000000000000002
++#define PLT_FILTER_MASK_ALBUM 0x0000000000000004
++#define PLT_FILTER_MASK_GENRE 0x0000000000000008
++#define PLT_FILTER_MASK_ALBUMARTURI 0x0000000000000010
++#define PLT_FILTER_MASK_DESCRIPTION 0x0000000000000020
++#define PLT_FILTER_MASK_SEARCHABLE 0x0000000000000040
++#define PLT_FILTER_MASK_CHILDCOUNT 0x0000000000000080
++#define PLT_FILTER_MASK_ORIGINALTRACK 0x0000000000000100
++#define PLT_FILTER_MASK_ACTOR 0x0000000000000200
++#define PLT_FILTER_MASK_AUTHOR 0x0000000000000400
++#define PLT_FILTER_MASK_DIRECTOR 0x0000000000000800
++#define PLT_FILTER_MASK_DATE 0x0000000000001000
++#define PLT_FILTER_MASK_PROGRAMTITLE 0x0000000000002000
++#define PLT_FILTER_MASK_SERIESTITLE 0x0000000000004000
++#define PLT_FILTER_MASK_EPISODE 0x0000000000008000
++#define PLT_FILTER_MASK_TITLE 0x0000000000010000
+
+-#define PLT_FILTER_MASK_RES 0x00020000
+-#define PLT_FILTER_MASK_RES_DURATION 0x00040000
+-#define PLT_FILTER_MASK_RES_SIZE 0x00080000
+-#define PLT_FILTER_MASK_RES_PROTECTION 0x00100000
+-#define PLT_FILTER_MASK_RES_RESOLUTION 0x00200000
+-#define PLT_FILTER_MASK_RES_BITRATE 0x00400000
+-#define PLT_FILTER_MASK_RES_BITSPERSAMPLE 0x00800000
+-#define PLT_FILTER_MASK_RES_NRAUDIOCHANNELS 0x01000000
+-#define PLT_FILTER_MASK_RES_SAMPLEFREQUENCY 0x02000000
++#define PLT_FILTER_MASK_RES 0x0000000000020000
++#define PLT_FILTER_MASK_RES_DURATION 0x0000000000040000
++#define PLT_FILTER_MASK_RES_SIZE 0x0000000000080000
++#define PLT_FILTER_MASK_RES_PROTECTION 0x0000000000100000
++#define PLT_FILTER_MASK_RES_RESOLUTION 0x0000000000200000
++#define PLT_FILTER_MASK_RES_BITRATE 0x0000000000400000
++#define PLT_FILTER_MASK_RES_BITSPERSAMPLE 0x0000000000800000
++#define PLT_FILTER_MASK_RES_NRAUDIOCHANNELS 0x0000000001000000
++#define PLT_FILTER_MASK_RES_SAMPLEFREQUENCY 0x0000000002000000
+
+-#define PLT_FILTER_MASK_LONGDESCRIPTION 0x04000000
+-#define PLT_FILTER_MASK_ICON 0x08000000
+-#define PLT_FILTER_MASK_RATING 0x10000000
++#define PLT_FILTER_MASK_LONGDESCRIPTION 0x0000000004000000
++#define PLT_FILTER_MASK_ICON 0x0000000008000000
++#define PLT_FILTER_MASK_RATING 0x0000000010000000
+
+-#define PLT_FILTER_MASK_TOC 0x20000000
+-#define PLT_FILTER_MASK_SEARCHCLASS 0x40000000
+-#define PLT_FILTER_MASK_REFID 0x80000000
++#define PLT_FILTER_MASK_TOC 0x0000000020000000
++#define PLT_FILTER_MASK_SEARCHCLASS 0x0000000040000000
++#define PLT_FILTER_MASK_REFID 0x0000000080000000
+
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+@@ -156,7 +156,7 @@ public:
+ return res;
+ }
+
+- static NPT_UInt32 ConvertFilterToMask(const NPT_String& filter);
++ static NPT_UInt64 ConvertFilterToMask(const NPT_String& filter);
+ };
+
+ #endif /* _PLT_DIDL_H_ */
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index b10d75a..31bc16c 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -215,7 +215,7 @@ PLT_MediaObject::ToDidl(const NPT_String& filter, NPT_String& didl)
+ | PLT_MediaObject::ToDidl
+ +---------------------------------------------------------------------*/
+ NPT_Result
+-PLT_MediaObject::ToDidl(NPT_UInt32 mask, NPT_String& didl)
++PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ {
+ // title is required
+ didl += "<dc:title>";
+@@ -682,7 +682,7 @@ PLT_MediaItem::ToDidl(const NPT_String& filter, NPT_String& didl)
+ | PLT_MediaItem::ToDidl
+ +---------------------------------------------------------------------*/
+ NPT_Result
+-PLT_MediaItem::ToDidl(NPT_UInt32 mask, NPT_String& didl)
++PLT_MediaItem::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ {
+ didl += "<item id=\"";
+
+@@ -773,7 +773,7 @@ PLT_MediaContainer::ToDidl(const NPT_String& filter, NPT_String& didl)
+ | PLT_MediaContainer::ToDidl
+ +---------------------------------------------------------------------*/
+ NPT_Result
+-PLT_MediaContainer::ToDidl(NPT_UInt32 mask, NPT_String& didl)
++PLT_MediaContainer::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ {
+ // container id property
+ didl += "<container id=\"";
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index fe04f34..2449276 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -196,7 +196,7 @@ public:
+
+ virtual NPT_Result Reset();
+ virtual NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl);
+- virtual NPT_Result ToDidl(NPT_UInt32 mask, NPT_String& didl);
++ virtual NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl);
+ virtual NPT_Result FromDidl(NPT_XmlElementNode* entry);
+
+ public:
+@@ -248,7 +248,7 @@ public:
+
+ // PLT_MediaObject methods
+ NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl);
+- NPT_Result ToDidl(NPT_UInt32 mask, NPT_String& didl);
++ NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl);
+ NPT_Result FromDidl(NPT_XmlElementNode* entry);
+ };
+
+@@ -271,7 +271,7 @@ public:
+ // PLT_MediaObject methods
+ NPT_Result Reset();
+ NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl);
+- NPT_Result ToDidl(NPT_UInt32 mask, NPT_String& didl);
++ NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl);
+ NPT_Result FromDidl(NPT_XmlElementNode* entry);
+
+ public:
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index e8cb7c6..94f1ab3 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -118,7 +118,7 @@ protected:
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata = false,
+- const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,searchable,childCount", // explicitely specify res otherwise WMP won't return a URL!
++ const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,searchable,childCount", // explicitely specify res otherwise WMP won't return a URL!
+ const char* sort = "");
+ private:
+ NPT_Result Find(const char* ip, PLT_DeviceDataReference& device);
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0015-platinum-fix-missing-filtering-for-extra-metadata.patch b/lib/libUPnP/patches/0015-platinum-fix-missing-filtering-for-extra-metadata.patch
new file mode 100644
index 0000000..ad8e0b1
--- /dev/null
+++ b/lib/libUPnP/patches/0015-platinum-fix-missing-filtering-for-extra-metadata.patch
@@ -0,0 +1,85 @@
+From c6d2a53c63a065a974c3f8fd1df29c30c2e2b40a Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Fri, 26 Oct 2012 12:57:58 +0100
+Subject: [PATCH 15/24] platinum: fix missing filtering for extra metadata
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp | 6 ++++++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 7 +++++++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 6 +++---
+ 3 files changed, 16 insertions(+), 3 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index 6f72dda..73f9ed2 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -111,6 +111,12 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_LONGDESCRIPTION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ORIGINALTRACK, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_ORIGINALTRACK;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_LASTPOSITION, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_LASTPOSITION;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_LASTPLAYBACK, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_LASTPLAYBACK;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_PLAYCOUNT, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_PLAYCOUNT;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_SEARCHABLE, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_SEARCHABLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_SEARCHCLASS, len, true) == 0) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index 29ce9ca..9af9725 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -86,6 +86,10 @@
+ #define PLT_FILTER_MASK_SEARCHCLASS 0x0000000040000000
+ #define PLT_FILTER_MASK_REFID 0x0000000080000000
+
++#define PLT_FILTER_MASK_LASTPOSITION 0x0000000100000000
++#define PLT_FILTER_MASK_LASTPLAYBACK 0x0000000200000000
++#define PLT_FILTER_MASK_PLAYCOUNT 0x0000000400000000
++
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+ #define PLT_FILTER_FIELD_DATE "dc:date"
+@@ -105,6 +109,9 @@
+ #define PLT_FILTER_FIELD_PROGRAMTITLE "upnp:programTitle"
+ #define PLT_FILTER_FIELD_SERIESTITLE "upnp:seriesTitle"
+ #define PLT_FILTER_FIELD_EPISODE "upnp:episodeNumber"
++#define PLT_FILTER_FIELD_LASTPOSITION "upnp:lastPlaybackPosition"
++#define PLT_FILTER_FIELD_LASTPLAYBACK "upnp:lastPlaybackTime"
++#define PLT_FILTER_FIELD_PLAYCOUNT "upnp:playbackCount"
+ #define PLT_FILTER_FIELD_SEARCHCLASS "upnp:searchClass"
+ #define PLT_FILTER_FIELD_SEARCHABLE "@searchable"
+ #define PLT_FILTER_FIELD_CHILDCOUNT "@childcount"
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 31bc16c..af6bc3b 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -333,21 +333,21 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ }
+
+ // last playback position
+- if (m_MiscInfo.last_position > 0) {
++ if (mask & PLT_FILTER_MASK_LASTPOSITION && m_MiscInfo.last_position > 0) {
+ didl += "<upnp:lastPlaybackPosition>";
+ didl += NPT_String::FromInteger(m_MiscInfo.last_position);
+ didl += "</upnp:lastPlaybackPosition>";
+ }
+
+ // last playback datetime
+- if (!m_MiscInfo.last_time.IsEmpty()) {
++ if (mask & PLT_FILTER_MASK_LASTPLAYBACK && !m_MiscInfo.last_time.IsEmpty()) {
+ didl += "<upnp:lastPlaybackTime>";
+ PLT_Didl::AppendXmlEscape(didl, m_MiscInfo.last_time);
+ didl += "</upnp:lastPlaybackTime>";
+ }
+
+ // playcount
+- if (m_MiscInfo.play_count > -1) {
++ if (mask & PLT_FILTER_MASK_PLAYCOUNT && m_MiscInfo.play_count > -1) {
+ didl += "<upnp:playbackCount>";
+ didl += NPT_String::FromInteger(m_MiscInfo.play_count);
+ didl += "</upnp:playbackCount>";
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0016-platinum-fix-compilation-by-using-the-right-suffix-f.patch b/lib/libUPnP/patches/0016-platinum-fix-compilation-by-using-the-right-suffix-f.patch
new file mode 100644
index 0000000..162c4c7
--- /dev/null
+++ b/lib/libUPnP/patches/0016-platinum-fix-compilation-by-using-the-right-suffix-f.patch
@@ -0,0 +1,101 @@
+From 5b2c16078401c8de2fdd7530df8d8d485c288495 Mon Sep 17 00:00:00 2001
+From: Memphiz <memphis@machzwo.de>
+Date: Fri, 26 Oct 2012 18:08:59 +0200
+Subject: [PATCH 16/24] platinum: fix compilation by using the right suffix
+ for 64bit constants
+
+---
+ .../Platinum/Source/Devices/MediaServer/PltDidl.h | 72 +++++++++++-----------
+ 1 file changed, 36 insertions(+), 36 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index 9af9725..59d1605 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -48,47 +48,47 @@
+ /*----------------------------------------------------------------------
+ | constants
+ +---------------------------------------------------------------------*/
+-#define PLT_FILTER_MASK_ALL 0xFFFFFFFFFFFFFFFF
++#define PLT_FILTER_MASK_ALL NPT_UINT64_C(0xFFFFFFFFFFFFFFFF)
+
+-#define PLT_FILTER_MASK_CREATOR 0x0000000000000001
+-#define PLT_FILTER_MASK_ARTIST 0x0000000000000002
+-#define PLT_FILTER_MASK_ALBUM 0x0000000000000004
+-#define PLT_FILTER_MASK_GENRE 0x0000000000000008
+-#define PLT_FILTER_MASK_ALBUMARTURI 0x0000000000000010
+-#define PLT_FILTER_MASK_DESCRIPTION 0x0000000000000020
+-#define PLT_FILTER_MASK_SEARCHABLE 0x0000000000000040
+-#define PLT_FILTER_MASK_CHILDCOUNT 0x0000000000000080
+-#define PLT_FILTER_MASK_ORIGINALTRACK 0x0000000000000100
+-#define PLT_FILTER_MASK_ACTOR 0x0000000000000200
+-#define PLT_FILTER_MASK_AUTHOR 0x0000000000000400
+-#define PLT_FILTER_MASK_DIRECTOR 0x0000000000000800
+-#define PLT_FILTER_MASK_DATE 0x0000000000001000
+-#define PLT_FILTER_MASK_PROGRAMTITLE 0x0000000000002000
+-#define PLT_FILTER_MASK_SERIESTITLE 0x0000000000004000
+-#define PLT_FILTER_MASK_EPISODE 0x0000000000008000
+-#define PLT_FILTER_MASK_TITLE 0x0000000000010000
++#define PLT_FILTER_MASK_CREATOR NPT_UINT64_C(0x0000000000000001)
++#define PLT_FILTER_MASK_ARTIST NPT_UINT64_C(0x0000000000000002)
++#define PLT_FILTER_MASK_ALBUM NPT_UINT64_C(0x0000000000000004)
++#define PLT_FILTER_MASK_GENRE NPT_UINT64_C(0x0000000000000008)
++#define PLT_FILTER_MASK_ALBUMARTURI NPT_UINT64_C(0x0000000000000010)
++#define PLT_FILTER_MASK_DESCRIPTION NPT_UINT64_C(0x0000000000000020)
++#define PLT_FILTER_MASK_SEARCHABLE NPT_UINT64_C(0x0000000000000040)
++#define PLT_FILTER_MASK_CHILDCOUNT NPT_UINT64_C(0x0000000000000080)
++#define PLT_FILTER_MASK_ORIGINALTRACK NPT_UINT64_C(0x0000000000000100)
++#define PLT_FILTER_MASK_ACTOR NPT_UINT64_C(0x0000000000000200)
++#define PLT_FILTER_MASK_AUTHOR NPT_UINT64_C(0x0000000000000400)
++#define PLT_FILTER_MASK_DIRECTOR NPT_UINT64_C(0x0000000000000800)
++#define PLT_FILTER_MASK_DATE NPT_UINT64_C(0x0000000000001000)
++#define PLT_FILTER_MASK_PROGRAMTITLE NPT_UINT64_C(0x0000000000002000)
++#define PLT_FILTER_MASK_SERIESTITLE NPT_UINT64_C(0x0000000000004000)
++#define PLT_FILTER_MASK_EPISODE NPT_UINT64_C(0x0000000000008000)
++#define PLT_FILTER_MASK_TITLE NPT_UINT64_C(0x0000000000010000)
+
+-#define PLT_FILTER_MASK_RES 0x0000000000020000
+-#define PLT_FILTER_MASK_RES_DURATION 0x0000000000040000
+-#define PLT_FILTER_MASK_RES_SIZE 0x0000000000080000
+-#define PLT_FILTER_MASK_RES_PROTECTION 0x0000000000100000
+-#define PLT_FILTER_MASK_RES_RESOLUTION 0x0000000000200000
+-#define PLT_FILTER_MASK_RES_BITRATE 0x0000000000400000
+-#define PLT_FILTER_MASK_RES_BITSPERSAMPLE 0x0000000000800000
+-#define PLT_FILTER_MASK_RES_NRAUDIOCHANNELS 0x0000000001000000
+-#define PLT_FILTER_MASK_RES_SAMPLEFREQUENCY 0x0000000002000000
++#define PLT_FILTER_MASK_RES NPT_UINT64_C(0x0000000000020000)
++#define PLT_FILTER_MASK_RES_DURATION NPT_UINT64_C(0x0000000000040000)
++#define PLT_FILTER_MASK_RES_SIZE NPT_UINT64_C(0x0000000000080000)
++#define PLT_FILTER_MASK_RES_PROTECTION NPT_UINT64_C(0x0000000000100000)
++#define PLT_FILTER_MASK_RES_RESOLUTION NPT_UINT64_C(0x0000000000200000)
++#define PLT_FILTER_MASK_RES_BITRATE NPT_UINT64_C(0x0000000000400000)
++#define PLT_FILTER_MASK_RES_BITSPERSAMPLE NPT_UINT64_C(0x0000000000800000)
++#define PLT_FILTER_MASK_RES_NRAUDIOCHANNELS NPT_UINT64_C(0x0000000001000000)
++#define PLT_FILTER_MASK_RES_SAMPLEFREQUENCY NPT_UINT64_C(0x0000000002000000)
+
+-#define PLT_FILTER_MASK_LONGDESCRIPTION 0x0000000004000000
+-#define PLT_FILTER_MASK_ICON 0x0000000008000000
+-#define PLT_FILTER_MASK_RATING 0x0000000010000000
++#define PLT_FILTER_MASK_LONGDESCRIPTION NPT_UINT64_C(0x0000000004000000)
++#define PLT_FILTER_MASK_ICON NPT_UINT64_C(0x0000000008000000)
++#define PLT_FILTER_MASK_RATING NPT_UINT64_C(0x0000000010000000)
+
+-#define PLT_FILTER_MASK_TOC 0x0000000020000000
+-#define PLT_FILTER_MASK_SEARCHCLASS 0x0000000040000000
+-#define PLT_FILTER_MASK_REFID 0x0000000080000000
++#define PLT_FILTER_MASK_TOC NPT_UINT64_C(0x0000000020000000)
++#define PLT_FILTER_MASK_SEARCHCLASS NPT_UINT64_C(0x0000000040000000)
++#define PLT_FILTER_MASK_REFID NPT_UINT64_C(0x0000000080000000)
+
+-#define PLT_FILTER_MASK_LASTPOSITION 0x0000000100000000
+-#define PLT_FILTER_MASK_LASTPLAYBACK 0x0000000200000000
+-#define PLT_FILTER_MASK_PLAYCOUNT 0x0000000400000000
++#define PLT_FILTER_MASK_LASTPOSITION NPT_UINT64_C(0x0000000100000000)
++#define PLT_FILTER_MASK_LASTPLAYBACK NPT_UINT64_C(0x0000000200000000)
++#define PLT_FILTER_MASK_PLAYCOUNT NPT_UINT64_C(0x0000000400000000)
+
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0017-platinum-don-t-disregard-PLT_MediaObjects-only-for-l.patch b/lib/libUPnP/patches/0017-platinum-don-t-disregard-PLT_MediaObjects-only-for-l.patch
new file mode 100644
index 0000000..35e4904
--- /dev/null
+++ b/lib/libUPnP/patches/0017-platinum-don-t-disregard-PLT_MediaObjects-only-for-l.patch
@@ -0,0 +1,32 @@
+From e4e282340a1524a5a01cce7ac9c03646d4df14a9 Mon Sep 17 00:00:00 2001
+From: Joakim Plate <elupus@ecce.se>
+Date: Sat, 19 Jan 2013 19:00:30 +0100
+Subject: [PATCH 17/24] platinum: don't disregard PLT_MediaObjects only for
+ lacking resources
+
+This could cause us to misscount the number of media objects in a upnp
+browse request, and re-request items we already had in list giving
+us duplicated items in lists.
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 5 -----
+ 1 file changed, 5 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index af6bc3b..514a1ab 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -722,11 +722,6 @@ PLT_MediaItem::FromDidl(NPT_XmlElementNode* entry)
+ }
+
+ NPT_Result result = PLT_MediaObject::FromDidl(entry);
+-
+- // make sure we have at least one valid resource
+- if (m_Resources.GetItemCount() == 0) {
+- NPT_CHECK_SEVERE(NPT_ERROR_INVALID_PARAMETERS);
+- }
+
+ return result;
+ }
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0018-platinum-add-SetNextAVTransportURI-support-to-media-.patch b/lib/libUPnP/patches/0018-platinum-add-SetNextAVTransportURI-support-to-media-.patch
new file mode 100644
index 0000000..cafb494
--- /dev/null
+++ b/lib/libUPnP/patches/0018-platinum-add-SetNextAVTransportURI-support-to-media-.patch
@@ -0,0 +1,2048 @@
+From 365faa24a48af37eb9c31f650187ff38be4eccb2 Mon Sep 17 00:00:00 2001
+From: Joakim Plate <elupus@ecce.se>
+Date: Sun, 4 Nov 2012 17:23:18 +0100
+Subject: [PATCH 18/24] platinum: add SetNextAVTransportURI support to media
+ renderer base
+
+---
+ .../Devices/MediaRenderer/AVTransportSCPD.cpp | 1889 ++++++++++----------
+ .../Devices/MediaRenderer/AVTransportSCPD.xml | 20 +
+ .../Devices/MediaRenderer/PltMediaController.cpp | 4 +
+ .../Devices/MediaRenderer/PltMediaController.h | 5 +
+ .../Devices/MediaRenderer/PltMediaRenderer.cpp | 30 +
+ .../Devices/MediaRenderer/PltMediaRenderer.h | 2 +
+ 6 files changed, 1012 insertions(+), 938 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp
+index 1c1fa44..64014ed 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.cpp
+@@ -40,944 +40,957 @@
+ /*----------------------------------------------------------------------
+ | globals
+ +---------------------------------------------------------------------*/
+-NPT_UInt8 RDR_AVTransportSCPD[18725] =
++NPT_UInt8 RDR_AVTransportSCPD[] =
+ {
+- 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+- 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+- 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+- 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+- 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72,
+- 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E,
+- 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69,
+- 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+- 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
+- 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+- 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+- 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74,
+- 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+- 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+- 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72,
+- 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73,
+- 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+- 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C,
+- 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+- 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+- 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63,
+- 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C,
+- 0x61, 0x79, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+- 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+- 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73,
+- 0x69, 0x62, 0x6C, 0x65, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D,
+- 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+- 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52,
+- 0x65, 0x63, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+- 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+- 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73,
+- 0x69, 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64,
+- 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63,
+- 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+- 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+- 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69,
+- 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x49,
+- 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+- 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+- 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
+- 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+- 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x72, 0x54, 0x72,
+- 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+- 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x4F,
+- 0x66, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+- 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43,
+- 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+- 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56,
+- 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+- 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+- 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74,
+- 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+- 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E,
+- 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65,
+- 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+- 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
+- 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+- 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F,
+- 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x4E, 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55,
+- 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+- 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D,
+- 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+- 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+- 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D,
+- 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+- 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x57, 0x72, 0x69, 0x74, 0x65,
+- 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+- 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+- 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72,
+- 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F,
+- 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+- 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x47, 0x65, 0x74, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74,
+- 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+- 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+- 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+- 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+- 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+- 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x72, 0x65,
+- 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+- 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75, 0x72, 0x61,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+- 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74,
+- 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+- 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74,
+- 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
+- 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61,
+- 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+- 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+- 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+- 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72,
+- 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x54, 0x69, 0x6D, 0x65, 0x3C,
+- 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+- 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6D, 0x65,
+- 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+- 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x54, 0x69, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+- 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+- 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C,
+- 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+- 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x43, 0x6F, 0x75,
+- 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74,
+- 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+- 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43,
+- 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+- 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+- 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+- 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65,
+- 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+- 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+- 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6E,
+- 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73,
+- 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74,
+- 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+- 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+- 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
+- 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61,
+- 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+- 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+- 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
+- 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+- 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+- 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+- 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x53, 0x70, 0x65, 0x65,
+- 0x64, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+- 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x65, 0x74,
+- 0x74, 0x69, 0x6E, 0x67, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+- 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+- 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63,
+- 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C,
+- 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+- 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+- 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+- 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+- 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C,
+- 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+- 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x52, 0x65, 0x63, 0x6F, 0x72,
+- 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+- 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+- 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
+- 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74,
+- 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49,
+- 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+- 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+- 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+- 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+- 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+- 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x50, 0x61, 0x75, 0x73, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+- 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61,
+- 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+- 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+- 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+- 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+- 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+- 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+- 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+- 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+- 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54,
+- 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x72,
+- 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+- 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74,
+- 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6F, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73,
+- 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x65, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+- 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E,
+- 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+- 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+- 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+- 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+- 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x6E, 0x69, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+- 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+- 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x4D, 0x6F, 0x64, 0x65, 0x3C,
+- 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+- 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
+- 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+- 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53,
+- 0x65, 0x65, 0x6B, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+- 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+- 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x41, 0x56, 0x54, 0x72,
+- 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+- 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+- 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C,
+- 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+- 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+- 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E,
+- 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+- 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+- 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+- 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+- 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+- 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+- 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49,
+- 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+- 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+- 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72,
+- 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F,
+- 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+- 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x53, 0x65, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+- 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+- 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+- 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+- 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+- 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+- 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x77, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+- 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65,
+- 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+- 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x6F, 0x70, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+- 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+- 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74,
+- 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+- 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74,
+- 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C,
+- 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+- 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x3C, 0x2F,
+- 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+- 0x3E, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x5F, 0x4F, 0x4E, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+- 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54,
+- 0x5F, 0x41, 0x4C, 0x4C, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+- 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x48, 0x55, 0x46, 0x46, 0x4C, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+- 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x48, 0x55,
+- 0x46, 0x46, 0x4C, 0x45, 0x5F, 0x4E, 0x4F, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+- 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x56, 0x61, 0x6C,
+- 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x3C, 0x2F, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x56, 0x61,
+- 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61,
+- 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+- 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64,
+- 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64,
+- 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+- 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44,
+- 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+- 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
+- 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
+- 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4C, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x3C, 0x2F, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+- 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
+- 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F,
+- 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+- 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+- 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52,
+- 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+- 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+- 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75,
+- 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+- 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65,
+- 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x52, 0x65,
+- 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+- 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+- 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54,
+- 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+- 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+- 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72,
+- 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61,
+- 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+- 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73,
+- 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+- 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+- 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65,
+- 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C,
+- 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+- 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+- 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+- 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75,
+- 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+- 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73,
+- 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E,
+- 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+- 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
+- 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+- 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+- 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x54, 0x4F, 0x50, 0x50, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+- 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x50, 0x41,
+- 0x55, 0x53, 0x45, 0x44, 0x5F, 0x50, 0x4C, 0x41, 0x59, 0x42, 0x41, 0x43, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+- 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x50, 0x4C, 0x41, 0x59,
+- 0x49, 0x4E, 0x47, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+- 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x54, 0x52, 0x41, 0x4E, 0x53, 0x49, 0x54, 0x49, 0x4F, 0x4E, 0x49, 0x4E, 0x47, 0x3C,
+- 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+- 0x65, 0x3E, 0x4E, 0x4F, 0x5F, 0x4D, 0x45, 0x44, 0x49, 0x41, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x54, 0x3C, 0x2F,
+- 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69,
+- 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+- 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+- 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44,
+- 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64,
+- 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74,
+- 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+- 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70,
+- 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+- 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65,
+- 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x52,
+- 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61,
+- 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+- 0x65, 0x3E, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+- 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+- 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C,
+- 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
+- 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+- 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52,
+- 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75,
+- 0x6D, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F,
+- 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C,
+- 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+- 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x6F,
+- 0x6C, 0x75, 0x74, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+- 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
+- 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D,
+- 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E,
+- 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+- 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B,
+- 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+- 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+- 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x4E, 0x45, 0x3C,
+- 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+- 0x65, 0x3E, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+- 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+- 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x44, 0x41, 0x3C, 0x2F, 0x61,
+- 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+- 0x48, 0x44, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+- 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+- 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75,
+- 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+- 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+- 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+- 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x57, 0x72,
+- 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
+- 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69,
+- 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+- 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45,
+- 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+- 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65,
+- 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x50,
+- 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C,
+- 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+- 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+- 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+- 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+- 0x3E, 0x4E, 0x4F, 0x4E, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+- 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+- 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44,
+- 0x2D, 0x44, 0x41, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+- 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x48, 0x44, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+- 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+- 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x3C,
+- 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C,
+- 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61,
+- 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+- 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65,
+- 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+- 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65,
+- 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x4F, 0x66, 0x54,
+- 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61,
+- 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+- 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E,
+- 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C,
+- 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+- 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E,
+- 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x4D, 0x6F, 0x64, 0x65, 0x3C,
+- 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+- 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+- 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+- 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+- 0x3E, 0x52, 0x45, 0x4C, 0x5F, 0x54, 0x49, 0x4D, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+- 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+- 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x5F, 0x4E, 0x52,
+- 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+- 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
+- 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
+- 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x65, 0x6B,
+- 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+- 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65,
+- 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x52,
+- 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61,
+- 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+- 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+- 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
+- 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+- 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+- 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+- 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54,
+- 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+- 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+- 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4F, 0x4B, 0x3C, 0x2F,
+- 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+- 0x3E, 0x45, 0x52, 0x52, 0x4F, 0x52, 0x5F, 0x4F, 0x43, 0x43, 0x55, 0x52, 0x52, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+- 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+- 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E,
+- 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+- 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+- 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+- 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+- 0x31, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+- 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x65, 0x72,
+- 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x73,
+- 0x63, 0x70, 0x64, 0x3E, 0x00
++ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
++ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
++ 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68, 0x65,
++ 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
++ 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F,
++ 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E,
++ 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56,
++ 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69,
++ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72,
++ 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73,
++ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
++ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74,
++ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
++ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
++ 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
++ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
++ 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
++ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
++ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43,
++ 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F,
++ 0x6E, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69,
++ 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E,
++ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
++ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
++ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
++ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
++ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53,
++ 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
++ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6F,
++ 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D,
++ 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x51,
++ 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6F,
++ 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D,
++ 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
++ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
++ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
++ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
++ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E,
++ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
++ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x4E, 0x72, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65,
++ 0x72, 0x4F, 0x66, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
++ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
++ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++ 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
++ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74,
++ 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74,
++ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
++ 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
++ 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
++ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44,
++ 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x55,
++ 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
++ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
++ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73,
++ 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E,
++ 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
++ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D,
++ 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50,
++ 0x6C, 0x61, 0x79, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
++ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79,
++ 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x72,
++ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
++ 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
++ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75,
++ 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
++ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67,
++ 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x57,
++ 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
++ 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
++ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x63,
++ 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
++ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
++ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
++ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47,
++ 0x65, 0x74, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
++ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
++ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
++ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
++ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73,
++ 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54,
++ 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
++ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
++ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72,
++ 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B,
++ 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
++ 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
++ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
++ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61,
++ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
++ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D,
++ 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54,
++ 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
++ 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
++ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E,
++ 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
++ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x52, 0x65, 0x6C, 0x54, 0x69, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74,
++ 0x69, 0x76, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
++ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
++ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x54, 0x69, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
++ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++ 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
++ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x43, 0x6F, 0x75, 0x6E,
++ 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
++ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6F, 0x75, 0x6E,
++ 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
++ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x62,
++ 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++ 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
++ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74,
++ 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
++ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
++ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F,
++ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49,
++ 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
++ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61,
++ 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
++ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
++ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74,
++ 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
++ 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E,
++ 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
++ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++ 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C,
++ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
++ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x70,
++ 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74,
++ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50,
++ 0x6C, 0x61, 0x79, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
++ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53,
++ 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
++ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
++ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
++ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
++ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
++ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65,
++ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
++ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F,
++ 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x51, 0x75, 0x61,
++ 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
++ 0x6E, 0x74, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C,
++ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
++ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
++ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
++ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65,
++ 0x78, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E,
++ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
++ 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
++ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
++ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
++ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
++ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x61, 0x75, 0x73, 0x65, 0x3C,
++ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
++ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61,
++ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
++ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
++ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
++ 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
++ 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
++ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
++ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
++ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
++ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E,
++ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
++ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
++ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
++ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74,
++ 0x50, 0x6C, 0x61, 0x79, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
++ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6F, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
++ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
++ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F,
++ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49,
++ 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
++ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x65, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
++ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
++ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
++ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
++ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61,
++ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x6E, 0x69,
++ 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
++ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65,
++ 0x65, 0x6B, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
++ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x61,
++ 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E,
++ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
++ 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
++ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
++ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73,
++ 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
++ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
++ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
++ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
++ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
++ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55,
++ 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F,
++ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55,
++ 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E,
++ 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
++ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56,
++ 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61,
++ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
++ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
++ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53,
++ 0x65, 0x74, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49,
++ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
++ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74,
++ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
++ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
++ 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
++ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
++ 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
++ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65,
++ 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65,
++ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
++ 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
++ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44,
++ 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
++ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
++ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73,
++ 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
++ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
++ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
++ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
++ 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x50, 0x6C, 0x61,
++ 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
++ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
++ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
++ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
++ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
++ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x77, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64,
++ 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
++ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F,
++ 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
++ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x53, 0x74, 0x6F, 0x70, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
++ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
++ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
++ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
++ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
++ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
++ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69,
++ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65,
++ 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
++ 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
++ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
++ 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
++ 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C,
++ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
++ 0x65, 0x3E, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x5F, 0x4F, 0x4E, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
++ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54,
++ 0x5F, 0x41, 0x4C, 0x4C, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
++ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x48, 0x55, 0x46, 0x46, 0x4C, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
++ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x48, 0x55, 0x46, 0x46,
++ 0x4C, 0x45, 0x5F, 0x4E, 0x4F, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
++ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C,
++ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
++ 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x3C, 0x2F, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++ 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63,
++ 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
++ 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
++ 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49,
++ 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
++ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
++ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
++ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4C, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6E,
++ 0x67, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
++ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
++ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61,
++ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
++ 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
++ 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74,
++ 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61,
++ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
++ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
++ 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
++ 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C,
++ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
++ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
++ 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
++ 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E,
++ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
++ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
++ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
++ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
++ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74,
++ 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F,
++ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
++ 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C,
++ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69,
++ 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
++ 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E,
++ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
++ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
++ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
++ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
++ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
++ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
++ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
++ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
++ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
++ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
++ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
++ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
++ 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
++ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
++ 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
++ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73,
++ 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69,
++ 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
++ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x54, 0x4F, 0x50, 0x50, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
++ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x50, 0x41, 0x55,
++ 0x53, 0x45, 0x44, 0x5F, 0x50, 0x4C, 0x41, 0x59, 0x42, 0x41, 0x43, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
++ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x50, 0x4C, 0x41, 0x59, 0x49, 0x4E,
++ 0x47, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
++ 0x75, 0x65, 0x3E, 0x54, 0x52, 0x41, 0x4E, 0x53, 0x49, 0x54, 0x49, 0x4F, 0x4E, 0x49, 0x4E, 0x47, 0x3C, 0x2F, 0x61, 0x6C,
++ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F,
++ 0x5F, 0x4D, 0x45, 0x44, 0x49, 0x41, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x54, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
++ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
++ 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
++ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
++ 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++ 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74,
++ 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
++ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69,
++ 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65,
++ 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
++ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
++ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
++ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
++ 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61,
++ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++ 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
++ 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75,
++ 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34,
++ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75,
++ 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35,
++ 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
++ 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
++ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
++ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
++ 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
++ 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69,
++ 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64,
++ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61,
++ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
++ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
++ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74,
++ 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74,
++ 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
++ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B,
++ 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
++ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
++ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
++ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x4E, 0x45, 0x3C, 0x2F, 0x61, 0x6C,
++ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x55, 0x4E,
++ 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
++ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x44, 0x41, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
++ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x48, 0x44, 0x44, 0x3C, 0x2F, 0x61,
++ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
++ 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
++ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73,
++ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
++ 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70,
++ 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
++ 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
++ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64,
++ 0x69, 0x75, 0x6D, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
++ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
++ 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50,
++ 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
++ 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
++ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
++ 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x50, 0x6C, 0x61,
++ 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E,
++ 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
++ 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
++ 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x4E, 0x45,
++ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
++ 0x65, 0x3E, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
++ 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
++ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x44, 0x41, 0x3C, 0x2F, 0x61, 0x6C,
++ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x48, 0x44,
++ 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
++ 0x75, 0x65, 0x3E, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
++ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
++ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
++ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F,
++ 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
++ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72,
++ 0x4F, 0x66, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F,
++ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E,
++ 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F,
++ 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
++ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
++ 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
++ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
++ 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x52, 0x45, 0x4C, 0x5F, 0x54, 0x49, 0x4D,
++ 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
++ 0x75, 0x65, 0x3E, 0x54, 0x52, 0x41, 0x43, 0x4B, 0x5F, 0x4E, 0x52, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
++ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C,
++ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
++ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
++ 0x50, 0x45, 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
++ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
++ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62,
++ 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x61,
++ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
++ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
++ 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
++ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
++ 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
++ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73,
++ 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
++ 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73,
++ 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
++ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4F, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
++ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x45, 0x52, 0x52, 0x4F, 0x52, 0x5F, 0x4F,
++ 0x43, 0x43, 0x55, 0x52, 0x52, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
++ 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
++ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
++ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
++ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50, 0x6C, 0x61,
++ 0x79, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
++ 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
++ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
++ 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
++ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73,
++ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73,
++ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x3C, 0x2F,
++ 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
+ };
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml
+index 63a3ee9..f9ee988 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml
+@@ -281,6 +281,26 @@
+ </argumentList>
+ </action>
+ <action>
++ <name>SetNextAVTransportURI</name>
++ <argumentList>
++ <argument>
++ <name>InstanceID</name>
++ <direction>in</direction>
++ <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
++ </argument>
++ <argument>
++ <name>NextURI</name>
++ <direction>in</direction>
++ <relatedStateVariable>NextAVTransportURI</relatedStateVariable>
++ </argument>
++ <argument>
++ <name>NextURIMetaData</name>
++ <direction>in</direction>
++ <relatedStateVariable>NextAVTransportURIMetaData</relatedStateVariable>
++ </argument>
++ </argumentList>
++ </action>
++ <action>
+ <name>SetPlayMode</name>
+ <argumentList>
+ <argument>
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp
+index 11e4e6a..87aabf3 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp
+@@ -882,6 +882,10 @@ PLT_MediaController::OnActionResponse(NPT_Result res,
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnSetAVTransportURIResult(res, device, userdata);
+ }
++ else if (actionName.Compare("SetNextAVTransportURI", true) == 0) {
++ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
++ m_Delegate->OnSetNextAVTransportURIResult(res, device, userdata);
++ }
+ else if (actionName.Compare("SetPlayMode", true) == 0) {
+ if (NPT_FAILED(FindRenderer(uuid, device))) res = NPT_FAILURE;
+ m_Delegate->OnSetPlayModeResult(res, device, userdata);
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h
+index 672c12a..bfd909c 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h
+@@ -176,6 +176,11 @@ public:
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
++ virtual void OnSetNextAVTransportURIResult(
++ NPT_Result /* res */,
++ PLT_DeviceDataReference& /* device */,
++ void* /* userdata */) {}
++
+ virtual void OnSetPlayModeResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp
+index 2a6986b..88144f7 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp
+@@ -258,6 +258,9 @@ PLT_MediaRenderer::OnAction(PLT_ActionReference& action,
+ if (name.Compare("SetAVTransportURI", true) == 0) {
+ return OnSetAVTransportURI(action);
+ }
++ if (name.Compare("SetNextAVTransportURI", true) == 0) {
++ return OnSetNextAVTransportURI(action);
++ }
+ if (name.Compare("SetPlayMode", true) == 0) {
+ return OnSetPlayMode(action);
+ }
+@@ -426,6 +429,33 @@ PLT_MediaRenderer::OnSetAVTransportURI(PLT_ActionReference& action)
+ }
+
+ /*----------------------------------------------------------------------
++ | PLT_MediaRenderer::OnSetAVTransportURI
++ +---------------------------------------------------------------------*/
++NPT_Result
++PLT_MediaRenderer::OnSetNextAVTransportURI(PLT_ActionReference& action)
++{
++ if (m_Delegate) {
++ return m_Delegate->OnSetNextAVTransportURI(action);
++ }
++
++ // default implementation is using state variable
++ NPT_String uri;
++ NPT_CHECK_WARNING(action->GetArgumentValue("NextURI", uri));
++
++ NPT_String metadata;
++ NPT_CHECK_WARNING(action->GetArgumentValue("NextURIMetaData", metadata));
++
++ PLT_Service* serviceAVT;
++ NPT_CHECK_WARNING(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceAVT));
++
++ // update service state variables
++ serviceAVT->SetStateVariable("NextAVTransportURI", uri);
++ serviceAVT->SetStateVariable("NextAVTransportURIMetaData", metadata);
++
++ return NPT_SUCCESS;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_MediaRenderer::OnSetPlayMode
+ +---------------------------------------------------------------------*/
+ NPT_Result
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h
+index d596838..bc0ac32 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h
+@@ -59,6 +59,7 @@ public:
+ virtual NPT_Result OnSeek(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnStop(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetAVTransportURI(PLT_ActionReference& action) = 0;
++ virtual NPT_Result OnSetNextAVTransportURI(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetPlayMode(PLT_ActionReference& action) = 0;
+
+ // RenderingControl
+@@ -102,6 +103,7 @@ protected:
+ virtual NPT_Result OnSeek(PLT_ActionReference& action);
+ virtual NPT_Result OnStop(PLT_ActionReference& action);
+ virtual NPT_Result OnSetAVTransportURI(PLT_ActionReference& action);
++ virtual NPT_Result OnSetNextAVTransportURI(PLT_ActionReference& action);
+ virtual NPT_Result OnSetPlayMode(PLT_ActionReference& action);
+
+ // RenderingControl
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0019-platinum-add-support-for-UpdateObject-action.patch b/lib/libUPnP/patches/0019-platinum-add-support-for-UpdateObject-action.patch
new file mode 100644
index 0000000..7a85740
--- /dev/null
+++ b/lib/libUPnP/patches/0019-platinum-add-support-for-UpdateObject-action.patch
@@ -0,0 +1,996 @@
+From abab9608a647177ff2a81d5827a6a0d11358b304 Mon Sep 17 00:00:00 2001
+From: Alasdair Campbell <alcoheca@gmail.com>
+Date: Wed, 3 Apr 2013 13:07:13 +0100
+Subject: [PATCH 19/24] platinum: add support for UpdateObject action
+
+---
+ .../MediaServer/ContentDirectorywSearchSCPD.cpp | 760 +++++++++++----------
+ .../MediaServer/ContentDirectorywSearchSCPD.xml | 26 +-
+ .../Source/Devices/MediaServer/PltMediaServer.cpp | 107 +++
+ .../Source/Devices/MediaServer/PltMediaServer.h | 9 +
+ 4 files changed, 548 insertions(+), 354 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp
+index 4fb91d8..3e8cc89 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.cpp
+@@ -40,360 +40,414 @@
+ /*----------------------------------------------------------------------
+ | globals
+ +---------------------------------------------------------------------*/
+-NPT_UInt8 MS_ContentDirectorywSearchSCPD[7058] =
++NPT_UInt8 MS_ContentDirectorywSearchSCPD[8121] =
+ {
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+- 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+- 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+- 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+- 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
+- 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A,
+- 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69,
+- 0x6E, 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F,
+- 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+- 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x42,
+- 0x72, 0x6F, 0x77, 0x73, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x72,
+- 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
+- 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4F, 0x62,
+- 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+- 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+- 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+- 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+- 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+- 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A,
+- 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+- 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+- 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C,
+- 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20,
+- 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+- 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72,
+- 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+- 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72,
+- 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+- 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+- 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+- 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+- 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65,
+- 0x78, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+- 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6F, 0x75,
+- 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+- 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+- 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+- 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69,
+- 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C,
+- 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+- 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+- 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65,
+- 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20,
+- 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+- 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+- 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+- 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+- 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D,
+- 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+- 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+- 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+- 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E,
+- 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+- 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+- 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73,
+- 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+- 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+- 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
+- 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+- 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+- 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+- 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+- 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69,
+- 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F,
+- 0x72, 0x74, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+- 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+- 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x72,
+- 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+- 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+- 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+- 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+- 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+- 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55,
+- 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+- 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+- 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x49, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+- 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+- 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+- 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74,
+- 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+- 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72,
+- 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74,
+- 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+- 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61,
+- 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+- 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+- 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+- 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74,
+- 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+- 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+- 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09,
+- 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+- 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x43, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+- 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+- 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72,
+- 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+- 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+- 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C,
+- 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+- 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+- 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+- 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+- 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+- 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+- 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C,
+- 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+- 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49,
+- 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+- 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F,
+- 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+- 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6F, 0x75, 0x6E, 0x74,
+- 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+- 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+- 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+- 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+- 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+- 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69,
+- 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+- 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C,
+- 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+- 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+- 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+- 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+- 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74,
+- 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+- 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+- 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+- 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+- 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+- 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+- 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
+- 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+- 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+- 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74,
+- 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+- 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+- 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+- 0x59, 0x50, 0x45, 0x5F, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+- 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+- 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+- 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+- 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74,
+- 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53,
+- 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+- 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+- 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+- 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A,
+- 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
+- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+- 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+- 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C,
+- 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x44, 0x69, 0x72,
+- 0x65, 0x63, 0x74, 0x43, 0x68, 0x69, 0x6C, 0x64, 0x72, 0x65, 0x6E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+- 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+- 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61,
+- 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74,
+- 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+- 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F,
+- 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61,
+- 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73,
+- 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+- 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+- 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+- 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+- 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+- 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+- 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+- 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F,
+- 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+- 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+- 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+- 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+- 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69,
+- 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+- 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+- 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+- 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
+- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+- 0x50, 0x45, 0x5F, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E,
+- 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73,
+- 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+- 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x20, 0x20, 0x20,
+- 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+- 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+- 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69,
+- 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61,
+- 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+- 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+- 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+- 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+- 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+- 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+- 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+- 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+- 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+- 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+- 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+- 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64,
+- 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+- 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+- 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
+- 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+- 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+- 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34,
+- 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74,
+- 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61,
+- 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+- 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F,
+- 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74,
+- 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+- 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+- 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+- 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+- 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73,
+- 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+- 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+- 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+- 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+- 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69,
+- 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61,
+- 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+- 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61,
+- 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
++0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
++0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68, 0x65,
++0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
++0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E,
++0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E,
++0x20, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E,
++0x20, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x3C,
++0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F,
++0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x3C, 0x2F, 0x6E,
++0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
++0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09,
++0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
++0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
++0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C,
++0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44,
++0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A,
++0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
++0x61, 0x6D, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E,
++0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72,
++0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
++0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61,
++0x67, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
++0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C,
++0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A,
++0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
++0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
++0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
++0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
++0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09,
++0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
++0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74,
++0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A,
++0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
++0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
++0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
++0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
++0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
++0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
++0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71,
++0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A,
++0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
++0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
++0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
++0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
++0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
++0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
++0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72,
++0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
++0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
++0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
++0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F,
++0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09,
++0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
++0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
++0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
++0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
++0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
++0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
++0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62,
++0x65, 0x72, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09,
++0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
++0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
++0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
++0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
++0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
++0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
++0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x6F, 0x74,
++0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
++0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
++0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
++0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
++0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
++0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
++0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61,
++0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69,
++0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
++0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
++0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
++0x45, 0x5F, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
++0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F,
++0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
++0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A,
++0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++0x47, 0x65, 0x74, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C,
++0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
++0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
++0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x73,
++0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
++0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
++0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C,
++0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
++0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
++0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
++0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C,
++0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74,
++0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
++0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
++0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09,
++0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
++0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
++0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
++0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x79,
++0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
++0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
++0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72,
++0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
++0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
++0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C,
++0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72,
++0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
++0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65,
++0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
++0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
++0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
++0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x65, 0x61,
++0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
++0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0A,
++0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C,
++0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61,
++0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09,
++0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3C, 0x2F, 0x6E, 0x61,
++0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
++0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
++0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
++0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
++0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
++0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
++0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C,
++0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
++0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F,
++0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
++0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x61,
++0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
++0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
++0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74,
++0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
++0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
++0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
++0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
++0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
++0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
++0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
++0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
++0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
++0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
++0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43,
++0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
++0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
++0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
++0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65,
++0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
++0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
++0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
++0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
++0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
++0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72,
++0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
++0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
++0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
++0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
++0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x52, 0x65,
++0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
++0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
++0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C,
++0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
++0x61, 0x6D, 0x65, 0x3E, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61,
++0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
++0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
++0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
++0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
++0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
++0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
++0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
++0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
++0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
++0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
++0x5F, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
++0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
++0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
++0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
++0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74,
++0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
++0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4F, 0x62, 0x6A, 0x65,
++0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
++0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
++0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
++0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C,
++0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
++0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
++0x65, 0x6E, 0x74, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
++0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
++0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x54, 0x61,
++0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
++0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
++0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x77, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3C, 0x2F,
++0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
++0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
++0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
++0x54, 0x59, 0x50, 0x45, 0x5F, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C, 0x2F, 0x72,
++0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
++0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
++0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
++0x69, 0x73, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E,
++0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65,
++0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E,
++0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
++0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A,
++0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
++0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
++0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61,
++0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x4D, 0x65,
++0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
++0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
++0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x43, 0x68, 0x69, 0x6C, 0x64, 0x72, 0x65,
++0x6E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
++0x09, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E,
++0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A,
++0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
++0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
++0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49,
++0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
++0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
++0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
++0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09,
++0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
++0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
++0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09,
++0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C,
++0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
++0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
++0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61,
++0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69,
++0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74,
++0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74,
++0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
++0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
++0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C,
++0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
++0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A,
++0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09,
++0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
++0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
++0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43,
++0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
++0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
++0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++0x62, 0x6C, 0x65, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
++0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
++0x22, 0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61,
++0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
++0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61,
++0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
++0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
++0x3E, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
++0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C,
++0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
++0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
++0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09, 0x09,
++0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62,
++0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
++0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
++0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
++0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
++0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09,
++0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
++0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09,
++0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52,
++0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61,
++0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
++0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
++0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
++0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A, 0x09,
++0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69,
++0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
++0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
++0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
++0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
++0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
++0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
++0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
++0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
++0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0A,
++0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
++0x54, 0x61, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0A,
++0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
++0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
++0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
++0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x0A,
++0x00
+ };
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml
+index 056a641..cba42e5 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml
+@@ -145,6 +145,26 @@
+ </argument>
+ </argumentList>
+ </action>
++ <action>
++ <name>UpdateObject</name>
++ <argumentList>
++ <argument>
++ <name>ObjectID</name>
++ <direction>in</direction>
++ <relatedStateVariable>A_ARG_TYPE_ObjectID</relatedStateVariable>
++ </argument>
++ <argument>
++ <name>CurrentTagValue</name>
++ <direction>in</direction>
++ <relatedStateVariable>A_ARG_TYPE_TagValueList</relatedStateVariable>
++ </argument>
++ <argument>
++ <name>NewTagValue</name>
++ <direction>in</direction>
++ <relatedStateVariable>A_ARG_TYPE_TagValueList</relatedStateVariable>
++ </argument>
++ </argumentList>
++ </action>
+ </actionList>
+ <serviceStateTable>
+ <stateVariable sendEvents="no">
+@@ -203,5 +223,9 @@
+ <name>A_ARG_TYPE_Filter</name>
+ <dataType>string</dataType>
+ </stateVariable>
++ <stateVariable sendEvents="no">
++ <name>A_ARG_TYPE_TagValueList</name>
++ <dataType>string</dataType>
++ </stateVariable>
+ </serviceStateTable>
+-</scpd>
+\ No newline at end of file
++</scpd>
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+index e275069..6ecec0f 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+@@ -169,6 +169,9 @@ PLT_MediaServer::OnAction(PLT_ActionReference& action,
+ if (name.Compare("Search", true) == 0) {
+ return OnSearch(action, context);
+ }
++ if (name.Compare("UpdateObject", true) == 0) {
++ return OnUpdate(action, context);
++ }
+ if (name.Compare("GetSystemUpdateID", true) == 0) {
+ return OnGetSystemUpdateID(action, context);
+ }
+@@ -356,6 +359,59 @@ PLT_MediaServer::ParseSort(const NPT_String& sort, NPT_List<NPT_String>& list)
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_MediaServer::ParseTagList
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_MediaServer::ParseTagList(const NPT_String& updates, NPT_Map<NPT_String,NPT_String>& tags)
++{
++ // reset output params first
++ tags.Clear();
++
++ NPT_List<NPT_String> split = updates.Split(",");
++ NPT_XmlNode* node = NULL;
++ NPT_XmlElementNode* didl_partial = NULL;
++ NPT_XmlParser parser;
++
++ // as these are single name value pairs, separated by commas we wrap in a tag
++ // to create a valid tree
++ NPT_String xml("<TagValueList>");
++ for (NPT_List<NPT_String>::Iterator entry = split.GetFirstItem(); entry; entry++) {
++ NPT_String& element = (*entry);
++ if (element.IsEmpty())
++ xml.Append("<empty>empty</empty>");
++ else
++ xml.Append(element);
++ }
++ xml.Append("</TagValueList>");
++
++ NPT_LOG_FINE("Parsing TagList...");
++ NPT_CHECK_LABEL_SEVERE(parser.Parse(xml, node), cleanup);
++ if (!node || !node->AsElementNode()) {
++ NPT_LOG_SEVERE("Invalid node type");
++ goto cleanup;
++ }
++
++ didl_partial = node->AsElementNode();
++ if (didl_partial->GetTag().Compare("TagValueList", true)) {
++ NPT_LOG_SEVERE("Invalid node tag");
++ goto cleanup;
++ }
++
++ for (NPT_List<NPT_XmlNode*>::Iterator children = didl_partial->GetChildren().GetFirstItem(); children; children++) {
++ NPT_XmlElementNode* child = (*children)->AsElementNode();
++ if (!child) continue;
++ tags[child->GetTag()] = *child->GetText();
++ }
++
++ return NPT_SUCCESS;
++
++cleanup:
++ if (node) delete node;
++ return NPT_FAILURE;
++}
++
++
++/*----------------------------------------------------------------------
+ | PLT_MediaServer::OnBrowse
+ +---------------------------------------------------------------------*/
+ NPT_Result
+@@ -529,6 +585,57 @@ PLT_MediaServer::OnSearch(PLT_ActionReference& action,
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_MediaServer::OnUpdate
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_MediaServer::OnUpdate(PLT_ActionReference& action,
++ const PLT_HttpRequestContext& context)
++{
++ if (!m_Delegate)
++ return NPT_ERROR_NOT_IMPLEMENTED;
++
++ int err;
++ const char* msg = NULL;
++
++ NPT_String object_id, current_xml, new_xml;
++ NPT_Map<NPT_String,NPT_String> curr_values;
++ NPT_Map<NPT_String,NPT_String> new_values;
++
++ NPT_CHECK_LABEL(action->GetArgumentValue("ObjectID", object_id), args);
++ NPT_CHECK_LABEL(object_id.IsEmpty(),args);
++ NPT_CHECK_LABEL(action->GetArgumentValue("CurrentTagValue", current_xml), args);
++ NPT_CHECK_LABEL(action->GetArgumentValue("NewTagValue", new_xml), args);
++
++ if (NPT_FAILED(ParseTagList(current_xml, curr_values))) {
++ err = 702;
++ msg = "Invalid currentTagvalue";
++ goto failure;
++ }
++ if (NPT_FAILED(ParseTagList(new_xml, new_values))) {
++ err = 703;
++ msg = "Invalid newTagValue";
++ goto failure;
++ }
++
++ if (curr_values.GetEntryCount() != new_values.GetEntryCount()) {
++ err = 706;
++ msg = "Paramater mismatch";
++ goto failure;
++ }
++
++ return m_Delegate->OnUpdateObject(action, object_id, curr_values, new_values, context);
++
++args:
++ err = 402;
++ msg = "Invalid args";
++
++failure:
++ NPT_LOG_WARNING(msg);
++ action->SetError(err, msg);
++ return NPT_FAILURE;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_MediaServer::OnBrowseMetadata
+ +---------------------------------------------------------------------*/
+ NPT_Result
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h
+index fb4f9f3..6af8aa1 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h
+@@ -87,6 +87,12 @@ public:
+ NPT_UInt32 /*requested_count*/,
+ const char* /*sort_criteria*/,
+ const PLT_HttpRequestContext& /*context*/) = 0;
++ virtual NPT_Result OnUpdateObject(PLT_ActionReference& /*action*/,
++ const char* /*object_id*/,
++ NPT_Map<NPT_String,NPT_String>& /*current_vals*/,
++ NPT_Map<NPT_String,NPT_String>& /*new_vals*/,
++ const PLT_HttpRequestContext& /*context*/) = 0;
++
+ virtual NPT_Result ProcessFileRequest(NPT_HttpRequest& /*request*/,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& /*response*/) = 0;
+@@ -111,6 +117,7 @@ public:
+ // class methods
+ static NPT_Result ParseBrowseFlag(const char* str, BrowseFlags& flag);
+ static NPT_Result ParseSort(const NPT_String& sort, NPT_List<NPT_String>& list);
++ static NPT_Result ParseTagList(const NPT_String& updates, NPT_Map<NPT_String,NPT_String>& tags);
+
+ // constructor
+ PLT_MediaServer(const char* friendly_name,
+@@ -155,6 +162,8 @@ protected:
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnSearch(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
++ virtual NPT_Result OnUpdate(PLT_ActionReference& action,
++ const PLT_HttpRequestContext& context);
+
+ // overridable methods
+ virtual NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0020-platinum-fixed-compiler-warning-about-unused-var.patch b/lib/libUPnP/patches/0020-platinum-fixed-compiler-warning-about-unused-var.patch
new file mode 100644
index 0000000..5b74d6f
--- /dev/null
+++ b/lib/libUPnP/patches/0020-platinum-fixed-compiler-warning-about-unused-var.patch
@@ -0,0 +1,32 @@
+From a6f7512f1d377a65fc5bf1976431454780d53d73 Mon Sep 17 00:00:00 2001
+From: davilla <davilla@4pi.com>
+Date: Thu, 11 Apr 2013 13:22:36 -0400
+Subject: [PATCH 20/24] platinum: fixed compiler warning about unused var
+
+---
+ lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
+index d38392e..e303cc6 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
++++ b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
+@@ -211,6 +211,7 @@ PLT_StateVariable::ValidateValue(const char* value)
+ while (val) {
+ val->Trim(" ");
+ if (!m_AllowedValues.Find(NPT_StringFinder(*val))) {
++#if defined(NPT_CONFIG_ENABLE_LOGGING)
+ NPT_LOG_WARNING_2("Invalid value of %s for state variable %s",
+ (const char*)*val,
+ (const char*)m_Name);
+@@ -218,6 +219,7 @@ PLT_StateVariable::ValidateValue(const char* value)
+ NPT_String *val = *m_AllowedValues.GetItem(i);
+ NPT_LOG_WARNING_1("Allowed: %s", (const char*)*val);
+ }
++#endif
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ ++val;
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0021-platinum-fix-shadowed-local-var.patch b/lib/libUPnP/patches/0021-platinum-fix-shadowed-local-var.patch
new file mode 100644
index 0000000..f81b609
--- /dev/null
+++ b/lib/libUPnP/patches/0021-platinum-fix-shadowed-local-var.patch
@@ -0,0 +1,27 @@
+From f9eff4bb16d36222c265681576707407627cf161 Mon Sep 17 00:00:00 2001
+From: Memphiz <memphis@machzwo.de>
+Date: Sat, 25 May 2013 23:06:14 +0200
+Subject: [PATCH 21/24] platinum: fix shadowed local var
+
+---
+ lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
+index e303cc6..f733d5c 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
++++ b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
+@@ -216,8 +216,8 @@ PLT_StateVariable::ValidateValue(const char* value)
+ (const char*)*val,
+ (const char*)m_Name);
+ for (unsigned long i=0; i < m_AllowedValues.GetItemCount(); i++) {
+- NPT_String *val = *m_AllowedValues.GetItem(i);
+- NPT_LOG_WARNING_1("Allowed: %s", (const char*)*val);
++ NPT_String *val2 = *m_AllowedValues.GetItem(i);
++ NPT_LOG_WARNING_1("Allowed: %s", (const char*)*val2);
+ }
+ #endif
+ return NPT_ERROR_INVALID_PARAMETERS;
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0022-platinum-Add-audio-x-flac-MIME-type-to-Neptune.patch b/lib/libUPnP/patches/0022-platinum-Add-audio-x-flac-MIME-type-to-Neptune.patch
new file mode 100644
index 0000000..04fbbd9
--- /dev/null
+++ b/lib/libUPnP/patches/0022-platinum-Add-audio-x-flac-MIME-type-to-Neptune.patch
@@ -0,0 +1,32 @@
+From c7dc8e23d0646200424179c16ccac2961df8da86 Mon Sep 17 00:00:00 2001
+From: mossywell <mark@mossywell.com>
+Date: Fri, 28 Mar 2014 07:26:49 +0000
+Subject: [PATCH 22/24] platinum: Add audio/x-flac MIME type to Neptune
+
+Change streaming FLAC MIME type from application/octet to audio/x-flac to
+support Frontier Silicon systems (such as the Axis X3) that require
+this. (Others don't care.)
+
+FLAC not added to DefaultDlnaMap as * suffices.
+
+(Commit amend: tabs --> spaces)
+(Commit amend: flac --> x-flac)
+---
+ lib/libUPnP/Neptune/Source/Core/NptHttp.cpp | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp b/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
+index 1700afc..8c5d587 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
++++ b/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
+@@ -2799,6 +2799,7 @@ NPT_HttpFileRequestHandler_DefaultFileTypeMap[] = {
+ {"aif", "audio/x-aiff"},
+ {"aifc", "audio/x-aiff"},
+ {"aiff", "audio/x-aiff"},
++ {"flac", "audio/x-flac"},
+ {"mka", "audio/x-matroska"},
+ {"mpa", "audio/mpeg"},
+ {"mp2", "audio/mpeg"},
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0023-platinum-lastPlaybackTime-is-in-the-upnp-and-not-in-.patch b/lib/libUPnP/patches/0023-platinum-lastPlaybackTime-is-in-the-upnp-and-not-in-.patch
new file mode 100644
index 0000000..22622c3
--- /dev/null
+++ b/lib/libUPnP/patches/0023-platinum-lastPlaybackTime-is-in-the-upnp-and-not-in-.patch
@@ -0,0 +1,26 @@
+From 19863401ba591822bc1df58c8d804530e0bafc16 Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Thu, 23 Jan 2014 19:36:06 +0100
+Subject: [PATCH 23/24] platinum: lastPlaybackTime is in the "upnp" and not in
+ the "dc" namespace
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 514a1ab..1728eff 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -559,7 +559,7 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ if (NPT_FAILED(str.ToInteger(value))) value = 0;
+ m_MiscInfo.last_position = value;
+
+- PLT_XmlHelper::GetChildText(entry, "lastPlaybackTime", m_MiscInfo.last_time, didl_namespace_dc, 256);
++ PLT_XmlHelper::GetChildText(entry, "lastPlaybackTime", m_MiscInfo.last_time, didl_namespace_upnp, 256);
+ NPT_String parsed_last_time;
+ for (int format=0; format<=NPT_DateTime::FORMAT_RFC_1036; format++) {
+ NPT_DateTime date;
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0024-platinum-add-already-supported-default-filters.patch b/lib/libUPnP/patches/0024-platinum-add-already-supported-default-filters.patch
new file mode 100644
index 0000000..22b4d8b
--- /dev/null
+++ b/lib/libUPnP/patches/0024-platinum-add-already-supported-default-filters.patch
@@ -0,0 +1,25 @@
+From bfeb22157a8f6542939b16e444d989181914cee8 Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Thu, 15 May 2014 18:24:46 +0200
+Subject: [PATCH 01/11] platinum: add already supported default filters
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 94f1ab3..9888b88 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -118,7 +118,7 @@ protected:
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata = false,
+- const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,searchable,childCount", // explicitely specify res otherwise WMP won't return a URL!
++ const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution", // explicitely specify res otherwise WMP won't return a URL!
+ const char* sort = "");
+ private:
+ NPT_Result Find(const char* ip, PLT_DeviceDataReference& device);
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0025-platinum-add-proper-support-for-dc-publisher.patch b/lib/libUPnP/patches/0025-platinum-add-proper-support-for-dc-publisher.patch
new file mode 100644
index 0000000..ee7e048
--- /dev/null
+++ b/lib/libUPnP/patches/0025-platinum-add-proper-support-for-dc-publisher.patch
@@ -0,0 +1,124 @@
+From 5991b14604febf705150cfc568255d9592e37b07 Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Mon, 19 May 2014 20:38:53 +0200
+Subject: [PATCH 02/11] platinum: add proper support for dc:publisher
+
+---
+ .../Source/Devices/MediaServer/PltDidl.cpp | 2 ++
+ .../Platinum/Source/Devices/MediaServer/PltDidl.h | 3 +++
+ .../Source/Devices/MediaServer/PltMediaItem.cpp | 23 ++++++++++++++++++++++
+ .../Source/Devices/MediaServer/PltMediaItem.h | 2 +-
+ .../Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ 5 files changed, 30 insertions(+), 2 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index 73f9ed2..3d8c9fd 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -135,6 +135,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_EPISODE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RATING, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RATING;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_PUBLISHER, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_PUBLISHER;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_DURATION, len, true) == 0 ||
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index 59d1605..ae67b43 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -90,6 +90,8 @@
+ #define PLT_FILTER_MASK_LASTPLAYBACK NPT_UINT64_C(0x0000000200000000)
+ #define PLT_FILTER_MASK_PLAYCOUNT NPT_UINT64_C(0x0000000400000000)
+
++#define PLT_FILTER_MASK_PUBLISHER NPT_UINT64_C(0x0000000800000000)
++
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+ #define PLT_FILTER_FIELD_DATE "dc:date"
+@@ -118,6 +120,7 @@
+ #define PLT_FILTER_FIELD_CONTAINER_CHILDCOUNT "container@childCount"
+ #define PLT_FILTER_FIELD_CONTAINER_SEARCHABLE "container@searchable"
+ #define PLT_FILTER_FIELD_REFID "@refID"
++#define PLT_FILTER_FIELD_PUBLISHER "dc:publisher"
+
+ #define PLT_FILTER_FIELD_RES "res"
+ #define PLT_FILTER_FIELD_RES_DURATION "res@duration"
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 1728eff..bd55cb5 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -172,6 +172,7 @@ PLT_MediaObject::Reset()
+ m_People.artists.Clear();
+ m_People.authors.Clear();
+ m_People.directors.Clear();
++ m_People.publisher.Clear();
+
+ m_Affiliation.album = "";
+ m_Affiliation.genres.Clear();
+@@ -259,6 +260,20 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ m_People.directors.ToDidl(didl, "director");
+ }
+
++ // publisher
++ if (mask & PLT_FILTER_MASK_PUBLISHER) {
++ // Add unknown publisher
++ if (m_People.publisher.GetItemCount() == 0)
++ m_People.publisher.Add("Unknown");
++
++ for (NPT_List<NPT_String>::Iterator it =
++ m_People.publisher.GetFirstItem(); it; ++it) {
++ didl += "<dc:publisher>";
++ PLT_Didl::AppendXmlEscape(didl, (*it));
++ didl += "</dc:publisher>";
++ }
++ }
++
+ // album
+ if ((mask & PLT_FILTER_MASK_ALBUM) && !m_Affiliation.album.IsEmpty()) {
+ didl += "<upnp:album>";
+@@ -517,6 +532,14 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ PLT_XmlHelper::GetChildren(entry, children, "director", didl_namespace_upnp);
+ m_People.directors.FromDidl(children);
+
++ children.Clear();
++ PLT_XmlHelper::GetChildren(entry, children, "publisher", didl_namespace_dc);
++ for (NPT_Cardinal i=0; i<children.GetItemCount(); i++) {
++ if (children[i]->GetText()) {
++ m_People.publisher.Add(*children[i]->GetText());
++ }
++ }
++
+ PLT_XmlHelper::GetChildText(entry, "album", m_Affiliation.album, didl_namespace_upnp, 256);
+ PLT_XmlHelper::GetChildText(entry, "programTitle", m_Recorded.program_title, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "seriesTitle", m_Recorded.series_title, didl_namespace_upnp);
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 2449276..9df90d5 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -92,7 +92,7 @@ typedef struct {
+ PLT_PersonRoles authors;
+ NPT_String producer; //TODO: can be multiple
+ PLT_PersonRoles directors;
+- NPT_String publisher; //TODO: can be multiple
++ NPT_List<NPT_String> publisher;
+ NPT_String contributor; // should match m_Creator (dc:creator) //TODO: can be multiple
+ } PLT_PeopleInfo;
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 9888b88..c6fc3be 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -118,7 +118,7 @@ protected:
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata = false,
+- const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution", // explicitely specify res otherwise WMP won't return a URL!
++ const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution", // explicitely specify res otherwise WMP won't return a URL!
+ const char* sort = "");
+ private:
+ NPT_Result Find(const char* ip, PLT_DeviceDataReference& device);
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0026-platinum-add-support-for-upnp-episodeCount-and-upnp-.patch b/lib/libUPnP/patches/0026-platinum-add-support-for-upnp-episodeCount-and-upnp-.patch
new file mode 100644
index 0000000..2e5cc3e
--- /dev/null
+++ b/lib/libUPnP/patches/0026-platinum-add-support-for-upnp-episodeCount-and-upnp-.patch
@@ -0,0 +1,131 @@
+From f4eef1767e642fd3b46ce18a4daf619903b74d46 Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Tue, 31 Dec 2013 14:06:55 +0100
+Subject: [PATCH 03/11] platinum: add support for upnp:episodeCount and
+ upnp:episodeSeason from ContentDirectory v4
+
+---
+ .../Source/Devices/MediaServer/PltDidl.cpp | 6 +++++-
+ .../Platinum/Source/Devices/MediaServer/PltDidl.h | 6 ++++++
+ .../Source/Devices/MediaServer/PltMediaItem.cpp | 22 ++++++++++++++++++++++
+ .../Source/Devices/MediaServer/PltMediaItem.h | 2 ++
+ .../Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ 5 files changed, 36 insertions(+), 2 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index 3d8c9fd..0758ad5 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -156,7 +156,11 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_NRAUDIOCHANNELS;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_SAMPLEFREQUENCY, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_SAMPLEFREQUENCY;
+- }
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_EPISODE_COUNT, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_EPISODE_COUNT;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_EPISODE_SEASON, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_EPISODE_SEASON;
++ }
+
+ if (next_comma < 0) {
+ return mask;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index ae67b43..2271162 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -92,6 +92,9 @@
+
+ #define PLT_FILTER_MASK_PUBLISHER NPT_UINT64_C(0x0000000800000000)
+
++#define PLT_FILTER_MASK_EPISODE_COUNT NPT_UINT64_C(0x0000001000000000)
++#define PLT_FILTER_MASK_EPISODE_SEASON NPT_UINT64_C(0x0000002000000000)
++
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+ #define PLT_FILTER_FIELD_DATE "dc:date"
+@@ -133,6 +136,9 @@
+ #define PLT_FILTER_FIELD_RES_NRAUDIOCHANNELS "res@nrAudioChannels"
+ #define PLT_FILTER_FIELD_RES_SAMPLEFREQUENCY "res@sampleFrequency"
+
++#define PLT_FILTER_FIELD_EPISODE_COUNT "upnp:episodeCount"
++#define PLT_FILTER_FIELD_EPISODE_SEASON "upnp:episodeSeason"
++
+ extern const char* didl_header;
+ extern const char* didl_footer;
+ extern const char* didl_namespace_dc;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index bd55cb5..a8855cc 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -195,6 +195,8 @@ PLT_MediaObject::Reset()
+ m_Recorded.program_title = "";
+ m_Recorded.series_title = "";
+ m_Recorded.episode_number = 0;
++ m_Recorded.episode_count = 0;
++ m_Recorded.episode_season = 0;
+
+ m_Resources.Clear();
+
+@@ -389,6 +391,20 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ didl += "</upnp:episodeNumber>";
+ }
+
++ // episode count
++ if ((mask & PLT_FILTER_MASK_EPISODE_COUNT) && m_Recorded.episode_count > 0) {
++ didl += "<upnp:episodeCount>";
++ didl += NPT_String::FromInteger(m_Recorded.episode_count);
++ didl += "</upnp:episodeCount>";
++ }
++
++ // episode count
++ if ((mask & PLT_FILTER_MASK_EPISODE_SEASON)) {
++ didl += "<upnp:episodeSeason>";
++ didl += NPT_String::FromInteger(m_Recorded.episode_season);
++ didl += "</upnp:episodeSeason>";
++ }
++
+ if ((mask & PLT_FILTER_MASK_TOC) && !m_MiscInfo.toc.IsEmpty()) {
+ didl += "<upnp:toc>";
+ PLT_Didl::AppendXmlEscape(didl, m_MiscInfo.toc);
+@@ -547,6 +563,12 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ NPT_UInt32 value;
+ if (NPT_FAILED(str.ToInteger(value))) value = 0;
+ m_Recorded.episode_number = value;
++ PLT_XmlHelper::GetChildText(entry, "episodeCount", str, didl_namespace_upnp);
++ if (NPT_FAILED(str.ToInteger(value))) value = 0;
++ m_Recorded.episode_count = value;
++ PLT_XmlHelper::GetChildText(entry, "episodeSeason", str, didl_namespace_upnp);
++ if (NPT_FAILED(str.ToInteger(value))) value = -1;
++ m_Recorded.episode_season = value;
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "genre", didl_namespace_upnp);
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 9df90d5..34a69b7 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -147,6 +147,8 @@ typedef struct {
+ NPT_String program_title;
+ NPT_String series_title;
+ NPT_UInt32 episode_number;
++ NPT_UInt32 episode_count;
++ NPT_UInt32 episode_season;
+ } PLT_RecordedInfo;
+
+ /*----------------------------------------------------------------------
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index c6fc3be..3c14dff 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -118,7 +118,7 @@ protected:
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata = false,
+- const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution", // explicitely specify res otherwise WMP won't return a URL!
++ const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason", // explicitely specify res otherwise WMP won't return a URL!
+ const char* sort = "");
+ private:
+ NPT_Result Find(const char* ip, PLT_DeviceDataReference& device);
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0027-platinum-add-support-for-xbmc-specific-fields-datead.patch b/lib/libUPnP/patches/0027-platinum-add-support-for-xbmc-specific-fields-datead.patch
new file mode 100644
index 0000000..ba7593f
--- /dev/null
+++ b/lib/libUPnP/patches/0027-platinum-add-support-for-xbmc-specific-fields-datead.patch
@@ -0,0 +1,284 @@
+From ac80794eedc6e240671ce3b60ecb4a24c58f84ab Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Mon, 19 May 2014 20:56:25 +0200
+Subject: [PATCH 04/11] platinum: add support for xbmc specific fields
+ dateadded, rating, votes and artwork
+
+xbmc:dateadded to pass dateadded with items and not need to stat upnp resources for that
+xbmc:rating for number-based rating
+xbmc:votes for string-based votes number
+xbmc:artwork for a type-url-based mapping of artwork
+---
+ .../Source/Devices/MediaServer/PltDidl.cpp | 12 ++-
+ .../Platinum/Source/Devices/MediaServer/PltDidl.h | 11 +++
+ .../Source/Devices/MediaServer/PltMediaItem.cpp | 109 +++++++++++++++++++++
+ .../Source/Devices/MediaServer/PltMediaItem.h | 23 +++++
+ .../Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ 5 files changed, 155 insertions(+), 2 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index 0758ad5..2bb6a04 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -47,11 +47,13 @@ NPT_SET_LOCAL_LOGGER("platinum.media.server.didl")
+ const char* didl_header = "<DIDL-Lite xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\""
+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\""
+ " xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\""
+- " xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\">";
++ " xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\""
++ " xmlns:xbmc=\"urn:schemas-xbmc-org:metadata-1-0/\">";
+ const char* didl_footer = "</DIDL-Lite>";
+ const char* didl_namespace_dc = "http://purl.org/dc/elements/1.1/";
+ const char* didl_namespace_upnp = "urn:schemas-upnp-org:metadata-1-0/upnp/";
+ const char* didl_namespace_dlna = "urn:schemas-dlna-org:metadata-1-0/";
++const char* didl_namespace_xbmc = "urn:schemas-xbmc-org:metadata-1-0/";
+
+ /*----------------------------------------------------------------------
+ | PLT_Didl::ConvertFilterToMask
+@@ -160,6 +162,14 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_EPISODE_COUNT;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_EPISODE_SEASON, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_EPISODE_SEASON;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_DATEADDED, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_XBMC_DATEADDED;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_RATING, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_XBMC_RATING;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_VOTES, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_XBMC_VOTES;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_ARTWORK, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_XBMC_ARTWORK;
+ }
+
+ if (next_comma < 0) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index 2271162..0f7c892 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -95,6 +95,11 @@
+ #define PLT_FILTER_MASK_EPISODE_COUNT NPT_UINT64_C(0x0000001000000000)
+ #define PLT_FILTER_MASK_EPISODE_SEASON NPT_UINT64_C(0x0000002000000000)
+
++#define PLT_FILTER_MASK_XBMC_DATEADDED NPT_UINT64_C(0x0000100000000000)
++#define PLT_FILTER_MASK_XBMC_RATING NPT_UINT64_C(0x0000200000000000)
++#define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000300000000000)
++#define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000400000000000)
++
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+ #define PLT_FILTER_FIELD_DATE "dc:date"
+@@ -139,11 +144,17 @@
+ #define PLT_FILTER_FIELD_EPISODE_COUNT "upnp:episodeCount"
+ #define PLT_FILTER_FIELD_EPISODE_SEASON "upnp:episodeSeason"
+
++#define PLT_FILTER_FIELD_XBMC_DATEADDED "xbmc:dateadded"
++#define PLT_FILTER_FIELD_XBMC_RATING "xbmc:rating"
++#define PLT_FILTER_FIELD_XBMC_VOTES "xbmc:votes"
++#define PLT_FILTER_FIELD_XBMC_ARTWORK "xbmc:artwork"
++
+ extern const char* didl_header;
+ extern const char* didl_footer;
+ extern const char* didl_namespace_dc;
+ extern const char* didl_namespace_upnp;
+ extern const char* didl_namespace_dlna;
++extern const char* didl_namespace_xbmc;
+
+ /*----------------------------------------------------------------------
+ | PLT_Didl
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index a8855cc..5c2ec84 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -110,6 +110,62 @@ PLT_PersonRoles::FromDidl(const NPT_Array<NPT_XmlElementNode*>& nodes)
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_Artworks::Add
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_Artworks::Add(const NPT_String& type, const NPT_String& url)
++{
++ PLT_Artwork artwork;
++ artwork.type = type;
++ artwork.url = url;
++
++ return NPT_List<PLT_Artwork>::Add(artwork);
++}
++
++/*----------------------------------------------------------------------
++| PLT_Artworks::ToDidl
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_Artworks::ToDidl(NPT_String& didl, const NPT_String& tag)
++{
++ NPT_String tmp;
++ for (NPT_List<PLT_Artwork>::Iterator it =
++ NPT_List<PLT_Artwork>::GetFirstItem(); it; it++) {
++ if (it->type.IsEmpty()) continue;
++
++ tmp += "<xbmc:" + tag;
++ if (!it->type.IsEmpty()) {
++ tmp += " type=\"";
++ PLT_Didl::AppendXmlEscape(tmp, it->type);
++ tmp += "\"";
++ }
++ tmp += ">";
++ PLT_Didl::AppendXmlEscape(tmp, it->url);
++ tmp += "</xbmc:" + tag + ">";
++ }
++
++ didl += tmp;
++ return NPT_SUCCESS;
++}
++
++/*----------------------------------------------------------------------
++| PLT_Artworks::ToDidl
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_Artworks::FromDidl(const NPT_Array<NPT_XmlElementNode*>& nodes)
++{
++ for (NPT_Cardinal i=0; i<nodes.GetItemCount(); i++) {
++ PLT_Artwork artwork;
++ const NPT_String* url = nodes[i]->GetText();
++ const NPT_String* type = nodes[i]->GetAttribute("type");
++ if (type) artwork.type = *type;
++ if (url) artwork.url = *url;
++ NPT_CHECK(NPT_List<PLT_Artwork>::Add(artwork));
++ }
++ return NPT_SUCCESS;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_MediaItemResource::PLT_MediaItemResource
+ +---------------------------------------------------------------------*/
+ PLT_MediaItemResource::PLT_MediaItemResource()
+@@ -200,6 +256,11 @@ PLT_MediaObject::Reset()
+
+ m_Resources.Clear();
+
++ m_XbmcInfo.date_added = "";
++ m_XbmcInfo.rating = 0.0f;
++ m_XbmcInfo.votes = "";
++ m_XbmcInfo.artwork.Clear();
++
+ m_Didl = "";
+
+ return NPT_SUCCESS;
+@@ -472,6 +533,32 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ }
+ }
+
++ // xbmc dateadded
++ if ((mask & PLT_FILTER_MASK_XBMC_DATEADDED) && !m_XbmcInfo.date_added.IsEmpty()) {
++ didl += "<xbmc:dateadded>";
++ PLT_Didl::AppendXmlEscape(didl, m_XbmcInfo.date_added);
++ didl += "</xbmc:dateadded>";
++ }
++
++ // xbmc rating
++ if (mask & PLT_FILTER_MASK_XBMC_RATING) {
++ didl += "<xbmc:rating>";
++ didl += NPT_String::Format("%.1f", m_XbmcInfo.rating);
++ didl += "</xbmc:rating>";
++ }
++
++ // xbmc votes
++ if (mask & PLT_FILTER_MASK_XBMC_VOTES && !m_XbmcInfo.votes.IsEmpty()) {
++ didl += "<xbmc:votes>";
++ PLT_Didl::AppendXmlEscape(didl, m_XbmcInfo.votes);
++ didl += "</xbmc:votes>";
++ }
++
++ // xbmc artwork
++ if (mask & PLT_FILTER_MASK_XBMC_ARTWORK) {
++ m_XbmcInfo.artwork.ToDidl(didl, "artwork");
++ }
++
+ // class is required
+ didl += "<upnp:class";
+ if (!m_ObjectClass.friendly_name.IsEmpty()) {
+@@ -672,6 +759,28 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ m_Resources.Add(resource);
+ }
+
++ PLT_XmlHelper::GetChildText(entry, "dateadded", m_XbmcInfo.date_added, didl_namespace_xbmc, 256);
++ // parse date and make sure it's valid
++ for (int format=0; format<=NPT_DateTime::FORMAT_RFC_1036; format++) {
++ NPT_DateTime date;
++ if (NPT_SUCCEEDED(date.FromString(m_XbmcInfo.date_added, (NPT_DateTime::Format)format))) {
++ parsed_date = date.ToString((NPT_DateTime::Format)format);
++ break;
++ }
++ }
++ m_XbmcInfo.date_added = parsed_date;
++
++ PLT_XmlHelper::GetChildText(entry, "rating", str, didl_namespace_xbmc);
++ NPT_Float floatValue;
++ if (NPT_FAILED(str.ToFloat(floatValue))) floatValue = 0.0;
++ m_XbmcInfo.rating = floatValue;
++
++ PLT_XmlHelper::GetChildText(entry, "votes", m_XbmcInfo.votes, didl_namespace_xbmc, 256);
++
++ children.Clear();
++ PLT_XmlHelper::GetChildren(entry, children, "artwork", didl_namespace_xbmc);
++ m_XbmcInfo.artwork.FromDidl(children);
++
+ // re serialize the entry didl as a we might need to pass it to a renderer
+ // we may have modified the tree to "fix" issues, so as not to break a renderer
+ // (don't write xml prefix as this didl could be part of a larger document)
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 34a69b7..56291a7 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -151,6 +151,26 @@ typedef struct {
+ NPT_UInt32 episode_season;
+ } PLT_RecordedInfo;
+
++typedef struct {
++ NPT_String type;
++ NPT_String url;
++} PLT_Artwork;
++
++class PLT_Artworks : public NPT_List<PLT_Artwork>
++{
++public:
++ NPT_Result Add(const NPT_String& type, const NPT_String& url);
++ NPT_Result ToDidl(NPT_String& didl, const NPT_String& tag);
++ NPT_Result FromDidl(const NPT_Array<NPT_XmlElementNode*>& nodes);
++};
++
++typedef struct {
++ NPT_String date_added;
++ NPT_Float rating;
++ NPT_String votes;
++ PLT_Artworks artwork;
++} PLT_XbmcInfo;
++
+ /*----------------------------------------------------------------------
+ | PLT_MediaItemResource
+ +---------------------------------------------------------------------*/
+@@ -229,6 +249,9 @@ public:
+ /* resources related */
+ NPT_Array<PLT_MediaItemResource> m_Resources;
+
++ /* XBMC specific */
++ PLT_XbmcInfo m_XbmcInfo;
++
+ /* original DIDL for Control Points to pass to a renderer when invoking SetAVTransportURI */
+ NPT_String m_Didl;
+ };
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 3c14dff..ffdddda 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -118,7 +118,7 @@ protected:
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata = false,
+- const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason", // explicitely specify res otherwise WMP won't return a URL!
++ const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork", // explicitely specify res otherwise WMP won't return a URL!
+ const char* sort = "");
+ private:
+ NPT_Result Find(const char* ip, PLT_DeviceDataReference& device);
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0028-platinum-add-SearchSync-method-to-SyncMediaBrowser.patch b/lib/libUPnP/patches/0028-platinum-add-SearchSync-method-to-SyncMediaBrowser.patch
new file mode 100644
index 0000000..e593271
--- /dev/null
+++ b/lib/libUPnP/patches/0028-platinum-add-SearchSync-method-to-SyncMediaBrowser.patch
@@ -0,0 +1,254 @@
+From 4d9d36139eed70da5ee922501bcf68443a349b44 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Micha=C5=82=20Piechowiak?= <misiek.piechowiak@gmail.com>
+Date: Fri, 2 Aug 2013 18:55:34 +0200
+Subject: [PATCH 05/11] platinum: add SearchSync method to SyncMediaBrowser
+
+---
+ .../Devices/MediaServer/PltSyncMediaBrowser.cpp | 150 +++++++++++++++++++--
+ .../Devices/MediaServer/PltSyncMediaBrowser.h | 25 +++-
+ 2 files changed, 164 insertions(+), 11 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+index 24219ff..96e4121 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+@@ -126,6 +126,24 @@ PLT_SyncMediaBrowser::Find(const char* ip, PLT_DeviceDataReference& device)
+ return NPT_FAILURE;
+ }
+
++static void OnResult(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ PLT_BrowseInfo* info,
++ void* userdata)
++{
++ NPT_COMPILER_UNUSED(device);
++
++ if (!userdata) return;
++
++ PLT_BrowseDataReference* data = (PLT_BrowseDataReference*) userdata;
++ (*data)->res = res;
++ if (NPT_SUCCEEDED(res) && info) {
++ (*data)->info = *info;
++ }
++ (*data)->shared_var.SetValue(1);
++ delete data;
++}
++
+ /*----------------------------------------------------------------------
+ | PLT_SyncMediaBrowser::OnBrowseResult
+ +---------------------------------------------------------------------*/
+@@ -135,17 +153,19 @@ PLT_SyncMediaBrowser::OnBrowseResult(NPT_Result res,
+ PLT_BrowseInfo* info,
+ void* userdata)
+ {
+- NPT_COMPILER_UNUSED(device);
+-
+- if (!userdata) return;
++ OnResult(res, device, info, userdata);
++}
+
+- PLT_BrowseDataReference* data = (PLT_BrowseDataReference*) userdata;
+- (*data)->res = res;
+- if (NPT_SUCCEEDED(res) && info) {
+- (*data)->info = *info;
+- }
+- (*data)->shared_var.SetValue(1);
+- delete data;
++/*----------------------------------------------------------------------
++| PLT_SyncMediaBrowser::OnSearchResult
+++---------------------------------------------------------------------*/
++void
++PLT_SyncMediaBrowser::OnSearchResult(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ PLT_BrowseInfo* info,
++ void* userdata)
++{
++ OnResult(res, device, info, userdata);
+ }
+
+ /*----------------------------------------------------------------------
+@@ -228,6 +248,38 @@ PLT_SyncMediaBrowser::BrowseSync(PLT_BrowseDataReference& browse_data,
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_SyncMediaBrowser::SearchSync
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_SyncMediaBrowser::SearchSync(PLT_BrowseDataReference& browse_data,
++ PLT_DeviceDataReference& device,
++ const char* container_id,
++ const char* search_criteria,
++ NPT_Int32 index,
++ NPT_Int32 count,
++ const char* filter)
++{
++ NPT_Result res;
++
++ browse_data->shared_var.SetValue(0);
++ browse_data->info.si = index;
++
++ // send off the search packet. Note that this will
++ // not block. There is a call to WaitForResponse in order
++ // to block until the response comes back.
++ res = PLT_MediaBrowser::Search(device,
++ container_id,
++ search_criteria,
++ index,
++ count,
++ filter,
++ new PLT_BrowseDataReference(browse_data));
++ NPT_CHECK_SEVERE(res);
++
++ return WaitForResponse(browse_data->shared_var);
++}
++
++/*----------------------------------------------------------------------
+ | PLT_SyncMediaBrowser::BrowseSync
+ +---------------------------------------------------------------------*/
+ NPT_Result
+@@ -319,6 +371,84 @@ done:
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_SyncMediaBrowser::SearchSync
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_SyncMediaBrowser::SearchSync(PLT_DeviceDataReference& device,
++ const char* container_id,
++ const char* search_criteria,
++ PLT_MediaObjectListReference& list,
++ NPT_Int32 start, /* = 0 */
++ NPT_Cardinal max_results /* = 0 */)
++{
++ NPT_Result res = NPT_FAILURE;
++ NPT_Int32 index = start;
++ NPT_UInt32 count = 0;
++
++ // reset output params
++ list = NULL;
++
++ do {
++ PLT_BrowseDataReference browse_data(new PLT_BrowseData(), true);
++
++ // send off the search packet. Note that this will
++ // not block. There is a call to WaitForResponse in order
++ // to block until the response comes back.
++ res = SearchSync(
++ browse_data,
++ device,
++ container_id,
++ search_criteria,
++ index,
++ 200); // DLNA recommendations for browsing children is no more than 30 at a time
++
++ NPT_CHECK_LABEL_WARNING(res, done);
++
++ if (NPT_FAILED(browse_data->res)) {
++ res = browse_data->res;
++ NPT_CHECK_LABEL_WARNING(res, done);
++ }
++
++ // server returned no more, bail now
++ if (browse_data->info.nr == 0)
++ break;
++
++ if (browse_data->info.nr != browse_data->info.items->GetItemCount()) {
++ NPT_LOG_WARNING_2("Server returned unexpected number of items (%d vs %d)",
++ browse_data->info.nr, browse_data->info.items->GetItemCount());
++ }
++ count += std::max<NPT_UInt32>(browse_data->info.nr, browse_data->info.items->GetItemCount());
++
++ if (list.IsNull()) {
++ list = browse_data->info.items;
++ } else {
++ list->Add(*browse_data->info.items);
++ // clear the list items so that the data inside is not
++ // cleaned up by PLT_MediaItemList dtor since we copied
++ // each pointer into the new list.
++ browse_data->info.items->Clear();
++ }
++
++ // stop now if our list contains exactly what the server said it had.
++ // Note that the server could return 0 if it didn't know how many items were
++ // available. In this case we have to continue browsing until
++ // nothing is returned back by the server.
++ // Unless we were told to stop after reaching a certain amount to avoid
++ // length delays
++ // (some servers may return a total matches out of whack at some point too)
++ if ((browse_data->info.tm && browse_data->info.tm <= count) ||
++ (max_results && count >= max_results))
++ break;
++
++ // ask for the next chunk of entries
++ index = count;
++ } while(1);
++
++done:
++ return res;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_SyncMediaBrowser::IsCached
+ +---------------------------------------------------------------------*/
+ bool
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index ffdddda..5ef9f37 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -61,6 +61,9 @@ typedef struct PLT_BrowseData {
+
+ typedef NPT_Reference<PLT_BrowseData> PLT_BrowseDataReference;
+
++// explicitely specify res otherwise WMP won't return a URL!
++#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork"
++
+ /*----------------------------------------------------------------------
+ | PLT_MediaContainerListener
+ +---------------------------------------------------------------------*/
+@@ -96,6 +99,10 @@ public:
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata);
++ virtual void OnSearchResult(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ PLT_BrowseInfo* info,
++ void* userdata);
+
+ // methods
+ void SetContainerListener(PLT_MediaContainerChangesListener* listener) {
+@@ -108,6 +115,13 @@ public:
+ NPT_Int32 start = 0,
+ NPT_Cardinal max_results = 0); // 0 means all
+
++ NPT_Result SearchSync(PLT_DeviceDataReference& device,
++ const char* container_id,
++ const char* search_criteria,
++ PLT_MediaObjectListReference& list,
++ NPT_Int32 start = 0,
++ NPT_Cardinal max_results = 0); // 0 means all
++
+ const NPT_Lock<PLT_DeviceMap>& GetMediaServersMap() const { return m_MediaServers; }
+ bool IsCached(const char* uuid, const char* object_id);
+
+@@ -118,8 +132,17 @@ protected:
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata = false,
+- const char* filter = "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork", // explicitely specify res otherwise WMP won't return a URL!
++ const char* filter = PLT_DEFAULT_FILTER,
+ const char* sort = "");
++
++ NPT_Result SearchSync(PLT_BrowseDataReference& browse_data,
++ PLT_DeviceDataReference& device,
++ const char* container_id,
++ const char* search_criteria,
++ NPT_Int32 index,
++ NPT_Int32 count,
++ const char* filter = PLT_DEFAULT_FILTER); // explicitely specify res otherwise WMP won't return a URL!
++
+ private:
+ NPT_Result Find(const char* ip, PLT_DeviceDataReference& device);
+ NPT_Result WaitForResponse(NPT_SharedVariable& shared_var);
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0029-platinum-implement-GetSearchCapabilities-in-media-br.patch b/lib/libUPnP/patches/0029-platinum-implement-GetSearchCapabilities-in-media-br.patch
new file mode 100644
index 0000000..224088a
--- /dev/null
+++ b/lib/libUPnP/patches/0029-platinum-implement-GetSearchCapabilities-in-media-br.patch
@@ -0,0 +1,251 @@
+From 4a35702414b4c3be06d24b5b5c5da86c3f058078 Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Sat, 8 Feb 2014 11:46:11 +0100
+Subject: [PATCH 06/11] platinum: implement GetSearchCapabilities in media
+ browser
+
+---
+ .../Source/Devices/MediaServer/PltMediaBrowser.cpp | 58 ++++++++++++++++++++++
+ .../Source/Devices/MediaServer/PltMediaBrowser.h | 14 ++++++
+ .../Devices/MediaServer/PltSyncMediaBrowser.cpp | 55 ++++++++++++++++++++
+ .../Devices/MediaServer/PltSyncMediaBrowser.h | 15 ++++++
+ 4 files changed, 142 insertions(+)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
+index 266397d..46b6f41 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
+@@ -305,6 +305,33 @@ PLT_MediaBrowser::Browse(PLT_DeviceDataReference& device,
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_MediaBrowser::GetSearchCapabilities
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_MediaBrowser::GetSearchCapabilities(PLT_DeviceDataReference& device,
++ void* userdata)
++{
++ // verify device still in our list
++ PLT_DeviceDataReference device_data;
++ NPT_CHECK_WARNING(FindServer(device->GetUUID(), device_data));
++
++ // create action
++ PLT_ActionReference action;
++ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
++ device,
++ "urn:schemas-upnp-org:service:ContentDirectory:1",
++ "GetSearchCapabilities",
++ action));
++
++ // invoke the action
++ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
++ return NPT_ERROR_INVALID_PARAMETERS;
++ }
++
++ return NPT_SUCCESS;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_MediaBrowser::OnActionResponse
+ +---------------------------------------------------------------------*/
+ NPT_Result
+@@ -322,6 +349,8 @@ PLT_MediaBrowser::OnActionResponse(NPT_Result res,
+ return OnBrowseResponse(res, device, action, userdata);
+ } else if (actionName.Compare("Search", true) == 0) {
+ return OnSearchResponse(res, device, action, userdata);
++ } else if (actionName.Compare("GetSearchCapabilities", true) == 0) {
++ return OnGetSearchCapabilitiesResponse(res, device, action, userdata);
+ }
+
+ return NPT_SUCCESS;
+@@ -436,6 +465,35 @@ bad_action:
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_MediaBrowser::OnGetSearchCapabilitiesResponse
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_MediaBrowser::OnGetSearchCapabilitiesResponse(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ PLT_ActionReference& action,
++ void* userdata)
++{
++ NPT_String value;
++
++ if (!m_Delegate) return NPT_SUCCESS;
++
++ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
++ goto bad_action;
++ }
++
++ if (NPT_FAILED(action->GetArgumentValue("SearchCaps", value))) {
++ goto bad_action;
++ }
++
++ m_Delegate->OnGetSearchCapabilitiesResult(NPT_SUCCESS, device, value, userdata);
++ return NPT_SUCCESS;
++
++bad_action:
++ m_Delegate->OnGetSearchCapabilitiesResult(NPT_FAILURE, device, value, userdata);
++ return NPT_FAILURE;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_MediaBrowser::OnEventNotify
+ +---------------------------------------------------------------------*/
+ NPT_Result
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
+index 2ee032b..023630d 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
+@@ -91,6 +91,12 @@ public:
+ PLT_DeviceDataReference& /*device*/,
+ PLT_BrowseInfo* /*info*/,
+ void* /*userdata*/) {}
++
++ virtual void OnGetSearchCapabilitiesResult(
++ NPT_Result /*res*/,
++ PLT_DeviceDataReference& /*device*/,
++ NPT_String /*searchCapabilities*/,
++ void* /*userdata*/) {}
+ };
+
+ /*----------------------------------------------------------------------
+@@ -124,6 +130,9 @@ public:
+ const char* filter = "dc:date,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:originalTrackNumber,upnp:album,upnp:artist,upnp:author", // explicitely specify res otherwise WMP won't return a URL!
+ void* userdata = NULL);
+
++ virtual NPT_Result GetSearchCapabilities(PLT_DeviceDataReference& device,
++ void* userdata = NULL);
++
+ // methods
+ virtual const NPT_Lock<PLT_DeviceDataReferenceList>& GetMediaServers() { return m_MediaServers; }
+ virtual NPT_Result FindServer(const char* uuid, PLT_DeviceDataReference& device);
+@@ -146,6 +155,11 @@ protected:
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata);
++
++ virtual NPT_Result OnGetSearchCapabilitiesResponse(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ PLT_ActionReference& action,
++ void* userdata);
+
+ protected:
+ PLT_CtrlPointReference m_CtrlPoint;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+index 96e4121..8ae9f72 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+@@ -169,6 +169,28 @@ PLT_SyncMediaBrowser::OnSearchResult(NPT_Result res,
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_SyncMediaBrowser::OnGetSearchCapabilitiesResult
+++---------------------------------------------------------------------*/
++void
++PLT_SyncMediaBrowser::OnGetSearchCapabilitiesResult(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ NPT_String searchCapabilities,
++ void* userdata)
++{
++ NPT_COMPILER_UNUSED(device);
++
++ if (!userdata) return;
++
++ PLT_CapabilitiesDataReference* data = (PLT_CapabilitiesDataReference*) userdata;
++ (*data)->res = res;
++ if (NPT_SUCCEEDED(res)) {
++ (*data)->capabilities = searchCapabilities;
++ }
++ (*data)->shared_var.SetValue(1);
++ delete data;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_SyncMediaBrowser::OnMSStateVariablesChanged
+ +---------------------------------------------------------------------*/
+ void
+@@ -280,6 +302,39 @@ PLT_SyncMediaBrowser::SearchSync(PLT_BrowseDataReference& browse_data,
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_SyncMediaBrowser::GetSearchCapabilitiesSync
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_SyncMediaBrowser::GetSearchCapabilitiesSync(PLT_DeviceDataReference& device,
++ NPT_String& searchCapabilities)
++{
++ NPT_Result res;
++
++ PLT_CapabilitiesDataReference capabilities_data(new PLT_CapabilitiesData(), true);
++ capabilities_data->shared_var.SetValue(0);
++
++ // send of the GetSearchCapabilities packet. Note that this will
++ // not block. There is a call to WaitForResponse in order
++ // to block until the response comes back.
++ res = PLT_MediaBrowser::GetSearchCapabilities(device,
++ new PLT_CapabilitiesDataReference(capabilities_data));
++ NPT_CHECK_SEVERE(res);
++
++ res = WaitForResponse(capabilities_data->shared_var);
++ NPT_CHECK_LABEL_WARNING(res, done);
++
++ if (NPT_FAILED(capabilities_data->res)) {
++ res = capabilities_data->res;
++ NPT_CHECK_LABEL_WARNING(res, done);
++ }
++
++ searchCapabilities = capabilities_data->capabilities;
++
++done:
++ return res;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_SyncMediaBrowser::BrowseSync
+ +---------------------------------------------------------------------*/
+ NPT_Result
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 5ef9f37..7054b72 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -61,6 +61,14 @@ typedef struct PLT_BrowseData {
+
+ typedef NPT_Reference<PLT_BrowseData> PLT_BrowseDataReference;
+
++typedef struct PLT_CapabilitiesData {
++ NPT_SharedVariable shared_var;
++ NPT_Result res;
++ NPT_String capabilities;
++} PLT_CapabilitiesData;
++
++typedef NPT_Reference<PLT_CapabilitiesData> PLT_CapabilitiesDataReference;
++
+ // explicitely specify res otherwise WMP won't return a URL!
+ #define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork"
+
+@@ -103,6 +111,10 @@ public:
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata);
++ virtual void OnGetSearchCapabilitiesResult(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ NPT_String searchCapabilities,
++ void* userdata);
+
+ // methods
+ void SetContainerListener(PLT_MediaContainerChangesListener* listener) {
+@@ -122,6 +134,9 @@ public:
+ NPT_Int32 start = 0,
+ NPT_Cardinal max_results = 0); // 0 means all
+
++ NPT_Result GetSearchCapabilitiesSync(PLT_DeviceDataReference& device,
++ NPT_String& searchCapabilities);
++
+ const NPT_Lock<PLT_DeviceMap>& GetMediaServersMap() const { return m_MediaServers; }
+ bool IsCached(const char* uuid, const char* object_id);
+
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0030-platinum-implement-GetSortCapabilities-in-media-brow.patch b/lib/libUPnP/patches/0030-platinum-implement-GetSortCapabilities-in-media-brow.patch
new file mode 100644
index 0000000..ed099b9
--- /dev/null
+++ b/lib/libUPnP/patches/0030-platinum-implement-GetSortCapabilities-in-media-brow.patch
@@ -0,0 +1,236 @@
+From bf2fe4c362eaec89257d7649f18af2431dcc544a Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Sat, 8 Feb 2014 15:15:32 +0100
+Subject: [PATCH 07/11] platinum: implement GetSortCapabilities in media
+ browser
+
+---
+ .../Source/Devices/MediaServer/PltMediaBrowser.cpp | 58 ++++++++++++++++++++++
+ .../Source/Devices/MediaServer/PltMediaBrowser.h | 14 ++++++
+ .../Devices/MediaServer/PltSyncMediaBrowser.cpp | 55 ++++++++++++++++++++
+ .../Devices/MediaServer/PltSyncMediaBrowser.h | 7 +++
+ 4 files changed, 134 insertions(+)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
+index 46b6f41..2478441 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
+@@ -332,6 +332,33 @@ PLT_MediaBrowser::GetSearchCapabilities(PLT_DeviceDataReference& device,
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_MediaBrowser::GetSortCapabilities
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_MediaBrowser::GetSortCapabilities(PLT_DeviceDataReference& device,
++ void* userdata)
++{
++ // verify device still in our list
++ PLT_DeviceDataReference device_data;
++ NPT_CHECK_WARNING(FindServer(device->GetUUID(), device_data));
++
++ // create action
++ PLT_ActionReference action;
++ NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction(
++ device,
++ "urn:schemas-upnp-org:service:ContentDirectory:1",
++ "GetSortCapabilities",
++ action));
++
++ // invoke the action
++ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
++ return NPT_ERROR_INVALID_PARAMETERS;
++ }
++
++ return NPT_SUCCESS;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_MediaBrowser::OnActionResponse
+ +---------------------------------------------------------------------*/
+ NPT_Result
+@@ -351,6 +378,8 @@ PLT_MediaBrowser::OnActionResponse(NPT_Result res,
+ return OnSearchResponse(res, device, action, userdata);
+ } else if (actionName.Compare("GetSearchCapabilities", true) == 0) {
+ return OnGetSearchCapabilitiesResponse(res, device, action, userdata);
++ } else if (actionName.Compare("GetSortCapabilities", true) == 0) {
++ return OnGetSortCapabilitiesResponse(res, device, action, userdata);
+ }
+
+ return NPT_SUCCESS;
+@@ -494,6 +523,35 @@ bad_action:
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_MediaBrowser::OnGetSearchCapabilitiesResponse
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_MediaBrowser::OnGetSortCapabilitiesResponse(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ PLT_ActionReference& action,
++ void* userdata)
++{
++ NPT_String value;
++
++ if (!m_Delegate) return NPT_SUCCESS;
++
++ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
++ goto bad_action;
++ }
++
++ if (NPT_FAILED(action->GetArgumentValue("SortCaps", value))) {
++ goto bad_action;
++ }
++
++ m_Delegate->OnGetSortCapabilitiesResult(NPT_SUCCESS, device, value, userdata);
++ return NPT_SUCCESS;
++
++bad_action:
++ m_Delegate->OnGetSortCapabilitiesResult(NPT_FAILURE, device, value, userdata);
++ return NPT_FAILURE;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_MediaBrowser::OnEventNotify
+ +---------------------------------------------------------------------*/
+ NPT_Result
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
+index 023630d..41ed84e 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
+@@ -97,6 +97,12 @@ public:
+ PLT_DeviceDataReference& /*device*/,
+ NPT_String /*searchCapabilities*/,
+ void* /*userdata*/) {}
++
++ virtual void OnGetSortCapabilitiesResult(
++ NPT_Result /*res*/,
++ PLT_DeviceDataReference& /*device*/,
++ NPT_String /*sortCapabilities*/,
++ void* /*userdata*/) {}
+ };
+
+ /*----------------------------------------------------------------------
+@@ -133,6 +139,9 @@ public:
+ virtual NPT_Result GetSearchCapabilities(PLT_DeviceDataReference& device,
+ void* userdata = NULL);
+
++ virtual NPT_Result GetSortCapabilities(PLT_DeviceDataReference& device,
++ void* userdata = NULL);
++
+ // methods
+ virtual const NPT_Lock<PLT_DeviceDataReferenceList>& GetMediaServers() { return m_MediaServers; }
+ virtual NPT_Result FindServer(const char* uuid, PLT_DeviceDataReference& device);
+@@ -160,6 +169,11 @@ protected:
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata);
++
++ virtual NPT_Result OnGetSortCapabilitiesResponse(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ PLT_ActionReference& action,
++ void* userdata);
+
+ protected:
+ PLT_CtrlPointReference m_CtrlPoint;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+index 8ae9f72..27d81fa 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+@@ -191,6 +191,28 @@ PLT_SyncMediaBrowser::OnGetSearchCapabilitiesResult(NPT_Result res
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_SyncMediaBrowser::OnGetSortCapabilitiesResult
+++---------------------------------------------------------------------*/
++void
++PLT_SyncMediaBrowser::OnGetSortCapabilitiesResult(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ NPT_String sortCapabilities,
++ void* userdata)
++{
++ NPT_COMPILER_UNUSED(device);
++
++ if (!userdata) return;
++
++ PLT_CapabilitiesDataReference* data = (PLT_CapabilitiesDataReference*) userdata;
++ (*data)->res = res;
++ if (NPT_SUCCEEDED(res)) {
++ (*data)->capabilities = sortCapabilities;
++ }
++ (*data)->shared_var.SetValue(1);
++ delete data;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_SyncMediaBrowser::OnMSStateVariablesChanged
+ +---------------------------------------------------------------------*/
+ void
+@@ -335,6 +357,39 @@ done:
+ }
+
+ /*----------------------------------------------------------------------
++| PLT_SyncMediaBrowser::GetSortCapabilitiesSync
+++---------------------------------------------------------------------*/
++NPT_Result
++PLT_SyncMediaBrowser::GetSortCapabilitiesSync(PLT_DeviceDataReference& device,
++ NPT_String& sortCapabilities)
++{
++ NPT_Result res;
++
++ PLT_CapabilitiesDataReference capabilities_data(new PLT_CapabilitiesData(), true);
++ capabilities_data->shared_var.SetValue(0);
++
++ // send of the GetSortCapabilities packet. Note that this will
++ // not block. There is a call to WaitForResponse in order
++ // to block until the response comes back.
++ res = PLT_MediaBrowser::GetSortCapabilities(device,
++ new PLT_CapabilitiesDataReference(capabilities_data));
++ NPT_CHECK_SEVERE(res);
++
++ res = WaitForResponse(capabilities_data->shared_var);
++ NPT_CHECK_LABEL_WARNING(res, done);
++
++ if (NPT_FAILED(capabilities_data->res)) {
++ res = capabilities_data->res;
++ NPT_CHECK_LABEL_WARNING(res, done);
++ }
++
++ sortCapabilities = capabilities_data->capabilities;
++
++done:
++ return res;
++}
++
++/*----------------------------------------------------------------------
+ | PLT_SyncMediaBrowser::BrowseSync
+ +---------------------------------------------------------------------*/
+ NPT_Result
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 7054b72..21f1d28 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -115,6 +115,10 @@ public:
+ PLT_DeviceDataReference& device,
+ NPT_String searchCapabilities,
+ void* userdata);
++ virtual void OnGetSortCapabilitiesResult(NPT_Result res,
++ PLT_DeviceDataReference& device,
++ NPT_String sortCapabilities,
++ void* userdata);
+
+ // methods
+ void SetContainerListener(PLT_MediaContainerChangesListener* listener) {
+@@ -137,6 +141,9 @@ public:
+ NPT_Result GetSearchCapabilitiesSync(PLT_DeviceDataReference& device,
+ NPT_String& searchCapabilities);
+
++ NPT_Result GetSortCapabilitiesSync(PLT_DeviceDataReference& device,
++ NPT_String& sortCapabilities);
++
+ const NPT_Lock<PLT_DeviceMap>& GetMediaServersMap() const { return m_MediaServers; }
+ bool IsCached(const char* uuid, const char* object_id);
+
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0031-platinum-only-apply-Xbox-specific-friendlyName-restr.patch b/lib/libUPnP/patches/0031-platinum-only-apply-Xbox-specific-friendlyName-restr.patch
new file mode 100644
index 0000000..d397ee7
--- /dev/null
+++ b/lib/libUPnP/patches/0031-platinum-only-apply-Xbox-specific-friendlyName-restr.patch
@@ -0,0 +1,39 @@
+From 9916c3e60b5924cd36bb4018e3723659cc077e23 Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Sat, 2 Aug 2014 20:57:46 +0200
+Subject: [PATCH] platinum: only apply Xbox specific "friendlyName"
+ restrictions to Xbox clients
+
+---
+ .../Source/Devices/MediaConnect/PltMediaConnect.cpp | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp
+index f948dd1..32503fe 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp
+@@ -117,11 +117,16 @@ PLT_MediaConnect::ProcessGetDescription(NPT_HttpRequest& request,
+
+ PLT_DeviceSignature signature = PLT_HttpHelper::GetDeviceSignature(request);
+
+- // XBox needs to see something behind a ':' to even show it
+- if (m_AddHostname && hostname.GetLength() > 0) {
+- m_FriendlyName += ": " + hostname;
+- } else if (m_FriendlyName.Find(":") == -1) {
+- m_FriendlyName += ": 1";
++ if (signature == PLT_DEVICE_XBOX_360 || signature == PLT_DEVICE_XBOX_ONE /*|| signature == PLT_SONOS*/) {
++ // XBox needs to see something behind a ':' to even show it
++ if (m_AddHostname && hostname.GetLength() > 0) {
++ m_FriendlyName += ": " + hostname;
++ } else if (m_FriendlyName.Find(":") == -1) {
++ m_FriendlyName += ": 1";
++ }
++ }
++ else if (m_AddHostname && hostname.GetLength() > 0) {
++ m_FriendlyName += " (" + hostname + ")";
+ }
+
+ // change some things based on device signature from request
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0032-platinum-improve-logging-on-bad-HTTP-requests.patch b/lib/libUPnP/patches/0032-platinum-improve-logging-on-bad-HTTP-requests.patch
new file mode 100644
index 0000000..d8715c0
--- /dev/null
+++ b/lib/libUPnP/patches/0032-platinum-improve-logging-on-bad-HTTP-requests.patch
@@ -0,0 +1,150 @@
+From bf8934a1f074c14b21359978821957520ed66eb4 Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Thu, 7 Aug 2014 21:28:38 +0200
+Subject: [PATCH] platinum: improve logging on bad HTTP requests
+
+---
+ lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp | 77 ++++++++++++++++++----
+ 1 file changed, 63 insertions(+), 14 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp
+index 4d9524b..6fbe7a7 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp
++++ b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp
+@@ -510,10 +510,10 @@ PLT_DeviceHost::ProcessHttpPostRequest(NPT_HttpRequest& request,
+ #endif
+
+ if (NPT_FAILED(FindServiceByControlURL(url, service, true)))
+- goto bad_request;
++ goto bad_request_find_service;
+
+ if (!request.GetHeaders().GetHeaderValue("SOAPAction"))
+- goto bad_request;
++ goto bad_request_soap_header_value;
+
+ // extract the soap action name from the header
+ soap_action_header = *request.GetHeaders().GetHeaderValue("SOAPAction");
+@@ -522,45 +522,45 @@ PLT_DeviceHost::ProcessHttpPostRequest(NPT_HttpRequest& request,
+
+ components = soap_action_header.Split("#");
+ if (components.GetItemCount() != 2)
+- goto bad_request;
++ goto bad_request_soap_action_header;
+
+ soap_action_name = *components.GetItem(1);
+-
++
+ // read the xml body and parse it
+ if (NPT_FAILED(PLT_HttpHelper::ParseBody(request, xml)))
+- goto bad_request;
++ goto bad_request_body_parse_error;
+
+ // check envelope
+ if (xml->GetTag().Compare("Envelope", true))
+- goto bad_request;
++ goto bad_request_no_envelope;
+
+ #if defined(PLATINUM_UPNP_SPECS_STRICT)
+ // check namespace
+ if (!xml->GetNamespace() || xml->GetNamespace()->Compare("http://schemas.xmlsoap.org/soap/envelope/"))
+- goto bad_request;
++ goto bad_request_upnp_not_strict;
+
+ // check encoding
+ attr = xml->GetAttribute("encodingStyle", "http://schemas.xmlsoap.org/soap/envelope/");
+ if (!attr || attr->Compare("http://schemas.xmlsoap.org/soap/encoding/"))
+- goto bad_request;
++ goto bad_request_bad_encoding;
+ #endif
+
+ // read action
+ soap_body = PLT_XmlHelper::GetChild(xml, "Body");
+ if (soap_body == NULL)
+- goto bad_request;
++ goto bad_request_soap_body;
+
+ PLT_XmlHelper::GetChild(soap_body, soap_action);
+ if (soap_action == NULL)
+- goto bad_request;
++ goto bad_request_soap_action_body;
+
+ // verify action name is identical to SOAPACTION header*/
+ if (soap_action->GetTag().Compare(soap_action_name, true))
+- goto bad_request;
++ goto bad_request_action_mismatch;
+
+ // verify namespace
+ if (!soap_action->GetNamespace() || soap_action->GetNamespace()->Compare(service->GetServiceType()))
+- goto bad_request;
++ goto bad_request_bad_namespace;
+
+ // create a buffer for our response body and call the service
+ if ((action_desc = service->FindActionDesc(soap_action_name)) == NULL) {
+@@ -646,8 +646,58 @@ done:
+ return NPT_SUCCESS;
+
+ bad_request:
+- delete xml;
++ // generic 500 now unused
+ response.SetStatus(500, "Bad Request");
++ goto bad_request_end;
++
++bad_request_find_service:
++ response.SetStatus(500, "Bad Request: Service by URL");
++ goto bad_request_end;
++
++bad_request_soap_header_value:
++ response.SetStatus(500, "Bad Request: SOAP Header");
++ goto bad_request_end;
++
++bad_request_soap_action_header:
++ response.SetStatus(500, "Bad Request: SOAP Action in Header");
++ goto bad_request_end;
++
++bad_request_body_parse_error:
++ response.SetStatus(500, "Bad Request: Error Parsing XML Body");
++ goto bad_request_end;
++
++bad_request_no_envelope:
++ response.SetStatus(500, "Bad Request: SOAP Envelope");
++ goto bad_request_end;
++
++#if defined(PLATINUM_UPNP_SPECS_STRICT)
++bad_request_upnp_not_strict:
++ response.SetStatus(500, "Bad Request: SOAP not Strict");
++ goto bad_request_end;
++
++bad_request_bad_encoding:
++ response.SetStatus(500, "Bad Request: SOAP Encoding");
++ goto bad_request_end;
++#endif
++
++bad_request_soap_body:
++ response.SetStatus(500, "Bad Request: SOAP Body");
++ goto bad_request_end;
++
++bad_request_soap_action_body:
++ response.SetStatus(500, "Bad Request: SOAP Action in Body");
++ goto bad_request_end;
++
++bad_request_action_mismatch:
++ response.SetStatus(500, "Bad Request: SOAP Action Mismatch");
++ goto bad_request_end;
++
++bad_request_bad_namespace:
++ response.SetStatus(500, "Bad Request: Bad Namespace");
++ goto bad_request_end;
++
++bad_request_end:
++ delete xml;
+ return NPT_SUCCESS;
+ }
+
+@@ -901,4 +951,3 @@ PLT_DeviceHost::OnAction(PLT_ActionReference& action,
+ action->SetError(401, "Invalid Action");
+ return NPT_FAILURE;
+ }
+-
+--
+1.7.11.msysgit.0
+
diff --git a/lib/libUPnP/patches/0033-platinum-fix-filter-mask-values-of-xbmc-votes-and-xb.patch b/lib/libUPnP/patches/0033-platinum-fix-filter-mask-values-of-xbmc-votes-and-xb.patch
new file mode 100644
index 0000000..072914b
--- /dev/null
+++ b/lib/libUPnP/patches/0033-platinum-fix-filter-mask-values-of-xbmc-votes-and-xb.patch
@@ -0,0 +1,28 @@
+From 210409361c07945de187be139519ff98d81919ee Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Sat, 29 Nov 2014 19:47:45 +0100
+Subject: [PATCH] platinum: fix filter mask values of xbmc:votes and
+ xbmc:artwork
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index 0f7c892..9e87599 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -97,8 +97,8 @@
+
+ #define PLT_FILTER_MASK_XBMC_DATEADDED NPT_UINT64_C(0x0000100000000000)
+ #define PLT_FILTER_MASK_XBMC_RATING NPT_UINT64_C(0x0000200000000000)
+-#define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000300000000000)
+-#define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000400000000000)
++#define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000400000000000)
++#define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000)
+
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+--
+1.9.4.msysgit.2
+
diff --git a/lib/libUPnP/patches/0034-platinum-add-xbmc-uniqueidentifier-for-IMDB-TVDB-ide.patch b/lib/libUPnP/patches/0034-platinum-add-xbmc-uniqueidentifier-for-IMDB-TVDB-ide.patch
new file mode 100644
index 0000000..3145924
--- /dev/null
+++ b/lib/libUPnP/patches/0034-platinum-add-xbmc-uniqueidentifier-for-IMDB-TVDB-ide.patch
@@ -0,0 +1,109 @@
+From 03a57931ab47724558d3ed8762a2c978cf056501 Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Sat, 29 Nov 2014 19:58:33 +0100
+Subject: [PATCH] platinum: add xbmc:uniqueidentifier for IMDB/TVDB identifiers
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp | 2 ++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 2 ++
+ .../Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 10 ++++++++++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h | 1 +
+ .../Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ 5 files changed, 16 insertions(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index 2bb6a04..7b853c8 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -170,6 +170,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_XBMC_VOTES;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_ARTWORK, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_ARTWORK;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER;
+ }
+
+ if (next_comma < 0) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index 0f7c892..a5015db 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -99,6 +99,7 @@
+ #define PLT_FILTER_MASK_XBMC_RATING NPT_UINT64_C(0x0000200000000000)
+ #define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000400000000000)
+ #define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000)
++#define PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER NPT_UINT64_C(0x0001000000000000)
+
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+@@ -148,6 +149,7 @@
+ #define PLT_FILTER_FIELD_XBMC_RATING "xbmc:rating"
+ #define PLT_FILTER_FIELD_XBMC_VOTES "xbmc:votes"
+ #define PLT_FILTER_FIELD_XBMC_ARTWORK "xbmc:artwork"
++#define PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER "xbmc:uniqueidentifier"
+
+ extern const char* didl_header;
+ extern const char* didl_footer;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 0c6830f..f8ddd85 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -260,6 +260,7 @@ PLT_MediaObject::Reset()
+ m_XbmcInfo.rating = 0.0f;
+ m_XbmcInfo.votes = "";
+ m_XbmcInfo.artwork.Clear();
++ m_XbmcInfo.unique_identifier = "";
+
+ m_Didl = "";
+
+@@ -559,6 +560,13 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ m_XbmcInfo.artwork.ToDidl(didl, "artwork");
+ }
+
++ // xbmc unique identifier
++ if (mask & PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER && !m_XbmcInfo.unique_identifier.IsEmpty()) {
++ didl += "<xbmc:uniqueidentifier>";
++ PLT_Didl::AppendXmlEscape(didl, m_XbmcInfo.unique_identifier);
++ didl += "</xbmc:uniqueidentifier>";
++ }
++
+ // class is required
+ didl += "<upnp:class";
+ if (!m_ObjectClass.friendly_name.IsEmpty()) {
+@@ -781,6 +789,8 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ PLT_XmlHelper::GetChildren(entry, children, "artwork", didl_namespace_xbmc);
+ m_XbmcInfo.artwork.FromDidl(children);
+
++ PLT_XmlHelper::GetChildText(entry, "uniqueidentifier", m_XbmcInfo.unique_identifier, didl_namespace_xbmc, 256);
++
+ // re serialize the entry didl as a we might need to pass it to a renderer
+ // we may have modified the tree to "fix" issues, so as not to break a renderer
+ // (don't write xml prefix as this didl could be part of a larger document)
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 18a094f..dd7f8ae 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -169,6 +169,7 @@ typedef struct {
+ NPT_Float rating;
+ NPT_String votes;
+ PLT_Artworks artwork;
++ NPT_String unique_identifier;
+ } PLT_XbmcInfo;
+
+ /*----------------------------------------------------------------------
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 21f1d28..8fb23dd 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -70,7 +70,7 @@ typedef struct PLT_CapabilitiesData {
+ typedef NPT_Reference<PLT_CapabilitiesData> PLT_CapabilitiesDataReference;
+
+ // explicitely specify res otherwise WMP won't return a URL!
+-#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork"
++#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier"
+
+ /*----------------------------------------------------------------------
+ | PLT_MediaContainerListener
+--
+1.9.4.msysgit.2
+
diff --git a/lib/libUPnP/patches/0035-platinum-Changes-to-external-subtitles-over-UPnP-wor.patch b/lib/libUPnP/patches/0035-platinum-Changes-to-external-subtitles-over-UPnP-wor.patch
new file mode 100644
index 0000000..880b331
--- /dev/null
+++ b/lib/libUPnP/patches/0035-platinum-Changes-to-external-subtitles-over-UPnP-wor.patch
@@ -0,0 +1,122 @@
+From ec171eae6aad8bbf51fdf52c97446db6418c96a1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Chwia=C5=82a?= <rchwiala@gmail.com>
+Date: Sat, 17 Jan 2015 15:55:52 +0100
+Subject: [PATCH] platinum Changes to external subtitles over UPnP works
+
+Added custom data to resources field - needed to add some attributes to res.
+Added new struct PLK_SecResource - needed by Somasung devices. It's not specialized struct (just general one), because I can't find any "sec" specification.
+---
+ .../Source/Devices/MediaServer/PltDidl.cpp | 1 +
+ .../Source/Devices/MediaServer/PltMediaItem.cpp | 41 +++++++++++++++++++++-
+ .../Source/Devices/MediaServer/PltMediaItem.h | 12 +++++++
+ 3 files changed, 53 insertions(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index 7b853c8..b58aa50 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -48,6 +48,7 @@ const char* didl_header = "<DIDL-Lite xmlns=\"urn:schemas-upnp-org:metad
+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\""
+ " xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\""
+ " xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\""
++ " xmlns:sec=\"http://www.sec.co.kr/\""
+ " xmlns:xbmc=\"urn:schemas-xbmc-org:metadata-1-0/\">";
+ const char* didl_footer = "</DIDL-Lite>";
+ const char* didl_namespace_dc = "http://purl.org/dc/elements/1.1/";
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 4db2d45..f937df2 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -528,12 +528,51 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+
+ didl += " protocolInfo=\"";
+ PLT_Didl::AppendXmlEscape(didl, m_Resources[i].m_ProtocolInfo.ToString());
+- didl += "\">";
++ didl += "\"";
++ /* adding custom data */
++ NPT_List<NPT_Map<NPT_String, NPT_String>::Entry*>::Iterator entry = m_Resources[i].m_CustomData.GetEntries().GetFirstItem();
++ while (entry)
++ {
++ didl += " ";
++ PLT_Didl::AppendXmlEscape(didl, (*entry)->GetKey());
++ didl += "=\"";
++ PLT_Didl::AppendXmlEscape(didl, (*entry)->GetValue());
++ didl += "\"";
++
++ entry++;
++ }
++
++ didl += ">";
+ PLT_Didl::AppendXmlEscape(didl, m_Resources[i].m_Uri);
+ didl += "</res>";
+ }
+ }
+
++ //sec resources related
++ for (NPT_Cardinal i = 0; i < m_SecResources.GetItemCount(); i++) {
++ didl += "<sec:";
++ PLT_Didl::AppendXmlEscape(didl, m_SecResources[i].name);
++
++ NPT_List<NPT_Map<NPT_String, NPT_String>::Entry*>::Iterator entry = m_SecResources[i].attributes.GetEntries().GetFirstItem();
++ while (entry)
++ {
++ didl += " sec:";
++ PLT_Didl::AppendXmlEscape(didl, (*entry)->GetKey());
++ didl += "=\"";
++ PLT_Didl::AppendXmlEscape(didl, (*entry)->GetValue());
++ didl += "\"";
++
++ entry++;
++ }
++
++ didl += ">";
++ PLT_Didl::AppendXmlEscape(didl, m_SecResources[i].value);
++
++ didl += "</sec:";
++ PLT_Didl::AppendXmlEscape(didl, m_SecResources[i].name);
++ didl += ">";
++ }
++
+ // xbmc dateadded
+ if ((mask & PLT_FILTER_MASK_XBMC_DATEADDED) && !m_XbmcInfo.date_added.IsEmpty()) {
+ didl += "<xbmc:dateadded>";
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index deb4961..6461b81 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -172,6 +172,12 @@ typedef struct {
+ NPT_String unique_identifier;
+ } PLT_XbmcInfo;
+
++typedef struct {
++ NPT_String name;
++ NPT_Map<NPT_String, NPT_String> attributes;
++ NPT_String value;
++} PLT_SecResource;
++
+ /*----------------------------------------------------------------------
+ | PLT_MediaItemResource
+ +---------------------------------------------------------------------*/
+@@ -192,6 +198,9 @@ public:
+ NPT_UInt32 m_NbAudioChannels;
+ NPT_String m_Resolution;
+ NPT_UInt32 m_ColorDepth;
++ /* to add custom data to resource, that are not standard one, or are only
++ proper for some type of devices (UPnP)*/
++ NPT_Map<NPT_String, NPT_String> m_CustomData;
+ };
+
+ /*----------------------------------------------------------------------
+@@ -250,6 +259,9 @@ public:
+ /* resources related */
+ NPT_Array<PLT_MediaItemResource> m_Resources;
+
++ /* sec resources related */
++ NPT_Array<PLT_SecResource> m_SecResources;
++
+ /* XBMC specific */
+ PLT_XbmcInfo m_XbmcInfo;
+
+--
+1.8.3.msysgit.0
+
diff --git a/lib/libUPnP/patches/0036-platinum-add-xbmc-country-for-countries.patch b/lib/libUPnP/patches/0036-platinum-add-xbmc-country-for-countries.patch
new file mode 100644
index 0000000..2f1a4b7
--- /dev/null
+++ b/lib/libUPnP/patches/0036-platinum-add-xbmc-country-for-countries.patch
@@ -0,0 +1,103 @@
+From 2f0e4019673a92b3c1e01fd2447bd05e7b231423 Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Sun, 8 Mar 2015 23:49:24 +0100
+Subject: [PATCH 1/3] platinum: add xbmc:country for countries
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp | 2 ++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 2 ++
+ .../Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 11 +++++++++++
+ .../Platinum/Source/Devices/MediaServer/PltMediaItem.h | 1 +
+ .../Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ 5 files changed, 17 insertions(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index b58aa50..0f24ab3 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -173,6 +173,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_XBMC_ARTWORK;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER;
++ } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_COUNTRY, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_XBMC_COUNTRY;
+ }
+
+ if (next_comma < 0) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index fe1de45..49b92d0 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -100,6 +100,7 @@
+ #define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000400000000000)
+ #define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000)
+ #define PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER NPT_UINT64_C(0x0001000000000000)
++#define PLT_FILTER_MASK_XBMC_COUNTRY NPT_UINT64_C(0x0002000000000000)
+
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+@@ -150,6 +151,7 @@
+ #define PLT_FILTER_FIELD_XBMC_VOTES "xbmc:votes"
+ #define PLT_FILTER_FIELD_XBMC_ARTWORK "xbmc:artwork"
+ #define PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER "xbmc:uniqueidentifier"
++#define PLT_FILTER_FIELD_XBMC_COUNTRY "xbmc:country"
+
+ extern const char* didl_header;
+ extern const char* didl_footer;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index f937df2..2e7d32b 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -261,6 +261,7 @@ PLT_MediaObject::Reset()
+ m_XbmcInfo.votes = "";
+ m_XbmcInfo.artwork.Clear();
+ m_XbmcInfo.unique_identifier = "";
++ m_XbmcInfo.countries.Clear();
+
+ m_Didl = "";
+
+@@ -606,6 +607,16 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ didl += "</xbmc:uniqueidentifier>";
+ }
+
++ // country
++ if (mask & PLT_FILTER_MASK_XBMC_COUNTRY) {
++ for (NPT_List<NPT_String>::Iterator it =
++ m_XbmcInfo.countries.GetFirstItem(); it; ++it) {
++ didl += "<xbmc:country>";
++ PLT_Didl::AppendXmlEscape(didl, (*it));
++ didl += "</xbmc:country>";
++ }
++ }
++
+ // class is required
+ didl += "<upnp:class";
+ if (!m_ObjectClass.friendly_name.IsEmpty()) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 6461b81..0efd505 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -170,6 +170,7 @@ typedef struct {
+ NPT_String votes;
+ PLT_Artworks artwork;
+ NPT_String unique_identifier;
++ NPT_List<NPT_String> countries;
+ } PLT_XbmcInfo;
+
+ typedef struct {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 8fb23dd..9b25d58 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -70,7 +70,7 @@ typedef struct PLT_CapabilitiesData {
+ typedef NPT_Reference<PLT_CapabilitiesData> PLT_CapabilitiesDataReference;
+
+ // explicitely specify res otherwise WMP won't return a URL!
+-#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier"
++#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country"
+
+ /*----------------------------------------------------------------------
+ | PLT_MediaContainerListener
+--
+1.9.5.msysgit.0
+
diff --git a/lib/libUPnP/patches/0037-platinum-add-xbmc-userrating-for-user-ratings.patch b/lib/libUPnP/patches/0037-platinum-add-xbmc-userrating-for-user-ratings.patch
new file mode 100644
index 0000000..e969b2d
--- /dev/null
+++ b/lib/libUPnP/patches/0037-platinum-add-xbmc-userrating-for-user-ratings.patch
@@ -0,0 +1,100 @@
+From 6a10f12a22b3210beb18d09b11315cdd87a8c6eb Mon Sep 17 00:00:00 2001
+From: montellese <montellese@xbmc.org>
+Date: Mon, 14 Sep 2015 08:40:15 +0200
+Subject: [PATCH 1/3] platinum: add xbmc:userrating for user ratings
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp | 2 ++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 2 ++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 8 ++++++++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h | 1 +
+ .../Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ 5 files changed, 14 insertions(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index 0f24ab3..b1ba66f 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -175,6 +175,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER;
+ } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_COUNTRY, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_COUNTRY;
++ } else if (NPT_String::CompareN(s + i, PLT_FILTER_FIELD_XBMC_USERRATING, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_XBMC_USERRATING;
+ }
+
+ if (next_comma < 0) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index 49b92d0..1705f9c 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -101,6 +101,7 @@
+ #define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000)
+ #define PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER NPT_UINT64_C(0x0001000000000000)
+ #define PLT_FILTER_MASK_XBMC_COUNTRY NPT_UINT64_C(0x0002000000000000)
++#define PLT_FILTER_MASK_XBMC_USERRATING NPT_UINT64_C(0x0004000000000000)
+
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+@@ -152,6 +153,7 @@
+ #define PLT_FILTER_FIELD_XBMC_ARTWORK "xbmc:artwork"
+ #define PLT_FILTER_FIELD_XBMC_UNIQUE_IDENTIFIER "xbmc:uniqueidentifier"
+ #define PLT_FILTER_FIELD_XBMC_COUNTRY "xbmc:country"
++#define PLT_FILTER_FIELD_XBMC_USERRATING "xbmc:userrating"
+
+ extern const char* didl_header;
+ extern const char* didl_footer;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 2e7d32b..01ef6e9 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -262,6 +262,7 @@ PLT_MediaObject::Reset()
+ m_XbmcInfo.artwork.Clear();
+ m_XbmcInfo.unique_identifier = "";
+ m_XbmcInfo.countries.Clear();
++ m_XbmcInfo.user_rating = 0;
+
+ m_Didl = "";
+
+@@ -617,6 +618,13 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ }
+ }
+
++ // user rating
++ if (mask & PLT_FILTER_MASK_XBMC_USERRATING) {
++ didl += "<xbmc:userrating>";
++ didl += NPT_String::FromInteger(m_XbmcInfo.user_rating);
++ didl += "</xbmc:userrating>";
++ }
++
+ // class is required
+ didl += "<upnp:class";
+ if (!m_ObjectClass.friendly_name.IsEmpty()) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 0efd505..98d47d8 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -171,6 +171,7 @@ typedef struct {
+ PLT_Artworks artwork;
+ NPT_String unique_identifier;
+ NPT_List<NPT_String> countries;
++ NPT_Int32 user_rating;
+ } PLT_XbmcInfo;
+
+ typedef struct {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 9b25d58..e52fb5a 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -70,7 +70,7 @@ typedef struct PLT_CapabilitiesData {
+ typedef NPT_Reference<PLT_CapabilitiesData> PLT_CapabilitiesDataReference;
+
+ // explicitely specify res otherwise WMP won't return a URL!
+-#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country"
++#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country,xbmc:userrating"
+
+ /*----------------------------------------------------------------------
+ | PLT_MediaContainerListener
+--
+1.9.5.msysgit.0
+
diff --git a/lib/libUPnP/patches/0038-platinum-add-support-for-multiple-ratings.patch b/lib/libUPnP/patches/0038-platinum-add-support-for-multiple-ratings.patch
new file mode 100644
index 0000000..d927ed1
--- /dev/null
+++ b/lib/libUPnP/patches/0038-platinum-add-support-for-multiple-ratings.patch
@@ -0,0 +1,63 @@
+From 77ba91ac8815c150c7e4537a3622df52bd811cef Mon Sep 17 00:00:00 2001
+From: phate89 <phates89@gmail.com>
+Date: Sat, 26 Sep 2015 11:16:57 +0200
+Subject: [PATCH] platinum: add support for multiple ratings
+
+---
+ .../Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 11 +++++++----
+ .../Platinum/Source/Devices/MediaServer/PltMediaItem.h | 2 +-
+ 2 files changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 01ef6e9..96839e4 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -258,7 +258,7 @@ PLT_MediaObject::Reset()
+
+ m_XbmcInfo.date_added = "";
+ m_XbmcInfo.rating = 0.0f;
+- m_XbmcInfo.votes = "";
++ m_XbmcInfo.votes = 0;
+ m_XbmcInfo.artwork.Clear();
+ m_XbmcInfo.unique_identifier = "";
+ m_XbmcInfo.countries.Clear();
+@@ -590,9 +590,9 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ }
+
+ // xbmc votes
+- if (mask & PLT_FILTER_MASK_XBMC_VOTES && !m_XbmcInfo.votes.IsEmpty()) {
++ if (mask & PLT_FILTER_MASK_XBMC_VOTES && m_XbmcInfo.votes != 0) {
+ didl += "<xbmc:votes>";
+- PLT_Didl::AppendXmlEscape(didl, m_XbmcInfo.votes);
++ didl += NPT_String::Format("%i", m_XbmcInfo.votes);
+ didl += "</xbmc:votes>";
+ }
+
+@@ -841,7 +841,10 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ if (NPT_FAILED(str.ToFloat(floatValue))) floatValue = 0.0;
+ m_XbmcInfo.rating = floatValue;
+
+- PLT_XmlHelper::GetChildText(entry, "votes", m_XbmcInfo.votes, didl_namespace_xbmc, 256);
++ PLT_XmlHelper::GetChildText(entry, "votes", str, didl_namespace_xbmc, 256);
++ NPT_Int32 intValue;
++ if (NPT_FAILED(str.ToInteger(intValue))) intValue = 0;
++ m_XbmcInfo.votes = intValue;
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "artwork", didl_namespace_xbmc);
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 98d47d8..5712b9a 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -167,7 +167,7 @@ public:
+ typedef struct {
+ NPT_String date_added;
+ NPT_Float rating;
+- NPT_String votes;
++ NPT_Int32 votes;
+ PLT_Artworks artwork;
+ NPT_String unique_identifier;
+ NPT_List<NPT_String> countries;
+--
+2.5.3.windows.1
+
diff --git a/lib/libUPnP/patches/0039-platinum-fix-potential-crash-in-parsetaglist.patch b/lib/libUPnP/patches/0039-platinum-fix-potential-crash-in-parsetaglist.patch
new file mode 100644
index 0000000..0375c67
--- /dev/null
+++ b/lib/libUPnP/patches/0039-platinum-fix-potential-crash-in-parsetaglist.patch
@@ -0,0 +1,26 @@
+From f034d17ddfefac6a182511f1401d248beb45b280 Mon Sep 17 00:00:00 2001
+From: phate89 <phates89@gmail.com>
+Date: Mon, 12 Dec 2016 17:37:44 +0100
+Subject: [PATCH 1/1] platinum: fix potential crash in parsetaglist
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+index 6ecec0f..0a43dab 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+@@ -400,7 +400,8 @@ PLT_MediaServer::ParseTagList(const NPT_String& updates, NPT_Map<NPT_String,NPT_
+ for (NPT_List<NPT_XmlNode*>::Iterator children = didl_partial->GetChildren().GetFirstItem(); children; children++) {
+ NPT_XmlElementNode* child = (*children)->AsElementNode();
+ if (!child) continue;
+- tags[child->GetTag()] = *child->GetText();
++ const NPT_String *txt = child->GetText();
++ tags[child->GetTag()] = txt ? *txt : "";
+ }
+
+ return NPT_SUCCESS;
+--
+2.10.2.windows.1
+
diff --git a/lib/libUPnP/patches/0040-platinum-add-resume-playerstate.patch b/lib/libUPnP/patches/0040-platinum-add-resume-playerstate.patch
new file mode 100644
index 0000000..2b33877
--- /dev/null
+++ b/lib/libUPnP/patches/0040-platinum-add-resume-playerstate.patch
@@ -0,0 +1,107 @@
+From 12839cbecd96ac0980e7a75a6e1e841688514b18 Mon Sep 17 00:00:00 2001
+From: phate89 <phates89@gmail.com>
+Date: Mon, 12 Dec 2016 17:40:10 +0100
+Subject: [PATCH 1/1] platinum: add resume playerstate
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp | 2 ++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 2 ++
+ .../Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 10 ++++++++++
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h | 1 +
+ .../Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h | 2 +-
+ xbmc/network/upnp/UPnP.cpp | 7 ++++++-
+ 6 files changed, 22 insertions(+), 2 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+index b1ba66f..37d36dd 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.cpp
+@@ -163,6 +163,8 @@ PLT_Didl::ConvertFilterToMask(const NPT_String& filter)
+ mask |= PLT_FILTER_MASK_EPISODE_COUNT;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_EPISODE_SEASON, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_EPISODE_SEASON;
++ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_LASTPLAYERSTATE, len, true) == 0) {
++ mask |= PLT_FILTER_MASK_XBMC_LASTPLAYERSTATE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_DATEADDED, len, true) == 0) {
+ mask |= PLT_FILTER_MASK_XBMC_DATEADDED;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_XBMC_RATING, len, true) == 0) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+index 1705f9c..b74ed0f 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h
+@@ -102,6 +102,7 @@
+ #define PLT_FILTER_MASK_XBMC_UNIQUE_IDENTIFIER NPT_UINT64_C(0x0001000000000000)
+ #define PLT_FILTER_MASK_XBMC_COUNTRY NPT_UINT64_C(0x0002000000000000)
+ #define PLT_FILTER_MASK_XBMC_USERRATING NPT_UINT64_C(0x0004000000000000)
++#define PLT_FILTER_MASK_XBMC_LASTPLAYERSTATE NPT_UINT64_C(0x0008000000000000)
+
+ #define PLT_FILTER_FIELD_TITLE "dc:title"
+ #define PLT_FILTER_FIELD_CREATOR "dc:creator"
+@@ -147,6 +148,7 @@
+ #define PLT_FILTER_FIELD_EPISODE_COUNT "upnp:episodeCount"
+ #define PLT_FILTER_FIELD_EPISODE_SEASON "upnp:episodeSeason"
+
++#define PLT_FILTER_FIELD_XBMC_LASTPLAYERSTATE "xbmc:lastPlayerState"
+ #define PLT_FILTER_FIELD_XBMC_DATEADDED "xbmc:dateadded"
+ #define PLT_FILTER_FIELD_XBMC_RATING "xbmc:rating"
+ #define PLT_FILTER_FIELD_XBMC_VOTES "xbmc:votes"
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 96839e4..5324dcb 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -256,6 +256,7 @@ PLT_MediaObject::Reset()
+
+ m_Resources.Clear();
+
++ m_XbmcInfo.last_playerstate = "";
+ m_XbmcInfo.date_added = "";
+ m_XbmcInfo.rating = 0.0f;
+ m_XbmcInfo.votes = 0;
+@@ -625,6 +626,13 @@ PLT_MediaObject::ToDidl(NPT_UInt64 mask, NPT_String& didl)
+ didl += "</xbmc:userrating>";
+ }
+
++ // xbmc last playback state
++ if (mask & PLT_FILTER_MASK_XBMC_LASTPLAYERSTATE && !m_XbmcInfo.last_playerstate.IsEmpty()) {
++ didl += "<xbmc:lastPlayerState>";
++ PLT_Didl::AppendXmlEscape(didl, m_XbmcInfo.last_playerstate);
++ didl += "</xbmc:lastPlayerState>";
++ }
++
+ // class is required
+ didl += "<upnp:class";
+ if (!m_ObjectClass.friendly_name.IsEmpty()) {
+@@ -825,6 +833,8 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ m_Resources.Add(resource);
+ }
+
++ PLT_XmlHelper::GetChildText(entry, "lastPlayerState", m_XbmcInfo.last_playerstate, didl_namespace_xbmc, 2048);
++
+ PLT_XmlHelper::GetChildText(entry, "dateadded", m_XbmcInfo.date_added, didl_namespace_xbmc, 256);
+ // parse date and make sure it's valid
+ for (int format=0; format<=NPT_DateTime::FORMAT_RFC_1036; format++) {
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 5712b9a..6502297 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -165,6 +165,7 @@ public:
+ };
+
+ typedef struct {
++ NPT_String last_playerstate;
+ NPT_String date_added;
+ NPT_Float rating;
+ NPT_Int32 votes;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index e52fb5a..1493a50 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -70,7 +70,7 @@ typedef struct PLT_CapabilitiesData {
+ typedef NPT_Reference<PLT_CapabilitiesData> PLT_CapabilitiesDataReference;
+
+ // explicitely specify res otherwise WMP won't return a URL!
+-#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country,xbmc:userrating"
++#define PLT_DEFAULT_FILTER "dc:date,dc:description,upnp:longDescription,upnp:genre,res,res@duration,res@size,upnp:albumArtURI,upnp:rating,upnp:lastPlaybackPosition,upnp:lastPlaybackTime,upnp:playbackCount,upnp:originalTrackNumber,upnp:episodeNumber,upnp:programTitle,upnp:seriesTitle,upnp:album,upnp:artist,upnp:author,upnp:director,dc:publisher,searchable,childCount,dc:title,dc:creator,upnp:actor,res@resolution,upnp:episodeCount,upnp:episodeSeason,xbmc:lastPlayerState,xbmc:dateadded,xbmc:rating,xbmc:votes,xbmc:artwork,xbmc:uniqueidentifier,xbmc:country,xbmc:userrating"
+
+ /*----------------------------------------------------------------------
+ | PLT_MediaContainerListener
diff --git a/lib/libUPnP/patches/0042-platinum-switch-build-to-unicode.patch b/lib/libUPnP/patches/0042-platinum-switch-build-to-unicode.patch
new file mode 100644
index 0000000..da43756
--- /dev/null
+++ b/lib/libUPnP/patches/0042-platinum-switch-build-to-unicode.patch
@@ -0,0 +1,85 @@
+diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Console.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Console.cpp
+index 59ac92e..e897f8a 100644
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Console.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Console.cpp
+@@ -15,6 +15,7 @@
+
+ #include "NptConfig.h"
+ #include "NptConsole.h"
++#include "NptDebug.h"
+
+ /*----------------------------------------------------------------------
+ | NPT_Console::Output
+@@ -22,7 +23,7 @@
+ void
+ NPT_Console::Output(const char* message)
+ {
+- OutputDebugString(message);
++ NPT_DebugOutput(message);
+ printf("%s", message);
+ }
+
+diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Debug.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Debug.cpp
+index c5b157d..5d9372a 100644
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Debug.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Debug.cpp
+@@ -11,16 +11,13 @@
+ | includes
+ +---------------------------------------------------------------------*/
+ #include <stdio.h>
+-#if defined(_XBOX)
+-#include <xtl.h>
+-#else
+ #include <windows.h>
+-#endif
+
+ #include "NptConfig.h"
+ #include "NptDefs.h"
+ #include "NptTypes.h"
+ #include "NptDebug.h"
++#include <memory>
+
+ /*----------------------------------------------------------------------
+ | NPT_DebugOutput
+@@ -28,9 +25,16 @@
+ void
+ NPT_DebugOutput(const char* message)
+ {
+-#if !defined(_WIN32_WCE)
+- OutputDebugString(message);
+-#endif
+- printf("%s", message);
++ int result = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, message, -1, nullptr, 0);
++ if (result == 0)
++ return;
++
++ auto newStr = std::make_unique<wchar_t[]>(result + 1);
++ result = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, message, result, newStr.get(), result);
++
++ if (result == 0)
++ return;
++
++ OutputDebugString(newStr.get());
+ }
+
+diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp
+index 8edd0ff..9428648 100644
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp
+@@ -207,6 +207,8 @@ NPT_Win32SerialPort::Open(unsigned int speed,
+ NPT_SerialPortFlowControl flow_control,
+ NPT_SerialPortParity parity)
+ {
++ return NPT_FAILURE; // We don't need serial port suppurt
++#if 0
+ // check if we're already open
+ if (!m_HandleReference.IsNull()) {
+ return NPT_ERROR_SERIAL_PORT_ALREADY_OPEN;
+@@ -278,6 +280,7 @@ NPT_Win32SerialPort::Open(unsigned int speed,
+ m_HandleReference = new NPT_Win32HandleWrapper(handle);
+
+ return NPT_SUCCESS;
++#endif
+ }
+
+ /*----------------------------------------------------------------------
diff --git a/lib/libUPnP/patches/0043-platinum-Fix-upnp-lastPlaybackPosition-parsing.patch b/lib/libUPnP/patches/0043-platinum-Fix-upnp-lastPlaybackPosition-parsing.patch
new file mode 100644
index 0000000..656c416
--- /dev/null
+++ b/lib/libUPnP/patches/0043-platinum-Fix-upnp-lastPlaybackPosition-parsing.patch
@@ -0,0 +1,32 @@
+From f65143c87c8d35e26b0876e9789c47b2dddaaf12 Mon Sep 17 00:00:00 2001
+From: Justin Maggard <jmaggard@netgear.com>
+Date: Wed, 17 May 2017 14:11:44 -0700
+Subject: [PATCH] platinum: Fix upnp:lastPlaybackPosition parsing
+
+According to the UPnP spec, upnp:lastPlaybackPosition should use the
+same format as duration (HH:MM:SS). So we should at least accept the
+proper format if it exists, and fall back to the raw integer value if
+it's not in the proper format.
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+index 5324dcb0e4..fac16902f7 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+@@ -762,7 +762,10 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+ m_MiscInfo.original_track_number = value;
+
+ PLT_XmlHelper::GetChildText(entry, "lastPlaybackPosition", str, didl_namespace_upnp);
+- if (NPT_FAILED(str.ToInteger(value))) value = 0;
++ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(str, value))) {
++ // fall back to raw integer parsing
++ if (NPT_FAILED(str.ToInteger(value))) value = 0;
++ }
+ m_MiscInfo.last_position = value;
+
+ PLT_XmlHelper::GetChildText(entry, "lastPlaybackTime", m_MiscInfo.last_time, didl_namespace_upnp, 256);
+--
+2.13.0
+
diff --git a/lib/libUPnP/patches/0044-platinum-Prefer-override-usage.patch b/lib/libUPnP/patches/0044-platinum-Prefer-override-usage.patch
new file mode 100644
index 0000000..b1ff8e3
--- /dev/null
+++ b/lib/libUPnP/patches/0044-platinum-Prefer-override-usage.patch
@@ -0,0 +1,2307 @@
+From 0133a1fb26d860df1fcb9b0cb0eea1f9797acb3e Mon Sep 17 00:00:00 2001
+From: "h.udo" <hudokkow@gmail.com>
+Date: Tue, 27 Jun 2017 11:41:35 +0100
+Subject: [PATCH] [modernize][libUPnP] Prefer 'override' usage
+
+---
+ .../Neptune/Source/Core/NptAutoreleasePool.h | 2 +-
+ .../Neptune/Source/Core/NptBufferedStreams.h | 12 ++--
+ .../Neptune/Source/Core/NptDynamicLibraries.h | 6 +-
+ lib/libUPnP/Neptune/Source/Core/NptFile.h | 10 +--
+ lib/libUPnP/Neptune/Source/Core/NptHttp.cpp | 16 ++---
+ lib/libUPnP/Neptune/Source/Core/NptHttp.h | 56 ++++++++--------
+ lib/libUPnP/Neptune/Source/Core/NptLogging.cpp | 12 ++--
+ lib/libUPnP/Neptune/Source/Core/NptLogging.h | 8 +--
+ lib/libUPnP/Neptune/Source/Core/NptMessaging.h | 8 +--
+ .../Source/Core/NptSelectableMessageQueue.h | 8 +--
+ lib/libUPnP/Neptune/Source/Core/NptSerialPort.h | 10 +--
+ .../Neptune/Source/Core/NptSimpleMessageQueue.h | 8 +--
+ lib/libUPnP/Neptune/Source/Core/NptSockets.h | 44 ++++++-------
+ lib/libUPnP/Neptune/Source/Core/NptStreams.h | 54 ++++++++--------
+ lib/libUPnP/Neptune/Source/Core/NptThreads.h | 42 ++++++------
+ lib/libUPnP/Neptune/Source/Core/NptTls.cpp | 4 +-
+ lib/libUPnP/Neptune/Source/Core/NptTls.h | 8 +--
+ lib/libUPnP/Neptune/Source/Core/NptXml.h | 12 ++--
+ lib/libUPnP/Neptune/Source/Core/NptZip.h | 28 ++++----
+ .../Neptune/Source/System/Bsd/NptBsdSockets.cpp | 74 +++++++++++-----------
+ .../Neptune/Source/System/Posix/NptPosixQueue.cpp | 8 +--
+ .../Source/System/Posix/NptPosixThreads.cpp | 40 ++++++------
+ lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h | 14 ++--
+ .../Platinum/Source/Core/PltCtrlPointTask.h | 24 +++----
+ .../Platinum/Source/Core/PltDatagramStream.h | 24 +++----
+ lib/libUPnP/Platinum/Source/Core/PltDeviceHost.h | 10 +--
+ lib/libUPnP/Platinum/Source/Core/PltHttp.h | 4 +-
+ .../Platinum/Source/Core/PltHttpClientTask.h | 10 +--
+ lib/libUPnP/Platinum/Source/Core/PltHttpServer.h | 6 +-
+ .../Platinum/Source/Core/PltHttpServerTask.h | 16 ++---
+ lib/libUPnP/Platinum/Source/Core/PltService.h | 2 +-
+ lib/libUPnP/Platinum/Source/Core/PltSsdp.h | 24 +++----
+ lib/libUPnP/Platinum/Source/Core/PltThreadTask.h | 4 +-
+ .../Source/Devices/MediaConnect/PltMediaConnect.h | 24 +++----
+ .../Source/Devices/MediaConnect/PltXbox360.h | 12 ++--
+ .../Devices/MediaRenderer/PltMediaController.h | 10 +--
+ .../Devices/MediaRenderer/PltMediaRenderer.h | 8 +--
+ .../Devices/MediaServer/PltFileMediaServer.h | 20 +++---
+ .../Source/Devices/MediaServer/PltMediaBrowser.h | 10 +--
+ .../Source/Devices/MediaServer/PltMediaItem.h | 18 +++---
+ .../Source/Devices/MediaServer/PltMediaServer.h | 12 ++--
+ .../Devices/MediaServer/PltSyncMediaBrowser.h | 26 ++++----
+ lib/libUPnP/Platinum/Source/Extras/PltDownloader.h | 8 +--
+ .../Platinum/Source/Extras/PltFrameServer.h | 8 +--
+ .../Platinum/Source/Extras/PltFrameStream.h | 14 ++--
+ .../Platinum/Source/Extras/PltRingBufferStream.h | 20 +++---
+ lib/libUPnP/Platinum/Source/Extras/PltStreamPump.h | 8 +--
+ 47 files changed, 403 insertions(+), 403 deletions(-)
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptAutoreleasePool.h b/lib/libUPnP/Neptune/Source/Core/NptAutoreleasePool.h
+index cc63664cb19c..6f704f72b114 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptAutoreleasePool.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptAutoreleasePool.h
+@@ -48,7 +48,7 @@ class NPT_AutoreleasePool : public NPT_AutoreleasePoolInterface
+ {
+ public:
+ NPT_AutoreleasePool();
+- virtual ~NPT_AutoreleasePool();
++ ~NPT_AutoreleasePool() override;
+
+ private:
+ NPT_AutoreleasePoolInterface* m_Delegate;
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.h b/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.h
+index 1c0e0d6839df..6e3705150ea8 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptBufferedStreams.h
+@@ -55,7 +55,7 @@ class NPT_BufferedInputStream : public NPT_InputStream
+ // constructors and destructor
+ NPT_BufferedInputStream(NPT_InputStreamReference& stream,
+ NPT_Size buffer_size = NPT_BUFFERED_BYTE_STREAM_DEFAULT_SIZE);
+- virtual ~NPT_BufferedInputStream();
++ ~NPT_BufferedInputStream() override;
+
+ // methods
+ virtual NPT_Result ReadLine(NPT_String& line,
+@@ -73,11 +73,11 @@ class NPT_BufferedInputStream : public NPT_InputStream
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = NULL);
+- NPT_Result Seek(NPT_Position offset);
+- NPT_Result Tell(NPT_Position& offset);
+- NPT_Result GetSize(NPT_LargeSize& size);
+- NPT_Result GetAvailable(NPT_LargeSize& available);
++ NPT_Size* bytes_read = NULL) override;
++ NPT_Result Seek(NPT_Position offset) override;
++ NPT_Result Tell(NPT_Position& offset) override;
++ NPT_Result GetSize(NPT_LargeSize& size) override;
++ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+ protected:
+ // members
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.h b/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.h
+index 4a2751ee21c1..50186ccfaac1 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptDynamicLibraries.h
+@@ -63,13 +63,13 @@ class NPT_DynamicLibrary : public NPT_DynamicLibraryInterface
+ static NPT_Result Load(const char* name, NPT_Flags flags, NPT_DynamicLibrary*& library);
+
+ // destructor
+- ~NPT_DynamicLibrary() { delete m_Delegate; }
++ ~NPT_DynamicLibrary() override { delete m_Delegate; }
+
+ // NPT_DynamicLibraryInterface methods
+- virtual NPT_Result FindSymbol(const char* name, void*& symbol) {
++ NPT_Result FindSymbol(const char* name, void*& symbol) override {
+ return m_Delegate->FindSymbol(name, symbol);
+ }
+- virtual NPT_Result Unload() {
++ NPT_Result Unload() override {
+ return m_Delegate->Unload();
+ }
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptFile.h b/lib/libUPnP/Neptune/Source/Core/NptFile.h
+index e93bb2b43d81..c6b2db219525 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptFile.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptFile.h
+@@ -174,7 +174,7 @@ class NPT_File : public NPT_FileInterface
+
+ // constructors and destructor
+ NPT_File(const char* path);
+- ~NPT_File() { delete m_Delegate; }
++ ~NPT_File() override { delete m_Delegate; }
+
+ // methods
+ NPT_Result Load(NPT_DataBuffer& buffer);
+@@ -186,16 +186,16 @@ class NPT_File : public NPT_FileInterface
+ NPT_Result Rename(const char* path);
+
+ // NPT_FileInterface methods
+- NPT_Result Open(OpenMode mode) {
++ NPT_Result Open(OpenMode mode) override {
+ return m_Delegate->Open(mode);
+ }
+- NPT_Result Close() {
++ NPT_Result Close() override {
+ return m_Delegate->Close();
+ }
+- NPT_Result GetInputStream(NPT_InputStreamReference& stream) {
++ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override {
+ return m_Delegate->GetInputStream(stream);
+ }
+- NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) {
++ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override {
+ return m_Delegate->GetOutputStream(stream);
+ }
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp b/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
+index 8c5d587ff143..af4f6dc9497a 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
++++ b/lib/libUPnP/Neptune/Source/Core/NptHttp.cpp
+@@ -332,7 +332,7 @@ class NPT_HttpEntityBodyInputStream : public NPT_InputStream
+ bool chunked,
+ NPT_HttpClient::Connection* connection,
+ bool should_persist);
+- virtual ~NPT_HttpEntityBodyInputStream();
++ ~NPT_HttpEntityBodyInputStream() override;
+
+ // methods
+ bool SizeIsKnown() { return m_SizeIsKnown; }
+@@ -340,19 +340,19 @@ class NPT_HttpEntityBodyInputStream : public NPT_InputStream
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = NULL);
+- NPT_Result Seek(NPT_Position /*offset*/) {
++ NPT_Size* bytes_read = NULL) override;
++ NPT_Result Seek(NPT_Position /*offset*/) override {
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+- NPT_Result Tell(NPT_Position& offset) {
++ NPT_Result Tell(NPT_Position& offset) override {
+ offset = m_Position;
+ return NPT_SUCCESS;
+ }
+- NPT_Result GetSize(NPT_LargeSize& size) {
++ NPT_Result GetSize(NPT_LargeSize& size) override {
+ size = m_Size;
+ return NPT_SUCCESS;
+ }
+- NPT_Result GetAvailable(NPT_LargeSize& available);
++ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+ private:
+ // methods
+@@ -1012,7 +1012,7 @@ class NPT_HttpEnvProxySelector : public NPT_HttpProxySelector,
+ static NPT_HttpEnvProxySelector* GetInstance();
+
+ // NPT_HttpProxySelector methods
+- NPT_Result GetProxyForUrl(const NPT_HttpUrl& url, NPT_HttpProxyAddress& proxy);
++ NPT_Result GetProxyForUrl(const NPT_HttpUrl& url, NPT_HttpProxyAddress& proxy) override;
+
+ private:
+ // class variables
+@@ -1225,7 +1225,7 @@ class NPT_HttpStaticProxySelector : public NPT_HttpProxySelector
+ NPT_UInt16 htts_proxy_port);
+
+ // NPT_HttpProxySelector methods
+- NPT_Result GetProxyForUrl(const NPT_HttpUrl& url, NPT_HttpProxyAddress& proxy);
++ NPT_Result GetProxyForUrl(const NPT_HttpUrl& url, NPT_HttpProxyAddress& proxy) override;
+
+ private:
+ // members
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptHttp.h b/lib/libUPnP/Neptune/Source/Core/NptHttp.h
+index 402d515e0e9a..fd5bfd66b733 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptHttp.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptHttp.h
+@@ -135,7 +135,7 @@ class NPT_HttpUrl : public NPT_Url {
+ NPT_HttpUrl(const char* url, bool ignore_scheme = false);
+
+ // methods
+- virtual NPT_String ToString(bool with_fragment = true) const;
++ NPT_String ToString(bool with_fragment = true) const override;
+ };
+
+ /*----------------------------------------------------------------------
+@@ -293,7 +293,7 @@ class NPT_HttpRequest : public NPT_HttpMessage {
+ NPT_HttpRequest(const char* url,
+ const char* method,
+ const char* protocol = NPT_HTTP_PROTOCOL_1_0);
+- virtual ~NPT_HttpRequest();
++ ~NPT_HttpRequest() override;
+
+ // methods
+ const NPT_HttpUrl& GetUrl() const { return m_Url; }
+@@ -322,7 +322,7 @@ class NPT_HttpResponse : public NPT_HttpMessage {
+ NPT_HttpResponse(NPT_HttpStatusCode status_code,
+ const char* reason_phrase,
+ const char* protocol = NPT_HTTP_PROTOCOL_1_0);
+- virtual ~NPT_HttpResponse();
++ ~NPT_HttpResponse() override;
+
+ // methods
+ NPT_Result SetStatus(NPT_HttpStatusCode status_code,
+@@ -503,16 +503,16 @@ class NPT_HttpConnectionManager : public NPT_Thread,
+ NPT_SocketReference& socket,
+ NPT_InputStreamReference input_stream,
+ NPT_OutputStreamReference output_stream);
+- virtual ~Connection();
++ ~Connection() override;
+
+ // NPT_HttpClient::Connection methods
+- virtual NPT_InputStreamReference& GetInputStream() { return m_InputStream; }
+- virtual NPT_OutputStreamReference& GetOutputStream() { return m_OutputStream; }
+- virtual NPT_Result GetInfo(NPT_SocketInfo& info) { return m_Socket->GetInfo(info); }
+- virtual bool SupportsPersistence() { return true; }
+- virtual bool IsRecycled() { return m_IsRecycled; }
+- virtual NPT_Result Recycle();
+- virtual NPT_Result Abort() { return m_Socket->Cancel(); }
++ NPT_InputStreamReference& GetInputStream() override { return m_InputStream; }
++ NPT_OutputStreamReference& GetOutputStream() override { return m_OutputStream; }
++ NPT_Result GetInfo(NPT_SocketInfo& info) override { return m_Socket->GetInfo(info); }
++ bool SupportsPersistence() override { return true; }
++ bool IsRecycled() override { return m_IsRecycled; }
++ NPT_Result Recycle() override;
++ NPT_Result Abort() override { return m_Socket->Cancel(); }
+
+ // members
+ NPT_HttpConnectionManager& m_Manager;
+@@ -524,7 +524,7 @@ class NPT_HttpConnectionManager : public NPT_Thread,
+ };
+
+ // destructor
+- ~NPT_HttpConnectionManager();
++ ~NPT_HttpConnectionManager() override;
+
+ // methods
+ Connection* FindConnection(NPT_SocketAddress& address);
+@@ -545,7 +545,7 @@ class NPT_HttpConnectionManager : public NPT_Thread,
+ NPT_HttpConnectionManager();
+
+ // NPT_Thread methods
+- void Run();
++ void Run() override;
+
+ // methods
+ NPT_Result UntrackConnection(NPT_HttpClient::Connection* connection);
+@@ -635,9 +635,9 @@ class NPT_HttpStaticRequestHandler : public NPT_HttpRequestHandler
+ bool copy = true);
+
+ // NPT_HttpRequestHandler methods
+- virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
++ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ private:
+ NPT_String m_MimeType;
+@@ -665,9 +665,9 @@ class NPT_HttpFileRequestHandler : public NPT_HttpRequestHandler
+ const char* auto_index = NULL);
+
+ // NPT_HttpRequestHandler methods
+- virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
++ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ // class methods
+ static const char* GetDefaultContentType(const char* extension);
+@@ -821,16 +821,16 @@ class NPT_HttpChunkedInputStream : public NPT_InputStream
+ public:
+ // constructors and destructor
+ NPT_HttpChunkedInputStream(NPT_BufferedInputStreamReference& stream);
+- virtual ~NPT_HttpChunkedInputStream();
++ ~NPT_HttpChunkedInputStream() override;
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = NULL);
+- NPT_Result Seek(NPT_Position offset);
+- NPT_Result Tell(NPT_Position& offset);
+- NPT_Result GetSize(NPT_LargeSize& size);
+- NPT_Result GetAvailable(NPT_LargeSize& available);
++ NPT_Size* bytes_read = NULL) override;
++ NPT_Result Seek(NPT_Position offset) override;
++ NPT_Result Tell(NPT_Position& offset) override;
++ NPT_Result GetSize(NPT_LargeSize& size) override;
++ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+ protected:
+ // members
+@@ -847,15 +847,15 @@ class NPT_HttpChunkedOutputStream : public NPT_OutputStream
+ public:
+ // constructors and destructor
+ NPT_HttpChunkedOutputStream(NPT_OutputStream& stream);
+- virtual ~NPT_HttpChunkedOutputStream();
++ ~NPT_HttpChunkedOutputStream() override;
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+- NPT_Size* bytes_written = NULL);
+- NPT_Result Seek(NPT_Position /*offset*/) { return NPT_ERROR_NOT_SUPPORTED;}
+- NPT_Result Tell(NPT_Position& offset) { return m_Stream.Tell(offset); }
+- NPT_Result Flush() { return m_Stream.Flush(); }
++ NPT_Size* bytes_written = NULL) override;
++ NPT_Result Seek(NPT_Position /*offset*/) override { return NPT_ERROR_NOT_SUPPORTED;}
++ NPT_Result Tell(NPT_Position& offset) override { return m_Stream.Tell(offset); }
++ NPT_Result Flush() override { return m_Stream.Flush(); }
+
+ protected:
+ // members
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptLogging.cpp b/lib/libUPnP/Neptune/Source/Core/NptLogging.cpp
+index 08037427ab09..5c75afe908d0 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptLogging.cpp
++++ b/lib/libUPnP/Neptune/Source/Core/NptLogging.cpp
+@@ -67,7 +67,7 @@ class NPT_LogConsoleHandler : public NPT_LogHandler {
+ static NPT_Result Create(const char* logger_name, NPT_LogHandler*& handler);
+
+ // methods
+- void Log(const NPT_LogRecord& record);
++ void Log(const NPT_LogRecord& record) override;
+
+ private:
+ // members
+@@ -82,7 +82,7 @@ class NPT_LogFileHandler : public NPT_LogHandler {
+ static NPT_Result Create(const char* logger_name, NPT_LogHandler*& handler);
+
+ // methods
+- void Log(const NPT_LogRecord& record);
++ void Log(const NPT_LogRecord& record) override;
+
+ private:
+ NPT_Result Open(bool append = true);
+@@ -104,7 +104,7 @@ class NPT_LogTcpHandler : public NPT_LogHandler {
+ static NPT_Result Create(const char* logger_name, NPT_LogHandler*& handler);
+
+ // methods
+- void Log(const NPT_LogRecord& record);
++ void Log(const NPT_LogRecord& record) override;
+
+ private:
+ // constructor
+@@ -125,7 +125,7 @@ class NPT_LogUdpHandler : public NPT_LogHandler {
+ static NPT_Result Create(const char* logger_name, NPT_LogHandler*& handler);
+
+ // methods
+- void Log(const NPT_LogRecord& record);
++ void Log(const NPT_LogRecord& record) override;
+
+ private:
+ // members
+@@ -139,7 +139,7 @@ class NPT_LogNullHandler : public NPT_LogHandler {
+ static NPT_Result Create(NPT_LogHandler*& handler);
+
+ // methods
+- void Log(const NPT_LogRecord& record);
++ void Log(const NPT_LogRecord& record) override;
+ };
+
+ class NPT_LogCustomHandler : public NPT_LogHandler {
+@@ -149,7 +149,7 @@ class NPT_LogCustomHandler : public NPT_LogHandler {
+ static NPT_Result Create(NPT_LogHandler*& handler);
+
+ // methods
+- void Log(const NPT_LogRecord& record);
++ void Log(const NPT_LogRecord& record) override;
+
+ private:
+ static CustomHandlerExternalFunction s_ExternalFunction;
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptLogging.h b/lib/libUPnP/Neptune/Source/Core/NptLogging.h
+index 3168424a3bc8..60966c922e52 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptLogging.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptLogging.h
+@@ -194,16 +194,16 @@ class NPT_HttpLoggerConfigurator : NPT_HttpRequestHandler, public NPT_Thread {
+ // constructor and destructor
+ NPT_HttpLoggerConfigurator(NPT_UInt16 port = NPT_HTTP_LOGGER_CONFIGURATOR_DEFAULT_PORT,
+ bool detached = true);
+- virtual ~NPT_HttpLoggerConfigurator();
++ ~NPT_HttpLoggerConfigurator() override;
+
+ // NPT_Runnable (NPT_Thread) methods
+- virtual void Run();
++ void Run() override;
+
+ private:
+ // NPT_HttpRequestHandler methods
+- virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
++ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ // members
+ NPT_HttpServer* m_Server;
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptMessaging.h b/lib/libUPnP/Neptune/Source/Core/NptMessaging.h
+index 3e61919f56a8..3da21a0901bb 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptMessaging.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptMessaging.h
+@@ -89,11 +89,11 @@ class NPT_MessageHandlerProxy : public NPT_MessageHandler
+ NPT_MessageHandlerProxy(NPT_MessageHandler* handler);
+
+ // destructor
+- virtual ~NPT_MessageHandlerProxy();
++ ~NPT_MessageHandlerProxy() override;
+
+ // NPT_MessageHandler methods
+- virtual void OnMessage(NPT_Message*);
+- virtual NPT_Result HandleMessage(NPT_Message* message);
++ void OnMessage(NPT_Message*) override;
++ NPT_Result HandleMessage(NPT_Message* message) override;
+
+ /**
+ * Detach the proxy from the handler implementation.
+@@ -153,7 +153,7 @@ class NPT_TerminateMessage : public NPT_Message
+ {
+ public:
+ // methods
+- NPT_Result Dispatch(NPT_MessageHandler* /*handler*/) {
++ NPT_Result Dispatch(NPT_MessageHandler* /*handler*/) override {
+ return NPT_ERROR_TERMINATED;
+ }
+ };
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptSelectableMessageQueue.h b/lib/libUPnP/Neptune/Source/Core/NptSelectableMessageQueue.h
+index 23dd4991537d..56b55d083a4a 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptSelectableMessageQueue.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptSelectableMessageQueue.h
+@@ -46,12 +46,12 @@ class NPT_SelectableMessageQueue : public NPT_SimpleMessageQueue
+ public:
+ // methods
+ NPT_SelectableMessageQueue();
+- virtual ~NPT_SelectableMessageQueue();
++ ~NPT_SelectableMessageQueue() override;
+
+ // NPT_MessageQueue methods
+- virtual NPT_Result PumpMessage(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+- virtual NPT_Result QueueMessage(NPT_Message* message,
+- NPT_MessageHandler* handler);
++ NPT_Result PumpMessage(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override;
++ NPT_Result QueueMessage(NPT_Message* message,
++ NPT_MessageHandler* handler) override;
+
+ // methods
+ int GetEventFd() { return m_Pipe[0]; }
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptSerialPort.h b/lib/libUPnP/Neptune/Source/Core/NptSerialPort.h
+index 1e23a3d37fdc..b543c112c65c 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptSerialPort.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptSerialPort.h
+@@ -92,22 +92,22 @@ class NPT_SerialPort : public NPT_SerialPortInterface
+ public:
+ // constructors and destructor
+ NPT_SerialPort(const char* name);
+- ~NPT_SerialPort() { delete m_Delegate; }
++ ~NPT_SerialPort() override { delete m_Delegate; }
+
+ // NPT_SerialPortInterface methods
+ NPT_Result Open(unsigned int speed,
+ NPT_SerialPortStopBits stop_bits = NPT_SERIAL_PORT_STOP_BITS_1,
+ NPT_SerialPortFlowControl flow_control = NPT_SERIAL_PORT_FLOW_CONTROL_NONE,
+- NPT_SerialPortParity parity = NPT_SERIAL_PORT_PARITY_NONE) {
++ NPT_SerialPortParity parity = NPT_SERIAL_PORT_PARITY_NONE) override {
+ return m_Delegate->Open(speed, stop_bits, flow_control, parity);
+ }
+- NPT_Result Close() {
++ NPT_Result Close() override {
+ return m_Delegate->Close();
+ }
+- NPT_Result GetInputStream(NPT_InputStreamReference& stream) {
++ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override {
+ return m_Delegate->GetInputStream(stream);
+ }
+- NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) {
++ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override {
+ return m_Delegate->GetOutputStream(stream);
+ }
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.h b/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.h
+index 158b6ff0297a..cad3ce124690 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptSimpleMessageQueue.h
+@@ -53,12 +53,12 @@ class NPT_SimpleMessageQueue : public NPT_MessageQueue
+ public:
+ // members
+ NPT_SimpleMessageQueue();
+- virtual ~NPT_SimpleMessageQueue();
++ ~NPT_SimpleMessageQueue() override;
+
+ // NPT_MessageQueue methods
+- virtual NPT_Result QueueMessage(NPT_Message* message,
+- NPT_MessageHandler* handler);
+- virtual NPT_Result PumpMessage(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
++ NPT_Result QueueMessage(NPT_Message* message,
++ NPT_MessageHandler* handler) override;
++ NPT_Result PumpMessage(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override;
+
+ private:
+ // members
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptSockets.h b/lib/libUPnP/Neptune/Source/Core/NptSockets.h
+index 789939a5341d..fcd2830715ef 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptSockets.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptSockets.h
+@@ -195,35 +195,35 @@ class NPT_Socket : public NPT_SocketInterface
+
+ // constructor and destructor
+ explicit NPT_Socket(NPT_SocketInterface* delegate) : m_SocketDelegate(delegate) {}
+- virtual ~NPT_Socket();
++ ~NPT_Socket() override;
+
+ // delegate NPT_SocketInterface methods
+- NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true) {
++ NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true) override {
+ return m_SocketDelegate->Bind(address, reuse_address);
+ }
+ NPT_Result Connect(const NPT_SocketAddress& address,
+- NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) {
++ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_SocketDelegate->Connect(address, timeout);
+ }
+- NPT_Result WaitForConnection(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) {
++ NPT_Result WaitForConnection(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_SocketDelegate->WaitForConnection(timeout);
+ }
+- NPT_Result GetInputStream(NPT_InputStreamReference& stream) {
++ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override {
+ return m_SocketDelegate->GetInputStream(stream);
+ }
+- NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) {
++ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override {
+ return m_SocketDelegate->GetOutputStream(stream);
+ }
+- NPT_Result GetInfo(NPT_SocketInfo& info) {
++ NPT_Result GetInfo(NPT_SocketInfo& info) override {
+ return m_SocketDelegate->GetInfo(info);
+ }
+- NPT_Result SetReadTimeout(NPT_Timeout timeout) {
++ NPT_Result SetReadTimeout(NPT_Timeout timeout) override {
+ return m_SocketDelegate->SetReadTimeout(timeout);
+ }
+- NPT_Result SetWriteTimeout(NPT_Timeout timeout) {
++ NPT_Result SetWriteTimeout(NPT_Timeout timeout) override {
+ return m_SocketDelegate->SetWriteTimeout(timeout);
+ }
+- NPT_Result Cancel(bool shutdown=true) {
++ NPT_Result Cancel(bool shutdown=true) override {
+ return m_SocketDelegate->Cancel(shutdown);
+ }
+
+@@ -246,15 +246,15 @@ class NPT_UdpSocket : public NPT_Socket,
+ public:
+ // constructor and destructor
+ NPT_UdpSocket(NPT_Flags flags=0);
+- virtual ~NPT_UdpSocket();
++ ~NPT_UdpSocket() override;
+
+ // delegate NPT_UdpSocketInterface methods
+ NPT_Result Send(const NPT_DataBuffer& packet,
+- const NPT_SocketAddress* address = NULL) {
++ const NPT_SocketAddress* address = NULL) override {
+ return m_UdpSocketDelegate->Send(packet, address);
+ }
+ NPT_Result Receive(NPT_DataBuffer& packet,
+- NPT_SocketAddress* address = NULL) {
++ NPT_SocketAddress* address = NULL) override {
+ return m_UdpSocketDelegate->Receive(packet, address);
+ }
+
+@@ -275,23 +275,23 @@ class NPT_UdpMulticastSocket : public NPT_UdpSocket,
+ public:
+ // constructor and destructor
+ NPT_UdpMulticastSocket(NPT_Flags flags=0);
+- virtual ~NPT_UdpMulticastSocket();
++ ~NPT_UdpMulticastSocket() override;
+
+ // delegate NPT_UdpMulticastSocketInterface methods
+ NPT_Result JoinGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface =
+- NPT_IpAddress::Any) {
++ NPT_IpAddress::Any) override {
+ return m_UdpMulticastSocketDelegate->JoinGroup(group, iface);
+ }
+ NPT_Result LeaveGroup(const NPT_IpAddress& group,
+ const NPT_IpAddress& iface =
+- NPT_IpAddress::Any) {
++ NPT_IpAddress::Any) override {
+ return m_UdpMulticastSocketDelegate->LeaveGroup(group, iface);
+ }
+- NPT_Result SetTimeToLive(unsigned char ttl) {
++ NPT_Result SetTimeToLive(unsigned char ttl) override {
+ return m_UdpMulticastSocketDelegate->SetTimeToLive(ttl);
+ }
+- NPT_Result SetInterface(const NPT_IpAddress& iface) {
++ NPT_Result SetInterface(const NPT_IpAddress& iface) override {
+ return m_UdpMulticastSocketDelegate->SetInterface(iface);
+ }
+
+@@ -308,7 +308,7 @@ class NPT_TcpClientSocket : public NPT_Socket
+ public:
+ // constructors and destructor
+ NPT_TcpClientSocket(NPT_Flags flags=0);
+- virtual ~NPT_TcpClientSocket();
++ ~NPT_TcpClientSocket() override;
+ };
+
+ /*----------------------------------------------------------------------
+@@ -320,15 +320,15 @@ class NPT_TcpServerSocket : public NPT_Socket,
+ public:
+ // constructors and destructor
+ NPT_TcpServerSocket(NPT_Flags flags=0);
+- virtual ~NPT_TcpServerSocket();
++ ~NPT_TcpServerSocket() override;
+
+ // delegate NPT_TcpServerSocketInterface methods
+- NPT_Result Listen(unsigned int max_clients) {
++ NPT_Result Listen(unsigned int max_clients) override {
+ return m_TcpServerSocketDelegate->Listen(max_clients);
+ }
+ NPT_Result WaitForNewClient(NPT_Socket*& client,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE,
+- NPT_Flags flags = 0) {
++ NPT_Flags flags = 0) override {
+ return m_TcpServerSocketDelegate->WaitForNewClient(client, timeout, flags);
+ }
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptStreams.h b/lib/libUPnP/Neptune/Source/Core/NptStreams.h
+index 6cdab10fcb27..bb22903a9137 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptStreams.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptStreams.h
+@@ -139,10 +139,10 @@ class NPT_DelegatingInputStream : public NPT_InputStream
+ {
+ public:
+ // NPT_InputStream methods
+- NPT_Result Seek(NPT_Position offset) {
++ NPT_Result Seek(NPT_Position offset) override {
+ return InputSeek(offset);
+ }
+- NPT_Result Tell(NPT_Position& offset) {
++ NPT_Result Tell(NPT_Position& offset) override {
+ return InputTell(offset);
+ }
+
+@@ -165,10 +165,10 @@ class NPT_DelegatingOutputStream : public NPT_OutputStream
+ {
+ public:
+ // NPT_OutputStream methods
+- NPT_Result Seek(NPT_Position offset) {
++ NPT_Result Seek(NPT_Position offset) override {
+ return OutputSeek(offset);
+ }
+- NPT_Result Tell(NPT_Position& offset) {
++ NPT_Result Tell(NPT_Position& offset) override {
+ return OutputTell(offset);
+ }
+
+@@ -189,7 +189,7 @@ class NPT_MemoryStream :
+ // constructor and destructor
+ NPT_MemoryStream(NPT_Size initial_capacity = 0);
+ NPT_MemoryStream(const void* data, NPT_Size size);
+- virtual ~NPT_MemoryStream() {}
++ ~NPT_MemoryStream() override {}
+
+ // accessors
+ const NPT_DataBuffer& GetBuffer() const { return m_Buffer; }
+@@ -197,12 +197,12 @@ class NPT_MemoryStream :
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = NULL);
+- NPT_Result GetSize(NPT_LargeSize& size) {
++ NPT_Size* bytes_read = NULL) override;
++ NPT_Result GetSize(NPT_LargeSize& size) override {
+ size = m_Buffer.GetDataSize();
+ return NPT_SUCCESS;
+ }
+- NPT_Result GetAvailable(NPT_LargeSize& available) {
++ NPT_Result GetAvailable(NPT_LargeSize& available) override {
+ available = (NPT_LargeSize)m_Buffer.GetDataSize()-m_ReadOffset;
+ return NPT_SUCCESS;
+ }
+@@ -210,7 +210,7 @@ class NPT_MemoryStream :
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+- NPT_Size* bytes_written = NULL);
++ NPT_Size* bytes_written = NULL) override;
+
+ // methods delegated to m_Buffer
+ const NPT_Byte* GetData() const { return m_Buffer.GetData(); }
+@@ -223,15 +223,15 @@ class NPT_MemoryStream :
+
+ private:
+ // NPT_DelegatingInputStream methods
+- NPT_Result InputSeek(NPT_Position offset);
+- NPT_Result InputTell(NPT_Position& offset) {
++ NPT_Result InputSeek(NPT_Position offset) override;
++ NPT_Result InputTell(NPT_Position& offset) override {
+ offset = m_ReadOffset;
+ return NPT_SUCCESS;
+ }
+
+ // NPT_DelegatingOutputStream methods
+- NPT_Result OutputSeek(NPT_Position offset);
+- NPT_Result OutputTell(NPT_Position& offset) {
++ NPT_Result OutputSeek(NPT_Position offset) override;
++ NPT_Result OutputTell(NPT_Position& offset) override {
+ offset = m_WriteOffset;
+ return NPT_SUCCESS;
+ }
+@@ -254,16 +254,16 @@ class NPT_StringOutputStream : public NPT_OutputStream
+ // methods
+ NPT_StringOutputStream(NPT_Size size = 4096);
+ NPT_StringOutputStream(NPT_String* storage);
+- virtual ~NPT_StringOutputStream() ;
++ ~NPT_StringOutputStream() override ;
+
+ const NPT_String& GetString() const { return *m_String; }
+ NPT_Result Reset() { if (m_String) m_String->SetLength(0); return NPT_SUCCESS; }
+
+ // NPT_OutputStream methods
+- NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL);
++ NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL) override;
+
+- NPT_Result Seek(NPT_Position /*offset*/) { return NPT_ERROR_NOT_SUPPORTED; }
+- NPT_Result Tell(NPT_Position& offset) { offset = m_String->GetLength(); return NPT_SUCCESS; }
++ NPT_Result Seek(NPT_Position /*offset*/) override { return NPT_ERROR_NOT_SUPPORTED; }
++ NPT_Result Tell(NPT_Position& offset) override { offset = m_String->GetLength(); return NPT_SUCCESS; }
+
+ protected:
+ NPT_String* m_String;
+@@ -284,13 +284,13 @@ class NPT_SubInputStream : public NPT_InputStream
+ NPT_LargeSize size);
+
+ // methods
+- virtual NPT_Result Read(void* buffer,
++ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = NULL);
+- virtual NPT_Result Seek(NPT_Position offset);
+- virtual NPT_Result Tell(NPT_Position& offset);
+- virtual NPT_Result GetSize(NPT_LargeSize& size);
+- virtual NPT_Result GetAvailable(NPT_LargeSize& available);
++ NPT_Size* bytes_read = NULL) override;
++ NPT_Result Seek(NPT_Position offset) override;
++ NPT_Result Tell(NPT_Position& offset) override;
++ NPT_Result GetSize(NPT_LargeSize& size) override;
++ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+ private:
+ NPT_InputStreamReference m_Source;
+@@ -307,13 +307,13 @@ class NPT_NullOutputStream : public NPT_OutputStream
+ public:
+ // methods
+ NPT_NullOutputStream() {}
+- virtual ~NPT_NullOutputStream() {}
++ ~NPT_NullOutputStream() override {}
+
+ // NPT_OutputStream methods
+- NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL);
++ NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL) override;
+
+- NPT_Result Seek(NPT_Position /*offset*/) { return NPT_ERROR_NOT_SUPPORTED; }
+- NPT_Result Tell(NPT_Position& /*offset*/) { return NPT_ERROR_NOT_SUPPORTED; }
++ NPT_Result Seek(NPT_Position /*offset*/) override { return NPT_ERROR_NOT_SUPPORTED; }
++ NPT_Result Tell(NPT_Position& /*offset*/) override { return NPT_ERROR_NOT_SUPPORTED; }
+ };
+
+ typedef NPT_Reference<NPT_NullOutputStream> NPT_NullOutputStreamReference;
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptThreads.h b/lib/libUPnP/Neptune/Source/Core/NptThreads.h
+index 9a7455f44b28..4bf73c8d5c9b 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptThreads.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptThreads.h
+@@ -78,9 +78,9 @@ class NPT_Mutex : public NPT_MutexInterface
+ public:
+ // methods
+ NPT_Mutex(bool recursive = false);
+- ~NPT_Mutex() { delete m_Delegate; }
+- NPT_Result Lock() { return m_Delegate->Lock(); }
+- NPT_Result Unlock() { return m_Delegate->Unlock(); }
++ ~NPT_Mutex() override { delete m_Delegate; }
++ NPT_Result Lock() override { return m_Delegate->Lock(); }
++ NPT_Result Unlock() override { return m_Delegate->Unlock(); }
+
+ private:
+ // members
+@@ -151,17 +151,17 @@ class NPT_SharedVariable : public NPT_SharedVariableInterface
+ public:
+ // methods
+ NPT_SharedVariable(int value = 0);
+- ~NPT_SharedVariable() { delete m_Delegate; }
+- void SetValue(int value) {
++ ~NPT_SharedVariable() override { delete m_Delegate; }
++ void SetValue(int value) override {
+ m_Delegate->SetValue(value);
+ }
+- int GetValue() {
++ int GetValue() override {
+ return m_Delegate->GetValue();
+ }
+- NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) {
++ NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_Delegate->WaitUntilEquals(value, timeout);
+ }
+- NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) {
++ NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_Delegate->WaitWhileEquals(value, timeout);
+ }
+
+@@ -192,11 +192,11 @@ class NPT_AtomicVariable : public NPT_AtomicVariableInterface
+ public:
+ // methods
+ NPT_AtomicVariable(int value = 0);
+- ~NPT_AtomicVariable() { delete m_Delegate; }
+- int Increment() { return m_Delegate->Increment();}
+- int Decrement() { return m_Delegate->Decrement();}
+- void SetValue(int value) { m_Delegate->SetValue(value); }
+- int GetValue() { return m_Delegate->GetValue(); }
++ ~NPT_AtomicVariable() override { delete m_Delegate; }
++ int Increment() override { return m_Delegate->Increment();}
++ int Decrement() override { return m_Delegate->Decrement();}
++ void SetValue(int value) override { m_Delegate->SetValue(value); }
++ int GetValue() override { return m_Delegate->GetValue(); }
+
+ private:
+ // members
+@@ -220,7 +220,7 @@ class NPT_ThreadInterface: public NPT_Runnable, public NPT_Interruptible
+ {
+ public:
+ // methods
+- virtual ~NPT_ThreadInterface() {}
++ ~NPT_ThreadInterface() override {}
+ virtual NPT_Result Start() = 0;
+ virtual NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+ virtual NPT_Result SetPriority(int /*priority*/) { return NPT_SUCCESS; }
+@@ -245,30 +245,30 @@ class NPT_Thread : public NPT_ThreadInterface
+ // methods
+ explicit NPT_Thread(bool detached = false);
+ explicit NPT_Thread(NPT_Runnable& target, bool detached = false);
+- ~NPT_Thread() { delete m_Delegate; }
++ ~NPT_Thread() override { delete m_Delegate; }
+
+ // cancel any socket that this thread may be waiting for
+- NPT_Result CancelBlockerSocket() { return m_Delegate->CancelBlockerSocket(); }
++ NPT_Result CancelBlockerSocket() override { return m_Delegate->CancelBlockerSocket(); }
+
+ // NPT_ThreadInterface methods
+- NPT_Result Start() {
++ NPT_Result Start() override {
+ return m_Delegate->Start();
+ }
+- NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) {
++ NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override {
+ return m_Delegate->Wait(timeout);
+ }
+- NPT_Result SetPriority(int priority) {
++ NPT_Result SetPriority(int priority) override {
+ return m_Delegate->SetPriority(priority);
+ }
+- NPT_Result GetPriority(int& priority) {
++ NPT_Result GetPriority(int& priority) override {
+ return m_Delegate->GetPriority(priority);
+ }
+
+ // NPT_Runnable methods
+- virtual void Run() {}
++ void Run() override {}
+
+ // NPT_Interruptible methods
+- virtual NPT_Result Interrupt() { return m_Delegate->Interrupt(); }
++ NPT_Result Interrupt() override { return m_Delegate->Interrupt(); }
+
+ private:
+ // members
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptTls.cpp b/lib/libUPnP/Neptune/Source/Core/NptTls.cpp
+index c622bb78aa2d..9118352ed5de 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptTls.cpp
++++ b/lib/libUPnP/Neptune/Source/Core/NptTls.cpp
+@@ -1055,10 +1055,10 @@ NPT_HttpTlsConnector::VerifyPeer(NPT_TlsClientSession& session, const char* host
+ class NPT_HttpSimpleTlsConnection : public NPT_HttpClient::Connection
+ {
+ public:
+- virtual NPT_InputStreamReference& GetInputStream() {
++ NPT_InputStreamReference& GetInputStream() override {
+ return m_InputStream;
+ }
+- virtual NPT_OutputStreamReference& GetOutputStream() {
++ NPT_OutputStreamReference& GetOutputStream() override {
+ return m_OutputStream;
+ }
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptTls.h b/lib/libUPnP/Neptune/Source/Core/NptTls.h
+index 4a392fdcc7b1..dafe8ef304ba 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptTls.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptTls.h
+@@ -131,7 +131,7 @@ class NPT_TlsContext : public NPT_AutomaticCleaner::Singleton
+ OPTION_NO_SESSION_CACHE = 8
+ };
+ NPT_TlsContext(NPT_Flags options=0);
+- ~NPT_TlsContext();
++ ~NPT_TlsContext() override;
+
+ // methods
+ NPT_Result LoadKey(NPT_TlsKeyFormat key_format,
+@@ -279,12 +279,12 @@ class NPT_HttpTlsConnector : public NPT_HttpClient::Connector
+ class NPT_HttpTlsConnector : public NPT_HttpClient::Connector
+ {
+ public:
+- virtual ~NPT_HttpTlsConnector() {}
+- virtual NPT_Result Connect(const NPT_HttpUrl& url,
++ ~NPT_HttpTlsConnector() override {}
++ NPT_Result Connect(const NPT_HttpUrl& url,
+ NPT_HttpClient& client,
+ const NPT_HttpProxyAddress* proxy,
+ bool reuse,
+- NPT_HttpClient::Connection*& connection);
++ NPT_HttpClient::Connection*& connection) override;
+ };
+ #endif
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptXml.h b/lib/libUPnP/Neptune/Source/Core/NptXml.h
+index b5d18ea38148..f76243bff453 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptXml.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptXml.h
+@@ -175,7 +175,7 @@ class NPT_XmlElementNode : public NPT_XmlNode
+ // methods
+ NPT_XmlElementNode(const char* tag);
+ NPT_XmlElementNode(const char* prefix, const char* tag);
+- virtual ~NPT_XmlElementNode();
++ ~NPT_XmlElementNode() override;
+ NPT_List<NPT_XmlNode*>& GetChildren() { return m_Children; }
+ const NPT_List<NPT_XmlNode*>&
+ GetChildren() const { return m_Children; }
+@@ -211,12 +211,12 @@ class NPT_XmlElementNode : public NPT_XmlNode
+ const NPT_String* GetNamespacePrefix(const char* uri) const;
+
+ // type casting
+- NPT_XmlElementNode* AsElementNode() { return this; }
+- const NPT_XmlElementNode* AsElementNode() const { return this; }
++ NPT_XmlElementNode* AsElementNode() override { return this; }
++ const NPT_XmlElementNode* AsElementNode() const override { return this; }
+
+ protected:
+ // methods
+- void SetParent(NPT_XmlNode* parent);
++ void SetParent(NPT_XmlNode* parent) override;
+ void SetNamespaceParent(NPT_XmlElementNode* parent);
+ void RelinkNamespaceMaps();
+
+@@ -264,8 +264,8 @@ class NPT_XmlTextNode : public NPT_XmlNode
+ TokenType GetTokenType() const { return m_TokenType; }
+
+ // type casting
+- NPT_XmlTextNode* AsTextNode() { return this; }
+- const NPT_XmlTextNode* AsTextNode() const { return this; }
++ NPT_XmlTextNode* AsTextNode() override { return this; }
++ const NPT_XmlTextNode* AsTextNode() const override { return this; }
+
+ private:
+ // members
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptZip.h b/lib/libUPnP/Neptune/Source/Core/NptZip.h
+index 3720451e7079..d8b692acca7c 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptZip.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptZip.h
+@@ -141,16 +141,16 @@ class NPT_ZipInflatingInputStream : public NPT_InputStream
+ {
+ public:
+ NPT_ZipInflatingInputStream(NPT_InputStreamReference& source, bool raw = false);
+- ~NPT_ZipInflatingInputStream();
++ ~NPT_ZipInflatingInputStream() override;
+
+ // NPT_InputStream methods
+- virtual NPT_Result Read(void* buffer,
++ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = NULL);
+- virtual NPT_Result Seek(NPT_Position offset);
+- virtual NPT_Result Tell(NPT_Position& offset);
+- virtual NPT_Result GetSize(NPT_LargeSize& size);
+- virtual NPT_Result GetAvailable(NPT_LargeSize& available);
++ NPT_Size* bytes_read = NULL) override;
++ NPT_Result Seek(NPT_Position offset) override;
++ NPT_Result Tell(NPT_Position& offset) override;
++ NPT_Result GetSize(NPT_LargeSize& size) override;
++ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+ private:
+ NPT_InputStreamReference m_Source;
+@@ -172,16 +172,16 @@ class NPT_ZipDeflatingInputStream : public NPT_InputStream
+ NPT_ZipDeflatingInputStream(NPT_InputStreamReference& source,
+ int compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT,
+ NPT_Zip::Format format = NPT_Zip::ZLIB);
+- ~NPT_ZipDeflatingInputStream();
++ ~NPT_ZipDeflatingInputStream() override;
+
+ // NPT_InputStream methods
+- virtual NPT_Result Read(void* buffer,
++ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = NULL);
+- virtual NPT_Result Seek(NPT_Position offset);
+- virtual NPT_Result Tell(NPT_Position& offset);
+- virtual NPT_Result GetSize(NPT_LargeSize& size);
+- virtual NPT_Result GetAvailable(NPT_LargeSize& available);
++ NPT_Size* bytes_read = NULL) override;
++ NPT_Result Seek(NPT_Position offset) override;
++ NPT_Result Tell(NPT_Position& offset) override;
++ NPT_Result GetSize(NPT_LargeSize& size) override;
++ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+ private:
+ NPT_InputStreamReference m_Source;
+diff --git a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
+index 6174ff96f902..ee86dbf4b092 100644
+--- a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
+@@ -1063,14 +1063,14 @@ class NPT_BsdSocketInputStream : public NPT_InputStream,
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read);
+- NPT_Result Seek(NPT_Position offset) {
++ NPT_Size* bytes_read) override;
++ NPT_Result Seek(NPT_Position offset) override {
+ return NPT_BsdSocketStream::Seek(offset); }
+- NPT_Result Tell(NPT_Position& where) {
++ NPT_Result Tell(NPT_Position& where) override {
+ return NPT_BsdSocketStream::Tell(where);
+ }
+- NPT_Result GetSize(NPT_LargeSize& size);
+- NPT_Result GetAvailable(NPT_LargeSize& available);
++ NPT_Result GetSize(NPT_LargeSize& size) override;
++ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+ };
+
+ /*----------------------------------------------------------------------
+@@ -1176,13 +1176,13 @@ class NPT_BsdSocketOutputStream : public NPT_OutputStream,
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+- NPT_Size* bytes_written);
+- NPT_Result Seek(NPT_Position offset) {
++ NPT_Size* bytes_written) override;
++ NPT_Result Seek(NPT_Position offset) override {
+ return NPT_BsdSocketStream::Seek(offset); }
+- NPT_Result Tell(NPT_Position& where) {
++ NPT_Result Tell(NPT_Position& where) override {
+ return NPT_BsdSocketStream::Tell(where);
+ }
+- NPT_Result Flush();
++ NPT_Result Flush() override;
+ };
+
+ /*----------------------------------------------------------------------
+@@ -1320,21 +1320,21 @@ class NPT_BsdSocket : public NPT_SocketInterface
+ public:
+ // constructors and destructor
+ NPT_BsdSocket(SocketFd fd, NPT_Flags flags);
+- virtual ~NPT_BsdSocket();
++ ~NPT_BsdSocket() override;
+
+ // methods
+ NPT_Result RefreshInfo();
+
+ // NPT_SocketInterface methods
+- NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true);
+- NPT_Result Connect(const NPT_SocketAddress& address, NPT_Timeout timeout);
+- NPT_Result WaitForConnection(NPT_Timeout timeout);
+- NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+- NPT_Result GetOutputStream(NPT_OutputStreamReference& stream);
+- NPT_Result GetInfo(NPT_SocketInfo& info);
+- NPT_Result SetReadTimeout(NPT_Timeout timeout);
+- NPT_Result SetWriteTimeout(NPT_Timeout timeout);
+- NPT_Result Cancel(bool shutdown);
++ NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true) override;
++ NPT_Result Connect(const NPT_SocketAddress& address, NPT_Timeout timeout) override;
++ NPT_Result WaitForConnection(NPT_Timeout timeout) override;
++ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override;
++ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override;
++ NPT_Result GetInfo(NPT_SocketInfo& info) override;
++ NPT_Result SetReadTimeout(NPT_Timeout timeout) override;
++ NPT_Result SetWriteTimeout(NPT_Timeout timeout) override;
++ NPT_Result Cancel(bool shutdown) override;
+
+ protected:
+ // members
+@@ -1564,18 +1564,18 @@ class NPT_BsdUdpSocket : public NPT_UdpSocketInterface,
+ public:
+ // constructor and destructor
+ NPT_BsdUdpSocket(NPT_Flags flags);
+- virtual ~NPT_BsdUdpSocket() {}
++ ~NPT_BsdUdpSocket() override {}
+
+ // NPT_SocketInterface methods
+- NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true);
++ NPT_Result Bind(const NPT_SocketAddress& address, bool reuse_address = true) override;
+ NPT_Result Connect(const NPT_SocketAddress& address,
+- NPT_Timeout timeout);
++ NPT_Timeout timeout) override;
+
+ // NPT_UdpSocketInterface methods
+ NPT_Result Send(const NPT_DataBuffer& packet,
+- const NPT_SocketAddress* address);
++ const NPT_SocketAddress* address) override;
+ NPT_Result Receive(NPT_DataBuffer& packet,
+- NPT_SocketAddress* address);
++ NPT_SocketAddress* address) override;
+
+ // friends
+ friend class NPT_UdpSocket;
+@@ -1833,15 +1833,15 @@ class NPT_BsdUdpMulticastSocket : public NPT_UdpMulticastSocketInterface,
+ public:
+ // methods
+ NPT_BsdUdpMulticastSocket(NPT_Flags flags);
+- ~NPT_BsdUdpMulticastSocket();
++ ~NPT_BsdUdpMulticastSocket() override;
+
+ // NPT_UdpMulticastSocketInterface methods
+ NPT_Result JoinGroup(const NPT_IpAddress& group,
+- const NPT_IpAddress& iface);
++ const NPT_IpAddress& iface) override;
+ NPT_Result LeaveGroup(const NPT_IpAddress& group,
+- const NPT_IpAddress& iface);
+- NPT_Result SetTimeToLive(unsigned char ttl);
+- NPT_Result SetInterface(const NPT_IpAddress& iface);
++ const NPT_IpAddress& iface) override;
++ NPT_Result SetTimeToLive(unsigned char ttl) override;
++ NPT_Result SetInterface(const NPT_IpAddress& iface) override;
+
+ // friends
+ friend class NPT_UdpMulticastSocket;
+@@ -2129,12 +2129,12 @@ class NPT_BsdTcpClientSocket : protected NPT_BsdSocket
+ public:
+ // methods
+ NPT_BsdTcpClientSocket(NPT_Flags flags);
+- ~NPT_BsdTcpClientSocket();
++ ~NPT_BsdTcpClientSocket() override;
+
+ // NPT_SocketInterface methods
+ NPT_Result Connect(const NPT_SocketAddress& address,
+- NPT_Timeout timeout);
+- NPT_Result WaitForConnection(NPT_Timeout timeout);
++ NPT_Timeout timeout) override;
++ NPT_Result WaitForConnection(NPT_Timeout timeout) override;
+
+ protected:
+ // friends
+@@ -2241,25 +2241,25 @@ class NPT_BsdTcpServerSocket : public NPT_TcpServerSocketInterface,
+ public:
+ // methods
+ NPT_BsdTcpServerSocket(NPT_Flags flags);
+- ~NPT_BsdTcpServerSocket();
++ ~NPT_BsdTcpServerSocket() override;
+
+ // NPT_SocketInterface methods
+- NPT_Result GetInputStream(NPT_InputStreamReference& stream) {
++ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override {
+ // no stream
+ stream = NULL;
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+- NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) {
++ NPT_Result GetOutputStream(NPT_OutputStreamReference& stream) override {
+ // no stream
+ stream = NULL;
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+
+ // NPT_TcpServerSocket methods
+- NPT_Result Listen(unsigned int max_clients);
++ NPT_Result Listen(unsigned int max_clients) override;
+ NPT_Result WaitForNewClient(NPT_Socket*& client,
+ NPT_Timeout timeout,
+- NPT_Flags flags);
++ NPT_Flags flags) override;
+
+ protected:
+ // members
+diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixQueue.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixQueue.cpp
+index f32dfe54eef4..553cda38ad67 100644
+--- a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixQueue.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixQueue.cpp
+@@ -38,10 +38,10 @@ class NPT_PosixQueue : public NPT_GenericQueue
+ public:
+ // methods
+ NPT_PosixQueue(NPT_Cardinal max_items);
+- ~NPT_PosixQueue();
+- NPT_Result Push(NPT_QueueItem* item, NPT_Timeout timeout);
+- NPT_Result Pop(NPT_QueueItem*& item, NPT_Timeout timeout);
+- NPT_Result Peek(NPT_QueueItem*& item, NPT_Timeout timeout);
++ ~NPT_PosixQueue() override;
++ NPT_Result Push(NPT_QueueItem* item, NPT_Timeout timeout) override;
++ NPT_Result Pop(NPT_QueueItem*& item, NPT_Timeout timeout) override;
++ NPT_Result Peek(NPT_QueueItem*& item, NPT_Timeout timeout) override;
+
+ private:
+ void Abort();
+diff --git a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixThreads.cpp b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixThreads.cpp
+index 36eb9978b085..010ba9be0fe9 100644
+--- a/lib/libUPnP/Neptune/Source/System/Posix/NptPosixThreads.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Posix/NptPosixThreads.cpp
+@@ -41,11 +41,11 @@ class NPT_PosixMutex : public NPT_MutexInterface
+ public:
+ // methods
+ NPT_PosixMutex(bool recursive = false);
+- virtual ~NPT_PosixMutex();
++ ~NPT_PosixMutex() override;
+
+ // NPT_Mutex methods
+- virtual NPT_Result Lock();
+- virtual NPT_Result Unlock();
++ NPT_Result Lock() override;
++ NPT_Result Unlock() override;
+
+ private:
+ // members
+@@ -112,11 +112,11 @@ class NPT_PosixSharedVariable : public NPT_SharedVariableInterface
+ public:
+ // methods
+ NPT_PosixSharedVariable(int value);
+- ~NPT_PosixSharedVariable();
+- void SetValue(int value);
+- int GetValue();
+- NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout);
+- NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout);
++ ~NPT_PosixSharedVariable() override;
++ void SetValue(int value) override;
++ int GetValue() override;
++ NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout) override;
++ NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout) override;
+
+ private:
+ // members
+@@ -270,11 +270,11 @@ class NPT_PosixAtomicVariable : public NPT_AtomicVariableInterface
+ public:
+ // methods
+ NPT_PosixAtomicVariable(int value);
+- ~NPT_PosixAtomicVariable();
+- int Increment();
+- int Decrement();
+- int GetValue();
+- void SetValue(int value);
++ ~NPT_PosixAtomicVariable() override;
++ int Increment() override;
++ int Decrement() override;
++ int GetValue() override;
++ void SetValue(int value) override;
+
+ private:
+ // members
+@@ -368,12 +368,12 @@ class NPT_PosixThread : public NPT_ThreadInterface
+ NPT_PosixThread(NPT_Thread* delegator,
+ NPT_Runnable& target,
+ bool detached);
+- ~NPT_PosixThread();
+- NPT_Result Start();
+- NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+- NPT_Result CancelBlockerSocket();
+- NPT_Result SetPriority(int priority);
+- NPT_Result GetPriority(int& priority);
++ ~NPT_PosixThread() override;
++ NPT_Result Start() override;
++ NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) override;
++ NPT_Result CancelBlockerSocket() override;
++ NPT_Result SetPriority(int priority) override;
++ NPT_Result GetPriority(int& priority) override;
+
+ // class methods
+ static NPT_Result GetPriority(NPT_Thread::ThreadId thread_id, int& priority);
+@@ -384,10 +384,10 @@ class NPT_PosixThread : public NPT_ThreadInterface
+ static void* EntryPoint(void* argument);
+
+ // NPT_Runnable methods
+- void Run();
++ void Run() override;
+
+ // NPT_Interruptible methods
+- NPT_Result Interrupt() { return NPT_ERROR_NOT_IMPLEMENTED; }
++ NPT_Result Interrupt() override { return NPT_ERROR_NOT_IMPLEMENTED; }
+
+ // members
+ NPT_Thread* m_Delegator;
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h
+index 65baa7b10c45..401c863a6a76 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.h
+@@ -92,7 +92,7 @@ class PLT_CtrlPoint : public PLT_SsdpPacketListener,
+ {
+ public:
+ PLT_CtrlPoint(const char* search_criteria = "upnp:rootdevice"); // pass NULL to prevent repeated automatic search
+- virtual ~PLT_CtrlPoint();
++ ~PLT_CtrlPoint() override;
+
+ /**
+ Returns the port used by the internal HTTP server for all incoming event notifications.
+@@ -138,17 +138,17 @@ class PLT_CtrlPoint : public PLT_SsdpPacketListener,
+ void* userdata = NULL);
+
+ // NPT_HttpRequestHandler methods
+- virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
++ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ // PLT_SsdpSearchResponseListener methods
+- virtual NPT_Result ProcessSsdpSearchResponse(NPT_Result res,
++ NPT_Result ProcessSsdpSearchResponse(NPT_Result res,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse* response);
++ NPT_HttpResponse* response) override;
+ // PLT_SsdpPacketListener method
+- virtual NPT_Result OnSsdpPacket(const NPT_HttpRequest& request,
+- const NPT_HttpRequestContext& context);
++ NPT_Result OnSsdpPacket(const NPT_HttpRequest& request,
++ const NPT_HttpRequestContext& context) override;
+
+ protected:
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.h b/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.h
+index 48e204483665..15ac8870f345 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltCtrlPointTask.h
+@@ -67,14 +67,14 @@ class PLT_CtrlPointGetDescriptionTask : public PLT_HttpClientSocketTask
+ PLT_CtrlPoint* ctrl_point,
+ NPT_TimeInterval leasetime,
+ NPT_String uuid);
+- virtual ~PLT_CtrlPointGetDescriptionTask();
++ ~PLT_CtrlPointGetDescriptionTask() override;
+
+ protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse* response);
++ NPT_HttpResponse* response) override;
+
+ protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+@@ -97,7 +97,7 @@ class PLT_CtrlPointGetSCPDRequest : public NPT_HttpRequest
+ const char* method = "GET",
+ const char* protocol = NPT_HTTP_PROTOCOL_1_1) : // 1.1 for pipelining
+ NPT_HttpRequest(url, method, protocol), m_Device(device) {}
+- virtual ~PLT_CtrlPointGetSCPDRequest() {}
++ ~PLT_CtrlPointGetSCPDRequest() override {}
+
+ // members
+ PLT_DeviceDataReference m_Device;
+@@ -114,14 +114,14 @@ class PLT_CtrlPointGetSCPDsTask : public PLT_HttpClientSocketTask
+ {
+ public:
+ PLT_CtrlPointGetSCPDsTask(PLT_CtrlPoint* ctrl_point, PLT_DeviceDataReference& root_device);
+- virtual ~PLT_CtrlPointGetSCPDsTask() {}
++ ~PLT_CtrlPointGetSCPDsTask() override {}
+
+ NPT_Result AddSCPDRequest(PLT_CtrlPointGetSCPDRequest* request) {
+ return PLT_HttpClientSocketTask::AddRequest((NPT_HttpRequest*)request);
+ }
+
+ // override to prevent calling this directly
+- NPT_Result AddRequest(NPT_HttpRequest*) {
++ NPT_Result AddRequest(NPT_HttpRequest*) override {
+ // only queuing PLT_CtrlPointGetSCPDRequest allowed
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+@@ -131,7 +131,7 @@ class PLT_CtrlPointGetSCPDsTask : public PLT_HttpClientSocketTask
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse* response);
++ NPT_HttpResponse* response) override;
+
+ protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+@@ -152,14 +152,14 @@ class PLT_CtrlPointInvokeActionTask : public PLT_HttpClientSocketTask
+ PLT_CtrlPoint* ctrl_point,
+ PLT_ActionReference& action,
+ void* userdata);
+- virtual ~PLT_CtrlPointInvokeActionTask();
++ ~PLT_CtrlPointInvokeActionTask() override;
+
+ protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse* response);
++ NPT_HttpResponse* response) override;
+
+ protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+@@ -181,10 +181,10 @@ class PLT_CtrlPointHouseKeepingTask : public PLT_ThreadTask
+ NPT_TimeInterval timer = NPT_TimeInterval(5.));
+
+ protected:
+- ~PLT_CtrlPointHouseKeepingTask() {}
++ ~PLT_CtrlPointHouseKeepingTask() override {}
+
+ // PLT_ThreadTask methods
+- virtual void DoRun();
++ void DoRun() override;
+
+ protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+@@ -206,14 +206,14 @@ class PLT_CtrlPointSubscribeEventTask : public PLT_HttpClientSocketTask
+ PLT_DeviceDataReference& device,
+ PLT_Service* service,
+ void* userdata = NULL);
+- virtual ~PLT_CtrlPointSubscribeEventTask();
++ ~PLT_CtrlPointSubscribeEventTask() override;
+
+ protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse* response);
++ NPT_HttpResponse* response) override;
+
+ protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.h b/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.h
+index 0e132b97fed9..86ba105a6b3b 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltDatagramStream.h
+@@ -58,20 +58,20 @@ class PLT_InputDatagramStream : public NPT_InputStream
+ // methods
+ PLT_InputDatagramStream(NPT_UdpSocket* socket,
+ NPT_Size buffer_size = 2000);
+- virtual ~PLT_InputDatagramStream();
++ ~PLT_InputDatagramStream() override;
+
+ NPT_Result GetInfo(NPT_SocketInfo& info);
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = 0);
++ NPT_Size* bytes_read = 0) override;
+
+- NPT_Result Seek(NPT_Position offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+- NPT_Result Skip(NPT_Size offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+- NPT_Result Tell(NPT_Position& offset){ NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+- NPT_Result GetSize(NPT_LargeSize& size) { NPT_COMPILER_UNUSED(size); return NPT_FAILURE; }
+- NPT_Result GetAvailable(NPT_LargeSize& available) { NPT_COMPILER_UNUSED(available); return NPT_FAILURE; }
++ NPT_Result Seek(NPT_Position offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
++ NPT_Result Skip(NPT_Size offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
++ NPT_Result Tell(NPT_Position& offset) override{ NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
++ NPT_Result GetSize(NPT_LargeSize& size) override { NPT_COMPILER_UNUSED(size); return NPT_FAILURE; }
++ NPT_Result GetAvailable(NPT_LargeSize& available) override { NPT_COMPILER_UNUSED(available); return NPT_FAILURE; }
+
+ protected:
+ NPT_UdpSocket* m_Socket;
+@@ -97,14 +97,14 @@ class PLT_OutputDatagramStream : public NPT_OutputStream
+ PLT_OutputDatagramStream(NPT_UdpSocket* socket,
+ NPT_Size size = 4096,
+ const NPT_SocketAddress* address = NULL);
+- virtual ~PLT_OutputDatagramStream();
++ ~PLT_OutputDatagramStream() override;
+
+ // NPT_OutputStream methods
+- NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL);
+- NPT_Result Flush();
++ NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL) override;
++ NPT_Result Flush() override;
+
+- NPT_Result Seek(NPT_Position offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+- NPT_Result Tell(NPT_Position& offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
++ NPT_Result Seek(NPT_Position offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
++ NPT_Result Tell(NPT_Position& offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+
+ protected:
+ NPT_UdpSocket* m_Socket;
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.h b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.h
+index 9c31484d92bb..8cf611866414 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.h
+@@ -90,7 +90,7 @@ class PLT_DeviceHost : public PLT_DeviceData,
+ bool show_ip = false,
+ NPT_UInt16 port = 0,
+ bool port_rebind = false);
+- virtual ~PLT_DeviceHost();
++ ~PLT_DeviceHost() override;
+
+ virtual void SetExtraBroadcast(bool broadcast) { m_ExtraBroascast = broadcast; }
+
+@@ -123,9 +123,9 @@ class PLT_DeviceHost : public PLT_DeviceData,
+ @param context the context of the request
+ @param response the response to set up
+ */
+- virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
++ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ /**
+ Static method similar to Announce.
+@@ -156,8 +156,8 @@ class PLT_DeviceHost : public PLT_DeviceData,
+ @param request SSDP packet
+ @param context the context of the request
+ */
+- virtual NPT_Result OnSsdpPacket(const NPT_HttpRequest& request,
+- const NPT_HttpRequestContext& context);
++ NPT_Result OnSsdpPacket(const NPT_HttpRequest& request,
++ const NPT_HttpRequestContext& context) override;
+
+ /**
+ Static method similar to SendSsdpSearchResponse.
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttp.h b/lib/libUPnP/Platinum/Source/Core/PltHttp.h
+index fc3d1b55c0ff..00e2b9f570e3 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltHttp.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltHttp.h
+@@ -198,12 +198,12 @@ class PLT_HttpRequestHandler : public NPT_HttpRequestHandler
+ public:
+ PLT_HttpRequestHandler(NPT_HttpRequestHandler* delegate) :
+ m_Delegate(delegate) {}
+- virtual ~PLT_HttpRequestHandler() {}
++ ~PLT_HttpRequestHandler() override {}
+
+ // NPT_HttpRequestHandler methods
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response) {
++ NPT_HttpResponse& response) override {
+ return m_Delegate->SetupResponse(request, context, response);
+ }
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.h b/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.h
+index 293c59207a5f..62ac723cd0d4 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltHttpClientTask.h
+@@ -62,15 +62,15 @@ friend class PLT_ThreadTask;
+ public:
+ PLT_HttpClientSocketTask(NPT_HttpRequest* request = NULL,
+ bool wait_forever = false);
+- virtual ~PLT_HttpClientSocketTask();
++ ~PLT_HttpClientSocketTask() override;
+
+ virtual NPT_Result AddRequest(NPT_HttpRequest* request);
+ virtual NPT_Result SetHttpClientConfig(const NPT_HttpClient::Config& config);
+
+ protected:
+ // PLT_ThreadTask methods
+- virtual void DoAbort();
+- virtual void DoRun();
++ void DoAbort() override;
++ void DoRun() override;
+
+ virtual NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+@@ -103,14 +103,14 @@ class PLT_HttpClientTask : public PLT_HttpClientSocketTask
+ NPT_HTTP_PROTOCOL_1_1)),
+ m_Data(data) {}
+ protected:
+- virtual ~PLT_HttpClientTask<T>() {}
++ ~PLT_HttpClientTask<T>() override {}
+
+ protected:
+ // PLT_HttpClientSocketTask method
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse* response) {
++ NPT_HttpResponse* response) override {
+ return m_Data->ProcessResponse(res, request, context, response);
+ }
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpServer.h b/lib/libUPnP/Platinum/Source/Core/PltHttpServer.h
+index 562e141431ff..04c47fce03b5 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltHttpServer.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltHttpServer.h
+@@ -61,7 +61,7 @@ class PLT_HttpServer : public NPT_HttpRequestHandler,
+ bool allow_random_port_on_bind_failure = false,
+ NPT_Cardinal max_clients = 50,
+ bool reuse_address = false);
+- virtual ~PLT_HttpServer();
++ ~PLT_HttpServer() override;
+
+ // class methods
+ static NPT_Result ServeFile(const NPT_HttpRequest& request,
+@@ -75,9 +75,9 @@ class PLT_HttpServer : public NPT_HttpRequestHandler,
+ const char* content_type);
+
+ // NPT_HttpRequestHandler methods
+- virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
++ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ // methods
+ virtual NPT_Result Start();
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h b/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h
+index 58b2a3fb761f..dc5cbd3ad859 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltHttpServerTask.h
+@@ -64,7 +64,7 @@ class PLT_HttpServerSocketTask : public PLT_ThreadTask
+ PLT_HttpServerSocketTask(NPT_Socket* socket, bool stay_alive_forever = false);
+
+ protected:
+- virtual ~PLT_HttpServerSocketTask();
++ ~PLT_HttpServerSocketTask() override;
+
+ protected:
+ // Request callback handler
+@@ -77,8 +77,8 @@ class PLT_HttpServerSocketTask : public PLT_ThreadTask
+ virtual NPT_Result GetInfo(NPT_SocketInfo& info);
+
+ // PLT_ThreadTask methods
+- virtual void DoAbort() { if (m_Socket) m_Socket->Cancel(); }
+- virtual void DoRun();
++ void DoAbort() override { if (m_Socket) m_Socket->Cancel(); }
++ void DoRun() override;
+
+ private:
+ virtual NPT_Result Read(NPT_BufferedInputStreamReference& buffered_input_stream,
+@@ -117,11 +117,11 @@ class PLT_HttpServerTask : public PLT_HttpServerSocketTask
+ PLT_HttpServerSocketTask(socket, keep_alive), m_Handler(handler) {}
+
+ protected:
+- virtual ~PLT_HttpServerTask() {}
++ ~PLT_HttpServerTask() override {}
+
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response) {
++ NPT_HttpResponse& response) override {
+ return m_Handler->SetupResponse(request, context, response);
+ }
+
+@@ -145,14 +145,14 @@ class PLT_HttpListenTask : public PLT_ThreadTask
+ m_Handler(handler), m_Socket(socket), m_OwnsSocket(owns_socket) {}
+
+ protected:
+- virtual ~PLT_HttpListenTask() {
++ ~PLT_HttpListenTask() override {
+ if (m_OwnsSocket && m_Socket) delete m_Socket;
+ }
+
+ protected:
+ // PLT_ThreadTask methods
+- virtual void DoAbort() { if (m_Socket) m_Socket->Cancel(); }
+- virtual void DoRun();
++ void DoAbort() override { if (m_Socket) m_Socket->Cancel(); }
++ void DoRun() override;
+
+ protected:
+ NPT_HttpRequestHandler* m_Handler;
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltService.h b/lib/libUPnP/Platinum/Source/Core/PltService.h
+index 0401ea287e00..ebca19542c67 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltService.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltService.h
+@@ -293,7 +293,7 @@ class PLT_Service
+ public:
+ PLT_ServiceEventTask(PLT_Service* service) : m_Service(service) {}
+
+- void DoRun() {
++ void DoRun() override {
+ while (!IsAborting(100)) m_Service->NotifyChanged();
+ }
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltSsdp.h b/lib/libUPnP/Platinum/Source/Core/PltSsdp.h
+index 21015e53b160..0bbbd75952ca 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltSsdp.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltSsdp.h
+@@ -162,10 +162,10 @@ class PLT_SsdpDeviceSearchResponseTask : public PLT_ThreadTask
+ m_Device(device), m_RemoteAddr(remote_addr), m_ST(st) {}
+
+ protected:
+- virtual ~PLT_SsdpDeviceSearchResponseTask() {}
++ ~PLT_SsdpDeviceSearchResponseTask() override {}
+
+ // PLT_ThreadTask methods
+- virtual void DoRun();
++ void DoRun() override;
+
+ protected:
+ PLT_DeviceHost* m_Device;
+@@ -240,10 +240,10 @@ class PLT_SsdpDeviceAnnounceTask : public PLT_ThreadTask
+ m_ExtraBroadcast(extra_broadcast) {}
+
+ protected:
+- virtual ~PLT_SsdpDeviceAnnounceTask() {}
++ ~PLT_SsdpDeviceAnnounceTask() override {}
+
+ // PLT_ThreadTask methods
+- virtual void DoRun();
++ void DoRun() override;
+
+ protected:
+ PLT_DeviceHost* m_Device;
+@@ -333,17 +333,17 @@ class PLT_SsdpListenTask : public PLT_HttpServerSocketTask
+ }
+
+ // PLT_Task methods
+- void DoAbort();
++ void DoAbort() override;
+
+ protected:
+- virtual ~PLT_SsdpListenTask() {}
++ ~PLT_SsdpListenTask() override {}
+
+ // PLT_HttpServerSocketTask methods
+- NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+- NPT_Result GetInfo(NPT_SocketInfo& info);
++ NPT_Result GetInputStream(NPT_InputStreamReference& stream) override;
++ NPT_Result GetInfo(NPT_SocketInfo& info) override;
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ protected:
+ PLT_InputDatagramStreamReference m_Datagram;
+@@ -367,11 +367,11 @@ class PLT_SsdpSearchTask : public PLT_ThreadTask
+ NPT_TimeInterval frequency = NPT_TimeInterval(0.)); // pass 0 for one time
+
+ protected:
+- virtual ~PLT_SsdpSearchTask();
++ ~PLT_SsdpSearchTask() override;
+
+ // PLT_ThreadTask methods
+- virtual void DoAbort();
+- virtual void DoRun();
++ void DoAbort() override;
++ void DoRun() override;
+
+ virtual NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltThreadTask.h b/lib/libUPnP/Platinum/Source/Core/PltThreadTask.h
+index 8315999c8e15..49bda3d24d7b 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltThreadTask.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltThreadTask.h
+@@ -116,13 +116,13 @@ class PLT_ThreadTask : public NPT_Runnable
+ The task manager will destroy the task when finished if m_AutoDestroy is
+ true otherwise the owner of this task must use the Kill method.
+ */
+- virtual ~PLT_ThreadTask();
++ ~PLT_ThreadTask() override;
+
+ private:
+ NPT_Result StartThread();
+
+ // NPT_Thread methods
+- void Run();
++ void Run() override;
+
+ protected:
+ // members
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h
+index c9ada4174175..b628d9b11112 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h
+@@ -60,19 +60,19 @@ class PLT_MediaConnect : public PLT_MediaServer
+ bool port_rebind = false);
+
+ protected:
+- virtual ~PLT_MediaConnect();
++ ~PLT_MediaConnect() override;
+
+ // PLT_DeviceHost methods
+- virtual NPT_Result SetupServices();
+- virtual NPT_Result OnAction(PLT_ActionReference& action,
+- const PLT_HttpRequestContext& context);
+- virtual NPT_Result ProcessGetDescription(NPT_HttpRequest& request,
++ NPT_Result SetupServices() override;
++ NPT_Result OnAction(PLT_ActionReference& action,
++ const PLT_HttpRequestContext& context) override;
++ NPT_Result ProcessGetDescription(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
+- virtual NPT_Result ProcessGetSCPD(PLT_Service* service,
++ NPT_HttpResponse& response) override;
++ NPT_Result ProcessGetSCPD(PLT_Service* service,
+ NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ // X_MS_MediaReceiverRegistrar
+ virtual NPT_Result OnIsAuthorized(PLT_ActionReference& action);
+@@ -93,18 +93,18 @@ class PLT_FileMediaConnectDelegate : public PLT_FileMediaServerDelegate
+ // constructor & destructor
+ PLT_FileMediaConnectDelegate(const char* url_root, const char* file_root) :
+ PLT_FileMediaServerDelegate(url_root, file_root) {}
+- virtual ~PLT_FileMediaConnectDelegate() {}
++ ~PLT_FileMediaConnectDelegate() override {}
+
+ // PLT_FileMediaServerDelegate methods
+- virtual NPT_Result GetFilePath(const char* object_id, NPT_String& filepath);
+- virtual NPT_Result OnSearchContainer(PLT_ActionReference& action,
++ NPT_Result GetFilePath(const char* object_id, NPT_String& filepath) override;
++ NPT_Result OnSearchContainer(PLT_ActionReference& action,
+ const char* object_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+- const PLT_HttpRequestContext& context);
++ const PLT_HttpRequestContext& context) override;
+ };
+
+ #endif /* _PLT_MEDIA_CONNECT_H_ */
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.h b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.h
+index 6bae726213af..346ce57b40ae 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaConnect/PltXbox360.h
+@@ -49,8 +49,8 @@ class PLT_Xbox360 : public PLT_MediaRenderer
+
+ protected:
+ // PLT_DeviceHost methods
+- virtual NPT_Result SetupServices();
+- virtual NPT_Result SetupIcons();
++ NPT_Result SetupServices() override;
++ NPT_Result SetupIcons() override;
+ virtual NPT_Result InitServiceURLs(PLT_Service* service, const char* service_name);
+
+ virtual NPT_Result Announce(PLT_DeviceData* device,
+@@ -59,12 +59,12 @@ class PLT_Xbox360 : public PLT_MediaRenderer
+ PLT_SsdpAnnounceType type);
+
+ // PLT_DeviceData methods
+- virtual NPT_Result GetDescription(NPT_String& desc) { return PLT_MediaRenderer::GetDescription(desc); }
+- virtual NPT_Result GetDescription(NPT_XmlElementNode* parent,
+- NPT_XmlElementNode** device = NULL);
++ NPT_Result GetDescription(NPT_String& desc) override { return PLT_MediaRenderer::GetDescription(desc); }
++ NPT_Result GetDescription(NPT_XmlElementNode* parent,
++ NPT_XmlElementNode** device = NULL) override;
+
+ protected:
+- virtual ~PLT_Xbox360();
++ ~PLT_Xbox360() override;
+
+ virtual NPT_Result AnnouncePresence(NPT_UdpSocket& socket,
+ const char* serial_number);
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h
+index bfd909ca783f..743c94ff7481 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaController.h
+@@ -245,7 +245,7 @@ class PLT_MediaController : public PLT_CtrlPointListener
+ public:
+ PLT_MediaController(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaControllerDelegate* delegate = NULL);
+- virtual ~PLT_MediaController();
++ ~PLT_MediaController() override;
+
+ // public methods
+ virtual void SetDelegate(PLT_MediaControllerDelegate* delegate) {
+@@ -253,10 +253,10 @@ class PLT_MediaController : public PLT_CtrlPointListener
+ }
+
+ // PLT_CtrlPointListener methods
+- virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device);
+- virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device);
+- virtual NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata);
+- virtual NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars);
++ NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device) override;
++ NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device) override;
++ NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata) override;
++ NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars) override;
+
+ // AVTransport
+ NPT_Result GetCurrentTransportActions(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h
+index bc0ac327fae0..ec30a36daaf2 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h
+@@ -84,12 +84,12 @@ class PLT_MediaRenderer : public PLT_DeviceHost
+ virtual void SetDelegate(PLT_MediaRendererDelegate* delegate) { m_Delegate = delegate; }
+
+ // PLT_DeviceHost methods
+- virtual NPT_Result SetupServices();
+- virtual NPT_Result OnAction(PLT_ActionReference& action,
+- const PLT_HttpRequestContext& context);
++ NPT_Result SetupServices() override;
++ NPT_Result OnAction(PLT_ActionReference& action,
++ const PLT_HttpRequestContext& context) override;
+
+ protected:
+- virtual ~PLT_MediaRenderer();
++ ~PLT_MediaRenderer() override;
+
+ // PLT_MediaRendererInterface methods
+ // ConnectionManager
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h
+index 49ff9d8ab68c..fa4b5e426a36 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h
+@@ -63,35 +63,35 @@ class PLT_FileMediaServerDelegate : public PLT_MediaServerDelegate
+ const char* file_path);
+ // constructor & destructor
+ PLT_FileMediaServerDelegate(const char* url_root, const char* file_root, bool use_cache = false);
+- virtual ~PLT_FileMediaServerDelegate();
++ ~PLT_FileMediaServerDelegate() override;
+
+ protected:
+ // PLT_MediaServerDelegate methods
+- virtual NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
++ NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+- const PLT_HttpRequestContext& context);
+- virtual NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
++ const PLT_HttpRequestContext& context) override;
++ NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+- const PLT_HttpRequestContext& context);
+- virtual NPT_Result OnSearchContainer(PLT_ActionReference& action,
++ const PLT_HttpRequestContext& context) override;
++ NPT_Result OnSearchContainer(PLT_ActionReference& action,
+ const char* object_id,
+ const char* search_criteria,
+ const char* filter,
+ NPT_UInt32 starting_index,
+ NPT_UInt32 requested_count,
+ const char* sort_criteria,
+- const PLT_HttpRequestContext& context);
+- virtual NPT_Result ProcessFileRequest(NPT_HttpRequest& request,
++ const PLT_HttpRequestContext& context) override;
++ NPT_Result ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ // overridable methods
+ virtual NPT_Result ExtractResourcePath(const NPT_HttpUrl& url, NPT_String& file_path);
+@@ -145,7 +145,7 @@ class PLT_FileMediaServer : public PLT_MediaServer,
+ PLT_FileMediaServerDelegate("/", file_root) {SetDelegate(this);}
+
+ protected:
+- virtual ~PLT_FileMediaServer() {}
++ ~PLT_FileMediaServer() override {}
+ };
+
+ #endif /* _PLT_FILE_MEDIA_SERVER_H_ */
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
+index 41ed84ea3af4..2484dcc2b75c 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
+@@ -116,7 +116,7 @@ class PLT_MediaBrowser : public PLT_CtrlPointListener
+ public:
+ PLT_MediaBrowser(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaBrowserDelegate* delegate = NULL);
+- virtual ~PLT_MediaBrowser();
++ ~PLT_MediaBrowser() override;
+
+ // ContentDirectory service
+ virtual NPT_Result Browse(PLT_DeviceDataReference& device,
+@@ -149,10 +149,10 @@ class PLT_MediaBrowser : public PLT_CtrlPointListener
+
+ protected:
+ // PLT_CtrlPointListener methods
+- virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device);
+- virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device);
+- virtual NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata);
+- virtual NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars);
++ NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device) override;
++ NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device) override;
++ NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata) override;
++ NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars) override;
+
+ // ContentDirectory service responses
+ virtual NPT_Result OnBrowseResponse(NPT_Result res,
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+index 65022976053b..3a13967f5f9b 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+@@ -285,12 +285,12 @@ class PLT_MediaItem : public PLT_MediaObject
+ NPT_IMPLEMENT_DYNAMIC_CAST_D(PLT_MediaItem, PLT_MediaObject)
+
+ PLT_MediaItem();
+- virtual ~PLT_MediaItem();
++ ~PLT_MediaItem() override;
+
+ // PLT_MediaObject methods
+- NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl);
+- NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl);
+- NPT_Result FromDidl(NPT_XmlElementNode* entry);
++ NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl) override;
++ NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl) override;
++ NPT_Result FromDidl(NPT_XmlElementNode* entry) override;
+ };
+
+ /*----------------------------------------------------------------------
+@@ -307,13 +307,13 @@ class PLT_MediaContainer : public PLT_MediaObject
+ NPT_IMPLEMENT_DYNAMIC_CAST_D(PLT_MediaContainer, PLT_MediaObject)
+
+ PLT_MediaContainer();
+- virtual ~PLT_MediaContainer();
++ ~PLT_MediaContainer() override;
+
+ // PLT_MediaObject methods
+- NPT_Result Reset();
+- NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl);
+- NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl);
+- NPT_Result FromDidl(NPT_XmlElementNode* entry);
++ NPT_Result Reset() override;
++ NPT_Result ToDidl(const NPT_String& filter, NPT_String& didl) override;
++ NPT_Result ToDidl(NPT_UInt64 mask, NPT_String& didl) override;
++ NPT_Result FromDidl(NPT_XmlElementNode* entry) override;
+
+ public:
+ NPT_List<PLT_SearchClass> m_SearchClasses;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h
+index 6af8aa183a26..d35d8d894eeb 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.h
+@@ -133,15 +133,15 @@ class PLT_MediaServer : public PLT_DeviceHost
+ virtual void UpdateContainerUpdateID(const char* id, NPT_UInt32 update);
+
+ protected:
+- virtual ~PLT_MediaServer();
++ ~PLT_MediaServer() override;
+
+ // PLT_DeviceHost methods
+- virtual NPT_Result SetupServices();
+- virtual NPT_Result OnAction(PLT_ActionReference& action,
+- const PLT_HttpRequestContext& context);
+- virtual NPT_Result ProcessHttpGetRequest(NPT_HttpRequest& request,
++ NPT_Result SetupServices() override;
++ NPT_Result OnAction(PLT_ActionReference& action,
++ const PLT_HttpRequestContext& context) override;
++ NPT_Result ProcessHttpGetRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ // ConnectionManager
+ virtual NPT_Result OnGetCurrentConnectionIDs(PLT_ActionReference& action,
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+index 1493a50fc4a7..6da21cb18a3e 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
+@@ -94,31 +94,31 @@ class PLT_SyncMediaBrowser : public PLT_MediaBrowser,
+ PLT_SyncMediaBrowser(PLT_CtrlPointReference& ctrlPoint,
+ bool use_cache = false,
+ PLT_MediaContainerChangesListener* listener = NULL);
+- virtual ~PLT_SyncMediaBrowser();
++ ~PLT_SyncMediaBrowser() override;
+
+ // PLT_MediaBrowser methods
+- virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device);
+- virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device);
++ NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device) override;
++ NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device) override;
+
+ // PLT_MediaBrowserDelegate methods
+- virtual void OnMSStateVariablesChanged(PLT_Service* service,
+- NPT_List<PLT_StateVariable*>* vars);
+- virtual void OnBrowseResult(NPT_Result res,
++ void OnMSStateVariablesChanged(PLT_Service* service,
++ NPT_List<PLT_StateVariable*>* vars) override;
++ void OnBrowseResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+- void* userdata);
+- virtual void OnSearchResult(NPT_Result res,
++ void* userdata) override;
++ void OnSearchResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+- void* userdata);
+- virtual void OnGetSearchCapabilitiesResult(NPT_Result res,
++ void* userdata) override;
++ void OnGetSearchCapabilitiesResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ NPT_String searchCapabilities,
+- void* userdata);
+- virtual void OnGetSortCapabilitiesResult(NPT_Result res,
++ void* userdata) override;
++ void OnGetSortCapabilitiesResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ NPT_String sortCapabilities,
+- void* userdata);
++ void* userdata) override;
+
+ // methods
+ void SetContainerListener(PLT_MediaContainerChangesListener* listener) {
+diff --git a/lib/libUPnP/Platinum/Source/Extras/PltDownloader.h b/lib/libUPnP/Platinum/Source/Extras/PltDownloader.h
+index 9581ec293550..15d9279ba5bf 100644
+--- a/lib/libUPnP/Platinum/Source/Extras/PltDownloader.h
++++ b/lib/libUPnP/Platinum/Source/Extras/PltDownloader.h
+@@ -65,7 +65,7 @@ class PLT_Downloader : public PLT_HttpClientSocketTask
+ public:
+ PLT_Downloader(NPT_HttpUrl& url,
+ NPT_OutputStreamReference& output);
+- virtual ~PLT_Downloader();
++ ~PLT_Downloader() override;
+
+ Plt_DowloaderState GetState() { return m_State; }
+
+@@ -73,11 +73,11 @@ class PLT_Downloader : public PLT_HttpClientSocketTask
+ NPT_Result ProcessResponse(NPT_Result res,
+ const NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse* response);
++ NPT_HttpResponse* response) override;
+
+ protected:
+- virtual void DoRun();
+- virtual void DoAbort();
++ void DoRun() override;
++ void DoAbort() override;
+
+ private:
+ // members
+diff --git a/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.h b/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.h
+index 62a730a09efa..e5c119258317 100644
+--- a/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.h
++++ b/lib/libUPnP/Platinum/Source/Extras/PltFrameServer.h
+@@ -71,9 +71,9 @@ class PLT_HttpStreamRequestHandler : public NPT_HttpRequestHandler
+ m_StreamValidator(stream_validator) {}
+
+ // NPT_HttpRequestHandler methods
+- virtual NPT_Result SetupResponse(NPT_HttpRequest& request,
++ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+- NPT_HttpResponse& response);
++ NPT_HttpResponse& response) override;
+
+ private:
+ PLT_StreamValidator& m_StreamValidator;
+@@ -90,9 +90,9 @@ class PLT_FrameServer : public PLT_HttpServer
+ NPT_IpAddress address = NPT_IpAddress::Any,
+ NPT_UInt16 port = 0,
+ bool policy_server_enabled = false);
+- virtual ~PLT_FrameServer();
++ ~PLT_FrameServer() override;
+
+- virtual NPT_Result Start();
++ NPT_Result Start() override;
+
+ protected:
+ PLT_SocketPolicyServer* m_PolicyServer;
+diff --git a/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.h b/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.h
+index 0eda3c3bdae7..6d6deb8681c6 100644
+--- a/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.h
++++ b/lib/libUPnP/Platinum/Source/Extras/PltFrameStream.h
+@@ -50,18 +50,18 @@ class PLT_InputFrameStream : public NPT_InputStream
+ // methods
+ PLT_InputFrameStream(NPT_Reference<PLT_FrameBuffer>& frame_buffer,
+ const char* boundary);
+- virtual ~PLT_InputFrameStream();
++ ~PLT_InputFrameStream() override;
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = 0);
++ NPT_Size* bytes_read = 0) override;
+
+- NPT_Result Seek(NPT_Position offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+- NPT_Result Skip(NPT_Size offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+- NPT_Result Tell(NPT_Position& offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+- NPT_Result GetSize(NPT_LargeSize& size) { NPT_COMPILER_UNUSED(size); return NPT_FAILURE; }
+- NPT_Result GetAvailable(NPT_LargeSize& available);
++ NPT_Result Seek(NPT_Position offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
++ NPT_Result Skip(NPT_Size offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
++ NPT_Result Tell(NPT_Position& offset) override { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
++ NPT_Result GetSize(NPT_LargeSize& size) override { NPT_COMPILER_UNUSED(size); return NPT_FAILURE; }
++ NPT_Result GetAvailable(NPT_LargeSize& available) override;
+
+ private:
+ NPT_Result FillBuffer();
+diff --git a/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.h b/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.h
+index d8ecd11d8eca..e5f98b2f350f 100644
+--- a/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.h
++++ b/lib/libUPnP/Platinum/Source/Extras/PltRingBufferStream.h
+@@ -49,7 +49,7 @@ class PLT_RingBufferStream : public NPT_DelegatingInputStream,
+ public:
+ PLT_RingBufferStream(NPT_Size buffer_size = 4096, bool blocking = true);
+ PLT_RingBufferStream(NPT_RingBufferReference& buffer, bool blocking = true);
+- virtual ~PLT_RingBufferStream();
++ ~PLT_RingBufferStream() override;
+
+ // methods
+ bool IsAborted() { return m_Aborted; }
+@@ -57,8 +57,8 @@ class PLT_RingBufferStream : public NPT_DelegatingInputStream,
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+- NPT_Size* bytes_read = NULL);
+- NPT_Result GetSize(NPT_LargeSize& size) {
++ NPT_Size* bytes_read = NULL) override;
++ NPT_Result GetSize(NPT_LargeSize& size) override {
+ NPT_COMPILER_UNUSED(size);
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+@@ -67,7 +67,7 @@ class PLT_RingBufferStream : public NPT_DelegatingInputStream,
+ space = m_RingBuffer->GetSpace();
+ return NPT_SUCCESS;
+ }
+- NPT_Result GetAvailable(NPT_LargeSize& available) {
++ NPT_Result GetAvailable(NPT_LargeSize& available) override {
+ NPT_AutoLock autoLock(m_Lock);
+ available = m_RingBuffer->GetAvailable();
+ return NPT_SUCCESS;
+@@ -76,29 +76,29 @@ class PLT_RingBufferStream : public NPT_DelegatingInputStream,
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+- NPT_Size* bytes_written = NULL);
+- NPT_Result Flush();
++ NPT_Size* bytes_written = NULL) override;
++ NPT_Result Flush() override;
+ NPT_Result SetEOS();
+ NPT_Result Abort();
+
+ protected:
+ // NPT_DelegatingInputStream methods
+- NPT_Result InputSeek(NPT_Position offset) {
++ NPT_Result InputSeek(NPT_Position offset) override {
+ NPT_COMPILER_UNUSED(offset);
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+- NPT_Result InputTell(NPT_Position& offset) {
++ NPT_Result InputTell(NPT_Position& offset) override {
+ NPT_AutoLock autoLock(m_Lock);
+ offset = m_TotalBytesRead;
+ return NPT_SUCCESS;
+ }
+
+ // NPT_DelegatingOutputStream methods
+- NPT_Result OutputSeek(NPT_Position offset) {
++ NPT_Result OutputSeek(NPT_Position offset) override {
+ NPT_COMPILER_UNUSED(offset);
+ return NPT_ERROR_NOT_SUPPORTED;
+ }
+- NPT_Result OutputTell(NPT_Position& offset) {
++ NPT_Result OutputTell(NPT_Position& offset) override {
+ NPT_AutoLock autoLock(m_Lock);
+ offset = m_TotalBytesWritten;
+ return NPT_SUCCESS;
+diff --git a/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.h b/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.h
+index 58ef256581a5..a022b88518e4 100644
+--- a/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.h
++++ b/lib/libUPnP/Platinum/Source/Extras/PltStreamPump.h
+@@ -98,9 +98,9 @@ class PLT_PipeInputStreamPump : public PLT_StreamPump,
+ {
+ public:
+ PLT_PipeInputStreamPump(NPT_OutputStreamReference& output, NPT_Size size = 65535);
+- virtual ~PLT_PipeInputStreamPump();
++ ~PLT_PipeInputStreamPump() override;
+
+- NPT_Result Receive(NPT_InputStream& input, NPT_Size max_bytes_to_read, NPT_Size* bytes_read);
++ NPT_Result Receive(NPT_InputStream& input, NPT_Size max_bytes_to_read, NPT_Size* bytes_read) override;
+
+ protected:
+ NPT_OutputStreamReference m_Output;
+@@ -117,9 +117,9 @@ class PLT_PipeOutputStreamPump : public PLT_StreamPump,
+ PLT_PipeOutputStreamPump(NPT_InputStreamReference& input,
+ NPT_Size size = 65535,
+ NPT_Size max_bytes_to_read = 0);
+- virtual ~PLT_PipeOutputStreamPump();
++ ~PLT_PipeOutputStreamPump() override;
+
+- NPT_Result Transmit(NPT_OutputStream& output);
++ NPT_Result Transmit(NPT_OutputStream& output) override;
+
+ protected:
+ NPT_InputStreamReference m_Input;
diff --git a/lib/libUPnP/patches/0045-platinum-win10-uwp-fixes.patch b/lib/libUPnP/patches/0045-platinum-win10-uwp-fixes.patch
new file mode 100644
index 0000000..2203432
--- /dev/null
+++ b/lib/libUPnP/patches/0045-platinum-win10-uwp-fixes.patch
@@ -0,0 +1,238 @@
+From 78d3d7f7abec5e0d76d7efa92b226b5236a7bbea Mon Sep 17 00:00:00 2001
+From: Dale Stammen <dalestam@microsoft.com>
+Date: Fri, 2 Jun 2017 16:34:58 +0300
+Subject: [PATCH] [win10] uwp fixes libUPnP
+
+---
+ lib/libUPnP/Neptune/Source/Core/NptConfig.h | 13 ++++++++++
+ lib/libUPnP/Neptune/Source/Core/NptUtils.cpp | 30 ++++++++++++++++++++++
+ lib/libUPnP/Neptune/Source/Core/NptUtils.h | 7 +++++
+ .../Source/System/StdC/NptStdcEnvironment.cpp | 2 +-
+ .../System/Win32/NptWin32DynamicLibraries.cpp | 4 +++
+ .../Source/System/Win32/NptWin32MessageQueue.cpp | 3 ++-
+ .../Source/System/Win32/NptWin32MessageQueue.h | 3 +++
+ .../Neptune/Source/System/Win32/NptWin32Queue.cpp | 6 ++---
+ .../Source/System/Win32/NptWin32SerialPort.cpp | 2 ++
+ 9 files changed, 65 insertions(+), 5 deletions(-)
+
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptConfig.h b/lib/libUPnP/Neptune/Source/Core/NptConfig.h
+index d51f67f94e..130d5cc33b 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptConfig.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptConfig.h
+@@ -60,6 +60,11 @@
+ #define NPT_CONFIG_HAVE_GETENV
+ #define NPT_CONFIG_HAVE_SETENV
+ #define NPT_CONFIG_HAVE_UNSETENV
++#if defined(TARGET_WINDOWS_STORE)
++#undef NPT_CONFIG_HAVE_GETENV
++#undef NPT_CONFIG_HAVE_SETENV
++#undef NPT_CONFIG_HAVE_UNSETENV
++#endif
+ #define NPT_CONFIG_HAVE_READDIR_R
+ #endif /* NPT_CONFIG_HAS_STD_C */
+
+@@ -240,12 +245,20 @@ typedef long NPT_PointerLong;
+ #define NPT_strncpy(d,s,c) strncpy_s(d,c+1,s,c)
+ #define NPT_strcpy(d,s) strcpy_s(d,strlen(s)+1,s)
+ #undef NPT_CONFIG_HAVE_GETENV
++#ifdef TARGET_WINDOWS_STORE
++#undef NPT_CONFIG_HAVE_GETENV
++#undef NPT_CONFIG_HAVE_DUPENV_S
++#undef NPT_CONFIG_HAVE_SETENV
++#undef NPT_CONFIG_HAVE_UNSETENV
++#undef NPT_CONFIG_HAVE_PUTENV_S
++#else
+ #define NPT_CONFIG_HAVE_DUPENV_S
+ #define dupenv_s _dupenv_s
+ #undef NPT_CONFIG_HAVE_SETENV
+ #undef NPT_CONFIG_HAVE_UNSETENV
+ #define NPT_CONFIG_HAVE_PUTENV_S
+ #define putenv_s _putenv_s
++#endif
+ #else
+ #undef NPT_CONFIG_HAVE_GMTIME_R
+ #undef NPT_CONFIG_HAVE_LOCALTIME_R
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptUtils.cpp b/lib/libUPnP/Neptune/Source/Core/NptUtils.cpp
+index a68a1afeaf..d98710dc12 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptUtils.cpp
++++ b/lib/libUPnP/Neptune/Source/Core/NptUtils.cpp
+@@ -44,6 +44,12 @@
+ #include <limits.h>
+ #endif
+
++#ifdef TARGET_WINDOWS_STORE
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN 1
++#endif
++#include <windows.h>
++#endif
+ /*----------------------------------------------------------------------
+ | constants
+ +---------------------------------------------------------------------*/
+@@ -925,3 +931,27 @@ NPT_ParseMimeParameters(const char* encoded,
+ return NPT_SUCCESS;
+ }
+
++#ifdef TARGET_WINDOWS_STORE
++std::wstring win32ConvertUtf8ToW(const std::string &text)
++{
++ if (text.empty())
++ {
++ return L"";
++ }
++
++ int bufSize = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, text.c_str(), -1, NULL, 0);
++ if (bufSize == 0)
++ return L"";
++ wchar_t *converted = new wchar_t[bufSize];
++ if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, text.c_str(), -1, converted, bufSize) != bufSize)
++ {
++ delete[] converted;
++ return L"";
++ }
++
++ std::wstring Wret(converted);
++ delete[] converted;
++
++ return Wret;
++}
++#endif
+diff --git a/lib/libUPnP/Neptune/Source/Core/NptUtils.h b/lib/libUPnP/Neptune/Source/Core/NptUtils.h
+index 3a06d497f4..89b2e29812 100644
+--- a/lib/libUPnP/Neptune/Source/Core/NptUtils.h
++++ b/lib/libUPnP/Neptune/Source/Core/NptUtils.h
+@@ -54,6 +54,9 @@
+ #include <stdarg.h>
+ #endif
+
++#if defined(TARGET_WINDOWS_STORE)
++#include <string>
++#endif
+ /*----------------------------------------------------------------------
+ | macros
+ +---------------------------------------------------------------------*/
+@@ -225,4 +228,8 @@ extern void NPT_SetMemory(void* dest, int c, NPT_Size size);
+ extern int NPT_MemoryEqual(const void* s1, const void* s2, unsigned long n);
+ #endif
+
++#if defined(TARGET_WINDOWS_STORE)
++std::wstring win32ConvertUtf8ToW(const std::string &text);
++#endif
++
+ #endif // _NPT_UTILS_H_
+diff --git a/lib/libUPnP/Neptune/Source/System/StdC/NptStdcEnvironment.cpp b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcEnvironment.cpp
+index c9f9939d2b..f700b2212b 100644
+--- a/lib/libUPnP/Neptune/Source/System/StdC/NptStdcEnvironment.cpp
++++ b/lib/libUPnP/Neptune/Source/System/StdC/NptStdcEnvironment.cpp
+@@ -22,7 +22,7 @@
+ NPT_Result
+ NPT_Environment::Get(const char* name, NPT_String& value)
+ {
+- char* env;
++ char* env = nullptr;
+
+ /* default value */
+ value.SetLength(0);
+diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp
+index caaf6d1903..371aaf5ab9 100644
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp
+@@ -97,7 +97,11 @@ NPT_DynamicLibrary::Load(const char* name, NPT_Flags flags, NPT_DynamicLibrary*&
+
+ // load the lib
+ NPT_LOG_FINE_2("loading library %s, flags=%x", name, flags);
++#ifdef TARGET_WINDOWS_STORE
++ HMODULE handle = LoadPackagedLibrary(NPT_WIN32_A2W(name), NULL);
++#else
+ HMODULE handle = LoadLibraryW(NPT_WIN32_A2W(name));
++#endif
+ if (handle == NULL) {
+ NPT_LOG_FINE("library not found");
+ return NPT_FAILURE;
+diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.cpp
+index f415b851d5..d5ad0b953c 100644
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.cpp
+@@ -11,7 +11,7 @@
+ | includes
+ +---------------------------------------------------------------------*/
+ #include "NptWin32MessageQueue.h"
+-
++#ifndef TARGET_WINDOWS_STORE
+ /*----------------------------------------------------------------------
+ | platform adaptation
+ +---------------------------------------------------------------------*/
+@@ -181,3 +181,4 @@ NPT_Win32WindowMessageQueue::HandleMessage(NPT_Message* message,
+ return result;
+ }
+
++#endif // ! TARGET_WINDOWS_STORE
+diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.h b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.h
+index a5f846b016..1d84800586 100644
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.h
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32MessageQueue.h
+@@ -10,6 +10,7 @@
+ #ifndef _NPT_WIN32_MESSAGE_QUEUE_
+ #define _NPT_WIN32_MESSAGE_QUEUE_
+
++#ifndef TARGET_WINDOWS_STORE
+ /*----------------------------------------------------------------------
+ | includes
+ +---------------------------------------------------------------------*/
+@@ -45,5 +46,7 @@ private:
+ HINSTANCE m_hInstance;
+ };
+
++#endif // ! TARGET_WINDOWS_STORE
++
+ #endif // _NPT_WIN32_MESSAGE_QUEUE_
+
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Queue.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Queue.cpp
+@@ -24,7 +24,7 @@
+ #include "NptDebug.h"
+ #include "NptLogging.h"
+
+-#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP
++#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP || defined(TARGET_WINDOWS_STORE)
+ // for XBox, Windows 7 Desktop or earlier
+ #include "NptWin32Threads.h"
+ #elif WINAPI_FAMILY == WINAPI_FAMILY_APP
+@@ -55,7 +55,7 @@ private:
+ // members
+ NPT_Cardinal m_MaxItems;
+
+-#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP
++#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP || defined(TARGET_WINDOWS_STORE)
+ // for XBox, Windows 7 Desktop or earlier
+ NPT_Win32CriticalSection m_Mutex;
+ NPT_Win32Event* m_CanPushCondition;
+@@ -76,7 +76,7 @@ private:
+ NPT_Win32Queue::NPT_Win32Queue(NPT_Cardinal max_items) :
+ m_MaxItems(max_items)
+ {
+-#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP
++#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP || defined(TARGET_WINDOWS_STORE)
+ // for XBox, Windows 7 Desktop or earlier
+ m_CanPushCondition = new NPT_Win32Event(true, true);
+ m_CanPopCondition = new NPT_Win32Event(true, false);
+diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp
+index 9428648bd7..4dfc23a603 100644
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32SerialPort.cpp
+@@ -17,6 +17,7 @@
+ #include "NptStrings.h"
+ #include "NptLogging.h"
+
++#ifndef TARGET_WINDOWS_STORE
+ /*----------------------------------------------------------------------
+ | NPT_Win32HandletWrapper
+ +---------------------------------------------------------------------*/
+@@ -338,3 +339,4 @@ NPT_SerialPort::NPT_SerialPort(const char* name)
+ {
+ m_Delegate = new NPT_Win32SerialPort(name);
+ }
++#endif // ! TARGET_WINDOWS_STORE
+--
+2.13.2.windows.1
+
diff --git a/lib/libUPnP/patches/0046-platinum-fix-format-security-warning.patch b/lib/libUPnP/patches/0046-platinum-fix-format-security-warning.patch
new file mode 100644
index 0000000..07cd53e
--- /dev/null
+++ b/lib/libUPnP/patches/0046-platinum-fix-format-security-warning.patch
@@ -0,0 +1,22 @@
+From 75dca8c816de2d65aee5117876b3c7110ad4cd47 Mon Sep 17 00:00:00 2001
+From: Rechi <Rechi@users.noreply.github.com>
+Date: Wed, 3 Jan 2018 10:31:43 +0100
+Subject: [PATCH] [libUPnP][platinum] fix format-security warning
+
+---
+ lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+index 0a43dab603..feeb537648 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+@@ -631,7 +631,7 @@ args:
+ msg = "Invalid args";
+
+ failure:
+- NPT_LOG_WARNING(msg);
++ NPT_LOG_WARNING_1("%s", msg);
+ action->SetError(err, msg);
+ return NPT_FAILURE;
+ }
diff --git a/lib/libUPnP/patches/0047-neptune-fix-device-discovery-on-windows.patch b/lib/libUPnP/patches/0047-neptune-fix-device-discovery-on-windows.patch
new file mode 100644
index 0000000..391ee3b
--- /dev/null
+++ b/lib/libUPnP/patches/0047-neptune-fix-device-discovery-on-windows.patch
@@ -0,0 +1,49 @@
+--- a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
+@@ -131,46 +131,19 @@
+ #undef SetPort
+ #endif
+
+-#if !defined(EWOULDBLOCK)
+ #define EWOULDBLOCK WSAEWOULDBLOCK
+-#endif
+-#if !defined(EINPROGRESS)
+ #define EINPROGRESS WSAEINPROGRESS
+-#endif
+-#if !defined(ECONNREFUSED)
+ #define ECONNREFUSED WSAECONNREFUSED
+-#endif
+-#if !defined(ECONNABORTED)
+ #define ECONNABORTED WSAECONNABORTED
+-#endif
+-#if !defined(ECONNRESET)
+ #define ECONNRESET WSAECONNRESET
+-#endif
+-#if !defined(ETIMEDOUT)
+ #define ETIMEDOUT WSAETIMEDOUT
+-#endif
+-#if !defined(ENETRESET)
+ #define ENETRESET WSAENETRESET
+-#endif
+-#if !defined(EADDRINUSE)
+ #define EADDRINUSE WSAEADDRINUSE
+-#endif
+-#if !defined(ENETDOWN)
+ #define ENETDOWN WSAENETDOWN
+-#endif
+-#if !defined(ENETUNREACH)
+ #define ENETUNREACH WSAENETUNREACH
+-#endif
+-#if !defined(EHOSTUNREACH)
+-#define EHOSTUNREACH WSAEHOSTUNREACH
+-#endif
+-#if !defined(ENOTCONN)
+ #define ENOTCONN WSAENOTCONN
+-#endif
+ #if !defined(EAGAIN)
+ #define EAGAIN WSAEWOULDBLOCK
+-#endif
+-#if !defined(EINTR)
+ #define EINTR WSAEINTR
+ #endif
+ #if !defined(SHUT_RDWR)
diff --git a/lib/libUPnP/patches/0048-libUPnP-Remove-unused-headers-from-Platinum-Source-E.patch b/lib/libUPnP/patches/0048-libUPnP-Remove-unused-headers-from-Platinum-Source-E.patch
new file mode 100644
index 0000000..c1cdb8f
--- /dev/null
+++ b/lib/libUPnP/patches/0048-libUPnP-Remove-unused-headers-from-Platinum-Source-E.patch
@@ -0,0 +1,29 @@
+From: Olaf Hering <olaf@aepfle.de>
+Date: Thu, 28 Mar 2019 18:07:31 +0100
+Subject: [libUPnP] Remove unused headers from Platinum/Source/Extras
+
+No code from the Extras directory is compiled, so it is unlikely that
+any of the interfaces will be used. Remove the headers and remove
+Platinum/Source/Extras from the list of include directories.
+
+Signed-off-by: Olaf Hering <olaf@aepfle.de>
+---
+ lib/libUPnP/Platinum/Source/Platinum/Platinum.h | 7 -------
+ 1 file changed, 7 deletions(-)
+
+diff --git a/lib/libUPnP/Platinum/Source/Platinum/Platinum.h b/lib/libUPnP/Platinum/Source/Platinum/Platinum.h
+index a7f47a6241..970cb8bd95 100644
+--- a/lib/libUPnP/Platinum/Source/Platinum/Platinum.h
++++ b/lib/libUPnP/Platinum/Source/Platinum/Platinum.h
+@@ -108,11 +108,4 @@ cross-platform logging system.
+ #include "PltXbox360.h"
+ #include "PltMediaConnect.h"
+
+-#include "PltDownloader.h"
+-#include "PltStreamPump.h"
+-#include "PltFrameBuffer.h"
+-#include "PltFrameServer.h"
+-#include "PltFrameStream.h"
+-#include "PltRingBufferStream.h"
+-
+ #endif /* _PLATINUM_H_ */
diff --git a/lib/libUPnP/patches/0049-libUPnP-fix-no-permissive-build.patch b/lib/libUPnP/patches/0049-libUPnP-fix-no-permissive-build.patch
new file mode 100644
index 0000000..b6b255c
--- /dev/null
+++ b/lib/libUPnP/patches/0049-libUPnP-fix-no-permissive-build.patch
@@ -0,0 +1,182 @@
+diff --git a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
+index 638446d776..063be46a7d 100644
+--- a/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Bsd/NptBsdSockets.cpp
+@@ -564,8 +564,10 @@ static int
+ socketpair(int, int, int, SOCKET sockets[2]) // we ignore the first two params: we only use this for a strictly limited case
+ {
+ int result = 0;
++ socklen_t name_length = 0;
++ int reuse = 1;
+
+- // initialize with default values
++ // initialize with default values
+ sockets[0] = INVALID_SOCKET;
+ sockets[1] = INVALID_SOCKET;
+
+@@ -578,15 +580,14 @@ socketpair(int, int, int, SOCKET sockets[2]) // we ignore the first two params:
+ memset(&inet_address, 0, sizeof(inet_address));
+ inet_address.sin_family = AF_INET;
+ inet_address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+- int reuse = 1;
+ setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse));
+ result = bind(listener, (const sockaddr*)&inet_address, sizeof(inet_address));
+ if (result != 0) goto fail;
+ listen(listener, 1);
+
+ // read the port that was assigned to the listener socket
+- socklen_t name_length = sizeof(inet_address);
+- result = getsockname(listener, (struct sockaddr*)&inet_address, &name_length);
++ name_length = sizeof(inet_address);
++ result = getsockname(listener, (struct sockaddr*)&inet_address, &name_length);
+ if (result != 0) goto fail;
+
+ // create the first socket
+diff --git a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
+index 8f3c6b7a0d..3ab979ad3b 100644
+--- a/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
++++ b/lib/libUPnP/Neptune/Source/System/Win32/NptWin32Threads.cpp
+@@ -441,7 +441,7 @@ NPT_Win32Thread::NPT_Win32Thread(NPT_Thread* delegator,
+ m_Delegator(delegator),
+ m_Target(target),
+ m_Detached(detached),
+- m_ThreadHandle(0),
++ m_ThreadHandle(nullptr),
+ m_ThreadId(0)
+ {
+ }
+@@ -567,7 +567,7 @@ NPT_Win32Thread::EntryPoint(void* argument)
+ NPT_Result
+ NPT_Win32Thread::Start()
+ {
+- if (m_ThreadHandle > 0) {
++ if (m_ThreadHandle != nullptr) {
+ // failed
+ NPT_LOG_WARNING("thread already started !");
+ return NPT_ERROR_INVALID_STATE;
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.cpp b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.cpp
+index bae654572c..7d476d1806 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.cpp
++++ b/lib/libUPnP/Platinum/Source/Core/PltCtrlPoint.cpp
+@@ -805,8 +805,9 @@ PLT_CtrlPoint::ProcessEventNotification(PLT_EventSubscriberReference subscriber,
+ var = service->FindStateVariable(property->GetTag());
+ if (var == NULL) continue;
+
+- if (NPT_FAILED(var->SetValue(property->GetText()?*property->GetText():""))) {
+- NPT_CHECK_LABEL_WARNING(NPT_FAILURE, failure);
++ if (NPT_FAILED(var->SetValue(property->GetText() ? property->GetText()->GetChars() : "")))
++ {
++ NPT_CHECK_LABEL_WARNING(NPT_FAILURE, failure);
+ }
+
+ vars.Add(var);
+@@ -1662,12 +1663,11 @@ PLT_CtrlPoint::ProcessSubscribeResponse(NPT_Result res,
+ goto remove_sub;
+
+ failure:
+- NPT_LOG_SEVERE_4("%subscription failed of sub \"%s\" for service \"%s\" of device \"%s\"",
+- (const char*)subscription?"S":"Uns",
+- (const char*)(sid?*sid:"Unknown"),
+- (const char*)service->GetServiceID(),
+- (const char*)service->GetDevice()->GetFriendlyName());
+- res = NPT_FAILED(res)?res:NPT_FAILURE;
++ NPT_LOG_SEVERE_4(
++ "%subscription failed of sub \"%s\" for service \"%s\" of device \"%s\"",
++ (const char*)subscription ? "S" : "Uns", (const char*)(sid ? sid->GetChars() : "Unknown"),
++ (const char*)service->GetServiceID(), (const char*)service->GetDevice()->GetFriendlyName());
++ res = NPT_FAILED(res) ? res : NPT_FAILURE;
+
+ remove_sub:
+ // in case it was a renewal look for the subscriber with that service and remove it from the list
+@@ -1814,7 +1814,8 @@ PLT_CtrlPoint::ProcessActionResponse(NPT_Result res,
+ NPT_XmlElementNode* child = (*args)->AsElementNode();
+ if (!child) continue;
+
+- action->SetArgumentValue(child->GetTag(), child->GetText()?*child->GetText():"");
++ action->SetArgumentValue(child->GetTag(),
++ child->GetText() ? child->GetText()->GetChars() : "");
+ if (NPT_FAILED(res)) goto failure;
+ }
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp
+index b6de5c202d..6f5f09f9cf 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp
++++ b/lib/libUPnP/Platinum/Source/Core/PltDeviceHost.cpp
+@@ -305,11 +305,12 @@ PLT_DeviceHost::Announce(PLT_DeviceData* device,
+ break;
+ }
+ PLT_UPnPMessageHelper::SetNTS(req, nts);
+-
+- NPT_LOG_FINER_3("Sending SSDP NOTIFY (%s) Request to %s (%s)",
+- nts.GetChars(),
++
++ NPT_LOG_FINER_3("Sending SSDP NOTIFY (%s) Request to %s (%s)", nts.GetChars(),
+ (const char*)req.GetUrl().ToString(),
+- (const char*)(PLT_UPnPMessageHelper::GetLocation(req)?*PLT_UPnPMessageHelper::GetLocation(req):""));
++ (const char*)(PLT_UPnPMessageHelper::GetLocation(req)
++ ? PLT_UPnPMessageHelper::GetLocation(req)->GetChars()
++ : ""));
+
+ // upnp:rootdevice
+ if (device->m_ParentUUID.IsEmpty()) {
+@@ -585,14 +586,13 @@ PLT_DeviceHost::ProcessHttpPostRequest(NPT_HttpRequest& request,
+ name = "ObjectID";
+ }
+
+- res = action->SetArgumentValue(
+- name,
+- child->GetText()?*child->GetText():"");
++ res = action->SetArgumentValue(name, child->GetText() ? child->GetText()->GetChars() : "");
+
+- // test if value was correct
+- if (res == NPT_ERROR_INVALID_PARAMETERS) {
+- action->SetError(701, "Invalid Name");
+- goto error;
++ // test if value was correct
++ if (res == NPT_ERROR_INVALID_PARAMETERS)
++ {
++ action->SetError(701, "Invalid Name");
++ goto error;
+ }
+ }
+
+diff --git a/lib/libUPnP/Platinum/Source/Core/PltUtilities.h b/lib/libUPnP/Platinum/Source/Core/PltUtilities.h
+index bdc1340173..4677f5be0e 100644
+--- a/lib/libUPnP/Platinum/Source/Core/PltUtilities.h
++++ b/lib/libUPnP/Platinum/Source/Core/PltUtilities.h
+@@ -140,7 +140,8 @@ public:
+
+ const NPT_String* text = child->GetText();
+ // DLNA 7.3.17
+- value = text?text->SubString(0, max_size):"";
++ if (text)
++ value = text->SubString(0, max_size);
+ return NPT_SUCCESS;
+ }
+
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+index feeb537648..8686aa9294 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
+@@ -401,7 +401,7 @@ PLT_MediaServer::ParseTagList(const NPT_String& updates, NPT_Map<NPT_String,NPT_
+ NPT_XmlElementNode* child = (*children)->AsElementNode();
+ if (!child) continue;
+ const NPT_String *txt = child->GetText();
+- tags[child->GetTag()] = txt ? *txt : "";
++ tags[child->GetTag()] = txt ? txt->GetChars() : "";
+ }
+
+ return NPT_SUCCESS;
+diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+index 27d81fae86..794b56be17 100644
+--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
+@@ -245,7 +245,7 @@ PLT_SyncMediaBrowser::OnMSStateVariablesChanged(PLT_Service* se
+ if (value.GetLength()) {
+ index = value.Find(',');
+ update_id = (index<0)?value:value.Left(index);
+- value = (index<0)?"":value.SubString(index+1);
++ value = (index < 0) ? "" : value.SubString(index + 1).GetChars();
+
+ // clear cache for that device
+ if (m_UseCache) m_Cache.Clear(device->GetUUID(), item_id);